[media] saa7134: Fix analog mode for Kworld SBTVD

There were some issues at tda8290 that were preventing this device
to work. Now that those fixes were fixed, we can enable analog
mode.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Mauro Carvalho Chehab 2011-01-13 14:24:44 -03:00
parent c736a5f28e
commit 6183040680
2 changed files with 4 additions and 76 deletions

View File

@ -5179,18 +5179,8 @@ struct saa7134_board saa7134_boards[] = {
[SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG] = {
.name = "Kworld PCI SBTVD/ISDB-T Full-Seg Hybrid",
.audio_clock = 0x00187de7,
#if 0
/*
* FIXME: Analog mode doesn't work, if digital is enabled. The proper
* fix is to use tda8290 driver, but Kworld seems to use an
* unsupported version of tda8295.
*/
.tuner_type = TUNER_NXP_TDA18271, /* TUNER_PHILIPS_TDA8290 */
.tuner_addr = 0x60,
#else
.tuner_type = UNSET,
.tuner_type = TUNER_PHILIPS_TDA8290,
.tuner_addr = ADDR_UNSET,
#endif
.radio_type = UNSET,
.radio_addr = ADDR_UNSET,
.gpiomask = 0x8e054000,
@ -5201,6 +5191,7 @@ struct saa7134_board saa7134_boards[] = {
.vmux = 1,
.amux = TV,
.tv = 1,
.gpio = 0x4000,
#if 0 /* FIXME */
}, {
.name = name_comp1,
@ -7659,36 +7650,11 @@ int saa7134_board_init2(struct saa7134_dev *dev)
break;
}
case SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG:
{
struct i2c_msg msg = { .addr = 0x4b, .flags = 0 };
int i;
static u8 buffer[][2] = {
{0x30, 0x31},
{0xff, 0x00},
{0x41, 0x03},
{0x41, 0x1a},
{0xff, 0x02},
{0x34, 0x00},
{0x45, 0x97},
{0x45, 0xc1},
};
saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x4000);
saa_writel(SAA7134_GPIO_GPSTATUS0 >> 2, 0x4000);
/*
* FIXME: identify what device is at addr 0x4b and what means
* this initialization
*/
for (i = 0; i < ARRAY_SIZE(buffer); i++) {
msg.buf = &buffer[i][0];
msg.len = ARRAY_SIZE(buffer[0]);
if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1)
printk(KERN_WARNING
"%s: Unable to enable tuner(%i).\n",
dev->name, i);
}
saa7134_set_gpio(dev, 27, 0);
break;
}
} /* switch() */
/* initialize tuner */

View File

@ -236,7 +236,7 @@ static struct tda18271_std_map mb86a20s_tda18271_std_map = {
static struct tda18271_config kworld_tda18271_config = {
.std_map = &mb86a20s_tda18271_std_map,
.gate = TDA18271_GATE_DIGITAL,
.gate = TDA18271_GATE_ANALOG,
};
static const struct mb86a20s_config kworld_mb86a20s_config = {
@ -623,37 +623,6 @@ static struct tda827x_config tda827x_cfg_2_sw42 = {
/* ------------------------------------------------------------------ */
static int __kworld_sbtvd_i2c_gate_ctrl(struct saa7134_dev *dev, int enable)
{
unsigned char initmsg[] = {0x45, 0x97};
unsigned char msg_enable[] = {0x45, 0xc1};
unsigned char msg_disable[] = {0x45, 0x81};
struct i2c_msg msg = {.addr = 0x4b, .flags = 0, .buf = initmsg, .len = 2};
if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1) {
wprintk("could not access the I2C gate\n");
return -EIO;
}
if (enable)
msg.buf = msg_enable;
else
msg.buf = msg_disable;
if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1) {
wprintk("could not access the I2C gate\n");
return -EIO;
}
msleep(20);
return 0;
}
static int kworld_sbtvd_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
{
struct saa7134_dev *dev = fe->dvb->priv;
return __kworld_sbtvd_i2c_gate_ctrl(dev, enable);
}
/* ------------------------------------------------------------------ */
static struct tda1004x_config tda827x_lifeview_config = {
.demod_address = 0x08,
.invert = 1,
@ -1660,7 +1629,6 @@ static int dvb_init(struct saa7134_dev *dev)
}
break;
case SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG:
__kworld_sbtvd_i2c_gate_ctrl(dev, 0);
saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x14000);
saa_writel(SAA7134_GPIO_GPSTATUS0 >> 2, 0x14000);
msleep(20);
@ -1670,16 +1638,10 @@ static int dvb_init(struct saa7134_dev *dev)
fe0->dvb.frontend = dvb_attach(mb86a20s_attach,
&kworld_mb86a20s_config,
&dev->i2c_adap);
__kworld_sbtvd_i2c_gate_ctrl(dev, 1);
if (fe0->dvb.frontend != NULL) {
dvb_attach(tda18271_attach, fe0->dvb.frontend,
0x60, &dev->i2c_adap,
&kworld_tda18271_config);
/*
* Only after success, it can initialize the gate, otherwise
* an OOPS will hit, due to kfree(fe0->dvb.frontend)
*/
fe0->dvb.frontend->ops.i2c_gate_ctrl = kworld_sbtvd_i2c_gate_ctrl;
}
break;
default: