lgdt3305.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077
  1. /*
  2. * Support for LGDT3305 - VSB/QAM
  3. *
  4. * Copyright (C) 2008, 2009 Michael Krufky <mkrufky@linuxtv.org>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19. *
  20. */
  21. #include <asm/div64.h>
  22. #include <linux/dvb/frontend.h>
  23. #include <linux/slab.h>
  24. #include "dvb_math.h"
  25. #include "lgdt3305.h"
  26. static int debug;
  27. module_param(debug, int, 0644);
  28. MODULE_PARM_DESC(debug, "set debug level (info=1, reg=2 (or-able))");
  29. #define DBG_INFO 1
  30. #define DBG_REG 2
  31. #define lg_printk(kern, fmt, arg...) \
  32. printk(kern "%s: " fmt, __func__, ##arg)
  33. #define lg_info(fmt, arg...) printk(KERN_INFO "lgdt3305: " fmt, ##arg)
  34. #define lg_warn(fmt, arg...) lg_printk(KERN_WARNING, fmt, ##arg)
  35. #define lg_err(fmt, arg...) lg_printk(KERN_ERR, fmt, ##arg)
  36. #define lg_dbg(fmt, arg...) if (debug & DBG_INFO) \
  37. lg_printk(KERN_DEBUG, fmt, ##arg)
  38. #define lg_reg(fmt, arg...) if (debug & DBG_REG) \
  39. lg_printk(KERN_DEBUG, fmt, ##arg)
  40. #define lg_fail(ret) \
  41. ({ \
  42. int __ret; \
  43. __ret = (ret < 0); \
  44. if (__ret) \
  45. lg_err("error %d on line %d\n", ret, __LINE__); \
  46. __ret; \
  47. })
  48. struct lgdt3305_state {
  49. struct i2c_adapter *i2c_adap;
  50. const struct lgdt3305_config *cfg;
  51. struct dvb_frontend frontend;
  52. fe_modulation_t current_modulation;
  53. u32 current_frequency;
  54. u32 snr;
  55. };
  56. /* ------------------------------------------------------------------------ */
  57. #define LGDT3305_GEN_CTRL_1 0x0000
  58. #define LGDT3305_GEN_CTRL_2 0x0001
  59. #define LGDT3305_GEN_CTRL_3 0x0002
  60. #define LGDT3305_GEN_STATUS 0x0003
  61. #define LGDT3305_GEN_CONTROL 0x0007
  62. #define LGDT3305_GEN_CTRL_4 0x000a
  63. #define LGDT3305_DGTL_AGC_REF_1 0x0012
  64. #define LGDT3305_DGTL_AGC_REF_2 0x0013
  65. #define LGDT3305_CR_CTR_FREQ_1 0x0106
  66. #define LGDT3305_CR_CTR_FREQ_2 0x0107
  67. #define LGDT3305_CR_CTR_FREQ_3 0x0108
  68. #define LGDT3305_CR_CTR_FREQ_4 0x0109
  69. #define LGDT3305_CR_MSE_1 0x011b
  70. #define LGDT3305_CR_MSE_2 0x011c
  71. #define LGDT3305_CR_LOCK_STATUS 0x011d
  72. #define LGDT3305_CR_CTRL_7 0x0126
  73. #define LGDT3305_AGC_POWER_REF_1 0x0300
  74. #define LGDT3305_AGC_POWER_REF_2 0x0301
  75. #define LGDT3305_AGC_DELAY_PT_1 0x0302
  76. #define LGDT3305_AGC_DELAY_PT_2 0x0303
  77. #define LGDT3305_RFAGC_LOOP_FLTR_BW_1 0x0306
  78. #define LGDT3305_RFAGC_LOOP_FLTR_BW_2 0x0307
  79. #define LGDT3305_IFBW_1 0x0308
  80. #define LGDT3305_IFBW_2 0x0309
  81. #define LGDT3305_AGC_CTRL_1 0x030c
  82. #define LGDT3305_AGC_CTRL_4 0x0314
  83. #define LGDT3305_EQ_MSE_1 0x0413
  84. #define LGDT3305_EQ_MSE_2 0x0414
  85. #define LGDT3305_EQ_MSE_3 0x0415
  86. #define LGDT3305_PT_MSE_1 0x0417
  87. #define LGDT3305_PT_MSE_2 0x0418
  88. #define LGDT3305_PT_MSE_3 0x0419
  89. #define LGDT3305_FEC_BLOCK_CTRL 0x0504
  90. #define LGDT3305_FEC_LOCK_STATUS 0x050a
  91. #define LGDT3305_FEC_PKT_ERR_1 0x050c
  92. #define LGDT3305_FEC_PKT_ERR_2 0x050d
  93. #define LGDT3305_TP_CTRL_1 0x050e
  94. #define LGDT3305_BERT_PERIOD 0x0801
  95. #define LGDT3305_BERT_ERROR_COUNT_1 0x080a
  96. #define LGDT3305_BERT_ERROR_COUNT_2 0x080b
  97. #define LGDT3305_BERT_ERROR_COUNT_3 0x080c
  98. #define LGDT3305_BERT_ERROR_COUNT_4 0x080d
  99. static int lgdt3305_write_reg(struct lgdt3305_state *state, u16 reg, u8 val)
  100. {
  101. int ret;
  102. u8 buf[] = { reg >> 8, reg & 0xff, val };
  103. struct i2c_msg msg = {
  104. .addr = state->cfg->i2c_addr, .flags = 0,
  105. .buf = buf, .len = 3,
  106. };
  107. lg_reg("reg: 0x%04x, val: 0x%02x\n", reg, val);
  108. ret = i2c_transfer(state->i2c_adap, &msg, 1);
  109. if (ret != 1) {
  110. lg_err("error (addr %02x %02x <- %02x, err = %i)\n",
  111. msg.buf[0], msg.buf[1], msg.buf[2], ret);
  112. if (ret < 0)
  113. return ret;
  114. else
  115. return -EREMOTEIO;
  116. }
  117. return 0;
  118. }
  119. static int lgdt3305_read_reg(struct lgdt3305_state *state, u16 reg, u8 *val)
  120. {
  121. int ret;
  122. u8 reg_buf[] = { reg >> 8, reg & 0xff };
  123. struct i2c_msg msg[] = {
  124. { .addr = state->cfg->i2c_addr,
  125. .flags = 0, .buf = reg_buf, .len = 2 },
  126. { .addr = state->cfg->i2c_addr,
  127. .flags = I2C_M_RD, .buf = val, .len = 1 },
  128. };
  129. lg_reg("reg: 0x%04x\n", reg);
  130. ret = i2c_transfer(state->i2c_adap, msg, 2);
  131. if (ret != 2) {
  132. lg_err("error (addr %02x reg %04x error (ret == %i)\n",
  133. state->cfg->i2c_addr, reg, ret);
  134. if (ret < 0)
  135. return ret;
  136. else
  137. return -EREMOTEIO;
  138. }
  139. return 0;
  140. }
  141. #define read_reg(state, reg) \
  142. ({ \
  143. u8 __val; \
  144. int ret = lgdt3305_read_reg(state, reg, &__val); \
  145. if (lg_fail(ret)) \
  146. __val = 0; \
  147. __val; \
  148. })
  149. static int lgdt3305_set_reg_bit(struct lgdt3305_state *state,
  150. u16 reg, int bit, int onoff)
  151. {
  152. u8 val;
  153. int ret;
  154. lg_reg("reg: 0x%04x, bit: %d, level: %d\n", reg, bit, onoff);
  155. ret = lgdt3305_read_reg(state, reg, &val);
  156. if (lg_fail(ret))
  157. goto fail;
  158. val &= ~(1 << bit);
  159. val |= (onoff & 1) << bit;
  160. ret = lgdt3305_write_reg(state, reg, val);
  161. fail:
  162. return ret;
  163. }
  164. struct lgdt3305_reg {
  165. u16 reg;
  166. u8 val;
  167. };
  168. static int lgdt3305_write_regs(struct lgdt3305_state *state,
  169. struct lgdt3305_reg *regs, int len)
  170. {
  171. int i, ret;
  172. lg_reg("writing %d registers...\n", len);
  173. for (i = 0; i < len - 1; i++) {
  174. ret = lgdt3305_write_reg(state, regs[i].reg, regs[i].val);
  175. if (lg_fail(ret))
  176. return ret;
  177. }
  178. return 0;
  179. }
  180. /* ------------------------------------------------------------------------ */
  181. static int lgdt3305_soft_reset(struct lgdt3305_state *state)
  182. {
  183. int ret;
  184. lg_dbg("\n");
  185. ret = lgdt3305_set_reg_bit(state, LGDT3305_GEN_CTRL_3, 0, 0);
  186. if (lg_fail(ret))
  187. goto fail;
  188. msleep(20);
  189. ret = lgdt3305_set_reg_bit(state, LGDT3305_GEN_CTRL_3, 0, 1);
  190. fail:
  191. return ret;
  192. }
  193. static inline int lgdt3305_mpeg_mode(struct lgdt3305_state *state,
  194. enum lgdt3305_mpeg_mode mode)
  195. {
  196. lg_dbg("(%d)\n", mode);
  197. return lgdt3305_set_reg_bit(state, LGDT3305_TP_CTRL_1, 5, mode);
  198. }
  199. static int lgdt3305_mpeg_mode_polarity(struct lgdt3305_state *state,
  200. enum lgdt3305_tp_clock_edge edge,
  201. enum lgdt3305_tp_valid_polarity valid)
  202. {
  203. u8 val;
  204. int ret;
  205. lg_dbg("edge = %d, valid = %d\n", edge, valid);
  206. ret = lgdt3305_read_reg(state, LGDT3305_TP_CTRL_1, &val);
  207. if (lg_fail(ret))
  208. goto fail;
  209. val &= ~0x09;
  210. if (edge)
  211. val |= 0x08;
  212. if (valid)
  213. val |= 0x01;
  214. ret = lgdt3305_write_reg(state, LGDT3305_TP_CTRL_1, val);
  215. if (lg_fail(ret))
  216. goto fail;
  217. ret = lgdt3305_soft_reset(state);
  218. fail:
  219. return ret;
  220. }
  221. static int lgdt3305_set_modulation(struct lgdt3305_state *state,
  222. struct dvb_frontend_parameters *param)
  223. {
  224. u8 opermode;
  225. int ret;
  226. lg_dbg("\n");
  227. ret = lgdt3305_read_reg(state, LGDT3305_GEN_CTRL_1, &opermode);
  228. if (lg_fail(ret))
  229. goto fail;
  230. opermode &= ~0x03;
  231. switch (param->u.vsb.modulation) {
  232. case VSB_8:
  233. opermode |= 0x03;
  234. break;
  235. case QAM_64:
  236. opermode |= 0x00;
  237. break;
  238. case QAM_256:
  239. opermode |= 0x01;
  240. break;
  241. default:
  242. return -EINVAL;
  243. }
  244. ret = lgdt3305_write_reg(state, LGDT3305_GEN_CTRL_1, opermode);
  245. fail:
  246. return ret;
  247. }
  248. static int lgdt3305_set_filter_extension(struct lgdt3305_state *state,
  249. struct dvb_frontend_parameters *param)
  250. {
  251. int val;
  252. switch (param->u.vsb.modulation) {
  253. case VSB_8:
  254. val = 0;
  255. break;
  256. case QAM_64:
  257. case QAM_256:
  258. val = 1;
  259. break;
  260. default:
  261. return -EINVAL;
  262. }
  263. lg_dbg("val = %d\n", val);
  264. return lgdt3305_set_reg_bit(state, 0x043f, 2, val);
  265. }
  266. /* ------------------------------------------------------------------------ */
  267. static int lgdt3305_passband_digital_agc(struct lgdt3305_state *state,
  268. struct dvb_frontend_parameters *param)
  269. {
  270. u16 agc_ref;
  271. switch (param->u.vsb.modulation) {
  272. case VSB_8:
  273. agc_ref = 0x32c4;
  274. break;
  275. case QAM_64:
  276. agc_ref = 0x2a00;
  277. break;
  278. case QAM_256:
  279. agc_ref = 0x2a80;
  280. break;
  281. default:
  282. return -EINVAL;
  283. }
  284. lg_dbg("agc ref: 0x%04x\n", agc_ref);
  285. lgdt3305_write_reg(state, LGDT3305_DGTL_AGC_REF_1, agc_ref >> 8);
  286. lgdt3305_write_reg(state, LGDT3305_DGTL_AGC_REF_2, agc_ref & 0xff);
  287. return 0;
  288. }
  289. static int lgdt3305_rfagc_loop(struct lgdt3305_state *state,
  290. struct dvb_frontend_parameters *param)
  291. {
  292. u16 ifbw, rfbw, agcdelay;
  293. switch (param->u.vsb.modulation) {
  294. case VSB_8:
  295. agcdelay = 0x04c0;
  296. rfbw = 0x8000;
  297. ifbw = 0x8000;
  298. break;
  299. case QAM_64:
  300. case QAM_256:
  301. agcdelay = 0x046b;
  302. rfbw = 0x8889;
  303. ifbw = 0x8888;
  304. break;
  305. default:
  306. return -EINVAL;
  307. }
  308. if (state->cfg->rf_agc_loop) {
  309. lg_dbg("agcdelay: 0x%04x, rfbw: 0x%04x\n", agcdelay, rfbw);
  310. /* rf agc loop filter bandwidth */
  311. lgdt3305_write_reg(state, LGDT3305_AGC_DELAY_PT_1,
  312. agcdelay >> 8);
  313. lgdt3305_write_reg(state, LGDT3305_AGC_DELAY_PT_2,
  314. agcdelay & 0xff);
  315. lgdt3305_write_reg(state, LGDT3305_RFAGC_LOOP_FLTR_BW_1,
  316. rfbw >> 8);
  317. lgdt3305_write_reg(state, LGDT3305_RFAGC_LOOP_FLTR_BW_2,
  318. rfbw & 0xff);
  319. } else {
  320. lg_dbg("ifbw: 0x%04x\n", ifbw);
  321. /* if agc loop filter bandwidth */
  322. lgdt3305_write_reg(state, LGDT3305_IFBW_1, ifbw >> 8);
  323. lgdt3305_write_reg(state, LGDT3305_IFBW_2, ifbw & 0xff);
  324. }
  325. return 0;
  326. }
  327. static int lgdt3305_agc_setup(struct lgdt3305_state *state,
  328. struct dvb_frontend_parameters *param)
  329. {
  330. int lockdten, acqen;
  331. switch (param->u.vsb.modulation) {
  332. case VSB_8:
  333. lockdten = 0;
  334. acqen = 0;
  335. break;
  336. case QAM_64:
  337. case QAM_256:
  338. lockdten = 1;
  339. acqen = 1;
  340. break;
  341. default:
  342. return -EINVAL;
  343. }
  344. lg_dbg("lockdten = %d, acqen = %d\n", lockdten, acqen);
  345. /* control agc function */
  346. lgdt3305_write_reg(state, LGDT3305_AGC_CTRL_4, 0xe1 | lockdten << 1);
  347. lgdt3305_set_reg_bit(state, LGDT3305_AGC_CTRL_1, 2, acqen);
  348. return lgdt3305_rfagc_loop(state, param);
  349. }
  350. static int lgdt3305_set_agc_power_ref(struct lgdt3305_state *state,
  351. struct dvb_frontend_parameters *param)
  352. {
  353. u16 usref = 0;
  354. switch (param->u.vsb.modulation) {
  355. case VSB_8:
  356. if (state->cfg->usref_8vsb)
  357. usref = state->cfg->usref_8vsb;
  358. break;
  359. case QAM_64:
  360. if (state->cfg->usref_qam64)
  361. usref = state->cfg->usref_qam64;
  362. break;
  363. case QAM_256:
  364. if (state->cfg->usref_qam256)
  365. usref = state->cfg->usref_qam256;
  366. break;
  367. default:
  368. return -EINVAL;
  369. }
  370. if (usref) {
  371. lg_dbg("set manual mode: 0x%04x\n", usref);
  372. lgdt3305_set_reg_bit(state, LGDT3305_AGC_CTRL_1, 3, 1);
  373. lgdt3305_write_reg(state, LGDT3305_AGC_POWER_REF_1,
  374. 0xff & (usref >> 8));
  375. lgdt3305_write_reg(state, LGDT3305_AGC_POWER_REF_2,
  376. 0xff & (usref >> 0));
  377. }
  378. return 0;
  379. }
  380. /* ------------------------------------------------------------------------ */
  381. static int lgdt3305_spectral_inversion(struct lgdt3305_state *state,
  382. struct dvb_frontend_parameters *param,
  383. int inversion)
  384. {
  385. int ret;
  386. lg_dbg("(%d)\n", inversion);
  387. switch (param->u.vsb.modulation) {
  388. case VSB_8:
  389. ret = lgdt3305_write_reg(state, LGDT3305_CR_CTRL_7,
  390. inversion ? 0xf9 : 0x79);
  391. break;
  392. case QAM_64:
  393. case QAM_256:
  394. ret = lgdt3305_write_reg(state, LGDT3305_FEC_BLOCK_CTRL,
  395. inversion ? 0xfd : 0xff);
  396. break;
  397. default:
  398. ret = -EINVAL;
  399. }
  400. return ret;
  401. }
  402. static int lgdt3305_set_if(struct lgdt3305_state *state,
  403. struct dvb_frontend_parameters *param)
  404. {
  405. u16 if_freq_khz;
  406. u8 nco1, nco2, nco3, nco4;
  407. u64 nco;
  408. switch (param->u.vsb.modulation) {
  409. case VSB_8:
  410. if_freq_khz = state->cfg->vsb_if_khz;
  411. break;
  412. case QAM_64:
  413. case QAM_256:
  414. if_freq_khz = state->cfg->qam_if_khz;
  415. break;
  416. default:
  417. return -EINVAL;
  418. }
  419. nco = if_freq_khz / 10;
  420. switch (param->u.vsb.modulation) {
  421. case VSB_8:
  422. nco <<= 24;
  423. do_div(nco, 625);
  424. break;
  425. case QAM_64:
  426. case QAM_256:
  427. nco <<= 28;
  428. do_div(nco, 625);
  429. break;
  430. default:
  431. return -EINVAL;
  432. }
  433. nco1 = (nco >> 24) & 0x3f;
  434. nco1 |= 0x40;
  435. nco2 = (nco >> 16) & 0xff;
  436. nco3 = (nco >> 8) & 0xff;
  437. nco4 = nco & 0xff;
  438. lgdt3305_write_reg(state, LGDT3305_CR_CTR_FREQ_1, nco1);
  439. lgdt3305_write_reg(state, LGDT3305_CR_CTR_FREQ_2, nco2);
  440. lgdt3305_write_reg(state, LGDT3305_CR_CTR_FREQ_3, nco3);
  441. lgdt3305_write_reg(state, LGDT3305_CR_CTR_FREQ_4, nco4);
  442. lg_dbg("%d KHz -> [%02x%02x%02x%02x]\n",
  443. if_freq_khz, nco1, nco2, nco3, nco4);
  444. return 0;
  445. }
  446. /* ------------------------------------------------------------------------ */
  447. static int lgdt3305_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
  448. {
  449. struct lgdt3305_state *state = fe->demodulator_priv;
  450. if (state->cfg->deny_i2c_rptr)
  451. return 0;
  452. lg_dbg("(%d)\n", enable);
  453. return lgdt3305_set_reg_bit(state, LGDT3305_GEN_CTRL_2, 5,
  454. enable ? 0 : 1);
  455. }
  456. static int lgdt3305_sleep(struct dvb_frontend *fe)
  457. {
  458. struct lgdt3305_state *state = fe->demodulator_priv;
  459. u8 gen_ctrl_3, gen_ctrl_4;
  460. lg_dbg("\n");
  461. gen_ctrl_3 = read_reg(state, LGDT3305_GEN_CTRL_3);
  462. gen_ctrl_4 = read_reg(state, LGDT3305_GEN_CTRL_4);
  463. /* hold in software reset while sleeping */
  464. gen_ctrl_3 &= ~0x01;
  465. /* tristate the IF-AGC pin */
  466. gen_ctrl_3 |= 0x02;
  467. /* tristate the RF-AGC pin */
  468. gen_ctrl_3 |= 0x04;
  469. /* disable vsb/qam module */
  470. gen_ctrl_4 &= ~0x01;
  471. /* disable adc module */
  472. gen_ctrl_4 &= ~0x02;
  473. lgdt3305_write_reg(state, LGDT3305_GEN_CTRL_3, gen_ctrl_3);
  474. lgdt3305_write_reg(state, LGDT3305_GEN_CTRL_4, gen_ctrl_4);
  475. return 0;
  476. }
  477. static int lgdt3305_init(struct dvb_frontend *fe)
  478. {
  479. struct lgdt3305_state *state = fe->demodulator_priv;
  480. int ret;
  481. static struct lgdt3305_reg lgdt3305_init_data[] = {
  482. { .reg = LGDT3305_GEN_CTRL_1,
  483. .val = 0x03, },
  484. { .reg = LGDT3305_GEN_CTRL_2,
  485. .val = 0xb0, },
  486. { .reg = LGDT3305_GEN_CTRL_3,
  487. .val = 0x01, },
  488. { .reg = LGDT3305_GEN_CONTROL,
  489. .val = 0x6f, },
  490. { .reg = LGDT3305_GEN_CTRL_4,
  491. .val = 0x03, },
  492. { .reg = LGDT3305_DGTL_AGC_REF_1,
  493. .val = 0x32, },
  494. { .reg = LGDT3305_DGTL_AGC_REF_2,
  495. .val = 0xc4, },
  496. { .reg = LGDT3305_CR_CTR_FREQ_1,
  497. .val = 0x00, },
  498. { .reg = LGDT3305_CR_CTR_FREQ_2,
  499. .val = 0x00, },
  500. { .reg = LGDT3305_CR_CTR_FREQ_3,
  501. .val = 0x00, },
  502. { .reg = LGDT3305_CR_CTR_FREQ_4,
  503. .val = 0x00, },
  504. { .reg = LGDT3305_CR_CTRL_7,
  505. .val = 0x79, },
  506. { .reg = LGDT3305_AGC_POWER_REF_1,
  507. .val = 0x32, },
  508. { .reg = LGDT3305_AGC_POWER_REF_2,
  509. .val = 0xc4, },
  510. { .reg = LGDT3305_AGC_DELAY_PT_1,
  511. .val = 0x0d, },
  512. { .reg = LGDT3305_AGC_DELAY_PT_2,
  513. .val = 0x30, },
  514. { .reg = LGDT3305_RFAGC_LOOP_FLTR_BW_1,
  515. .val = 0x80, },
  516. { .reg = LGDT3305_RFAGC_LOOP_FLTR_BW_2,
  517. .val = 0x00, },
  518. { .reg = LGDT3305_IFBW_1,
  519. .val = 0x80, },
  520. { .reg = LGDT3305_IFBW_2,
  521. .val = 0x00, },
  522. { .reg = LGDT3305_AGC_CTRL_1,
  523. .val = 0x30, },
  524. { .reg = LGDT3305_AGC_CTRL_4,
  525. .val = 0x61, },
  526. { .reg = LGDT3305_FEC_BLOCK_CTRL,
  527. .val = 0xff, },
  528. { .reg = LGDT3305_TP_CTRL_1,
  529. .val = 0x1b, },
  530. };
  531. lg_dbg("\n");
  532. ret = lgdt3305_write_regs(state, lgdt3305_init_data,
  533. ARRAY_SIZE(lgdt3305_init_data));
  534. if (lg_fail(ret))
  535. goto fail;
  536. ret = lgdt3305_soft_reset(state);
  537. fail:
  538. return ret;
  539. }
  540. static int lgdt3305_set_parameters(struct dvb_frontend *fe,
  541. struct dvb_frontend_parameters *param)
  542. {
  543. struct lgdt3305_state *state = fe->demodulator_priv;
  544. int ret;
  545. lg_dbg("(%d, %d)\n", param->frequency, param->u.vsb.modulation);
  546. if (fe->ops.tuner_ops.set_params) {
  547. ret = fe->ops.tuner_ops.set_params(fe, param);
  548. if (fe->ops.i2c_gate_ctrl)
  549. fe->ops.i2c_gate_ctrl(fe, 0);
  550. if (lg_fail(ret))
  551. goto fail;
  552. state->current_frequency = param->frequency;
  553. }
  554. ret = lgdt3305_set_modulation(state, param);
  555. if (lg_fail(ret))
  556. goto fail;
  557. ret = lgdt3305_passband_digital_agc(state, param);
  558. if (lg_fail(ret))
  559. goto fail;
  560. ret = lgdt3305_set_agc_power_ref(state, param);
  561. if (lg_fail(ret))
  562. goto fail;
  563. ret = lgdt3305_agc_setup(state, param);
  564. if (lg_fail(ret))
  565. goto fail;
  566. /* low if */
  567. ret = lgdt3305_write_reg(state, LGDT3305_GEN_CONTROL, 0x2f);
  568. if (lg_fail(ret))
  569. goto fail;
  570. ret = lgdt3305_set_reg_bit(state, LGDT3305_CR_CTR_FREQ_1, 6, 1);
  571. if (lg_fail(ret))
  572. goto fail;
  573. ret = lgdt3305_set_if(state, param);
  574. if (lg_fail(ret))
  575. goto fail;
  576. ret = lgdt3305_spectral_inversion(state, param,
  577. state->cfg->spectral_inversion
  578. ? 1 : 0);
  579. if (lg_fail(ret))
  580. goto fail;
  581. ret = lgdt3305_set_filter_extension(state, param);
  582. if (lg_fail(ret))
  583. goto fail;
  584. state->current_modulation = param->u.vsb.modulation;
  585. ret = lgdt3305_mpeg_mode(state, state->cfg->mpeg_mode);
  586. if (lg_fail(ret))
  587. goto fail;
  588. /* lgdt3305_mpeg_mode_polarity calls lgdt3305_soft_reset */
  589. ret = lgdt3305_mpeg_mode_polarity(state,
  590. state->cfg->tpclk_edge,
  591. state->cfg->tpvalid_polarity);
  592. fail:
  593. return ret;
  594. }
  595. static int lgdt3305_get_frontend(struct dvb_frontend *fe,
  596. struct dvb_frontend_parameters *param)
  597. {
  598. struct lgdt3305_state *state = fe->demodulator_priv;
  599. lg_dbg("\n");
  600. param->u.vsb.modulation = state->current_modulation;
  601. param->frequency = state->current_frequency;
  602. return 0;
  603. }
  604. /* ------------------------------------------------------------------------ */
  605. static int lgdt3305_read_cr_lock_status(struct lgdt3305_state *state,
  606. int *locked)
  607. {
  608. u8 val;
  609. int ret;
  610. char *cr_lock_state = "";
  611. *locked = 0;
  612. ret = lgdt3305_read_reg(state, LGDT3305_CR_LOCK_STATUS, &val);
  613. if (lg_fail(ret))
  614. goto fail;
  615. switch (state->current_modulation) {
  616. case QAM_256:
  617. case QAM_64:
  618. if (val & (1 << 1))
  619. *locked = 1;
  620. switch (val & 0x07) {
  621. case 0:
  622. cr_lock_state = "QAM UNLOCK";
  623. break;
  624. case 4:
  625. cr_lock_state = "QAM 1stLock";
  626. break;
  627. case 6:
  628. cr_lock_state = "QAM 2ndLock";
  629. break;
  630. case 7:
  631. cr_lock_state = "QAM FinalLock";
  632. break;
  633. default:
  634. cr_lock_state = "CLOCKQAM-INVALID!";
  635. break;
  636. }
  637. break;
  638. case VSB_8:
  639. if (val & (1 << 7)) {
  640. *locked = 1;
  641. cr_lock_state = "CLOCKVSB";
  642. }
  643. break;
  644. default:
  645. ret = -EINVAL;
  646. }
  647. lg_dbg("(%d) %s\n", *locked, cr_lock_state);
  648. fail:
  649. return ret;
  650. }
  651. static int lgdt3305_read_fec_lock_status(struct lgdt3305_state *state,
  652. int *locked)
  653. {
  654. u8 val;
  655. int ret, mpeg_lock, fec_lock, viterbi_lock;
  656. *locked = 0;
  657. switch (state->current_modulation) {
  658. case QAM_256:
  659. case QAM_64:
  660. ret = lgdt3305_read_reg(state,
  661. LGDT3305_FEC_LOCK_STATUS, &val);
  662. if (lg_fail(ret))
  663. goto fail;
  664. mpeg_lock = (val & (1 << 0)) ? 1 : 0;
  665. fec_lock = (val & (1 << 2)) ? 1 : 0;
  666. viterbi_lock = (val & (1 << 3)) ? 1 : 0;
  667. *locked = mpeg_lock && fec_lock && viterbi_lock;
  668. lg_dbg("(%d) %s%s%s\n", *locked,
  669. mpeg_lock ? "mpeg lock " : "",
  670. fec_lock ? "fec lock " : "",
  671. viterbi_lock ? "viterbi lock" : "");
  672. break;
  673. case VSB_8:
  674. default:
  675. ret = -EINVAL;
  676. }
  677. fail:
  678. return ret;
  679. }
  680. static int lgdt3305_read_status(struct dvb_frontend *fe, fe_status_t *status)
  681. {
  682. struct lgdt3305_state *state = fe->demodulator_priv;
  683. u8 val;
  684. int ret, signal, inlock, nofecerr, snrgood,
  685. cr_lock, fec_lock, sync_lock;
  686. *status = 0;
  687. ret = lgdt3305_read_reg(state, LGDT3305_GEN_STATUS, &val);
  688. if (lg_fail(ret))
  689. goto fail;
  690. signal = (val & (1 << 4)) ? 1 : 0;
  691. inlock = (val & (1 << 3)) ? 0 : 1;
  692. sync_lock = (val & (1 << 2)) ? 1 : 0;
  693. nofecerr = (val & (1 << 1)) ? 1 : 0;
  694. snrgood = (val & (1 << 0)) ? 1 : 0;
  695. lg_dbg("%s%s%s%s%s\n",
  696. signal ? "SIGNALEXIST " : "",
  697. inlock ? "INLOCK " : "",
  698. sync_lock ? "SYNCLOCK " : "",
  699. nofecerr ? "NOFECERR " : "",
  700. snrgood ? "SNRGOOD " : "");
  701. ret = lgdt3305_read_cr_lock_status(state, &cr_lock);
  702. if (lg_fail(ret))
  703. goto fail;
  704. if (signal)
  705. *status |= FE_HAS_SIGNAL;
  706. if (cr_lock)
  707. *status |= FE_HAS_CARRIER;
  708. if (nofecerr)
  709. *status |= FE_HAS_VITERBI;
  710. if (sync_lock)
  711. *status |= FE_HAS_SYNC;
  712. switch (state->current_modulation) {
  713. case QAM_256:
  714. case QAM_64:
  715. ret = lgdt3305_read_fec_lock_status(state, &fec_lock);
  716. if (lg_fail(ret))
  717. goto fail;
  718. if (fec_lock)
  719. *status |= FE_HAS_LOCK;
  720. break;
  721. case VSB_8:
  722. if (inlock)
  723. *status |= FE_HAS_LOCK;
  724. break;
  725. default:
  726. ret = -EINVAL;
  727. }
  728. fail:
  729. return ret;
  730. }
  731. /* ------------------------------------------------------------------------ */
  732. /* borrowed from lgdt330x.c */
  733. static u32 calculate_snr(u32 mse, u32 c)
  734. {
  735. if (mse == 0) /* no signal */
  736. return 0;
  737. mse = intlog10(mse);
  738. if (mse > c) {
  739. /* Negative SNR, which is possible, but realisticly the
  740. demod will lose lock before the signal gets this bad. The
  741. API only allows for unsigned values, so just return 0 */
  742. return 0;
  743. }
  744. return 10*(c - mse);
  745. }
  746. static int lgdt3305_read_snr(struct dvb_frontend *fe, u16 *snr)
  747. {
  748. struct lgdt3305_state *state = fe->demodulator_priv;
  749. u32 noise; /* noise value */
  750. u32 c; /* per-modulation SNR calculation constant */
  751. switch (state->current_modulation) {
  752. case VSB_8:
  753. #ifdef USE_PTMSE
  754. /* Use Phase Tracker Mean-Square Error Register */
  755. /* SNR for ranges from -13.11 to +44.08 */
  756. noise = ((read_reg(state, LGDT3305_PT_MSE_1) & 0x07) << 16) |
  757. (read_reg(state, LGDT3305_PT_MSE_2) << 8) |
  758. (read_reg(state, LGDT3305_PT_MSE_3) & 0xff);
  759. c = 73957994; /* log10(25*32^2)*2^24 */
  760. #else
  761. /* Use Equalizer Mean-Square Error Register */
  762. /* SNR for ranges from -16.12 to +44.08 */
  763. noise = ((read_reg(state, LGDT3305_EQ_MSE_1) & 0x0f) << 16) |
  764. (read_reg(state, LGDT3305_EQ_MSE_2) << 8) |
  765. (read_reg(state, LGDT3305_EQ_MSE_3) & 0xff);
  766. c = 73957994; /* log10(25*32^2)*2^24 */
  767. #endif
  768. break;
  769. case QAM_64:
  770. case QAM_256:
  771. noise = (read_reg(state, LGDT3305_CR_MSE_1) << 8) |
  772. (read_reg(state, LGDT3305_CR_MSE_2) & 0xff);
  773. c = (state->current_modulation == QAM_64) ?
  774. 97939837 : 98026066;
  775. /* log10(688128)*2^24 and log10(696320)*2^24 */
  776. break;
  777. default:
  778. return -EINVAL;
  779. }
  780. state->snr = calculate_snr(noise, c);
  781. /* report SNR in dB * 10 */
  782. *snr = (state->snr / ((1 << 24) / 10));
  783. lg_dbg("noise = 0x%08x, snr = %d.%02d dB\n", noise,
  784. state->snr >> 24, (((state->snr >> 8) & 0xffff) * 100) >> 16);
  785. return 0;
  786. }
  787. static int lgdt3305_read_signal_strength(struct dvb_frontend *fe,
  788. u16 *strength)
  789. {
  790. /* borrowed from lgdt330x.c
  791. *
  792. * Calculate strength from SNR up to 35dB
  793. * Even though the SNR can go higher than 35dB,
  794. * there is some comfort factor in having a range of
  795. * strong signals that can show at 100%
  796. */
  797. struct lgdt3305_state *state = fe->demodulator_priv;
  798. u16 snr;
  799. int ret;
  800. *strength = 0;
  801. ret = fe->ops.read_snr(fe, &snr);
  802. if (lg_fail(ret))
  803. goto fail;
  804. /* Rather than use the 8.8 value snr, use state->snr which is 8.24 */
  805. /* scale the range 0 - 35*2^24 into 0 - 65535 */
  806. if (state->snr >= 8960 * 0x10000)
  807. *strength = 0xffff;
  808. else
  809. *strength = state->snr / 8960;
  810. fail:
  811. return ret;
  812. }
  813. /* ------------------------------------------------------------------------ */
  814. static int lgdt3305_read_ber(struct dvb_frontend *fe, u32 *ber)
  815. {
  816. *ber = 0;
  817. return 0;
  818. }
  819. static int lgdt3305_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
  820. {
  821. struct lgdt3305_state *state = fe->demodulator_priv;
  822. *ucblocks =
  823. (read_reg(state, LGDT3305_FEC_PKT_ERR_1) << 8) |
  824. (read_reg(state, LGDT3305_FEC_PKT_ERR_2) & 0xff);
  825. return 0;
  826. }
  827. static int lgdt3305_get_tune_settings(struct dvb_frontend *fe,
  828. struct dvb_frontend_tune_settings
  829. *fe_tune_settings)
  830. {
  831. fe_tune_settings->min_delay_ms = 500;
  832. lg_dbg("\n");
  833. return 0;
  834. }
  835. static void lgdt3305_release(struct dvb_frontend *fe)
  836. {
  837. struct lgdt3305_state *state = fe->demodulator_priv;
  838. lg_dbg("\n");
  839. kfree(state);
  840. }
  841. static struct dvb_frontend_ops lgdt3305_ops;
  842. struct dvb_frontend *lgdt3305_attach(const struct lgdt3305_config *config,
  843. struct i2c_adapter *i2c_adap)
  844. {
  845. struct lgdt3305_state *state = NULL;
  846. int ret;
  847. u8 val;
  848. lg_dbg("(%d-%04x)\n",
  849. i2c_adap ? i2c_adapter_id(i2c_adap) : 0,
  850. config ? config->i2c_addr : 0);
  851. state = kzalloc(sizeof(struct lgdt3305_state), GFP_KERNEL);
  852. if (state == NULL)
  853. goto fail;
  854. state->cfg = config;
  855. state->i2c_adap = i2c_adap;
  856. memcpy(&state->frontend.ops, &lgdt3305_ops,
  857. sizeof(struct dvb_frontend_ops));
  858. state->frontend.demodulator_priv = state;
  859. /* verify that we're talking to a lg dt3305 */
  860. ret = lgdt3305_read_reg(state, LGDT3305_GEN_CTRL_2, &val);
  861. if ((lg_fail(ret)) | (val == 0))
  862. goto fail;
  863. ret = lgdt3305_write_reg(state, 0x0808, 0x80);
  864. if (lg_fail(ret))
  865. goto fail;
  866. ret = lgdt3305_read_reg(state, 0x0808, &val);
  867. if ((lg_fail(ret)) | (val != 0x80))
  868. goto fail;
  869. ret = lgdt3305_write_reg(state, 0x0808, 0x00);
  870. if (lg_fail(ret))
  871. goto fail;
  872. state->current_frequency = -1;
  873. state->current_modulation = -1;
  874. return &state->frontend;
  875. fail:
  876. lg_warn("unable to detect LGDT3305 hardware\n");
  877. kfree(state);
  878. return NULL;
  879. }
  880. EXPORT_SYMBOL(lgdt3305_attach);
  881. static struct dvb_frontend_ops lgdt3305_ops = {
  882. .info = {
  883. .name = "LG Electronics LGDT3305 VSB/QAM Frontend",
  884. .type = FE_ATSC,
  885. .frequency_min = 54000000,
  886. .frequency_max = 858000000,
  887. .frequency_stepsize = 62500,
  888. .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
  889. },
  890. .i2c_gate_ctrl = lgdt3305_i2c_gate_ctrl,
  891. .init = lgdt3305_init,
  892. .sleep = lgdt3305_sleep,
  893. .set_frontend = lgdt3305_set_parameters,
  894. .get_frontend = lgdt3305_get_frontend,
  895. .get_tune_settings = lgdt3305_get_tune_settings,
  896. .read_status = lgdt3305_read_status,
  897. .read_ber = lgdt3305_read_ber,
  898. .read_signal_strength = lgdt3305_read_signal_strength,
  899. .read_snr = lgdt3305_read_snr,
  900. .read_ucblocks = lgdt3305_read_ucblocks,
  901. .release = lgdt3305_release,
  902. };
  903. MODULE_DESCRIPTION("LG Electronics LGDT3305 ATSC/QAM-B Demodulator Driver");
  904. MODULE_AUTHOR("Michael Krufky <mkrufky@linuxtv.org>");
  905. MODULE_LICENSE("GPL");
  906. MODULE_VERSION("0.1");
  907. /*
  908. * Local variables:
  909. * c-basic-offset: 8
  910. * End:
  911. */