diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/common/tuners/mt2063.c | 2 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-usb/az6007.c | 174 |
2 files changed, 104 insertions, 72 deletions
diff --git a/drivers/media/common/tuners/mt2063.c b/drivers/media/common/tuners/mt2063.c index c89af3cd5eba..7bbf25da3efe 100644 --- a/drivers/media/common/tuners/mt2063.c +++ b/drivers/media/common/tuners/mt2063.c | |||
@@ -350,7 +350,7 @@ static int MT2063_Sleep(struct dvb_frontend *fe) | |||
350 | /* | 350 | /* |
351 | * ToDo: Add code here to implement a OS blocking | 351 | * ToDo: Add code here to implement a OS blocking |
352 | */ | 352 | */ |
353 | msleep(10); | 353 | msleep(100); |
354 | 354 | ||
355 | return 0; | 355 | return 0; |
356 | } | 356 | } |
diff --git a/drivers/media/dvb/dvb-usb/az6007.c b/drivers/media/dvb/dvb-usb/az6007.c index cd5dd4cecd0b..5873759f5db4 100644 --- a/drivers/media/dvb/dvb-usb/az6007.c +++ b/drivers/media/dvb/dvb-usb/az6007.c | |||
@@ -8,6 +8,10 @@ | |||
8 | #include "mt2063.h" | 8 | #include "mt2063.h" |
9 | #include "dvb_ca_en50221.h" | 9 | #include "dvb_ca_en50221.h" |
10 | 10 | ||
11 | /* HACK: Should be moved to the right place */ | ||
12 | #define USB_PID_AZUREWAVE_6007 0xccd | ||
13 | #define USB_PID_TERRATEC_H7 0x10b4 | ||
14 | |||
11 | /* debug */ | 15 | /* debug */ |
12 | int dvb_usb_az6007_debug; | 16 | int dvb_usb_az6007_debug; |
13 | module_param_named(debug,dvb_usb_az6007_debug, int, 0644); | 17 | module_param_named(debug,dvb_usb_az6007_debug, int, 0644); |
@@ -28,30 +32,39 @@ struct az6007_device_state { | |||
28 | struct dvb_ca_en50221 ca; | 32 | struct dvb_ca_en50221 ca; |
29 | struct mutex ca_mutex; | 33 | struct mutex ca_mutex; |
30 | u8 power_state; | 34 | u8 power_state; |
31 | }; | ||
32 | 35 | ||
33 | struct drxk3913_config az6007_drxk3913_config_DVBT = { | 36 | /* Due to DRX-K - probably need changes */ |
34 | .demod_address = 0x52, | 37 | int (*gate_ctrl)(struct dvb_frontend *, int); |
35 | .min_delay_ms = 100, | 38 | struct semaphore pll_mutex; |
36 | .standard = MTTUNEA_DVBT, | 39 | bool dont_attach_fe1; |
37 | .set_tuner = mt2063_setTune, | ||
38 | .tuner_getlocked = mt2063_lockStatus, | ||
39 | .tuner_MT2063_Open = tuner_MT2063_Open, | ||
40 | .tuner_MT2063_SoftwareShutdown = tuner_MT2063_SoftwareShutdown, | ||
41 | .tuner_MT2063_ClearPowerMaskBits = tuner_MT2063_ClearPowerMaskBits, | ||
42 | }; | 40 | }; |
43 | 41 | ||
44 | struct drxk3913_config az6007_drxk3913_config_DVBC = { | 42 | struct drxk_config terratec_h7_drxk = { |
45 | .demod_address = 0x52, | 43 | .adr = 0x29, |
46 | .min_delay_ms = 100, | 44 | .single_master = 1, |
47 | .standard = MTTUNEA_DVBC, | 45 | .no_i2c_bridge = 1, |
48 | .set_tuner = mt2063_setTune, | 46 | .microcode_name = "dvb-usb-terratec-h5-drxk.fw", |
49 | .tuner_getlocked = mt2063_lockStatus, | ||
50 | .tuner_MT2063_Open = tuner_MT2063_Open, | ||
51 | .tuner_MT2063_SoftwareShutdown = tuner_MT2063_SoftwareShutdown, | ||
52 | .tuner_MT2063_ClearPowerMaskBits = tuner_MT2063_ClearPowerMaskBits, | ||
53 | }; | 47 | }; |
54 | 48 | ||
49 | static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable) | ||
50 | { | ||
51 | struct dvb_usb_adapter *adap = fe->sec_priv; | ||
52 | struct az6007_device_state *st = adap->priv; | ||
53 | int status; | ||
54 | |||
55 | if (!adap || !st) | ||
56 | return -EINVAL; | ||
57 | |||
58 | if (enable) { | ||
59 | down(&st->pll_mutex); | ||
60 | status = st->gate_ctrl(fe, 1); | ||
61 | } else { | ||
62 | status = st->gate_ctrl(fe, 0); | ||
63 | up(&st->pll_mutex); | ||
64 | } | ||
65 | return status; | ||
66 | } | ||
67 | |||
55 | struct mt2063_config az6007_mt2063_config = { | 68 | struct mt2063_config az6007_mt2063_config = { |
56 | .tuner_address = 0xc0, | 69 | .tuner_address = 0xc0, |
57 | .refclock = 36125000, | 70 | .refclock = 36125000, |
@@ -87,7 +100,7 @@ static int az6007_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, | |||
87 | { | 100 | { |
88 | int ret; | 101 | int ret; |
89 | 102 | ||
90 | #if 0 | 103 | #if 0 |
91 | int i=0, cyc=0, rem=0; | 104 | int i=0, cyc=0, rem=0; |
92 | cyc = blen/64; | 105 | cyc = blen/64; |
93 | rem = blen%64; | 106 | rem = blen%64; |
@@ -96,7 +109,7 @@ static int az6007_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, | |||
96 | deb_xfer("out: req. %02x, val: %04x, ind: %04x, buffer: ",req,value,index); | 109 | deb_xfer("out: req. %02x, val: %04x, ind: %04x, buffer: ",req,value,index); |
97 | debug_dump(b,blen,deb_xfer); | 110 | debug_dump(b,blen,deb_xfer); |
98 | 111 | ||
99 | 112 | ||
100 | #if 0 | 113 | #if 0 |
101 | if (blen>64) | 114 | if (blen>64) |
102 | { | 115 | { |
@@ -110,7 +123,7 @@ static int az6007_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, | |||
110 | 5000)) != 64) { | 123 | 5000)) != 64) { |
111 | warn("usb out operation failed. (%d)",ret); | 124 | warn("usb out operation failed. (%d)",ret); |
112 | return -EIO; | 125 | return -EIO; |
113 | } | 126 | } |
114 | } | 127 | } |
115 | 128 | ||
116 | if (rem>0) | 129 | if (rem>0) |
@@ -127,7 +140,7 @@ static int az6007_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, | |||
127 | } | 140 | } |
128 | } | 141 | } |
129 | else | 142 | else |
130 | #endif | 143 | #endif |
131 | { | 144 | { |
132 | if ((ret = usb_control_msg(d->udev, | 145 | if ((ret = usb_control_msg(d->udev, |
133 | usb_sndctrlpipe(d->udev,0), | 146 | usb_sndctrlpipe(d->udev,0), |
@@ -139,7 +152,7 @@ static int az6007_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, | |||
139 | return -EIO; | 152 | return -EIO; |
140 | } | 153 | } |
141 | } | 154 | } |
142 | 155 | ||
143 | return 0; | 156 | return 0; |
144 | } | 157 | } |
145 | 158 | ||
@@ -149,9 +162,9 @@ static int az6007_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) | |||
149 | } | 162 | } |
150 | 163 | ||
151 | /* keys for the enclosed remote control */ | 164 | /* keys for the enclosed remote control */ |
152 | static struct dvb_usb_rc_key az6007_rc_keys[] = { | 165 | struct rc_map_table rc_map_az6007_table[] = { |
153 | { 0x00, 0x01, KEY_1 }, | 166 | { 0x0001, KEY_1 }, |
154 | { 0x00, 0x02, KEY_2 }, | 167 | { 0x0002, KEY_2 }, |
155 | }; | 168 | }; |
156 | 169 | ||
157 | /* remote control stuff (does not work with my box) */ | 170 | /* remote control stuff (does not work with my box) */ |
@@ -163,7 +176,7 @@ static int az6007_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | |||
163 | int i; | 176 | int i; |
164 | 177 | ||
165 | /* remove the following return to enabled remote querying */ | 178 | /* remove the following return to enabled remote querying */ |
166 | 179 | ||
167 | 180 | ||
168 | az6007_usb_in_op(d,READ_REMOTE_REQ,0,0,key,10); | 181 | az6007_usb_in_op(d,READ_REMOTE_REQ,0,0,key,10); |
169 | 182 | ||
@@ -257,7 +270,7 @@ static int az6007_frontend_reset(struct dvb_usb_adapter *adap) | |||
257 | int blen; | 270 | int blen; |
258 | 271 | ||
259 | info("az6007_frontend_reset adap=%p adap->dev=%p\n", adap, adap->dev); | 272 | info("az6007_frontend_reset adap=%p adap->dev=%p\n", adap, adap->dev); |
260 | 273 | ||
261 | //reset demodulator | 274 | //reset demodulator |
262 | req = 0xC0; | 275 | req = 0xC0; |
263 | value = 1;//high | 276 | value = 1;//high |
@@ -268,7 +281,7 @@ static int az6007_frontend_reset(struct dvb_usb_adapter *adap) | |||
268 | err("az6007_frontend_reset failed 1 !!!"); | 281 | err("az6007_frontend_reset failed 1 !!!"); |
269 | return -EIO; | 282 | return -EIO; |
270 | } | 283 | } |
271 | 284 | ||
272 | req = 0xC0; | 285 | req = 0xC0; |
273 | value = 0;//low | 286 | value = 0;//low |
274 | index = 3; | 287 | index = 3; |
@@ -290,11 +303,11 @@ static int az6007_frontend_reset(struct dvb_usb_adapter *adap) | |||
290 | err("az6007_frontend_reset failed 3 !!!"); | 303 | err("az6007_frontend_reset failed 3 !!!"); |
291 | return -EIO; | 304 | return -EIO; |
292 | } | 305 | } |
293 | 306 | ||
294 | msleep_interruptible(200); | 307 | msleep_interruptible(200); |
295 | 308 | ||
296 | info("reset az6007 frontend\n"); | 309 | info("reset az6007 frontend\n"); |
297 | 310 | ||
298 | return 0; | 311 | return 0; |
299 | } | 312 | } |
300 | 313 | ||
@@ -350,38 +363,55 @@ static int az6007_frontend_tsbypass(struct dvb_usb_adapter *adap,int onoff) | |||
350 | 363 | ||
351 | static int az6007_frontend_attach(struct dvb_usb_adapter *adap) | 364 | static int az6007_frontend_attach(struct dvb_usb_adapter *adap) |
352 | { | 365 | { |
366 | struct az6007_device_state *st = adap->priv; | ||
367 | |||
368 | int result; | ||
369 | |||
353 | az6007_frontend_poweron(adap); | 370 | az6007_frontend_poweron(adap); |
354 | az6007_frontend_reset(adap); | 371 | az6007_frontend_reset(adap); |
355 | 372 | ||
356 | info("az6007_frontend_attach\n"); | 373 | info("az6007_frontend_attach\n"); |
357 | 374 | ||
358 | if (az6007_type == 0) | 375 | adap->fe = dvb_attach(drxk_attach, &terratec_h7_drxk, |
359 | { | 376 | &adap->dev->i2c_adap, &adap->fe2); |
360 | info("az6007_drxk3913_config_DVBT\n"); | 377 | if (!adap->fe) { |
361 | adap->fe = drxk3913_attach(&az6007_drxk3913_config_DVBT, &adap->dev->i2c_adap); | 378 | result = -EINVAL; |
379 | goto out_free; | ||
362 | } | 380 | } |
363 | else | 381 | |
364 | { | 382 | /* FIXME: do we need a pll semaphore? */ |
365 | info("az6007_drxk3913_config_DVBC\n"); | 383 | adap->fe->sec_priv = adap; |
366 | adap->fe = drxk3913_attach(&az6007_drxk3913_config_DVBC, &adap->dev->i2c_adap); | 384 | sema_init(&st->pll_mutex, 1); |
367 | } | 385 | st->gate_ctrl = adap->fe->ops.i2c_gate_ctrl; |
368 | if (adap->fe) { | 386 | adap->fe->ops.i2c_gate_ctrl = drxk_gate_ctrl; |
369 | if (mt2063_attach(adap->fe, &az6007_mt2063_config, &adap->dev->i2c_adap)) { | 387 | adap->fe2->id = 1; |
370 | info("found STB6100 DVB-C/DVB-T frontend @0x%02x\n",az6007_mt2063_config.tuner_address); | 388 | |
371 | 389 | /* Attach mt2063 to DVB-C frontend */ | |
372 | //vp6027_ci_init(adap); | 390 | if (adap->fe->ops.i2c_gate_ctrl) |
373 | } else { | 391 | adap->fe->ops.i2c_gate_ctrl(adap->fe, 1); |
374 | adap->fe = NULL; | 392 | if (!dvb_attach(mt2063_attach, adap->fe, &az6007_mt2063_config, |
375 | } | 393 | &adap->dev->i2c_adap)) { |
376 | } | 394 | result = -EINVAL; |
377 | else | 395 | |
378 | { | 396 | goto out_free; |
379 | adap->fe = NULL; | ||
380 | err("no front-end attached\n"); | ||
381 | } | 397 | } |
382 | //az6007_frontend_tsbypass(adap,0); | 398 | if (adap->fe->ops.i2c_gate_ctrl) |
383 | 399 | adap->fe->ops.i2c_gate_ctrl(adap->fe, 0); | |
400 | |||
401 | /* Hack - needed due to drxk */ | ||
402 | adap->fe2->tuner_priv = adap->fe->tuner_priv; | ||
403 | memcpy(&adap->fe2->ops.tuner_ops, | ||
404 | &adap->fe->ops.tuner_ops, | ||
405 | sizeof(adap->fe->ops.tuner_ops)); | ||
384 | return 0; | 406 | return 0; |
407 | |||
408 | out_free: | ||
409 | if (adap->fe) | ||
410 | dvb_frontend_detach(adap->fe); | ||
411 | adap->fe = NULL; | ||
412 | adap->fe2 = NULL; | ||
413 | |||
414 | return result; | ||
385 | } | 415 | } |
386 | 416 | ||
387 | static struct dvb_usb_device_properties az6007_properties; | 417 | static struct dvb_usb_device_properties az6007_properties; |
@@ -403,7 +433,7 @@ static int az6007_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num | |||
403 | int length; | 433 | int length; |
404 | u8 req; | 434 | u8 req; |
405 | u8 data[512]; | 435 | u8 data[512]; |
406 | 436 | ||
407 | if (mutex_lock_interruptible(&d->i2c_mutex) < 0) | 437 | if (mutex_lock_interruptible(&d->i2c_mutex) < 0) |
408 | return -EAGAIN; | 438 | return -EAGAIN; |
409 | if (num > 2) | 439 | if (num > 2) |
@@ -442,7 +472,7 @@ static int az6007_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num | |||
442 | //printk("Tuner Tuner ReadDATA len=%d ", len); | 472 | //printk("Tuner Tuner ReadDATA len=%d ", len); |
443 | for (j=0; j<len; j++) | 473 | for (j=0; j<len; j++) |
444 | { | 474 | { |
445 | msg[1].buf[j] = data[j+5]; | 475 | msg[1].buf[j] = data[j+5]; |
446 | //printk("data[%d]=%02x ", j, data[j+5]); | 476 | //printk("data[%d]=%02x ", j, data[j+5]); |
447 | } | 477 | } |
448 | //printk("\n"); | 478 | //printk("\n"); |
@@ -458,13 +488,13 @@ static int az6007_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num | |||
458 | value = msg[0].addr | (1<<8); | 488 | value = msg[0].addr | (1<<8); |
459 | length = msg[0].len - 1; | 489 | length = msg[0].len - 1; |
460 | len = msg[0].len - 1; | 490 | len = msg[0].len - 1; |
461 | //printk("Demodulator WriteDATA len=%d ", len); | 491 | //printk("Demodulator WriteDATA len=%d ", len); |
462 | for(j=0;j<len;j++) | 492 | for(j=0;j<len;j++) |
463 | { | 493 | { |
464 | data[j] = msg[0].buf[j+1]; | 494 | data[j] = msg[0].buf[j+1]; |
465 | //printk("data[%d]=%02x ", j, data[j]); | 495 | //printk("data[%d]=%02x ", j, data[j]); |
466 | } | 496 | } |
467 | //printk("\n"); | 497 | //printk("\n"); |
468 | ret = az6007_usb_out_op(d,req,value,index,data,length); | 498 | ret = az6007_usb_out_op(d,req,value,index,data,length); |
469 | } | 499 | } |
470 | else //read | 500 | else //read |
@@ -479,7 +509,7 @@ static int az6007_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num | |||
479 | //printk("Demodulator ReadDATA len=%d ", len); | 509 | //printk("Demodulator ReadDATA len=%d ", len); |
480 | for (j=0; j<len; j++) | 510 | for (j=0; j<len; j++) |
481 | { | 511 | { |
482 | msg[0].buf[j] = data[j+5]; | 512 | msg[0].buf[j] = data[j+5]; |
483 | //printk("data[%d]=%02x ", j, data[j+5]); | 513 | //printk("data[%d]=%02x ", j, data[j+5]); |
484 | } | 514 | } |
485 | //printk("\n"); | 515 | //printk("\n"); |
@@ -521,10 +551,10 @@ int az6007_identify_state(struct usb_device *udev, struct dvb_usb_device_propert | |||
521 | static int az6007_usb_probe(struct usb_interface *intf, | 551 | static int az6007_usb_probe(struct usb_interface *intf, |
522 | const struct usb_device_id *id) | 552 | const struct usb_device_id *id) |
523 | { | 553 | { |
524 | az6007_led_on_off(intf, 0); | 554 | az6007_led_on_off(intf, 0); |
525 | 555 | ||
526 | return dvb_usb_device_init(intf, &az6007_properties, | 556 | return dvb_usb_device_init(intf, &az6007_properties, |
527 | THIS_MODULE, NULL, adapter_nr); | 557 | THIS_MODULE, NULL, adapter_nr); |
528 | } | 558 | } |
529 | 559 | ||
530 | static struct usb_device_id az6007_usb_table [] = { | 560 | static struct usb_device_id az6007_usb_table [] = { |
@@ -569,10 +599,12 @@ static struct dvb_usb_device_properties az6007_properties = { | |||
569 | //.power_ctrl = az6007_power_ctrl, | 599 | //.power_ctrl = az6007_power_ctrl, |
570 | .read_mac_address = az6007_read_mac_addr, | 600 | .read_mac_address = az6007_read_mac_addr, |
571 | 601 | ||
572 | .rc_key_map = az6007_rc_keys, | 602 | .rc.legacy = { |
573 | .rc_key_map_size = ARRAY_SIZE(az6007_rc_keys), | 603 | .rc_map_table = rc_map_az6007_table, |
574 | .rc_interval = 400, | 604 | .rc_map_size = ARRAY_SIZE(rc_map_az6007_table), |
575 | .rc_query = az6007_rc_query, | 605 | .rc_interval = 400, |
606 | .rc_query = az6007_rc_query, | ||
607 | }, | ||
576 | .i2c_algo = &az6007_i2c_algo, | 608 | .i2c_algo = &az6007_i2c_algo, |
577 | 609 | ||
578 | .num_device_descs = 2, | 610 | .num_device_descs = 2, |
@@ -585,10 +617,10 @@ static struct dvb_usb_device_properties az6007_properties = { | |||
585 | .cold_ids = { &az6007_usb_table[1], NULL }, | 617 | .cold_ids = { &az6007_usb_table[1], NULL }, |
586 | .warm_ids = { NULL }, | 618 | .warm_ids = { NULL }, |
587 | }, | 619 | }, |
588 | { NULL }, | 620 | { NULL }, |
589 | } | 621 | } |
590 | }; | 622 | }; |
591 | 623 | ||
592 | /* usb specific object needed to register this driver with the usb subsystem */ | 624 | /* usb specific object needed to register this driver with the usb subsystem */ |
593 | static struct usb_driver az6007_usb_driver = { | 625 | static struct usb_driver az6007_usb_driver = { |
594 | .name = "dvb_usb_az6007", | 626 | .name = "dvb_usb_az6007", |