it913x-fe.c 23 KB

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