dsi_ctrl_hw_2_0.c 8.2 KB

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