Commit 6b996126 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] saa7164: fix input and tuner compliance problems

- the frequency range was never set
- there was no initial frequency
- missing index/tuner checks
- inconsistent standard reporting
- removed unnecessary tuner type checks (the core handles that)
- clamp frequency to the valid frequency range as per the V4L2 spec
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 4e203f7f
...@@ -246,11 +246,12 @@ static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *id) ...@@ -246,11 +246,12 @@ static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *id)
static int vidioc_enum_input(struct file *file, void *priv, static int vidioc_enum_input(struct file *file, void *priv,
struct v4l2_input *i) struct v4l2_input *i)
{ {
static const char * const inputs[] = {
"tuner", "composite", "svideo", "aux",
"composite 2", "svideo 2", "aux 2"
};
int n; int n;
char *inputs[] = { "tuner", "composite", "svideo", "aux",
"composite 2", "svideo 2", "aux 2" };
if (i->index >= 7) if (i->index >= 7)
return -EINVAL; return -EINVAL;
...@@ -313,8 +314,9 @@ static int vidioc_g_tuner(struct file *file, void *priv, ...@@ -313,8 +314,9 @@ static int vidioc_g_tuner(struct file *file, void *priv,
return -EINVAL; return -EINVAL;
strcpy(t->name, "tuner"); strcpy(t->name, "tuner");
t->type = V4L2_TUNER_ANALOG_TV;
t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO; t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO;
t->rangelow = SAA7164_TV_MIN_FREQ;
t->rangehigh = SAA7164_TV_MAX_FREQ;
dprintk(DBGLVL_ENC, "VIDIOC_G_TUNER: tuner type %d\n", t->type); dprintk(DBGLVL_ENC, "VIDIOC_G_TUNER: tuner type %d\n", t->type);
...@@ -324,6 +326,9 @@ static int vidioc_g_tuner(struct file *file, void *priv, ...@@ -324,6 +326,9 @@ static int vidioc_g_tuner(struct file *file, void *priv,
static int vidioc_s_tuner(struct file *file, void *priv, static int vidioc_s_tuner(struct file *file, void *priv,
const struct v4l2_tuner *t) const struct v4l2_tuner *t)
{ {
if (0 != t->index)
return -EINVAL;
/* Update the A/V core */ /* Update the A/V core */
return 0; return 0;
} }
...@@ -334,7 +339,9 @@ static int vidioc_g_frequency(struct file *file, void *priv, ...@@ -334,7 +339,9 @@ static int vidioc_g_frequency(struct file *file, void *priv,
struct saa7164_encoder_fh *fh = file->private_data; struct saa7164_encoder_fh *fh = file->private_data;
struct saa7164_port *port = fh->port; struct saa7164_port *port = fh->port;
f->type = V4L2_TUNER_ANALOG_TV; if (f->tuner)
return -EINVAL;
f->frequency = port->freq; f->frequency = port->freq;
return 0; return 0;
...@@ -364,10 +371,8 @@ static int vidioc_s_frequency(struct file *file, void *priv, ...@@ -364,10 +371,8 @@ static int vidioc_s_frequency(struct file *file, void *priv,
if (f->tuner != 0) if (f->tuner != 0)
return -EINVAL; return -EINVAL;
if (f->type != V4L2_TUNER_ANALOG_TV) port->freq = clamp(f->frequency,
return -EINVAL; SAA7164_TV_MIN_FREQ, SAA7164_TV_MAX_FREQ);
port->freq = f->frequency;
/* Update the hardware */ /* Update the hardware */
if (port->nr == SAA7164_PORT_ENC1) if (port->nr == SAA7164_PORT_ENC1)
...@@ -1012,6 +1017,7 @@ int saa7164_encoder_register(struct saa7164_port *port) ...@@ -1012,6 +1017,7 @@ int saa7164_encoder_register(struct saa7164_port *port)
port->video_format = EU_VIDEO_FORMAT_MPEG_2; port->video_format = EU_VIDEO_FORMAT_MPEG_2;
port->audio_format = 0; port->audio_format = 0;
port->video_resolution = 0; port->video_resolution = 0;
port->freq = SAA7164_TV_MIN_FREQ;
v4l2_ctrl_handler_init(hdl, 14); v4l2_ctrl_handler_init(hdl, 14);
v4l2_ctrl_new_std(hdl, &saa7164_ctrl_ops, v4l2_ctrl_new_std(hdl, &saa7164_ctrl_ops,
......
...@@ -117,7 +117,11 @@ ...@@ -117,7 +117,11 @@
#define DBGLVL_CPU 8192 #define DBGLVL_CPU 8192
#define SAA7164_NORMS \ #define SAA7164_NORMS \
(V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_JP | V4L2_STD_NTSC_443) (V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_JP)
/* TV frequency range copied from tuner-core.c */
#define SAA7164_TV_MIN_FREQ (44U * 16U)
#define SAA7164_TV_MAX_FREQ (958U * 16U)
enum port_t { enum port_t {
SAA7164_MPEG_UNDEFINED = 0, SAA7164_MPEG_UNDEFINED = 0,
......
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