diff options
Diffstat (limited to 'drivers/media/usb/dvb-usb-v2/it913x.c')
-rw-r--r-- | drivers/media/usb/dvb-usb-v2/it913x.c | 799 |
1 files changed, 799 insertions, 0 deletions
diff --git a/drivers/media/usb/dvb-usb-v2/it913x.c b/drivers/media/usb/dvb-usb-v2/it913x.c new file mode 100644 index 000000000000..695f9106bc54 --- /dev/null +++ b/drivers/media/usb/dvb-usb-v2/it913x.c | |||
@@ -0,0 +1,799 @@ | |||
1 | /* | ||
2 | * DVB USB compliant linux driver for ITE IT9135 and IT9137 | ||
3 | * | ||
4 | * Copyright (C) 2011 Malcolm Priestley (tvboxspy@gmail.com) | ||
5 | * IT9135 (C) ITE Tech Inc. | ||
6 | * IT9137 (C) ITE Tech Inc. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License Version 2, as | ||
10 | * published by the Free Software Foundation. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | * | ||
21 | * | ||
22 | * see Documentation/dvb/README.dvb-usb for more information | ||
23 | * see Documentation/dvb/it9137.txt for firmware information | ||
24 | * | ||
25 | */ | ||
26 | #define DVB_USB_LOG_PREFIX "it913x" | ||
27 | |||
28 | #include <linux/usb.h> | ||
29 | #include <linux/usb/input.h> | ||
30 | #include <media/rc-core.h> | ||
31 | |||
32 | #include "dvb_usb.h" | ||
33 | #include "it913x-fe.h" | ||
34 | |||
35 | /* debug */ | ||
36 | static int dvb_usb_it913x_debug; | ||
37 | #define it_debug(var, level, args...) \ | ||
38 | do { if ((var & level)) pr_debug(DVB_USB_LOG_PREFIX": " args); \ | ||
39 | } while (0) | ||
40 | #define deb_info(level, args...) it_debug(dvb_usb_it913x_debug, level, args) | ||
41 | #define info(args...) pr_info(DVB_USB_LOG_PREFIX": " args) | ||
42 | |||
43 | module_param_named(debug, dvb_usb_it913x_debug, int, 0644); | ||
44 | MODULE_PARM_DESC(debug, "set debugging level (1=info (or-able))."); | ||
45 | |||
46 | static int dvb_usb_it913x_firmware; | ||
47 | module_param_named(firmware, dvb_usb_it913x_firmware, int, 0644); | ||
48 | MODULE_PARM_DESC(firmware, "set firmware 0=auto"\ | ||
49 | "1=IT9137 2=IT9135 V1 3=IT9135 V2"); | ||
50 | #define FW_IT9137 "dvb-usb-it9137-01.fw" | ||
51 | #define FW_IT9135_V1 "dvb-usb-it9135-01.fw" | ||
52 | #define FW_IT9135_V2 "dvb-usb-it9135-02.fw" | ||
53 | |||
54 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | ||
55 | |||
56 | struct it913x_state { | ||
57 | struct ite_config it913x_config; | ||
58 | u8 pid_filter_onoff; | ||
59 | bool proprietary_ir; | ||
60 | int cmd_counter; | ||
61 | }; | ||
62 | |||
63 | static u16 check_sum(u8 *p, u8 len) | ||
64 | { | ||
65 | u16 sum = 0; | ||
66 | u8 i = 1; | ||
67 | while (i < len) | ||
68 | sum += (i++ & 1) ? (*p++) << 8 : *p++; | ||
69 | return ~sum; | ||
70 | } | ||
71 | |||
72 | static int it913x_io(struct dvb_usb_device *d, u8 mode, u8 pro, | ||
73 | u8 cmd, u32 reg, u8 addr, u8 *data, u8 len) | ||
74 | { | ||
75 | struct it913x_state *st = d->priv; | ||
76 | int ret = 0, i, buf_size = 1; | ||
77 | u8 *buff; | ||
78 | u8 rlen; | ||
79 | u16 chk_sum; | ||
80 | |||
81 | buff = kzalloc(256, GFP_KERNEL); | ||
82 | if (!buff) { | ||
83 | info("USB Buffer Failed"); | ||
84 | return -ENOMEM; | ||
85 | } | ||
86 | |||
87 | buff[buf_size++] = pro; | ||
88 | buff[buf_size++] = cmd; | ||
89 | buff[buf_size++] = st->cmd_counter; | ||
90 | |||
91 | switch (mode) { | ||
92 | case READ_LONG: | ||
93 | case WRITE_LONG: | ||
94 | buff[buf_size++] = len; | ||
95 | buff[buf_size++] = 2; | ||
96 | buff[buf_size++] = (reg >> 24); | ||
97 | buff[buf_size++] = (reg >> 16) & 0xff; | ||
98 | buff[buf_size++] = (reg >> 8) & 0xff; | ||
99 | buff[buf_size++] = reg & 0xff; | ||
100 | break; | ||
101 | case READ_SHORT: | ||
102 | buff[buf_size++] = addr; | ||
103 | break; | ||
104 | case WRITE_SHORT: | ||
105 | buff[buf_size++] = len; | ||
106 | buff[buf_size++] = addr; | ||
107 | buff[buf_size++] = (reg >> 8) & 0xff; | ||
108 | buff[buf_size++] = reg & 0xff; | ||
109 | break; | ||
110 | case READ_DATA: | ||
111 | case WRITE_DATA: | ||
112 | break; | ||
113 | case WRITE_CMD: | ||
114 | mode = 7; | ||
115 | break; | ||
116 | default: | ||
117 | kfree(buff); | ||
118 | return -EINVAL; | ||
119 | } | ||
120 | |||
121 | if (mode & 1) { | ||
122 | for (i = 0; i < len ; i++) | ||
123 | buff[buf_size++] = data[i]; | ||
124 | } | ||
125 | chk_sum = check_sum(&buff[1], buf_size); | ||
126 | |||
127 | buff[buf_size++] = chk_sum >> 8; | ||
128 | buff[0] = buf_size; | ||
129 | buff[buf_size++] = (chk_sum & 0xff); | ||
130 | |||
131 | ret = dvb_usbv2_generic_rw(d, buff, buf_size, buff, (mode & 1) ? | ||
132 | 5 : len + 5); | ||
133 | if (ret < 0) | ||
134 | goto error; | ||
135 | |||
136 | rlen = (mode & 0x1) ? 0x1 : len; | ||
137 | |||
138 | if (mode & 1) | ||
139 | ret = buff[2]; | ||
140 | else | ||
141 | memcpy(data, &buff[3], rlen); | ||
142 | |||
143 | st->cmd_counter++; | ||
144 | |||
145 | error: kfree(buff); | ||
146 | |||
147 | return ret; | ||
148 | } | ||
149 | |||
150 | static int it913x_wr_reg(struct dvb_usb_device *d, u8 pro, u32 reg , u8 data) | ||
151 | { | ||
152 | int ret; | ||
153 | u8 b[1]; | ||
154 | b[0] = data; | ||
155 | ret = it913x_io(d, WRITE_LONG, pro, | ||
156 | CMD_DEMOD_WRITE, reg, 0, b, sizeof(b)); | ||
157 | |||
158 | return ret; | ||
159 | } | ||
160 | |||
161 | static int it913x_read_reg(struct dvb_usb_device *d, u32 reg) | ||
162 | { | ||
163 | int ret; | ||
164 | u8 data[1]; | ||
165 | |||
166 | ret = it913x_io(d, READ_LONG, DEV_0, | ||
167 | CMD_DEMOD_READ, reg, 0, &data[0], sizeof(data)); | ||
168 | |||
169 | return (ret < 0) ? ret : data[0]; | ||
170 | } | ||
171 | |||
172 | static int it913x_query(struct dvb_usb_device *d, u8 pro) | ||
173 | { | ||
174 | struct it913x_state *st = d->priv; | ||
175 | int ret, i; | ||
176 | u8 data[4]; | ||
177 | u8 ver; | ||
178 | |||
179 | for (i = 0; i < 5; i++) { | ||
180 | ret = it913x_io(d, READ_LONG, pro, CMD_DEMOD_READ, | ||
181 | 0x1222, 0, &data[0], 3); | ||
182 | ver = data[0]; | ||
183 | if (ver > 0 && ver < 3) | ||
184 | break; | ||
185 | msleep(100); | ||
186 | } | ||
187 | |||
188 | if (ver < 1 || ver > 2) { | ||
189 | info("Failed to identify chip version applying 1"); | ||
190 | st->it913x_config.chip_ver = 0x1; | ||
191 | st->it913x_config.chip_type = 0x9135; | ||
192 | return 0; | ||
193 | } | ||
194 | |||
195 | st->it913x_config.chip_ver = ver; | ||
196 | st->it913x_config.chip_type = (u16)(data[2] << 8) + data[1]; | ||
197 | |||
198 | info("Chip Version=%02x Chip Type=%04x", st->it913x_config.chip_ver, | ||
199 | st->it913x_config.chip_type); | ||
200 | |||
201 | ret = it913x_io(d, READ_SHORT, pro, | ||
202 | CMD_QUERYINFO, 0, 0x1, &data[0], 4); | ||
203 | |||
204 | st->it913x_config.firmware = (data[0] << 24) | (data[1] << 16) | | ||
205 | (data[2] << 8) | data[3]; | ||
206 | |||
207 | return ret; | ||
208 | } | ||
209 | |||
210 | static int it913x_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff) | ||
211 | { | ||
212 | struct dvb_usb_device *d = adap_to_d(adap); | ||
213 | struct it913x_state *st = adap_to_priv(adap); | ||
214 | int ret; | ||
215 | u8 pro = (adap->id == 0) ? DEV_0_DMOD : DEV_1_DMOD; | ||
216 | |||
217 | mutex_lock(&d->i2c_mutex); | ||
218 | |||
219 | deb_info(1, "PID_C (%02x)", onoff); | ||
220 | |||
221 | ret = it913x_wr_reg(d, pro, PID_EN, st->pid_filter_onoff); | ||
222 | |||
223 | mutex_unlock(&d->i2c_mutex); | ||
224 | return ret; | ||
225 | } | ||
226 | |||
227 | static int it913x_pid_filter(struct dvb_usb_adapter *adap, | ||
228 | int index, u16 pid, int onoff) | ||
229 | { | ||
230 | struct dvb_usb_device *d = adap_to_d(adap); | ||
231 | struct it913x_state *st = adap_to_priv(adap); | ||
232 | int ret; | ||
233 | u8 pro = (adap->id == 0) ? DEV_0_DMOD : DEV_1_DMOD; | ||
234 | |||
235 | mutex_lock(&d->i2c_mutex); | ||
236 | |||
237 | deb_info(1, "PID_F (%02x)", onoff); | ||
238 | |||
239 | ret = it913x_wr_reg(d, pro, PID_LSB, (u8)(pid & 0xff)); | ||
240 | |||
241 | ret |= it913x_wr_reg(d, pro, PID_MSB, (u8)(pid >> 8)); | ||
242 | |||
243 | ret |= it913x_wr_reg(d, pro, PID_INX_EN, (u8)onoff); | ||
244 | |||
245 | ret |= it913x_wr_reg(d, pro, PID_INX, (u8)(index & 0x1f)); | ||
246 | |||
247 | if (d->udev->speed == USB_SPEED_HIGH && pid == 0x2000) { | ||
248 | ret |= it913x_wr_reg(d , pro, PID_EN, !onoff); | ||
249 | st->pid_filter_onoff = !onoff; | ||
250 | } else | ||
251 | st->pid_filter_onoff = | ||
252 | adap->pid_filtering; | ||
253 | |||
254 | mutex_unlock(&d->i2c_mutex); | ||
255 | return 0; | ||
256 | } | ||
257 | |||
258 | |||
259 | static int it913x_return_status(struct dvb_usb_device *d) | ||
260 | { | ||
261 | struct it913x_state *st = d->priv; | ||
262 | int ret = it913x_query(d, DEV_0); | ||
263 | if (st->it913x_config.firmware > 0) | ||
264 | info("Firmware Version %d", st->it913x_config.firmware); | ||
265 | |||
266 | return ret; | ||
267 | } | ||
268 | |||
269 | static int it913x_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
270 | int num) | ||
271 | { | ||
272 | struct dvb_usb_device *d = i2c_get_adapdata(adap); | ||
273 | static u8 data[256]; | ||
274 | int ret; | ||
275 | u32 reg; | ||
276 | u8 pro; | ||
277 | |||
278 | mutex_lock(&d->i2c_mutex); | ||
279 | |||
280 | deb_info(2, "num of messages %d address %02x", num, msg[0].addr); | ||
281 | |||
282 | pro = (msg[0].addr & 0x2) ? DEV_0_DMOD : 0x0; | ||
283 | pro |= (msg[0].addr & 0x20) ? DEV_1 : DEV_0; | ||
284 | memcpy(data, msg[0].buf, msg[0].len); | ||
285 | reg = (data[0] << 24) + (data[1] << 16) + | ||
286 | (data[2] << 8) + data[3]; | ||
287 | if (num == 2) { | ||
288 | ret = it913x_io(d, READ_LONG, pro, | ||
289 | CMD_DEMOD_READ, reg, 0, data, msg[1].len); | ||
290 | memcpy(msg[1].buf, data, msg[1].len); | ||
291 | } else | ||
292 | ret = it913x_io(d, WRITE_LONG, pro, CMD_DEMOD_WRITE, | ||
293 | reg, 0, &data[4], msg[0].len - 4); | ||
294 | |||
295 | mutex_unlock(&d->i2c_mutex); | ||
296 | |||
297 | return ret; | ||
298 | } | ||
299 | |||
300 | static u32 it913x_i2c_func(struct i2c_adapter *adapter) | ||
301 | { | ||
302 | return I2C_FUNC_I2C; | ||
303 | } | ||
304 | |||
305 | static struct i2c_algorithm it913x_i2c_algo = { | ||
306 | .master_xfer = it913x_i2c_xfer, | ||
307 | .functionality = it913x_i2c_func, | ||
308 | }; | ||
309 | |||
310 | /* Callbacks for DVB USB */ | ||
311 | #define IT913X_POLL 250 | ||
312 | static int it913x_rc_query(struct dvb_usb_device *d) | ||
313 | { | ||
314 | u8 ibuf[4]; | ||
315 | int ret; | ||
316 | u32 key; | ||
317 | /* Avoid conflict with frontends*/ | ||
318 | mutex_lock(&d->i2c_mutex); | ||
319 | |||
320 | ret = it913x_io(d, READ_LONG, PRO_LINK, CMD_IR_GET, | ||
321 | 0, 0, &ibuf[0], sizeof(ibuf)); | ||
322 | |||
323 | if ((ibuf[2] + ibuf[3]) == 0xff) { | ||
324 | key = ibuf[2]; | ||
325 | key += ibuf[0] << 16; | ||
326 | key += ibuf[1] << 8; | ||
327 | deb_info(1, "NEC Extended Key =%08x", key); | ||
328 | if (d->rc_dev != NULL) | ||
329 | rc_keydown(d->rc_dev, key, 0); | ||
330 | } | ||
331 | |||
332 | mutex_unlock(&d->i2c_mutex); | ||
333 | |||
334 | return ret; | ||
335 | } | ||
336 | |||
337 | /* Firmware sets raw */ | ||
338 | static const char fw_it9135_v1[] = FW_IT9135_V1; | ||
339 | static const char fw_it9135_v2[] = FW_IT9135_V2; | ||
340 | static const char fw_it9137[] = FW_IT9137; | ||
341 | |||
342 | static void ite_get_firmware_name(struct dvb_usb_device *d, | ||
343 | const char **name) | ||
344 | { | ||
345 | struct it913x_state *st = d->priv; | ||
346 | int sw; | ||
347 | /* auto switch */ | ||
348 | if (le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_KWORLD_2) | ||
349 | sw = IT9137_FW; | ||
350 | else if (st->it913x_config.chip_ver == 1) | ||
351 | sw = IT9135_V1_FW; | ||
352 | else | ||
353 | sw = IT9135_V2_FW; | ||
354 | |||
355 | /* force switch */ | ||
356 | if (dvb_usb_it913x_firmware != IT9135_AUTO) | ||
357 | sw = dvb_usb_it913x_firmware; | ||
358 | |||
359 | switch (sw) { | ||
360 | case IT9135_V1_FW: | ||
361 | st->it913x_config.firmware_ver = 1; | ||
362 | st->it913x_config.adc_x2 = 1; | ||
363 | st->it913x_config.read_slevel = false; | ||
364 | *name = fw_it9135_v1; | ||
365 | break; | ||
366 | case IT9135_V2_FW: | ||
367 | st->it913x_config.firmware_ver = 1; | ||
368 | st->it913x_config.adc_x2 = 1; | ||
369 | st->it913x_config.read_slevel = false; | ||
370 | *name = fw_it9135_v2; | ||
371 | switch (st->it913x_config.tuner_id_0) { | ||
372 | case IT9135_61: | ||
373 | case IT9135_62: | ||
374 | break; | ||
375 | default: | ||
376 | info("Unknown tuner ID applying default 0x60"); | ||
377 | case IT9135_60: | ||
378 | st->it913x_config.tuner_id_0 = IT9135_60; | ||
379 | } | ||
380 | break; | ||
381 | case IT9137_FW: | ||
382 | default: | ||
383 | st->it913x_config.firmware_ver = 0; | ||
384 | st->it913x_config.adc_x2 = 0; | ||
385 | st->it913x_config.read_slevel = true; | ||
386 | *name = fw_it9137; | ||
387 | } | ||
388 | |||
389 | return; | ||
390 | } | ||
391 | |||
392 | #define TS_MPEG_PKT_SIZE 188 | ||
393 | #define EP_LOW 21 | ||
394 | #define TS_BUFFER_SIZE_PID (EP_LOW*TS_MPEG_PKT_SIZE) | ||
395 | #define EP_HIGH 348 | ||
396 | #define TS_BUFFER_SIZE_MAX (EP_HIGH*TS_MPEG_PKT_SIZE) | ||
397 | |||
398 | static int it913x_get_stream_config(struct dvb_frontend *fe, u8 *ts_type, | ||
399 | struct usb_data_stream_properties *stream) | ||
400 | { | ||
401 | struct dvb_usb_adapter *adap = fe_to_adap(fe); | ||
402 | if (adap->pid_filtering) | ||
403 | stream->u.bulk.buffersize = TS_BUFFER_SIZE_PID; | ||
404 | else | ||
405 | stream->u.bulk.buffersize = TS_BUFFER_SIZE_MAX; | ||
406 | |||
407 | return 0; | ||
408 | } | ||
409 | |||
410 | static int it913x_select_config(struct dvb_usb_device *d) | ||
411 | { | ||
412 | struct it913x_state *st = d->priv; | ||
413 | int ret, reg; | ||
414 | |||
415 | ret = it913x_return_status(d); | ||
416 | if (ret < 0) | ||
417 | return ret; | ||
418 | |||
419 | if (st->it913x_config.chip_ver == 0x02 | ||
420 | && st->it913x_config.chip_type == 0x9135) | ||
421 | reg = it913x_read_reg(d, 0x461d); | ||
422 | else | ||
423 | reg = it913x_read_reg(d, 0x461b); | ||
424 | |||
425 | if (reg < 0) | ||
426 | return reg; | ||
427 | |||
428 | if (reg == 0) { | ||
429 | st->it913x_config.dual_mode = 0; | ||
430 | st->it913x_config.tuner_id_0 = IT9135_38; | ||
431 | st->proprietary_ir = true; | ||
432 | } else { | ||
433 | /* TS mode */ | ||
434 | reg = it913x_read_reg(d, 0x49c5); | ||
435 | if (reg < 0) | ||
436 | return reg; | ||
437 | st->it913x_config.dual_mode = reg; | ||
438 | |||
439 | /* IR mode type */ | ||
440 | reg = it913x_read_reg(d, 0x49ac); | ||
441 | if (reg < 0) | ||
442 | return reg; | ||
443 | if (reg == 5) { | ||
444 | info("Remote propriety (raw) mode"); | ||
445 | st->proprietary_ir = true; | ||
446 | } else if (reg == 1) { | ||
447 | info("Remote HID mode NOT SUPPORTED"); | ||
448 | st->proprietary_ir = false; | ||
449 | } | ||
450 | |||
451 | /* Tuner_id */ | ||
452 | reg = it913x_read_reg(d, 0x49d0); | ||
453 | if (reg < 0) | ||
454 | return reg; | ||
455 | st->it913x_config.tuner_id_0 = reg; | ||
456 | } | ||
457 | |||
458 | info("Dual mode=%x Tuner Type=%x", st->it913x_config.dual_mode, | ||
459 | st->it913x_config.tuner_id_0); | ||
460 | |||
461 | return ret; | ||
462 | } | ||
463 | |||
464 | static int it913x_streaming_ctrl(struct dvb_frontend *fe, int onoff) | ||
465 | { | ||
466 | struct dvb_usb_adapter *adap = fe_to_adap(fe); | ||
467 | struct dvb_usb_device *d = adap_to_d(adap); | ||
468 | struct it913x_state *st = fe_to_priv(fe); | ||
469 | int ret = 0; | ||
470 | u8 pro = (adap->id == 0) ? DEV_0_DMOD : DEV_1_DMOD; | ||
471 | |||
472 | deb_info(1, "STM (%02x)", onoff); | ||
473 | |||
474 | if (!onoff) { | ||
475 | mutex_lock(&d->i2c_mutex); | ||
476 | |||
477 | ret = it913x_wr_reg(d, pro, PID_RST, 0x1); | ||
478 | |||
479 | mutex_unlock(&d->i2c_mutex); | ||
480 | st->pid_filter_onoff = | ||
481 | adap->pid_filtering; | ||
482 | |||
483 | } | ||
484 | |||
485 | return ret; | ||
486 | } | ||
487 | |||
488 | static int it913x_identify_state(struct dvb_usb_device *d, const char **name) | ||
489 | { | ||
490 | struct it913x_state *st = d->priv; | ||
491 | int ret; | ||
492 | u8 reg; | ||
493 | |||
494 | /* Read and select config */ | ||
495 | ret = it913x_select_config(d); | ||
496 | if (ret < 0) | ||
497 | return ret; | ||
498 | |||
499 | ite_get_firmware_name(d, name); | ||
500 | |||
501 | if (st->it913x_config.firmware > 0) | ||
502 | return WARM; | ||
503 | |||
504 | if (st->it913x_config.dual_mode) { | ||
505 | st->it913x_config.tuner_id_1 = it913x_read_reg(d, 0x49e0); | ||
506 | ret = it913x_wr_reg(d, DEV_0, GPIOH1_EN, 0x1); | ||
507 | ret |= it913x_wr_reg(d, DEV_0, GPIOH1_ON, 0x1); | ||
508 | ret |= it913x_wr_reg(d, DEV_0, GPIOH1_O, 0x1); | ||
509 | msleep(50); | ||
510 | ret |= it913x_wr_reg(d, DEV_0, GPIOH1_O, 0x0); | ||
511 | msleep(50); | ||
512 | reg = it913x_read_reg(d, GPIOH1_O); | ||
513 | if (reg == 0) { | ||
514 | ret |= it913x_wr_reg(d, DEV_0, GPIOH1_O, 0x1); | ||
515 | ret |= it913x_return_status(d); | ||
516 | if (ret != 0) | ||
517 | ret = it913x_wr_reg(d, DEV_0, | ||
518 | GPIOH1_O, 0x0); | ||
519 | } | ||
520 | } | ||
521 | |||
522 | reg = it913x_read_reg(d, IO_MUX_POWER_CLK); | ||
523 | |||
524 | if (st->it913x_config.dual_mode) { | ||
525 | ret |= it913x_wr_reg(d, DEV_0, 0x4bfb, CHIP2_I2C_ADDR); | ||
526 | if (st->it913x_config.firmware_ver == 1) | ||
527 | ret |= it913x_wr_reg(d, DEV_0, 0xcfff, 0x1); | ||
528 | else | ||
529 | ret |= it913x_wr_reg(d, DEV_0, CLK_O_EN, 0x1); | ||
530 | } else { | ||
531 | ret |= it913x_wr_reg(d, DEV_0, 0x4bfb, 0x0); | ||
532 | if (st->it913x_config.firmware_ver == 1) | ||
533 | ret |= it913x_wr_reg(d, DEV_0, 0xcfff, 0x0); | ||
534 | else | ||
535 | ret |= it913x_wr_reg(d, DEV_0, CLK_O_EN, 0x0); | ||
536 | } | ||
537 | |||
538 | ret |= it913x_wr_reg(d, DEV_0, I2C_CLK, I2C_CLK_100); | ||
539 | |||
540 | return (ret < 0) ? ret : COLD; | ||
541 | } | ||
542 | |||
543 | static int it913x_download_firmware(struct dvb_usb_device *d, | ||
544 | const struct firmware *fw) | ||
545 | { | ||
546 | struct it913x_state *st = d->priv; | ||
547 | int ret = 0, i = 0, pos = 0; | ||
548 | u8 packet_size, min_pkt; | ||
549 | u8 *fw_data; | ||
550 | |||
551 | ret = it913x_wr_reg(d, DEV_0, I2C_CLK, I2C_CLK_100); | ||
552 | |||
553 | info("FRM Starting Firmware Download"); | ||
554 | |||
555 | /* Multi firmware loader */ | ||
556 | /* This uses scatter write firmware headers */ | ||
557 | /* The firmware must start with 03 XX 00 */ | ||
558 | /* and be the extact firmware length */ | ||
559 | |||
560 | if (st->it913x_config.chip_ver == 2) | ||
561 | min_pkt = 0x11; | ||
562 | else | ||
563 | min_pkt = 0x19; | ||
564 | |||
565 | while (i <= fw->size) { | ||
566 | if (((fw->data[i] == 0x3) && (fw->data[i + 2] == 0x0)) | ||
567 | || (i == fw->size)) { | ||
568 | packet_size = i - pos; | ||
569 | if ((packet_size > min_pkt) || (i == fw->size)) { | ||
570 | fw_data = (u8 *)(fw->data + pos); | ||
571 | pos += packet_size; | ||
572 | if (packet_size > 0) { | ||
573 | ret = it913x_io(d, WRITE_DATA, | ||
574 | DEV_0, CMD_SCATTER_WRITE, 0, | ||
575 | 0, fw_data, packet_size); | ||
576 | if (ret < 0) | ||
577 | break; | ||
578 | } | ||
579 | udelay(1000); | ||
580 | } | ||
581 | } | ||
582 | i++; | ||
583 | } | ||
584 | |||
585 | if (ret < 0) | ||
586 | info("FRM Firmware Download Failed (%d)" , ret); | ||
587 | else | ||
588 | info("FRM Firmware Download Completed - Resetting Device"); | ||
589 | |||
590 | msleep(30); | ||
591 | |||
592 | ret = it913x_io(d, WRITE_CMD, DEV_0, CMD_BOOT, 0, 0, NULL, 0); | ||
593 | if (ret < 0) | ||
594 | info("FRM Device not responding to reboot"); | ||
595 | |||
596 | ret = it913x_return_status(d); | ||
597 | if (st->it913x_config.firmware == 0) { | ||
598 | info("FRM Failed to reboot device"); | ||
599 | return -ENODEV; | ||
600 | } | ||
601 | |||
602 | msleep(30); | ||
603 | |||
604 | ret = it913x_wr_reg(d, DEV_0, I2C_CLK, I2C_CLK_400); | ||
605 | |||
606 | msleep(30); | ||
607 | |||
608 | /* Tuner function */ | ||
609 | if (st->it913x_config.dual_mode) | ||
610 | ret |= it913x_wr_reg(d, DEV_0_DMOD , 0xec4c, 0xa0); | ||
611 | else | ||
612 | ret |= it913x_wr_reg(d, DEV_0_DMOD , 0xec4c, 0x68); | ||
613 | |||
614 | if ((st->it913x_config.chip_ver == 1) && | ||
615 | (st->it913x_config.chip_type == 0x9135)) { | ||
616 | ret |= it913x_wr_reg(d, DEV_0, PADODPU, 0x0); | ||
617 | ret |= it913x_wr_reg(d, DEV_0, AGC_O_D, 0x0); | ||
618 | if (st->it913x_config.dual_mode) { | ||
619 | ret |= it913x_wr_reg(d, DEV_1, PADODPU, 0x0); | ||
620 | ret |= it913x_wr_reg(d, DEV_1, AGC_O_D, 0x0); | ||
621 | } | ||
622 | } | ||
623 | |||
624 | return (ret < 0) ? -ENODEV : 0; | ||
625 | } | ||
626 | |||
627 | static int it913x_name(struct dvb_usb_adapter *adap) | ||
628 | { | ||
629 | struct dvb_usb_device *d = adap_to_d(adap); | ||
630 | const char *desc = d->name; | ||
631 | char *fe_name[] = {"_1", "_2", "_3", "_4"}; | ||
632 | char *name = adap->fe[0]->ops.info.name; | ||
633 | |||
634 | strlcpy(name, desc, 128); | ||
635 | strlcat(name, fe_name[adap->id], 128); | ||
636 | |||
637 | return 0; | ||
638 | } | ||
639 | |||
640 | static int it913x_frontend_attach(struct dvb_usb_adapter *adap) | ||
641 | { | ||
642 | struct dvb_usb_device *d = adap_to_d(adap); | ||
643 | struct it913x_state *st = d->priv; | ||
644 | int ret = 0; | ||
645 | u8 adap_addr = I2C_BASE_ADDR + (adap->id << 5); | ||
646 | u16 ep_size = adap->stream.buf_size / 4; | ||
647 | u8 pkt_size = 0x80; | ||
648 | |||
649 | if (d->udev->speed != USB_SPEED_HIGH) | ||
650 | pkt_size = 0x10; | ||
651 | |||
652 | st->it913x_config.adf = it913x_read_reg(d, IO_MUX_POWER_CLK); | ||
653 | |||
654 | adap->fe[0] = dvb_attach(it913x_fe_attach, | ||
655 | &d->i2c_adap, adap_addr, &st->it913x_config); | ||
656 | |||
657 | if (adap->id == 0 && adap->fe[0]) { | ||
658 | it913x_wr_reg(d, DEV_0_DMOD, MP2_SW_RST, 0x1); | ||
659 | it913x_wr_reg(d, DEV_0_DMOD, MP2IF2_SW_RST, 0x1); | ||
660 | it913x_wr_reg(d, DEV_0, EP0_TX_EN, 0x0f); | ||
661 | it913x_wr_reg(d, DEV_0, EP0_TX_NAK, 0x1b); | ||
662 | it913x_wr_reg(d, DEV_0, EP0_TX_EN, 0x2f); | ||
663 | it913x_wr_reg(d, DEV_0, EP4_TX_LEN_LSB, | ||
664 | ep_size & 0xff); | ||
665 | it913x_wr_reg(d, DEV_0, EP4_TX_LEN_MSB, ep_size >> 8); | ||
666 | ret = it913x_wr_reg(d, DEV_0, EP4_MAX_PKT, pkt_size); | ||
667 | } else if (adap->id == 1 && adap->fe[0]) { | ||
668 | it913x_wr_reg(d, DEV_0, EP0_TX_EN, 0x6f); | ||
669 | it913x_wr_reg(d, DEV_0, EP5_TX_LEN_LSB, | ||
670 | ep_size & 0xff); | ||
671 | it913x_wr_reg(d, DEV_0, EP5_TX_LEN_MSB, ep_size >> 8); | ||
672 | it913x_wr_reg(d, DEV_0, EP5_MAX_PKT, pkt_size); | ||
673 | it913x_wr_reg(d, DEV_0_DMOD, MP2IF2_EN, 0x1); | ||
674 | it913x_wr_reg(d, DEV_1_DMOD, MP2IF_SERIAL, 0x1); | ||
675 | it913x_wr_reg(d, DEV_1, TOP_HOSTB_SER_MODE, 0x1); | ||
676 | it913x_wr_reg(d, DEV_0_DMOD, TSIS_ENABLE, 0x1); | ||
677 | it913x_wr_reg(d, DEV_0_DMOD, MP2_SW_RST, 0x0); | ||
678 | it913x_wr_reg(d, DEV_0_DMOD, MP2IF2_SW_RST, 0x0); | ||
679 | it913x_wr_reg(d, DEV_0_DMOD, MP2IF2_HALF_PSB, 0x0); | ||
680 | it913x_wr_reg(d, DEV_0_DMOD, MP2IF_STOP_EN, 0x1); | ||
681 | it913x_wr_reg(d, DEV_1_DMOD, MPEG_FULL_SPEED, 0x0); | ||
682 | ret = it913x_wr_reg(d, DEV_1_DMOD, MP2IF_STOP_EN, 0x0); | ||
683 | } else | ||
684 | return -ENODEV; | ||
685 | |||
686 | ret |= it913x_name(adap); | ||
687 | |||
688 | return ret; | ||
689 | } | ||
690 | |||
691 | /* DVB USB Driver */ | ||
692 | static int it913x_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc) | ||
693 | { | ||
694 | struct it913x_state *st = d->priv; | ||
695 | |||
696 | if (st->proprietary_ir == false) { | ||
697 | rc->map_name = NULL; | ||
698 | return 0; | ||
699 | } | ||
700 | |||
701 | rc->allowed_protos = RC_TYPE_NEC; | ||
702 | rc->query = it913x_rc_query; | ||
703 | rc->interval = 250; | ||
704 | |||
705 | return 0; | ||
706 | } | ||
707 | |||
708 | static int it913x_get_adapter_count(struct dvb_usb_device *d) | ||
709 | { | ||
710 | struct it913x_state *st = d->priv; | ||
711 | if (st->it913x_config.dual_mode) | ||
712 | return 2; | ||
713 | return 1; | ||
714 | } | ||
715 | |||
716 | static struct dvb_usb_device_properties it913x_properties = { | ||
717 | .driver_name = KBUILD_MODNAME, | ||
718 | .owner = THIS_MODULE, | ||
719 | .bInterfaceNumber = 0, | ||
720 | .generic_bulk_ctrl_endpoint = 0x02, | ||
721 | .generic_bulk_ctrl_endpoint_response = 0x81, | ||
722 | |||
723 | .adapter_nr = adapter_nr, | ||
724 | .size_of_priv = sizeof(struct it913x_state), | ||
725 | |||
726 | .identify_state = it913x_identify_state, | ||
727 | .i2c_algo = &it913x_i2c_algo, | ||
728 | |||
729 | .download_firmware = it913x_download_firmware, | ||
730 | |||
731 | .frontend_attach = it913x_frontend_attach, | ||
732 | .get_rc_config = it913x_get_rc_config, | ||
733 | .get_stream_config = it913x_get_stream_config, | ||
734 | .get_adapter_count = it913x_get_adapter_count, | ||
735 | .streaming_ctrl = it913x_streaming_ctrl, | ||
736 | |||
737 | |||
738 | .adapter = { | ||
739 | { | ||
740 | .caps = DVB_USB_ADAP_HAS_PID_FILTER| | ||
741 | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, | ||
742 | .pid_filter_count = 32, | ||
743 | .pid_filter = it913x_pid_filter, | ||
744 | .pid_filter_ctrl = it913x_pid_filter_ctrl, | ||
745 | .stream = | ||
746 | DVB_USB_STREAM_BULK(0x84, 10, TS_BUFFER_SIZE_MAX), | ||
747 | }, | ||
748 | { | ||
749 | .caps = DVB_USB_ADAP_HAS_PID_FILTER| | ||
750 | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, | ||
751 | .pid_filter_count = 32, | ||
752 | .pid_filter = it913x_pid_filter, | ||
753 | .pid_filter_ctrl = it913x_pid_filter_ctrl, | ||
754 | .stream = | ||
755 | DVB_USB_STREAM_BULK(0x85, 10, TS_BUFFER_SIZE_MAX), | ||
756 | } | ||
757 | } | ||
758 | }; | ||
759 | |||
760 | static const struct usb_device_id it913x_id_table[] = { | ||
761 | { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_UB499_2T_T09, | ||
762 | &it913x_properties, "Kworld UB499-2T T09(IT9137)", | ||
763 | RC_MAP_IT913X_V1) }, | ||
764 | { DVB_USB_DEVICE(USB_VID_ITETECH, USB_PID_ITETECH_IT9135, | ||
765 | &it913x_properties, "ITE 9135 Generic", | ||
766 | RC_MAP_IT913X_V1) }, | ||
767 | { DVB_USB_DEVICE(USB_VID_KWORLD_2, USB_PID_SVEON_STV22_IT9137, | ||
768 | &it913x_properties, "Sveon STV22 Dual DVB-T HDTV(IT9137)", | ||
769 | RC_MAP_IT913X_V1) }, | ||
770 | { DVB_USB_DEVICE(USB_VID_ITETECH, USB_PID_ITETECH_IT9135_9005, | ||
771 | &it913x_properties, "ITE 9135(9005) Generic", | ||
772 | RC_MAP_IT913X_V2) }, | ||
773 | { DVB_USB_DEVICE(USB_VID_ITETECH, USB_PID_ITETECH_IT9135_9006, | ||
774 | &it913x_properties, "ITE 9135(9006) Generic", | ||
775 | RC_MAP_IT913X_V1) }, | ||
776 | {} /* Terminating entry */ | ||
777 | }; | ||
778 | |||
779 | MODULE_DEVICE_TABLE(usb, it913x_id_table); | ||
780 | |||
781 | static struct usb_driver it913x_driver = { | ||
782 | .name = KBUILD_MODNAME, | ||
783 | .probe = dvb_usbv2_probe, | ||
784 | .disconnect = dvb_usbv2_disconnect, | ||
785 | .suspend = dvb_usbv2_suspend, | ||
786 | .resume = dvb_usbv2_resume, | ||
787 | .id_table = it913x_id_table, | ||
788 | }; | ||
789 | |||
790 | module_usb_driver(it913x_driver); | ||
791 | |||
792 | MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>"); | ||
793 | MODULE_DESCRIPTION("it913x USB 2 Driver"); | ||
794 | MODULE_VERSION("1.32"); | ||
795 | MODULE_LICENSE("GPL"); | ||
796 | MODULE_FIRMWARE(FW_IT9135_V1); | ||
797 | MODULE_FIRMWARE(FW_IT9135_V2); | ||
798 | MODULE_FIRMWARE(FW_IT9137); | ||
799 | |||