tm6000-core.c revision 3169c9b26fffa180bc3bc81dc247df2f4824ee7d
19701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab/*
29701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab   tm6000-core.c - driver for TM5600/TM6000 USB video capture devices
39701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
49701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab   Copyright (C) 2006-2007 Mauro Carvalho Chehab <mchehab@infradead.org>
59701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
63169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig   Copyright (C) 2007 Michel Ludwig <michel.ludwig@gmail.com>
73169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig       - DVB-T support
83169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig
99701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab   This program is free software; you can redistribute it and/or modify
109701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab   it under the terms of the GNU General Public License as published by
119701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab   the Free Software Foundation version 2
129701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
139701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab   This program is distributed in the hope that it will be useful,
149701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab   but WITHOUT ANY WARRANTY; without even the implied warranty of
159701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
169701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab   GNU General Public License for more details.
179701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
189701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab   You should have received a copy of the GNU General Public License
199701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab   along with this program; if not, write to the Free Software
209701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
219701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab */
229701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
239701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include <linux/module.h>
249701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include <linux/kernel.h>
259701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include <linux/usb.h>
269701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include <linux/i2c.h>
279701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include <linux/video_decoder.h>
289701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include "tm6000.h"
299701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include "tm6000-regs.h"
309701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include <media/v4l2-common.h>
319701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include <media/tuner.h>
329701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
339701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#ifdef HACK /* HACK */
349701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#include "tm6000-hack.c"
359701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#endif
369701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
379701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#define USB_TIMEOUT	5*HZ /* ms */
389701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
399701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_read_write_usb (struct tm6000_core *dev, u8 req_type, u8 req,
409701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			   u16 value, u16 index, u8 *buf, u16 len)
419701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab{
429701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	int          ret, i;
439701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	unsigned int pipe;
449701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	static int   ini=0, last=0, n=0;
459701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	u8	     *data=NULL;
469701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
479701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (len)
489701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		data = kzalloc(len, GFP_KERNEL);
499701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
509701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
519701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (req_type & USB_DIR_IN)
529701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		pipe=usb_rcvctrlpipe(dev->udev, 0);
539701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	else {
549701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		pipe=usb_sndctrlpipe(dev->udev, 0);
559701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		memcpy(data, buf, len);
569701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	}
579701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
589701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (tm6000_debug & V4L2_DEBUG_I2C) {
599701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		if (!ini)
609701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			last=ini=jiffies;
619701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
629701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		printk("%06i (dev %p, pipe %08x): ", n, dev->udev, pipe);
639701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
649701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		printk( "%s: %06u ms %06u ms %02x %02x %02x %02x %02x %02x %02x %02x ",
659701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			(req_type & USB_DIR_IN)?" IN":"OUT",
669701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			jiffies_to_msecs(jiffies-last),
679701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			jiffies_to_msecs(jiffies-ini),
689701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			req_type, req,value&0xff,value>>8, index&0xff, index>>8,
699701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			len&0xff, len>>8);
709701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		last=jiffies;
719701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		n++;
729701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
739701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		if ( !(req_type & USB_DIR_IN) ) {
749701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			printk(">>> ");
759701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			for (i=0;i<len;i++) {
769701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				printk(" %02x",buf[i]);
779701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			}
789701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			printk("\n");
799701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		}
809701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	}
819701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
829701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	ret = usb_control_msg(dev->udev, pipe, req, req_type, value, index, data,
839701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			      len, USB_TIMEOUT);
849701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
859701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (req_type &  USB_DIR_IN)
869701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		memcpy(buf, data, len);
879701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
889701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (tm6000_debug & V4L2_DEBUG_I2C) {
899701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		if (ret<0) {
909701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			if (req_type &  USB_DIR_IN)
919701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				printk("<<< (len=%d)\n",len);
929701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
939701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			printk("%s: Error #%d\n", __FUNCTION__, ret);
949701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		} else if (req_type &  USB_DIR_IN) {
959701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			printk("<<< ");
969701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			for (i=0;i<len;i++) {
979701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				printk(" %02x",buf[i]);
989701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			}
999701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			printk("\n");
1009701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		}
1019701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	}
1029701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1039701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	kfree(data);
1049701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
105a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig	msleep(5);
106a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig
1079701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	return ret;
1089701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab}
1099701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1109701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_set_reg (struct tm6000_core *dev, u8 req, u16 value, u16 index)
1119701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab{
1129701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	return
1139701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_read_write_usb (dev, USB_DIR_OUT | USB_TYPE_VENDOR,
1149701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				       req, value, index, NULL, 0);
1159701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab}
1169701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1179701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_get_reg (struct tm6000_core *dev, u8 req, u16 value, u16 index)
1189701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab{
1199701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	int rc;
1209701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	u8 buf[1];
1219701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1229701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	rc=tm6000_read_write_usb (dev, USB_DIR_IN | USB_TYPE_VENDOR, req,
1239701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				       value, index, buf, 1);
1249701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1259701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (rc<0)
1269701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		return rc;
1279701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1289701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	return *buf;
1299701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab}
1309701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1319701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_get_reg16 (struct tm6000_core *dev, u8 req, u16 value, u16 index)
1329701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab{
1339701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	int rc;
1349701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	u8 buf[2];
1359701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1369701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	rc=tm6000_read_write_usb (dev, USB_DIR_IN | USB_TYPE_VENDOR, req,
1379701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				       value, index, buf, 2);
1389701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1399701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (rc<0)
1409701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		return rc;
1419701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1429701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	return buf[1]|buf[0]<<8;
1439701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab}
1449701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1459701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabvoid tm6000_set_fourcc_format(struct tm6000_core *dev)
1469701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab{
1479701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (dev->fourcc==V4L2_PIX_FMT_UYVY) {
1489701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		/* Sets driver to UYUV */
1499701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xc1, 0xd0);
1509701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	} else {
1519701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		/* Sets driver to YUV2 */
1529701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xc1, 0x90);
1539701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	}
1549701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab}
1559701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1569701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_init_analog_mode (struct tm6000_core *dev)
1579701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab{
1589701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1599701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* Enables soft reset */
1609701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x3f, 0x01);
1619701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1629701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (dev->scaler) {
1639701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xc0, 0x20);
1649701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	} else {
1659701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		/* Enable Hfilter and disable TS Drop err */
1669701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xc0, 0x80);
1679701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	}
1689701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xc3, 0x88);
1699701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xda, 0x23);
1709701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xd1, 0xc0);
1719701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xd2, 0xd8);
1729701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xd6, 0x06);
1739701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xdf, 0x1f);
1749701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1759701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* AP Software reset */
1769701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xff, 0x08);
1779701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xff, 0x00);
1789701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1799701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_fourcc_format(dev);
1809701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1819701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* Disables soft reset */
1829701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x3f, 0x00);
1839701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1849701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* E3: Select input 0 - TV tuner */
1859701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe3, 0x00);
1869701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, 0x60);
1879701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1889701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* Tuner firmware can now be loaded */
1899701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1909701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_1, 0x00);
1919701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	msleep(11);
1929701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1939701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* This controls input */
1949701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_2, 0x0);
1959701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_3, 0x01);
1969701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	msleep(20);
1979701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
1989701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/*FIXME: Hack!!! */
1999701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	struct v4l2_frequency f;
2009701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	mutex_lock(&dev->lock);
2019701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	f.frequency=dev->freq;
2029701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_i2c_call_clients(dev,VIDIOC_S_FREQUENCY,&f);
2039701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	mutex_unlock(&dev->lock);
2049701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2059701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	msleep(100);
2069701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_standard (dev, &dev->norm);
2079701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_audio_bitrate (dev,48000);
2089701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2099701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2109701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	return 0;
2119701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab}
2129701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2133169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwigint tm6000_init_digital_mode (struct tm6000_core *dev)
2143169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig{
2153169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00ff, 0x08);
2163169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00ff, 0x00);
2173169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x003f, 0x01);
2183169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00df, 0x08);
2193169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00e2, 0x0c);
2203169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00e8, 0xff);
2213169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00eb, 0xd8);
2223169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00c0, 0x40);
2233169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00c1, 0xd0);
2243169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00c3, 0x09);
2253169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00da, 0x37);
2263169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00d1, 0xd8);
2273169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00d2, 0xc0);
2283169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00d6, 0x60);
2293169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	msleep(50);
2303169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig
2313169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_04_EN_DISABLE_MCU_INT, 0x0020, 0x00);
2323169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_04_EN_DISABLE_MCU_INT, 0x0020, 0x01);
2333169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	tm6000_set_reg (dev, REQ_04_EN_DISABLE_MCU_INT, 0x0020, 0x00);
2343169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig
2353169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	msleep(100);
2363169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig
2373169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig	return 0;
2383169c9b26fffa180bc3bc81dc247df2f4824ee7dMichel Ludwig}
2399701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
2409701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab/* The meaning of those initializations are unknown */
2419701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabu8 init_tab[][2] = {
2429701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* REG  VALUE */
2439701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0xdf, 0x1f },
2449701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0xff, 0x08 },
2459701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0xff, 0x00 },
2469701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0xd5, 0x4f },
2479701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0xda, 0x23 },
2489701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0xdb, 0x08 },
2499701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0xe2, 0x00 },
2509701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0xe3, 0x10 },
2519701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0xe5, 0x00 },
2529701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0xe8, 0x00 },
2539701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0xeb, 0x64 },		/* 48000 bits/sample, external input */
2549701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0xee, 0xc2 },
2559701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x3f, 0x01 },		/* Start of soft reset */
2569701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x00, 0x00 },
2579701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x01, 0x07 },
2589701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x02, 0x5f },
2599701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x03, 0x00 },
2609701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x05, 0x64 },
2619701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x07, 0x01 },
2629701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x08, 0x82 },
2639701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x09, 0x36 },
2649701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x0a, 0x50 },
2659701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x0c, 0x6a },
2669701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x11, 0xc9 },
2679701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x12, 0x07 },
2689701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x13, 0x3b },
2699701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x14, 0x47 },
2709701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x15, 0x6f },
2719701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x17, 0xcd },
2729701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x18, 0x1e },
2739701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x19, 0x8b },
2749701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x1a, 0xa2 },
2759701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x1b, 0xe9 },
2769701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x1c, 0x1c },
2779701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x1d, 0xcc },
2789701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x1e, 0xcc },
2799701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x1f, 0xcd },
2809701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x20, 0x3c },
2819701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x21, 0x3c },
2829701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x2d, 0x48 },
2839701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x2e, 0x88 },
2849701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x30, 0x22 },
2859701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x31, 0x61 },
2869701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x32, 0x74 },
2879701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x33, 0x1c },
2889701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x34, 0x74 },
2899701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x35, 0x1c },
2909701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x36, 0x7a },
2919701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x37, 0x26 },
2929701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x38, 0x40 },
2939701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x39, 0x0a },
2949701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x42, 0x55 },
2959701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x51, 0x11 },
2969701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x55, 0x01 },
2979701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x57, 0x02 },
2989701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x58, 0x35 },
2999701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x59, 0xa0 },
3009701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x80, 0x15 },
3019701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x82, 0x42 },
3029701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0xc1, 0xd0 },
3039701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0xc3, 0x88 },
3049701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ 0x3f, 0x00 },		/* End of the soft reset */
3059701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab};
3069701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3079701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_init (struct tm6000_core *dev)
3089701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab{
3099701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	int board, rc=0, i;
3109701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3119701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#ifdef HACK /* HACK */
3129701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	init_tm6000(dev);
3139701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	return 0;
3149701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#else
3159701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3169701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* Load board's initialization table */
3179701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	for (i=0; i< ARRAY_SIZE(init_tab); i++) {
3189701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		rc= tm6000_set_reg (dev, REQ_07_SET_GET_AVREG,
3199701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			init_tab[i][0],init_tab[i][1]);
3209701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		if (rc<0) {
3219701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			printk (KERN_ERR "Error %i while setting reg %d to value %d\n",
3229701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			rc, init_tab[i][0],init_tab[i][1]);
3239701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			return rc;
3249701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		}
3259701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	}
3269701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3279701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* Check board version - maybe 10Moons specific */
3289701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	board=tm6000_get_reg16 (dev, 0x40, 0, 0);
3299701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (board >=0) {
3309701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		printk (KERN_INFO "Board version = 0x%04x\n",board);
3319701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	} else {
3329701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		printk (KERN_ERR "Error %i while retrieving board version\n",board);
3339701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	}
3349701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3359701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_05_SET_GET_USBREG, 0x18, 0x00);
3369701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	msleep(5); /* Just to be conservative */
3379701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
338a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig	/* Reset GPIO1 and GPIO4. */
339a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig	for (i=0; i< 2; i++) {
3409701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		rc=tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_1, 0);
3419701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		if (rc<0) {
3429701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			printk (KERN_ERR "Error %i doing GPIO1 reset\n",rc);
3439701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			return rc;
3449701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		}
3459701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3469701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		msleep(10); /* Just to be conservative */
3479701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		rc=tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_1, 1);
3489701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		if (rc<0) {
3499701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			printk (KERN_ERR "Error %i doing GPIO1 reset\n",rc);
3509701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			return rc;
3519701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		}
3529701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
353a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig		msleep(10);
354a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig		rc=tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_4, 0);
355a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig		if (rc<0) {
356a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig			printk (KERN_ERR "Error %i doing GPIO4 reset\n",rc);
357a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig			return rc;
358a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig		}
359a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig
360a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig		msleep(10);
361a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig		rc=tm6000_set_reg (dev, REQ_03_SET_GET_MCU_PIN, TM6000_GPIO_4, 1);
362a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig		if (rc<0) {
363a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig			printk (KERN_ERR "Error %i doing GPIO4 reset\n",rc);
364a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig			return rc;
365a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig		}
366a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig
3679701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		if (!i)
3689701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			rc=tm6000_get_reg16(dev, 0x40,0,0);
3699701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	}
370a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig
371a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig	msleep(50);
372a5adfbed09ffedb4ffa8e9a93dbd757096020470Michel Ludwig
3739701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	return 0;
3749701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3759701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#endif /* HACK */
3769701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab}
3779701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3789701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab#define tm6000_wrt(dev,req,reg,val, data...)				\
3799701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	{ const static u8 _val[] = data;				\
3809701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_read_write_usb(dev,USB_DIR_OUT | USB_TYPE_VENDOR,	\
3819701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	req,reg, val, (u8 *) _val, ARRAY_SIZE(_val));			\
3829701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	}
3839701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3849701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab/*
3859701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho ChehabTM5600/6000 register values to set video standards.
3869701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	There's an adjust, common to all, for composite video
3879701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	Additional adjustments are required for S-Video, based on std.
3889701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
3899701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab      Standards values for TV             S-Video Changes
3909701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho ChehabREG   PAL   PAL_M PAL_N SECAM NTSC  Comp. PAL  PAL_M PAL_N SECAM NTSC
3919701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0xdf  0x1f  0x1f  0x1f  0x1f  0x1f
3929701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0xe2  0x00  0x00  0x00  0x00  0x00
3939701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0xe8  0x0f  0x0f  0x0f  0x0f  0x0f        0x00 0x00  0x00  0x00  0x00
3949701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0xeb  0x60  0x60  0x60  0x60  0x60  0x64  0x64 0x64  0x64  0x64  0x64
3959701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0xd5  0x5f  0x5f  0x5f  0x4f  0x4f        0x4f 0x4f  0x4f  0x4f  0x4f
3969701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0xe3  0x00  0x00  0x00  0x00  0x00  0x10  0x10 0x10  0x10  0x10  0x10
3979701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0xe5  0x00  0x00  0x00  0x00  0x00        0x10 0x10  0x10  0x10  0x10
3989701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x3f  0x01  0x01  0x01  0x01  0x01
3999701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x00  0x32  0x04  0x36  0x38  0x00        0x33 0x05  0x37  0x39  0x01
4009701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x01  0x0e  0x0e  0x0e  0x0e  0x0f
4019701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x02  0x5f  0x5f  0x5f  0x5f  0x5f
4029701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x03  0x02  0x00  0x02  0x02  0x00        0x04 0x04  0x04  0x03  0x03
4039701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x07  0x01  0x01  0x01  0x01  0x01        0x00                   0x00
4049701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x17  0xcd  0xcd  0xcd  0xcd  0xcd                               0x8b
4059701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x18  0x25  0x1e  0x1e  0x24  0x1e
4069701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x19  0xd5  0x83  0x91  0x92  0x8b
4079701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x1a  0x63  0x0a  0x1f  0xe8  0xa2
4089701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x1b  0x50  0xe0  0x0c  0xed  0xe9
4099701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x1c  0x1c  0x1c  0x1c  0x1c  0x1c
4109701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x1d  0xcc  0xcc  0xcc  0xcc  0xcc
4119701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x1e  0xcc  0xcc  0xcc  0xcc  0xcc
4129701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x1f  0xcd  0xcd  0xcd  0xcd  0xcd
4139701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x2e  0x8c  0x88  0x8c  0x8c  0x88                   0x88
4149701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x30  0x2c  0x20  0x2c  0x2c  0x22        0x2a 0x22  0x22  0x2a
4159701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x31  0xc1  0x61  0xc1  0xc1  0x61
4169701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x33  0x0c  0x0c  0x0c  0x2c  0x1c
4179701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x35  0x1c  0x1c  0x1c  0x18  0x1c
4189701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x82  0x52  0x52  0x52  0x42  0x42
4199701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x04  0xdc  0xdc  0xdc        0xdd
4209701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x0d  0x07  0x07  0x07  0x87  0x07
4219701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab0x3f  0x00  0x00  0x00  0x00  0x00
4229701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab*/
4239701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
4249701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_set_standard (struct tm6000_core *dev, v4l2_std_id *norm)
4259701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab{
4269701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	dev->norm=*norm;
4279701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
4289701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* HACK: Should use, instead, the common code!!! */
4299701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (*norm & V4L2_STD_PAL_M) {
4309701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xdf, 0x1f);
4319701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe2, 0x00);
4329701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe8, 0x0f);
4339701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, 0x60);
4349701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xd5, 0x5f);
4359701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe3, 0x00);
4369701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe5, 0x00);
4379701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x3f, 0x01);
4389701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x04);
4399701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x01, 0x0e);
4409701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x02, 0x5f);
4419701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x00);
4429701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x07, 0x01);
4439701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x18, 0x1e);
4449701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x19, 0x83);
4459701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1a, 0x0a);
4469701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1b, 0xe0);
4479701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1c, 0x1c);
4489701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1d, 0xcc);
4499701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1e, 0xcc);
4509701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1f, 0xcd);
4519701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2e, 0x88);
4529701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x20);
4539701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x31, 0x61);
4549701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x33, 0x0c);
4559701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x35, 0x1c);
4569701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x82, 0x52);
4579701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x04, 0xdc);
4589701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x0d, 0x07);
4599701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x3f, 0x00);
4609701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		return 0;
4619701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	}
4629701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
4639701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* */
4649701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab//	tm6000_set_reg (dev, REQ_04_EN_DISABLE_MCU_INT, 0x02, 0x01);
4659701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab//	tm6000_set_reg (dev, REQ_04_EN_DISABLE_MCU_INT, 0x02, 0x00);
4669701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
4679701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* Set registers common to all standards */
4689701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xdf, 0x1f);
4699701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe2, 0x00);
4709701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
4719701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	switch (dev->input) {
4729701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	case TM6000_INPUT_TV:
4739701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		/* Seems to disable ADC2 - needed for TV and RCA */
4749701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe8, 0x0f);
4759701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
4769701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, 0x60);
4779701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
4789701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		if (*norm & V4L2_STD_PAL) {
4799701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			/* Enable UV_FLT_EN */
4809701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xd5, 0x5f);
4819701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		} else {
4829701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xd5, 0x4f);
4839701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		}
4849701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
4859701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		/* E3: Select input 0 */
4869701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe3, 0x00);
4879701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
4889701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe5, 0x10);
4899701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
4909701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		break;
4919701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	case TM6000_INPUT_COMPOSITE:
4929701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, 0x64);
4939701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		/* E3: Select input 1 */
4949701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe3, 0x10);
4959701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		break;
4969701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	case TM6000_INPUT_SVIDEO:
4979701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe8, 0x00);
4989701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
4999701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, 0x64);
5009701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5019701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xd5, 0x4f);
5029701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		/* E3: Select input 1 */
5039701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe3, 0x10);
5049701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5059701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xe5, 0x10);
5069701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5079701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		break;
5089701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	}
5099701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5109701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* Software reset */
5119701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x3f, 0x01);
5129701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5139701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x02, 0x5f);
5149701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5159701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x07, 0x01);
5169701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab//	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x17, 0xcd);
5179701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5189701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* Horizontal Sync DTO = 0x1ccccccd */
5199701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1c, 0x1c);
5209701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1d, 0xcc);
5219701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1e, 0xcc);
5229701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1f, 0xcd);
5239701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5249701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* Vertical Height */
5259701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (*norm & V4L2_STD_525_60) {
5269701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x31, 0x61);
5279701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	} else {
5289701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x31, 0xc1);
5299701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	}
5309701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5319701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* Horizontal Length */
5329701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2f, 640/8);
5339701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5349701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (*norm & V4L2_STD_PAL) {
5359701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		/* Common to All PAL Standards */
5369701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5379701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x01, 0x0e);
5389701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5399701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		/* Vsync Hsinc Lockout End */
5409701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x33, 0x0c);
5419701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5429701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x35, 0x1c);
5439701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x82, 0x52);
5449701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x04, 0xdc);
5459701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x0d, 0x07);
5469701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		if (*norm & V4L2_STD_PAL_M) {
5479701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5489701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			/* Chroma DTO */
5499701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x18, 0x1e);
5509701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x19, 0x83);
5519701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1a, 0x0a);
5529701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1b, 0xe0);
5539701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5549701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			/* Active Video Horiz Start Time */
5559701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2e, 0x88);
5569701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5579701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			if (dev->input==TM6000_INPUT_SVIDEO) {
5589701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x05);
5599701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x04);
5609701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x22);
5619701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			} else {
5629701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x04);
5639701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x00);
5649701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x20);
5659701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			}
5669701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		} else if (*norm & V4L2_STD_PAL_N) {
5679701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			/* Chroma DTO */
5689701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x18, 0x1e);
5699701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x19, 0x91);
5709701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1a, 0x1f);
5719701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1b, 0x0c);
5729701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5739701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			if (dev->input==TM6000_INPUT_SVIDEO) {
5749701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x37);
5759701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x04);
5769701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2e, 0x88);
5779701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x22);
5789701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			} else {
5799701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x36);
5809701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x02);
5819701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2e, 0x8c);
5829701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x2c);
5839701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			}
5849701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		} else {	// Other PAL standards
5859701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x18, 0x25);
5869701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x19, 0xd5);
5879701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1a, 0x63);
5889701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1b, 0x50);
5899701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2e, 0x8c);
5909701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5919701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			if (dev->input==TM6000_INPUT_SVIDEO) {
5929701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x33);
5939701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x04);
5949701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x2a);
5959701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
5969701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x2c);
5979701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			} else {
5989701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x32);
5999701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x02);
6009701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab				tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x2c);
6019701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			}
6029701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		}
6039701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	} if (*norm & V4L2_STD_SECAM) {
6049701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x01, 0x0e);
6059701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x18, 0x24);
6069701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x19, 0x92);
6079701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1a, 0xe8);
6089701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1b, 0xed);
6099701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2e, 0x8c);
6109701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
6119701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x33, 0x2c);
6129701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x35, 0x18);
6139701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x82, 0x42);
6149701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		// Register 0x04 is not initialized on SECAM
6159701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x0d, 0x87);
6169701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
6179701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		if (dev->input==TM6000_INPUT_SVIDEO) {
6189701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x39);
6199701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x03);
6209701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x2a);
6219701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		} else {
6229701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x38);
6239701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x02);
6249701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x2c);
6259701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		}
6269701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	} else {	/* NTSC */
6279701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x01, 0x0f);
6289701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x18, 0x1e);
6299701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x19, 0x8b);
6309701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1a, 0xa2);
6319701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x1b, 0xe9);
6329701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x2e, 0x88);
6339701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x30, 0x22);
6349701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
6359701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x33, 0x1c);
6369701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x35, 0x1c);
6379701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x82, 0x42);
6389701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x0d, 0x07);
6399701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		if (dev->input==TM6000_INPUT_SVIDEO) {
6409701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x01);
6419701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x03);
6429701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
6439701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x07, 0x00);
6449701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x17, 0x8b);
6459701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		} else {
6469701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x00, 0x00);
6479701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab			tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x03, 0x00);
6489701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		}
6499701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	}
6509701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
6519701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
6529701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	/* End of software reset */
6539701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0x3f, 0x00);
6549701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
6559701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	msleep(40);
6569701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
6579701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	return 0;
6589701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab}
6599701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
6609701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabint tm6000_set_audio_bitrate (struct tm6000_core *dev, int bitrate)
6619701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab{
6629701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	int val;
6639701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
6649701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	val=tm6000_get_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, 0x0);
6659701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehabprintk("Original value=%d\n",val);
6669701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	if (val<0)
6679701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		return val;
6689701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
6699701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	val &= 0x0f;		/* Preserve the audio input control bits */
6709701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	switch (bitrate) {
6719701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	case 44100:
6729701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		val|=0xd0;
6739701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		break;
6749701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	case 48000:
6759701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		val|=0x60;
6769701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab		break;
6779701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	}
6789701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	val=tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, val);
6799701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab
6809701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab	return val;
6819701dc94a14e54a33c3c99744ec3a761f6385fc6Mauro Carvalho Chehab}
682