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