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.
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
38 #include "mt352_priv.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
);
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
));
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);
87 dev_dbg(&d
->udev
->dev
,
88 "%s: recv bulk message failed=%d\n",
91 dev_dbg(&d
->udev
->dev
, "%s: <<< %*ph\n", __func__
,
94 if (state
->buf
[63] != 0x4f)
95 dev_dbg(&d
->udev
->dev
,
96 "%s: cmd failed\n", __func__
);
102 /* all retries failed, it is fatal */
103 dev_err(&d
->udev
->dev
, "%s: recv bulk message failed=%d\n",
104 KBUILD_MODNAME
, ret
);
108 /* read request, copy returned data to return buf */
110 memcpy(rbuf
, state
->buf
, rlen
);
113 mutex_unlock(&d
->usb_mutex
);
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};
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
);
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
,
140 /* no need for read if whole reg is written */
142 ret
= anysee_read_reg(d
, reg
, &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
,
161 ret
= anysee_read_reg(d
, reg
, &tmp
);
167 /* find position of the first bit */
168 for (i
= 0; i
< 8; i
++) {
169 if ((mask
>> i
) & 0x01)
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__
,
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);
206 static int anysee_master_xfer(struct i2c_adapter
*adap
, struct i2c_msg
*msg
,
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)
217 if (num
> i
+ 1 && (msg
[i
+1].flags
& I2C_M_RD
)) {
218 if (msg
[i
].len
> 2 || msg
[i
+1].len
> 60) {
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
,
232 if (msg
[i
].len
> 48) {
236 buf
[0] = CMD_I2C_WRITE
;
237 buf
[1] = (msg
[i
].addr
<< 1);
240 memcpy(&buf
[4], msg
[i
].buf
, msg
[i
].len
);
241 ret
= anysee_ctrl_msg(d
, buf
, 4 + msg
[i
].len
, NULL
, 0);
250 mutex_unlock(&d
->i2c_mutex
);
252 return ret
? ret
: i
;
255 static u32
anysee_i2c_func(struct i2c_adapter
*adapter
)
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
));
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
));
286 /* Callbacks for DVB USB */
287 static struct tda10023_config anysee_tda10023_config
= {
288 .demod_address
= (0x1a >> 1),
294 .output_mode
= TDA10023_OUTPUT_MODE_PARALLEL_C
,
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),
308 static struct zl10353_config anysee_zl10353_tda18212_config2
= {
309 .demod_address
= (0x1e >> 1),
311 .disable_i2c_gate_ctrl
= 1,
316 static struct zl10353_config anysee_zl10353_tda18212_config
= {
317 .demod_address
= (0x18 >> 1),
319 .disable_i2c_gate_ctrl
= 1,
324 static struct tda10023_config anysee_tda10023_tda18212_config
= {
325 .demod_address
= (0x1a >> 1),
330 .output_mode
= TDA10023_OUTPUT_MODE_PARALLEL_B
,
334 static struct tda18212_config anysee_tda18212_config
= {
341 static struct tda18212_config anysee_tda18212_config2
= {
351 static struct cx24116_config anysee_cx24116_config
= {
352 .demod_address
= (0xaa >> 1),
353 .mpg_clk_pos_pol
= 0x00,
357 static struct stv0900_config anysee_stv0900_config
= {
358 .demod_address
= (0xd0 >> 1),
364 .tun1_adc
= 1, /* 1 Vpp */
368 static struct stv6110_config anysee_stv6110_config
= {
369 .i2c_address
= (0xc0 >> 1),
374 static struct isl6423_config anysee_isl6423_config
= {
375 .current_max
= SEC_CURRENT_800m
,
376 .curlim
= SEC_CURRENT_LIM_OFF
,
381 static struct cxd2820r_config anysee_cxd2820r_config
= {
382 .i2c_address
= 0x6d, /* (0xda >> 1) */
387 * New USB device strings: Mfr=1, Product=2, SerialNumber=0
388 * Manufacturer: AMT.CO.KR
390 * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
392 * parts: DNOS404ZH102A(MT352, DTT7579(?))
394 * E30 VID=04b4 PID=861f HW=2 FW=2.1 "anysee-T(LP)"
395 * PCB: PCB 507T (rev1.61)
396 * parts: DNOS404ZH103A(ZL10353, DTT7579(?))
397 * OEA=0a OEB=00 OEC=00 OED=ff OEE=00
398 * IOA=45 IOB=ff IOC=00 IOD=ff IOE=00
400 * E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee"
401 * PCB: 507CD (rev1.1)
402 * parts: DNOS404ZH103A(ZL10353, DTT7579(?)), CST56I01
403 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
404 * IOA=4f IOB=ff IOC=00 IOD=06 IOE=01
405 * IOD[0] ZL10353 1=enabled
406 * IOA[7] TS 0=enabled
407 * tuner is not behind ZL10353 I2C-gate (no care if gate disabled or not)
409 * E30 C Plus VID=04b4 PID=861f HW=10 FW=1.0 "anysee-DC(LP)"
410 * PCB: 507DC (rev0.2)
411 * parts: TDA10023, DTOS403IH102B TM, CST56I01
412 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
413 * IOA=4f IOB=ff IOC=00 IOD=26 IOE=01
414 * IOD[0] TDA10023 1=enabled
416 * E30 S2 Plus VID=04b4 PID=861f HW=11 FW=0.1 "anysee-S2(LP)"
417 * PCB: 507SI (rev2.1)
418 * parts: BS2N10WCC01(CX24116, CX24118), ISL6423, TDA8024
419 * OEA=80 OEB=00 OEC=ff OED=ff OEE=fe
420 * IOA=4d IOB=ff IOC=00 IOD=26 IOE=01
421 * IOD[0] CX24116 1=enabled
423 * E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
424 * PCB: 507FA (rev0.4)
425 * parts: TDA10023, DTOS403IH102B TM, TDA8024
426 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
427 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
428 * IOD[5] TDA10023 1=enabled
429 * IOE[0] tuner 1=enabled
431 * E30 Combo Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
432 * PCB: 507FA (rev1.1)
433 * parts: ZL10353, TDA10023, DTOS403IH102B TM, TDA8024
434 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
435 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
437 * IOD[5] TDA10023 1=enabled
438 * IOE[0] tuner 1=enabled
440 * IOD[0] ZL10353 1=enabled
441 * IOE[0] tuner 0=enabled
442 * tuner is behind ZL10353 I2C-gate
443 * tuner is behind TDA10023 I2C-gate
445 * E7 TC VID=1c73 PID=861f HW=18 FW=0.7 AMTCI=0.5 "anysee-E7TC(LP)"
446 * PCB: 508TC (rev0.6)
447 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
448 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
449 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
450 * IOA[7] TS 1=enabled
451 * IOE[4] TDA18212 1=enabled
453 * IOD[6] ZL10353 0=disabled
454 * IOD[5] TDA10023 1=enabled
455 * IOE[0] IF 1=enabled
457 * IOD[5] TDA10023 0=disabled
458 * IOD[6] ZL10353 1=enabled
459 * IOE[0] IF 0=enabled
461 * E7 S2 VID=1c73 PID=861f HW=19 FW=0.4 AMTCI=0.5 "anysee-E7S2(LP)"
462 * PCB: 508S2 (rev0.7)
463 * parts: DNBU10512IST(STV0903, STV6110), ISL6423
464 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
465 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
466 * IOA[7] TS 1=enabled
467 * IOE[5] STV0903 1=enabled
469 * E7 T2C VID=1c73 PID=861f HW=20 FW=0.1 AMTCI=0.5 "anysee-E7T2C(LP)"
470 * PCB: 508T2C (rev0.3)
471 * parts: DNOQ44QCH106A(CXD2820R, TDA18212), TDA8024
472 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
473 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
474 * IOA[7] TS 1=enabled
475 * IOE[5] CXD2820R 1=enabled
477 * E7 PTC VID=1c73 PID=861f HW=21 FW=0.1 AMTCI=?? "anysee-E7PTC(LP)"
478 * PCB: 508PTC (rev0.5)
479 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
480 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
481 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
482 * IOA[7] TS 1=enabled
483 * IOE[4] TDA18212 1=enabled
485 * IOD[6] ZL10353 0=disabled
486 * IOD[5] TDA10023 1=enabled
487 * IOE[0] IF 1=enabled
489 * IOD[5] TDA10023 0=disabled
490 * IOD[6] ZL10353 1=enabled
491 * IOE[0] IF 0=enabled
493 * E7 PS2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
494 * PCB: 508PS2 (rev0.4)
495 * parts: DNBU10512IST(STV0903, STV6110), ISL6423
496 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
497 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
498 * IOA[7] TS 1=enabled
499 * IOE[5] STV0903 1=enabled
502 static int anysee_read_config(struct dvb_usb_device
*d
)
504 struct anysee_state
*state
= d_to_priv(d
);
509 * Check which hardware we have.
510 * We must do this call two times to get reliable values (hw/fw bug).
512 ret
= anysee_get_hw_info(d
, hw_info
);
516 ret
= anysee_get_hw_info(d
, hw_info
);
521 * Meaning of these info bytes are guessed.
523 dev_info(&d
->udev
->dev
, "%s: firmware version %d.%d hardware id %d\n",
524 KBUILD_MODNAME
, hw_info
[1], hw_info
[2], hw_info
[0]);
526 state
->hw
= hw_info
[0];
531 /* external I2C gate used for DNOD44CDH086A(TDA18212) tuner module */
532 static int anysee_i2c_gate_ctrl(struct dvb_frontend
*fe
, int enable
)
534 /* enable / disable tuner access on IOE[4] */
535 return anysee_wr_reg_mask(fe_to_d(fe
), REG_IOE
, (enable
<< 4), 0x10);
538 static int anysee_frontend_ctrl(struct dvb_frontend
*fe
, int onoff
)
540 struct anysee_state
*state
= fe_to_priv(fe
);
541 struct dvb_usb_device
*d
= fe_to_d(fe
);
543 dev_dbg(&d
->udev
->dev
, "%s: fe=%d onoff=%d\n", __func__
, fe
->id
, onoff
);
545 /* no frontend sleep control */
550 case ANYSEE_HW_507FA
: /* 15 */
555 /* disable DVB-T demod on IOD[0] */
556 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 0), 0x01);
560 /* enable DVB-C demod on IOD[5] */
561 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 5), 0x20);
565 /* enable DVB-C tuner on IOE[0] */
566 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (1 << 0), 0x01);
570 /* disable DVB-C demod on IOD[5] */
571 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 5), 0x20);
575 /* enable DVB-T demod on IOD[0] */
576 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 0), 0x01);
580 /* enable DVB-T tuner on IOE[0] */
581 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (0 << 0), 0x01);
587 case ANYSEE_HW_508TC
: /* 18 */
588 case ANYSEE_HW_508PTC
: /* 21 */
593 /* disable DVB-T demod on IOD[6] */
594 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 6), 0x40);
598 /* enable DVB-C demod on IOD[5] */
599 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 5), 0x20);
603 /* enable IF route on IOE[0] */
604 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (1 << 0), 0x01);
608 /* disable DVB-C demod on IOD[5] */
609 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 5), 0x20);
613 /* enable DVB-T demod on IOD[6] */
614 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 6), 0x40);
618 /* enable IF route on IOE[0] */
619 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (0 << 0), 0x01);
633 static int anysee_add_i2c_dev(struct dvb_usb_device
*d
, const char *type
,
634 u8 addr
, void *platform_data
)
637 struct anysee_state
*state
= d_to_priv(d
);
638 struct i2c_client
*client
;
639 struct i2c_adapter
*adapter
= &d
->i2c_adap
;
640 struct i2c_board_info board_info
= {
642 .platform_data
= platform_data
,
645 strlcpy(board_info
.type
, type
, I2C_NAME_SIZE
);
647 /* find first free client */
648 for (num
= 0; num
< ANYSEE_I2C_CLIENT_MAX
; num
++) {
649 if (state
->i2c_client
[num
] == NULL
)
653 dev_dbg(&d
->udev
->dev
, "%s: num=%d\n", __func__
, num
);
655 if (num
== ANYSEE_I2C_CLIENT_MAX
) {
656 dev_err(&d
->udev
->dev
, "%s: I2C client out of index\n",
662 request_module("%s", board_info
.type
);
664 /* register I2C device */
665 client
= i2c_new_device(adapter
, &board_info
);
666 if (client
== NULL
|| client
->dev
.driver
== NULL
) {
671 /* increase I2C driver usage count */
672 if (!try_module_get(client
->dev
.driver
->owner
)) {
673 i2c_unregister_device(client
);
678 state
->i2c_client
[num
] = client
;
681 dev_dbg(&d
->udev
->dev
, "%s: failed=%d\n", __func__
, ret
);
685 static void anysee_del_i2c_dev(struct dvb_usb_device
*d
)
688 struct anysee_state
*state
= d_to_priv(d
);
689 struct i2c_client
*client
;
691 /* find last used client */
692 num
= ANYSEE_I2C_CLIENT_MAX
;
694 if (state
->i2c_client
[num
] != NULL
)
698 dev_dbg(&d
->udev
->dev
, "%s: num=%d\n", __func__
, num
);
701 dev_err(&d
->udev
->dev
, "%s: I2C client out of index\n",
706 client
= state
->i2c_client
[num
];
708 /* decrease I2C driver usage count */
709 module_put(client
->dev
.driver
->owner
);
711 /* unregister I2C device */
712 i2c_unregister_device(client
);
714 state
->i2c_client
[num
] = NULL
;
716 dev_dbg(&d
->udev
->dev
, "%s: failed\n", __func__
);
719 static int anysee_frontend_attach(struct dvb_usb_adapter
*adap
)
721 struct anysee_state
*state
= adap_to_priv(adap
);
722 struct dvb_usb_device
*d
= adap_to_d(adap
);
725 struct i2c_msg msg
[2] = {
740 case ANYSEE_HW_507T
: /* 2 */
744 adap
->fe
[0] = dvb_attach(mt352_attach
, &anysee_mt352_config
,
750 adap
->fe
[0] = dvb_attach(zl10353_attach
, &anysee_zl10353_config
,
754 case ANYSEE_HW_507CD
: /* 6 */
757 /* enable DVB-T demod on IOD[0] */
758 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 0), 0x01);
762 /* enable transport stream on IOA[7] */
763 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (0 << 7), 0x80);
768 adap
->fe
[0] = dvb_attach(zl10353_attach
, &anysee_zl10353_config
,
772 case ANYSEE_HW_507DC
: /* 10 */
775 /* enable DVB-C demod on IOD[0] */
776 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 0), 0x01);
781 adap
->fe
[0] = dvb_attach(tda10023_attach
,
782 &anysee_tda10023_config
, &d
->i2c_adap
, 0x48);
785 case ANYSEE_HW_507SI
: /* 11 */
788 /* enable DVB-S/S2 demod on IOD[0] */
789 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 0), 0x01);
794 adap
->fe
[0] = dvb_attach(cx24116_attach
, &anysee_cx24116_config
,
798 case ANYSEE_HW_507FA
: /* 15 */
802 /* enable tuner on IOE[4] */
803 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (1 << 4), 0x10);
809 ret
= i2c_transfer(&d
->i2c_adap
, msg
, 2);
810 if (ret
== 2 && tmp
== 0xc7) {
811 dev_dbg(&d
->udev
->dev
, "%s: TDA18212 found\n",
813 state
->has_tda18212
= true;
818 /* disable tuner on IOE[4] */
819 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (0 << 4), 0x10);
823 /* disable DVB-T demod on IOD[0] */
824 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 0), 0x01);
828 /* enable DVB-C demod on IOD[5] */
829 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 5), 0x20);
835 /* TDA18212 config */
836 adap
->fe
[0] = dvb_attach(tda10023_attach
,
837 &anysee_tda10023_tda18212_config
,
840 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
842 adap
->fe
[0]->ops
.i2c_gate_ctrl
=
843 anysee_i2c_gate_ctrl
;
846 adap
->fe
[0] = dvb_attach(tda10023_attach
,
847 &anysee_tda10023_config
,
851 /* break out if first frontend attaching fails */
855 /* disable DVB-C demod on IOD[5] */
856 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 5), 0x20);
860 /* enable DVB-T demod on IOD[0] */
861 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 0), 0x01);
867 /* TDA18212 config */
868 adap
->fe
[1] = dvb_attach(zl10353_attach
,
869 &anysee_zl10353_tda18212_config2
,
872 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
874 adap
->fe
[1]->ops
.i2c_gate_ctrl
=
875 anysee_i2c_gate_ctrl
;
878 adap
->fe
[1] = dvb_attach(zl10353_attach
,
879 &anysee_zl10353_config
,
884 case ANYSEE_HW_508TC
: /* 18 */
885 case ANYSEE_HW_508PTC
: /* 21 */
889 /* disable DVB-T demod on IOD[6] */
890 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 6), 0x40);
894 /* enable DVB-C demod on IOD[5] */
895 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 5), 0x20);
900 adap
->fe
[0] = dvb_attach(tda10023_attach
,
901 &anysee_tda10023_tda18212_config
,
904 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
906 adap
->fe
[0]->ops
.i2c_gate_ctrl
= anysee_i2c_gate_ctrl
;
908 /* break out if first frontend attaching fails */
912 /* disable DVB-C demod on IOD[5] */
913 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 5), 0x20);
917 /* enable DVB-T demod on IOD[6] */
918 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 6), 0x40);
923 adap
->fe
[1] = dvb_attach(zl10353_attach
,
924 &anysee_zl10353_tda18212_config
,
927 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
929 adap
->fe
[1]->ops
.i2c_gate_ctrl
= anysee_i2c_gate_ctrl
;
931 state
->has_ci
= true;
934 case ANYSEE_HW_508S2
: /* 19 */
935 case ANYSEE_HW_508PS2
: /* 22 */
939 /* enable DVB-S/S2 demod on IOE[5] */
940 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (1 << 5), 0x20);
945 adap
->fe
[0] = dvb_attach(stv0900_attach
,
946 &anysee_stv0900_config
, &d
->i2c_adap
, 0);
948 state
->has_ci
= true;
951 case ANYSEE_HW_508T2C
: /* 20 */
954 /* enable DVB-T/T2/C demod on IOE[5] */
955 ret
= anysee_wr_reg_mask(d
, REG_IOE
, (1 << 5), 0x20);
960 adap
->fe
[0] = dvb_attach(cxd2820r_attach
,
961 &anysee_cxd2820r_config
, &d
->i2c_adap
, NULL
);
963 state
->has_ci
= true;
969 /* we have no frontend :-( */
971 dev_err(&d
->udev
->dev
,
972 "%s: Unsupported Anysee version. Please report to <linux-media@vger.kernel.org>.\n",
979 static int anysee_tuner_attach(struct dvb_usb_adapter
*adap
)
981 struct anysee_state
*state
= adap_to_priv(adap
);
982 struct dvb_usb_device
*d
= adap_to_d(adap
);
983 struct dvb_frontend
*fe
;
985 dev_dbg(&d
->udev
->dev
, "%s:\n", __func__
);
988 case ANYSEE_HW_507T
: /* 2 */
992 fe
= dvb_attach(dvb_pll_attach
, adap
->fe
[0], (0xc2 >> 1), NULL
,
993 DVB_PLL_THOMSON_DTT7579
);
996 case ANYSEE_HW_507CD
: /* 6 */
1000 fe
= dvb_attach(dvb_pll_attach
, adap
->fe
[0], (0xc2 >> 1),
1001 &d
->i2c_adap
, DVB_PLL_THOMSON_DTT7579
);
1004 case ANYSEE_HW_507DC
: /* 10 */
1008 fe
= dvb_attach(dvb_pll_attach
, adap
->fe
[0], (0xc0 >> 1),
1009 &d
->i2c_adap
, DVB_PLL_SAMSUNG_DTOS403IH102A
);
1012 case ANYSEE_HW_507SI
: /* 11 */
1015 /* attach LNB controller */
1016 fe
= dvb_attach(isl6423_attach
, adap
->fe
[0], &d
->i2c_adap
,
1017 &anysee_isl6423_config
);
1020 case ANYSEE_HW_507FA
: /* 15 */
1021 /* E30 Combo Plus */
1024 /* Try first attach TDA18212 silicon tuner on IOE[4], if that
1025 * fails attach old simple PLL. */
1028 if (state
->has_tda18212
) {
1029 struct tda18212_config tda18212_config
=
1030 anysee_tda18212_config
;
1032 tda18212_config
.fe
= adap
->fe
[0];
1033 ret
= anysee_add_i2c_dev(d
, "tda18212", 0x60,
1038 /* copy tuner ops for 2nd FE as tuner is shared */
1040 adap
->fe
[1]->tuner_priv
=
1041 adap
->fe
[0]->tuner_priv
;
1042 memcpy(&adap
->fe
[1]->ops
.tuner_ops
,
1043 &adap
->fe
[0]->ops
.tuner_ops
,
1044 sizeof(struct dvb_tuner_ops
));
1050 fe
= dvb_attach(dvb_pll_attach
, adap
->fe
[0],
1051 (0xc0 >> 1), &d
->i2c_adap
,
1052 DVB_PLL_SAMSUNG_DTOS403IH102A
);
1054 if (fe
&& adap
->fe
[1]) {
1055 /* attach tuner for 2nd FE */
1056 fe
= dvb_attach(dvb_pll_attach
, adap
->fe
[1],
1057 (0xc0 >> 1), &d
->i2c_adap
,
1058 DVB_PLL_SAMSUNG_DTOS403IH102A
);
1063 case ANYSEE_HW_508TC
: /* 18 */
1064 case ANYSEE_HW_508PTC
: /* 21 */
1068 struct tda18212_config tda18212_config
= anysee_tda18212_config
;
1070 tda18212_config
.fe
= adap
->fe
[0];
1071 ret
= anysee_add_i2c_dev(d
, "tda18212", 0x60, &tda18212_config
);
1075 /* copy tuner ops for 2nd FE as tuner is shared */
1077 adap
->fe
[1]->tuner_priv
= adap
->fe
[0]->tuner_priv
;
1078 memcpy(&adap
->fe
[1]->ops
.tuner_ops
,
1079 &adap
->fe
[0]->ops
.tuner_ops
,
1080 sizeof(struct dvb_tuner_ops
));
1085 case ANYSEE_HW_508S2
: /* 19 */
1086 case ANYSEE_HW_508PS2
: /* 22 */
1091 fe
= dvb_attach(stv6110_attach
, adap
->fe
[0],
1092 &anysee_stv6110_config
, &d
->i2c_adap
);
1095 /* attach LNB controller */
1096 fe
= dvb_attach(isl6423_attach
, adap
->fe
[0],
1097 &d
->i2c_adap
, &anysee_isl6423_config
);
1102 case ANYSEE_HW_508T2C
: /* 20 */
1105 struct tda18212_config tda18212_config
=
1106 anysee_tda18212_config2
;
1108 tda18212_config
.fe
= adap
->fe
[0];
1109 ret
= anysee_add_i2c_dev(d
, "tda18212", 0x60, &tda18212_config
);
1127 #if IS_ENABLED(CONFIG_RC_CORE)
1128 static int anysee_rc_query(struct dvb_usb_device
*d
)
1130 u8 buf
[] = {CMD_GET_IR_CODE
};
1134 /* Remote controller is basic NEC using address byte 0x08.
1135 Anysee device RC query returns only two bytes, status and code,
1136 address byte is dropped. Also it does not return any value for
1137 NEC RCs having address byte other than 0x08. Due to that, we
1138 cannot use that device as standard NEC receiver.
1139 It could be possible make hack which reads whole code directly
1140 from device memory... */
1142 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), ircode
, sizeof(ircode
));
1147 dev_dbg(&d
->udev
->dev
, "%s: key pressed %02x\n", __func__
,
1149 rc_keydown(d
->rc_dev
, RC_TYPE_NEC
,
1150 RC_SCANCODE_NEC(0x08, ircode
[1]), 0);
1156 static int anysee_get_rc_config(struct dvb_usb_device
*d
, struct dvb_usb_rc
*rc
)
1158 rc
->allowed_protos
= RC_BIT_NEC
;
1159 rc
->query
= anysee_rc_query
;
1160 rc
->interval
= 250; /* windows driver uses 500ms */
1165 #define anysee_get_rc_config NULL
1168 static int anysee_ci_read_attribute_mem(struct dvb_ca_en50221
*ci
, int slot
,
1171 struct dvb_usb_device
*d
= ci
->data
;
1173 u8 buf
[] = {CMD_CI
, 0x02, 0x40 | addr
>> 8, addr
& 0xff, 0x00, 1};
1176 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), &val
, 1);
1183 static int anysee_ci_write_attribute_mem(struct dvb_ca_en50221
*ci
, int slot
,
1186 struct dvb_usb_device
*d
= ci
->data
;
1188 u8 buf
[] = {CMD_CI
, 0x03, 0x40 | addr
>> 8, addr
& 0xff, 0x00, 1, val
};
1190 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), NULL
, 0);
1197 static int anysee_ci_read_cam_control(struct dvb_ca_en50221
*ci
, int slot
,
1200 struct dvb_usb_device
*d
= ci
->data
;
1202 u8 buf
[] = {CMD_CI
, 0x04, 0x40, addr
, 0x00, 1};
1205 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), &val
, 1);
1212 static int anysee_ci_write_cam_control(struct dvb_ca_en50221
*ci
, int slot
,
1215 struct dvb_usb_device
*d
= ci
->data
;
1217 u8 buf
[] = {CMD_CI
, 0x05, 0x40, addr
, 0x00, 1, val
};
1219 ret
= anysee_ctrl_msg(d
, buf
, sizeof(buf
), NULL
, 0);
1226 static int anysee_ci_slot_reset(struct dvb_ca_en50221
*ci
, int slot
)
1228 struct dvb_usb_device
*d
= ci
->data
;
1230 struct anysee_state
*state
= d_to_priv(d
);
1232 state
->ci_cam_ready
= jiffies
+ msecs_to_jiffies(1000);
1234 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (0 << 7), 0x80);
1240 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (1 << 7), 0x80);
1247 static int anysee_ci_slot_shutdown(struct dvb_ca_en50221
*ci
, int slot
)
1249 struct dvb_usb_device
*d
= ci
->data
;
1252 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (0 << 7), 0x80);
1258 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (1 << 7), 0x80);
1265 static int anysee_ci_slot_ts_enable(struct dvb_ca_en50221
*ci
, int slot
)
1267 struct dvb_usb_device
*d
= ci
->data
;
1270 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 1), 0x02);
1277 static int anysee_ci_poll_slot_status(struct dvb_ca_en50221
*ci
, int slot
,
1280 struct dvb_usb_device
*d
= ci
->data
;
1281 struct anysee_state
*state
= d_to_priv(d
);
1285 ret
= anysee_rd_reg_mask(d
, REG_IOC
, &tmp
, 0x40);
1290 ret
= DVB_CA_EN50221_POLL_CAM_PRESENT
;
1291 if (time_after(jiffies
, state
->ci_cam_ready
))
1292 ret
|= DVB_CA_EN50221_POLL_CAM_READY
;
1298 static int anysee_ci_init(struct dvb_usb_device
*d
)
1300 struct anysee_state
*state
= d_to_priv(d
);
1303 state
->ci
.owner
= THIS_MODULE
;
1304 state
->ci
.read_attribute_mem
= anysee_ci_read_attribute_mem
;
1305 state
->ci
.write_attribute_mem
= anysee_ci_write_attribute_mem
;
1306 state
->ci
.read_cam_control
= anysee_ci_read_cam_control
;
1307 state
->ci
.write_cam_control
= anysee_ci_write_cam_control
;
1308 state
->ci
.slot_reset
= anysee_ci_slot_reset
;
1309 state
->ci
.slot_shutdown
= anysee_ci_slot_shutdown
;
1310 state
->ci
.slot_ts_enable
= anysee_ci_slot_ts_enable
;
1311 state
->ci
.poll_slot_status
= anysee_ci_poll_slot_status
;
1314 ret
= anysee_wr_reg_mask(d
, REG_IOA
, (1 << 7), 0x80);
1318 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (0 << 2)|(0 << 1)|(0 << 0), 0x07);
1322 ret
= anysee_wr_reg_mask(d
, REG_IOD
, (1 << 2)|(1 << 1)|(1 << 0), 0x07);
1326 ret
= dvb_ca_en50221_init(&d
->adapter
[0].dvb_adap
, &state
->ci
, 0, 1);
1330 state
->ci_attached
= true;
1335 static void anysee_ci_release(struct dvb_usb_device
*d
)
1337 struct anysee_state
*state
= d_to_priv(d
);
1340 if (state
->ci_attached
)
1341 dvb_ca_en50221_release(&state
->ci
);
1346 static int anysee_init(struct dvb_usb_device
*d
)
1348 struct anysee_state
*state
= d_to_priv(d
);
1351 /* There is one interface with two alternate settings.
1352 Alternate setting 0 is for bulk transfer.
1353 Alternate setting 1 is for isochronous transfer.
1354 We use bulk transfer (alternate setting 0). */
1355 ret
= usb_set_interface(d
->udev
, 0, 0);
1360 ret
= anysee_led_ctrl(d
, 0x01, 0x03);
1365 ret
= anysee_ir_ctrl(d
, 1);
1370 if (state
->has_ci
) {
1371 ret
= anysee_ci_init(d
);
1379 static void anysee_exit(struct dvb_usb_device
*d
)
1381 struct anysee_state
*state
= d_to_priv(d
);
1383 if (state
->i2c_client
[0])
1384 anysee_del_i2c_dev(d
);
1386 return anysee_ci_release(d
);
1389 /* DVB USB Driver stuff */
1390 static struct dvb_usb_device_properties anysee_props
= {
1391 .driver_name
= KBUILD_MODNAME
,
1392 .owner
= THIS_MODULE
,
1393 .adapter_nr
= adapter_nr
,
1394 .size_of_priv
= sizeof(struct anysee_state
),
1396 .generic_bulk_ctrl_endpoint
= 0x01,
1397 .generic_bulk_ctrl_endpoint_response
= 0x81,
1399 .i2c_algo
= &anysee_i2c_algo
,
1400 .read_config
= anysee_read_config
,
1401 .frontend_attach
= anysee_frontend_attach
,
1402 .tuner_attach
= anysee_tuner_attach
,
1403 .init
= anysee_init
,
1404 .get_rc_config
= anysee_get_rc_config
,
1405 .frontend_ctrl
= anysee_frontend_ctrl
,
1406 .streaming_ctrl
= anysee_streaming_ctrl
,
1407 .exit
= anysee_exit
,
1412 .stream
= DVB_USB_STREAM_BULK(0x82, 8, 16 * 512),
1417 static const struct usb_device_id anysee_id_table
[] = {
1418 { DVB_USB_DEVICE(USB_VID_CYPRESS
, USB_PID_ANYSEE
,
1419 &anysee_props
, "Anysee", RC_MAP_ANYSEE
) },
1420 { DVB_USB_DEVICE(USB_VID_AMT
, USB_PID_ANYSEE
,
1421 &anysee_props
, "Anysee", RC_MAP_ANYSEE
) },
1424 MODULE_DEVICE_TABLE(usb
, anysee_id_table
);
1426 static struct usb_driver anysee_usb_driver
= {
1427 .name
= KBUILD_MODNAME
,
1428 .id_table
= anysee_id_table
,
1429 .probe
= dvb_usbv2_probe
,
1430 .disconnect
= dvb_usbv2_disconnect
,
1431 .suspend
= dvb_usbv2_suspend
,
1432 .resume
= dvb_usbv2_resume
,
1433 .reset_resume
= dvb_usbv2_reset_resume
,
1438 module_usb_driver(anysee_usb_driver
);
1440 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1441 MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
1442 MODULE_LICENSE("GPL");