Introduce a new video4linux2 I2C helper, to unregister a subdev.
This allows to get rid of yet another ifdefs.

Signed-off-by: Ezequiel Garcia <ezequ...@collabora.com>
---
 drivers/media/v4l2-core/v4l2-device.c | 25 ++-----------------------
 drivers/media/v4l2-core/v4l2-i2c.c    | 20 ++++++++++++++++++++
 include/media/v4l2-common.h           |  4 ++++
 3 files changed, 26 insertions(+), 23 deletions(-)

diff --git a/drivers/media/v4l2-core/v4l2-device.c 
b/drivers/media/v4l2-core/v4l2-device.c
index c2811238996f..63d6b147b21e 100644
--- a/drivers/media/v4l2-core/v4l2-device.c
+++ b/drivers/media/v4l2-core/v4l2-device.c
@@ -9,7 +9,6 @@
 #include <linux/types.h>
 #include <linux/ioctl.h>
 #include <linux/module.h>
-#include <linux/i2c.h>
 #include <linux/slab.h>
 #include <linux/videodev2.h>
 #include <media/v4l2-device.h>
@@ -99,28 +98,8 @@ void v4l2_device_unregister(struct v4l2_device *v4l2_dev)
        /* Unregister subdevs */
        list_for_each_entry_safe(sd, next, &v4l2_dev->subdevs, list) {
                v4l2_device_unregister_subdev(sd);
-#if IS_ENABLED(CONFIG_I2C)
-               if (sd->flags & V4L2_SUBDEV_FL_IS_I2C) {
-                       struct i2c_client *client = v4l2_get_subdevdata(sd);
-
-                       /*
-                        * We need to unregister the i2c client
-                        * explicitly. We cannot rely on
-                        * i2c_del_adapter to always unregister
-                        * clients for us, since if the i2c bus is a
-                        * platform bus, then it is never deleted.
-                        *
-                        * Device tree or ACPI based devices must not
-                        * be unregistered as they have not been
-                        * registered by us, and would not be
-                        * re-created by just probing the V4L2 driver.
-                        */
-                       if (client &&
-                           !client->dev.of_node && !client->dev.fwnode)
-                               i2c_unregister_device(client);
-                       continue;
-               }
-#endif
+               if (sd->flags & V4L2_SUBDEV_FL_IS_I2C)
+                       v4l2_i2c_subdev_unregister(sd);
                else if (sd->flags & V4L2_SUBDEV_FL_IS_SPI)
                        v4l2_spi_subdev_unregister(sd);
        }
diff --git a/drivers/media/v4l2-core/v4l2-i2c.c 
b/drivers/media/v4l2-core/v4l2-i2c.c
index f9853cc823df..b2cc8d727a60 100644
--- a/drivers/media/v4l2-core/v4l2-i2c.c
+++ b/drivers/media/v4l2-core/v4l2-i2c.c
@@ -8,6 +8,26 @@
 #include <media/v4l2-common.h>
 #include <media/v4l2-device.h>
 
+void v4l2_i2c_subdev_unregister(struct v4l2_subdev *sd)
+{
+       struct i2c_client *client = v4l2_get_subdevdata(sd);
+
+       /*
+        * We need to unregister the i2c client
+        * explicitly. We cannot rely on
+        * i2c_del_adapter to always unregister
+        * clients for us, since if the i2c bus is a
+        * platform bus, then it is never deleted.
+        *
+        * Device tree or ACPI based devices must not
+        * be unregistered as they have not been
+        * registered by us, and would not be
+        * re-created by just probing the V4L2 driver.
+        */
+        if (client && !client->dev.of_node && !client->dev.fwnode)
+               i2c_unregister_device(client);
+}
+
 void v4l2_i2c_subdev_set_name(struct v4l2_subdev *sd, struct i2c_client 
*client,
                              const char *devname, const char *postfix)
 {
diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h
index 04a748311a7b..c38d55d16230 100644
--- a/include/media/v4l2-common.h
+++ b/include/media/v4l2-common.h
@@ -214,6 +214,10 @@ enum v4l2_i2c_tuner_type {
  */
 const unsigned short *v4l2_i2c_tuner_addrs(enum v4l2_i2c_tuner_type type);
 
+void v4l2_i2c_subdev_unregister(struct v4l2_subdev *sd);
+#else
+static inline void v4l2_i2c_subdev_unregister(struct v4l2_subdev *sd)
+{}
 #endif
 
 /* ------------------------------------------------------------------------- */
-- 
2.22.0

Reply via email to