aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/cx231xx
diff options
context:
space:
mode:
authorMichael Krufky <mkrufky@kernellabs.com>2010-07-06 17:23:53 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-10-20 23:17:11 -0400
commit1a50fddefd17ec1359d08cd23c77da42fabbb4a7 (patch)
tree2467c087a5ba145e004d5de30fa0e950bbdaf359 /drivers/media/video/cx231xx
parent64fbf44455260684fa5bfdd3121af3d0ef0b48dd (diff)
[media] cx231xx: add support for Hauppauge EXETER
Add support for various Hauppauge EXETER designs. Note by DJH: fixed a few minor 'make checkpatch' warnings before commit. Signed-off-by: Michael Krufky <mkrufky@kernellabs.com> Signed-off-by: Devin Heitmueller <dheitmueller@hauppauge.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/cx231xx')
-rw-r--r--drivers/media/video/cx231xx/cx231xx-avcore.c15
-rw-r--r--drivers/media/video/cx231xx/cx231xx-cards.c47
-rw-r--r--drivers/media/video/cx231xx/cx231xx-core.c7
-rw-r--r--drivers/media/video/cx231xx/cx231xx-dvb.c49
-rw-r--r--drivers/media/video/cx231xx/cx231xx.h1
5 files changed, 115 insertions, 4 deletions
diff --git a/drivers/media/video/cx231xx/cx231xx-avcore.c b/drivers/media/video/cx231xx/cx231xx-avcore.c
index 3e467ce1b06f..64e07d335e77 100644
--- a/drivers/media/video/cx231xx/cx231xx-avcore.c
+++ b/drivers/media/video/cx231xx/cx231xx-avcore.c
@@ -352,6 +352,7 @@ int cx231xx_afe_update_power_control(struct cx231xx *dev,
352 case CX231XX_BOARD_CNXT_RDE_253S: 352 case CX231XX_BOARD_CNXT_RDE_253S:
353 case CX231XX_BOARD_CNXT_RDU_253S: 353 case CX231XX_BOARD_CNXT_RDU_253S:
354 case CX231XX_BOARD_CNXT_VIDEO_GRABBER: 354 case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
355 case CX231XX_BOARD_HAUPPAUGE_EXETER:
355 if (avmode == POLARIS_AVMODE_ANALOGT_TV) { 356 if (avmode == POLARIS_AVMODE_ANALOGT_TV) {
356 while (afe_power_status != (FLD_PWRDN_TUNING_BIAS | 357 while (afe_power_status != (FLD_PWRDN_TUNING_BIAS |
357 FLD_PWRDN_ENABLE_PLL)) { 358 FLD_PWRDN_ENABLE_PLL)) {
@@ -1187,6 +1188,7 @@ int cx231xx_set_audio_decoder_input(struct cx231xx *dev,
1187 break; 1188 break;
1188 case CX231XX_BOARD_CNXT_RDE_253S: 1189 case CX231XX_BOARD_CNXT_RDE_253S:
1189 case CX231XX_BOARD_CNXT_RDU_253S: 1190 case CX231XX_BOARD_CNXT_RDU_253S:
1191 case CX231XX_BOARD_HAUPPAUGE_EXETER:
1190 status = cx231xx_read_modify_write_i2c_dword(dev, 1192 status = cx231xx_read_modify_write_i2c_dword(dev,
1191 VID_BLK_I2C_ADDRESS, 1193 VID_BLK_I2C_ADDRESS,
1192 CHIP_CTRL, 1194 CHIP_CTRL,
@@ -1750,6 +1752,7 @@ int cx231xx_dif_set_standard(struct cx231xx *dev, u32 standard)
1750 case CX231XX_BOARD_CNXT_SHELBY: 1752 case CX231XX_BOARD_CNXT_SHELBY:
1751 case CX231XX_BOARD_CNXT_RDU_250: 1753 case CX231XX_BOARD_CNXT_RDU_250:
1752 case CX231XX_BOARD_CNXT_VIDEO_GRABBER: 1754 case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
1755 case CX231XX_BOARD_HAUPPAUGE_EXETER:
1753 func_mode = 0x03; 1756 func_mode = 0x03;
1754 break; 1757 break;
1755 case CX231XX_BOARD_CNXT_RDE_253S: 1758 case CX231XX_BOARD_CNXT_RDE_253S:
@@ -2361,6 +2364,12 @@ int cx231xx_set_power_mode(struct cx231xx *dev, enum AV_MODE mode)
2361 cx231xx_enable_i2c_for_tuner(dev, I2C_3); 2364 cx231xx_enable_i2c_for_tuner(dev, I2C_3);
2362 if (dev->cx231xx_reset_analog_tuner) 2365 if (dev->cx231xx_reset_analog_tuner)
2363 dev->cx231xx_reset_analog_tuner(dev); 2366 dev->cx231xx_reset_analog_tuner(dev);
2367 } else if (dev->model == CX231XX_BOARD_HAUPPAUGE_EXETER) {
2368 /* tuner path to channel 1 from port 1 ?? */
2369 cx231xx_enable_i2c_for_tuner(dev, I2C_1);
2370
2371 if (dev->cx231xx_reset_analog_tuner)
2372 dev->cx231xx_reset_analog_tuner(dev);
2364 } 2373 }
2365 2374
2366 break; 2375 break;
@@ -2436,6 +2445,12 @@ int cx231xx_set_power_mode(struct cx231xx *dev, enum AV_MODE mode)
2436 cx231xx_enable_i2c_for_tuner(dev, I2C_3); 2445 cx231xx_enable_i2c_for_tuner(dev, I2C_3);
2437 if (dev->cx231xx_reset_analog_tuner) 2446 if (dev->cx231xx_reset_analog_tuner)
2438 dev->cx231xx_reset_analog_tuner(dev); 2447 dev->cx231xx_reset_analog_tuner(dev);
2448 } else if (dev->model == CX231XX_BOARD_HAUPPAUGE_EXETER) {
2449 /* tuner path to channel 1 from port 1 ?? */
2450 cx231xx_enable_i2c_for_tuner(dev, I2C_1);
2451
2452 if (dev->cx231xx_reset_analog_tuner)
2453 dev->cx231xx_reset_analog_tuner(dev);
2439 } 2454 }
2440 2455
2441 break; 2456 break;
diff --git a/drivers/media/video/cx231xx/cx231xx-cards.c b/drivers/media/video/cx231xx/cx231xx-cards.c
index 59e273324f5a..a19248495c2a 100644
--- a/drivers/media/video/cx231xx/cx231xx-cards.c
+++ b/drivers/media/video/cx231xx/cx231xx-cards.c
@@ -340,6 +340,44 @@ struct cx231xx_board cx231xx_boards[] = {
340 } 340 }
341 }, 341 },
342 }, 342 },
343 [CX231XX_BOARD_HAUPPAUGE_EXETER] = {
344 .name = "Hauppauge EXETER",
345 .tuner_type = TUNER_NXP_TDA18271,
346 .tuner_addr = 0x60,
347 .tuner_gpio = RDE250_XCV_TUNER,
348 .tuner_sif_gpio = 0x05,
349 .tuner_scl_gpio = 0x1a,
350 .tuner_sda_gpio = 0x1b,
351 .decoder = CX231XX_AVDECODER,
352 .demod_xfer_mode = 0,
353 .ctl_pin_status_mask = 0xFFFFFFC4,
354 .agc_analog_digital_select_gpio = 0x0c,
355 .gpio_pin_status_mask = 0x4001000,
356 .tuner_i2c_master = 1,
357 .demod_i2c_master = 2,
358 .has_dvb = 1,
359 .demod_addr = 0x0e,
360 .norm = V4L2_STD_NTSC,
361
362 .input = {{
363 .type = CX231XX_VMUX_TELEVISION,
364 .vmux = CX231XX_VIN_3_1,
365 .amux = CX231XX_AMUX_VIDEO,
366 .gpio = 0,
367 }, {
368 .type = CX231XX_VMUX_COMPOSITE1,
369 .vmux = CX231XX_VIN_2_1,
370 .amux = CX231XX_AMUX_LINE_IN,
371 .gpio = 0,
372 }, {
373 .type = CX231XX_VMUX_SVIDEO,
374 .vmux = CX231XX_VIN_1_1 |
375 (CX231XX_VIN_1_2 << 8) |
376 CX25840_SVIDEO_ON,
377 .amux = CX231XX_AMUX_LINE_IN,
378 .gpio = 0,
379 } },
380 },
343 381
344 382
345 383
@@ -352,6 +390,8 @@ const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
352struct usb_device_id cx231xx_id_table[] = { 390struct usb_device_id cx231xx_id_table[] = {
353 {USB_DEVICE(0x0572, 0x5A3C), 391 {USB_DEVICE(0x0572, 0x5A3C),
354 .driver_info = CX231XX_BOARD_UNKNOWN}, 392 .driver_info = CX231XX_BOARD_UNKNOWN},
393 {USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x4000,0x4fff),
394 .driver_info = CX231XX_BOARD_UNKNOWN},
355 {USB_DEVICE(0x0572, 0x58A2), 395 {USB_DEVICE(0x0572, 0x58A2),
356 .driver_info = CX231XX_BOARD_CNXT_CARRAERA}, 396 .driver_info = CX231XX_BOARD_CNXT_CARRAERA},
357 {USB_DEVICE(0x0572, 0x58A1), 397 {USB_DEVICE(0x0572, 0x58A1),
@@ -366,8 +406,8 @@ struct usb_device_id cx231xx_id_table[] = {
366 .driver_info = CX231XX_BOARD_CNXT_RDE_250}, 406 .driver_info = CX231XX_BOARD_CNXT_RDE_250},
367 {USB_DEVICE(0x0572, 0x58A0), 407 {USB_DEVICE(0x0572, 0x58A0),
368 .driver_info = CX231XX_BOARD_CNXT_RDU_250}, 408 .driver_info = CX231XX_BOARD_CNXT_RDU_250},
369 {USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x4000,0x4fff), 409 {USB_DEVICE(0x2040, 0xb120),
370 .driver_info = CX231XX_BOARD_UNKNOWN}, 410 .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
371 {}, 411 {},
372}; 412};
373 413
@@ -515,6 +555,8 @@ void cx231xx_register_i2c_ir(struct cx231xx *dev)
515 break; 555 break;
516 case CX231XX_BOARD_CNXT_VIDEO_GRABBER: 556 case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
517 break; 557 break;
558 case CX231XX_BOARD_HAUPPAUGE_EXETER:
559 break;
518 default: 560 default:
519 break; 561 break;
520 } 562 }
@@ -559,6 +601,7 @@ void cx231xx_card_setup(struct cx231xx *dev)
559 case CX231XX_BOARD_CNXT_RDE_253S: 601 case CX231XX_BOARD_CNXT_RDE_253S:
560 case CX231XX_BOARD_CNXT_RDU_253S: 602 case CX231XX_BOARD_CNXT_RDU_253S:
561 case CX231XX_BOARD_CNXT_VIDEO_GRABBER: 603 case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
604 case CX231XX_BOARD_HAUPPAUGE_EXETER:
562 if (dev->board.tuner_type != TUNER_ABSENT) { 605 if (dev->board.tuner_type != TUNER_ABSENT) {
563 dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev, 606 dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
564 &dev->i2c_bus[1].i2c_adap, 607 &dev->i2c_bus[1].i2c_adap,
diff --git a/drivers/media/video/cx231xx/cx231xx-core.c b/drivers/media/video/cx231xx/cx231xx-core.c
index e258a6261ea4..b75e9e7dd502 100644
--- a/drivers/media/video/cx231xx/cx231xx-core.c
+++ b/drivers/media/video/cx231xx/cx231xx-core.c
@@ -752,6 +752,7 @@ int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode)
752 break; 752 break;
753 case CX231XX_BOARD_CNXT_RDE_253S: 753 case CX231XX_BOARD_CNXT_RDE_253S:
754 case CX231XX_BOARD_CNXT_RDU_253S: 754 case CX231XX_BOARD_CNXT_RDU_253S:
755 case CX231XX_BOARD_HAUPPAUGE_EXETER:
755 errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1); 756 errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
756 break; 757 break;
757 default: 758 default:
@@ -768,6 +769,7 @@ int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode)
768 break; 769 break;
769 case CX231XX_BOARD_CNXT_RDE_253S: 770 case CX231XX_BOARD_CNXT_RDE_253S:
770 case CX231XX_BOARD_CNXT_RDU_253S: 771 case CX231XX_BOARD_CNXT_RDU_253S:
772 case CX231XX_BOARD_HAUPPAUGE_EXETER:
771 errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0); 773 errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
772 break; 774 break;
773 default: 775 default:
@@ -1306,14 +1308,14 @@ int cx231xx_dev_init(struct cx231xx *dev)
1306 /* External Master 1 Bus */ 1308 /* External Master 1 Bus */
1307 dev->i2c_bus[0].nr = 0; 1309 dev->i2c_bus[0].nr = 0;
1308 dev->i2c_bus[0].dev = dev; 1310 dev->i2c_bus[0].dev = dev;
1309 dev->i2c_bus[0].i2c_period = I2C_SPEED_1M; /* 1MHz */ 1311 dev->i2c_bus[0].i2c_period = I2C_SPEED_100K; /* 100 KHz */
1310 dev->i2c_bus[0].i2c_nostop = 0; 1312 dev->i2c_bus[0].i2c_nostop = 0;
1311 dev->i2c_bus[0].i2c_reserve = 0; 1313 dev->i2c_bus[0].i2c_reserve = 0;
1312 1314
1313 /* External Master 2 Bus */ 1315 /* External Master 2 Bus */
1314 dev->i2c_bus[1].nr = 1; 1316 dev->i2c_bus[1].nr = 1;
1315 dev->i2c_bus[1].dev = dev; 1317 dev->i2c_bus[1].dev = dev;
1316 dev->i2c_bus[1].i2c_period = I2C_SPEED_1M; /* 1MHz */ 1318 dev->i2c_bus[1].i2c_period = I2C_SPEED_100K; /* 100 KHz */
1317 dev->i2c_bus[1].i2c_nostop = 0; 1319 dev->i2c_bus[1].i2c_nostop = 0;
1318 dev->i2c_bus[1].i2c_reserve = 0; 1320 dev->i2c_bus[1].i2c_reserve = 0;
1319 1321
@@ -1411,6 +1413,7 @@ int cx231xx_dev_init(struct cx231xx *dev)
1411 break; 1413 break;
1412 case CX231XX_BOARD_CNXT_RDE_253S: 1414 case CX231XX_BOARD_CNXT_RDE_253S:
1413 case CX231XX_BOARD_CNXT_RDU_253S: 1415 case CX231XX_BOARD_CNXT_RDU_253S:
1416 case CX231XX_BOARD_HAUPPAUGE_EXETER:
1414 errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0); 1417 errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
1415 break; 1418 break;
1416 default: 1419 default:
diff --git a/drivers/media/video/cx231xx/cx231xx-dvb.c b/drivers/media/video/cx231xx/cx231xx-dvb.c
index 130794b971ce..3ff99e9f4a1f 100644
--- a/drivers/media/video/cx231xx/cx231xx-dvb.c
+++ b/drivers/media/video/cx231xx/cx231xx-dvb.c
@@ -32,6 +32,7 @@
32#include "s5h1432.h" 32#include "s5h1432.h"
33#include "tda18271.h" 33#include "tda18271.h"
34#include "s5h1411.h" 34#include "s5h1411.h"
35#include "lgdt3305.h"
35 36
36MODULE_DESCRIPTION("driver for cx231xx based DVB cards"); 37MODULE_DESCRIPTION("driver for cx231xx based DVB cards");
37MODULE_AUTHOR("Srinivasa Deevi <srinivasa.deevi@conexant.com>"); 38MODULE_AUTHOR("Srinivasa Deevi <srinivasa.deevi@conexant.com>");
@@ -110,6 +111,30 @@ static struct s5h1411_config xc5000_s5h1411_config = {
110 .status_mode = S5H1411_DEMODLOCKING, 111 .status_mode = S5H1411_DEMODLOCKING,
111 .mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK, 112 .mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
112}; 113};
114
115static struct lgdt3305_config hcw_lgdt3305_config = {
116 .i2c_addr = 0x0e,
117 .mpeg_mode = LGDT3305_MPEG_SERIAL,
118 .tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE,
119 .tpvalid_polarity = LGDT3305_TP_VALID_HIGH,
120 .deny_i2c_rptr = 1,
121 .spectral_inversion = 1,
122 .qam_if_khz = 4000,
123 .vsb_if_khz = 3250,
124};
125
126static struct tda18271_std_map hauppauge_tda18271_std_map = {
127 .atsc_6 = { .if_freq = 3250, .agc_mode = 3, .std = 4,
128 .if_lvl = 1, .rfagc_top = 0x58, },
129 .qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 5,
130 .if_lvl = 1, .rfagc_top = 0x58, },
131};
132
133static struct tda18271_config hcw_tda18271_config = {
134 .std_map = &hauppauge_tda18271_std_map,
135 .gate = TDA18271_GATE_DIGITAL,
136};
137
113static inline void print_err_status(struct cx231xx *dev, int packet, int status) 138static inline void print_err_status(struct cx231xx *dev, int packet, int status)
114{ 139{
115 char *errmsg = "Unknown"; 140 char *errmsg = "Unknown";
@@ -639,6 +664,30 @@ static int dvb_init(struct cx231xx *dev)
639 goto out_free; 664 goto out_free;
640 } 665 }
641 break; 666 break;
667 case CX231XX_BOARD_HAUPPAUGE_EXETER:
668
669 printk(KERN_INFO "%s: looking for tuner / demod on i2c bus: %d\n",
670 __func__, i2c_adapter_id(&dev->i2c_bus[1].i2c_adap));
671
672 dev->dvb->frontend = dvb_attach(lgdt3305_attach,
673 &hcw_lgdt3305_config,
674 &dev->i2c_bus[1].i2c_adap);
675
676 if (dev->dvb->frontend == NULL) {
677 printk(DRIVER_NAME
678 ": Failed to attach LG3305 front end\n");
679 result = -EINVAL;
680 goto out_free;
681 }
682
683 /* define general-purpose callback pointer */
684 dvb->frontend->callback = cx231xx_tuner_callback;
685
686 dvb_attach(tda18271_attach, dev->dvb->frontend,
687 0x60, &dev->i2c_bus[1].i2c_adap,
688 &hcw_tda18271_config);
689 break;
690
642 691
643 default: 692 default:
644 printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card" 693 printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card"
diff --git a/drivers/media/video/cx231xx/cx231xx.h b/drivers/media/video/cx231xx/cx231xx.h
index d9a90c50aaa0..634d595818d8 100644
--- a/drivers/media/video/cx231xx/cx231xx.h
+++ b/drivers/media/video/cx231xx/cx231xx.h
@@ -62,6 +62,7 @@
62#define CX231XX_BOARD_CNXT_VIDEO_GRABBER 5 62#define CX231XX_BOARD_CNXT_VIDEO_GRABBER 5
63#define CX231XX_BOARD_CNXT_RDE_250 6 63#define CX231XX_BOARD_CNXT_RDE_250 6
64#define CX231XX_BOARD_CNXT_RDU_250 7 64#define CX231XX_BOARD_CNXT_RDU_250 7
65#define CX231XX_BOARD_HAUPPAUGE_EXETER 8
65 66
66/* Limits minimum and default number of buffers */ 67/* Limits minimum and default number of buffers */
67#define CX231XX_MIN_BUF 4 68#define CX231XX_MIN_BUF 4