Merge branch 'gadget' into for-next
[zen-stable.git] / drivers / media / dvb / dvb-usb / anysee.c
blob7c327b54308e30312848d7b9c4c289f28fe2d937
1 /*
2 * DVB USB Linux driver for Anysee E30 DVB-C & DVB-T USB2.0 receiver
4 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
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.
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.
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.
20 * TODO:
21 * - add smart card reader support for Conditional Access (CA)
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.
30 * Any help according to implement serial smart card reader support
31 * is highly welcome!
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"
45 /* debug */
46 static int dvb_usb_anysee_debug;
47 module_param_named(debug, dvb_usb_anysee_debug, int, 0644);
48 MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
49 static int dvb_usb_anysee_delsys;
50 module_param_named(delsys, dvb_usb_anysee_delsys, int, 0644);
51 MODULE_PARM_DESC(delsys, "select delivery mode (0=DVB-C, 1=DVB-T)");
52 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
54 static DEFINE_MUTEX(anysee_usb_mutex);
56 static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen,
57 u8 *rbuf, u8 rlen)
59 struct anysee_state *state = d->priv;
60 int act_len, ret;
61 u8 buf[64];
63 memcpy(&buf[0], sbuf, slen);
64 buf[60] = state->seq++;
66 if (mutex_lock_interruptible(&anysee_usb_mutex) < 0)
67 return -EAGAIN;
69 /* We need receive one message more after dvb_usb_generic_rw due
70 to weird transaction flow, which is 1 x send + 2 x receive. */
71 ret = dvb_usb_generic_rw(d, buf, sizeof(buf), buf, sizeof(buf), 0);
73 if (!ret) {
74 /* receive 2nd answer */
75 ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
76 d->props.generic_bulk_ctrl_endpoint), buf, sizeof(buf),
77 &act_len, 2000);
78 if (ret)
79 err("%s: recv bulk message failed: %d", __func__, ret);
80 else {
81 deb_xfer("<<< ");
82 debug_dump(buf, act_len, deb_xfer);
86 /* read request, copy returned data to return buf */
87 if (!ret && rbuf && rlen)
88 memcpy(rbuf, buf, rlen);
90 mutex_unlock(&anysee_usb_mutex);
92 return ret;
95 static int anysee_read_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
97 u8 buf[] = {CMD_REG_READ, reg >> 8, reg & 0xff, 0x01};
98 int ret;
99 ret = anysee_ctrl_msg(d, buf, sizeof(buf), val, 1);
100 deb_info("%s: reg:%04x val:%02x\n", __func__, reg, *val);
101 return ret;
104 static int anysee_write_reg(struct dvb_usb_device *d, u16 reg, u8 val)
106 u8 buf[] = {CMD_REG_WRITE, reg >> 8, reg & 0xff, 0x01, val};
107 deb_info("%s: reg:%04x val:%02x\n", __func__, reg, val);
108 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
111 /* write single register with mask */
112 static int anysee_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
113 u8 mask)
115 int ret;
116 u8 tmp;
118 /* no need for read if whole reg is written */
119 if (mask != 0xff) {
120 ret = anysee_read_reg(d, reg, &tmp);
121 if (ret)
122 return ret;
124 val &= mask;
125 tmp &= ~mask;
126 val |= tmp;
129 return anysee_write_reg(d, reg, val);
132 static int anysee_get_hw_info(struct dvb_usb_device *d, u8 *id)
134 u8 buf[] = {CMD_GET_HW_INFO};
135 return anysee_ctrl_msg(d, buf, sizeof(buf), id, 3);
138 static int anysee_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
140 u8 buf[] = {CMD_STREAMING_CTRL, (u8)onoff, 0x00};
141 deb_info("%s: onoff:%02x\n", __func__, onoff);
142 return anysee_ctrl_msg(adap->dev, buf, sizeof(buf), NULL, 0);
145 static int anysee_led_ctrl(struct dvb_usb_device *d, u8 mode, u8 interval)
147 u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x01, mode, interval};
148 deb_info("%s: state:%02x interval:%02x\n", __func__, mode, interval);
149 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
152 static int anysee_ir_ctrl(struct dvb_usb_device *d, u8 onoff)
154 u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x02, onoff};
155 deb_info("%s: onoff:%02x\n", __func__, onoff);
156 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
159 static int anysee_init(struct dvb_usb_device *d)
161 int ret;
162 /* LED light */
163 ret = anysee_led_ctrl(d, 0x01, 0x03);
164 if (ret)
165 return ret;
167 /* enable IR */
168 ret = anysee_ir_ctrl(d, 1);
169 if (ret)
170 return ret;
172 return 0;
175 /* I2C */
176 static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
177 int num)
179 struct dvb_usb_device *d = i2c_get_adapdata(adap);
180 int ret = 0, inc, i = 0;
181 u8 buf[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */
183 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
184 return -EAGAIN;
186 while (i < num) {
187 if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
188 if (msg[i].len > 2 || msg[i+1].len > 60) {
189 ret = -EOPNOTSUPP;
190 break;
192 buf[0] = CMD_I2C_READ;
193 buf[1] = (msg[i].addr << 1) | 0x01;
194 buf[2] = msg[i].buf[0];
195 buf[3] = msg[i].buf[1];
196 buf[4] = msg[i].len-1;
197 buf[5] = msg[i+1].len;
198 ret = anysee_ctrl_msg(d, buf, 6, msg[i+1].buf,
199 msg[i+1].len);
200 inc = 2;
201 } else {
202 if (msg[i].len > 48) {
203 ret = -EOPNOTSUPP;
204 break;
206 buf[0] = CMD_I2C_WRITE;
207 buf[1] = (msg[i].addr << 1);
208 buf[2] = msg[i].len;
209 buf[3] = 0x01;
210 memcpy(&buf[4], msg[i].buf, msg[i].len);
211 ret = anysee_ctrl_msg(d, buf, 4 + msg[i].len, NULL, 0);
212 inc = 1;
214 if (ret)
215 break;
217 i += inc;
220 mutex_unlock(&d->i2c_mutex);
222 return ret ? ret : i;
225 static u32 anysee_i2c_func(struct i2c_adapter *adapter)
227 return I2C_FUNC_I2C;
230 static struct i2c_algorithm anysee_i2c_algo = {
231 .master_xfer = anysee_master_xfer,
232 .functionality = anysee_i2c_func,
235 static int anysee_mt352_demod_init(struct dvb_frontend *fe)
237 static u8 clock_config[] = { CLOCK_CTL, 0x38, 0x28 };
238 static u8 reset[] = { RESET, 0x80 };
239 static u8 adc_ctl_1_cfg[] = { ADC_CTL_1, 0x40 };
240 static u8 agc_cfg[] = { AGC_TARGET, 0x28, 0x20 };
241 static u8 gpp_ctl_cfg[] = { GPP_CTL, 0x33 };
242 static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
244 mt352_write(fe, clock_config, sizeof(clock_config));
245 udelay(200);
246 mt352_write(fe, reset, sizeof(reset));
247 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
249 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
250 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
251 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
253 return 0;
256 /* Callbacks for DVB USB */
257 static struct tda10023_config anysee_tda10023_config = {
258 .demod_address = (0x1a >> 1),
259 .invert = 0,
260 .xtal = 16000000,
261 .pll_m = 11,
262 .pll_p = 3,
263 .pll_n = 1,
264 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
265 .deltaf = 0xfeeb,
268 static struct mt352_config anysee_mt352_config = {
269 .demod_address = (0x1e >> 1),
270 .demod_init = anysee_mt352_demod_init,
273 static struct zl10353_config anysee_zl10353_config = {
274 .demod_address = (0x1e >> 1),
275 .parallel_ts = 1,
278 static struct zl10353_config anysee_zl10353_tda18212_config2 = {
279 .demod_address = (0x1e >> 1),
280 .parallel_ts = 1,
281 .disable_i2c_gate_ctrl = 1,
282 .no_tuner = 1,
283 .if2 = 41500,
286 static struct zl10353_config anysee_zl10353_tda18212_config = {
287 .demod_address = (0x18 >> 1),
288 .parallel_ts = 1,
289 .disable_i2c_gate_ctrl = 1,
290 .no_tuner = 1,
291 .if2 = 41500,
294 static struct tda10023_config anysee_tda10023_tda18212_config = {
295 .demod_address = (0x1a >> 1),
296 .xtal = 16000000,
297 .pll_m = 12,
298 .pll_p = 3,
299 .pll_n = 1,
300 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
301 .deltaf = 0xba02,
304 static struct tda18212_config anysee_tda18212_config = {
305 .i2c_address = (0xc0 >> 1),
306 .if_dvbt_6 = 4150,
307 .if_dvbt_7 = 4150,
308 .if_dvbt_8 = 4150,
309 .if_dvbc = 5000,
312 static struct cx24116_config anysee_cx24116_config = {
313 .demod_address = (0xaa >> 1),
314 .mpg_clk_pos_pol = 0x00,
315 .i2c_wr_max = 48,
318 static struct stv0900_config anysee_stv0900_config = {
319 .demod_address = (0xd0 >> 1),
320 .demod_mode = 0,
321 .xtal = 8000000,
322 .clkmode = 3,
323 .diseqc_mode = 2,
324 .tun1_maddress = 0,
325 .tun1_adc = 1, /* 1 Vpp */
326 .path1_mode = 3,
329 static struct stv6110_config anysee_stv6110_config = {
330 .i2c_address = (0xc0 >> 1),
331 .mclk = 16000000,
332 .clk_div = 1,
335 static struct isl6423_config anysee_isl6423_config = {
336 .current_max = SEC_CURRENT_800m,
337 .curlim = SEC_CURRENT_LIM_OFF,
338 .mod_extern = 1,
339 .addr = (0x10 >> 1),
343 * New USB device strings: Mfr=1, Product=2, SerialNumber=0
344 * Manufacturer: AMT.CO.KR
346 * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
347 * PCB: ?
348 * parts: DNOS404ZH102A(MT352, DTT7579(?))
350 * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
351 * PCB: ?
352 * parts: DNOS404ZH103A(ZL10353, DTT7579(?))
354 * E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee"
355 * PCB: 507CD (rev1.1)
356 * parts: DNOS404ZH103A(ZL10353, DTT7579(?)), CST56I01
357 * OEA=80 OEB=00 OEC=00 OED=ff OEF=fe
358 * IOA=4f IOB=ff IOC=00 IOD=06 IOF=01
359 * IOD[0] ZL10353 1=enabled
360 * IOA[7] TS 0=enabled
361 * tuner is not behind ZL10353 I2C-gate (no care if gate disabled or not)
363 * E30 C Plus VID=04b4 PID=861f HW=10 FW=1.0 "anysee-DC(LP)"
364 * PCB: 507DC (rev0.2)
365 * parts: TDA10023, DTOS403IH102B TM, CST56I01
366 * OEA=80 OEB=00 OEC=00 OED=ff OEF=fe
367 * IOA=4f IOB=ff IOC=00 IOD=26 IOF=01
368 * IOD[0] TDA10023 1=enabled
370 * E30 S2 Plus VID=04b4 PID=861f HW=11 FW=0.1 "anysee-S2(LP)"
371 * PCB: 507SI (rev2.1)
372 * parts: BS2N10WCC01(CX24116, CX24118), ISL6423, TDA8024
373 * OEA=80 OEB=00 OEC=ff OED=ff OEF=fe
374 * IOA=4d IOB=ff IOC=00 IOD=26 IOF=01
375 * IOD[0] CX24116 1=enabled
377 * E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
378 * PCB: 507FA (rev0.4)
379 * parts: TDA10023, DTOS403IH102B TM, TDA8024
380 * OEA=80 OEB=00 OEC=ff OED=ff OEF=ff
381 * IOA=4d IOB=ff IOC=00 IOD=00 IOF=c0
382 * IOD[5] TDA10023 1=enabled
383 * IOE[0] tuner 1=enabled
385 * E30 Combo Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
386 * PCB: 507FA (rev1.1)
387 * parts: ZL10353, TDA10023, DTOS403IH102B TM, TDA8024
388 * OEA=80 OEB=00 OEC=ff OED=ff OEF=ff
389 * IOA=4d IOB=ff IOC=00 IOD=00 IOF=c0
390 * DVB-C:
391 * IOD[5] TDA10023 1=enabled
392 * IOE[0] tuner 1=enabled
393 * DVB-T:
394 * IOD[0] ZL10353 1=enabled
395 * IOE[0] tuner 0=enabled
396 * tuner is behind ZL10353 I2C-gate
398 * E7 TC VID=1c73 PID=861f HW=18 FW=0.7 AMTCI=0.5 "anysee-E7TC(LP)"
399 * PCB: 508TC (rev0.6)
400 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
401 * OEA=80 OEB=00 OEC=03 OED=f7 OEF=ff
402 * IOA=4d IOB=00 IOC=cc IOD=48 IOF=e4
403 * IOA[7] TS 1=enabled
404 * IOE[4] TDA18212 1=enabled
405 * DVB-C:
406 * IOD[6] ZL10353 0=disabled
407 * IOD[5] TDA10023 1=enabled
408 * IOE[0] IF 1=enabled
409 * DVB-T:
410 * IOD[5] TDA10023 0=disabled
411 * IOD[6] ZL10353 1=enabled
412 * IOE[0] IF 0=enabled
414 * E7 S2 VID=1c73 PID=861f HW=19 FW=0.4 AMTCI=0.5 "anysee-E7S2(LP)"
415 * PCB: 508S2 (rev0.7)
416 * parts: DNBU10512IST(STV0903, STV6110), ISL6423
417 * OEA=80 OEB=00 OEC=03 OED=f7 OEF=ff
418 * IOA=4d IOB=00 IOC=c4 IOD=08 IOF=e4
419 * IOA[7] TS 1=enabled
420 * IOE[5] STV0903 1=enabled
424 static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
426 int ret;
427 struct anysee_state *state = adap->dev->priv;
428 u8 hw_info[3];
429 u8 tmp;
430 struct i2c_msg msg[2] = {
432 .addr = anysee_tda18212_config.i2c_address,
433 .flags = 0,
434 .len = 1,
435 .buf = "\x00",
436 }, {
437 .addr = anysee_tda18212_config.i2c_address,
438 .flags = I2C_M_RD,
439 .len = 1,
440 .buf = &tmp,
444 /* Check which hardware we have.
445 * We must do this call two times to get reliable values (hw bug).
447 ret = anysee_get_hw_info(adap->dev, hw_info);
448 if (ret)
449 goto error;
451 ret = anysee_get_hw_info(adap->dev, hw_info);
452 if (ret)
453 goto error;
455 /* Meaning of these info bytes are guessed. */
456 info("firmware version:%d.%d hardware id:%d",
457 hw_info[1], hw_info[2], hw_info[0]);
459 state->hw = hw_info[0];
461 switch (state->hw) {
462 case ANYSEE_HW_02: /* 2 */
463 /* E30 */
465 /* attach demod */
466 adap->fe = dvb_attach(mt352_attach, &anysee_mt352_config,
467 &adap->dev->i2c_adap);
468 if (adap->fe)
469 break;
471 /* attach demod */
472 adap->fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
473 &adap->dev->i2c_adap);
475 break;
476 case ANYSEE_HW_507CD: /* 6 */
477 /* E30 Plus */
479 /* enable DVB-T demod on IOD[0] */
480 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
481 if (ret)
482 goto error;
484 /* enable transport stream on IOA[7] */
485 ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (0 << 7), 0x80);
486 if (ret)
487 goto error;
489 /* attach demod */
490 adap->fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
491 &adap->dev->i2c_adap);
493 break;
494 case ANYSEE_HW_507DC: /* 10 */
495 /* E30 C Plus */
497 /* enable DVB-C demod on IOD[0] */
498 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
499 if (ret)
500 goto error;
502 /* attach demod */
503 adap->fe = dvb_attach(tda10023_attach, &anysee_tda10023_config,
504 &adap->dev->i2c_adap, 0x48);
506 break;
507 case ANYSEE_HW_507SI: /* 11 */
508 /* E30 S2 Plus */
510 /* enable DVB-S/S2 demod on IOD[0] */
511 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
512 if (ret)
513 goto error;
515 /* attach demod */
516 adap->fe = dvb_attach(cx24116_attach, &anysee_cx24116_config,
517 &adap->dev->i2c_adap);
519 break;
520 case ANYSEE_HW_507FA: /* 15 */
521 /* E30 Combo Plus */
522 /* E30 C Plus */
524 /* enable tuner on IOE[4] */
525 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
526 if (ret)
527 goto error;
529 /* probe TDA18212 */
530 tmp = 0;
531 ret = i2c_transfer(&adap->dev->i2c_adap, msg, 2);
532 if (ret == 2 && tmp == 0xc7)
533 deb_info("%s: TDA18212 found\n", __func__);
534 else
535 tmp = 0;
537 /* disable tuner on IOE[4] */
538 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
539 if (ret)
540 goto error;
542 if (dvb_usb_anysee_delsys) {
543 /* disable DVB-C demod on IOD[5] */
544 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
545 0x20);
546 if (ret)
547 goto error;
549 /* enable DVB-T demod on IOD[0] */
550 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
551 0x01);
552 if (ret)
553 goto error;
555 /* attach demod */
556 if (tmp == 0xc7) {
557 /* TDA18212 config */
558 adap->fe = dvb_attach(zl10353_attach,
559 &anysee_zl10353_tda18212_config2,
560 &adap->dev->i2c_adap);
561 } else {
562 /* PLL config */
563 adap->fe = dvb_attach(zl10353_attach,
564 &anysee_zl10353_config,
565 &adap->dev->i2c_adap);
567 } else {
568 /* disable DVB-T demod on IOD[0] */
569 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
570 0x01);
571 if (ret)
572 goto error;
574 /* enable DVB-C demod on IOD[5] */
575 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
576 0x20);
577 if (ret)
578 goto error;
580 /* attach demod */
581 if (tmp == 0xc7) {
582 /* TDA18212 config */
583 adap->fe = dvb_attach(tda10023_attach,
584 &anysee_tda10023_tda18212_config,
585 &adap->dev->i2c_adap, 0x48);
586 } else {
587 /* PLL config */
588 adap->fe = dvb_attach(tda10023_attach,
589 &anysee_tda10023_config,
590 &adap->dev->i2c_adap, 0x48);
594 break;
595 case ANYSEE_HW_508TC: /* 18 */
596 /* E7 TC */
598 /* enable transport stream on IOA[7] */
599 ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
600 if (ret)
601 goto error;
603 if (dvb_usb_anysee_delsys) {
604 /* disable DVB-C demod on IOD[5] */
605 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
606 0x20);
607 if (ret)
608 goto error;
610 /* enable DVB-T demod on IOD[6] */
611 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
612 0x40);
613 if (ret)
614 goto error;
616 /* enable IF route on IOE[0] */
617 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
618 0x01);
619 if (ret)
620 goto error;
622 /* attach demod */
623 adap->fe = dvb_attach(zl10353_attach,
624 &anysee_zl10353_tda18212_config,
625 &adap->dev->i2c_adap);
626 } else {
627 /* disable DVB-T demod on IOD[6] */
628 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
629 0x40);
630 if (ret)
631 goto error;
633 /* enable DVB-C demod on IOD[5] */
634 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
635 0x20);
636 if (ret)
637 goto error;
639 /* enable IF route on IOE[0] */
640 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
641 0x01);
642 if (ret)
643 goto error;
645 /* attach demod */
646 adap->fe = dvb_attach(tda10023_attach,
647 &anysee_tda10023_tda18212_config,
648 &adap->dev->i2c_adap, 0x48);
651 break;
652 case ANYSEE_HW_508S2: /* 19 */
653 /* E7 S2 */
655 /* enable transport stream on IOA[7] */
656 ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
657 if (ret)
658 goto error;
660 /* enable DVB-S/S2 demod on IOE[5] */
661 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
662 if (ret)
663 goto error;
665 /* attach demod */
666 adap->fe = dvb_attach(stv0900_attach, &anysee_stv0900_config,
667 &adap->dev->i2c_adap, 0);
669 break;
672 if (!adap->fe) {
673 /* we have no frontend :-( */
674 ret = -ENODEV;
675 err("Unsupported Anysee version. " \
676 "Please report the <linux-media@vger.kernel.org>.");
678 error:
679 return ret;
682 static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
684 struct anysee_state *state = adap->dev->priv;
685 struct dvb_frontend *fe;
686 int ret;
687 deb_info("%s:\n", __func__);
689 switch (state->hw) {
690 case ANYSEE_HW_02: /* 2 */
691 /* E30 */
693 /* attach tuner */
694 fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc2 >> 1),
695 NULL, DVB_PLL_THOMSON_DTT7579);
697 break;
698 case ANYSEE_HW_507CD: /* 6 */
699 /* E30 Plus */
701 /* attach tuner */
702 fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc2 >> 1),
703 &adap->dev->i2c_adap, DVB_PLL_THOMSON_DTT7579);
705 break;
706 case ANYSEE_HW_507DC: /* 10 */
707 /* E30 C Plus */
709 /* attach tuner */
710 fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc0 >> 1),
711 &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
713 break;
714 case ANYSEE_HW_507SI: /* 11 */
715 /* E30 S2 Plus */
717 /* attach LNB controller */
718 fe = dvb_attach(isl6423_attach, adap->fe, &adap->dev->i2c_adap,
719 &anysee_isl6423_config);
721 break;
722 case ANYSEE_HW_507FA: /* 15 */
723 /* E30 Combo Plus */
724 /* E30 C Plus */
726 if (dvb_usb_anysee_delsys) {
727 /* enable DVB-T tuner on IOE[0] */
728 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
729 0x01);
730 if (ret)
731 goto error;
732 } else {
733 /* enable DVB-C tuner on IOE[0] */
734 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
735 0x01);
736 if (ret)
737 goto error;
740 /* Try first attach TDA18212 silicon tuner on IOE[4], if that
741 * fails attach old simple PLL. */
743 /* enable tuner on IOE[4] */
744 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
745 if (ret)
746 goto error;
748 /* attach tuner */
749 fe = dvb_attach(tda18212_attach, adap->fe, &adap->dev->i2c_adap,
750 &anysee_tda18212_config);
751 if (fe)
752 break;
754 /* disable tuner on IOE[4] */
755 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
756 if (ret)
757 goto error;
759 /* attach tuner */
760 fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc0 >> 1),
761 &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
763 break;
764 case ANYSEE_HW_508TC: /* 18 */
765 /* E7 TC */
767 /* enable tuner on IOE[4] */
768 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
769 if (ret)
770 goto error;
772 /* attach tuner */
773 fe = dvb_attach(tda18212_attach, adap->fe, &adap->dev->i2c_adap,
774 &anysee_tda18212_config);
776 break;
777 case ANYSEE_HW_508S2: /* 19 */
778 /* E7 S2 */
780 /* attach tuner */
781 fe = dvb_attach(stv6110_attach, adap->fe,
782 &anysee_stv6110_config, &adap->dev->i2c_adap);
784 if (fe) {
785 /* attach LNB controller */
786 fe = dvb_attach(isl6423_attach, adap->fe,
787 &adap->dev->i2c_adap, &anysee_isl6423_config);
790 break;
791 default:
792 fe = NULL;
795 if (fe)
796 ret = 0;
797 else
798 ret = -ENODEV;
800 error:
801 return ret;
804 static int anysee_rc_query(struct dvb_usb_device *d)
806 u8 buf[] = {CMD_GET_IR_CODE};
807 u8 ircode[2];
808 int ret;
810 /* Remote controller is basic NEC using address byte 0x08.
811 Anysee device RC query returns only two bytes, status and code,
812 address byte is dropped. Also it does not return any value for
813 NEC RCs having address byte other than 0x08. Due to that, we
814 cannot use that device as standard NEC receiver.
815 It could be possible make hack which reads whole code directly
816 from device memory... */
818 ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode));
819 if (ret)
820 return ret;
822 if (ircode[0]) {
823 deb_rc("%s: key pressed %02x\n", __func__, ircode[1]);
824 rc_keydown(d->rc_dev, 0x08 << 8 | ircode[1], 0);
827 return 0;
830 /* DVB USB Driver stuff */
831 static struct dvb_usb_device_properties anysee_properties;
833 static int anysee_probe(struct usb_interface *intf,
834 const struct usb_device_id *id)
836 struct dvb_usb_device *d;
837 struct usb_host_interface *alt;
838 int ret;
840 /* There is one interface with two alternate settings.
841 Alternate setting 0 is for bulk transfer.
842 Alternate setting 1 is for isochronous transfer.
843 We use bulk transfer (alternate setting 0). */
844 if (intf->num_altsetting < 1)
845 return -ENODEV;
848 * Anysee is always warm (its USB-bridge, Cypress FX2, uploads
849 * firmware from eeprom). If dvb_usb_device_init() succeeds that
850 * means d is a valid pointer.
852 ret = dvb_usb_device_init(intf, &anysee_properties, THIS_MODULE, &d,
853 adapter_nr);
854 if (ret)
855 return ret;
857 alt = usb_altnum_to_altsetting(intf, 0);
858 if (alt == NULL) {
859 deb_info("%s: no alt found!\n", __func__);
860 return -ENODEV;
863 ret = usb_set_interface(d->udev, alt->desc.bInterfaceNumber,
864 alt->desc.bAlternateSetting);
865 if (ret)
866 return ret;
868 return anysee_init(d);
871 static struct usb_device_id anysee_table[] = {
872 { USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE) },
873 { USB_DEVICE(USB_VID_AMT, USB_PID_ANYSEE) },
874 { } /* Terminating entry */
876 MODULE_DEVICE_TABLE(usb, anysee_table);
878 static struct dvb_usb_device_properties anysee_properties = {
879 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
881 .usb_ctrl = DEVICE_SPECIFIC,
883 .size_of_priv = sizeof(struct anysee_state),
885 .num_adapters = 1,
886 .adapter = {
888 .streaming_ctrl = anysee_streaming_ctrl,
889 .frontend_attach = anysee_frontend_attach,
890 .tuner_attach = anysee_tuner_attach,
891 .stream = {
892 .type = USB_BULK,
893 .count = 8,
894 .endpoint = 0x82,
895 .u = {
896 .bulk = {
897 .buffersize = (16*512),
904 .rc.core = {
905 .rc_codes = RC_MAP_ANYSEE,
906 .protocol = RC_TYPE_OTHER,
907 .module_name = "anysee",
908 .rc_query = anysee_rc_query,
909 .rc_interval = 250, /* windows driver uses 500ms */
912 .i2c_algo = &anysee_i2c_algo,
914 .generic_bulk_ctrl_endpoint = 1,
916 .num_device_descs = 1,
917 .devices = {
919 .name = "Anysee DVB USB2.0",
920 .cold_ids = {NULL},
921 .warm_ids = {&anysee_table[0],
922 &anysee_table[1], NULL},
927 static struct usb_driver anysee_driver = {
928 .name = "dvb_usb_anysee",
929 .probe = anysee_probe,
930 .disconnect = dvb_usb_device_exit,
931 .id_table = anysee_table,
934 /* module stuff */
935 static int __init anysee_module_init(void)
937 int ret;
939 ret = usb_register(&anysee_driver);
940 if (ret)
941 err("%s: usb_register failed. Error number %d", __func__, ret);
943 return ret;
946 static void __exit anysee_module_exit(void)
948 /* deregister this driver from the USB subsystem */
949 usb_deregister(&anysee_driver);
952 module_init(anysee_module_init);
953 module_exit(anysee_module_exit);
955 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
956 MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
957 MODULE_LICENSE("GPL");