diff options
author | Michael Krufky <mkrufky@kernellabs.com> | 2010-07-06 17:23:53 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-10-20 23:17:11 -0400 |
commit | 1a50fddefd17ec1359d08cd23c77da42fabbb4a7 (patch) | |
tree | 2467c087a5ba145e004d5de30fa0e950bbdaf359 /drivers/media/video/cx231xx | |
parent | 64fbf44455260684fa5bfdd3121af3d0ef0b48dd (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.c | 15 | ||||
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx-cards.c | 47 | ||||
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx-core.c | 7 | ||||
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx-dvb.c | 49 | ||||
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx.h | 1 |
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); | |||
352 | struct usb_device_id cx231xx_id_table[] = { | 390 | struct 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 | ||
36 | MODULE_DESCRIPTION("driver for cx231xx based DVB cards"); | 37 | MODULE_DESCRIPTION("driver for cx231xx based DVB cards"); |
37 | MODULE_AUTHOR("Srinivasa Deevi <srinivasa.deevi@conexant.com>"); | 38 | MODULE_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 | |||
115 | static 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 | |||
126 | static 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 | |||
133 | static struct tda18271_config hcw_tda18271_config = { | ||
134 | .std_map = &hauppauge_tda18271_std_map, | ||
135 | .gate = TDA18271_GATE_DIGITAL, | ||
136 | }; | ||
137 | |||
113 | static inline void print_err_status(struct cx231xx *dev, int packet, int status) | 138 | static 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 |