Commit 68a57fa9 authored by Javier Martinez Canillas's avatar Javier Martinez Canillas Committed by Mauro Carvalho Chehab

[media] omap3isp: create links after all subdevs have been bound

The omap3isp driver parses the graph endpoints to know how many subdevices
needs to be registered async and register notifiers callbacks for to know
when these are bound and when the async registrations are completed.

Currently the entities pad are linked with the correct ISP input interface
when the subdevs are bound but it happens before entitities are registered
with the media device so that won't work now that the entity links list is
initialized on device registration.

So instead creating the pad links when the subdevice is bound, create them
on the complete callback once all the subdevices have been bound but only
try to create for the ones that have a bus configuration set during bound.
Signed-off-by: default avatarJavier Martinez Canillas <javier@osg.samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent f2f6da0d
...@@ -2321,26 +2321,33 @@ static int isp_subdev_notifier_bound(struct v4l2_async_notifier *async, ...@@ -2321,26 +2321,33 @@ static int isp_subdev_notifier_bound(struct v4l2_async_notifier *async,
struct v4l2_subdev *subdev, struct v4l2_subdev *subdev,
struct v4l2_async_subdev *asd) struct v4l2_async_subdev *asd)
{ {
struct isp_device *isp = container_of(async, struct isp_device,
notifier);
struct isp_async_subdev *isd = struct isp_async_subdev *isd =
container_of(asd, struct isp_async_subdev, asd); container_of(asd, struct isp_async_subdev, asd);
int ret;
ret = isp_link_entity(isp, &subdev->entity, isd->bus.interface);
if (ret < 0)
return ret;
isd->sd = subdev; isd->sd = subdev;
isd->sd->host_priv = &isd->bus; isd->sd->host_priv = &isd->bus;
return ret; return 0;
} }
static int isp_subdev_notifier_complete(struct v4l2_async_notifier *async) static int isp_subdev_notifier_complete(struct v4l2_async_notifier *async)
{ {
struct isp_device *isp = container_of(async, struct isp_device, struct isp_device *isp = container_of(async, struct isp_device,
notifier); notifier);
struct v4l2_device *v4l2_dev = &isp->v4l2_dev;
struct v4l2_subdev *sd;
struct isp_bus_cfg *bus;
int ret;
list_for_each_entry(sd, &v4l2_dev->subdevs, list) {
/* Only try to link entities whose interface was set on bound */
if (sd->host_priv) {
bus = (struct isp_bus_cfg *)sd->host_priv;
ret = isp_link_entity(isp, &sd->entity, bus->interface);
if (ret < 0)
return ret;
}
}
return v4l2_device_register_subdev_nodes(&isp->v4l2_dev); return v4l2_device_register_subdev_nodes(&isp->v4l2_dev);
} }
......
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