diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-10-03 06:01:26 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-12-29 05:16:28 -0500 |
commit | f0551efc77b0f34a93a14d2bf96051612e352a39 (patch) | |
tree | c8646df928ebca0572fe1ce8046a6470a5e976d4 /drivers/media/video/saa7134 | |
parent | 68541cdaadecbc280cd50122f11fdbb249a2ae29 (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.c | 23 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-dvb.c | 69 |
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 | ||
232 | static 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 | |||
237 | static struct tda18271_config kworld_tda18271_config = { | ||
238 | .std_map = &mb86a20s_tda18271_std_map, | ||
239 | .gate = TDA18271_GATE_DIGITAL, | ||
240 | }; | ||
241 | |||
242 | static 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 | ||
626 | static 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 | } | ||
648 | static 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 | |||
611 | static struct tda1004x_config tda827x_lifeview_config = { | 657 | static 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; |