blob: 5f2278b73ee9c4375cea917d8bc45fd75e9827b7 [file] [log] [blame]
Antti Palosaaria51e34d2008-05-17 23:05:48 -03001/*
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
Antti Palosaari9fdd9ca2008-06-11 11:43:19 -030026 * for ISO 7816 card reader, like dvb_ca_en50221 is implemented. This
27 * module registers serial interface that can be used to communicate
Antti Palosaaria51e34d2008-05-17 23:05:48 -030028 * 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"
Antti Palosaari72ffd2b2011-04-10 20:14:50 -030039#include "tda18212.h"
Antti Palosaarif0a53102011-04-27 21:11:59 -030040#include "cx24116.h"
Antti Palosaaribedbf3d2011-04-29 13:55:02 -030041#include "stv0900.h"
42#include "stv6110.h"
Antti Palosaarif0a53102011-04-27 21:11:59 -030043#include "isl6423.h"
Antti Palosaaria51e34d2008-05-17 23:05:48 -030044
45/* debug */
46static int dvb_usb_anysee_debug;
47module_param_named(debug, dvb_usb_anysee_debug, int, 0644);
48MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
Mauro Carvalho Chehabffbc5f82009-01-05 01:34:20 -030049static int dvb_usb_anysee_delsys;
Antti Palosaari0f77c3a2008-08-11 10:54:16 -030050module_param_named(delsys, dvb_usb_anysee_delsys, int, 0644);
51MODULE_PARM_DESC(delsys, "select delivery mode (0=DVB-C, 1=DVB-T)");
Antti Palosaaria51e34d2008-05-17 23:05:48 -030052DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
53
Akinobu Mitadec0c462008-10-29 21:16:04 -030054static DEFINE_MUTEX(anysee_usb_mutex);
Antti Palosaaria51e34d2008-05-17 23:05:48 -030055
56static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen,
57 u8 *rbuf, u8 rlen)
58{
59 struct anysee_state *state = d->priv;
60 int act_len, ret;
61 u8 buf[64];
62
Antti Palosaaria51e34d2008-05-17 23:05:48 -030063 memcpy(&buf[0], sbuf, slen);
64 buf[60] = state->seq++;
65
66 if (mutex_lock_interruptible(&anysee_usb_mutex) < 0)
67 return -EAGAIN;
68
69 /* We need receive one message more after dvb_usb_generic_rw due
70 to weird transaction flow, which is 1 x send + 2 x receive. */
71 ret = dvb_usb_generic_rw(d, buf, sizeof(buf), buf, sizeof(buf), 0);
72
73 if (!ret) {
74 /* receive 2nd answer */
75 ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
76 d->props.generic_bulk_ctrl_endpoint), buf, sizeof(buf),
77 &act_len, 2000);
78 if (ret)
79 err("%s: recv bulk message failed: %d", __func__, ret);
80 else {
81 deb_xfer("<<< ");
82 debug_dump(buf, act_len, deb_xfer);
83 }
84 }
85
86 /* read request, copy returned data to return buf */
87 if (!ret && rbuf && rlen)
88 memcpy(rbuf, buf, rlen);
89
90 mutex_unlock(&anysee_usb_mutex);
91
92 return ret;
93}
94
95static int anysee_read_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
96{
97 u8 buf[] = {CMD_REG_READ, reg >> 8, reg & 0xff, 0x01};
98 int ret;
99 ret = anysee_ctrl_msg(d, buf, sizeof(buf), val, 1);
100 deb_info("%s: reg:%04x val:%02x\n", __func__, reg, *val);
101 return ret;
102}
103
104static int anysee_write_reg(struct dvb_usb_device *d, u16 reg, u8 val)
105{
106 u8 buf[] = {CMD_REG_WRITE, reg >> 8, reg & 0xff, 0x01, val};
107 deb_info("%s: reg:%04x val:%02x\n", __func__, reg, val);
108 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
109}
110
Antti Palosaari41f81f62011-04-10 17:53:52 -0300111/* write single register with mask */
112static int anysee_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
113 u8 mask)
114{
115 int ret;
116 u8 tmp;
117
118 /* no need for read if whole reg is written */
119 if (mask != 0xff) {
120 ret = anysee_read_reg(d, reg, &tmp);
121 if (ret)
122 return ret;
123
124 val &= mask;
125 tmp &= ~mask;
126 val |= tmp;
127 }
128
129 return anysee_write_reg(d, reg, val);
130}
131
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300132static int anysee_get_hw_info(struct dvb_usb_device *d, u8 *id)
133{
134 u8 buf[] = {CMD_GET_HW_INFO};
135 return anysee_ctrl_msg(d, buf, sizeof(buf), id, 3);
136}
137
138static int anysee_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
139{
140 u8 buf[] = {CMD_STREAMING_CTRL, (u8)onoff, 0x00};
141 deb_info("%s: onoff:%02x\n", __func__, onoff);
142 return anysee_ctrl_msg(adap->dev, buf, sizeof(buf), NULL, 0);
143}
144
145static int anysee_led_ctrl(struct dvb_usb_device *d, u8 mode, u8 interval)
146{
147 u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x01, mode, interval};
148 deb_info("%s: state:%02x interval:%02x\n", __func__, mode, interval);
149 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
150}
151
152static int anysee_ir_ctrl(struct dvb_usb_device *d, u8 onoff)
153{
154 u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x02, onoff};
155 deb_info("%s: onoff:%02x\n", __func__, onoff);
156 return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
157}
158
159static int anysee_init(struct dvb_usb_device *d)
160{
161 int ret;
162 /* LED light */
163 ret = anysee_led_ctrl(d, 0x01, 0x03);
164 if (ret)
165 return ret;
166
167 /* enable IR */
168 ret = anysee_ir_ctrl(d, 1);
169 if (ret)
170 return ret;
171
172 return 0;
173}
174
175/* I2C */
176static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
177 int num)
178{
179 struct dvb_usb_device *d = i2c_get_adapdata(adap);
Mauro Carvalho Chehab902571a2008-12-29 19:02:24 -0300180 int ret = 0, inc, i = 0;
Antti Palosaari21d2e932011-05-24 06:04:08 -0300181 u8 buf[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300182
183 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
184 return -EAGAIN;
185
186 while (i < num) {
187 if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
Antti Palosaari21d2e932011-05-24 06:04:08 -0300188 if (msg[i].len > 2 || msg[i+1].len > 60) {
189 ret = -EOPNOTSUPP;
190 break;
191 }
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300192 buf[0] = CMD_I2C_READ;
Antti Palosaari7ea03d22011-04-09 20:50:07 -0300193 buf[1] = (msg[i].addr << 1) | 0x01;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300194 buf[2] = msg[i].buf[0];
Antti Palosaari882b82c2011-04-12 19:49:25 -0300195 buf[3] = msg[i].buf[1];
196 buf[4] = msg[i].len-1;
Antti Palosaarib3e6a5a2011-04-09 21:00:51 -0300197 buf[5] = msg[i+1].len;
Antti Palosaari21d2e932011-05-24 06:04:08 -0300198 ret = anysee_ctrl_msg(d, buf, 6, msg[i+1].buf,
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300199 msg[i+1].len);
200 inc = 2;
201 } else {
Antti Palosaari21d2e932011-05-24 06:04:08 -0300202 if (msg[i].len > 48) {
203 ret = -EOPNOTSUPP;
204 break;
205 }
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300206 buf[0] = CMD_I2C_WRITE;
Antti Palosaari7ea03d22011-04-09 20:50:07 -0300207 buf[1] = (msg[i].addr << 1);
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300208 buf[2] = msg[i].len;
209 buf[3] = 0x01;
210 memcpy(&buf[4], msg[i].buf, msg[i].len);
Antti Palosaari21d2e932011-05-24 06:04:08 -0300211 ret = anysee_ctrl_msg(d, buf, 4 + msg[i].len, NULL, 0);
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300212 inc = 1;
213 }
214 if (ret)
Antti Palosaarie613f8f2008-08-11 10:36:43 -0300215 break;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300216
217 i += inc;
218 }
219
220 mutex_unlock(&d->i2c_mutex);
221
Antti Palosaarie613f8f2008-08-11 10:36:43 -0300222 return ret ? ret : i;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300223}
224
225static u32 anysee_i2c_func(struct i2c_adapter *adapter)
226{
227 return I2C_FUNC_I2C;
228}
229
230static struct i2c_algorithm anysee_i2c_algo = {
231 .master_xfer = anysee_master_xfer,
232 .functionality = anysee_i2c_func,
233};
234
235static int anysee_mt352_demod_init(struct dvb_frontend *fe)
236{
Antti Palosaariae3745f2009-09-16 19:50:25 -0300237 static u8 clock_config[] = { CLOCK_CTL, 0x38, 0x28 };
238 static u8 reset[] = { RESET, 0x80 };
239 static u8 adc_ctl_1_cfg[] = { ADC_CTL_1, 0x40 };
240 static u8 agc_cfg[] = { AGC_TARGET, 0x28, 0x20 };
241 static u8 gpp_ctl_cfg[] = { GPP_CTL, 0x33 };
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300242 static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
243
244 mt352_write(fe, clock_config, sizeof(clock_config));
245 udelay(200);
246 mt352_write(fe, reset, sizeof(reset));
247 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
248
249 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
250 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
251 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
252
253 return 0;
254}
255
256/* Callbacks for DVB USB */
257static struct tda10023_config anysee_tda10023_config = {
Antti Palosaari7ea03d22011-04-09 20:50:07 -0300258 .demod_address = (0x1a >> 1),
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300259 .invert = 0,
260 .xtal = 16000000,
261 .pll_m = 11,
262 .pll_p = 3,
263 .pll_n = 1,
Antti Palosaari5ae2fca2008-06-09 22:58:22 -0300264 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
265 .deltaf = 0xfeeb,
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300266};
267
268static struct mt352_config anysee_mt352_config = {
Antti Palosaari7ea03d22011-04-09 20:50:07 -0300269 .demod_address = (0x1e >> 1),
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300270 .demod_init = anysee_mt352_demod_init,
271};
272
273static struct zl10353_config anysee_zl10353_config = {
Antti Palosaari7ea03d22011-04-09 20:50:07 -0300274 .demod_address = (0x1e >> 1),
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300275 .parallel_ts = 1,
276};
277
Antti Palosaari1fd80702011-04-12 17:34:08 -0300278static struct zl10353_config anysee_zl10353_tda18212_config2 = {
279 .demod_address = (0x1e >> 1),
280 .parallel_ts = 1,
281 .disable_i2c_gate_ctrl = 1,
282 .no_tuner = 1,
283 .if2 = 41500,
284};
285
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300286static struct zl10353_config anysee_zl10353_tda18212_config = {
287 .demod_address = (0x18 >> 1),
288 .parallel_ts = 1,
289 .disable_i2c_gate_ctrl = 1,
290 .no_tuner = 1,
291 .if2 = 41500,
292};
293
294static struct tda10023_config anysee_tda10023_tda18212_config = {
295 .demod_address = (0x1a >> 1),
296 .xtal = 16000000,
297 .pll_m = 12,
298 .pll_p = 3,
299 .pll_n = 1,
300 .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
301 .deltaf = 0xba02,
302};
303
304static struct tda18212_config anysee_tda18212_config = {
305 .i2c_address = (0xc0 >> 1),
306 .if_dvbt_6 = 4150,
307 .if_dvbt_7 = 4150,
308 .if_dvbt_8 = 4150,
309 .if_dvbc = 5000,
310};
311
Antti Palosaarif0a53102011-04-27 21:11:59 -0300312static struct cx24116_config anysee_cx24116_config = {
313 .demod_address = (0xaa >> 1),
314 .mpg_clk_pos_pol = 0x00,
315 .i2c_wr_max = 48,
316};
317
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300318static struct stv0900_config anysee_stv0900_config = {
319 .demod_address = (0xd0 >> 1),
320 .demod_mode = 0,
321 .xtal = 8000000,
322 .clkmode = 3,
323 .diseqc_mode = 2,
324 .tun1_maddress = 0,
325 .tun1_adc = 1, /* 1 Vpp */
326 .path1_mode = 3,
327};
328
329static struct stv6110_config anysee_stv6110_config = {
330 .i2c_address = (0xc0 >> 1),
331 .mclk = 16000000,
332 .clk_div = 1,
333};
334
Antti Palosaarif0a53102011-04-27 21:11:59 -0300335static struct isl6423_config anysee_isl6423_config = {
336 .current_max = SEC_CURRENT_800m,
337 .curlim = SEC_CURRENT_LIM_OFF,
338 .mod_extern = 1,
339 .addr = (0x10 >> 1),
340};
341
Antti Palosaari41f81f62011-04-10 17:53:52 -0300342/*
343 * New USB device strings: Mfr=1, Product=2, SerialNumber=0
344 * Manufacturer: AMT.CO.KR
345 *
346 * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
347 * PCB: ?
Antti Palosaari70fc26f2011-04-12 20:17:11 -0300348 * parts: DNOS404ZH102A(MT352, DTT7579(?))
Antti Palosaari41f81f62011-04-10 17:53:52 -0300349 *
Antti Palosaari05c46c02011-05-25 18:30:09 -0300350 * E30 VID=04b4 PID=861f HW=2 FW=2.1 "anysee-T(LP)"
351 * PCB: PCB 507T (rev1.61)
Antti Palosaari70fc26f2011-04-12 20:17:11 -0300352 * parts: DNOS404ZH103A(ZL10353, DTT7579(?))
Antti Palosaari05c46c02011-05-25 18:30:09 -0300353 * OEA=0a OEB=00 OEC=00 OED=ff OEE=00
354 * IOA=45 IOB=ff IOC=00 IOD=ff IOE=00
Antti Palosaari41f81f62011-04-10 17:53:52 -0300355 *
356 * E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee"
357 * PCB: 507CD (rev1.1)
Antti Palosaari70fc26f2011-04-12 20:17:11 -0300358 * parts: DNOS404ZH103A(ZL10353, DTT7579(?)), CST56I01
Antti Palosaari05c46c02011-05-25 18:30:09 -0300359 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
360 * IOA=4f IOB=ff IOC=00 IOD=06 IOE=01
Antti Palosaari41f81f62011-04-10 17:53:52 -0300361 * IOD[0] ZL10353 1=enabled
362 * IOA[7] TS 0=enabled
363 * tuner is not behind ZL10353 I2C-gate (no care if gate disabled or not)
364 *
365 * E30 C Plus VID=04b4 PID=861f HW=10 FW=1.0 "anysee-DC(LP)"
366 * PCB: 507DC (rev0.2)
Antti Palosaari70fc26f2011-04-12 20:17:11 -0300367 * parts: TDA10023, DTOS403IH102B TM, CST56I01
Antti Palosaari05c46c02011-05-25 18:30:09 -0300368 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
369 * IOA=4f IOB=ff IOC=00 IOD=26 IOE=01
Antti Palosaari41f81f62011-04-10 17:53:52 -0300370 * IOD[0] TDA10023 1=enabled
371 *
Antti Palosaarif0a53102011-04-27 21:11:59 -0300372 * E30 S2 Plus VID=04b4 PID=861f HW=11 FW=0.1 "anysee-S2(LP)"
373 * PCB: 507SI (rev2.1)
374 * parts: BS2N10WCC01(CX24116, CX24118), ISL6423, TDA8024
Antti Palosaari05c46c02011-05-25 18:30:09 -0300375 * OEA=80 OEB=00 OEC=ff OED=ff OEE=fe
376 * IOA=4d IOB=ff IOC=00 IOD=26 IOE=01
Antti Palosaarif0a53102011-04-27 21:11:59 -0300377 * IOD[0] CX24116 1=enabled
378 *
Antti Palosaari41f81f62011-04-10 17:53:52 -0300379 * E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
380 * PCB: 507FA (rev0.4)
Antti Palosaari70fc26f2011-04-12 20:17:11 -0300381 * parts: TDA10023, DTOS403IH102B TM, TDA8024
Antti Palosaari05c46c02011-05-25 18:30:09 -0300382 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
383 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
Antti Palosaari41f81f62011-04-10 17:53:52 -0300384 * IOD[5] TDA10023 1=enabled
385 * IOE[0] tuner 1=enabled
386 *
387 * E30 Combo Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
388 * PCB: 507FA (rev1.1)
Antti Palosaari70fc26f2011-04-12 20:17:11 -0300389 * parts: ZL10353, TDA10023, DTOS403IH102B TM, TDA8024
Antti Palosaari05c46c02011-05-25 18:30:09 -0300390 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
391 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
Antti Palosaari41f81f62011-04-10 17:53:52 -0300392 * DVB-C:
393 * IOD[5] TDA10023 1=enabled
394 * IOE[0] tuner 1=enabled
395 * DVB-T:
396 * IOD[0] ZL10353 1=enabled
397 * IOE[0] tuner 0=enabled
398 * tuner is behind ZL10353 I2C-gate
Antti Palosaari70fc26f2011-04-12 20:17:11 -0300399 *
400 * E7 TC VID=1c73 PID=861f HW=18 FW=0.7 AMTCI=0.5 "anysee-E7TC(LP)"
401 * PCB: 508TC (rev0.6)
402 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
Antti Palosaari05c46c02011-05-25 18:30:09 -0300403 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
404 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
Antti Palosaari70fc26f2011-04-12 20:17:11 -0300405 * IOA[7] TS 1=enabled
406 * IOE[4] TDA18212 1=enabled
407 * DVB-C:
408 * IOD[6] ZL10353 0=disabled
409 * IOD[5] TDA10023 1=enabled
410 * IOE[0] IF 1=enabled
411 * DVB-T:
412 * IOD[5] TDA10023 0=disabled
413 * IOD[6] ZL10353 1=enabled
414 * IOE[0] IF 0=enabled
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300415 *
416 * E7 S2 VID=1c73 PID=861f HW=19 FW=0.4 AMTCI=0.5 "anysee-E7S2(LP)"
417 * PCB: 508S2 (rev0.7)
418 * parts: DNBU10512IST(STV0903, STV6110), ISL6423
Antti Palosaari05c46c02011-05-25 18:30:09 -0300419 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
420 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300421 * IOA[7] TS 1=enabled
422 * IOE[5] STV0903 1=enabled
423 *
Antti Palosaari8439e0d2011-05-24 07:57:34 -0300424 * E7 PTC VID=1c73 PID=861f HW=21 FW=0.1 AMTCI=?? "anysee-E7PTC(LP)"
425 * PCB: 508PTC (rev0.5)
426 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
427 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
428 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
429 * IOA[7] TS 1=enabled
430 * IOE[4] TDA18212 1=enabled
431 * DVB-C:
432 * IOD[6] ZL10353 0=disabled
433 * IOD[5] TDA10023 1=enabled
434 * IOE[0] IF 1=enabled
435 * DVB-T:
436 * IOD[5] TDA10023 0=disabled
437 * IOD[6] ZL10353 1=enabled
438 * IOE[0] IF 0=enabled
Antti Palosaarifea3c392011-05-25 18:21:43 -0300439 *
440 * E7 S2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
441 * PCB: 508PS2 (rev0.4)
442 * parts: DNBU10512IST(STV0903, STV6110), ISL6423
443 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
444 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
445 * IOA[7] TS 1=enabled
446 * IOE[5] STV0903 1=enabled
Antti Palosaari41f81f62011-04-10 17:53:52 -0300447 */
448
Antti Palosaari449d1a02011-07-25 20:25:21 -0300449static int anysee_frontend_ctrl(struct dvb_frontend *fe, int onoff)
450{
451 struct dvb_usb_adapter *adap = fe->dvb->priv;
452 struct anysee_state *state = adap->dev->priv;
453 int ret;
454
455 deb_info("%s: fe=%d onoff=%d\n", __func__, fe->id, onoff);
456
457 /* no frontend sleep control */
458 if (onoff == 0)
459 return 0;
460
461 switch (state->hw) {
462 case ANYSEE_HW_507FA: /* 15 */
463 /* E30 Combo Plus */
464 /* E30 C Plus */
465
466 if ((fe->id ^ dvb_usb_anysee_delsys) == 0) {
467 /* disable DVB-T demod on IOD[0] */
468 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
469 0x01);
470 if (ret)
471 goto error;
472
473 /* enable DVB-C demod on IOD[5] */
474 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
475 0x20);
476 if (ret)
477 goto error;
478
479 /* enable DVB-C tuner on IOE[0] */
480 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
481 0x01);
482 if (ret)
483 goto error;
484 } else {
485 /* disable DVB-C demod on IOD[5] */
486 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
487 0x20);
488 if (ret)
489 goto error;
490
491 /* enable DVB-T demod on IOD[0] */
492 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
493 0x01);
494 if (ret)
495 goto error;
496
497 /* enable DVB-T tuner on IOE[0] */
498 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
499 0x01);
500 if (ret)
501 goto error;
502 }
503
504 break;
505 case ANYSEE_HW_508TC: /* 18 */
506 case ANYSEE_HW_508PTC: /* 21 */
507 /* E7 TC */
508 /* E7 PTC */
509
510 if ((fe->id ^ dvb_usb_anysee_delsys) == 0) {
511 /* disable DVB-T demod on IOD[6] */
512 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
513 0x40);
514 if (ret)
515 goto error;
516
517 /* enable DVB-C demod on IOD[5] */
518 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
519 0x20);
520 if (ret)
521 goto error;
522
523 /* enable IF route on IOE[0] */
524 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
525 0x01);
526 if (ret)
527 goto error;
528 } else {
529 /* disable DVB-C demod on IOD[5] */
530 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
531 0x20);
532 if (ret)
533 goto error;
534
535 /* enable DVB-T demod on IOD[6] */
536 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
537 0x40);
538 if (ret)
539 goto error;
540
541 /* enable IF route on IOE[0] */
542 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
543 0x01);
544 if (ret)
545 goto error;
546 }
547
548 break;
549 default:
550 ret = 0;
551 }
552
553error:
554 return ret;
555}
556
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300557static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
558{
559 int ret;
560 struct anysee_state *state = adap->dev->priv;
561 u8 hw_info[3];
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300562 u8 tmp;
563 struct i2c_msg msg[2] = {
564 {
565 .addr = anysee_tda18212_config.i2c_address,
566 .flags = 0,
567 .len = 1,
568 .buf = "\x00",
569 }, {
570 .addr = anysee_tda18212_config.i2c_address,
571 .flags = I2C_M_RD,
572 .len = 1,
573 .buf = &tmp,
574 }
575 };
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300576
Antti Palosaari449d1a02011-07-25 20:25:21 -0300577 /* detect hardware only once */
Michael Krufky77eed212011-09-06 09:31:57 -0300578 if (adap->fe_adap[0].fe == NULL) {
Antti Palosaari449d1a02011-07-25 20:25:21 -0300579 /* Check which hardware we have.
580 * We must do this call two times to get reliable values (hw bug).
581 */
582 ret = anysee_get_hw_info(adap->dev, hw_info);
583 if (ret)
584 goto error;
Antti Palosaari41f81f62011-04-10 17:53:52 -0300585
Antti Palosaari449d1a02011-07-25 20:25:21 -0300586 ret = anysee_get_hw_info(adap->dev, hw_info);
587 if (ret)
588 goto error;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300589
Antti Palosaari449d1a02011-07-25 20:25:21 -0300590 /* Meaning of these info bytes are guessed. */
591 info("firmware version:%d.%d hardware id:%d",
592 hw_info[1], hw_info[2], hw_info[0]);
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300593
Antti Palosaari449d1a02011-07-25 20:25:21 -0300594 state->hw = hw_info[0];
595 }
596
597 /* set current frondend ID for devices having two frondends */
Michael Krufky77eed212011-09-06 09:31:57 -0300598 if (adap->fe_adap[0].fe)
Antti Palosaari449d1a02011-07-25 20:25:21 -0300599 state->fe_id++;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300600
Antti Palosaari41f81f62011-04-10 17:53:52 -0300601 switch (state->hw) {
Antti Palosaari05c46c02011-05-25 18:30:09 -0300602 case ANYSEE_HW_507T: /* 2 */
Antti Palosaari41f81f62011-04-10 17:53:52 -0300603 /* E30 */
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300604
Antti Palosaari449d1a02011-07-25 20:25:21 -0300605 if (state->fe_id)
606 break;
607
Antti Palosaari41f81f62011-04-10 17:53:52 -0300608 /* attach demod */
Michael Krufky77eed212011-09-06 09:31:57 -0300609 adap->fe_adap[0].fe = dvb_attach(mt352_attach, &anysee_mt352_config,
Antti Palosaari41f81f62011-04-10 17:53:52 -0300610 &adap->dev->i2c_adap);
Michael Krufky77eed212011-09-06 09:31:57 -0300611 if (adap->fe_adap[0].fe)
Antti Palosaari41f81f62011-04-10 17:53:52 -0300612 break;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300613
Antti Palosaari41f81f62011-04-10 17:53:52 -0300614 /* attach demod */
Michael Krufky77eed212011-09-06 09:31:57 -0300615 adap->fe_adap[0].fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
Antti Palosaari41f81f62011-04-10 17:53:52 -0300616 &adap->dev->i2c_adap);
Antti Palosaari41f81f62011-04-10 17:53:52 -0300617
618 break;
619 case ANYSEE_HW_507CD: /* 6 */
620 /* E30 Plus */
621
Antti Palosaari449d1a02011-07-25 20:25:21 -0300622 if (state->fe_id)
623 break;
624
Antti Palosaari41f81f62011-04-10 17:53:52 -0300625 /* enable DVB-T demod on IOD[0] */
626 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
627 if (ret)
628 goto error;
629
630 /* enable transport stream on IOA[7] */
631 ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (0 << 7), 0x80);
632 if (ret)
633 goto error;
634
635 /* attach demod */
Michael Krufky77eed212011-09-06 09:31:57 -0300636 adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
Antti Palosaari449d1a02011-07-25 20:25:21 -0300637 &anysee_zl10353_config, &adap->dev->i2c_adap);
Antti Palosaari41f81f62011-04-10 17:53:52 -0300638
639 break;
640 case ANYSEE_HW_507DC: /* 10 */
641 /* E30 C Plus */
642
Antti Palosaari449d1a02011-07-25 20:25:21 -0300643 if (state->fe_id)
644 break;
645
Antti Palosaari41f81f62011-04-10 17:53:52 -0300646 /* enable DVB-C demod on IOD[0] */
647 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
648 if (ret)
649 goto error;
650
651 /* attach demod */
Michael Krufky77eed212011-09-06 09:31:57 -0300652 adap->fe_adap[0].fe = dvb_attach(tda10023_attach,
Antti Palosaari449d1a02011-07-25 20:25:21 -0300653 &anysee_tda10023_config, &adap->dev->i2c_adap, 0x48);
Antti Palosaari41f81f62011-04-10 17:53:52 -0300654
655 break;
Antti Palosaarif0a53102011-04-27 21:11:59 -0300656 case ANYSEE_HW_507SI: /* 11 */
657 /* E30 S2 Plus */
658
Antti Palosaari449d1a02011-07-25 20:25:21 -0300659 if (state->fe_id)
660 break;
661
Antti Palosaarif0a53102011-04-27 21:11:59 -0300662 /* enable DVB-S/S2 demod on IOD[0] */
663 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
664 if (ret)
665 goto error;
666
667 /* attach demod */
Michael Krufky77eed212011-09-06 09:31:57 -0300668 adap->fe_adap[0].fe = dvb_attach(cx24116_attach, &anysee_cx24116_config,
Antti Palosaarif0a53102011-04-27 21:11:59 -0300669 &adap->dev->i2c_adap);
670
671 break;
Antti Palosaari41f81f62011-04-10 17:53:52 -0300672 case ANYSEE_HW_507FA: /* 15 */
673 /* E30 Combo Plus */
674 /* E30 C Plus */
675
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300676 /* enable tuner on IOE[4] */
677 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
678 if (ret)
679 goto error;
680
681 /* probe TDA18212 */
682 tmp = 0;
683 ret = i2c_transfer(&adap->dev->i2c_adap, msg, 2);
684 if (ret == 2 && tmp == 0xc7)
685 deb_info("%s: TDA18212 found\n", __func__);
686 else
687 tmp = 0;
688
689 /* disable tuner on IOE[4] */
690 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
691 if (ret)
692 goto error;
693
Antti Palosaari449d1a02011-07-25 20:25:21 -0300694 if ((state->fe_id ^ dvb_usb_anysee_delsys) == 0) {
Antti Palosaari41f81f62011-04-10 17:53:52 -0300695 /* disable DVB-T demod on IOD[0] */
696 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
697 0x01);
698 if (ret)
699 goto error;
700
701 /* enable DVB-C demod on IOD[5] */
702 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
703 0x20);
704 if (ret)
705 goto error;
706
707 /* attach demod */
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300708 if (tmp == 0xc7) {
709 /* TDA18212 config */
Michael Krufky77eed212011-09-06 09:31:57 -0300710 adap->fe_adap[state->fe_id].fe = dvb_attach(
Antti Palosaari449d1a02011-07-25 20:25:21 -0300711 tda10023_attach,
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300712 &anysee_tda10023_tda18212_config,
713 &adap->dev->i2c_adap, 0x48);
714 } else {
715 /* PLL config */
Michael Krufky77eed212011-09-06 09:31:57 -0300716 adap->fe_adap[state->fe_id].fe = dvb_attach(
Antti Palosaari449d1a02011-07-25 20:25:21 -0300717 tda10023_attach,
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300718 &anysee_tda10023_config,
719 &adap->dev->i2c_adap, 0x48);
720 }
Antti Palosaari449d1a02011-07-25 20:25:21 -0300721 } else {
722 /* disable DVB-C demod on IOD[5] */
723 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
724 0x20);
725 if (ret)
726 goto error;
727
728 /* enable DVB-T demod on IOD[0] */
729 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
730 0x01);
731 if (ret)
732 goto error;
733
734 /* attach demod */
735 if (tmp == 0xc7) {
736 /* TDA18212 config */
Michael Krufky77eed212011-09-06 09:31:57 -0300737 adap->fe_adap[state->fe_id].fe = dvb_attach(
Antti Palosaari449d1a02011-07-25 20:25:21 -0300738 zl10353_attach,
739 &anysee_zl10353_tda18212_config2,
740 &adap->dev->i2c_adap);
741 } else {
742 /* PLL config */
Michael Krufky77eed212011-09-06 09:31:57 -0300743 adap->fe_adap[state->fe_id].fe = dvb_attach(
Antti Palosaari449d1a02011-07-25 20:25:21 -0300744 zl10353_attach,
745 &anysee_zl10353_config,
746 &adap->dev->i2c_adap);
747 }
Antti Palosaari0f77c3a2008-08-11 10:54:16 -0300748 }
Antti Palosaarie82eea72011-04-12 19:43:30 -0300749
Antti Palosaari41f81f62011-04-10 17:53:52 -0300750 break;
Antti Palosaaria43be982011-04-10 20:23:02 -0300751 case ANYSEE_HW_508TC: /* 18 */
Antti Palosaari8439e0d2011-05-24 07:57:34 -0300752 case ANYSEE_HW_508PTC: /* 21 */
Antti Palosaaria43be982011-04-10 20:23:02 -0300753 /* E7 TC */
Antti Palosaari8439e0d2011-05-24 07:57:34 -0300754 /* E7 PTC */
Antti Palosaaria43be982011-04-10 20:23:02 -0300755
756 /* enable transport stream on IOA[7] */
757 ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
758 if (ret)
759 goto error;
760
Antti Palosaari449d1a02011-07-25 20:25:21 -0300761 if ((state->fe_id ^ dvb_usb_anysee_delsys) == 0) {
Antti Palosaaria43be982011-04-10 20:23:02 -0300762 /* disable DVB-T demod on IOD[6] */
763 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
764 0x40);
765 if (ret)
766 goto error;
767
768 /* enable DVB-C demod on IOD[5] */
769 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
770 0x20);
771 if (ret)
772 goto error;
773
Antti Palosaari449d1a02011-07-25 20:25:21 -0300774 /* attach demod */
Michael Krufky77eed212011-09-06 09:31:57 -0300775 adap->fe_adap[state->fe_id].fe = dvb_attach(tda10023_attach,
Antti Palosaari449d1a02011-07-25 20:25:21 -0300776 &anysee_tda10023_tda18212_config,
777 &adap->dev->i2c_adap, 0x48);
778 } else {
779 /* disable DVB-C demod on IOD[5] */
780 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
781 0x20);
782 if (ret)
783 goto error;
784
785 /* enable DVB-T demod on IOD[6] */
786 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
787 0x40);
Antti Palosaaria43be982011-04-10 20:23:02 -0300788 if (ret)
789 goto error;
790
791 /* attach demod */
Michael Krufky77eed212011-09-06 09:31:57 -0300792 adap->fe_adap[state->fe_id].fe = dvb_attach(zl10353_attach,
Antti Palosaari449d1a02011-07-25 20:25:21 -0300793 &anysee_zl10353_tda18212_config,
794 &adap->dev->i2c_adap);
Antti Palosaaria43be982011-04-10 20:23:02 -0300795 }
Antti Palosaarie82eea72011-04-12 19:43:30 -0300796
Antti Palosaaria43be982011-04-10 20:23:02 -0300797 break;
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300798 case ANYSEE_HW_508S2: /* 19 */
Antti Palosaarifea3c392011-05-25 18:21:43 -0300799 case ANYSEE_HW_508PS2: /* 22 */
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300800 /* E7 S2 */
Antti Palosaarifea3c392011-05-25 18:21:43 -0300801 /* E7 PS2 */
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300802
Antti Palosaari449d1a02011-07-25 20:25:21 -0300803 if (state->fe_id)
804 break;
805
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300806 /* enable transport stream on IOA[7] */
807 ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
808 if (ret)
809 goto error;
810
811 /* enable DVB-S/S2 demod on IOE[5] */
812 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
813 if (ret)
814 goto error;
815
816 /* attach demod */
Michael Krufky77eed212011-09-06 09:31:57 -0300817 adap->fe_adap[0].fe = dvb_attach(stv0900_attach, &anysee_stv0900_config,
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300818 &adap->dev->i2c_adap, 0);
819
820 break;
Antti Palosaari0f77c3a2008-08-11 10:54:16 -0300821 }
822
Michael Krufky77eed212011-09-06 09:31:57 -0300823 if (!adap->fe_adap[0].fe) {
Antti Palosaari41f81f62011-04-10 17:53:52 -0300824 /* we have no frontend :-( */
825 ret = -ENODEV;
Antti Palosaarie82eea72011-04-12 19:43:30 -0300826 err("Unsupported Anysee version. " \
827 "Please report the <linux-media@vger.kernel.org>.");
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300828 }
Antti Palosaari41f81f62011-04-10 17:53:52 -0300829error:
830 return ret;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300831}
832
833static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
834{
835 struct anysee_state *state = adap->dev->priv;
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300836 struct dvb_frontend *fe;
Antti Palosaarie82eea72011-04-12 19:43:30 -0300837 int ret;
Antti Palosaari449d1a02011-07-25 20:25:21 -0300838 deb_info("%s: fe=%d\n", __func__, state->fe_id);
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300839
Antti Palosaari41f81f62011-04-10 17:53:52 -0300840 switch (state->hw) {
Antti Palosaari05c46c02011-05-25 18:30:09 -0300841 case ANYSEE_HW_507T: /* 2 */
Antti Palosaari41f81f62011-04-10 17:53:52 -0300842 /* E30 */
843
844 /* attach tuner */
Michael Krufky77eed212011-09-06 09:31:57 -0300845 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc2 >> 1),
Antti Palosaari7ea03d22011-04-09 20:50:07 -0300846 NULL, DVB_PLL_THOMSON_DTT7579);
Antti Palosaarie82eea72011-04-12 19:43:30 -0300847
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300848 break;
Antti Palosaari41f81f62011-04-10 17:53:52 -0300849 case ANYSEE_HW_507CD: /* 6 */
850 /* E30 Plus */
851
852 /* attach tuner */
Michael Krufky77eed212011-09-06 09:31:57 -0300853 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc2 >> 1),
Antti Palosaari41f81f62011-04-10 17:53:52 -0300854 &adap->dev->i2c_adap, DVB_PLL_THOMSON_DTT7579);
855
856 break;
857 case ANYSEE_HW_507DC: /* 10 */
858 /* E30 C Plus */
859
860 /* attach tuner */
Michael Krufky77eed212011-09-06 09:31:57 -0300861 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc0 >> 1),
Antti Palosaari7ea03d22011-04-09 20:50:07 -0300862 &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
Antti Palosaarie82eea72011-04-12 19:43:30 -0300863
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300864 break;
Antti Palosaarif0a53102011-04-27 21:11:59 -0300865 case ANYSEE_HW_507SI: /* 11 */
866 /* E30 S2 Plus */
867
868 /* attach LNB controller */
Michael Krufky77eed212011-09-06 09:31:57 -0300869 fe = dvb_attach(isl6423_attach, adap->fe_adap[0].fe,
Antti Palosaari449d1a02011-07-25 20:25:21 -0300870 &adap->dev->i2c_adap, &anysee_isl6423_config);
Antti Palosaarif0a53102011-04-27 21:11:59 -0300871
872 break;
Antti Palosaari41f81f62011-04-10 17:53:52 -0300873 case ANYSEE_HW_507FA: /* 15 */
874 /* E30 Combo Plus */
875 /* E30 C Plus */
876
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300877 /* Try first attach TDA18212 silicon tuner on IOE[4], if that
878 * fails attach old simple PLL. */
879
880 /* enable tuner on IOE[4] */
881 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
882 if (ret)
883 goto error;
884
885 /* attach tuner */
Michael Krufky77eed212011-09-06 09:31:57 -0300886 fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
Antti Palosaari449d1a02011-07-25 20:25:21 -0300887 &adap->dev->i2c_adap, &anysee_tda18212_config);
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300888 if (fe)
889 break;
890
891 /* disable tuner on IOE[4] */
892 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
893 if (ret)
894 goto error;
895
Antti Palosaari41f81f62011-04-10 17:53:52 -0300896 /* attach tuner */
Michael Krufky77eed212011-09-06 09:31:57 -0300897 fe = dvb_attach(dvb_pll_attach, adap->fe_adap[state->fe_id].fe,
Antti Palosaari449d1a02011-07-25 20:25:21 -0300898 (0xc0 >> 1), &adap->dev->i2c_adap,
899 DVB_PLL_SAMSUNG_DTOS403IH102A);
Antti Palosaari41f81f62011-04-10 17:53:52 -0300900
901 break;
Antti Palosaaria43be982011-04-10 20:23:02 -0300902 case ANYSEE_HW_508TC: /* 18 */
Antti Palosaari8439e0d2011-05-24 07:57:34 -0300903 case ANYSEE_HW_508PTC: /* 21 */
Antti Palosaaria43be982011-04-10 20:23:02 -0300904 /* E7 TC */
Antti Palosaari8439e0d2011-05-24 07:57:34 -0300905 /* E7 PTC */
Antti Palosaaria43be982011-04-10 20:23:02 -0300906
907 /* enable tuner on IOE[4] */
908 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
909 if (ret)
910 goto error;
911
912 /* attach tuner */
Michael Krufky77eed212011-09-06 09:31:57 -0300913 fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
Antti Palosaari449d1a02011-07-25 20:25:21 -0300914 &adap->dev->i2c_adap, &anysee_tda18212_config);
Antti Palosaaria43be982011-04-10 20:23:02 -0300915
916 break;
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300917 case ANYSEE_HW_508S2: /* 19 */
Antti Palosaarifea3c392011-05-25 18:21:43 -0300918 case ANYSEE_HW_508PS2: /* 22 */
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300919 /* E7 S2 */
Antti Palosaarifea3c392011-05-25 18:21:43 -0300920 /* E7 PS2 */
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300921
922 /* attach tuner */
Michael Krufky77eed212011-09-06 09:31:57 -0300923 fe = dvb_attach(stv6110_attach, adap->fe_adap[0].fe,
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300924 &anysee_stv6110_config, &adap->dev->i2c_adap);
925
926 if (fe) {
927 /* attach LNB controller */
Michael Krufky77eed212011-09-06 09:31:57 -0300928 fe = dvb_attach(isl6423_attach, adap->fe_adap[0].fe,
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300929 &adap->dev->i2c_adap, &anysee_isl6423_config);
930 }
931
932 break;
Antti Palosaari41f81f62011-04-10 17:53:52 -0300933 default:
Antti Palosaarie82eea72011-04-12 19:43:30 -0300934 fe = NULL;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300935 }
936
Antti Palosaarie82eea72011-04-12 19:43:30 -0300937 if (fe)
938 ret = 0;
939 else
940 ret = -ENODEV;
941
Antti Palosaari41f81f62011-04-10 17:53:52 -0300942error:
943 return ret;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300944}
945
Antti Palosaaria8494682010-10-17 18:25:10 -0300946static int anysee_rc_query(struct dvb_usb_device *d)
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300947{
948 u8 buf[] = {CMD_GET_IR_CODE};
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300949 u8 ircode[2];
Antti Palosaaria8494682010-10-17 18:25:10 -0300950 int ret;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300951
Antti Palosaaria8494682010-10-17 18:25:10 -0300952 /* Remote controller is basic NEC using address byte 0x08.
953 Anysee device RC query returns only two bytes, status and code,
954 address byte is dropped. Also it does not return any value for
955 NEC RCs having address byte other than 0x08. Due to that, we
956 cannot use that device as standard NEC receiver.
957 It could be possible make hack which reads whole code directly
958 from device memory... */
959
960 ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode));
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300961 if (ret)
962 return ret;
963
Antti Palosaaria8494682010-10-17 18:25:10 -0300964 if (ircode[0]) {
965 deb_rc("%s: key pressed %02x\n", __func__, ircode[1]);
Mauro Carvalho Chehabca866742010-11-17 13:53:11 -0300966 rc_keydown(d->rc_dev, 0x08 << 8 | ircode[1], 0);
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300967 }
Antti Palosaaria8494682010-10-17 18:25:10 -0300968
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300969 return 0;
970}
971
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300972/* DVB USB Driver stuff */
973static struct dvb_usb_device_properties anysee_properties;
974
975static int anysee_probe(struct usb_interface *intf,
976 const struct usb_device_id *id)
977{
978 struct dvb_usb_device *d;
979 struct usb_host_interface *alt;
980 int ret;
981
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300982 /* There is one interface with two alternate settings.
983 Alternate setting 0 is for bulk transfer.
984 Alternate setting 1 is for isochronous transfer.
985 We use bulk transfer (alternate setting 0). */
986 if (intf->num_altsetting < 1)
987 return -ENODEV;
988
Dan Carpenter8b0d7042010-05-31 16:27:39 -0300989 /*
990 * Anysee is always warm (its USB-bridge, Cypress FX2, uploads
991 * firmware from eeprom). If dvb_usb_device_init() succeeds that
992 * means d is a valid pointer.
993 */
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300994 ret = dvb_usb_device_init(intf, &anysee_properties, THIS_MODULE, &d,
995 adapter_nr);
996 if (ret)
997 return ret;
998
999 alt = usb_altnum_to_altsetting(intf, 0);
1000 if (alt == NULL) {
1001 deb_info("%s: no alt found!\n", __func__);
1002 return -ENODEV;
1003 }
1004
1005 ret = usb_set_interface(d->udev, alt->desc.bInterfaceNumber,
1006 alt->desc.bAlternateSetting);
1007 if (ret)
1008 return ret;
1009
Dan Carpenter8b0d7042010-05-31 16:27:39 -03001010 return anysee_init(d);
Antti Palosaaria51e34d2008-05-17 23:05:48 -03001011}
1012
Antti Palosaariae3745f2009-09-16 19:50:25 -03001013static struct usb_device_id anysee_table[] = {
Antti Palosaaria51e34d2008-05-17 23:05:48 -03001014 { USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE) },
1015 { USB_DEVICE(USB_VID_AMT, USB_PID_ANYSEE) },
1016 { } /* Terminating entry */
1017};
1018MODULE_DEVICE_TABLE(usb, anysee_table);
1019
1020static struct dvb_usb_device_properties anysee_properties = {
1021 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1022
1023 .usb_ctrl = DEVICE_SPECIFIC,
1024
1025 .size_of_priv = sizeof(struct anysee_state),
1026
1027 .num_adapters = 1,
1028 .adapter = {
1029 {
Michael Krufky77eed212011-09-06 09:31:57 -03001030 .num_frontends = 2,
1031 .frontend_ctrl = anysee_frontend_ctrl,
1032 .fe = {{
Antti Palosaaria51e34d2008-05-17 23:05:48 -03001033 .streaming_ctrl = anysee_streaming_ctrl,
1034 .frontend_attach = anysee_frontend_attach,
1035 .tuner_attach = anysee_tuner_attach,
1036 .stream = {
1037 .type = USB_BULK,
1038 .count = 8,
1039 .endpoint = 0x82,
1040 .u = {
1041 .bulk = {
Antti Palosaariab693332009-09-16 19:47:01 -03001042 .buffersize = (16*512),
Antti Palosaaria51e34d2008-05-17 23:05:48 -03001043 }
1044 }
1045 },
Michael Krufky77eed212011-09-06 09:31:57 -03001046 }, {
1047 .streaming_ctrl = anysee_streaming_ctrl,
1048 .frontend_attach = anysee_frontend_attach,
1049 .tuner_attach = anysee_tuner_attach,
1050 .stream = {
1051 .type = USB_BULK,
1052 .count = 8,
1053 .endpoint = 0x82,
1054 .u = {
1055 .bulk = {
1056 .buffersize = (16*512),
1057 }
1058 }
1059 },
1060 }},
Antti Palosaaria51e34d2008-05-17 23:05:48 -03001061 }
1062 },
1063
Antti Palosaaria8494682010-10-17 18:25:10 -03001064 .rc.core = {
1065 .rc_codes = RC_MAP_ANYSEE,
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -03001066 .protocol = RC_TYPE_OTHER,
Antti Palosaaria8494682010-10-17 18:25:10 -03001067 .module_name = "anysee",
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001068 .rc_query = anysee_rc_query,
Antti Palosaaria8494682010-10-17 18:25:10 -03001069 .rc_interval = 250, /* windows driver uses 500ms */
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -03001070 },
Antti Palosaaria51e34d2008-05-17 23:05:48 -03001071
1072 .i2c_algo = &anysee_i2c_algo,
1073
1074 .generic_bulk_ctrl_endpoint = 1,
1075
1076 .num_device_descs = 1,
1077 .devices = {
1078 {
1079 .name = "Anysee DVB USB2.0",
1080 .cold_ids = {NULL},
1081 .warm_ids = {&anysee_table[0],
1082 &anysee_table[1], NULL},
1083 },
1084 }
1085};
1086
1087static struct usb_driver anysee_driver = {
1088 .name = "dvb_usb_anysee",
1089 .probe = anysee_probe,
1090 .disconnect = dvb_usb_device_exit,
1091 .id_table = anysee_table,
1092};
1093
1094/* module stuff */
1095static int __init anysee_module_init(void)
1096{
1097 int ret;
1098
1099 ret = usb_register(&anysee_driver);
1100 if (ret)
1101 err("%s: usb_register failed. Error number %d", __func__, ret);
1102
1103 return ret;
1104}
1105
1106static void __exit anysee_module_exit(void)
1107{
1108 /* deregister this driver from the USB subsystem */
1109 usb_deregister(&anysee_driver);
1110}
1111
1112module_init(anysee_module_init);
1113module_exit(anysee_module_exit);
1114
1115MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1116MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
1117MODULE_LICENSE("GPL");