aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2011-02-28 09:12:19 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-03-22 03:54:16 -0400
commit117182d18399a956719be94d3e6e17aad9210cda (patch)
treed888d420f2354af873d2db7acd997e371bf0ef45 /drivers
parent4ecbf5d1d2bb7d1e3882de79e512c1a0a2816581 (diff)
[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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/s5p-fimc/fimc-capture.c23
-rw-r--r--drivers/media/video/s5p-fimc/fimc-core.c22
2 files changed, 18 insertions, 27 deletions
diff --git a/drivers/media/video/s5p-fimc/fimc-capture.c b/drivers/media/video/s5p-fimc/fimc-capture.c
index 8312ce465f16..95f8b4e11e46 100644
--- a/drivers/media/video/s5p-fimc/fimc-capture.c
+++ b/drivers/media/video/s5p-fimc/fimc-capture.c
@@ -91,10 +91,10 @@ static int fimc_subdev_attach(struct fimc_dev *fimc, int index)
91 struct v4l2_subdev *sd; 91 struct v4l2_subdev *sd;
92 int i; 92 int i;
93 93
94 for (i = 0; i < FIMC_MAX_CAMIF_CLIENTS; ++i) { 94 for (i = 0; i < pdata->num_clients; ++i) {
95 isp_info = pdata->isp_info[i]; 95 isp_info = &pdata->isp_info[i];
96 96
97 if (!isp_info || (index >= 0 && i != index)) 97 if (index >= 0 && i != index)
98 continue; 98 continue;
99 99
100 sd = fimc_subdev_register(fimc, isp_info); 100 sd = fimc_subdev_register(fimc, isp_info);
@@ -116,14 +116,13 @@ static int fimc_subdev_attach(struct fimc_dev *fimc, int index)
116static int fimc_isp_subdev_init(struct fimc_dev *fimc, unsigned int index) 116static int fimc_isp_subdev_init(struct fimc_dev *fimc, unsigned int index)
117{ 117{
118 struct s5p_fimc_isp_info *isp_info; 118 struct s5p_fimc_isp_info *isp_info;
119 struct s5p_platform_fimc *pdata = fimc->pdata;
119 int ret; 120 int ret;
120 121
121 if (index >= FIMC_MAX_CAMIF_CLIENTS) 122 if (index >= pdata->num_clients)
122 return -EINVAL; 123 return -EINVAL;
123 124
124 isp_info = fimc->pdata->isp_info[index]; 125 isp_info = &pdata->isp_info[index];
125 if (!isp_info)
126 return -EINVAL;
127 126
128 if (isp_info->clk_frequency) 127 if (isp_info->clk_frequency)
129 clk_set_rate(fimc->clock[CLK_CAM], isp_info->clk_frequency); 128 clk_set_rate(fimc->clock[CLK_CAM], isp_info->clk_frequency);
@@ -215,7 +214,7 @@ static int start_streaming(struct vb2_queue *q)
215 if (ret) 214 if (ret)
216 return ret; 215 return ret;
217 216
218 isp_info = fimc->pdata->isp_info[fimc->vid_cap.input_index]; 217 isp_info = &fimc->pdata->isp_info[fimc->vid_cap.input_index];
219 fimc_hw_set_camera_type(fimc, isp_info); 218 fimc_hw_set_camera_type(fimc, isp_info);
220 fimc_hw_set_camera_source(fimc, isp_info); 219 fimc_hw_set_camera_source(fimc, isp_info);
221 fimc_hw_set_camera_offset(fimc, &ctx->s_frame); 220 fimc_hw_set_camera_offset(fimc, &ctx->s_frame);
@@ -567,12 +566,10 @@ static int fimc_cap_enum_input(struct file *file, void *priv,
567 struct s5p_platform_fimc *pldata = ctx->fimc_dev->pdata; 566 struct s5p_platform_fimc *pldata = ctx->fimc_dev->pdata;
568 struct s5p_fimc_isp_info *isp_info; 567 struct s5p_fimc_isp_info *isp_info;
569 568
570 if (i->index >= FIMC_MAX_CAMIF_CLIENTS) 569 if (i->index >= pldata->num_clients)
571 return -EINVAL; 570 return -EINVAL;
572 571
573 isp_info = pldata->isp_info[i->index]; 572 isp_info = &pldata->isp_info[i->index];
574 if (isp_info == NULL)
575 return -EINVAL;
576 573
577 i->type = V4L2_INPUT_TYPE_CAMERA; 574 i->type = V4L2_INPUT_TYPE_CAMERA;
578 strncpy(i->name, isp_info->board_info->type, 32); 575 strncpy(i->name, isp_info->board_info->type, 32);
@@ -589,7 +586,7 @@ static int fimc_cap_s_input(struct file *file, void *priv,
589 if (fimc_capture_active(ctx->fimc_dev)) 586 if (fimc_capture_active(ctx->fimc_dev))
590 return -EBUSY; 587 return -EBUSY;
591 588
592 if (i >= FIMC_MAX_CAMIF_CLIENTS || !pdata->isp_info[i]) 589 if (i >= pdata->num_clients)
593 return -EINVAL; 590 return -EINVAL;
594 591
595 592
diff --git a/drivers/media/video/s5p-fimc/fimc-core.c b/drivers/media/video/s5p-fimc/fimc-core.c
index f506197201c8..b29937eba602 100644
--- a/drivers/media/video/s5p-fimc/fimc-core.c
+++ b/drivers/media/video/s5p-fimc/fimc-core.c
@@ -1577,6 +1577,7 @@ static int fimc_probe(struct platform_device *pdev)
1577 struct fimc_dev *fimc; 1577 struct fimc_dev *fimc;
1578 struct resource *res; 1578 struct resource *res;
1579 struct samsung_fimc_driverdata *drv_data; 1579 struct samsung_fimc_driverdata *drv_data;
1580 struct s5p_platform_fimc *pdata;
1580 int ret = 0; 1581 int ret = 0;
1581 int cap_input_index = -1; 1582 int cap_input_index = -1;
1582 1583
@@ -1598,7 +1599,8 @@ static int fimc_probe(struct platform_device *pdev)
1598 fimc->id = pdev->id; 1599 fimc->id = pdev->id;
1599 fimc->variant = drv_data->variant[fimc->id]; 1600 fimc->variant = drv_data->variant[fimc->id];
1600 fimc->pdev = pdev; 1601 fimc->pdev = pdev;
1601 fimc->pdata = pdev->dev.platform_data; 1602 pdata = pdev->dev.platform_data;
1603 fimc->pdata = pdata;
1602 fimc->state = ST_IDLE; 1604 fimc->state = ST_IDLE;
1603 1605
1604 init_waitqueue_head(&fimc->irq_queue); 1606 init_waitqueue_head(&fimc->irq_queue);
@@ -1629,19 +1631,11 @@ static int fimc_probe(struct platform_device *pdev)
1629 } 1631 }
1630 1632
1631 fimc->num_clocks = MAX_FIMC_CLOCKS - 1; 1633 fimc->num_clocks = MAX_FIMC_CLOCKS - 1;
1632 /* 1634
1633 * Check if vide capture node needs to be registered for this device 1635 /* Check if a video capture node needs to be registered. */
1634 * instance. 1636 if (pdata && pdata->num_clients > 0) {
1635 */ 1637 cap_input_index = 0;
1636 if (fimc->pdata) { 1638 fimc->num_clocks++;
1637 int i;
1638 for (i = 0; i < FIMC_MAX_CAMIF_CLIENTS; ++i)
1639 if (fimc->pdata->isp_info[i])
1640 break;
1641 if (i < FIMC_MAX_CAMIF_CLIENTS) {
1642 cap_input_index = i;
1643 fimc->num_clocks++;
1644 }
1645 } 1639 }
1646 1640
1647 ret = fimc_clk_get(fimc); 1641 ret = fimc_clk_get(fimc);