Commit a597a772 authored by Jacopo Mondi's avatar Jacopo Mondi Committed by Mauro Carvalho Chehab

media: rcar-vin: Parse parallel input on Gen3

The rcar-vin driver so far had a mutually exclusive code path for
handling parallel and CSI-2 video input subdevices, with only the CSI-2
use case supporting media-controller. As we add support for parallel
inputs to Gen3 media-controller compliant code path now parse both port@0
and port@1, handling the media-controller use case in the parallel
bound/unbind notifier operations.
Signed-off-by: default avatarJacopo Mondi <jacopo+renesas@jmondi.org>
Acked-by: default avatarNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 158e2a53
......@@ -397,6 +397,11 @@ static int rvin_parallel_subdevice_attach(struct rvin_dev *vin,
ret = rvin_find_pad(subdev, MEDIA_PAD_FL_SINK);
vin->parallel->sink_pad = ret < 0 ? 0 : ret;
if (vin->info->use_mc) {
vin->parallel->subdev = subdev;
return 0;
}
/* Find compatible subdevices mbus format */
vin->mbus_code = 0;
code.index = 0;
......@@ -458,10 +463,12 @@ static int rvin_parallel_subdevice_attach(struct rvin_dev *vin,
static void rvin_parallel_subdevice_detach(struct rvin_dev *vin)
{
rvin_v4l2_unregister(vin);
v4l2_ctrl_handler_free(&vin->ctrl_handler);
vin->parallel->subdev = NULL;
if (!vin->info->use_mc) {
v4l2_ctrl_handler_free(&vin->ctrl_handler);
vin->vdev.ctrl_handler = NULL;
vin->parallel->subdev = NULL;
}
}
static int rvin_parallel_notify_complete(struct v4l2_async_notifier *notifier)
......@@ -550,18 +557,19 @@ static int rvin_parallel_parse_v4l2(struct device *dev,
return 0;
}
static int rvin_parallel_graph_init(struct rvin_dev *vin)
static int rvin_parallel_init(struct rvin_dev *vin)
{
int ret;
ret = v4l2_async_notifier_parse_fwnode_endpoints(
vin->dev, &vin->notifier,
sizeof(struct rvin_parallel_entity), rvin_parallel_parse_v4l2);
ret = v4l2_async_notifier_parse_fwnode_endpoints_by_port(
vin->dev, &vin->notifier, sizeof(struct rvin_parallel_entity),
0, rvin_parallel_parse_v4l2);
if (ret)
return ret;
/* If using mc, it's fine not to have any input registered. */
if (!vin->parallel)
return -ENODEV;
return vin->info->use_mc ? 0 : -ENODEV;
vin_dbg(vin, "Found parallel subdevice %pOF\n",
to_of_node(vin->parallel->asd.match.fwnode));
......@@ -1122,20 +1130,35 @@ static int rcar_vin_probe(struct platform_device *pdev)
return ret;
platform_set_drvdata(pdev, vin);
if (vin->info->use_mc)
if (vin->info->use_mc) {
ret = rvin_mc_init(vin);
else
ret = rvin_parallel_graph_init(vin);
if (ret < 0)
goto error;
if (ret)
goto error_dma_unregister;
}
ret = rvin_parallel_init(vin);
if (ret)
goto error_group_unregister;
pm_suspend_ignore_children(&pdev->dev, true);
pm_runtime_enable(&pdev->dev);
return 0;
error:
error_group_unregister:
if (vin->info->use_mc) {
mutex_lock(&vin->group->lock);
if (&vin->v4l2_dev == vin->group->notifier.v4l2_dev) {
v4l2_async_notifier_unregister(&vin->group->notifier);
v4l2_async_notifier_cleanup(&vin->group->notifier);
}
mutex_unlock(&vin->group->lock);
rvin_group_put(vin);
}
error_dma_unregister:
rvin_dma_unregister(vin);
v4l2_async_notifier_cleanup(&vin->notifier);
return ret;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment