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-rac...@live.ca>
---
Changes from v1:
- Separated parsing each endpoint into separate func
---
 drivers/media/platform/exynos4-is/media-dev.c | 28 +++++++++++++------
 1 file changed, 19 insertions(+), 9 deletions(-)

diff --git a/drivers/media/platform/exynos4-is/media-dev.c 
b/drivers/media/platform/exynos4-is/media-dev.c
index 70b0a70840cf..6d9b8fe3ac79 100644
--- a/drivers/media/platform/exynos4-is/media-dev.c
+++ b/drivers/media/platform/exynos4-is/media-dev.c
@@ -394,21 +394,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);
@@ -482,6 +476,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)
 {
-- 
2.20.1

Reply via email to