it913x.c 20 KB

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