diff options
author | Sylwester Nawrocki <s.nawrocki@samsung.com> | 2011-02-28 09:12:19 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-03-22 03:54:16 -0400 |
commit | 117182d18399a956719be94d3e6e17aad9210cda (patch) | |
tree | d888d420f2354af873d2db7acd997e371bf0ef45 /drivers | |
parent | 4ecbf5d1d2bb7d1e3882de79e512c1a0a2816581 (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.c | 23 | ||||
-rw-r--r-- | drivers/media/video/s5p-fimc/fimc-core.c | 22 |
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) | |||
116 | static int fimc_isp_subdev_init(struct fimc_dev *fimc, unsigned int index) | 116 | static 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); |