Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cxusb.c
Go to the documentation of this file.
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 ([email protected])
17  * Copyright (C) 2006 Michael Krufky ([email protected])
18  * Copyright (C) 2006, 2007 Chris Pascoe ([email protected])
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 <media/tuner.h>
27 #include <linux/vmalloc.h>
28 #include <linux/slab.h>
29 
30 #include "cxusb.h"
31 
32 #include "cx22702.h"
33 #include "lgdt330x.h"
34 #include "mt352.h"
35 #include "mt352_priv.h"
36 #include "zl10353.h"
37 #include "tuner-xc2028.h"
38 #include "tuner-simple.h"
39 #include "mxl5005s.h"
40 #include "max2165.h"
41 #include "dib7000p.h"
42 #include "dib0070.h"
43 #include "lgs8gxx.h"
44 #include "atbm8830.h"
45 
46 /* debug */
47 static int dvb_usb_cxusb_debug;
48 module_param_named(debug, dvb_usb_cxusb_debug, int, 0644);
49 MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS);
50 
52 
53 #define deb_info(args...) dprintk(dvb_usb_cxusb_debug, 0x03, args)
54 #define deb_i2c(args...) dprintk(dvb_usb_cxusb_debug, 0x02, args)
55 
56 static int cxusb_ctrl_msg(struct dvb_usb_device *d,
57  u8 cmd, u8 *wbuf, int wlen, u8 *rbuf, int rlen)
58 {
59  int wo = (rbuf == NULL || rlen == 0); /* write-only */
60  u8 sndbuf[1+wlen];
61  memset(sndbuf, 0, 1+wlen);
62 
63  sndbuf[0] = cmd;
64  memcpy(&sndbuf[1], wbuf, wlen);
65  if (wo)
66  return dvb_usb_generic_write(d, sndbuf, 1+wlen);
67  else
68  return dvb_usb_generic_rw(d, sndbuf, 1+wlen, rbuf, rlen, 0);
69 }
70 
71 /* GPIO */
72 static void cxusb_gpio_tuner(struct dvb_usb_device *d, int onoff)
73 {
74  struct cxusb_state *st = d->priv;
75  u8 o[2], i;
76 
77  if (st->gpio_write_state[GPIO_TUNER] == onoff)
78  return;
79 
80  o[0] = GPIO_TUNER;
81  o[1] = onoff;
82  cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1);
83 
84  if (i != 0x01)
85  deb_info("gpio_write failed.\n");
86 
88 }
89 
90 static int cxusb_bluebird_gpio_rw(struct dvb_usb_device *d, u8 changemask,
91  u8 newval)
92 {
93  u8 o[2], gpio_state;
94  int rc;
95 
96  o[0] = 0xff & ~changemask; /* mask of bits to keep */
97  o[1] = newval & changemask; /* new values for bits */
98 
99  rc = cxusb_ctrl_msg(d, CMD_BLUEBIRD_GPIO_RW, o, 2, &gpio_state, 1);
100  if (rc < 0 || (gpio_state & changemask) != (newval & changemask))
101  deb_info("bluebird_gpio_write failed.\n");
102 
103  return rc < 0 ? rc : gpio_state;
104 }
105 
106 static void cxusb_bluebird_gpio_pulse(struct dvb_usb_device *d, u8 pin, int low)
107 {
108  cxusb_bluebird_gpio_rw(d, pin, low ? 0 : pin);
109  msleep(5);
110  cxusb_bluebird_gpio_rw(d, pin, low ? pin : 0);
111 }
112 
113 static void cxusb_nano2_led(struct dvb_usb_device *d, int onoff)
114 {
115  cxusb_bluebird_gpio_rw(d, 0x40, onoff ? 0 : 0x40);
116 }
117 
118 static int cxusb_d680_dmb_gpio_tuner(struct dvb_usb_device *d,
119  u8 addr, int onoff)
120 {
121  u8 o[2] = {addr, onoff};
122  u8 i;
123  int rc;
124 
125  rc = cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1);
126 
127  if (rc < 0)
128  return rc;
129  if (i == 0x01)
130  return 0;
131  else {
132  deb_info("gpio_write failed.\n");
133  return -EIO;
134  }
135 }
136 
137 /* I2C */
138 static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
139  int num)
140 {
141  struct dvb_usb_device *d = i2c_get_adapdata(adap);
142  int i;
143 
144  if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
145  return -EAGAIN;
146 
147  for (i = 0; i < num; i++) {
148 
149  if (d->udev->descriptor.idVendor == USB_VID_MEDION)
150  switch (msg[i].addr) {
151  case 0x63:
152  cxusb_gpio_tuner(d, 0);
153  break;
154  default:
155  cxusb_gpio_tuner(d, 1);
156  break;
157  }
158 
159  if (msg[i].flags & I2C_M_RD) {
160  /* read only */
161  u8 obuf[3], ibuf[1+msg[i].len];
162  obuf[0] = 0;
163  obuf[1] = msg[i].len;
164  obuf[2] = msg[i].addr;
165  if (cxusb_ctrl_msg(d, CMD_I2C_READ,
166  obuf, 3,
167  ibuf, 1+msg[i].len) < 0) {
168  warn("i2c read failed");
169  break;
170  }
171  memcpy(msg[i].buf, &ibuf[1], msg[i].len);
172  } else if (i+1 < num && (msg[i+1].flags & I2C_M_RD) &&
173  msg[i].addr == msg[i+1].addr) {
174  /* write to then read from same address */
175  u8 obuf[3+msg[i].len], ibuf[1+msg[i+1].len];
176  obuf[0] = msg[i].len;
177  obuf[1] = msg[i+1].len;
178  obuf[2] = msg[i].addr;
179  memcpy(&obuf[3], msg[i].buf, msg[i].len);
180 
181  if (cxusb_ctrl_msg(d, CMD_I2C_READ,
182  obuf, 3+msg[i].len,
183  ibuf, 1+msg[i+1].len) < 0)
184  break;
185 
186  if (ibuf[0] != 0x08)
187  deb_i2c("i2c read may have failed\n");
188 
189  memcpy(msg[i+1].buf, &ibuf[1], msg[i+1].len);
190 
191  i++;
192  } else {
193  /* write only */
194  u8 obuf[2+msg[i].len], ibuf;
195  obuf[0] = msg[i].addr;
196  obuf[1] = msg[i].len;
197  memcpy(&obuf[2], msg[i].buf, msg[i].len);
198 
199  if (cxusb_ctrl_msg(d, CMD_I2C_WRITE, obuf,
200  2+msg[i].len, &ibuf,1) < 0)
201  break;
202  if (ibuf != 0x08)
203  deb_i2c("i2c write may have failed\n");
204  }
205  }
206 
207  mutex_unlock(&d->i2c_mutex);
208  return i == num ? num : -EREMOTEIO;
209 }
210 
211 static u32 cxusb_i2c_func(struct i2c_adapter *adapter)
212 {
213  return I2C_FUNC_I2C;
214 }
215 
216 static struct i2c_algorithm cxusb_i2c_algo = {
217  .master_xfer = cxusb_i2c_xfer,
218  .functionality = cxusb_i2c_func,
219 };
220 
221 static int cxusb_power_ctrl(struct dvb_usb_device *d, int onoff)
222 {
223  u8 b = 0;
224  if (onoff)
225  return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
226  else
227  return cxusb_ctrl_msg(d, CMD_POWER_OFF, &b, 1, NULL, 0);
228 }
229 
230 static int cxusb_aver_power_ctrl(struct dvb_usb_device *d, int onoff)
231 {
232  int ret;
233  if (!onoff)
234  return cxusb_ctrl_msg(d, CMD_POWER_OFF, NULL, 0, NULL, 0);
235  if (d->state == DVB_USB_STATE_INIT &&
236  usb_set_interface(d->udev, 0, 0) < 0)
237  err("set interface failed");
238  do {} while (!(ret = cxusb_ctrl_msg(d, CMD_POWER_ON, NULL, 0, NULL, 0)) &&
239  !(ret = cxusb_ctrl_msg(d, 0x15, NULL, 0, NULL, 0)) &&
240  !(ret = cxusb_ctrl_msg(d, 0x17, NULL, 0, NULL, 0)) && 0);
241  if (!ret) {
242  /* FIXME: We don't know why, but we need to configure the
243  * lgdt3303 with the register settings below on resume */
244  int i;
245  u8 buf, bufs[] = {
246  0x0e, 0x2, 0x00, 0x7f,
247  0x0e, 0x2, 0x02, 0xfe,
248  0x0e, 0x2, 0x02, 0x01,
249  0x0e, 0x2, 0x00, 0x03,
250  0x0e, 0x2, 0x0d, 0x40,
251  0x0e, 0x2, 0x0e, 0x87,
252  0x0e, 0x2, 0x0f, 0x8e,
253  0x0e, 0x2, 0x10, 0x01,
254  0x0e, 0x2, 0x14, 0xd7,
255  0x0e, 0x2, 0x47, 0x88,
256  };
257  msleep(20);
258  for (i = 0; i < sizeof(bufs)/sizeof(u8); i += 4/sizeof(u8)) {
259  ret = cxusb_ctrl_msg(d, CMD_I2C_WRITE,
260  bufs+i, 4, &buf, 1);
261  if (ret)
262  break;
263  if (buf != 0x8)
264  return -EREMOTEIO;
265  }
266  }
267  return ret;
268 }
269 
270 static int cxusb_bluebird_power_ctrl(struct dvb_usb_device *d, int onoff)
271 {
272  u8 b = 0;
273  if (onoff)
274  return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
275  else
276  return 0;
277 }
278 
279 static int cxusb_nano2_power_ctrl(struct dvb_usb_device *d, int onoff)
280 {
281  int rc = 0;
282 
283  rc = cxusb_power_ctrl(d, onoff);
284  if (!onoff)
285  cxusb_nano2_led(d, 0);
286 
287  return rc;
288 }
289 
290 static int cxusb_d680_dmb_power_ctrl(struct dvb_usb_device *d, int onoff)
291 {
292  int ret;
293  u8 b;
294  ret = cxusb_power_ctrl(d, onoff);
295  if (!onoff)
296  return ret;
297 
298  msleep(128);
299  cxusb_ctrl_msg(d, CMD_DIGITAL, NULL, 0, &b, 1);
300  msleep(100);
301  return ret;
302 }
303 
304 static int cxusb_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
305 {
306  u8 buf[2] = { 0x03, 0x00 };
307  if (onoff)
308  cxusb_ctrl_msg(adap->dev, CMD_STREAMING_ON, buf, 2, NULL, 0);
309  else
310  cxusb_ctrl_msg(adap->dev, CMD_STREAMING_OFF, NULL, 0, NULL, 0);
311 
312  return 0;
313 }
314 
315 static int cxusb_aver_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
316 {
317  if (onoff)
318  cxusb_ctrl_msg(adap->dev, CMD_AVER_STREAM_ON, NULL, 0, NULL, 0);
319  else
320  cxusb_ctrl_msg(adap->dev, CMD_AVER_STREAM_OFF,
321  NULL, 0, NULL, 0);
322  return 0;
323 }
324 
325 static void cxusb_d680_dmb_drain_message(struct dvb_usb_device *d)
326 {
327  int ep = d->props.generic_bulk_ctrl_endpoint;
328  const int timeout = 100;
329  const int junk_len = 32;
330  u8 *junk;
331  int rd_count;
332 
333  /* Discard remaining data in video pipe */
334  junk = kmalloc(junk_len, GFP_KERNEL);
335  if (!junk)
336  return;
337  while (1) {
338  if (usb_bulk_msg(d->udev,
339  usb_rcvbulkpipe(d->udev, ep),
340  junk, junk_len, &rd_count, timeout) < 0)
341  break;
342  if (!rd_count)
343  break;
344  }
345  kfree(junk);
346 }
347 
348 static void cxusb_d680_dmb_drain_video(struct dvb_usb_device *d)
349 {
350  struct usb_data_stream_properties *p = &d->props.adapter[0].fe[0].stream;
351  const int timeout = 100;
352  const int junk_len = p->u.bulk.buffersize;
353  u8 *junk;
354  int rd_count;
355 
356  /* Discard remaining data in video pipe */
357  junk = kmalloc(junk_len, GFP_KERNEL);
358  if (!junk)
359  return;
360  while (1) {
361  if (usb_bulk_msg(d->udev,
362  usb_rcvbulkpipe(d->udev, p->endpoint),
363  junk, junk_len, &rd_count, timeout) < 0)
364  break;
365  if (!rd_count)
366  break;
367  }
368  kfree(junk);
369 }
370 
371 static int cxusb_d680_dmb_streaming_ctrl(
372  struct dvb_usb_adapter *adap, int onoff)
373 {
374  if (onoff) {
375  u8 buf[2] = { 0x03, 0x00 };
376  cxusb_d680_dmb_drain_video(adap->dev);
377  return cxusb_ctrl_msg(adap->dev, CMD_STREAMING_ON,
378  buf, sizeof(buf), NULL, 0);
379  } else {
380  int ret = cxusb_ctrl_msg(adap->dev,
381  CMD_STREAMING_OFF, NULL, 0, NULL, 0);
382  return ret;
383  }
384 }
385 
386 static int cxusb_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
387 {
388  struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
389  u8 ircode[4];
390  int i;
391 
392  cxusb_ctrl_msg(d, CMD_GET_IR_CODE, NULL, 0, ircode, 4);
393 
394  *event = 0;
395  *state = REMOTE_NO_KEY_PRESSED;
396 
397  for (i = 0; i < d->props.rc.legacy.rc_map_size; i++) {
398  if (rc5_custom(&keymap[i]) == ircode[2] &&
399  rc5_data(&keymap[i]) == ircode[3]) {
400  *event = keymap[i].keycode;
401  *state = REMOTE_KEY_PRESSED;
402 
403  return 0;
404  }
405  }
406 
407  return 0;
408 }
409 
410 static int cxusb_bluebird2_rc_query(struct dvb_usb_device *d, u32 *event,
411  int *state)
412 {
413  struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
414  u8 ircode[4];
415  int i;
416  struct i2c_msg msg = { .addr = 0x6b, .flags = I2C_M_RD,
417  .buf = ircode, .len = 4 };
418 
419  *event = 0;
420  *state = REMOTE_NO_KEY_PRESSED;
421 
422  if (cxusb_i2c_xfer(&d->i2c_adap, &msg, 1) != 1)
423  return 0;
424 
425  for (i = 0; i < d->props.rc.legacy.rc_map_size; i++) {
426  if (rc5_custom(&keymap[i]) == ircode[1] &&
427  rc5_data(&keymap[i]) == ircode[2]) {
428  *event = keymap[i].keycode;
429  *state = REMOTE_KEY_PRESSED;
430 
431  return 0;
432  }
433  }
434 
435  return 0;
436 }
437 
438 static int cxusb_d680_dmb_rc_query(struct dvb_usb_device *d, u32 *event,
439  int *state)
440 {
441  struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
442  u8 ircode[2];
443  int i;
444 
445  *event = 0;
446  *state = REMOTE_NO_KEY_PRESSED;
447 
448  if (cxusb_ctrl_msg(d, 0x10, NULL, 0, ircode, 2) < 0)
449  return 0;
450 
451  for (i = 0; i < d->props.rc.legacy.rc_map_size; i++) {
452  if (rc5_custom(&keymap[i]) == ircode[0] &&
453  rc5_data(&keymap[i]) == ircode[1]) {
454  *event = keymap[i].keycode;
455  *state = REMOTE_KEY_PRESSED;
456 
457  return 0;
458  }
459  }
460 
461  return 0;
462 }
463 
464 static struct rc_map_table rc_map_dvico_mce_table[] = {
465  { 0xfe02, KEY_TV },
466  { 0xfe0e, KEY_MP3 },
467  { 0xfe1a, KEY_DVD },
468  { 0xfe1e, KEY_FAVORITES },
469  { 0xfe16, KEY_SETUP },
470  { 0xfe46, KEY_POWER2 },
471  { 0xfe0a, KEY_EPG },
472  { 0xfe49, KEY_BACK },
473  { 0xfe4d, KEY_MENU },
474  { 0xfe51, KEY_UP },
475  { 0xfe5b, KEY_LEFT },
476  { 0xfe5f, KEY_RIGHT },
477  { 0xfe53, KEY_DOWN },
478  { 0xfe5e, KEY_OK },
479  { 0xfe59, KEY_INFO },
480  { 0xfe55, KEY_TAB },
481  { 0xfe0f, KEY_PREVIOUSSONG },/* Replay */
482  { 0xfe12, KEY_NEXTSONG }, /* Skip */
483  { 0xfe42, KEY_ENTER }, /* Windows/Start */
484  { 0xfe15, KEY_VOLUMEUP },
485  { 0xfe05, KEY_VOLUMEDOWN },
486  { 0xfe11, KEY_CHANNELUP },
487  { 0xfe09, KEY_CHANNELDOWN },
488  { 0xfe52, KEY_CAMERA },
489  { 0xfe5a, KEY_TUNER }, /* Live */
490  { 0xfe19, KEY_OPEN },
491  { 0xfe0b, KEY_1 },
492  { 0xfe17, KEY_2 },
493  { 0xfe1b, KEY_3 },
494  { 0xfe07, KEY_4 },
495  { 0xfe50, KEY_5 },
496  { 0xfe54, KEY_6 },
497  { 0xfe48, KEY_7 },
498  { 0xfe4c, KEY_8 },
499  { 0xfe58, KEY_9 },
500  { 0xfe13, KEY_ANGLE }, /* Aspect */
501  { 0xfe03, KEY_0 },
502  { 0xfe1f, KEY_ZOOM },
503  { 0xfe43, KEY_REWIND },
504  { 0xfe47, KEY_PLAYPAUSE },
505  { 0xfe4f, KEY_FASTFORWARD },
506  { 0xfe57, KEY_MUTE },
507  { 0xfe0d, KEY_STOP },
508  { 0xfe01, KEY_RECORD },
509  { 0xfe4e, KEY_POWER },
510 };
511 
512 static struct rc_map_table rc_map_dvico_portable_table[] = {
513  { 0xfc02, KEY_SETUP }, /* Profile */
514  { 0xfc43, KEY_POWER2 },
515  { 0xfc06, KEY_EPG },
516  { 0xfc5a, KEY_BACK },
517  { 0xfc05, KEY_MENU },
518  { 0xfc47, KEY_INFO },
519  { 0xfc01, KEY_TAB },
520  { 0xfc42, KEY_PREVIOUSSONG },/* Replay */
521  { 0xfc49, KEY_VOLUMEUP },
522  { 0xfc09, KEY_VOLUMEDOWN },
523  { 0xfc54, KEY_CHANNELUP },
524  { 0xfc0b, KEY_CHANNELDOWN },
525  { 0xfc16, KEY_CAMERA },
526  { 0xfc40, KEY_TUNER }, /* ATV/DTV */
527  { 0xfc45, KEY_OPEN },
528  { 0xfc19, KEY_1 },
529  { 0xfc18, KEY_2 },
530  { 0xfc1b, KEY_3 },
531  { 0xfc1a, KEY_4 },
532  { 0xfc58, KEY_5 },
533  { 0xfc59, KEY_6 },
534  { 0xfc15, KEY_7 },
535  { 0xfc14, KEY_8 },
536  { 0xfc17, KEY_9 },
537  { 0xfc44, KEY_ANGLE }, /* Aspect */
538  { 0xfc55, KEY_0 },
539  { 0xfc07, KEY_ZOOM },
540  { 0xfc0a, KEY_REWIND },
541  { 0xfc08, KEY_PLAYPAUSE },
542  { 0xfc4b, KEY_FASTFORWARD },
543  { 0xfc5b, KEY_MUTE },
544  { 0xfc04, KEY_STOP },
545  { 0xfc56, KEY_RECORD },
546  { 0xfc57, KEY_POWER },
547  { 0xfc41, KEY_UNKNOWN }, /* INPUT */
548  { 0xfc00, KEY_UNKNOWN }, /* HD */
549 };
550 
551 static struct rc_map_table rc_map_d680_dmb_table[] = {
552  { 0x0038, KEY_UNKNOWN }, /* TV/AV */
553  { 0x080c, KEY_ZOOM },
554  { 0x0800, KEY_0 },
555  { 0x0001, KEY_1 },
556  { 0x0802, KEY_2 },
557  { 0x0003, KEY_3 },
558  { 0x0804, KEY_4 },
559  { 0x0005, KEY_5 },
560  { 0x0806, KEY_6 },
561  { 0x0007, KEY_7 },
562  { 0x0808, KEY_8 },
563  { 0x0009, KEY_9 },
564  { 0x000a, KEY_MUTE },
565  { 0x0829, KEY_BACK },
566  { 0x0012, KEY_CHANNELUP },
567  { 0x0813, KEY_CHANNELDOWN },
568  { 0x002b, KEY_VOLUMEUP },
569  { 0x082c, KEY_VOLUMEDOWN },
570  { 0x0020, KEY_UP },
571  { 0x0821, KEY_DOWN },
572  { 0x0011, KEY_LEFT },
573  { 0x0810, KEY_RIGHT },
574  { 0x000d, KEY_OK },
575  { 0x081f, KEY_RECORD },
576  { 0x0017, KEY_PLAYPAUSE },
577  { 0x0816, KEY_PLAYPAUSE },
578  { 0x000b, KEY_STOP },
579  { 0x0827, KEY_FASTFORWARD },
580  { 0x0026, KEY_REWIND },
581  { 0x081e, KEY_UNKNOWN }, /* Time Shift */
582  { 0x000e, KEY_UNKNOWN }, /* Snapshot */
583  { 0x082d, KEY_UNKNOWN }, /* Mouse Cursor */
584  { 0x000f, KEY_UNKNOWN }, /* Minimize/Maximize */
585  { 0x0814, KEY_UNKNOWN }, /* Shuffle */
586  { 0x0025, KEY_POWER },
587 };
588 
589 static int cxusb_dee1601_demod_init(struct dvb_frontend* fe)
590 {
591  static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x28 };
592  static u8 reset [] = { RESET, 0x80 };
593  static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
594  static u8 agc_cfg [] = { AGC_TARGET, 0x28, 0x20 };
595  static u8 gpp_ctl_cfg [] = { GPP_CTL, 0x33 };
596  static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
597 
598  mt352_write(fe, clock_config, sizeof(clock_config));
599  udelay(200);
600  mt352_write(fe, reset, sizeof(reset));
601  mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
602 
603  mt352_write(fe, agc_cfg, sizeof(agc_cfg));
604  mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
605  mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
606 
607  return 0;
608 }
609 
610 static int cxusb_mt352_demod_init(struct dvb_frontend* fe)
611 { /* used in both lgz201 and th7579 */
612  static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x29 };
613  static u8 reset [] = { RESET, 0x80 };
614  static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
615  static u8 agc_cfg [] = { AGC_TARGET, 0x24, 0x20 };
616  static u8 gpp_ctl_cfg [] = { GPP_CTL, 0x33 };
617  static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
618 
619  mt352_write(fe, clock_config, sizeof(clock_config));
620  udelay(200);
621  mt352_write(fe, reset, sizeof(reset));
622  mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
623 
624  mt352_write(fe, agc_cfg, sizeof(agc_cfg));
625  mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
626  mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
627  return 0;
628 }
629 
630 static struct cx22702_config cxusb_cx22702_config = {
631  .demod_address = 0x63,
632  .output_mode = CX22702_PARALLEL_OUTPUT,
633 };
634 
635 static struct lgdt330x_config cxusb_lgdt3303_config = {
636  .demod_address = 0x0e,
637  .demod_chip = LGDT3303,
638 };
639 
640 static struct lgdt330x_config cxusb_aver_lgdt3303_config = {
641  .demod_address = 0x0e,
642  .demod_chip = LGDT3303,
643  .clock_polarity_flip = 2,
644 };
645 
646 static struct mt352_config cxusb_dee1601_config = {
647  .demod_address = 0x0f,
648  .demod_init = cxusb_dee1601_demod_init,
649 };
650 
651 static struct zl10353_config cxusb_zl10353_dee1601_config = {
652  .demod_address = 0x0f,
653  .parallel_ts = 1,
654 };
655 
656 static struct mt352_config cxusb_mt352_config = {
657  /* used in both lgz201 and th7579 */
658  .demod_address = 0x0f,
659  .demod_init = cxusb_mt352_demod_init,
660 };
661 
662 static struct zl10353_config cxusb_zl10353_xc3028_config = {
663  .demod_address = 0x0f,
664  .if2 = 45600,
665  .no_tuner = 1,
666  .parallel_ts = 1,
667 };
668 
669 static struct zl10353_config cxusb_zl10353_xc3028_config_no_i2c_gate = {
670  .demod_address = 0x0f,
671  .if2 = 45600,
672  .no_tuner = 1,
673  .parallel_ts = 1,
674  .disable_i2c_gate_ctrl = 1,
675 };
676 
677 static struct mt352_config cxusb_mt352_xc3028_config = {
678  .demod_address = 0x0f,
679  .if2 = 4560,
680  .no_tuner = 1,
681  .demod_init = cxusb_mt352_demod_init,
682 };
683 
684 /* FIXME: needs tweaking */
685 static struct mxl5005s_config aver_a868r_tuner = {
686  .i2c_address = 0x63,
687  .if_freq = 6000000UL,
688  .xtal_freq = CRYSTAL_FREQ_16000000HZ,
689  .agc_mode = MXL_SINGLE_AGC,
690  .tracking_filter = MXL_TF_C,
691  .rssi_enable = MXL_RSSI_ENABLE,
692  .cap_select = MXL_CAP_SEL_ENABLE,
693  .div_out = MXL_DIV_OUT_4,
694  .clock_out = MXL_CLOCK_OUT_DISABLE,
695  .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
696  .top = MXL5005S_TOP_25P2,
697  .mod_mode = MXL_DIGITAL_MODE,
698  .if_mode = MXL_ZERO_IF,
699  .AgcMasterByte = 0x00,
700 };
701 
702 /* FIXME: needs tweaking */
703 static struct mxl5005s_config d680_dmb_tuner = {
704  .i2c_address = 0x63,
705  .if_freq = 36125000UL,
706  .xtal_freq = CRYSTAL_FREQ_16000000HZ,
707  .agc_mode = MXL_SINGLE_AGC,
708  .tracking_filter = MXL_TF_C,
709  .rssi_enable = MXL_RSSI_ENABLE,
710  .cap_select = MXL_CAP_SEL_ENABLE,
711  .div_out = MXL_DIV_OUT_4,
712  .clock_out = MXL_CLOCK_OUT_DISABLE,
713  .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
714  .top = MXL5005S_TOP_25P2,
715  .mod_mode = MXL_DIGITAL_MODE,
716  .if_mode = MXL_ZERO_IF,
717  .AgcMasterByte = 0x00,
718 };
719 
720 static struct max2165_config mygica_d689_max2165_cfg = {
721  .i2c_address = 0x60,
722  .osc_clk = 20
723 };
724 
725 /* Callbacks for DVB USB */
726 static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
727 {
729  &adap->dev->i2c_adap, 0x61,
730  TUNER_PHILIPS_FMD1216ME_MK3);
731  return 0;
732 }
733 
734 static int cxusb_dee1601_tuner_attach(struct dvb_usb_adapter *adap)
735 {
736  dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61,
738  return 0;
739 }
740 
741 static int cxusb_lgz201_tuner_attach(struct dvb_usb_adapter *adap)
742 {
743  dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61, NULL, DVB_PLL_LG_Z201);
744  return 0;
745 }
746 
747 static int cxusb_dtt7579_tuner_attach(struct dvb_usb_adapter *adap)
748 {
749  dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60,
751  return 0;
752 }
753 
754 static int cxusb_lgh064f_tuner_attach(struct dvb_usb_adapter *adap)
755 {
757  &adap->dev->i2c_adap, 0x61, TUNER_LG_TDVS_H06XF);
758  return 0;
759 }
760 
761 static int dvico_bluebird_xc2028_callback(void *ptr, int component,
762  int command, int arg)
763 {
764  struct dvb_usb_adapter *adap = ptr;
765  struct dvb_usb_device *d = adap->dev;
766 
767  switch (command) {
768  case XC2028_TUNER_RESET:
769  deb_info("%s: XC2028_TUNER_RESET %d\n", __func__, arg);
770  cxusb_bluebird_gpio_pulse(d, 0x01, 1);
771  break;
772  case XC2028_RESET_CLK:
773  deb_info("%s: XC2028_RESET_CLK %d\n", __func__, arg);
774  break;
775  default:
776  deb_info("%s: unknown command %d, arg %d\n", __func__,
777  command, arg);
778  return -EINVAL;
779  }
780 
781  return 0;
782 }
783 
784 static int cxusb_dvico_xc3028_tuner_attach(struct dvb_usb_adapter *adap)
785 {
786  struct dvb_frontend *fe;
787  struct xc2028_config cfg = {
788  .i2c_adap = &adap->dev->i2c_adap,
789  .i2c_addr = 0x61,
790  };
791  static struct xc2028_ctrl ctl = {
792  .fname = XC2028_DEFAULT_FIRMWARE,
793  .max_len = 64,
794  .demod = XC3028_FE_ZARLINK456,
795  };
796 
797  /* FIXME: generalize & move to common area */
798  adap->fe_adap[0].fe->callback = dvico_bluebird_xc2028_callback;
799 
800  fe = dvb_attach(xc2028_attach, adap->fe_adap[0].fe, &cfg);
801  if (fe == NULL || fe->ops.tuner_ops.set_config == NULL)
802  return -EIO;
803 
804  fe->ops.tuner_ops.set_config(fe, &ctl);
805 
806  return 0;
807 }
808 
809 static int cxusb_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
810 {
811  dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
812  &adap->dev->i2c_adap, &aver_a868r_tuner);
813  return 0;
814 }
815 
816 static int cxusb_d680_dmb_tuner_attach(struct dvb_usb_adapter *adap)
817 {
818  struct dvb_frontend *fe;
819  fe = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
820  &adap->dev->i2c_adap, &d680_dmb_tuner);
821  return (fe == NULL) ? -EIO : 0;
822 }
823 
824 static int cxusb_mygica_d689_tuner_attach(struct dvb_usb_adapter *adap)
825 {
826  struct dvb_frontend *fe;
827  fe = dvb_attach(max2165_attach, adap->fe_adap[0].fe,
828  &adap->dev->i2c_adap, &mygica_d689_max2165_cfg);
829  return (fe == NULL) ? -EIO : 0;
830 }
831 
832 static int cxusb_cx22702_frontend_attach(struct dvb_usb_adapter *adap)
833 {
834  u8 b;
835  if (usb_set_interface(adap->dev->udev, 0, 6) < 0)
836  err("set interface failed");
837 
838  cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, &b, 1);
839 
840  adap->fe_adap[0].fe = dvb_attach(cx22702_attach, &cxusb_cx22702_config,
841  &adap->dev->i2c_adap);
842  if ((adap->fe_adap[0].fe) != NULL)
843  return 0;
844 
845  return -EIO;
846 }
847 
848 static int cxusb_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
849 {
850  if (usb_set_interface(adap->dev->udev, 0, 7) < 0)
851  err("set interface failed");
852 
853  cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
854 
855  adap->fe_adap[0].fe = dvb_attach(lgdt330x_attach,
856  &cxusb_lgdt3303_config,
857  &adap->dev->i2c_adap);
858  if ((adap->fe_adap[0].fe) != NULL)
859  return 0;
860 
861  return -EIO;
862 }
863 
864 static int cxusb_aver_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
865 {
866  adap->fe_adap[0].fe = dvb_attach(lgdt330x_attach, &cxusb_aver_lgdt3303_config,
867  &adap->dev->i2c_adap);
868  if (adap->fe_adap[0].fe != NULL)
869  return 0;
870 
871  return -EIO;
872 }
873 
874 static int cxusb_mt352_frontend_attach(struct dvb_usb_adapter *adap)
875 {
876  /* used in both lgz201 and th7579 */
877  if (usb_set_interface(adap->dev->udev, 0, 0) < 0)
878  err("set interface failed");
879 
880  cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
881 
882  adap->fe_adap[0].fe = dvb_attach(mt352_attach, &cxusb_mt352_config,
883  &adap->dev->i2c_adap);
884  if ((adap->fe_adap[0].fe) != NULL)
885  return 0;
886 
887  return -EIO;
888 }
889 
890 static int cxusb_dee1601_frontend_attach(struct dvb_usb_adapter *adap)
891 {
892  if (usb_set_interface(adap->dev->udev, 0, 0) < 0)
893  err("set interface failed");
894 
895  cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
896 
897  adap->fe_adap[0].fe = dvb_attach(mt352_attach, &cxusb_dee1601_config,
898  &adap->dev->i2c_adap);
899  if ((adap->fe_adap[0].fe) != NULL)
900  return 0;
901 
902  adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
903  &cxusb_zl10353_dee1601_config,
904  &adap->dev->i2c_adap);
905  if ((adap->fe_adap[0].fe) != NULL)
906  return 0;
907 
908  return -EIO;
909 }
910 
911 static int cxusb_dualdig4_frontend_attach(struct dvb_usb_adapter *adap)
912 {
913  u8 ircode[4];
914  int i;
915  struct i2c_msg msg = { .addr = 0x6b, .flags = I2C_M_RD,
916  .buf = ircode, .len = 4 };
917 
918  if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
919  err("set interface failed");
920 
921  cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
922 
923  /* reset the tuner and demodulator */
924  cxusb_bluebird_gpio_rw(adap->dev, 0x04, 0);
925  cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
926  cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
927 
928  adap->fe_adap[0].fe =
930  &cxusb_zl10353_xc3028_config_no_i2c_gate,
931  &adap->dev->i2c_adap);
932  if ((adap->fe_adap[0].fe) == NULL)
933  return -EIO;
934 
935  /* try to determine if there is no IR decoder on the I2C bus */
936  for (i = 0; adap->dev->props.rc.legacy.rc_map_table != NULL && i < 5; i++) {
937  msleep(20);
938  if (cxusb_i2c_xfer(&adap->dev->i2c_adap, &msg, 1) != 1)
939  goto no_IR;
940  if (ircode[0] == 0 && ircode[1] == 0)
941  continue;
942  if (ircode[2] + ircode[3] != 0xff) {
943 no_IR:
944  adap->dev->props.rc.legacy.rc_map_table = NULL;
945  info("No IR receiver detected on this device.");
946  break;
947  }
948  }
949 
950  return 0;
951 }
952 
953 static struct dibx000_agc_config dib7070_agc_config = {
954  .band_caps = BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
955 
956  /*
957  * P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5,
958  * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
959  * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0
960  */
961  .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) |
962  (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
963  .inv_gain = 600,
964  .time_stabiliz = 10,
965  .alpha_level = 0,
966  .thlock = 118,
967  .wbd_inv = 0,
968  .wbd_ref = 3530,
969  .wbd_sel = 1,
970  .wbd_alpha = 5,
971  .agc1_max = 65535,
972  .agc1_min = 0,
973  .agc2_max = 65535,
974  .agc2_min = 0,
975  .agc1_pt1 = 0,
976  .agc1_pt2 = 40,
977  .agc1_pt3 = 183,
978  .agc1_slope1 = 206,
979  .agc1_slope2 = 255,
980  .agc2_pt1 = 72,
981  .agc2_pt2 = 152,
982  .agc2_slope1 = 88,
983  .agc2_slope2 = 90,
984  .alpha_mant = 17,
985  .alpha_exp = 27,
986  .beta_mant = 23,
987  .beta_exp = 51,
988  .perform_agc_softsplit = 0,
989 };
990 
991 static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
992  .internal = 60000,
993  .sampling = 15000,
994  .pll_prediv = 1,
995  .pll_ratio = 20,
996  .pll_range = 3,
997  .pll_reset = 1,
998  .pll_bypass = 0,
999  .enable_refdiv = 0,
1000  .bypclk_div = 0,
1001  .IO_CLK_en_core = 1,
1002  .ADClkSrc = 1,
1003  .modulo = 2,
1004  /* refsel, sel, freq_15k */
1005  .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
1006  .ifreq = (0 << 25) | 0,
1007  .timf = 20452225,
1008  .xtal_hz = 12000000,
1009 };
1010 
1011 static struct dib7000p_config cxusb_dualdig4_rev2_config = {
1012  .output_mode = OUTMODE_MPEG2_PAR_GATED_CLK,
1013  .output_mpeg2_in_188_bytes = 1,
1014 
1015  .agc_config_count = 1,
1016  .agc = &dib7070_agc_config,
1017  .bw = &dib7070_bw_config_12_mhz,
1018  .tuner_is_baseband = 1,
1019  .spur_protect = 1,
1020 
1021  .gpio_dir = 0xfcef,
1022  .gpio_val = 0x0110,
1023 
1024  .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
1025 
1026  .hostbus_diversity = 1,
1027 };
1028 
1029 static int cxusb_dualdig4_rev2_frontend_attach(struct dvb_usb_adapter *adap)
1030 {
1031  if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
1032  err("set interface failed");
1033 
1034  cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
1035 
1036  cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
1037 
1038  if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
1039  &cxusb_dualdig4_rev2_config) < 0) {
1040  printk(KERN_WARNING "Unable to enumerate dib7000p\n");
1041  return -ENODEV;
1042  }
1043 
1044  adap->fe_adap[0].fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
1045  &cxusb_dualdig4_rev2_config);
1046  if (adap->fe_adap[0].fe == NULL)
1047  return -EIO;
1048 
1049  return 0;
1050 }
1051 
1052 static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
1053 {
1054  return dib7000p_set_gpio(fe, 8, 0, !onoff);
1055 }
1056 
1057 static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
1058 {
1059  return 0;
1060 }
1061 
1062 static struct dib0070_config dib7070p_dib0070_config = {
1063  .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
1064  .reset = dib7070_tuner_reset,
1065  .sleep = dib7070_tuner_sleep,
1066  .clock_khz = 12000,
1067 };
1068 
1071 };
1072 
1073 static int dib7070_set_param_override(struct dvb_frontend *fe)
1074 {
1076  struct dvb_usb_adapter *adap = fe->dvb->priv;
1077  struct dib0700_adapter_state *state = adap->priv;
1078 
1079  u16 offset;
1080  u8 band = BAND_OF_FREQUENCY(p->frequency/1000);
1081  switch (band) {
1082  case BAND_VHF: offset = 950; break;
1083  default:
1084  case BAND_UHF: offset = 550; break;
1085  }
1086 
1087  dib7000p_set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1088 
1089  return state->set_param_save(fe);
1090 }
1091 
1092 static int cxusb_dualdig4_rev2_tuner_attach(struct dvb_usb_adapter *adap)
1093 {
1094  struct dib0700_adapter_state *st = adap->priv;
1095  struct i2c_adapter *tun_i2c =
1096  dib7000p_get_i2c_master(adap->fe_adap[0].fe,
1098 
1099  if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
1100  &dib7070p_dib0070_config) == NULL)
1101  return -ENODEV;
1102 
1103  st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1104  adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override;
1105  return 0;
1106 }
1107 
1108 static int cxusb_nano2_frontend_attach(struct dvb_usb_adapter *adap)
1109 {
1110  if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
1111  err("set interface failed");
1112 
1113  cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
1114 
1115  /* reset the tuner and demodulator */
1116  cxusb_bluebird_gpio_rw(adap->dev, 0x04, 0);
1117  cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
1118  cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
1119 
1120  adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
1121  &cxusb_zl10353_xc3028_config,
1122  &adap->dev->i2c_adap);
1123  if ((adap->fe_adap[0].fe) != NULL)
1124  return 0;
1125 
1126  adap->fe_adap[0].fe = dvb_attach(mt352_attach,
1127  &cxusb_mt352_xc3028_config,
1128  &adap->dev->i2c_adap);
1129  if ((adap->fe_adap[0].fe) != NULL)
1130  return 0;
1131 
1132  return -EIO;
1133 }
1134 
1135 static struct lgs8gxx_config d680_lgs8gl5_cfg = {
1136  .prod = LGS8GXX_PROD_LGS8GL5,
1137  .demod_address = 0x19,
1138  .serial_ts = 0,
1139  .ts_clk_pol = 0,
1140  .ts_clk_gated = 1,
1141  .if_clk_freq = 30400, /* 30.4 MHz */
1142  .if_freq = 5725, /* 5.725 MHz */
1143  .if_neg_center = 0,
1144  .ext_adc = 0,
1145  .adc_signed = 0,
1146  .if_neg_edge = 0,
1147 };
1148 
1149 static int cxusb_d680_dmb_frontend_attach(struct dvb_usb_adapter *adap)
1150 {
1151  struct dvb_usb_device *d = adap->dev;
1152  int n;
1153 
1154  /* Select required USB configuration */
1155  if (usb_set_interface(d->udev, 0, 0) < 0)
1156  err("set interface failed");
1157 
1158  /* Unblock all USB pipes */
1159  usb_clear_halt(d->udev,
1160  usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1161  usb_clear_halt(d->udev,
1162  usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1163  usb_clear_halt(d->udev,
1164  usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
1165 
1166  /* Drain USB pipes to avoid hang after reboot */
1167  for (n = 0; n < 5; n++) {
1168  cxusb_d680_dmb_drain_message(d);
1169  cxusb_d680_dmb_drain_video(d);
1170  msleep(200);
1171  }
1172 
1173  /* Reset the tuner */
1174  if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 0) < 0) {
1175  err("clear tuner gpio failed");
1176  return -EIO;
1177  }
1178  msleep(100);
1179  if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 1) < 0) {
1180  err("set tuner gpio failed");
1181  return -EIO;
1182  }
1183  msleep(100);
1184 
1185  /* Attach frontend */
1186  adap->fe_adap[0].fe = dvb_attach(lgs8gxx_attach, &d680_lgs8gl5_cfg, &d->i2c_adap);
1187  if (adap->fe_adap[0].fe == NULL)
1188  return -EIO;
1189 
1190  return 0;
1191 }
1192 
1193 static struct atbm8830_config mygica_d689_atbm8830_cfg = {
1194  .prod = ATBM8830_PROD_8830,
1195  .demod_address = 0x40,
1196  .serial_ts = 0,
1197  .ts_sampling_edge = 1,
1198  .ts_clk_gated = 0,
1199  .osc_clk_freq = 30400, /* in kHz */
1200  .if_freq = 0, /* zero IF */
1201  .zif_swap_iq = 1,
1202  .agc_min = 0x2E,
1203  .agc_max = 0x90,
1204  .agc_hold_loop = 0,
1205 };
1206 
1207 static int cxusb_mygica_d689_frontend_attach(struct dvb_usb_adapter *adap)
1208 {
1209  struct dvb_usb_device *d = adap->dev;
1210 
1211  /* Select required USB configuration */
1212  if (usb_set_interface(d->udev, 0, 0) < 0)
1213  err("set interface failed");
1214 
1215  /* Unblock all USB pipes */
1216  usb_clear_halt(d->udev,
1217  usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1218  usb_clear_halt(d->udev,
1219  usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1220  usb_clear_halt(d->udev,
1221  usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
1222 
1223 
1224  /* Reset the tuner */
1225  if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 0) < 0) {
1226  err("clear tuner gpio failed");
1227  return -EIO;
1228  }
1229  msleep(100);
1230  if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 1) < 0) {
1231  err("set tuner gpio failed");
1232  return -EIO;
1233  }
1234  msleep(100);
1235 
1236  /* Attach frontend */
1237  adap->fe_adap[0].fe = dvb_attach(atbm8830_attach, &mygica_d689_atbm8830_cfg,
1238  &d->i2c_adap);
1239  if (adap->fe_adap[0].fe == NULL)
1240  return -EIO;
1241 
1242  return 0;
1243 }
1244 
1245 /*
1246  * DViCO has shipped two devices with the same USB ID, but only one of them
1247  * needs a firmware download. Check the device class details to see if they
1248  * have non-default values to decide whether the device is actually cold or
1249  * not, and forget a match if it turns out we selected the wrong device.
1250  */
1251 static int bluebird_fx2_identify_state(struct usb_device *udev,
1254  int *cold)
1255 {
1256  int wascold = *cold;
1257 
1258  *cold = udev->descriptor.bDeviceClass == 0xff &&
1259  udev->descriptor.bDeviceSubClass == 0xff &&
1260  udev->descriptor.bDeviceProtocol == 0xff;
1261 
1262  if (*cold && !wascold)
1263  *desc = NULL;
1264 
1265  return 0;
1266 }
1267 
1268 /*
1269  * DViCO bluebird firmware needs the "warm" product ID to be patched into the
1270  * firmware file before download.
1271  */
1272 
1273 static const int dvico_firmware_id_offsets[] = { 6638, 3204 };
1274 static int bluebird_patch_dvico_firmware_download(struct usb_device *udev,
1275  const struct firmware *fw)
1276 {
1277  int pos;
1278 
1279  for (pos = 0; pos < ARRAY_SIZE(dvico_firmware_id_offsets); pos++) {
1280  int idoff = dvico_firmware_id_offsets[pos];
1281 
1282  if (fw->size < idoff + 4)
1283  continue;
1284 
1285  if (fw->data[idoff] == (USB_VID_DVICO & 0xff) &&
1286  fw->data[idoff + 1] == USB_VID_DVICO >> 8) {
1287  struct firmware new_fw;
1288  u8 *new_fw_data = vmalloc(fw->size);
1289  int ret;
1290 
1291  if (!new_fw_data)
1292  return -ENOMEM;
1293 
1294  memcpy(new_fw_data, fw->data, fw->size);
1295  new_fw.size = fw->size;
1296  new_fw.data = new_fw_data;
1297 
1298  new_fw_data[idoff + 2] =
1299  le16_to_cpu(udev->descriptor.idProduct) + 1;
1300  new_fw_data[idoff + 3] =
1301  le16_to_cpu(udev->descriptor.idProduct) >> 8;
1302 
1303  ret = usb_cypress_load_firmware(udev, &new_fw,
1304  CYPRESS_FX2);
1305  vfree(new_fw_data);
1306  return ret;
1307  }
1308  }
1309 
1310  return -EINVAL;
1311 }
1312 
1313 /* DVB USB Driver stuff */
1314 static struct dvb_usb_device_properties cxusb_medion_properties;
1315 static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties;
1316 static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties;
1317 static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties;
1318 static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties;
1319 static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties;
1320 static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties;
1321 static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties;
1322 static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_properties;
1323 static struct dvb_usb_device_properties cxusb_aver_a868r_properties;
1324 static struct dvb_usb_device_properties cxusb_d680_dmb_properties;
1325 static struct dvb_usb_device_properties cxusb_mygica_d689_properties;
1326 
1327 static int cxusb_probe(struct usb_interface *intf,
1328  const struct usb_device_id *id)
1329 {
1330  if (0 == dvb_usb_device_init(intf, &cxusb_medion_properties,
1332  0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgh064f_properties,
1334  0 == dvb_usb_device_init(intf, &cxusb_bluebird_dee1601_properties,
1336  0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgz201_properties,
1338  0 == dvb_usb_device_init(intf, &cxusb_bluebird_dtt7579_properties,
1340  0 == dvb_usb_device_init(intf, &cxusb_bluebird_dualdig4_properties,
1342  0 == dvb_usb_device_init(intf, &cxusb_bluebird_nano2_properties,
1344  0 == dvb_usb_device_init(intf,
1345  &cxusb_bluebird_nano2_needsfirmware_properties,
1347  0 == dvb_usb_device_init(intf, &cxusb_aver_a868r_properties,
1349  0 == dvb_usb_device_init(intf,
1350  &cxusb_bluebird_dualdig4_rev2_properties,
1352  0 == dvb_usb_device_init(intf, &cxusb_d680_dmb_properties,
1354  0 == dvb_usb_device_init(intf, &cxusb_mygica_d689_properties,
1356  0)
1357  return 0;
1358 
1359  return -EINVAL;
1360 }
1361 
1362 static struct usb_device_id cxusb_table [] = {
1363  { USB_DEVICE(USB_VID_MEDION, USB_PID_MEDION_MD95700) },
1382  { USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_D689) },
1383  {} /* Terminating entry */
1384 };
1385 MODULE_DEVICE_TABLE (usb, cxusb_table);
1386 
1387 static struct dvb_usb_device_properties cxusb_medion_properties = {
1388  .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1389 
1390  .usb_ctrl = CYPRESS_FX2,
1391 
1392  .size_of_priv = sizeof(struct cxusb_state),
1393 
1394  .num_adapters = 1,
1395  .adapter = {
1396  {
1397  .num_frontends = 1,
1398  .fe = {{
1399  .streaming_ctrl = cxusb_streaming_ctrl,
1400  .frontend_attach = cxusb_cx22702_frontend_attach,
1401  .tuner_attach = cxusb_fmd1216me_tuner_attach,
1402  /* parameter for the MPEG2-data transfer */
1403  .stream = {
1404  .type = USB_BULK,
1405  .count = 5,
1406  .endpoint = 0x02,
1407  .u = {
1408  .bulk = {
1409  .buffersize = 8192,
1410  }
1411  }
1412  },
1413  }},
1414  },
1415  },
1416  .power_ctrl = cxusb_power_ctrl,
1417 
1418  .i2c_algo = &cxusb_i2c_algo,
1419 
1420  .generic_bulk_ctrl_endpoint = 0x01,
1421 
1422  .num_device_descs = 1,
1423  .devices = {
1424  { "Medion MD95700 (MDUSBTV-HYBRID)",
1425  { NULL },
1426  { &cxusb_table[0], NULL },
1427  },
1428  }
1429 };
1430 
1431 static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties = {
1432  .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1433 
1434  .usb_ctrl = DEVICE_SPECIFIC,
1435  .firmware = "dvb-usb-bluebird-01.fw",
1436  .download_firmware = bluebird_patch_dvico_firmware_download,
1437  /* use usb alt setting 0 for EP4 transfer (dvb-t),
1438  use usb alt setting 7 for EP2 transfer (atsc) */
1439 
1440  .size_of_priv = sizeof(struct cxusb_state),
1441 
1442  .num_adapters = 1,
1443  .adapter = {
1444  {
1445  .num_frontends = 1,
1446  .fe = {{
1447  .streaming_ctrl = cxusb_streaming_ctrl,
1448  .frontend_attach = cxusb_lgdt3303_frontend_attach,
1449  .tuner_attach = cxusb_lgh064f_tuner_attach,
1450 
1451  /* parameter for the MPEG2-data transfer */
1452  .stream = {
1453  .type = USB_BULK,
1454  .count = 5,
1455  .endpoint = 0x02,
1456  .u = {
1457  .bulk = {
1458  .buffersize = 8192,
1459  }
1460  }
1461  },
1462  }},
1463  },
1464  },
1465 
1466  .power_ctrl = cxusb_bluebird_power_ctrl,
1467 
1468  .i2c_algo = &cxusb_i2c_algo,
1469 
1470  .rc.legacy = {
1471  .rc_interval = 100,
1472  .rc_map_table = rc_map_dvico_portable_table,
1473  .rc_map_size = ARRAY_SIZE(rc_map_dvico_portable_table),
1474  .rc_query = cxusb_rc_query,
1475  },
1476 
1477  .generic_bulk_ctrl_endpoint = 0x01,
1478 
1479  .num_device_descs = 1,
1480  .devices = {
1481  { "DViCO FusionHDTV5 USB Gold",
1482  { &cxusb_table[1], NULL },
1483  { &cxusb_table[2], NULL },
1484  },
1485  }
1486 };
1487 
1488 static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties = {
1489  .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1490 
1491  .usb_ctrl = DEVICE_SPECIFIC,
1492  .firmware = "dvb-usb-bluebird-01.fw",
1493  .download_firmware = bluebird_patch_dvico_firmware_download,
1494  /* use usb alt setting 0 for EP4 transfer (dvb-t),
1495  use usb alt setting 7 for EP2 transfer (atsc) */
1496 
1497  .size_of_priv = sizeof(struct cxusb_state),
1498 
1499  .num_adapters = 1,
1500  .adapter = {
1501  {
1502  .num_frontends = 1,
1503  .fe = {{
1504  .streaming_ctrl = cxusb_streaming_ctrl,
1505  .frontend_attach = cxusb_dee1601_frontend_attach,
1506  .tuner_attach = cxusb_dee1601_tuner_attach,
1507  /* parameter for the MPEG2-data transfer */
1508  .stream = {
1509  .type = USB_BULK,
1510  .count = 5,
1511  .endpoint = 0x04,
1512  .u = {
1513  .bulk = {
1514  .buffersize = 8192,
1515  }
1516  }
1517  },
1518  }},
1519  },
1520  },
1521 
1522  .power_ctrl = cxusb_bluebird_power_ctrl,
1523 
1524  .i2c_algo = &cxusb_i2c_algo,
1525 
1526  .rc.legacy = {
1527  .rc_interval = 150,
1528  .rc_map_table = rc_map_dvico_mce_table,
1529  .rc_map_size = ARRAY_SIZE(rc_map_dvico_mce_table),
1530  .rc_query = cxusb_rc_query,
1531  },
1532 
1533  .generic_bulk_ctrl_endpoint = 0x01,
1534 
1535  .num_device_descs = 3,
1536  .devices = {
1537  { "DViCO FusionHDTV DVB-T Dual USB",
1538  { &cxusb_table[3], NULL },
1539  { &cxusb_table[4], NULL },
1540  },
1541  { "DigitalNow DVB-T Dual USB",
1542  { &cxusb_table[9], NULL },
1543  { &cxusb_table[10], NULL },
1544  },
1545  { "DViCO FusionHDTV DVB-T Dual Digital 2",
1546  { &cxusb_table[11], NULL },
1547  { &cxusb_table[12], NULL },
1548  },
1549  }
1550 };
1551 
1552 static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
1553  .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1554 
1555  .usb_ctrl = DEVICE_SPECIFIC,
1556  .firmware = "dvb-usb-bluebird-01.fw",
1557  .download_firmware = bluebird_patch_dvico_firmware_download,
1558  /* use usb alt setting 0 for EP4 transfer (dvb-t),
1559  use usb alt setting 7 for EP2 transfer (atsc) */
1560 
1561  .size_of_priv = sizeof(struct cxusb_state),
1562 
1563  .num_adapters = 2,
1564  .adapter = {
1565  {
1566  .num_frontends = 1,
1567  .fe = {{
1568  .streaming_ctrl = cxusb_streaming_ctrl,
1569  .frontend_attach = cxusb_mt352_frontend_attach,
1570  .tuner_attach = cxusb_lgz201_tuner_attach,
1571 
1572  /* parameter for the MPEG2-data transfer */
1573  .stream = {
1574  .type = USB_BULK,
1575  .count = 5,
1576  .endpoint = 0x04,
1577  .u = {
1578  .bulk = {
1579  .buffersize = 8192,
1580  }
1581  }
1582  },
1583  }},
1584  },
1585  },
1586  .power_ctrl = cxusb_bluebird_power_ctrl,
1587 
1588  .i2c_algo = &cxusb_i2c_algo,
1589 
1590  .rc.legacy = {
1591  .rc_interval = 100,
1592  .rc_map_table = rc_map_dvico_portable_table,
1593  .rc_map_size = ARRAY_SIZE(rc_map_dvico_portable_table),
1594  .rc_query = cxusb_rc_query,
1595  },
1596 
1597  .generic_bulk_ctrl_endpoint = 0x01,
1598  .num_device_descs = 1,
1599  .devices = {
1600  { "DViCO FusionHDTV DVB-T USB (LGZ201)",
1601  { &cxusb_table[5], NULL },
1602  { &cxusb_table[6], NULL },
1603  },
1604  }
1605 };
1606 
1607 static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties = {
1608  .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1609 
1610  .usb_ctrl = DEVICE_SPECIFIC,
1611  .firmware = "dvb-usb-bluebird-01.fw",
1612  .download_firmware = bluebird_patch_dvico_firmware_download,
1613  /* use usb alt setting 0 for EP4 transfer (dvb-t),
1614  use usb alt setting 7 for EP2 transfer (atsc) */
1615 
1616  .size_of_priv = sizeof(struct cxusb_state),
1617 
1618  .num_adapters = 1,
1619  .adapter = {
1620  {
1621  .num_frontends = 1,
1622  .fe = {{
1623  .streaming_ctrl = cxusb_streaming_ctrl,
1624  .frontend_attach = cxusb_mt352_frontend_attach,
1625  .tuner_attach = cxusb_dtt7579_tuner_attach,
1626 
1627  /* parameter for the MPEG2-data transfer */
1628  .stream = {
1629  .type = USB_BULK,
1630  .count = 5,
1631  .endpoint = 0x04,
1632  .u = {
1633  .bulk = {
1634  .buffersize = 8192,
1635  }
1636  }
1637  },
1638  }},
1639  },
1640  },
1641  .power_ctrl = cxusb_bluebird_power_ctrl,
1642 
1643  .i2c_algo = &cxusb_i2c_algo,
1644 
1645  .rc.legacy = {
1646  .rc_interval = 100,
1647  .rc_map_table = rc_map_dvico_portable_table,
1648  .rc_map_size = ARRAY_SIZE(rc_map_dvico_portable_table),
1649  .rc_query = cxusb_rc_query,
1650  },
1651 
1652  .generic_bulk_ctrl_endpoint = 0x01,
1653 
1654  .num_device_descs = 1,
1655  .devices = {
1656  { "DViCO FusionHDTV DVB-T USB (TH7579)",
1657  { &cxusb_table[7], NULL },
1658  { &cxusb_table[8], NULL },
1659  },
1660  }
1661 };
1662 
1663 static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties = {
1664  .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1665 
1666  .usb_ctrl = CYPRESS_FX2,
1667 
1668  .size_of_priv = sizeof(struct cxusb_state),
1669 
1670  .num_adapters = 1,
1671  .adapter = {
1672  {
1673  .num_frontends = 1,
1674  .fe = {{
1675  .streaming_ctrl = cxusb_streaming_ctrl,
1676  .frontend_attach = cxusb_dualdig4_frontend_attach,
1677  .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
1678  /* parameter for the MPEG2-data transfer */
1679  .stream = {
1680  .type = USB_BULK,
1681  .count = 5,
1682  .endpoint = 0x02,
1683  .u = {
1684  .bulk = {
1685  .buffersize = 8192,
1686  }
1687  }
1688  },
1689  }},
1690  },
1691  },
1692 
1693  .power_ctrl = cxusb_power_ctrl,
1694 
1695  .i2c_algo = &cxusb_i2c_algo,
1696 
1697  .generic_bulk_ctrl_endpoint = 0x01,
1698 
1699  .rc.legacy = {
1700  .rc_interval = 100,
1701  .rc_map_table = rc_map_dvico_mce_table,
1702  .rc_map_size = ARRAY_SIZE(rc_map_dvico_mce_table),
1703  .rc_query = cxusb_bluebird2_rc_query,
1704  },
1705 
1706  .num_device_descs = 1,
1707  .devices = {
1708  { "DViCO FusionHDTV DVB-T Dual Digital 4",
1709  { NULL },
1710  { &cxusb_table[13], NULL },
1711  },
1712  }
1713 };
1714 
1715 static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties = {
1716  .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1717 
1718  .usb_ctrl = CYPRESS_FX2,
1719  .identify_state = bluebird_fx2_identify_state,
1720 
1721  .size_of_priv = sizeof(struct cxusb_state),
1722 
1723  .num_adapters = 1,
1724  .adapter = {
1725  {
1726  .num_frontends = 1,
1727  .fe = {{
1728  .streaming_ctrl = cxusb_streaming_ctrl,
1729  .frontend_attach = cxusb_nano2_frontend_attach,
1730  .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
1731  /* parameter for the MPEG2-data transfer */
1732  .stream = {
1733  .type = USB_BULK,
1734  .count = 5,
1735  .endpoint = 0x02,
1736  .u = {
1737  .bulk = {
1738  .buffersize = 8192,
1739  }
1740  }
1741  },
1742  }},
1743  },
1744  },
1745 
1746  .power_ctrl = cxusb_nano2_power_ctrl,
1747 
1748  .i2c_algo = &cxusb_i2c_algo,
1749 
1750  .generic_bulk_ctrl_endpoint = 0x01,
1751 
1752  .rc.legacy = {
1753  .rc_interval = 100,
1754  .rc_map_table = rc_map_dvico_portable_table,
1755  .rc_map_size = ARRAY_SIZE(rc_map_dvico_portable_table),
1756  .rc_query = cxusb_bluebird2_rc_query,
1757  },
1758 
1759  .num_device_descs = 1,
1760  .devices = {
1761  { "DViCO FusionHDTV DVB-T NANO2",
1762  { NULL },
1763  { &cxusb_table[14], NULL },
1764  },
1765  }
1766 };
1767 
1768 static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_properties = {
1769  .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1770 
1771  .usb_ctrl = DEVICE_SPECIFIC,
1772  .firmware = "dvb-usb-bluebird-02.fw",
1773  .download_firmware = bluebird_patch_dvico_firmware_download,
1774  .identify_state = bluebird_fx2_identify_state,
1775 
1776  .size_of_priv = sizeof(struct cxusb_state),
1777 
1778  .num_adapters = 1,
1779  .adapter = {
1780  {
1781  .num_frontends = 1,
1782  .fe = {{
1783  .streaming_ctrl = cxusb_streaming_ctrl,
1784  .frontend_attach = cxusb_nano2_frontend_attach,
1785  .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
1786  /* parameter for the MPEG2-data transfer */
1787  .stream = {
1788  .type = USB_BULK,
1789  .count = 5,
1790  .endpoint = 0x02,
1791  .u = {
1792  .bulk = {
1793  .buffersize = 8192,
1794  }
1795  }
1796  },
1797  }},
1798  },
1799  },
1800 
1801  .power_ctrl = cxusb_nano2_power_ctrl,
1802 
1803  .i2c_algo = &cxusb_i2c_algo,
1804 
1805  .generic_bulk_ctrl_endpoint = 0x01,
1806 
1807  .rc.legacy = {
1808  .rc_interval = 100,
1809  .rc_map_table = rc_map_dvico_portable_table,
1810  .rc_map_size = ARRAY_SIZE(rc_map_dvico_portable_table),
1811  .rc_query = cxusb_rc_query,
1812  },
1813 
1814  .num_device_descs = 1,
1815  .devices = {
1816  { "DViCO FusionHDTV DVB-T NANO2 w/o firmware",
1817  { &cxusb_table[14], NULL },
1818  { &cxusb_table[15], NULL },
1819  },
1820  }
1821 };
1822 
1823 static struct dvb_usb_device_properties cxusb_aver_a868r_properties = {
1824  .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1825 
1826  .usb_ctrl = CYPRESS_FX2,
1827 
1828  .size_of_priv = sizeof(struct cxusb_state),
1829 
1830  .num_adapters = 1,
1831  .adapter = {
1832  {
1833  .num_frontends = 1,
1834  .fe = {{
1835  .streaming_ctrl = cxusb_aver_streaming_ctrl,
1836  .frontend_attach = cxusb_aver_lgdt3303_frontend_attach,
1837  .tuner_attach = cxusb_mxl5003s_tuner_attach,
1838  /* parameter for the MPEG2-data transfer */
1839  .stream = {
1840  .type = USB_BULK,
1841  .count = 5,
1842  .endpoint = 0x04,
1843  .u = {
1844  .bulk = {
1845  .buffersize = 8192,
1846  }
1847  }
1848  },
1849  }},
1850  },
1851  },
1852  .power_ctrl = cxusb_aver_power_ctrl,
1853 
1854  .i2c_algo = &cxusb_i2c_algo,
1855 
1856  .generic_bulk_ctrl_endpoint = 0x01,
1857 
1858  .num_device_descs = 1,
1859  .devices = {
1860  { "AVerMedia AVerTVHD Volar (A868R)",
1861  { NULL },
1862  { &cxusb_table[16], NULL },
1863  },
1864  }
1865 };
1866 
1867 static
1868 struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties = {
1869  .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1870 
1871  .usb_ctrl = CYPRESS_FX2,
1872 
1873  .size_of_priv = sizeof(struct cxusb_state),
1874 
1875  .num_adapters = 1,
1876  .adapter = {
1877  {
1878  .size_of_priv = sizeof(struct dib0700_adapter_state),
1879  .num_frontends = 1,
1880  .fe = {{
1881  .streaming_ctrl = cxusb_streaming_ctrl,
1882  .frontend_attach = cxusb_dualdig4_rev2_frontend_attach,
1883  .tuner_attach = cxusb_dualdig4_rev2_tuner_attach,
1884  /* parameter for the MPEG2-data transfer */
1885  .stream = {
1886  .type = USB_BULK,
1887  .count = 7,
1888  .endpoint = 0x02,
1889  .u = {
1890  .bulk = {
1891  .buffersize = 4096,
1892  }
1893  }
1894  },
1895  }},
1896  },
1897  },
1898 
1899  .power_ctrl = cxusb_bluebird_power_ctrl,
1900 
1901  .i2c_algo = &cxusb_i2c_algo,
1902 
1903  .generic_bulk_ctrl_endpoint = 0x01,
1904 
1905  .rc.legacy = {
1906  .rc_interval = 100,
1907  .rc_map_table = rc_map_dvico_mce_table,
1908  .rc_map_size = ARRAY_SIZE(rc_map_dvico_mce_table),
1909  .rc_query = cxusb_rc_query,
1910  },
1911 
1912  .num_device_descs = 1,
1913  .devices = {
1914  { "DViCO FusionHDTV DVB-T Dual Digital 4 (rev 2)",
1915  { NULL },
1916  { &cxusb_table[17], NULL },
1917  },
1918  }
1919 };
1920 
1921 static struct dvb_usb_device_properties cxusb_d680_dmb_properties = {
1922  .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1923 
1924  .usb_ctrl = CYPRESS_FX2,
1925 
1926  .size_of_priv = sizeof(struct cxusb_state),
1927 
1928  .num_adapters = 1,
1929  .adapter = {
1930  {
1931  .num_frontends = 1,
1932  .fe = {{
1933  .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl,
1934  .frontend_attach = cxusb_d680_dmb_frontend_attach,
1935  .tuner_attach = cxusb_d680_dmb_tuner_attach,
1936 
1937  /* parameter for the MPEG2-data transfer */
1938  .stream = {
1939  .type = USB_BULK,
1940  .count = 5,
1941  .endpoint = 0x02,
1942  .u = {
1943  .bulk = {
1944  .buffersize = 8192,
1945  }
1946  }
1947  },
1948  }},
1949  },
1950  },
1951 
1952  .power_ctrl = cxusb_d680_dmb_power_ctrl,
1953 
1954  .i2c_algo = &cxusb_i2c_algo,
1955 
1956  .generic_bulk_ctrl_endpoint = 0x01,
1957 
1958  .rc.legacy = {
1959  .rc_interval = 100,
1960  .rc_map_table = rc_map_d680_dmb_table,
1961  .rc_map_size = ARRAY_SIZE(rc_map_d680_dmb_table),
1962  .rc_query = cxusb_d680_dmb_rc_query,
1963  },
1964 
1965  .num_device_descs = 1,
1966  .devices = {
1967  {
1968  "Conexant DMB-TH Stick",
1969  { NULL },
1970  { &cxusb_table[18], NULL },
1971  },
1972  }
1973 };
1974 
1975 static struct dvb_usb_device_properties cxusb_mygica_d689_properties = {
1976  .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1977 
1978  .usb_ctrl = CYPRESS_FX2,
1979 
1980  .size_of_priv = sizeof(struct cxusb_state),
1981 
1982  .num_adapters = 1,
1983  .adapter = {
1984  {
1985  .num_frontends = 1,
1986  .fe = {{
1987  .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl,
1988  .frontend_attach = cxusb_mygica_d689_frontend_attach,
1989  .tuner_attach = cxusb_mygica_d689_tuner_attach,
1990 
1991  /* parameter for the MPEG2-data transfer */
1992  .stream = {
1993  .type = USB_BULK,
1994  .count = 5,
1995  .endpoint = 0x02,
1996  .u = {
1997  .bulk = {
1998  .buffersize = 8192,
1999  }
2000  }
2001  },
2002  }},
2003  },
2004  },
2005 
2006  .power_ctrl = cxusb_d680_dmb_power_ctrl,
2007 
2008  .i2c_algo = &cxusb_i2c_algo,
2009 
2010  .generic_bulk_ctrl_endpoint = 0x01,
2011 
2012  .rc.legacy = {
2013  .rc_interval = 100,
2014  .rc_map_table = rc_map_d680_dmb_table,
2015  .rc_map_size = ARRAY_SIZE(rc_map_d680_dmb_table),
2016  .rc_query = cxusb_d680_dmb_rc_query,
2017  },
2018 
2019  .num_device_descs = 1,
2020  .devices = {
2021  {
2022  "Mygica D689 DMB-TH",
2023  { NULL },
2024  { &cxusb_table[19], NULL },
2025  },
2026  }
2027 };
2028 
2029 static struct usb_driver cxusb_driver = {
2030  .name = "dvb_usb_cxusb",
2031  .probe = cxusb_probe,
2032  .disconnect = dvb_usb_device_exit,
2033  .id_table = cxusb_table,
2034 };
2035 
2036 module_usb_driver(cxusb_driver);
2037 
2038 MODULE_AUTHOR("Patrick Boettcher <[email protected]>");
2039 MODULE_AUTHOR("Michael Krufky <[email protected]>");
2040 MODULE_AUTHOR("Chris Pascoe <[email protected]>");
2041 MODULE_DESCRIPTION("Driver for Conexant USB2.0 hybrid reference design");
2042 MODULE_VERSION("1.0-alpha");
2043 MODULE_LICENSE("GPL");