hd29l2.c 18 KB

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