[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>
This commit is contained in:
parent
4ecbf5d1d2
commit
117182d183
@ -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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
|||||||
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_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user