Merge branch 'for-linus' of git://git.kernel.dk/linux-block
[deliverable/linux.git] / drivers / media / dvb / dvb-usb / anysee.c
CommitLineData
a51e34dd
AP
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
9fdd9caf
AP
26 * for ISO 7816 card reader, like dvb_ca_en50221 is implemented. This
27 * module registers serial interface that can be used to communicate
a51e34dd
AP
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"
72ffd2b8 39#include "tda18212.h"
f0a53105 40#include "cx24116.h"
bedbf3d1
AP
41#include "stv0900.h"
42#include "stv6110.h"
f0a53105 43#include "isl6423.h"
608add85 44#include "cxd2820r.h"
a51e34dd
AP
45
46/* debug */
47static int dvb_usb_anysee_debug;
48module_param_named(debug, dvb_usb_anysee_debug, int, 0644);
49MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
ffbc5f88 50static int dvb_usb_anysee_delsys;
0f77c3a4
AP
51module_param_named(delsys, dvb_usb_anysee_delsys, int, 0644);
52MODULE_PARM_DESC(delsys, "select delivery mode (0=DVB-C, 1=DVB-T)");
a51e34dd
AP
53DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
54
dec0c46a 55static DEFINE_MUTEX(anysee_usb_mutex);
a51e34dd
AP
56
57static 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
a51e34dd
AP
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
4048da2f
AP
70 deb_xfer(">>> ");
71 debug_dump(buf, slen, deb_xfer);
72
a51e34dd
AP
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);
a51e34dd
AP
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("<<< ");
4048da2f
AP
85 debug_dump(buf, rlen, deb_xfer);
86
87 if (buf[63] != 0x4f)
88 deb_info("%s: cmd failed\n", __func__);
a51e34dd
AP
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
101static 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
110static 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
41f81f68
AP
117/* write single register with mask */
118static 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
05cd37de
AP
138/* read single register with mask */
139static 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
a51e34dd
AP
161static 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
167static 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
174static 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
181static 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
a51e34dd
AP
188/* I2C */
189static 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);
902571aa 193 int ret = 0, inc, i = 0;
21d2e938 194 u8 buf[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */
a51e34dd
AP
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)) {
21d2e938
AP
201 if (msg[i].len > 2 || msg[i+1].len > 60) {
202 ret = -EOPNOTSUPP;
203 break;
204 }
a51e34dd 205 buf[0] = CMD_I2C_READ;
7ea03d21 206 buf[1] = (msg[i].addr << 1) | 0x01;
a51e34dd 207 buf[2] = msg[i].buf[0];
882b82ca
AP
208 buf[3] = msg[i].buf[1];
209 buf[4] = msg[i].len-1;
b3e6a5af 210 buf[5] = msg[i+1].len;
21d2e938 211 ret = anysee_ctrl_msg(d, buf, 6, msg[i+1].buf,
a51e34dd
AP
212 msg[i+1].len);
213 inc = 2;
214 } else {
21d2e938
AP
215 if (msg[i].len > 48) {
216 ret = -EOPNOTSUPP;
217 break;
218 }
a51e34dd 219 buf[0] = CMD_I2C_WRITE;
7ea03d21 220 buf[1] = (msg[i].addr << 1);
a51e34dd
AP
221 buf[2] = msg[i].len;
222 buf[3] = 0x01;
223 memcpy(&buf[4], msg[i].buf, msg[i].len);
21d2e938 224 ret = anysee_ctrl_msg(d, buf, 4 + msg[i].len, NULL, 0);
a51e34dd
AP
225 inc = 1;
226 }
227 if (ret)
e613f8fa 228 break;
a51e34dd
AP
229
230 i += inc;
231 }
232
233 mutex_unlock(&d->i2c_mutex);
234
e613f8fa 235 return ret ? ret : i;
a51e34dd
AP
236}
237
238static u32 anysee_i2c_func(struct i2c_adapter *adapter)
239{
240 return I2C_FUNC_I2C;
241}
242
243static struct i2c_algorithm anysee_i2c_algo = {
244 .master_xfer = anysee_master_xfer,
245 .functionality = anysee_i2c_func,
246};
247
248static int anysee_mt352_demod_init(struct dvb_frontend *fe)
249{
ae3745f6
AP
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 };
a51e34dd
AP
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 */
270static struct tda10023_config anysee_tda10023_config = {
7ea03d21 271 .demod_address = (0x1a >> 1),
a51e34dd
AP
272 .invert = 0,
273 .xtal = 16000000,
274 .pll_m = 11,
275 .pll_p = 3,
276 .pll_n = 1,
5ae2fcae
AP
277 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
278 .deltaf = 0xfeeb,
a51e34dd
AP
279};
280
281static struct mt352_config anysee_mt352_config = {
7ea03d21 282 .demod_address = (0x1e >> 1),
a51e34dd
AP
283 .demod_init = anysee_mt352_demod_init,
284};
285
286static struct zl10353_config anysee_zl10353_config = {
7ea03d21 287 .demod_address = (0x1e >> 1),
a51e34dd
AP
288 .parallel_ts = 1,
289};
290
1fd80701
AP
291static 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
72ffd2b8
AP
299static 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
307static 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,
05cd37de 313 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_B,
72ffd2b8
AP
314 .deltaf = 0xba02,
315};
316
317static 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
608add85
AP
325static 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
f0a53105
AP
336static struct cx24116_config anysee_cx24116_config = {
337 .demod_address = (0xaa >> 1),
338 .mpg_clk_pos_pol = 0x00,
339 .i2c_wr_max = 48,
340};
341
bedbf3d1
AP
342static 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
353static struct stv6110_config anysee_stv6110_config = {
354 .i2c_address = (0xc0 >> 1),
355 .mclk = 16000000,
356 .clk_div = 1,
357};
358
f0a53105
AP
359static 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
608add85
AP
366static struct cxd2820r_config anysee_cxd2820r_config = {
367 .i2c_address = 0x6d, /* (0xda >> 1) */
368 .ts_mode = 0x38,
608add85
AP
369};
370
41f81f68
AP
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: ?
70fc26fb 377 * parts: DNOS404ZH102A(MT352, DTT7579(?))
41f81f68 378 *
05c46c05
AP
379 * E30 VID=04b4 PID=861f HW=2 FW=2.1 "anysee-T(LP)"
380 * PCB: PCB 507T (rev1.61)
70fc26fb 381 * parts: DNOS404ZH103A(ZL10353, DTT7579(?))
05c46c05
AP
382 * OEA=0a OEB=00 OEC=00 OED=ff OEE=00
383 * IOA=45 IOB=ff IOC=00 IOD=ff IOE=00
41f81f68
AP
384 *
385 * E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee"
386 * PCB: 507CD (rev1.1)
70fc26fb 387 * parts: DNOS404ZH103A(ZL10353, DTT7579(?)), CST56I01
05c46c05
AP
388 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
389 * IOA=4f IOB=ff IOC=00 IOD=06 IOE=01
41f81f68
AP
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)
70fc26fb 396 * parts: TDA10023, DTOS403IH102B TM, CST56I01
05c46c05
AP
397 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
398 * IOA=4f IOB=ff IOC=00 IOD=26 IOE=01
41f81f68
AP
399 * IOD[0] TDA10023 1=enabled
400 *
f0a53105
AP
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
05c46c05
AP
404 * OEA=80 OEB=00 OEC=ff OED=ff OEE=fe
405 * IOA=4d IOB=ff IOC=00 IOD=26 IOE=01
f0a53105
AP
406 * IOD[0] CX24116 1=enabled
407 *
41f81f68
AP
408 * E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
409 * PCB: 507FA (rev0.4)
70fc26fb 410 * parts: TDA10023, DTOS403IH102B TM, TDA8024
05c46c05
AP
411 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
412 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
41f81f68
AP
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)
70fc26fb 418 * parts: ZL10353, TDA10023, DTOS403IH102B TM, TDA8024
05c46c05
AP
419 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
420 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
41f81f68
AP
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
70fc26fb
AP
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)
05c46c05
AP
432 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
433 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
70fc26fb
AP
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
bedbf3d1
AP
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
05c46c05
AP
448 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
449 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
bedbf3d1
AP
450 * IOA[7] TS 1=enabled
451 * IOE[5] STV0903 1=enabled
452 *
608add85
AP
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 *
8439e0df
AP
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
fea3c39a 476 *
608add85 477 * E7 PS2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
fea3c39a
AP
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
41f81f68
AP
484 */
485
be94351e
AP
486
487/* external I2C gate used for DNOD44CDH086A(TDA18212) tuner module */
488static 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
449d1a0a
AP
496static 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
600error:
601 return ret;
602}
603
a51e34dd
AP
604static 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];
72ffd2b8
AP
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 };
a51e34dd 623
449d1a0a 624 /* detect hardware only once */
77eed219 625 if (adap->fe_adap[0].fe == NULL) {
449d1a0a 626 /* Check which hardware we have.
8f4ffb1d
AP
627 * We must do this call two times to get reliable values
628 * (hw/fw bug).
449d1a0a
AP
629 */
630 ret = anysee_get_hw_info(adap->dev, hw_info);
631 if (ret)
632 goto error;
41f81f68 633
449d1a0a
AP
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]);
a51e34dd 641
449d1a0a
AP
642 state->hw = hw_info[0];
643 }
a51e34dd 644
449d1a0a 645 /* set current frondend ID for devices having two frondends */
77eed219 646 if (adap->fe_adap[0].fe)
449d1a0a 647 state->fe_id++;
a51e34dd 648
41f81f68 649 switch (state->hw) {
05c46c05 650 case ANYSEE_HW_507T: /* 2 */
41f81f68 651 /* E30 */
a51e34dd 652
449d1a0a
AP
653 if (state->fe_id)
654 break;
655
41f81f68 656 /* attach demod */
8f4ffb1d
AP
657 adap->fe_adap[0].fe = dvb_attach(mt352_attach,
658 &anysee_mt352_config, &adap->dev->i2c_adap);
77eed219 659 if (adap->fe_adap[0].fe)
41f81f68 660 break;
0f77c3a4 661
41f81f68 662 /* attach demod */
8f4ffb1d
AP
663 adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
664 &anysee_zl10353_config, &adap->dev->i2c_adap);
0f77c3a4 665
41f81f68
AP
666 break;
667 case ANYSEE_HW_507CD: /* 6 */
668 /* E30 Plus */
a51e34dd 669
449d1a0a
AP
670 if (state->fe_id)
671 break;
672
41f81f68
AP
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;
a51e34dd 677
41f81f68
AP
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;
a51e34dd 682
41f81f68 683 /* attach demod */
77eed219 684 adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
449d1a0a 685 &anysee_zl10353_config, &adap->dev->i2c_adap);
a51e34dd 686
41f81f68
AP
687 break;
688 case ANYSEE_HW_507DC: /* 10 */
689 /* E30 C Plus */
690
449d1a0a
AP
691 if (state->fe_id)
692 break;
693
41f81f68
AP
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 */
77eed219 700 adap->fe_adap[0].fe = dvb_attach(tda10023_attach,
449d1a0a 701 &anysee_tda10023_config, &adap->dev->i2c_adap, 0x48);
a51e34dd 702
f0a53105
AP
703 break;
704 case ANYSEE_HW_507SI: /* 11 */
705 /* E30 S2 Plus */
706
449d1a0a
AP
707 if (state->fe_id)
708 break;
709
f0a53105
AP
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 */
8f4ffb1d
AP
716 adap->fe_adap[0].fe = dvb_attach(cx24116_attach,
717 &anysee_cx24116_config, &adap->dev->i2c_adap);
f0a53105 718
41f81f68
AP
719 break;
720 case ANYSEE_HW_507FA: /* 15 */
721 /* E30 Combo Plus */
722 /* E30 C Plus */
723
72ffd2b8
AP
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
449d1a0a
AP
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);
41f81f68
AP
746 if (ret)
747 goto error;
748
449d1a0a
AP
749 /* enable DVB-C demod on IOD[5] */
750 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
751 0x20);
41f81f68
AP
752 if (ret)
753 goto error;
754
755 /* attach demod */
72ffd2b8
AP
756 if (tmp == 0xc7) {
757 /* TDA18212 config */
77eed219 758 adap->fe_adap[state->fe_id].fe = dvb_attach(
449d1a0a
AP
759 tda10023_attach,
760 &anysee_tda10023_tda18212_config,
761 &adap->dev->i2c_adap, 0x48);
72ffd2b8
AP
762 } else {
763 /* PLL config */
77eed219 764 adap->fe_adap[state->fe_id].fe = dvb_attach(
449d1a0a
AP
765 tda10023_attach,
766 &anysee_tda10023_config,
767 &adap->dev->i2c_adap, 0x48);
72ffd2b8 768 }
41f81f68 769 } else {
449d1a0a
AP
770 /* disable DVB-C demod on IOD[5] */
771 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
772 0x20);
41f81f68
AP
773 if (ret)
774 goto error;
775
449d1a0a
AP
776 /* enable DVB-T demod on IOD[0] */
777 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
778 0x01);
41f81f68
AP
779 if (ret)
780 goto error;
781
782 /* attach demod */
72ffd2b8
AP
783 if (tmp == 0xc7) {
784 /* TDA18212 config */
77eed219 785 adap->fe_adap[state->fe_id].fe = dvb_attach(
449d1a0a
AP
786 zl10353_attach,
787 &anysee_zl10353_tda18212_config2,
788 &adap->dev->i2c_adap);
72ffd2b8
AP
789 } else {
790 /* PLL config */
77eed219 791 adap->fe_adap[state->fe_id].fe = dvb_attach(
449d1a0a
AP
792 zl10353_attach,
793 &anysee_zl10353_config,
794 &adap->dev->i2c_adap);
72ffd2b8 795 }
41f81f68 796 }
e82eea79 797
be94351e
AP
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
41f81f68 805 break;
a43be980 806 case ANYSEE_HW_508TC: /* 18 */
8439e0df 807 case ANYSEE_HW_508PTC: /* 21 */
a43be980 808 /* E7 TC */
8439e0df 809 /* E7 PTC */
a43be980 810
449d1a0a
AP
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),
a43be980
AP
814 0x40);
815 if (ret)
816 goto error;
817
449d1a0a
AP
818 /* enable DVB-C demod on IOD[5] */
819 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
820 0x20);
a43be980
AP
821 if (ret)
822 goto error;
823
824 /* attach demod */
8f4ffb1d
AP
825 adap->fe_adap[state->fe_id].fe =
826 dvb_attach(tda10023_attach,
449d1a0a
AP
827 &anysee_tda10023_tda18212_config,
828 &adap->dev->i2c_adap, 0x48);
a43be980 829 } else {
449d1a0a
AP
830 /* disable DVB-C demod on IOD[5] */
831 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
a43be980
AP
832 0x20);
833 if (ret)
834 goto error;
835
449d1a0a
AP
836 /* enable DVB-T demod on IOD[6] */
837 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
838 0x40);
a43be980
AP
839 if (ret)
840 goto error;
841
842 /* attach demod */
8f4ffb1d
AP
843 adap->fe_adap[state->fe_id].fe =
844 dvb_attach(zl10353_attach,
449d1a0a
AP
845 &anysee_zl10353_tda18212_config,
846 &adap->dev->i2c_adap);
a43be980 847 }
e82eea79 848
be94351e
AP
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
05cd37de
AP
854 state->has_ci = true;
855
bedbf3d1
AP
856 break;
857 case ANYSEE_HW_508S2: /* 19 */
fea3c39a 858 case ANYSEE_HW_508PS2: /* 22 */
bedbf3d1 859 /* E7 S2 */
fea3c39a 860 /* E7 PS2 */
bedbf3d1 861
449d1a0a
AP
862 if (state->fe_id)
863 break;
864
bedbf3d1
AP
865 /* enable DVB-S/S2 demod on IOE[5] */
866 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
bedbf3d1
AP
867 if (ret)
868 goto error;
869
bedbf3d1 870 /* attach demod */
8f4ffb1d
AP
871 adap->fe_adap[0].fe = dvb_attach(stv0900_attach,
872 &anysee_stv0900_config, &adap->dev->i2c_adap, 0);
bedbf3d1 873
05cd37de
AP
874 state->has_ci = true;
875
608add85
AP
876 break;
877 case ANYSEE_HW_508T2C: /* 20 */
878 /* E7 T2C */
879
608add85 880 /* enable DVB-T/T2/C demod on IOE[5] */
bedbf3d1
AP
881 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
882 if (ret)
883 goto error;
884
608add85
AP
885 if (state->fe_id == 0) {
886 /* DVB-T/T2 */
8f4ffb1d
AP
887 adap->fe_adap[state->fe_id].fe =
888 dvb_attach(cxd2820r_attach,
608add85
AP
889 &anysee_cxd2820r_config,
890 &adap->dev->i2c_adap, NULL);
891 } else {
892 /* DVB-C */
8f4ffb1d
AP
893 adap->fe_adap[state->fe_id].fe =
894 dvb_attach(cxd2820r_attach,
608add85 895 &anysee_cxd2820r_config,
be94351e 896 &adap->dev->i2c_adap, adap->fe_adap[0].fe);
608add85
AP
897 }
898
05cd37de 899 state->has_ci = true;
bedbf3d1 900
a43be980 901 break;
41f81f68 902 }
a51e34dd 903
77eed219 904 if (!adap->fe_adap[0].fe) {
41f81f68
AP
905 /* we have no frontend :-( */
906 ret = -ENODEV;
e82eea79
AP
907 err("Unsupported Anysee version. " \
908 "Please report the <linux-media@vger.kernel.org>.");
41f81f68
AP
909 }
910error:
911 return ret;
a51e34dd
AP
912}
913
914static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
915{
916 struct anysee_state *state = adap->dev->priv;
72ffd2b8 917 struct dvb_frontend *fe;
e82eea79 918 int ret;
449d1a0a 919 deb_info("%s: fe=%d\n", __func__, state->fe_id);
a51e34dd 920
41f81f68 921 switch (state->hw) {
05c46c05 922 case ANYSEE_HW_507T: /* 2 */
41f81f68
AP
923 /* E30 */
924
925 /* attach tuner */
8f4ffb1d
AP
926 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
927 (0xc2 >> 1), NULL, DVB_PLL_THOMSON_DTT7579);
e82eea79 928
a51e34dd 929 break;
41f81f68
AP
930 case ANYSEE_HW_507CD: /* 6 */
931 /* E30 Plus */
932
933 /* attach tuner */
8f4ffb1d
AP
934 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
935 (0xc2 >> 1), &adap->dev->i2c_adap,
936 DVB_PLL_THOMSON_DTT7579);
41f81f68
AP
937
938 break;
939 case ANYSEE_HW_507DC: /* 10 */
940 /* E30 C Plus */
941
942 /* attach tuner */
8f4ffb1d
AP
943 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
944 (0xc0 >> 1), &adap->dev->i2c_adap,
945 DVB_PLL_SAMSUNG_DTOS403IH102A);
e82eea79 946
f0a53105
AP
947 break;
948 case ANYSEE_HW_507SI: /* 11 */
949 /* E30 S2 Plus */
950
951 /* attach LNB controller */
77eed219 952 fe = dvb_attach(isl6423_attach, adap->fe_adap[0].fe,
449d1a0a 953 &adap->dev->i2c_adap, &anysee_isl6423_config);
f0a53105 954
41f81f68
AP
955 break;
956 case ANYSEE_HW_507FA: /* 15 */
957 /* E30 Combo Plus */
958 /* E30 C Plus */
959
72ffd2b8
AP
960 /* Try first attach TDA18212 silicon tuner on IOE[4], if that
961 * fails attach old simple PLL. */
962
72ffd2b8 963 /* attach tuner */
77eed219 964 fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
449d1a0a 965 &adap->dev->i2c_adap, &anysee_tda18212_config);
72ffd2b8
AP
966 if (fe)
967 break;
968
41f81f68 969 /* attach tuner */
77eed219 970 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[state->fe_id].fe,
449d1a0a
AP
971 (0xc0 >> 1), &adap->dev->i2c_adap,
972 DVB_PLL_SAMSUNG_DTOS403IH102A);
41f81f68 973
a51e34dd 974 break;
a43be980 975 case ANYSEE_HW_508TC: /* 18 */
8439e0df 976 case ANYSEE_HW_508PTC: /* 21 */
a43be980 977 /* E7 TC */
8439e0df 978 /* E7 PTC */
a43be980 979
a43be980 980 /* attach tuner */
77eed219 981 fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
449d1a0a 982 &adap->dev->i2c_adap, &anysee_tda18212_config);
a43be980 983
bedbf3d1
AP
984 break;
985 case ANYSEE_HW_508S2: /* 19 */
fea3c39a 986 case ANYSEE_HW_508PS2: /* 22 */
bedbf3d1 987 /* E7 S2 */
fea3c39a 988 /* E7 PS2 */
bedbf3d1
AP
989
990 /* attach tuner */
77eed219 991 fe = dvb_attach(stv6110_attach, adap->fe_adap[0].fe,
bedbf3d1
AP
992 &anysee_stv6110_config, &adap->dev->i2c_adap);
993
994 if (fe) {
995 /* attach LNB controller */
77eed219 996 fe = dvb_attach(isl6423_attach, adap->fe_adap[0].fe,
bedbf3d1
AP
997 &adap->dev->i2c_adap, &anysee_isl6423_config);
998 }
999
a43be980 1000 break;
608add85
AP
1001
1002 case ANYSEE_HW_508T2C: /* 20 */
1003 /* E7 T2C */
1004
1005 /* attach tuner */
be94351e 1006 fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
608add85
AP
1007 &adap->dev->i2c_adap, &anysee_tda18212_config2);
1008
1009 break;
41f81f68 1010 default:
e82eea79 1011 fe = NULL;
a51e34dd
AP
1012 }
1013
e82eea79
AP
1014 if (fe)
1015 ret = 0;
1016 else
1017 ret = -ENODEV;
1018
41f81f68 1019 return ret;
a51e34dd
AP
1020}
1021
a8494689 1022static int anysee_rc_query(struct dvb_usb_device *d)
a51e34dd
AP
1023{
1024 u8 buf[] = {CMD_GET_IR_CODE};
a51e34dd 1025 u8 ircode[2];
a8494689
AP
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... */
a51e34dd 1035
a8494689 1036 ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode));
a51e34dd
AP
1037 if (ret)
1038 return ret;
1039
a8494689
AP
1040 if (ircode[0]) {
1041 deb_rc("%s: key pressed %02x\n", __func__, ircode[1]);
ca86674b 1042 rc_keydown(d->rc_dev, 0x08 << 8 | ircode[1], 0);
a51e34dd 1043 }
a8494689 1044
a51e34dd
AP
1045 return 0;
1046}
1047
05cd37de
AP
1048static 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
1063static 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
1077static 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
1092static 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
1106static 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
1127static 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
1145static 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
1157static 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
1178static 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
1205static 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
1216static 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
a51e34dd
AP
1243/* DVB USB Driver stuff */
1244static struct dvb_usb_device_properties anysee_properties;
1245
1246static 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
a51e34dd
AP
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
8b0d7048
DC
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 */
a51e34dd
AP
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
8b0d7048 1281 return anysee_init(d);
a51e34dd
AP
1282}
1283
05cd37de
AP
1284static 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
ae3745f6 1294static struct usb_device_id anysee_table[] = {
a51e34dd
AP
1295 { USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE) },
1296 { USB_DEVICE(USB_VID_AMT, USB_PID_ANYSEE) },
1297 { } /* Terminating entry */
1298};
1299MODULE_DEVICE_TABLE(usb, anysee_table);
1300
1301static 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 {
77eed219
MK
1311 .num_frontends = 2,
1312 .frontend_ctrl = anysee_frontend_ctrl,
8f4ffb1d 1313 .fe = { {
a51e34dd
AP
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 = {
ab693336 1323 .buffersize = (16*512),
a51e34dd
AP
1324 }
1325 }
1326 },
77eed219
MK
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 },
8f4ffb1d 1341 } },
a51e34dd
AP
1342 }
1343 },
1344
a8494689
AP
1345 .rc.core = {
1346 .rc_codes = RC_MAP_ANYSEE,
52b66144 1347 .protocol = RC_TYPE_OTHER,
a8494689 1348 .module_name = "anysee",
f72a27b8 1349 .rc_query = anysee_rc_query,
a8494689 1350 .rc_interval = 250, /* windows driver uses 500ms */
f72a27b8 1351 },
a51e34dd
AP
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
1368static struct usb_driver anysee_driver = {
1369 .name = "dvb_usb_anysee",
1370 .probe = anysee_probe,
05cd37de 1371 .disconnect = anysee_disconnect,
a51e34dd
AP
1372 .id_table = anysee_table,
1373};
1374
ecb3b2b3 1375module_usb_driver(anysee_driver);
a51e34dd
AP
1376
1377MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1378MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
1379MODULE_LICENSE("GPL");
This page took 0.39309 seconds and 5 git commands to generate.