V4L/DVB (6578): dvb-usb: make some debug vars static
[pandora-kernel.git] / drivers / media / dvb / dvb-usb / cxusb.c
1 /* DVB USB compliant linux driver for Conexant USB reference design.
2  *
3  * The Conexant reference design I saw on their website was only for analogue
4  * capturing (using the cx25842). The box I took to write this driver (reverse
5  * engineered) is the one labeled Medion MD95700. In addition to the cx25842
6  * for analogue capturing it also has a cx22702 DVB-T demodulator on the main
7  * board. Besides it has a atiremote (X10) and a USB2.0 hub onboard.
8  *
9  * Maybe it is a little bit premature to call this driver cxusb, but I assume
10  * the USB protocol is identical or at least inherited from the reference
11  * design, so it can be reused for the "analogue-only" device (if it will
12  * appear at all).
13  *
14  * TODO: Use the cx25840-driver for the analogue part
15  *
16  * Copyright (C) 2005 Patrick Boettcher (patrick.boettcher@desy.de)
17  * Copyright (C) 2006 Michael Krufky (mkrufky@linuxtv.org)
18  * Copyright (C) 2006 Chris Pascoe (c.pascoe@itee.uq.edu.au)
19  *
20  *   This program is free software; you can redistribute it and/or modify it
21  *   under the terms of the GNU General Public License as published by the Free
22  *   Software Foundation, version 2.
23  *
24  * see Documentation/dvb/README.dvb-usb for more information
25  */
26 #include "cxusb.h"
27
28 #include "cx22702.h"
29 #include "lgdt330x.h"
30 #include "mt352.h"
31 #include "mt352_priv.h"
32 #include "zl10353.h"
33
34 /* debug */
35 static int dvb_usb_cxusb_debug;
36 module_param_named(debug, dvb_usb_cxusb_debug, int, 0644);
37 MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS);
38 #define deb_info(args...)   dprintk(dvb_usb_cxusb_debug,0x01,args)
39 #define deb_i2c(args...)    if (d->udev->descriptor.idVendor == USB_VID_MEDION) \
40                                 dprintk(dvb_usb_cxusb_debug,0x01,args)
41
42 static int cxusb_ctrl_msg(struct dvb_usb_device *d,
43                           u8 cmd, u8 *wbuf, int wlen, u8 *rbuf, int rlen)
44 {
45         int wo = (rbuf == NULL || rlen == 0); /* write-only */
46         u8 sndbuf[1+wlen];
47         memset(sndbuf, 0, 1+wlen);
48
49         sndbuf[0] = cmd;
50         memcpy(&sndbuf[1], wbuf, wlen);
51         if (wo)
52                 dvb_usb_generic_write(d, sndbuf, 1+wlen);
53         else
54                 dvb_usb_generic_rw(d, sndbuf, 1+wlen, rbuf, rlen, 0);
55
56         return 0;
57 }
58
59 /* GPIO */
60 static void cxusb_gpio_tuner(struct dvb_usb_device *d, int onoff)
61 {
62         struct cxusb_state *st = d->priv;
63         u8 o[2], i;
64
65         if (st->gpio_write_state[GPIO_TUNER] == onoff)
66                 return;
67
68         o[0] = GPIO_TUNER;
69         o[1] = onoff;
70         cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1);
71
72         if (i != 0x01)
73                 deb_info("gpio_write failed.\n");
74
75         st->gpio_write_state[GPIO_TUNER] = onoff;
76 }
77
78 /* I2C */
79 static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
80                           int num)
81 {
82         struct dvb_usb_device *d = i2c_get_adapdata(adap);
83         int i;
84
85         if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
86                 return -EAGAIN;
87
88         if (num > 2)
89                 warn("more than two i2c messages at a time is not handled yet. TODO.");
90
91         for (i = 0; i < num; i++) {
92
93                 if (d->udev->descriptor.idVendor == USB_VID_MEDION)
94                         switch (msg[i].addr) {
95                         case 0x63:
96                                 cxusb_gpio_tuner(d, 0);
97                                 break;
98                         default:
99                                 cxusb_gpio_tuner(d, 1);
100                                 break;
101                         }
102
103                 /* read request */
104                 if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) {
105                         u8 obuf[3+msg[i].len], ibuf[1+msg[i+1].len];
106                         obuf[0] = msg[i].len;
107                         obuf[1] = msg[i+1].len;
108                         obuf[2] = msg[i].addr;
109                         memcpy(&obuf[3], msg[i].buf, msg[i].len);
110
111                         if (cxusb_ctrl_msg(d, CMD_I2C_READ,
112                                            obuf, 3+msg[i].len,
113                                            ibuf, 1+msg[i+1].len) < 0)
114                                 break;
115
116                         if (ibuf[0] != 0x08)
117                                 deb_i2c("i2c read may have failed\n");
118
119                         memcpy(msg[i+1].buf, &ibuf[1], msg[i+1].len);
120
121                         i++;
122                 } else { /* write */
123                         u8 obuf[2+msg[i].len], ibuf;
124                         obuf[0] = msg[i].addr;
125                         obuf[1] = msg[i].len;
126                         memcpy(&obuf[2], msg[i].buf, msg[i].len);
127
128                         if (cxusb_ctrl_msg(d, CMD_I2C_WRITE, obuf,
129                                            2+msg[i].len, &ibuf,1) < 0)
130                                 break;
131                         if (ibuf != 0x08)
132                                 deb_i2c("i2c write may have failed\n");
133                 }
134         }
135
136         mutex_unlock(&d->i2c_mutex);
137         return i;
138 }
139
140 static u32 cxusb_i2c_func(struct i2c_adapter *adapter)
141 {
142         return I2C_FUNC_I2C;
143 }
144
145 static struct i2c_algorithm cxusb_i2c_algo = {
146         .master_xfer   = cxusb_i2c_xfer,
147         .functionality = cxusb_i2c_func,
148 };
149
150 static int cxusb_power_ctrl(struct dvb_usb_device *d, int onoff)
151 {
152         u8 b = 0;
153         if (onoff)
154                 return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
155         else
156                 return cxusb_ctrl_msg(d, CMD_POWER_OFF, &b, 1, NULL, 0);
157 }
158
159 static int cxusb_bluebird_power_ctrl(struct dvb_usb_device *d, int onoff)
160 {
161         u8 b = 0;
162         if (onoff)
163                 return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
164         else
165                 return 0;
166 }
167
168 static int cxusb_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
169 {
170         u8 buf[2] = { 0x03, 0x00 };
171         if (onoff)
172                 cxusb_ctrl_msg(adap->dev, CMD_STREAMING_ON, buf, 2, NULL, 0);
173         else
174                 cxusb_ctrl_msg(adap->dev, CMD_STREAMING_OFF, NULL, 0, NULL, 0);
175
176         return 0;
177 }
178
179 static int cxusb_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
180 {
181         struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
182         u8 ircode[4];
183         int i;
184
185         cxusb_ctrl_msg(d, CMD_GET_IR_CODE, NULL, 0, ircode, 4);
186
187         *event = 0;
188         *state = REMOTE_NO_KEY_PRESSED;
189
190         for (i = 0; i < d->props.rc_key_map_size; i++) {
191                 if (keymap[i].custom == ircode[2] &&
192                     keymap[i].data == ircode[3]) {
193                         *event = keymap[i].event;
194                         *state = REMOTE_KEY_PRESSED;
195
196                         return 0;
197                 }
198         }
199
200         return 0;
201 }
202
203 static struct dvb_usb_rc_key dvico_mce_rc_keys[] = {
204         { 0xfe, 0x02, KEY_TV },
205         { 0xfe, 0x0e, KEY_MP3 },
206         { 0xfe, 0x1a, KEY_DVD },
207         { 0xfe, 0x1e, KEY_FAVORITES },
208         { 0xfe, 0x16, KEY_SETUP },
209         { 0xfe, 0x46, KEY_POWER2 },
210         { 0xfe, 0x0a, KEY_EPG },
211         { 0xfe, 0x49, KEY_BACK },
212         { 0xfe, 0x4d, KEY_MENU },
213         { 0xfe, 0x51, KEY_UP },
214         { 0xfe, 0x5b, KEY_LEFT },
215         { 0xfe, 0x5f, KEY_RIGHT },
216         { 0xfe, 0x53, KEY_DOWN },
217         { 0xfe, 0x5e, KEY_OK },
218         { 0xfe, 0x59, KEY_INFO },
219         { 0xfe, 0x55, KEY_TAB },
220         { 0xfe, 0x0f, KEY_PREVIOUSSONG },/* Replay */
221         { 0xfe, 0x12, KEY_NEXTSONG },   /* Skip */
222         { 0xfe, 0x42, KEY_ENTER  },     /* Windows/Start */
223         { 0xfe, 0x15, KEY_VOLUMEUP },
224         { 0xfe, 0x05, KEY_VOLUMEDOWN },
225         { 0xfe, 0x11, KEY_CHANNELUP },
226         { 0xfe, 0x09, KEY_CHANNELDOWN },
227         { 0xfe, 0x52, KEY_CAMERA },
228         { 0xfe, 0x5a, KEY_TUNER },      /* Live */
229         { 0xfe, 0x19, KEY_OPEN },
230         { 0xfe, 0x0b, KEY_1 },
231         { 0xfe, 0x17, KEY_2 },
232         { 0xfe, 0x1b, KEY_3 },
233         { 0xfe, 0x07, KEY_4 },
234         { 0xfe, 0x50, KEY_5 },
235         { 0xfe, 0x54, KEY_6 },
236         { 0xfe, 0x48, KEY_7 },
237         { 0xfe, 0x4c, KEY_8 },
238         { 0xfe, 0x58, KEY_9 },
239         { 0xfe, 0x13, KEY_ANGLE },      /* Aspect */
240         { 0xfe, 0x03, KEY_0 },
241         { 0xfe, 0x1f, KEY_ZOOM },
242         { 0xfe, 0x43, KEY_REWIND },
243         { 0xfe, 0x47, KEY_PLAYPAUSE },
244         { 0xfe, 0x4f, KEY_FASTFORWARD },
245         { 0xfe, 0x57, KEY_MUTE },
246         { 0xfe, 0x0d, KEY_STOP },
247         { 0xfe, 0x01, KEY_RECORD },
248         { 0xfe, 0x4e, KEY_POWER },
249 };
250
251 static struct dvb_usb_rc_key dvico_portable_rc_keys[] = {
252         { 0xfc, 0x02, KEY_SETUP },       /* Profile */
253         { 0xfc, 0x43, KEY_POWER2 },
254         { 0xfc, 0x06, KEY_EPG },
255         { 0xfc, 0x5a, KEY_BACK },
256         { 0xfc, 0x05, KEY_MENU },
257         { 0xfc, 0x47, KEY_INFO },
258         { 0xfc, 0x01, KEY_TAB },
259         { 0xfc, 0x42, KEY_PREVIOUSSONG },/* Replay */
260         { 0xfc, 0x49, KEY_VOLUMEUP },
261         { 0xfc, 0x09, KEY_VOLUMEDOWN },
262         { 0xfc, 0x54, KEY_CHANNELUP },
263         { 0xfc, 0x0b, KEY_CHANNELDOWN },
264         { 0xfc, 0x16, KEY_CAMERA },
265         { 0xfc, 0x40, KEY_TUNER },      /* ATV/DTV */
266         { 0xfc, 0x45, KEY_OPEN },
267         { 0xfc, 0x19, KEY_1 },
268         { 0xfc, 0x18, KEY_2 },
269         { 0xfc, 0x1b, KEY_3 },
270         { 0xfc, 0x1a, KEY_4 },
271         { 0xfc, 0x58, KEY_5 },
272         { 0xfc, 0x59, KEY_6 },
273         { 0xfc, 0x15, KEY_7 },
274         { 0xfc, 0x14, KEY_8 },
275         { 0xfc, 0x17, KEY_9 },
276         { 0xfc, 0x44, KEY_ANGLE },      /* Aspect */
277         { 0xfc, 0x55, KEY_0 },
278         { 0xfc, 0x07, KEY_ZOOM },
279         { 0xfc, 0x0a, KEY_REWIND },
280         { 0xfc, 0x08, KEY_PLAYPAUSE },
281         { 0xfc, 0x4b, KEY_FASTFORWARD },
282         { 0xfc, 0x5b, KEY_MUTE },
283         { 0xfc, 0x04, KEY_STOP },
284         { 0xfc, 0x56, KEY_RECORD },
285         { 0xfc, 0x57, KEY_POWER },
286         { 0xfc, 0x41, KEY_UNKNOWN },    /* INPUT */
287         { 0xfc, 0x00, KEY_UNKNOWN },    /* HD */
288 };
289
290 static int cxusb_dee1601_demod_init(struct dvb_frontend* fe)
291 {
292         static u8 clock_config []  = { CLOCK_CTL,  0x38, 0x28 };
293         static u8 reset []         = { RESET,      0x80 };
294         static u8 adc_ctl_1_cfg [] = { ADC_CTL_1,  0x40 };
295         static u8 agc_cfg []       = { AGC_TARGET, 0x28, 0x20 };
296         static u8 gpp_ctl_cfg []   = { GPP_CTL,    0x33 };
297         static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
298
299         mt352_write(fe, clock_config,   sizeof(clock_config));
300         udelay(200);
301         mt352_write(fe, reset,          sizeof(reset));
302         mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
303
304         mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
305         mt352_write(fe, gpp_ctl_cfg,    sizeof(gpp_ctl_cfg));
306         mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
307
308         return 0;
309 }
310
311 static int cxusb_mt352_demod_init(struct dvb_frontend* fe)
312 {       /* used in both lgz201 and th7579 */
313         static u8 clock_config []  = { CLOCK_CTL,  0x38, 0x29 };
314         static u8 reset []         = { RESET,      0x80 };
315         static u8 adc_ctl_1_cfg [] = { ADC_CTL_1,  0x40 };
316         static u8 agc_cfg []       = { AGC_TARGET, 0x24, 0x20 };
317         static u8 gpp_ctl_cfg []   = { GPP_CTL,    0x33 };
318         static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
319
320         mt352_write(fe, clock_config,   sizeof(clock_config));
321         udelay(200);
322         mt352_write(fe, reset,          sizeof(reset));
323         mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
324
325         mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
326         mt352_write(fe, gpp_ctl_cfg,    sizeof(gpp_ctl_cfg));
327         mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
328         return 0;
329 }
330
331 static struct cx22702_config cxusb_cx22702_config = {
332         .demod_address = 0x63,
333         .output_mode = CX22702_PARALLEL_OUTPUT,
334 };
335
336 static struct lgdt330x_config cxusb_lgdt3303_config = {
337         .demod_address = 0x0e,
338         .demod_chip    = LGDT3303,
339 };
340
341 static struct mt352_config cxusb_dee1601_config = {
342         .demod_address = 0x0f,
343         .demod_init    = cxusb_dee1601_demod_init,
344 };
345
346 static struct zl10353_config cxusb_zl10353_dee1601_config = {
347         .demod_address = 0x0f,
348         .parallel_ts = 1,
349 };
350
351 static struct mt352_config cxusb_mt352_config = {
352         /* used in both lgz201 and th7579 */
353         .demod_address = 0x0f,
354         .demod_init    = cxusb_mt352_demod_init,
355 };
356
357 /* Callbacks for DVB USB */
358 static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
359 {
360         dvb_attach(dvb_pll_attach, adap->fe, 0x61, &adap->dev->i2c_adap,
361                    DVB_PLL_FMD1216ME);
362         return 0;
363 }
364
365 static int cxusb_dee1601_tuner_attach(struct dvb_usb_adapter *adap)
366 {
367         dvb_attach(dvb_pll_attach, adap->fe, 0x61,
368                    NULL, DVB_PLL_THOMSON_DTT7579);
369         return 0;
370 }
371
372 static int cxusb_lgz201_tuner_attach(struct dvb_usb_adapter *adap)
373 {
374         dvb_attach(dvb_pll_attach, adap->fe, 0x61, NULL, DVB_PLL_LG_Z201);
375         return 0;
376 }
377
378 static int cxusb_dtt7579_tuner_attach(struct dvb_usb_adapter *adap)
379 {
380         dvb_attach(dvb_pll_attach, adap->fe, 0x60,
381                    NULL, DVB_PLL_THOMSON_DTT7579);
382         return 0;
383 }
384
385 static int cxusb_lgh064f_tuner_attach(struct dvb_usb_adapter *adap)
386 {
387         dvb_attach(dvb_pll_attach, adap->fe, 0x61, &adap->dev->i2c_adap,
388                    DVB_PLL_LG_TDVS_H06XF);
389         return 0;
390 }
391
392 static int cxusb_cx22702_frontend_attach(struct dvb_usb_adapter *adap)
393 {
394         u8 b;
395         if (usb_set_interface(adap->dev->udev, 0, 6) < 0)
396                 err("set interface failed");
397
398         cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, &b, 1);
399
400         if ((adap->fe = dvb_attach(cx22702_attach, &cxusb_cx22702_config,
401                                    &adap->dev->i2c_adap)) != NULL)
402                 return 0;
403
404         return -EIO;
405 }
406
407 static int cxusb_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
408 {
409         if (usb_set_interface(adap->dev->udev, 0, 7) < 0)
410                 err("set interface failed");
411
412         cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
413
414         if ((adap->fe = dvb_attach(lgdt330x_attach, &cxusb_lgdt3303_config,
415                                    &adap->dev->i2c_adap)) != NULL)
416                 return 0;
417
418         return -EIO;
419 }
420
421 static int cxusb_mt352_frontend_attach(struct dvb_usb_adapter *adap)
422 {
423         /* used in both lgz201 and th7579 */
424         if (usb_set_interface(adap->dev->udev, 0, 0) < 0)
425                 err("set interface failed");
426
427         cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
428
429         if ((adap->fe = dvb_attach(mt352_attach, &cxusb_mt352_config,
430                                    &adap->dev->i2c_adap)) != NULL)
431                 return 0;
432
433         return -EIO;
434 }
435
436 static int cxusb_dee1601_frontend_attach(struct dvb_usb_adapter *adap)
437 {
438         if (usb_set_interface(adap->dev->udev, 0, 0) < 0)
439                 err("set interface failed");
440
441         cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
442
443         if (((adap->fe = dvb_attach(mt352_attach, &cxusb_dee1601_config,
444                                     &adap->dev->i2c_adap)) != NULL) ||
445                 ((adap->fe = dvb_attach(zl10353_attach,
446                                         &cxusb_zl10353_dee1601_config,
447                                         &adap->dev->i2c_adap)) != NULL))
448                 return 0;
449
450         return -EIO;
451 }
452
453 /*
454  * DViCO bluebird firmware needs the "warm" product ID to be patched into the
455  * firmware file before download.
456  */
457
458 #define BLUEBIRD_01_ID_OFFSET 6638
459 static int bluebird_patch_dvico_firmware_download(struct usb_device *udev,
460                                                   const struct firmware *fw)
461 {
462         if (fw->size < BLUEBIRD_01_ID_OFFSET + 4)
463                 return -EINVAL;
464
465         if (fw->data[BLUEBIRD_01_ID_OFFSET] == (USB_VID_DVICO & 0xff) &&
466             fw->data[BLUEBIRD_01_ID_OFFSET + 1] == USB_VID_DVICO >> 8) {
467
468                 fw->data[BLUEBIRD_01_ID_OFFSET + 2] =
469                         le16_to_cpu(udev->descriptor.idProduct) + 1;
470                 fw->data[BLUEBIRD_01_ID_OFFSET + 3] =
471                         le16_to_cpu(udev->descriptor.idProduct) >> 8;
472
473                 return usb_cypress_load_firmware(udev, fw, CYPRESS_FX2);
474         }
475
476         return -EINVAL;
477 }
478
479 /* DVB USB Driver stuff */
480 static struct dvb_usb_device_properties cxusb_medion_properties;
481 static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties;
482 static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties;
483 static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties;
484 static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties;
485
486 static int cxusb_probe(struct usb_interface *intf,
487                        const struct usb_device_id *id)
488 {
489         if (dvb_usb_device_init(intf,&cxusb_medion_properties,THIS_MODULE,NULL) == 0 ||
490                 dvb_usb_device_init(intf,&cxusb_bluebird_lgh064f_properties,THIS_MODULE,NULL) == 0 ||
491                 dvb_usb_device_init(intf,&cxusb_bluebird_dee1601_properties,THIS_MODULE,NULL) == 0 ||
492                 dvb_usb_device_init(intf,&cxusb_bluebird_lgz201_properties,THIS_MODULE,NULL) == 0 ||
493                 dvb_usb_device_init(intf,&cxusb_bluebird_dtt7579_properties,THIS_MODULE,NULL) == 0) {
494                 return 0;
495         }
496
497         return -EINVAL;
498 }
499
500 static struct usb_device_id cxusb_table [] = {
501         { USB_DEVICE(USB_VID_MEDION, USB_PID_MEDION_MD95700) },
502         { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LG064F_COLD) },
503         { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LG064F_WARM) },
504         { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_1_COLD) },
505         { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_1_WARM) },
506         { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LGZ201_COLD) },
507         { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LGZ201_WARM) },
508         { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_TH7579_COLD) },
509         { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_TH7579_WARM) },
510         { USB_DEVICE(USB_VID_DVICO, USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_COLD) },
511         { USB_DEVICE(USB_VID_DVICO, USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_WARM) },
512         { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_2_COLD) },
513         { USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_2_WARM) },
514         {}              /* Terminating entry */
515 };
516 MODULE_DEVICE_TABLE (usb, cxusb_table);
517
518 static struct dvb_usb_device_properties cxusb_medion_properties = {
519         .caps = DVB_USB_IS_AN_I2C_ADAPTER,
520
521         .usb_ctrl = CYPRESS_FX2,
522
523         .size_of_priv     = sizeof(struct cxusb_state),
524
525         .num_adapters = 1,
526         .adapter = {
527                 {
528                         .streaming_ctrl   = cxusb_streaming_ctrl,
529                         .frontend_attach  = cxusb_cx22702_frontend_attach,
530                         .tuner_attach     = cxusb_fmd1216me_tuner_attach,
531                         /* parameter for the MPEG2-data transfer */
532                                         .stream = {
533                                                 .type = USB_BULK,
534                                 .count = 5,
535                                 .endpoint = 0x02,
536                                 .u = {
537                                         .bulk = {
538                                                 .buffersize = 8192,
539                                         }
540                                 }
541                         },
542
543                 },
544         },
545         .power_ctrl       = cxusb_power_ctrl,
546
547         .i2c_algo         = &cxusb_i2c_algo,
548
549         .generic_bulk_ctrl_endpoint = 0x01,
550
551         .num_device_descs = 1,
552         .devices = {
553                 {   "Medion MD95700 (MDUSBTV-HYBRID)",
554                         { NULL },
555                         { &cxusb_table[0], NULL },
556                 },
557         }
558 };
559
560 static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties = {
561         .caps = DVB_USB_IS_AN_I2C_ADAPTER,
562
563         .usb_ctrl          = DEVICE_SPECIFIC,
564         .firmware          = "dvb-usb-bluebird-01.fw",
565         .download_firmware = bluebird_patch_dvico_firmware_download,
566         /* use usb alt setting 0 for EP4 transfer (dvb-t),
567            use usb alt setting 7 for EP2 transfer (atsc) */
568
569         .size_of_priv     = sizeof(struct cxusb_state),
570
571         .num_adapters = 1,
572         .adapter = {
573                 {
574                         .streaming_ctrl   = cxusb_streaming_ctrl,
575                         .frontend_attach  = cxusb_lgdt3303_frontend_attach,
576                         .tuner_attach     = cxusb_lgh064f_tuner_attach,
577
578                         /* parameter for the MPEG2-data transfer */
579                                         .stream = {
580                                                 .type = USB_BULK,
581                                 .count = 5,
582                                 .endpoint = 0x02,
583                                 .u = {
584                                         .bulk = {
585                                                 .buffersize = 8192,
586                                         }
587                                 }
588                         },
589                 },
590         },
591
592         .power_ctrl       = cxusb_bluebird_power_ctrl,
593
594         .i2c_algo         = &cxusb_i2c_algo,
595
596         .rc_interval      = 100,
597         .rc_key_map       = dvico_portable_rc_keys,
598         .rc_key_map_size  = ARRAY_SIZE(dvico_portable_rc_keys),
599         .rc_query         = cxusb_rc_query,
600
601         .generic_bulk_ctrl_endpoint = 0x01,
602
603         .num_device_descs = 1,
604         .devices = {
605                 {   "DViCO FusionHDTV5 USB Gold",
606                         { &cxusb_table[1], NULL },
607                         { &cxusb_table[2], NULL },
608                 },
609         }
610 };
611
612 static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties = {
613         .caps = DVB_USB_IS_AN_I2C_ADAPTER,
614
615         .usb_ctrl          = DEVICE_SPECIFIC,
616         .firmware          = "dvb-usb-bluebird-01.fw",
617         .download_firmware = bluebird_patch_dvico_firmware_download,
618         /* use usb alt setting 0 for EP4 transfer (dvb-t),
619            use usb alt setting 7 for EP2 transfer (atsc) */
620
621         .size_of_priv     = sizeof(struct cxusb_state),
622
623         .num_adapters = 1,
624         .adapter = {
625                 {
626                         .streaming_ctrl   = cxusb_streaming_ctrl,
627                         .frontend_attach  = cxusb_dee1601_frontend_attach,
628                         .tuner_attach     = cxusb_dee1601_tuner_attach,
629                         /* parameter for the MPEG2-data transfer */
630                         .stream = {
631                                 .type = USB_BULK,
632                                 .count = 5,
633                                 .endpoint = 0x04,
634                                 .u = {
635                                         .bulk = {
636                                                 .buffersize = 8192,
637                                         }
638                                 }
639                         },
640                 },
641         },
642
643         .power_ctrl       = cxusb_bluebird_power_ctrl,
644
645         .i2c_algo         = &cxusb_i2c_algo,
646
647         .rc_interval      = 150,
648         .rc_key_map       = dvico_mce_rc_keys,
649         .rc_key_map_size  = ARRAY_SIZE(dvico_mce_rc_keys),
650         .rc_query         = cxusb_rc_query,
651
652         .generic_bulk_ctrl_endpoint = 0x01,
653
654         .num_device_descs = 3,
655         .devices = {
656                 {   "DViCO FusionHDTV DVB-T Dual USB",
657                         { &cxusb_table[3], NULL },
658                         { &cxusb_table[4], NULL },
659                 },
660                 {   "DigitalNow DVB-T Dual USB",
661                         { &cxusb_table[9],  NULL },
662                         { &cxusb_table[10], NULL },
663                 },
664                 {   "DViCO FusionHDTV DVB-T Dual Digital 2",
665                         { &cxusb_table[11], NULL },
666                         { &cxusb_table[12], NULL },
667                 },
668         }
669 };
670
671 static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
672         .caps = DVB_USB_IS_AN_I2C_ADAPTER,
673
674         .usb_ctrl          = DEVICE_SPECIFIC,
675         .firmware          = "dvb-usb-bluebird-01.fw",
676         .download_firmware = bluebird_patch_dvico_firmware_download,
677         /* use usb alt setting 0 for EP4 transfer (dvb-t),
678            use usb alt setting 7 for EP2 transfer (atsc) */
679
680         .size_of_priv     = sizeof(struct cxusb_state),
681
682         .num_adapters = 2,
683         .adapter = {
684                 {
685                         .streaming_ctrl   = cxusb_streaming_ctrl,
686                         .frontend_attach  = cxusb_mt352_frontend_attach,
687                         .tuner_attach     = cxusb_lgz201_tuner_attach,
688
689                         /* parameter for the MPEG2-data transfer */
690                         .stream = {
691                                 .type = USB_BULK,
692                                 .count = 5,
693                                 .endpoint = 0x04,
694                                 .u = {
695                                         .bulk = {
696                                                 .buffersize = 8192,
697                                         }
698                                 }
699                         },
700                 },
701         },
702         .power_ctrl       = cxusb_bluebird_power_ctrl,
703
704         .i2c_algo         = &cxusb_i2c_algo,
705
706         .rc_interval      = 100,
707         .rc_key_map       = dvico_portable_rc_keys,
708         .rc_key_map_size  = ARRAY_SIZE(dvico_portable_rc_keys),
709         .rc_query         = cxusb_rc_query,
710
711         .generic_bulk_ctrl_endpoint = 0x01,
712         .num_device_descs = 1,
713         .devices = {
714                 {   "DViCO FusionHDTV DVB-T USB (LGZ201)",
715                         { &cxusb_table[5], NULL },
716                         { &cxusb_table[6], NULL },
717                 },
718         }
719 };
720
721 static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties = {
722         .caps = DVB_USB_IS_AN_I2C_ADAPTER,
723
724         .usb_ctrl          = DEVICE_SPECIFIC,
725         .firmware          = "dvb-usb-bluebird-01.fw",
726         .download_firmware = bluebird_patch_dvico_firmware_download,
727         /* use usb alt setting 0 for EP4 transfer (dvb-t),
728            use usb alt setting 7 for EP2 transfer (atsc) */
729
730         .size_of_priv     = sizeof(struct cxusb_state),
731
732         .num_adapters = 1,
733         .adapter = {
734                 {
735                         .streaming_ctrl   = cxusb_streaming_ctrl,
736                         .frontend_attach  = cxusb_mt352_frontend_attach,
737                         .tuner_attach     = cxusb_dtt7579_tuner_attach,
738
739                         /* parameter for the MPEG2-data transfer */
740                         .stream = {
741                                 .type = USB_BULK,
742                                 .count = 5,
743                                 .endpoint = 0x04,
744                                 .u = {
745                                         .bulk = {
746                                                 .buffersize = 8192,
747                                         }
748                                 }
749                         },
750                 },
751         },
752         .power_ctrl       = cxusb_bluebird_power_ctrl,
753
754         .i2c_algo         = &cxusb_i2c_algo,
755
756         .rc_interval      = 100,
757         .rc_key_map       = dvico_portable_rc_keys,
758         .rc_key_map_size  = ARRAY_SIZE(dvico_portable_rc_keys),
759         .rc_query         = cxusb_rc_query,
760
761         .generic_bulk_ctrl_endpoint = 0x01,
762
763         .num_device_descs = 1,
764         .devices = {
765                 {   "DViCO FusionHDTV DVB-T USB (TH7579)",
766                         { &cxusb_table[7], NULL },
767                         { &cxusb_table[8], NULL },
768                 },
769         }
770 };
771
772 static struct usb_driver cxusb_driver = {
773         .name           = "dvb_usb_cxusb",
774         .probe          = cxusb_probe,
775         .disconnect     = dvb_usb_device_exit,
776         .id_table       = cxusb_table,
777 };
778
779 /* module stuff */
780 static int __init cxusb_module_init(void)
781 {
782         int result;
783         if ((result = usb_register(&cxusb_driver))) {
784                 err("usb_register failed. Error number %d",result);
785                 return result;
786         }
787
788         return 0;
789 }
790
791 static void __exit cxusb_module_exit(void)
792 {
793         /* deregister this driver from the USB subsystem */
794         usb_deregister(&cxusb_driver);
795 }
796
797 module_init (cxusb_module_init);
798 module_exit (cxusb_module_exit);
799
800 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");
801 MODULE_AUTHOR("Michael Krufky <mkrufky@linuxtv.org>");
802 MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
803 MODULE_DESCRIPTION("Driver for Conexant USB2.0 hybrid reference design");
804 MODULE_VERSION("1.0-alpha");
805 MODULE_LICENSE("GPL");