diff options
author | Devin Heitmueller <dheitmueller@kernellabs.com> | 2011-02-26 00:44:38 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-03-02 11:45:56 -0500 |
commit | e3bfeabbf5ba5da7f6cc5d53a83cb7765220c619 (patch) | |
tree | de870e91b29281545927c909c04b8a901c76bc7a | |
parent | d213ad08362909ab50fbd6568fcc9fd568268d29 (diff) |
[media] cx18: Add support for Hauppauge HVR-1600 models with s5h1411
The newest variants of the HVR-1600 have an s5h1411/tda18271 for the digital
frontend. Add support for these boards.
Thanks to Hauppauge Computer Works for providing sample hardware.
[awalls@md.metrocast.net: Changed an additional log message to clarify for
the end user that the driver is defaulting to an original HVR-1600 for
unknown model numbers.]
Signed-off-by: Devin Heitmueller <dheitmueller@kernellabs.com>
Signed-off-by: Andy Walls <awalls@md.metrocast.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/media/video/cx18/cx18-cards.c | 50 | ||||
-rw-r--r-- | drivers/media/video/cx18/cx18-driver.c | 25 | ||||
-rw-r--r-- | drivers/media/video/cx18/cx18-driver.h | 3 | ||||
-rw-r--r-- | drivers/media/video/cx18/cx18-dvb.c | 38 |
4 files changed, 112 insertions, 4 deletions
diff --git a/drivers/media/video/cx18/cx18-cards.c b/drivers/media/video/cx18/cx18-cards.c index 87177733cf92..68ad1963f421 100644 --- a/drivers/media/video/cx18/cx18-cards.c +++ b/drivers/media/video/cx18/cx18-cards.c | |||
@@ -95,6 +95,53 @@ static const struct cx18_card cx18_card_hvr1600_esmt = { | |||
95 | .i2c = &cx18_i2c_std, | 95 | .i2c = &cx18_i2c_std, |
96 | }; | 96 | }; |
97 | 97 | ||
98 | static const struct cx18_card cx18_card_hvr1600_s5h1411 = { | ||
99 | .type = CX18_CARD_HVR_1600_S5H1411, | ||
100 | .name = "Hauppauge HVR-1600", | ||
101 | .comment = "Simultaneous Digital and Analog TV capture supported\n", | ||
102 | .v4l2_capabilities = CX18_CAP_ENCODER, | ||
103 | .hw_audio_ctrl = CX18_HW_418_AV, | ||
104 | .hw_muxer = CX18_HW_CS5345, | ||
105 | .hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER | | ||
106 | CX18_HW_CS5345 | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL | | ||
107 | CX18_HW_Z8F0811_IR_HAUP, | ||
108 | .video_inputs = { | ||
109 | { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE7 }, | ||
110 | { CX18_CARD_INPUT_SVIDEO1, 1, CX18_AV_SVIDEO1 }, | ||
111 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE3 }, | ||
112 | { CX18_CARD_INPUT_SVIDEO2, 2, CX18_AV_SVIDEO2 }, | ||
113 | { CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE4 }, | ||
114 | }, | ||
115 | .audio_inputs = { | ||
116 | { CX18_CARD_INPUT_AUD_TUNER, | ||
117 | CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 }, | ||
118 | { CX18_CARD_INPUT_LINE_IN1, | ||
119 | CX18_AV_AUDIO_SERIAL1, CS5345_IN_2 }, | ||
120 | { CX18_CARD_INPUT_LINE_IN2, | ||
121 | CX18_AV_AUDIO_SERIAL1, CS5345_IN_3 }, | ||
122 | }, | ||
123 | .radio_input = { CX18_CARD_INPUT_AUD_TUNER, | ||
124 | CX18_AV_AUDIO_SERIAL1, CS5345_IN_4 }, | ||
125 | .ddr = { | ||
126 | /* ESMT M13S128324A-5B memory */ | ||
127 | .chip_config = 0x003, | ||
128 | .refresh = 0x30c, | ||
129 | .timing1 = 0x44220e82, | ||
130 | .timing2 = 0x08, | ||
131 | .tune_lane = 0, | ||
132 | .initial_emrs = 0, | ||
133 | }, | ||
134 | .gpio_init.initial_value = 0x3001, | ||
135 | .gpio_init.direction = 0x3001, | ||
136 | .gpio_i2c_slave_reset = { | ||
137 | .active_lo_mask = 0x3001, | ||
138 | .msecs_asserted = 10, | ||
139 | .msecs_recovery = 40, | ||
140 | .ir_reset_mask = 0x0001, | ||
141 | }, | ||
142 | .i2c = &cx18_i2c_std, | ||
143 | }; | ||
144 | |||
98 | static const struct cx18_card cx18_card_hvr1600_samsung = { | 145 | static const struct cx18_card cx18_card_hvr1600_samsung = { |
99 | .type = CX18_CARD_HVR_1600_SAMSUNG, | 146 | .type = CX18_CARD_HVR_1600_SAMSUNG, |
100 | .name = "Hauppauge HVR-1600 (Preproduction)", | 147 | .name = "Hauppauge HVR-1600 (Preproduction)", |
@@ -523,7 +570,8 @@ static const struct cx18_card *cx18_card_list[] = { | |||
523 | &cx18_card_toshiba_qosmio_dvbt, | 570 | &cx18_card_toshiba_qosmio_dvbt, |
524 | &cx18_card_leadtek_pvr2100, | 571 | &cx18_card_leadtek_pvr2100, |
525 | &cx18_card_leadtek_dvr3100h, | 572 | &cx18_card_leadtek_dvr3100h, |
526 | &cx18_card_gotview_dvd3 | 573 | &cx18_card_gotview_dvd3, |
574 | &cx18_card_hvr1600_s5h1411 | ||
527 | }; | 575 | }; |
528 | 576 | ||
529 | const struct cx18_card *cx18_get_card(u16 index) | 577 | const struct cx18_card *cx18_get_card(u16 index) |
diff --git a/drivers/media/video/cx18/cx18-driver.c b/drivers/media/video/cx18/cx18-driver.c index 944af8adbe0c..b1c3cbd92743 100644 --- a/drivers/media/video/cx18/cx18-driver.c +++ b/drivers/media/video/cx18/cx18-driver.c | |||
@@ -157,6 +157,7 @@ MODULE_PARM_DESC(cardtype, | |||
157 | "\t\t\t 7 = Leadtek WinFast PVR2100\n" | 157 | "\t\t\t 7 = Leadtek WinFast PVR2100\n" |
158 | "\t\t\t 8 = Leadtek WinFast DVR3100 H\n" | 158 | "\t\t\t 8 = Leadtek WinFast DVR3100 H\n" |
159 | "\t\t\t 9 = GoTView PCI DVD3 Hybrid\n" | 159 | "\t\t\t 9 = GoTView PCI DVD3 Hybrid\n" |
160 | "\t\t\t 10 = Hauppauge HVR 1600 (S5H1411)\n" | ||
160 | "\t\t\t 0 = Autodetect (default)\n" | 161 | "\t\t\t 0 = Autodetect (default)\n" |
161 | "\t\t\t-1 = Ignore this card\n\t\t"); | 162 | "\t\t\t-1 = Ignore this card\n\t\t"); |
162 | MODULE_PARM_DESC(pal, "Set PAL standard: B, G, H, D, K, I, M, N, Nc, 60"); | 163 | MODULE_PARM_DESC(pal, "Set PAL standard: B, G, H, D, K, I, M, N, Nc, 60"); |
@@ -337,6 +338,7 @@ void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv) | |||
337 | switch (cx->card->type) { | 338 | switch (cx->card->type) { |
338 | case CX18_CARD_HVR_1600_ESMT: | 339 | case CX18_CARD_HVR_1600_ESMT: |
339 | case CX18_CARD_HVR_1600_SAMSUNG: | 340 | case CX18_CARD_HVR_1600_SAMSUNG: |
341 | case CX18_CARD_HVR_1600_S5H1411: | ||
340 | tveeprom_hauppauge_analog(&c, tv, eedata); | 342 | tveeprom_hauppauge_analog(&c, tv, eedata); |
341 | break; | 343 | break; |
342 | case CX18_CARD_YUAN_MPC718: | 344 | case CX18_CARD_YUAN_MPC718: |
@@ -365,7 +367,25 @@ static void cx18_process_eeprom(struct cx18 *cx) | |||
365 | from the model number. Use the cardtype module option if you | 367 | from the model number. Use the cardtype module option if you |
366 | have one of these preproduction models. */ | 368 | have one of these preproduction models. */ |
367 | switch (tv.model) { | 369 | switch (tv.model) { |
368 | case 74000 ... 74999: | 370 | case 74301: /* Retail models */ |
371 | case 74321: | ||
372 | case 74351: /* OEM models */ | ||
373 | case 74361: | ||
374 | /* Digital side is s5h1411/tda18271 */ | ||
375 | cx->card = cx18_get_card(CX18_CARD_HVR_1600_S5H1411); | ||
376 | break; | ||
377 | case 74021: /* Retail models */ | ||
378 | case 74031: | ||
379 | case 74041: | ||
380 | case 74141: | ||
381 | case 74541: /* OEM models */ | ||
382 | case 74551: | ||
383 | case 74591: | ||
384 | case 74651: | ||
385 | case 74691: | ||
386 | case 74751: | ||
387 | case 74891: | ||
388 | /* Digital side is s5h1409/mxl5005s */ | ||
369 | cx->card = cx18_get_card(CX18_CARD_HVR_1600_ESMT); | 389 | cx->card = cx18_get_card(CX18_CARD_HVR_1600_ESMT); |
370 | break; | 390 | break; |
371 | case 0x718: | 391 | case 0x718: |
@@ -377,7 +397,8 @@ static void cx18_process_eeprom(struct cx18 *cx) | |||
377 | CX18_ERR("Invalid EEPROM\n"); | 397 | CX18_ERR("Invalid EEPROM\n"); |
378 | return; | 398 | return; |
379 | default: | 399 | default: |
380 | CX18_ERR("Unknown model %d, defaulting to HVR-1600\n", tv.model); | 400 | CX18_ERR("Unknown model %d, defaulting to original HVR-1600 " |
401 | "(cardtype=1)\n", tv.model); | ||
381 | cx->card = cx18_get_card(CX18_CARD_HVR_1600_ESMT); | 402 | cx->card = cx18_get_card(CX18_CARD_HVR_1600_ESMT); |
382 | break; | 403 | break; |
383 | } | 404 | } |
diff --git a/drivers/media/video/cx18/cx18-driver.h b/drivers/media/video/cx18/cx18-driver.h index 306caac6d3fc..f736679d2517 100644 --- a/drivers/media/video/cx18/cx18-driver.h +++ b/drivers/media/video/cx18/cx18-driver.h | |||
@@ -85,7 +85,8 @@ | |||
85 | #define CX18_CARD_LEADTEK_PVR2100 6 /* Leadtek WinFast PVR2100 */ | 85 | #define CX18_CARD_LEADTEK_PVR2100 6 /* Leadtek WinFast PVR2100 */ |
86 | #define CX18_CARD_LEADTEK_DVR3100H 7 /* Leadtek WinFast DVR3100 H */ | 86 | #define CX18_CARD_LEADTEK_DVR3100H 7 /* Leadtek WinFast DVR3100 H */ |
87 | #define CX18_CARD_GOTVIEW_PCI_DVD3 8 /* GoTView PCI DVD3 Hybrid */ | 87 | #define CX18_CARD_GOTVIEW_PCI_DVD3 8 /* GoTView PCI DVD3 Hybrid */ |
88 | #define CX18_CARD_LAST 8 | 88 | #define CX18_CARD_HVR_1600_S5H1411 9 /* Hauppauge HVR 1600 s5h1411/tda18271*/ |
89 | #define CX18_CARD_LAST 9 | ||
89 | 90 | ||
90 | #define CX18_ENC_STREAM_TYPE_MPG 0 | 91 | #define CX18_ENC_STREAM_TYPE_MPG 0 |
91 | #define CX18_ENC_STREAM_TYPE_TS 1 | 92 | #define CX18_ENC_STREAM_TYPE_TS 1 |
diff --git a/drivers/media/video/cx18/cx18-dvb.c b/drivers/media/video/cx18/cx18-dvb.c index f0381d62518d..f41922bd4020 100644 --- a/drivers/media/video/cx18/cx18-dvb.c +++ b/drivers/media/video/cx18/cx18-dvb.c | |||
@@ -29,6 +29,8 @@ | |||
29 | #include "cx18-gpio.h" | 29 | #include "cx18-gpio.h" |
30 | #include "s5h1409.h" | 30 | #include "s5h1409.h" |
31 | #include "mxl5005s.h" | 31 | #include "mxl5005s.h" |
32 | #include "s5h1411.h" | ||
33 | #include "tda18271.h" | ||
32 | #include "zl10353.h" | 34 | #include "zl10353.h" |
33 | 35 | ||
34 | #include <linux/firmware.h> | 36 | #include <linux/firmware.h> |
@@ -77,6 +79,32 @@ static struct s5h1409_config hauppauge_hvr1600_config = { | |||
77 | }; | 79 | }; |
78 | 80 | ||
79 | /* | 81 | /* |
82 | * CX18_CARD_HVR_1600_S5H1411 | ||
83 | */ | ||
84 | static struct s5h1411_config hcw_s5h1411_config = { | ||
85 | .output_mode = S5H1411_SERIAL_OUTPUT, | ||
86 | .gpio = S5H1411_GPIO_OFF, | ||
87 | .vsb_if = S5H1411_IF_44000, | ||
88 | .qam_if = S5H1411_IF_4000, | ||
89 | .inversion = S5H1411_INVERSION_ON, | ||
90 | .status_mode = S5H1411_DEMODLOCKING, | ||
91 | .mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK, | ||
92 | }; | ||
93 | |||
94 | static struct tda18271_std_map hauppauge_tda18271_std_map = { | ||
95 | .atsc_6 = { .if_freq = 5380, .agc_mode = 3, .std = 3, | ||
96 | .if_lvl = 6, .rfagc_top = 0x37 }, | ||
97 | .qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 0, | ||
98 | .if_lvl = 6, .rfagc_top = 0x37 }, | ||
99 | }; | ||
100 | |||
101 | static struct tda18271_config hauppauge_tda18271_config = { | ||
102 | .std_map = &hauppauge_tda18271_std_map, | ||
103 | .gate = TDA18271_GATE_DIGITAL, | ||
104 | .output_opt = TDA18271_OUTPUT_LT_OFF, | ||
105 | }; | ||
106 | |||
107 | /* | ||
80 | * CX18_CARD_LEADTEK_DVR3100H | 108 | * CX18_CARD_LEADTEK_DVR3100H |
81 | */ | 109 | */ |
82 | /* Information/confirmation of proper config values provided by Terry Wu */ | 110 | /* Information/confirmation of proper config values provided by Terry Wu */ |
@@ -244,6 +272,7 @@ static int cx18_dvb_start_feed(struct dvb_demux_feed *feed) | |||
244 | switch (cx->card->type) { | 272 | switch (cx->card->type) { |
245 | case CX18_CARD_HVR_1600_ESMT: | 273 | case CX18_CARD_HVR_1600_ESMT: |
246 | case CX18_CARD_HVR_1600_SAMSUNG: | 274 | case CX18_CARD_HVR_1600_SAMSUNG: |
275 | case CX18_CARD_HVR_1600_S5H1411: | ||
247 | v = cx18_read_reg(cx, CX18_REG_DMUX_NUM_PORT_0_CONTROL); | 276 | v = cx18_read_reg(cx, CX18_REG_DMUX_NUM_PORT_0_CONTROL); |
248 | v |= 0x00400000; /* Serial Mode */ | 277 | v |= 0x00400000; /* Serial Mode */ |
249 | v |= 0x00002000; /* Data Length - Byte */ | 278 | v |= 0x00002000; /* Data Length - Byte */ |
@@ -455,6 +484,15 @@ static int dvb_register(struct cx18_stream *stream) | |||
455 | ret = 0; | 484 | ret = 0; |
456 | } | 485 | } |
457 | break; | 486 | break; |
487 | case CX18_CARD_HVR_1600_S5H1411: | ||
488 | dvb->fe = dvb_attach(s5h1411_attach, | ||
489 | &hcw_s5h1411_config, | ||
490 | &cx->i2c_adap[0]); | ||
491 | if (dvb->fe != NULL) | ||
492 | dvb_attach(tda18271_attach, dvb->fe, | ||
493 | 0x60, &cx->i2c_adap[0], | ||
494 | &hauppauge_tda18271_config); | ||
495 | break; | ||
458 | case CX18_CARD_LEADTEK_DVR3100H: | 496 | case CX18_CARD_LEADTEK_DVR3100H: |
459 | dvb->fe = dvb_attach(zl10353_attach, | 497 | dvb->fe = dvb_attach(zl10353_attach, |
460 | &leadtek_dvr3100h_demod, | 498 | &leadtek_dvr3100h_demod, |