]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
media: exynos4-is: Add support for multiple sensors on one port
authorJonathan Bakker <xc-racer2@live.ca>
Thu, 30 Jul 2020 23:01:10 +0000 (01:01 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 1 Sep 2020 12:13:25 +0000 (14:13 +0200)
On some devices, there may be multiple camera sensors attached
to the same port.  Make sure we probe all of them, not just the
first one.

Signed-off-by: Jonathan Bakker <xc-racer2@live.ca>
Reviewed-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/exynos4-is/media-dev.c

index 1ca9050195d601f6eabb1354d932b9c9eeb75392..7d92793a8e74af75b9f0c8170bbb63699dc9ce87 100644 (file)
@@ -395,21 +395,15 @@ static void fimc_md_pipelines_free(struct fimc_md *fmd)
        }
 }
 
-/* Parse port node and register as a sub-device any sensor specified there. */
-static int fimc_md_parse_port_node(struct fimc_md *fmd,
-                                  struct device_node *port)
+static int fimc_md_parse_one_endpoint(struct fimc_md *fmd,
+                                  struct device_node *ep)
 {
        int index = fmd->num_sensors;
        struct fimc_source_info *pd = &fmd->sensor[index].pdata;
-       struct device_node *rem, *ep, *np;
+       struct device_node *rem, *np;
        struct v4l2_fwnode_endpoint endpoint = { .bus_type = 0 };
        int ret;
 
-       /* Assume here a port node can have only one endpoint node. */
-       ep = of_get_next_child(port, NULL);
-       if (!ep)
-               return 0;
-
        ret = v4l2_fwnode_endpoint_parse(of_fwnode_handle(ep), &endpoint);
        if (ret) {
                of_node_put(ep);
@@ -483,6 +477,22 @@ static int fimc_md_parse_port_node(struct fimc_md *fmd,
        return 0;
 }
 
+/* Parse port node and register as a sub-device any sensor specified there. */
+static int fimc_md_parse_port_node(struct fimc_md *fmd,
+                                  struct device_node *port)
+{
+       struct device_node *ep;
+       int ret;
+
+       for_each_child_of_node(port, ep) {
+               ret = fimc_md_parse_one_endpoint(fmd, ep);
+               if (ret < 0)
+                       return ret;
+       }
+
+       return 0;
+}
+
 /* Register all SoC external sub-devices */
 static int fimc_md_register_sensor_entities(struct fimc_md *fmd)
 {