aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/saa7134
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2010-10-03 06:01:26 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-12-29 05:16:28 -0500
commitf0551efc77b0f34a93a14d2bf96051612e352a39 (patch)
treec8646df928ebca0572fe1ce8046a6470a5e976d4 /drivers/media/video/saa7134
parent68541cdaadecbc280cd50122f11fdbb249a2ae29 (diff)
[media] Add DVB support for SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/saa7134')
-rw-r--r--drivers/media/video/saa7134/saa7134-cards.c23
-rw-r--r--drivers/media/video/saa7134/saa7134-dvb.c69
2 files changed, 81 insertions, 11 deletions
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c
index 58c8c03fd8f7..ff23e6ebdde4 100644
--- a/drivers/media/video/saa7134/saa7134-cards.c
+++ b/drivers/media/video/saa7134/saa7134-cards.c
@@ -5179,12 +5179,23 @@ struct saa7134_board saa7134_boards[] = {
5179 [SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG] = { 5179 [SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG] = {
5180 .name = "Kworld PCI SBTVD/ISDB-T Full-Seg Hybrid", 5180 .name = "Kworld PCI SBTVD/ISDB-T Full-Seg Hybrid",
5181 .audio_clock = 0x00187de7, 5181 .audio_clock = 0x00187de7,
5182#if 0
5183 /*
5184 * FIXME: Analog mode doesn't work, if digital is enabled. The proper
5185 * fix is to use tda8290 driver, but Kworld seems to use an
5186 * unsupported version of tda8295.
5187 */
5182 .tuner_type = TUNER_NXP_TDA18271, /* TUNER_PHILIPS_TDA8290 */ 5188 .tuner_type = TUNER_NXP_TDA18271, /* TUNER_PHILIPS_TDA8290 */
5183 .radio_type = UNSET,
5184 .tuner_addr = 0x60, 5189 .tuner_addr = 0x60,
5190#else
5191 .tuner_type = UNSET,
5192 .tuner_addr = ADDR_UNSET,
5193#endif
5194 .radio_type = UNSET,
5185 .radio_addr = ADDR_UNSET, 5195 .radio_addr = ADDR_UNSET,
5186 .gpiomask = 0x8e054000, 5196 .gpiomask = 0x8e054000,
5187 .mpeg = SAA7134_MPEG_DVB, 5197 .mpeg = SAA7134_MPEG_DVB,
5198 .ts_type = SAA7134_MPEG_TS_PARALLEL,
5188 .inputs = { { 5199 .inputs = { {
5189 .name = name_tv, 5200 .name = name_tv,
5190 .vmux = 1, 5201 .vmux = 1,
@@ -7623,16 +7634,6 @@ int saa7134_board_init2(struct saa7134_dev *dev)
7623 {0x45, 0x97}, 7634 {0x45, 0x97},
7624 {0x45, 0xc1}, 7635 {0x45, 0xc1},
7625 }; 7636 };
7626
7627 saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x0000);
7628 saa_writel(SAA7134_GPIO_GPSTATUS0 >> 2, 0x0000);
7629 saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x0000);
7630 saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x4000);
7631 saa_writel(SAA7134_GPIO_GPSTATUS0 >> 2, 0x0000);
7632 saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x4000);
7633 saa_writel(SAA7134_GPIO_GPSTATUS0 >> 2, 0x4000);
7634 saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x4000);
7635 saa_writel(SAA7134_GPIO_GPSTATUS0 >> 2, 0x0000);
7636 saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x4000); 7637 saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x4000);
7637 saa_writel(SAA7134_GPIO_GPSTATUS0 >> 2, 0x4000); 7638 saa_writel(SAA7134_GPIO_GPSTATUS0 >> 2, 0x4000);
7638 7639
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c
index beb95e21d109..3315a48a848b 100644
--- a/drivers/media/video/saa7134/saa7134-dvb.c
+++ b/drivers/media/video/saa7134/saa7134-dvb.c
@@ -52,6 +52,7 @@
52#include "tda18271.h" 52#include "tda18271.h"
53#include "lgdt3305.h" 53#include "lgdt3305.h"
54#include "tda8290.h" 54#include "tda8290.h"
55#include "mb86a20s.h"
55 56
56#include "zl10353.h" 57#include "zl10353.h"
57 58
@@ -228,6 +229,20 @@ static struct mt352_config avermedia_xc3028_mt352_dev = {
228 .demod_init = mt352_avermedia_xc3028_init, 229 .demod_init = mt352_avermedia_xc3028_init,
229}; 230};
230 231
232static struct tda18271_std_map mb86a20s_tda18271_std_map = {
233 .dvbt_6 = { .if_freq = 3300, .agc_mode = 3, .std = 4,
234 .if_lvl = 7, .rfagc_top = 0x37, },
235};
236
237static struct tda18271_config kworld_tda18271_config = {
238 .std_map = &mb86a20s_tda18271_std_map,
239 .gate = TDA18271_GATE_DIGITAL,
240};
241
242static const struct mb86a20s_config kworld_mb86a20s_config = {
243 .demod_address = 0x10,
244};
245
231/* ================================================================== 246/* ==================================================================
232 * tda1004x based DVB-T cards, helper functions 247 * tda1004x based DVB-T cards, helper functions
233 */ 248 */
@@ -608,6 +623,37 @@ static struct tda827x_config tda827x_cfg_2_sw42 = {
608 623
609/* ------------------------------------------------------------------ */ 624/* ------------------------------------------------------------------ */
610 625
626static int __kworld_sbtvd_i2c_gate_ctrl(struct saa7134_dev *dev, int enable)
627{
628 unsigned char initmsg[] = {0x45, 0x97};
629 unsigned char msg_enable[] = {0x45, 0xc1};
630 unsigned char msg_disable[] = {0x45, 0x81};
631 struct i2c_msg msg = {.addr = 0x4b, .flags = 0, .buf = initmsg, .len = 2};
632
633 if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1) {
634 wprintk("could not access the I2C gate\n");
635 return -EIO;
636 }
637 if (enable)
638 msg.buf = msg_enable;
639 else
640 msg.buf = msg_disable;
641 if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1) {
642 wprintk("could not access the I2C gate\n");
643 return -EIO;
644 }
645 msleep(20);
646 return 0;
647}
648static int kworld_sbtvd_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
649{
650 struct saa7134_dev *dev = fe->dvb->priv;
651
652 return __kworld_sbtvd_i2c_gate_ctrl(dev, enable);
653}
654
655/* ------------------------------------------------------------------ */
656
611static struct tda1004x_config tda827x_lifeview_config = { 657static struct tda1004x_config tda827x_lifeview_config = {
612 .demod_address = 0x08, 658 .demod_address = 0x08,
613 .invert = 1, 659 .invert = 1,
@@ -1613,6 +1659,29 @@ static int dvb_init(struct saa7134_dev *dev)
1613 &dtv1000s_tda18271_config); 1659 &dtv1000s_tda18271_config);
1614 } 1660 }
1615 break; 1661 break;
1662 case SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG:
1663 __kworld_sbtvd_i2c_gate_ctrl(dev, 0);
1664 saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x14000);
1665 saa_writel(SAA7134_GPIO_GPSTATUS0 >> 2, 0x14000);
1666 msleep(20);
1667 saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x54000);
1668 saa_writel(SAA7134_GPIO_GPSTATUS0 >> 2, 0x54000);
1669 msleep(20);
1670 fe0->dvb.frontend = dvb_attach(mb86a20s_attach,
1671 &kworld_mb86a20s_config,
1672 &dev->i2c_adap);
1673 __kworld_sbtvd_i2c_gate_ctrl(dev, 1);
1674 if (fe0->dvb.frontend != NULL) {
1675 dvb_attach(tda18271_attach, fe0->dvb.frontend,
1676 0x60, &dev->i2c_adap,
1677 &kworld_tda18271_config);
1678 /*
1679 * Only after success, it can initialize the gate, otherwise
1680 * an OOPS will hit, due to kfree(fe0->dvb.frontend)
1681 */
1682 fe0->dvb.frontend->ops.i2c_gate_ctrl = kworld_sbtvd_i2c_gate_ctrl;
1683 }
1684 break;
1616 default: 1685 default:
1617 wprintk("Huh? unknown DVB card?\n"); 1686 wprintk("Huh? unknown DVB card?\n");
1618 break; 1687 break;