aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2010-10-12 11:11:55 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-10-20 23:17:53 -0400
commit589851d5990f85cce884f831ec70b9aa40b7ad5f (patch)
tree88f82461505b2a552245df2c325f3596ad0084d8
parent421d1b70718232dfbd386f67b135f5e23f569c6e (diff)
[media] V4L-DVB: tm6000: Move VBI init to a separate function
While here, documment that VBI may need changes, based on video STD, and do some cleanup at device init, to be sure that VBI init will happen all the times, and to remove a duplicated video standard call. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/staging/tm6000/tm6000-core.c49
-rw-r--r--drivers/staging/tm6000/tm6000-video.c16
2 files changed, 37 insertions, 28 deletions
diff --git a/drivers/staging/tm6000/tm6000-core.c b/drivers/staging/tm6000/tm6000-core.c
index 1bce43acd3d9..0912639369d9 100644
--- a/drivers/staging/tm6000/tm6000-core.c
+++ b/drivers/staging/tm6000/tm6000-core.c
@@ -186,27 +186,17 @@ void tm6000_set_fourcc_format(struct tm6000_core *dev)
186 } 186 }
187} 187}
188 188
189int tm6000_init_analog_mode(struct tm6000_core *dev) 189static void tm6000_set_vbi(struct tm6000_core *dev)
190{ 190{
191 struct v4l2_frequency f; 191 /*
192 * FIXME:
193 * VBI lines and start/end are different between 60Hz and 50Hz
194 * So, it is very likely that we need to change the config to
195 * something that takes it into account, doing something different
196 * if (dev->norm & V4L2_STD_525_60)
197 */
192 198
193 if (dev->dev_type == TM6010) { 199 if (dev->dev_type == TM6010) {
194 int val;
195
196 /* Enable video */
197 val = tm6000_get_reg(dev, TM6010_REQ07_RCC_ACTIVE_VIDEO_IF, 0);
198 val |= 0x60;
199 tm6000_set_reg(dev, TM6010_REQ07_RCC_ACTIVE_VIDEO_IF, val);
200 val = tm6000_get_reg(dev,
201 TM6010_REQ07_RC0_ACTIVE_VIDEO_SOURCE, 0);
202 val &= ~0x40;
203 tm6000_set_reg(dev, TM6010_REQ07_RC0_ACTIVE_VIDEO_SOURCE, val);
204
205 tm6000_set_reg(dev, TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc);
206
207#if 0 /* FIXME: VBI is standard-dependent */
208
209 /* Init teletext */
210 tm6000_set_reg(dev, TM6010_REQ07_R3F_RESET, 0x01); 200 tm6000_set_reg(dev, TM6010_REQ07_R3F_RESET, 0x01);
211 tm6000_set_reg(dev, TM6010_REQ07_R41_TELETEXT_VBI_CODE1, 0x27); 201 tm6000_set_reg(dev, TM6010_REQ07_R41_TELETEXT_VBI_CODE1, 0x27);
212 tm6000_set_reg(dev, TM6010_REQ07_R42_VBI_DATA_HIGH_LEVEL, 0x55); 202 tm6000_set_reg(dev, TM6010_REQ07_R42_VBI_DATA_HIGH_LEVEL, 0x55);
@@ -255,7 +245,27 @@ int tm6000_init_analog_mode(struct tm6000_core *dev)
255 tm6000_set_reg(dev, TM6010_REQ07_R5B_VBI_TELETEXT_DTO0, 0x4c); 245 tm6000_set_reg(dev, TM6010_REQ07_R5B_VBI_TELETEXT_DTO0, 0x4c);
256 tm6000_set_reg(dev, TM6010_REQ07_R40_TELETEXT_VBI_CODE0, 0x01); 246 tm6000_set_reg(dev, TM6010_REQ07_R40_TELETEXT_VBI_CODE0, 0x01);
257 tm6000_set_reg(dev, TM6010_REQ07_R3F_RESET, 0x00); 247 tm6000_set_reg(dev, TM6010_REQ07_R3F_RESET, 0x00);
258#endif 248 }
249}
250
251int tm6000_init_analog_mode(struct tm6000_core *dev)
252{
253 struct v4l2_frequency f;
254
255 if (dev->dev_type == TM6010) {
256 int val;
257
258 /* Enable video */
259 val = tm6000_get_reg(dev, TM6010_REQ07_RCC_ACTIVE_VIDEO_IF, 0);
260 val |= 0x60;
261 tm6000_set_reg(dev, TM6010_REQ07_RCC_ACTIVE_VIDEO_IF, val);
262 val = tm6000_get_reg(dev,
263 TM6010_REQ07_RC0_ACTIVE_VIDEO_SOURCE, 0);
264 val &= ~0x40;
265 tm6000_set_reg(dev, TM6010_REQ07_RC0_ACTIVE_VIDEO_SOURCE, val);
266
267 tm6000_set_reg(dev, TM6010_REQ08_RF1_AADC_POWER_DOWN, 0xfc);
268
259 } else { 269 } else {
260 /* Enables soft reset */ 270 /* Enables soft reset */
261 tm6000_set_reg(dev, TM6010_REQ07_R3F_RESET, 0x01); 271 tm6000_set_reg(dev, TM6010_REQ07_R3F_RESET, 0x01);
@@ -310,6 +320,7 @@ int tm6000_init_analog_mode(struct tm6000_core *dev)
310 320
311 msleep(100); 321 msleep(100);
312 tm6000_set_standard(dev, &dev->norm); 322 tm6000_set_standard(dev, &dev->norm);
323 tm6000_set_vbi(dev);
313 tm6000_set_audio_bitrate(dev, 48000); 324 tm6000_set_audio_bitrate(dev, 48000);
314 325
315 /* switch dvb led off */ 326 /* switch dvb led off */
diff --git a/drivers/staging/tm6000/tm6000-video.c b/drivers/staging/tm6000/tm6000-video.c
index 9304158db6da..84ab49d1618c 100644
--- a/drivers/staging/tm6000/tm6000-video.c
+++ b/drivers/staging/tm6000/tm6000-video.c
@@ -1015,7 +1015,6 @@ static int vidioc_s_std (struct file *file, void *priv, v4l2_std_id *norm)
1015 struct tm6000_fh *fh=priv; 1015 struct tm6000_fh *fh=priv;
1016 struct tm6000_core *dev = fh->dev; 1016 struct tm6000_core *dev = fh->dev;
1017 1017
1018 rc = tm6000_set_standard(dev, norm);
1019 rc = tm6000_init_analog_mode(dev); 1018 rc = tm6000_init_analog_mode(dev);
1020 1019
1021 fh->width = dev->width; 1020 fh->width = dev->width;
@@ -1293,18 +1292,17 @@ static int tm6000_open(struct file *file)
1293 "active=%d\n",list_empty(&dev->vidq.active)); 1292 "active=%d\n",list_empty(&dev->vidq.active));
1294 1293
1295 /* initialize hardware on analog mode */ 1294 /* initialize hardware on analog mode */
1296// if (dev->mode!=TM6000_MODE_ANALOG) { 1295 rc = tm6000_init_analog_mode(dev);
1297// rc = tm6000_set_standard(dev, dev->norm); 1296 if (rc < 0)
1298 rc += tm6000_init_analog_mode(dev); 1297 return rc;
1299 if (rc < 0)
1300 return rc;
1301 1298
1299 if (dev->mode != TM6000_MODE_ANALOG) {
1302 /* Put all controls at a sane state */ 1300 /* Put all controls at a sane state */
1303 for (i = 0; i < ARRAY_SIZE(tm6000_qctrl); i++) 1301 for (i = 0; i < ARRAY_SIZE(tm6000_qctrl); i++)
1304 qctl_regs[i] =tm6000_qctrl[i].default_value; 1302 qctl_regs[i] = tm6000_qctrl[i].default_value;
1305 1303
1306 dev->mode=TM6000_MODE_ANALOG; 1304 dev->mode = TM6000_MODE_ANALOG;
1307// } 1305 }
1308 1306
1309 videobuf_queue_vmalloc_init(&fh->vb_vidq, &tm6000_video_qops, 1307 videobuf_queue_vmalloc_init(&fh->vb_vidq, &tm6000_video_qops,
1310 NULL, &dev->slock, 1308 NULL, &dev->slock,