[media] media: Move media_device link_notify operation to an ops structure
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Tue, 3 Nov 2015 02:27:51 +0000 (00:27 -0200)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Fri, 9 Sep 2016 14:20:09 +0000 (11:20 -0300)
This will allow adding new operations without increasing the
media_device structure size for drivers that don't implement any media
device operation.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/media-entity.c
drivers/media/platform/exynos4-is/media-dev.c
drivers/media/platform/omap3isp/isp.c
drivers/staging/media/omap4iss/iss.c
include/media/media-device.h

index 9014362e904ddbab6932f4ff8564d10f3ae5a3db..c68239e604875b8c8078b657b24a220a7b511a2c 100644 (file)
@@ -808,17 +808,18 @@ int __media_entity_setup_link(struct media_link *link, u32 flags)
 
        mdev = source->graph_obj.mdev;
 
-       if (mdev->link_notify) {
-               ret = mdev->link_notify(link, flags,
-                                       MEDIA_DEV_NOTIFY_PRE_LINK_CH);
+       if (mdev->ops && mdev->ops->link_notify) {
+               ret = mdev->ops->link_notify(link, flags,
+                                            MEDIA_DEV_NOTIFY_PRE_LINK_CH);
                if (ret < 0)
                        return ret;
        }
 
        ret = __media_entity_setup_link_notify(link, flags);
 
-       if (mdev->link_notify)
-               mdev->link_notify(link, flags, MEDIA_DEV_NOTIFY_POST_LINK_CH);
+       if (mdev->ops && mdev->ops->link_notify)
+               mdev->ops->link_notify(link, flags,
+                                      MEDIA_DEV_NOTIFY_POST_LINK_CH);
 
        return ret;
 }
index 891625e77ef566504ca9024008124d2fffd4089f..1a1154a9dfa492e423ce220df6350fcd7689fa96 100644 (file)
@@ -1190,6 +1190,10 @@ static int fimc_md_link_notify(struct media_link *link, unsigned int flags,
        return ret ? -EPIPE : 0;
 }
 
+static const struct media_device_ops fimc_md_ops = {
+       .link_notify = fimc_md_link_notify,
+};
+
 static ssize_t fimc_md_sysfs_show(struct device *dev,
                                  struct device_attribute *attr, char *buf)
 {
@@ -1416,7 +1420,7 @@ static int fimc_md_probe(struct platform_device *pdev)
 
        strlcpy(fmd->media_dev.model, "SAMSUNG S5P FIMC",
                sizeof(fmd->media_dev.model));
-       fmd->media_dev.link_notify = fimc_md_link_notify;
+       fmd->media_dev.ops = &fimc_md_ops;
        fmd->media_dev.dev = dev;
 
        v4l2_dev = &fmd->v4l2_dev;
index 5d54e2c6c16bdc4eeb0f081efc2c51421e234e29..0321d84addc776c6c5e74c4c0bbe86d1afc9c752 100644 (file)
@@ -657,6 +657,10 @@ static irqreturn_t isp_isr(int irq, void *_isp)
        return IRQ_HANDLED;
 }
 
+static const struct media_device_ops isp_media_ops = {
+       .link_notify = v4l2_pipeline_link_notify,
+};
+
 /* -----------------------------------------------------------------------------
  * Pipeline stream management
  */
@@ -1680,7 +1684,7 @@ static int isp_register_entities(struct isp_device *isp)
        strlcpy(isp->media_dev.model, "TI OMAP3 ISP",
                sizeof(isp->media_dev.model));
        isp->media_dev.hw_revision = isp->revision;
-       isp->media_dev.link_notify = v4l2_pipeline_link_notify;
+       isp->media_dev.ops = &isp_media_ops;
        media_device_init(&isp->media_dev);
 
        isp->v4l2_dev.mdev = &isp->media_dev;
index 6ceb4eb00493da8dc58ce78e4583d2d5bf95b2d7..ffc4900da9612382a03873c80e07309e372a150b 100644 (file)
@@ -362,6 +362,10 @@ static irqreturn_t iss_isr(int irq, void *_iss)
        return IRQ_HANDLED;
 }
 
+static const struct media_device_ops iss_media_ops = {
+       .link_notify = v4l2_pipeline_link_notify,
+};
+
 /* -----------------------------------------------------------------------------
  * Pipeline stream management
  */
@@ -988,7 +992,7 @@ static int iss_register_entities(struct iss_device *iss)
        strlcpy(iss->media_dev.model, "TI OMAP4 ISS",
                sizeof(iss->media_dev.model));
        iss->media_dev.hw_revision = iss->revision;
-       iss->media_dev.link_notify = v4l2_pipeline_link_notify;
+       iss->media_dev.ops = &iss_media_ops;
        ret = media_device_register(&iss->media_dev);
        if (ret < 0) {
                dev_err(iss->dev, "Media device registration failed (%d)\n",
index 481dd6c672cbda8863e69362e84fe72ba9ef7412..ef93e21335dfb1fd5967b5b0cda845f236c10170 100644 (file)
@@ -48,6 +48,16 @@ struct media_entity_notify {
        void (*notify)(struct media_entity *entity, void *notify_data);
 };
 
+/**
+ * struct media_device_ops - Media device operations
+ * @link_notify: Link state change notification callback. This callback is
+ *              called with the graph_mutex held.
+ */
+struct media_device_ops {
+       int (*link_notify)(struct media_link *link, u32 flags,
+                          unsigned int notification);
+};
+
 /**
  * struct media_device - Media device
  * @dev:       Parent device
@@ -80,8 +90,7 @@ struct media_entity_notify {
  * @enable_source: Enable Source Handler function pointer
  * @disable_source: Disable Source Handler function pointer
  *
- * @link_notify: Link state change notification callback. This callback is
- *              called with the graph_mutex held.
+ * @ops:       Operation handler callbacks
  *
  * This structure represents an abstract high-level media device. It allows easy
  * access to entities and provides basic media device-level support. The
@@ -150,8 +159,7 @@ struct media_device {
                             struct media_pipeline *pipe);
        void (*disable_source)(struct media_entity *entity);
 
-       int (*link_notify)(struct media_link *link, u32 flags,
-                          unsigned int notification);
+       const struct media_device_ops *ops;
 };
 
 /* We don't need to include pci.h or usb.h here */