[media] s5p-fimc: Allow defining number of sensors at runtime

Add num_clients field to struct s5p_fimc_isp_info to define exactly
size of clients array which simplifies a bit the sensors management.

Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
diff --git a/drivers/media/video/s5p-fimc/fimc-capture.c b/drivers/media/video/s5p-fimc/fimc-capture.c
index 8312ce4..95f8b4e1 100644
--- a/drivers/media/video/s5p-fimc/fimc-capture.c
+++ b/drivers/media/video/s5p-fimc/fimc-capture.c
@@ -91,10 +91,10 @@
 	struct v4l2_subdev *sd;
 	int i;
 
-	for (i = 0; i < FIMC_MAX_CAMIF_CLIENTS; ++i) {
-		isp_info = pdata->isp_info[i];
+	for (i = 0; i < pdata->num_clients; ++i) {
+		isp_info = &pdata->isp_info[i];
 
-		if (!isp_info || (index >= 0 && i != index))
+		if (index >= 0 && i != index)
 			continue;
 
 		sd = fimc_subdev_register(fimc, isp_info);
@@ -116,14 +116,13 @@
 static int fimc_isp_subdev_init(struct fimc_dev *fimc, unsigned int index)
 {
 	struct s5p_fimc_isp_info *isp_info;
+	struct s5p_platform_fimc *pdata = fimc->pdata;
 	int ret;
 
-	if (index >= FIMC_MAX_CAMIF_CLIENTS)
+	if (index >= pdata->num_clients)
 		return -EINVAL;
 
-	isp_info = fimc->pdata->isp_info[index];
-	if (!isp_info)
-		return -EINVAL;
+	isp_info = &pdata->isp_info[index];
 
 	if (isp_info->clk_frequency)
 		clk_set_rate(fimc->clock[CLK_CAM], isp_info->clk_frequency);
@@ -215,7 +214,7 @@
 	if (ret)
 		return ret;
 
-	isp_info = fimc->pdata->isp_info[fimc->vid_cap.input_index];
+	isp_info = &fimc->pdata->isp_info[fimc->vid_cap.input_index];
 	fimc_hw_set_camera_type(fimc, isp_info);
 	fimc_hw_set_camera_source(fimc, isp_info);
 	fimc_hw_set_camera_offset(fimc, &ctx->s_frame);
@@ -567,12 +566,10 @@
 	struct s5p_platform_fimc *pldata = ctx->fimc_dev->pdata;
 	struct s5p_fimc_isp_info *isp_info;
 
-	if (i->index >= FIMC_MAX_CAMIF_CLIENTS)
+	if (i->index >= pldata->num_clients)
 		return -EINVAL;
 
-	isp_info = pldata->isp_info[i->index];
-	if (isp_info == NULL)
-		return -EINVAL;
+	isp_info = &pldata->isp_info[i->index];
 
 	i->type = V4L2_INPUT_TYPE_CAMERA;
 	strncpy(i->name, isp_info->board_info->type, 32);
@@ -589,7 +586,7 @@
 	if (fimc_capture_active(ctx->fimc_dev))
 		return -EBUSY;
 
-	if (i >= FIMC_MAX_CAMIF_CLIENTS || !pdata->isp_info[i])
+	if (i >= pdata->num_clients)
 		return -EINVAL;
 
 
diff --git a/drivers/media/video/s5p-fimc/fimc-core.c b/drivers/media/video/s5p-fimc/fimc-core.c
index f506197..b29937e 100644
--- a/drivers/media/video/s5p-fimc/fimc-core.c
+++ b/drivers/media/video/s5p-fimc/fimc-core.c
@@ -1577,6 +1577,7 @@
 	struct fimc_dev *fimc;
 	struct resource *res;
 	struct samsung_fimc_driverdata *drv_data;
+	struct s5p_platform_fimc *pdata;
 	int ret = 0;
 	int cap_input_index = -1;
 
@@ -1598,7 +1599,8 @@
 	fimc->id = pdev->id;
 	fimc->variant = drv_data->variant[fimc->id];
 	fimc->pdev = pdev;
-	fimc->pdata = pdev->dev.platform_data;
+	pdata = pdev->dev.platform_data;
+	fimc->pdata = pdata;
 	fimc->state = ST_IDLE;
 
 	init_waitqueue_head(&fimc->irq_queue);
@@ -1629,19 +1631,11 @@
 	}
 
 	fimc->num_clocks = MAX_FIMC_CLOCKS - 1;
-	/*
-	 * Check if vide capture node needs to be registered for this device
-	 * instance.
-	 */
-	if (fimc->pdata) {
-		int i;
-		for (i = 0; i < FIMC_MAX_CAMIF_CLIENTS; ++i)
-			if (fimc->pdata->isp_info[i])
-				break;
-		if (i < FIMC_MAX_CAMIF_CLIENTS) {
-			cap_input_index = i;
-			fimc->num_clocks++;
-		}
+
+	/* Check if a video capture node needs to be registered. */
+	if (pdata && pdata->num_clients > 0) {
+		cap_input_index = 0;
+		fimc->num_clocks++;
 	}
 
 	ret = fimc_clk_get(fimc);
diff --git a/include/media/s5p_fimc.h b/include/media/s5p_fimc.h
index 0d457ca..82496d3 100644
--- a/include/media/s5p_fimc.h
+++ b/include/media/s5p_fimc.h
@@ -46,15 +46,14 @@
 	u16 flags;
 };
 
-
-#define FIMC_MAX_CAMIF_CLIENTS	2
-
 /**
  * struct s5p_platform_fimc - camera host interface platform data
  *
  * @isp_info: properties of camera sensor required for host interface setup
+ * @num_clients: the number of attached image sensors
  */
 struct s5p_platform_fimc {
-	struct s5p_fimc_isp_info *isp_info[FIMC_MAX_CAMIF_CLIENTS];
+	struct s5p_fimc_isp_info *isp_info;
+	int num_clients;
 };
 #endif /* S5P_FIMC_H_ */