Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 117182d1 authored by Sylwester Nawrocki's avatar Sylwester Nawrocki Committed by Mauro Carvalho Chehab
Browse files

[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: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 4ecbf5d1
Loading
Loading
Loading
Loading
+10 −13
Original line number Original line Diff line number Diff line
@@ -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;




+8 −14
Original line number Original line Diff line number Diff line
@@ -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,20 +1631,12 @@ 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) {
		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++;
		fimc->num_clocks++;
	}
	}
	}


	ret = fimc_clk_get(fimc);
	ret = fimc_clk_get(fimc);
	if (ret)
	if (ret)
+3 −4
Original line number Original line Diff line number Diff line
@@ -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_ */