pandora: defconfig: update
[pandora-kernel.git] / drivers / media / dvb / dvb-usb / dw2102.c
1 /* DVB USB framework compliant Linux driver for the
2  *      DVBWorld DVB-S 2101, 2102, DVB-S2 2104, DVB-C 3101,
3  *      TeVii S600, S630, S650, S660, S480,
4  *      Prof 1100, 7500,
5  *      Geniatech SU3000 Cards
6  * Copyright (C) 2008-2011 Igor M. Liplianin (liplianin@me.by)
7  *
8  *      This program is free software; you can redistribute it and/or modify it
9  *      under the terms of the GNU General Public License as published by the
10  *      Free Software Foundation, version 2.
11  *
12  * see Documentation/dvb/README.dvb-usb for more information
13  */
14 #include "dw2102.h"
15 #include "si21xx.h"
16 #include "stv0299.h"
17 #include "z0194a.h"
18 #include "stv0288.h"
19 #include "stb6000.h"
20 #include "eds1547.h"
21 #include "cx24116.h"
22 #include "tda1002x.h"
23 #include "mt312.h"
24 #include "zl10039.h"
25 #include "ds3000.h"
26 #include "stv0900.h"
27 #include "stv6110.h"
28 #include "stb6100.h"
29 #include "stb6100_proc.h"
30
31 /* Max transfer size done by I2C transfer functions */
32 #define MAX_XFER_SIZE  64
33
34 #ifndef USB_PID_DW2102
35 #define USB_PID_DW2102 0x2102
36 #endif
37
38 #ifndef USB_PID_DW2104
39 #define USB_PID_DW2104 0x2104
40 #endif
41
42 #ifndef USB_PID_DW3101
43 #define USB_PID_DW3101 0x3101
44 #endif
45
46 #ifndef USB_PID_CINERGY_S
47 #define USB_PID_CINERGY_S 0x0064
48 #endif
49
50 #ifndef USB_PID_TEVII_S630
51 #define USB_PID_TEVII_S630 0xd630
52 #endif
53
54 #ifndef USB_PID_TEVII_S650
55 #define USB_PID_TEVII_S650 0xd650
56 #endif
57
58 #ifndef USB_PID_TEVII_S660
59 #define USB_PID_TEVII_S660 0xd660
60 #endif
61
62 #ifndef USB_PID_TEVII_S480_1
63 #define USB_PID_TEVII_S480_1 0xd481
64 #endif
65
66 #ifndef USB_PID_TEVII_S480_2
67 #define USB_PID_TEVII_S480_2 0xd482
68 #endif
69
70 #ifndef USB_PID_PROF_1100
71 #define USB_PID_PROF_1100 0xb012
72 #endif
73
74 #define DW210X_READ_MSG 0
75 #define DW210X_WRITE_MSG 1
76
77 #define REG_1F_SYMBOLRATE_BYTE0 0x1f
78 #define REG_20_SYMBOLRATE_BYTE1 0x20
79 #define REG_21_SYMBOLRATE_BYTE2 0x21
80 /* on my own*/
81 #define DW2102_VOLTAGE_CTRL (0x1800)
82 #define SU3000_STREAM_CTRL (0x1900)
83 #define DW2102_RC_QUERY (0x1a00)
84 #define DW2102_LED_CTRL (0x1b00)
85
86 #define err_str "did not find the firmware file. (%s) " \
87                 "Please see linux/Documentation/dvb/ for more details " \
88                 "on firmware-problems."
89
90 struct rc_map_dvb_usb_table_table {
91         struct rc_map_table *rc_keys;
92         int rc_keys_size;
93 };
94
95 struct su3000_state {
96         u8 initialized;
97 };
98
99 struct s6x0_state {
100         int (*old_set_voltage)(struct dvb_frontend *f, fe_sec_voltage_t v);
101 };
102
103 /* debug */
104 static int dvb_usb_dw2102_debug;
105 module_param_named(debug, dvb_usb_dw2102_debug, int, 0644);
106 MODULE_PARM_DESC(debug, "set debugging level (1=info 2=xfer 4=rc(or-able))."
107                                                 DVB_USB_DEBUG_STATUS);
108
109 /* keymaps */
110 static int ir_keymap;
111 module_param_named(keymap, ir_keymap, int, 0644);
112 MODULE_PARM_DESC(keymap, "set keymap 0=default 1=dvbworld 2=tevii 3=tbs  ..."
113                         " 256=none");
114
115 /* demod probe */
116 static int demod_probe = 1;
117 module_param_named(demod, demod_probe, int, 0644);
118 MODULE_PARM_DESC(demod, "demod to probe (1=cx24116 2=stv0903+stv6110 "
119                         "4=stv0903+stb6100(or-able)).");
120
121 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
122
123 static int dw210x_op_rw(struct usb_device *dev, u8 request, u16 value,
124                         u16 index, u8 * data, u16 len, int flags)
125 {
126         int ret;
127         u8 *u8buf;
128         unsigned int pipe = (flags == DW210X_READ_MSG) ?
129                                 usb_rcvctrlpipe(dev, 0) : usb_sndctrlpipe(dev, 0);
130         u8 request_type = (flags == DW210X_READ_MSG) ? USB_DIR_IN : USB_DIR_OUT;
131
132         u8buf = kmalloc(len, GFP_KERNEL);
133         if (!u8buf)
134                 return -ENOMEM;
135
136
137         if (flags == DW210X_WRITE_MSG)
138                 memcpy(u8buf, data, len);
139         ret = usb_control_msg(dev, pipe, request, request_type | USB_TYPE_VENDOR,
140                                 value, index , u8buf, len, 2000);
141
142         if (flags == DW210X_READ_MSG)
143                 memcpy(data, u8buf, len);
144
145         kfree(u8buf);
146         return ret;
147 }
148
149 /* I2C */
150 static int dw2102_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
151                 int num)
152 {
153         struct dvb_usb_device *d = i2c_get_adapdata(adap);
154         int i = 0, ret = 0;
155         u8 buf6[] = {0x2c, 0x05, 0xc0, 0, 0, 0, 0};
156         u16 value;
157
158         if (!d)
159                 return -ENODEV;
160         if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
161                 return -EAGAIN;
162
163         switch (num) {
164         case 2:
165                 /* read stv0299 register */
166                 value = msg[0].buf[0];/* register */
167                 for (i = 0; i < msg[1].len; i++) {
168                         ret = dw210x_op_rw(d->udev, 0xb5, value + i, 0,
169                                         buf6, 2, DW210X_READ_MSG);
170                         msg[1].buf[i] = buf6[0];
171                 }
172                 break;
173         case 1:
174                 switch (msg[0].addr) {
175                 case 0x68:
176                         /* write to stv0299 register */
177                         buf6[0] = 0x2a;
178                         buf6[1] = msg[0].buf[0];
179                         buf6[2] = msg[0].buf[1];
180                         ret = dw210x_op_rw(d->udev, 0xb2, 0, 0,
181                                         buf6, 3, DW210X_WRITE_MSG);
182                         break;
183                 case 0x60:
184                         if (msg[0].flags == 0) {
185                         /* write to tuner pll */
186                                 buf6[0] = 0x2c;
187                                 buf6[1] = 5;
188                                 buf6[2] = 0xc0;
189                                 buf6[3] = msg[0].buf[0];
190                                 buf6[4] = msg[0].buf[1];
191                                 buf6[5] = msg[0].buf[2];
192                                 buf6[6] = msg[0].buf[3];
193                                 ret = dw210x_op_rw(d->udev, 0xb2, 0, 0,
194                                                 buf6, 7, DW210X_WRITE_MSG);
195                         } else {
196                         /* read from tuner */
197                                 ret = dw210x_op_rw(d->udev, 0xb5, 0, 0,
198                                                 buf6, 1, DW210X_READ_MSG);
199                                 msg[0].buf[0] = buf6[0];
200                         }
201                         break;
202                 case (DW2102_RC_QUERY):
203                         ret  = dw210x_op_rw(d->udev, 0xb8, 0, 0,
204                                         buf6, 2, DW210X_READ_MSG);
205                         msg[0].buf[0] = buf6[0];
206                         msg[0].buf[1] = buf6[1];
207                         break;
208                 case (DW2102_VOLTAGE_CTRL):
209                         buf6[0] = 0x30;
210                         buf6[1] = msg[0].buf[0];
211                         ret = dw210x_op_rw(d->udev, 0xb2, 0, 0,
212                                         buf6, 2, DW210X_WRITE_MSG);
213                         break;
214                 }
215
216                 break;
217         }
218
219         mutex_unlock(&d->i2c_mutex);
220         return num;
221 }
222
223 static int dw2102_serit_i2c_transfer(struct i2c_adapter *adap,
224                                                 struct i2c_msg msg[], int num)
225 {
226         struct dvb_usb_device *d = i2c_get_adapdata(adap);
227         int ret = 0;
228         u8 buf6[] = {0, 0, 0, 0, 0, 0, 0};
229
230         if (!d)
231                 return -ENODEV;
232         if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
233                 return -EAGAIN;
234
235         switch (num) {
236         case 2:
237                 if (msg[0].len != 1) {
238                         warn("i2c rd: len=%d is not 1!\n",
239                              msg[0].len);
240                         num = -EOPNOTSUPP;
241                         break;
242                 }
243
244                 if (2 + msg[1].len > sizeof(buf6)) {
245                         warn("i2c rd: len=%d is too big!\n",
246                              msg[1].len);
247                         num = -EOPNOTSUPP;
248                         break;
249                 }
250
251                 /* read si2109 register by number */
252                 buf6[0] = msg[0].addr << 1;
253                 buf6[1] = msg[0].len;
254                 buf6[2] = msg[0].buf[0];
255                 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
256                                 buf6, msg[0].len + 2, DW210X_WRITE_MSG);
257                 /* read si2109 register */
258                 ret = dw210x_op_rw(d->udev, 0xc3, 0xd0, 0,
259                                 buf6, msg[1].len + 2, DW210X_READ_MSG);
260                 memcpy(msg[1].buf, buf6 + 2, msg[1].len);
261
262                 break;
263         case 1:
264                 switch (msg[0].addr) {
265                 case 0x68:
266                         if (2 + msg[0].len > sizeof(buf6)) {
267                                 warn("i2c wr: len=%d is too big!\n",
268                                      msg[0].len);
269                                 num = -EOPNOTSUPP;
270                                 break;
271                         }
272
273                         /* write to si2109 register */
274                         buf6[0] = msg[0].addr << 1;
275                         buf6[1] = msg[0].len;
276                         memcpy(buf6 + 2, msg[0].buf, msg[0].len);
277                         ret = dw210x_op_rw(d->udev, 0xc2, 0, 0, buf6,
278                                         msg[0].len + 2, DW210X_WRITE_MSG);
279                         break;
280                 case(DW2102_RC_QUERY):
281                         ret  = dw210x_op_rw(d->udev, 0xb8, 0, 0,
282                                         buf6, 2, DW210X_READ_MSG);
283                         msg[0].buf[0] = buf6[0];
284                         msg[0].buf[1] = buf6[1];
285                         break;
286                 case(DW2102_VOLTAGE_CTRL):
287                         buf6[0] = 0x30;
288                         buf6[1] = msg[0].buf[0];
289                         ret = dw210x_op_rw(d->udev, 0xb2, 0, 0,
290                                         buf6, 2, DW210X_WRITE_MSG);
291                         break;
292                 }
293                 break;
294         }
295
296         mutex_unlock(&d->i2c_mutex);
297         return num;
298 }
299
300 static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num)
301 {
302         struct dvb_usb_device *d = i2c_get_adapdata(adap);
303         int ret = 0;
304
305         if (!d)
306                 return -ENODEV;
307         if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
308                 return -EAGAIN;
309
310         switch (num) {
311         case 2: {
312                 /* read */
313                 /* first write first register number */
314                 u8 ibuf[MAX_XFER_SIZE], obuf[3];
315
316                 if (2 + msg[0].len != sizeof(obuf)) {
317                         warn("i2c rd: len=%d is not 1!\n",
318                              msg[0].len);
319                         ret = -EOPNOTSUPP;
320                         goto unlock;
321                 }
322
323                 if (2 + msg[1].len > sizeof(ibuf)) {
324                         warn("i2c rd: len=%d is too big!\n",
325                              msg[1].len);
326                         ret = -EOPNOTSUPP;
327                         goto unlock;
328                 }
329
330                 obuf[0] = msg[0].addr << 1;
331                 obuf[1] = msg[0].len;
332                 obuf[2] = msg[0].buf[0];
333                 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
334                                 obuf, msg[0].len + 2, DW210X_WRITE_MSG);
335                 /* second read registers */
336                 ret = dw210x_op_rw(d->udev, 0xc3, 0xd1 , 0,
337                                 ibuf, msg[1].len + 2, DW210X_READ_MSG);
338                 memcpy(msg[1].buf, ibuf + 2, msg[1].len);
339
340                 break;
341         }
342         case 1:
343                 switch (msg[0].addr) {
344                 case 0x68: {
345                         /* write to register */
346                         u8 obuf[MAX_XFER_SIZE];
347
348                         if (2 + msg[0].len > sizeof(obuf)) {
349                                 warn("i2c wr: len=%d is too big!\n",
350                                      msg[1].len);
351                                 ret = -EOPNOTSUPP;
352                                 goto unlock;
353                         }
354
355                         obuf[0] = msg[0].addr << 1;
356                         obuf[1] = msg[0].len;
357                         memcpy(obuf + 2, msg[0].buf, msg[0].len);
358                         ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
359                                         obuf, msg[0].len + 2, DW210X_WRITE_MSG);
360                         break;
361                 }
362                 case 0x61: {
363                         /* write to tuner */
364                         u8 obuf[MAX_XFER_SIZE];
365
366                         if (2 + msg[0].len > sizeof(obuf)) {
367                                 warn("i2c wr: len=%d is too big!\n",
368                                      msg[1].len);
369                                 ret = -EOPNOTSUPP;
370                                 goto unlock;
371                         }
372
373                         obuf[0] = msg[0].addr << 1;
374                         obuf[1] = msg[0].len;
375                         memcpy(obuf + 2, msg[0].buf, msg[0].len);
376                         ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
377                                         obuf, msg[0].len + 2, DW210X_WRITE_MSG);
378                         break;
379                 }
380                 case(DW2102_RC_QUERY): {
381                         u8 ibuf[2];
382                         ret  = dw210x_op_rw(d->udev, 0xb8, 0, 0,
383                                         ibuf, 2, DW210X_READ_MSG);
384                         memcpy(msg[0].buf, ibuf , 2);
385                         break;
386                 }
387                 case(DW2102_VOLTAGE_CTRL): {
388                         u8 obuf[2];
389                         obuf[0] = 0x30;
390                         obuf[1] = msg[0].buf[0];
391                         ret = dw210x_op_rw(d->udev, 0xb2, 0, 0,
392                                         obuf, 2, DW210X_WRITE_MSG);
393                         break;
394                 }
395                 }
396
397                 break;
398         }
399         ret = num;
400
401 unlock:
402         mutex_unlock(&d->i2c_mutex);
403         return ret;
404 }
405
406 static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num)
407 {
408         struct dvb_usb_device *d = i2c_get_adapdata(adap);
409         int ret = 0;
410         int len, i, j;
411
412         if (!d)
413                 return -ENODEV;
414         if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
415                 return -EAGAIN;
416
417         for (j = 0; j < num; j++) {
418                 switch (msg[j].addr) {
419                 case(DW2102_RC_QUERY): {
420                         u8 ibuf[2];
421                         ret  = dw210x_op_rw(d->udev, 0xb8, 0, 0,
422                                         ibuf, 2, DW210X_READ_MSG);
423                         memcpy(msg[j].buf, ibuf , 2);
424                         break;
425                 }
426                 case(DW2102_VOLTAGE_CTRL): {
427                         u8 obuf[2];
428                         obuf[0] = 0x30;
429                         obuf[1] = msg[j].buf[0];
430                         ret = dw210x_op_rw(d->udev, 0xb2, 0, 0,
431                                         obuf, 2, DW210X_WRITE_MSG);
432                         break;
433                 }
434                 /*case 0x55: cx24116
435                 case 0x6a: stv0903
436                 case 0x68: ds3000, stv0903
437                 case 0x60: ts2020, stv6110, stb6100 */
438                 default: {
439                         if (msg[j].flags == I2C_M_RD) {
440                                 /* read registers */
441                                 u8  ibuf[MAX_XFER_SIZE];
442
443                                 if (2 + msg[j].len > sizeof(ibuf)) {
444                                         warn("i2c rd: len=%d is too big!\n",
445                                              msg[j].len);
446                                         ret = -EOPNOTSUPP;
447                                         goto unlock;
448                                 }
449
450                                 ret = dw210x_op_rw(d->udev, 0xc3,
451                                                 (msg[j].addr << 1) + 1, 0,
452                                                 ibuf, msg[j].len + 2,
453                                                 DW210X_READ_MSG);
454                                 memcpy(msg[j].buf, ibuf + 2, msg[j].len);
455                         mdelay(10);
456                         } else if (((msg[j].buf[0] == 0xb0) &&
457                                                 (msg[j].addr == 0x68)) ||
458                                                 ((msg[j].buf[0] == 0xf7) &&
459                                                 (msg[j].addr == 0x55))) {
460                                 /* write firmware */
461                                 u8 obuf[19];
462                                 obuf[0] = msg[j].addr << 1;
463                                 obuf[1] = (msg[j].len > 15 ? 17 : msg[j].len);
464                                 obuf[2] = msg[j].buf[0];
465                                 len = msg[j].len - 1;
466                                 i = 1;
467                                 do {
468                                         memcpy(obuf + 3, msg[j].buf + i,
469                                                         (len > 16 ? 16 : len));
470                                         ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
471                                                 obuf, (len > 16 ? 16 : len) + 3,
472                                                 DW210X_WRITE_MSG);
473                                         i += 16;
474                                         len -= 16;
475                                 } while (len > 0);
476                         } else {
477                                 /* write registers */
478                                 u8 obuf[MAX_XFER_SIZE];
479
480                                 if (2 + msg[j].len > sizeof(obuf)) {
481                                         warn("i2c wr: len=%d is too big!\n",
482                                              msg[j].len);
483                                         ret = -EOPNOTSUPP;
484                                         goto unlock;
485                                 }
486
487                                 obuf[0] = msg[j].addr << 1;
488                                 obuf[1] = msg[j].len;
489                                 memcpy(obuf + 2, msg[j].buf, msg[j].len);
490                                 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
491                                                 obuf, msg[j].len + 2,
492                                                 DW210X_WRITE_MSG);
493                         }
494                         break;
495                 }
496                 }
497
498         }
499         ret = num;
500
501 unlock:
502         mutex_unlock(&d->i2c_mutex);
503         return ret;
504 }
505
506 static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
507                                                                 int num)
508 {
509         struct dvb_usb_device *d = i2c_get_adapdata(adap);
510         int ret = 0, i;
511
512         if (!d)
513                 return -ENODEV;
514         if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
515                 return -EAGAIN;
516
517         switch (num) {
518         case 2: {
519                 /* read */
520                 /* first write first register number */
521                 u8 ibuf[MAX_XFER_SIZE], obuf[3];
522
523                 if (2 + msg[0].len != sizeof(obuf)) {
524                         warn("i2c rd: len=%d is not 1!\n",
525                              msg[0].len);
526                         ret = -EOPNOTSUPP;
527                         goto unlock;
528                 }
529                 if (2 + msg[1].len > sizeof(ibuf)) {
530                         warn("i2c rd: len=%d is too big!\n",
531                              msg[1].len);
532                         ret = -EOPNOTSUPP;
533                         goto unlock;
534                 }
535                 obuf[0] = msg[0].addr << 1;
536                 obuf[1] = msg[0].len;
537                 obuf[2] = msg[0].buf[0];
538                 ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
539                                 obuf, msg[0].len + 2, DW210X_WRITE_MSG);
540                 /* second read registers */
541                 ret = dw210x_op_rw(d->udev, 0xc3, 0x19 , 0,
542                                 ibuf, msg[1].len + 2, DW210X_READ_MSG);
543                 memcpy(msg[1].buf, ibuf + 2, msg[1].len);
544
545                 break;
546         }
547         case 1:
548                 switch (msg[0].addr) {
549                 case 0x60:
550                 case 0x0c: {
551                         /* write to register */
552                         u8 obuf[MAX_XFER_SIZE];
553
554                         if (2 + msg[0].len > sizeof(obuf)) {
555                                 warn("i2c wr: len=%d is too big!\n",
556                                      msg[0].len);
557                                 ret = -EOPNOTSUPP;
558                                 goto unlock;
559                         }
560                         obuf[0] = msg[0].addr << 1;
561                         obuf[1] = msg[0].len;
562                         memcpy(obuf + 2, msg[0].buf, msg[0].len);
563                         ret = dw210x_op_rw(d->udev, 0xc2, 0, 0,
564                                         obuf, msg[0].len + 2, DW210X_WRITE_MSG);
565                         break;
566                 }
567                 case(DW2102_RC_QUERY): {
568                         u8 ibuf[2];
569                         ret  = dw210x_op_rw(d->udev, 0xb8, 0, 0,
570                                         ibuf, 2, DW210X_READ_MSG);
571                         memcpy(msg[0].buf, ibuf , 2);
572                         break;
573                 }
574                 }
575
576                 break;
577         }
578
579         for (i = 0; i < num; i++) {
580                 deb_xfer("%02x:%02x: %s ", i, msg[i].addr,
581                                 msg[i].flags == 0 ? ">>>" : "<<<");
582                 debug_dump(msg[i].buf, msg[i].len, deb_xfer);
583         }
584         ret = num;
585
586 unlock:
587         mutex_unlock(&d->i2c_mutex);
588         return ret;
589 }
590
591 static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
592                                                                 int num)
593 {
594         struct dvb_usb_device *d = i2c_get_adapdata(adap);
595         struct usb_device *udev;
596         int ret = 0;
597         int len, i, j;
598
599         if (!d)
600                 return -ENODEV;
601         udev = d->udev;
602         if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
603                 return -EAGAIN;
604
605         for (j = 0; j < num; j++) {
606                 switch (msg[j].addr) {
607                 case (DW2102_RC_QUERY): {
608                         u8 ibuf[5];
609                         ret  = dw210x_op_rw(d->udev, 0xb8, 0, 0,
610                                         ibuf, 5, DW210X_READ_MSG);
611                         memcpy(msg[j].buf, ibuf + 3, 2);
612                         break;
613                 }
614                 case (DW2102_VOLTAGE_CTRL): {
615                         u8 obuf[2];
616
617                         obuf[0] = 1;
618                         obuf[1] = msg[j].buf[1];/* off-on */
619                         ret = dw210x_op_rw(d->udev, 0x8a, 0, 0,
620                                         obuf, 2, DW210X_WRITE_MSG);
621                         obuf[0] = 3;
622                         obuf[1] = msg[j].buf[0];/* 13v-18v */
623                         ret = dw210x_op_rw(d->udev, 0x8a, 0, 0,
624                                         obuf, 2, DW210X_WRITE_MSG);
625                         break;
626                 }
627                 case (DW2102_LED_CTRL): {
628                         u8 obuf[2];
629
630                         obuf[0] = 5;
631                         obuf[1] = msg[j].buf[0];
632                         ret = dw210x_op_rw(d->udev, 0x8a, 0, 0,
633                                         obuf, 2, DW210X_WRITE_MSG);
634                         break;
635                 }
636                 /*case 0x55: cx24116
637                 case 0x6a: stv0903
638                 case 0x68: ds3000, stv0903
639                 case 0x60: ts2020, stv6110, stb6100
640                 case 0xa0: eeprom */
641                 default: {
642                         if (msg[j].flags == I2C_M_RD) {
643                                 /* read registers */
644                                 u8 ibuf[MAX_XFER_SIZE];
645
646                                 if (msg[j].len > sizeof(ibuf)) {
647                                         warn("i2c rd: len=%d is too big!\n",
648                                              msg[j].len);
649                                         ret = -EOPNOTSUPP;
650                                         goto unlock;
651                                 }
652
653                                 ret = dw210x_op_rw(d->udev, 0x91, 0, 0,
654                                                 ibuf, msg[j].len,
655                                                 DW210X_READ_MSG);
656                                 memcpy(msg[j].buf, ibuf, msg[j].len);
657                                 break;
658                         } else if ((msg[j].buf[0] == 0xb0) &&
659                                                 (msg[j].addr == 0x68)) {
660                                 /* write firmware */
661                                 u8 obuf[19];
662                                 obuf[0] = (msg[j].len > 16 ?
663                                                 18 : msg[j].len + 1);
664                                 obuf[1] = msg[j].addr << 1;
665                                 obuf[2] = msg[j].buf[0];
666                                 len = msg[j].len - 1;
667                                 i = 1;
668                                 do {
669                                         memcpy(obuf + 3, msg[j].buf + i,
670                                                         (len > 16 ? 16 : len));
671                                         ret = dw210x_op_rw(d->udev, 0x80, 0, 0,
672                                                 obuf, (len > 16 ? 16 : len) + 3,
673                                                 DW210X_WRITE_MSG);
674                                         i += 16;
675                                         len -= 16;
676                                 } while (len > 0);
677                         } else if (j < (num - 1)) {
678                                 /* write register addr before read */
679                                 u8 obuf[MAX_XFER_SIZE];
680
681                                 if (2 + msg[j].len > sizeof(obuf)) {
682                                         warn("i2c wr: len=%d is too big!\n",
683                                              msg[j].len);
684                                         ret = -EOPNOTSUPP;
685                                         goto unlock;
686                                 }
687
688                                 obuf[0] = msg[j + 1].len;
689                                 obuf[1] = (msg[j].addr << 1);
690                                 memcpy(obuf + 2, msg[j].buf, msg[j].len);
691                                 ret = dw210x_op_rw(d->udev,
692                                                 udev->descriptor.idProduct ==
693                                                 0x7500 ? 0x92 : 0x90, 0, 0,
694                                                 obuf, msg[j].len + 2,
695                                                 DW210X_WRITE_MSG);
696                                 break;
697                         } else {
698                                 /* write registers */
699                                 u8 obuf[MAX_XFER_SIZE];
700
701                                 if (2 + msg[j].len > sizeof(obuf)) {
702                                         warn("i2c wr: len=%d is too big!\n",
703                                              msg[j].len);
704                                         ret = -EOPNOTSUPP;
705                                         goto unlock;
706                                 }
707                                 obuf[0] = msg[j].len + 1;
708                                 obuf[1] = (msg[j].addr << 1);
709                                 memcpy(obuf + 2, msg[j].buf, msg[j].len);
710                                 ret = dw210x_op_rw(d->udev, 0x80, 0, 0,
711                                                 obuf, msg[j].len + 2,
712                                                 DW210X_WRITE_MSG);
713                                 break;
714                         }
715                         break;
716                 }
717                 }
718         }
719         ret = num;
720
721 unlock:
722         mutex_unlock(&d->i2c_mutex);
723         return ret;
724 }
725
726 static int su3000_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
727                                                                 int num)
728 {
729         struct dvb_usb_device *d = i2c_get_adapdata(adap);
730         u8 obuf[0x40], ibuf[0x40];
731
732         if (!d)
733                 return -ENODEV;
734         if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
735                 return -EAGAIN;
736
737         switch (num) {
738         case 1:
739                 switch (msg[0].addr) {
740                 case SU3000_STREAM_CTRL:
741                         obuf[0] = msg[0].buf[0] + 0x36;
742                         obuf[1] = 3;
743                         obuf[2] = 0;
744                         if (dvb_usb_generic_rw(d, obuf, 3, ibuf, 0, 0) < 0)
745                                 err("i2c transfer failed.");
746                         break;
747                 case DW2102_RC_QUERY:
748                         obuf[0] = 0x10;
749                         if (dvb_usb_generic_rw(d, obuf, 1, ibuf, 2, 0) < 0)
750                                 err("i2c transfer failed.");
751                         msg[0].buf[1] = ibuf[0];
752                         msg[0].buf[0] = ibuf[1];
753                         break;
754                 default:
755                         if (3 + msg[0].len > sizeof(obuf)) {
756                                 warn("i2c wr: len=%d is too big!\n",
757                                      msg[0].len);
758                                 num = -EOPNOTSUPP;
759                                 break;
760                         }
761
762                         /* always i2c write*/
763                         obuf[0] = 0x08;
764                         obuf[1] = msg[0].addr;
765                         obuf[2] = msg[0].len;
766
767                         memcpy(&obuf[3], msg[0].buf, msg[0].len);
768
769                         if (dvb_usb_generic_rw(d, obuf, msg[0].len + 3,
770                                                 ibuf, 1, 0) < 0)
771                                 err("i2c transfer failed.");
772
773                 }
774                 break;
775         case 2:
776                 /* always i2c read */
777                 if (4 + msg[0].len > sizeof(obuf)) {
778                         warn("i2c rd: len=%d is too big!\n",
779                              msg[0].len);
780                         num = -EOPNOTSUPP;
781                         break;
782                 }
783                 if (1 + msg[1].len > sizeof(obuf)) {
784                         warn("i2c rd: len=%d is too big!\n",
785                              msg[1].len);
786                         num = -EOPNOTSUPP;
787                         break;
788                 }
789
790                 obuf[0] = 0x09;
791                 obuf[1] = msg[0].len;
792                 obuf[2] = msg[1].len;
793                 obuf[3] = msg[0].addr;
794                 memcpy(&obuf[4], msg[0].buf, msg[0].len);
795
796                 if (dvb_usb_generic_rw(d, obuf, msg[0].len + 4,
797                                         ibuf, msg[1].len + 1, 0) < 0)
798                         err("i2c transfer failed.");
799
800                 memcpy(msg[1].buf, &ibuf[1], msg[1].len);
801                 break;
802         default:
803                 warn("more than 2 i2c messages at a time is not handled yet.");
804                 break;
805         }
806         mutex_unlock(&d->i2c_mutex);
807         return num;
808 }
809
810 static u32 dw210x_i2c_func(struct i2c_adapter *adapter)
811 {
812         return I2C_FUNC_I2C;
813 }
814
815 static struct i2c_algorithm dw2102_i2c_algo = {
816         .master_xfer = dw2102_i2c_transfer,
817         .functionality = dw210x_i2c_func,
818 };
819
820 static struct i2c_algorithm dw2102_serit_i2c_algo = {
821         .master_xfer = dw2102_serit_i2c_transfer,
822         .functionality = dw210x_i2c_func,
823 };
824
825 static struct i2c_algorithm dw2102_earda_i2c_algo = {
826         .master_xfer = dw2102_earda_i2c_transfer,
827         .functionality = dw210x_i2c_func,
828 };
829
830 static struct i2c_algorithm dw2104_i2c_algo = {
831         .master_xfer = dw2104_i2c_transfer,
832         .functionality = dw210x_i2c_func,
833 };
834
835 static struct i2c_algorithm dw3101_i2c_algo = {
836         .master_xfer = dw3101_i2c_transfer,
837         .functionality = dw210x_i2c_func,
838 };
839
840 static struct i2c_algorithm s6x0_i2c_algo = {
841         .master_xfer = s6x0_i2c_transfer,
842         .functionality = dw210x_i2c_func,
843 };
844
845 static struct i2c_algorithm su3000_i2c_algo = {
846         .master_xfer = su3000_i2c_transfer,
847         .functionality = dw210x_i2c_func,
848 };
849
850 static int dw210x_read_mac_address(struct dvb_usb_device *d, u8 mac[6])
851 {
852         int i;
853         u8 ibuf[] = {0, 0};
854         u8 eeprom[256], eepromline[16];
855
856         for (i = 0; i < 256; i++) {
857                 if (dw210x_op_rw(d->udev, 0xb6, 0xa0 , i, ibuf, 2, DW210X_READ_MSG) < 0) {
858                         err("read eeprom failed.");
859                         return -1;
860                 } else {
861                         eepromline[i%16] = ibuf[0];
862                         eeprom[i] = ibuf[0];
863                 }
864                 if ((i % 16) == 15) {
865                         deb_xfer("%02x: ", i - 15);
866                         debug_dump(eepromline, 16, deb_xfer);
867                 }
868         }
869
870         memcpy(mac, eeprom + 8, 6);
871         return 0;
872 };
873
874 static int s6x0_read_mac_address(struct dvb_usb_device *d, u8 mac[6])
875 {
876         int i, ret;
877         u8 ibuf[] = { 0 }, obuf[] = { 0 };
878         u8 eeprom[256], eepromline[16];
879         struct i2c_msg msg[] = {
880                 {
881                         .addr = 0xa0 >> 1,
882                         .flags = 0,
883                         .buf = obuf,
884                         .len = 1,
885                 }, {
886                         .addr = 0xa0 >> 1,
887                         .flags = I2C_M_RD,
888                         .buf = ibuf,
889                         .len = 1,
890                 }
891         };
892
893         for (i = 0; i < 256; i++) {
894                 obuf[0] = i;
895                 ret = s6x0_i2c_transfer(&d->i2c_adap, msg, 2);
896                 if (ret != 2) {
897                         err("read eeprom failed.");
898                         return -1;
899                 } else {
900                         eepromline[i % 16] = ibuf[0];
901                         eeprom[i] = ibuf[0];
902                 }
903
904                 if ((i % 16) == 15) {
905                         deb_xfer("%02x: ", i - 15);
906                         debug_dump(eepromline, 16, deb_xfer);
907                 }
908         }
909
910         memcpy(mac, eeprom + 16, 6);
911         return 0;
912 };
913
914 static int su3000_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
915 {
916         static u8 command_start[] = {0x00};
917         static u8 command_stop[] = {0x01};
918         struct i2c_msg msg = {
919                 .addr = SU3000_STREAM_CTRL,
920                 .flags = 0,
921                 .buf = onoff ? command_start : command_stop,
922                 .len = 1
923         };
924
925         i2c_transfer(&adap->dev->i2c_adap, &msg, 1);
926
927         return 0;
928 }
929
930 static int su3000_power_ctrl(struct dvb_usb_device *d, int i)
931 {
932         struct su3000_state *state = (struct su3000_state *)d->priv;
933         u8 obuf[] = {0xde, 0};
934
935         info("%s: %d, initialized %d\n", __func__, i, state->initialized);
936
937         if (i && !state->initialized) {
938                 state->initialized = 1;
939                 /* reset board */
940                 dvb_usb_generic_rw(d, obuf, 2, NULL, 0, 0);
941         }
942
943         return 0;
944 }
945
946 static int su3000_read_mac_address(struct dvb_usb_device *d, u8 mac[6])
947 {
948         int i;
949         u8 obuf[] = { 0x1f, 0xf0 };
950         u8 ibuf[] = { 0 };
951         struct i2c_msg msg[] = {
952                 {
953                         .addr = 0x51,
954                         .flags = 0,
955                         .buf = obuf,
956                         .len = 2,
957                 }, {
958                         .addr = 0x51,
959                         .flags = I2C_M_RD,
960                         .buf = ibuf,
961                         .len = 1,
962
963                 }
964         };
965
966         for (i = 0; i < 6; i++) {
967                 obuf[1] = 0xf0 + i;
968                 if (i2c_transfer(&d->i2c_adap, msg, 2) != 2)
969                         break;
970                 else
971                         mac[i] = ibuf[0];
972
973                 debug_dump(mac, 6, printk);
974         }
975
976         return 0;
977 }
978
979 static int su3000_identify_state(struct usb_device *udev,
980                                  struct dvb_usb_device_properties *props,
981                                  struct dvb_usb_device_description **desc,
982                                  int *cold)
983 {
984         info("%s\n", __func__);
985
986         *cold = 0;
987         return 0;
988 }
989
990 static int dw210x_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
991 {
992         static u8 command_13v[] = {0x00, 0x01};
993         static u8 command_18v[] = {0x01, 0x01};
994         static u8 command_off[] = {0x00, 0x00};
995         struct i2c_msg msg = {
996                 .addr = DW2102_VOLTAGE_CTRL,
997                 .flags = 0,
998                 .buf = command_off,
999                 .len = 2,
1000         };
1001
1002         struct dvb_usb_adapter *udev_adap =
1003                 (struct dvb_usb_adapter *)(fe->dvb->priv);
1004         if (voltage == SEC_VOLTAGE_18)
1005                 msg.buf = command_18v;
1006         else if (voltage == SEC_VOLTAGE_13)
1007                 msg.buf = command_13v;
1008
1009         i2c_transfer(&udev_adap->dev->i2c_adap, &msg, 1);
1010
1011         return 0;
1012 }
1013
1014 static int s660_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
1015 {
1016         struct dvb_usb_adapter *d =
1017                 (struct dvb_usb_adapter *)(fe->dvb->priv);
1018         struct s6x0_state *st = (struct s6x0_state *)d->dev->priv;
1019
1020         dw210x_set_voltage(fe, voltage);
1021         if (st->old_set_voltage)
1022                 st->old_set_voltage(fe, voltage);
1023
1024         return 0;
1025 }
1026
1027 static void dw210x_led_ctrl(struct dvb_frontend *fe, int offon)
1028 {
1029         static u8 led_off[] = { 0 };
1030         static u8 led_on[] = { 1 };
1031         struct i2c_msg msg = {
1032                 .addr = DW2102_LED_CTRL,
1033                 .flags = 0,
1034                 .buf = led_off,
1035                 .len = 1
1036         };
1037         struct dvb_usb_adapter *udev_adap =
1038                 (struct dvb_usb_adapter *)(fe->dvb->priv);
1039
1040         if (offon)
1041                 msg.buf = led_on;
1042         i2c_transfer(&udev_adap->dev->i2c_adap, &msg, 1);
1043 }
1044
1045 static struct stv0299_config sharp_z0194a_config = {
1046         .demod_address = 0x68,
1047         .inittab = sharp_z0194a_inittab,
1048         .mclk = 88000000UL,
1049         .invert = 1,
1050         .skip_reinit = 0,
1051         .lock_output = STV0299_LOCKOUTPUT_1,
1052         .volt13_op0_op1 = STV0299_VOLT13_OP1,
1053         .min_delay_ms = 100,
1054         .set_symbol_rate = sharp_z0194a_set_symbol_rate,
1055 };
1056
1057 static struct cx24116_config dw2104_config = {
1058         .demod_address = 0x55,
1059         .mpg_clk_pos_pol = 0x01,
1060 };
1061
1062 static struct si21xx_config serit_sp1511lhb_config = {
1063         .demod_address = 0x68,
1064         .min_delay_ms = 100,
1065
1066 };
1067
1068 static struct tda10023_config dw3101_tda10023_config = {
1069         .demod_address = 0x0c,
1070         .invert = 1,
1071 };
1072
1073 static struct mt312_config zl313_config = {
1074         .demod_address = 0x0e,
1075 };
1076
1077 static struct ds3000_config dw2104_ds3000_config = {
1078         .demod_address = 0x68,
1079 };
1080
1081 static struct stv0900_config dw2104a_stv0900_config = {
1082         .demod_address = 0x6a,
1083         .demod_mode = 0,
1084         .xtal = 27000000,
1085         .clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */
1086         .diseqc_mode = 2,/* 2/3 PWM */
1087         .tun1_maddress = 0,/* 0x60 */
1088         .tun1_adc = 0,/* 2 Vpp */
1089         .path1_mode = 3,
1090 };
1091
1092 static struct stb6100_config dw2104a_stb6100_config = {
1093         .tuner_address = 0x60,
1094         .refclock = 27000000,
1095 };
1096
1097 static struct stv0900_config dw2104_stv0900_config = {
1098         .demod_address = 0x68,
1099         .demod_mode = 0,
1100         .xtal = 8000000,
1101         .clkmode = 3,
1102         .diseqc_mode = 2,
1103         .tun1_maddress = 0,
1104         .tun1_adc = 1,/* 1 Vpp */
1105         .path1_mode = 3,
1106 };
1107
1108 static struct stv6110_config dw2104_stv6110_config = {
1109         .i2c_address = 0x60,
1110         .mclk = 16000000,
1111         .clk_div = 1,
1112 };
1113
1114 static struct stv0900_config prof_7500_stv0900_config = {
1115         .demod_address = 0x6a,
1116         .demod_mode = 0,
1117         .xtal = 27000000,
1118         .clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */
1119         .diseqc_mode = 2,/* 2/3 PWM */
1120         .tun1_maddress = 0,/* 0x60 */
1121         .tun1_adc = 0,/* 2 Vpp */
1122         .path1_mode = 3,
1123         .tun1_type = 3,
1124         .set_lock_led = dw210x_led_ctrl,
1125 };
1126
1127 static struct ds3000_config su3000_ds3000_config = {
1128         .demod_address = 0x68,
1129         .ci_mode = 1,
1130 };
1131
1132 static int dw2104_frontend_attach(struct dvb_usb_adapter *d)
1133 {
1134         struct dvb_tuner_ops *tuner_ops = NULL;
1135
1136         if (demod_probe & 4) {
1137                 d->fe_adap[0].fe = dvb_attach(stv0900_attach, &dw2104a_stv0900_config,
1138                                 &d->dev->i2c_adap, 0);
1139                 if (d->fe_adap[0].fe != NULL) {
1140                         if (dvb_attach(stb6100_attach, d->fe_adap[0].fe,
1141                                         &dw2104a_stb6100_config,
1142                                         &d->dev->i2c_adap)) {
1143                                 tuner_ops = &d->fe_adap[0].fe->ops.tuner_ops;
1144                                 tuner_ops->set_frequency = stb6100_set_freq;
1145                                 tuner_ops->get_frequency = stb6100_get_freq;
1146                                 tuner_ops->set_bandwidth = stb6100_set_bandw;
1147                                 tuner_ops->get_bandwidth = stb6100_get_bandw;
1148                                 d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1149                                 info("Attached STV0900+STB6100!\n");
1150                                 return 0;
1151                         }
1152                 }
1153         }
1154
1155         if (demod_probe & 2) {
1156                 d->fe_adap[0].fe = dvb_attach(stv0900_attach, &dw2104_stv0900_config,
1157                                 &d->dev->i2c_adap, 0);
1158                 if (d->fe_adap[0].fe != NULL) {
1159                         if (dvb_attach(stv6110_attach, d->fe_adap[0].fe,
1160                                         &dw2104_stv6110_config,
1161                                         &d->dev->i2c_adap)) {
1162                                 d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1163                                 info("Attached STV0900+STV6110A!\n");
1164                                 return 0;
1165                         }
1166                 }
1167         }
1168
1169         if (demod_probe & 1) {
1170                 d->fe_adap[0].fe = dvb_attach(cx24116_attach, &dw2104_config,
1171                                 &d->dev->i2c_adap);
1172                 if (d->fe_adap[0].fe != NULL) {
1173                         d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1174                         info("Attached cx24116!\n");
1175                         return 0;
1176                 }
1177         }
1178
1179         d->fe_adap[0].fe = dvb_attach(ds3000_attach, &dw2104_ds3000_config,
1180                         &d->dev->i2c_adap);
1181         if (d->fe_adap[0].fe != NULL) {
1182                 d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1183                 info("Attached DS3000!\n");
1184                 return 0;
1185         }
1186
1187         return -EIO;
1188 }
1189
1190 static struct dvb_usb_device_properties dw2102_properties;
1191 static struct dvb_usb_device_properties dw2104_properties;
1192 static struct dvb_usb_device_properties s6x0_properties;
1193
1194 static int dw2102_frontend_attach(struct dvb_usb_adapter *d)
1195 {
1196         if (dw2102_properties.i2c_algo == &dw2102_serit_i2c_algo) {
1197                 /*dw2102_properties.adapter->tuner_attach = NULL;*/
1198                 d->fe_adap[0].fe = dvb_attach(si21xx_attach, &serit_sp1511lhb_config,
1199                                         &d->dev->i2c_adap);
1200                 if (d->fe_adap[0].fe != NULL) {
1201                         d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1202                         info("Attached si21xx!\n");
1203                         return 0;
1204                 }
1205         }
1206
1207         if (dw2102_properties.i2c_algo == &dw2102_earda_i2c_algo) {
1208                 d->fe_adap[0].fe = dvb_attach(stv0288_attach, &earda_config,
1209                                         &d->dev->i2c_adap);
1210                 if (d->fe_adap[0].fe != NULL) {
1211                         if (dvb_attach(stb6000_attach, d->fe_adap[0].fe, 0x61,
1212                                         &d->dev->i2c_adap)) {
1213                                 d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1214                                 info("Attached stv0288!\n");
1215                                 return 0;
1216                         }
1217                 }
1218         }
1219
1220         if (dw2102_properties.i2c_algo == &dw2102_i2c_algo) {
1221                 /*dw2102_properties.adapter->tuner_attach = dw2102_tuner_attach;*/
1222                 d->fe_adap[0].fe = dvb_attach(stv0299_attach, &sharp_z0194a_config,
1223                                         &d->dev->i2c_adap);
1224                 if (d->fe_adap[0].fe != NULL) {
1225                         d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1226                         info("Attached stv0299!\n");
1227                         return 0;
1228                 }
1229         }
1230         return -EIO;
1231 }
1232
1233 static int dw3101_frontend_attach(struct dvb_usb_adapter *d)
1234 {
1235         d->fe_adap[0].fe = dvb_attach(tda10023_attach, &dw3101_tda10023_config,
1236                                 &d->dev->i2c_adap, 0x48);
1237         if (d->fe_adap[0].fe != NULL) {
1238                 info("Attached tda10023!\n");
1239                 return 0;
1240         }
1241         return -EIO;
1242 }
1243
1244 static int zl100313_frontend_attach(struct dvb_usb_adapter *d)
1245 {
1246         d->fe_adap[0].fe = dvb_attach(mt312_attach, &zl313_config,
1247                         &d->dev->i2c_adap);
1248         if (d->fe_adap[0].fe != NULL) {
1249                 if (dvb_attach(zl10039_attach, d->fe_adap[0].fe, 0x60,
1250                                 &d->dev->i2c_adap)) {
1251                         d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1252                         info("Attached zl100313+zl10039!\n");
1253                         return 0;
1254                 }
1255         }
1256
1257         return -EIO;
1258 }
1259
1260 static int stv0288_frontend_attach(struct dvb_usb_adapter *d)
1261 {
1262         u8 obuf[] = {7, 1};
1263
1264         d->fe_adap[0].fe = dvb_attach(stv0288_attach, &earda_config,
1265                         &d->dev->i2c_adap);
1266
1267         if (d->fe_adap[0].fe == NULL)
1268                 return -EIO;
1269
1270         if (NULL == dvb_attach(stb6000_attach, d->fe_adap[0].fe, 0x61, &d->dev->i2c_adap))
1271                 return -EIO;
1272
1273         d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1274
1275         dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG);
1276
1277         info("Attached stv0288+stb6000!\n");
1278
1279         return 0;
1280
1281 }
1282
1283 static int ds3000_frontend_attach(struct dvb_usb_adapter *d)
1284 {
1285         struct s6x0_state *st = (struct s6x0_state *)d->dev->priv;
1286         u8 obuf[] = {7, 1};
1287
1288         d->fe_adap[0].fe = dvb_attach(ds3000_attach, &dw2104_ds3000_config,
1289                         &d->dev->i2c_adap);
1290
1291         if (d->fe_adap[0].fe == NULL)
1292                 return -EIO;
1293
1294         st->old_set_voltage = d->fe_adap[0].fe->ops.set_voltage;
1295         d->fe_adap[0].fe->ops.set_voltage = s660_set_voltage;
1296
1297         dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG);
1298
1299         info("Attached ds3000+ds2020!\n");
1300
1301         return 0;
1302 }
1303
1304 static int prof_7500_frontend_attach(struct dvb_usb_adapter *d)
1305 {
1306         u8 obuf[] = {7, 1};
1307
1308         d->fe_adap[0].fe = dvb_attach(stv0900_attach, &prof_7500_stv0900_config,
1309                                         &d->dev->i2c_adap, 0);
1310         if (d->fe_adap[0].fe == NULL)
1311                 return -EIO;
1312
1313         d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1314
1315         dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG);
1316
1317         info("Attached STV0900+STB6100A!\n");
1318
1319         return 0;
1320 }
1321
1322 static int su3000_frontend_attach(struct dvb_usb_adapter *d)
1323 {
1324         u8 obuf[3] = { 0xe, 0x80, 0 };
1325         u8 ibuf[] = { 0 };
1326
1327         if (dvb_usb_generic_rw(d->dev, obuf, 3, ibuf, 1, 0) < 0)
1328                 err("command 0x0e transfer failed.");
1329
1330         obuf[0] = 0xe;
1331         obuf[1] = 0x83;
1332         obuf[2] = 0;
1333
1334         if (dvb_usb_generic_rw(d->dev, obuf, 3, ibuf, 1, 0) < 0)
1335                 err("command 0x0e transfer failed.");
1336
1337         obuf[0] = 0xe;
1338         obuf[1] = 0x83;
1339         obuf[2] = 1;
1340
1341         if (dvb_usb_generic_rw(d->dev, obuf, 3, ibuf, 1, 0) < 0)
1342                 err("command 0x0e transfer failed.");
1343
1344         obuf[0] = 0x51;
1345
1346         if (dvb_usb_generic_rw(d->dev, obuf, 1, ibuf, 1, 0) < 0)
1347                 err("command 0x51 transfer failed.");
1348
1349         d->fe_adap[0].fe = dvb_attach(ds3000_attach, &su3000_ds3000_config,
1350                                         &d->dev->i2c_adap);
1351         if (d->fe_adap[0].fe == NULL)
1352                 return -EIO;
1353
1354         info("Attached DS3000!\n");
1355
1356         return 0;
1357 }
1358
1359 static int dw2102_tuner_attach(struct dvb_usb_adapter *adap)
1360 {
1361         dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60,
1362                 &adap->dev->i2c_adap, DVB_PLL_OPERA1);
1363         return 0;
1364 }
1365
1366 static int dw3101_tuner_attach(struct dvb_usb_adapter *adap)
1367 {
1368         dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60,
1369                 &adap->dev->i2c_adap, DVB_PLL_TUA6034);
1370
1371         return 0;
1372 }
1373
1374 static struct rc_map_table rc_map_dw210x_table[] = {
1375         { 0xf80a, KEY_POWER2 },         /*power*/
1376         { 0xf80c, KEY_MUTE },           /*mute*/
1377         { 0xf811, KEY_1 },
1378         { 0xf812, KEY_2 },
1379         { 0xf813, KEY_3 },
1380         { 0xf814, KEY_4 },
1381         { 0xf815, KEY_5 },
1382         { 0xf816, KEY_6 },
1383         { 0xf817, KEY_7 },
1384         { 0xf818, KEY_8 },
1385         { 0xf819, KEY_9 },
1386         { 0xf810, KEY_0 },
1387         { 0xf81c, KEY_CHANNELUP },      /*ch+*/
1388         { 0xf80f, KEY_CHANNELDOWN },    /*ch-*/
1389         { 0xf81a, KEY_VOLUMEUP },       /*vol+*/
1390         { 0xf80e, KEY_VOLUMEDOWN },     /*vol-*/
1391         { 0xf804, KEY_RECORD },         /*rec*/
1392         { 0xf809, KEY_FAVORITES },      /*fav*/
1393         { 0xf808, KEY_REWIND },         /*rewind*/
1394         { 0xf807, KEY_FASTFORWARD },    /*fast*/
1395         { 0xf80b, KEY_PAUSE },          /*pause*/
1396         { 0xf802, KEY_ESC },            /*cancel*/
1397         { 0xf803, KEY_TAB },            /*tab*/
1398         { 0xf800, KEY_UP },             /*up*/
1399         { 0xf81f, KEY_OK },             /*ok*/
1400         { 0xf801, KEY_DOWN },           /*down*/
1401         { 0xf805, KEY_CAMERA },         /*cap*/
1402         { 0xf806, KEY_STOP },           /*stop*/
1403         { 0xf840, KEY_ZOOM },           /*full*/
1404         { 0xf81e, KEY_TV },             /*tvmode*/
1405         { 0xf81b, KEY_LAST },           /*recall*/
1406 };
1407
1408 static struct rc_map_table rc_map_tevii_table[] = {
1409         { 0xf80a, KEY_POWER },
1410         { 0xf80c, KEY_MUTE },
1411         { 0xf811, KEY_1 },
1412         { 0xf812, KEY_2 },
1413         { 0xf813, KEY_3 },
1414         { 0xf814, KEY_4 },
1415         { 0xf815, KEY_5 },
1416         { 0xf816, KEY_6 },
1417         { 0xf817, KEY_7 },
1418         { 0xf818, KEY_8 },
1419         { 0xf819, KEY_9 },
1420         { 0xf810, KEY_0 },
1421         { 0xf81c, KEY_MENU },
1422         { 0xf80f, KEY_VOLUMEDOWN },
1423         { 0xf81a, KEY_LAST },
1424         { 0xf80e, KEY_OPEN },
1425         { 0xf804, KEY_RECORD },
1426         { 0xf809, KEY_VOLUMEUP },
1427         { 0xf808, KEY_CHANNELUP },
1428         { 0xf807, KEY_PVR },
1429         { 0xf80b, KEY_TIME },
1430         { 0xf802, KEY_RIGHT },
1431         { 0xf803, KEY_LEFT },
1432         { 0xf800, KEY_UP },
1433         { 0xf81f, KEY_OK },
1434         { 0xf801, KEY_DOWN },
1435         { 0xf805, KEY_TUNER },
1436         { 0xf806, KEY_CHANNELDOWN },
1437         { 0xf840, KEY_PLAYPAUSE },
1438         { 0xf81e, KEY_REWIND },
1439         { 0xf81b, KEY_FAVORITES },
1440         { 0xf81d, KEY_BACK },
1441         { 0xf84d, KEY_FASTFORWARD },
1442         { 0xf844, KEY_EPG },
1443         { 0xf84c, KEY_INFO },
1444         { 0xf841, KEY_AB },
1445         { 0xf843, KEY_AUDIO },
1446         { 0xf845, KEY_SUBTITLE },
1447         { 0xf84a, KEY_LIST },
1448         { 0xf846, KEY_F1 },
1449         { 0xf847, KEY_F2 },
1450         { 0xf85e, KEY_F3 },
1451         { 0xf85c, KEY_F4 },
1452         { 0xf852, KEY_F5 },
1453         { 0xf85a, KEY_F6 },
1454         { 0xf856, KEY_MODE },
1455         { 0xf858, KEY_SWITCHVIDEOMODE },
1456 };
1457
1458 static struct rc_map_table rc_map_tbs_table[] = {
1459         { 0xf884, KEY_POWER },
1460         { 0xf894, KEY_MUTE },
1461         { 0xf887, KEY_1 },
1462         { 0xf886, KEY_2 },
1463         { 0xf885, KEY_3 },
1464         { 0xf88b, KEY_4 },
1465         { 0xf88a, KEY_5 },
1466         { 0xf889, KEY_6 },
1467         { 0xf88f, KEY_7 },
1468         { 0xf88e, KEY_8 },
1469         { 0xf88d, KEY_9 },
1470         { 0xf892, KEY_0 },
1471         { 0xf896, KEY_CHANNELUP },
1472         { 0xf891, KEY_CHANNELDOWN },
1473         { 0xf893, KEY_VOLUMEUP },
1474         { 0xf88c, KEY_VOLUMEDOWN },
1475         { 0xf883, KEY_RECORD },
1476         { 0xf898, KEY_PAUSE  },
1477         { 0xf899, KEY_OK },
1478         { 0xf89a, KEY_SHUFFLE },
1479         { 0xf881, KEY_UP },
1480         { 0xf890, KEY_LEFT },
1481         { 0xf882, KEY_RIGHT },
1482         { 0xf888, KEY_DOWN },
1483         { 0xf895, KEY_FAVORITES },
1484         { 0xf897, KEY_SUBTITLE },
1485         { 0xf89d, KEY_ZOOM },
1486         { 0xf89f, KEY_EXIT },
1487         { 0xf89e, KEY_MENU },
1488         { 0xf89c, KEY_EPG },
1489         { 0xf880, KEY_PREVIOUS },
1490         { 0xf89b, KEY_MODE }
1491 };
1492
1493 static struct rc_map_table rc_map_su3000_table[] = {
1494         { 0x25, KEY_POWER },    /* right-bottom Red */
1495         { 0x0a, KEY_MUTE },     /* -/-- */
1496         { 0x01, KEY_1 },
1497         { 0x02, KEY_2 },
1498         { 0x03, KEY_3 },
1499         { 0x04, KEY_4 },
1500         { 0x05, KEY_5 },
1501         { 0x06, KEY_6 },
1502         { 0x07, KEY_7 },
1503         { 0x08, KEY_8 },
1504         { 0x09, KEY_9 },
1505         { 0x00, KEY_0 },
1506         { 0x20, KEY_UP },       /* CH+ */
1507         { 0x21, KEY_DOWN },     /* CH+ */
1508         { 0x12, KEY_VOLUMEUP }, /* Brightness Up */
1509         { 0x13, KEY_VOLUMEDOWN },/* Brightness Down */
1510         { 0x1f, KEY_RECORD },
1511         { 0x17, KEY_PLAY },
1512         { 0x16, KEY_PAUSE },
1513         { 0x0b, KEY_STOP },
1514         { 0x27, KEY_FASTFORWARD },/* >> */
1515         { 0x26, KEY_REWIND },   /* << */
1516         { 0x0d, KEY_OK },       /* Mute */
1517         { 0x11, KEY_LEFT },     /* VOL- */
1518         { 0x10, KEY_RIGHT },    /* VOL+ */
1519         { 0x29, KEY_BACK },     /* button under 9 */
1520         { 0x2c, KEY_MENU },     /* TTX */
1521         { 0x2b, KEY_EPG },      /* EPG */
1522         { 0x1e, KEY_RED },      /* OSD */
1523         { 0x0e, KEY_GREEN },    /* Window */
1524         { 0x2d, KEY_YELLOW },   /* button under << */
1525         { 0x0f, KEY_BLUE },     /* bottom yellow button */
1526         { 0x14, KEY_AUDIO },    /* Snapshot */
1527         { 0x38, KEY_TV },       /* TV/Radio */
1528         { 0x0c, KEY_ESC }       /* upper Red button */
1529 };
1530
1531 static struct rc_map_dvb_usb_table_table keys_tables[] = {
1532         { rc_map_dw210x_table, ARRAY_SIZE(rc_map_dw210x_table) },
1533         { rc_map_tevii_table, ARRAY_SIZE(rc_map_tevii_table) },
1534         { rc_map_tbs_table, ARRAY_SIZE(rc_map_tbs_table) },
1535         { rc_map_su3000_table, ARRAY_SIZE(rc_map_su3000_table) },
1536 };
1537
1538 static int dw2102_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
1539 {
1540         struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
1541         int keymap_size = d->props.rc.legacy.rc_map_size;
1542         u8 key[2];
1543         struct i2c_msg msg = {
1544                 .addr = DW2102_RC_QUERY,
1545                 .flags = I2C_M_RD,
1546                 .buf = key,
1547                 .len = 2
1548         };
1549         int i;
1550         /* override keymap */
1551         if ((ir_keymap > 0) && (ir_keymap <= ARRAY_SIZE(keys_tables))) {
1552                 keymap = keys_tables[ir_keymap - 1].rc_keys ;
1553                 keymap_size = keys_tables[ir_keymap - 1].rc_keys_size;
1554         } else if (ir_keymap > ARRAY_SIZE(keys_tables))
1555                 return 0; /* none */
1556
1557         *state = REMOTE_NO_KEY_PRESSED;
1558         if (d->props.i2c_algo->master_xfer(&d->i2c_adap, &msg, 1) == 1) {
1559                 for (i = 0; i < keymap_size ; i++) {
1560                         if (rc5_data(&keymap[i]) == msg.buf[0]) {
1561                                 *state = REMOTE_KEY_PRESSED;
1562                                 *event = keymap[i].keycode;
1563                                 break;
1564                         }
1565
1566                 }
1567
1568                 if ((*state) == REMOTE_KEY_PRESSED)
1569                         deb_rc("%s: found rc key: %x, %x, event: %x\n",
1570                                         __func__, key[0], key[1], (*event));
1571                 else if (key[0] != 0xff)
1572                         deb_rc("%s: unknown rc key: %x, %x\n",
1573                                         __func__, key[0], key[1]);
1574
1575         }
1576
1577         return 0;
1578 }
1579
1580 static struct usb_device_id dw2102_table[] = {
1581         {USB_DEVICE(USB_VID_CYPRESS, USB_PID_DW2102)},
1582         {USB_DEVICE(USB_VID_CYPRESS, 0x2101)},
1583         {USB_DEVICE(USB_VID_CYPRESS, USB_PID_DW2104)},
1584         {USB_DEVICE(0x9022, USB_PID_TEVII_S650)},
1585         {USB_DEVICE(USB_VID_TERRATEC, USB_PID_CINERGY_S)},
1586         {USB_DEVICE(USB_VID_CYPRESS, USB_PID_DW3101)},
1587         {USB_DEVICE(0x9022, USB_PID_TEVII_S630)},
1588         {USB_DEVICE(0x3011, USB_PID_PROF_1100)},
1589         {USB_DEVICE(0x9022, USB_PID_TEVII_S660)},
1590         {USB_DEVICE(0x3034, 0x7500)},
1591         {USB_DEVICE(0x1f4d, 0x3000)},
1592         {USB_DEVICE(USB_VID_TERRATEC, 0x00a8)},
1593         {USB_DEVICE(0x9022, USB_PID_TEVII_S480_1)},
1594         {USB_DEVICE(0x9022, USB_PID_TEVII_S480_2)},
1595         {USB_DEVICE(0x1f4d, 0x3100)},
1596         { }
1597 };
1598
1599 MODULE_DEVICE_TABLE(usb, dw2102_table);
1600
1601 static int dw2102_load_firmware(struct usb_device *dev,
1602                         const struct firmware *frmwr)
1603 {
1604         u8 *b, *p;
1605         int ret = 0, i;
1606         u8 reset;
1607         u8 reset16[] = {0, 0, 0, 0, 0, 0, 0};
1608         const struct firmware *fw;
1609         const char *fw_2101 = "dvb-usb-dw2101.fw";
1610
1611         switch (dev->descriptor.idProduct) {
1612         case 0x2101:
1613                 ret = request_firmware(&fw, fw_2101, &dev->dev);
1614                 if (ret != 0) {
1615                         err(err_str, fw_2101);
1616                         return ret;
1617                 }
1618                 break;
1619         default:
1620                 fw = frmwr;
1621                 break;
1622         }
1623         info("start downloading DW210X firmware");
1624         p = kmalloc(fw->size, GFP_KERNEL);
1625         reset = 1;
1626         /*stop the CPU*/
1627         dw210x_op_rw(dev, 0xa0, 0x7f92, 0, &reset, 1, DW210X_WRITE_MSG);
1628         dw210x_op_rw(dev, 0xa0, 0xe600, 0, &reset, 1, DW210X_WRITE_MSG);
1629
1630         if (p != NULL) {
1631                 memcpy(p, fw->data, fw->size);
1632                 for (i = 0; i < fw->size; i += 0x40) {
1633                         b = (u8 *) p + i;
1634                         if (dw210x_op_rw(dev, 0xa0, i, 0, b , 0x40,
1635                                         DW210X_WRITE_MSG) != 0x40) {
1636                                 err("error while transferring firmware");
1637                                 ret = -EINVAL;
1638                                 break;
1639                         }
1640                 }
1641                 /* restart the CPU */
1642                 reset = 0;
1643                 if (ret || dw210x_op_rw(dev, 0xa0, 0x7f92, 0, &reset, 1,
1644                                         DW210X_WRITE_MSG) != 1) {
1645                         err("could not restart the USB controller CPU.");
1646                         ret = -EINVAL;
1647                 }
1648                 if (ret || dw210x_op_rw(dev, 0xa0, 0xe600, 0, &reset, 1,
1649                                         DW210X_WRITE_MSG) != 1) {
1650                         err("could not restart the USB controller CPU.");
1651                         ret = -EINVAL;
1652                 }
1653                 /* init registers */
1654                 switch (dev->descriptor.idProduct) {
1655                 case USB_PID_TEVII_S650:
1656                         dw2104_properties.rc.legacy.rc_map_table = rc_map_tevii_table;
1657                         dw2104_properties.rc.legacy.rc_map_size =
1658                                         ARRAY_SIZE(rc_map_tevii_table);
1659                 case USB_PID_DW2104:
1660                         reset = 1;
1661                         dw210x_op_rw(dev, 0xc4, 0x0000, 0, &reset, 1,
1662                                         DW210X_WRITE_MSG);
1663                         /* break omitted intentionally */
1664                 case USB_PID_DW3101:
1665                         reset = 0;
1666                         dw210x_op_rw(dev, 0xbf, 0x0040, 0, &reset, 0,
1667                                         DW210X_WRITE_MSG);
1668                         break;
1669                 case USB_PID_CINERGY_S:
1670                 case USB_PID_DW2102:
1671                         dw210x_op_rw(dev, 0xbf, 0x0040, 0, &reset, 0,
1672                                         DW210X_WRITE_MSG);
1673                         dw210x_op_rw(dev, 0xb9, 0x0000, 0, &reset16[0], 2,
1674                                         DW210X_READ_MSG);
1675                         /* check STV0299 frontend  */
1676                         dw210x_op_rw(dev, 0xb5, 0, 0, &reset16[0], 2,
1677                                         DW210X_READ_MSG);
1678                         if ((reset16[0] == 0xa1) || (reset16[0] == 0x80)) {
1679                                 dw2102_properties.i2c_algo = &dw2102_i2c_algo;
1680                                 dw2102_properties.adapter->fe[0].tuner_attach = &dw2102_tuner_attach;
1681                                 break;
1682                         } else {
1683                                 /* check STV0288 frontend  */
1684                                 reset16[0] = 0xd0;
1685                                 reset16[1] = 1;
1686                                 reset16[2] = 0;
1687                                 dw210x_op_rw(dev, 0xc2, 0, 0, &reset16[0], 3,
1688                                                 DW210X_WRITE_MSG);
1689                                 dw210x_op_rw(dev, 0xc3, 0xd1, 0, &reset16[0], 3,
1690                                                 DW210X_READ_MSG);
1691                                 if (reset16[2] == 0x11) {
1692                                         dw2102_properties.i2c_algo = &dw2102_earda_i2c_algo;
1693                                         break;
1694                                 }
1695                         }
1696                 case 0x2101:
1697                         dw210x_op_rw(dev, 0xbc, 0x0030, 0, &reset16[0], 2,
1698                                         DW210X_READ_MSG);
1699                         dw210x_op_rw(dev, 0xba, 0x0000, 0, &reset16[0], 7,
1700                                         DW210X_READ_MSG);
1701                         dw210x_op_rw(dev, 0xba, 0x0000, 0, &reset16[0], 7,
1702                                         DW210X_READ_MSG);
1703                         dw210x_op_rw(dev, 0xb9, 0x0000, 0, &reset16[0], 2,
1704                                         DW210X_READ_MSG);
1705                         break;
1706                 }
1707
1708                 msleep(100);
1709                 kfree(p);
1710         }
1711         return ret;
1712 }
1713
1714 static struct dvb_usb_device_properties dw2102_properties = {
1715         .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1716         .usb_ctrl = DEVICE_SPECIFIC,
1717         .firmware = "dvb-usb-dw2102.fw",
1718         .no_reconnect = 1,
1719
1720         .i2c_algo = &dw2102_serit_i2c_algo,
1721
1722         .rc.legacy = {
1723                 .rc_map_table = rc_map_dw210x_table,
1724                 .rc_map_size = ARRAY_SIZE(rc_map_dw210x_table),
1725                 .rc_interval = 150,
1726                 .rc_query = dw2102_rc_query,
1727         },
1728
1729         .generic_bulk_ctrl_endpoint = 0x81,
1730         /* parameter for the MPEG2-data transfer */
1731         .num_adapters = 1,
1732         .download_firmware = dw2102_load_firmware,
1733         .read_mac_address = dw210x_read_mac_address,
1734         .adapter = {
1735                 {
1736                 .num_frontends = 1,
1737                 .fe = {{
1738                         .frontend_attach = dw2102_frontend_attach,
1739                         .stream = {
1740                                 .type = USB_BULK,
1741                                 .count = 8,
1742                                 .endpoint = 0x82,
1743                                 .u = {
1744                                         .bulk = {
1745                                                 .buffersize = 4096,
1746                                         }
1747                                 }
1748                         },
1749                 }},
1750                 }
1751         },
1752         .num_device_descs = 3,
1753         .devices = {
1754                 {"DVBWorld DVB-S 2102 USB2.0",
1755                         {&dw2102_table[0], NULL},
1756                         {NULL},
1757                 },
1758                 {"DVBWorld DVB-S 2101 USB2.0",
1759                         {&dw2102_table[1], NULL},
1760                         {NULL},
1761                 },
1762                 {"TerraTec Cinergy S USB",
1763                         {&dw2102_table[4], NULL},
1764                         {NULL},
1765                 },
1766         }
1767 };
1768
1769 static struct dvb_usb_device_properties dw2104_properties = {
1770         .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1771         .usb_ctrl = DEVICE_SPECIFIC,
1772         .firmware = "dvb-usb-dw2104.fw",
1773         .no_reconnect = 1,
1774
1775         .i2c_algo = &dw2104_i2c_algo,
1776         .rc.legacy = {
1777                 .rc_map_table = rc_map_dw210x_table,
1778                 .rc_map_size = ARRAY_SIZE(rc_map_dw210x_table),
1779                 .rc_interval = 150,
1780                 .rc_query = dw2102_rc_query,
1781         },
1782
1783         .generic_bulk_ctrl_endpoint = 0x81,
1784         /* parameter for the MPEG2-data transfer */
1785         .num_adapters = 1,
1786         .download_firmware = dw2102_load_firmware,
1787         .read_mac_address = dw210x_read_mac_address,
1788         .adapter = {
1789                 {
1790                 .num_frontends = 1,
1791                 .fe = {{
1792                         .frontend_attach = dw2104_frontend_attach,
1793                         .stream = {
1794                                 .type = USB_BULK,
1795                                 .count = 8,
1796                                 .endpoint = 0x82,
1797                                 .u = {
1798                                         .bulk = {
1799                                                 .buffersize = 4096,
1800                                         }
1801                                 }
1802                         },
1803                 }},
1804                 }
1805         },
1806         .num_device_descs = 2,
1807         .devices = {
1808                 { "DVBWorld DW2104 USB2.0",
1809                         {&dw2102_table[2], NULL},
1810                         {NULL},
1811                 },
1812                 { "TeVii S650 USB2.0",
1813                         {&dw2102_table[3], NULL},
1814                         {NULL},
1815                 },
1816         }
1817 };
1818
1819 static struct dvb_usb_device_properties dw3101_properties = {
1820         .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1821         .usb_ctrl = DEVICE_SPECIFIC,
1822         .firmware = "dvb-usb-dw3101.fw",
1823         .no_reconnect = 1,
1824
1825         .i2c_algo = &dw3101_i2c_algo,
1826         .rc.legacy = {
1827                 .rc_map_table = rc_map_dw210x_table,
1828                 .rc_map_size = ARRAY_SIZE(rc_map_dw210x_table),
1829                 .rc_interval = 150,
1830                 .rc_query = dw2102_rc_query,
1831         },
1832
1833         .generic_bulk_ctrl_endpoint = 0x81,
1834         /* parameter for the MPEG2-data transfer */
1835         .num_adapters = 1,
1836         .download_firmware = dw2102_load_firmware,
1837         .read_mac_address = dw210x_read_mac_address,
1838         .adapter = {
1839                 {
1840                 .num_frontends = 1,
1841                 .fe = {{
1842                         .frontend_attach = dw3101_frontend_attach,
1843                         .tuner_attach = dw3101_tuner_attach,
1844                         .stream = {
1845                                 .type = USB_BULK,
1846                                 .count = 8,
1847                                 .endpoint = 0x82,
1848                                 .u = {
1849                                         .bulk = {
1850                                                 .buffersize = 4096,
1851                                         }
1852                                 }
1853                         },
1854                 }},
1855                 }
1856         },
1857         .num_device_descs = 1,
1858         .devices = {
1859                 { "DVBWorld DVB-C 3101 USB2.0",
1860                         {&dw2102_table[5], NULL},
1861                         {NULL},
1862                 },
1863         }
1864 };
1865
1866 static struct dvb_usb_device_properties s6x0_properties = {
1867         .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1868         .usb_ctrl = DEVICE_SPECIFIC,
1869         .size_of_priv = sizeof(struct s6x0_state),
1870         .firmware = "dvb-usb-s630.fw",
1871         .no_reconnect = 1,
1872
1873         .i2c_algo = &s6x0_i2c_algo,
1874         .rc.legacy = {
1875                 .rc_map_table = rc_map_tevii_table,
1876                 .rc_map_size = ARRAY_SIZE(rc_map_tevii_table),
1877                 .rc_interval = 150,
1878                 .rc_query = dw2102_rc_query,
1879         },
1880
1881         .generic_bulk_ctrl_endpoint = 0x81,
1882         .num_adapters = 1,
1883         .download_firmware = dw2102_load_firmware,
1884         .read_mac_address = s6x0_read_mac_address,
1885         .adapter = {
1886                 {
1887                 .num_frontends = 1,
1888                 .fe = {{
1889                         .frontend_attach = zl100313_frontend_attach,
1890                         .stream = {
1891                                 .type = USB_BULK,
1892                                 .count = 8,
1893                                 .endpoint = 0x82,
1894                                 .u = {
1895                                         .bulk = {
1896                                                 .buffersize = 4096,
1897                                         }
1898                                 }
1899                         },
1900                 }},
1901                 }
1902         },
1903         .num_device_descs = 1,
1904         .devices = {
1905                 {"TeVii S630 USB",
1906                         {&dw2102_table[6], NULL},
1907                         {NULL},
1908                 },
1909         }
1910 };
1911
1912 struct dvb_usb_device_properties *p1100;
1913 static struct dvb_usb_device_description d1100 = {
1914         "Prof 1100 USB ",
1915         {&dw2102_table[7], NULL},
1916         {NULL},
1917 };
1918
1919 struct dvb_usb_device_properties *s660;
1920 static struct dvb_usb_device_description d660 = {
1921         "TeVii S660 USB",
1922         {&dw2102_table[8], NULL},
1923         {NULL},
1924 };
1925
1926 static struct dvb_usb_device_description d480_1 = {
1927         "TeVii S480.1 USB",
1928         {&dw2102_table[12], NULL},
1929         {NULL},
1930 };
1931
1932 static struct dvb_usb_device_description d480_2 = {
1933         "TeVii S480.2 USB",
1934         {&dw2102_table[13], NULL},
1935         {NULL},
1936 };
1937
1938 struct dvb_usb_device_properties *p7500;
1939 static struct dvb_usb_device_description d7500 = {
1940         "Prof 7500 USB DVB-S2",
1941         {&dw2102_table[9], NULL},
1942         {NULL},
1943 };
1944
1945 static struct dvb_usb_device_properties su3000_properties = {
1946         .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1947         .usb_ctrl = DEVICE_SPECIFIC,
1948         .size_of_priv = sizeof(struct su3000_state),
1949         .power_ctrl = su3000_power_ctrl,
1950         .num_adapters = 1,
1951         .identify_state = su3000_identify_state,
1952         .i2c_algo = &su3000_i2c_algo,
1953
1954         .rc.legacy = {
1955                 .rc_map_table = rc_map_su3000_table,
1956                 .rc_map_size = ARRAY_SIZE(rc_map_su3000_table),
1957                 .rc_interval = 150,
1958                 .rc_query = dw2102_rc_query,
1959         },
1960
1961         .read_mac_address = su3000_read_mac_address,
1962
1963         .generic_bulk_ctrl_endpoint = 0x01,
1964
1965         .adapter = {
1966                 {
1967                 .num_frontends = 1,
1968                 .fe = {{
1969                         .streaming_ctrl   = su3000_streaming_ctrl,
1970                         .frontend_attach  = su3000_frontend_attach,
1971                         .stream = {
1972                                 .type = USB_BULK,
1973                                 .count = 8,
1974                                 .endpoint = 0x82,
1975                                 .u = {
1976                                         .bulk = {
1977                                                 .buffersize = 4096,
1978                                         }
1979                                 }
1980                         }
1981                 }},
1982                 }
1983         },
1984         .num_device_descs = 3,
1985         .devices = {
1986                 { "SU3000HD DVB-S USB2.0",
1987                         { &dw2102_table[10], NULL },
1988                         { NULL },
1989                 },
1990                 { "Terratec Cinergy S2 USB HD",
1991                         { &dw2102_table[11], NULL },
1992                         { NULL },
1993                 },
1994                 { "X3M TV SPC1400HD PCI",
1995                         { &dw2102_table[14], NULL },
1996                         { NULL },
1997                 },
1998         }
1999 };
2000
2001 static int dw2102_probe(struct usb_interface *intf,
2002                 const struct usb_device_id *id)
2003 {
2004         p1100 = kzalloc(sizeof(struct dvb_usb_device_properties), GFP_KERNEL);
2005         if (!p1100)
2006                 return -ENOMEM;
2007         /* copy default structure */
2008         memcpy(p1100, &s6x0_properties,
2009                         sizeof(struct dvb_usb_device_properties));
2010         /* fill only different fields */
2011         p1100->firmware = "dvb-usb-p1100.fw";
2012         p1100->devices[0] = d1100;
2013         p1100->rc.legacy.rc_map_table = rc_map_tbs_table;
2014         p1100->rc.legacy.rc_map_size = ARRAY_SIZE(rc_map_tbs_table);
2015         p1100->adapter->fe[0].frontend_attach = stv0288_frontend_attach;
2016
2017         s660 = kzalloc(sizeof(struct dvb_usb_device_properties), GFP_KERNEL);
2018         if (!s660) {
2019                 kfree(p1100);
2020                 return -ENOMEM;
2021         }
2022         memcpy(s660, &s6x0_properties,
2023                         sizeof(struct dvb_usb_device_properties));
2024         s660->firmware = "dvb-usb-s660.fw";
2025         s660->num_device_descs = 3;
2026         s660->devices[0] = d660;
2027         s660->devices[1] = d480_1;
2028         s660->devices[2] = d480_2;
2029         s660->adapter->fe[0].frontend_attach = ds3000_frontend_attach;
2030
2031         p7500 = kzalloc(sizeof(struct dvb_usb_device_properties), GFP_KERNEL);
2032         if (!p7500) {
2033                 kfree(p1100);
2034                 kfree(s660);
2035                 return -ENOMEM;
2036         }
2037         memcpy(p7500, &s6x0_properties,
2038                         sizeof(struct dvb_usb_device_properties));
2039         p7500->firmware = "dvb-usb-p7500.fw";
2040         p7500->devices[0] = d7500;
2041         p7500->rc.legacy.rc_map_table = rc_map_tbs_table;
2042         p7500->rc.legacy.rc_map_size = ARRAY_SIZE(rc_map_tbs_table);
2043         p7500->adapter->fe[0].frontend_attach = prof_7500_frontend_attach;
2044
2045         if (0 == dvb_usb_device_init(intf, &dw2102_properties,
2046                         THIS_MODULE, NULL, adapter_nr) ||
2047             0 == dvb_usb_device_init(intf, &dw2104_properties,
2048                         THIS_MODULE, NULL, adapter_nr) ||
2049             0 == dvb_usb_device_init(intf, &dw3101_properties,
2050                         THIS_MODULE, NULL, adapter_nr) ||
2051             0 == dvb_usb_device_init(intf, &s6x0_properties,
2052                         THIS_MODULE, NULL, adapter_nr) ||
2053             0 == dvb_usb_device_init(intf, p1100,
2054                         THIS_MODULE, NULL, adapter_nr) ||
2055             0 == dvb_usb_device_init(intf, s660,
2056                         THIS_MODULE, NULL, adapter_nr) ||
2057             0 == dvb_usb_device_init(intf, p7500,
2058                         THIS_MODULE, NULL, adapter_nr) ||
2059             0 == dvb_usb_device_init(intf, &su3000_properties,
2060                                      THIS_MODULE, NULL, adapter_nr))
2061                 return 0;
2062
2063         return -ENODEV;
2064 }
2065
2066 static struct usb_driver dw2102_driver = {
2067         .name = "dw2102",
2068         .probe = dw2102_probe,
2069         .disconnect = dvb_usb_device_exit,
2070         .id_table = dw2102_table,
2071 };
2072
2073 static int __init dw2102_module_init(void)
2074 {
2075         int ret =  usb_register(&dw2102_driver);
2076         if (ret)
2077                 err("usb_register failed. Error number %d", ret);
2078
2079         return ret;
2080 }
2081
2082 static void __exit dw2102_module_exit(void)
2083 {
2084         usb_deregister(&dw2102_driver);
2085 }
2086
2087 module_init(dw2102_module_init);
2088 module_exit(dw2102_module_exit);
2089
2090 MODULE_AUTHOR("Igor M. Liplianin (c) liplianin@me.by");
2091 MODULE_DESCRIPTION("Driver for DVBWorld DVB-S 2101, 2102, DVB-S2 2104,"
2092                                 " DVB-C 3101 USB2.0,"
2093                                 " TeVii S600, S630, S650, S660, S480,"
2094                                 " Prof 1100, 7500 USB2.0,"
2095                                 " Geniatech SU3000 devices");
2096 MODULE_VERSION("0.1");
2097 MODULE_LICENSE("GPL");