media: staging: rkisp1: replace the call to v4l2_async_notifier_parse_fwnode_endpoint...
authorDafna Hirschfeld <dafna.hirschfeld@collabora.com>
Tue, 17 Mar 2020 18:07:01 +0000 (19:07 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 21 Apr 2020 15:21:10 +0000 (17:21 +0200)
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>
drivers/staging/media/rkisp1/TODO
drivers/staging/media/rkisp1/rkisp1-dev.c

index f495b8177767624ed334a846be41155139df7aba..c0cbec0a164d273b68166281059c1f45b2646fda 100644 (file)
@@ -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.
index ec7d9cf291069eb8092b5c6961a2d08d2b6ff0e0..9ac38bafb839959feb7ed77c7dc726957fa5c0c8 100644 (file)
@@ -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)
-               return 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;
 
-       if (list_empty(&ntf->asd_list))
-               return -ENODEV;
+               ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(rkisp1->dev),
+                       0, next_id, FWNODE_GRAPH_ENDPOINT_NEXT);
+               if (!ep)
+                       break;
 
-       ntf->ops = &rkisp1_subdev_notifier_ops;
+               ret = v4l2_fwnode_endpoint_parse(ep, &vep);
+               if (ret)
+                       goto err_parse;
 
-       return v4l2_async_notifier_register(&rkisp1->v4l2_dev, ntf);
+               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 (next_id == 0)
+               dev_dbg(rkisp1->dev, "no remote subdevice found\n");
+       ntf->ops = &rkisp1_subdev_notifier_ops;
+       ret = v4l2_async_notifier_register(&rkisp1->v4l2_dev, ntf);
+       if (ret) {
+               v4l2_async_notifier_cleanup(ntf);
+               return ret;
+       }
+       return 0;
 }
 
 /* ----------------------------------------------------------------------------