mirror of
https://github.com/torvalds/linux.git
synced 2024-11-07 12:41:55 +00:00
[media] v4l: fix handling of v4l2_input.capabilities
The v4l core sets the v4l2_input.capabilities field based on the supplied v4l2_ioctl_ops. However, several drivers do a memset or memcpy of the v4l2_input struct, thus overwriting that field incorrectly. Either remove the memset (which is already done by the v4l core), or add the proper capabilities field in case of a memcpy. The same is also true for v4l2_output, but that only affected the ivtv driver. Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
3ea2b673a5
commit
657f227105
@ -100,6 +100,7 @@ static struct v4l2_input inputs[4] = {
|
||||
.tuner = 0, /* ignored */
|
||||
.std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
|
||||
.status = 0,
|
||||
.capabilities = V4L2_IN_CAP_STD,
|
||||
}, {
|
||||
.index = 1,
|
||||
.name = "Television",
|
||||
@ -108,6 +109,7 @@ static struct v4l2_input inputs[4] = {
|
||||
.tuner = 0,
|
||||
.std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
|
||||
.status = 0,
|
||||
.capabilities = V4L2_IN_CAP_STD,
|
||||
}, {
|
||||
.index = 2,
|
||||
.name = "Video",
|
||||
@ -116,6 +118,7 @@ static struct v4l2_input inputs[4] = {
|
||||
.tuner = 0,
|
||||
.std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
|
||||
.status = 0,
|
||||
.capabilities = V4L2_IN_CAP_STD,
|
||||
}, {
|
||||
.index = 3,
|
||||
.name = "Y/C",
|
||||
@ -124,6 +127,7 @@ static struct v4l2_input inputs[4] = {
|
||||
.tuner = 0,
|
||||
.std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
|
||||
.status = 0,
|
||||
.capabilities = V4L2_IN_CAP_STD,
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1406,8 +1406,10 @@ static int budget_av_detach(struct saa7146_dev *dev)
|
||||
|
||||
#define KNC1_INPUTS 2
|
||||
static struct v4l2_input knc1_inputs[KNC1_INPUTS] = {
|
||||
{0, "Composite", V4L2_INPUT_TYPE_TUNER, 1, 0, V4L2_STD_PAL_BG | V4L2_STD_NTSC_M, 0},
|
||||
{1, "S-Video", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG | V4L2_STD_NTSC_M, 0},
|
||||
{ 0, "Composite", V4L2_INPUT_TYPE_TUNER, 1, 0,
|
||||
V4L2_STD_PAL_BG | V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 1, "S-Video", V4L2_INPUT_TYPE_CAMERA, 2, 0,
|
||||
V4L2_STD_PAL_BG | V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
};
|
||||
|
||||
static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i)
|
||||
|
@ -546,7 +546,6 @@ int cx18_get_input(struct cx18 *cx, u16 index, struct v4l2_input *input)
|
||||
"Component 1"
|
||||
};
|
||||
|
||||
memset(input, 0, sizeof(*input));
|
||||
if (index >= cx->nof_inputs)
|
||||
return -EINVAL;
|
||||
input->index = index;
|
||||
|
@ -1126,7 +1126,6 @@ static int cx23885_enum_input(struct cx23885_dev *dev, struct v4l2_input *i)
|
||||
if (0 == INPUT(n)->type)
|
||||
return -EINVAL;
|
||||
|
||||
memset(i, 0, sizeof(*i));
|
||||
i->index = n;
|
||||
i->type = V4L2_INPUT_TYPE_CAMERA;
|
||||
strcpy(i->name, iname[INPUT(n)->type]);
|
||||
|
@ -1610,6 +1610,7 @@ et61x251_vidioc_enuminput(struct et61x251_device* cam, void __user * arg)
|
||||
memset(&i, 0, sizeof(i));
|
||||
strcpy(i.name, "Camera");
|
||||
i.type = V4L2_INPUT_TYPE_CAMERA;
|
||||
i.capabilities = V4L2_IN_CAP_STD;
|
||||
|
||||
if (copy_to_user(arg, &i, sizeof(i)))
|
||||
return -EFAULT;
|
||||
|
@ -37,15 +37,15 @@ static int hexium_num;
|
||||
|
||||
#define HEXIUM_INPUTS 9
|
||||
static struct v4l2_input hexium_inputs[HEXIUM_INPUTS] = {
|
||||
{ 0, "CVBS 1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 1, "CVBS 2", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 2, "CVBS 3", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 3, "CVBS 4", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 4, "CVBS 5", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 5, "CVBS 6", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 6, "Y/C 1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 7, "Y/C 2", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 8, "Y/C 3", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 0, "CVBS 1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 1, "CVBS 2", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 2, "CVBS 3", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 3, "CVBS 4", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 4, "CVBS 5", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 5, "CVBS 6", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 6, "Y/C 1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 7, "Y/C 2", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 8, "Y/C 3", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
};
|
||||
|
||||
#define HEXIUM_AUDIOS 0
|
||||
|
@ -38,15 +38,15 @@ static int hexium_num;
|
||||
|
||||
#define HEXIUM_INPUTS 9
|
||||
static struct v4l2_input hexium_inputs[HEXIUM_INPUTS] = {
|
||||
{ 0, "CVBS 1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 1, "CVBS 2", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 2, "CVBS 3", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 3, "CVBS 4", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 4, "CVBS 5", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 5, "CVBS 6", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 6, "Y/C 1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 7, "Y/C 2", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 8, "Y/C 3", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ 0, "CVBS 1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 1, "CVBS 2", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 2, "CVBS 3", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 3, "CVBS 4", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 4, "CVBS 5", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 5, "CVBS 6", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 6, "Y/C 1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 7, "Y/C 2", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ 8, "Y/C 3", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
};
|
||||
|
||||
#define HEXIUM_AUDIOS 0
|
||||
|
@ -1313,7 +1313,6 @@ int ivtv_get_input(struct ivtv *itv, u16 index, struct v4l2_input *input)
|
||||
"Composite 3"
|
||||
};
|
||||
|
||||
memset(input, 0, sizeof(*input));
|
||||
if (index >= itv->nof_inputs)
|
||||
return -EINVAL;
|
||||
input->index = index;
|
||||
@ -1331,7 +1330,6 @@ int ivtv_get_output(struct ivtv *itv, u16 index, struct v4l2_output *output)
|
||||
{
|
||||
const struct ivtv_card_output *card_output = itv->card->video_outputs + index;
|
||||
|
||||
memset(output, 0, sizeof(*output));
|
||||
if (index >= itv->card->nof_outputs)
|
||||
return -EINVAL;
|
||||
output->index = index;
|
||||
|
@ -59,10 +59,10 @@ MODULE_PARM_DESC(debug, "Turn on/off device debugging (default:off).");
|
||||
enum { TUNER, AUX1, AUX3, AUX3_YC };
|
||||
|
||||
static struct v4l2_input mxb_inputs[MXB_INPUTS] = {
|
||||
{ TUNER, "Tuner", V4L2_INPUT_TYPE_TUNER, 1, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ AUX1, "AUX1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ AUX3, "AUX3 Composite", V4L2_INPUT_TYPE_CAMERA, 4, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ AUX3_YC, "AUX3 S-Video", V4L2_INPUT_TYPE_CAMERA, 4, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
|
||||
{ TUNER, "Tuner", V4L2_INPUT_TYPE_TUNER, 1, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ AUX1, "AUX1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ AUX3, "AUX3 Composite", V4L2_INPUT_TYPE_CAMERA, 4, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
{ AUX3_YC, "AUX3 S-Video", V4L2_INPUT_TYPE_CAMERA, 4, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
|
||||
};
|
||||
|
||||
/* this array holds the information, which port of the saa7146 each
|
||||
|
@ -1748,7 +1748,6 @@ static int saa7134_enum_input(struct file *file, void *priv,
|
||||
return -EINVAL;
|
||||
if (NULL == card_in(dev, i->index).name)
|
||||
return -EINVAL;
|
||||
memset(i, 0, sizeof(*i));
|
||||
i->index = n;
|
||||
i->type = V4L2_INPUT_TYPE_CAMERA;
|
||||
strcpy(i->name, card_in(dev, n).name);
|
||||
|
@ -2189,6 +2189,7 @@ sn9c102_vidioc_enuminput(struct sn9c102_device* cam, void __user * arg)
|
||||
memset(&i, 0, sizeof(i));
|
||||
strcpy(i.name, "Camera");
|
||||
i.type = V4L2_INPUT_TYPE_CAMERA;
|
||||
i.capabilities = V4L2_IN_CAP_STD;
|
||||
|
||||
if (copy_to_user(arg, &i, sizeof(i)))
|
||||
return -EFAULT;
|
||||
|
@ -369,7 +369,6 @@ static int timblogiw_enuminput(struct file *file, void *priv,
|
||||
if (inp->index != 0)
|
||||
return -EINVAL;
|
||||
|
||||
memset(inp, 0, sizeof(*inp));
|
||||
inp->index = 0;
|
||||
|
||||
strncpy(inp->name, "Timb input 1", sizeof(inp->name) - 1);
|
||||
|
@ -2954,9 +2954,6 @@ static int vino_enum_input(struct file *file, void *__fh,
|
||||
if (input == VINO_INPUT_NONE)
|
||||
return -EINVAL;
|
||||
|
||||
memset(i, 0, sizeof(struct v4l2_input));
|
||||
|
||||
i->index = index;
|
||||
i->type = V4L2_INPUT_TYPE_CAMERA;
|
||||
i->std = vino_inputs[input].std;
|
||||
strcpy(i->name, vino_inputs[input].name);
|
||||
|
@ -2449,11 +2449,6 @@ static int zoran_enum_input(struct file *file, void *__fh,
|
||||
|
||||
if (inp->index >= zr->card.inputs)
|
||||
return -EINVAL;
|
||||
else {
|
||||
int id = inp->index;
|
||||
memset(inp, 0, sizeof(*inp));
|
||||
inp->index = id;
|
||||
}
|
||||
|
||||
strncpy(inp->name, zr->card.input[inp->index].name,
|
||||
sizeof(inp->name) - 1);
|
||||
@ -2503,7 +2498,6 @@ static int zoran_enum_output(struct file *file, void *__fh,
|
||||
if (outp->index != 0)
|
||||
return -EINVAL;
|
||||
|
||||
memset(outp, 0, sizeof(*outp));
|
||||
outp->index = 0;
|
||||
outp->type = V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY;
|
||||
strncpy(outp->name, "Autodetect", sizeof(outp->name)-1);
|
||||
|
@ -1272,8 +1272,6 @@ int cx25821_enum_input(struct cx25821_dev *dev, struct v4l2_input *i)
|
||||
if (0 == INPUT(n)->type)
|
||||
return -EINVAL;
|
||||
|
||||
memset(i, 0, sizeof(*i));
|
||||
i->index = n;
|
||||
i->type = V4L2_INPUT_TYPE_CAMERA;
|
||||
strcpy(i->name, iname[INPUT(n)->type]);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user