Commit 657f2271 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[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: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 3ea2b673
...@@ -100,6 +100,7 @@ static struct v4l2_input inputs[4] = { ...@@ -100,6 +100,7 @@ static struct v4l2_input inputs[4] = {
.tuner = 0, /* ignored */ .tuner = 0, /* ignored */
.std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
.status = 0, .status = 0,
.capabilities = V4L2_IN_CAP_STD,
}, { }, {
.index = 1, .index = 1,
.name = "Television", .name = "Television",
...@@ -108,6 +109,7 @@ static struct v4l2_input inputs[4] = { ...@@ -108,6 +109,7 @@ static struct v4l2_input inputs[4] = {
.tuner = 0, .tuner = 0,
.std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
.status = 0, .status = 0,
.capabilities = V4L2_IN_CAP_STD,
}, { }, {
.index = 2, .index = 2,
.name = "Video", .name = "Video",
...@@ -116,6 +118,7 @@ static struct v4l2_input inputs[4] = { ...@@ -116,6 +118,7 @@ static struct v4l2_input inputs[4] = {
.tuner = 0, .tuner = 0,
.std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
.status = 0, .status = 0,
.capabilities = V4L2_IN_CAP_STD,
}, { }, {
.index = 3, .index = 3,
.name = "Y/C", .name = "Y/C",
...@@ -124,6 +127,7 @@ static struct v4l2_input inputs[4] = { ...@@ -124,6 +127,7 @@ static struct v4l2_input inputs[4] = {
.tuner = 0, .tuner = 0,
.std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
.status = 0, .status = 0,
.capabilities = V4L2_IN_CAP_STD,
} }
}; };
......
...@@ -1406,8 +1406,10 @@ static int budget_av_detach(struct saa7146_dev *dev) ...@@ -1406,8 +1406,10 @@ static int budget_av_detach(struct saa7146_dev *dev)
#define KNC1_INPUTS 2 #define KNC1_INPUTS 2
static struct v4l2_input knc1_inputs[KNC1_INPUTS] = { 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}, { 0, "Composite", V4L2_INPUT_TYPE_TUNER, 1, 0,
{1, "S-Video", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG | V4L2_STD_NTSC_M, 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) 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) ...@@ -546,7 +546,6 @@ int cx18_get_input(struct cx18 *cx, u16 index, struct v4l2_input *input)
"Component 1" "Component 1"
}; };
memset(input, 0, sizeof(*input));
if (index >= cx->nof_inputs) if (index >= cx->nof_inputs)
return -EINVAL; return -EINVAL;
input->index = index; input->index = index;
......
...@@ -1126,7 +1126,6 @@ static int cx23885_enum_input(struct cx23885_dev *dev, struct v4l2_input *i) ...@@ -1126,7 +1126,6 @@ static int cx23885_enum_input(struct cx23885_dev *dev, struct v4l2_input *i)
if (0 == INPUT(n)->type) if (0 == INPUT(n)->type)
return -EINVAL; return -EINVAL;
memset(i, 0, sizeof(*i));
i->index = n; i->index = n;
i->type = V4L2_INPUT_TYPE_CAMERA; i->type = V4L2_INPUT_TYPE_CAMERA;
strcpy(i->name, iname[INPUT(n)->type]); strcpy(i->name, iname[INPUT(n)->type]);
......
...@@ -1610,6 +1610,7 @@ et61x251_vidioc_enuminput(struct et61x251_device* cam, void __user * arg) ...@@ -1610,6 +1610,7 @@ et61x251_vidioc_enuminput(struct et61x251_device* cam, void __user * arg)
memset(&i, 0, sizeof(i)); memset(&i, 0, sizeof(i));
strcpy(i.name, "Camera"); strcpy(i.name, "Camera");
i.type = V4L2_INPUT_TYPE_CAMERA; i.type = V4L2_INPUT_TYPE_CAMERA;
i.capabilities = V4L2_IN_CAP_STD;
if (copy_to_user(arg, &i, sizeof(i))) if (copy_to_user(arg, &i, sizeof(i)))
return -EFAULT; return -EFAULT;
......
...@@ -37,15 +37,15 @@ static int hexium_num; ...@@ -37,15 +37,15 @@ static int hexium_num;
#define HEXIUM_INPUTS 9 #define HEXIUM_INPUTS 9
static struct v4l2_input hexium_inputs[HEXIUM_INPUTS] = { 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 }, { 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 }, { 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 }, { 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 }, { 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 }, { 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 }, { 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 }, { 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 }, { 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 }, { 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 #define HEXIUM_AUDIOS 0
......
...@@ -38,15 +38,15 @@ static int hexium_num; ...@@ -38,15 +38,15 @@ static int hexium_num;
#define HEXIUM_INPUTS 9 #define HEXIUM_INPUTS 9
static struct v4l2_input hexium_inputs[HEXIUM_INPUTS] = { 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 }, { 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 }, { 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 }, { 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 }, { 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 }, { 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 }, { 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 }, { 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 }, { 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 }, { 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 #define HEXIUM_AUDIOS 0
......
...@@ -1313,7 +1313,6 @@ int ivtv_get_input(struct ivtv *itv, u16 index, struct v4l2_input *input) ...@@ -1313,7 +1313,6 @@ int ivtv_get_input(struct ivtv *itv, u16 index, struct v4l2_input *input)
"Composite 3" "Composite 3"
}; };
memset(input, 0, sizeof(*input));
if (index >= itv->nof_inputs) if (index >= itv->nof_inputs)
return -EINVAL; return -EINVAL;
input->index = index; input->index = index;
...@@ -1331,7 +1330,6 @@ int ivtv_get_output(struct ivtv *itv, u16 index, struct v4l2_output *output) ...@@ -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; const struct ivtv_card_output *card_output = itv->card->video_outputs + index;
memset(output, 0, sizeof(*output));
if (index >= itv->card->nof_outputs) if (index >= itv->card->nof_outputs)
return -EINVAL; return -EINVAL;
output->index = index; output->index = index;
......
...@@ -59,10 +59,10 @@ MODULE_PARM_DESC(debug, "Turn on/off device debugging (default:off)."); ...@@ -59,10 +59,10 @@ MODULE_PARM_DESC(debug, "Turn on/off device debugging (default:off).");
enum { TUNER, AUX1, AUX3, AUX3_YC }; enum { TUNER, AUX1, AUX3, AUX3_YC };
static struct v4l2_input mxb_inputs[MXB_INPUTS] = { 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 }, { 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 }, { 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 }, { 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 }, { 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 /* 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, ...@@ -1748,7 +1748,6 @@ static int saa7134_enum_input(struct file *file, void *priv,
return -EINVAL; return -EINVAL;
if (NULL == card_in(dev, i->index).name) if (NULL == card_in(dev, i->index).name)
return -EINVAL; return -EINVAL;
memset(i, 0, sizeof(*i));
i->index = n; i->index = n;
i->type = V4L2_INPUT_TYPE_CAMERA; i->type = V4L2_INPUT_TYPE_CAMERA;
strcpy(i->name, card_in(dev, n).name); strcpy(i->name, card_in(dev, n).name);
......
...@@ -2189,6 +2189,7 @@ sn9c102_vidioc_enuminput(struct sn9c102_device* cam, void __user * arg) ...@@ -2189,6 +2189,7 @@ sn9c102_vidioc_enuminput(struct sn9c102_device* cam, void __user * arg)
memset(&i, 0, sizeof(i)); memset(&i, 0, sizeof(i));
strcpy(i.name, "Camera"); strcpy(i.name, "Camera");
i.type = V4L2_INPUT_TYPE_CAMERA; i.type = V4L2_INPUT_TYPE_CAMERA;
i.capabilities = V4L2_IN_CAP_STD;
if (copy_to_user(arg, &i, sizeof(i))) if (copy_to_user(arg, &i, sizeof(i)))
return -EFAULT; return -EFAULT;
......
...@@ -369,7 +369,6 @@ static int timblogiw_enuminput(struct file *file, void *priv, ...@@ -369,7 +369,6 @@ static int timblogiw_enuminput(struct file *file, void *priv,
if (inp->index != 0) if (inp->index != 0)
return -EINVAL; return -EINVAL;
memset(inp, 0, sizeof(*inp));
inp->index = 0; inp->index = 0;
strncpy(inp->name, "Timb input 1", sizeof(inp->name) - 1); strncpy(inp->name, "Timb input 1", sizeof(inp->name) - 1);
......
...@@ -2954,9 +2954,6 @@ static int vino_enum_input(struct file *file, void *__fh, ...@@ -2954,9 +2954,6 @@ static int vino_enum_input(struct file *file, void *__fh,
if (input == VINO_INPUT_NONE) if (input == VINO_INPUT_NONE)
return -EINVAL; return -EINVAL;
memset(i, 0, sizeof(struct v4l2_input));
i->index = index;
i->type = V4L2_INPUT_TYPE_CAMERA; i->type = V4L2_INPUT_TYPE_CAMERA;
i->std = vino_inputs[input].std; i->std = vino_inputs[input].std;
strcpy(i->name, vino_inputs[input].name); strcpy(i->name, vino_inputs[input].name);
......
...@@ -2449,11 +2449,6 @@ static int zoran_enum_input(struct file *file, void *__fh, ...@@ -2449,11 +2449,6 @@ static int zoran_enum_input(struct file *file, void *__fh,
if (inp->index >= zr->card.inputs) if (inp->index >= zr->card.inputs)
return -EINVAL; return -EINVAL;
else {
int id = inp->index;
memset(inp, 0, sizeof(*inp));
inp->index = id;
}
strncpy(inp->name, zr->card.input[inp->index].name, strncpy(inp->name, zr->card.input[inp->index].name,
sizeof(inp->name) - 1); sizeof(inp->name) - 1);
...@@ -2503,7 +2498,6 @@ static int zoran_enum_output(struct file *file, void *__fh, ...@@ -2503,7 +2498,6 @@ static int zoran_enum_output(struct file *file, void *__fh,
if (outp->index != 0) if (outp->index != 0)
return -EINVAL; return -EINVAL;
memset(outp, 0, sizeof(*outp));
outp->index = 0; outp->index = 0;
outp->type = V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY; outp->type = V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY;
strncpy(outp->name, "Autodetect", sizeof(outp->name)-1); strncpy(outp->name, "Autodetect", sizeof(outp->name)-1);
......
...@@ -1272,8 +1272,6 @@ int cx25821_enum_input(struct cx25821_dev *dev, struct v4l2_input *i) ...@@ -1272,8 +1272,6 @@ int cx25821_enum_input(struct cx25821_dev *dev, struct v4l2_input *i)
if (0 == INPUT(n)->type) if (0 == INPUT(n)->type)
return -EINVAL; return -EINVAL;
memset(i, 0, sizeof(*i));
i->index = n;
i->type = V4L2_INPUT_TYPE_CAMERA; i->type = V4L2_INPUT_TYPE_CAMERA;
strcpy(i->name, iname[INPUT(n)->type]); strcpy(i->name, iname[INPUT(n)->type]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment