hd29l2.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. /*
  2. * HDIC HD29L2 DMB-TH demodulator driver
  3. *
  4. * Copyright (C) 2011 Metropolia University of Applied Sciences, Electria R&D
  5. *
  6. * Author: Antti Palosaari <crope@iki.fi>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21. */
  22. #include "hd29l2_priv.h"
  23. /* write multiple registers */
  24. static int hd29l2_wr_regs(struct hd29l2_priv *priv, u8 reg, u8 *val, int len)
  25. {
  26. int ret;
  27. u8 buf[2 + len];
  28. struct i2c_msg msg[1] = {
  29. {
  30. .addr = priv->cfg.i2c_addr,
  31. .flags = 0,
  32. .len = sizeof(buf),
  33. .buf = buf,
  34. }
  35. };
  36. buf[0] = 0x00;
  37. buf[1] = reg;
  38. memcpy(&buf[2], val, len);
  39. ret = i2c_transfer(priv->i2c, msg, 1);
  40. if (ret == 1) {
  41. ret = 0;
  42. } else {
  43. dev_warn(&priv->i2c->dev,
  44. "%s: i2c wr failed=%d reg=%02x len=%d\n",
  45. KBUILD_MODNAME, ret, reg, len);
  46. ret = -EREMOTEIO;
  47. }
  48. return ret;
  49. }
  50. /* read multiple registers */
  51. static int hd29l2_rd_regs(struct hd29l2_priv *priv, u8 reg, u8 *val, int len)
  52. {
  53. int ret;
  54. u8 buf[2] = { 0x00, reg };
  55. struct i2c_msg msg[2] = {
  56. {
  57. .addr = priv->cfg.i2c_addr,
  58. .flags = 0,
  59. .len = 2,
  60. .buf = buf,
  61. }, {
  62. .addr = priv->cfg.i2c_addr,
  63. .flags = I2C_M_RD,
  64. .len = len,
  65. .buf = val,
  66. }
  67. };
  68. ret = i2c_transfer(priv->i2c, msg, 2);
  69. if (ret == 2) {
  70. ret = 0;
  71. } else {
  72. dev_warn(&priv->i2c->dev,
  73. "%s: i2c rd failed=%d reg=%02x len=%d\n",
  74. KBUILD_MODNAME, ret, reg, len);
  75. ret = -EREMOTEIO;
  76. }
  77. return ret;
  78. }
  79. /* write single register */
  80. static int hd29l2_wr_reg(struct hd29l2_priv *priv, u8 reg, u8 val)
  81. {
  82. return hd29l2_wr_regs(priv, reg, &val, 1);
  83. }
  84. /* read single register */
  85. static int hd29l2_rd_reg(struct hd29l2_priv *priv, u8 reg, u8 *val)
  86. {
  87. return hd29l2_rd_regs(priv, reg, val, 1);
  88. }
  89. /* write single register with mask */
  90. static int hd29l2_wr_reg_mask(struct hd29l2_priv *priv, u8 reg, u8 val, u8 mask)
  91. {
  92. int ret;
  93. u8 tmp;
  94. /* no need for read if whole reg is written */
  95. if (mask != 0xff) {
  96. ret = hd29l2_rd_regs(priv, reg, &tmp, 1);
  97. if (ret)
  98. return ret;
  99. val &= mask;
  100. tmp &= ~mask;
  101. val |= tmp;
  102. }
  103. return hd29l2_wr_regs(priv, reg, &val, 1);
  104. }
  105. /* read single register with mask */
  106. int hd29l2_rd_reg_mask(struct hd29l2_priv *priv, u8 reg, u8 *val, u8 mask)
  107. {
  108. int ret, i;
  109. u8 tmp;
  110. ret = hd29l2_rd_regs(priv, reg, &tmp, 1);
  111. if (ret)
  112. return ret;
  113. tmp &= mask;
  114. /* find position of the first bit */
  115. for (i = 0; i < 8; i++) {
  116. if ((mask >> i) & 0x01)
  117. break;
  118. }
  119. *val = tmp >> i;
  120. return 0;
  121. }
  122. static int hd29l2_soft_reset(struct hd29l2_priv *priv)
  123. {
  124. int ret;
  125. u8 tmp;
  126. ret = hd29l2_rd_reg(priv, 0x26, &tmp);
  127. if (ret)
  128. goto err;
  129. ret = hd29l2_wr_reg(priv, 0x26, 0x0d);
  130. if (ret)
  131. goto err;
  132. usleep_range(10000, 20000);
  133. ret = hd29l2_wr_reg(priv, 0x26, tmp);
  134. if (ret)
  135. goto err;
  136. return 0;
  137. err:
  138. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  139. return ret;
  140. }
  141. static int hd29l2_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
  142. {
  143. int ret, i;
  144. struct hd29l2_priv *priv = fe->demodulator_priv;
  145. u8 tmp;
  146. dev_dbg(&priv->i2c->dev, "%s: enable=%d\n", __func__, enable);
  147. /* set tuner address for demod */
  148. if (!priv->tuner_i2c_addr_programmed && enable) {
  149. /* no need to set tuner address every time, once is enough */
  150. ret = hd29l2_wr_reg(priv, 0x9d, priv->cfg.tuner_i2c_addr << 1);
  151. if (ret)
  152. goto err;
  153. priv->tuner_i2c_addr_programmed = true;
  154. }
  155. /* open / close gate */
  156. ret = hd29l2_wr_reg(priv, 0x9f, enable);
  157. if (ret)
  158. goto err;
  159. /* wait demod ready */
  160. for (i = 10; i; i--) {
  161. ret = hd29l2_rd_reg(priv, 0x9e, &tmp);
  162. if (ret)
  163. goto err;
  164. if (tmp == enable)
  165. break;
  166. usleep_range(5000, 10000);
  167. }
  168. dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i);
  169. return ret;
  170. err:
  171. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  172. return ret;
  173. }
  174. static int hd29l2_read_status(struct dvb_frontend *fe, fe_status_t *status)
  175. {
  176. int ret;
  177. struct hd29l2_priv *priv = fe->demodulator_priv;
  178. u8 buf[2];
  179. *status = 0;
  180. ret = hd29l2_rd_reg(priv, 0x05, &buf[0]);
  181. if (ret)
  182. goto err;
  183. if (buf[0] & 0x01) {
  184. /* full lock */
  185. *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI |
  186. FE_HAS_SYNC | FE_HAS_LOCK;
  187. } else {
  188. ret = hd29l2_rd_reg(priv, 0x0d, &buf[1]);
  189. if (ret)
  190. goto err;
  191. if ((buf[1] & 0xfe) == 0x78)
  192. /* partial lock */
  193. *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
  194. FE_HAS_VITERBI | FE_HAS_SYNC;
  195. }
  196. priv->fe_status = *status;
  197. return 0;
  198. err:
  199. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  200. return ret;
  201. }
  202. static int hd29l2_read_snr(struct dvb_frontend *fe, u16 *snr)
  203. {
  204. int ret;
  205. struct hd29l2_priv *priv = fe->demodulator_priv;
  206. u8 buf[2];
  207. u16 tmp;
  208. if (!(priv->fe_status & FE_HAS_LOCK)) {
  209. *snr = 0;
  210. ret = 0;
  211. goto err;
  212. }
  213. ret = hd29l2_rd_regs(priv, 0x0b, buf, 2);
  214. if (ret)
  215. goto err;
  216. tmp = (buf[0] << 8) | buf[1];
  217. /* report SNR in dB * 10 */
  218. #define LOG10_20736_24 72422627 /* log10(20736) << 24 */
  219. if (tmp)
  220. *snr = (LOG10_20736_24 - intlog10(tmp)) / ((1 << 24) / 100);
  221. else
  222. *snr = 0;
  223. return 0;
  224. err:
  225. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  226. return ret;
  227. }
  228. static int hd29l2_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
  229. {
  230. int ret;
  231. struct hd29l2_priv *priv = fe->demodulator_priv;
  232. u8 buf[2];
  233. u16 tmp;
  234. *strength = 0;
  235. ret = hd29l2_rd_regs(priv, 0xd5, buf, 2);
  236. if (ret)
  237. goto err;
  238. tmp = buf[0] << 8 | buf[1];
  239. tmp = ~tmp & 0x0fff;
  240. /* scale value to 0x0000-0xffff from 0x0000-0x0fff */
  241. *strength = tmp * 0xffff / 0x0fff;
  242. return 0;
  243. err:
  244. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  245. return ret;
  246. }
  247. static int hd29l2_read_ber(struct dvb_frontend *fe, u32 *ber)
  248. {
  249. int ret;
  250. struct hd29l2_priv *priv = fe->demodulator_priv;
  251. u8 buf[2];
  252. if (!(priv->fe_status & FE_HAS_SYNC)) {
  253. *ber = 0;
  254. ret = 0;
  255. goto err;
  256. }
  257. ret = hd29l2_rd_regs(priv, 0xd9, buf, 2);
  258. if (ret) {
  259. *ber = 0;
  260. goto err;
  261. }
  262. /* LDPC BER */
  263. *ber = ((buf[0] & 0x0f) << 8) | buf[1];
  264. return 0;
  265. err:
  266. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  267. return ret;
  268. }
  269. static int hd29l2_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
  270. {
  271. /* no way to read? */
  272. *ucblocks = 0;
  273. return 0;
  274. }
  275. static enum dvbfe_search hd29l2_search(struct dvb_frontend *fe)
  276. {
  277. int ret, i;
  278. struct hd29l2_priv *priv = fe->demodulator_priv;
  279. struct dtv_frontend_properties *c = &fe->dtv_property_cache;
  280. u8 tmp, buf[3];
  281. u8 modulation, carrier, guard_interval, interleave, code_rate;
  282. u64 num64;
  283. u32 if_freq, if_ctl;
  284. bool auto_mode;
  285. dev_dbg(&priv->i2c->dev, "%s: delivery_system=%d frequency=%d " \
  286. "bandwidth_hz=%d modulation=%d inversion=%d " \
  287. "fec_inner=%d guard_interval=%d\n", __func__,
  288. c->delivery_system, c->frequency, c->bandwidth_hz,
  289. c->modulation, c->inversion, c->fec_inner,
  290. c->guard_interval);
  291. /* as for now we detect always params automatically */
  292. auto_mode = true;
  293. /* program tuner */
  294. if (fe->ops.tuner_ops.set_params)
  295. fe->ops.tuner_ops.set_params(fe);
  296. /* get and program IF */
  297. if (fe->ops.tuner_ops.get_if_frequency)
  298. fe->ops.tuner_ops.get_if_frequency(fe, &if_freq);
  299. else
  300. if_freq = 0;
  301. if (if_freq) {
  302. /* normal IF */
  303. /* calc IF control value */
  304. num64 = if_freq;
  305. num64 *= 0x800000;
  306. num64 = div_u64(num64, HD29L2_XTAL);
  307. num64 -= 0x800000;
  308. if_ctl = num64;
  309. tmp = 0xfc; /* tuner type normal */
  310. } else {
  311. /* zero IF */
  312. if_ctl = 0;
  313. tmp = 0xfe; /* tuner type Zero-IF */
  314. }
  315. buf[0] = ((if_ctl >> 0) & 0xff);
  316. buf[1] = ((if_ctl >> 8) & 0xff);
  317. buf[2] = ((if_ctl >> 16) & 0xff);
  318. /* program IF control */
  319. ret = hd29l2_wr_regs(priv, 0x14, buf, 3);
  320. if (ret)
  321. goto err;
  322. /* program tuner type */
  323. ret = hd29l2_wr_reg(priv, 0xab, tmp);
  324. if (ret)
  325. goto err;
  326. dev_dbg(&priv->i2c->dev, "%s: if_freq=%d if_ctl=%x\n",
  327. __func__, if_freq, if_ctl);
  328. if (auto_mode) {
  329. /*
  330. * use auto mode
  331. */
  332. /* disable quick mode */
  333. ret = hd29l2_wr_reg_mask(priv, 0xac, 0 << 7, 0x80);
  334. if (ret)
  335. goto err;
  336. ret = hd29l2_wr_reg_mask(priv, 0x82, 1 << 1, 0x02);
  337. if (ret)
  338. goto err;
  339. /* enable auto mode */
  340. ret = hd29l2_wr_reg_mask(priv, 0x7d, 1 << 6, 0x40);
  341. if (ret)
  342. goto err;
  343. ret = hd29l2_wr_reg_mask(priv, 0x81, 1 << 3, 0x08);
  344. if (ret)
  345. goto err;
  346. /* soft reset */
  347. ret = hd29l2_soft_reset(priv);
  348. if (ret)
  349. goto err;
  350. /* detect modulation */
  351. for (i = 30; i; i--) {
  352. msleep(100);
  353. ret = hd29l2_rd_reg(priv, 0x0d, &tmp);
  354. if (ret)
  355. goto err;
  356. if ((((tmp & 0xf0) >= 0x10) &&
  357. ((tmp & 0x0f) == 0x08)) || (tmp >= 0x2c))
  358. break;
  359. }
  360. dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i);
  361. if (i == 0)
  362. /* detection failed */
  363. return DVBFE_ALGO_SEARCH_FAILED;
  364. /* read modulation */
  365. ret = hd29l2_rd_reg_mask(priv, 0x7d, &modulation, 0x07);
  366. if (ret)
  367. goto err;
  368. } else {
  369. /*
  370. * use manual mode
  371. */
  372. modulation = HD29L2_QAM64;
  373. carrier = HD29L2_CARRIER_MULTI;
  374. guard_interval = HD29L2_PN945;
  375. interleave = HD29L2_INTERLEAVER_420;
  376. code_rate = HD29L2_CODE_RATE_08;
  377. tmp = (code_rate << 3) | modulation;
  378. ret = hd29l2_wr_reg_mask(priv, 0x7d, tmp, 0x5f);
  379. if (ret)
  380. goto err;
  381. tmp = (carrier << 2) | guard_interval;
  382. ret = hd29l2_wr_reg_mask(priv, 0x81, tmp, 0x0f);
  383. if (ret)
  384. goto err;
  385. tmp = interleave;
  386. ret = hd29l2_wr_reg_mask(priv, 0x82, tmp, 0x03);
  387. if (ret)
  388. goto err;
  389. }
  390. /* ensure modulation validy */
  391. /* 0=QAM4_NR, 1=QAM4, 2=QAM16, 3=QAM32, 4=QAM64 */
  392. if (modulation > (ARRAY_SIZE(reg_mod_vals_tab[0].val) - 1)) {
  393. dev_dbg(&priv->i2c->dev, "%s: modulation=%d not valid\n",
  394. __func__, modulation);
  395. goto err;
  396. }
  397. /* program registers according to modulation */
  398. for (i = 0; i < ARRAY_SIZE(reg_mod_vals_tab); i++) {
  399. ret = hd29l2_wr_reg(priv, reg_mod_vals_tab[i].reg,
  400. reg_mod_vals_tab[i].val[modulation]);
  401. if (ret)
  402. goto err;
  403. }
  404. /* read guard interval */
  405. ret = hd29l2_rd_reg_mask(priv, 0x81, &guard_interval, 0x03);
  406. if (ret)
  407. goto err;
  408. /* read carrier mode */
  409. ret = hd29l2_rd_reg_mask(priv, 0x81, &carrier, 0x04);
  410. if (ret)
  411. goto err;
  412. dev_dbg(&priv->i2c->dev,
  413. "%s: modulation=%d guard_interval=%d carrier=%d\n",
  414. __func__, modulation, guard_interval, carrier);
  415. if ((carrier == HD29L2_CARRIER_MULTI) && (modulation == HD29L2_QAM64) &&
  416. (guard_interval == HD29L2_PN945)) {
  417. dev_dbg(&priv->i2c->dev, "%s: C=3780 && QAM64 && PN945\n",
  418. __func__);
  419. ret = hd29l2_wr_reg(priv, 0x42, 0x33);
  420. if (ret)
  421. goto err;
  422. ret = hd29l2_wr_reg(priv, 0xdd, 0x01);
  423. if (ret)
  424. goto err;
  425. }
  426. usleep_range(10000, 20000);
  427. /* soft reset */
  428. ret = hd29l2_soft_reset(priv);
  429. if (ret)
  430. goto err;
  431. /* wait demod lock */
  432. for (i = 30; i; i--) {
  433. msleep(100);
  434. /* read lock bit */
  435. ret = hd29l2_rd_reg_mask(priv, 0x05, &tmp, 0x01);
  436. if (ret)
  437. goto err;
  438. if (tmp)
  439. break;
  440. }
  441. dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i);
  442. if (i == 0)
  443. return DVBFE_ALGO_SEARCH_AGAIN;
  444. return DVBFE_ALGO_SEARCH_SUCCESS;
  445. err:
  446. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  447. return DVBFE_ALGO_SEARCH_ERROR;
  448. }
  449. static int hd29l2_get_frontend_algo(struct dvb_frontend *fe)
  450. {
  451. return DVBFE_ALGO_CUSTOM;
  452. }
  453. static int hd29l2_get_frontend(struct dvb_frontend *fe)
  454. {
  455. int ret;
  456. struct hd29l2_priv *priv = fe->demodulator_priv;
  457. struct dtv_frontend_properties *c = &fe->dtv_property_cache;
  458. u8 buf[3];
  459. u32 if_ctl;
  460. char *str_constellation, *str_code_rate, *str_constellation_code_rate,
  461. *str_guard_interval, *str_carrier, *str_guard_interval_carrier,
  462. *str_interleave, *str_interleave_;
  463. ret = hd29l2_rd_reg(priv, 0x7d, &buf[0]);
  464. if (ret)
  465. goto err;
  466. ret = hd29l2_rd_regs(priv, 0x81, &buf[1], 2);
  467. if (ret)
  468. goto err;
  469. /* constellation, 0x7d[2:0] */
  470. switch ((buf[0] >> 0) & 0x07) {
  471. case 0: /* QAM4NR */
  472. str_constellation = "QAM4NR";
  473. c->modulation = QAM_AUTO; /* FIXME */
  474. break;
  475. case 1: /* QAM4 */
  476. str_constellation = "QAM4";
  477. c->modulation = QPSK; /* FIXME */
  478. break;
  479. case 2:
  480. str_constellation = "QAM16";
  481. c->modulation = QAM_16;
  482. break;
  483. case 3:
  484. str_constellation = "QAM32";
  485. c->modulation = QAM_32;
  486. break;
  487. case 4:
  488. str_constellation = "QAM64";
  489. c->modulation = QAM_64;
  490. break;
  491. default:
  492. str_constellation = "?";
  493. }
  494. /* LDPC code rate, 0x7d[4:3] */
  495. switch ((buf[0] >> 3) & 0x03) {
  496. case 0: /* 0.4 */
  497. str_code_rate = "0.4";
  498. c->fec_inner = FEC_AUTO; /* FIXME */
  499. break;
  500. case 1: /* 0.6 */
  501. str_code_rate = "0.6";
  502. c->fec_inner = FEC_3_5;
  503. break;
  504. case 2: /* 0.8 */
  505. str_code_rate = "0.8";
  506. c->fec_inner = FEC_4_5;
  507. break;
  508. default:
  509. str_code_rate = "?";
  510. }
  511. /* constellation & code rate set, 0x7d[6] */
  512. switch ((buf[0] >> 6) & 0x01) {
  513. case 0:
  514. str_constellation_code_rate = "manual";
  515. break;
  516. case 1:
  517. str_constellation_code_rate = "auto";
  518. break;
  519. default:
  520. str_constellation_code_rate = "?";
  521. }
  522. /* frame header, 0x81[1:0] */
  523. switch ((buf[1] >> 0) & 0x03) {
  524. case 0: /* PN945 */
  525. str_guard_interval = "PN945";
  526. c->guard_interval = GUARD_INTERVAL_AUTO; /* FIXME */
  527. break;
  528. case 1: /* PN595 */
  529. str_guard_interval = "PN595";
  530. c->guard_interval = GUARD_INTERVAL_AUTO; /* FIXME */
  531. break;
  532. case 2: /* PN420 */
  533. str_guard_interval = "PN420";
  534. c->guard_interval = GUARD_INTERVAL_AUTO; /* FIXME */
  535. break;
  536. default:
  537. str_guard_interval = "?";
  538. }
  539. /* carrier, 0x81[2] */
  540. switch ((buf[1] >> 2) & 0x01) {
  541. case 0:
  542. str_carrier = "C=1";
  543. break;
  544. case 1:
  545. str_carrier = "C=3780";
  546. break;
  547. default:
  548. str_carrier = "?";
  549. }
  550. /* frame header & carrier set, 0x81[3] */
  551. switch ((buf[1] >> 3) & 0x01) {
  552. case 0:
  553. str_guard_interval_carrier = "manual";
  554. break;
  555. case 1:
  556. str_guard_interval_carrier = "auto";
  557. break;
  558. default:
  559. str_guard_interval_carrier = "?";
  560. }
  561. /* interleave, 0x82[0] */
  562. switch ((buf[2] >> 0) & 0x01) {
  563. case 0:
  564. str_interleave = "M=720";
  565. break;
  566. case 1:
  567. str_interleave = "M=240";
  568. break;
  569. default:
  570. str_interleave = "?";
  571. }
  572. /* interleave set, 0x82[1] */
  573. switch ((buf[2] >> 1) & 0x01) {
  574. case 0:
  575. str_interleave_ = "manual";
  576. break;
  577. case 1:
  578. str_interleave_ = "auto";
  579. break;
  580. default:
  581. str_interleave_ = "?";
  582. }
  583. /*
  584. * We can read out current detected NCO and use that value next
  585. * time instead of calculating new value from targed IF.
  586. * I think it will not effect receiver sensitivity but gaining lock
  587. * after tune could be easier...
  588. */
  589. ret = hd29l2_rd_regs(priv, 0xb1, &buf[0], 3);
  590. if (ret)
  591. goto err;
  592. if_ctl = (buf[0] << 16) | ((buf[1] - 7) << 8) | buf[2];
  593. dev_dbg(&priv->i2c->dev, "%s: %s %s %s | %s %s %s | %s %s | NCO=%06x\n",
  594. __func__, str_constellation, str_code_rate,
  595. str_constellation_code_rate, str_guard_interval,
  596. str_carrier, str_guard_interval_carrier, str_interleave,
  597. str_interleave_, if_ctl);
  598. return 0;
  599. err:
  600. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  601. return ret;
  602. }
  603. static int hd29l2_init(struct dvb_frontend *fe)
  604. {
  605. int ret, i;
  606. struct hd29l2_priv *priv = fe->demodulator_priv;
  607. u8 tmp;
  608. static const struct reg_val tab[] = {
  609. { 0x3a, 0x06 },
  610. { 0x3b, 0x03 },
  611. { 0x3c, 0x04 },
  612. { 0xaf, 0x06 },
  613. { 0xb0, 0x1b },
  614. { 0x80, 0x64 },
  615. { 0x10, 0x38 },
  616. };
  617. dev_dbg(&priv->i2c->dev, "%s:\n", __func__);
  618. /* reset demod */
  619. /* it is recommended to HW reset chip using RST_N pin */
  620. if (fe->callback) {
  621. ret = fe->callback(fe, DVB_FRONTEND_COMPONENT_DEMOD, 0, 0);
  622. if (ret)
  623. goto err;
  624. /* reprogramming needed because HW reset clears registers */
  625. priv->tuner_i2c_addr_programmed = false;
  626. }
  627. /* init */
  628. for (i = 0; i < ARRAY_SIZE(tab); i++) {
  629. ret = hd29l2_wr_reg(priv, tab[i].reg, tab[i].val);
  630. if (ret)
  631. goto err;
  632. }
  633. /* TS params */
  634. ret = hd29l2_rd_reg(priv, 0x36, &tmp);
  635. if (ret)
  636. goto err;
  637. tmp &= 0x1b;
  638. tmp |= priv->cfg.ts_mode;
  639. ret = hd29l2_wr_reg(priv, 0x36, tmp);
  640. if (ret)
  641. goto err;
  642. ret = hd29l2_rd_reg(priv, 0x31, &tmp);
  643. tmp &= 0xef;
  644. if (!(priv->cfg.ts_mode >> 7))
  645. /* set b4 for serial TS */
  646. tmp |= 0x10;
  647. ret = hd29l2_wr_reg(priv, 0x31, tmp);
  648. if (ret)
  649. goto err;
  650. return ret;
  651. err:
  652. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  653. return ret;
  654. }
  655. static void hd29l2_release(struct dvb_frontend *fe)
  656. {
  657. struct hd29l2_priv *priv = fe->demodulator_priv;
  658. kfree(priv);
  659. }
  660. static struct dvb_frontend_ops hd29l2_ops;
  661. struct dvb_frontend *hd29l2_attach(const struct hd29l2_config *config,
  662. struct i2c_adapter *i2c)
  663. {
  664. int ret;
  665. struct hd29l2_priv *priv = NULL;
  666. u8 tmp;
  667. /* allocate memory for the internal state */
  668. priv = kzalloc(sizeof(struct hd29l2_priv), GFP_KERNEL);
  669. if (priv == NULL)
  670. goto err;
  671. /* setup the state */
  672. priv->i2c = i2c;
  673. memcpy(&priv->cfg, config, sizeof(struct hd29l2_config));
  674. /* check if the demod is there */
  675. ret = hd29l2_rd_reg(priv, 0x00, &tmp);
  676. if (ret)
  677. goto err;
  678. /* create dvb_frontend */
  679. memcpy(&priv->fe.ops, &hd29l2_ops, sizeof(struct dvb_frontend_ops));
  680. priv->fe.demodulator_priv = priv;
  681. return &priv->fe;
  682. err:
  683. kfree(priv);
  684. return NULL;
  685. }
  686. EXPORT_SYMBOL(hd29l2_attach);
  687. static struct dvb_frontend_ops hd29l2_ops = {
  688. .delsys = { SYS_DVBT },
  689. .info = {
  690. .name = "HDIC HD29L2 DMB-TH",
  691. .frequency_min = 474000000,
  692. .frequency_max = 858000000,
  693. .frequency_stepsize = 10000,
  694. .caps = FE_CAN_FEC_AUTO |
  695. FE_CAN_QPSK |
  696. FE_CAN_QAM_16 |
  697. FE_CAN_QAM_32 |
  698. FE_CAN_QAM_64 |
  699. FE_CAN_QAM_AUTO |
  700. FE_CAN_TRANSMISSION_MODE_AUTO |
  701. FE_CAN_BANDWIDTH_AUTO |
  702. FE_CAN_GUARD_INTERVAL_AUTO |
  703. FE_CAN_HIERARCHY_AUTO |
  704. FE_CAN_RECOVER
  705. },
  706. .release = hd29l2_release,
  707. .init = hd29l2_init,
  708. .get_frontend_algo = hd29l2_get_frontend_algo,
  709. .search = hd29l2_search,
  710. .get_frontend = hd29l2_get_frontend,
  711. .read_status = hd29l2_read_status,
  712. .read_snr = hd29l2_read_snr,
  713. .read_signal_strength = hd29l2_read_signal_strength,
  714. .read_ber = hd29l2_read_ber,
  715. .read_ucblocks = hd29l2_read_ucblocks,
  716. .i2c_gate_ctrl = hd29l2_i2c_gate_ctrl,
  717. };
  718. MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
  719. MODULE_DESCRIPTION("HDIC HD29L2 DMB-TH demodulator driver");
  720. MODULE_LICENSE("GPL");