Linux 3.11-rc3
[cris-mirror.git] / drivers / media / usb / dvb-usb-v2 / anysee.c
blob90cfa35ef6e62d57bf19a32fe1c2e203a77ed5f0
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 "dvb-pll.h"
36 #include "tda1002x.h"
37 #include "mt352.h"
38 #include "mt352_priv.h"
39 #include "zl10353.h"
40 #include "tda18212.h"
41 #include "cx24116.h"
42 #include "stv0900.h"
43 #include "stv6110.h"
44 #include "isl6423.h"
45 #include "cxd2820r.h"
47 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
49 static int anysee_ctrl_msg(struct dvb_usb_device *d,
50 u8 *sbuf, u8 slen, u8 *rbuf, u8 rlen)
52 struct anysee_state *state = d_to_priv(d);
53 int act_len, ret, i;
55 mutex_lock(&d->usb_mutex);
57 memcpy(&state->buf[0], sbuf, slen);
58 state->buf[60] = state->seq++;
60 dev_dbg(&d->udev->dev, "%s: >>> %*ph\n", __func__, slen, state->buf);
62 /* We need receive one message more after dvb_usb_generic_rw due
63 to weird transaction flow, which is 1 x send + 2 x receive. */
64 ret = dvb_usbv2_generic_rw_locked(d, state->buf, sizeof(state->buf),
65 state->buf, sizeof(state->buf));
66 if (ret)
67 goto error_unlock;
69 /* TODO FIXME: dvb_usb_generic_rw() fails rarely with error code -32
70 * (EPIPE, Broken pipe). Function supports currently msleep() as a
71 * parameter but I would not like to use it, since according to
72 * Documentation/timers/timers-howto.txt it should not be used such
73 * short, under < 20ms, sleeps. Repeating failed message would be
74 * better choice as not to add unwanted delays...
75 * Fixing that correctly is one of those or both;
76 * 1) use repeat if possible
77 * 2) add suitable delay
80 /* get answer, retry few times if error returned */
81 for (i = 0; i < 3; i++) {
82 /* receive 2nd answer */
83 ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
84 d->props->generic_bulk_ctrl_endpoint),
85 state->buf, sizeof(state->buf), &act_len, 2000);
86 if (ret) {
87 dev_dbg(&d->udev->dev,
88 "%s: recv bulk message failed=%d\n",
89 __func__, ret);
90 } else {
91 dev_dbg(&d->udev->dev, "%s: <<< %*ph\n", __func__,
92 rlen, state->buf);
94 if (state->buf[63] != 0x4f)
95 dev_dbg(&d->udev->dev,
96 "%s: cmd failed\n", __func__);
97 break;
101 if (ret) {
102 /* all retries failed, it is fatal */
103 dev_err(&d->udev->dev, "%s: recv bulk message failed=%d\n",
104 KBUILD_MODNAME, ret);
105 goto error_unlock;
108 /* read request, copy returned data to return buf */
109 if (rbuf && rlen)
110 memcpy(rbuf, state->buf, rlen);
112 error_unlock:
113 mutex_unlock(&d->usb_mutex);
114 return ret;
117 static int anysee_read_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
119 u8 buf[] = {CMD_REG_READ, reg >> 8, reg & 0xff, 0x01};
120 int ret;
121 ret = anysee_ctrl_msg(d, buf, sizeof(buf), val, 1);
122 dev_dbg(&d->udev->dev, "%s: reg=%04x val=%02x\n", __func__, reg, *val);
123 return ret;
126 static int anysee_write_reg(struct dvb_usb_device *d, u16 reg, u8 val)
128 u8 buf[] = {CMD_REG_WRITE, reg >> 8, reg & 0xff, 0x01, val};
129 dev_dbg(&d->udev->dev, "%s: reg=%04x val=%02x\n", __func__, reg, val);
130 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
133 /* write single register with mask */
134 static int anysee_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
135 u8 mask)
137 int ret;
138 u8 tmp;
140 /* no need for read if whole reg is written */
141 if (mask != 0xff) {
142 ret = anysee_read_reg(d, reg, &tmp);
143 if (ret)
144 return ret;
146 val &= mask;
147 tmp &= ~mask;
148 val |= tmp;
151 return anysee_write_reg(d, reg, val);
154 /* read single register with mask */
155 static int anysee_rd_reg_mask(struct dvb_usb_device *d, u16 reg, u8 *val,
156 u8 mask)
158 int ret, i;
159 u8 tmp;
161 ret = anysee_read_reg(d, reg, &tmp);
162 if (ret)
163 return ret;
165 tmp &= mask;
167 /* find position of the first bit */
168 for (i = 0; i < 8; i++) {
169 if ((mask >> i) & 0x01)
170 break;
172 *val = tmp >> i;
174 return 0;
177 static int anysee_get_hw_info(struct dvb_usb_device *d, u8 *id)
179 u8 buf[] = {CMD_GET_HW_INFO};
180 return anysee_ctrl_msg(d, buf, sizeof(buf), id, 3);
183 static int anysee_streaming_ctrl(struct dvb_frontend *fe, int onoff)
185 u8 buf[] = {CMD_STREAMING_CTRL, (u8)onoff, 0x00};
186 dev_dbg(&fe_to_d(fe)->udev->dev, "%s: onoff=%d\n", __func__, onoff);
187 return anysee_ctrl_msg(fe_to_d(fe), buf, sizeof(buf), NULL, 0);
190 static int anysee_led_ctrl(struct dvb_usb_device *d, u8 mode, u8 interval)
192 u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x01, mode, interval};
193 dev_dbg(&d->udev->dev, "%s: state=%d interval=%d\n", __func__,
194 mode, interval);
195 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
198 static int anysee_ir_ctrl(struct dvb_usb_device *d, u8 onoff)
200 u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x02, onoff};
201 dev_dbg(&d->udev->dev, "%s: onoff=%d\n", __func__, onoff);
202 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
205 /* I2C */
206 static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
207 int num)
209 struct dvb_usb_device *d = i2c_get_adapdata(adap);
210 int ret = 0, inc, i = 0;
211 u8 buf[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */
213 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
214 return -EAGAIN;
216 while (i < num) {
217 if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
218 if (msg[i].len > 2 || msg[i+1].len > 60) {
219 ret = -EOPNOTSUPP;
220 break;
222 buf[0] = CMD_I2C_READ;
223 buf[1] = (msg[i].addr << 1) | 0x01;
224 buf[2] = msg[i].buf[0];
225 buf[3] = msg[i].buf[1];
226 buf[4] = msg[i].len-1;
227 buf[5] = msg[i+1].len;
228 ret = anysee_ctrl_msg(d, buf, 6, msg[i+1].buf,
229 msg[i+1].len);
230 inc = 2;
231 } else {
232 if (msg[i].len > 48) {
233 ret = -EOPNOTSUPP;
234 break;
236 buf[0] = CMD_I2C_WRITE;
237 buf[1] = (msg[i].addr << 1);
238 buf[2] = msg[i].len;
239 buf[3] = 0x01;
240 memcpy(&buf[4], msg[i].buf, msg[i].len);
241 ret = anysee_ctrl_msg(d, buf, 4 + msg[i].len, NULL, 0);
242 inc = 1;
244 if (ret)
245 break;
247 i += inc;
250 mutex_unlock(&d->i2c_mutex);
252 return ret ? ret : i;
255 static u32 anysee_i2c_func(struct i2c_adapter *adapter)
257 return I2C_FUNC_I2C;
260 static struct i2c_algorithm anysee_i2c_algo = {
261 .master_xfer = anysee_master_xfer,
262 .functionality = anysee_i2c_func,
265 static int anysee_mt352_demod_init(struct dvb_frontend *fe)
267 static u8 clock_config[] = { CLOCK_CTL, 0x38, 0x28 };
268 static u8 reset[] = { RESET, 0x80 };
269 static u8 adc_ctl_1_cfg[] = { ADC_CTL_1, 0x40 };
270 static u8 agc_cfg[] = { AGC_TARGET, 0x28, 0x20 };
271 static u8 gpp_ctl_cfg[] = { GPP_CTL, 0x33 };
272 static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
274 mt352_write(fe, clock_config, sizeof(clock_config));
275 udelay(200);
276 mt352_write(fe, reset, sizeof(reset));
277 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
279 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
280 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
281 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
283 return 0;
286 /* Callbacks for DVB USB */
287 static struct tda10023_config anysee_tda10023_config = {
288 .demod_address = (0x1a >> 1),
289 .invert = 0,
290 .xtal = 16000000,
291 .pll_m = 11,
292 .pll_p = 3,
293 .pll_n = 1,
294 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
295 .deltaf = 0xfeeb,
298 static struct mt352_config anysee_mt352_config = {
299 .demod_address = (0x1e >> 1),
300 .demod_init = anysee_mt352_demod_init,
303 static struct zl10353_config anysee_zl10353_config = {
304 .demod_address = (0x1e >> 1),
305 .parallel_ts = 1,
308 static struct zl10353_config anysee_zl10353_tda18212_config2 = {
309 .demod_address = (0x1e >> 1),
310 .parallel_ts = 1,
311 .disable_i2c_gate_ctrl = 1,
312 .no_tuner = 1,
313 .if2 = 41500,
316 static struct zl10353_config anysee_zl10353_tda18212_config = {
317 .demod_address = (0x18 >> 1),
318 .parallel_ts = 1,
319 .disable_i2c_gate_ctrl = 1,
320 .no_tuner = 1,
321 .if2 = 41500,
324 static struct tda10023_config anysee_tda10023_tda18212_config = {
325 .demod_address = (0x1a >> 1),
326 .xtal = 16000000,
327 .pll_m = 12,
328 .pll_p = 3,
329 .pll_n = 1,
330 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_B,
331 .deltaf = 0xba02,
334 static struct tda18212_config anysee_tda18212_config = {
335 .i2c_address = (0xc0 >> 1),
336 .if_dvbt_6 = 4150,
337 .if_dvbt_7 = 4150,
338 .if_dvbt_8 = 4150,
339 .if_dvbc = 5000,
342 static struct tda18212_config anysee_tda18212_config2 = {
343 .i2c_address = 0x60 /* (0xc0 >> 1) */,
344 .if_dvbt_6 = 3550,
345 .if_dvbt_7 = 3700,
346 .if_dvbt_8 = 4150,
347 .if_dvbt2_6 = 3250,
348 .if_dvbt2_7 = 4000,
349 .if_dvbt2_8 = 4000,
350 .if_dvbc = 5000,
353 static struct cx24116_config anysee_cx24116_config = {
354 .demod_address = (0xaa >> 1),
355 .mpg_clk_pos_pol = 0x00,
356 .i2c_wr_max = 48,
359 static struct stv0900_config anysee_stv0900_config = {
360 .demod_address = (0xd0 >> 1),
361 .demod_mode = 0,
362 .xtal = 8000000,
363 .clkmode = 3,
364 .diseqc_mode = 2,
365 .tun1_maddress = 0,
366 .tun1_adc = 1, /* 1 Vpp */
367 .path1_mode = 3,
370 static struct stv6110_config anysee_stv6110_config = {
371 .i2c_address = (0xc0 >> 1),
372 .mclk = 16000000,
373 .clk_div = 1,
376 static struct isl6423_config anysee_isl6423_config = {
377 .current_max = SEC_CURRENT_800m,
378 .curlim = SEC_CURRENT_LIM_OFF,
379 .mod_extern = 1,
380 .addr = (0x10 >> 1),
383 static struct cxd2820r_config anysee_cxd2820r_config = {
384 .i2c_address = 0x6d, /* (0xda >> 1) */
385 .ts_mode = 0x38,
389 * New USB device strings: Mfr=1, Product=2, SerialNumber=0
390 * Manufacturer: AMT.CO.KR
392 * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
393 * PCB: ?
394 * parts: DNOS404ZH102A(MT352, DTT7579(?))
396 * E30 VID=04b4 PID=861f HW=2 FW=2.1 "anysee-T(LP)"
397 * PCB: PCB 507T (rev1.61)
398 * parts: DNOS404ZH103A(ZL10353, DTT7579(?))
399 * OEA=0a OEB=00 OEC=00 OED=ff OEE=00
400 * IOA=45 IOB=ff IOC=00 IOD=ff IOE=00
402 * E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee"
403 * PCB: 507CD (rev1.1)
404 * parts: DNOS404ZH103A(ZL10353, DTT7579(?)), CST56I01
405 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
406 * IOA=4f IOB=ff IOC=00 IOD=06 IOE=01
407 * IOD[0] ZL10353 1=enabled
408 * IOA[7] TS 0=enabled
409 * tuner is not behind ZL10353 I2C-gate (no care if gate disabled or not)
411 * E30 C Plus VID=04b4 PID=861f HW=10 FW=1.0 "anysee-DC(LP)"
412 * PCB: 507DC (rev0.2)
413 * parts: TDA10023, DTOS403IH102B TM, CST56I01
414 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
415 * IOA=4f IOB=ff IOC=00 IOD=26 IOE=01
416 * IOD[0] TDA10023 1=enabled
418 * E30 S2 Plus VID=04b4 PID=861f HW=11 FW=0.1 "anysee-S2(LP)"
419 * PCB: 507SI (rev2.1)
420 * parts: BS2N10WCC01(CX24116, CX24118), ISL6423, TDA8024
421 * OEA=80 OEB=00 OEC=ff OED=ff OEE=fe
422 * IOA=4d IOB=ff IOC=00 IOD=26 IOE=01
423 * IOD[0] CX24116 1=enabled
425 * E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
426 * PCB: 507FA (rev0.4)
427 * parts: TDA10023, DTOS403IH102B TM, TDA8024
428 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
429 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
430 * IOD[5] TDA10023 1=enabled
431 * IOE[0] tuner 1=enabled
433 * E30 Combo Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
434 * PCB: 507FA (rev1.1)
435 * parts: ZL10353, TDA10023, DTOS403IH102B TM, TDA8024
436 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
437 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
438 * DVB-C:
439 * IOD[5] TDA10023 1=enabled
440 * IOE[0] tuner 1=enabled
441 * DVB-T:
442 * IOD[0] ZL10353 1=enabled
443 * IOE[0] tuner 0=enabled
444 * tuner is behind ZL10353 I2C-gate
446 * E7 TC VID=1c73 PID=861f HW=18 FW=0.7 AMTCI=0.5 "anysee-E7TC(LP)"
447 * PCB: 508TC (rev0.6)
448 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
449 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
450 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
451 * IOA[7] TS 1=enabled
452 * IOE[4] TDA18212 1=enabled
453 * DVB-C:
454 * IOD[6] ZL10353 0=disabled
455 * IOD[5] TDA10023 1=enabled
456 * IOE[0] IF 1=enabled
457 * DVB-T:
458 * IOD[5] TDA10023 0=disabled
459 * IOD[6] ZL10353 1=enabled
460 * IOE[0] IF 0=enabled
462 * E7 S2 VID=1c73 PID=861f HW=19 FW=0.4 AMTCI=0.5 "anysee-E7S2(LP)"
463 * PCB: 508S2 (rev0.7)
464 * parts: DNBU10512IST(STV0903, STV6110), ISL6423
465 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
466 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
467 * IOA[7] TS 1=enabled
468 * IOE[5] STV0903 1=enabled
470 * E7 T2C VID=1c73 PID=861f HW=20 FW=0.1 AMTCI=0.5 "anysee-E7T2C(LP)"
471 * PCB: 508T2C (rev0.3)
472 * parts: DNOQ44QCH106A(CXD2820R, TDA18212), TDA8024
473 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
474 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
475 * IOA[7] TS 1=enabled
476 * IOE[5] CXD2820R 1=enabled
478 * E7 PTC VID=1c73 PID=861f HW=21 FW=0.1 AMTCI=?? "anysee-E7PTC(LP)"
479 * PCB: 508PTC (rev0.5)
480 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
481 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
482 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
483 * IOA[7] TS 1=enabled
484 * IOE[4] TDA18212 1=enabled
485 * DVB-C:
486 * IOD[6] ZL10353 0=disabled
487 * IOD[5] TDA10023 1=enabled
488 * IOE[0] IF 1=enabled
489 * DVB-T:
490 * IOD[5] TDA10023 0=disabled
491 * IOD[6] ZL10353 1=enabled
492 * IOE[0] IF 0=enabled
494 * E7 PS2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
495 * PCB: 508PS2 (rev0.4)
496 * parts: DNBU10512IST(STV0903, STV6110), ISL6423
497 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
498 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
499 * IOA[7] TS 1=enabled
500 * IOE[5] STV0903 1=enabled
503 static int anysee_read_config(struct dvb_usb_device *d)
505 struct anysee_state *state = d_to_priv(d);
506 int ret;
507 u8 hw_info[3];
510 * Check which hardware we have.
511 * We must do this call two times to get reliable values (hw/fw bug).
513 ret = anysee_get_hw_info(d, hw_info);
514 if (ret)
515 goto error;
517 ret = anysee_get_hw_info(d, hw_info);
518 if (ret)
519 goto error;
522 * Meaning of these info bytes are guessed.
524 dev_info(&d->udev->dev, "%s: firmware version %d.%d hardware id %d\n",
525 KBUILD_MODNAME, hw_info[1], hw_info[2], hw_info[0]);
527 state->hw = hw_info[0];
528 error:
529 return ret;
532 /* external I2C gate used for DNOD44CDH086A(TDA18212) tuner module */
533 static int anysee_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
535 /* enable / disable tuner access on IOE[4] */
536 return anysee_wr_reg_mask(fe_to_d(fe), REG_IOE, (enable << 4), 0x10);
539 static int anysee_frontend_ctrl(struct dvb_frontend *fe, int onoff)
541 struct anysee_state *state = fe_to_priv(fe);
542 struct dvb_usb_device *d = fe_to_d(fe);
543 int ret;
544 dev_dbg(&d->udev->dev, "%s: fe=%d onoff=%d\n", __func__, fe->id, onoff);
546 /* no frontend sleep control */
547 if (onoff == 0)
548 return 0;
550 switch (state->hw) {
551 case ANYSEE_HW_507FA: /* 15 */
552 /* E30 Combo Plus */
553 /* E30 C Plus */
555 if (fe->id == 0) {
556 /* disable DVB-T demod on IOD[0] */
557 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 0), 0x01);
558 if (ret)
559 goto error;
561 /* enable DVB-C demod on IOD[5] */
562 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
563 if (ret)
564 goto error;
566 /* enable DVB-C tuner on IOE[0] */
567 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 0), 0x01);
568 if (ret)
569 goto error;
570 } else {
571 /* disable DVB-C demod on IOD[5] */
572 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
573 if (ret)
574 goto error;
576 /* enable DVB-T demod on IOD[0] */
577 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
578 if (ret)
579 goto error;
581 /* enable DVB-T tuner on IOE[0] */
582 ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 0), 0x01);
583 if (ret)
584 goto error;
587 break;
588 case ANYSEE_HW_508TC: /* 18 */
589 case ANYSEE_HW_508PTC: /* 21 */
590 /* E7 TC */
591 /* E7 PTC */
593 if (fe->id == 0) {
594 /* disable DVB-T demod on IOD[6] */
595 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 6), 0x40);
596 if (ret)
597 goto error;
599 /* enable DVB-C demod on IOD[5] */
600 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
601 if (ret)
602 goto error;
604 /* enable IF route on IOE[0] */
605 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 0), 0x01);
606 if (ret)
607 goto error;
608 } else {
609 /* disable DVB-C demod on IOD[5] */
610 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
611 if (ret)
612 goto error;
614 /* enable DVB-T demod on IOD[6] */
615 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 6), 0x40);
616 if (ret)
617 goto error;
619 /* enable IF route on IOE[0] */
620 ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 0), 0x01);
621 if (ret)
622 goto error;
625 break;
626 default:
627 ret = 0;
630 error:
631 return ret;
634 static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
636 struct anysee_state *state = adap_to_priv(adap);
637 struct dvb_usb_device *d = adap_to_d(adap);
638 int ret = 0;
639 u8 tmp;
640 struct i2c_msg msg[2] = {
642 .addr = anysee_tda18212_config.i2c_address,
643 .flags = 0,
644 .len = 1,
645 .buf = "\x00",
646 }, {
647 .addr = anysee_tda18212_config.i2c_address,
648 .flags = I2C_M_RD,
649 .len = 1,
650 .buf = &tmp,
654 switch (state->hw) {
655 case ANYSEE_HW_507T: /* 2 */
656 /* E30 */
658 /* attach demod */
659 adap->fe[0] = dvb_attach(mt352_attach, &anysee_mt352_config,
660 &d->i2c_adap);
661 if (adap->fe[0])
662 break;
664 /* attach demod */
665 adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config,
666 &d->i2c_adap);
668 break;
669 case ANYSEE_HW_507CD: /* 6 */
670 /* E30 Plus */
672 /* enable DVB-T demod on IOD[0] */
673 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
674 if (ret)
675 goto error;
677 /* enable transport stream on IOA[7] */
678 ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
679 if (ret)
680 goto error;
682 /* attach demod */
683 adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config,
684 &d->i2c_adap);
686 break;
687 case ANYSEE_HW_507DC: /* 10 */
688 /* E30 C Plus */
690 /* enable DVB-C demod on IOD[0] */
691 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
692 if (ret)
693 goto error;
695 /* attach demod */
696 adap->fe[0] = dvb_attach(tda10023_attach,
697 &anysee_tda10023_config, &d->i2c_adap, 0x48);
699 break;
700 case ANYSEE_HW_507SI: /* 11 */
701 /* E30 S2 Plus */
703 /* enable DVB-S/S2 demod on IOD[0] */
704 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
705 if (ret)
706 goto error;
708 /* attach demod */
709 adap->fe[0] = dvb_attach(cx24116_attach, &anysee_cx24116_config,
710 &d->i2c_adap);
712 break;
713 case ANYSEE_HW_507FA: /* 15 */
714 /* E30 Combo Plus */
715 /* E30 C Plus */
717 /* enable tuner on IOE[4] */
718 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 4), 0x10);
719 if (ret)
720 goto error;
722 /* probe TDA18212 */
723 tmp = 0;
724 ret = i2c_transfer(&d->i2c_adap, msg, 2);
725 if (ret == 2 && tmp == 0xc7)
726 dev_dbg(&d->udev->dev, "%s: TDA18212 found\n",
727 __func__);
728 else
729 tmp = 0;
731 /* disable tuner on IOE[4] */
732 ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 4), 0x10);
733 if (ret)
734 goto error;
736 /* disable DVB-T demod on IOD[0] */
737 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 0), 0x01);
738 if (ret)
739 goto error;
741 /* enable DVB-C demod on IOD[5] */
742 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
743 if (ret)
744 goto error;
746 /* attach demod */
747 if (tmp == 0xc7) {
748 /* TDA18212 config */
749 adap->fe[0] = dvb_attach(tda10023_attach,
750 &anysee_tda10023_tda18212_config,
751 &d->i2c_adap, 0x48);
753 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
754 if (adap->fe[0])
755 adap->fe[0]->ops.i2c_gate_ctrl =
756 anysee_i2c_gate_ctrl;
757 } else {
758 /* PLL config */
759 adap->fe[0] = dvb_attach(tda10023_attach,
760 &anysee_tda10023_config,
761 &d->i2c_adap, 0x48);
764 /* break out if first frontend attaching fails */
765 if (!adap->fe[0])
766 break;
768 /* disable DVB-C demod on IOD[5] */
769 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
770 if (ret)
771 goto error;
773 /* enable DVB-T demod on IOD[0] */
774 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
775 if (ret)
776 goto error;
778 /* attach demod */
779 if (tmp == 0xc7) {
780 /* TDA18212 config */
781 adap->fe[1] = dvb_attach(zl10353_attach,
782 &anysee_zl10353_tda18212_config2,
783 &d->i2c_adap);
785 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
786 if (adap->fe[1])
787 adap->fe[1]->ops.i2c_gate_ctrl =
788 anysee_i2c_gate_ctrl;
789 } else {
790 /* PLL config */
791 adap->fe[1] = dvb_attach(zl10353_attach,
792 &anysee_zl10353_config,
793 &d->i2c_adap);
796 break;
797 case ANYSEE_HW_508TC: /* 18 */
798 case ANYSEE_HW_508PTC: /* 21 */
799 /* E7 TC */
800 /* E7 PTC */
802 /* disable DVB-T demod on IOD[6] */
803 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 6), 0x40);
804 if (ret)
805 goto error;
807 /* enable DVB-C demod on IOD[5] */
808 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
809 if (ret)
810 goto error;
812 /* attach demod */
813 adap->fe[0] = dvb_attach(tda10023_attach,
814 &anysee_tda10023_tda18212_config,
815 &d->i2c_adap, 0x48);
817 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
818 if (adap->fe[0])
819 adap->fe[0]->ops.i2c_gate_ctrl = anysee_i2c_gate_ctrl;
821 /* break out if first frontend attaching fails */
822 if (!adap->fe[0])
823 break;
825 /* disable DVB-C demod on IOD[5] */
826 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
827 if (ret)
828 goto error;
830 /* enable DVB-T demod on IOD[6] */
831 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 6), 0x40);
832 if (ret)
833 goto error;
835 /* attach demod */
836 adap->fe[1] = dvb_attach(zl10353_attach,
837 &anysee_zl10353_tda18212_config,
838 &d->i2c_adap);
840 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
841 if (adap->fe[1])
842 adap->fe[1]->ops.i2c_gate_ctrl = anysee_i2c_gate_ctrl;
844 state->has_ci = true;
846 break;
847 case ANYSEE_HW_508S2: /* 19 */
848 case ANYSEE_HW_508PS2: /* 22 */
849 /* E7 S2 */
850 /* E7 PS2 */
852 /* enable DVB-S/S2 demod on IOE[5] */
853 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 5), 0x20);
854 if (ret)
855 goto error;
857 /* attach demod */
858 adap->fe[0] = dvb_attach(stv0900_attach,
859 &anysee_stv0900_config, &d->i2c_adap, 0);
861 state->has_ci = true;
863 break;
864 case ANYSEE_HW_508T2C: /* 20 */
865 /* E7 T2C */
867 /* enable DVB-T/T2/C demod on IOE[5] */
868 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 5), 0x20);
869 if (ret)
870 goto error;
872 /* attach demod */
873 adap->fe[0] = dvb_attach(cxd2820r_attach,
874 &anysee_cxd2820r_config, &d->i2c_adap, NULL);
876 state->has_ci = true;
878 break;
881 if (!adap->fe[0]) {
882 /* we have no frontend :-( */
883 ret = -ENODEV;
884 dev_err(&d->udev->dev,
885 "%s: Unsupported Anysee version. Please report to <linux-media@vger.kernel.org>.\n",
886 KBUILD_MODNAME);
888 error:
889 return ret;
892 static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
894 struct anysee_state *state = adap_to_priv(adap);
895 struct dvb_usb_device *d = adap_to_d(adap);
896 struct dvb_frontend *fe;
897 int ret;
898 dev_dbg(&d->udev->dev, "%s:\n", __func__);
900 switch (state->hw) {
901 case ANYSEE_HW_507T: /* 2 */
902 /* E30 */
904 /* attach tuner */
905 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1), NULL,
906 DVB_PLL_THOMSON_DTT7579);
908 break;
909 case ANYSEE_HW_507CD: /* 6 */
910 /* E30 Plus */
912 /* attach tuner */
913 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1),
914 &d->i2c_adap, DVB_PLL_THOMSON_DTT7579);
916 break;
917 case ANYSEE_HW_507DC: /* 10 */
918 /* E30 C Plus */
920 /* attach tuner */
921 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc0 >> 1),
922 &d->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
924 break;
925 case ANYSEE_HW_507SI: /* 11 */
926 /* E30 S2 Plus */
928 /* attach LNB controller */
929 fe = dvb_attach(isl6423_attach, adap->fe[0], &d->i2c_adap,
930 &anysee_isl6423_config);
932 break;
933 case ANYSEE_HW_507FA: /* 15 */
934 /* E30 Combo Plus */
935 /* E30 C Plus */
937 /* Try first attach TDA18212 silicon tuner on IOE[4], if that
938 * fails attach old simple PLL. */
940 /* attach tuner */
941 fe = dvb_attach(tda18212_attach, adap->fe[0], &d->i2c_adap,
942 &anysee_tda18212_config);
944 if (fe && adap->fe[1]) {
945 /* attach tuner for 2nd FE */
946 fe = dvb_attach(tda18212_attach, adap->fe[1],
947 &d->i2c_adap, &anysee_tda18212_config);
948 break;
949 } else if (fe) {
950 break;
953 /* attach tuner */
954 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc0 >> 1),
955 &d->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
957 if (fe && adap->fe[1]) {
958 /* attach tuner for 2nd FE */
959 fe = dvb_attach(dvb_pll_attach, adap->fe[0],
960 (0xc0 >> 1), &d->i2c_adap,
961 DVB_PLL_SAMSUNG_DTOS403IH102A);
964 break;
965 case ANYSEE_HW_508TC: /* 18 */
966 case ANYSEE_HW_508PTC: /* 21 */
967 /* E7 TC */
968 /* E7 PTC */
970 /* attach tuner */
971 fe = dvb_attach(tda18212_attach, adap->fe[0], &d->i2c_adap,
972 &anysee_tda18212_config);
974 if (fe) {
975 /* attach tuner for 2nd FE */
976 fe = dvb_attach(tda18212_attach, adap->fe[1],
977 &d->i2c_adap, &anysee_tda18212_config);
980 break;
981 case ANYSEE_HW_508S2: /* 19 */
982 case ANYSEE_HW_508PS2: /* 22 */
983 /* E7 S2 */
984 /* E7 PS2 */
986 /* attach tuner */
987 fe = dvb_attach(stv6110_attach, adap->fe[0],
988 &anysee_stv6110_config, &d->i2c_adap);
990 if (fe) {
991 /* attach LNB controller */
992 fe = dvb_attach(isl6423_attach, adap->fe[0],
993 &d->i2c_adap, &anysee_isl6423_config);
996 break;
998 case ANYSEE_HW_508T2C: /* 20 */
999 /* E7 T2C */
1001 /* attach tuner */
1002 fe = dvb_attach(tda18212_attach, adap->fe[0], &d->i2c_adap,
1003 &anysee_tda18212_config2);
1005 break;
1006 default:
1007 fe = NULL;
1010 if (fe)
1011 ret = 0;
1012 else
1013 ret = -ENODEV;
1015 return ret;
1018 #if IS_ENABLED(CONFIG_RC_CORE)
1019 static int anysee_rc_query(struct dvb_usb_device *d)
1021 u8 buf[] = {CMD_GET_IR_CODE};
1022 u8 ircode[2];
1023 int ret;
1025 /* Remote controller is basic NEC using address byte 0x08.
1026 Anysee device RC query returns only two bytes, status and code,
1027 address byte is dropped. Also it does not return any value for
1028 NEC RCs having address byte other than 0x08. Due to that, we
1029 cannot use that device as standard NEC receiver.
1030 It could be possible make hack which reads whole code directly
1031 from device memory... */
1033 ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode));
1034 if (ret)
1035 return ret;
1037 if (ircode[0]) {
1038 dev_dbg(&d->udev->dev, "%s: key pressed %02x\n", __func__,
1039 ircode[1]);
1040 rc_keydown(d->rc_dev, 0x08 << 8 | ircode[1], 0);
1043 return 0;
1046 static int anysee_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc)
1048 rc->allowed_protos = RC_BIT_NEC;
1049 rc->query = anysee_rc_query;
1050 rc->interval = 250; /* windows driver uses 500ms */
1052 return 0;
1054 #else
1055 #define anysee_get_rc_config NULL
1056 #endif
1058 static int anysee_ci_read_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
1059 int addr)
1061 struct dvb_usb_device *d = ci->data;
1062 int ret;
1063 u8 buf[] = {CMD_CI, 0x02, 0x40 | addr >> 8, addr & 0xff, 0x00, 1};
1064 u8 val;
1066 ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
1067 if (ret)
1068 return ret;
1070 return val;
1073 static int anysee_ci_write_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
1074 int addr, u8 val)
1076 struct dvb_usb_device *d = ci->data;
1077 int ret;
1078 u8 buf[] = {CMD_CI, 0x03, 0x40 | addr >> 8, addr & 0xff, 0x00, 1, val};
1080 ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
1081 if (ret)
1082 return ret;
1084 return 0;
1087 static int anysee_ci_read_cam_control(struct dvb_ca_en50221 *ci, int slot,
1088 u8 addr)
1090 struct dvb_usb_device *d = ci->data;
1091 int ret;
1092 u8 buf[] = {CMD_CI, 0x04, 0x40, addr, 0x00, 1};
1093 u8 val;
1095 ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
1096 if (ret)
1097 return ret;
1099 return val;
1102 static int anysee_ci_write_cam_control(struct dvb_ca_en50221 *ci, int slot,
1103 u8 addr, u8 val)
1105 struct dvb_usb_device *d = ci->data;
1106 int ret;
1107 u8 buf[] = {CMD_CI, 0x05, 0x40, addr, 0x00, 1, val};
1109 ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
1110 if (ret)
1111 return ret;
1113 return 0;
1116 static int anysee_ci_slot_reset(struct dvb_ca_en50221 *ci, int slot)
1118 struct dvb_usb_device *d = ci->data;
1119 int ret;
1120 struct anysee_state *state = d_to_priv(d);
1122 state->ci_cam_ready = jiffies + msecs_to_jiffies(1000);
1124 ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
1125 if (ret)
1126 return ret;
1128 msleep(300);
1130 ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1131 if (ret)
1132 return ret;
1134 return 0;
1137 static int anysee_ci_slot_shutdown(struct dvb_ca_en50221 *ci, int slot)
1139 struct dvb_usb_device *d = ci->data;
1140 int ret;
1142 ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
1143 if (ret)
1144 return ret;
1146 msleep(30);
1148 ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1149 if (ret)
1150 return ret;
1152 return 0;
1155 static int anysee_ci_slot_ts_enable(struct dvb_ca_en50221 *ci, int slot)
1157 struct dvb_usb_device *d = ci->data;
1158 int ret;
1160 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 1), 0x02);
1161 if (ret)
1162 return ret;
1164 return 0;
1167 static int anysee_ci_poll_slot_status(struct dvb_ca_en50221 *ci, int slot,
1168 int open)
1170 struct dvb_usb_device *d = ci->data;
1171 struct anysee_state *state = d_to_priv(d);
1172 int ret;
1173 u8 tmp = 0;
1175 ret = anysee_rd_reg_mask(d, REG_IOC, &tmp, 0x40);
1176 if (ret)
1177 return ret;
1179 if (tmp == 0) {
1180 ret = DVB_CA_EN50221_POLL_CAM_PRESENT;
1181 if (time_after(jiffies, state->ci_cam_ready))
1182 ret |= DVB_CA_EN50221_POLL_CAM_READY;
1185 return ret;
1188 static int anysee_ci_init(struct dvb_usb_device *d)
1190 struct anysee_state *state = d_to_priv(d);
1191 int ret;
1193 state->ci.owner = THIS_MODULE;
1194 state->ci.read_attribute_mem = anysee_ci_read_attribute_mem;
1195 state->ci.write_attribute_mem = anysee_ci_write_attribute_mem;
1196 state->ci.read_cam_control = anysee_ci_read_cam_control;
1197 state->ci.write_cam_control = anysee_ci_write_cam_control;
1198 state->ci.slot_reset = anysee_ci_slot_reset;
1199 state->ci.slot_shutdown = anysee_ci_slot_shutdown;
1200 state->ci.slot_ts_enable = anysee_ci_slot_ts_enable;
1201 state->ci.poll_slot_status = anysee_ci_poll_slot_status;
1202 state->ci.data = d;
1204 ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1205 if (ret)
1206 return ret;
1208 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 2)|(0 << 1)|(0 << 0), 0x07);
1209 if (ret)
1210 return ret;
1212 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 2)|(1 << 1)|(1 << 0), 0x07);
1213 if (ret)
1214 return ret;
1216 ret = dvb_ca_en50221_init(&d->adapter[0].dvb_adap, &state->ci, 0, 1);
1217 if (ret)
1218 return ret;
1220 state->ci_attached = true;
1222 return 0;
1225 static void anysee_ci_release(struct dvb_usb_device *d)
1227 struct anysee_state *state = d_to_priv(d);
1229 /* detach CI */
1230 if (state->ci_attached)
1231 dvb_ca_en50221_release(&state->ci);
1233 return;
1236 static int anysee_init(struct dvb_usb_device *d)
1238 struct anysee_state *state = d_to_priv(d);
1239 int ret;
1241 /* There is one interface with two alternate settings.
1242 Alternate setting 0 is for bulk transfer.
1243 Alternate setting 1 is for isochronous transfer.
1244 We use bulk transfer (alternate setting 0). */
1245 ret = usb_set_interface(d->udev, 0, 0);
1246 if (ret)
1247 return ret;
1249 /* LED light */
1250 ret = anysee_led_ctrl(d, 0x01, 0x03);
1251 if (ret)
1252 return ret;
1254 /* enable IR */
1255 ret = anysee_ir_ctrl(d, 1);
1256 if (ret)
1257 return ret;
1259 /* attach CI */
1260 if (state->has_ci) {
1261 ret = anysee_ci_init(d);
1262 if (ret)
1263 return ret;
1266 return 0;
1269 static void anysee_exit(struct dvb_usb_device *d)
1271 return anysee_ci_release(d);
1274 /* DVB USB Driver stuff */
1275 static struct dvb_usb_device_properties anysee_props = {
1276 .driver_name = KBUILD_MODNAME,
1277 .owner = THIS_MODULE,
1278 .adapter_nr = adapter_nr,
1279 .size_of_priv = sizeof(struct anysee_state),
1281 .generic_bulk_ctrl_endpoint = 0x01,
1282 .generic_bulk_ctrl_endpoint_response = 0x81,
1284 .i2c_algo = &anysee_i2c_algo,
1285 .read_config = anysee_read_config,
1286 .frontend_attach = anysee_frontend_attach,
1287 .tuner_attach = anysee_tuner_attach,
1288 .init = anysee_init,
1289 .get_rc_config = anysee_get_rc_config,
1290 .frontend_ctrl = anysee_frontend_ctrl,
1291 .streaming_ctrl = anysee_streaming_ctrl,
1292 .exit = anysee_exit,
1294 .num_adapters = 1,
1295 .adapter = {
1297 .stream = DVB_USB_STREAM_BULK(0x82, 8, 16 * 512),
1302 static const struct usb_device_id anysee_id_table[] = {
1303 { DVB_USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE,
1304 &anysee_props, "Anysee", RC_MAP_ANYSEE) },
1305 { DVB_USB_DEVICE(USB_VID_AMT, USB_PID_ANYSEE,
1306 &anysee_props, "Anysee", RC_MAP_ANYSEE) },
1309 MODULE_DEVICE_TABLE(usb, anysee_id_table);
1311 static struct usb_driver anysee_usb_driver = {
1312 .name = KBUILD_MODNAME,
1313 .id_table = anysee_id_table,
1314 .probe = dvb_usbv2_probe,
1315 .disconnect = dvb_usbv2_disconnect,
1316 .suspend = dvb_usbv2_suspend,
1317 .resume = dvb_usbv2_resume,
1318 .reset_resume = dvb_usbv2_reset_resume,
1319 .no_dynamic_id = 1,
1320 .soft_unbind = 1,
1323 module_usb_driver(anysee_usb_driver);
1325 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1326 MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
1327 MODULE_LICENSE("GPL");