dsi_ctrl_hw_1_4.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/delay.h>
  6. #include <linux/iopoll.h>
  7. #include "dsi_ctrl_hw.h"
  8. #include "dsi_ctrl_reg.h"
  9. #include "dsi_hw.h"
  10. #define MMSS_MISC_CLAMP_REG_OFF 0x0014
  11. /**
  12. * dsi_ctrl_hw_14_setup_lane_map() - setup mapping between
  13. * logical and physical lanes
  14. * @ctrl: Pointer to the controller host hardware.
  15. * @lane_map: Structure defining the mapping between DSI logical
  16. * lanes and physical lanes.
  17. */
  18. void dsi_ctrl_hw_14_setup_lane_map(struct dsi_ctrl_hw *ctrl,
  19. struct dsi_lane_map *lane_map)
  20. {
  21. DSI_W32(ctrl, DSI_LANE_SWAP_CTRL, lane_map->lane_map_v1);
  22. DSI_CTRL_HW_DBG(ctrl, "Lane swap setup complete\n");
  23. }
  24. /**
  25. * dsi_ctrl_hw_14_wait_for_lane_idle()
  26. * This function waits for all the active DSI lanes to be idle by polling all
  27. * the FIFO_EMPTY bits and polling he lane status to ensure that all the lanes
  28. * are in stop state. This function assumes that the bus clocks required to
  29. * access the registers are already turned on.
  30. *
  31. * @ctrl: Pointer to the controller host hardware.
  32. * @lanes: ORed list of lanes (enum dsi_data_lanes) which need
  33. * to be stopped.
  34. *
  35. * return: Error code.
  36. */
  37. int dsi_ctrl_hw_14_wait_for_lane_idle(struct dsi_ctrl_hw *ctrl, u32 lanes)
  38. {
  39. int rc = 0, val = 0;
  40. u32 stop_state_mask = 0, fifo_empty_mask = 0;
  41. u32 const sleep_us = 10;
  42. u32 const timeout_us = 100;
  43. if (lanes & DSI_DATA_LANE_0) {
  44. stop_state_mask |= BIT(0);
  45. fifo_empty_mask |= (BIT(12) | BIT(16));
  46. }
  47. if (lanes & DSI_DATA_LANE_1) {
  48. stop_state_mask |= BIT(1);
  49. fifo_empty_mask |= BIT(20);
  50. }
  51. if (lanes & DSI_DATA_LANE_2) {
  52. stop_state_mask |= BIT(2);
  53. fifo_empty_mask |= BIT(24);
  54. }
  55. if (lanes & DSI_DATA_LANE_3) {
  56. stop_state_mask |= BIT(3);
  57. fifo_empty_mask |= BIT(28);
  58. }
  59. DSI_CTRL_HW_DBG(ctrl, "polling for fifo empty, mask=0x%08x\n",
  60. fifo_empty_mask);
  61. rc = readl_poll_timeout(ctrl->base + DSI_FIFO_STATUS, val,
  62. (val & fifo_empty_mask), sleep_us, timeout_us);
  63. if (rc) {
  64. DSI_CTRL_HW_ERR(ctrl, "fifo not empty, FIFO_STATUS=0x%08x\n",
  65. val);
  66. goto error;
  67. }
  68. DSI_CTRL_HW_DBG(ctrl, "polling for lanes to be in stop state, mask=0x%08x\n",
  69. stop_state_mask);
  70. rc = readl_poll_timeout(ctrl->base + DSI_LANE_STATUS, val,
  71. (val & stop_state_mask), sleep_us, timeout_us);
  72. if (rc) {
  73. DSI_CTRL_HW_ERR(ctrl, "lanes not in stop state, LANE_STATUS=0x%08x\n",
  74. val);
  75. goto error;
  76. }
  77. error:
  78. return rc;
  79. }
  80. /**
  81. * ulps_request() - request ulps entry for specified lanes
  82. * @ctrl: Pointer to the controller host hardware.
  83. * @lanes: ORed list of lanes (enum dsi_data_lanes) which need
  84. * to enter ULPS.
  85. *
  86. * Caller should check if lanes are in ULPS mode by calling
  87. * get_lanes_in_ulps() operation.
  88. */
  89. void dsi_ctrl_hw_cmn_ulps_request(struct dsi_ctrl_hw *ctrl, u32 lanes)
  90. {
  91. u32 reg = 0;
  92. reg = DSI_R32(ctrl, DSI_LANE_CTRL);
  93. if (lanes & DSI_CLOCK_LANE)
  94. reg |= BIT(4);
  95. if (lanes & DSI_DATA_LANE_0)
  96. reg |= BIT(0);
  97. if (lanes & DSI_DATA_LANE_1)
  98. reg |= BIT(1);
  99. if (lanes & DSI_DATA_LANE_2)
  100. reg |= BIT(2);
  101. if (lanes & DSI_DATA_LANE_3)
  102. reg |= BIT(3);
  103. /*
  104. * ULPS entry request. Wait for short time to make sure
  105. * that the lanes enter ULPS. Recommended as per HPG.
  106. */
  107. DSI_W32(ctrl, DSI_LANE_CTRL, reg);
  108. usleep_range(100, 110);
  109. DSI_CTRL_HW_DBG(ctrl, "ULPS requested for lanes 0x%x\n", lanes);
  110. }
  111. /**
  112. * ulps_exit() - exit ULPS on specified lanes
  113. * @ctrl: Pointer to the controller host hardware.
  114. * @lanes: ORed list of lanes (enum dsi_data_lanes) which need
  115. * to exit ULPS.
  116. *
  117. * Caller should check if lanes are in active mode by calling
  118. * get_lanes_in_ulps() operation.
  119. */
  120. void dsi_ctrl_hw_cmn_ulps_exit(struct dsi_ctrl_hw *ctrl, u32 lanes)
  121. {
  122. u32 reg = 0;
  123. u32 prev_reg = 0;
  124. prev_reg = DSI_R32(ctrl, DSI_LANE_CTRL);
  125. prev_reg &= BIT(24);
  126. if (lanes & DSI_CLOCK_LANE)
  127. reg |= BIT(12);
  128. if (lanes & DSI_DATA_LANE_0)
  129. reg |= BIT(8);
  130. if (lanes & DSI_DATA_LANE_1)
  131. reg |= BIT(9);
  132. if (lanes & DSI_DATA_LANE_2)
  133. reg |= BIT(10);
  134. if (lanes & DSI_DATA_LANE_3)
  135. reg |= BIT(11);
  136. /*
  137. * ULPS Exit Request
  138. * Hardware requirement is to wait for at least 1ms
  139. */
  140. DSI_W32(ctrl, DSI_LANE_CTRL, reg | prev_reg);
  141. usleep_range(1000, 1010);
  142. /*
  143. * Sometimes when exiting ULPS, it is possible that some DSI
  144. * lanes are not in the stop state which could lead to DSI
  145. * commands not going through. To avoid this, force the lanes
  146. * to be in stop state.
  147. */
  148. DSI_W32(ctrl, DSI_LANE_CTRL, (reg << 8) | prev_reg);
  149. wmb(); /* ensure lanes are put to stop state */
  150. DSI_W32(ctrl, DSI_LANE_CTRL, 0x0 | prev_reg);
  151. wmb(); /* ensure lanes are put to stop state */
  152. DSI_CTRL_HW_DBG(ctrl, "ULPS exit request for lanes=0x%x\n", lanes);
  153. }
  154. /**
  155. * get_lanes_in_ulps() - returns the list of lanes in ULPS mode
  156. * @ctrl: Pointer to the controller host hardware.
  157. *
  158. * Returns an ORed list of lanes (enum dsi_data_lanes) that are in ULPS
  159. * state. If 0 is returned, all the lanes are active.
  160. *
  161. * Return: List of lanes in ULPS state.
  162. */
  163. u32 dsi_ctrl_hw_cmn_get_lanes_in_ulps(struct dsi_ctrl_hw *ctrl)
  164. {
  165. u32 reg = 0;
  166. u32 lanes = 0;
  167. reg = DSI_R32(ctrl, DSI_LANE_STATUS);
  168. if (!(reg & BIT(8)))
  169. lanes |= DSI_DATA_LANE_0;
  170. if (!(reg & BIT(9)))
  171. lanes |= DSI_DATA_LANE_1;
  172. if (!(reg & BIT(10)))
  173. lanes |= DSI_DATA_LANE_2;
  174. if (!(reg & BIT(11)))
  175. lanes |= DSI_DATA_LANE_3;
  176. if (!(reg & BIT(12)))
  177. lanes |= DSI_CLOCK_LANE;
  178. DSI_CTRL_HW_DBG(ctrl, "lanes in ulps = 0x%x\n", lanes);
  179. return lanes;
  180. }
  181. /**
  182. * clamp_enable() - enable DSI clamps to keep PHY driving a stable link
  183. * @ctrl: Pointer to the controller host hardware.
  184. * @lanes: ORed list of lanes which need to be clamped.
  185. * @enable_ulps: Boolean to specify if ULPS is enabled in DSI controller
  186. */
  187. void dsi_ctrl_hw_14_clamp_enable(struct dsi_ctrl_hw *ctrl,
  188. u32 lanes,
  189. bool enable_ulps)
  190. {
  191. u32 clamp_reg = 0;
  192. u32 bit_shift = 0;
  193. u32 reg = 0;
  194. if (ctrl->index == 1)
  195. bit_shift = 16;
  196. if (lanes & DSI_CLOCK_LANE) {
  197. clamp_reg |= BIT(9);
  198. if (enable_ulps)
  199. clamp_reg |= BIT(8);
  200. }
  201. if (lanes & DSI_DATA_LANE_0) {
  202. clamp_reg |= BIT(7);
  203. if (enable_ulps)
  204. clamp_reg |= BIT(6);
  205. }
  206. if (lanes & DSI_DATA_LANE_1) {
  207. clamp_reg |= BIT(5);
  208. if (enable_ulps)
  209. clamp_reg |= BIT(4);
  210. }
  211. if (lanes & DSI_DATA_LANE_2) {
  212. clamp_reg |= BIT(3);
  213. if (enable_ulps)
  214. clamp_reg |= BIT(2);
  215. }
  216. if (lanes & DSI_DATA_LANE_3) {
  217. clamp_reg |= BIT(1);
  218. if (enable_ulps)
  219. clamp_reg |= BIT(0);
  220. }
  221. reg = DSI_MMSS_MISC_R32(ctrl, MMSS_MISC_CLAMP_REG_OFF);
  222. reg |= (clamp_reg << bit_shift);
  223. DSI_MMSS_MISC_W32(ctrl, MMSS_MISC_CLAMP_REG_OFF, reg);
  224. reg = DSI_MMSS_MISC_R32(ctrl, MMSS_MISC_CLAMP_REG_OFF);
  225. reg |= (BIT(15) << bit_shift); /* Enable clamp */
  226. DSI_MMSS_MISC_W32(ctrl, MMSS_MISC_CLAMP_REG_OFF, reg);
  227. DSI_CTRL_HW_DBG(ctrl, "Clamps enabled for lanes=0x%x\n", lanes);
  228. }
  229. /**
  230. * clamp_disable() - disable DSI clamps
  231. * @ctrl: Pointer to the controller host hardware.
  232. * @lanes: ORed list of lanes which need to have clamps released.
  233. * @disable_ulps: Boolean to specify if ULPS is enabled in DSI controller
  234. */
  235. void dsi_ctrl_hw_14_clamp_disable(struct dsi_ctrl_hw *ctrl,
  236. u32 lanes,
  237. bool disable_ulps)
  238. {
  239. u32 clamp_reg = 0;
  240. u32 bit_shift = 0;
  241. u32 reg = 0;
  242. if (ctrl->index == 1)
  243. bit_shift = 16;
  244. if (lanes & DSI_CLOCK_LANE) {
  245. clamp_reg |= BIT(9);
  246. if (disable_ulps)
  247. clamp_reg |= BIT(8);
  248. }
  249. if (lanes & DSI_DATA_LANE_0) {
  250. clamp_reg |= BIT(7);
  251. if (disable_ulps)
  252. clamp_reg |= BIT(6);
  253. }
  254. if (lanes & DSI_DATA_LANE_1) {
  255. clamp_reg |= BIT(5);
  256. if (disable_ulps)
  257. clamp_reg |= BIT(4);
  258. }
  259. if (lanes & DSI_DATA_LANE_2) {
  260. clamp_reg |= BIT(3);
  261. if (disable_ulps)
  262. clamp_reg |= BIT(2);
  263. }
  264. if (lanes & DSI_DATA_LANE_3) {
  265. clamp_reg |= BIT(1);
  266. if (disable_ulps)
  267. clamp_reg |= BIT(0);
  268. }
  269. clamp_reg |= BIT(15); /* Enable clamp */
  270. clamp_reg <<= bit_shift;
  271. reg = DSI_MMSS_MISC_R32(ctrl, MMSS_MISC_CLAMP_REG_OFF);
  272. reg &= ~(clamp_reg);
  273. DSI_MMSS_MISC_W32(ctrl, MMSS_MISC_CLAMP_REG_OFF, reg);
  274. DSI_CTRL_HW_DBG(ctrl, "Disable clamps for lanes=%d\n", lanes);
  275. }
  276. #define DUMP_REG_VALUE(off) "\t%-30s: 0x%08x\n", #off, DSI_R32(ctrl, off)
  277. ssize_t dsi_ctrl_hw_14_reg_dump_to_buffer(struct dsi_ctrl_hw *ctrl,
  278. char *buf,
  279. u32 size)
  280. {
  281. u32 len = 0;
  282. len += snprintf((buf + len), (size - len), "CONFIGURATION REGS:\n");
  283. len += snprintf((buf + len), (size - len),
  284. DUMP_REG_VALUE(DSI_HW_VERSION));
  285. len += snprintf((buf + len), (size - len),
  286. DUMP_REG_VALUE(DSI_CTRL));
  287. len += snprintf((buf + len), (size - len),
  288. DUMP_REG_VALUE(DSI_STATUS));
  289. len += snprintf((buf + len), (size - len),
  290. DUMP_REG_VALUE(DSI_FIFO_STATUS));
  291. len += snprintf((buf + len), (size - len),
  292. DUMP_REG_VALUE(DSI_VIDEO_MODE_CTRL));
  293. len += snprintf((buf + len), (size - len),
  294. DUMP_REG_VALUE(DSI_VIDEO_MODE_SYNC_DATATYPE));
  295. len += snprintf((buf + len), (size - len),
  296. DUMP_REG_VALUE(DSI_VIDEO_MODE_PIXEL_DATATYPE));
  297. len += snprintf((buf + len), (size - len),
  298. DUMP_REG_VALUE(DSI_VIDEO_MODE_BLANKING_DATATYPE));
  299. len += snprintf((buf + len), (size - len),
  300. DUMP_REG_VALUE(DSI_VIDEO_MODE_DATA_CTRL));
  301. len += snprintf((buf + len), (size - len),
  302. DUMP_REG_VALUE(DSI_VIDEO_MODE_ACTIVE_H));
  303. len += snprintf((buf + len), (size - len),
  304. DUMP_REG_VALUE(DSI_VIDEO_MODE_ACTIVE_V));
  305. len += snprintf((buf + len), (size - len),
  306. DUMP_REG_VALUE(DSI_VIDEO_MODE_TOTAL));
  307. len += snprintf((buf + len), (size - len),
  308. DUMP_REG_VALUE(DSI_VIDEO_MODE_HSYNC));
  309. len += snprintf((buf + len), (size - len),
  310. DUMP_REG_VALUE(DSI_VIDEO_MODE_VSYNC));
  311. len += snprintf((buf + len), (size - len),
  312. DUMP_REG_VALUE(DSI_VIDEO_MODE_VSYNC_VPOS));
  313. len += snprintf((buf + len), (size - len),
  314. DUMP_REG_VALUE(DSI_COMMAND_MODE_DMA_CTRL));
  315. len += snprintf((buf + len), (size - len),
  316. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_CTRL));
  317. len += snprintf((buf + len), (size - len),
  318. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_DCS_CMD_CTRL));
  319. len += snprintf((buf + len), (size - len),
  320. DUMP_REG_VALUE(DSI_DMA_CMD_OFFSET));
  321. len += snprintf((buf + len), (size - len),
  322. DUMP_REG_VALUE(DSI_DMA_CMD_LENGTH));
  323. len += snprintf((buf + len), (size - len),
  324. DUMP_REG_VALUE(DSI_DMA_FIFO_CTRL));
  325. len += snprintf((buf + len), (size - len),
  326. DUMP_REG_VALUE(DSI_DMA_NULL_PACKET_DATA));
  327. len += snprintf((buf + len), (size - len),
  328. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM0_CTRL));
  329. len += snprintf((buf + len), (size - len),
  330. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM0_TOTAL));
  331. len += snprintf((buf + len), (size - len),
  332. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM1_CTRL));
  333. len += snprintf((buf + len), (size - len),
  334. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM1_TOTAL));
  335. len += snprintf((buf + len), (size - len),
  336. DUMP_REG_VALUE(DSI_ACK_ERR_STATUS));
  337. len += snprintf((buf + len), (size - len),
  338. DUMP_REG_VALUE(DSI_RDBK_DATA0));
  339. len += snprintf((buf + len), (size - len),
  340. DUMP_REG_VALUE(DSI_RDBK_DATA1));
  341. len += snprintf((buf + len), (size - len),
  342. DUMP_REG_VALUE(DSI_RDBK_DATA2));
  343. len += snprintf((buf + len), (size - len),
  344. DUMP_REG_VALUE(DSI_RDBK_DATA3));
  345. len += snprintf((buf + len), (size - len),
  346. DUMP_REG_VALUE(DSI_RDBK_DATATYPE0));
  347. len += snprintf((buf + len), (size - len),
  348. DUMP_REG_VALUE(DSI_RDBK_DATATYPE1));
  349. len += snprintf((buf + len), (size - len),
  350. DUMP_REG_VALUE(DSI_TRIG_CTRL));
  351. len += snprintf((buf + len), (size - len),
  352. DUMP_REG_VALUE(DSI_EXT_MUX));
  353. len += snprintf((buf + len), (size - len),
  354. DUMP_REG_VALUE(DSI_EXT_MUX_TE_PULSE_DETECT_CTRL));
  355. len += snprintf((buf + len), (size - len),
  356. DUMP_REG_VALUE(DSI_CMD_MODE_DMA_SW_TRIGGER));
  357. len += snprintf((buf + len), (size - len),
  358. DUMP_REG_VALUE(DSI_CMD_MODE_MDP_SW_TRIGGER));
  359. len += snprintf((buf + len), (size - len),
  360. DUMP_REG_VALUE(DSI_CMD_MODE_BTA_SW_TRIGGER));
  361. len += snprintf((buf + len), (size - len),
  362. DUMP_REG_VALUE(DSI_RESET_SW_TRIGGER));
  363. len += snprintf((buf + len), (size - len),
  364. DUMP_REG_VALUE(DSI_LANE_STATUS));
  365. len += snprintf((buf + len), (size - len),
  366. DUMP_REG_VALUE(DSI_LANE_CTRL));
  367. len += snprintf((buf + len), (size - len),
  368. DUMP_REG_VALUE(DSI_LANE_SWAP_CTRL));
  369. len += snprintf((buf + len), (size - len),
  370. DUMP_REG_VALUE(DSI_DLN0_PHY_ERR));
  371. len += snprintf((buf + len), (size - len),
  372. DUMP_REG_VALUE(DSI_LP_TIMER_CTRL));
  373. len += snprintf((buf + len), (size - len),
  374. DUMP_REG_VALUE(DSI_HS_TIMER_CTRL));
  375. len += snprintf((buf + len), (size - len),
  376. DUMP_REG_VALUE(DSI_TIMEOUT_STATUS));
  377. len += snprintf((buf + len), (size - len),
  378. DUMP_REG_VALUE(DSI_CLKOUT_TIMING_CTRL));
  379. len += snprintf((buf + len), (size - len),
  380. DUMP_REG_VALUE(DSI_EOT_PACKET));
  381. len += snprintf((buf + len), (size - len),
  382. DUMP_REG_VALUE(DSI_EOT_PACKET_CTRL));
  383. len += snprintf((buf + len), (size - len),
  384. DUMP_REG_VALUE(DSI_GENERIC_ESC_TX_TRIGGER));
  385. len += snprintf((buf + len), (size - len),
  386. DUMP_REG_VALUE(DSI_ERR_INT_MASK0));
  387. len += snprintf((buf + len), (size - len),
  388. DUMP_REG_VALUE(DSI_INT_CTRL));
  389. len += snprintf((buf + len), (size - len),
  390. DUMP_REG_VALUE(DSI_SOFT_RESET));
  391. len += snprintf((buf + len), (size - len),
  392. DUMP_REG_VALUE(DSI_CLK_CTRL));
  393. len += snprintf((buf + len), (size - len),
  394. DUMP_REG_VALUE(DSI_CLK_STATUS));
  395. len += snprintf((buf + len), (size - len),
  396. DUMP_REG_VALUE(DSI_PHY_SW_RESET));
  397. len += snprintf((buf + len), (size - len),
  398. DUMP_REG_VALUE(DSI_AXI2AHB_CTRL));
  399. len += snprintf((buf + len), (size - len),
  400. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_CTRL2));
  401. len += snprintf((buf + len), (size - len),
  402. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM2_CTRL));
  403. len += snprintf((buf + len), (size - len),
  404. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM2_TOTAL));
  405. len += snprintf((buf + len), (size - len),
  406. DUMP_REG_VALUE(DSI_VBIF_CTRL));
  407. len += snprintf((buf + len), (size - len),
  408. DUMP_REG_VALUE(DSI_AES_CTRL));
  409. len += snprintf((buf + len), (size - len),
  410. DUMP_REG_VALUE(DSI_RDBK_DATA_CTRL));
  411. len += snprintf((buf + len), (size - len),
  412. DUMP_REG_VALUE(DSI_TEST_PATTERN_GEN_CMD_DMA_INIT_VAL2));
  413. len += snprintf((buf + len), (size - len),
  414. DUMP_REG_VALUE(DSI_TPG_DMA_FIFO_STATUS));
  415. len += snprintf((buf + len), (size - len),
  416. DUMP_REG_VALUE(DSI_TPG_DMA_FIFO_WRITE_TRIGGER));
  417. len += snprintf((buf + len), (size - len),
  418. DUMP_REG_VALUE(DSI_DSI_TIMING_FLUSH));
  419. len += snprintf((buf + len), (size - len),
  420. DUMP_REG_VALUE(DSI_DSI_TIMING_DB_MODE));
  421. len += snprintf((buf + len), (size - len),
  422. DUMP_REG_VALUE(DSI_TPG_DMA_FIFO_RESET));
  423. len += snprintf((buf + len), (size - len),
  424. DUMP_REG_VALUE(DSI_VERSION));
  425. DSI_CTRL_HW_ERR(ctrl, "LLENGTH = %d\n", len);
  426. return len;
  427. }