2005-04-17 02:20:36 +04:00
|
|
|
/*
|
|
|
|
*
|
|
|
|
* (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
|
|
|
|
*
|
2005-07-13 00:58:47 +04:00
|
|
|
* Extended 3 / 2005 by Hartmut Hackmann to support various
|
|
|
|
* cards with the tda10046 DVB-T channel decoder
|
|
|
|
*
|
2005-04-17 02:20:36 +04:00
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/init.h>
|
|
|
|
#include <linux/list.h>
|
|
|
|
#include <linux/module.h>
|
|
|
|
#include <linux/kernel.h>
|
|
|
|
#include <linux/delay.h>
|
|
|
|
#include <linux/kthread.h>
|
|
|
|
#include <linux/suspend.h>
|
|
|
|
|
|
|
|
#include "saa7134-reg.h"
|
|
|
|
#include "saa7134.h"
|
2006-01-09 20:32:31 +03:00
|
|
|
#include <media/v4l2-common.h>
|
2006-02-07 11:25:14 +03:00
|
|
|
#include "dvb-pll.h"
|
2008-04-22 21:46:08 +04:00
|
|
|
#include <dvb_frontend.h>
|
2005-04-17 02:20:36 +04:00
|
|
|
|
2006-08-08 16:10:09 +04:00
|
|
|
#include "mt352.h"
|
|
|
|
#include "mt352_priv.h" /* FIXME */
|
|
|
|
#include "tda1004x.h"
|
|
|
|
#include "nxt200x.h"
|
2008-04-22 21:45:27 +04:00
|
|
|
#include "tuner-xc2028.h"
|
2009-10-01 06:02:21 +04:00
|
|
|
#include "xc5000.h"
|
2005-04-17 02:20:36 +04:00
|
|
|
|
2006-08-08 16:10:10 +04:00
|
|
|
#include "tda10086.h"
|
|
|
|
#include "tda826x.h"
|
2007-04-27 19:31:14 +04:00
|
|
|
#include "tda827x.h"
|
2006-08-08 16:10:10 +04:00
|
|
|
#include "isl6421.h"
|
2008-04-22 21:42:09 +04:00
|
|
|
#include "isl6405.h"
|
2008-04-22 21:42:11 +04:00
|
|
|
#include "lnbp21.h"
|
2008-04-22 21:46:16 +04:00
|
|
|
#include "tuner-simple.h"
|
2009-01-19 07:10:49 +03:00
|
|
|
#include "tda10048.h"
|
2009-01-19 07:10:49 +03:00
|
|
|
#include "tda18271.h"
|
|
|
|
#include "lgdt3305.h"
|
|
|
|
#include "tda8290.h"
|
2007-04-27 19:31:14 +04:00
|
|
|
|
2008-12-23 09:53:03 +03:00
|
|
|
#include "zl10353.h"
|
|
|
|
|
2009-02-24 18:35:16 +03:00
|
|
|
#include "zl10036.h"
|
2009-08-14 04:42:21 +04:00
|
|
|
#include "zl10039.h"
|
2009-02-24 18:35:16 +03:00
|
|
|
#include "mt312.h"
|
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
|
|
|
|
MODULE_LICENSE("GPL");
|
|
|
|
|
2008-04-22 21:41:48 +04:00
|
|
|
static unsigned int antenna_pwr;
|
2005-07-13 00:58:47 +04:00
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
module_param(antenna_pwr, int, 0444);
|
|
|
|
MODULE_PARM_DESC(antenna_pwr,"enable antenna power (Pinnacle 300i)");
|
|
|
|
|
2008-04-22 21:41:48 +04:00
|
|
|
static int use_frontend;
|
2006-12-20 15:37:05 +03:00
|
|
|
module_param(use_frontend, int, 0644);
|
|
|
|
MODULE_PARM_DESC(use_frontend,"for cards with multiple frontends (0: terrestrial, 1: satellite)");
|
2006-11-16 04:06:56 +03:00
|
|
|
|
2008-04-22 21:41:48 +04:00
|
|
|
static int debug;
|
2007-04-27 19:31:12 +04:00
|
|
|
module_param(debug, int, 0644);
|
|
|
|
MODULE_PARM_DESC(debug, "Turn on/off module debugging (default:off).");
|
|
|
|
|
2008-04-10 02:13:13 +04:00
|
|
|
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
|
|
|
|
|
2007-03-08 00:19:48 +03:00
|
|
|
#define dprintk(fmt, arg...) do { if (debug) \
|
|
|
|
printk(KERN_DEBUG "%s/dvb: " fmt, dev->name , ## arg); } while(0)
|
|
|
|
|
|
|
|
/* Print a warning */
|
|
|
|
#define wprintk(fmt, arg...) \
|
|
|
|
printk(KERN_WARNING "%s/dvb: " fmt, dev->name, ## arg)
|
2007-04-27 19:31:12 +04:00
|
|
|
|
|
|
|
/* ------------------------------------------------------------------
|
|
|
|
* mt352 based DVB-T cards
|
|
|
|
*/
|
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
static int pinnacle_antenna_pwr(struct saa7134_dev *dev, int on)
|
|
|
|
{
|
|
|
|
u32 ok;
|
|
|
|
|
|
|
|
if (!on) {
|
|
|
|
saa_setl(SAA7134_GPIO_GPMODE0 >> 2, (1 << 26));
|
|
|
|
saa_clearl(SAA7134_GPIO_GPSTATUS0 >> 2, (1 << 26));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
saa_setl(SAA7134_GPIO_GPMODE0 >> 2, (1 << 26));
|
|
|
|
saa_setl(SAA7134_GPIO_GPSTATUS0 >> 2, (1 << 26));
|
|
|
|
udelay(10);
|
|
|
|
|
|
|
|
saa_setl(SAA7134_GPIO_GPMODE0 >> 2, (1 << 28));
|
|
|
|
saa_clearl(SAA7134_GPIO_GPSTATUS0 >> 2, (1 << 28));
|
|
|
|
udelay(10);
|
|
|
|
saa_setl(SAA7134_GPIO_GPSTATUS0 >> 2, (1 << 28));
|
|
|
|
udelay(10);
|
|
|
|
ok = saa_readl(SAA7134_GPIO_GPSTATUS0) & (1 << 27);
|
2008-04-22 21:46:08 +04:00
|
|
|
dprintk("%s %s\n", __func__, ok ? "on" : "off");
|
2005-04-17 02:20:36 +04:00
|
|
|
|
|
|
|
if (!ok)
|
|
|
|
saa_clearl(SAA7134_GPIO_GPSTATUS0 >> 2, (1 << 26));
|
|
|
|
return ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int mt352_pinnacle_init(struct dvb_frontend* fe)
|
|
|
|
{
|
|
|
|
static u8 clock_config [] = { CLOCK_CTL, 0x3d, 0x28 };
|
|
|
|
static u8 reset [] = { RESET, 0x80 };
|
|
|
|
static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
|
|
|
|
static u8 agc_cfg [] = { AGC_TARGET, 0x28, 0xa0 };
|
|
|
|
static u8 capt_range_cfg[] = { CAPT_RANGE, 0x31 };
|
|
|
|
static u8 fsm_ctl_cfg[] = { 0x7b, 0x04 };
|
|
|
|
static u8 gpp_ctl_cfg [] = { GPP_CTL, 0x0f };
|
|
|
|
static u8 scan_ctl_cfg [] = { SCAN_CTL, 0x0d };
|
|
|
|
static u8 irq_cfg [] = { INTERRUPT_EN_0, 0x00, 0x00, 0x00, 0x00 };
|
|
|
|
struct saa7134_dev *dev= fe->dvb->priv;
|
|
|
|
|
2008-04-22 21:46:08 +04:00
|
|
|
dprintk("%s called\n", __func__);
|
2005-04-17 02:20:36 +04:00
|
|
|
|
|
|
|
mt352_write(fe, clock_config, sizeof(clock_config));
|
|
|
|
udelay(200);
|
|
|
|
mt352_write(fe, reset, sizeof(reset));
|
|
|
|
mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
|
|
|
|
mt352_write(fe, agc_cfg, sizeof(agc_cfg));
|
|
|
|
mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
|
|
|
|
mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
|
|
|
|
|
|
|
|
mt352_write(fe, fsm_ctl_cfg, sizeof(fsm_ctl_cfg));
|
|
|
|
mt352_write(fe, scan_ctl_cfg, sizeof(scan_ctl_cfg));
|
|
|
|
mt352_write(fe, irq_cfg, sizeof(irq_cfg));
|
2006-03-03 18:09:26 +03:00
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-02-07 11:25:14 +03:00
|
|
|
static int mt352_aver777_init(struct dvb_frontend* fe)
|
|
|
|
{
|
|
|
|
static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x2d };
|
|
|
|
static u8 reset [] = { RESET, 0x80 };
|
|
|
|
static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
|
|
|
|
static u8 agc_cfg [] = { AGC_TARGET, 0x28, 0xa0 };
|
|
|
|
static u8 capt_range_cfg[] = { CAPT_RANGE, 0x33 };
|
|
|
|
|
|
|
|
mt352_write(fe, clock_config, sizeof(clock_config));
|
|
|
|
udelay(200);
|
|
|
|
mt352_write(fe, reset, sizeof(reset));
|
|
|
|
mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
|
|
|
|
mt352_write(fe, agc_cfg, sizeof(agc_cfg));
|
|
|
|
mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-06-15 20:33:42 +04:00
|
|
|
static int mt352_avermedia_xc3028_init(struct dvb_frontend *fe)
|
2008-03-28 23:52:44 +03:00
|
|
|
{
|
2008-06-15 20:33:42 +04:00
|
|
|
static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x2d };
|
|
|
|
static u8 reset [] = { RESET, 0x80 };
|
|
|
|
static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
|
|
|
|
static u8 agc_cfg [] = { AGC_TARGET, 0xe };
|
2008-03-28 23:52:44 +03:00
|
|
|
static u8 capt_range_cfg[] = { CAPT_RANGE, 0x33 };
|
|
|
|
|
|
|
|
mt352_write(fe, clock_config, sizeof(clock_config));
|
|
|
|
udelay(200);
|
|
|
|
mt352_write(fe, reset, sizeof(reset));
|
|
|
|
mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
|
|
|
|
mt352_write(fe, agc_cfg, sizeof(agc_cfg));
|
|
|
|
mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-05-17 00:22:02 +04:00
|
|
|
static int mt352_pinnacle_tuner_set_params(struct dvb_frontend* fe,
|
|
|
|
struct dvb_frontend_parameters* params)
|
2005-04-17 02:20:36 +04:00
|
|
|
{
|
2006-03-03 18:09:26 +03:00
|
|
|
u8 off[] = { 0x00, 0xf1};
|
|
|
|
u8 on[] = { 0x00, 0x71};
|
|
|
|
struct i2c_msg msg = {.addr=0x43, .flags=0, .buf=off, .len = sizeof(off)};
|
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
|
|
|
struct v4l2_frequency f;
|
|
|
|
|
|
|
|
/* set frequency (mt2050) */
|
|
|
|
f.tuner = 0;
|
|
|
|
f.type = V4L2_TUNER_DIGITAL_TV;
|
|
|
|
f.frequency = params->frequency / 1000 * 16 / 1000;
|
2006-05-14 12:01:31 +04:00
|
|
|
if (fe->ops.i2c_gate_ctrl)
|
|
|
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
2006-03-03 18:09:26 +03:00
|
|
|
i2c_transfer(&dev->i2c_adap, &msg, 1);
|
2009-01-17 18:17:14 +03:00
|
|
|
saa_call_all(dev, tuner, s_frequency, &f);
|
2006-03-03 18:09:26 +03:00
|
|
|
msg.buf = on;
|
2006-05-14 12:01:31 +04:00
|
|
|
if (fe->ops.i2c_gate_ctrl)
|
|
|
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
2006-03-03 18:09:26 +03:00
|
|
|
i2c_transfer(&dev->i2c_adap, &msg, 1);
|
2005-04-17 02:20:36 +04:00
|
|
|
|
|
|
|
pinnacle_antenna_pwr(dev, antenna_pwr);
|
|
|
|
|
|
|
|
/* mt352 setup */
|
2006-05-17 00:22:02 +04:00
|
|
|
return mt352_pinnacle_init(fe);
|
2005-04-17 02:20:36 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static struct mt352_config pinnacle_300i = {
|
|
|
|
.demod_address = 0x3c >> 1,
|
|
|
|
.adc_clock = 20333,
|
|
|
|
.if2 = 36150,
|
|
|
|
.no_tuner = 1,
|
|
|
|
.demod_init = mt352_pinnacle_init,
|
|
|
|
};
|
2006-02-07 11:25:14 +03:00
|
|
|
|
|
|
|
static struct mt352_config avermedia_777 = {
|
|
|
|
.demod_address = 0xf,
|
|
|
|
.demod_init = mt352_aver777_init,
|
|
|
|
};
|
2005-04-17 02:20:36 +04:00
|
|
|
|
2008-06-15 20:33:42 +04:00
|
|
|
static struct mt352_config avermedia_xc3028_mt352_dev = {
|
2008-04-22 21:45:27 +04:00
|
|
|
.demod_address = (0x1e >> 1),
|
|
|
|
.no_tuner = 1,
|
2008-06-15 20:33:42 +04:00
|
|
|
.demod_init = mt352_avermedia_xc3028_init,
|
2008-04-22 21:45:27 +04:00
|
|
|
};
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
/* ==================================================================
|
|
|
|
* tda1004x based DVB-T cards, helper functions
|
|
|
|
*/
|
|
|
|
|
|
|
|
static int philips_tda1004x_request_firmware(struct dvb_frontend *fe,
|
|
|
|
const struct firmware **fw, char *name)
|
2005-04-17 02:20:36 +04:00
|
|
|
{
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
2007-04-27 19:31:12 +04:00
|
|
|
return request_firmware(fw, name, &dev->pci->dev);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ------------------------------------------------------------------
|
|
|
|
* these tuners are tu1216, td1316(a)
|
|
|
|
*/
|
|
|
|
|
|
|
|
static int philips_tda6651_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
|
|
|
|
{
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
|
|
|
struct tda1004x_state *state = fe->demodulator_priv;
|
|
|
|
u8 addr = state->config->tuner_address;
|
2005-07-13 00:58:47 +04:00
|
|
|
u8 tuner_buf[4];
|
2005-11-09 08:36:32 +03:00
|
|
|
struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tuner_buf,.len =
|
2005-07-13 00:58:47 +04:00
|
|
|
sizeof(tuner_buf) };
|
|
|
|
int tuner_frequency = 0;
|
|
|
|
u8 band, cp, filter;
|
|
|
|
|
|
|
|
/* determine charge pump */
|
|
|
|
tuner_frequency = params->frequency + 36166000;
|
|
|
|
if (tuner_frequency < 87000000)
|
|
|
|
return -EINVAL;
|
|
|
|
else if (tuner_frequency < 130000000)
|
|
|
|
cp = 3;
|
|
|
|
else if (tuner_frequency < 160000000)
|
|
|
|
cp = 5;
|
|
|
|
else if (tuner_frequency < 200000000)
|
|
|
|
cp = 6;
|
|
|
|
else if (tuner_frequency < 290000000)
|
|
|
|
cp = 3;
|
|
|
|
else if (tuner_frequency < 420000000)
|
|
|
|
cp = 5;
|
|
|
|
else if (tuner_frequency < 480000000)
|
|
|
|
cp = 6;
|
|
|
|
else if (tuner_frequency < 620000000)
|
|
|
|
cp = 3;
|
|
|
|
else if (tuner_frequency < 830000000)
|
|
|
|
cp = 5;
|
|
|
|
else if (tuner_frequency < 895000000)
|
|
|
|
cp = 7;
|
|
|
|
else
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
/* determine band */
|
|
|
|
if (params->frequency < 49000000)
|
|
|
|
return -EINVAL;
|
|
|
|
else if (params->frequency < 161000000)
|
|
|
|
band = 1;
|
|
|
|
else if (params->frequency < 444000000)
|
|
|
|
band = 2;
|
|
|
|
else if (params->frequency < 861000000)
|
|
|
|
band = 4;
|
|
|
|
else
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
/* setup PLL filter */
|
|
|
|
switch (params->u.ofdm.bandwidth) {
|
|
|
|
case BANDWIDTH_6_MHZ:
|
|
|
|
filter = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BANDWIDTH_7_MHZ:
|
|
|
|
filter = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BANDWIDTH_8_MHZ:
|
|
|
|
filter = 1;
|
|
|
|
break;
|
2005-04-17 02:20:36 +04:00
|
|
|
|
2005-07-13 00:58:47 +04:00
|
|
|
default:
|
|
|
|
return -EINVAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* calculate divisor
|
|
|
|
* ((36166000+((1000000/6)/2)) + Finput)/(1000000/6)
|
2005-04-17 02:20:36 +04:00
|
|
|
*/
|
2005-07-13 00:58:47 +04:00
|
|
|
tuner_frequency = (((params->frequency / 1000) * 6) + 217496) / 1000;
|
|
|
|
|
|
|
|
/* setup tuner buffer */
|
|
|
|
tuner_buf[0] = (tuner_frequency >> 8) & 0x7f;
|
|
|
|
tuner_buf[1] = tuner_frequency & 0xff;
|
|
|
|
tuner_buf[2] = 0xca;
|
|
|
|
tuner_buf[3] = (cp << 5) | (filter << 3) | band;
|
|
|
|
|
2006-05-14 12:01:31 +04:00
|
|
|
if (fe->ops.i2c_gate_ctrl)
|
|
|
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
2007-04-27 19:31:12 +04:00
|
|
|
if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) {
|
2007-03-08 00:19:48 +03:00
|
|
|
wprintk("could not write to tuner at addr: 0x%02x\n",
|
|
|
|
addr << 1);
|
2005-07-13 00:58:47 +04:00
|
|
|
return -EIO;
|
2007-04-27 19:31:12 +04:00
|
|
|
}
|
2005-11-09 08:36:32 +03:00
|
|
|
msleep(1);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
static int philips_tu1216_init(struct dvb_frontend *fe)
|
2005-11-09 08:36:32 +03:00
|
|
|
{
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
2007-04-27 19:31:12 +04:00
|
|
|
struct tda1004x_state *state = fe->demodulator_priv;
|
|
|
|
u8 addr = state->config->tuner_address;
|
2005-11-09 08:36:32 +03:00
|
|
|
static u8 tu1216_init[] = { 0x0b, 0xf5, 0x85, 0xab };
|
|
|
|
struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tu1216_init,.len = sizeof(tu1216_init) };
|
2005-07-13 00:58:47 +04:00
|
|
|
|
2005-11-09 08:36:32 +03:00
|
|
|
/* setup PLL configuration */
|
2006-05-14 12:01:31 +04:00
|
|
|
if (fe->ops.i2c_gate_ctrl)
|
|
|
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
2005-11-09 08:36:32 +03:00
|
|
|
if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1)
|
|
|
|
return -EIO;
|
2005-07-13 00:58:47 +04:00
|
|
|
msleep(1);
|
2005-11-09 08:36:32 +03:00
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-11-09 08:36:32 +03:00
|
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
|
|
|
|
static struct tda1004x_config philips_tu1216_60_config = {
|
2005-07-13 00:58:47 +04:00
|
|
|
.demod_address = 0x8,
|
|
|
|
.invert = 1,
|
2005-11-09 08:36:32 +03:00
|
|
|
.invert_oclk = 0,
|
2005-07-13 00:58:47 +04:00
|
|
|
.xtal_freq = TDA10046_XTAL_4M,
|
|
|
|
.agc_config = TDA10046_AGC_DEFAULT,
|
|
|
|
.if_freq = TDA10046_FREQ_3617,
|
2007-04-27 19:31:12 +04:00
|
|
|
.tuner_address = 0x60,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
2005-07-13 00:58:47 +04:00
|
|
|
};
|
|
|
|
|
2005-11-09 08:36:32 +03:00
|
|
|
static struct tda1004x_config philips_tu1216_61_config = {
|
|
|
|
|
|
|
|
.demod_address = 0x8,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_4M,
|
|
|
|
.agc_config = TDA10046_AGC_DEFAULT,
|
|
|
|
.if_freq = TDA10046_FREQ_3617,
|
2007-04-27 19:31:12 +04:00
|
|
|
.tuner_address = 0x61,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
2005-11-09 08:36:32 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
|
2006-10-31 02:00:16 +03:00
|
|
|
static int philips_td1316_tuner_init(struct dvb_frontend *fe)
|
2005-11-09 08:36:32 +03:00
|
|
|
{
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
2007-04-27 19:31:12 +04:00
|
|
|
struct tda1004x_state *state = fe->demodulator_priv;
|
|
|
|
u8 addr = state->config->tuner_address;
|
2005-11-09 08:36:32 +03:00
|
|
|
static u8 msg[] = { 0x0b, 0xf5, 0x86, 0xab };
|
2007-04-27 19:31:12 +04:00
|
|
|
struct i2c_msg init_msg = {.addr = addr,.flags = 0,.buf = msg,.len = sizeof(msg) };
|
2005-11-09 08:36:32 +03:00
|
|
|
|
|
|
|
/* setup PLL configuration */
|
2006-05-14 12:01:31 +04:00
|
|
|
if (fe->ops.i2c_gate_ctrl)
|
|
|
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
2005-11-09 08:36:32 +03:00
|
|
|
if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1)
|
|
|
|
return -EIO;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-04-19 00:47:11 +04:00
|
|
|
static int philips_td1316_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
|
2005-11-09 08:36:32 +03:00
|
|
|
{
|
2007-04-27 19:31:12 +04:00
|
|
|
return philips_tda6651_pll_set(fe, params);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int philips_td1316_tuner_sleep(struct dvb_frontend *fe)
|
|
|
|
{
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
|
|
|
struct tda1004x_state *state = fe->demodulator_priv;
|
|
|
|
u8 addr = state->config->tuner_address;
|
|
|
|
static u8 msg[] = { 0x0b, 0xdc, 0x86, 0xa4 };
|
|
|
|
struct i2c_msg analog_msg = {.addr = addr,.flags = 0,.buf = msg,.len = sizeof(msg) };
|
|
|
|
|
|
|
|
/* switch the tuner to analog mode */
|
|
|
|
if (fe->ops.i2c_gate_ctrl)
|
|
|
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
|
|
|
if (i2c_transfer(&dev->i2c_adap, &analog_msg, 1) != 1)
|
|
|
|
return -EIO;
|
|
|
|
return 0;
|
2005-11-09 08:36:32 +03:00
|
|
|
}
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
|
2006-10-31 02:00:16 +03:00
|
|
|
static int philips_europa_tuner_init(struct dvb_frontend *fe)
|
|
|
|
{
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
|
|
|
static u8 msg[] = { 0x00, 0x40};
|
|
|
|
struct i2c_msg init_msg = {.addr = 0x43,.flags = 0,.buf = msg,.len = sizeof(msg) };
|
|
|
|
|
|
|
|
|
|
|
|
if (philips_td1316_tuner_init(fe))
|
|
|
|
return -EIO;
|
|
|
|
msleep(1);
|
|
|
|
if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1)
|
|
|
|
return -EIO;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-04-19 00:47:11 +04:00
|
|
|
static int philips_europa_tuner_sleep(struct dvb_frontend *fe)
|
2005-11-09 08:36:32 +03:00
|
|
|
{
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
static u8 msg[] = { 0x00, 0x14 };
|
|
|
|
struct i2c_msg analog_msg = {.addr = 0x43,.flags = 0,.buf = msg,.len = sizeof(msg) };
|
|
|
|
|
|
|
|
if (philips_td1316_tuner_sleep(fe))
|
|
|
|
return -EIO;
|
2005-11-09 08:36:32 +03:00
|
|
|
|
|
|
|
/* switch the board to analog mode */
|
2006-05-14 12:01:31 +04:00
|
|
|
if (fe->ops.i2c_gate_ctrl)
|
|
|
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
2005-11-09 08:36:32 +03:00
|
|
|
i2c_transfer(&dev->i2c_adap, &analog_msg, 1);
|
2006-04-19 00:47:11 +04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int philips_europa_demod_sleep(struct dvb_frontend *fe)
|
|
|
|
{
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
|
|
|
|
|
|
|
if (dev->original_demod_sleep)
|
|
|
|
dev->original_demod_sleep(fe);
|
2006-05-14 12:01:31 +04:00
|
|
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
2006-04-19 00:47:11 +04:00
|
|
|
return 0;
|
2005-11-09 08:36:32 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
static struct tda1004x_config philips_europa_config = {
|
|
|
|
|
|
|
|
.demod_address = 0x8,
|
|
|
|
.invert = 0,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_4M,
|
|
|
|
.agc_config = TDA10046_AGC_IFO_AUTO_POS,
|
|
|
|
.if_freq = TDA10046_FREQ_052,
|
2007-04-27 19:31:12 +04:00
|
|
|
.tuner_address = 0x61,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
2005-11-09 08:36:32 +03:00
|
|
|
};
|
|
|
|
|
2005-05-01 19:59:29 +04:00
|
|
|
static struct tda1004x_config medion_cardbus = {
|
2005-07-13 00:58:47 +04:00
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
|
|
|
.agc_config = TDA10046_AGC_IFO_AUTO_NEG,
|
|
|
|
.if_freq = TDA10046_FREQ_3613,
|
2007-04-27 19:31:12 +04:00
|
|
|
.tuner_address = 0x61,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
2005-07-13 00:58:47 +04:00
|
|
|
};
|
|
|
|
|
2010-05-29 19:49:16 +04:00
|
|
|
static struct tda1004x_config technotrend_budget_t3000_config = {
|
|
|
|
.demod_address = 0x8,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_4M,
|
|
|
|
.agc_config = TDA10046_AGC_DEFAULT,
|
|
|
|
.if_freq = TDA10046_FREQ_3617,
|
|
|
|
.tuner_address = 0x63,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
|
|
|
};
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
/* ------------------------------------------------------------------
|
|
|
|
* tda 1004x based cards with philips silicon tuner
|
|
|
|
*/
|
|
|
|
|
|
|
|
static int tda8290_i2c_gate_ctrl( struct dvb_frontend* fe, int enable)
|
|
|
|
{
|
|
|
|
struct tda1004x_state *state = fe->demodulator_priv;
|
|
|
|
|
|
|
|
u8 addr = state->config->i2c_gate;
|
|
|
|
static u8 tda8290_close[] = { 0x21, 0xc0};
|
|
|
|
static u8 tda8290_open[] = { 0x21, 0x80};
|
|
|
|
struct i2c_msg tda8290_msg = {.addr = addr,.flags = 0, .len = 2};
|
|
|
|
if (enable) {
|
|
|
|
tda8290_msg.buf = tda8290_close;
|
|
|
|
} else {
|
|
|
|
tda8290_msg.buf = tda8290_open;
|
|
|
|
}
|
2007-04-27 19:31:15 +04:00
|
|
|
if (i2c_transfer(state->i2c, &tda8290_msg, 1) != 1) {
|
2007-03-08 00:19:48 +03:00
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
|
|
|
wprintk("could not access tda8290 I2C gate\n");
|
2007-04-27 19:31:12 +04:00
|
|
|
return -EIO;
|
|
|
|
}
|
|
|
|
msleep(20);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int philips_tda827x_tuner_init(struct dvb_frontend *fe)
|
2005-11-09 08:38:42 +03:00
|
|
|
{
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
2007-04-27 19:31:12 +04:00
|
|
|
struct tda1004x_state *state = fe->demodulator_priv;
|
2007-04-27 19:31:14 +04:00
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
switch (state->config->antenna_switch) {
|
|
|
|
case 0: break;
|
|
|
|
case 1: dprintk("setting GPIO21 to 0 (TV antenna?)\n");
|
|
|
|
saa7134_set_gpio(dev, 21, 0);
|
|
|
|
break;
|
|
|
|
case 2: dprintk("setting GPIO21 to 1 (Radio antenna?)\n");
|
|
|
|
saa7134_set_gpio(dev, 21, 1);
|
|
|
|
break;
|
2006-10-07 02:13:50 +04:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
static int philips_tda827x_tuner_sleep(struct dvb_frontend *fe)
|
2006-10-07 02:13:50 +04:00
|
|
|
{
|
2007-04-27 19:31:12 +04:00
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
|
|
|
struct tda1004x_state *state = fe->demodulator_priv;
|
2007-04-27 19:31:14 +04:00
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
switch (state->config->antenna_switch) {
|
|
|
|
case 0: break;
|
|
|
|
case 1: dprintk("setting GPIO21 to 1 (Radio antenna?)\n");
|
|
|
|
saa7134_set_gpio(dev, 21, 1);
|
|
|
|
break;
|
|
|
|
case 2: dprintk("setting GPIO21 to 0 (TV antenna?)\n");
|
|
|
|
saa7134_set_gpio(dev, 21, 0);
|
|
|
|
break;
|
|
|
|
}
|
2006-10-07 02:13:50 +04:00
|
|
|
return 0;
|
2006-02-28 03:14:36 +03:00
|
|
|
}
|
2005-11-09 08:38:42 +03:00
|
|
|
|
2008-04-30 22:27:55 +04:00
|
|
|
static int configure_tda827x_fe(struct saa7134_dev *dev,
|
|
|
|
struct tda1004x_config *cdec_conf,
|
|
|
|
struct tda827x_config *tuner_conf)
|
2005-11-09 08:38:42 +03:00
|
|
|
{
|
2008-10-11 18:05:50 +04:00
|
|
|
struct videobuf_dvb_frontend *fe0;
|
|
|
|
|
2008-10-11 18:18:53 +04:00
|
|
|
/* Get the first frontend */
|
|
|
|
fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
|
2008-10-11 18:05:50 +04:00
|
|
|
|
|
|
|
fe0->dvb.frontend = dvb_attach(tda10046_attach, cdec_conf, &dev->i2c_adap);
|
|
|
|
if (fe0->dvb.frontend) {
|
2008-04-22 21:46:08 +04:00
|
|
|
if (cdec_conf->i2c_gate)
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl;
|
|
|
|
if (dvb_attach(tda827x_attach, fe0->dvb.frontend,
|
2008-04-30 22:27:55 +04:00
|
|
|
cdec_conf->tuner_address,
|
|
|
|
&dev->i2c_adap, tuner_conf))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
wprintk("no tda827x tuner found at addr: %02x\n",
|
2008-04-22 21:46:08 +04:00
|
|
|
cdec_conf->tuner_address);
|
2007-04-27 19:31:12 +04:00
|
|
|
}
|
2008-04-30 22:27:55 +04:00
|
|
|
return -EINVAL;
|
2005-11-09 08:38:42 +03:00
|
|
|
}
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
/* ------------------------------------------------------------------ */
|
2007-08-20 21:06:00 +04:00
|
|
|
|
2008-04-22 21:46:08 +04:00
|
|
|
static struct tda827x_config tda827x_cfg_0 = {
|
|
|
|
.init = philips_tda827x_tuner_init,
|
|
|
|
.sleep = philips_tda827x_tuner_sleep,
|
|
|
|
.config = 0,
|
|
|
|
.switch_addr = 0
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct tda827x_config tda827x_cfg_1 = {
|
|
|
|
.init = philips_tda827x_tuner_init,
|
|
|
|
.sleep = philips_tda827x_tuner_sleep,
|
|
|
|
.config = 1,
|
|
|
|
.switch_addr = 0x4b
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct tda827x_config tda827x_cfg_2 = {
|
|
|
|
.init = philips_tda827x_tuner_init,
|
|
|
|
.sleep = philips_tda827x_tuner_sleep,
|
|
|
|
.config = 2,
|
|
|
|
.switch_addr = 0x4b
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct tda827x_config tda827x_cfg_2_sw42 = {
|
|
|
|
.init = philips_tda827x_tuner_init,
|
|
|
|
.sleep = philips_tda827x_tuner_sleep,
|
|
|
|
.config = 2,
|
|
|
|
.switch_addr = 0x42
|
|
|
|
};
|
|
|
|
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
static struct tda1004x_config tda827x_lifeview_config = {
|
2005-11-09 08:38:42 +03:00
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
2007-04-27 19:31:10 +04:00
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP11_I,
|
2006-11-16 03:31:54 +03:00
|
|
|
.if_freq = TDA10046_FREQ_045,
|
2007-04-27 19:31:12 +04:00
|
|
|
.tuner_address = 0x60,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
2006-11-16 03:31:54 +03:00
|
|
|
};
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
static struct tda1004x_config philips_tiger_config = {
|
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP11_I,
|
|
|
|
.if_freq = TDA10046_FREQ_045,
|
|
|
|
.i2c_gate = 0x4b,
|
|
|
|
.tuner_address = 0x61,
|
|
|
|
.antenna_switch= 1,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
|
|
|
};
|
2006-11-16 03:31:54 +03:00
|
|
|
|
|
|
|
static struct tda1004x_config cinergy_ht_config = {
|
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
2007-04-27 19:31:10 +04:00
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP01_I,
|
2005-11-09 08:38:42 +03:00
|
|
|
.if_freq = TDA10046_FREQ_045,
|
2007-04-27 19:31:12 +04:00
|
|
|
.i2c_gate = 0x4b,
|
|
|
|
.tuner_address = 0x61,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
2005-11-09 08:38:42 +03:00
|
|
|
};
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
static struct tda1004x_config cinergy_ht_pci_config = {
|
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP01_I,
|
|
|
|
.if_freq = TDA10046_FREQ_045,
|
|
|
|
.i2c_gate = 0x4b,
|
|
|
|
.tuner_address = 0x60,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct tda1004x_config philips_tiger_s_config = {
|
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP01_I,
|
|
|
|
.if_freq = TDA10046_FREQ_045,
|
|
|
|
.i2c_gate = 0x4b,
|
|
|
|
.tuner_address = 0x61,
|
|
|
|
.antenna_switch= 1,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
|
|
|
};
|
2006-02-07 11:49:10 +03:00
|
|
|
|
2006-10-07 02:13:50 +04:00
|
|
|
static struct tda1004x_config pinnacle_pctv_310i_config = {
|
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
2007-04-27 19:31:10 +04:00
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP11_I,
|
2006-10-07 02:13:50 +04:00
|
|
|
.if_freq = TDA10046_FREQ_045,
|
2007-04-27 19:31:12 +04:00
|
|
|
.i2c_gate = 0x4b,
|
|
|
|
.tuner_address = 0x61,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
2006-10-07 02:13:50 +04:00
|
|
|
};
|
|
|
|
|
2006-11-05 20:17:30 +03:00
|
|
|
static struct tda1004x_config hauppauge_hvr_1110_config = {
|
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
2007-04-27 19:31:10 +04:00
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP11_I,
|
2006-11-05 20:17:30 +03:00
|
|
|
.if_freq = TDA10046_FREQ_045,
|
2007-04-27 19:31:12 +04:00
|
|
|
.i2c_gate = 0x4b,
|
|
|
|
.tuner_address = 0x61,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
2006-11-05 20:17:30 +03:00
|
|
|
};
|
|
|
|
|
2006-10-13 03:38:51 +04:00
|
|
|
static struct tda1004x_config asus_p7131_dual_config = {
|
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
2007-04-27 19:31:10 +04:00
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP11_I,
|
2006-10-13 03:38:51 +04:00
|
|
|
.if_freq = TDA10046_FREQ_045,
|
2007-04-27 19:31:12 +04:00
|
|
|
.i2c_gate = 0x4b,
|
|
|
|
.tuner_address = 0x61,
|
|
|
|
.antenna_switch= 2,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
2006-10-13 03:38:51 +04:00
|
|
|
};
|
|
|
|
|
2006-03-03 18:11:28 +03:00
|
|
|
static struct tda1004x_config lifeview_trio_config = {
|
|
|
|
.demod_address = 0x09,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
2007-04-27 19:31:10 +04:00
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP00_I,
|
2006-03-03 18:11:28 +03:00
|
|
|
.if_freq = TDA10046_FREQ_045,
|
2007-04-27 19:31:12 +04:00
|
|
|
.tuner_address = 0x60,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
2006-03-03 18:11:28 +03:00
|
|
|
};
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
static struct tda1004x_config tevion_dvbt220rf_config = {
|
2006-02-07 11:49:10 +03:00
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
2007-04-27 19:31:10 +04:00
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
2007-04-27 19:31:12 +04:00
|
|
|
.gpio_config = TDA10046_GP11_I,
|
2006-02-07 11:49:10 +03:00
|
|
|
.if_freq = TDA10046_FREQ_045,
|
2007-04-27 19:31:12 +04:00
|
|
|
.tuner_address = 0x60,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
2006-02-07 11:49:10 +03:00
|
|
|
};
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
static struct tda1004x_config md8800_dvbt_config = {
|
2006-02-07 11:49:13 +03:00
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
2007-04-27 19:31:10 +04:00
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
2007-04-27 19:31:12 +04:00
|
|
|
.gpio_config = TDA10046_GP01_I,
|
2006-02-07 11:49:13 +03:00
|
|
|
.if_freq = TDA10046_FREQ_045,
|
2007-04-27 19:31:12 +04:00
|
|
|
.i2c_gate = 0x4b,
|
|
|
|
.tuner_address = 0x60,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
2006-02-07 11:49:13 +03:00
|
|
|
};
|
|
|
|
|
2007-03-14 02:58:29 +03:00
|
|
|
static struct tda1004x_config asus_p7131_4871_config = {
|
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP01_I,
|
|
|
|
.if_freq = TDA10046_FREQ_045,
|
|
|
|
.i2c_gate = 0x4b,
|
|
|
|
.tuner_address = 0x61,
|
|
|
|
.antenna_switch= 2,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
|
|
|
};
|
|
|
|
|
2007-03-15 02:33:55 +03:00
|
|
|
static struct tda1004x_config asus_p7131_hybrid_lna_config = {
|
2007-03-14 02:58:29 +03:00
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP11_I,
|
|
|
|
.if_freq = TDA10046_FREQ_045,
|
|
|
|
.i2c_gate = 0x4b,
|
|
|
|
.tuner_address = 0x61,
|
|
|
|
.antenna_switch= 2,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
|
|
|
};
|
2007-08-20 21:06:00 +04:00
|
|
|
|
2007-05-01 17:01:20 +04:00
|
|
|
static struct tda1004x_config kworld_dvb_t_210_config = {
|
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP11_I,
|
|
|
|
.if_freq = TDA10046_FREQ_045,
|
|
|
|
.i2c_gate = 0x4b,
|
|
|
|
.tuner_address = 0x61,
|
|
|
|
.antenna_switch= 1,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
|
|
|
};
|
2007-08-20 21:06:00 +04:00
|
|
|
|
2007-08-20 21:14:50 +04:00
|
|
|
static struct tda1004x_config avermedia_super_007_config = {
|
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP01_I,
|
|
|
|
.if_freq = TDA10046_FREQ_045,
|
|
|
|
.i2c_gate = 0x4b,
|
|
|
|
.tuner_address = 0x60,
|
|
|
|
.antenna_switch= 1,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
|
|
|
};
|
|
|
|
|
2008-01-21 01:27:51 +03:00
|
|
|
static struct tda1004x_config twinhan_dtv_dvb_3056_config = {
|
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP01_I,
|
|
|
|
.if_freq = TDA10046_FREQ_045,
|
|
|
|
.i2c_gate = 0x42,
|
|
|
|
.tuner_address = 0x61,
|
|
|
|
.antenna_switch = 1,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
|
|
|
};
|
|
|
|
|
V4L/DVB (9028): saa7134: add support for the triple Asus Tiger 3in1
after looking it up, all rants about the 80 columns restriction seem to
be in vain. After changing the card's name it are now "only" seven new
lines in the tiny DVB-T/DVB-S switch function.
saa7130/34: v4l2 driver version 0.2.14 loaded
saa7133[0]: found at 0000:02:08.0, rev: 209, irq: 18, latency: 32, mmio: 0xfdef7000
saa7133[0]: subsystem: 1043:4878, board: Asus Tiger 3in1 [card=147,autodetected]
saa7133[0]: board init: gpio is 200000
tuner' 2-004b: chip found @ 0x96 (saa7133[0])
saa7133[0]: i2c eeprom 00: 43 10 78 48 54 20 1c 00 43 43 a9 1c 55 d2 b2 92
saa7133[0]: i2c eeprom 10: ff ff ff 0f ff 20 ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 20: 01 40 01 02 03 01 01 03 08 ff 00 d7 ff ff ff ff
saa7133[0]: i2c eeprom 30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 40: ff 28 00 c2 96 16 03 02 c0 1c ff ff ff ff ff ff
saa7133[0]: i2c eeprom 50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c scan: found device @ 0x10 [???]
saa7133[0]: i2c scan: found device @ 0x16 [???]
saa7133[0]: i2c scan: found device @ 0x1c [???]
saa7133[0]: i2c scan: found device @ 0x96 [???]
saa7133[0]: i2c scan: found device @ 0xa0 [eeprom]
tda829x 2-004b: setting tuner address to 61
tda829x 2-004b: type set to tda8290+75a
saa7133[0]: registered device video0 [v4l2]
saa7133[0]: registered device vbi0
saa7133[0]: registered device radio0
DVB: registering new adapter (saa7133[0])
DVB: registering frontend 0 (Philips TDA10086 DVB-S)...
The board init gpio is 0x0, 0x200000 is from previously unloading with
antenna_switch = 1.
It needs firmware for the tda10046 and analog sound needs saa7134-alsa.
I have support for one more board and need to fix the first revision of
the Asus Tiger DVB-T hybrid. DVB-T currently hangs on the male radio
antenna input, also some small other stuff.
Please report any issues with this patch, the next are depending on this
one.
saa7134: add support for the triple Asus Tiger 3in1
Signed-off-by: Hermann Pitton <hermann-pitton@arcor.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2008-09-15 00:49:14 +04:00
|
|
|
static struct tda1004x_config asus_tiger_3in1_config = {
|
|
|
|
.demod_address = 0x0b,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
|
|
|
.gpio_config = TDA10046_GP11_I,
|
|
|
|
.if_freq = TDA10046_FREQ_045,
|
|
|
|
.i2c_gate = 0x4b,
|
|
|
|
.tuner_address = 0x61,
|
|
|
|
.antenna_switch = 1,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
|
|
|
};
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
/* ------------------------------------------------------------------
|
|
|
|
* special case: this card uses saa713x GPIO22 for the mode switch
|
|
|
|
*/
|
2006-08-07 21:03:32 +04:00
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
static int ads_duo_tuner_init(struct dvb_frontend *fe)
|
2006-08-07 21:03:32 +04:00
|
|
|
{
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
2007-04-27 19:31:12 +04:00
|
|
|
philips_tda827x_tuner_init(fe);
|
|
|
|
/* route TDA8275a AGC input to the channel decoder */
|
2007-04-27 19:31:15 +04:00
|
|
|
saa7134_set_gpio(dev, 22, 1);
|
2006-08-07 21:03:32 +04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
static int ads_duo_tuner_sleep(struct dvb_frontend *fe)
|
2006-08-07 21:03:32 +04:00
|
|
|
{
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
2007-04-27 19:31:12 +04:00
|
|
|
/* route TDA8275a AGC input to the analog IF chip*/
|
2007-04-27 19:31:15 +04:00
|
|
|
saa7134_set_gpio(dev, 22, 0);
|
2007-04-27 19:31:12 +04:00
|
|
|
philips_tda827x_tuner_sleep(fe);
|
|
|
|
return 0;
|
2006-08-07 21:03:32 +04:00
|
|
|
}
|
|
|
|
|
2007-04-27 19:31:14 +04:00
|
|
|
static struct tda827x_config ads_duo_cfg = {
|
|
|
|
.init = ads_duo_tuner_init,
|
2008-04-22 21:46:08 +04:00
|
|
|
.sleep = ads_duo_tuner_sleep,
|
|
|
|
.config = 0
|
2007-04-27 19:31:14 +04:00
|
|
|
};
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
static struct tda1004x_config ads_tech_duo_config = {
|
2006-08-07 21:03:32 +04:00
|
|
|
.demod_address = 0x08,
|
|
|
|
.invert = 1,
|
|
|
|
.invert_oclk = 0,
|
|
|
|
.xtal_freq = TDA10046_XTAL_16M,
|
2007-04-27 19:31:10 +04:00
|
|
|
.agc_config = TDA10046_AGC_TDA827X,
|
2007-04-27 19:31:12 +04:00
|
|
|
.gpio_config = TDA10046_GP00_I,
|
2006-08-07 21:03:32 +04:00
|
|
|
.if_freq = TDA10046_FREQ_045,
|
2007-04-27 19:31:12 +04:00
|
|
|
.tuner_address = 0x61,
|
|
|
|
.request_firmware = philips_tda1004x_request_firmware
|
2006-08-07 21:03:32 +04:00
|
|
|
};
|
|
|
|
|
2008-12-23 09:53:03 +03:00
|
|
|
static struct zl10353_config behold_h6_config = {
|
|
|
|
.demod_address = 0x1e>>1,
|
|
|
|
.no_tuner = 1,
|
|
|
|
.parallel_ts = 1,
|
2009-03-10 19:06:40 +03:00
|
|
|
.disable_i2c_gate_ctrl = 1,
|
2008-12-23 09:53:03 +03:00
|
|
|
};
|
|
|
|
|
2009-10-01 06:02:21 +04:00
|
|
|
static struct xc5000_config behold_x7_tunerconfig = {
|
|
|
|
.i2c_address = 0xc2>>1,
|
|
|
|
.if_khz = 4560,
|
2009-10-01 06:04:39 +04:00
|
|
|
.radio_input = XC5000_RADIO_FM1,
|
2009-10-01 06:02:21 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
static struct zl10353_config behold_x7_config = {
|
|
|
|
.demod_address = 0x1e>>1,
|
|
|
|
.if2 = 45600,
|
|
|
|
.no_tuner = 1,
|
|
|
|
.parallel_ts = 1,
|
|
|
|
.disable_i2c_gate_ctrl = 1,
|
|
|
|
};
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
/* ==================================================================
|
|
|
|
* tda10086 based DVB-S cards, helper functions
|
|
|
|
*/
|
|
|
|
|
2006-08-08 16:10:10 +04:00
|
|
|
static struct tda10086_config flydvbs = {
|
|
|
|
.demod_address = 0x0e,
|
|
|
|
.invert = 0,
|
2008-02-10 05:54:24 +03:00
|
|
|
.diseqc_tone = 0,
|
2008-04-10 06:07:11 +04:00
|
|
|
.xtal_freq = TDA10086_XTAL_16M,
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct tda10086_config sd1878_4m = {
|
|
|
|
.demod_address = 0x0e,
|
|
|
|
.invert = 0,
|
|
|
|
.diseqc_tone = 0,
|
|
|
|
.xtal_freq = TDA10086_XTAL_4M,
|
2006-08-08 16:10:10 +04:00
|
|
|
};
|
|
|
|
|
2008-04-22 21:42:12 +04:00
|
|
|
/* ------------------------------------------------------------------
|
|
|
|
* special case: lnb supply is connected to the gated i2c
|
|
|
|
*/
|
|
|
|
|
|
|
|
static int md8800_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
|
|
|
|
{
|
|
|
|
int res = -EIO;
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
|
|
|
if (fe->ops.i2c_gate_ctrl) {
|
|
|
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
|
|
|
if (dev->original_set_voltage)
|
|
|
|
res = dev->original_set_voltage(fe, voltage);
|
|
|
|
fe->ops.i2c_gate_ctrl(fe, 0);
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
};
|
|
|
|
|
|
|
|
static int md8800_set_high_voltage(struct dvb_frontend *fe, long arg)
|
|
|
|
{
|
|
|
|
int res = -EIO;
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
|
|
|
if (fe->ops.i2c_gate_ctrl) {
|
|
|
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
|
|
|
if (dev->original_set_high_voltage)
|
|
|
|
res = dev->original_set_high_voltage(fe, arg);
|
|
|
|
fe->ops.i2c_gate_ctrl(fe, 0);
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
};
|
|
|
|
|
2008-04-22 21:46:08 +04:00
|
|
|
static int md8800_set_voltage2(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
|
|
|
|
{
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
|
|
|
u8 wbuf[2] = { 0x1f, 00 };
|
|
|
|
u8 rbuf;
|
|
|
|
struct i2c_msg msg[] = { { .addr = 0x08, .flags = 0, .buf = wbuf, .len = 1 },
|
|
|
|
{ .addr = 0x08, .flags = I2C_M_RD, .buf = &rbuf, .len = 1 } };
|
|
|
|
|
|
|
|
if (i2c_transfer(&dev->i2c_adap, msg, 2) != 2)
|
|
|
|
return -EIO;
|
|
|
|
/* NOTE: this assumes that gpo1 is used, it might be bit 5 (gpo2) */
|
|
|
|
if (voltage == SEC_VOLTAGE_18)
|
|
|
|
wbuf[1] = rbuf | 0x10;
|
|
|
|
else
|
|
|
|
wbuf[1] = rbuf & 0xef;
|
|
|
|
msg[0].len = 2;
|
|
|
|
i2c_transfer(&dev->i2c_adap, msg, 1);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int md8800_set_high_voltage2(struct dvb_frontend *fe, long arg)
|
|
|
|
{
|
|
|
|
struct saa7134_dev *dev = fe->dvb->priv;
|
|
|
|
wprintk("%s: sorry can't set high LNB supply voltage from here\n", __func__);
|
|
|
|
return -EIO;
|
|
|
|
}
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
/* ==================================================================
|
|
|
|
* nxt200x based ATSC cards, helper functions
|
|
|
|
*/
|
2005-11-09 08:38:42 +03:00
|
|
|
|
2005-11-09 08:38:20 +03:00
|
|
|
static struct nxt200x_config avertvhda180 = {
|
|
|
|
.demod_address = 0x0a,
|
|
|
|
};
|
2006-02-27 06:08:23 +03:00
|
|
|
|
|
|
|
static struct nxt200x_config kworldatsc110 = {
|
|
|
|
.demod_address = 0x0a,
|
|
|
|
};
|
2005-11-09 08:38:20 +03:00
|
|
|
|
2009-02-24 18:35:16 +03:00
|
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
|
|
|
|
static struct mt312_config avertv_a700_mt312 = {
|
|
|
|
.demod_address = 0x0e,
|
|
|
|
.voltage_inverted = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct zl10036_config avertv_a700_tuner = {
|
|
|
|
.tuner_address = 0x60,
|
|
|
|
};
|
|
|
|
|
2009-08-14 04:42:21 +04:00
|
|
|
static struct mt312_config zl10313_compro_s350_config = {
|
|
|
|
.demod_address = 0x0e,
|
|
|
|
};
|
|
|
|
|
2009-01-19 07:10:49 +03:00
|
|
|
static struct lgdt3305_config hcw_lgdt3305_config = {
|
|
|
|
.i2c_addr = 0x0e,
|
|
|
|
.mpeg_mode = LGDT3305_MPEG_SERIAL,
|
|
|
|
.tpclk_edge = LGDT3305_TPCLK_RISING_EDGE,
|
|
|
|
.tpvalid_polarity = LGDT3305_TP_VALID_HIGH,
|
|
|
|
.deny_i2c_rptr = 1,
|
|
|
|
.spectral_inversion = 1,
|
|
|
|
.qam_if_khz = 4000,
|
|
|
|
.vsb_if_khz = 3250,
|
|
|
|
};
|
|
|
|
|
2009-01-19 07:10:49 +03:00
|
|
|
static struct tda10048_config hcw_tda10048_config = {
|
|
|
|
.demod_address = 0x10 >> 1,
|
|
|
|
.output_mode = TDA10048_SERIAL_OUTPUT,
|
|
|
|
.fwbulkwritelen = TDA10048_BULKWRITE_200,
|
|
|
|
.inversion = TDA10048_INVERSION_ON,
|
|
|
|
.dtv6_if_freq_khz = TDA10048_IF_3300,
|
|
|
|
.dtv7_if_freq_khz = TDA10048_IF_3500,
|
|
|
|
.dtv8_if_freq_khz = TDA10048_IF_4000,
|
|
|
|
.clk_freq_khz = TDA10048_CLK_16000,
|
|
|
|
.disable_gate_access = 1,
|
|
|
|
};
|
|
|
|
|
2009-01-19 07:10:49 +03:00
|
|
|
static struct tda18271_std_map hauppauge_tda18271_std_map = {
|
|
|
|
.atsc_6 = { .if_freq = 3250, .agc_mode = 3, .std = 4,
|
|
|
|
.if_lvl = 1, .rfagc_top = 0x58, },
|
|
|
|
.qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 5,
|
|
|
|
.if_lvl = 1, .rfagc_top = 0x58, },
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct tda18271_config hcw_tda18271_config = {
|
|
|
|
.std_map = &hauppauge_tda18271_std_map,
|
|
|
|
.gate = TDA18271_GATE_ANALOG,
|
|
|
|
.config = 3,
|
2009-08-30 00:45:48 +04:00
|
|
|
.output_opt = TDA18271_OUTPUT_LT_OFF,
|
2009-01-19 07:10:49 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
static struct tda829x_config tda829x_no_probe = {
|
|
|
|
.probe_tuner = TDA829X_DONT_PROBE,
|
|
|
|
};
|
|
|
|
|
2009-09-19 03:44:37 +04:00
|
|
|
static struct tda10048_config zolid_tda10048_config = {
|
|
|
|
.demod_address = 0x10 >> 1,
|
|
|
|
.output_mode = TDA10048_PARALLEL_OUTPUT,
|
|
|
|
.fwbulkwritelen = TDA10048_BULKWRITE_200,
|
|
|
|
.inversion = TDA10048_INVERSION_ON,
|
|
|
|
.dtv6_if_freq_khz = TDA10048_IF_3300,
|
|
|
|
.dtv7_if_freq_khz = TDA10048_IF_3500,
|
|
|
|
.dtv8_if_freq_khz = TDA10048_IF_4000,
|
|
|
|
.clk_freq_khz = TDA10048_CLK_16000,
|
|
|
|
.disable_gate_access = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct tda18271_config zolid_tda18271_config = {
|
|
|
|
.gate = TDA18271_GATE_ANALOG,
|
|
|
|
};
|
|
|
|
|
2009-06-05 11:28:28 +04:00
|
|
|
static struct tda10048_config dtv1000s_tda10048_config = {
|
|
|
|
.demod_address = 0x10 >> 1,
|
|
|
|
.output_mode = TDA10048_PARALLEL_OUTPUT,
|
|
|
|
.fwbulkwritelen = TDA10048_BULKWRITE_200,
|
|
|
|
.inversion = TDA10048_INVERSION_ON,
|
|
|
|
.dtv6_if_freq_khz = TDA10048_IF_3300,
|
|
|
|
.dtv7_if_freq_khz = TDA10048_IF_3800,
|
|
|
|
.dtv8_if_freq_khz = TDA10048_IF_4300,
|
|
|
|
.clk_freq_khz = TDA10048_CLK_16000,
|
|
|
|
.disable_gate_access = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct tda18271_std_map dtv1000s_tda18271_std_map = {
|
|
|
|
.dvbt_6 = { .if_freq = 3300, .agc_mode = 3, .std = 4,
|
|
|
|
.if_lvl = 1, .rfagc_top = 0x37, },
|
|
|
|
.dvbt_7 = { .if_freq = 3800, .agc_mode = 3, .std = 5,
|
|
|
|
.if_lvl = 1, .rfagc_top = 0x37, },
|
|
|
|
.dvbt_8 = { .if_freq = 4300, .agc_mode = 3, .std = 6,
|
|
|
|
.if_lvl = 1, .rfagc_top = 0x37, },
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct tda18271_config dtv1000s_tda18271_config = {
|
|
|
|
.std_map = &dtv1000s_tda18271_std_map,
|
|
|
|
.gate = TDA18271_GATE_ANALOG,
|
|
|
|
};
|
|
|
|
|
2007-04-27 19:31:12 +04:00
|
|
|
/* ==================================================================
|
|
|
|
* Core code
|
|
|
|
*/
|
2005-04-17 02:20:36 +04:00
|
|
|
|
|
|
|
static int dvb_init(struct saa7134_dev *dev)
|
|
|
|
{
|
2007-04-27 19:31:16 +04:00
|
|
|
int ret;
|
2008-04-22 21:45:27 +04:00
|
|
|
int attach_xc3028 = 0;
|
2008-10-11 18:05:50 +04:00
|
|
|
struct videobuf_dvb_frontend *fe0;
|
|
|
|
|
2008-10-11 18:24:30 +04:00
|
|
|
/* FIXME: add support for multi-frontend */
|
|
|
|
mutex_init(&dev->frontends.lock);
|
2008-10-15 20:43:41 +04:00
|
|
|
INIT_LIST_HEAD(&dev->frontends.felist);
|
2008-10-11 18:24:30 +04:00
|
|
|
|
|
|
|
printk(KERN_INFO "%s() allocating 1 frontend\n", __func__);
|
2008-11-11 14:50:02 +03:00
|
|
|
fe0 = videobuf_dvb_alloc_frontend(&dev->frontends, 1);
|
|
|
|
if (!fe0) {
|
2008-10-11 18:24:30 +04:00
|
|
|
printk(KERN_ERR "%s() failed to alloc\n", __func__);
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
/* init struct videobuf_dvb */
|
|
|
|
dev->ts.nr_bufs = 32;
|
|
|
|
dev->ts.nr_packets = 32*4;
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.name = dev->name;
|
|
|
|
videobuf_queue_sg_init(&fe0->dvb.dvbq, &saa7134_ts_qops,
|
2008-04-22 21:42:13 +04:00
|
|
|
&dev->pci->dev, &dev->slock,
|
2005-04-17 02:20:36 +04:00
|
|
|
V4L2_BUF_TYPE_VIDEO_CAPTURE,
|
|
|
|
V4L2_FIELD_ALTERNATE,
|
|
|
|
sizeof(struct saa7134_buf),
|
|
|
|
dev);
|
|
|
|
|
|
|
|
switch (dev->board) {
|
|
|
|
case SAA7134_BOARD_PINNACLE_300I_DVBT_PAL:
|
2007-03-08 00:19:48 +03:00
|
|
|
dprintk("pinnacle 300i dvb setup\n");
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(mt352_attach, &pinnacle_300i,
|
2006-08-08 22:48:08 +04:00
|
|
|
&dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.set_params = mt352_pinnacle_tuner_set_params;
|
2006-04-20 19:01:47 +04:00
|
|
|
}
|
2005-04-17 02:20:36 +04:00
|
|
|
break;
|
2006-02-07 11:25:14 +03:00
|
|
|
case SAA7134_BOARD_AVERMEDIA_777:
|
2006-09-26 23:53:53 +04:00
|
|
|
case SAA7134_BOARD_AVERMEDIA_A16AR:
|
2007-03-08 00:19:48 +03:00
|
|
|
dprintk("avertv 777 dvb setup\n");
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(mt352_attach, &avermedia_777,
|
2006-08-08 22:48:08 +04:00
|
|
|
&dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
|
2008-04-22 21:46:16 +04:00
|
|
|
&dev->i2c_adap, 0x61,
|
|
|
|
TUNER_PHILIPS_TD1316);
|
2006-04-20 19:01:47 +04:00
|
|
|
}
|
2006-02-07 11:25:14 +03:00
|
|
|
break;
|
2008-03-28 23:52:44 +03:00
|
|
|
case SAA7134_BOARD_AVERMEDIA_A16D:
|
2008-06-15 20:33:42 +04:00
|
|
|
dprintk("AverMedia A16D dvb setup\n");
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(mt352_attach,
|
2008-06-15 20:33:42 +04:00
|
|
|
&avermedia_xc3028_mt352_dev,
|
|
|
|
&dev->i2c_adap);
|
2008-03-28 23:52:44 +03:00
|
|
|
attach_xc3028 = 1;
|
|
|
|
break;
|
2005-04-17 02:20:36 +04:00
|
|
|
case SAA7134_BOARD_MD7134:
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(tda10046_attach,
|
2006-08-08 22:48:08 +04:00
|
|
|
&medion_cardbus,
|
|
|
|
&dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
|
2008-04-22 21:46:16 +04:00
|
|
|
&dev->i2c_adap, medion_cardbus.tuner_address,
|
|
|
|
TUNER_PHILIPS_FMD1216ME_MK3);
|
2006-04-20 19:01:47 +04:00
|
|
|
}
|
2005-04-17 02:20:36 +04:00
|
|
|
break;
|
2005-07-13 00:58:47 +04:00
|
|
|
case SAA7134_BOARD_PHILIPS_TOUGH:
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(tda10046_attach,
|
2006-08-08 22:48:08 +04:00
|
|
|
&philips_tu1216_60_config,
|
|
|
|
&dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.init = philips_tu1216_init;
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.set_params = philips_tda6651_pll_set;
|
2006-04-20 19:01:47 +04:00
|
|
|
}
|
2005-07-13 00:58:47 +04:00
|
|
|
break;
|
|
|
|
case SAA7134_BOARD_FLYDVBTDUO:
|
2006-01-23 22:11:06 +03:00
|
|
|
case SAA7134_BOARD_FLYDVBT_DUO_CARDBUS:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &tda827x_lifeview_config,
|
|
|
|
&tda827x_cfg_0) < 0)
|
|
|
|
goto dettach_frontend;
|
2005-07-13 00:58:47 +04:00
|
|
|
break;
|
2005-11-09 08:36:32 +03:00
|
|
|
case SAA7134_BOARD_PHILIPS_EUROPA:
|
|
|
|
case SAA7134_BOARD_VIDEOMATE_DVBT_300:
|
2009-09-20 19:14:21 +04:00
|
|
|
case SAA7134_BOARD_ASUS_EUROPA_HYBRID:
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(tda10046_attach,
|
2006-08-08 22:48:08 +04:00
|
|
|
&philips_europa_config,
|
|
|
|
&dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
dev->original_demod_sleep = fe0->dvb.frontend->ops.sleep;
|
|
|
|
fe0->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.init = philips_europa_tuner_init;
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.sleep = philips_europa_tuner_sleep;
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
|
2006-04-20 19:01:47 +04:00
|
|
|
}
|
2005-11-09 08:36:32 +03:00
|
|
|
break;
|
2010-05-29 19:49:16 +04:00
|
|
|
case SAA7134_BOARD_TECHNOTREND_BUDGET_T3000:
|
|
|
|
fe0->dvb.frontend = dvb_attach(tda10046_attach,
|
|
|
|
&technotrend_budget_t3000_config,
|
|
|
|
&dev->i2c_adap);
|
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
dev->original_demod_sleep = fe0->dvb.frontend->ops.sleep;
|
|
|
|
fe0->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.init = philips_europa_tuner_init;
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.sleep = philips_europa_tuner_sleep;
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
|
|
|
|
}
|
|
|
|
break;
|
2005-11-09 08:36:32 +03:00
|
|
|
case SAA7134_BOARD_VIDEOMATE_DVBT_200:
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(tda10046_attach,
|
2006-08-08 22:48:08 +04:00
|
|
|
&philips_tu1216_61_config,
|
|
|
|
&dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.init = philips_tu1216_init;
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.set_params = philips_tda6651_pll_set;
|
2006-04-20 19:01:47 +04:00
|
|
|
}
|
2005-11-09 08:36:32 +03:00
|
|
|
break;
|
2007-05-01 17:01:20 +04:00
|
|
|
case SAA7134_BOARD_KWORLD_DVBT_210:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &kworld_dvb_t_210_config,
|
|
|
|
&tda827x_cfg_2) < 0)
|
|
|
|
goto dettach_frontend;
|
2007-05-01 17:01:20 +04:00
|
|
|
break;
|
2009-08-03 23:51:33 +04:00
|
|
|
case SAA7134_BOARD_HAUPPAUGE_HVR1120:
|
2009-01-19 07:10:49 +03:00
|
|
|
fe0->dvb.frontend = dvb_attach(tda10048_attach,
|
|
|
|
&hcw_tda10048_config,
|
|
|
|
&dev->i2c_adap);
|
|
|
|
if (fe0->dvb.frontend != NULL) {
|
|
|
|
dvb_attach(tda829x_attach, fe0->dvb.frontend,
|
|
|
|
&dev->i2c_adap, 0x4b,
|
|
|
|
&tda829x_no_probe);
|
|
|
|
dvb_attach(tda18271_attach, fe0->dvb.frontend,
|
|
|
|
0x60, &dev->i2c_adap,
|
|
|
|
&hcw_tda18271_config);
|
|
|
|
}
|
|
|
|
break;
|
2005-11-09 08:38:42 +03:00
|
|
|
case SAA7134_BOARD_PHILIPS_TIGER:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &philips_tiger_config,
|
|
|
|
&tda827x_cfg_0) < 0)
|
|
|
|
goto dettach_frontend;
|
2006-10-07 02:13:50 +04:00
|
|
|
break;
|
|
|
|
case SAA7134_BOARD_PINNACLE_PCTV_310i:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &pinnacle_pctv_310i_config,
|
|
|
|
&tda827x_cfg_1) < 0)
|
|
|
|
goto dettach_frontend;
|
2005-11-09 08:38:42 +03:00
|
|
|
break;
|
2006-11-05 20:17:30 +03:00
|
|
|
case SAA7134_BOARD_HAUPPAUGE_HVR1110:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &hauppauge_hvr_1110_config,
|
|
|
|
&tda827x_cfg_1) < 0)
|
|
|
|
goto dettach_frontend;
|
2006-11-05 20:17:30 +03:00
|
|
|
break;
|
2009-08-03 23:51:33 +04:00
|
|
|
case SAA7134_BOARD_HAUPPAUGE_HVR1150:
|
2009-01-19 07:10:49 +03:00
|
|
|
fe0->dvb.frontend = dvb_attach(lgdt3305_attach,
|
|
|
|
&hcw_lgdt3305_config,
|
|
|
|
&dev->i2c_adap);
|
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
dvb_attach(tda829x_attach, fe0->dvb.frontend,
|
|
|
|
&dev->i2c_adap, 0x4b,
|
|
|
|
&tda829x_no_probe);
|
|
|
|
dvb_attach(tda18271_attach, fe0->dvb.frontend,
|
|
|
|
0x60, &dev->i2c_adap,
|
|
|
|
&hcw_tda18271_config);
|
|
|
|
}
|
|
|
|
break;
|
2005-11-09 08:38:44 +03:00
|
|
|
case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &asus_p7131_dual_config,
|
|
|
|
&tda827x_cfg_0) < 0)
|
|
|
|
goto dettach_frontend;
|
2005-11-09 08:38:44 +03:00
|
|
|
break;
|
2006-02-07 11:49:09 +03:00
|
|
|
case SAA7134_BOARD_FLYDVBT_LR301:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &tda827x_lifeview_config,
|
|
|
|
&tda827x_cfg_0) < 0)
|
|
|
|
goto dettach_frontend;
|
2006-02-07 11:49:09 +03:00
|
|
|
break;
|
2008-10-11 18:18:53 +04:00
|
|
|
case SAA7134_BOARD_FLYDVB_TRIO:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (!use_frontend) { /* terrestrial */
|
|
|
|
if (configure_tda827x_fe(dev, &lifeview_trio_config,
|
|
|
|
&tda827x_cfg_0) < 0)
|
|
|
|
goto dettach_frontend;
|
2008-04-22 21:46:08 +04:00
|
|
|
} else { /* satellite */
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, &dev->i2c_adap);
|
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x63,
|
2006-11-16 04:06:56 +03:00
|
|
|
&dev->i2c_adap, 0) == NULL) {
|
2008-04-22 21:46:08 +04:00
|
|
|
wprintk("%s: Lifeview Trio, No tda826x found!\n", __func__);
|
2008-04-30 22:27:55 +04:00
|
|
|
goto dettach_frontend;
|
2006-11-16 04:06:56 +03:00
|
|
|
}
|
2008-10-11 18:05:50 +04:00
|
|
|
if (dvb_attach(isl6421_attach, fe0->dvb.frontend, &dev->i2c_adap,
|
2006-11-16 04:06:56 +03:00
|
|
|
0x08, 0, 0) == NULL) {
|
2008-04-22 21:46:08 +04:00
|
|
|
wprintk("%s: Lifeview Trio, No ISL6421 found!\n", __func__);
|
2008-04-30 22:27:55 +04:00
|
|
|
goto dettach_frontend;
|
2006-11-16 04:06:56 +03:00
|
|
|
}
|
|
|
|
}
|
2006-04-20 19:01:47 +04:00
|
|
|
}
|
2006-03-03 18:11:28 +03:00
|
|
|
break;
|
2006-02-07 11:49:10 +03:00
|
|
|
case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
|
2007-04-27 19:31:12 +04:00
|
|
|
case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(tda10046_attach,
|
2006-08-08 22:48:08 +04:00
|
|
|
&ads_tech_duo_config,
|
|
|
|
&dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
if (dvb_attach(tda827x_attach,fe0->dvb.frontend,
|
2008-04-22 21:46:08 +04:00
|
|
|
ads_tech_duo_config.tuner_address, &dev->i2c_adap,
|
|
|
|
&ads_duo_cfg) == NULL) {
|
2007-03-08 00:19:48 +03:00
|
|
|
wprintk("no tda827x tuner found at addr: %02x\n",
|
2007-04-27 19:31:32 +04:00
|
|
|
ads_tech_duo_config.tuner_address);
|
2008-04-30 22:27:55 +04:00
|
|
|
goto dettach_frontend;
|
2007-04-27 19:31:32 +04:00
|
|
|
}
|
2008-06-14 17:44:04 +04:00
|
|
|
} else
|
|
|
|
wprintk("failed to attach tda10046\n");
|
2006-02-07 11:49:10 +03:00
|
|
|
break;
|
2006-02-07 11:49:13 +03:00
|
|
|
case SAA7134_BOARD_TEVION_DVBT_220RF:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &tevion_dvbt220rf_config,
|
|
|
|
&tda827x_cfg_0) < 0)
|
|
|
|
goto dettach_frontend;
|
2006-03-28 02:39:30 +04:00
|
|
|
break;
|
2006-08-07 21:03:32 +04:00
|
|
|
case SAA7134_BOARD_MEDION_MD8800_QUADRO:
|
2008-04-22 21:42:09 +04:00
|
|
|
if (!use_frontend) { /* terrestrial */
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &md8800_dvbt_config,
|
|
|
|
&tda827x_cfg_0) < 0)
|
|
|
|
goto dettach_frontend;
|
2008-04-22 21:42:09 +04:00
|
|
|
} else { /* satellite */
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(tda10086_attach,
|
2008-04-22 21:42:09 +04:00
|
|
|
&flydvbs, &dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
struct dvb_frontend *fe = fe0->dvb.frontend;
|
2008-04-22 21:46:08 +04:00
|
|
|
u8 dev_id = dev->eedata[2];
|
|
|
|
u8 data = 0xc4;
|
|
|
|
struct i2c_msg msg = {.addr = 0x08, .flags = 0, .len = 1};
|
|
|
|
|
2008-10-11 18:05:50 +04:00
|
|
|
if (dvb_attach(tda826x_attach, fe0->dvb.frontend,
|
2008-04-30 22:27:55 +04:00
|
|
|
0x60, &dev->i2c_adap, 0) == NULL) {
|
2008-04-22 21:42:09 +04:00
|
|
|
wprintk("%s: Medion Quadro, no tda826x "
|
2008-04-22 21:46:08 +04:00
|
|
|
"found !\n", __func__);
|
2008-04-30 22:27:55 +04:00
|
|
|
goto dettach_frontend;
|
|
|
|
}
|
2008-04-22 21:46:08 +04:00
|
|
|
if (dev_id != 0x08) {
|
|
|
|
/* we need to open the i2c gate (we know it exists) */
|
|
|
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
|
|
|
if (dvb_attach(isl6405_attach, fe,
|
2008-04-30 22:27:55 +04:00
|
|
|
&dev->i2c_adap, 0x08, 0, 0) == NULL) {
|
2008-04-22 21:46:08 +04:00
|
|
|
wprintk("%s: Medion Quadro, no ISL6405 "
|
|
|
|
"found !\n", __func__);
|
2008-04-30 22:27:55 +04:00
|
|
|
goto dettach_frontend;
|
|
|
|
}
|
2008-04-22 21:46:10 +04:00
|
|
|
if (dev_id == 0x07) {
|
|
|
|
/* fire up the 2nd section of the LNB supply since
|
|
|
|
we can't do this from the other section */
|
|
|
|
msg.buf = &data;
|
|
|
|
i2c_transfer(&dev->i2c_adap, &msg, 1);
|
|
|
|
}
|
2008-04-22 21:46:08 +04:00
|
|
|
fe->ops.i2c_gate_ctrl(fe, 0);
|
|
|
|
dev->original_set_voltage = fe->ops.set_voltage;
|
|
|
|
fe->ops.set_voltage = md8800_set_voltage;
|
|
|
|
dev->original_set_high_voltage = fe->ops.enable_high_lnb_voltage;
|
|
|
|
fe->ops.enable_high_lnb_voltage = md8800_set_high_voltage;
|
|
|
|
} else {
|
|
|
|
fe->ops.set_voltage = md8800_set_voltage2;
|
|
|
|
fe->ops.enable_high_lnb_voltage = md8800_set_high_voltage2;
|
|
|
|
}
|
2008-04-22 21:42:09 +04:00
|
|
|
}
|
|
|
|
}
|
2006-08-07 21:03:32 +04:00
|
|
|
break;
|
2005-11-09 08:38:20 +03:00
|
|
|
case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180:
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(nxt200x_attach, &avertvhda180,
|
2006-08-08 22:48:08 +04:00
|
|
|
&dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend)
|
|
|
|
dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x61,
|
2007-06-12 23:10:51 +04:00
|
|
|
NULL, DVB_PLL_TDHU2);
|
2005-11-09 08:38:20 +03:00
|
|
|
break;
|
2008-05-06 10:20:27 +04:00
|
|
|
case SAA7134_BOARD_ADS_INSTANT_HDTV_PCI:
|
2006-02-27 06:08:23 +03:00
|
|
|
case SAA7134_BOARD_KWORLD_ATSC110:
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(nxt200x_attach, &kworldatsc110,
|
2006-08-08 22:48:08 +04:00
|
|
|
&dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend)
|
|
|
|
dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
|
2008-04-22 21:46:17 +04:00
|
|
|
&dev->i2c_adap, 0x61,
|
|
|
|
TUNER_PHILIPS_TUV1236D);
|
2006-02-27 06:08:23 +03:00
|
|
|
break;
|
2006-08-08 16:10:10 +04:00
|
|
|
case SAA7134_BOARD_FLYDVBS_LR300:
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs,
|
2006-08-08 22:48:08 +04:00
|
|
|
&dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x60,
|
2006-08-08 22:48:08 +04:00
|
|
|
&dev->i2c_adap, 0) == NULL) {
|
2008-04-22 21:46:08 +04:00
|
|
|
wprintk("%s: No tda826x found!\n", __func__);
|
2008-04-30 22:27:55 +04:00
|
|
|
goto dettach_frontend;
|
2006-08-08 16:10:10 +04:00
|
|
|
}
|
2008-10-11 18:05:50 +04:00
|
|
|
if (dvb_attach(isl6421_attach, fe0->dvb.frontend,
|
2006-08-08 22:48:08 +04:00
|
|
|
&dev->i2c_adap, 0x08, 0, 0) == NULL) {
|
2008-04-22 21:46:08 +04:00
|
|
|
wprintk("%s: No ISL6421 found!\n", __func__);
|
2008-04-30 22:27:55 +04:00
|
|
|
goto dettach_frontend;
|
2006-08-08 16:10:10 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2006-10-03 03:49:24 +04:00
|
|
|
case SAA7134_BOARD_ASUS_EUROPA2_HYBRID:
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(tda10046_attach,
|
2008-01-28 18:01:11 +03:00
|
|
|
&medion_cardbus,
|
|
|
|
&dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
dev->original_demod_sleep = fe0->dvb.frontend->ops.sleep;
|
|
|
|
fe0->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
|
V4L/DVB (5636): Integrate all users of the fmd1216 tuner with dvb-pll
Enhance the dvb-pll definition of the fmd1216 tuner by adding an init sequence
and a sleep sequence.
The init sequence sets the AGC control register to 0xa0, selecting the fast
time constant and 112 dBuV take-over point. This the recommended value for
DVB-T operation.
The sleep sequence sets bit P4 (which is believed to turn the analog
demodulator on), turns off the tuning voltage, and sets the AGC control
register to 0x60 (external AGC voltage, the recommended value for analog
operation).
The existing dvb-pll users in the cx88 driver, listed below, will gain these
init and sleep sequences.
CX88_BOARD_HAUPPAUGE_HVR1100 Hauppauge WinTV-HVR1100 DVB-T/Hybrid
CX88_BOARD_HAUPPAUGE_HVR1100LP Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profi
CX88_BOARD_WINFAST_DTV2000H WinFast DTV2000 H
CX88_BOARD_HAUPPAUGE_HVR3000 Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DV
CX88_BOARD_HAUPPAUGE_HVR1300 Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encod
This non-dvb-pll user in the cx88 driver should only gain the sleep sequence,
as it already had an equivalent init sequence. The non-dvb-pll code for this
user is removed.
X88_BOARD_DNTV_LIVE_DVB_T_PRO digitalnow DNTV Live! DVB-T Pro
In these saa7134 driver, these non-dvb-pll users are converted to use dvb-pll:
SAA7134_BOARD_MD7134 Medion 7134
SAA7134_BOARD_ASUS_EUROPA2_HYBRID Asus Europa2 OEM
The saa7134 functions philips_fmd1216_tuner_init(),
philips_fmd1216_tuner_sleep(), and philips_fmd1216_tuner_set_params() are
deleted and the dvb-pll versions are used.
This should result in equivalent sleep, init, and tuning sequences being sent
to the tuner.
For the cxusb driver, only one board is effected:
USB_PID_MEDION_MD95700 Medion MD95700
This board used dvb_usb_tuner_init_i2c() and dvb_usb_tuner_set_params_i2c()
for init and tuning, respectively. These functions are effectively the same
as the dvb-pll versions. They call a tuner pass control function defined at
the dvb-usb level, but this does not matter, as this card does not have a
tuner pass control function (only the dib3000mb does). This board will gain
the sleep sequence, while init and tuning should be unchanged.
Signed-off-by: Trent Piepho <xyzzy@speakeasy.org>
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
2007-05-09 01:05:16 +04:00
|
|
|
|
2008-10-11 18:05:50 +04:00
|
|
|
dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
|
2008-04-22 21:46:16 +04:00
|
|
|
&dev->i2c_adap, medion_cardbus.tuner_address,
|
|
|
|
TUNER_PHILIPS_FMD1216ME_MK3);
|
2006-10-03 03:49:24 +04:00
|
|
|
}
|
|
|
|
break;
|
2006-10-31 02:00:16 +03:00
|
|
|
case SAA7134_BOARD_VIDEOMATE_DVBT_200A:
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(tda10046_attach,
|
2006-10-31 02:00:16 +03:00
|
|
|
&philips_europa_config,
|
|
|
|
&dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.init = philips_td1316_tuner_init;
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
|
2006-10-31 02:00:16 +03:00
|
|
|
}
|
|
|
|
break;
|
2006-11-16 03:31:54 +03:00
|
|
|
case SAA7134_BOARD_CINERGY_HT_PCMCIA:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &cinergy_ht_config,
|
|
|
|
&tda827x_cfg_0) < 0)
|
|
|
|
goto dettach_frontend;
|
2007-01-17 00:36:40 +03:00
|
|
|
break;
|
|
|
|
case SAA7134_BOARD_CINERGY_HT_PCI:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &cinergy_ht_pci_config,
|
|
|
|
&tda827x_cfg_0) < 0)
|
|
|
|
goto dettach_frontend;
|
2007-04-27 19:31:12 +04:00
|
|
|
break;
|
|
|
|
case SAA7134_BOARD_PHILIPS_TIGER_S:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &philips_tiger_s_config,
|
|
|
|
&tda827x_cfg_2) < 0)
|
|
|
|
goto dettach_frontend;
|
2006-11-16 03:31:54 +03:00
|
|
|
break;
|
2007-03-14 02:58:29 +03:00
|
|
|
case SAA7134_BOARD_ASUS_P7131_4871:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &asus_p7131_4871_config,
|
|
|
|
&tda827x_cfg_2) < 0)
|
|
|
|
goto dettach_frontend;
|
2007-03-14 02:58:29 +03:00
|
|
|
break;
|
2007-03-15 02:33:55 +03:00
|
|
|
case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &asus_p7131_hybrid_lna_config,
|
|
|
|
&tda827x_cfg_2) < 0)
|
|
|
|
goto dettach_frontend;
|
2007-03-14 02:58:29 +03:00
|
|
|
break;
|
2007-08-20 21:14:50 +04:00
|
|
|
case SAA7134_BOARD_AVERMEDIA_SUPER_007:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &avermedia_super_007_config,
|
|
|
|
&tda827x_cfg_0) < 0)
|
|
|
|
goto dettach_frontend;
|
2007-08-20 21:14:50 +04:00
|
|
|
break;
|
2008-01-21 01:27:51 +03:00
|
|
|
case SAA7134_BOARD_TWINHAN_DTV_DVB_3056:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &twinhan_dtv_dvb_3056_config,
|
|
|
|
&tda827x_cfg_2_sw42) < 0)
|
|
|
|
goto dettach_frontend;
|
2008-01-21 01:27:51 +03:00
|
|
|
break;
|
2008-04-22 21:42:11 +04:00
|
|
|
case SAA7134_BOARD_PHILIPS_SNAKE:
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs,
|
2008-04-22 21:42:11 +04:00
|
|
|
&dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x60,
|
2008-04-30 22:27:55 +04:00
|
|
|
&dev->i2c_adap, 0) == NULL) {
|
2008-04-22 21:46:08 +04:00
|
|
|
wprintk("%s: No tda826x found!\n", __func__);
|
2008-04-30 22:27:55 +04:00
|
|
|
goto dettach_frontend;
|
|
|
|
}
|
2008-10-11 18:05:50 +04:00
|
|
|
if (dvb_attach(lnbp21_attach, fe0->dvb.frontend,
|
2008-04-30 22:27:55 +04:00
|
|
|
&dev->i2c_adap, 0, 0) == NULL) {
|
2008-04-22 21:46:08 +04:00
|
|
|
wprintk("%s: No lnbp21 found!\n", __func__);
|
2008-04-30 22:27:55 +04:00
|
|
|
goto dettach_frontend;
|
|
|
|
}
|
2008-04-22 21:42:11 +04:00
|
|
|
}
|
|
|
|
break;
|
2008-04-22 21:42:12 +04:00
|
|
|
case SAA7134_BOARD_CREATIX_CTX953:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &md8800_dvbt_config,
|
|
|
|
&tda827x_cfg_0) < 0)
|
|
|
|
goto dettach_frontend;
|
2008-04-22 21:42:12 +04:00
|
|
|
break;
|
2008-04-22 21:42:12 +04:00
|
|
|
case SAA7134_BOARD_MSI_TVANYWHERE_AD11:
|
2008-04-30 22:27:55 +04:00
|
|
|
if (configure_tda827x_fe(dev, &philips_tiger_s_config,
|
|
|
|
&tda827x_cfg_2) < 0)
|
|
|
|
goto dettach_frontend;
|
2008-04-22 21:42:12 +04:00
|
|
|
break;
|
2008-04-22 21:45:27 +04:00
|
|
|
case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
|
2008-06-15 20:33:42 +04:00
|
|
|
dprintk("AverMedia E506R dvb setup\n");
|
|
|
|
saa7134_set_gpio(dev, 25, 0);
|
|
|
|
msleep(10);
|
|
|
|
saa7134_set_gpio(dev, 25, 1);
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(mt352_attach,
|
2008-06-15 20:33:42 +04:00
|
|
|
&avermedia_xc3028_mt352_dev,
|
|
|
|
&dev->i2c_adap);
|
2008-04-22 21:45:27 +04:00
|
|
|
attach_xc3028 = 1;
|
2008-07-11 20:48:02 +04:00
|
|
|
break;
|
2008-04-22 21:46:08 +04:00
|
|
|
case SAA7134_BOARD_MD7134_BRIDGE_2:
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(tda10086_attach,
|
2008-04-10 06:07:11 +04:00
|
|
|
&sd1878_4m, &dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend) {
|
2008-04-22 21:46:08 +04:00
|
|
|
struct dvb_frontend *fe;
|
2008-10-11 18:05:50 +04:00
|
|
|
if (dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x60,
|
2008-04-30 22:27:55 +04:00
|
|
|
&dev->i2c_adap, DVB_PLL_PHILIPS_SD1878_TDA8261) == NULL) {
|
2008-04-22 21:46:08 +04:00
|
|
|
wprintk("%s: MD7134 DVB-S, no SD1878 "
|
2008-04-22 21:46:08 +04:00
|
|
|
"found !\n", __func__);
|
2008-04-30 22:27:55 +04:00
|
|
|
goto dettach_frontend;
|
|
|
|
}
|
2008-04-22 21:46:08 +04:00
|
|
|
/* we need to open the i2c gate (we know it exists) */
|
2008-10-11 18:05:50 +04:00
|
|
|
fe = fe0->dvb.frontend;
|
2008-04-22 21:46:08 +04:00
|
|
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
|
|
|
if (dvb_attach(isl6405_attach, fe,
|
2008-04-30 22:27:55 +04:00
|
|
|
&dev->i2c_adap, 0x08, 0, 0) == NULL) {
|
2008-04-22 21:46:08 +04:00
|
|
|
wprintk("%s: MD7134 DVB-S, no ISL6405 "
|
2008-04-22 21:46:08 +04:00
|
|
|
"found !\n", __func__);
|
2008-04-30 22:27:55 +04:00
|
|
|
goto dettach_frontend;
|
|
|
|
}
|
2008-04-22 21:46:08 +04:00
|
|
|
fe->ops.i2c_gate_ctrl(fe, 0);
|
|
|
|
dev->original_set_voltage = fe->ops.set_voltage;
|
|
|
|
fe->ops.set_voltage = md8800_set_voltage;
|
|
|
|
dev->original_set_high_voltage = fe->ops.enable_high_lnb_voltage;
|
|
|
|
fe->ops.enable_high_lnb_voltage = md8800_set_high_voltage;
|
|
|
|
}
|
|
|
|
break;
|
2008-07-11 20:48:02 +04:00
|
|
|
case SAA7134_BOARD_AVERMEDIA_M103:
|
|
|
|
saa7134_set_gpio(dev, 25, 0);
|
|
|
|
msleep(10);
|
|
|
|
saa7134_set_gpio(dev, 25, 1);
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(mt352_attach,
|
2008-07-11 20:48:02 +04:00
|
|
|
&avermedia_xc3028_mt352_dev,
|
|
|
|
&dev->i2c_adap);
|
|
|
|
attach_xc3028 = 1;
|
|
|
|
break;
|
V4L/DVB (9028): saa7134: add support for the triple Asus Tiger 3in1
after looking it up, all rants about the 80 columns restriction seem to
be in vain. After changing the card's name it are now "only" seven new
lines in the tiny DVB-T/DVB-S switch function.
saa7130/34: v4l2 driver version 0.2.14 loaded
saa7133[0]: found at 0000:02:08.0, rev: 209, irq: 18, latency: 32, mmio: 0xfdef7000
saa7133[0]: subsystem: 1043:4878, board: Asus Tiger 3in1 [card=147,autodetected]
saa7133[0]: board init: gpio is 200000
tuner' 2-004b: chip found @ 0x96 (saa7133[0])
saa7133[0]: i2c eeprom 00: 43 10 78 48 54 20 1c 00 43 43 a9 1c 55 d2 b2 92
saa7133[0]: i2c eeprom 10: ff ff ff 0f ff 20 ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 20: 01 40 01 02 03 01 01 03 08 ff 00 d7 ff ff ff ff
saa7133[0]: i2c eeprom 30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 40: ff 28 00 c2 96 16 03 02 c0 1c ff ff ff ff ff ff
saa7133[0]: i2c eeprom 50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c scan: found device @ 0x10 [???]
saa7133[0]: i2c scan: found device @ 0x16 [???]
saa7133[0]: i2c scan: found device @ 0x1c [???]
saa7133[0]: i2c scan: found device @ 0x96 [???]
saa7133[0]: i2c scan: found device @ 0xa0 [eeprom]
tda829x 2-004b: setting tuner address to 61
tda829x 2-004b: type set to tda8290+75a
saa7133[0]: registered device video0 [v4l2]
saa7133[0]: registered device vbi0
saa7133[0]: registered device radio0
DVB: registering new adapter (saa7133[0])
DVB: registering frontend 0 (Philips TDA10086 DVB-S)...
The board init gpio is 0x0, 0x200000 is from previously unloading with
antenna_switch = 1.
It needs firmware for the tda10046 and analog sound needs saa7134-alsa.
I have support for one more board and need to fix the first revision of
the Asus Tiger DVB-T hybrid. DVB-T currently hangs on the male radio
antenna input, also some small other stuff.
Please report any issues with this patch, the next are depending on this
one.
saa7134: add support for the triple Asus Tiger 3in1
Signed-off-by: Hermann Pitton <hermann-pitton@arcor.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2008-09-15 00:49:14 +04:00
|
|
|
case SAA7134_BOARD_ASUSTeK_TIGER_3IN1:
|
|
|
|
if (!use_frontend) { /* terrestrial */
|
|
|
|
if (configure_tda827x_fe(dev, &asus_tiger_3in1_config,
|
|
|
|
&tda827x_cfg_2) < 0)
|
|
|
|
goto dettach_frontend;
|
|
|
|
} else { /* satellite */
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend = dvb_attach(tda10086_attach,
|
V4L/DVB (9028): saa7134: add support for the triple Asus Tiger 3in1
after looking it up, all rants about the 80 columns restriction seem to
be in vain. After changing the card's name it are now "only" seven new
lines in the tiny DVB-T/DVB-S switch function.
saa7130/34: v4l2 driver version 0.2.14 loaded
saa7133[0]: found at 0000:02:08.0, rev: 209, irq: 18, latency: 32, mmio: 0xfdef7000
saa7133[0]: subsystem: 1043:4878, board: Asus Tiger 3in1 [card=147,autodetected]
saa7133[0]: board init: gpio is 200000
tuner' 2-004b: chip found @ 0x96 (saa7133[0])
saa7133[0]: i2c eeprom 00: 43 10 78 48 54 20 1c 00 43 43 a9 1c 55 d2 b2 92
saa7133[0]: i2c eeprom 10: ff ff ff 0f ff 20 ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 20: 01 40 01 02 03 01 01 03 08 ff 00 d7 ff ff ff ff
saa7133[0]: i2c eeprom 30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 40: ff 28 00 c2 96 16 03 02 c0 1c ff ff ff ff ff ff
saa7133[0]: i2c eeprom 50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c scan: found device @ 0x10 [???]
saa7133[0]: i2c scan: found device @ 0x16 [???]
saa7133[0]: i2c scan: found device @ 0x1c [???]
saa7133[0]: i2c scan: found device @ 0x96 [???]
saa7133[0]: i2c scan: found device @ 0xa0 [eeprom]
tda829x 2-004b: setting tuner address to 61
tda829x 2-004b: type set to tda8290+75a
saa7133[0]: registered device video0 [v4l2]
saa7133[0]: registered device vbi0
saa7133[0]: registered device radio0
DVB: registering new adapter (saa7133[0])
DVB: registering frontend 0 (Philips TDA10086 DVB-S)...
The board init gpio is 0x0, 0x200000 is from previously unloading with
antenna_switch = 1.
It needs firmware for the tda10046 and analog sound needs saa7134-alsa.
I have support for one more board and need to fix the first revision of
the Asus Tiger DVB-T hybrid. DVB-T currently hangs on the male radio
antenna input, also some small other stuff.
Please report any issues with this patch, the next are depending on this
one.
saa7134: add support for the triple Asus Tiger 3in1
Signed-off-by: Hermann Pitton <hermann-pitton@arcor.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2008-09-15 00:49:14 +04:00
|
|
|
&flydvbs, &dev->i2c_adap);
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend) {
|
V4L/DVB (9028): saa7134: add support for the triple Asus Tiger 3in1
after looking it up, all rants about the 80 columns restriction seem to
be in vain. After changing the card's name it are now "only" seven new
lines in the tiny DVB-T/DVB-S switch function.
saa7130/34: v4l2 driver version 0.2.14 loaded
saa7133[0]: found at 0000:02:08.0, rev: 209, irq: 18, latency: 32, mmio: 0xfdef7000
saa7133[0]: subsystem: 1043:4878, board: Asus Tiger 3in1 [card=147,autodetected]
saa7133[0]: board init: gpio is 200000
tuner' 2-004b: chip found @ 0x96 (saa7133[0])
saa7133[0]: i2c eeprom 00: 43 10 78 48 54 20 1c 00 43 43 a9 1c 55 d2 b2 92
saa7133[0]: i2c eeprom 10: ff ff ff 0f ff 20 ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 20: 01 40 01 02 03 01 01 03 08 ff 00 d7 ff ff ff ff
saa7133[0]: i2c eeprom 30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 40: ff 28 00 c2 96 16 03 02 c0 1c ff ff ff ff ff ff
saa7133[0]: i2c eeprom 50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c scan: found device @ 0x10 [???]
saa7133[0]: i2c scan: found device @ 0x16 [???]
saa7133[0]: i2c scan: found device @ 0x1c [???]
saa7133[0]: i2c scan: found device @ 0x96 [???]
saa7133[0]: i2c scan: found device @ 0xa0 [eeprom]
tda829x 2-004b: setting tuner address to 61
tda829x 2-004b: type set to tda8290+75a
saa7133[0]: registered device video0 [v4l2]
saa7133[0]: registered device vbi0
saa7133[0]: registered device radio0
DVB: registering new adapter (saa7133[0])
DVB: registering frontend 0 (Philips TDA10086 DVB-S)...
The board init gpio is 0x0, 0x200000 is from previously unloading with
antenna_switch = 1.
It needs firmware for the tda10046 and analog sound needs saa7134-alsa.
I have support for one more board and need to fix the first revision of
the Asus Tiger DVB-T hybrid. DVB-T currently hangs on the male radio
antenna input, also some small other stuff.
Please report any issues with this patch, the next are depending on this
one.
saa7134: add support for the triple Asus Tiger 3in1
Signed-off-by: Hermann Pitton <hermann-pitton@arcor.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2008-09-15 00:49:14 +04:00
|
|
|
if (dvb_attach(tda826x_attach,
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend, 0x60,
|
V4L/DVB (9028): saa7134: add support for the triple Asus Tiger 3in1
after looking it up, all rants about the 80 columns restriction seem to
be in vain. After changing the card's name it are now "only" seven new
lines in the tiny DVB-T/DVB-S switch function.
saa7130/34: v4l2 driver version 0.2.14 loaded
saa7133[0]: found at 0000:02:08.0, rev: 209, irq: 18, latency: 32, mmio: 0xfdef7000
saa7133[0]: subsystem: 1043:4878, board: Asus Tiger 3in1 [card=147,autodetected]
saa7133[0]: board init: gpio is 200000
tuner' 2-004b: chip found @ 0x96 (saa7133[0])
saa7133[0]: i2c eeprom 00: 43 10 78 48 54 20 1c 00 43 43 a9 1c 55 d2 b2 92
saa7133[0]: i2c eeprom 10: ff ff ff 0f ff 20 ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 20: 01 40 01 02 03 01 01 03 08 ff 00 d7 ff ff ff ff
saa7133[0]: i2c eeprom 30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 40: ff 28 00 c2 96 16 03 02 c0 1c ff ff ff ff ff ff
saa7133[0]: i2c eeprom 50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c scan: found device @ 0x10 [???]
saa7133[0]: i2c scan: found device @ 0x16 [???]
saa7133[0]: i2c scan: found device @ 0x1c [???]
saa7133[0]: i2c scan: found device @ 0x96 [???]
saa7133[0]: i2c scan: found device @ 0xa0 [eeprom]
tda829x 2-004b: setting tuner address to 61
tda829x 2-004b: type set to tda8290+75a
saa7133[0]: registered device video0 [v4l2]
saa7133[0]: registered device vbi0
saa7133[0]: registered device radio0
DVB: registering new adapter (saa7133[0])
DVB: registering frontend 0 (Philips TDA10086 DVB-S)...
The board init gpio is 0x0, 0x200000 is from previously unloading with
antenna_switch = 1.
It needs firmware for the tda10046 and analog sound needs saa7134-alsa.
I have support for one more board and need to fix the first revision of
the Asus Tiger DVB-T hybrid. DVB-T currently hangs on the male radio
antenna input, also some small other stuff.
Please report any issues with this patch, the next are depending on this
one.
saa7134: add support for the triple Asus Tiger 3in1
Signed-off-by: Hermann Pitton <hermann-pitton@arcor.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2008-09-15 00:49:14 +04:00
|
|
|
&dev->i2c_adap, 0) == NULL) {
|
|
|
|
wprintk("%s: Asus Tiger 3in1, no "
|
|
|
|
"tda826x found!\n", __func__);
|
|
|
|
goto dettach_frontend;
|
|
|
|
}
|
2008-10-11 18:05:50 +04:00
|
|
|
if (dvb_attach(lnbp21_attach, fe0->dvb.frontend,
|
V4L/DVB (9028): saa7134: add support for the triple Asus Tiger 3in1
after looking it up, all rants about the 80 columns restriction seem to
be in vain. After changing the card's name it are now "only" seven new
lines in the tiny DVB-T/DVB-S switch function.
saa7130/34: v4l2 driver version 0.2.14 loaded
saa7133[0]: found at 0000:02:08.0, rev: 209, irq: 18, latency: 32, mmio: 0xfdef7000
saa7133[0]: subsystem: 1043:4878, board: Asus Tiger 3in1 [card=147,autodetected]
saa7133[0]: board init: gpio is 200000
tuner' 2-004b: chip found @ 0x96 (saa7133[0])
saa7133[0]: i2c eeprom 00: 43 10 78 48 54 20 1c 00 43 43 a9 1c 55 d2 b2 92
saa7133[0]: i2c eeprom 10: ff ff ff 0f ff 20 ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 20: 01 40 01 02 03 01 01 03 08 ff 00 d7 ff ff ff ff
saa7133[0]: i2c eeprom 30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 40: ff 28 00 c2 96 16 03 02 c0 1c ff ff ff ff ff ff
saa7133[0]: i2c eeprom 50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c scan: found device @ 0x10 [???]
saa7133[0]: i2c scan: found device @ 0x16 [???]
saa7133[0]: i2c scan: found device @ 0x1c [???]
saa7133[0]: i2c scan: found device @ 0x96 [???]
saa7133[0]: i2c scan: found device @ 0xa0 [eeprom]
tda829x 2-004b: setting tuner address to 61
tda829x 2-004b: type set to tda8290+75a
saa7133[0]: registered device video0 [v4l2]
saa7133[0]: registered device vbi0
saa7133[0]: registered device radio0
DVB: registering new adapter (saa7133[0])
DVB: registering frontend 0 (Philips TDA10086 DVB-S)...
The board init gpio is 0x0, 0x200000 is from previously unloading with
antenna_switch = 1.
It needs firmware for the tda10046 and analog sound needs saa7134-alsa.
I have support for one more board and need to fix the first revision of
the Asus Tiger DVB-T hybrid. DVB-T currently hangs on the male radio
antenna input, also some small other stuff.
Please report any issues with this patch, the next are depending on this
one.
saa7134: add support for the triple Asus Tiger 3in1
Signed-off-by: Hermann Pitton <hermann-pitton@arcor.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2008-09-15 00:49:14 +04:00
|
|
|
&dev->i2c_adap, 0, 0) == NULL) {
|
|
|
|
wprintk("%s: Asus Tiger 3in1, no lnbp21"
|
|
|
|
" found!\n", __func__);
|
|
|
|
goto dettach_frontend;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2008-10-05 04:37:36 +04:00
|
|
|
case SAA7134_BOARD_ASUSTeK_TIGER:
|
|
|
|
if (configure_tda827x_fe(dev, &philips_tiger_config,
|
|
|
|
&tda827x_cfg_0) < 0)
|
|
|
|
goto dettach_frontend;
|
|
|
|
break;
|
2008-12-23 09:53:03 +03:00
|
|
|
case SAA7134_BOARD_BEHOLD_H6:
|
2008-12-31 01:10:09 +03:00
|
|
|
fe0->dvb.frontend = dvb_attach(zl10353_attach,
|
2008-12-23 09:53:03 +03:00
|
|
|
&behold_h6_config,
|
|
|
|
&dev->i2c_adap);
|
2008-12-31 01:10:09 +03:00
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
|
2008-12-23 09:53:03 +03:00
|
|
|
&dev->i2c_adap, 0x61,
|
2009-08-05 03:07:42 +04:00
|
|
|
TUNER_PHILIPS_FMD1216MEX_MK3);
|
2008-12-23 09:53:03 +03:00
|
|
|
}
|
2009-02-24 18:35:16 +03:00
|
|
|
break;
|
2009-10-01 06:02:21 +04:00
|
|
|
case SAA7134_BOARD_BEHOLD_X7:
|
|
|
|
fe0->dvb.frontend = dvb_attach(zl10353_attach,
|
|
|
|
&behold_x7_config,
|
|
|
|
&dev->i2c_adap);
|
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
dvb_attach(xc5000_attach, fe0->dvb.frontend,
|
|
|
|
&dev->i2c_adap, &behold_x7_tunerconfig);
|
|
|
|
}
|
|
|
|
break;
|
2010-04-06 08:00:05 +04:00
|
|
|
case SAA7134_BOARD_BEHOLD_H7:
|
|
|
|
fe0->dvb.frontend = dvb_attach(zl10353_attach,
|
|
|
|
&behold_x7_config,
|
|
|
|
&dev->i2c_adap);
|
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
dvb_attach(xc5000_attach, fe0->dvb.frontend,
|
|
|
|
&dev->i2c_adap, &behold_x7_tunerconfig);
|
|
|
|
}
|
|
|
|
break;
|
2009-02-24 18:35:16 +03:00
|
|
|
case SAA7134_BOARD_AVERMEDIA_A700_PRO:
|
|
|
|
case SAA7134_BOARD_AVERMEDIA_A700_HYBRID:
|
|
|
|
/* Zarlink ZL10313 */
|
|
|
|
fe0->dvb.frontend = dvb_attach(mt312_attach,
|
|
|
|
&avertv_a700_mt312, &dev->i2c_adap);
|
|
|
|
if (fe0->dvb.frontend) {
|
|
|
|
if (dvb_attach(zl10036_attach, fe0->dvb.frontend,
|
|
|
|
&avertv_a700_tuner, &dev->i2c_adap) == NULL) {
|
|
|
|
wprintk("%s: No zl10036 found!\n",
|
|
|
|
__func__);
|
|
|
|
}
|
|
|
|
}
|
2009-08-14 04:42:21 +04:00
|
|
|
break;
|
|
|
|
case SAA7134_BOARD_VIDEOMATE_S350:
|
|
|
|
fe0->dvb.frontend = dvb_attach(mt312_attach,
|
|
|
|
&zl10313_compro_s350_config, &dev->i2c_adap);
|
|
|
|
if (fe0->dvb.frontend)
|
|
|
|
if (dvb_attach(zl10039_attach, fe0->dvb.frontend,
|
|
|
|
0x60, &dev->i2c_adap) == NULL)
|
|
|
|
wprintk("%s: No zl10039 found!\n",
|
|
|
|
__func__);
|
|
|
|
|
2009-09-19 03:44:37 +04:00
|
|
|
break;
|
|
|
|
case SAA7134_BOARD_ZOLID_HYBRID_PCI:
|
|
|
|
fe0->dvb.frontend = dvb_attach(tda10048_attach,
|
|
|
|
&zolid_tda10048_config,
|
|
|
|
&dev->i2c_adap);
|
|
|
|
if (fe0->dvb.frontend != NULL) {
|
|
|
|
dvb_attach(tda829x_attach, fe0->dvb.frontend,
|
|
|
|
&dev->i2c_adap, 0x4b,
|
|
|
|
&tda829x_no_probe);
|
|
|
|
dvb_attach(tda18271_attach, fe0->dvb.frontend,
|
|
|
|
0x60, &dev->i2c_adap,
|
|
|
|
&zolid_tda18271_config);
|
|
|
|
}
|
2008-12-23 09:53:03 +03:00
|
|
|
break;
|
2009-06-05 11:28:28 +04:00
|
|
|
case SAA7134_BOARD_LEADTEK_WINFAST_DTV1000S:
|
|
|
|
fe0->dvb.frontend = dvb_attach(tda10048_attach,
|
|
|
|
&dtv1000s_tda10048_config,
|
|
|
|
&dev->i2c_adap);
|
|
|
|
if (fe0->dvb.frontend != NULL) {
|
|
|
|
dvb_attach(tda829x_attach, fe0->dvb.frontend,
|
|
|
|
&dev->i2c_adap, 0x4b,
|
|
|
|
&tda829x_no_probe);
|
|
|
|
dvb_attach(tda18271_attach, fe0->dvb.frontend,
|
|
|
|
0x60, &dev->i2c_adap,
|
|
|
|
&dtv1000s_tda18271_config);
|
|
|
|
}
|
|
|
|
break;
|
2005-04-17 02:20:36 +04:00
|
|
|
default:
|
2007-03-08 00:19:48 +03:00
|
|
|
wprintk("Huh? unknown DVB card?\n");
|
2005-04-17 02:20:36 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2008-04-22 21:45:27 +04:00
|
|
|
if (attach_xc3028) {
|
|
|
|
struct dvb_frontend *fe;
|
|
|
|
struct xc2028_config cfg = {
|
|
|
|
.i2c_adap = &dev->i2c_adap,
|
|
|
|
.i2c_addr = 0x61,
|
|
|
|
};
|
2008-03-28 23:52:44 +03:00
|
|
|
|
2008-10-11 18:05:50 +04:00
|
|
|
if (!fe0->dvb.frontend)
|
2008-11-11 14:50:02 +03:00
|
|
|
goto dettach_frontend;
|
2008-03-28 23:52:44 +03:00
|
|
|
|
2008-10-11 18:05:50 +04:00
|
|
|
fe = dvb_attach(xc2028_attach, fe0->dvb.frontend, &cfg);
|
2008-04-22 21:45:27 +04:00
|
|
|
if (!fe) {
|
|
|
|
printk(KERN_ERR "%s/2: xc3028 attach failed\n",
|
|
|
|
dev->name);
|
2008-04-30 22:27:55 +04:00
|
|
|
goto dettach_frontend;
|
2008-04-22 21:45:27 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-10-11 18:05:50 +04:00
|
|
|
if (NULL == fe0->dvb.frontend) {
|
2007-03-08 00:19:48 +03:00
|
|
|
printk(KERN_ERR "%s/dvb: frontend initialization failed\n", dev->name);
|
2008-11-11 14:50:02 +03:00
|
|
|
goto dettach_frontend;
|
2005-04-17 02:20:36 +04:00
|
|
|
}
|
2008-09-12 20:31:45 +04:00
|
|
|
/* define general-purpose callback pointer */
|
2008-10-11 18:05:50 +04:00
|
|
|
fe0->dvb.frontend->callback = saa7134_tuner_callback;
|
2005-04-17 02:20:36 +04:00
|
|
|
|
|
|
|
/* register everything else */
|
2008-10-11 18:05:50 +04:00
|
|
|
ret = videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
|
2009-05-24 01:00:59 +04:00
|
|
|
&dev->pci->dev, adapter_nr, 0, NULL);
|
2007-04-27 19:31:16 +04:00
|
|
|
|
|
|
|
/* this sequence is necessary to make the tda1004x load its firmware
|
|
|
|
* and to enter analog mode of hybrid boards
|
|
|
|
*/
|
|
|
|
if (!ret) {
|
2008-10-11 18:05:50 +04:00
|
|
|
if (fe0->dvb.frontend->ops.init)
|
|
|
|
fe0->dvb.frontend->ops.init(fe0->dvb.frontend);
|
|
|
|
if (fe0->dvb.frontend->ops.sleep)
|
|
|
|
fe0->dvb.frontend->ops.sleep(fe0->dvb.frontend);
|
|
|
|
if (fe0->dvb.frontend->ops.tuner_ops.sleep)
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.sleep(fe0->dvb.frontend);
|
2007-04-27 19:31:16 +04:00
|
|
|
}
|
|
|
|
return ret;
|
2008-04-30 22:27:55 +04:00
|
|
|
|
|
|
|
dettach_frontend:
|
2008-11-11 14:50:02 +03:00
|
|
|
videobuf_dvb_dealloc_frontends(&dev->frontends);
|
|
|
|
return -EINVAL;
|
2005-04-17 02:20:36 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
static int dvb_fini(struct saa7134_dev *dev)
|
|
|
|
{
|
2008-10-11 18:05:50 +04:00
|
|
|
struct videobuf_dvb_frontend *fe0;
|
|
|
|
|
|
|
|
/* Get the first frontend */
|
|
|
|
fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
|
|
|
|
if (!fe0)
|
|
|
|
return -EINVAL;
|
|
|
|
|
2007-10-19 02:56:47 +04:00
|
|
|
/* FIXME: I suspect that this code is bogus, since the entry for
|
|
|
|
Pinnacle 300I DVB-T PAL already defines the proper init to allow
|
|
|
|
the detection of mt2032 (TDA9887_PORT2_INACTIVE)
|
|
|
|
*/
|
|
|
|
if (dev->board == SAA7134_BOARD_PINNACLE_300I_DVBT_PAL) {
|
|
|
|
struct v4l2_priv_tun_config tda9887_cfg;
|
|
|
|
static int on = TDA9887_PRESENT | TDA9887_PORT2_INACTIVE;
|
|
|
|
|
|
|
|
tda9887_cfg.tuner = TUNER_TDA9887;
|
|
|
|
tda9887_cfg.priv = &on;
|
2005-04-17 02:20:36 +04:00
|
|
|
|
|
|
|
/* otherwise we don't detect the tuner on next insmod */
|
2009-01-17 18:17:14 +03:00
|
|
|
saa_call_all(dev, tuner, s_config, &tda9887_cfg);
|
2008-04-22 21:46:08 +04:00
|
|
|
} else if (dev->board == SAA7134_BOARD_MEDION_MD8800_QUADRO) {
|
2008-04-22 21:46:10 +04:00
|
|
|
if ((dev->eedata[2] == 0x07) && use_frontend) {
|
2008-04-22 21:46:08 +04:00
|
|
|
/* turn off the 2nd lnb supply */
|
|
|
|
u8 data = 0x80;
|
|
|
|
struct i2c_msg msg = {.addr = 0x08, .buf = &data, .flags = 0, .len = 1};
|
|
|
|
struct dvb_frontend *fe;
|
2008-10-11 18:05:50 +04:00
|
|
|
fe = fe0->dvb.frontend;
|
2008-04-22 21:46:08 +04:00
|
|
|
if (fe->ops.i2c_gate_ctrl) {
|
|
|
|
fe->ops.i2c_gate_ctrl(fe, 1);
|
|
|
|
i2c_transfer(&dev->i2c_adap, &msg, 1);
|
|
|
|
fe->ops.i2c_gate_ctrl(fe, 0);
|
|
|
|
}
|
|
|
|
}
|
2007-10-19 02:56:47 +04:00
|
|
|
}
|
2008-11-11 14:50:02 +03:00
|
|
|
videobuf_dvb_unregister_bus(&dev->frontends);
|
2005-04-17 02:20:36 +04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct saa7134_mpeg_ops dvb_ops = {
|
|
|
|
.type = SAA7134_MPEG_DVB,
|
|
|
|
.init = dvb_init,
|
|
|
|
.fini = dvb_fini,
|
|
|
|
};
|
|
|
|
|
|
|
|
static int __init dvb_register(void)
|
|
|
|
{
|
|
|
|
return saa7134_ts_register(&dvb_ops);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void __exit dvb_unregister(void)
|
|
|
|
{
|
|
|
|
saa7134_ts_unregister(&dvb_ops);
|
|
|
|
}
|
|
|
|
|
|
|
|
module_init(dvb_register);
|
|
|
|
module_exit(dvb_unregister);
|
|
|
|
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
/*
|
|
|
|
* Local variables:
|
|
|
|
* c-basic-offset: 8
|
|
|
|
* End:
|
|
|
|
*/
|