[media] s5p-fimc: Limit number of available inputs to one

The current driver allowed camera sensors to be used only with single
FIMC H/W instance, FIMC0..FIMC2/3, designated at compile time. Remaining FIMC
entities could be used for video processing only, as mem-to-mem devices.
Required camera could be selected with S_INPUT ioctl at one devnode only.

However in that case it was not possible to use both cameras independently
at the same time, as all sensors were registered to single FIMC capture
driver. In most recent S5P SoC version there is enough FIMC H/W instances
to cover all physical camera interfaces.
Each FIMC instance exports its own video devnode. Thus we distribute
the camera sensors one per each /dev/video? by default. It will allow to
use both camera simultaneously by opening different video node.

The camera sensors at FIMC are now not selected with S_INPUT ioctl, there
is one input only available per /dev/video?.

By default a single sensor is connected at FIMC input as specified by the
media device platform data subdev description table. This assignment
can be changed at runtime through the pipeline reconfiguration at the media
device level.

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:
Sylwester Nawrocki 2011-07-26 18:27:59 -03:00 committed by Mauro Carvalho Chehab
parent ebdfea810e
commit 3e00218207

View File

@ -577,57 +577,26 @@ static int fimc_cap_s_fmt_mplane(struct file *file, void *priv,
}
static int fimc_cap_enum_input(struct file *file, void *priv,
struct v4l2_input *i)
struct v4l2_input *i)
{
struct fimc_ctx *ctx = priv;
struct s5p_platform_fimc *pldata = ctx->fimc_dev->pdata;
struct s5p_fimc_isp_info *isp_info;
if (i->index >= pldata->num_clients)
if (i->index != 0)
return -EINVAL;
isp_info = &pldata->isp_info[i->index];
i->type = V4L2_INPUT_TYPE_CAMERA;
strncpy(i->name, isp_info->board_info->type, 32);
return 0;
}
static int fimc_cap_s_input(struct file *file, void *priv,
unsigned int i)
static int fimc_cap_s_input(struct file *file, void *priv, unsigned int i)
{
struct fimc_ctx *ctx = priv;
struct fimc_dev *fimc = ctx->fimc_dev;
struct s5p_platform_fimc *pdata = fimc->pdata;
if (fimc_capture_active(ctx->fimc_dev))
return -EBUSY;
if (i >= pdata->num_clients)
return -EINVAL;
if (fimc->vid_cap.sd) {
int ret = v4l2_subdev_call(fimc->vid_cap.sd, core, s_power, 0);
if (ret)
err("s_power failed: %d", ret);
clk_disable(fimc->clock[CLK_CAM]);
}
/* Release the attached sensor subdevice. */
fimc_subdev_unregister(fimc);
return fimc_isp_subdev_init(fimc, i);
return i == 0 ? i : -EINVAL;
}
static int fimc_cap_g_input(struct file *file, void *priv,
unsigned int *i)
static int fimc_cap_g_input(struct file *file, void *priv, unsigned int *i)
{
struct fimc_ctx *ctx = priv;
struct fimc_vid_cap *cap = &ctx->fimc_dev->vid_cap;
*i = cap->input_index;
*i = 0;
return 0;
}