tda10071.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284
  1. /*
  2. * NXP TDA10071 + Conexant CX24118A DVB-S/S2 demodulator + tuner driver
  3. *
  4. * Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
  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 along
  17. * with this program; if not, write to the Free Software Foundation, Inc.,
  18. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  19. */
  20. #include "tda10071_priv.h"
  21. static struct dvb_frontend_ops tda10071_ops;
  22. /* write multiple registers */
  23. static int tda10071_wr_regs(struct tda10071_priv *priv, u8 reg, u8 *val,
  24. int len)
  25. {
  26. int ret;
  27. u8 buf[len+1];
  28. struct i2c_msg msg[1] = {
  29. {
  30. .addr = priv->cfg.i2c_address,
  31. .flags = 0,
  32. .len = sizeof(buf),
  33. .buf = buf,
  34. }
  35. };
  36. buf[0] = reg;
  37. memcpy(&buf[1], val, len);
  38. ret = i2c_transfer(priv->i2c, msg, 1);
  39. if (ret == 1) {
  40. ret = 0;
  41. } else {
  42. dev_warn(&priv->i2c->dev, "%s: i2c wr failed=%d reg=%02x " \
  43. "len=%d\n", KBUILD_MODNAME, ret, reg, len);
  44. ret = -EREMOTEIO;
  45. }
  46. return ret;
  47. }
  48. /* read multiple registers */
  49. static int tda10071_rd_regs(struct tda10071_priv *priv, u8 reg, u8 *val,
  50. int len)
  51. {
  52. int ret;
  53. u8 buf[len];
  54. struct i2c_msg msg[2] = {
  55. {
  56. .addr = priv->cfg.i2c_address,
  57. .flags = 0,
  58. .len = 1,
  59. .buf = &reg,
  60. }, {
  61. .addr = priv->cfg.i2c_address,
  62. .flags = I2C_M_RD,
  63. .len = sizeof(buf),
  64. .buf = buf,
  65. }
  66. };
  67. ret = i2c_transfer(priv->i2c, msg, 2);
  68. if (ret == 2) {
  69. memcpy(val, buf, len);
  70. ret = 0;
  71. } else {
  72. dev_warn(&priv->i2c->dev, "%s: i2c rd failed=%d reg=%02x " \
  73. "len=%d\n", KBUILD_MODNAME, ret, reg, len);
  74. ret = -EREMOTEIO;
  75. }
  76. return ret;
  77. }
  78. /* write single register */
  79. static int tda10071_wr_reg(struct tda10071_priv *priv, u8 reg, u8 val)
  80. {
  81. return tda10071_wr_regs(priv, reg, &val, 1);
  82. }
  83. /* read single register */
  84. static int tda10071_rd_reg(struct tda10071_priv *priv, u8 reg, u8 *val)
  85. {
  86. return tda10071_rd_regs(priv, reg, val, 1);
  87. }
  88. /* write single register with mask */
  89. int tda10071_wr_reg_mask(struct tda10071_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 = tda10071_rd_regs(priv, reg, &tmp, 1);
  96. if (ret)
  97. return ret;
  98. val &= mask;
  99. tmp &= ~mask;
  100. val |= tmp;
  101. }
  102. return tda10071_wr_regs(priv, reg, &val, 1);
  103. }
  104. /* read single register with mask */
  105. int tda10071_rd_reg_mask(struct tda10071_priv *priv, u8 reg, u8 *val, u8 mask)
  106. {
  107. int ret, i;
  108. u8 tmp;
  109. ret = tda10071_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. /* execute firmware command */
  122. static int tda10071_cmd_execute(struct tda10071_priv *priv,
  123. struct tda10071_cmd *cmd)
  124. {
  125. int ret, i;
  126. u8 tmp;
  127. if (!priv->warm) {
  128. ret = -EFAULT;
  129. goto error;
  130. }
  131. /* write cmd and args for firmware */
  132. ret = tda10071_wr_regs(priv, 0x00, cmd->args, cmd->len);
  133. if (ret)
  134. goto error;
  135. /* start cmd execution */
  136. ret = tda10071_wr_reg(priv, 0x1f, 1);
  137. if (ret)
  138. goto error;
  139. /* wait cmd execution terminate */
  140. for (i = 1000, tmp = 1; i && tmp; i--) {
  141. ret = tda10071_rd_reg(priv, 0x1f, &tmp);
  142. if (ret)
  143. goto error;
  144. usleep_range(200, 5000);
  145. }
  146. dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i);
  147. if (i == 0) {
  148. ret = -ETIMEDOUT;
  149. goto error;
  150. }
  151. return ret;
  152. error:
  153. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  154. return ret;
  155. }
  156. static int tda10071_set_tone(struct dvb_frontend *fe,
  157. fe_sec_tone_mode_t fe_sec_tone_mode)
  158. {
  159. struct tda10071_priv *priv = fe->demodulator_priv;
  160. struct tda10071_cmd cmd;
  161. int ret;
  162. u8 tone;
  163. if (!priv->warm) {
  164. ret = -EFAULT;
  165. goto error;
  166. }
  167. dev_dbg(&priv->i2c->dev, "%s: tone_mode=%d\n", __func__,
  168. fe_sec_tone_mode);
  169. switch (fe_sec_tone_mode) {
  170. case SEC_TONE_ON:
  171. tone = 1;
  172. break;
  173. case SEC_TONE_OFF:
  174. tone = 0;
  175. break;
  176. default:
  177. dev_dbg(&priv->i2c->dev, "%s: invalid fe_sec_tone_mode\n",
  178. __func__);
  179. ret = -EINVAL;
  180. goto error;
  181. }
  182. cmd.args[0] = CMD_LNB_PCB_CONFIG;
  183. cmd.args[1] = 0;
  184. cmd.args[2] = 0x00;
  185. cmd.args[3] = 0x00;
  186. cmd.args[4] = tone;
  187. cmd.len = 5;
  188. ret = tda10071_cmd_execute(priv, &cmd);
  189. if (ret)
  190. goto error;
  191. return ret;
  192. error:
  193. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  194. return ret;
  195. }
  196. static int tda10071_set_voltage(struct dvb_frontend *fe,
  197. fe_sec_voltage_t fe_sec_voltage)
  198. {
  199. struct tda10071_priv *priv = fe->demodulator_priv;
  200. struct tda10071_cmd cmd;
  201. int ret;
  202. u8 voltage;
  203. if (!priv->warm) {
  204. ret = -EFAULT;
  205. goto error;
  206. }
  207. dev_dbg(&priv->i2c->dev, "%s: voltage=%d\n", __func__, fe_sec_voltage);
  208. switch (fe_sec_voltage) {
  209. case SEC_VOLTAGE_13:
  210. voltage = 0;
  211. break;
  212. case SEC_VOLTAGE_18:
  213. voltage = 1;
  214. break;
  215. case SEC_VOLTAGE_OFF:
  216. voltage = 0;
  217. break;
  218. default:
  219. dev_dbg(&priv->i2c->dev, "%s: invalid fe_sec_voltage\n",
  220. __func__);
  221. ret = -EINVAL;
  222. goto error;
  223. };
  224. cmd.args[0] = CMD_LNB_SET_DC_LEVEL;
  225. cmd.args[1] = 0;
  226. cmd.args[2] = voltage;
  227. cmd.len = 3;
  228. ret = tda10071_cmd_execute(priv, &cmd);
  229. if (ret)
  230. goto error;
  231. return ret;
  232. error:
  233. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  234. return ret;
  235. }
  236. static int tda10071_diseqc_send_master_cmd(struct dvb_frontend *fe,
  237. struct dvb_diseqc_master_cmd *diseqc_cmd)
  238. {
  239. struct tda10071_priv *priv = fe->demodulator_priv;
  240. struct tda10071_cmd cmd;
  241. int ret, i;
  242. u8 tmp;
  243. if (!priv->warm) {
  244. ret = -EFAULT;
  245. goto error;
  246. }
  247. dev_dbg(&priv->i2c->dev, "%s: msg_len=%d\n", __func__,
  248. diseqc_cmd->msg_len);
  249. if (diseqc_cmd->msg_len < 3 || diseqc_cmd->msg_len > 6) {
  250. ret = -EINVAL;
  251. goto error;
  252. }
  253. /* wait LNB TX */
  254. for (i = 500, tmp = 0; i && !tmp; i--) {
  255. ret = tda10071_rd_reg_mask(priv, 0x47, &tmp, 0x01);
  256. if (ret)
  257. goto error;
  258. usleep_range(10000, 20000);
  259. }
  260. dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i);
  261. if (i == 0) {
  262. ret = -ETIMEDOUT;
  263. goto error;
  264. }
  265. ret = tda10071_wr_reg_mask(priv, 0x47, 0x00, 0x01);
  266. if (ret)
  267. goto error;
  268. cmd.args[0] = CMD_LNB_SEND_DISEQC;
  269. cmd.args[1] = 0;
  270. cmd.args[2] = 0;
  271. cmd.args[3] = 0;
  272. cmd.args[4] = 2;
  273. cmd.args[5] = 0;
  274. cmd.args[6] = diseqc_cmd->msg_len;
  275. memcpy(&cmd.args[7], diseqc_cmd->msg, diseqc_cmd->msg_len);
  276. cmd.len = 7 + diseqc_cmd->msg_len;
  277. ret = tda10071_cmd_execute(priv, &cmd);
  278. if (ret)
  279. goto error;
  280. return ret;
  281. error:
  282. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  283. return ret;
  284. }
  285. static int tda10071_diseqc_recv_slave_reply(struct dvb_frontend *fe,
  286. struct dvb_diseqc_slave_reply *reply)
  287. {
  288. struct tda10071_priv *priv = fe->demodulator_priv;
  289. struct tda10071_cmd cmd;
  290. int ret, i;
  291. u8 tmp;
  292. if (!priv->warm) {
  293. ret = -EFAULT;
  294. goto error;
  295. }
  296. dev_dbg(&priv->i2c->dev, "%s:\n", __func__);
  297. /* wait LNB RX */
  298. for (i = 500, tmp = 0; i && !tmp; i--) {
  299. ret = tda10071_rd_reg_mask(priv, 0x47, &tmp, 0x02);
  300. if (ret)
  301. goto error;
  302. usleep_range(10000, 20000);
  303. }
  304. dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i);
  305. if (i == 0) {
  306. ret = -ETIMEDOUT;
  307. goto error;
  308. }
  309. /* reply len */
  310. ret = tda10071_rd_reg(priv, 0x46, &tmp);
  311. if (ret)
  312. goto error;
  313. reply->msg_len = tmp & 0x1f; /* [4:0] */;
  314. if (reply->msg_len > sizeof(reply->msg))
  315. reply->msg_len = sizeof(reply->msg); /* truncate API max */
  316. /* read reply */
  317. cmd.args[0] = CMD_LNB_UPDATE_REPLY;
  318. cmd.args[1] = 0;
  319. cmd.len = 2;
  320. ret = tda10071_cmd_execute(priv, &cmd);
  321. if (ret)
  322. goto error;
  323. ret = tda10071_rd_regs(priv, cmd.len, reply->msg, reply->msg_len);
  324. if (ret)
  325. goto error;
  326. return ret;
  327. error:
  328. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  329. return ret;
  330. }
  331. static int tda10071_diseqc_send_burst(struct dvb_frontend *fe,
  332. fe_sec_mini_cmd_t fe_sec_mini_cmd)
  333. {
  334. struct tda10071_priv *priv = fe->demodulator_priv;
  335. struct tda10071_cmd cmd;
  336. int ret, i;
  337. u8 tmp, burst;
  338. if (!priv->warm) {
  339. ret = -EFAULT;
  340. goto error;
  341. }
  342. dev_dbg(&priv->i2c->dev, "%s: fe_sec_mini_cmd=%d\n", __func__,
  343. fe_sec_mini_cmd);
  344. switch (fe_sec_mini_cmd) {
  345. case SEC_MINI_A:
  346. burst = 0;
  347. break;
  348. case SEC_MINI_B:
  349. burst = 1;
  350. break;
  351. default:
  352. dev_dbg(&priv->i2c->dev, "%s: invalid fe_sec_mini_cmd\n",
  353. __func__);
  354. ret = -EINVAL;
  355. goto error;
  356. }
  357. /* wait LNB TX */
  358. for (i = 500, tmp = 0; i && !tmp; i--) {
  359. ret = tda10071_rd_reg_mask(priv, 0x47, &tmp, 0x01);
  360. if (ret)
  361. goto error;
  362. usleep_range(10000, 20000);
  363. }
  364. dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i);
  365. if (i == 0) {
  366. ret = -ETIMEDOUT;
  367. goto error;
  368. }
  369. ret = tda10071_wr_reg_mask(priv, 0x47, 0x00, 0x01);
  370. if (ret)
  371. goto error;
  372. cmd.args[0] = CMD_LNB_SEND_TONEBURST;
  373. cmd.args[1] = 0;
  374. cmd.args[2] = burst;
  375. cmd.len = 3;
  376. ret = tda10071_cmd_execute(priv, &cmd);
  377. if (ret)
  378. goto error;
  379. return ret;
  380. error:
  381. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  382. return ret;
  383. }
  384. static int tda10071_read_status(struct dvb_frontend *fe, fe_status_t *status)
  385. {
  386. struct tda10071_priv *priv = fe->demodulator_priv;
  387. int ret;
  388. u8 tmp;
  389. *status = 0;
  390. if (!priv->warm) {
  391. ret = 0;
  392. goto error;
  393. }
  394. ret = tda10071_rd_reg(priv, 0x39, &tmp);
  395. if (ret)
  396. goto error;
  397. if (tmp & 0x01) /* tuner PLL */
  398. *status |= FE_HAS_SIGNAL;
  399. if (tmp & 0x02) /* demod PLL */
  400. *status |= FE_HAS_CARRIER;
  401. if (tmp & 0x04) /* viterbi or LDPC*/
  402. *status |= FE_HAS_VITERBI;
  403. if (tmp & 0x08) /* RS or BCH */
  404. *status |= FE_HAS_SYNC | FE_HAS_LOCK;
  405. priv->fe_status = *status;
  406. return ret;
  407. error:
  408. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  409. return ret;
  410. }
  411. static int tda10071_read_snr(struct dvb_frontend *fe, u16 *snr)
  412. {
  413. struct tda10071_priv *priv = fe->demodulator_priv;
  414. int ret;
  415. u8 buf[2];
  416. if (!priv->warm || !(priv->fe_status & FE_HAS_LOCK)) {
  417. *snr = 0;
  418. ret = 0;
  419. goto error;
  420. }
  421. ret = tda10071_rd_regs(priv, 0x3a, buf, 2);
  422. if (ret)
  423. goto error;
  424. /* Es/No dBx10 */
  425. *snr = buf[0] << 8 | buf[1];
  426. return ret;
  427. error:
  428. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  429. return ret;
  430. }
  431. static int tda10071_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
  432. {
  433. struct tda10071_priv *priv = fe->demodulator_priv;
  434. struct tda10071_cmd cmd;
  435. int ret;
  436. u8 tmp;
  437. if (!priv->warm || !(priv->fe_status & FE_HAS_LOCK)) {
  438. *strength = 0;
  439. ret = 0;
  440. goto error;
  441. }
  442. cmd.args[0] = CMD_GET_AGCACC;
  443. cmd.args[1] = 0;
  444. cmd.len = 2;
  445. ret = tda10071_cmd_execute(priv, &cmd);
  446. if (ret)
  447. goto error;
  448. /* input power estimate dBm */
  449. ret = tda10071_rd_reg(priv, 0x50, &tmp);
  450. if (ret)
  451. goto error;
  452. if (tmp < 181)
  453. tmp = 181; /* -75 dBm */
  454. else if (tmp > 236)
  455. tmp = 236; /* -20 dBm */
  456. /* scale value to 0x0000-0xffff */
  457. *strength = (tmp-181) * 0xffff / (236-181);
  458. return ret;
  459. error:
  460. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  461. return ret;
  462. }
  463. static int tda10071_read_ber(struct dvb_frontend *fe, u32 *ber)
  464. {
  465. struct tda10071_priv *priv = fe->demodulator_priv;
  466. struct tda10071_cmd cmd;
  467. int ret, i, len;
  468. u8 tmp, reg, buf[8];
  469. if (!priv->warm || !(priv->fe_status & FE_HAS_LOCK)) {
  470. *ber = priv->ber = 0;
  471. ret = 0;
  472. goto error;
  473. }
  474. switch (priv->delivery_system) {
  475. case SYS_DVBS:
  476. reg = 0x4c;
  477. len = 8;
  478. i = 1;
  479. break;
  480. case SYS_DVBS2:
  481. reg = 0x4d;
  482. len = 4;
  483. i = 0;
  484. break;
  485. default:
  486. *ber = priv->ber = 0;
  487. return 0;
  488. }
  489. ret = tda10071_rd_reg(priv, reg, &tmp);
  490. if (ret)
  491. goto error;
  492. if (priv->meas_count[i] == tmp) {
  493. dev_dbg(&priv->i2c->dev, "%s: meas not ready=%02x\n", __func__,
  494. tmp);
  495. *ber = priv->ber;
  496. return 0;
  497. } else {
  498. priv->meas_count[i] = tmp;
  499. }
  500. cmd.args[0] = CMD_BER_UPDATE_COUNTERS;
  501. cmd.args[1] = 0;
  502. cmd.args[2] = i;
  503. cmd.len = 3;
  504. ret = tda10071_cmd_execute(priv, &cmd);
  505. if (ret)
  506. goto error;
  507. ret = tda10071_rd_regs(priv, cmd.len, buf, len);
  508. if (ret)
  509. goto error;
  510. if (priv->delivery_system == SYS_DVBS) {
  511. *ber = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
  512. priv->ucb += (buf[4] << 8) | buf[5];
  513. } else {
  514. *ber = (buf[0] << 8) | buf[1];
  515. }
  516. priv->ber = *ber;
  517. return ret;
  518. error:
  519. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  520. return ret;
  521. }
  522. static int tda10071_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
  523. {
  524. struct tda10071_priv *priv = fe->demodulator_priv;
  525. int ret = 0;
  526. if (!priv->warm || !(priv->fe_status & FE_HAS_LOCK)) {
  527. *ucblocks = 0;
  528. goto error;
  529. }
  530. /* UCB is updated when BER is read. Assume BER is read anyway. */
  531. *ucblocks = priv->ucb;
  532. return ret;
  533. error:
  534. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  535. return ret;
  536. }
  537. static int tda10071_set_frontend(struct dvb_frontend *fe)
  538. {
  539. struct tda10071_priv *priv = fe->demodulator_priv;
  540. struct tda10071_cmd cmd;
  541. struct dtv_frontend_properties *c = &fe->dtv_property_cache;
  542. int ret, i;
  543. u8 mode, rolloff, pilot, inversion, div;
  544. dev_dbg(&priv->i2c->dev, "%s: delivery_system=%d modulation=%d " \
  545. "frequency=%d symbol_rate=%d inversion=%d pilot=%d " \
  546. "rolloff=%d\n", __func__, c->delivery_system, c->modulation,
  547. c->frequency, c->symbol_rate, c->inversion, c->pilot,
  548. c->rolloff);
  549. priv->delivery_system = SYS_UNDEFINED;
  550. if (!priv->warm) {
  551. ret = -EFAULT;
  552. goto error;
  553. }
  554. switch (c->inversion) {
  555. case INVERSION_OFF:
  556. inversion = 1;
  557. break;
  558. case INVERSION_ON:
  559. inversion = 0;
  560. break;
  561. case INVERSION_AUTO:
  562. /* 2 = auto; try first on then off
  563. * 3 = auto; try first off then on */
  564. inversion = 3;
  565. break;
  566. default:
  567. dev_dbg(&priv->i2c->dev, "%s: invalid inversion\n", __func__);
  568. ret = -EINVAL;
  569. goto error;
  570. }
  571. switch (c->delivery_system) {
  572. case SYS_DVBS:
  573. rolloff = 0;
  574. pilot = 2;
  575. break;
  576. case SYS_DVBS2:
  577. switch (c->rolloff) {
  578. case ROLLOFF_20:
  579. rolloff = 2;
  580. break;
  581. case ROLLOFF_25:
  582. rolloff = 1;
  583. break;
  584. case ROLLOFF_35:
  585. rolloff = 0;
  586. break;
  587. case ROLLOFF_AUTO:
  588. default:
  589. dev_dbg(&priv->i2c->dev, "%s: invalid rolloff\n",
  590. __func__);
  591. ret = -EINVAL;
  592. goto error;
  593. }
  594. switch (c->pilot) {
  595. case PILOT_OFF:
  596. pilot = 0;
  597. break;
  598. case PILOT_ON:
  599. pilot = 1;
  600. break;
  601. case PILOT_AUTO:
  602. pilot = 2;
  603. break;
  604. default:
  605. dev_dbg(&priv->i2c->dev, "%s: invalid pilot\n",
  606. __func__);
  607. ret = -EINVAL;
  608. goto error;
  609. }
  610. break;
  611. default:
  612. dev_dbg(&priv->i2c->dev, "%s: invalid delivery_system\n",
  613. __func__);
  614. ret = -EINVAL;
  615. goto error;
  616. }
  617. for (i = 0, mode = 0xff; i < ARRAY_SIZE(TDA10071_MODCOD); i++) {
  618. if (c->delivery_system == TDA10071_MODCOD[i].delivery_system &&
  619. c->modulation == TDA10071_MODCOD[i].modulation &&
  620. c->fec_inner == TDA10071_MODCOD[i].fec) {
  621. mode = TDA10071_MODCOD[i].val;
  622. dev_dbg(&priv->i2c->dev, "%s: mode found=%02x\n",
  623. __func__, mode);
  624. break;
  625. }
  626. }
  627. if (mode == 0xff) {
  628. dev_dbg(&priv->i2c->dev, "%s: invalid parameter combination\n",
  629. __func__);
  630. ret = -EINVAL;
  631. goto error;
  632. }
  633. if (c->symbol_rate <= 5000000)
  634. div = 14;
  635. else
  636. div = 4;
  637. ret = tda10071_wr_reg(priv, 0x81, div);
  638. if (ret)
  639. goto error;
  640. ret = tda10071_wr_reg(priv, 0xe3, div);
  641. if (ret)
  642. goto error;
  643. cmd.args[0] = CMD_CHANGE_CHANNEL;
  644. cmd.args[1] = 0;
  645. cmd.args[2] = mode;
  646. cmd.args[3] = (c->frequency >> 16) & 0xff;
  647. cmd.args[4] = (c->frequency >> 8) & 0xff;
  648. cmd.args[5] = (c->frequency >> 0) & 0xff;
  649. cmd.args[6] = ((c->symbol_rate / 1000) >> 8) & 0xff;
  650. cmd.args[7] = ((c->symbol_rate / 1000) >> 0) & 0xff;
  651. cmd.args[8] = (tda10071_ops.info.frequency_tolerance >> 8) & 0xff;
  652. cmd.args[9] = (tda10071_ops.info.frequency_tolerance >> 0) & 0xff;
  653. cmd.args[10] = rolloff;
  654. cmd.args[11] = inversion;
  655. cmd.args[12] = pilot;
  656. cmd.args[13] = 0x00;
  657. cmd.args[14] = 0x00;
  658. cmd.len = 15;
  659. ret = tda10071_cmd_execute(priv, &cmd);
  660. if (ret)
  661. goto error;
  662. priv->delivery_system = c->delivery_system;
  663. return ret;
  664. error:
  665. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  666. return ret;
  667. }
  668. static int tda10071_get_frontend(struct dvb_frontend *fe)
  669. {
  670. struct tda10071_priv *priv = fe->demodulator_priv;
  671. struct dtv_frontend_properties *c = &fe->dtv_property_cache;
  672. int ret, i;
  673. u8 buf[5], tmp;
  674. if (!priv->warm || !(priv->fe_status & FE_HAS_LOCK)) {
  675. ret = -EFAULT;
  676. goto error;
  677. }
  678. ret = tda10071_rd_regs(priv, 0x30, buf, 5);
  679. if (ret)
  680. goto error;
  681. tmp = buf[0] & 0x3f;
  682. for (i = 0; i < ARRAY_SIZE(TDA10071_MODCOD); i++) {
  683. if (tmp == TDA10071_MODCOD[i].val) {
  684. c->modulation = TDA10071_MODCOD[i].modulation;
  685. c->fec_inner = TDA10071_MODCOD[i].fec;
  686. c->delivery_system = TDA10071_MODCOD[i].delivery_system;
  687. }
  688. }
  689. switch ((buf[1] >> 0) & 0x01) {
  690. case 0:
  691. c->inversion = INVERSION_OFF;
  692. break;
  693. case 1:
  694. c->inversion = INVERSION_ON;
  695. break;
  696. }
  697. switch ((buf[1] >> 7) & 0x01) {
  698. case 0:
  699. c->pilot = PILOT_OFF;
  700. break;
  701. case 1:
  702. c->pilot = PILOT_ON;
  703. break;
  704. }
  705. c->frequency = (buf[2] << 16) | (buf[3] << 8) | (buf[4] << 0);
  706. ret = tda10071_rd_regs(priv, 0x52, buf, 3);
  707. if (ret)
  708. goto error;
  709. c->symbol_rate = (buf[0] << 16) | (buf[1] << 8) | (buf[2] << 0);
  710. return ret;
  711. error:
  712. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  713. return ret;
  714. }
  715. static int tda10071_init(struct dvb_frontend *fe)
  716. {
  717. struct tda10071_priv *priv = fe->demodulator_priv;
  718. struct tda10071_cmd cmd;
  719. int ret, i, len, remaining, fw_size;
  720. const struct firmware *fw;
  721. u8 *fw_file = TDA10071_DEFAULT_FIRMWARE;
  722. u8 tmp, buf[4];
  723. struct tda10071_reg_val_mask tab[] = {
  724. { 0xcd, 0x00, 0x07 },
  725. { 0x80, 0x00, 0x02 },
  726. { 0xcd, 0x00, 0xc0 },
  727. { 0xce, 0x00, 0x1b },
  728. { 0x9d, 0x00, 0x01 },
  729. { 0x9d, 0x00, 0x02 },
  730. { 0x9e, 0x00, 0x01 },
  731. { 0x87, 0x00, 0x80 },
  732. { 0xce, 0x00, 0x08 },
  733. { 0xce, 0x00, 0x10 },
  734. };
  735. struct tda10071_reg_val_mask tab2[] = {
  736. { 0xf1, 0x70, 0xff },
  737. { 0x88, priv->cfg.pll_multiplier, 0x3f },
  738. { 0x89, 0x00, 0x10 },
  739. { 0x89, 0x10, 0x10 },
  740. { 0xc0, 0x01, 0x01 },
  741. { 0xc0, 0x00, 0x01 },
  742. { 0xe0, 0xff, 0xff },
  743. { 0xe0, 0x00, 0xff },
  744. { 0x96, 0x1e, 0x7e },
  745. { 0x8b, 0x08, 0x08 },
  746. { 0x8b, 0x00, 0x08 },
  747. { 0x8f, 0x1a, 0x7e },
  748. { 0x8c, 0x68, 0xff },
  749. { 0x8d, 0x08, 0xff },
  750. { 0x8e, 0x4c, 0xff },
  751. { 0x8f, 0x01, 0x01 },
  752. { 0x8b, 0x04, 0x04 },
  753. { 0x8b, 0x00, 0x04 },
  754. { 0x87, 0x05, 0x07 },
  755. { 0x80, 0x00, 0x20 },
  756. { 0xc8, 0x01, 0xff },
  757. { 0xb4, 0x47, 0xff },
  758. { 0xb5, 0x9c, 0xff },
  759. { 0xb6, 0x7d, 0xff },
  760. { 0xba, 0x00, 0x03 },
  761. { 0xb7, 0x47, 0xff },
  762. { 0xb8, 0x9c, 0xff },
  763. { 0xb9, 0x7d, 0xff },
  764. { 0xba, 0x00, 0x0c },
  765. { 0xc8, 0x00, 0xff },
  766. { 0xcd, 0x00, 0x04 },
  767. { 0xcd, 0x00, 0x20 },
  768. { 0xe8, 0x02, 0xff },
  769. { 0xcf, 0x20, 0xff },
  770. { 0x9b, 0xd7, 0xff },
  771. { 0x9a, 0x01, 0x03 },
  772. { 0xa8, 0x05, 0x0f },
  773. { 0xa8, 0x65, 0xf0 },
  774. { 0xa6, 0xa0, 0xf0 },
  775. { 0x9d, 0x50, 0xfc },
  776. { 0x9e, 0x20, 0xe0 },
  777. { 0xa3, 0x1c, 0x7c },
  778. { 0xd5, 0x03, 0x03 },
  779. };
  780. /* firmware status */
  781. ret = tda10071_rd_reg(priv, 0x51, &tmp);
  782. if (ret)
  783. goto error;
  784. if (!tmp) {
  785. /* warm state - wake up device from sleep */
  786. priv->warm = 1;
  787. for (i = 0; i < ARRAY_SIZE(tab); i++) {
  788. ret = tda10071_wr_reg_mask(priv, tab[i].reg,
  789. tab[i].val, tab[i].mask);
  790. if (ret)
  791. goto error;
  792. }
  793. cmd.args[0] = CMD_SET_SLEEP_MODE;
  794. cmd.args[1] = 0;
  795. cmd.args[2] = 0;
  796. cmd.len = 3;
  797. ret = tda10071_cmd_execute(priv, &cmd);
  798. if (ret)
  799. goto error;
  800. } else {
  801. /* cold state - try to download firmware */
  802. priv->warm = 0;
  803. /* request the firmware, this will block and timeout */
  804. ret = request_firmware(&fw, fw_file, priv->i2c->dev.parent);
  805. if (ret) {
  806. dev_err(&priv->i2c->dev, "%s: did not find the " \
  807. "firmware file. (%s) Please see " \
  808. "linux/Documentation/dvb/ for more " \
  809. "details on firmware-problems. (%d)\n",
  810. KBUILD_MODNAME, fw_file, ret);
  811. goto error;
  812. }
  813. /* init */
  814. for (i = 0; i < ARRAY_SIZE(tab2); i++) {
  815. ret = tda10071_wr_reg_mask(priv, tab2[i].reg,
  816. tab2[i].val, tab2[i].mask);
  817. if (ret)
  818. goto error_release_firmware;
  819. }
  820. /* download firmware */
  821. ret = tda10071_wr_reg(priv, 0xe0, 0x7f);
  822. if (ret)
  823. goto error_release_firmware;
  824. ret = tda10071_wr_reg(priv, 0xf7, 0x81);
  825. if (ret)
  826. goto error_release_firmware;
  827. ret = tda10071_wr_reg(priv, 0xf8, 0x00);
  828. if (ret)
  829. goto error_release_firmware;
  830. ret = tda10071_wr_reg(priv, 0xf9, 0x00);
  831. if (ret)
  832. goto error_release_firmware;
  833. dev_info(&priv->i2c->dev, "%s: found a '%s' in cold state, " \
  834. "will try to load a firmware\n", KBUILD_MODNAME,
  835. tda10071_ops.info.name);
  836. dev_info(&priv->i2c->dev, "%s: downloading firmware from " \
  837. "file '%s'\n", KBUILD_MODNAME, fw_file);
  838. /* do not download last byte */
  839. fw_size = fw->size - 1;
  840. for (remaining = fw_size; remaining > 0;
  841. remaining -= (priv->cfg.i2c_wr_max - 1)) {
  842. len = remaining;
  843. if (len > (priv->cfg.i2c_wr_max - 1))
  844. len = (priv->cfg.i2c_wr_max - 1);
  845. ret = tda10071_wr_regs(priv, 0xfa,
  846. (u8 *) &fw->data[fw_size - remaining], len);
  847. if (ret) {
  848. dev_err(&priv->i2c->dev, "%s: firmware " \
  849. "download failed=%d\n",
  850. KBUILD_MODNAME, ret);
  851. if (ret)
  852. goto error_release_firmware;
  853. }
  854. }
  855. release_firmware(fw);
  856. ret = tda10071_wr_reg(priv, 0xf7, 0x0c);
  857. if (ret)
  858. goto error;
  859. ret = tda10071_wr_reg(priv, 0xe0, 0x00);
  860. if (ret)
  861. goto error;
  862. /* wait firmware start */
  863. msleep(250);
  864. /* firmware status */
  865. ret = tda10071_rd_reg(priv, 0x51, &tmp);
  866. if (ret)
  867. goto error;
  868. if (tmp) {
  869. dev_info(&priv->i2c->dev, "%s: firmware did not run\n",
  870. KBUILD_MODNAME);
  871. ret = -EFAULT;
  872. goto error;
  873. } else {
  874. priv->warm = 1;
  875. }
  876. cmd.args[0] = CMD_GET_FW_VERSION;
  877. cmd.len = 1;
  878. ret = tda10071_cmd_execute(priv, &cmd);
  879. if (ret)
  880. goto error;
  881. ret = tda10071_rd_regs(priv, cmd.len, buf, 4);
  882. if (ret)
  883. goto error;
  884. dev_info(&priv->i2c->dev, "%s: firmware version %d.%d.%d.%d\n",
  885. KBUILD_MODNAME, buf[0], buf[1], buf[2], buf[3]);
  886. dev_info(&priv->i2c->dev, "%s: found a '%s' in warm state\n",
  887. KBUILD_MODNAME, tda10071_ops.info.name);
  888. ret = tda10071_rd_regs(priv, 0x81, buf, 2);
  889. if (ret)
  890. goto error;
  891. cmd.args[0] = CMD_DEMOD_INIT;
  892. cmd.args[1] = ((priv->cfg.xtal / 1000) >> 8) & 0xff;
  893. cmd.args[2] = ((priv->cfg.xtal / 1000) >> 0) & 0xff;
  894. cmd.args[3] = buf[0];
  895. cmd.args[4] = buf[1];
  896. cmd.args[5] = priv->cfg.pll_multiplier;
  897. cmd.args[6] = priv->cfg.spec_inv;
  898. cmd.args[7] = 0x00;
  899. cmd.len = 8;
  900. ret = tda10071_cmd_execute(priv, &cmd);
  901. if (ret)
  902. goto error;
  903. cmd.args[0] = CMD_TUNER_INIT;
  904. cmd.args[1] = 0x00;
  905. cmd.args[2] = 0x00;
  906. cmd.args[3] = 0x00;
  907. cmd.args[4] = 0x00;
  908. cmd.args[5] = 0x14;
  909. cmd.args[6] = 0x00;
  910. cmd.args[7] = 0x03;
  911. cmd.args[8] = 0x02;
  912. cmd.args[9] = 0x02;
  913. cmd.args[10] = 0x00;
  914. cmd.args[11] = 0x00;
  915. cmd.args[12] = 0x00;
  916. cmd.args[13] = 0x00;
  917. cmd.args[14] = 0x00;
  918. cmd.len = 15;
  919. ret = tda10071_cmd_execute(priv, &cmd);
  920. if (ret)
  921. goto error;
  922. cmd.args[0] = CMD_MPEG_CONFIG;
  923. cmd.args[1] = 0;
  924. cmd.args[2] = priv->cfg.ts_mode;
  925. cmd.args[3] = 0x00;
  926. cmd.args[4] = 0x04;
  927. cmd.args[5] = 0x00;
  928. cmd.len = 6;
  929. ret = tda10071_cmd_execute(priv, &cmd);
  930. if (ret)
  931. goto error;
  932. ret = tda10071_wr_reg_mask(priv, 0xf0, 0x01, 0x01);
  933. if (ret)
  934. goto error;
  935. cmd.args[0] = CMD_LNB_CONFIG;
  936. cmd.args[1] = 0;
  937. cmd.args[2] = 150;
  938. cmd.args[3] = 3;
  939. cmd.args[4] = 22;
  940. cmd.args[5] = 1;
  941. cmd.args[6] = 1;
  942. cmd.args[7] = 30;
  943. cmd.args[8] = 30;
  944. cmd.args[9] = 30;
  945. cmd.args[10] = 30;
  946. cmd.len = 11;
  947. ret = tda10071_cmd_execute(priv, &cmd);
  948. if (ret)
  949. goto error;
  950. cmd.args[0] = CMD_BER_CONTROL;
  951. cmd.args[1] = 0;
  952. cmd.args[2] = 14;
  953. cmd.args[3] = 14;
  954. cmd.len = 4;
  955. ret = tda10071_cmd_execute(priv, &cmd);
  956. if (ret)
  957. goto error;
  958. }
  959. return ret;
  960. error_release_firmware:
  961. release_firmware(fw);
  962. error:
  963. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  964. return ret;
  965. }
  966. static int tda10071_sleep(struct dvb_frontend *fe)
  967. {
  968. struct tda10071_priv *priv = fe->demodulator_priv;
  969. struct tda10071_cmd cmd;
  970. int ret, i;
  971. struct tda10071_reg_val_mask tab[] = {
  972. { 0xcd, 0x07, 0x07 },
  973. { 0x80, 0x02, 0x02 },
  974. { 0xcd, 0xc0, 0xc0 },
  975. { 0xce, 0x1b, 0x1b },
  976. { 0x9d, 0x01, 0x01 },
  977. { 0x9d, 0x02, 0x02 },
  978. { 0x9e, 0x01, 0x01 },
  979. { 0x87, 0x80, 0x80 },
  980. { 0xce, 0x08, 0x08 },
  981. { 0xce, 0x10, 0x10 },
  982. };
  983. if (!priv->warm) {
  984. ret = -EFAULT;
  985. goto error;
  986. }
  987. cmd.args[0] = CMD_SET_SLEEP_MODE;
  988. cmd.args[1] = 0;
  989. cmd.args[2] = 1;
  990. cmd.len = 3;
  991. ret = tda10071_cmd_execute(priv, &cmd);
  992. if (ret)
  993. goto error;
  994. for (i = 0; i < ARRAY_SIZE(tab); i++) {
  995. ret = tda10071_wr_reg_mask(priv, tab[i].reg, tab[i].val,
  996. tab[i].mask);
  997. if (ret)
  998. goto error;
  999. }
  1000. return ret;
  1001. error:
  1002. dev_dbg(&priv->i2c->dev, "%s: failed=%d\n", __func__, ret);
  1003. return ret;
  1004. }
  1005. static int tda10071_get_tune_settings(struct dvb_frontend *fe,
  1006. struct dvb_frontend_tune_settings *s)
  1007. {
  1008. s->min_delay_ms = 8000;
  1009. s->step_size = 0;
  1010. s->max_drift = 0;
  1011. return 0;
  1012. }
  1013. static void tda10071_release(struct dvb_frontend *fe)
  1014. {
  1015. struct tda10071_priv *priv = fe->demodulator_priv;
  1016. kfree(priv);
  1017. }
  1018. struct dvb_frontend *tda10071_attach(const struct tda10071_config *config,
  1019. struct i2c_adapter *i2c)
  1020. {
  1021. int ret;
  1022. struct tda10071_priv *priv = NULL;
  1023. u8 tmp;
  1024. /* allocate memory for the internal priv */
  1025. priv = kzalloc(sizeof(struct tda10071_priv), GFP_KERNEL);
  1026. if (priv == NULL) {
  1027. ret = -ENOMEM;
  1028. goto error;
  1029. }
  1030. /* setup the priv */
  1031. priv->i2c = i2c;
  1032. memcpy(&priv->cfg, config, sizeof(struct tda10071_config));
  1033. /* chip ID */
  1034. ret = tda10071_rd_reg(priv, 0xff, &tmp);
  1035. if (ret || tmp != 0x0f)
  1036. goto error;
  1037. /* chip type */
  1038. ret = tda10071_rd_reg(priv, 0xdd, &tmp);
  1039. if (ret || tmp != 0x00)
  1040. goto error;
  1041. /* chip version */
  1042. ret = tda10071_rd_reg(priv, 0xfe, &tmp);
  1043. if (ret || tmp != 0x01)
  1044. goto error;
  1045. /* create dvb_frontend */
  1046. memcpy(&priv->fe.ops, &tda10071_ops, sizeof(struct dvb_frontend_ops));
  1047. priv->fe.demodulator_priv = priv;
  1048. return &priv->fe;
  1049. error:
  1050. dev_dbg(&i2c->dev, "%s: failed=%d\n", __func__, ret);
  1051. kfree(priv);
  1052. return NULL;
  1053. }
  1054. EXPORT_SYMBOL(tda10071_attach);
  1055. static struct dvb_frontend_ops tda10071_ops = {
  1056. .delsys = { SYS_DVBS, SYS_DVBS2 },
  1057. .info = {
  1058. .name = "NXP TDA10071",
  1059. .frequency_min = 950000,
  1060. .frequency_max = 2150000,
  1061. .frequency_tolerance = 5000,
  1062. .symbol_rate_min = 1000000,
  1063. .symbol_rate_max = 45000000,
  1064. .caps = FE_CAN_INVERSION_AUTO |
  1065. FE_CAN_FEC_1_2 |
  1066. FE_CAN_FEC_2_3 |
  1067. FE_CAN_FEC_3_4 |
  1068. FE_CAN_FEC_4_5 |
  1069. FE_CAN_FEC_5_6 |
  1070. FE_CAN_FEC_6_7 |
  1071. FE_CAN_FEC_7_8 |
  1072. FE_CAN_FEC_8_9 |
  1073. FE_CAN_FEC_AUTO |
  1074. FE_CAN_QPSK |
  1075. FE_CAN_RECOVER |
  1076. FE_CAN_2G_MODULATION
  1077. },
  1078. .release = tda10071_release,
  1079. .get_tune_settings = tda10071_get_tune_settings,
  1080. .init = tda10071_init,
  1081. .sleep = tda10071_sleep,
  1082. .set_frontend = tda10071_set_frontend,
  1083. .get_frontend = tda10071_get_frontend,
  1084. .read_status = tda10071_read_status,
  1085. .read_snr = tda10071_read_snr,
  1086. .read_signal_strength = tda10071_read_signal_strength,
  1087. .read_ber = tda10071_read_ber,
  1088. .read_ucblocks = tda10071_read_ucblocks,
  1089. .diseqc_send_master_cmd = tda10071_diseqc_send_master_cmd,
  1090. .diseqc_recv_slave_reply = tda10071_diseqc_recv_slave_reply,
  1091. .diseqc_send_burst = tda10071_diseqc_send_burst,
  1092. .set_tone = tda10071_set_tone,
  1093. .set_voltage = tda10071_set_voltage,
  1094. };
  1095. MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
  1096. MODULE_DESCRIPTION("NXP TDA10071 DVB-S/S2 demodulator driver");
  1097. MODULE_LICENSE("GPL");