[PATCH v2 07/11] media: exynos4-is: Add support for multiple sensors on one port

From: Jonathan Bakker
Date: Thu Jul 30 2020 - 19:02:11 EST


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@xxxxxxx>
---
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