diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-10-03 04:27:59 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-12-29 05:16:28 -0500 |
commit | 68541cdaadecbc280cd50122f11fdbb249a2ae29 (patch) | |
tree | c82b6c50215e59559ed8d0daf454b8f68e46b7d1 | |
parent | 7572f9c5575c721f43b575a71fda1ecd896e0327 (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.c | 23 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134-cards.c | 109 | ||||
-rw-r--r-- | drivers/media/video/saa7134/saa7134.h | 1 |
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 | ||
6881 | static 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 | |||
6834 | static int saa7134_tda8290_18271_callback(struct saa7134_dev *dev, | 6898 | static 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 |