aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/common/tuners/mt2063.c2
-rw-r--r--drivers/media/dvb/dvb-usb/az6007.c174
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 */
12int dvb_usb_az6007_debug; 16int dvb_usb_az6007_debug;
13module_param_named(debug,dvb_usb_az6007_debug, int, 0644); 17module_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
33struct 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
44struct drxk3913_config az6007_drxk3913_config_DVBC = { 42struct 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
49static 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
55struct mt2063_config az6007_mt2063_config = { 68struct 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 */
152static struct dvb_usb_rc_key az6007_rc_keys[] = { 165struct 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
351static int az6007_frontend_attach(struct dvb_usb_adapter *adap) 364static 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
408out_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
387static struct dvb_usb_device_properties az6007_properties; 417static 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
521static int az6007_usb_probe(struct usb_interface *intf, 551static 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
530static struct usb_device_id az6007_usb_table [] = { 560static 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 */
593static struct usb_driver az6007_usb_driver = { 625static struct usb_driver az6007_usb_driver = {
594 .name = "dvb_usb_az6007", 626 .name = "dvb_usb_az6007",