Merge branch 'for-linus' of git://git.kernel.dk/linux-block
[deliverable/linux.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");
This page took 0.110613 seconds and 5 git commands to generate.