zx_vga.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. /*
  2. * Copyright (C) 2017 Sanechips Technology Co., Ltd.
  3. * Copyright 2017 Linaro Ltd.
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. */
  9. #include <linux/clk.h>
  10. #include <linux/component.h>
  11. #include <linux/mfd/syscon.h>
  12. #include <linux/regmap.h>
  13. #include <drm/drm_atomic_helper.h>
  14. #include <drm/drm_crtc_helper.h>
  15. #include <drm/drmP.h>
  16. #include "zx_drm_drv.h"
  17. #include "zx_vga_regs.h"
  18. #include "zx_vou.h"
  19. struct zx_vga_pwrctrl {
  20. struct regmap *regmap;
  21. u32 reg;
  22. u32 mask;
  23. };
  24. struct zx_vga_i2c {
  25. struct i2c_adapter adap;
  26. struct mutex lock;
  27. };
  28. struct zx_vga {
  29. struct drm_connector connector;
  30. struct drm_encoder encoder;
  31. struct zx_vga_i2c *ddc;
  32. struct device *dev;
  33. void __iomem *mmio;
  34. struct clk *i2c_wclk;
  35. struct zx_vga_pwrctrl pwrctrl;
  36. struct completion complete;
  37. bool connected;
  38. };
  39. #define to_zx_vga(x) container_of(x, struct zx_vga, x)
  40. static void zx_vga_encoder_enable(struct drm_encoder *encoder)
  41. {
  42. struct zx_vga *vga = to_zx_vga(encoder);
  43. struct zx_vga_pwrctrl *pwrctrl = &vga->pwrctrl;
  44. /* Set bit to power up VGA DACs */
  45. regmap_update_bits(pwrctrl->regmap, pwrctrl->reg, pwrctrl->mask,
  46. pwrctrl->mask);
  47. vou_inf_enable(VOU_VGA, encoder->crtc);
  48. }
  49. static void zx_vga_encoder_disable(struct drm_encoder *encoder)
  50. {
  51. struct zx_vga *vga = to_zx_vga(encoder);
  52. struct zx_vga_pwrctrl *pwrctrl = &vga->pwrctrl;
  53. vou_inf_disable(VOU_VGA, encoder->crtc);
  54. /* Clear bit to power down VGA DACs */
  55. regmap_update_bits(pwrctrl->regmap, pwrctrl->reg, pwrctrl->mask, 0);
  56. }
  57. static const struct drm_encoder_helper_funcs zx_vga_encoder_helper_funcs = {
  58. .enable = zx_vga_encoder_enable,
  59. .disable = zx_vga_encoder_disable,
  60. };
  61. static const struct drm_encoder_funcs zx_vga_encoder_funcs = {
  62. .destroy = drm_encoder_cleanup,
  63. };
  64. static int zx_vga_connector_get_modes(struct drm_connector *connector)
  65. {
  66. struct zx_vga *vga = to_zx_vga(connector);
  67. struct edid *edid;
  68. int ret;
  69. /*
  70. * Clear both detection bits to switch I2C bus from device
  71. * detecting to EDID reading.
  72. */
  73. zx_writel(vga->mmio + VGA_AUTO_DETECT_SEL, 0);
  74. edid = drm_get_edid(connector, &vga->ddc->adap);
  75. if (!edid) {
  76. /*
  77. * If EDID reading fails, we set the device state into
  78. * disconnected. Locking is not required here, since the
  79. * VGA_AUTO_DETECT_SEL register write in irq handler cannot
  80. * be triggered when both detection bits are cleared as above.
  81. */
  82. zx_writel(vga->mmio + VGA_AUTO_DETECT_SEL,
  83. VGA_DETECT_SEL_NO_DEVICE);
  84. vga->connected = false;
  85. return 0;
  86. }
  87. /*
  88. * As edid reading succeeds, device must be connected, so we set
  89. * up detection bit for unplug interrupt here.
  90. */
  91. zx_writel(vga->mmio + VGA_AUTO_DETECT_SEL, VGA_DETECT_SEL_HAS_DEVICE);
  92. drm_connector_update_edid_property(connector, edid);
  93. ret = drm_add_edid_modes(connector, edid);
  94. kfree(edid);
  95. return ret;
  96. }
  97. static enum drm_mode_status
  98. zx_vga_connector_mode_valid(struct drm_connector *connector,
  99. struct drm_display_mode *mode)
  100. {
  101. return MODE_OK;
  102. }
  103. static struct drm_connector_helper_funcs zx_vga_connector_helper_funcs = {
  104. .get_modes = zx_vga_connector_get_modes,
  105. .mode_valid = zx_vga_connector_mode_valid,
  106. };
  107. static enum drm_connector_status
  108. zx_vga_connector_detect(struct drm_connector *connector, bool force)
  109. {
  110. struct zx_vga *vga = to_zx_vga(connector);
  111. return vga->connected ? connector_status_connected :
  112. connector_status_disconnected;
  113. }
  114. static const struct drm_connector_funcs zx_vga_connector_funcs = {
  115. .fill_modes = drm_helper_probe_single_connector_modes,
  116. .detect = zx_vga_connector_detect,
  117. .destroy = drm_connector_cleanup,
  118. .reset = drm_atomic_helper_connector_reset,
  119. .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
  120. .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
  121. };
  122. static int zx_vga_register(struct drm_device *drm, struct zx_vga *vga)
  123. {
  124. struct drm_encoder *encoder = &vga->encoder;
  125. struct drm_connector *connector = &vga->connector;
  126. struct device *dev = vga->dev;
  127. int ret;
  128. encoder->possible_crtcs = VOU_CRTC_MASK;
  129. ret = drm_encoder_init(drm, encoder, &zx_vga_encoder_funcs,
  130. DRM_MODE_ENCODER_DAC, NULL);
  131. if (ret) {
  132. DRM_DEV_ERROR(dev, "failed to init encoder: %d\n", ret);
  133. return ret;
  134. };
  135. drm_encoder_helper_add(encoder, &zx_vga_encoder_helper_funcs);
  136. vga->connector.polled = DRM_CONNECTOR_POLL_HPD;
  137. ret = drm_connector_init(drm, connector, &zx_vga_connector_funcs,
  138. DRM_MODE_CONNECTOR_VGA);
  139. if (ret) {
  140. DRM_DEV_ERROR(dev, "failed to init connector: %d\n", ret);
  141. goto clean_encoder;
  142. };
  143. drm_connector_helper_add(connector, &zx_vga_connector_helper_funcs);
  144. ret = drm_connector_attach_encoder(connector, encoder);
  145. if (ret) {
  146. DRM_DEV_ERROR(dev, "failed to attach encoder: %d\n", ret);
  147. goto clean_connector;
  148. };
  149. return 0;
  150. clean_connector:
  151. drm_connector_cleanup(connector);
  152. clean_encoder:
  153. drm_encoder_cleanup(encoder);
  154. return ret;
  155. }
  156. static int zx_vga_pwrctrl_init(struct zx_vga *vga)
  157. {
  158. struct zx_vga_pwrctrl *pwrctrl = &vga->pwrctrl;
  159. struct device *dev = vga->dev;
  160. struct of_phandle_args out_args;
  161. struct regmap *regmap;
  162. int ret;
  163. ret = of_parse_phandle_with_fixed_args(dev->of_node,
  164. "zte,vga-power-control", 2, 0, &out_args);
  165. if (ret)
  166. return ret;
  167. regmap = syscon_node_to_regmap(out_args.np);
  168. if (IS_ERR(regmap)) {
  169. ret = PTR_ERR(regmap);
  170. goto out;
  171. }
  172. pwrctrl->regmap = regmap;
  173. pwrctrl->reg = out_args.args[0];
  174. pwrctrl->mask = out_args.args[1];
  175. out:
  176. of_node_put(out_args.np);
  177. return ret;
  178. }
  179. static int zx_vga_i2c_read(struct zx_vga *vga, struct i2c_msg *msg)
  180. {
  181. int len = msg->len;
  182. u8 *buf = msg->buf;
  183. u32 offset = 0;
  184. int i;
  185. reinit_completion(&vga->complete);
  186. /* Select combo write */
  187. zx_writel_mask(vga->mmio + VGA_CMD_CFG, VGA_CMD_COMBO, VGA_CMD_COMBO);
  188. zx_writel_mask(vga->mmio + VGA_CMD_CFG, VGA_CMD_RW, 0);
  189. while (len > 0) {
  190. u32 cnt;
  191. /* Clear RX FIFO */
  192. zx_writel_mask(vga->mmio + VGA_RXF_CTRL, VGA_RX_FIFO_CLEAR,
  193. VGA_RX_FIFO_CLEAR);
  194. /* Data offset to read from */
  195. zx_writel(vga->mmio + VGA_SUB_ADDR, offset);
  196. /* Kick off the transfer */
  197. zx_writel_mask(vga->mmio + VGA_CMD_CFG, VGA_CMD_TRANS,
  198. VGA_CMD_TRANS);
  199. if (!wait_for_completion_timeout(&vga->complete,
  200. msecs_to_jiffies(1000))) {
  201. DRM_DEV_ERROR(vga->dev, "transfer timeout\n");
  202. return -ETIMEDOUT;
  203. }
  204. cnt = zx_readl(vga->mmio + VGA_RXF_STATUS);
  205. cnt = (cnt & VGA_RXF_COUNT_MASK) >> VGA_RXF_COUNT_SHIFT;
  206. /* FIFO status may report more data than we need to read */
  207. cnt = min_t(u32, len, cnt);
  208. for (i = 0; i < cnt; i++)
  209. *buf++ = zx_readl(vga->mmio + VGA_DATA);
  210. len -= cnt;
  211. offset += cnt;
  212. }
  213. return 0;
  214. }
  215. static int zx_vga_i2c_write(struct zx_vga *vga, struct i2c_msg *msg)
  216. {
  217. /*
  218. * The DDC I2C adapter is only for reading EDID data, so we assume
  219. * that the write to this adapter must be the EDID data offset.
  220. */
  221. if ((msg->len != 1) || ((msg->addr != DDC_ADDR)))
  222. return -EINVAL;
  223. /* Hardware will take care of the slave address shifting */
  224. zx_writel(vga->mmio + VGA_DEVICE_ADDR, msg->addr);
  225. return 0;
  226. }
  227. static int zx_vga_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
  228. int num)
  229. {
  230. struct zx_vga *vga = i2c_get_adapdata(adap);
  231. struct zx_vga_i2c *ddc = vga->ddc;
  232. int ret = 0;
  233. int i;
  234. mutex_lock(&ddc->lock);
  235. for (i = 0; i < num; i++) {
  236. if (msgs[i].flags & I2C_M_RD)
  237. ret = zx_vga_i2c_read(vga, &msgs[i]);
  238. else
  239. ret = zx_vga_i2c_write(vga, &msgs[i]);
  240. if (ret < 0)
  241. break;
  242. }
  243. if (!ret)
  244. ret = num;
  245. mutex_unlock(&ddc->lock);
  246. return ret;
  247. }
  248. static u32 zx_vga_i2c_func(struct i2c_adapter *adapter)
  249. {
  250. return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
  251. }
  252. static const struct i2c_algorithm zx_vga_algorithm = {
  253. .master_xfer = zx_vga_i2c_xfer,
  254. .functionality = zx_vga_i2c_func,
  255. };
  256. static int zx_vga_ddc_register(struct zx_vga *vga)
  257. {
  258. struct device *dev = vga->dev;
  259. struct i2c_adapter *adap;
  260. struct zx_vga_i2c *ddc;
  261. int ret;
  262. ddc = devm_kzalloc(dev, sizeof(*ddc), GFP_KERNEL);
  263. if (!ddc)
  264. return -ENOMEM;
  265. vga->ddc = ddc;
  266. mutex_init(&ddc->lock);
  267. adap = &ddc->adap;
  268. adap->owner = THIS_MODULE;
  269. adap->class = I2C_CLASS_DDC;
  270. adap->dev.parent = dev;
  271. adap->algo = &zx_vga_algorithm;
  272. snprintf(adap->name, sizeof(adap->name), "zx vga i2c");
  273. ret = i2c_add_adapter(adap);
  274. if (ret) {
  275. DRM_DEV_ERROR(dev, "failed to add I2C adapter: %d\n", ret);
  276. return ret;
  277. }
  278. i2c_set_adapdata(adap, vga);
  279. return 0;
  280. }
  281. static irqreturn_t zx_vga_irq_thread(int irq, void *dev_id)
  282. {
  283. struct zx_vga *vga = dev_id;
  284. drm_helper_hpd_irq_event(vga->connector.dev);
  285. return IRQ_HANDLED;
  286. }
  287. static irqreturn_t zx_vga_irq_handler(int irq, void *dev_id)
  288. {
  289. struct zx_vga *vga = dev_id;
  290. u32 status;
  291. status = zx_readl(vga->mmio + VGA_I2C_STATUS);
  292. /* Clear interrupt status */
  293. zx_writel_mask(vga->mmio + VGA_I2C_STATUS, VGA_CLEAR_IRQ,
  294. VGA_CLEAR_IRQ);
  295. if (status & VGA_DEVICE_CONNECTED) {
  296. /*
  297. * Since VGA_DETECT_SEL bits need to be reset for switching DDC
  298. * bus from device detection to EDID read, rather than setting
  299. * up HAS_DEVICE bit here, we need to do that in .get_modes
  300. * hook for unplug detecting after EDID read succeeds.
  301. */
  302. vga->connected = true;
  303. return IRQ_WAKE_THREAD;
  304. }
  305. if (status & VGA_DEVICE_DISCONNECTED) {
  306. zx_writel(vga->mmio + VGA_AUTO_DETECT_SEL,
  307. VGA_DETECT_SEL_NO_DEVICE);
  308. vga->connected = false;
  309. return IRQ_WAKE_THREAD;
  310. }
  311. if (status & VGA_TRANS_DONE) {
  312. complete(&vga->complete);
  313. return IRQ_HANDLED;
  314. }
  315. return IRQ_NONE;
  316. }
  317. static void zx_vga_hw_init(struct zx_vga *vga)
  318. {
  319. unsigned long ref = clk_get_rate(vga->i2c_wclk);
  320. int div;
  321. /*
  322. * Set up I2C fast speed divider per formula below to get 400kHz.
  323. * scl = ref / ((div + 1) * 4)
  324. */
  325. div = DIV_ROUND_UP(ref / 1000, 400 * 4) - 1;
  326. zx_writel(vga->mmio + VGA_CLK_DIV_FS, div);
  327. /* Set up device detection */
  328. zx_writel(vga->mmio + VGA_AUTO_DETECT_PARA, 0x80);
  329. zx_writel(vga->mmio + VGA_AUTO_DETECT_SEL, VGA_DETECT_SEL_NO_DEVICE);
  330. /*
  331. * We need to poke monitor via DDC bus to get connection irq
  332. * start working.
  333. */
  334. zx_writel(vga->mmio + VGA_DEVICE_ADDR, DDC_ADDR);
  335. zx_writel_mask(vga->mmio + VGA_CMD_CFG, VGA_CMD_TRANS, VGA_CMD_TRANS);
  336. }
  337. static int zx_vga_bind(struct device *dev, struct device *master, void *data)
  338. {
  339. struct platform_device *pdev = to_platform_device(dev);
  340. struct drm_device *drm = data;
  341. struct resource *res;
  342. struct zx_vga *vga;
  343. int irq;
  344. int ret;
  345. vga = devm_kzalloc(dev, sizeof(*vga), GFP_KERNEL);
  346. if (!vga)
  347. return -ENOMEM;
  348. vga->dev = dev;
  349. dev_set_drvdata(dev, vga);
  350. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  351. vga->mmio = devm_ioremap_resource(dev, res);
  352. if (IS_ERR(vga->mmio))
  353. return PTR_ERR(vga->mmio);
  354. irq = platform_get_irq(pdev, 0);
  355. if (irq < 0)
  356. return irq;
  357. vga->i2c_wclk = devm_clk_get(dev, "i2c_wclk");
  358. if (IS_ERR(vga->i2c_wclk)) {
  359. ret = PTR_ERR(vga->i2c_wclk);
  360. DRM_DEV_ERROR(dev, "failed to get i2c_wclk: %d\n", ret);
  361. return ret;
  362. }
  363. ret = zx_vga_pwrctrl_init(vga);
  364. if (ret) {
  365. DRM_DEV_ERROR(dev, "failed to init power control: %d\n", ret);
  366. return ret;
  367. }
  368. ret = zx_vga_ddc_register(vga);
  369. if (ret) {
  370. DRM_DEV_ERROR(dev, "failed to register ddc: %d\n", ret);
  371. return ret;
  372. }
  373. ret = zx_vga_register(drm, vga);
  374. if (ret) {
  375. DRM_DEV_ERROR(dev, "failed to register vga: %d\n", ret);
  376. return ret;
  377. }
  378. init_completion(&vga->complete);
  379. ret = devm_request_threaded_irq(dev, irq, zx_vga_irq_handler,
  380. zx_vga_irq_thread, IRQF_SHARED,
  381. dev_name(dev), vga);
  382. if (ret) {
  383. DRM_DEV_ERROR(dev, "failed to request threaded irq: %d\n", ret);
  384. return ret;
  385. }
  386. ret = clk_prepare_enable(vga->i2c_wclk);
  387. if (ret)
  388. return ret;
  389. zx_vga_hw_init(vga);
  390. return 0;
  391. }
  392. static void zx_vga_unbind(struct device *dev, struct device *master,
  393. void *data)
  394. {
  395. struct zx_vga *vga = dev_get_drvdata(dev);
  396. clk_disable_unprepare(vga->i2c_wclk);
  397. }
  398. static const struct component_ops zx_vga_component_ops = {
  399. .bind = zx_vga_bind,
  400. .unbind = zx_vga_unbind,
  401. };
  402. static int zx_vga_probe(struct platform_device *pdev)
  403. {
  404. return component_add(&pdev->dev, &zx_vga_component_ops);
  405. }
  406. static int zx_vga_remove(struct platform_device *pdev)
  407. {
  408. component_del(&pdev->dev, &zx_vga_component_ops);
  409. return 0;
  410. }
  411. static const struct of_device_id zx_vga_of_match[] = {
  412. { .compatible = "zte,zx296718-vga", },
  413. { /* end */ },
  414. };
  415. MODULE_DEVICE_TABLE(of, zx_vga_of_match);
  416. struct platform_driver zx_vga_driver = {
  417. .probe = zx_vga_probe,
  418. .remove = zx_vga_remove,
  419. .driver = {
  420. .name = "zx-vga",
  421. .of_match_table = zx_vga_of_match,
  422. },
  423. };