dsi_ctrl_hw_2_0.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
  4. */
  5. #define pr_fmt(fmt) "dsi-hw:" fmt
  6. #include <linux/delay.h>
  7. #include <linux/iopoll.h>
  8. #include "dsi_ctrl_hw.h"
  9. #include "dsi_ctrl_reg.h"
  10. #include "dsi_hw.h"
  11. void dsi_ctrl_hw_20_setup_lane_map(struct dsi_ctrl_hw *ctrl,
  12. struct dsi_lane_map *lane_map)
  13. {
  14. u32 reg_value = lane_map->lane_map_v2[DSI_LOGICAL_LANE_0] |
  15. (lane_map->lane_map_v2[DSI_LOGICAL_LANE_1] << 4) |
  16. (lane_map->lane_map_v2[DSI_LOGICAL_LANE_2] << 8) |
  17. (lane_map->lane_map_v2[DSI_LOGICAL_LANE_3] << 12);
  18. DSI_W32(ctrl, DSI_LANE_SWAP_CTRL, reg_value);
  19. pr_debug("[DSI_%d] Lane swap setup complete\n", ctrl->index);
  20. }
  21. int dsi_ctrl_hw_20_wait_for_lane_idle(struct dsi_ctrl_hw *ctrl,
  22. u32 lanes)
  23. {
  24. int rc = 0, val = 0;
  25. u32 fifo_empty_mask = 0;
  26. u32 const sleep_us = 10;
  27. u32 const timeout_us = 100;
  28. if (lanes & DSI_DATA_LANE_0)
  29. fifo_empty_mask |= (BIT(12) | BIT(16));
  30. if (lanes & DSI_DATA_LANE_1)
  31. fifo_empty_mask |= BIT(20);
  32. if (lanes & DSI_DATA_LANE_2)
  33. fifo_empty_mask |= BIT(24);
  34. if (lanes & DSI_DATA_LANE_3)
  35. fifo_empty_mask |= BIT(28);
  36. pr_debug("%s: polling for fifo empty, mask=0x%08x\n", __func__,
  37. fifo_empty_mask);
  38. rc = readl_poll_timeout(ctrl->base + DSI_FIFO_STATUS, val,
  39. (val & fifo_empty_mask), sleep_us, timeout_us);
  40. if (rc) {
  41. pr_err("%s: fifo not empty, FIFO_STATUS=0x%08x\n",
  42. __func__, val);
  43. goto error;
  44. }
  45. error:
  46. return rc;
  47. }
  48. #define DUMP_REG_VALUE(off) "\t%-30s: 0x%08x\n", #off, DSI_R32(ctrl, off)
  49. ssize_t dsi_ctrl_hw_20_reg_dump_to_buffer(struct dsi_ctrl_hw *ctrl,
  50. char *buf,
  51. u32 size)
  52. {
  53. u32 len = 0;
  54. len += snprintf((buf + len), (size - len), "CONFIGURATION REGS:\n");
  55. len += snprintf((buf + len), (size - len),
  56. DUMP_REG_VALUE(DSI_HW_VERSION));
  57. len += snprintf((buf + len), (size - len),
  58. DUMP_REG_VALUE(DSI_CTRL));
  59. len += snprintf((buf + len), (size - len),
  60. DUMP_REG_VALUE(DSI_STATUS));
  61. len += snprintf((buf + len), (size - len),
  62. DUMP_REG_VALUE(DSI_FIFO_STATUS));
  63. len += snprintf((buf + len), (size - len),
  64. DUMP_REG_VALUE(DSI_VIDEO_MODE_CTRL));
  65. len += snprintf((buf + len), (size - len),
  66. DUMP_REG_VALUE(DSI_VIDEO_MODE_SYNC_DATATYPE));
  67. len += snprintf((buf + len), (size - len),
  68. DUMP_REG_VALUE(DSI_VIDEO_MODE_PIXEL_DATATYPE));
  69. len += snprintf((buf + len), (size - len),
  70. DUMP_REG_VALUE(DSI_VIDEO_MODE_BLANKING_DATATYPE));
  71. len += snprintf((buf + len), (size - len),
  72. DUMP_REG_VALUE(DSI_VIDEO_MODE_DATA_CTRL));
  73. len += snprintf((buf + len), (size - len),
  74. DUMP_REG_VALUE(DSI_VIDEO_MODE_ACTIVE_H));
  75. len += snprintf((buf + len), (size - len),
  76. DUMP_REG_VALUE(DSI_VIDEO_MODE_ACTIVE_V));
  77. len += snprintf((buf + len), (size - len),
  78. DUMP_REG_VALUE(DSI_VIDEO_MODE_TOTAL));
  79. len += snprintf((buf + len), (size - len),
  80. DUMP_REG_VALUE(DSI_VIDEO_MODE_HSYNC));
  81. len += snprintf((buf + len), (size - len),
  82. DUMP_REG_VALUE(DSI_VIDEO_MODE_VSYNC));
  83. len += snprintf((buf + len), (size - len),
  84. DUMP_REG_VALUE(DSI_VIDEO_MODE_VSYNC_VPOS));
  85. len += snprintf((buf + len), (size - len),
  86. DUMP_REG_VALUE(DSI_COMMAND_MODE_DMA_CTRL));
  87. len += snprintf((buf + len), (size - len),
  88. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_CTRL));
  89. len += snprintf((buf + len), (size - len),
  90. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_DCS_CMD_CTRL));
  91. len += snprintf((buf + len), (size - len),
  92. DUMP_REG_VALUE(DSI_DMA_CMD_OFFSET));
  93. len += snprintf((buf + len), (size - len),
  94. DUMP_REG_VALUE(DSI_DMA_CMD_LENGTH));
  95. len += snprintf((buf + len), (size - len),
  96. DUMP_REG_VALUE(DSI_DMA_FIFO_CTRL));
  97. len += snprintf((buf + len), (size - len),
  98. DUMP_REG_VALUE(DSI_DMA_NULL_PACKET_DATA));
  99. len += snprintf((buf + len), (size - len),
  100. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM0_CTRL));
  101. len += snprintf((buf + len), (size - len),
  102. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM0_TOTAL));
  103. len += snprintf((buf + len), (size - len),
  104. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM1_CTRL));
  105. len += snprintf((buf + len), (size - len),
  106. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM1_TOTAL));
  107. len += snprintf((buf + len), (size - len),
  108. DUMP_REG_VALUE(DSI_ACK_ERR_STATUS));
  109. len += snprintf((buf + len), (size - len),
  110. DUMP_REG_VALUE(DSI_RDBK_DATA0));
  111. len += snprintf((buf + len), (size - len),
  112. DUMP_REG_VALUE(DSI_RDBK_DATA1));
  113. len += snprintf((buf + len), (size - len),
  114. DUMP_REG_VALUE(DSI_RDBK_DATA2));
  115. len += snprintf((buf + len), (size - len),
  116. DUMP_REG_VALUE(DSI_RDBK_DATA3));
  117. len += snprintf((buf + len), (size - len),
  118. DUMP_REG_VALUE(DSI_RDBK_DATATYPE0));
  119. len += snprintf((buf + len), (size - len),
  120. DUMP_REG_VALUE(DSI_RDBK_DATATYPE1));
  121. len += snprintf((buf + len), (size - len),
  122. DUMP_REG_VALUE(DSI_TRIG_CTRL));
  123. len += snprintf((buf + len), (size - len),
  124. DUMP_REG_VALUE(DSI_EXT_MUX));
  125. len += snprintf((buf + len), (size - len),
  126. DUMP_REG_VALUE(DSI_EXT_MUX_TE_PULSE_DETECT_CTRL));
  127. len += snprintf((buf + len), (size - len),
  128. DUMP_REG_VALUE(DSI_CMD_MODE_DMA_SW_TRIGGER));
  129. len += snprintf((buf + len), (size - len),
  130. DUMP_REG_VALUE(DSI_CMD_MODE_MDP_SW_TRIGGER));
  131. len += snprintf((buf + len), (size - len),
  132. DUMP_REG_VALUE(DSI_CMD_MODE_BTA_SW_TRIGGER));
  133. len += snprintf((buf + len), (size - len),
  134. DUMP_REG_VALUE(DSI_RESET_SW_TRIGGER));
  135. len += snprintf((buf + len), (size - len),
  136. DUMP_REG_VALUE(DSI_MISR_CMD_CTRL));
  137. len += snprintf((buf + len), (size - len),
  138. DUMP_REG_VALUE(DSI_MISR_VIDEO_CTRL));
  139. len += snprintf((buf + len), (size - len),
  140. DUMP_REG_VALUE(DSI_LANE_STATUS));
  141. len += snprintf((buf + len), (size - len),
  142. DUMP_REG_VALUE(DSI_LANE_CTRL));
  143. len += snprintf((buf + len), (size - len),
  144. DUMP_REG_VALUE(DSI_LANE_SWAP_CTRL));
  145. len += snprintf((buf + len), (size - len),
  146. DUMP_REG_VALUE(DSI_DLN0_PHY_ERR));
  147. len += snprintf((buf + len), (size - len),
  148. DUMP_REG_VALUE(DSI_LP_TIMER_CTRL));
  149. len += snprintf((buf + len), (size - len),
  150. DUMP_REG_VALUE(DSI_HS_TIMER_CTRL));
  151. len += snprintf((buf + len), (size - len),
  152. DUMP_REG_VALUE(DSI_TIMEOUT_STATUS));
  153. len += snprintf((buf + len), (size - len),
  154. DUMP_REG_VALUE(DSI_CLKOUT_TIMING_CTRL));
  155. len += snprintf((buf + len), (size - len),
  156. DUMP_REG_VALUE(DSI_EOT_PACKET));
  157. len += snprintf((buf + len), (size - len),
  158. DUMP_REG_VALUE(DSI_EOT_PACKET_CTRL));
  159. len += snprintf((buf + len), (size - len),
  160. DUMP_REG_VALUE(DSI_GENERIC_ESC_TX_TRIGGER));
  161. len += snprintf((buf + len), (size - len),
  162. DUMP_REG_VALUE(DSI_ERR_INT_MASK0));
  163. len += snprintf((buf + len), (size - len),
  164. DUMP_REG_VALUE(DSI_INT_CTRL));
  165. len += snprintf((buf + len), (size - len),
  166. DUMP_REG_VALUE(DSI_SOFT_RESET));
  167. len += snprintf((buf + len), (size - len),
  168. DUMP_REG_VALUE(DSI_CLK_CTRL));
  169. len += snprintf((buf + len), (size - len),
  170. DUMP_REG_VALUE(DSI_CLK_STATUS));
  171. len += snprintf((buf + len), (size - len),
  172. DUMP_REG_VALUE(DSI_PHY_SW_RESET));
  173. len += snprintf((buf + len), (size - len),
  174. DUMP_REG_VALUE(DSI_AXI2AHB_CTRL));
  175. len += snprintf((buf + len), (size - len),
  176. DUMP_REG_VALUE(DSI_MISR_CMD_MDP0_32BIT));
  177. len += snprintf((buf + len), (size - len),
  178. DUMP_REG_VALUE(DSI_MISR_CMD_MDP1_32BIT));
  179. len += snprintf((buf + len), (size - len),
  180. DUMP_REG_VALUE(DSI_MISR_VIDEO_32BIT));
  181. len += snprintf((buf + len), (size - len),
  182. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_CTRL2));
  183. len += snprintf((buf + len), (size - len),
  184. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM2_CTRL));
  185. len += snprintf((buf + len), (size - len),
  186. DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM2_TOTAL));
  187. len += snprintf((buf + len), (size - len),
  188. DUMP_REG_VALUE(DSI_VBIF_CTRL));
  189. len += snprintf((buf + len), (size - len),
  190. DUMP_REG_VALUE(DSI_AES_CTRL));
  191. len += snprintf((buf + len), (size - len),
  192. DUMP_REG_VALUE(DSI_RDBK_DATA_CTRL));
  193. len += snprintf((buf + len), (size - len),
  194. DUMP_REG_VALUE(DSI_TEST_PATTERN_GEN_CMD_DMA_INIT_VAL2));
  195. len += snprintf((buf + len), (size - len),
  196. DUMP_REG_VALUE(DSI_TPG_DMA_FIFO_STATUS));
  197. len += snprintf((buf + len), (size - len),
  198. DUMP_REG_VALUE(DSI_TPG_DMA_FIFO_WRITE_TRIGGER));
  199. len += snprintf((buf + len), (size - len),
  200. DUMP_REG_VALUE(DSI_DSI_TIMING_FLUSH));
  201. len += snprintf((buf + len), (size - len),
  202. DUMP_REG_VALUE(DSI_DSI_TIMING_DB_MODE));
  203. len += snprintf((buf + len), (size - len),
  204. DUMP_REG_VALUE(DSI_TPG_DMA_FIFO_RESET));
  205. len += snprintf((buf + len), (size - len),
  206. DUMP_REG_VALUE(DSI_VERSION));
  207. pr_err("LLENGTH = %d\n", len);
  208. return len;
  209. }