Merge branch 'mailbox-for-next' of git://git.linaro.org/landing-teams/working/fujitsu...
[deliverable/linux.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);
a51e34dd 48
4458a54c
AP
49static int anysee_ctrl_msg(struct dvb_usb_device *d,
50 u8 *sbuf, u8 slen, u8 *rbuf, u8 rlen)
a51e34dd 51{
05cd62e0 52 struct anysee_state *state = d_to_priv(d);
cf427952 53 int act_len, ret, i;
a51e34dd 54
6c604e8e 55 mutex_lock(&d->usb_mutex);
a51e34dd 56
6c604e8e
AP
57 memcpy(&state->buf[0], sbuf, slen);
58 state->buf[60] = state->seq++;
a51e34dd 59
6c604e8e 60 dev_dbg(&d->udev->dev, "%s: >>> %*ph\n", __func__, slen, state->buf);
4048da2f 61
a51e34dd
AP
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. */
6c604e8e
AP
64 ret = dvb_usbv2_generic_rw_locked(d, state->buf, sizeof(state->buf),
65 state->buf, sizeof(state->buf));
cf427952
AP
66 if (ret)
67 goto error_unlock;
68
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
78 */
79
80 /* get answer, retry few times if error returned */
81 for (i = 0; i < 3; i++) {
a51e34dd
AP
82 /* receive 2nd answer */
83 ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
6c604e8e
AP
84 d->props->generic_bulk_ctrl_endpoint),
85 state->buf, sizeof(state->buf), &act_len, 2000);
cf427952 86 if (ret) {
4458a54c
AP
87 dev_dbg(&d->udev->dev,
88 "%s: recv bulk message failed=%d\n",
89 __func__, ret);
cf427952 90 } else {
82026f96 91 dev_dbg(&d->udev->dev, "%s: <<< %*ph\n", __func__,
6c604e8e 92 rlen, state->buf);
4048da2f 93
6c604e8e 94 if (state->buf[63] != 0x4f)
4458a54c
AP
95 dev_dbg(&d->udev->dev,
96 "%s: cmd failed\n", __func__);
cf427952 97 break;
a51e34dd
AP
98 }
99 }
100
cf427952
AP
101 if (ret) {
102 /* all retries failed, it is fatal */
82026f96
AP
103 dev_err(&d->udev->dev, "%s: recv bulk message failed=%d\n",
104 KBUILD_MODNAME, ret);
cf427952
AP
105 goto error_unlock;
106 }
107
a51e34dd 108 /* read request, copy returned data to return buf */
cf427952 109 if (rbuf && rlen)
6c604e8e 110 memcpy(rbuf, state->buf, rlen);
a51e34dd 111
cf427952 112error_unlock:
6c604e8e 113 mutex_unlock(&d->usb_mutex);
a51e34dd
AP
114 return ret;
115}
116
117static int anysee_read_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
118{
119 u8 buf[] = {CMD_REG_READ, reg >> 8, reg & 0xff, 0x01};
120 int ret;
121 ret = anysee_ctrl_msg(d, buf, sizeof(buf), val, 1);
82026f96 122 dev_dbg(&d->udev->dev, "%s: reg=%04x val=%02x\n", __func__, reg, *val);
a51e34dd
AP
123 return ret;
124}
125
126static int anysee_write_reg(struct dvb_usb_device *d, u16 reg, u8 val)
127{
128 u8 buf[] = {CMD_REG_WRITE, reg >> 8, reg & 0xff, 0x01, val};
82026f96 129 dev_dbg(&d->udev->dev, "%s: reg=%04x val=%02x\n", __func__, reg, val);
a51e34dd
AP
130 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
131}
132
41f81f68
AP
133/* write single register with mask */
134static int anysee_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
135 u8 mask)
136{
137 int ret;
138 u8 tmp;
139
140 /* no need for read if whole reg is written */
141 if (mask != 0xff) {
142 ret = anysee_read_reg(d, reg, &tmp);
143 if (ret)
144 return ret;
145
146 val &= mask;
147 tmp &= ~mask;
148 val |= tmp;
149 }
150
151 return anysee_write_reg(d, reg, val);
152}
153
05cd37de
AP
154/* read single register with mask */
155static int anysee_rd_reg_mask(struct dvb_usb_device *d, u16 reg, u8 *val,
156 u8 mask)
157{
158 int ret, i;
159 u8 tmp;
160
161 ret = anysee_read_reg(d, reg, &tmp);
162 if (ret)
163 return ret;
164
165 tmp &= mask;
166
167 /* find position of the first bit */
168 for (i = 0; i < 8; i++) {
169 if ((mask >> i) & 0x01)
170 break;
171 }
172 *val = tmp >> i;
173
174 return 0;
175}
176
a51e34dd
AP
177static int anysee_get_hw_info(struct dvb_usb_device *d, u8 *id)
178{
179 u8 buf[] = {CMD_GET_HW_INFO};
180 return anysee_ctrl_msg(d, buf, sizeof(buf), id, 3);
181}
182
a13a6e1f 183static int anysee_streaming_ctrl(struct dvb_frontend *fe, int onoff)
a51e34dd
AP
184{
185 u8 buf[] = {CMD_STREAMING_CTRL, (u8)onoff, 0x00};
82026f96 186 dev_dbg(&fe_to_d(fe)->udev->dev, "%s: onoff=%d\n", __func__, onoff);
a13a6e1f 187 return anysee_ctrl_msg(fe_to_d(fe), buf, sizeof(buf), NULL, 0);
a51e34dd
AP
188}
189
190static int anysee_led_ctrl(struct dvb_usb_device *d, u8 mode, u8 interval)
191{
192 u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x01, mode, interval};
82026f96
AP
193 dev_dbg(&d->udev->dev, "%s: state=%d interval=%d\n", __func__,
194 mode, interval);
a51e34dd
AP
195 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
196}
197
198static int anysee_ir_ctrl(struct dvb_usb_device *d, u8 onoff)
199{
200 u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x02, onoff};
82026f96 201 dev_dbg(&d->udev->dev, "%s: onoff=%d\n", __func__, onoff);
a51e34dd
AP
202 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
203}
204
a51e34dd
AP
205/* I2C */
206static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
207 int num)
208{
209 struct dvb_usb_device *d = i2c_get_adapdata(adap);
902571aa 210 int ret = 0, inc, i = 0;
21d2e938 211 u8 buf[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */
a51e34dd
AP
212
213 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
214 return -EAGAIN;
215
216 while (i < num) {
217 if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
21d2e938
AP
218 if (msg[i].len > 2 || msg[i+1].len > 60) {
219 ret = -EOPNOTSUPP;
220 break;
221 }
a51e34dd 222 buf[0] = CMD_I2C_READ;
7ea03d21 223 buf[1] = (msg[i].addr << 1) | 0x01;
a51e34dd 224 buf[2] = msg[i].buf[0];
882b82ca
AP
225 buf[3] = msg[i].buf[1];
226 buf[4] = msg[i].len-1;
b3e6a5af 227 buf[5] = msg[i+1].len;
21d2e938 228 ret = anysee_ctrl_msg(d, buf, 6, msg[i+1].buf,
a51e34dd
AP
229 msg[i+1].len);
230 inc = 2;
231 } else {
21d2e938
AP
232 if (msg[i].len > 48) {
233 ret = -EOPNOTSUPP;
234 break;
235 }
a51e34dd 236 buf[0] = CMD_I2C_WRITE;
7ea03d21 237 buf[1] = (msg[i].addr << 1);
a51e34dd
AP
238 buf[2] = msg[i].len;
239 buf[3] = 0x01;
240 memcpy(&buf[4], msg[i].buf, msg[i].len);
21d2e938 241 ret = anysee_ctrl_msg(d, buf, 4 + msg[i].len, NULL, 0);
a51e34dd
AP
242 inc = 1;
243 }
244 if (ret)
e613f8fa 245 break;
a51e34dd
AP
246
247 i += inc;
248 }
249
250 mutex_unlock(&d->i2c_mutex);
251
e613f8fa 252 return ret ? ret : i;
a51e34dd
AP
253}
254
255static u32 anysee_i2c_func(struct i2c_adapter *adapter)
256{
257 return I2C_FUNC_I2C;
258}
259
260static struct i2c_algorithm anysee_i2c_algo = {
261 .master_xfer = anysee_master_xfer,
262 .functionality = anysee_i2c_func,
263};
264
265static int anysee_mt352_demod_init(struct dvb_frontend *fe)
266{
ae3745f6
AP
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 };
a51e34dd
AP
272 static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
273
274 mt352_write(fe, clock_config, sizeof(clock_config));
275 udelay(200);
276 mt352_write(fe, reset, sizeof(reset));
277 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
278
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));
282
283 return 0;
284}
285
286/* Callbacks for DVB USB */
287static struct tda10023_config anysee_tda10023_config = {
7ea03d21 288 .demod_address = (0x1a >> 1),
a51e34dd
AP
289 .invert = 0,
290 .xtal = 16000000,
291 .pll_m = 11,
292 .pll_p = 3,
293 .pll_n = 1,
5ae2fcae
AP
294 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
295 .deltaf = 0xfeeb,
a51e34dd
AP
296};
297
298static struct mt352_config anysee_mt352_config = {
7ea03d21 299 .demod_address = (0x1e >> 1),
a51e34dd
AP
300 .demod_init = anysee_mt352_demod_init,
301};
302
303static struct zl10353_config anysee_zl10353_config = {
7ea03d21 304 .demod_address = (0x1e >> 1),
a51e34dd
AP
305 .parallel_ts = 1,
306};
307
1fd80701
AP
308static struct zl10353_config anysee_zl10353_tda18212_config2 = {
309 .demod_address = (0x1e >> 1),
310 .parallel_ts = 1,
311 .disable_i2c_gate_ctrl = 1,
312 .no_tuner = 1,
313 .if2 = 41500,
314};
315
72ffd2b8
AP
316static struct zl10353_config anysee_zl10353_tda18212_config = {
317 .demod_address = (0x18 >> 1),
318 .parallel_ts = 1,
319 .disable_i2c_gate_ctrl = 1,
320 .no_tuner = 1,
321 .if2 = 41500,
322};
323
324static struct tda10023_config anysee_tda10023_tda18212_config = {
325 .demod_address = (0x1a >> 1),
326 .xtal = 16000000,
327 .pll_m = 12,
328 .pll_p = 3,
329 .pll_n = 1,
05cd37de 330 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_B,
72ffd2b8
AP
331 .deltaf = 0xba02,
332};
333
334static struct tda18212_config anysee_tda18212_config = {
72ffd2b8
AP
335 .if_dvbt_6 = 4150,
336 .if_dvbt_7 = 4150,
337 .if_dvbt_8 = 4150,
338 .if_dvbc = 5000,
339};
340
608add85 341static struct tda18212_config anysee_tda18212_config2 = {
608add85
AP
342 .if_dvbt_6 = 3550,
343 .if_dvbt_7 = 3700,
344 .if_dvbt_8 = 4150,
345 .if_dvbt2_6 = 3250,
346 .if_dvbt2_7 = 4000,
347 .if_dvbt2_8 = 4000,
348 .if_dvbc = 5000,
349};
350
f0a53105
AP
351static struct cx24116_config anysee_cx24116_config = {
352 .demod_address = (0xaa >> 1),
353 .mpg_clk_pos_pol = 0x00,
354 .i2c_wr_max = 48,
355};
356
bedbf3d1
AP
357static struct stv0900_config anysee_stv0900_config = {
358 .demod_address = (0xd0 >> 1),
359 .demod_mode = 0,
360 .xtal = 8000000,
361 .clkmode = 3,
362 .diseqc_mode = 2,
363 .tun1_maddress = 0,
364 .tun1_adc = 1, /* 1 Vpp */
365 .path1_mode = 3,
366};
367
368static struct stv6110_config anysee_stv6110_config = {
369 .i2c_address = (0xc0 >> 1),
370 .mclk = 16000000,
371 .clk_div = 1,
372};
373
f0a53105
AP
374static struct isl6423_config anysee_isl6423_config = {
375 .current_max = SEC_CURRENT_800m,
376 .curlim = SEC_CURRENT_LIM_OFF,
377 .mod_extern = 1,
378 .addr = (0x10 >> 1),
379};
380
608add85
AP
381static struct cxd2820r_config anysee_cxd2820r_config = {
382 .i2c_address = 0x6d, /* (0xda >> 1) */
383 .ts_mode = 0x38,
608add85
AP
384};
385
41f81f68
AP
386/*
387 * New USB device strings: Mfr=1, Product=2, SerialNumber=0
388 * Manufacturer: AMT.CO.KR
389 *
390 * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
391 * PCB: ?
70fc26fb 392 * parts: DNOS404ZH102A(MT352, DTT7579(?))
41f81f68 393 *
05c46c05
AP
394 * E30 VID=04b4 PID=861f HW=2 FW=2.1 "anysee-T(LP)"
395 * PCB: PCB 507T (rev1.61)
70fc26fb 396 * parts: DNOS404ZH103A(ZL10353, DTT7579(?))
05c46c05
AP
397 * OEA=0a OEB=00 OEC=00 OED=ff OEE=00
398 * IOA=45 IOB=ff IOC=00 IOD=ff IOE=00
41f81f68
AP
399 *
400 * E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee"
401 * PCB: 507CD (rev1.1)
70fc26fb 402 * parts: DNOS404ZH103A(ZL10353, DTT7579(?)), CST56I01
05c46c05
AP
403 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
404 * IOA=4f IOB=ff IOC=00 IOD=06 IOE=01
41f81f68
AP
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)
408 *
409 * E30 C Plus VID=04b4 PID=861f HW=10 FW=1.0 "anysee-DC(LP)"
410 * PCB: 507DC (rev0.2)
70fc26fb 411 * parts: TDA10023, DTOS403IH102B TM, CST56I01
05c46c05
AP
412 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
413 * IOA=4f IOB=ff IOC=00 IOD=26 IOE=01
41f81f68
AP
414 * IOD[0] TDA10023 1=enabled
415 *
f0a53105
AP
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
05c46c05
AP
419 * OEA=80 OEB=00 OEC=ff OED=ff OEE=fe
420 * IOA=4d IOB=ff IOC=00 IOD=26 IOE=01
f0a53105
AP
421 * IOD[0] CX24116 1=enabled
422 *
41f81f68
AP
423 * E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
424 * PCB: 507FA (rev0.4)
70fc26fb 425 * parts: TDA10023, DTOS403IH102B TM, TDA8024
05c46c05
AP
426 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
427 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
41f81f68
AP
428 * IOD[5] TDA10023 1=enabled
429 * IOE[0] tuner 1=enabled
430 *
431 * E30 Combo Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
432 * PCB: 507FA (rev1.1)
70fc26fb 433 * parts: ZL10353, TDA10023, DTOS403IH102B TM, TDA8024
05c46c05
AP
434 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
435 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
41f81f68
AP
436 * DVB-C:
437 * IOD[5] TDA10023 1=enabled
438 * IOE[0] tuner 1=enabled
439 * DVB-T:
440 * IOD[0] ZL10353 1=enabled
441 * IOE[0] tuner 0=enabled
442 * tuner is behind ZL10353 I2C-gate
c57f87e6 443 * tuner is behind TDA10023 I2C-gate
70fc26fb
AP
444 *
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)
05c46c05
AP
448 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
449 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
70fc26fb
AP
450 * IOA[7] TS 1=enabled
451 * IOE[4] TDA18212 1=enabled
452 * DVB-C:
453 * IOD[6] ZL10353 0=disabled
454 * IOD[5] TDA10023 1=enabled
455 * IOE[0] IF 1=enabled
456 * DVB-T:
457 * IOD[5] TDA10023 0=disabled
458 * IOD[6] ZL10353 1=enabled
459 * IOE[0] IF 0=enabled
bedbf3d1
AP
460 *
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
05c46c05
AP
464 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
465 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
bedbf3d1
AP
466 * IOA[7] TS 1=enabled
467 * IOE[5] STV0903 1=enabled
468 *
608add85
AP
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
476 *
8439e0df
AP
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
484 * DVB-C:
485 * IOD[6] ZL10353 0=disabled
486 * IOD[5] TDA10023 1=enabled
487 * IOE[0] IF 1=enabled
488 * DVB-T:
489 * IOD[5] TDA10023 0=disabled
490 * IOD[6] ZL10353 1=enabled
491 * IOE[0] IF 0=enabled
fea3c39a 492 *
608add85 493 * E7 PS2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
fea3c39a
AP
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
41f81f68
AP
500 */
501
a4e7c51e
AP
502static int anysee_read_config(struct dvb_usb_device *d)
503{
05cd62e0 504 struct anysee_state *state = d_to_priv(d);
a4e7c51e
AP
505 int ret;
506 u8 hw_info[3];
507
508 /*
509 * Check which hardware we have.
510 * We must do this call two times to get reliable values (hw/fw bug).
511 */
512 ret = anysee_get_hw_info(d, hw_info);
513 if (ret)
514 goto error;
515
516 ret = anysee_get_hw_info(d, hw_info);
517 if (ret)
518 goto error;
519
82026f96
AP
520 /*
521 * Meaning of these info bytes are guessed.
522 */
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]);
a4e7c51e
AP
525
526 state->hw = hw_info[0];
527error:
528 return ret;
529}
be94351e
AP
530
531/* external I2C gate used for DNOD44CDH086A(TDA18212) tuner module */
532static int anysee_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
533{
be94351e 534 /* enable / disable tuner access on IOE[4] */
05cd62e0 535 return anysee_wr_reg_mask(fe_to_d(fe), REG_IOE, (enable << 4), 0x10);
be94351e
AP
536}
537
449d1a0a
AP
538static int anysee_frontend_ctrl(struct dvb_frontend *fe, int onoff)
539{
05cd62e0
AP
540 struct anysee_state *state = fe_to_priv(fe);
541 struct dvb_usb_device *d = fe_to_d(fe);
449d1a0a 542 int ret;
82026f96 543 dev_dbg(&d->udev->dev, "%s: fe=%d onoff=%d\n", __func__, fe->id, onoff);
449d1a0a
AP
544
545 /* no frontend sleep control */
546 if (onoff == 0)
547 return 0;
548
549 switch (state->hw) {
550 case ANYSEE_HW_507FA: /* 15 */
551 /* E30 Combo Plus */
552 /* E30 C Plus */
553
a4e7c51e 554 if (fe->id == 0) {
449d1a0a 555 /* disable DVB-T demod on IOD[0] */
05cd62e0 556 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 0), 0x01);
449d1a0a
AP
557 if (ret)
558 goto error;
559
560 /* enable DVB-C demod on IOD[5] */
05cd62e0 561 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
449d1a0a
AP
562 if (ret)
563 goto error;
564
565 /* enable DVB-C tuner on IOE[0] */
05cd62e0 566 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 0), 0x01);
449d1a0a
AP
567 if (ret)
568 goto error;
569 } else {
570 /* disable DVB-C demod on IOD[5] */
05cd62e0 571 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
449d1a0a
AP
572 if (ret)
573 goto error;
574
575 /* enable DVB-T demod on IOD[0] */
05cd62e0 576 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
449d1a0a
AP
577 if (ret)
578 goto error;
579
580 /* enable DVB-T tuner on IOE[0] */
05cd62e0 581 ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 0), 0x01);
449d1a0a
AP
582 if (ret)
583 goto error;
584 }
585
586 break;
587 case ANYSEE_HW_508TC: /* 18 */
588 case ANYSEE_HW_508PTC: /* 21 */
589 /* E7 TC */
590 /* E7 PTC */
591
a4e7c51e 592 if (fe->id == 0) {
449d1a0a 593 /* disable DVB-T demod on IOD[6] */
05cd62e0 594 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 6), 0x40);
449d1a0a
AP
595 if (ret)
596 goto error;
597
598 /* enable DVB-C demod on IOD[5] */
05cd62e0 599 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
449d1a0a
AP
600 if (ret)
601 goto error;
602
603 /* enable IF route on IOE[0] */
05cd62e0 604 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 0), 0x01);
449d1a0a
AP
605 if (ret)
606 goto error;
607 } else {
608 /* disable DVB-C demod on IOD[5] */
05cd62e0 609 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
449d1a0a
AP
610 if (ret)
611 goto error;
612
613 /* enable DVB-T demod on IOD[6] */
05cd62e0 614 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 6), 0x40);
449d1a0a
AP
615 if (ret)
616 goto error;
617
618 /* enable IF route on IOE[0] */
05cd62e0 619 ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 0), 0x01);
449d1a0a
AP
620 if (ret)
621 goto error;
622 }
623
624 break;
625 default:
626 ret = 0;
627 }
628
629error:
630 return ret;
631}
632
7383159f
KC
633static int anysee_add_i2c_dev(struct dvb_usb_device *d, const char *type,
634 u8 addr, void *platform_data)
f80f2ae2
AP
635{
636 int ret, num;
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 = {
641 .addr = addr,
642 .platform_data = platform_data,
643 };
644
645 strlcpy(board_info.type, type, I2C_NAME_SIZE);
646
647 /* find first free client */
648 for (num = 0; num < ANYSEE_I2C_CLIENT_MAX; num++) {
649 if (state->i2c_client[num] == NULL)
650 break;
651 }
652
653 dev_dbg(&d->udev->dev, "%s: num=%d\n", __func__, num);
654
655 if (num == ANYSEE_I2C_CLIENT_MAX) {
656 dev_err(&d->udev->dev, "%s: I2C client out of index\n",
657 KBUILD_MODNAME);
658 ret = -ENODEV;
659 goto err;
660 }
661
7383159f 662 request_module("%s", board_info.type);
f80f2ae2
AP
663
664 /* register I2C device */
665 client = i2c_new_device(adapter, &board_info);
666 if (client == NULL || client->dev.driver == NULL) {
667 ret = -ENODEV;
668 goto err;
669 }
670
671 /* increase I2C driver usage count */
672 if (!try_module_get(client->dev.driver->owner)) {
673 i2c_unregister_device(client);
674 ret = -ENODEV;
675 goto err;
676 }
677
678 state->i2c_client[num] = client;
679 return 0;
680err:
681 dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret);
682 return ret;
683}
684
685static void anysee_del_i2c_dev(struct dvb_usb_device *d)
686{
687 int num;
688 struct anysee_state *state = d_to_priv(d);
689 struct i2c_client *client;
690
691 /* find last used client */
692 num = ANYSEE_I2C_CLIENT_MAX;
693 while (num--) {
694 if (state->i2c_client[num] != NULL)
695 break;
696 }
697
698 dev_dbg(&d->udev->dev, "%s: num=%d\n", __func__, num);
699
700 if (num == -1) {
701 dev_err(&d->udev->dev, "%s: I2C client out of index\n",
702 KBUILD_MODNAME);
703 goto err;
704 }
705
706 client = state->i2c_client[num];
707
708 /* decrease I2C driver usage count */
709 module_put(client->dev.driver->owner);
710
711 /* unregister I2C device */
712 i2c_unregister_device(client);
713
714 state->i2c_client[num] = NULL;
715err:
716 dev_dbg(&d->udev->dev, "%s: failed\n", __func__);
717}
718
a51e34dd
AP
719static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
720{
05cd62e0
AP
721 struct anysee_state *state = adap_to_priv(adap);
722 struct dvb_usb_device *d = adap_to_d(adap);
ecb52ab8 723 int ret = 0;
72ffd2b8
AP
724 u8 tmp;
725 struct i2c_msg msg[2] = {
726 {
f80f2ae2 727 .addr = 0x60,
72ffd2b8
AP
728 .flags = 0,
729 .len = 1,
730 .buf = "\x00",
731 }, {
f80f2ae2 732 .addr = 0x60,
72ffd2b8
AP
733 .flags = I2C_M_RD,
734 .len = 1,
735 .buf = &tmp,
736 }
737 };
a51e34dd 738
41f81f68 739 switch (state->hw) {
05c46c05 740 case ANYSEE_HW_507T: /* 2 */
41f81f68 741 /* E30 */
a51e34dd 742
41f81f68 743 /* attach demod */
05cd62e0
AP
744 adap->fe[0] = dvb_attach(mt352_attach, &anysee_mt352_config,
745 &d->i2c_adap);
a4e7c51e 746 if (adap->fe[0])
41f81f68 747 break;
0f77c3a4 748
41f81f68 749 /* attach demod */
05cd62e0
AP
750 adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config,
751 &d->i2c_adap);
0f77c3a4 752
41f81f68
AP
753 break;
754 case ANYSEE_HW_507CD: /* 6 */
755 /* E30 Plus */
a51e34dd 756
41f81f68 757 /* enable DVB-T demod on IOD[0] */
05cd62e0 758 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
41f81f68
AP
759 if (ret)
760 goto error;
a51e34dd 761
41f81f68 762 /* enable transport stream on IOA[7] */
05cd62e0 763 ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
41f81f68
AP
764 if (ret)
765 goto error;
a51e34dd 766
41f81f68 767 /* attach demod */
05cd62e0
AP
768 adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config,
769 &d->i2c_adap);
a51e34dd 770
41f81f68
AP
771 break;
772 case ANYSEE_HW_507DC: /* 10 */
773 /* E30 C Plus */
774
775 /* enable DVB-C demod on IOD[0] */
05cd62e0 776 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
41f81f68
AP
777 if (ret)
778 goto error;
779
780 /* attach demod */
a4e7c51e 781 adap->fe[0] = dvb_attach(tda10023_attach,
05cd62e0 782 &anysee_tda10023_config, &d->i2c_adap, 0x48);
a51e34dd 783
f0a53105
AP
784 break;
785 case ANYSEE_HW_507SI: /* 11 */
786 /* E30 S2 Plus */
787
788 /* enable DVB-S/S2 demod on IOD[0] */
05cd62e0 789 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
f0a53105
AP
790 if (ret)
791 goto error;
792
793 /* attach demod */
05cd62e0
AP
794 adap->fe[0] = dvb_attach(cx24116_attach, &anysee_cx24116_config,
795 &d->i2c_adap);
f0a53105 796
41f81f68
AP
797 break;
798 case ANYSEE_HW_507FA: /* 15 */
799 /* E30 Combo Plus */
800 /* E30 C Plus */
801
72ffd2b8 802 /* enable tuner on IOE[4] */
05cd62e0 803 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 4), 0x10);
72ffd2b8
AP
804 if (ret)
805 goto error;
806
807 /* probe TDA18212 */
808 tmp = 0;
05cd62e0 809 ret = i2c_transfer(&d->i2c_adap, msg, 2);
f80f2ae2 810 if (ret == 2 && tmp == 0xc7) {
82026f96
AP
811 dev_dbg(&d->udev->dev, "%s: TDA18212 found\n",
812 __func__);
f80f2ae2
AP
813 state->has_tda18212 = true;
814 }
72ffd2b8
AP
815 else
816 tmp = 0;
817
818 /* disable tuner on IOE[4] */
05cd62e0 819 ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 4), 0x10);
72ffd2b8
AP
820 if (ret)
821 goto error;
822
a4e7c51e 823 /* disable DVB-T demod on IOD[0] */
05cd62e0 824 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 0), 0x01);
a4e7c51e
AP
825 if (ret)
826 goto error;
41f81f68 827
a4e7c51e 828 /* enable DVB-C demod on IOD[5] */
05cd62e0 829 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
a4e7c51e
AP
830 if (ret)
831 goto error;
41f81f68 832
a4e7c51e
AP
833 /* attach demod */
834 if (tmp == 0xc7) {
835 /* TDA18212 config */
836 adap->fe[0] = dvb_attach(tda10023_attach,
449d1a0a 837 &anysee_tda10023_tda18212_config,
05cd62e0 838 &d->i2c_adap, 0x48);
a4e7c51e
AP
839
840 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
841 if (adap->fe[0])
842 adap->fe[0]->ops.i2c_gate_ctrl =
843 anysee_i2c_gate_ctrl;
844 } else {
845 /* PLL config */
846 adap->fe[0] = dvb_attach(tda10023_attach,
449d1a0a 847 &anysee_tda10023_config,
05cd62e0 848 &d->i2c_adap, 0x48);
a4e7c51e 849 }
41f81f68 850
a4e7c51e
AP
851 /* break out if first frontend attaching fails */
852 if (!adap->fe[0])
853 break;
854
855 /* disable DVB-C demod on IOD[5] */
05cd62e0 856 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
a4e7c51e
AP
857 if (ret)
858 goto error;
859
860 /* enable DVB-T demod on IOD[0] */
05cd62e0 861 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
a4e7c51e
AP
862 if (ret)
863 goto error;
41f81f68 864
a4e7c51e
AP
865 /* attach demod */
866 if (tmp == 0xc7) {
867 /* TDA18212 config */
868 adap->fe[1] = dvb_attach(zl10353_attach,
449d1a0a 869 &anysee_zl10353_tda18212_config2,
05cd62e0 870 &d->i2c_adap);
a4e7c51e
AP
871
872 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
873 if (adap->fe[1])
874 adap->fe[1]->ops.i2c_gate_ctrl =
875 anysee_i2c_gate_ctrl;
876 } else {
877 /* PLL config */
878 adap->fe[1] = dvb_attach(zl10353_attach,
449d1a0a 879 &anysee_zl10353_config,
05cd62e0 880 &d->i2c_adap);
be94351e
AP
881 }
882
41f81f68 883 break;
a43be980 884 case ANYSEE_HW_508TC: /* 18 */
8439e0df 885 case ANYSEE_HW_508PTC: /* 21 */
a43be980 886 /* E7 TC */
8439e0df 887 /* E7 PTC */
a43be980 888
a4e7c51e 889 /* disable DVB-T demod on IOD[6] */
05cd62e0 890 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 6), 0x40);
a4e7c51e
AP
891 if (ret)
892 goto error;
a43be980 893
a4e7c51e 894 /* enable DVB-C demod on IOD[5] */
05cd62e0 895 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
a4e7c51e
AP
896 if (ret)
897 goto error;
a43be980 898
a4e7c51e
AP
899 /* attach demod */
900 adap->fe[0] = dvb_attach(tda10023_attach,
449d1a0a 901 &anysee_tda10023_tda18212_config,
05cd62e0 902 &d->i2c_adap, 0x48);
a43be980 903
a4e7c51e
AP
904 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
905 if (adap->fe[0])
906 adap->fe[0]->ops.i2c_gate_ctrl = anysee_i2c_gate_ctrl;
907
908 /* break out if first frontend attaching fails */
909 if (!adap->fe[0])
910 break;
911
912 /* disable DVB-C demod on IOD[5] */
05cd62e0 913 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
a4e7c51e
AP
914 if (ret)
915 goto error;
916
917 /* enable DVB-T demod on IOD[6] */
05cd62e0 918 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 6), 0x40);
a4e7c51e
AP
919 if (ret)
920 goto error;
a43be980 921
a4e7c51e
AP
922 /* attach demod */
923 adap->fe[1] = dvb_attach(zl10353_attach,
449d1a0a 924 &anysee_zl10353_tda18212_config,
05cd62e0 925 &d->i2c_adap);
e82eea79 926
be94351e 927 /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
a4e7c51e
AP
928 if (adap->fe[1])
929 adap->fe[1]->ops.i2c_gate_ctrl = anysee_i2c_gate_ctrl;
be94351e 930
05cd37de
AP
931 state->has_ci = true;
932
bedbf3d1
AP
933 break;
934 case ANYSEE_HW_508S2: /* 19 */
fea3c39a 935 case ANYSEE_HW_508PS2: /* 22 */
bedbf3d1 936 /* E7 S2 */
fea3c39a 937 /* E7 PS2 */
bedbf3d1 938
bedbf3d1 939 /* enable DVB-S/S2 demod on IOE[5] */
05cd62e0 940 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 5), 0x20);
bedbf3d1
AP
941 if (ret)
942 goto error;
943
bedbf3d1 944 /* attach demod */
a4e7c51e 945 adap->fe[0] = dvb_attach(stv0900_attach,
05cd62e0 946 &anysee_stv0900_config, &d->i2c_adap, 0);
bedbf3d1 947
05cd37de
AP
948 state->has_ci = true;
949
608add85
AP
950 break;
951 case ANYSEE_HW_508T2C: /* 20 */
952 /* E7 T2C */
953
608add85 954 /* enable DVB-T/T2/C demod on IOE[5] */
05cd62e0 955 ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 5), 0x20);
bedbf3d1
AP
956 if (ret)
957 goto error;
958
faf27976 959 /* attach demod */
a4e7c51e 960 adap->fe[0] = dvb_attach(cxd2820r_attach,
1e8f31f3 961 &anysee_cxd2820r_config, &d->i2c_adap, NULL);
608add85 962
05cd37de 963 state->has_ci = true;
bedbf3d1 964
a43be980 965 break;
41f81f68 966 }
a51e34dd 967
a4e7c51e 968 if (!adap->fe[0]) {
41f81f68
AP
969 /* we have no frontend :-( */
970 ret = -ENODEV;
4458a54c 971 dev_err(&d->udev->dev,
542b329f 972 "%s: Unsupported Anysee version. Please report to <linux-media@vger.kernel.org>.\n",
82026f96 973 KBUILD_MODNAME);
41f81f68
AP
974 }
975error:
976 return ret;
a51e34dd
AP
977}
978
979static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
980{
05cd62e0
AP
981 struct anysee_state *state = adap_to_priv(adap);
982 struct dvb_usb_device *d = adap_to_d(adap);
72ffd2b8 983 struct dvb_frontend *fe;
e82eea79 984 int ret;
82026f96 985 dev_dbg(&d->udev->dev, "%s:\n", __func__);
a51e34dd 986
41f81f68 987 switch (state->hw) {
05c46c05 988 case ANYSEE_HW_507T: /* 2 */
41f81f68
AP
989 /* E30 */
990
991 /* attach tuner */
05cd62e0
AP
992 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1), NULL,
993 DVB_PLL_THOMSON_DTT7579);
e82eea79 994
a51e34dd 995 break;
41f81f68
AP
996 case ANYSEE_HW_507CD: /* 6 */
997 /* E30 Plus */
998
999 /* attach tuner */
05cd62e0
AP
1000 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1),
1001 &d->i2c_adap, DVB_PLL_THOMSON_DTT7579);
41f81f68
AP
1002
1003 break;
1004 case ANYSEE_HW_507DC: /* 10 */
1005 /* E30 C Plus */
1006
1007 /* attach tuner */
05cd62e0
AP
1008 fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc0 >> 1),
1009 &d->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
e82eea79 1010
f0a53105
AP
1011 break;
1012 case ANYSEE_HW_507SI: /* 11 */
1013 /* E30 S2 Plus */
1014
1015 /* attach LNB controller */
05cd62e0
AP
1016 fe = dvb_attach(isl6423_attach, adap->fe[0], &d->i2c_adap,
1017 &anysee_isl6423_config);
f0a53105 1018
41f81f68
AP
1019 break;
1020 case ANYSEE_HW_507FA: /* 15 */
1021 /* E30 Combo Plus */
1022 /* E30 C Plus */
1023
72ffd2b8
AP
1024 /* Try first attach TDA18212 silicon tuner on IOE[4], if that
1025 * fails attach old simple PLL. */
1026
72ffd2b8 1027 /* attach tuner */
f80f2ae2
AP
1028 if (state->has_tda18212) {
1029 struct tda18212_config tda18212_config =
1030 anysee_tda18212_config;
a4e7c51e 1031
f80f2ae2
AP
1032 tda18212_config.fe = adap->fe[0];
1033 ret = anysee_add_i2c_dev(d, "tda18212", 0x60,
1034 &tda18212_config);
1035 if (ret)
1036 goto err;
1037
1038 /* copy tuner ops for 2nd FE as tuner is shared */
1039 if (adap->fe[1]) {
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));
1045 }
a4e7c51e 1046
f80f2ae2
AP
1047 return 0;
1048 } else {
1049 /* attach tuner */
1050 fe = dvb_attach(dvb_pll_attach, adap->fe[0],
05cd62e0 1051 (0xc0 >> 1), &d->i2c_adap,
a4e7c51e 1052 DVB_PLL_SAMSUNG_DTOS403IH102A);
f80f2ae2
AP
1053
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);
1059 }
a4e7c51e 1060 }
41f81f68 1061
a51e34dd 1062 break;
a43be980 1063 case ANYSEE_HW_508TC: /* 18 */
8439e0df 1064 case ANYSEE_HW_508PTC: /* 21 */
f80f2ae2 1065 {
a43be980 1066 /* E7 TC */
8439e0df 1067 /* E7 PTC */
f80f2ae2 1068 struct tda18212_config tda18212_config = anysee_tda18212_config;
a43be980 1069
f80f2ae2
AP
1070 tda18212_config.fe = adap->fe[0];
1071 ret = anysee_add_i2c_dev(d, "tda18212", 0x60, &tda18212_config);
1072 if (ret)
1073 goto err;
1074
1075 /* copy tuner ops for 2nd FE as tuner is shared */
1076 if (adap->fe[1]) {
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));
a4e7c51e
AP
1081 }
1082
f80f2ae2
AP
1083 return 0;
1084 }
bedbf3d1 1085 case ANYSEE_HW_508S2: /* 19 */
fea3c39a 1086 case ANYSEE_HW_508PS2: /* 22 */
bedbf3d1 1087 /* E7 S2 */
fea3c39a 1088 /* E7 PS2 */
bedbf3d1
AP
1089
1090 /* attach tuner */
a4e7c51e 1091 fe = dvb_attach(stv6110_attach, adap->fe[0],
05cd62e0 1092 &anysee_stv6110_config, &d->i2c_adap);
bedbf3d1
AP
1093
1094 if (fe) {
1095 /* attach LNB controller */
a4e7c51e 1096 fe = dvb_attach(isl6423_attach, adap->fe[0],
05cd62e0 1097 &d->i2c_adap, &anysee_isl6423_config);
bedbf3d1
AP
1098 }
1099
a43be980 1100 break;
608add85
AP
1101
1102 case ANYSEE_HW_508T2C: /* 20 */
f80f2ae2 1103 {
608add85 1104 /* E7 T2C */
f80f2ae2
AP
1105 struct tda18212_config tda18212_config =
1106 anysee_tda18212_config2;
608add85 1107
f80f2ae2
AP
1108 tda18212_config.fe = adap->fe[0];
1109 ret = anysee_add_i2c_dev(d, "tda18212", 0x60, &tda18212_config);
1110 if (ret)
1111 goto err;
608add85 1112
f80f2ae2
AP
1113 return 0;
1114 }
41f81f68 1115 default:
e82eea79 1116 fe = NULL;
a51e34dd
AP
1117 }
1118
e82eea79
AP
1119 if (fe)
1120 ret = 0;
1121 else
1122 ret = -ENODEV;
f80f2ae2 1123err:
41f81f68 1124 return ret;
a51e34dd
AP
1125}
1126
37b44a0f 1127#if IS_ENABLED(CONFIG_RC_CORE)
a8494689 1128static int anysee_rc_query(struct dvb_usb_device *d)
a51e34dd
AP
1129{
1130 u8 buf[] = {CMD_GET_IR_CODE};
a51e34dd 1131 u8 ircode[2];
a8494689
AP
1132 int ret;
1133
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... */
a51e34dd 1141
a8494689 1142 ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode));
a51e34dd
AP
1143 if (ret)
1144 return ret;
1145
a8494689 1146 if (ircode[0]) {
82026f96
AP
1147 dev_dbg(&d->udev->dev, "%s: key pressed %02x\n", __func__,
1148 ircode[1]);
120703f9
DH
1149 rc_keydown(d->rc_dev, RC_TYPE_NEC,
1150 RC_SCANCODE_NEC(0x08, ircode[1]), 0);
a51e34dd 1151 }
a8494689 1152
a51e34dd
AP
1153 return 0;
1154}
1155
a4e7c51e
AP
1156static int anysee_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc)
1157{
c003ab1b 1158 rc->allowed_protos = RC_BIT_NEC;
a4e7c51e
AP
1159 rc->query = anysee_rc_query;
1160 rc->interval = 250; /* windows driver uses 500ms */
1161
1162 return 0;
1163}
d5c62090
AP
1164#else
1165 #define anysee_get_rc_config NULL
1166#endif
a4e7c51e 1167
05cd37de
AP
1168static int anysee_ci_read_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
1169 int addr)
1170{
1171 struct dvb_usb_device *d = ci->data;
1172 int ret;
1173 u8 buf[] = {CMD_CI, 0x02, 0x40 | addr >> 8, addr & 0xff, 0x00, 1};
1174 u8 val;
1175
1176 ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
1177 if (ret)
1178 return ret;
1179
1180 return val;
1181}
1182
1183static int anysee_ci_write_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
1184 int addr, u8 val)
1185{
1186 struct dvb_usb_device *d = ci->data;
1187 int ret;
1188 u8 buf[] = {CMD_CI, 0x03, 0x40 | addr >> 8, addr & 0xff, 0x00, 1, val};
1189
1190 ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
1191 if (ret)
1192 return ret;
1193
1194 return 0;
1195}
1196
1197static int anysee_ci_read_cam_control(struct dvb_ca_en50221 *ci, int slot,
1198 u8 addr)
1199{
1200 struct dvb_usb_device *d = ci->data;
1201 int ret;
1202 u8 buf[] = {CMD_CI, 0x04, 0x40, addr, 0x00, 1};
1203 u8 val;
1204
1205 ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
1206 if (ret)
1207 return ret;
1208
1209 return val;
1210}
1211
1212static int anysee_ci_write_cam_control(struct dvb_ca_en50221 *ci, int slot,
1213 u8 addr, u8 val)
1214{
1215 struct dvb_usb_device *d = ci->data;
1216 int ret;
1217 u8 buf[] = {CMD_CI, 0x05, 0x40, addr, 0x00, 1, val};
1218
1219 ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
1220 if (ret)
1221 return ret;
1222
1223 return 0;
1224}
1225
1226static int anysee_ci_slot_reset(struct dvb_ca_en50221 *ci, int slot)
1227{
1228 struct dvb_usb_device *d = ci->data;
1229 int ret;
05cd62e0 1230 struct anysee_state *state = d_to_priv(d);
05cd37de
AP
1231
1232 state->ci_cam_ready = jiffies + msecs_to_jiffies(1000);
1233
1234 ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
1235 if (ret)
1236 return ret;
1237
1238 msleep(300);
1239
1240 ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1241 if (ret)
1242 return ret;
1243
1244 return 0;
1245}
1246
1247static int anysee_ci_slot_shutdown(struct dvb_ca_en50221 *ci, int slot)
1248{
1249 struct dvb_usb_device *d = ci->data;
1250 int ret;
1251
1252 ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
1253 if (ret)
1254 return ret;
1255
1256 msleep(30);
1257
1258 ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1259 if (ret)
1260 return ret;
1261
1262 return 0;
1263}
1264
1265static int anysee_ci_slot_ts_enable(struct dvb_ca_en50221 *ci, int slot)
1266{
1267 struct dvb_usb_device *d = ci->data;
1268 int ret;
1269
1270 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 1), 0x02);
1271 if (ret)
1272 return ret;
1273
1274 return 0;
1275}
1276
1277static int anysee_ci_poll_slot_status(struct dvb_ca_en50221 *ci, int slot,
1278 int open)
1279{
1280 struct dvb_usb_device *d = ci->data;
05cd62e0 1281 struct anysee_state *state = d_to_priv(d);
05cd37de 1282 int ret;
03ad9fe4 1283 u8 tmp = 0;
05cd37de
AP
1284
1285 ret = anysee_rd_reg_mask(d, REG_IOC, &tmp, 0x40);
1286 if (ret)
1287 return ret;
1288
1289 if (tmp == 0) {
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;
1293 }
1294
1295 return ret;
1296}
1297
1298static int anysee_ci_init(struct dvb_usb_device *d)
1299{
05cd62e0 1300 struct anysee_state *state = d_to_priv(d);
05cd37de
AP
1301 int ret;
1302
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;
1312 state->ci.data = d;
1313
1314 ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1315 if (ret)
1316 return ret;
1317
46de20a7
AP
1318 ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 2)|(0 << 1)|(0 << 0), 0x07);
1319 if (ret)
1320 return ret;
1321
1322 ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 2)|(1 << 1)|(1 << 0), 0x07);
1323 if (ret)
1324 return ret;
1325
05cd37de
AP
1326 ret = dvb_ca_en50221_init(&d->adapter[0].dvb_adap, &state->ci, 0, 1);
1327 if (ret)
1328 return ret;
1329
f6068764
AP
1330 state->ci_attached = true;
1331
05cd37de
AP
1332 return 0;
1333}
1334
1335static void anysee_ci_release(struct dvb_usb_device *d)
1336{
05cd62e0 1337 struct anysee_state *state = d_to_priv(d);
05cd37de
AP
1338
1339 /* detach CI */
f6068764 1340 if (state->ci_attached)
05cd37de
AP
1341 dvb_ca_en50221_release(&state->ci);
1342
1343 return;
1344}
1345
1346static int anysee_init(struct dvb_usb_device *d)
1347{
05cd62e0 1348 struct anysee_state *state = d_to_priv(d);
05cd37de
AP
1349 int ret;
1350
a4e7c51e
AP
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);
1356 if (ret)
1357 return ret;
1358
05cd37de
AP
1359 /* LED light */
1360 ret = anysee_led_ctrl(d, 0x01, 0x03);
1361 if (ret)
1362 return ret;
1363
1364 /* enable IR */
1365 ret = anysee_ir_ctrl(d, 1);
1366 if (ret)
1367 return ret;
1368
1369 /* attach CI */
1370 if (state->has_ci) {
1371 ret = anysee_ci_init(d);
f6068764 1372 if (ret)
05cd37de 1373 return ret;
05cd37de
AP
1374 }
1375
1376 return 0;
1377}
1378
831511bd 1379static void anysee_exit(struct dvb_usb_device *d)
05cd37de 1380{
f80f2ae2
AP
1381 struct anysee_state *state = d_to_priv(d);
1382
1383 if (state->i2c_client[0])
1384 anysee_del_i2c_dev(d);
1385
a4e7c51e 1386 return anysee_ci_release(d);
05cd37de
AP
1387}
1388
a4e7c51e
AP
1389/* DVB USB Driver stuff */
1390static 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),
a51e34dd 1395
a4e7c51e
AP
1396 .generic_bulk_ctrl_endpoint = 0x01,
1397 .generic_bulk_ctrl_endpoint_response = 0x81,
a51e34dd 1398
a4e7c51e
AP
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,
831511bd 1407 .exit = anysee_exit,
a51e34dd
AP
1408
1409 .num_adapters = 1,
1410 .adapter = {
1411 {
05cd62e0 1412 .stream = DVB_USB_STREAM_BULK(0x82, 8, 16 * 512),
a51e34dd 1413 }
a51e34dd
AP
1414 }
1415};
1416
a4e7c51e
AP
1417static 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) },
1422 { }
1423};
1424MODULE_DEVICE_TABLE(usb, anysee_id_table);
1425
1426static 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,
04966aa8 1433 .reset_resume = dvb_usbv2_reset_resume,
a4e7c51e
AP
1434 .no_dynamic_id = 1,
1435 .soft_unbind = 1,
a51e34dd
AP
1436};
1437
a4e7c51e 1438module_usb_driver(anysee_usb_driver);
a51e34dd
AP
1439
1440MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1441MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
1442MODULE_LICENSE("GPL");
This page took 0.751005 seconds and 5 git commands to generate.