aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2010-10-03 04:27:59 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-12-29 05:16:28 -0500
commit68541cdaadecbc280cd50122f11fdbb249a2ae29 (patch)
treec82b6c50215e59559ed8d0daf454b8f68e46b7d1
parent7572f9c5575c721f43b575a71fda1ecd896e0327 (diff)
[media] Add support for Kworld SBTVD board
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/dvb/frontends/mb86a20s.c23
-rw-r--r--drivers/media/video/saa7134/saa7134-cards.c109
-rw-r--r--drivers/media/video/saa7134/saa7134.h1
3 files changed, 133 insertions, 0 deletions
diff --git a/drivers/media/dvb/frontends/mb86a20s.c b/drivers/media/dvb/frontends/mb86a20s.c
index b4de8f12df27..d3ad3e75a35a 100644
--- a/drivers/media/dvb/frontends/mb86a20s.c
+++ b/drivers/media/dvb/frontends/mb86a20s.c
@@ -376,6 +376,9 @@ static int mb86a20s_initfe(struct dvb_frontend *fe)
376 376
377 dprintk("\n"); 377 dprintk("\n");
378 378
379 if (fe->ops.i2c_gate_ctrl)
380 fe->ops.i2c_gate_ctrl(fe, 0);
381
379 /* Initialize the frontend */ 382 /* Initialize the frontend */
380 rc = mb86a20s_writeregdata(state, mb86a20s_init); 383 rc = mb86a20s_writeregdata(state, mb86a20s_init);
381 if (rc < 0) 384 if (rc < 0)
@@ -392,6 +395,9 @@ static int mb86a20s_initfe(struct dvb_frontend *fe)
392 return rc; 395 return rc;
393 } 396 }
394 397
398 if (fe->ops.i2c_gate_ctrl)
399 fe->ops.i2c_gate_ctrl(fe, 1);
400
395 return 0; 401 return 0;
396} 402}
397 403
@@ -403,6 +409,9 @@ static int mb86a20s_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
403 409
404 dprintk("\n"); 410 dprintk("\n");
405 411
412 if (fe->ops.i2c_gate_ctrl)
413 fe->ops.i2c_gate_ctrl(fe, 0);
414
406 /* Does a binary search to get RF strength */ 415 /* Does a binary search to get RF strength */
407 rf_max = 0xfff; 416 rf_max = 0xfff;
408 rf_min = 0; 417 rf_min = 0;
@@ -426,6 +435,9 @@ static int mb86a20s_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
426 435
427 dprintk("signal strength = %d\n", *strength); 436 dprintk("signal strength = %d\n", *strength);
428 437
438 if (fe->ops.i2c_gate_ctrl)
439 fe->ops.i2c_gate_ctrl(fe, 1);
440
429 return 0; 441 return 0;
430} 442}
431 443
@@ -437,7 +449,11 @@ static int mb86a20s_read_status(struct dvb_frontend *fe, fe_status_t *status)
437 dprintk("\n"); 449 dprintk("\n");
438 *status = 0; 450 *status = 0;
439 451
452 if (fe->ops.i2c_gate_ctrl)
453 fe->ops.i2c_gate_ctrl(fe, 0);
440 val = mb86a20s_readreg(state, 0x0a) & 0xf; 454 val = mb86a20s_readreg(state, 0x0a) & 0xf;
455 if (fe->ops.i2c_gate_ctrl)
456 fe->ops.i2c_gate_ctrl(fe, 1);
441 457
442 if (val >= 2) 458 if (val >= 2)
443 *status |= FE_HAS_SIGNAL; 459 *status |= FE_HAS_SIGNAL;
@@ -467,8 +483,15 @@ static int mb86a20s_set_frontend(struct dvb_frontend *fe,
467 483
468 dprintk("\n"); 484 dprintk("\n");
469 485
486 if (fe->ops.i2c_gate_ctrl)
487 fe->ops.i2c_gate_ctrl(fe, 1);
470 fe->ops.tuner_ops.set_params(fe, p); 488 fe->ops.tuner_ops.set_params(fe, p);
489
490 if (fe->ops.i2c_gate_ctrl)
491 fe->ops.i2c_gate_ctrl(fe, 0);
471 rc = mb86a20s_writeregdata(state, mb86a20s_reset_reception); 492 rc = mb86a20s_writeregdata(state, mb86a20s_reset_reception);
493 if (fe->ops.i2c_gate_ctrl)
494 fe->ops.i2c_gate_ctrl(fe, 1);
472 495
473 return rc; 496 return rc;
474} 497}
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c
index 1d4d0a49ea52..58c8c03fd8f7 100644
--- a/drivers/media/video/saa7134/saa7134-cards.c
+++ b/drivers/media/video/saa7134/saa7134-cards.c
@@ -5176,6 +5176,47 @@ struct saa7134_board saa7134_boards[] = {
5176 .amux = 2, 5176 .amux = 2,
5177 }, 5177 },
5178 }, 5178 },
5179 [SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG] = {
5180 .name = "Kworld PCI SBTVD/ISDB-T Full-Seg Hybrid",
5181 .audio_clock = 0x00187de7,
5182 .tuner_type = TUNER_NXP_TDA18271, /* TUNER_PHILIPS_TDA8290 */
5183 .radio_type = UNSET,
5184 .tuner_addr = 0x60,
5185 .radio_addr = ADDR_UNSET,
5186 .gpiomask = 0x8e054000,
5187 .mpeg = SAA7134_MPEG_DVB,
5188 .inputs = { {
5189 .name = name_tv,
5190 .vmux = 1,
5191 .amux = TV,
5192 .tv = 1,
5193#if 0 /* FIXME */
5194 }, {
5195 .name = name_comp1,
5196 .vmux = 3,
5197 .amux = LINE1,
5198 .gpio = 0x200,
5199 }, {
5200 .name = name_svideo,
5201 .vmux = 8,
5202 .amux = LINE1,
5203 .gpio = 0x200,
5204#endif
5205 } },
5206#if 0
5207 .radio = {
5208 .name = name_radio,
5209 .vmux = 1,
5210 .amux = LINE1,
5211 .gpio = 0x100,
5212 },
5213#endif
5214 .mute = {
5215 .name = name_mute,
5216 .vmux = 0,
5217 .amux = TV,
5218 },
5219 },
5179 [SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS] = { 5220 [SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS] = {
5180 .name = "Avermedia AVerTV GO 007 FM Plus", 5221 .name = "Avermedia AVerTV GO 007 FM Plus",
5181 .audio_clock = 0x00187de7, 5222 .audio_clock = 0x00187de7,
@@ -6615,6 +6656,12 @@ struct pci_device_id saa7134_pci_tbl[] = {
6615 }, { 6656 }, {
6616 .vendor = PCI_VENDOR_ID_PHILIPS, 6657 .vendor = PCI_VENDOR_ID_PHILIPS,
6617 .device = PCI_DEVICE_ID_PHILIPS_SAA7133, 6658 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6659 .subvendor = 0x17de,
6660 .subdevice = 0xb136,
6661 .driver_data = SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG,
6662 }, {
6663 .vendor = PCI_VENDOR_ID_PHILIPS,
6664 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6618 .subvendor = 0x1461, /* Avermedia Technologies Inc */ 6665 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6619 .subdevice = 0xf31d, 6666 .subdevice = 0xf31d,
6620 .driver_data = SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS, 6667 .driver_data = SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS,
@@ -6831,6 +6878,23 @@ static inline int saa7134_tda18271_hvr11x0_toggle_agc(struct saa7134_dev *dev,
6831 return 0; 6878 return 0;
6832} 6879}
6833 6880
6881static inline int saa7134_kworld_sbtvd_toggle_agc(struct saa7134_dev *dev,
6882 enum tda18271_mode mode)
6883{
6884 /* toggle AGC switch through GPIO 27 */
6885 switch (mode) {
6886 case TDA18271_ANALOG:
6887 saa7134_set_gpio(dev, 27, 0);
6888 break;
6889 case TDA18271_DIGITAL:
6890 saa7134_set_gpio(dev, 27, 1);
6891 break;
6892 default:
6893 return -EINVAL;
6894 }
6895 return 0;
6896}
6897
6834static int saa7134_tda8290_18271_callback(struct saa7134_dev *dev, 6898static int saa7134_tda8290_18271_callback(struct saa7134_dev *dev,
6835 int command, int arg) 6899 int command, int arg)
6836{ 6900{
@@ -6843,6 +6907,9 @@ static int saa7134_tda8290_18271_callback(struct saa7134_dev *dev,
6843 case SAA7134_BOARD_HAUPPAUGE_HVR1120: 6907 case SAA7134_BOARD_HAUPPAUGE_HVR1120:
6844 ret = saa7134_tda18271_hvr11x0_toggle_agc(dev, arg); 6908 ret = saa7134_tda18271_hvr11x0_toggle_agc(dev, arg);
6845 break; 6909 break;
6910 case SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG:
6911 ret = saa7134_kworld_sbtvd_toggle_agc(dev, arg);
6912 break;
6846 default: 6913 default:
6847 break; 6914 break;
6848 } 6915 }
@@ -6863,6 +6930,7 @@ static int saa7134_tda8290_callback(struct saa7134_dev *dev,
6863 case SAA7134_BOARD_HAUPPAUGE_HVR1150: 6930 case SAA7134_BOARD_HAUPPAUGE_HVR1150:
6864 case SAA7134_BOARD_HAUPPAUGE_HVR1120: 6931 case SAA7134_BOARD_HAUPPAUGE_HVR1120:
6865 case SAA7134_BOARD_AVERMEDIA_M733A: 6932 case SAA7134_BOARD_AVERMEDIA_M733A:
6933 case SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG:
6866 /* tda8290 + tda18271 */ 6934 /* tda8290 + tda18271 */
6867 ret = saa7134_tda8290_18271_callback(dev, command, arg); 6935 ret = saa7134_tda8290_18271_callback(dev, command, arg);
6868 break; 6936 break;
@@ -7541,6 +7609,47 @@ int saa7134_board_init2(struct saa7134_dev *dev)
7541 dev->name); 7609 dev->name);
7542 break; 7610 break;
7543 } 7611 }
7612 case SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG:
7613 {
7614 struct i2c_msg msg = { .addr = 0x4b, .flags = 0 };
7615 int i;
7616 static u8 buffer[][2] = {
7617 {0x30, 0x31},
7618 {0xff, 0x00},
7619 {0x41, 0x03},
7620 {0x41, 0x1a},
7621 {0xff, 0x02},
7622 {0x34, 0x00},
7623 {0x45, 0x97},
7624 {0x45, 0xc1},
7625 };
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_GPSTATUS0 >> 2, 0x4000);
7638
7639 /*
7640 * FIXME: identify what device is at addr 0x4b and what means
7641 * this initialization
7642 */
7643 for (i = 0; i < ARRAY_SIZE(buffer); i++) {
7644 msg.buf = &buffer[i][0];
7645 msg.len = ARRAY_SIZE(buffer[0]);
7646 if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1)
7647 printk(KERN_WARNING
7648 "%s: Unable to enable tuner(%i).\n",
7649 dev->name, i);
7650 }
7651 break;
7652 }
7544 } /* switch() */ 7653 } /* switch() */
7545 7654
7546 /* initialize tuner */ 7655 /* initialize tuner */
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h
index d3b6a196e5dc..4e37b8bfb6fa 100644
--- a/drivers/media/video/saa7134/saa7134.h
+++ b/drivers/media/video/saa7134/saa7134.h
@@ -305,6 +305,7 @@ struct saa7134_format {
305#define SAA7134_BOARD_BEHOLD_A7 179 305#define SAA7134_BOARD_BEHOLD_A7 179
306#define SAA7134_BOARD_AVERMEDIA_M733A 180 306#define SAA7134_BOARD_AVERMEDIA_M733A 180
307#define SAA7134_BOARD_TECHNOTREND_BUDGET_T3000 181 307#define SAA7134_BOARD_TECHNOTREND_BUDGET_T3000 181
308#define SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG 182
308 309
309#define SAA7134_MAXBOARDS 32 310#define SAA7134_MAXBOARDS 32
310#define SAA7134_INPUT_MAX 8 311#define SAA7134_INPUT_MAX 8