blob: 2cbf19a52e38d5124be4b7f805e70f4ce6e8d62f [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 Palosaaria51e34d2008-05-17 23:05:48 -0300449static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
450{
451 int ret;
452 struct anysee_state *state = adap->dev->priv;
453 u8 hw_info[3];
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300454 u8 tmp;
455 struct i2c_msg msg[2] = {
456 {
457 .addr = anysee_tda18212_config.i2c_address,
458 .flags = 0,
459 .len = 1,
460 .buf = "\x00",
461 }, {
462 .addr = anysee_tda18212_config.i2c_address,
463 .flags = I2C_M_RD,
464 .len = 1,
465 .buf = &tmp,
466 }
467 };
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300468
Antti Palosaari41f81f62011-04-10 17:53:52 -0300469 /* Check which hardware we have.
470 * We must do this call two times to get reliable values (hw bug).
471 */
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300472 ret = anysee_get_hw_info(adap->dev, hw_info);
473 if (ret)
Antti Palosaari41f81f62011-04-10 17:53:52 -0300474 goto error;
475
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300476 ret = anysee_get_hw_info(adap->dev, hw_info);
477 if (ret)
Antti Palosaari41f81f62011-04-10 17:53:52 -0300478 goto error;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300479
480 /* Meaning of these info bytes are guessed. */
Antti Palosaari592d9e22011-04-09 21:13:33 -0300481 info("firmware version:%d.%d hardware id:%d",
482 hw_info[1], hw_info[2], hw_info[0]);
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300483
Antti Palosaari41f81f62011-04-10 17:53:52 -0300484 state->hw = hw_info[0];
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300485
Antti Palosaari41f81f62011-04-10 17:53:52 -0300486 switch (state->hw) {
Antti Palosaari05c46c02011-05-25 18:30:09 -0300487 case ANYSEE_HW_507T: /* 2 */
Antti Palosaari41f81f62011-04-10 17:53:52 -0300488 /* E30 */
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300489
Antti Palosaari41f81f62011-04-10 17:53:52 -0300490 /* attach demod */
491 adap->fe = dvb_attach(mt352_attach, &anysee_mt352_config,
492 &adap->dev->i2c_adap);
493 if (adap->fe)
494 break;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300495
Antti Palosaari41f81f62011-04-10 17:53:52 -0300496 /* attach demod */
Antti Palosaari0f77c3a2008-08-11 10:54:16 -0300497 adap->fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
Antti Palosaari41f81f62011-04-10 17:53:52 -0300498 &adap->dev->i2c_adap);
Antti Palosaari41f81f62011-04-10 17:53:52 -0300499
500 break;
501 case ANYSEE_HW_507CD: /* 6 */
502 /* E30 Plus */
503
504 /* enable DVB-T demod on IOD[0] */
505 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
506 if (ret)
507 goto error;
508
509 /* enable transport stream on IOA[7] */
510 ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (0 << 7), 0x80);
511 if (ret)
512 goto error;
513
514 /* attach demod */
515 adap->fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
516 &adap->dev->i2c_adap);
Antti Palosaari41f81f62011-04-10 17:53:52 -0300517
518 break;
519 case ANYSEE_HW_507DC: /* 10 */
520 /* E30 C Plus */
521
522 /* enable DVB-C demod on IOD[0] */
523 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
524 if (ret)
525 goto error;
526
527 /* attach demod */
528 adap->fe = dvb_attach(tda10023_attach, &anysee_tda10023_config,
529 &adap->dev->i2c_adap, 0x48);
Antti Palosaari41f81f62011-04-10 17:53:52 -0300530
531 break;
Antti Palosaarif0a53102011-04-27 21:11:59 -0300532 case ANYSEE_HW_507SI: /* 11 */
533 /* E30 S2 Plus */
534
535 /* enable DVB-S/S2 demod on IOD[0] */
536 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0), 0x01);
537 if (ret)
538 goto error;
539
540 /* attach demod */
541 adap->fe = dvb_attach(cx24116_attach, &anysee_cx24116_config,
542 &adap->dev->i2c_adap);
543
544 break;
Antti Palosaari41f81f62011-04-10 17:53:52 -0300545 case ANYSEE_HW_507FA: /* 15 */
546 /* E30 Combo Plus */
547 /* E30 C Plus */
548
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300549 /* enable tuner on IOE[4] */
550 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
551 if (ret)
552 goto error;
553
554 /* probe TDA18212 */
555 tmp = 0;
556 ret = i2c_transfer(&adap->dev->i2c_adap, msg, 2);
557 if (ret == 2 && tmp == 0xc7)
558 deb_info("%s: TDA18212 found\n", __func__);
559 else
560 tmp = 0;
561
562 /* disable tuner on IOE[4] */
563 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
564 if (ret)
565 goto error;
566
Antti Palosaari41f81f62011-04-10 17:53:52 -0300567 if (dvb_usb_anysee_delsys) {
568 /* disable DVB-C demod on IOD[5] */
569 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
570 0x20);
571 if (ret)
572 goto error;
573
574 /* enable DVB-T demod on IOD[0] */
575 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 0),
576 0x01);
577 if (ret)
578 goto error;
579
580 /* attach demod */
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300581 if (tmp == 0xc7) {
582 /* TDA18212 config */
583 adap->fe = dvb_attach(zl10353_attach,
Antti Palosaari1fd80702011-04-12 17:34:08 -0300584 &anysee_zl10353_tda18212_config2,
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300585 &adap->dev->i2c_adap);
586 } else {
587 /* PLL config */
588 adap->fe = dvb_attach(zl10353_attach,
589 &anysee_zl10353_config,
590 &adap->dev->i2c_adap);
591 }
Antti Palosaari41f81f62011-04-10 17:53:52 -0300592 } else {
593 /* disable DVB-T demod on IOD[0] */
594 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 0),
595 0x01);
596 if (ret)
597 goto error;
598
599 /* enable DVB-C demod on IOD[5] */
600 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
601 0x20);
602 if (ret)
603 goto error;
604
605 /* attach demod */
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300606 if (tmp == 0xc7) {
607 /* TDA18212 config */
608 adap->fe = dvb_attach(tda10023_attach,
609 &anysee_tda10023_tda18212_config,
610 &adap->dev->i2c_adap, 0x48);
611 } else {
612 /* PLL config */
613 adap->fe = dvb_attach(tda10023_attach,
614 &anysee_tda10023_config,
615 &adap->dev->i2c_adap, 0x48);
616 }
Antti Palosaari0f77c3a2008-08-11 10:54:16 -0300617 }
Antti Palosaarie82eea72011-04-12 19:43:30 -0300618
Antti Palosaari41f81f62011-04-10 17:53:52 -0300619 break;
Antti Palosaaria43be982011-04-10 20:23:02 -0300620 case ANYSEE_HW_508TC: /* 18 */
Antti Palosaari8439e0d2011-05-24 07:57:34 -0300621 case ANYSEE_HW_508PTC: /* 21 */
Antti Palosaaria43be982011-04-10 20:23:02 -0300622 /* E7 TC */
Antti Palosaari8439e0d2011-05-24 07:57:34 -0300623 /* E7 PTC */
Antti Palosaaria43be982011-04-10 20:23:02 -0300624
625 /* enable transport stream on IOA[7] */
626 ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
627 if (ret)
628 goto error;
629
630 if (dvb_usb_anysee_delsys) {
631 /* disable DVB-C demod on IOD[5] */
632 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 5),
633 0x20);
634 if (ret)
635 goto error;
636
637 /* enable DVB-T demod on IOD[6] */
638 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 6),
639 0x40);
640 if (ret)
641 goto error;
642
643 /* enable IF route on IOE[0] */
644 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
645 0x01);
646 if (ret)
647 goto error;
648
649 /* attach demod */
650 adap->fe = dvb_attach(zl10353_attach,
651 &anysee_zl10353_tda18212_config,
652 &adap->dev->i2c_adap);
Antti Palosaaria43be982011-04-10 20:23:02 -0300653 } else {
654 /* disable DVB-T demod on IOD[6] */
655 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
656 0x40);
657 if (ret)
658 goto error;
659
660 /* enable DVB-C demod on IOD[5] */
661 ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (1 << 5),
662 0x20);
663 if (ret)
664 goto error;
665
666 /* enable IF route on IOE[0] */
667 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
668 0x01);
669 if (ret)
670 goto error;
671
672 /* attach demod */
673 adap->fe = dvb_attach(tda10023_attach,
674 &anysee_tda10023_tda18212_config,
675 &adap->dev->i2c_adap, 0x48);
Antti Palosaaria43be982011-04-10 20:23:02 -0300676 }
Antti Palosaarie82eea72011-04-12 19:43:30 -0300677
Antti Palosaaria43be982011-04-10 20:23:02 -0300678 break;
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300679 case ANYSEE_HW_508S2: /* 19 */
Antti Palosaarifea3c392011-05-25 18:21:43 -0300680 case ANYSEE_HW_508PS2: /* 22 */
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300681 /* E7 S2 */
Antti Palosaarifea3c392011-05-25 18:21:43 -0300682 /* E7 PS2 */
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300683
684 /* enable transport stream on IOA[7] */
685 ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
686 if (ret)
687 goto error;
688
689 /* enable DVB-S/S2 demod on IOE[5] */
690 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
691 if (ret)
692 goto error;
693
694 /* attach demod */
695 adap->fe = dvb_attach(stv0900_attach, &anysee_stv0900_config,
696 &adap->dev->i2c_adap, 0);
697
698 break;
Antti Palosaari0f77c3a2008-08-11 10:54:16 -0300699 }
700
Antti Palosaari41f81f62011-04-10 17:53:52 -0300701 if (!adap->fe) {
702 /* we have no frontend :-( */
703 ret = -ENODEV;
Antti Palosaarie82eea72011-04-12 19:43:30 -0300704 err("Unsupported Anysee version. " \
705 "Please report the <linux-media@vger.kernel.org>.");
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300706 }
Antti Palosaari41f81f62011-04-10 17:53:52 -0300707error:
708 return ret;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300709}
710
711static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
712{
713 struct anysee_state *state = adap->dev->priv;
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300714 struct dvb_frontend *fe;
Antti Palosaarie82eea72011-04-12 19:43:30 -0300715 int ret;
Antti Palosaaria8494682010-10-17 18:25:10 -0300716 deb_info("%s:\n", __func__);
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300717
Antti Palosaari41f81f62011-04-10 17:53:52 -0300718 switch (state->hw) {
Antti Palosaari05c46c02011-05-25 18:30:09 -0300719 case ANYSEE_HW_507T: /* 2 */
Antti Palosaari41f81f62011-04-10 17:53:52 -0300720 /* E30 */
721
722 /* attach tuner */
Antti Palosaarie82eea72011-04-12 19:43:30 -0300723 fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc2 >> 1),
Antti Palosaari7ea03d22011-04-09 20:50:07 -0300724 NULL, DVB_PLL_THOMSON_DTT7579);
Antti Palosaarie82eea72011-04-12 19:43:30 -0300725
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300726 break;
Antti Palosaari41f81f62011-04-10 17:53:52 -0300727 case ANYSEE_HW_507CD: /* 6 */
728 /* E30 Plus */
729
730 /* attach tuner */
Antti Palosaarie82eea72011-04-12 19:43:30 -0300731 fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc2 >> 1),
Antti Palosaari41f81f62011-04-10 17:53:52 -0300732 &adap->dev->i2c_adap, DVB_PLL_THOMSON_DTT7579);
733
734 break;
735 case ANYSEE_HW_507DC: /* 10 */
736 /* E30 C Plus */
737
738 /* attach tuner */
Antti Palosaarie82eea72011-04-12 19:43:30 -0300739 fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc0 >> 1),
Antti Palosaari7ea03d22011-04-09 20:50:07 -0300740 &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
Antti Palosaarie82eea72011-04-12 19:43:30 -0300741
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300742 break;
Antti Palosaarif0a53102011-04-27 21:11:59 -0300743 case ANYSEE_HW_507SI: /* 11 */
744 /* E30 S2 Plus */
745
746 /* attach LNB controller */
747 fe = dvb_attach(isl6423_attach, adap->fe, &adap->dev->i2c_adap,
748 &anysee_isl6423_config);
749
750 break;
Antti Palosaari41f81f62011-04-10 17:53:52 -0300751 case ANYSEE_HW_507FA: /* 15 */
752 /* E30 Combo Plus */
753 /* E30 C Plus */
754
Antti Palosaari59fb4142011-04-12 10:22:47 -0300755 if (dvb_usb_anysee_delsys) {
756 /* enable DVB-T tuner on IOE[0] */
757 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 0),
758 0x01);
759 if (ret)
760 goto error;
761 } else {
762 /* enable DVB-C tuner on IOE[0] */
763 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 0),
764 0x01);
765 if (ret)
766 goto error;
767 }
768
Antti Palosaari72ffd2b2011-04-10 20:14:50 -0300769 /* Try first attach TDA18212 silicon tuner on IOE[4], if that
770 * fails attach old simple PLL. */
771
772 /* enable tuner on IOE[4] */
773 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
774 if (ret)
775 goto error;
776
777 /* attach tuner */
778 fe = dvb_attach(tda18212_attach, adap->fe, &adap->dev->i2c_adap,
779 &anysee_tda18212_config);
780 if (fe)
781 break;
782
783 /* disable tuner on IOE[4] */
784 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
785 if (ret)
786 goto error;
787
Antti Palosaari41f81f62011-04-10 17:53:52 -0300788 /* attach tuner */
Antti Palosaarie82eea72011-04-12 19:43:30 -0300789 fe = dvb_attach(dvb_pll_attach, adap->fe, (0xc0 >> 1),
Antti Palosaari41f81f62011-04-10 17:53:52 -0300790 &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
791
792 break;
Antti Palosaaria43be982011-04-10 20:23:02 -0300793 case ANYSEE_HW_508TC: /* 18 */
Antti Palosaari8439e0d2011-05-24 07:57:34 -0300794 case ANYSEE_HW_508PTC: /* 21 */
Antti Palosaaria43be982011-04-10 20:23:02 -0300795 /* E7 TC */
Antti Palosaari8439e0d2011-05-24 07:57:34 -0300796 /* E7 PTC */
Antti Palosaaria43be982011-04-10 20:23:02 -0300797
798 /* enable tuner on IOE[4] */
799 ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
800 if (ret)
801 goto error;
802
803 /* attach tuner */
804 fe = dvb_attach(tda18212_attach, adap->fe, &adap->dev->i2c_adap,
805 &anysee_tda18212_config);
Antti Palosaaria43be982011-04-10 20:23:02 -0300806
807 break;
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300808 case ANYSEE_HW_508S2: /* 19 */
Antti Palosaarifea3c392011-05-25 18:21:43 -0300809 case ANYSEE_HW_508PS2: /* 22 */
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300810 /* E7 S2 */
Antti Palosaarifea3c392011-05-25 18:21:43 -0300811 /* E7 PS2 */
Antti Palosaaribedbf3d2011-04-29 13:55:02 -0300812
813 /* attach tuner */
814 fe = dvb_attach(stv6110_attach, adap->fe,
815 &anysee_stv6110_config, &adap->dev->i2c_adap);
816
817 if (fe) {
818 /* attach LNB controller */
819 fe = dvb_attach(isl6423_attach, adap->fe,
820 &adap->dev->i2c_adap, &anysee_isl6423_config);
821 }
822
823 break;
Antti Palosaari41f81f62011-04-10 17:53:52 -0300824 default:
Antti Palosaarie82eea72011-04-12 19:43:30 -0300825 fe = NULL;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300826 }
827
Antti Palosaarie82eea72011-04-12 19:43:30 -0300828 if (fe)
829 ret = 0;
830 else
831 ret = -ENODEV;
832
Antti Palosaari41f81f62011-04-10 17:53:52 -0300833error:
834 return ret;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300835}
836
Antti Palosaaria8494682010-10-17 18:25:10 -0300837static int anysee_rc_query(struct dvb_usb_device *d)
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300838{
839 u8 buf[] = {CMD_GET_IR_CODE};
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300840 u8 ircode[2];
Antti Palosaaria8494682010-10-17 18:25:10 -0300841 int ret;
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300842
Antti Palosaaria8494682010-10-17 18:25:10 -0300843 /* Remote controller is basic NEC using address byte 0x08.
844 Anysee device RC query returns only two bytes, status and code,
845 address byte is dropped. Also it does not return any value for
846 NEC RCs having address byte other than 0x08. Due to that, we
847 cannot use that device as standard NEC receiver.
848 It could be possible make hack which reads whole code directly
849 from device memory... */
850
851 ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode));
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300852 if (ret)
853 return ret;
854
Antti Palosaaria8494682010-10-17 18:25:10 -0300855 if (ircode[0]) {
856 deb_rc("%s: key pressed %02x\n", __func__, ircode[1]);
Mauro Carvalho Chehabca866742010-11-17 13:53:11 -0300857 rc_keydown(d->rc_dev, 0x08 << 8 | ircode[1], 0);
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300858 }
Antti Palosaaria8494682010-10-17 18:25:10 -0300859
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300860 return 0;
861}
862
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300863/* DVB USB Driver stuff */
864static struct dvb_usb_device_properties anysee_properties;
865
866static int anysee_probe(struct usb_interface *intf,
867 const struct usb_device_id *id)
868{
869 struct dvb_usb_device *d;
870 struct usb_host_interface *alt;
871 int ret;
872
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300873 /* There is one interface with two alternate settings.
874 Alternate setting 0 is for bulk transfer.
875 Alternate setting 1 is for isochronous transfer.
876 We use bulk transfer (alternate setting 0). */
877 if (intf->num_altsetting < 1)
878 return -ENODEV;
879
Dan Carpenter8b0d7042010-05-31 16:27:39 -0300880 /*
881 * Anysee is always warm (its USB-bridge, Cypress FX2, uploads
882 * firmware from eeprom). If dvb_usb_device_init() succeeds that
883 * means d is a valid pointer.
884 */
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300885 ret = dvb_usb_device_init(intf, &anysee_properties, THIS_MODULE, &d,
886 adapter_nr);
887 if (ret)
888 return ret;
889
890 alt = usb_altnum_to_altsetting(intf, 0);
891 if (alt == NULL) {
892 deb_info("%s: no alt found!\n", __func__);
893 return -ENODEV;
894 }
895
896 ret = usb_set_interface(d->udev, alt->desc.bInterfaceNumber,
897 alt->desc.bAlternateSetting);
898 if (ret)
899 return ret;
900
Dan Carpenter8b0d7042010-05-31 16:27:39 -0300901 return anysee_init(d);
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300902}
903
Antti Palosaariae3745f2009-09-16 19:50:25 -0300904static struct usb_device_id anysee_table[] = {
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300905 { USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE) },
906 { USB_DEVICE(USB_VID_AMT, USB_PID_ANYSEE) },
907 { } /* Terminating entry */
908};
909MODULE_DEVICE_TABLE(usb, anysee_table);
910
911static struct dvb_usb_device_properties anysee_properties = {
912 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
913
914 .usb_ctrl = DEVICE_SPECIFIC,
915
916 .size_of_priv = sizeof(struct anysee_state),
917
918 .num_adapters = 1,
919 .adapter = {
920 {
921 .streaming_ctrl = anysee_streaming_ctrl,
922 .frontend_attach = anysee_frontend_attach,
923 .tuner_attach = anysee_tuner_attach,
924 .stream = {
925 .type = USB_BULK,
926 .count = 8,
927 .endpoint = 0x82,
928 .u = {
929 .bulk = {
Antti Palosaariab693332009-09-16 19:47:01 -0300930 .buffersize = (16*512),
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300931 }
932 }
933 },
934 }
935 },
936
Antti Palosaaria8494682010-10-17 18:25:10 -0300937 .rc.core = {
938 .rc_codes = RC_MAP_ANYSEE,
Mauro Carvalho Chehab52b66142010-11-17 14:20:52 -0300939 .protocol = RC_TYPE_OTHER,
Antti Palosaaria8494682010-10-17 18:25:10 -0300940 .module_name = "anysee",
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -0300941 .rc_query = anysee_rc_query,
Antti Palosaaria8494682010-10-17 18:25:10 -0300942 .rc_interval = 250, /* windows driver uses 500ms */
Mauro Carvalho Chehabf72a27b2010-07-31 18:04:09 -0300943 },
Antti Palosaaria51e34d2008-05-17 23:05:48 -0300944
945 .i2c_algo = &anysee_i2c_algo,
946
947 .generic_bulk_ctrl_endpoint = 1,
948
949 .num_device_descs = 1,
950 .devices = {
951 {
952 .name = "Anysee DVB USB2.0",
953 .cold_ids = {NULL},
954 .warm_ids = {&anysee_table[0],
955 &anysee_table[1], NULL},
956 },
957 }
958};
959
960static struct usb_driver anysee_driver = {
961 .name = "dvb_usb_anysee",
962 .probe = anysee_probe,
963 .disconnect = dvb_usb_device_exit,
964 .id_table = anysee_table,
965};
966
967/* module stuff */
968static int __init anysee_module_init(void)
969{
970 int ret;
971
972 ret = usb_register(&anysee_driver);
973 if (ret)
974 err("%s: usb_register failed. Error number %d", __func__, ret);
975
976 return ret;
977}
978
979static void __exit anysee_module_exit(void)
980{
981 /* deregister this driver from the USB subsystem */
982 usb_deregister(&anysee_driver);
983}
984
985module_init(anysee_module_init);
986module_exit(anysee_module_exit);
987
988MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
989MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
990MODULE_LICENSE("GPL");