On 07/21/2017 11:55 AM, Kieran Bingham wrote:
> Use a container_of macro to obtain the graph entity object from the ASD
> This removes the error conditions, and reduces the lock contention.
>
> (The locking may even be potentially removed)
I've set the status in patchwork to 'Not Applicable' since the patch isn't
against the mainline code. I leave it to Niklas to decide what to do with this.
Regards,
Hans
>
> Signed-off-by: Kieran Bingham <[email protected]>
> ---
>
> Hi Niklas,
>
> While working through the Multi camera setup, we came across this improvement.
>
> If this code isn't yet upstream, feel free to squash this change into your
> existing branch if you wish.
>
> Regards
>
> Kieran
>
> drivers/media/platform/rcar-vin/rcar-core.c | 28 ++++++----------------------
> drivers/media/platform/rcar-vin/rcar-vin.h | 3 +++
> 2 files changed, 9 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/media/platform/rcar-vin/rcar-core.c
> b/drivers/media/platform/rcar-vin/rcar-core.c
> index 8393a1598660..b4fc7b56c8a1 100644
> --- a/drivers/media/platform/rcar-vin/rcar-core.c
> +++ b/drivers/media/platform/rcar-vin/rcar-core.c
> @@ -688,20 +688,11 @@ static void rvin_group_notify_unbind(struct
> v4l2_async_notifier *notifier,
> struct v4l2_async_subdev *asd)
> {
> struct rvin_dev *vin = notifier_to_vin(notifier);
> - unsigned int i;
> + struct rvin_graph_entity *csi = to_rvin_graph_entity(asd);
>
> mutex_lock(&vin->group->lock);
> - for (i = 0; i < RVIN_CSI_MAX; i++) {
> - if (&vin->group->csi[i].asd == asd) {
> - vin_dbg(vin, "Unbind CSI-2 %s\n", subdev->name);
> - vin->group->csi[i].subdev = NULL;
> - mutex_unlock(&vin->group->lock);
> - return;
> - }
> - }
> + csi->subdev = NULL;
> mutex_unlock(&vin->group->lock);
> -
> - vin_err(vin, "No entity for subdev %s to unbind\n", subdev->name);
> }
>
> static int rvin_group_notify_bound(struct v4l2_async_notifier *notifier,
> @@ -709,23 +700,16 @@ static int rvin_group_notify_bound(struct
> v4l2_async_notifier *notifier,
> struct v4l2_async_subdev *asd)
> {
> struct rvin_dev *vin = notifier_to_vin(notifier);
> - unsigned int i;
> + struct rvin_graph_entity *csi = to_rvin_graph_entity(asd);
>
> v4l2_set_subdev_hostdata(subdev, vin);
>
> mutex_lock(&vin->group->lock);
> - for (i = 0; i < RVIN_CSI_MAX; i++) {
> - if (&vin->group->csi[i].asd == asd) {
> - vin_dbg(vin, "Bound CSI-2 %s\n", subdev->name);
> - vin->group->csi[i].subdev = subdev;
> - mutex_unlock(&vin->group->lock);
> - return 0;
> - }
> - }
> + vin_dbg(vin, "Bound CSI-2 %s\n", subdev->name);
> + csi->subdev = subdev;
> mutex_unlock(&vin->group->lock);
>
> - vin_err(vin, "No entity for subdev %s to bind\n", subdev->name);
> - return -EINVAL;
> + return 0;
> }
>
> static struct device_node *rvin_group_get_csi(struct rvin_dev *vin,
> diff --git a/drivers/media/platform/rcar-vin/rcar-vin.h
> b/drivers/media/platform/rcar-vin/rcar-vin.h
> index e7e600fdf566..900c473c3d15 100644
> --- a/drivers/media/platform/rcar-vin/rcar-vin.h
> +++ b/drivers/media/platform/rcar-vin/rcar-vin.h
> @@ -92,6 +92,9 @@ struct rvin_graph_entity {
> unsigned int sink_pad;
> };
>
> +#define to_rvin_graph_entity(asd) \
> + container_of(asd, struct rvin_graph_entity, asd)
> +
> struct rvin_group;
>
>
>