hd29l2.c 18 KB

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