it913x-fe.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964
  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. #define info(format, arg...) \
  44. printk(KERN_INFO "it913x-fe: " format "\n" , ## arg)
  45. struct it913x_fe_state {
  46. struct dvb_frontend frontend;
  47. struct i2c_adapter *i2c_adap;
  48. struct ite_config *config;
  49. u8 i2c_addr;
  50. u32 frequency;
  51. fe_modulation_t constellation;
  52. fe_transmit_mode_t transmission_mode;
  53. u32 crystalFrequency;
  54. u32 adcFrequency;
  55. u8 tuner_type;
  56. struct adctable *table;
  57. fe_status_t it913x_status;
  58. u16 tun_xtal;
  59. u8 tun_fdiv;
  60. u8 tun_clk_mode;
  61. u32 tun_fn_min;
  62. };
  63. static int it913x_read_reg(struct it913x_fe_state *state,
  64. u32 reg, u8 *data, u8 count)
  65. {
  66. int ret;
  67. u8 pro = PRO_DMOD; /* All reads from demodulator */
  68. u8 b[4];
  69. struct i2c_msg msg[2] = {
  70. { .addr = state->i2c_addr + (pro << 1), .flags = 0,
  71. .buf = b, .len = sizeof(b) },
  72. { .addr = state->i2c_addr + (pro << 1), .flags = I2C_M_RD,
  73. .buf = data, .len = count }
  74. };
  75. b[0] = (u8) reg >> 24;
  76. b[1] = (u8)(reg >> 16) & 0xff;
  77. b[2] = (u8)(reg >> 8) & 0xff;
  78. b[3] = (u8) reg & 0xff;
  79. ret = i2c_transfer(state->i2c_adap, msg, 2);
  80. return ret;
  81. }
  82. static int it913x_read_reg_u8(struct it913x_fe_state *state, u32 reg)
  83. {
  84. int ret;
  85. u8 b[1];
  86. ret = it913x_read_reg(state, reg, &b[0], sizeof(b));
  87. return (ret < 0) ? -ENODEV : b[0];
  88. }
  89. static int it913x_write(struct it913x_fe_state *state,
  90. u8 pro, u32 reg, u8 buf[], u8 count)
  91. {
  92. u8 b[256];
  93. struct i2c_msg msg[1] = {
  94. { .addr = state->i2c_addr + (pro << 1), .flags = 0,
  95. .buf = b, .len = count + 4 }
  96. };
  97. int ret;
  98. b[0] = (u8) reg >> 24;
  99. b[1] = (u8)(reg >> 16) & 0xff;
  100. b[2] = (u8)(reg >> 8) & 0xff;
  101. b[3] = (u8) reg & 0xff;
  102. memcpy(&b[4], buf, count);
  103. ret = i2c_transfer(state->i2c_adap, msg, 1);
  104. if (ret < 0)
  105. return -EIO;
  106. return 0;
  107. }
  108. static int it913x_write_reg(struct it913x_fe_state *state,
  109. u8 pro, u32 reg, u32 data)
  110. {
  111. int ret;
  112. u8 b[4];
  113. u8 s;
  114. b[0] = data >> 24;
  115. b[1] = (data >> 16) & 0xff;
  116. b[2] = (data >> 8) & 0xff;
  117. b[3] = data & 0xff;
  118. /* expand write as needed */
  119. if (data < 0x100)
  120. s = 3;
  121. else if (data < 0x1000)
  122. s = 2;
  123. else if (data < 0x100000)
  124. s = 1;
  125. else
  126. s = 0;
  127. ret = it913x_write(state, pro, reg, &b[s], sizeof(b) - s);
  128. return ret;
  129. }
  130. static int it913x_fe_script_loader(struct it913x_fe_state *state,
  131. struct it913xset *loadscript)
  132. {
  133. int ret, i;
  134. if (loadscript == NULL)
  135. return -EINVAL;
  136. for (i = 0; i < 1000; ++i) {
  137. if (loadscript[i].pro == 0xff)
  138. break;
  139. ret = it913x_write(state, loadscript[i].pro,
  140. loadscript[i].address,
  141. loadscript[i].reg, loadscript[i].count);
  142. if (ret < 0)
  143. return -ENODEV;
  144. }
  145. return 0;
  146. }
  147. static int it913x_init_tuner(struct it913x_fe_state *state)
  148. {
  149. int ret, i, reg;
  150. u8 val, nv_val;
  151. u8 nv[] = {48, 32, 24, 16, 12, 8, 6, 4, 2};
  152. u8 b[2];
  153. reg = it913x_read_reg_u8(state, 0xec86);
  154. switch (reg) {
  155. case 0:
  156. state->tun_clk_mode = reg;
  157. state->tun_xtal = 2000;
  158. state->tun_fdiv = 3;
  159. val = 16;
  160. break;
  161. case -ENODEV:
  162. return -ENODEV;
  163. case 1:
  164. default:
  165. state->tun_clk_mode = reg;
  166. state->tun_xtal = 640;
  167. state->tun_fdiv = 1;
  168. val = 6;
  169. break;
  170. }
  171. reg = it913x_read_reg_u8(state, 0xed03);
  172. if (reg < 0)
  173. return -ENODEV;
  174. else if (reg < sizeof(nv))
  175. nv_val = nv[reg];
  176. else
  177. nv_val = 2;
  178. for (i = 0; i < 50; i++) {
  179. ret = it913x_read_reg(state, 0xed23, &b[0], sizeof(b));
  180. reg = (b[1] << 8) + b[0];
  181. if (reg > 0)
  182. break;
  183. if (ret < 0)
  184. return -ENODEV;
  185. udelay(2000);
  186. }
  187. state->tun_fn_min = state->tun_xtal * reg;
  188. state->tun_fn_min /= (state->tun_fdiv * nv_val);
  189. deb_info("Tuner fn_min %d", state->tun_fn_min);
  190. if (state->config->chip_ver > 1)
  191. msleep(50);
  192. else {
  193. for (i = 0; i < 50; i++) {
  194. reg = it913x_read_reg_u8(state, 0xec82);
  195. if (reg > 0)
  196. break;
  197. if (reg < 0)
  198. return -ENODEV;
  199. udelay(2000);
  200. }
  201. }
  202. return it913x_write_reg(state, PRO_DMOD, 0xed81, val);
  203. }
  204. static int it9137_set_tuner(struct it913x_fe_state *state,
  205. u32 bandwidth, u32 frequency_m)
  206. {
  207. struct it913xset *set_tuner = set_it9137_template;
  208. int ret, reg;
  209. u32 frequency = frequency_m / 1000;
  210. u32 freq, temp_f, tmp;
  211. u16 iqik_m_cal;
  212. u16 n_div;
  213. u8 n;
  214. u8 l_band;
  215. u8 lna_band;
  216. u8 bw;
  217. if (state->config->firmware_ver == 1)
  218. set_tuner = set_it9135_template;
  219. else
  220. set_tuner = set_it9137_template;
  221. deb_info("Tuner Frequency %d Bandwidth %d", frequency, bandwidth);
  222. if (frequency >= 51000 && frequency <= 440000) {
  223. l_band = 0;
  224. lna_band = 0;
  225. } else if (frequency > 440000 && frequency <= 484000) {
  226. l_band = 1;
  227. lna_band = 1;
  228. } else if (frequency > 484000 && frequency <= 533000) {
  229. l_band = 1;
  230. lna_band = 2;
  231. } else if (frequency > 533000 && frequency <= 587000) {
  232. l_band = 1;
  233. lna_band = 3;
  234. } else if (frequency > 587000 && frequency <= 645000) {
  235. l_band = 1;
  236. lna_band = 4;
  237. } else if (frequency > 645000 && frequency <= 710000) {
  238. l_band = 1;
  239. lna_band = 5;
  240. } else if (frequency > 710000 && frequency <= 782000) {
  241. l_band = 1;
  242. lna_band = 6;
  243. } else if (frequency > 782000 && frequency <= 860000) {
  244. l_band = 1;
  245. lna_band = 7;
  246. } else if (frequency > 1450000 && frequency <= 1492000) {
  247. l_band = 1;
  248. lna_band = 0;
  249. } else if (frequency > 1660000 && frequency <= 1685000) {
  250. l_band = 1;
  251. lna_band = 1;
  252. } else
  253. return -EINVAL;
  254. set_tuner[0].reg[0] = lna_band;
  255. switch (bandwidth) {
  256. case 5000000:
  257. bw = 0;
  258. break;
  259. case 6000000:
  260. bw = 2;
  261. break;
  262. case 7000000:
  263. bw = 4;
  264. break;
  265. default:
  266. case 8000000:
  267. bw = 6;
  268. break;
  269. }
  270. set_tuner[1].reg[0] = bw;
  271. set_tuner[2].reg[0] = 0xa0 | (l_band << 3);
  272. if (frequency > 53000 && frequency <= 74000) {
  273. n_div = 48;
  274. n = 0;
  275. } else if (frequency > 74000 && frequency <= 111000) {
  276. n_div = 32;
  277. n = 1;
  278. } else if (frequency > 111000 && frequency <= 148000) {
  279. n_div = 24;
  280. n = 2;
  281. } else if (frequency > 148000 && frequency <= 222000) {
  282. n_div = 16;
  283. n = 3;
  284. } else if (frequency > 222000 && frequency <= 296000) {
  285. n_div = 12;
  286. n = 4;
  287. } else if (frequency > 296000 && frequency <= 445000) {
  288. n_div = 8;
  289. n = 5;
  290. } else if (frequency > 445000 && frequency <= state->tun_fn_min) {
  291. n_div = 6;
  292. n = 6;
  293. } else if (frequency > state->tun_fn_min && frequency <= 950000) {
  294. n_div = 4;
  295. n = 7;
  296. } else if (frequency > 1450000 && frequency <= 1680000) {
  297. n_div = 2;
  298. n = 0;
  299. } else
  300. return -EINVAL;
  301. reg = it913x_read_reg_u8(state, 0xed81);
  302. iqik_m_cal = (u16)reg * n_div;
  303. if (reg < 0x20) {
  304. if (state->tun_clk_mode == 0)
  305. iqik_m_cal = (iqik_m_cal * 9) >> 5;
  306. else
  307. iqik_m_cal >>= 1;
  308. } else {
  309. iqik_m_cal = 0x40 - iqik_m_cal;
  310. if (state->tun_clk_mode == 0)
  311. iqik_m_cal = ~((iqik_m_cal * 9) >> 5);
  312. else
  313. iqik_m_cal = ~(iqik_m_cal >> 1);
  314. }
  315. temp_f = frequency * (u32)n_div * (u32)state->tun_fdiv;
  316. freq = temp_f / state->tun_xtal;
  317. tmp = freq * state->tun_xtal;
  318. if ((temp_f - tmp) >= (state->tun_xtal >> 1))
  319. freq++;
  320. freq += (u32) n << 13;
  321. /* Frequency OMEGA_IQIK_M_CAL_MID*/
  322. temp_f = freq + (u32)iqik_m_cal;
  323. set_tuner[3].reg[0] = temp_f & 0xff;
  324. set_tuner[4].reg[0] = (temp_f >> 8) & 0xff;
  325. deb_info("High Frequency = %04x", temp_f);
  326. /* Lower frequency */
  327. set_tuner[5].reg[0] = freq & 0xff;
  328. set_tuner[6].reg[0] = (freq >> 8) & 0xff;
  329. deb_info("low Frequency = %04x", freq);
  330. ret = it913x_fe_script_loader(state, set_tuner);
  331. return (ret < 0) ? -ENODEV : 0;
  332. }
  333. static int it913x_fe_select_bw(struct it913x_fe_state *state,
  334. u32 bandwidth, u32 adcFrequency)
  335. {
  336. int ret, i;
  337. u8 buffer[256];
  338. u32 coeff[8];
  339. u16 bfsfcw_fftinx_ratio;
  340. u16 fftinx_bfsfcw_ratio;
  341. u8 count;
  342. u8 bw;
  343. u8 adcmultiplier;
  344. deb_info("Bandwidth %d Adc %d", bandwidth, adcFrequency);
  345. switch (bandwidth) {
  346. case 5000000:
  347. bw = 3;
  348. break;
  349. case 6000000:
  350. bw = 0;
  351. break;
  352. case 7000000:
  353. bw = 1;
  354. break;
  355. default:
  356. case 8000000:
  357. bw = 2;
  358. break;
  359. }
  360. ret = it913x_write_reg(state, PRO_DMOD, REG_BW, bw);
  361. if (state->table == NULL)
  362. return -EINVAL;
  363. /* In write order */
  364. coeff[0] = state->table[bw].coeff_1_2048;
  365. coeff[1] = state->table[bw].coeff_2_2k;
  366. coeff[2] = state->table[bw].coeff_1_8191;
  367. coeff[3] = state->table[bw].coeff_1_8192;
  368. coeff[4] = state->table[bw].coeff_1_8193;
  369. coeff[5] = state->table[bw].coeff_2_8k;
  370. coeff[6] = state->table[bw].coeff_1_4096;
  371. coeff[7] = state->table[bw].coeff_2_4k;
  372. bfsfcw_fftinx_ratio = state->table[bw].bfsfcw_fftinx_ratio;
  373. fftinx_bfsfcw_ratio = state->table[bw].fftinx_bfsfcw_ratio;
  374. /* ADC multiplier */
  375. ret = it913x_read_reg_u8(state, ADC_X_2);
  376. if (ret < 0)
  377. return -EINVAL;
  378. adcmultiplier = ret;
  379. count = 0;
  380. /* Build Buffer for COEFF Registers */
  381. for (i = 0; i < 8; i++) {
  382. if (adcmultiplier == 1)
  383. coeff[i] /= 2;
  384. buffer[count++] = (coeff[i] >> 24) & 0x3;
  385. buffer[count++] = (coeff[i] >> 16) & 0xff;
  386. buffer[count++] = (coeff[i] >> 8) & 0xff;
  387. buffer[count++] = coeff[i] & 0xff;
  388. }
  389. /* bfsfcw_fftinx_ratio register 0x21-0x22 */
  390. buffer[count++] = bfsfcw_fftinx_ratio & 0xff;
  391. buffer[count++] = (bfsfcw_fftinx_ratio >> 8) & 0xff;
  392. /* fftinx_bfsfcw_ratio register 0x23-0x24 */
  393. buffer[count++] = fftinx_bfsfcw_ratio & 0xff;
  394. buffer[count++] = (fftinx_bfsfcw_ratio >> 8) & 0xff;
  395. /* start at COEFF_1_2048 and write through to fftinx_bfsfcw_ratio*/
  396. ret = it913x_write(state, PRO_DMOD, COEFF_1_2048, buffer, count);
  397. for (i = 0; i < 42; i += 8)
  398. debug_data_snipet(0x1, "Buffer", &buffer[i]);
  399. return ret;
  400. }
  401. static int it913x_fe_read_status(struct dvb_frontend *fe, fe_status_t *status)
  402. {
  403. struct it913x_fe_state *state = fe->demodulator_priv;
  404. int ret, i;
  405. fe_status_t old_status = state->it913x_status;
  406. *status = 0;
  407. if (state->it913x_status == 0) {
  408. ret = it913x_read_reg_u8(state, EMPTY_CHANNEL_STATUS);
  409. if (ret == 0x1) {
  410. *status |= FE_HAS_SIGNAL;
  411. for (i = 0; i < 40; i++) {
  412. ret = it913x_read_reg_u8(state, MP2IF_SYNC_LK);
  413. if (ret == 0x1)
  414. break;
  415. msleep(25);
  416. }
  417. if (ret == 0x1)
  418. *status |= FE_HAS_CARRIER
  419. | FE_HAS_VITERBI
  420. | FE_HAS_SYNC;
  421. state->it913x_status = *status;
  422. }
  423. }
  424. if (state->it913x_status & FE_HAS_SYNC) {
  425. ret = it913x_read_reg_u8(state, TPSD_LOCK);
  426. if (ret == 0x1)
  427. *status |= FE_HAS_LOCK
  428. | state->it913x_status;
  429. else
  430. state->it913x_status = 0;
  431. if (old_status != state->it913x_status)
  432. ret = it913x_write_reg(state, PRO_LINK, GPIOH3_O, ret);
  433. }
  434. return 0;
  435. }
  436. static int it913x_fe_read_signal_strength(struct dvb_frontend *fe,
  437. u16 *strength)
  438. {
  439. struct it913x_fe_state *state = fe->demodulator_priv;
  440. int ret = it913x_read_reg_u8(state, SIGNAL_LEVEL);
  441. /*SIGNAL_LEVEL always returns 100%! so using FE_HAS_SIGNAL as switch*/
  442. if (state->it913x_status & FE_HAS_SIGNAL)
  443. ret = (ret * 0xff) / 0x64;
  444. else
  445. ret = 0x0;
  446. ret |= ret << 0x8;
  447. *strength = ret;
  448. return 0;
  449. }
  450. static int it913x_fe_read_snr(struct dvb_frontend *fe, u16 *snr)
  451. {
  452. struct it913x_fe_state *state = fe->demodulator_priv;
  453. int ret;
  454. u8 reg[3];
  455. u32 snr_val, snr_min, snr_max;
  456. u32 temp;
  457. ret = it913x_read_reg(state, 0x2c, reg, sizeof(reg));
  458. snr_val = (u32)(reg[2] << 16) | (reg[1] < 8) | reg[0];
  459. ret |= it913x_read_reg(state, 0xf78b, reg, 1);
  460. if (reg[0])
  461. snr_val /= reg[0];
  462. if (state->transmission_mode == TRANSMISSION_MODE_2K)
  463. snr_val *= 4;
  464. else if (state->transmission_mode == TRANSMISSION_MODE_4K)
  465. snr_val *= 2;
  466. if (state->constellation == QPSK) {
  467. snr_min = 0xb4711;
  468. snr_max = 0x191451;
  469. } else if (state->constellation == QAM_16) {
  470. snr_min = 0x4f0d5;
  471. snr_max = 0xc7925;
  472. } else if (state->constellation == QAM_64) {
  473. snr_min = 0x256d0;
  474. snr_max = 0x626be;
  475. } else
  476. return -EINVAL;
  477. if (snr_val < snr_min)
  478. *snr = 0;
  479. else if (snr_val < snr_max) {
  480. temp = (snr_val - snr_min) >> 5;
  481. temp *= 0xffff;
  482. temp /= (snr_max - snr_min) >> 5;
  483. *snr = (u16)temp;
  484. } else
  485. *snr = 0xffff;
  486. return (ret < 0) ? -ENODEV : 0;
  487. }
  488. static int it913x_fe_read_ber(struct dvb_frontend *fe, u32 *ber)
  489. {
  490. *ber = 0;
  491. return 0;
  492. }
  493. static int it913x_fe_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
  494. {
  495. *ucblocks = 0;
  496. return 0;
  497. }
  498. static int it913x_fe_get_frontend(struct dvb_frontend *fe)
  499. {
  500. struct dtv_frontend_properties *p = &fe->dtv_property_cache;
  501. struct it913x_fe_state *state = fe->demodulator_priv;
  502. int ret;
  503. u8 reg[8];
  504. ret = it913x_read_reg(state, REG_TPSD_TX_MODE, reg, sizeof(reg));
  505. if (reg[3] < 3)
  506. p->modulation = fe_con[reg[3]];
  507. if (reg[0] < 3)
  508. p->transmission_mode = fe_mode[reg[0]];
  509. if (reg[1] < 4)
  510. p->guard_interval = fe_gi[reg[1]];
  511. if (reg[2] < 4)
  512. p->hierarchy = fe_hi[reg[2]];
  513. p->code_rate_HP = (reg[6] < 6) ? fe_code[reg[6]] : FEC_NONE;
  514. p->code_rate_LP = (reg[7] < 6) ? fe_code[reg[7]] : FEC_NONE;
  515. /* Update internal state to reflect the autodetected props */
  516. state->constellation = p->modulation;
  517. state->transmission_mode = p->transmission_mode;
  518. return 0;
  519. }
  520. static int it913x_fe_set_frontend(struct dvb_frontend *fe)
  521. {
  522. struct dtv_frontend_properties *p = &fe->dtv_property_cache;
  523. struct it913x_fe_state *state = fe->demodulator_priv;
  524. int ret, i;
  525. u8 empty_ch, last_ch;
  526. state->it913x_status = 0;
  527. /* Set bw*/
  528. ret = it913x_fe_select_bw(state, p->bandwidth_hz,
  529. state->adcFrequency);
  530. /* Training Mode Off */
  531. ret = it913x_write_reg(state, PRO_LINK, TRAINING_MODE, 0x0);
  532. /* Clear Empty Channel */
  533. ret = it913x_write_reg(state, PRO_DMOD, EMPTY_CHANNEL_STATUS, 0x0);
  534. /* Clear bits */
  535. ret = it913x_write_reg(state, PRO_DMOD, MP2IF_SYNC_LK, 0x0);
  536. /* LED on */
  537. ret = it913x_write_reg(state, PRO_LINK, GPIOH3_O, 0x1);
  538. /* Select Band*/
  539. if ((p->frequency >= 51000000) && (p->frequency <= 230000000))
  540. i = 0;
  541. else if ((p->frequency >= 350000000) && (p->frequency <= 900000000))
  542. i = 1;
  543. else if ((p->frequency >= 1450000000) && (p->frequency <= 1680000000))
  544. i = 2;
  545. else
  546. return -EOPNOTSUPP;
  547. ret = it913x_write_reg(state, PRO_DMOD, FREE_BAND, i);
  548. deb_info("Frontend Set Tuner Type %02x", state->tuner_type);
  549. switch (state->tuner_type) {
  550. case IT9135_38:
  551. case IT9135_51:
  552. case IT9135_52:
  553. case IT9135_60:
  554. case IT9135_61:
  555. case IT9135_62:
  556. ret = it9137_set_tuner(state,
  557. p->bandwidth_hz, p->frequency);
  558. break;
  559. default:
  560. if (fe->ops.tuner_ops.set_params) {
  561. fe->ops.tuner_ops.set_params(fe);
  562. if (fe->ops.i2c_gate_ctrl)
  563. fe->ops.i2c_gate_ctrl(fe, 0);
  564. }
  565. break;
  566. }
  567. /* LED off */
  568. ret = it913x_write_reg(state, PRO_LINK, GPIOH3_O, 0x0);
  569. /* Trigger ofsm */
  570. ret = it913x_write_reg(state, PRO_DMOD, TRIGGER_OFSM, 0x0);
  571. last_ch = 2;
  572. for (i = 0; i < 40; ++i) {
  573. empty_ch = it913x_read_reg_u8(state, EMPTY_CHANNEL_STATUS);
  574. if (last_ch == 1 && empty_ch == 1)
  575. break;
  576. if (last_ch == 2 && empty_ch == 2)
  577. return 0;
  578. last_ch = empty_ch;
  579. msleep(25);
  580. }
  581. for (i = 0; i < 40; ++i) {
  582. if (it913x_read_reg_u8(state, D_TPSD_LOCK) == 1)
  583. break;
  584. msleep(25);
  585. }
  586. state->frequency = p->frequency;
  587. return 0;
  588. }
  589. static int it913x_fe_suspend(struct it913x_fe_state *state)
  590. {
  591. int ret, i;
  592. u8 b;
  593. ret = it913x_write_reg(state, PRO_DMOD, SUSPEND_FLAG, 0x1);
  594. ret |= it913x_write_reg(state, PRO_DMOD, TRIGGER_OFSM, 0x0);
  595. for (i = 0; i < 128; i++) {
  596. ret = it913x_read_reg(state, SUSPEND_FLAG, &b, 1);
  597. if (ret < 0)
  598. return -ENODEV;
  599. if (b == 0)
  600. break;
  601. }
  602. ret |= it913x_write_reg(state, PRO_DMOD, AFE_MEM0, 0x8);
  603. /* Turn LED off */
  604. ret |= it913x_write_reg(state, PRO_LINK, GPIOH3_O, 0x0);
  605. ret |= it913x_fe_script_loader(state, it9137_tuner_off);
  606. return (ret < 0) ? -ENODEV : 0;
  607. }
  608. /* Power sequence */
  609. /* Power Up Tuner on -> Frontend suspend off -> Tuner clk on */
  610. /* Power Down Frontend suspend on -> Tuner clk off -> Tuner off */
  611. static int it913x_fe_sleep(struct dvb_frontend *fe)
  612. {
  613. struct it913x_fe_state *state = fe->demodulator_priv;
  614. return it913x_fe_suspend(state);
  615. }
  616. static u32 compute_div(u32 a, u32 b, u32 x)
  617. {
  618. u32 res = 0;
  619. u32 c = 0;
  620. u32 i = 0;
  621. if (a > b) {
  622. c = a / b;
  623. a = a - c * b;
  624. }
  625. for (i = 0; i < x; i++) {
  626. if (a >= b) {
  627. res += 1;
  628. a -= b;
  629. }
  630. a <<= 1;
  631. res <<= 1;
  632. }
  633. res = (c << x) + res;
  634. return res;
  635. }
  636. static int it913x_fe_start(struct it913x_fe_state *state)
  637. {
  638. struct it913xset *set_lna;
  639. struct it913xset *set_mode;
  640. int ret;
  641. u8 adf = (state->config->adf & 0xf);
  642. u32 adc, xtal;
  643. u8 b[4];
  644. if (state->config->chip_ver == 1)
  645. ret = it913x_init_tuner(state);
  646. info("ADF table value :%02x", adf);
  647. if (adf < 10) {
  648. state->crystalFrequency = fe_clockTable[adf].xtal ;
  649. state->table = fe_clockTable[adf].table;
  650. state->adcFrequency = state->table->adcFrequency;
  651. adc = compute_div(state->adcFrequency, 1000000ul, 19ul);
  652. xtal = compute_div(state->crystalFrequency, 1000000ul, 19ul);
  653. } else
  654. return -EINVAL;
  655. /* Set LED indicator on GPIOH3 */
  656. ret = it913x_write_reg(state, PRO_LINK, GPIOH3_EN, 0x1);
  657. ret |= it913x_write_reg(state, PRO_LINK, GPIOH3_ON, 0x1);
  658. ret |= it913x_write_reg(state, PRO_LINK, GPIOH3_O, 0x1);
  659. ret |= it913x_write_reg(state, PRO_LINK, 0xf641, state->tuner_type);
  660. ret |= it913x_write_reg(state, PRO_DMOD, 0xf5ca, 0x01);
  661. ret |= it913x_write_reg(state, PRO_DMOD, 0xf715, 0x01);
  662. b[0] = xtal & 0xff;
  663. b[1] = (xtal >> 8) & 0xff;
  664. b[2] = (xtal >> 16) & 0xff;
  665. b[3] = (xtal >> 24);
  666. ret |= it913x_write(state, PRO_DMOD, XTAL_CLK, b , 4);
  667. b[0] = adc & 0xff;
  668. b[1] = (adc >> 8) & 0xff;
  669. b[2] = (adc >> 16) & 0xff;
  670. ret |= it913x_write(state, PRO_DMOD, ADC_FREQ, b, 3);
  671. if (state->config->adc_x2)
  672. ret |= it913x_write_reg(state, PRO_DMOD, ADC_X_2, 0x01);
  673. b[0] = 0;
  674. b[1] = 0;
  675. b[2] = 0;
  676. ret |= it913x_write(state, PRO_DMOD, 0x0029, b, 3);
  677. info("Crystal Frequency :%d Adc Frequency :%d ADC X2: %02x",
  678. state->crystalFrequency, state->adcFrequency,
  679. state->config->adc_x2);
  680. deb_info("Xtal value :%04x Adc value :%04x", xtal, adc);
  681. if (ret < 0)
  682. return -ENODEV;
  683. /* v1 or v2 tuner script */
  684. if (state->config->chip_ver > 1)
  685. ret = it913x_fe_script_loader(state, it9135_v2);
  686. else
  687. ret = it913x_fe_script_loader(state, it9135_v1);
  688. if (ret < 0)
  689. return ret;
  690. /* LNA Scripts */
  691. switch (state->tuner_type) {
  692. case IT9135_51:
  693. set_lna = it9135_51;
  694. break;
  695. case IT9135_52:
  696. set_lna = it9135_52;
  697. break;
  698. case IT9135_60:
  699. set_lna = it9135_60;
  700. break;
  701. case IT9135_61:
  702. set_lna = it9135_61;
  703. break;
  704. case IT9135_62:
  705. set_lna = it9135_62;
  706. break;
  707. case IT9135_38:
  708. default:
  709. set_lna = it9135_38;
  710. }
  711. info("Tuner LNA type :%02x", state->tuner_type);
  712. ret = it913x_fe_script_loader(state, set_lna);
  713. if (ret < 0)
  714. return ret;
  715. if (state->config->chip_ver == 2) {
  716. ret = it913x_write_reg(state, PRO_DMOD, TRIGGER_OFSM, 0x1);
  717. ret |= it913x_write_reg(state, PRO_LINK, PADODPU, 0x0);
  718. ret |= it913x_write_reg(state, PRO_LINK, AGC_O_D, 0x0);
  719. ret |= it913x_init_tuner(state);
  720. }
  721. if (ret < 0)
  722. return -ENODEV;
  723. /* Always solo frontend */
  724. set_mode = set_solo_fe;
  725. ret |= it913x_fe_script_loader(state, set_mode);
  726. ret |= it913x_fe_suspend(state);
  727. return (ret < 0) ? -ENODEV : 0;
  728. }
  729. static int it913x_fe_init(struct dvb_frontend *fe)
  730. {
  731. struct it913x_fe_state *state = fe->demodulator_priv;
  732. int ret = 0;
  733. /* Power Up Tuner - common all versions */
  734. ret = it913x_write_reg(state, PRO_DMOD, 0xec40, 0x1);
  735. ret |= it913x_fe_script_loader(state, init_1);
  736. ret |= it913x_write_reg(state, PRO_DMOD, AFE_MEM0, 0x0);
  737. ret |= it913x_write_reg(state, PRO_DMOD, 0xfba8, 0x0);
  738. return (ret < 0) ? -ENODEV : 0;
  739. }
  740. static void it913x_fe_release(struct dvb_frontend *fe)
  741. {
  742. struct it913x_fe_state *state = fe->demodulator_priv;
  743. kfree(state);
  744. }
  745. static struct dvb_frontend_ops it913x_fe_ofdm_ops;
  746. struct dvb_frontend *it913x_fe_attach(struct i2c_adapter *i2c_adap,
  747. u8 i2c_addr, struct ite_config *config)
  748. {
  749. struct it913x_fe_state *state = NULL;
  750. int ret;
  751. /* allocate memory for the internal state */
  752. state = kzalloc(sizeof(struct it913x_fe_state), GFP_KERNEL);
  753. if (state == NULL)
  754. return NULL;
  755. if (config == NULL)
  756. goto error;
  757. state->i2c_adap = i2c_adap;
  758. state->i2c_addr = i2c_addr;
  759. state->config = config;
  760. switch (state->config->tuner_id_0) {
  761. case IT9135_51:
  762. case IT9135_52:
  763. case IT9135_60:
  764. case IT9135_61:
  765. case IT9135_62:
  766. state->tuner_type = state->config->tuner_id_0;
  767. break;
  768. default:
  769. case IT9135_38:
  770. state->tuner_type = IT9135_38;
  771. }
  772. ret = it913x_fe_start(state);
  773. if (ret < 0)
  774. goto error;
  775. /* create dvb_frontend */
  776. memcpy(&state->frontend.ops, &it913x_fe_ofdm_ops,
  777. sizeof(struct dvb_frontend_ops));
  778. state->frontend.demodulator_priv = state;
  779. return &state->frontend;
  780. error:
  781. kfree(state);
  782. return NULL;
  783. }
  784. EXPORT_SYMBOL(it913x_fe_attach);
  785. static struct dvb_frontend_ops it913x_fe_ofdm_ops = {
  786. .delsys = { SYS_DVBT },
  787. .info = {
  788. .name = "it913x-fe DVB-T",
  789. .type = FE_OFDM,
  790. .frequency_min = 51000000,
  791. .frequency_max = 1680000000,
  792. .frequency_stepsize = 62500,
  793. .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
  794. FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
  795. FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
  796. FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
  797. FE_CAN_TRANSMISSION_MODE_AUTO |
  798. FE_CAN_GUARD_INTERVAL_AUTO |
  799. FE_CAN_HIERARCHY_AUTO,
  800. },
  801. .release = it913x_fe_release,
  802. .init = it913x_fe_init,
  803. .sleep = it913x_fe_sleep,
  804. .set_frontend = it913x_fe_set_frontend,
  805. .get_frontend = it913x_fe_get_frontend,
  806. .read_status = it913x_fe_read_status,
  807. .read_signal_strength = it913x_fe_read_signal_strength,
  808. .read_snr = it913x_fe_read_snr,
  809. .read_ber = it913x_fe_read_ber,
  810. .read_ucblocks = it913x_fe_read_ucblocks,
  811. };
  812. MODULE_DESCRIPTION("it913x Frontend and it9137 tuner");
  813. MODULE_AUTHOR("Malcolm Priestley tvboxspy@gmail.com");
  814. MODULE_VERSION("1.12");
  815. MODULE_LICENSE("GPL");