diff options
Diffstat (limited to 'drivers/media/video/cx88/cx88-dvb.c')
-rw-r--r-- | drivers/media/video/cx88/cx88-dvb.c | 104 |
1 files changed, 69 insertions, 35 deletions
diff --git a/drivers/media/video/cx88/cx88-dvb.c b/drivers/media/video/cx88/cx88-dvb.c index 6ad1458ab652..78d223257a68 100644 --- a/drivers/media/video/cx88/cx88-dvb.c +++ b/drivers/media/video/cx88/cx88-dvb.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: cx88-dvb.c,v 1.42 2005/07/12 15:44:55 mkrufky Exp $ | 2 | * $Id: cx88-dvb.c,v 1.58 2005/08/07 09:24:08 mkrufky Exp $ |
3 | * | 3 | * |
4 | * device driver for Conexant 2388x based TV cards | 4 | * device driver for Conexant 2388x based TV cards |
5 | * MPEG Transport Stream (DVB) routines | 5 | * MPEG Transport Stream (DVB) routines |
@@ -29,27 +29,23 @@ | |||
29 | #include <linux/kthread.h> | 29 | #include <linux/kthread.h> |
30 | #include <linux/file.h> | 30 | #include <linux/file.h> |
31 | #include <linux/suspend.h> | 31 | #include <linux/suspend.h> |
32 | 32 | #include <linux/config.h> | |
33 | #define CONFIG_DVB_MT352 1 | ||
34 | #define CONFIG_DVB_CX22702 1 | ||
35 | #define CONFIG_DVB_OR51132 1 | ||
36 | #define CONFIG_DVB_LGDT3302 1 | ||
37 | 33 | ||
38 | #include "cx88.h" | 34 | #include "cx88.h" |
39 | #include "dvb-pll.h" | 35 | #include "dvb-pll.h" |
40 | 36 | ||
41 | #if CONFIG_DVB_MT352 | 37 | #ifdef HAVE_MT352 |
42 | # include "mt352.h" | 38 | # include "mt352.h" |
43 | # include "mt352_priv.h" | 39 | # include "mt352_priv.h" |
44 | #endif | 40 | #endif |
45 | #if CONFIG_DVB_CX22702 | 41 | #ifdef HAVE_CX22702 |
46 | # include "cx22702.h" | 42 | # include "cx22702.h" |
47 | #endif | 43 | #endif |
48 | #if CONFIG_DVB_OR51132 | 44 | #ifdef HAVE_OR51132 |
49 | # include "or51132.h" | 45 | # include "or51132.h" |
50 | #endif | 46 | #endif |
51 | #if CONFIG_DVB_LGDT3302 | 47 | #ifdef HAVE_LGDT330X |
52 | # include "lgdt3302.h" | 48 | # include "lgdt330x.h" |
53 | #endif | 49 | #endif |
54 | 50 | ||
55 | MODULE_DESCRIPTION("driver for cx2388x based DVB cards"); | 51 | MODULE_DESCRIPTION("driver for cx2388x based DVB cards"); |
@@ -107,7 +103,7 @@ static struct videobuf_queue_ops dvb_qops = { | |||
107 | 103 | ||
108 | /* ------------------------------------------------------------------ */ | 104 | /* ------------------------------------------------------------------ */ |
109 | 105 | ||
110 | #if CONFIG_DVB_MT352 | 106 | #ifdef HAVE_MT352 |
111 | static int dvico_fusionhdtv_demod_init(struct dvb_frontend* fe) | 107 | static int dvico_fusionhdtv_demod_init(struct dvb_frontend* fe) |
112 | { | 108 | { |
113 | static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x39 }; | 109 | static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x39 }; |
@@ -177,7 +173,7 @@ static struct mt352_config dntv_live_dvbt_config = { | |||
177 | }; | 173 | }; |
178 | #endif | 174 | #endif |
179 | 175 | ||
180 | #if CONFIG_DVB_CX22702 | 176 | #ifdef HAVE_CX22702 |
181 | static struct cx22702_config connexant_refboard_config = { | 177 | static struct cx22702_config connexant_refboard_config = { |
182 | .demod_address = 0x43, | 178 | .demod_address = 0x43, |
183 | .output_mode = CX22702_SERIAL_OUTPUT, | 179 | .output_mode = CX22702_SERIAL_OUTPUT, |
@@ -193,7 +189,7 @@ static struct cx22702_config hauppauge_novat_config = { | |||
193 | }; | 189 | }; |
194 | #endif | 190 | #endif |
195 | 191 | ||
196 | #if CONFIG_DVB_OR51132 | 192 | #ifdef HAVE_OR51132 |
197 | static int or51132_set_ts_param(struct dvb_frontend* fe, | 193 | static int or51132_set_ts_param(struct dvb_frontend* fe, |
198 | int is_punctured) | 194 | int is_punctured) |
199 | { | 195 | { |
@@ -210,8 +206,45 @@ static struct or51132_config pchdtv_hd3000 = { | |||
210 | }; | 206 | }; |
211 | #endif | 207 | #endif |
212 | 208 | ||
213 | #if CONFIG_DVB_LGDT3302 | 209 | #ifdef HAVE_LGDT330X |
214 | static int lgdt3302_set_ts_param(struct dvb_frontend* fe, int is_punctured) | 210 | static int lgdt330x_pll_set(struct dvb_frontend* fe, |
211 | struct dvb_frontend_parameters* params) | ||
212 | { | ||
213 | struct cx8802_dev *dev= fe->dvb->priv; | ||
214 | u8 buf[4]; | ||
215 | struct i2c_msg msg = | ||
216 | { .addr = dev->core->pll_addr, .flags = 0, .buf = buf, .len = 4 }; | ||
217 | int err; | ||
218 | |||
219 | dvb_pll_configure(dev->core->pll_desc, buf, params->frequency, 0); | ||
220 | dprintk(1, "%s: tuner at 0x%02x bytes: 0x%02x 0x%02x 0x%02x 0x%02x\n", | ||
221 | __FUNCTION__, msg.addr, buf[0],buf[1],buf[2],buf[3]); | ||
222 | if ((err = i2c_transfer(&dev->core->i2c_adap, &msg, 1)) != 1) { | ||
223 | printk(KERN_WARNING "cx88-dvb: %s error " | ||
224 | "(addr %02x <- %02x, err = %i)\n", | ||
225 | __FUNCTION__, buf[0], buf[1], err); | ||
226 | if (err < 0) | ||
227 | return err; | ||
228 | else | ||
229 | return -EREMOTEIO; | ||
230 | } | ||
231 | return 0; | ||
232 | } | ||
233 | |||
234 | static int lgdt330x_pll_rf_set(struct dvb_frontend* fe, int index) | ||
235 | { | ||
236 | struct cx8802_dev *dev= fe->dvb->priv; | ||
237 | struct cx88_core *core = dev->core; | ||
238 | |||
239 | dprintk(1, "%s: index = %d\n", __FUNCTION__, index); | ||
240 | if (index == 0) | ||
241 | cx_clear(MO_GP0_IO, 8); | ||
242 | else | ||
243 | cx_set(MO_GP0_IO, 8); | ||
244 | return 0; | ||
245 | } | ||
246 | |||
247 | static int lgdt330x_set_ts_param(struct dvb_frontend* fe, int is_punctured) | ||
215 | { | 248 | { |
216 | struct cx8802_dev *dev= fe->dvb->priv; | 249 | struct cx8802_dev *dev= fe->dvb->priv; |
217 | if (is_punctured) | 250 | if (is_punctured) |
@@ -221,18 +254,12 @@ static int lgdt3302_set_ts_param(struct dvb_frontend* fe, int is_punctured) | |||
221 | return 0; | 254 | return 0; |
222 | } | 255 | } |
223 | 256 | ||
224 | static struct lgdt3302_config fusionhdtv_3_gold_q = { | 257 | static struct lgdt330x_config fusionhdtv_3_gold = { |
225 | .demod_address = 0x0e, | ||
226 | .pll_address = 0x61, | ||
227 | .pll_desc = &dvb_pll_microtune_4042, | ||
228 | .set_ts_params = lgdt3302_set_ts_param, | ||
229 | }; | ||
230 | |||
231 | static struct lgdt3302_config fusionhdtv_3_gold_t = { | ||
232 | .demod_address = 0x0e, | 258 | .demod_address = 0x0e, |
233 | .pll_address = 0x61, | 259 | .demod_chip = LGDT3302, |
234 | .pll_desc = &dvb_pll_thomson_dtt7611, | 260 | .serial_mpeg = 0x04, /* TPSERIAL for 3302 in TOP_CONTROL */ |
235 | .set_ts_params = lgdt3302_set_ts_param, | 261 | .pll_set = lgdt330x_pll_set, |
262 | .set_ts_params = lgdt330x_set_ts_param, | ||
236 | }; | 263 | }; |
237 | #endif | 264 | #endif |
238 | 265 | ||
@@ -244,7 +271,7 @@ static int dvb_register(struct cx8802_dev *dev) | |||
244 | 271 | ||
245 | /* init frontend */ | 272 | /* init frontend */ |
246 | switch (dev->core->board) { | 273 | switch (dev->core->board) { |
247 | #if CONFIG_DVB_CX22702 | 274 | #ifdef HAVE_CX22702 |
248 | case CX88_BOARD_HAUPPAUGE_DVB_T1: | 275 | case CX88_BOARD_HAUPPAUGE_DVB_T1: |
249 | dev->dvb.frontend = cx22702_attach(&hauppauge_novat_config, | 276 | dev->dvb.frontend = cx22702_attach(&hauppauge_novat_config, |
250 | &dev->core->i2c_adap); | 277 | &dev->core->i2c_adap); |
@@ -255,7 +282,7 @@ static int dvb_register(struct cx8802_dev *dev) | |||
255 | &dev->core->i2c_adap); | 282 | &dev->core->i2c_adap); |
256 | break; | 283 | break; |
257 | #endif | 284 | #endif |
258 | #if CONFIG_DVB_MT352 | 285 | #ifdef HAVE_MT352 |
259 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1: | 286 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1: |
260 | dev->core->pll_addr = 0x61; | 287 | dev->core->pll_addr = 0x61; |
261 | dev->core->pll_desc = &dvb_pll_lg_z201; | 288 | dev->core->pll_desc = &dvb_pll_lg_z201; |
@@ -277,13 +304,13 @@ static int dvb_register(struct cx8802_dev *dev) | |||
277 | &dev->core->i2c_adap); | 304 | &dev->core->i2c_adap); |
278 | break; | 305 | break; |
279 | #endif | 306 | #endif |
280 | #if CONFIG_DVB_OR51132 | 307 | #ifdef HAVE_OR51132 |
281 | case CX88_BOARD_PCHDTV_HD3000: | 308 | case CX88_BOARD_PCHDTV_HD3000: |
282 | dev->dvb.frontend = or51132_attach(&pchdtv_hd3000, | 309 | dev->dvb.frontend = or51132_attach(&pchdtv_hd3000, |
283 | &dev->core->i2c_adap); | 310 | &dev->core->i2c_adap); |
284 | break; | 311 | break; |
285 | #endif | 312 | #endif |
286 | #if CONFIG_DVB_LGDT3302 | 313 | #ifdef HAVE_LGDT330X |
287 | case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q: | 314 | case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q: |
288 | dev->ts_gen_cntrl = 0x08; | 315 | dev->ts_gen_cntrl = 0x08; |
289 | { | 316 | { |
@@ -292,9 +319,14 @@ static int dvb_register(struct cx8802_dev *dev) | |||
292 | 319 | ||
293 | cx_clear(MO_GP0_IO, 1); | 320 | cx_clear(MO_GP0_IO, 1); |
294 | mdelay(100); | 321 | mdelay(100); |
295 | cx_set(MO_GP0_IO, 9); // ANT connector too FIXME | 322 | cx_set(MO_GP0_IO, 1); |
296 | mdelay(200); | 323 | mdelay(200); |
297 | dev->dvb.frontend = lgdt3302_attach(&fusionhdtv_3_gold_q, | 324 | |
325 | /* Select RF connector callback */ | ||
326 | fusionhdtv_3_gold.pll_rf_set = lgdt330x_pll_rf_set; | ||
327 | dev->core->pll_addr = 0x61; | ||
328 | dev->core->pll_desc = &dvb_pll_microtune_4042; | ||
329 | dev->dvb.frontend = lgdt330x_attach(&fusionhdtv_3_gold, | ||
298 | &dev->core->i2c_adap); | 330 | &dev->core->i2c_adap); |
299 | } | 331 | } |
300 | break; | 332 | break; |
@@ -306,9 +338,11 @@ static int dvb_register(struct cx8802_dev *dev) | |||
306 | 338 | ||
307 | cx_clear(MO_GP0_IO, 1); | 339 | cx_clear(MO_GP0_IO, 1); |
308 | mdelay(100); | 340 | mdelay(100); |
309 | cx_set(MO_GP0_IO, 9); /* ANT connector too FIXME */ | 341 | cx_set(MO_GP0_IO, 9); |
310 | mdelay(200); | 342 | mdelay(200); |
311 | dev->dvb.frontend = lgdt3302_attach(&fusionhdtv_3_gold_t, | 343 | dev->core->pll_addr = 0x61; |
344 | dev->core->pll_desc = &dvb_pll_thomson_dtt7611; | ||
345 | dev->dvb.frontend = lgdt330x_attach(&fusionhdtv_3_gold, | ||
312 | &dev->core->i2c_adap); | 346 | &dev->core->i2c_adap); |
313 | } | 347 | } |
314 | break; | 348 | break; |