it913x-fe.c 24 KB

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