2 tm6000-core.c - driver for TM5600/TM6000 USB video capture devices
4 Copyright (C) 2006-2007 Mauro Carvalho Chehab <mchehab@infradead.org>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation version 2
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include <linux/module.h>
21 #include <linux/kernel.h>
22 #include <linux/usb.h>
23 #include <linux/i2c.h>
24 #include <linux/video_decoder.h>
26 #include "tm6000-regs.h"
27 #include <media/v4l2-common.h>
28 #include <media/tuner.h>
30 #ifdef HACK /* HACK */
31 #include "tm6000-hack.c"
34 #define USB_TIMEOUT 5*HZ /* ms */
36 int tm6000_read_write_usb (struct tm6000_core *dev, u8 req_type, u8 req,
37 u16 value, u16 index, u8 *buf, u16 len)
41 static int ini=0, last=0, n=0;
45 data = kzalloc(len, GFP_KERNEL);
48 if (req_type & USB_DIR_IN)
49 pipe=usb_rcvctrlpipe(dev->udev, 0);
51 pipe=usb_sndctrlpipe(dev->udev, 0);
52 memcpy(data, buf, len);
55 if (tm6000_debug & V4L2_DEBUG_I2C) {
59 printk("%06i (dev %p, pipe %08x): ", n, dev->udev, pipe);
61 printk( "%s: %06u ms %06u ms %02x %02x %02x %02x %02x %02x %02x %02x ",
62 (req_type & USB_DIR_IN)?" IN":"OUT",
63 jiffies_to_msecs(jiffies-last),
64 jiffies_to_msecs(jiffies-ini),
65 req_type, req,value&0xff,value>>8, index&0xff, index>>8,
70 if ( !(req_type & USB_DIR_IN) ) {
73 printk(" %02x",buf[i]);
79 ret = usb_control_msg(dev->udev, pipe, req, req_type, value, index, data,
82 if (req_type & USB_DIR_IN)
83 memcpy(buf, data, len);
85 if (tm6000_debug & V4L2_DEBUG_I2C) {
87 if (req_type & USB_DIR_IN)
88 printk("<<< (len=%d)\n",len);
90 printk("%s: Error #%d\n", __FUNCTION__, ret);
91 } else if (req_type & USB_DIR_IN) {
94 printk(" %02x",buf[i]);
107 int tm6000_set_reg (struct tm6000_core *dev, u8 req, u16 value, u16 index)
110 tm6000_read_write_usb (dev, USB_DIR_OUT | USB_TYPE_VENDOR,
111 req, value, index, NULL, 0);
114 int tm6000_get_reg (struct tm6000_core *dev, u8 req, u16 value, u16 index)
119 rc=tm6000_read_write_usb (dev, USB_DIR_IN | USB_TYPE_VENDOR, req,
120 value, index, buf, 1);
128 int tm6000_get_reg16 (struct tm6000_core *dev, u8 req, u16 value, u16 index)
133 rc=tm6000_read_write_usb (dev, USB_DIR_IN | USB_TYPE_VENDOR, req,
134 value, index, buf, 2);
139 return buf[1]|buf[0]<<8;
142 void tm6000_set_fourcc_format(struct tm6000_core *dev)
144 if (dev->fourcc==V4L2_PIX_FMT_UYVY) {
145 /* Sets driver to UYUV */
146 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xc1, 0xd0);
148 /* Sets driver to YUV2 */
149 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xc1, 0x90);
153 int tm6000_init_analog_mode (struct tm6000_core *dev)
156 /* Enables soft reset */
157 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x3f, 0x01);
160 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xc0, 0x20);
162 /* Enable Hfilter and disable TS Drop err */
163 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xc0, 0x80);
165 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xc3, 0x88);
166 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xda, 0x23);
167 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xd1, 0xc0);
168 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xd2, 0xd8);
169 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xd6, 0x06);
170 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xdf, 0x1f);
172 /* AP Software reset */
173 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xff, 0x08);
174 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xff, 0x00);
176 tm6000_set_fourcc_format(dev);
178 /* Disables soft reset */
179 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x3f, 0x00);
181 /* E3: Select input 0 - TV tuner */
182 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe3, 0x00);
183 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, 0x60);
185 /* Tuner firmware can now be loaded */
187 tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_1, 0x00);
190 /* This controls input */
191 tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_2, 0x0);
192 tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_3, 0x01);
196 struct v4l2_frequency f;
197 mutex_lock(&dev->lock);
198 f.frequency=dev->freq;
199 tm6000_i2c_call_clients(dev,VIDIOC_S_FREQUENCY,&f);
200 mutex_unlock(&dev->lock);
203 tm6000_set_standard (dev, &dev->norm);
204 tm6000_set_audio_bitrate (dev,48000);
211 /* The meaning of those initializations are unknown */
224 { 0xeb, 0x64 }, /* 48000 bits/sample, external input */
226 { 0x3f, 0x01 }, /* Start of soft reset */
275 { 0x3f, 0x00 }, /* End of the soft reset */
278 int tm6000_init (struct tm6000_core *dev)
282 #ifdef HACK /* HACK */
287 /* Load board's initialization table */
288 for (i=0; i< ARRAY_SIZE(init_tab); i++) {
289 rc= tm6000_set_reg (dev, REQ_07_SET_GET_AVREG,
290 init_tab[i][0],init_tab[i][1]);
292 printk (KERN_ERR "Error %i while setting reg %d to value %d\n",
293 rc, init_tab[i][0],init_tab[i][1]);
298 /* Check board version - maybe 10Moons specific */
299 board=tm6000_get_reg16 (dev, 0x40, 0, 0);
301 printk (KERN_INFO "Board version = 0x%04x\n",board);
303 printk (KERN_ERR "Error %i while retrieving board version\n",board);
306 tm6000_set_reg (dev, REQ_05_SET_GET_USBREG, 0x18, 0x00);
307 msleep(5); /* Just to be conservative */
309 /* Reset GPIO1 and GPIO4. */
310 for (i=0; i< 2; i++) {
311 rc=tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_1, 0);
313 printk (KERN_ERR "Error %i doing GPIO1 reset\n",rc);
317 msleep(10); /* Just to be conservative */
318 rc=tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_1, 1);
320 printk (KERN_ERR "Error %i doing GPIO1 reset\n",rc);
325 rc=tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_4, 0);
327 printk (KERN_ERR "Error %i doing GPIO4 reset\n",rc);
332 rc=tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_4, 1);
334 printk (KERN_ERR "Error %i doing GPIO4 reset\n",rc);
339 rc=tm6000_get_reg16(dev, 0x40,0,0);
349 #define tm6000_wrt(dev,req,reg,val, data...) \
350 { const static u8 _val[] = data; \
351 tm6000_read_write_usb(dev,USB_DIR_OUT | USB_TYPE_VENDOR, \
352 req,reg, val, (u8 *) _val, ARRAY_SIZE(_val)); \
356 TM5600/6000 register values to set video standards.
357 There's an adjust, common to all, for composite video
358 Additional adjustments are required for S-Video, based on std.
360 Standards values for TV S-Video Changes
361 REG PAL PAL_M PAL_N SECAM NTSC Comp. PAL PAL_M PAL_N SECAM NTSC
362 0xdf 0x1f 0x1f 0x1f 0x1f 0x1f
363 0xe2 0x00 0x00 0x00 0x00 0x00
364 0xe8 0x0f 0x0f 0x0f 0x0f 0x0f 0x00 0x00 0x00 0x00 0x00
365 0xeb 0x60 0x60 0x60 0x60 0x60 0x64 0x64 0x64 0x64 0x64 0x64
366 0xd5 0x5f 0x5f 0x5f 0x4f 0x4f 0x4f 0x4f 0x4f 0x4f 0x4f
367 0xe3 0x00 0x00 0x00 0x00 0x00 0x10 0x10 0x10 0x10 0x10 0x10
368 0xe5 0x00 0x00 0x00 0x00 0x00 0x10 0x10 0x10 0x10 0x10
369 0x3f 0x01 0x01 0x01 0x01 0x01
370 0x00 0x32 0x04 0x36 0x38 0x00 0x33 0x05 0x37 0x39 0x01
371 0x01 0x0e 0x0e 0x0e 0x0e 0x0f
372 0x02 0x5f 0x5f 0x5f 0x5f 0x5f
373 0x03 0x02 0x00 0x02 0x02 0x00 0x04 0x04 0x04 0x03 0x03
374 0x07 0x01 0x01 0x01 0x01 0x01 0x00 0x00
375 0x17 0xcd 0xcd 0xcd 0xcd 0xcd 0x8b
376 0x18 0x25 0x1e 0x1e 0x24 0x1e
377 0x19 0xd5 0x83 0x91 0x92 0x8b
378 0x1a 0x63 0x0a 0x1f 0xe8 0xa2
379 0x1b 0x50 0xe0 0x0c 0xed 0xe9
380 0x1c 0x1c 0x1c 0x1c 0x1c 0x1c
381 0x1d 0xcc 0xcc 0xcc 0xcc 0xcc
382 0x1e 0xcc 0xcc 0xcc 0xcc 0xcc
383 0x1f 0xcd 0xcd 0xcd 0xcd 0xcd
384 0x2e 0x8c 0x88 0x8c 0x8c 0x88 0x88
385 0x30 0x2c 0x20 0x2c 0x2c 0x22 0x2a 0x22 0x22 0x2a
386 0x31 0xc1 0x61 0xc1 0xc1 0x61
387 0x33 0x0c 0x0c 0x0c 0x2c 0x1c
388 0x35 0x1c 0x1c 0x1c 0x18 0x1c
389 0x82 0x52 0x52 0x52 0x42 0x42
390 0x04 0xdc 0xdc 0xdc 0xdd
391 0x0d 0x07 0x07 0x07 0x87 0x07
392 0x3f 0x00 0x00 0x00 0x00 0x00
395 int tm6000_set_standard (struct tm6000_core *dev, v4l2_std_id *norm)
399 /* HACK: Should use, instead, the common code!!! */
400 if (*norm & V4L2_STD_PAL_M) {
401 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xdf, 0x1f);
402 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe2, 0x00);
403 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe8, 0x0f);
404 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, 0x60);
405 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xd5, 0x5f);
406 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe3, 0x00);
407 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe5, 0x00);
408 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x3f, 0x01);
409 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x04);
410 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x01, 0x0e);
411 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x02, 0x5f);
412 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x00);
413 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x07, 0x01);
414 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x18, 0x1e);
415 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x19, 0x83);
416 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1a, 0x0a);
417 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1b, 0xe0);
418 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1c, 0x1c);
419 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1d, 0xcc);
420 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1e, 0xcc);
421 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1f, 0xcd);
422 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2e, 0x88);
423 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x20);
424 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x31, 0x61);
425 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x33, 0x0c);
426 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x35, 0x1c);
427 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x82, 0x52);
428 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x04, 0xdc);
429 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x0d, 0x07);
430 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x3f, 0x00);
435 // tm6000_set_reg (dev, REQ_04_EN_DISABLE_MCU_INT, 0x02, 0x01);
436 // tm6000_set_reg (dev, REQ_04_EN_DISABLE_MCU_INT, 0x02, 0x00);
438 /* Set registers common to all standards */
439 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xdf, 0x1f);
440 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe2, 0x00);
442 switch (dev->input) {
443 case TM6000_INPUT_TV:
444 /* Seems to disable ADC2 - needed for TV and RCA */
445 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe8, 0x0f);
447 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, 0x60);
449 if (*norm & V4L2_STD_PAL) {
450 /* Enable UV_FLT_EN */
451 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xd5, 0x5f);
453 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xd5, 0x4f);
456 /* E3: Select input 0 */
457 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe3, 0x00);
459 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe5, 0x10);
462 case TM6000_INPUT_COMPOSITE:
463 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, 0x64);
464 /* E3: Select input 1 */
465 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe3, 0x10);
467 case TM6000_INPUT_SVIDEO:
468 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe8, 0x00);
470 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, 0x64);
472 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xd5, 0x4f);
473 /* E3: Select input 1 */
474 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe3, 0x10);
476 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe5, 0x10);
482 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x3f, 0x01);
484 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x02, 0x5f);
486 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x07, 0x01);
487 // tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x17, 0xcd);
489 /* Horizontal Sync DTO = 0x1ccccccd */
490 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1c, 0x1c);
491 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1d, 0xcc);
492 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1e, 0xcc);
493 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1f, 0xcd);
495 /* Vertical Height */
496 if (*norm & V4L2_STD_525_60) {
497 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x31, 0x61);
499 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x31, 0xc1);
502 /* Horizontal Length */
503 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2f, 640/8);
505 if (*norm & V4L2_STD_PAL) {
506 /* Common to All PAL Standards */
508 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x01, 0x0e);
510 /* Vsync Hsinc Lockout End */
511 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x33, 0x0c);
513 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x35, 0x1c);
514 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x82, 0x52);
515 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x04, 0xdc);
516 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x0d, 0x07);
517 if (*norm & V4L2_STD_PAL_M) {
520 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x18, 0x1e);
521 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x19, 0x83);
522 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1a, 0x0a);
523 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1b, 0xe0);
525 /* Active Video Horiz Start Time */
526 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2e, 0x88);
528 if (dev->input==TM6000_INPUT_SVIDEO) {
529 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x05);
530 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x04);
531 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x22);
533 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x04);
534 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x00);
535 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x20);
537 } else if (*norm & V4L2_STD_PAL_N) {
539 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x18, 0x1e);
540 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x19, 0x91);
541 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1a, 0x1f);
542 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1b, 0x0c);
544 if (dev->input==TM6000_INPUT_SVIDEO) {
545 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x37);
546 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x04);
547 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2e, 0x88);
548 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x22);
550 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x36);
551 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x02);
552 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2e, 0x8c);
553 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x2c);
555 } else { // Other PAL standards
556 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x18, 0x25);
557 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x19, 0xd5);
558 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1a, 0x63);
559 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1b, 0x50);
560 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2e, 0x8c);
562 if (dev->input==TM6000_INPUT_SVIDEO) {
563 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x33);
564 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x04);
565 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x2a);
567 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x2c);
569 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x32);
570 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x02);
571 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x2c);
574 } if (*norm & V4L2_STD_SECAM) {
575 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x01, 0x0e);
576 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x18, 0x24);
577 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x19, 0x92);
578 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1a, 0xe8);
579 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1b, 0xed);
580 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2e, 0x8c);
582 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x33, 0x2c);
583 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x35, 0x18);
584 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x82, 0x42);
585 // Register 0x04 is not initialized on SECAM
586 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x0d, 0x87);
588 if (dev->input==TM6000_INPUT_SVIDEO) {
589 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x39);
590 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x03);
591 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x2a);
593 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x38);
594 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x02);
595 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x2c);
598 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x01, 0x0f);
599 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x18, 0x1e);
600 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x19, 0x8b);
601 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1a, 0xa2);
602 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1b, 0xe9);
603 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2e, 0x88);
604 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x22);
606 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x33, 0x1c);
607 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x35, 0x1c);
608 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x82, 0x42);
609 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x0d, 0x07);
610 if (dev->input==TM6000_INPUT_SVIDEO) {
611 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x01);
612 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x03);
614 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x07, 0x00);
615 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x17, 0x8b);
617 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x00);
618 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x00);
623 /* End of software reset */
624 tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x3f, 0x00);
631 int tm6000_set_audio_bitrate (struct tm6000_core *dev, int bitrate)
635 val=tm6000_get_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, 0x0);
636 printk("Original value=%d\n",val);
640 val &= 0x0f; /* Preserve the audio input control bits */
649 val=tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, val);