aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2011-07-21 17:31:14 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-01-21 10:44:33 -0500
commit6da347065062d28de035c01b298c6aebab2723fb (patch)
tree425f1f8164f992b5ee3a543f30e1f478b3178480
parent71d676345698b275955b2584803ae550972249e5 (diff)
[media] az6007: Fix compilation troubles at az6007
Some changes are needed, in order to make az6007 compile with the upstream tree. Most of the changes are due to the upstream drxk module. Even allowing its compilation, the driver is not working yet. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-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",