mn88472.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. /*
  2. * Panasonic MN88472 DVB-T/T2/C demodulator driver
  3. *
  4. * Copyright (C) 2013 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. #include "mn88472_priv.h"
  17. static int mn88472_get_tune_settings(struct dvb_frontend *fe,
  18. struct dvb_frontend_tune_settings *s)
  19. {
  20. s->min_delay_ms = 1000;
  21. return 0;
  22. }
  23. static int mn88472_read_status(struct dvb_frontend *fe, enum fe_status *status)
  24. {
  25. struct i2c_client *client = fe->demodulator_priv;
  26. struct mn88472_dev *dev = i2c_get_clientdata(client);
  27. struct dtv_frontend_properties *c = &fe->dtv_property_cache;
  28. int ret;
  29. unsigned int utmp;
  30. if (!dev->active) {
  31. ret = -EAGAIN;
  32. goto err;
  33. }
  34. switch (c->delivery_system) {
  35. case SYS_DVBT:
  36. ret = regmap_read(dev->regmap[0], 0x7f, &utmp);
  37. if (ret)
  38. goto err;
  39. if ((utmp & 0x0f) >= 0x09)
  40. *status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
  41. FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
  42. else
  43. *status = 0;
  44. break;
  45. case SYS_DVBT2:
  46. ret = regmap_read(dev->regmap[2], 0x92, &utmp);
  47. if (ret)
  48. goto err;
  49. if ((utmp & 0x0f) >= 0x0d)
  50. *status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
  51. FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
  52. else if ((utmp & 0x0f) >= 0x0a)
  53. *status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
  54. FE_HAS_VITERBI;
  55. else if ((utmp & 0x0f) >= 0x07)
  56. *status = FE_HAS_SIGNAL | FE_HAS_CARRIER;
  57. else
  58. *status = 0;
  59. break;
  60. case SYS_DVBC_ANNEX_A:
  61. ret = regmap_read(dev->regmap[1], 0x84, &utmp);
  62. if (ret)
  63. goto err;
  64. if ((utmp & 0x0f) >= 0x08)
  65. *status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
  66. FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
  67. else
  68. *status = 0;
  69. break;
  70. default:
  71. ret = -EINVAL;
  72. goto err;
  73. }
  74. return 0;
  75. err:
  76. dev_dbg(&client->dev, "failed=%d\n", ret);
  77. return ret;
  78. }
  79. static int mn88472_set_frontend(struct dvb_frontend *fe)
  80. {
  81. struct i2c_client *client = fe->demodulator_priv;
  82. struct mn88472_dev *dev = i2c_get_clientdata(client);
  83. struct dtv_frontend_properties *c = &fe->dtv_property_cache;
  84. int ret, i;
  85. unsigned int utmp;
  86. u32 if_frequency;
  87. u8 buf[3], delivery_system_val, bandwidth_val, *bandwidth_vals_ptr;
  88. u8 reg_bank0_b4_val, reg_bank0_cd_val, reg_bank0_d4_val;
  89. u8 reg_bank0_d6_val;
  90. dev_dbg(&client->dev,
  91. "delivery_system=%u modulation=%u frequency=%u bandwidth_hz=%u symbol_rate=%u inversion=%d stream_id=%d\n",
  92. c->delivery_system, c->modulation, c->frequency,
  93. c->bandwidth_hz, c->symbol_rate, c->inversion, c->stream_id);
  94. if (!dev->active) {
  95. ret = -EAGAIN;
  96. goto err;
  97. }
  98. switch (c->delivery_system) {
  99. case SYS_DVBT:
  100. delivery_system_val = 0x02;
  101. reg_bank0_b4_val = 0x00;
  102. reg_bank0_cd_val = 0x1f;
  103. reg_bank0_d4_val = 0x0a;
  104. reg_bank0_d6_val = 0x48;
  105. break;
  106. case SYS_DVBT2:
  107. delivery_system_val = 0x03;
  108. reg_bank0_b4_val = 0xf6;
  109. reg_bank0_cd_val = 0x01;
  110. reg_bank0_d4_val = 0x09;
  111. reg_bank0_d6_val = 0x46;
  112. break;
  113. case SYS_DVBC_ANNEX_A:
  114. delivery_system_val = 0x04;
  115. reg_bank0_b4_val = 0x00;
  116. reg_bank0_cd_val = 0x17;
  117. reg_bank0_d4_val = 0x09;
  118. reg_bank0_d6_val = 0x48;
  119. break;
  120. default:
  121. ret = -EINVAL;
  122. goto err;
  123. }
  124. switch (c->delivery_system) {
  125. case SYS_DVBT:
  126. case SYS_DVBT2:
  127. switch (c->bandwidth_hz) {
  128. case 5000000:
  129. bandwidth_vals_ptr = "\xe5\x99\x9a\x1b\xa9\x1b\xa9";
  130. bandwidth_val = 0x03;
  131. break;
  132. case 6000000:
  133. bandwidth_vals_ptr = "\xbf\x55\x55\x15\x6b\x15\x6b";
  134. bandwidth_val = 0x02;
  135. break;
  136. case 7000000:
  137. bandwidth_vals_ptr = "\xa4\x00\x00\x0f\x2c\x0f\x2c";
  138. bandwidth_val = 0x01;
  139. break;
  140. case 8000000:
  141. bandwidth_vals_ptr = "\x8f\x80\x00\x08\xee\x08\xee";
  142. bandwidth_val = 0x00;
  143. break;
  144. default:
  145. ret = -EINVAL;
  146. goto err;
  147. }
  148. break;
  149. case SYS_DVBC_ANNEX_A:
  150. bandwidth_vals_ptr = NULL;
  151. bandwidth_val = 0x00;
  152. break;
  153. default:
  154. break;
  155. }
  156. /* Program tuner */
  157. if (fe->ops.tuner_ops.set_params) {
  158. ret = fe->ops.tuner_ops.set_params(fe);
  159. if (ret)
  160. goto err;
  161. }
  162. if (fe->ops.tuner_ops.get_if_frequency) {
  163. ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_frequency);
  164. if (ret)
  165. goto err;
  166. dev_dbg(&client->dev, "get_if_frequency=%d\n", if_frequency);
  167. } else {
  168. ret = -EINVAL;
  169. goto err;
  170. }
  171. ret = regmap_write(dev->regmap[2], 0x00, 0x66);
  172. if (ret)
  173. goto err;
  174. ret = regmap_write(dev->regmap[2], 0x01, 0x00);
  175. if (ret)
  176. goto err;
  177. ret = regmap_write(dev->regmap[2], 0x02, 0x01);
  178. if (ret)
  179. goto err;
  180. ret = regmap_write(dev->regmap[2], 0x03, delivery_system_val);
  181. if (ret)
  182. goto err;
  183. ret = regmap_write(dev->regmap[2], 0x04, bandwidth_val);
  184. if (ret)
  185. goto err;
  186. /* IF */
  187. utmp = DIV_ROUND_CLOSEST_ULL((u64)if_frequency * 0x1000000, dev->clk);
  188. buf[0] = (utmp >> 16) & 0xff;
  189. buf[1] = (utmp >> 8) & 0xff;
  190. buf[2] = (utmp >> 0) & 0xff;
  191. for (i = 0; i < 3; i++) {
  192. ret = regmap_write(dev->regmap[2], 0x10 + i, buf[i]);
  193. if (ret)
  194. goto err;
  195. }
  196. /* Bandwidth */
  197. if (bandwidth_vals_ptr) {
  198. for (i = 0; i < 7; i++) {
  199. ret = regmap_write(dev->regmap[2], 0x13 + i,
  200. bandwidth_vals_ptr[i]);
  201. if (ret)
  202. goto err;
  203. }
  204. }
  205. ret = regmap_write(dev->regmap[0], 0xb4, reg_bank0_b4_val);
  206. if (ret)
  207. goto err;
  208. ret = regmap_write(dev->regmap[0], 0xcd, reg_bank0_cd_val);
  209. if (ret)
  210. goto err;
  211. ret = regmap_write(dev->regmap[0], 0xd4, reg_bank0_d4_val);
  212. if (ret)
  213. goto err;
  214. ret = regmap_write(dev->regmap[0], 0xd6, reg_bank0_d6_val);
  215. if (ret)
  216. goto err;
  217. switch (c->delivery_system) {
  218. case SYS_DVBT:
  219. ret = regmap_write(dev->regmap[0], 0x07, 0x26);
  220. if (ret)
  221. goto err;
  222. ret = regmap_write(dev->regmap[0], 0x00, 0xba);
  223. if (ret)
  224. goto err;
  225. ret = regmap_write(dev->regmap[0], 0x01, 0x13);
  226. if (ret)
  227. goto err;
  228. break;
  229. case SYS_DVBT2:
  230. ret = regmap_write(dev->regmap[2], 0x2b, 0x13);
  231. if (ret)
  232. goto err;
  233. ret = regmap_write(dev->regmap[2], 0x4f, 0x05);
  234. if (ret)
  235. goto err;
  236. ret = regmap_write(dev->regmap[1], 0xf6, 0x05);
  237. if (ret)
  238. goto err;
  239. ret = regmap_write(dev->regmap[2], 0x32, c->stream_id);
  240. if (ret)
  241. goto err;
  242. break;
  243. case SYS_DVBC_ANNEX_A:
  244. break;
  245. default:
  246. break;
  247. }
  248. /* Reset FSM */
  249. ret = regmap_write(dev->regmap[2], 0xf8, 0x9f);
  250. if (ret)
  251. goto err;
  252. return 0;
  253. err:
  254. dev_dbg(&client->dev, "failed=%d\n", ret);
  255. return ret;
  256. }
  257. static int mn88472_init(struct dvb_frontend *fe)
  258. {
  259. struct i2c_client *client = fe->demodulator_priv;
  260. struct mn88472_dev *dev = i2c_get_clientdata(client);
  261. int ret, len, rem;
  262. unsigned int utmp;
  263. const struct firmware *firmware;
  264. const char *name = MN88472_FIRMWARE;
  265. dev_dbg(&client->dev, "\n");
  266. /* Power up */
  267. ret = regmap_write(dev->regmap[2], 0x05, 0x00);
  268. if (ret)
  269. goto err;
  270. ret = regmap_write(dev->regmap[2], 0x0b, 0x00);
  271. if (ret)
  272. goto err;
  273. ret = regmap_write(dev->regmap[2], 0x0c, 0x00);
  274. if (ret)
  275. goto err;
  276. /* Check if firmware is already running */
  277. ret = regmap_read(dev->regmap[0], 0xf5, &utmp);
  278. if (ret)
  279. goto err;
  280. if (!(utmp & 0x01))
  281. goto warm;
  282. ret = request_firmware(&firmware, name, &client->dev);
  283. if (ret) {
  284. dev_err(&client->dev, "firmware file '%s' not found\n", name);
  285. goto err;
  286. }
  287. dev_info(&client->dev, "downloading firmware from file '%s'\n", name);
  288. ret = regmap_write(dev->regmap[0], 0xf5, 0x03);
  289. if (ret)
  290. goto err_release_firmware;
  291. for (rem = firmware->size; rem > 0; rem -= (dev->i2c_write_max - 1)) {
  292. len = min(dev->i2c_write_max - 1, rem);
  293. ret = regmap_bulk_write(dev->regmap[0], 0xf6,
  294. &firmware->data[firmware->size - rem],
  295. len);
  296. if (ret) {
  297. dev_err(&client->dev, "firmware download failed %d\n",
  298. ret);
  299. goto err_release_firmware;
  300. }
  301. }
  302. /* Parity check of firmware */
  303. ret = regmap_read(dev->regmap[0], 0xf8, &utmp);
  304. if (ret)
  305. goto err_release_firmware;
  306. if (utmp & 0x10) {
  307. ret = -EINVAL;
  308. dev_err(&client->dev, "firmware did not run\n");
  309. goto err_release_firmware;
  310. }
  311. ret = regmap_write(dev->regmap[0], 0xf5, 0x00);
  312. if (ret)
  313. goto err_release_firmware;
  314. release_firmware(firmware);
  315. warm:
  316. /* TS config */
  317. switch (dev->ts_mode) {
  318. case SERIAL_TS_MODE:
  319. utmp = 0x1d;
  320. break;
  321. case PARALLEL_TS_MODE:
  322. utmp = 0x00;
  323. break;
  324. default:
  325. ret = -EINVAL;
  326. goto err;
  327. }
  328. ret = regmap_write(dev->regmap[2], 0x08, utmp);
  329. if (ret)
  330. goto err;
  331. switch (dev->ts_clk) {
  332. case VARIABLE_TS_CLOCK:
  333. utmp = 0xe3;
  334. break;
  335. case FIXED_TS_CLOCK:
  336. utmp = 0xe1;
  337. break;
  338. default:
  339. ret = -EINVAL;
  340. goto err;
  341. }
  342. ret = regmap_write(dev->regmap[0], 0xd9, utmp);
  343. if (ret)
  344. goto err;
  345. dev->active = true;
  346. return 0;
  347. err_release_firmware:
  348. release_firmware(firmware);
  349. err:
  350. dev_dbg(&client->dev, "failed=%d\n", ret);
  351. return ret;
  352. }
  353. static int mn88472_sleep(struct dvb_frontend *fe)
  354. {
  355. struct i2c_client *client = fe->demodulator_priv;
  356. struct mn88472_dev *dev = i2c_get_clientdata(client);
  357. int ret;
  358. dev_dbg(&client->dev, "\n");
  359. /* Power down */
  360. ret = regmap_write(dev->regmap[2], 0x0c, 0x30);
  361. if (ret)
  362. goto err;
  363. ret = regmap_write(dev->regmap[2], 0x0b, 0x30);
  364. if (ret)
  365. goto err;
  366. ret = regmap_write(dev->regmap[2], 0x05, 0x3e);
  367. if (ret)
  368. goto err;
  369. return 0;
  370. err:
  371. dev_dbg(&client->dev, "failed=%d\n", ret);
  372. return ret;
  373. }
  374. static struct dvb_frontend_ops mn88472_ops = {
  375. .delsys = {SYS_DVBT, SYS_DVBT2, SYS_DVBC_ANNEX_A},
  376. .info = {
  377. .name = "Panasonic MN88472",
  378. .symbol_rate_min = 1000000,
  379. .symbol_rate_max = 7200000,
  380. .caps = FE_CAN_FEC_1_2 |
  381. FE_CAN_FEC_2_3 |
  382. FE_CAN_FEC_3_4 |
  383. FE_CAN_FEC_5_6 |
  384. FE_CAN_FEC_7_8 |
  385. FE_CAN_FEC_AUTO |
  386. FE_CAN_QPSK |
  387. FE_CAN_QAM_16 |
  388. FE_CAN_QAM_32 |
  389. FE_CAN_QAM_64 |
  390. FE_CAN_QAM_128 |
  391. FE_CAN_QAM_256 |
  392. FE_CAN_QAM_AUTO |
  393. FE_CAN_TRANSMISSION_MODE_AUTO |
  394. FE_CAN_GUARD_INTERVAL_AUTO |
  395. FE_CAN_HIERARCHY_AUTO |
  396. FE_CAN_MUTE_TS |
  397. FE_CAN_2G_MODULATION |
  398. FE_CAN_MULTISTREAM
  399. },
  400. .get_tune_settings = mn88472_get_tune_settings,
  401. .init = mn88472_init,
  402. .sleep = mn88472_sleep,
  403. .set_frontend = mn88472_set_frontend,
  404. .read_status = mn88472_read_status,
  405. };
  406. static struct dvb_frontend *mn88472_get_dvb_frontend(struct i2c_client *client)
  407. {
  408. struct mn88472_dev *dev = i2c_get_clientdata(client);
  409. dev_dbg(&client->dev, "\n");
  410. return &dev->fe;
  411. }
  412. static int mn88472_probe(struct i2c_client *client,
  413. const struct i2c_device_id *id)
  414. {
  415. struct mn88472_config *pdata = client->dev.platform_data;
  416. struct mn88472_dev *dev;
  417. int ret;
  418. unsigned int utmp;
  419. static const struct regmap_config regmap_config = {
  420. .reg_bits = 8,
  421. .val_bits = 8,
  422. };
  423. dev_dbg(&client->dev, "\n");
  424. dev = kzalloc(sizeof(*dev), GFP_KERNEL);
  425. if (!dev) {
  426. ret = -ENOMEM;
  427. goto err;
  428. }
  429. dev->i2c_write_max = pdata->i2c_wr_max ? pdata->i2c_wr_max : ~0;
  430. dev->clk = pdata->xtal;
  431. dev->ts_mode = pdata->ts_mode;
  432. dev->ts_clk = pdata->ts_clock;
  433. dev->client[0] = client;
  434. dev->regmap[0] = regmap_init_i2c(dev->client[0], &regmap_config);
  435. if (IS_ERR(dev->regmap[0])) {
  436. ret = PTR_ERR(dev->regmap[0]);
  437. goto err_kfree;
  438. }
  439. /*
  440. * Chip has three I2C addresses for different register banks. Used
  441. * addresses are 0x18, 0x1a and 0x1c. We register two dummy clients,
  442. * 0x1a and 0x1c, in order to get own I2C client for each register bank.
  443. *
  444. * Also, register bank 2 do not support sequential I/O. Only single
  445. * register write or read is allowed to that bank.
  446. */
  447. dev->client[1] = i2c_new_dummy(client->adapter, 0x1a);
  448. if (!dev->client[1]) {
  449. ret = -ENODEV;
  450. dev_err(&client->dev, "I2C registration failed\n");
  451. if (ret)
  452. goto err_regmap_0_regmap_exit;
  453. }
  454. dev->regmap[1] = regmap_init_i2c(dev->client[1], &regmap_config);
  455. if (IS_ERR(dev->regmap[1])) {
  456. ret = PTR_ERR(dev->regmap[1]);
  457. goto err_client_1_i2c_unregister_device;
  458. }
  459. i2c_set_clientdata(dev->client[1], dev);
  460. dev->client[2] = i2c_new_dummy(client->adapter, 0x1c);
  461. if (!dev->client[2]) {
  462. ret = -ENODEV;
  463. dev_err(&client->dev, "2nd I2C registration failed\n");
  464. if (ret)
  465. goto err_regmap_1_regmap_exit;
  466. }
  467. dev->regmap[2] = regmap_init_i2c(dev->client[2], &regmap_config);
  468. if (IS_ERR(dev->regmap[2])) {
  469. ret = PTR_ERR(dev->regmap[2]);
  470. goto err_client_2_i2c_unregister_device;
  471. }
  472. i2c_set_clientdata(dev->client[2], dev);
  473. /* Check demod answers with correct chip id */
  474. ret = regmap_read(dev->regmap[2], 0xff, &utmp);
  475. if (ret)
  476. goto err_regmap_2_regmap_exit;
  477. dev_dbg(&client->dev, "chip id=%02x\n", utmp);
  478. if (utmp != 0x02) {
  479. ret = -ENODEV;
  480. goto err_regmap_2_regmap_exit;
  481. }
  482. /* Sleep because chip is active by default */
  483. ret = regmap_write(dev->regmap[2], 0x05, 0x3e);
  484. if (ret)
  485. goto err_regmap_2_regmap_exit;
  486. /* Create dvb frontend */
  487. memcpy(&dev->fe.ops, &mn88472_ops, sizeof(struct dvb_frontend_ops));
  488. dev->fe.demodulator_priv = client;
  489. *pdata->fe = &dev->fe;
  490. i2c_set_clientdata(client, dev);
  491. /* Setup callbacks */
  492. pdata->get_dvb_frontend = mn88472_get_dvb_frontend;
  493. dev_info(&client->dev, "Panasonic MN88472 successfully identified\n");
  494. return 0;
  495. err_regmap_2_regmap_exit:
  496. regmap_exit(dev->regmap[2]);
  497. err_client_2_i2c_unregister_device:
  498. i2c_unregister_device(dev->client[2]);
  499. err_regmap_1_regmap_exit:
  500. regmap_exit(dev->regmap[1]);
  501. err_client_1_i2c_unregister_device:
  502. i2c_unregister_device(dev->client[1]);
  503. err_regmap_0_regmap_exit:
  504. regmap_exit(dev->regmap[0]);
  505. err_kfree:
  506. kfree(dev);
  507. err:
  508. dev_dbg(&client->dev, "failed=%d\n", ret);
  509. return ret;
  510. }
  511. static int mn88472_remove(struct i2c_client *client)
  512. {
  513. struct mn88472_dev *dev = i2c_get_clientdata(client);
  514. dev_dbg(&client->dev, "\n");
  515. regmap_exit(dev->regmap[2]);
  516. i2c_unregister_device(dev->client[2]);
  517. regmap_exit(dev->regmap[1]);
  518. i2c_unregister_device(dev->client[1]);
  519. regmap_exit(dev->regmap[0]);
  520. kfree(dev);
  521. return 0;
  522. }
  523. static const struct i2c_device_id mn88472_id_table[] = {
  524. {"mn88472", 0},
  525. {}
  526. };
  527. MODULE_DEVICE_TABLE(i2c, mn88472_id_table);
  528. static struct i2c_driver mn88472_driver = {
  529. .driver = {
  530. .name = "mn88472",
  531. .suppress_bind_attrs = true,
  532. },
  533. .probe = mn88472_probe,
  534. .remove = mn88472_remove,
  535. .id_table = mn88472_id_table,
  536. };
  537. module_i2c_driver(mn88472_driver);
  538. MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
  539. MODULE_DESCRIPTION("Panasonic MN88472 DVB-T/T2/C demodulator driver");
  540. MODULE_LICENSE("GPL");
  541. MODULE_FIRMWARE(MN88472_FIRMWARE);