zd1301_demod.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * ZyDAS ZD1301 driver (demodulator)
  4. *
  5. * Copyright (C) 2015 Antti Palosaari <[email protected]>
  6. */
  7. #include "zd1301_demod.h"
  8. static u8 zd1301_demod_gain = 0x38;
  9. module_param_named(gain, zd1301_demod_gain, byte, 0644);
  10. MODULE_PARM_DESC(gain, "gain (value: 0x00 - 0x70, default: 0x38)");
  11. struct zd1301_demod_dev {
  12. struct platform_device *pdev;
  13. struct dvb_frontend frontend;
  14. struct i2c_adapter adapter;
  15. u8 gain;
  16. };
  17. static int zd1301_demod_wreg(struct zd1301_demod_dev *dev, u16 reg, u8 val)
  18. {
  19. struct platform_device *pdev = dev->pdev;
  20. struct zd1301_demod_platform_data *pdata = pdev->dev.platform_data;
  21. return pdata->reg_write(pdata->reg_priv, reg, val);
  22. }
  23. static int zd1301_demod_rreg(struct zd1301_demod_dev *dev, u16 reg, u8 *val)
  24. {
  25. struct platform_device *pdev = dev->pdev;
  26. struct zd1301_demod_platform_data *pdata = pdev->dev.platform_data;
  27. return pdata->reg_read(pdata->reg_priv, reg, val);
  28. }
  29. static int zd1301_demod_set_frontend(struct dvb_frontend *fe)
  30. {
  31. struct zd1301_demod_dev *dev = fe->demodulator_priv;
  32. struct platform_device *pdev = dev->pdev;
  33. struct dtv_frontend_properties *c = &fe->dtv_property_cache;
  34. int ret;
  35. u32 if_frequency;
  36. u8 r6a50_val;
  37. dev_dbg(&pdev->dev, "frequency=%u bandwidth_hz=%u\n",
  38. c->frequency, c->bandwidth_hz);
  39. /* Program tuner */
  40. if (fe->ops.tuner_ops.set_params &&
  41. fe->ops.tuner_ops.get_if_frequency) {
  42. ret = fe->ops.tuner_ops.set_params(fe);
  43. if (ret)
  44. goto err;
  45. ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_frequency);
  46. if (ret)
  47. goto err;
  48. } else {
  49. ret = -EINVAL;
  50. goto err;
  51. }
  52. dev_dbg(&pdev->dev, "if_frequency=%u\n", if_frequency);
  53. if (if_frequency != 36150000) {
  54. ret = -EINVAL;
  55. goto err;
  56. }
  57. switch (c->bandwidth_hz) {
  58. case 6000000:
  59. r6a50_val = 0x78;
  60. break;
  61. case 7000000:
  62. r6a50_val = 0x68;
  63. break;
  64. case 8000000:
  65. r6a50_val = 0x58;
  66. break;
  67. default:
  68. ret = -EINVAL;
  69. goto err;
  70. }
  71. ret = zd1301_demod_wreg(dev, 0x6a60, 0x11);
  72. if (ret)
  73. goto err;
  74. ret = zd1301_demod_wreg(dev, 0x6a47, 0x46);
  75. if (ret)
  76. goto err;
  77. ret = zd1301_demod_wreg(dev, 0x6a48, 0x46);
  78. if (ret)
  79. goto err;
  80. ret = zd1301_demod_wreg(dev, 0x6a4a, 0x15);
  81. if (ret)
  82. goto err;
  83. ret = zd1301_demod_wreg(dev, 0x6a4b, 0x63);
  84. if (ret)
  85. goto err;
  86. ret = zd1301_demod_wreg(dev, 0x6a5b, 0x99);
  87. if (ret)
  88. goto err;
  89. ret = zd1301_demod_wreg(dev, 0x6a3b, 0x10);
  90. if (ret)
  91. goto err;
  92. ret = zd1301_demod_wreg(dev, 0x6806, 0x01);
  93. if (ret)
  94. goto err;
  95. ret = zd1301_demod_wreg(dev, 0x6a41, 0x08);
  96. if (ret)
  97. goto err;
  98. ret = zd1301_demod_wreg(dev, 0x6a42, 0x46);
  99. if (ret)
  100. goto err;
  101. ret = zd1301_demod_wreg(dev, 0x6a44, 0x14);
  102. if (ret)
  103. goto err;
  104. ret = zd1301_demod_wreg(dev, 0x6a45, 0x67);
  105. if (ret)
  106. goto err;
  107. ret = zd1301_demod_wreg(dev, 0x6a38, 0x00);
  108. if (ret)
  109. goto err;
  110. ret = zd1301_demod_wreg(dev, 0x6a4c, 0x52);
  111. if (ret)
  112. goto err;
  113. ret = zd1301_demod_wreg(dev, 0x6a49, 0x2a);
  114. if (ret)
  115. goto err;
  116. ret = zd1301_demod_wreg(dev, 0x6840, 0x2e);
  117. if (ret)
  118. goto err;
  119. ret = zd1301_demod_wreg(dev, 0x6a50, r6a50_val);
  120. if (ret)
  121. goto err;
  122. ret = zd1301_demod_wreg(dev, 0x6a38, 0x07);
  123. if (ret)
  124. goto err;
  125. return 0;
  126. err:
  127. dev_dbg(&pdev->dev, "failed=%d\n", ret);
  128. return ret;
  129. }
  130. static int zd1301_demod_sleep(struct dvb_frontend *fe)
  131. {
  132. struct zd1301_demod_dev *dev = fe->demodulator_priv;
  133. struct platform_device *pdev = dev->pdev;
  134. int ret;
  135. dev_dbg(&pdev->dev, "\n");
  136. ret = zd1301_demod_wreg(dev, 0x6a43, 0x70);
  137. if (ret)
  138. goto err;
  139. ret = zd1301_demod_wreg(dev, 0x684e, 0x00);
  140. if (ret)
  141. goto err;
  142. ret = zd1301_demod_wreg(dev, 0x6849, 0x00);
  143. if (ret)
  144. goto err;
  145. ret = zd1301_demod_wreg(dev, 0x68e2, 0xd7);
  146. if (ret)
  147. goto err;
  148. ret = zd1301_demod_wreg(dev, 0x68e0, 0x39);
  149. if (ret)
  150. goto err;
  151. ret = zd1301_demod_wreg(dev, 0x6840, 0x21);
  152. if (ret)
  153. goto err;
  154. return 0;
  155. err:
  156. dev_dbg(&pdev->dev, "failed=%d\n", ret);
  157. return ret;
  158. }
  159. static int zd1301_demod_init(struct dvb_frontend *fe)
  160. {
  161. struct zd1301_demod_dev *dev = fe->demodulator_priv;
  162. struct platform_device *pdev = dev->pdev;
  163. int ret;
  164. dev_dbg(&pdev->dev, "\n");
  165. ret = zd1301_demod_wreg(dev, 0x6840, 0x26);
  166. if (ret)
  167. goto err;
  168. ret = zd1301_demod_wreg(dev, 0x68e0, 0xff);
  169. if (ret)
  170. goto err;
  171. ret = zd1301_demod_wreg(dev, 0x68e2, 0xd8);
  172. if (ret)
  173. goto err;
  174. ret = zd1301_demod_wreg(dev, 0x6849, 0x4e);
  175. if (ret)
  176. goto err;
  177. ret = zd1301_demod_wreg(dev, 0x684e, 0x01);
  178. if (ret)
  179. goto err;
  180. ret = zd1301_demod_wreg(dev, 0x6a43, zd1301_demod_gain);
  181. if (ret)
  182. goto err;
  183. return 0;
  184. err:
  185. dev_dbg(&pdev->dev, "failed=%d\n", ret);
  186. return ret;
  187. }
  188. static int zd1301_demod_get_tune_settings(struct dvb_frontend *fe,
  189. struct dvb_frontend_tune_settings *settings)
  190. {
  191. struct zd1301_demod_dev *dev = fe->demodulator_priv;
  192. struct platform_device *pdev = dev->pdev;
  193. dev_dbg(&pdev->dev, "\n");
  194. /* ~180ms seems to be enough */
  195. settings->min_delay_ms = 400;
  196. return 0;
  197. }
  198. static int zd1301_demod_read_status(struct dvb_frontend *fe,
  199. enum fe_status *status)
  200. {
  201. struct zd1301_demod_dev *dev = fe->demodulator_priv;
  202. struct platform_device *pdev = dev->pdev;
  203. int ret;
  204. u8 u8tmp;
  205. ret = zd1301_demod_rreg(dev, 0x6a24, &u8tmp);
  206. if (ret)
  207. goto err;
  208. if (u8tmp > 0x00 && u8tmp < 0x20)
  209. *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI |
  210. FE_HAS_SYNC | FE_HAS_LOCK;
  211. else
  212. *status = 0;
  213. dev_dbg(&pdev->dev, "lock byte=%02x\n", u8tmp);
  214. /*
  215. * Interesting registers here are:
  216. * 0x6a05: get some gain value
  217. * 0x6a06: get about same gain value than set to 0x6a43
  218. * 0x6a07: get some gain value
  219. * 0x6a43: set gain value by driver
  220. * 0x6a24: get demod lock bits (FSM stage?)
  221. *
  222. * Driver should implement some kind of algorithm to calculate suitable
  223. * value for register 0x6a43, based likely values from register 0x6a05
  224. * and 0x6a07. Looks like gain register 0x6a43 value could be from
  225. * range 0x00 - 0x70.
  226. */
  227. if (dev->gain != zd1301_demod_gain) {
  228. dev->gain = zd1301_demod_gain;
  229. ret = zd1301_demod_wreg(dev, 0x6a43, dev->gain);
  230. if (ret)
  231. goto err;
  232. }
  233. return 0;
  234. err:
  235. dev_dbg(&pdev->dev, "failed=%d\n", ret);
  236. return ret;
  237. }
  238. static const struct dvb_frontend_ops zd1301_demod_ops = {
  239. .delsys = {SYS_DVBT},
  240. .info = {
  241. .name = "ZyDAS ZD1301",
  242. .caps = FE_CAN_FEC_1_2 |
  243. FE_CAN_FEC_2_3 |
  244. FE_CAN_FEC_3_4 |
  245. FE_CAN_FEC_5_6 |
  246. FE_CAN_FEC_7_8 |
  247. FE_CAN_FEC_AUTO |
  248. FE_CAN_QPSK |
  249. FE_CAN_QAM_16 |
  250. FE_CAN_QAM_64 |
  251. FE_CAN_QAM_AUTO |
  252. FE_CAN_TRANSMISSION_MODE_AUTO |
  253. FE_CAN_GUARD_INTERVAL_AUTO |
  254. FE_CAN_HIERARCHY_AUTO |
  255. FE_CAN_MUTE_TS
  256. },
  257. .sleep = zd1301_demod_sleep,
  258. .init = zd1301_demod_init,
  259. .set_frontend = zd1301_demod_set_frontend,
  260. .get_tune_settings = zd1301_demod_get_tune_settings,
  261. .read_status = zd1301_demod_read_status,
  262. };
  263. struct dvb_frontend *zd1301_demod_get_dvb_frontend(struct platform_device *pdev)
  264. {
  265. struct zd1301_demod_dev *dev = platform_get_drvdata(pdev);
  266. dev_dbg(&pdev->dev, "\n");
  267. return &dev->frontend;
  268. }
  269. EXPORT_SYMBOL(zd1301_demod_get_dvb_frontend);
  270. static int zd1301_demod_i2c_master_xfer(struct i2c_adapter *adapter,
  271. struct i2c_msg msg[], int num)
  272. {
  273. struct zd1301_demod_dev *dev = i2c_get_adapdata(adapter);
  274. struct platform_device *pdev = dev->pdev;
  275. int ret, i;
  276. unsigned long timeout;
  277. u8 u8tmp;
  278. #define I2C_XFER_TIMEOUT 5
  279. #define ZD1301_IS_I2C_XFER_WRITE_READ(_msg, _num) \
  280. (_num == 2 && !(_msg[0].flags & I2C_M_RD) && (_msg[1].flags & I2C_M_RD))
  281. #define ZD1301_IS_I2C_XFER_WRITE(_msg, _num) \
  282. (_num == 1 && !(_msg[0].flags & I2C_M_RD))
  283. #define ZD1301_IS_I2C_XFER_READ(_msg, _num) \
  284. (_num == 1 && (_msg[0].flags & I2C_M_RD))
  285. if (ZD1301_IS_I2C_XFER_WRITE_READ(msg, num)) {
  286. dev_dbg(&pdev->dev, "write&read msg[0].len=%u msg[1].len=%u\n",
  287. msg[0].len, msg[1].len);
  288. if (msg[0].len > 1 || msg[1].len > 8) {
  289. ret = -EOPNOTSUPP;
  290. goto err;
  291. }
  292. ret = zd1301_demod_wreg(dev, 0x6811, 0x80);
  293. if (ret)
  294. goto err;
  295. ret = zd1301_demod_wreg(dev, 0x6812, 0x05);
  296. if (ret)
  297. goto err;
  298. ret = zd1301_demod_wreg(dev, 0x6813, msg[1].addr << 1);
  299. if (ret)
  300. goto err;
  301. ret = zd1301_demod_wreg(dev, 0x6801, msg[0].buf[0]);
  302. if (ret)
  303. goto err;
  304. ret = zd1301_demod_wreg(dev, 0x6802, 0x00);
  305. if (ret)
  306. goto err;
  307. ret = zd1301_demod_wreg(dev, 0x6803, 0x06);
  308. if (ret)
  309. goto err;
  310. ret = zd1301_demod_wreg(dev, 0x6805, 0x00);
  311. if (ret)
  312. goto err;
  313. ret = zd1301_demod_wreg(dev, 0x6804, msg[1].len);
  314. if (ret)
  315. goto err;
  316. /* Poll xfer ready */
  317. timeout = jiffies + msecs_to_jiffies(I2C_XFER_TIMEOUT);
  318. for (u8tmp = 1; !time_after(jiffies, timeout) && u8tmp;) {
  319. usleep_range(500, 800);
  320. ret = zd1301_demod_rreg(dev, 0x6804, &u8tmp);
  321. if (ret)
  322. goto err;
  323. }
  324. for (i = 0; i < msg[1].len; i++) {
  325. ret = zd1301_demod_rreg(dev, 0x0600 + i, &msg[1].buf[i]);
  326. if (ret)
  327. goto err;
  328. }
  329. } else if (ZD1301_IS_I2C_XFER_WRITE(msg, num)) {
  330. dev_dbg(&pdev->dev, "write msg[0].len=%u\n", msg[0].len);
  331. if (msg[0].len > 1 + 8) {
  332. ret = -EOPNOTSUPP;
  333. goto err;
  334. }
  335. ret = zd1301_demod_wreg(dev, 0x6811, 0x80);
  336. if (ret)
  337. goto err;
  338. ret = zd1301_demod_wreg(dev, 0x6812, 0x01);
  339. if (ret)
  340. goto err;
  341. ret = zd1301_demod_wreg(dev, 0x6813, msg[0].addr << 1);
  342. if (ret)
  343. goto err;
  344. ret = zd1301_demod_wreg(dev, 0x6800, msg[0].buf[0]);
  345. if (ret)
  346. goto err;
  347. ret = zd1301_demod_wreg(dev, 0x6802, 0x00);
  348. if (ret)
  349. goto err;
  350. ret = zd1301_demod_wreg(dev, 0x6803, 0x06);
  351. if (ret)
  352. goto err;
  353. for (i = 0; i < msg[0].len - 1; i++) {
  354. ret = zd1301_demod_wreg(dev, 0x0600 + i, msg[0].buf[1 + i]);
  355. if (ret)
  356. goto err;
  357. }
  358. ret = zd1301_demod_wreg(dev, 0x6805, 0x80);
  359. if (ret)
  360. goto err;
  361. ret = zd1301_demod_wreg(dev, 0x6804, msg[0].len - 1);
  362. if (ret)
  363. goto err;
  364. /* Poll xfer ready */
  365. timeout = jiffies + msecs_to_jiffies(I2C_XFER_TIMEOUT);
  366. for (u8tmp = 1; !time_after(jiffies, timeout) && u8tmp;) {
  367. usleep_range(500, 800);
  368. ret = zd1301_demod_rreg(dev, 0x6804, &u8tmp);
  369. if (ret)
  370. goto err;
  371. }
  372. } else {
  373. dev_dbg(&pdev->dev, "unknown msg[0].len=%u\n", msg[0].len);
  374. ret = -EOPNOTSUPP;
  375. goto err;
  376. }
  377. return num;
  378. err:
  379. dev_dbg(&pdev->dev, "failed=%d\n", ret);
  380. return ret;
  381. }
  382. static u32 zd1301_demod_i2c_functionality(struct i2c_adapter *adapter)
  383. {
  384. return I2C_FUNC_I2C;
  385. }
  386. static const struct i2c_algorithm zd1301_demod_i2c_algorithm = {
  387. .master_xfer = zd1301_demod_i2c_master_xfer,
  388. .functionality = zd1301_demod_i2c_functionality,
  389. };
  390. struct i2c_adapter *zd1301_demod_get_i2c_adapter(struct platform_device *pdev)
  391. {
  392. struct zd1301_demod_dev *dev = platform_get_drvdata(pdev);
  393. dev_dbg(&pdev->dev, "\n");
  394. return &dev->adapter;
  395. }
  396. EXPORT_SYMBOL(zd1301_demod_get_i2c_adapter);
  397. /* Platform driver interface */
  398. static int zd1301_demod_probe(struct platform_device *pdev)
  399. {
  400. struct zd1301_demod_dev *dev;
  401. struct zd1301_demod_platform_data *pdata = pdev->dev.platform_data;
  402. int ret;
  403. dev_dbg(&pdev->dev, "\n");
  404. if (!pdata) {
  405. ret = -EINVAL;
  406. dev_err(&pdev->dev, "cannot proceed without platform data\n");
  407. goto err;
  408. }
  409. if (!pdev->dev.parent->driver) {
  410. ret = -EINVAL;
  411. dev_dbg(&pdev->dev, "no parent device\n");
  412. goto err;
  413. }
  414. dev = kzalloc(sizeof(*dev), GFP_KERNEL);
  415. if (!dev) {
  416. ret = -ENOMEM;
  417. goto err;
  418. }
  419. /* Setup the state */
  420. dev->pdev = pdev;
  421. dev->gain = zd1301_demod_gain;
  422. /* Sleep */
  423. ret = zd1301_demod_wreg(dev, 0x6840, 0x21);
  424. if (ret)
  425. goto err_kfree;
  426. ret = zd1301_demod_wreg(dev, 0x6a38, 0x07);
  427. if (ret)
  428. goto err_kfree;
  429. /* Create I2C adapter */
  430. strscpy(dev->adapter.name, "ZyDAS ZD1301 demod",
  431. sizeof(dev->adapter.name));
  432. dev->adapter.algo = &zd1301_demod_i2c_algorithm;
  433. dev->adapter.algo_data = NULL;
  434. dev->adapter.dev.parent = pdev->dev.parent;
  435. i2c_set_adapdata(&dev->adapter, dev);
  436. ret = i2c_add_adapter(&dev->adapter);
  437. if (ret) {
  438. dev_err(&pdev->dev, "I2C adapter add failed %d\n", ret);
  439. goto err_kfree;
  440. }
  441. /* Create dvb frontend */
  442. memcpy(&dev->frontend.ops, &zd1301_demod_ops, sizeof(dev->frontend.ops));
  443. dev->frontend.demodulator_priv = dev;
  444. platform_set_drvdata(pdev, dev);
  445. dev_info(&pdev->dev, "ZyDAS ZD1301 demod attached\n");
  446. return 0;
  447. err_kfree:
  448. kfree(dev);
  449. err:
  450. dev_dbg(&pdev->dev, "failed=%d\n", ret);
  451. return ret;
  452. }
  453. static int zd1301_demod_remove(struct platform_device *pdev)
  454. {
  455. struct zd1301_demod_dev *dev = platform_get_drvdata(pdev);
  456. dev_dbg(&pdev->dev, "\n");
  457. i2c_del_adapter(&dev->adapter);
  458. kfree(dev);
  459. return 0;
  460. }
  461. static struct platform_driver zd1301_demod_driver = {
  462. .driver = {
  463. .name = "zd1301_demod",
  464. .suppress_bind_attrs = true,
  465. },
  466. .probe = zd1301_demod_probe,
  467. .remove = zd1301_demod_remove,
  468. };
  469. module_platform_driver(zd1301_demod_driver);
  470. MODULE_AUTHOR("Antti Palosaari <[email protected]>");
  471. MODULE_DESCRIPTION("ZyDAS ZD1301 demodulator driver");
  472. MODULE_LICENSE("GPL");