]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
media: rcar-vin: Change link setup argument
authorNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Fri, 13 Jun 2025 15:34:24 +0000 (17:34 +0200)
committerHans Verkuil <hverkuil@xs4all.nl>
Mon, 16 Jun 2025 06:52:14 +0000 (08:52 +0200)
The link setup callback once acted on each VIN instance, and expected to
be called once for each VIN instance. This have changed as the driver
grew support for later hardware generations and the callback is now
expected to setup links for all VIN in the group.

The argument to the callback has however remained a pointer to a single
VIN instance. This pointer was then used to get the group structure. Fix
this and pass the group as the single argument to the link setup
callback making the expectation of the function clear.

There is no intentional change in behavior.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Tested-by: Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Link: https://lore.kernel.org/r/20250613153434.2001800-4-niklas.soderlund+renesas@ragnatech.se
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
drivers/media/platform/renesas/rcar-vin/rcar-core.c
drivers/media/platform/renesas/rcar-vin/rcar-vin.h

index 66efe075adae7a857998553c8ba81590a809620d..73d713868391972e29dae84248fa10d2582c4167 100644 (file)
@@ -65,7 +65,7 @@ static void rvin_group_cleanup(struct rvin_group *group)
 }
 
 static int rvin_group_init(struct rvin_group *group, struct rvin_dev *vin,
-                          int (*link_setup)(struct rvin_dev *),
+                          int (*link_setup)(struct rvin_group *),
                           const struct media_device_ops *ops)
 {
        struct media_device *mdev = &group->mdev;
@@ -115,7 +115,7 @@ static void rvin_group_release(struct kref *kref)
 }
 
 static int rvin_group_get(struct rvin_dev *vin,
-                         int (*link_setup)(struct rvin_dev *),
+                         int (*link_setup)(struct rvin_group *),
                          const struct media_device_ops *ops)
 {
        struct rvin_group *group;
@@ -247,7 +247,7 @@ static int rvin_group_notify_complete(struct v4l2_async_notifier *notifier)
                }
        }
 
-       return vin->group->link_setup(vin);
+       return vin->group->link_setup(vin->group);
 }
 
 static void rvin_group_notify_unbind(struct v4l2_async_notifier *notifier,
@@ -910,35 +910,35 @@ static int rvin_csi2_create_link(struct rvin_group *group, unsigned int id,
        return 0;
 }
 
-static int rvin_csi2_setup_links(struct rvin_dev *vin)
+static int rvin_csi2_setup_links(struct rvin_group *group)
 {
        const struct rvin_group_route *route;
        unsigned int id;
        int ret = -EINVAL;
 
        /* Create all media device links between VINs and CSI-2's. */
-       mutex_lock(&vin->group->lock);
-       for (route = vin->info->routes; route->chsel; route++) {
+       mutex_lock(&group->lock);
+       for (route = group->info->routes; route->chsel; route++) {
                /* Check that VIN' master is part of the group. */
-               if (!vin->group->vin[route->master])
+               if (!group->vin[route->master])
                        continue;
 
                /* Check that CSI-2 is part of the group. */
-               if (!vin->group->remotes[route->csi].subdev)
+               if (!group->remotes[route->csi].subdev)
                        continue;
 
                for (id = route->master; id < route->master + 4; id++) {
                        /* Check that VIN is part of the group. */
-                       if (!vin->group->vin[id])
+                       if (!group->vin[id])
                                continue;
 
-                       ret = rvin_csi2_create_link(vin->group, id, route);
+                       ret = rvin_csi2_create_link(group, id, route);
                        if (ret)
                                goto out;
                }
        }
 out:
-       mutex_unlock(&vin->group->lock);
+       mutex_unlock(&group->lock);
 
        return ret;
 }
@@ -992,30 +992,31 @@ err_controls:
  * ISP
  */
 
-static int rvin_isp_setup_links(struct rvin_dev *vin)
+static int rvin_isp_setup_links(struct rvin_group *group)
 {
        unsigned int i;
        int ret = -EINVAL;
 
        /* Create all media device links between VINs and ISP's. */
-       mutex_lock(&vin->group->lock);
+       mutex_lock(&group->lock);
        for (i = 0; i < RCAR_VIN_NUM; i++) {
                struct media_pad *source_pad, *sink_pad;
                struct media_entity *source, *sink;
                unsigned int source_slot = i / 8;
                unsigned int source_idx = i % 8 + 1;
+               struct rvin_dev *vin = group->vin[i];
 
-               if (!vin->group->vin[i])
+               if (!vin)
                        continue;
 
                /* Check that ISP is part of the group. */
-               if (!vin->group->remotes[source_slot].subdev)
+               if (!group->remotes[source_slot].subdev)
                        continue;
 
-               source = &vin->group->remotes[source_slot].subdev->entity;
+               source = &group->remotes[source_slot].subdev->entity;
                source_pad = &source->pads[source_idx];
 
-               sink = &vin->group->vin[i]->vdev.entity;
+               sink = &vin->vdev.entity;
                sink_pad = &sink->pads[0];
 
                /* Skip if link already exists. */
@@ -1031,7 +1032,7 @@ static int rvin_isp_setup_links(struct rvin_dev *vin)
                        break;
                }
        }
-       mutex_unlock(&vin->group->lock);
+       mutex_unlock(&group->lock);
 
        return ret;
 }
index 313703cd110325c0b06a1d4df71a91a595947e11..cb8e8fa54f96fc21c44824d90bd609f1b4f14bad 100644 (file)
@@ -259,7 +259,7 @@ struct rvin_group {
        const struct rvin_info *info;
        struct rvin_dev *vin[RCAR_VIN_NUM];
 
-       int (*link_setup)(struct rvin_dev *vin);
+       int (*link_setup)(struct rvin_group *group);
 
        struct {
                struct v4l2_async_connection *asc;