Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[linux-2.6.git] / drivers / media / dvb / dvb-usb / anysee.c
1 /*
2  * DVB USB Linux driver for Anysee E30 DVB-C & DVB-T USB2.0 receiver
3  *
4  * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
5  *
6  *    This program is free software; you can redistribute it and/or modify
7  *    it under the terms of the GNU General Public License as published by
8  *    the Free Software Foundation; either version 2 of the License, or
9  *    (at your option) any later version.
10  *
11  *    This program is distributed in the hope that it will be useful,
12  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *    GNU General Public License for more details.
15  *
16  *    You should have received a copy of the GNU General Public License
17  *    along with this program; if not, write to the Free Software
18  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  *
20  * TODO:
21  * - add smart card reader support for Conditional Access (CA)
22  *
23  * Card reader in Anysee is nothing more than ISO 7816 card reader.
24  * There is no hardware CAM in any Anysee device sold.
25  * In my understanding it should be implemented by making own module
26  * for ISO 7816 card reader, like dvb_ca_en50221 is implemented. This
27  * module registers serial interface that can be used to communicate
28  * with any ISO 7816 smart card.
29  *
30  * Any help according to implement serial smart card reader support
31  * is highly welcome!
32  */
33
34 #include "anysee.h"
35 #include "tda1002x.h"
36 #include "mt352.h"
37 #include "mt352_priv.h"
38 #include "zl10353.h"
39 #include "tda18212.h"
40 #include "cx24116.h"
41 #include "stv0900.h"
42 #include "stv6110.h"
43 #include "isl6423.h"
44 #include "cxd2820r.h"
45
46 /* debug */
47 static int dvb_usb_anysee_debug;
48 module_param_named(debug, dvb_usb_anysee_debug, int, 0644);
49 MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
50 static int dvb_usb_anysee_delsys;
51 module_param_named(delsys, dvb_usb_anysee_delsys, int, 0644);
52 MODULE_PARM_DESC(delsys, "select delivery mode (0=DVB-C, 1=DVB-T)");
53 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
54
55 static DEFINE_MUTEX(anysee_usb_mutex);
56
57 static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen,
58         u8 *rbuf, u8 rlen)
59 {
60         struct anysee_state *state = d->priv;
61         int act_len, ret;
62         u8 buf[64];
63
64         memcpy(&buf[0], sbuf, slen);
65         buf[60] = state->seq++;
66
67         if (mutex_lock_interruptible(&anysee_usb_mutex) < 0)
68                 return -EAGAIN;
69
70         deb_xfer(">>> ");
71         debug_dump(buf, slen, deb_xfer);
72
73         /* We need receive one message more after dvb_usb_generic_rw due
74            to weird transaction flow, which is 1 x send + 2 x receive. */
75         ret = dvb_usb_generic_rw(d, buf, sizeof(buf), buf, sizeof(buf), 0);
76         if (!ret) {
77                 /* receive 2nd answer */
78                 ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
79                         d->props.generic_bulk_ctrl_endpoint), buf, sizeof(buf),
80                         &act_len, 2000);
81                 if (ret)
82                         err("%s: recv bulk message failed: %d", __func__, ret);
83                 else {
84                         deb_xfer("<<< ");
85                         debug_dump(buf, rlen, deb_xfer);
86
87                         if (buf[63] != 0x4f)
88                                 deb_info("%s: cmd failed\n", __func__);
89                 }
90         }
91
92         /* read request, copy returned data to return buf */
93         if (!ret && rbuf && rlen)
94                 memcpy(rbuf, buf, rlen);
95
96         mutex_unlock(&anysee_usb_mutex);
97
98         return ret;
99 }
100
101 static int anysee_read_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
102 {
103         u8 buf[] = {CMD_REG_READ, reg >> 8, reg & 0xff, 0x01};
104         int ret;
105         ret = anysee_ctrl_msg(d, buf, sizeof(buf), val, 1);
106         deb_info("%s: reg:%04x val:%02x\n", __func__, reg, *val);
107         return ret;
108 }
109
110 static int anysee_write_reg(struct dvb_usb_device *d, u16 reg, u8 val)
111 {
112         u8 buf[] = {CMD_REG_WRITE, reg >> 8, reg & 0xff, 0x01, val};
113         deb_info("%s: reg:%04x val:%02x\n", __func__, reg, val);
114         return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
115 }
116
117 /* write single register with mask */
118 static int anysee_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
119         u8 mask)
120 {
121         int ret;
122         u8 tmp;
123
124         /* no need for read if whole reg is written */
125         if (mask != 0xff) {
126                 ret = anysee_read_reg(d, reg, &tmp);
127                 if (ret)
128                         return ret;
129
130                 val &= mask;
131                 tmp &= ~mask;
132                 val |= tmp;
133         }
134
135         return anysee_write_reg(d, reg, val);
136 }
137
138 /* read single register with mask */
139 static int anysee_rd_reg_mask(struct dvb_usb_device *d, u16 reg, u8 *val,
140         u8 mask)
141 {
142         int ret, i;
143         u8 tmp;
144
145         ret = anysee_read_reg(d, reg, &tmp);
146         if (ret)
147                 return ret;
148
149         tmp &= mask;
150
151         /* find position of the first bit */
152         for (i = 0; i < 8; i++) {
153                 if ((mask >> i) & 0x01)
154                         break;
155         }
156         *val = tmp >> i;
157
158         return 0;
159 }
160
161 static int anysee_get_hw_info(struct dvb_usb_device *d, u8 *id)
162 {
163         u8 buf[] = {CMD_GET_HW_INFO};
164         return anysee_ctrl_msg(d, buf, sizeof(buf), id, 3);
165 }
166
167 static int anysee_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
168 {
169         u8 buf[] = {CMD_STREAMING_CTRL, (u8)onoff, 0x00};
170         deb_info("%s: onoff:%02x\n", __func__, onoff);
171         return anysee_ctrl_msg(adap->dev, buf, sizeof(buf), NULL, 0);
172 }
173
174 static int anysee_led_ctrl(struct dvb_usb_device *d, u8 mode, u8 interval)
175 {
176         u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x01, mode, interval};
177         deb_info("%s: state:%02x interval:%02x\n", __func__, mode, interval);
178         return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
179 }
180
181 static int anysee_ir_ctrl(struct dvb_usb_device *d, u8 onoff)
182 {
183         u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x02, onoff};
184         deb_info("%s: onoff:%02x\n", __func__, onoff);
185         return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
186 }
187
188 /* I2C */
189 static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
190         int num)
191 {
192         struct dvb_usb_device *d = i2c_get_adapdata(adap);
193         int ret = 0, inc, i = 0;
194         u8 buf[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */
195
196         if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
197                 return -EAGAIN;
198
199         while (i < num) {
200                 if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
201                         if (msg[i].len > 2 || msg[i+1].len > 60) {
202                                 ret = -EOPNOTSUPP;
203                                 break;
204                         }
205                         buf[0] = CMD_I2C_READ;
206                         buf[1] = (msg[i].addr << 1) | 0x01;
207                         buf[2] = msg[i].buf[0];
208                         buf[3] = msg[i].buf[1];
209                         buf[4] = msg[i].len-1;
210                         buf[5] = msg[i+1].len;
211                         ret = anysee_ctrl_msg(d, buf, 6, msg[i+1].buf,
212                                 msg[i+1].len);
213                         inc = 2;
214                 } else {
215                         if (msg[i].len > 48) {
216                                 ret = -EOPNOTSUPP;
217                                 break;
218                         }
219                         buf[0] = CMD_I2C_WRITE;
220                         buf[1] = (msg[i].addr << 1);
221                         buf[2] = msg[i].len;
222                         buf[3] = 0x01;
223                         memcpy(&buf[4], msg[i].buf, msg[i].len);
224                         ret = anysee_ctrl_msg(d, buf, 4 + msg[i].len, NULL, 0);
225                         inc = 1;
226                 }
227                 if (ret)
228                         break;
229
230                 i += inc;
231         }
232
233         mutex_unlock(&d->i2c_mutex);
234
235         return ret ? ret : i;
236 }
237
238 static u32 anysee_i2c_func(struct i2c_adapter *adapter)
239 {
240         return I2C_FUNC_I2C;
241 }
242
243 static struct i2c_algorithm anysee_i2c_algo = {
244         .master_xfer   = anysee_master_xfer,
245         .functionality = anysee_i2c_func,
246 };
247
248 static int anysee_mt352_demod_init(struct dvb_frontend *fe)
249 {
250         static u8 clock_config[]   = { CLOCK_CTL,  0x38, 0x28 };
251         static u8 reset[]          = { RESET,      0x80 };
252         static u8 adc_ctl_1_cfg[]  = { ADC_CTL_1,  0x40 };
253         static u8 agc_cfg[]        = { AGC_TARGET, 0x28, 0x20 };
254         static u8 gpp_ctl_cfg[]    = { GPP_CTL,    0x33 };
255         static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
256
257         mt352_write(fe, clock_config,   sizeof(clock_config));
258         udelay(200);
259         mt352_write(fe, reset,          sizeof(reset));
260         mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
261
262         mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
263         mt352_write(fe, gpp_ctl_cfg,    sizeof(gpp_ctl_cfg));
264         mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
265
266         return 0;
267 }
268
269 /* Callbacks for DVB USB */
270 static struct tda10023_config anysee_tda10023_config = {
271         .demod_address = (0x1a >> 1),
272         .invert = 0,
273         .xtal   = 16000000,
274         .pll_m  = 11,
275         .pll_p  = 3,
276         .pll_n  = 1,
277         .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
278         .deltaf = 0xfeeb,
279 };
280
281 static struct mt352_config anysee_mt352_config = {
282         .demod_address = (0x1e >> 1),
283         .demod_init    = anysee_mt352_demod_init,
284 };
285
286 static struct zl10353_config anysee_zl10353_config = {
287         .demod_address = (0x1e >> 1),
288         .parallel_ts = 1,
289 };
290
291 static struct zl10353_config anysee_zl10353_tda18212_config2 = {
292         .demod_address = (0x1e >> 1),
293         .parallel_ts = 1,
294         .disable_i2c_gate_ctrl = 1,
295         .no_tuner = 1,
296         .if2 = 41500,
297 };
298
299 static struct zl10353_config anysee_zl10353_tda18212_config = {
300         .demod_address = (0x18 >> 1),
301         .parallel_ts = 1,
302         .disable_i2c_gate_ctrl = 1,
303         .no_tuner = 1,
304         .if2 = 41500,
305 };
306
307 static struct tda10023_config anysee_tda10023_tda18212_config = {
308         .demod_address = (0x1a >> 1),
309         .xtal   = 16000000,
310         .pll_m  = 12,
311         .pll_p  = 3,
312         .pll_n  = 1,
313         .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_B,
314         .deltaf = 0xba02,
315 };
316
317 static struct tda18212_config anysee_tda18212_config = {
318         .i2c_address = (0xc0 >> 1),
319         .if_dvbt_6 = 4150,
320         .if_dvbt_7 = 4150,
321         .if_dvbt_8 = 4150,
322         .if_dvbc = 5000,
323 };
324
325 static struct tda18212_config anysee_tda18212_config2 = {
326         .i2c_address = 0x60 /* (0xc0 >> 1) */,
327         .if_dvbt_6 = 3550,
328         .if_dvbt_7 = 3700,
329         .if_dvbt_8 = 4150,
330         .if_dvbt2_6 = 3250,
331         .if_dvbt2_7 = 4000,
332         .if_dvbt2_8 = 4000,
333         .if_dvbc = 5000,
334 };
335
336 static struct cx24116_config anysee_cx24116_config = {
337         .demod_address = (0xaa >> 1),
338         .mpg_clk_pos_pol = 0x00,
339         .i2c_wr_max = 48,
340 };
341
342 static struct stv0900_config anysee_stv0900_config = {
343         .demod_address = (0xd0 >> 1),
344         .demod_mode = 0,
345         .xtal = 8000000,
346         .clkmode = 3,
347         .diseqc_mode = 2,
348         .tun1_maddress = 0,
349         .tun1_adc = 1, /* 1 Vpp */
350         .path1_mode = 3,
351 };
352
353 static struct stv6110_config anysee_stv6110_config = {
354         .i2c_address = (0xc0 >> 1),
355         .mclk = 16000000,
356         .clk_div = 1,
357 };
358
359 static struct isl6423_config anysee_isl6423_config = {
360         .current_max = SEC_CURRENT_800m,
361         .curlim  = SEC_CURRENT_LIM_OFF,
362         .mod_extern = 1,
363         .addr = (0x10 >> 1),
364 };
365
366 static struct cxd2820r_config anysee_cxd2820r_config = {
367         .i2c_address = 0x6d, /* (0xda >> 1) */
368         .ts_mode = 0x38,
369 };
370
371 /*
372  * New USB device strings: Mfr=1, Product=2, SerialNumber=0
373  * Manufacturer: AMT.CO.KR
374  *
375  * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
376  * PCB: ?
377  * parts: DNOS404ZH102A(MT352, DTT7579(?))
378  *
379  * E30 VID=04b4 PID=861f HW=2 FW=2.1 "anysee-T(LP)"
380  * PCB: PCB 507T (rev1.61)
381  * parts: DNOS404ZH103A(ZL10353, DTT7579(?))
382  * OEA=0a OEB=00 OEC=00 OED=ff OEE=00
383  * IOA=45 IOB=ff IOC=00 IOD=ff IOE=00
384  *
385  * E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee"
386  * PCB: 507CD (rev1.1)
387  * parts: DNOS404ZH103A(ZL10353, DTT7579(?)), CST56I01
388  * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
389  * IOA=4f IOB=ff IOC=00 IOD=06 IOE=01
390  * IOD[0] ZL10353 1=enabled
391  * IOA[7] TS 0=enabled
392  * tuner is not behind ZL10353 I2C-gate (no care if gate disabled or not)
393  *
394  * E30 C Plus VID=04b4 PID=861f HW=10 FW=1.0 "anysee-DC(LP)"
395  * PCB: 507DC (rev0.2)
396  * parts: TDA10023, DTOS403IH102B TM, CST56I01
397  * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
398  * IOA=4f IOB=ff IOC=00 IOD=26 IOE=01
399  * IOD[0] TDA10023 1=enabled
400  *
401  * E30 S2 Plus VID=04b4 PID=861f HW=11 FW=0.1 "anysee-S2(LP)"
402  * PCB: 507SI (rev2.1)
403  * parts: BS2N10WCC01(CX24116, CX24118), ISL6423, TDA8024
404  * OEA=80 OEB=00 OEC=ff OED=ff OEE=fe
405  * IOA=4d IOB=ff IOC=00 IOD=26 IOE=01
406  * IOD[0] CX24116 1=enabled
407  *
408  * E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
409  * PCB: 507FA (rev0.4)
410  * parts: TDA10023, DTOS403IH102B TM, TDA8024
411  * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
412  * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
413  * IOD[5] TDA10023 1=enabled
414  * IOE[0] tuner 1=enabled
415  *
416  * E30 Combo Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
417  * PCB: 507FA (rev1.1)
418  * parts: ZL10353, TDA10023, DTOS403IH102B TM, TDA8024
419  * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
420  * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
421  * DVB-C:
422  * IOD[5] TDA10023 1=enabled
423  * IOE[0] tuner 1=enabled
424  * DVB-T:
425  * IOD[0] ZL10353 1=enabled
426  * IOE[0] tuner 0=enabled
427  * tuner is behind ZL10353 I2C-gate
428  *
429  * E7 TC VID=1c73 PID=861f HW=18 FW=0.7 AMTCI=0.5 "anysee-E7TC(LP)"
430  * PCB: 508TC (rev0.6)
431  * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
432  * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
433  * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
434  * IOA[7] TS 1=enabled
435  * IOE[4] TDA18212 1=enabled
436  * DVB-C:
437  * IOD[6] ZL10353 0=disabled
438  * IOD[5] TDA10023 1=enabled
439  * IOE[0] IF 1=enabled
440  * DVB-T:
441  * IOD[5] TDA10023 0=disabled
442  * IOD[6] ZL10353 1=enabled
443  * IOE[0] IF 0=enabled
444  *
445  * E7 S2 VID=1c73 PID=861f HW=19 FW=0.4 AMTCI=0.5 "anysee-E7S2(LP)"
446  * PCB: 508S2 (rev0.7)
447  * parts: DNBU10512IST(STV0903, STV6110), ISL6423
448  * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
449  * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
450  * IOA[7] TS 1=enabled
451  * IOE[5] STV0903 1=enabled
452  *
453  * E7 T2C VID=1c73 PID=861f HW=20 FW=0.1 AMTCI=0.5 "anysee-E7T2C(LP)"
454  * PCB: 508T2C (rev0.3)
455  * parts: DNOQ44QCH106A(CXD2820R, TDA18212), TDA8024
456  * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
457  * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
458  * IOA[7] TS 1=enabled
459  * IOE[5] CXD2820R 1=enabled
460  *
461  * E7 PTC VID=1c73 PID=861f HW=21 FW=0.1 AMTCI=?? "anysee-E7PTC(LP)"
462  * PCB: 508PTC (rev0.5)
463  * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
464  * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
465  * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
466  * IOA[7] TS 1=enabled
467  * IOE[4] TDA18212 1=enabled
468  * DVB-C:
469  * IOD[6] ZL10353 0=disabled
470  * IOD[5] TDA10023 1=enabled
471  * IOE[0] IF 1=enabled
472  * DVB-T:
473  * IOD[5] TDA10023 0=disabled
474  * IOD[6] ZL10353 1=enabled
475  * IOE[0] IF 0=enabled
476  *
477  * E7 PS2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
478  * PCB: 508PS2 (rev0.4)
479  * parts: DNBU10512IST(STV0903, STV6110), ISL6423
480  * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
481  * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
482  * IOA[7] TS 1=enabled
483  * IOE[5] STV0903 1=enabled
484  */
485
486
487 /* external I2C gate used for DNOD44CDH086A(TDA18212) tuner module */
488 static int anysee_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
489 {
490         struct dvb_usb_adapter *adap = fe->dvb->priv;
491
492         /* enable / disable tuner access on IOE[4] */
493         return anysee_wr_reg_mask(adap->dev, REG_IOE, (enable << 4), 0x10);
494 }
495
496 static int anysee_frontend_ctrl(struct dvb_frontend *fe, int onoff)
497 {
498         struct dvb_usb_adapter *adap = fe->dvb->priv;
499         struct anysee_state *state = adap->dev->priv;
500         int ret;
501
502         deb_info("%s: fe=%d onoff=%d\n", __func__, fe->id, onoff);
503
504         /* no frontend sleep control */
505         if (onoff == 0)
506                 return 0;
507
508         switch (state->hw) {
509         case ANYSEE_HW_507FA: /* 15 */
510                 /* E30 Combo Plus */
511                 /* E30 C Plus */
512
513                 if ((fe->id ^ dvb_usb_anysee_delsys) == 0)  {
514                         /* disable DVB-T demod on IOD[0] */
515                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
516                                 0x01);
517                         if (ret)
518                                 goto error;
519
520                         /* enable DVB-C demod on IOD[5] */
521                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
522                                 0x20);
523                         if (ret)
524                                 goto error;
525
526                         /* enable DVB-C tuner on IOE[0] */
527                         ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
528                                 0x01);
529                         if (ret)
530                                 goto error;
531                 } else {
532                         /* disable DVB-C demod on IOD[5] */
533                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
534                                 0x20);
535                         if (ret)
536                                 goto error;
537
538                         /* enable DVB-T demod on IOD[0] */
539                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
540                                 0x01);
541                         if (ret)
542                                 goto error;
543
544                         /* enable DVB-T tuner on IOE[0] */
545                         ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
546                                 0x01);
547                         if (ret)
548                                 goto error;
549                 }
550
551                 break;
552         case ANYSEE_HW_508TC: /* 18 */
553         case ANYSEE_HW_508PTC: /* 21 */
554                 /* E7 TC */
555                 /* E7 PTC */
556
557                 if ((fe->id ^ dvb_usb_anysee_delsys) == 0)  {
558                         /* disable DVB-T demod on IOD[6] */
559                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
560                                 0x40);
561                         if (ret)
562                                 goto error;
563
564                         /* enable DVB-C demod on IOD[5] */
565                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
566                                 0x20);
567                         if (ret)
568                                 goto error;
569
570                         /* enable IF route on IOE[0] */
571                         ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
572                                 0x01);
573                         if (ret)
574                                 goto error;
575                 } else {
576                         /* disable DVB-C demod on IOD[5] */
577                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
578                                 0x20);
579                         if (ret)
580                                 goto error;
581
582                         /* enable DVB-T demod on IOD[6] */
583                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
584                                 0x40);
585                         if (ret)
586                                 goto error;
587
588                         /* enable IF route on IOE[0] */
589                         ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
590                                 0x01);
591                         if (ret)
592                                 goto error;
593                 }
594
595                 break;
596         default:
597                 ret = 0;
598         }
599
600 error:
601         return ret;
602 }
603
604 static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
605 {
606         int ret;
607         struct anysee_state *state = adap->dev->priv;
608         u8 hw_info[3];
609         u8 tmp;
610         struct i2c_msg msg[2] = {
611                 {
612                         .addr = anysee_tda18212_config.i2c_address,
613                         .flags = 0,
614                         .len = 1,
615                         .buf = "\x00",
616                 }, {
617                         .addr = anysee_tda18212_config.i2c_address,
618                         .flags = I2C_M_RD,
619                         .len = 1,
620                         .buf = &tmp,
621                 }
622         };
623
624         /* detect hardware only once */
625         if (adap->fe_adap[0].fe == NULL) {
626                 /* Check which hardware we have.
627                  * We must do this call two times to get reliable values
628                  * (hw/fw bug).
629                  */
630                 ret = anysee_get_hw_info(adap->dev, hw_info);
631                 if (ret)
632                         goto error;
633
634                 ret = anysee_get_hw_info(adap->dev, hw_info);
635                 if (ret)
636                         goto error;
637
638                 /* Meaning of these info bytes are guessed. */
639                 info("firmware version:%d.%d hardware id:%d",
640                         hw_info[1], hw_info[2], hw_info[0]);
641
642                 state->hw = hw_info[0];
643         }
644
645         /* set current frondend ID for devices having two frondends */
646         if (adap->fe_adap[0].fe)
647                 state->fe_id++;
648
649         switch (state->hw) {
650         case ANYSEE_HW_507T: /* 2 */
651                 /* E30 */
652
653                 if (state->fe_id)
654                         break;
655
656                 /* attach demod */
657                 adap->fe_adap[0].fe = dvb_attach(mt352_attach,
658                         &anysee_mt352_config, &adap->dev->i2c_adap);
659                 if (adap->fe_adap[0].fe)
660                         break;
661
662                 /* attach demod */
663                 adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
664                         &anysee_zl10353_config, &adap->dev->i2c_adap);
665
666                 break;
667         case ANYSEE_HW_507CD: /* 6 */
668                 /* E30 Plus */
669
670                 if (state->fe_id)
671                         break;
672
673                 /* enable DVB-T demod on IOD[0] */
674                 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
675                 if (ret)
676                         goto error;
677
678                 /* enable transport stream on IOA[7] */
679                 ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (0 << 7), 0x80);
680                 if (ret)
681                         goto error;
682
683                 /* attach demod */
684                 adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
685                         &anysee_zl10353_config, &adap->dev->i2c_adap);
686
687                 break;
688         case ANYSEE_HW_507DC: /* 10 */
689                 /* E30 C Plus */
690
691                 if (state->fe_id)
692                         break;
693
694                 /* enable DVB-C demod on IOD[0] */
695                 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
696                 if (ret)
697                         goto error;
698
699                 /* attach demod */
700                 adap->fe_adap[0].fe = dvb_attach(tda10023_attach,
701                         &anysee_tda10023_config, &adap->dev->i2c_adap, 0x48);
702
703                 break;
704         case ANYSEE_HW_507SI: /* 11 */
705                 /* E30 S2 Plus */
706
707                 if (state->fe_id)
708                         break;
709
710                 /* enable DVB-S/S2 demod on IOD[0] */
711                 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
712                 if (ret)
713                         goto error;
714
715                 /* attach demod */
716                 adap->fe_adap[0].fe = dvb_attach(cx24116_attach,
717                         &anysee_cx24116_config, &adap->dev->i2c_adap);
718
719                 break;
720         case ANYSEE_HW_507FA: /* 15 */
721                 /* E30 Combo Plus */
722                 /* E30 C Plus */
723
724                 /* enable tuner on IOE[4] */
725                 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
726                 if (ret)
727                         goto error;
728
729                 /* probe TDA18212 */
730                 tmp = 0;
731                 ret = i2c_transfer(&adap->dev->i2c_adap, msg, 2);
732                 if (ret == 2 && tmp == 0xc7)
733                         deb_info("%s: TDA18212 found\n", __func__);
734                 else
735                         tmp = 0;
736
737                 /* disable tuner on IOE[4] */
738                 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
739                 if (ret)
740                         goto error;
741
742                 if ((state->fe_id ^ dvb_usb_anysee_delsys) == 0)  {
743                         /* disable DVB-T demod on IOD[0] */
744                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
745                                 0x01);
746                         if (ret)
747                                 goto error;
748
749                         /* enable DVB-C demod on IOD[5] */
750                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
751                                 0x20);
752                         if (ret)
753                                 goto error;
754
755                         /* attach demod */
756                         if (tmp == 0xc7) {
757                                 /* TDA18212 config */
758                                 adap->fe_adap[state->fe_id].fe = dvb_attach(
759                                         tda10023_attach,
760                                         &anysee_tda10023_tda18212_config,
761                                         &adap->dev->i2c_adap, 0x48);
762                         } else {
763                                 /* PLL config */
764                                 adap->fe_adap[state->fe_id].fe = dvb_attach(
765                                         tda10023_attach,
766                                         &anysee_tda10023_config,
767                                         &adap->dev->i2c_adap, 0x48);
768                         }
769                 } else {
770                         /* disable DVB-C demod on IOD[5] */
771                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
772                                 0x20);
773                         if (ret)
774                                 goto error;
775
776                         /* enable DVB-T demod on IOD[0] */
777                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
778                                 0x01);
779                         if (ret)
780                                 goto error;
781
782                         /* attach demod */
783                         if (tmp == 0xc7) {
784                                 /* TDA18212 config */
785                                 adap->fe_adap[state->fe_id].fe = dvb_attach(
786                                         zl10353_attach,
787                                         &anysee_zl10353_tda18212_config2,
788                                         &adap->dev->i2c_adap);
789                         } else {
790                                 /* PLL config */
791                                 adap->fe_adap[state->fe_id].fe = dvb_attach(
792                                         zl10353_attach,
793                                         &anysee_zl10353_config,
794                                         &adap->dev->i2c_adap);
795                         }
796                 }
797
798                 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
799                 if (tmp == 0xc7) {
800                         if (adap->fe_adap[state->fe_id].fe)
801                                 adap->fe_adap[state->fe_id].fe->ops.i2c_gate_ctrl =
802                                         anysee_i2c_gate_ctrl;
803                 }
804
805                 break;
806         case ANYSEE_HW_508TC: /* 18 */
807         case ANYSEE_HW_508PTC: /* 21 */
808                 /* E7 TC */
809                 /* E7 PTC */
810
811                 if ((state->fe_id ^ dvb_usb_anysee_delsys) == 0)  {
812                         /* disable DVB-T demod on IOD[6] */
813                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
814                                 0x40);
815                         if (ret)
816                                 goto error;
817
818                         /* enable DVB-C demod on IOD[5] */
819                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
820                                 0x20);
821                         if (ret)
822                                 goto error;
823
824                         /* attach demod */
825                         adap->fe_adap[state->fe_id].fe =
826                                 dvb_attach(tda10023_attach,
827                                 &anysee_tda10023_tda18212_config,
828                                 &adap->dev->i2c_adap, 0x48);
829                 } else {
830                         /* disable DVB-C demod on IOD[5] */
831                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
832                                 0x20);
833                         if (ret)
834                                 goto error;
835
836                         /* enable DVB-T demod on IOD[6] */
837                         ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
838                                 0x40);
839                         if (ret)
840                                 goto error;
841
842                         /* attach demod */
843                         adap->fe_adap[state->fe_id].fe =
844                                 dvb_attach(zl10353_attach,
845                                 &anysee_zl10353_tda18212_config,
846                                 &adap->dev->i2c_adap);
847                 }
848
849                 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
850                 if (adap->fe_adap[state->fe_id].fe)
851                         adap->fe_adap[state->fe_id].fe->ops.i2c_gate_ctrl =
852                                 anysee_i2c_gate_ctrl;
853
854                 state->has_ci = true;
855
856                 break;
857         case ANYSEE_HW_508S2: /* 19 */
858         case ANYSEE_HW_508PS2: /* 22 */
859                 /* E7 S2 */
860                 /* E7 PS2 */
861
862                 if (state->fe_id)
863                         break;
864
865                 /* enable DVB-S/S2 demod on IOE[5] */
866                 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
867                 if (ret)
868                         goto error;
869
870                 /* attach demod */
871                 adap->fe_adap[0].fe = dvb_attach(stv0900_attach,
872                         &anysee_stv0900_config, &adap->dev->i2c_adap, 0);
873
874                 state->has_ci = true;
875
876                 break;
877         case ANYSEE_HW_508T2C: /* 20 */
878                 /* E7 T2C */
879
880                 /* enable DVB-T/T2/C demod on IOE[5] */
881                 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
882                 if (ret)
883                         goto error;
884
885                 if (state->fe_id == 0)  {
886                         /* DVB-T/T2 */
887                         adap->fe_adap[state->fe_id].fe =
888                                 dvb_attach(cxd2820r_attach,
889                                 &anysee_cxd2820r_config,
890                                 &adap->dev->i2c_adap, NULL);
891                 } else {
892                         /* DVB-C */
893                         adap->fe_adap[state->fe_id].fe =
894                                 dvb_attach(cxd2820r_attach,
895                                 &anysee_cxd2820r_config,
896                                 &adap->dev->i2c_adap, adap->fe_adap[0].fe);
897                 }
898
899                 state->has_ci = true;
900
901                 break;
902         }
903
904         if (!adap->fe_adap[0].fe) {
905                 /* we have no frontend :-( */
906                 ret = -ENODEV;
907                 err("Unsupported Anysee version. " \
908                         "Please report the <linux-media@vger.kernel.org>.");
909         }
910 error:
911         return ret;
912 }
913
914 static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
915 {
916         struct anysee_state *state = adap->dev->priv;
917         struct dvb_frontend *fe;
918         int ret;
919         deb_info("%s: fe=%d\n", __func__, state->fe_id);
920
921         switch (state->hw) {
922         case ANYSEE_HW_507T: /* 2 */
923                 /* E30 */
924
925                 /* attach tuner */
926                 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
927                         (0xc2 >> 1), NULL, DVB_PLL_THOMSON_DTT7579);
928
929                 break;
930         case ANYSEE_HW_507CD: /* 6 */
931                 /* E30 Plus */
932
933                 /* attach tuner */
934                 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
935                         (0xc2 >> 1), &adap->dev->i2c_adap,
936                         DVB_PLL_THOMSON_DTT7579);
937
938                 break;
939         case ANYSEE_HW_507DC: /* 10 */
940                 /* E30 C Plus */
941
942                 /* attach tuner */
943                 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
944                         (0xc0 >> 1), &adap->dev->i2c_adap,
945                         DVB_PLL_SAMSUNG_DTOS403IH102A);
946
947                 break;
948         case ANYSEE_HW_507SI: /* 11 */
949                 /* E30 S2 Plus */
950
951                 /* attach LNB controller */
952                 fe = dvb_attach(isl6423_attach, adap->fe_adap[0].fe,
953                         &adap->dev->i2c_adap, &anysee_isl6423_config);
954
955                 break;
956         case ANYSEE_HW_507FA: /* 15 */
957                 /* E30 Combo Plus */
958                 /* E30 C Plus */
959
960                 /* Try first attach TDA18212 silicon tuner on IOE[4], if that
961                  * fails attach old simple PLL. */
962
963                 /* attach tuner */
964                 fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
965                         &adap->dev->i2c_adap, &anysee_tda18212_config);
966                 if (fe)
967                         break;
968
969                 /* attach tuner */
970                 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[state->fe_id].fe,
971                         (0xc0 >> 1), &adap->dev->i2c_adap,
972                         DVB_PLL_SAMSUNG_DTOS403IH102A);
973
974                 break;
975         case ANYSEE_HW_508TC: /* 18 */
976         case ANYSEE_HW_508PTC: /* 21 */
977                 /* E7 TC */
978                 /* E7 PTC */
979
980                 /* attach tuner */
981                 fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
982                         &adap->dev->i2c_adap, &anysee_tda18212_config);
983
984                 break;
985         case ANYSEE_HW_508S2: /* 19 */
986         case ANYSEE_HW_508PS2: /* 22 */
987                 /* E7 S2 */
988                 /* E7 PS2 */
989
990                 /* attach tuner */
991                 fe = dvb_attach(stv6110_attach, adap->fe_adap[0].fe,
992                         &anysee_stv6110_config, &adap->dev->i2c_adap);
993
994                 if (fe) {
995                         /* attach LNB controller */
996                         fe = dvb_attach(isl6423_attach, adap->fe_adap[0].fe,
997                                 &adap->dev->i2c_adap, &anysee_isl6423_config);
998                 }
999
1000                 break;
1001
1002         case ANYSEE_HW_508T2C: /* 20 */
1003                 /* E7 T2C */
1004
1005                 /* attach tuner */
1006                 fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
1007                         &adap->dev->i2c_adap, &anysee_tda18212_config2);
1008
1009                 break;
1010         default:
1011                 fe = NULL;
1012         }
1013
1014         if (fe)
1015                 ret = 0;
1016         else
1017                 ret = -ENODEV;
1018
1019         return ret;
1020 }
1021
1022 static int anysee_rc_query(struct dvb_usb_device *d)
1023 {
1024         u8 buf[] = {CMD_GET_IR_CODE};
1025         u8 ircode[2];
1026         int ret;
1027
1028         /* Remote controller is basic NEC using address byte 0x08.
1029            Anysee device RC query returns only two bytes, status and code,
1030            address byte is dropped. Also it does not return any value for
1031            NEC RCs having address byte other than 0x08. Due to that, we
1032            cannot use that device as standard NEC receiver.
1033            It could be possible make hack which reads whole code directly
1034            from device memory... */
1035
1036         ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode));
1037         if (ret)
1038                 return ret;
1039
1040         if (ircode[0]) {
1041                 deb_rc("%s: key pressed %02x\n", __func__, ircode[1]);
1042                 rc_keydown(d->rc_dev, 0x08 << 8 | ircode[1], 0);
1043         }
1044
1045         return 0;
1046 }
1047
1048 static int anysee_ci_read_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
1049         int addr)
1050 {
1051         struct dvb_usb_device *d = ci->data;
1052         int ret;
1053         u8 buf[] = {CMD_CI, 0x02, 0x40 | addr >> 8, addr & 0xff, 0x00, 1};
1054         u8 val;
1055
1056         ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
1057         if (ret)
1058                 return ret;
1059
1060         return val;
1061 }
1062
1063 static int anysee_ci_write_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
1064         int addr, u8 val)
1065 {
1066         struct dvb_usb_device *d = ci->data;
1067         int ret;
1068         u8 buf[] = {CMD_CI, 0x03, 0x40 | addr >> 8, addr & 0xff, 0x00, 1, val};
1069
1070         ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
1071         if (ret)
1072                 return ret;
1073
1074         return 0;
1075 }
1076
1077 static int anysee_ci_read_cam_control(struct dvb_ca_en50221 *ci, int slot,
1078         u8 addr)
1079 {
1080         struct dvb_usb_device *d = ci->data;
1081         int ret;
1082         u8 buf[] = {CMD_CI, 0x04, 0x40, addr, 0x00, 1};
1083         u8 val;
1084
1085         ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
1086         if (ret)
1087                 return ret;
1088
1089         return val;
1090 }
1091
1092 static int anysee_ci_write_cam_control(struct dvb_ca_en50221 *ci, int slot,
1093         u8 addr, u8 val)
1094 {
1095         struct dvb_usb_device *d = ci->data;
1096         int ret;
1097         u8 buf[] = {CMD_CI, 0x05, 0x40, addr, 0x00, 1, val};
1098
1099         ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
1100         if (ret)
1101                 return ret;
1102
1103         return 0;
1104 }
1105
1106 static int anysee_ci_slot_reset(struct dvb_ca_en50221 *ci, int slot)
1107 {
1108         struct dvb_usb_device *d = ci->data;
1109         int ret;
1110         struct anysee_state *state = d->priv;
1111
1112         state->ci_cam_ready = jiffies + msecs_to_jiffies(1000);
1113
1114         ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
1115         if (ret)
1116                 return ret;
1117
1118         msleep(300);
1119
1120         ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1121         if (ret)
1122                 return ret;
1123
1124         return 0;
1125 }
1126
1127 static int anysee_ci_slot_shutdown(struct dvb_ca_en50221 *ci, int slot)
1128 {
1129         struct dvb_usb_device *d = ci->data;
1130         int ret;
1131
1132         ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
1133         if (ret)
1134                 return ret;
1135
1136         msleep(30);
1137
1138         ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1139         if (ret)
1140                 return ret;
1141
1142         return 0;
1143 }
1144
1145 static int anysee_ci_slot_ts_enable(struct dvb_ca_en50221 *ci, int slot)
1146 {
1147         struct dvb_usb_device *d = ci->data;
1148         int ret;
1149
1150         ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 1), 0x02);
1151         if (ret)
1152                 return ret;
1153
1154         return 0;
1155 }
1156
1157 static int anysee_ci_poll_slot_status(struct dvb_ca_en50221 *ci, int slot,
1158         int open)
1159 {
1160         struct dvb_usb_device *d = ci->data;
1161         struct anysee_state *state = d->priv;
1162         int ret;
1163         u8 tmp;
1164
1165         ret = anysee_rd_reg_mask(d, REG_IOC, &tmp, 0x40);
1166         if (ret)
1167                 return ret;
1168
1169         if (tmp == 0) {
1170                 ret = DVB_CA_EN50221_POLL_CAM_PRESENT;
1171                 if (time_after(jiffies, state->ci_cam_ready))
1172                         ret |= DVB_CA_EN50221_POLL_CAM_READY;
1173         }
1174
1175         return ret;
1176 }
1177
1178 static int anysee_ci_init(struct dvb_usb_device *d)
1179 {
1180         struct anysee_state *state = d->priv;
1181         int ret;
1182
1183         state->ci.owner               = THIS_MODULE;
1184         state->ci.read_attribute_mem  = anysee_ci_read_attribute_mem;
1185         state->ci.write_attribute_mem = anysee_ci_write_attribute_mem;
1186         state->ci.read_cam_control    = anysee_ci_read_cam_control;
1187         state->ci.write_cam_control   = anysee_ci_write_cam_control;
1188         state->ci.slot_reset          = anysee_ci_slot_reset;
1189         state->ci.slot_shutdown       = anysee_ci_slot_shutdown;
1190         state->ci.slot_ts_enable      = anysee_ci_slot_ts_enable;
1191         state->ci.poll_slot_status    = anysee_ci_poll_slot_status;
1192         state->ci.data                = d;
1193
1194         ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1195         if (ret)
1196                 return ret;
1197
1198         ret = dvb_ca_en50221_init(&d->adapter[0].dvb_adap, &state->ci, 0, 1);
1199         if (ret)
1200                 return ret;
1201
1202         return 0;
1203 }
1204
1205 static void anysee_ci_release(struct dvb_usb_device *d)
1206 {
1207         struct anysee_state *state = d->priv;
1208
1209         /* detach CI */
1210         if (state->has_ci)
1211                 dvb_ca_en50221_release(&state->ci);
1212
1213         return;
1214 }
1215
1216 static int anysee_init(struct dvb_usb_device *d)
1217 {
1218         struct anysee_state *state = d->priv;
1219         int ret;
1220
1221         /* LED light */
1222         ret = anysee_led_ctrl(d, 0x01, 0x03);
1223         if (ret)
1224                 return ret;
1225
1226         /* enable IR */
1227         ret = anysee_ir_ctrl(d, 1);
1228         if (ret)
1229                 return ret;
1230
1231         /* attach CI */
1232         if (state->has_ci) {
1233                 ret = anysee_ci_init(d);
1234                 if (ret) {
1235                         state->has_ci = false;
1236                         return ret;
1237                 }
1238         }
1239
1240         return 0;
1241 }
1242
1243 /* DVB USB Driver stuff */
1244 static struct dvb_usb_device_properties anysee_properties;
1245
1246 static int anysee_probe(struct usb_interface *intf,
1247                         const struct usb_device_id *id)
1248 {
1249         struct dvb_usb_device *d;
1250         struct usb_host_interface *alt;
1251         int ret;
1252
1253         /* There is one interface with two alternate settings.
1254            Alternate setting 0 is for bulk transfer.
1255            Alternate setting 1 is for isochronous transfer.
1256            We use bulk transfer (alternate setting 0). */
1257         if (intf->num_altsetting < 1)
1258                 return -ENODEV;
1259
1260         /*
1261          * Anysee is always warm (its USB-bridge, Cypress FX2, uploads
1262          * firmware from eeprom).  If dvb_usb_device_init() succeeds that
1263          * means d is a valid pointer.
1264          */
1265         ret = dvb_usb_device_init(intf, &anysee_properties, THIS_MODULE, &d,
1266                 adapter_nr);
1267         if (ret)
1268                 return ret;
1269
1270         alt = usb_altnum_to_altsetting(intf, 0);
1271         if (alt == NULL) {
1272                 deb_info("%s: no alt found!\n", __func__);
1273                 return -ENODEV;
1274         }
1275
1276         ret = usb_set_interface(d->udev, alt->desc.bInterfaceNumber,
1277                 alt->desc.bAlternateSetting);
1278         if (ret)
1279                 return ret;
1280
1281         return anysee_init(d);
1282 }
1283
1284 static void anysee_disconnect(struct usb_interface *intf)
1285 {
1286         struct dvb_usb_device *d = usb_get_intfdata(intf);
1287
1288         anysee_ci_release(d);
1289         dvb_usb_device_exit(intf);
1290
1291         return;
1292 }
1293
1294 static struct usb_device_id anysee_table[] = {
1295         { USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE) },
1296         { USB_DEVICE(USB_VID_AMT,     USB_PID_ANYSEE) },
1297         { }             /* Terminating entry */
1298 };
1299 MODULE_DEVICE_TABLE(usb, anysee_table);
1300
1301 static struct dvb_usb_device_properties anysee_properties = {
1302         .caps             = DVB_USB_IS_AN_I2C_ADAPTER,
1303
1304         .usb_ctrl         = DEVICE_SPECIFIC,
1305
1306         .size_of_priv     = sizeof(struct anysee_state),
1307
1308         .num_adapters = 1,
1309         .adapter = {
1310                 {
1311                 .num_frontends    = 2,
1312                 .frontend_ctrl    = anysee_frontend_ctrl,
1313                 .fe = { {
1314                         .streaming_ctrl   = anysee_streaming_ctrl,
1315                         .frontend_attach  = anysee_frontend_attach,
1316                         .tuner_attach     = anysee_tuner_attach,
1317                         .stream = {
1318                                 .type = USB_BULK,
1319                                 .count = 8,
1320                                 .endpoint = 0x82,
1321                                 .u = {
1322                                         .bulk = {
1323                                                 .buffersize = (16*512),
1324                                         }
1325                                 }
1326                         },
1327                 }, {
1328                         .streaming_ctrl   = anysee_streaming_ctrl,
1329                         .frontend_attach  = anysee_frontend_attach,
1330                         .tuner_attach     = anysee_tuner_attach,
1331                         .stream = {
1332                                 .type = USB_BULK,
1333                                 .count = 8,
1334                                 .endpoint = 0x82,
1335                                 .u = {
1336                                         .bulk = {
1337                                                 .buffersize = (16*512),
1338                                         }
1339                                 }
1340                         },
1341                 } },
1342                 }
1343         },
1344
1345         .rc.core = {
1346                 .rc_codes         = RC_MAP_ANYSEE,
1347                 .protocol         = RC_TYPE_OTHER,
1348                 .module_name      = "anysee",
1349                 .rc_query         = anysee_rc_query,
1350                 .rc_interval      = 250,  /* windows driver uses 500ms */
1351         },
1352
1353         .i2c_algo         = &anysee_i2c_algo,
1354
1355         .generic_bulk_ctrl_endpoint = 1,
1356
1357         .num_device_descs = 1,
1358         .devices = {
1359                 {
1360                         .name = "Anysee DVB USB2.0",
1361                         .cold_ids = {NULL},
1362                         .warm_ids = {&anysee_table[0],
1363                                      &anysee_table[1], NULL},
1364                 },
1365         }
1366 };
1367
1368 static struct usb_driver anysee_driver = {
1369         .name       = "dvb_usb_anysee",
1370         .probe      = anysee_probe,
1371         .disconnect = anysee_disconnect,
1372         .id_table   = anysee_table,
1373 };
1374
1375 module_usb_driver(anysee_driver);
1376
1377 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1378 MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
1379 MODULE_LICENSE("GPL");