it913x-fe.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. /*
  2. * Driver for it913x-fe Frontend
  3. *
  4. * with support for on chip it9137 integral tuner
  5. *
  6. * Copyright (C) 2011 Malcolm Priestley (tvboxspy@gmail.com)
  7. * IT9137 Copyright (C) ITE Tech Inc.
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. *
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.=
  23. */
  24. #include <linux/module.h>
  25. #include <linux/init.h>
  26. #include <linux/slab.h>
  27. #include <linux/types.h>
  28. #include "dvb_frontend.h"
  29. #include "it913x-fe.h"
  30. #include "it913x-fe-priv.h"
  31. static int it913x_debug;
  32. module_param_named(debug, it913x_debug, int, 0644);
  33. MODULE_PARM_DESC(debug, "set debugging level (1=info (or-able)).");
  34. #define dprintk(level, args...) do { \
  35. if (level & it913x_debug) \
  36. printk(KERN_DEBUG "it913x-fe: " args); \
  37. } while (0)
  38. #define deb_info(args...) dprintk(0x01, args)
  39. #define debug_data_snipet(level, name, p) \
  40. dprintk(level, name" (%02x%02x%02x%02x%02x%02x%02x%02x)", \
  41. *p, *(p+1), *(p+2), *(p+3), *(p+4), \
  42. *(p+5), *(p+6), *(p+7));
  43. struct it913x_fe_state {
  44. struct dvb_frontend frontend;
  45. struct i2c_adapter *i2c_adap;
  46. u8 i2c_addr;
  47. u32 frequency;
  48. u8 adf;
  49. u32 crystalFrequency;
  50. u32 adcFrequency;
  51. u8 tuner_type;
  52. struct adctable *table;
  53. fe_status_t it913x_status;
  54. u16 tun_xtal;
  55. u8 tun_fdiv;
  56. u8 tun_clk_mode;
  57. u32 tun_fn_min;
  58. };
  59. static int it913x_read_reg(struct it913x_fe_state *state,
  60. u32 reg, u8 *data, u8 count)
  61. {
  62. int ret;
  63. u8 pro = PRO_DMOD; /* All reads from demodulator */
  64. u8 b[4];
  65. struct i2c_msg msg[2] = {
  66. { .addr = state->i2c_addr + (pro << 1), .flags = 0,
  67. .buf = b, .len = sizeof(b) },
  68. { .addr = state->i2c_addr + (pro << 1), .flags = I2C_M_RD,
  69. .buf = data, .len = count }
  70. };
  71. b[0] = (u8) reg >> 24;
  72. b[1] = (u8)(reg >> 16) & 0xff;
  73. b[2] = (u8)(reg >> 8) & 0xff;
  74. b[3] = (u8) reg & 0xff;
  75. ret = i2c_transfer(state->i2c_adap, msg, 2);
  76. return ret;
  77. }
  78. static int it913x_read_reg_u8(struct it913x_fe_state *state, u32 reg)
  79. {
  80. int ret;
  81. u8 b[1];
  82. ret = it913x_read_reg(state, reg, &b[0], sizeof(b));
  83. return (ret < 0) ? -ENODEV : b[0];
  84. }
  85. static int it913x_write(struct it913x_fe_state *state,
  86. u8 pro, u32 reg, u8 buf[], u8 count)
  87. {
  88. u8 b[256];
  89. struct i2c_msg msg[1] = {
  90. { .addr = state->i2c_addr + (pro << 1), .flags = 0,
  91. .buf = b, .len = count + 4 }
  92. };
  93. int ret;
  94. b[0] = (u8) reg >> 24;
  95. b[1] = (u8)(reg >> 16) & 0xff;
  96. b[2] = (u8)(reg >> 8) & 0xff;
  97. b[3] = (u8) reg & 0xff;
  98. memcpy(&b[4], buf, count);
  99. ret = i2c_transfer(state->i2c_adap, msg, 1);
  100. if (ret < 0)
  101. return -EIO;
  102. return 0;
  103. }
  104. static int it913x_write_reg(struct it913x_fe_state *state,
  105. u8 pro, u32 reg, u32 data)
  106. {
  107. int ret;
  108. u8 b[4];
  109. u8 s;
  110. b[0] = data >> 24;
  111. b[1] = (data >> 16) & 0xff;
  112. b[2] = (data >> 8) & 0xff;
  113. b[3] = data & 0xff;
  114. /* expand write as needed */
  115. if (data < 0x100)
  116. s = 3;
  117. else if (data < 0x1000)
  118. s = 2;
  119. else if (data < 0x100000)
  120. s = 1;
  121. else
  122. s = 0;
  123. ret = it913x_write(state, pro, reg, &b[s], sizeof(b) - s);
  124. return ret;
  125. }
  126. static int it913x_fe_script_loader(struct it913x_fe_state *state,
  127. struct it913xset *loadscript)
  128. {
  129. int ret, i;
  130. if (loadscript == NULL)
  131. return -EINVAL;
  132. for (i = 0; i < 1000; ++i) {
  133. if (loadscript[i].pro == 0xff)
  134. break;
  135. ret = it913x_write(state, loadscript[i].pro,
  136. loadscript[i].address,
  137. loadscript[i].reg, loadscript[i].count);
  138. if (ret < 0)
  139. return -ENODEV;
  140. }
  141. return 0;
  142. }
  143. static int it913x_init_tuner(struct it913x_fe_state *state)
  144. {
  145. int ret, i, reg;
  146. u8 val, nv_val;
  147. u8 nv[] = {48, 32, 24, 16, 12, 8, 6, 4, 2};
  148. u8 b[2];
  149. reg = it913x_read_reg_u8(state, 0xec86);
  150. switch (reg) {
  151. case 0:
  152. state->tun_clk_mode = reg;
  153. state->tun_xtal = 2000;
  154. state->tun_fdiv = 3;
  155. val = 16;
  156. break;
  157. case -ENODEV:
  158. return -ENODEV;
  159. case 1:
  160. default:
  161. state->tun_clk_mode = reg;
  162. state->tun_xtal = 640;
  163. state->tun_fdiv = 1;
  164. val = 6;
  165. break;
  166. }
  167. reg = it913x_read_reg_u8(state, 0xed03);
  168. if (reg < 0)
  169. return -ENODEV;
  170. else if (reg < sizeof(nv))
  171. nv_val = nv[reg];
  172. else
  173. nv_val = 2;
  174. for (i = 0; i < 50; i++) {
  175. ret = it913x_read_reg(state, 0xed23, &b[0], sizeof(b));
  176. reg = (b[1] << 8) + b[0];
  177. if (reg > 0)
  178. break;
  179. if (ret < 0)
  180. return -ENODEV;
  181. udelay(2000);
  182. }
  183. state->tun_fn_min = state->tun_xtal * reg;
  184. state->tun_fn_min /= (state->tun_fdiv * nv_val);
  185. deb_info("Tuner fn_min %d", state->tun_fn_min);
  186. for (i = 0; i < 50; i++) {
  187. reg = it913x_read_reg_u8(state, 0xec82);
  188. if (reg > 0)
  189. break;
  190. if (reg < 0)
  191. return -ENODEV;
  192. udelay(2000);
  193. }
  194. return it913x_write_reg(state, PRO_DMOD, 0xed81, val);
  195. }
  196. static int it9137_set_tuner(struct it913x_fe_state *state,
  197. enum fe_bandwidth bandwidth, u32 frequency_m)
  198. {
  199. struct it913xset *set_tuner = set_it9137_template;
  200. int ret, reg;
  201. u32 frequency = frequency_m / 1000;
  202. u32 freq, temp_f, tmp;
  203. u16 iqik_m_cal;
  204. u16 n_div;
  205. u8 n;
  206. u8 l_band;
  207. u8 lna_band;
  208. u8 bw;
  209. deb_info("Tuner Frequency %d Bandwidth %d", frequency, bandwidth);
  210. if (frequency >= 51000 && frequency <= 440000) {
  211. l_band = 0;
  212. lna_band = 0;
  213. } else if (frequency > 440000 && frequency <= 484000) {
  214. l_band = 1;
  215. lna_band = 1;
  216. } else if (frequency > 484000 && frequency <= 533000) {
  217. l_band = 1;
  218. lna_band = 2;
  219. } else if (frequency > 533000 && frequency <= 587000) {
  220. l_band = 1;
  221. lna_band = 3;
  222. } else if (frequency > 587000 && frequency <= 645000) {
  223. l_band = 1;
  224. lna_band = 4;
  225. } else if (frequency > 645000 && frequency <= 710000) {
  226. l_band = 1;
  227. lna_band = 5;
  228. } else if (frequency > 710000 && frequency <= 782000) {
  229. l_band = 1;
  230. lna_band = 6;
  231. } else if (frequency > 782000 && frequency <= 860000) {
  232. l_band = 1;
  233. lna_band = 7;
  234. } else if (frequency > 1450000 && frequency <= 1492000) {
  235. l_band = 1;
  236. lna_band = 0;
  237. } else if (frequency > 1660000 && frequency <= 1685000) {
  238. l_band = 1;
  239. lna_band = 1;
  240. } else
  241. return -EINVAL;
  242. set_tuner[0].reg[0] = lna_band;
  243. if (bandwidth == BANDWIDTH_5_MHZ)
  244. bw = 0;
  245. else if (bandwidth == BANDWIDTH_6_MHZ)
  246. bw = 2;
  247. else if (bandwidth == BANDWIDTH_7_MHZ)
  248. bw = 4;
  249. else if (bandwidth == BANDWIDTH_8_MHZ)
  250. bw = 6;
  251. else
  252. bw = 6;
  253. set_tuner[1].reg[0] = bw;
  254. set_tuner[2].reg[0] = 0xa0 | (l_band << 3);
  255. if (frequency > 53000 && frequency <= 74000) {
  256. n_div = 48;
  257. n = 0;
  258. } else if (frequency > 74000 && frequency <= 111000) {
  259. n_div = 32;
  260. n = 1;
  261. } else if (frequency > 111000 && frequency <= 148000) {
  262. n_div = 24;
  263. n = 2;
  264. } else if (frequency > 148000 && frequency <= 222000) {
  265. n_div = 16;
  266. n = 3;
  267. } else if (frequency > 222000 && frequency <= 296000) {
  268. n_div = 12;
  269. n = 4;
  270. } else if (frequency > 296000 && frequency <= 445000) {
  271. n_div = 8;
  272. n = 5;
  273. } else if (frequency > 445000 && frequency <= state->tun_fn_min) {
  274. n_div = 6;
  275. n = 6;
  276. } else if (frequency > state->tun_fn_min && frequency <= 950000) {
  277. n_div = 4;
  278. n = 7;
  279. } else if (frequency > 1450000 && frequency <= 1680000) {
  280. n_div = 2;
  281. n = 0;
  282. } else
  283. return -EINVAL;
  284. reg = it913x_read_reg_u8(state, 0xed81);
  285. iqik_m_cal = (u16)reg * n_div;
  286. if (reg < 0x20) {
  287. if (state->tun_clk_mode == 0)
  288. iqik_m_cal = (iqik_m_cal * 9) >> 5;
  289. else
  290. iqik_m_cal >>= 1;
  291. } else {
  292. iqik_m_cal = 0x40 - iqik_m_cal;
  293. if (state->tun_clk_mode == 0)
  294. iqik_m_cal = ~((iqik_m_cal * 9) >> 5);
  295. else
  296. iqik_m_cal = ~(iqik_m_cal >> 1);
  297. }
  298. temp_f = frequency * (u32)n_div * (u32)state->tun_fdiv;
  299. freq = temp_f / state->tun_xtal;
  300. tmp = freq * state->tun_xtal;
  301. if ((temp_f - tmp) >= (state->tun_xtal >> 1))
  302. freq++;
  303. freq += (u32) n << 13;
  304. /* Frequency OMEGA_IQIK_M_CAL_MID*/
  305. temp_f = freq + (u32)iqik_m_cal;
  306. set_tuner[3].reg[0] = temp_f & 0xff;
  307. set_tuner[4].reg[0] = (temp_f >> 8) & 0xff;
  308. deb_info("High Frequency = %04x", temp_f);
  309. /* Lower frequency */
  310. set_tuner[5].reg[0] = freq & 0xff;
  311. set_tuner[6].reg[0] = (freq >> 8) & 0xff;
  312. deb_info("low Frequency = %04x", freq);
  313. ret = it913x_fe_script_loader(state, set_tuner);
  314. return (ret < 0) ? -ENODEV : 0;
  315. }
  316. static int it913x_fe_select_bw(struct it913x_fe_state *state,
  317. enum fe_bandwidth bandwidth, u32 adcFrequency)
  318. {
  319. int ret, i;
  320. u8 buffer[256];
  321. u32 coeff[8];
  322. u16 bfsfcw_fftinx_ratio;
  323. u16 fftinx_bfsfcw_ratio;
  324. u8 count;
  325. u8 bw;
  326. u8 adcmultiplier;
  327. deb_info("Bandwidth %d Adc %d", bandwidth, adcFrequency);
  328. if (bandwidth == BANDWIDTH_5_MHZ)
  329. bw = 3;
  330. else if (bandwidth == BANDWIDTH_6_MHZ)
  331. bw = 0;
  332. else if (bandwidth == BANDWIDTH_7_MHZ)
  333. bw = 1;
  334. else if (bandwidth == BANDWIDTH_8_MHZ)
  335. bw = 2;
  336. else
  337. bw = 2;
  338. ret = it913x_write_reg(state, PRO_DMOD, REG_BW, bw);
  339. if (state->table == NULL)
  340. return -EINVAL;
  341. /* In write order */
  342. coeff[0] = state->table[bw].coeff_1_2048;
  343. coeff[1] = state->table[bw].coeff_2_2k;
  344. coeff[2] = state->table[bw].coeff_1_8191;
  345. coeff[3] = state->table[bw].coeff_1_8192;
  346. coeff[4] = state->table[bw].coeff_1_8193;
  347. coeff[5] = state->table[bw].coeff_2_8k;
  348. coeff[6] = state->table[bw].coeff_1_4096;
  349. coeff[7] = state->table[bw].coeff_2_4k;
  350. bfsfcw_fftinx_ratio = state->table[bw].bfsfcw_fftinx_ratio;
  351. fftinx_bfsfcw_ratio = state->table[bw].fftinx_bfsfcw_ratio;
  352. /* ADC multiplier */
  353. ret = it913x_read_reg_u8(state, ADC_X_2);
  354. if (ret < 0)
  355. return -EINVAL;
  356. adcmultiplier = ret;
  357. count = 0;
  358. /* Build Buffer for COEFF Registers */
  359. for (i = 0; i < 8; i++) {
  360. if (adcmultiplier == 1)
  361. coeff[i] /= 2;
  362. buffer[count++] = (coeff[i] >> 24) & 0x3;
  363. buffer[count++] = (coeff[i] >> 16) & 0xff;
  364. buffer[count++] = (coeff[i] >> 8) & 0xff;
  365. buffer[count++] = coeff[i] & 0xff;
  366. }
  367. /* bfsfcw_fftinx_ratio register 0x21-0x22 */
  368. buffer[count++] = bfsfcw_fftinx_ratio & 0xff;
  369. buffer[count++] = (bfsfcw_fftinx_ratio >> 8) & 0xff;
  370. /* fftinx_bfsfcw_ratio register 0x23-0x24 */
  371. buffer[count++] = fftinx_bfsfcw_ratio & 0xff;
  372. buffer[count++] = (fftinx_bfsfcw_ratio >> 8) & 0xff;
  373. /* start at COEFF_1_2048 and write through to fftinx_bfsfcw_ratio*/
  374. ret = it913x_write(state, PRO_DMOD, COEFF_1_2048, buffer, count);
  375. for (i = 0; i < 42; i += 8)
  376. debug_data_snipet(0x1, "Buffer", &buffer[i]);
  377. return ret;
  378. }
  379. static int it913x_fe_read_status(struct dvb_frontend *fe, fe_status_t *status)
  380. {
  381. struct it913x_fe_state *state = fe->demodulator_priv;
  382. int ret, i;
  383. fe_status_t old_status = state->it913x_status;
  384. *status = 0;
  385. if (state->it913x_status == 0) {
  386. ret = it913x_read_reg_u8(state, EMPTY_CHANNEL_STATUS);
  387. if (ret == 0x1) {
  388. *status |= FE_HAS_SIGNAL;
  389. for (i = 0; i < 40; i++) {
  390. ret = it913x_read_reg_u8(state, MP2IF_SYNC_LK);
  391. if (ret == 0x1)
  392. break;
  393. msleep(25);
  394. }
  395. if (ret == 0x1)
  396. *status |= FE_HAS_CARRIER
  397. | FE_HAS_VITERBI
  398. | FE_HAS_SYNC;
  399. state->it913x_status = *status;
  400. }
  401. }
  402. if (state->it913x_status & FE_HAS_SYNC) {
  403. ret = it913x_read_reg_u8(state, TPSD_LOCK);
  404. if (ret == 0x1)
  405. *status |= FE_HAS_LOCK
  406. | state->it913x_status;
  407. else
  408. state->it913x_status = 0;
  409. if (old_status != state->it913x_status)
  410. ret = it913x_write_reg(state, PRO_LINK, GPIOH3_O, ret);
  411. }
  412. return 0;
  413. }
  414. static int it913x_fe_read_signal_strength(struct dvb_frontend *fe,
  415. u16 *strength)
  416. {
  417. struct it913x_fe_state *state = fe->demodulator_priv;
  418. int ret = it913x_read_reg_u8(state, SIGNAL_LEVEL);
  419. /*SIGNAL_LEVEL always returns 100%! so using FE_HAS_SIGNAL as switch*/
  420. if (state->it913x_status & FE_HAS_SIGNAL)
  421. ret = (ret * 0xff) / 0x64;
  422. else
  423. ret = 0x0;
  424. ret |= ret << 0x8;
  425. *strength = ret;
  426. return 0;
  427. }
  428. static int it913x_fe_read_snr(struct dvb_frontend *fe, u16* snr)
  429. {
  430. struct it913x_fe_state *state = fe->demodulator_priv;
  431. int ret = it913x_read_reg_u8(state, SIGNAL_QUALITY);
  432. ret = (ret * 0xff) / 0x64;
  433. ret |= (ret << 0x8);
  434. *snr = ~ret;
  435. return 0;
  436. }
  437. static int it913x_fe_read_ber(struct dvb_frontend *fe, u32 *ber)
  438. {
  439. *ber = 0;
  440. return 0;
  441. }
  442. static int it913x_fe_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
  443. {
  444. *ucblocks = 0;
  445. return 0;
  446. }
  447. static int it913x_fe_get_frontend(struct dvb_frontend *fe,
  448. struct dvb_frontend_parameters *p)
  449. {
  450. struct it913x_fe_state *state = fe->demodulator_priv;
  451. int ret;
  452. u8 reg[8];
  453. ret = it913x_read_reg(state, REG_TPSD_TX_MODE, reg, sizeof(reg));
  454. if (reg[3] < 3)
  455. p->u.ofdm.constellation = fe_con[reg[3]];
  456. if (reg[0] < 3)
  457. p->u.ofdm.transmission_mode = fe_mode[reg[0]];
  458. if (reg[1] < 4)
  459. p->u.ofdm.guard_interval = fe_gi[reg[1]];
  460. if (reg[2] < 4)
  461. p->u.ofdm.hierarchy_information = fe_hi[reg[2]];
  462. p->u.ofdm.code_rate_HP = (reg[6] < 6) ? fe_code[reg[6]] : FEC_NONE;
  463. p->u.ofdm.code_rate_LP = (reg[7] < 6) ? fe_code[reg[7]] : FEC_NONE;
  464. return 0;
  465. }
  466. static int it913x_fe_set_frontend(struct dvb_frontend *fe,
  467. struct dvb_frontend_parameters *p)
  468. {
  469. struct it913x_fe_state *state = fe->demodulator_priv;
  470. int ret, i;
  471. u8 empty_ch, last_ch;
  472. state->it913x_status = 0;
  473. /* Set bw*/
  474. ret = it913x_fe_select_bw(state, p->u.ofdm.bandwidth,
  475. state->adcFrequency);
  476. /* Training Mode Off */
  477. ret = it913x_write_reg(state, PRO_LINK, TRAINING_MODE, 0x0);
  478. /* Clear Empty Channel */
  479. ret = it913x_write_reg(state, PRO_DMOD, EMPTY_CHANNEL_STATUS, 0x0);
  480. /* Clear bits */
  481. ret = it913x_write_reg(state, PRO_DMOD, MP2IF_SYNC_LK, 0x0);
  482. /* LED on */
  483. ret = it913x_write_reg(state, PRO_LINK, GPIOH3_O, 0x1);
  484. /* Select Band*/
  485. if ((p->frequency >= 51000000) && (p->frequency <= 230000000))
  486. i = 0;
  487. else if ((p->frequency >= 350000000) && (p->frequency <= 900000000))
  488. i = 1;
  489. else if ((p->frequency >= 1450000000) && (p->frequency <= 1680000000))
  490. i = 2;
  491. else
  492. return -EOPNOTSUPP;
  493. ret = it913x_write_reg(state, PRO_DMOD, FREE_BAND, i);
  494. deb_info("Frontend Set Tuner Type %02x", state->tuner_type);
  495. switch (state->tuner_type) {
  496. case IT9137: /* Tuner type 0x38 */
  497. ret = it9137_set_tuner(state,
  498. p->u.ofdm.bandwidth, p->frequency);
  499. break;
  500. default:
  501. if (fe->ops.tuner_ops.set_params) {
  502. fe->ops.tuner_ops.set_params(fe, p);
  503. if (fe->ops.i2c_gate_ctrl)
  504. fe->ops.i2c_gate_ctrl(fe, 0);
  505. }
  506. break;
  507. }
  508. /* LED off */
  509. ret = it913x_write_reg(state, PRO_LINK, GPIOH3_O, 0x0);
  510. /* Trigger ofsm */
  511. ret = it913x_write_reg(state, PRO_DMOD, TRIGGER_OFSM, 0x0);
  512. last_ch = 2;
  513. for (i = 0; i < 40; ++i) {
  514. empty_ch = it913x_read_reg_u8(state, EMPTY_CHANNEL_STATUS);
  515. if (last_ch == 1 && empty_ch == 1)
  516. break;
  517. if (last_ch == 2 && empty_ch == 2)
  518. return 0;
  519. last_ch = empty_ch;
  520. msleep(25);
  521. }
  522. for (i = 0; i < 40; ++i) {
  523. if (it913x_read_reg_u8(state, D_TPSD_LOCK) == 1)
  524. break;
  525. msleep(25);
  526. }
  527. state->frequency = p->frequency;
  528. return 0;
  529. }
  530. static int it913x_fe_suspend(struct it913x_fe_state *state)
  531. {
  532. int ret, i;
  533. u8 b;
  534. ret = it913x_write_reg(state, PRO_DMOD, SUSPEND_FLAG, 0x1);
  535. ret |= it913x_write_reg(state, PRO_DMOD, TRIGGER_OFSM, 0x0);
  536. for (i = 0; i < 128; i++) {
  537. ret = it913x_read_reg(state, SUSPEND_FLAG, &b, 1);
  538. if (ret < 0)
  539. return -EINVAL;
  540. if (b == 0)
  541. break;
  542. }
  543. ret |= it913x_write_reg(state, PRO_DMOD, AFE_MEM0, 0x8);
  544. /* Turn LED off */
  545. ret = it913x_write_reg(state, PRO_LINK, GPIOH3_O, 0x0);
  546. return 0;
  547. }
  548. static int it913x_fe_sleep(struct dvb_frontend *fe)
  549. {
  550. struct it913x_fe_state *state = fe->demodulator_priv;
  551. return it913x_fe_suspend(state);
  552. }
  553. static u32 compute_div(u32 a, u32 b, u32 x)
  554. {
  555. u32 res = 0;
  556. u32 c = 0;
  557. u32 i = 0;
  558. if (a > b) {
  559. c = a / b;
  560. a = a - c * b;
  561. }
  562. for (i = 0; i < x; i++) {
  563. if (a >= b) {
  564. res += 1;
  565. a -= b;
  566. }
  567. a <<= 1;
  568. res <<= 1;
  569. }
  570. res = (c << x) + res;
  571. return res;
  572. }
  573. static int it913x_fe_start(struct it913x_fe_state *state)
  574. {
  575. struct it913xset *set_fe;
  576. struct it913xset *set_mode;
  577. int ret;
  578. u8 adf = (state->adf & 0xf);
  579. u32 adc, xtal;
  580. u8 b[4];
  581. ret = it913x_init_tuner(state);
  582. if (adf < 12) {
  583. state->crystalFrequency = fe_clockTable[adf].xtal ;
  584. state->table = fe_clockTable[adf].table;
  585. state->adcFrequency = state->table->adcFrequency;
  586. adc = compute_div(state->adcFrequency, 1000000ul, 19ul);
  587. xtal = compute_div(state->crystalFrequency, 1000000ul, 19ul);
  588. } else
  589. return -EINVAL;
  590. deb_info("Xtal Freq :%d Adc Freq :%d Adc %08x Xtal %08x",
  591. state->crystalFrequency, state->adcFrequency, adc, xtal);
  592. /* Set LED indicator on GPIOH3 */
  593. ret = it913x_write_reg(state, PRO_LINK, GPIOH3_EN, 0x1);
  594. ret |= it913x_write_reg(state, PRO_LINK, GPIOH3_ON, 0x1);
  595. ret |= it913x_write_reg(state, PRO_LINK, GPIOH3_O, 0x1);
  596. ret |= it913x_write_reg(state, PRO_LINK, 0xf641, state->tuner_type);
  597. ret |= it913x_write_reg(state, PRO_DMOD, 0xf5ca, 0x01);
  598. ret |= it913x_write_reg(state, PRO_DMOD, 0xf715, 0x01);
  599. b[0] = xtal & 0xff;
  600. b[1] = (xtal >> 8) & 0xff;
  601. b[2] = (xtal >> 16) & 0xff;
  602. b[3] = (xtal >> 24);
  603. ret |= it913x_write(state, PRO_DMOD, XTAL_CLK, b , 4);
  604. b[0] = adc & 0xff;
  605. b[1] = (adc >> 8) & 0xff;
  606. b[2] = (adc >> 16) & 0xff;
  607. ret |= it913x_write(state, PRO_DMOD, ADC_FREQ, b, 3);
  608. switch (state->tuner_type) {
  609. case IT9137: /* Tuner type 0x38 */
  610. set_fe = it9137_set;
  611. break;
  612. default:
  613. return -EINVAL;
  614. }
  615. /* set the demod */
  616. ret = it913x_fe_script_loader(state, set_fe);
  617. /* Always solo frontend */
  618. set_mode = set_solo_fe;
  619. ret |= it913x_fe_script_loader(state, set_mode);
  620. ret |= it913x_fe_suspend(state);
  621. return 0;
  622. }
  623. static int it913x_fe_init(struct dvb_frontend *fe)
  624. {
  625. struct it913x_fe_state *state = fe->demodulator_priv;
  626. int ret = 0;
  627. it913x_write_reg(state, PRO_DMOD, AFE_MEM0, 0x0);
  628. ret |= it913x_fe_script_loader(state, init_1);
  629. return (ret < 0) ? -ENODEV : 0;
  630. }
  631. static void it913x_fe_release(struct dvb_frontend *fe)
  632. {
  633. struct it913x_fe_state *state = fe->demodulator_priv;
  634. kfree(state);
  635. }
  636. static struct dvb_frontend_ops it913x_fe_ofdm_ops;
  637. struct dvb_frontend *it913x_fe_attach(struct i2c_adapter *i2c_adap,
  638. u8 i2c_addr, u8 adf, u8 type)
  639. {
  640. struct it913x_fe_state *state = NULL;
  641. int ret;
  642. /* allocate memory for the internal state */
  643. state = kzalloc(sizeof(struct it913x_fe_state), GFP_KERNEL);
  644. if (state == NULL)
  645. goto error;
  646. state->i2c_adap = i2c_adap;
  647. state->i2c_addr = i2c_addr;
  648. state->adf = adf;
  649. state->tuner_type = type;
  650. ret = it913x_fe_start(state);
  651. if (ret < 0)
  652. goto error;
  653. /* create dvb_frontend */
  654. memcpy(&state->frontend.ops, &it913x_fe_ofdm_ops,
  655. sizeof(struct dvb_frontend_ops));
  656. state->frontend.demodulator_priv = state;
  657. return &state->frontend;
  658. error:
  659. kfree(state);
  660. return NULL;
  661. }
  662. EXPORT_SYMBOL(it913x_fe_attach);
  663. static struct dvb_frontend_ops it913x_fe_ofdm_ops = {
  664. .info = {
  665. .name = "it913x-fe DVB-T",
  666. .type = FE_OFDM,
  667. .frequency_min = 51000000,
  668. .frequency_max = 1680000000,
  669. .frequency_stepsize = 62500,
  670. .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
  671. FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
  672. FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
  673. FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
  674. FE_CAN_TRANSMISSION_MODE_AUTO |
  675. FE_CAN_GUARD_INTERVAL_AUTO |
  676. FE_CAN_HIERARCHY_AUTO,
  677. },
  678. .release = it913x_fe_release,
  679. .init = it913x_fe_init,
  680. .sleep = it913x_fe_sleep,
  681. .set_frontend = it913x_fe_set_frontend,
  682. .get_frontend = it913x_fe_get_frontend,
  683. .read_status = it913x_fe_read_status,
  684. .read_signal_strength = it913x_fe_read_signal_strength,
  685. .read_snr = it913x_fe_read_snr,
  686. .read_ber = it913x_fe_read_ber,
  687. .read_ucblocks = it913x_fe_read_ucblocks,
  688. };
  689. MODULE_DESCRIPTION("it913x Frontend and it9137 tuner");
  690. MODULE_AUTHOR("Malcolm Priestley tvboxspy@gmail.com");
  691. MODULE_VERSION("1.06");
  692. MODULE_LICENSE("GPL");