mirror of https://gitee.com/openkylin/linux.git
media: staging: rkisp1: replace the call to v4l2_async_notifier_parse_fwnode_endpoints_by_port
don't call 'v4l2_async_notifier_parse_fwnode_endpoints_by_port' in order to register async subdevices. Instead call 'v4l2_fwnode_endpoint_parse' to parse the remote endpoints and then register each async subdev with 'v4l2_async_notifier_add_fwnode_remote_subdev' Also remove the relevant item in the TODO file Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> Acked-by: Helen Koike <helen.koike@collabora.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
4d0b43804c
commit
1d3ac27801
|
@ -1,6 +1,3 @@
|
|||
* Don't use v4l2_async_notifier_parse_fwnode_endpoints_by_port().
|
||||
e.g. isp_parse_of_endpoints in drivers/media/platform/omap3isp/isp.c
|
||||
cio2_parse_firmware in drivers/media/pci/intel/ipu3/ipu3-cio2.c.
|
||||
* Fix pad format size for statistics and parameters entities.
|
||||
* Use threaded interrupt for rkisp1_stats_isr(), remove work queue.
|
||||
* Fix checkpatch errors.
|
||||
|
|
|
@ -233,33 +233,6 @@ static int rkisp1_subdev_notifier_complete(struct v4l2_async_notifier *notifier)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int rkisp1_fwnode_parse(struct device *dev,
|
||||
struct v4l2_fwnode_endpoint *vep,
|
||||
struct v4l2_async_subdev *asd)
|
||||
{
|
||||
struct rkisp1_sensor_async *s_asd =
|
||||
container_of(asd, struct rkisp1_sensor_async, asd);
|
||||
|
||||
if (vep->bus_type != V4L2_MBUS_CSI2_DPHY) {
|
||||
dev_err(dev, "Only CSI2 bus type is currently supported\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (vep->base.port != 0) {
|
||||
dev_err(dev, "The ISP has only port 0\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
s_asd->mbus_type = vep->bus_type;
|
||||
s_asd->mbus_flags = vep->bus.mipi_csi2.flags;
|
||||
s_asd->lanes = vep->bus.mipi_csi2.num_data_lanes;
|
||||
|
||||
if (s_asd->lanes < 1 || s_asd->lanes > 4)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct v4l2_async_notifier_operations rkisp1_subdev_notifier_ops = {
|
||||
.bound = rkisp1_subdev_notifier_bound,
|
||||
.unbind = rkisp1_subdev_notifier_unbind,
|
||||
|
@ -269,23 +242,66 @@ static const struct v4l2_async_notifier_operations rkisp1_subdev_notifier_ops =
|
|||
static int rkisp1_subdev_notifier(struct rkisp1_device *rkisp1)
|
||||
{
|
||||
struct v4l2_async_notifier *ntf = &rkisp1->notifier;
|
||||
struct device *dev = rkisp1->dev;
|
||||
unsigned int next_id = 0;
|
||||
int ret;
|
||||
|
||||
v4l2_async_notifier_init(ntf);
|
||||
|
||||
ret = v4l2_async_notifier_parse_fwnode_endpoints_by_port(dev, ntf,
|
||||
sizeof(struct rkisp1_sensor_async),
|
||||
0, rkisp1_fwnode_parse);
|
||||
if (ret)
|
||||
while (1) {
|
||||
struct v4l2_fwnode_endpoint vep = {
|
||||
.bus_type = V4L2_MBUS_CSI2_DPHY
|
||||
};
|
||||
struct rkisp1_sensor_async *rk_asd = NULL;
|
||||
struct fwnode_handle *ep;
|
||||
|
||||
ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(rkisp1->dev),
|
||||
0, next_id, FWNODE_GRAPH_ENDPOINT_NEXT);
|
||||
if (!ep)
|
||||
break;
|
||||
|
||||
ret = v4l2_fwnode_endpoint_parse(ep, &vep);
|
||||
if (ret)
|
||||
goto err_parse;
|
||||
|
||||
rk_asd = kzalloc(sizeof(*rk_asd), GFP_KERNEL);
|
||||
if (!rk_asd) {
|
||||
ret = -ENOMEM;
|
||||
goto err_parse;
|
||||
}
|
||||
|
||||
rk_asd->mbus_type = vep.bus_type;
|
||||
rk_asd->mbus_flags = vep.bus.mipi_csi2.flags;
|
||||
rk_asd->lanes = vep.bus.mipi_csi2.num_data_lanes;
|
||||
|
||||
ret = v4l2_async_notifier_add_fwnode_remote_subdev(ntf, ep,
|
||||
&rk_asd->asd);
|
||||
if (ret)
|
||||
goto err_parse;
|
||||
|
||||
dev_dbg(rkisp1->dev, "registered ep id %d with %d lanes\n",
|
||||
vep.base.id, rk_asd->lanes);
|
||||
|
||||
next_id = vep.base.id + 1;
|
||||
|
||||
fwnode_handle_put(ep);
|
||||
|
||||
continue;
|
||||
err_parse:
|
||||
fwnode_handle_put(ep);
|
||||
kfree(rk_asd);
|
||||
v4l2_async_notifier_cleanup(ntf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (list_empty(&ntf->asd_list))
|
||||
return -ENODEV;
|
||||
|
||||
if (next_id == 0)
|
||||
dev_dbg(rkisp1->dev, "no remote subdevice found\n");
|
||||
ntf->ops = &rkisp1_subdev_notifier_ops;
|
||||
|
||||
return v4l2_async_notifier_register(&rkisp1->v4l2_dev, ntf);
|
||||
ret = v4l2_async_notifier_register(&rkisp1->v4l2_dev, ntf);
|
||||
if (ret) {
|
||||
v4l2_async_notifier_cleanup(ntf);
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue