it913x.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * ITE IT913X silicon tuner driver
  4. *
  5. * Copyright (C) 2011 Malcolm Priestley ([email protected])
  6. * IT9137 Copyright (C) ITE Tech Inc.
  7. */
  8. #include "it913x.h"
  9. #include <linux/platform_device.h>
  10. #include <linux/regmap.h>
  11. struct it913x_dev {
  12. struct platform_device *pdev;
  13. struct regmap *regmap;
  14. struct dvb_frontend *fe;
  15. u8 chip_ver:2;
  16. u8 role:2;
  17. u16 xtal;
  18. u8 fdiv;
  19. u8 clk_mode;
  20. u32 fn_min;
  21. bool active;
  22. };
  23. static int it913x_init(struct dvb_frontend *fe)
  24. {
  25. struct it913x_dev *dev = fe->tuner_priv;
  26. struct platform_device *pdev = dev->pdev;
  27. int ret;
  28. unsigned int utmp;
  29. u8 iqik_m_cal, nv_val, buf[2];
  30. static const u8 nv[] = {48, 32, 24, 16, 12, 8, 6, 4, 2};
  31. unsigned long timeout;
  32. dev_dbg(&pdev->dev, "role %u\n", dev->role);
  33. ret = regmap_write(dev->regmap, 0x80ec4c, 0x68);
  34. if (ret)
  35. goto err;
  36. usleep_range(10000, 100000);
  37. ret = regmap_read(dev->regmap, 0x80ec86, &utmp);
  38. if (ret)
  39. goto err;
  40. switch (utmp) {
  41. case 0:
  42. /* 12.000 MHz */
  43. dev->clk_mode = utmp;
  44. dev->xtal = 2000;
  45. dev->fdiv = 3;
  46. iqik_m_cal = 16;
  47. break;
  48. case 1:
  49. /* 20.480 MHz */
  50. dev->clk_mode = utmp;
  51. dev->xtal = 640;
  52. dev->fdiv = 1;
  53. iqik_m_cal = 6;
  54. break;
  55. default:
  56. dev_err(&pdev->dev, "unknown clock identifier %d\n", utmp);
  57. ret = -EINVAL;
  58. goto err;
  59. }
  60. ret = regmap_read(dev->regmap, 0x80ed03, &utmp);
  61. if (ret)
  62. goto err;
  63. else if (utmp < ARRAY_SIZE(nv))
  64. nv_val = nv[utmp];
  65. else
  66. nv_val = 2;
  67. #define TIMEOUT 50
  68. timeout = jiffies + msecs_to_jiffies(TIMEOUT);
  69. while (!time_after(jiffies, timeout)) {
  70. ret = regmap_bulk_read(dev->regmap, 0x80ed23, buf, 2);
  71. if (ret)
  72. goto err;
  73. utmp = (buf[1] << 8) | (buf[0] << 0);
  74. if (utmp)
  75. break;
  76. }
  77. dev_dbg(&pdev->dev, "r_fbc_m_bdry took %u ms, val %u\n",
  78. jiffies_to_msecs(jiffies) -
  79. (jiffies_to_msecs(timeout) - TIMEOUT), utmp);
  80. dev->fn_min = dev->xtal * utmp;
  81. dev->fn_min /= (dev->fdiv * nv_val);
  82. dev->fn_min *= 1000;
  83. dev_dbg(&pdev->dev, "fn_min %u\n", dev->fn_min);
  84. /*
  85. * Chip version BX never sets that flag so we just wait 50ms in that
  86. * case. It is possible poll BX similarly than AX and then timeout in
  87. * order to get 50ms delay, but that causes about 120 extra I2C
  88. * messages. As for now, we just wait and reduce IO.
  89. */
  90. if (dev->chip_ver == 1) {
  91. #define TIMEOUT 50
  92. timeout = jiffies + msecs_to_jiffies(TIMEOUT);
  93. while (!time_after(jiffies, timeout)) {
  94. ret = regmap_read(dev->regmap, 0x80ec82, &utmp);
  95. if (ret)
  96. goto err;
  97. if (utmp)
  98. break;
  99. }
  100. dev_dbg(&pdev->dev, "p_tsm_init_mode took %u ms, val %u\n",
  101. jiffies_to_msecs(jiffies) -
  102. (jiffies_to_msecs(timeout) - TIMEOUT), utmp);
  103. } else {
  104. msleep(50);
  105. }
  106. ret = regmap_write(dev->regmap, 0x80ed81, iqik_m_cal);
  107. if (ret)
  108. goto err;
  109. ret = regmap_write(dev->regmap, 0x80ec57, 0x00);
  110. if (ret)
  111. goto err;
  112. ret = regmap_write(dev->regmap, 0x80ec58, 0x00);
  113. if (ret)
  114. goto err;
  115. ret = regmap_write(dev->regmap, 0x80ec40, 0x01);
  116. if (ret)
  117. goto err;
  118. dev->active = true;
  119. return 0;
  120. err:
  121. dev_dbg(&pdev->dev, "failed %d\n", ret);
  122. return ret;
  123. }
  124. static int it913x_sleep(struct dvb_frontend *fe)
  125. {
  126. struct it913x_dev *dev = fe->tuner_priv;
  127. struct platform_device *pdev = dev->pdev;
  128. int ret, len;
  129. dev_dbg(&pdev->dev, "role %u\n", dev->role);
  130. dev->active = false;
  131. ret = regmap_bulk_write(dev->regmap, 0x80ec40, "\x00", 1);
  132. if (ret)
  133. goto err;
  134. /*
  135. * Writing '0x00' to master tuner register '0x80ec08' causes slave tuner
  136. * communication lost. Due to that, we cannot put master full sleep.
  137. */
  138. if (dev->role == IT913X_ROLE_DUAL_MASTER)
  139. len = 4;
  140. else
  141. len = 15;
  142. dev_dbg(&pdev->dev, "role %u, len %d\n", dev->role, len);
  143. ret = regmap_bulk_write(dev->regmap, 0x80ec02,
  144. "\x3f\x1f\x3f\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
  145. len);
  146. if (ret)
  147. goto err;
  148. ret = regmap_bulk_write(dev->regmap, 0x80ec12, "\x00\x00\x00\x00", 4);
  149. if (ret)
  150. goto err;
  151. ret = regmap_bulk_write(dev->regmap, 0x80ec17,
  152. "\x00\x00\x00\x00\x00\x00\x00\x00\x00", 9);
  153. if (ret)
  154. goto err;
  155. ret = regmap_bulk_write(dev->regmap, 0x80ec22,
  156. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 10);
  157. if (ret)
  158. goto err;
  159. ret = regmap_bulk_write(dev->regmap, 0x80ec20, "\x00", 1);
  160. if (ret)
  161. goto err;
  162. ret = regmap_bulk_write(dev->regmap, 0x80ec3f, "\x01", 1);
  163. if (ret)
  164. goto err;
  165. return 0;
  166. err:
  167. dev_dbg(&pdev->dev, "failed %d\n", ret);
  168. return ret;
  169. }
  170. static int it913x_set_params(struct dvb_frontend *fe)
  171. {
  172. struct it913x_dev *dev = fe->tuner_priv;
  173. struct platform_device *pdev = dev->pdev;
  174. struct dtv_frontend_properties *c = &fe->dtv_property_cache;
  175. int ret;
  176. unsigned int utmp;
  177. u32 pre_lo_freq, t_cal_freq;
  178. u16 iqik_m_cal, n_div;
  179. u8 u8tmp, n, l_band, lna_band;
  180. dev_dbg(&pdev->dev, "role=%u, frequency %u, bandwidth_hz %u\n",
  181. dev->role, c->frequency, c->bandwidth_hz);
  182. if (!dev->active) {
  183. ret = -EINVAL;
  184. goto err;
  185. }
  186. if (c->frequency <= 74000000) {
  187. n_div = 48;
  188. n = 0;
  189. } else if (c->frequency <= 111000000) {
  190. n_div = 32;
  191. n = 1;
  192. } else if (c->frequency <= 148000000) {
  193. n_div = 24;
  194. n = 2;
  195. } else if (c->frequency <= 222000000) {
  196. n_div = 16;
  197. n = 3;
  198. } else if (c->frequency <= 296000000) {
  199. n_div = 12;
  200. n = 4;
  201. } else if (c->frequency <= 445000000) {
  202. n_div = 8;
  203. n = 5;
  204. } else if (c->frequency <= dev->fn_min) {
  205. n_div = 6;
  206. n = 6;
  207. } else if (c->frequency <= 950000000) {
  208. n_div = 4;
  209. n = 7;
  210. } else {
  211. n_div = 2;
  212. n = 0;
  213. }
  214. ret = regmap_read(dev->regmap, 0x80ed81, &utmp);
  215. if (ret)
  216. goto err;
  217. iqik_m_cal = utmp * n_div;
  218. if (utmp < 0x20) {
  219. if (dev->clk_mode == 0)
  220. iqik_m_cal = (iqik_m_cal * 9) >> 5;
  221. else
  222. iqik_m_cal >>= 1;
  223. } else {
  224. iqik_m_cal = 0x40 - iqik_m_cal;
  225. if (dev->clk_mode == 0)
  226. iqik_m_cal = ~((iqik_m_cal * 9) >> 5);
  227. else
  228. iqik_m_cal = ~(iqik_m_cal >> 1);
  229. }
  230. t_cal_freq = (c->frequency / 1000) * n_div * dev->fdiv;
  231. pre_lo_freq = t_cal_freq / dev->xtal;
  232. utmp = pre_lo_freq * dev->xtal;
  233. if ((t_cal_freq - utmp) >= (dev->xtal >> 1))
  234. pre_lo_freq++;
  235. pre_lo_freq += (u32) n << 13;
  236. /* Frequency OMEGA_IQIK_M_CAL_MID*/
  237. t_cal_freq = pre_lo_freq + (u32)iqik_m_cal;
  238. dev_dbg(&pdev->dev, "t_cal_freq %u, pre_lo_freq %u\n",
  239. t_cal_freq, pre_lo_freq);
  240. if (c->frequency <= 440000000) {
  241. l_band = 0;
  242. lna_band = 0;
  243. } else if (c->frequency <= 484000000) {
  244. l_band = 1;
  245. lna_band = 1;
  246. } else if (c->frequency <= 533000000) {
  247. l_band = 1;
  248. lna_band = 2;
  249. } else if (c->frequency <= 587000000) {
  250. l_band = 1;
  251. lna_band = 3;
  252. } else if (c->frequency <= 645000000) {
  253. l_band = 1;
  254. lna_band = 4;
  255. } else if (c->frequency <= 710000000) {
  256. l_band = 1;
  257. lna_band = 5;
  258. } else if (c->frequency <= 782000000) {
  259. l_band = 1;
  260. lna_band = 6;
  261. } else if (c->frequency <= 860000000) {
  262. l_band = 1;
  263. lna_band = 7;
  264. } else if (c->frequency <= 1492000000) {
  265. l_band = 1;
  266. lna_band = 0;
  267. } else if (c->frequency <= 1685000000) {
  268. l_band = 1;
  269. lna_band = 1;
  270. } else {
  271. ret = -EINVAL;
  272. goto err;
  273. }
  274. /* XXX: latest windows driver does not set that at all */
  275. ret = regmap_write(dev->regmap, 0x80ee06, lna_band);
  276. if (ret)
  277. goto err;
  278. if (c->bandwidth_hz <= 5000000)
  279. u8tmp = 0;
  280. else if (c->bandwidth_hz <= 6000000)
  281. u8tmp = 2;
  282. else if (c->bandwidth_hz <= 7000000)
  283. u8tmp = 4;
  284. else
  285. u8tmp = 6; /* 8000000 */
  286. ret = regmap_write(dev->regmap, 0x80ec56, u8tmp);
  287. if (ret)
  288. goto err;
  289. /* XXX: latest windows driver sets different value (a8 != 68) */
  290. ret = regmap_write(dev->regmap, 0x80ec4c, 0xa0 | (l_band << 3));
  291. if (ret)
  292. goto err;
  293. ret = regmap_write(dev->regmap, 0x80ec4d, (t_cal_freq >> 0) & 0xff);
  294. if (ret)
  295. goto err;
  296. ret = regmap_write(dev->regmap, 0x80ec4e, (t_cal_freq >> 8) & 0xff);
  297. if (ret)
  298. goto err;
  299. ret = regmap_write(dev->regmap, 0x80011e, (pre_lo_freq >> 0) & 0xff);
  300. if (ret)
  301. goto err;
  302. ret = regmap_write(dev->regmap, 0x80011f, (pre_lo_freq >> 8) & 0xff);
  303. if (ret)
  304. goto err;
  305. return 0;
  306. err:
  307. dev_dbg(&pdev->dev, "failed %d\n", ret);
  308. return ret;
  309. }
  310. static const struct dvb_tuner_ops it913x_tuner_ops = {
  311. .info = {
  312. .name = "ITE IT913X",
  313. .frequency_min_hz = 174 * MHz,
  314. .frequency_max_hz = 862 * MHz,
  315. },
  316. .init = it913x_init,
  317. .sleep = it913x_sleep,
  318. .set_params = it913x_set_params,
  319. };
  320. static int it913x_probe(struct platform_device *pdev)
  321. {
  322. struct it913x_platform_data *pdata = pdev->dev.platform_data;
  323. struct dvb_frontend *fe = pdata->fe;
  324. struct it913x_dev *dev;
  325. const struct platform_device_id *id = platform_get_device_id(pdev);
  326. int ret;
  327. char *chip_ver_str;
  328. dev = kzalloc(sizeof(struct it913x_dev), GFP_KERNEL);
  329. if (dev == NULL) {
  330. ret = -ENOMEM;
  331. dev_err(&pdev->dev, "kzalloc() failed\n");
  332. goto err;
  333. }
  334. dev->pdev = pdev;
  335. dev->regmap = pdata->regmap;
  336. dev->fe = pdata->fe;
  337. dev->chip_ver = id->driver_data;
  338. dev->role = pdata->role;
  339. fe->tuner_priv = dev;
  340. memcpy(&fe->ops.tuner_ops, &it913x_tuner_ops,
  341. sizeof(struct dvb_tuner_ops));
  342. platform_set_drvdata(pdev, dev);
  343. if (dev->chip_ver == 1)
  344. chip_ver_str = "AX";
  345. else if (dev->chip_ver == 2)
  346. chip_ver_str = "BX";
  347. else
  348. chip_ver_str = "??";
  349. dev_info(&pdev->dev, "ITE IT913X %s successfully attached\n",
  350. chip_ver_str);
  351. dev_dbg(&pdev->dev, "chip_ver %u, role %u\n", dev->chip_ver, dev->role);
  352. return 0;
  353. err:
  354. dev_dbg(&pdev->dev, "failed %d\n", ret);
  355. return ret;
  356. }
  357. static int it913x_remove(struct platform_device *pdev)
  358. {
  359. struct it913x_dev *dev = platform_get_drvdata(pdev);
  360. struct dvb_frontend *fe = dev->fe;
  361. dev_dbg(&pdev->dev, "\n");
  362. memset(&fe->ops.tuner_ops, 0, sizeof(struct dvb_tuner_ops));
  363. fe->tuner_priv = NULL;
  364. kfree(dev);
  365. return 0;
  366. }
  367. static const struct platform_device_id it913x_id_table[] = {
  368. {"it9133ax-tuner", 1},
  369. {"it9133bx-tuner", 2},
  370. {},
  371. };
  372. MODULE_DEVICE_TABLE(platform, it913x_id_table);
  373. static struct platform_driver it913x_driver = {
  374. .driver = {
  375. .name = "it913x",
  376. .suppress_bind_attrs = true,
  377. },
  378. .probe = it913x_probe,
  379. .remove = it913x_remove,
  380. .id_table = it913x_id_table,
  381. };
  382. module_platform_driver(it913x_driver);
  383. MODULE_DESCRIPTION("ITE IT913X silicon tuner driver");
  384. MODULE_AUTHOR("Antti Palosaari <[email protected]>");
  385. MODULE_LICENSE("GPL");