提交 117182d1 编写于 作者: S Sylwester Nawrocki 提交者: Mauro Carvalho Chehab

[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: NSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: NKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 4ecbf5d1
...@@ -91,10 +91,10 @@ static int fimc_subdev_attach(struct fimc_dev *fimc, int index) ...@@ -91,10 +91,10 @@ static int fimc_subdev_attach(struct fimc_dev *fimc, int index)
struct v4l2_subdev *sd; struct v4l2_subdev *sd;
int i; int i;
for (i = 0; i < FIMC_MAX_CAMIF_CLIENTS; ++i) { for (i = 0; i < pdata->num_clients; ++i) {
isp_info = pdata->isp_info[i]; isp_info = &pdata->isp_info[i];
if (!isp_info || (index >= 0 && i != index)) if (index >= 0 && i != index)
continue; continue;
sd = fimc_subdev_register(fimc, isp_info); sd = fimc_subdev_register(fimc, isp_info);
...@@ -116,14 +116,13 @@ static int fimc_subdev_attach(struct fimc_dev *fimc, int index) ...@@ -116,14 +116,13 @@ static int fimc_subdev_attach(struct fimc_dev *fimc, int index)
static int fimc_isp_subdev_init(struct fimc_dev *fimc, unsigned int index) static int fimc_isp_subdev_init(struct fimc_dev *fimc, unsigned int index)
{ {
struct s5p_fimc_isp_info *isp_info; struct s5p_fimc_isp_info *isp_info;
struct s5p_platform_fimc *pdata = fimc->pdata;
int ret; int ret;
if (index >= FIMC_MAX_CAMIF_CLIENTS) if (index >= pdata->num_clients)
return -EINVAL; return -EINVAL;
isp_info = fimc->pdata->isp_info[index]; isp_info = &pdata->isp_info[index];
if (!isp_info)
return -EINVAL;
if (isp_info->clk_frequency) if (isp_info->clk_frequency)
clk_set_rate(fimc->clock[CLK_CAM], isp_info->clk_frequency); clk_set_rate(fimc->clock[CLK_CAM], isp_info->clk_frequency);
...@@ -215,7 +214,7 @@ static int start_streaming(struct vb2_queue *q) ...@@ -215,7 +214,7 @@ static int start_streaming(struct vb2_queue *q)
if (ret) if (ret)
return 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_type(fimc, isp_info);
fimc_hw_set_camera_source(fimc, isp_info); fimc_hw_set_camera_source(fimc, isp_info);
fimc_hw_set_camera_offset(fimc, &ctx->s_frame); 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,12 +566,10 @@ static int fimc_cap_enum_input(struct file *file, void *priv,
struct s5p_platform_fimc *pldata = ctx->fimc_dev->pdata; struct s5p_platform_fimc *pldata = ctx->fimc_dev->pdata;
struct s5p_fimc_isp_info *isp_info; struct s5p_fimc_isp_info *isp_info;
if (i->index >= FIMC_MAX_CAMIF_CLIENTS) if (i->index >= pldata->num_clients)
return -EINVAL; return -EINVAL;
isp_info = pldata->isp_info[i->index]; isp_info = &pldata->isp_info[i->index];
if (isp_info == NULL)
return -EINVAL;
i->type = V4L2_INPUT_TYPE_CAMERA; i->type = V4L2_INPUT_TYPE_CAMERA;
strncpy(i->name, isp_info->board_info->type, 32); 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,7 +586,7 @@ static int fimc_cap_s_input(struct file *file, void *priv,
if (fimc_capture_active(ctx->fimc_dev)) if (fimc_capture_active(ctx->fimc_dev))
return -EBUSY; return -EBUSY;
if (i >= FIMC_MAX_CAMIF_CLIENTS || !pdata->isp_info[i]) if (i >= pdata->num_clients)
return -EINVAL; return -EINVAL;
......
...@@ -1577,6 +1577,7 @@ static int fimc_probe(struct platform_device *pdev) ...@@ -1577,6 +1577,7 @@ static int fimc_probe(struct platform_device *pdev)
struct fimc_dev *fimc; struct fimc_dev *fimc;
struct resource *res; struct resource *res;
struct samsung_fimc_driverdata *drv_data; struct samsung_fimc_driverdata *drv_data;
struct s5p_platform_fimc *pdata;
int ret = 0; int ret = 0;
int cap_input_index = -1; int cap_input_index = -1;
...@@ -1598,7 +1599,8 @@ static int fimc_probe(struct platform_device *pdev) ...@@ -1598,7 +1599,8 @@ static int fimc_probe(struct platform_device *pdev)
fimc->id = pdev->id; fimc->id = pdev->id;
fimc->variant = drv_data->variant[fimc->id]; fimc->variant = drv_data->variant[fimc->id];
fimc->pdev = pdev; fimc->pdev = pdev;
fimc->pdata = pdev->dev.platform_data; pdata = pdev->dev.platform_data;
fimc->pdata = pdata;
fimc->state = ST_IDLE; fimc->state = ST_IDLE;
init_waitqueue_head(&fimc->irq_queue); init_waitqueue_head(&fimc->irq_queue);
...@@ -1629,19 +1631,11 @@ static int fimc_probe(struct platform_device *pdev) ...@@ -1629,19 +1631,11 @@ static int fimc_probe(struct platform_device *pdev)
} }
fimc->num_clocks = MAX_FIMC_CLOCKS - 1; fimc->num_clocks = MAX_FIMC_CLOCKS - 1;
/*
* Check if vide capture node needs to be registered for this device /* Check if a video capture node needs to be registered. */
* instance. if (pdata && pdata->num_clients > 0) {
*/ cap_input_index = 0;
if (fimc->pdata) { fimc->num_clocks++;
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++;
}
} }
ret = fimc_clk_get(fimc); ret = fimc_clk_get(fimc);
......
...@@ -46,15 +46,14 @@ struct s5p_fimc_isp_info { ...@@ -46,15 +46,14 @@ struct s5p_fimc_isp_info {
u16 flags; u16 flags;
}; };
#define FIMC_MAX_CAMIF_CLIENTS 2
/** /**
* struct s5p_platform_fimc - camera host interface platform data * struct s5p_platform_fimc - camera host interface platform data
* *
* @isp_info: properties of camera sensor required for host interface setup * @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_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_ */ #endif /* S5P_FIMC_H_ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册