kmb_dsi.h 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. /* SPDX-License-Identifier: GPL-2.0-only
  2. *
  3. * Copyright © 2019-2020 Intel Corporation
  4. */
  5. #ifndef __KMB_DSI_H__
  6. #define __KMB_DSI_H__
  7. #include <drm/drm_encoder.h>
  8. #include <drm/drm_mipi_dsi.h>
  9. /* MIPI TX CFG */
  10. #define MIPI_TX_LANE_DATA_RATE_MBPS 891
  11. #define MIPI_TX_REF_CLK_KHZ 24000
  12. #define MIPI_TX_CFG_CLK_KHZ 24000
  13. #define MIPI_TX_BPP 24
  14. /* DPHY Tx test codes*/
  15. #define TEST_CODE_FSM_CONTROL 0x03
  16. #define TEST_CODE_MULTIPLE_PHY_CTRL 0x0C
  17. #define TEST_CODE_PLL_PROPORTIONAL_CHARGE_PUMP_CTRL 0x0E
  18. #define TEST_CODE_PLL_INTEGRAL_CHARGE_PUMP_CTRL 0x0F
  19. #define TEST_CODE_PLL_VCO_CTRL 0x12
  20. #define TEST_CODE_PLL_GMP_CTRL 0x13
  21. #define TEST_CODE_PLL_PHASE_ERR_CTRL 0x14
  22. #define TEST_CODE_PLL_LOCK_FILTER 0x15
  23. #define TEST_CODE_PLL_UNLOCK_FILTER 0x16
  24. #define TEST_CODE_PLL_INPUT_DIVIDER 0x17
  25. #define TEST_CODE_PLL_FEEDBACK_DIVIDER 0x18
  26. #define PLL_FEEDBACK_DIVIDER_HIGH BIT(7)
  27. #define TEST_CODE_PLL_OUTPUT_CLK_SEL 0x19
  28. #define PLL_N_OVR_EN BIT(4)
  29. #define PLL_M_OVR_EN BIT(5)
  30. #define TEST_CODE_VOD_LEVEL 0x24
  31. #define TEST_CODE_PLL_CHARGE_PUMP_BIAS 0x1C
  32. #define TEST_CODE_PLL_LOCK_DETECTOR 0x1D
  33. #define TEST_CODE_HS_FREQ_RANGE_CFG 0x44
  34. #define TEST_CODE_PLL_ANALOG_PROG 0x1F
  35. #define TEST_CODE_SLEW_RATE_OVERRIDE_CTRL 0xA0
  36. #define TEST_CODE_SLEW_RATE_DDL_LOOP_CTRL 0xA3
  37. #define TEST_CODE_SLEW_RATE_DDL_CYCLES 0xA4
  38. /* DPHY params */
  39. #define PLL_N_MIN 0
  40. #define PLL_N_MAX 15
  41. #define PLL_M_MIN 62
  42. #define PLL_M_MAX 623
  43. #define PLL_FVCO_MAX 1250
  44. #define TIMEOUT 600
  45. #define MIPI_TX_FRAME_GEN 4
  46. #define MIPI_TX_FRAME_GEN_SECTIONS 4
  47. #define MIPI_CTRL_VIRTUAL_CHANNELS 4
  48. #define MIPI_D_LANES_PER_DPHY 2
  49. #define MIPI_CTRL_2LANE_MAX_MC_FIFO_LOC 255
  50. #define MIPI_CTRL_4LANE_MAX_MC_FIFO_LOC 511
  51. /* 2 Data Lanes per D-PHY */
  52. #define MIPI_DPHY_D_LANES 2
  53. #define MIPI_DPHY_DEFAULT_BIT_RATES 63
  54. #define KMB_MIPI_DEFAULT_CLK 24000000
  55. #define KMB_MIPI_DEFAULT_CFG_CLK 24000000
  56. #define to_kmb_dsi(x) container_of(x, struct kmb_dsi, base)
  57. struct kmb_dsi {
  58. struct drm_encoder base;
  59. struct device *dev;
  60. struct platform_device *pdev;
  61. struct mipi_dsi_host *host;
  62. struct mipi_dsi_device *device;
  63. struct drm_bridge *adv_bridge;
  64. void __iomem *mipi_mmio;
  65. struct clk *clk_mipi;
  66. struct clk *clk_mipi_ecfg;
  67. struct clk *clk_mipi_cfg;
  68. int sys_clk_mhz;
  69. };
  70. /* DPHY Tx test codes */
  71. enum mipi_ctrl_num {
  72. MIPI_CTRL0 = 0,
  73. MIPI_CTRL1,
  74. MIPI_CTRL2,
  75. MIPI_CTRL3,
  76. MIPI_CTRL4,
  77. MIPI_CTRL5,
  78. MIPI_CTRL6,
  79. MIPI_CTRL7,
  80. MIPI_CTRL8,
  81. MIPI_CTRL9,
  82. MIPI_CTRL_NA
  83. };
  84. enum mipi_dphy_num {
  85. MIPI_DPHY0 = 0,
  86. MIPI_DPHY1,
  87. MIPI_DPHY2,
  88. MIPI_DPHY3,
  89. MIPI_DPHY4,
  90. MIPI_DPHY5,
  91. MIPI_DPHY6,
  92. MIPI_DPHY7,
  93. MIPI_DPHY8,
  94. MIPI_DPHY9,
  95. MIPI_DPHY_NA
  96. };
  97. enum mipi_dir {
  98. MIPI_RX,
  99. MIPI_TX
  100. };
  101. enum mipi_ctrl_type {
  102. MIPI_DSI,
  103. MIPI_CSI
  104. };
  105. enum mipi_data_if {
  106. MIPI_IF_DMA,
  107. MIPI_IF_PARALLEL
  108. };
  109. enum mipi_data_mode {
  110. MIPI_DATA_MODE0,
  111. MIPI_DATA_MODE1,
  112. MIPI_DATA_MODE2,
  113. MIPI_DATA_MODE3
  114. };
  115. enum mipi_dsi_video_mode {
  116. DSI_VIDEO_MODE_NO_BURST_PULSE,
  117. DSI_VIDEO_MODE_NO_BURST_EVENT,
  118. DSI_VIDEO_MODE_BURST
  119. };
  120. enum mipi_dsi_blanking_mode {
  121. TRANSITION_TO_LOW_POWER,
  122. SEND_BLANK_PACKET
  123. };
  124. enum mipi_dsi_eotp {
  125. DSI_EOTP_DISABLED,
  126. DSI_EOTP_ENABLES
  127. };
  128. enum mipi_dsi_data_type {
  129. DSI_SP_DT_RESERVED_00 = 0x00,
  130. DSI_SP_DT_VSYNC_START = 0x01,
  131. DSI_SP_DT_COLOR_MODE_OFF = 0x02,
  132. DSI_SP_DT_GENERIC_SHORT_WR = 0x03,
  133. DSI_SP_DT_GENERIC_RD = 0x04,
  134. DSI_SP_DT_DCS_SHORT_WR = 0x05,
  135. DSI_SP_DT_DCS_RD = 0x06,
  136. DSI_SP_DT_EOTP = 0x08,
  137. DSI_LP_DT_NULL = 0x09,
  138. DSI_LP_DT_RESERVED_0A = 0x0a,
  139. DSI_LP_DT_RESERVED_0B = 0x0b,
  140. DSI_LP_DT_LPPS_YCBCR422_20B = 0x0c,
  141. DSI_LP_DT_PPS_RGB101010_30B = 0x0d,
  142. DSI_LP_DT_PPS_RGB565_16B = 0x0e,
  143. DSI_LP_DT_RESERVED_0F = 0x0f,
  144. DSI_SP_DT_RESERVED_10 = 0x10,
  145. DSI_SP_DT_VSYNC_END = 0x11,
  146. DSI_SP_DT_COLOR_MODE_ON = 0x12,
  147. DSI_SP_DT_GENERIC_SHORT_WR_1PAR = 0x13,
  148. DSI_SP_DT_GENERIC_RD_1PAR = 0x14,
  149. DSI_SP_DT_DCS_SHORT_WR_1PAR = 0x15,
  150. DSI_SP_DT_RESERVED_16 = 0x16,
  151. DSI_SP_DT_RESERVED_17 = 0x17,
  152. DSI_SP_DT_RESERVED_18 = 0x18,
  153. DSI_LP_DT_BLANK = 0x19,
  154. DSI_LP_DT_RESERVED_1A = 0x1a,
  155. DSI_LP_DT_RESERVED_1B = 0x1b,
  156. DSI_LP_DT_PPS_YCBCR422_24B = 0x1c,
  157. DSI_LP_DT_PPS_RGB121212_36B = 0x1d,
  158. DSI_LP_DT_PPS_RGB666_18B = 0x1e,
  159. DSI_LP_DT_RESERVED_1F = 0x1f,
  160. DSI_SP_DT_RESERVED_20 = 0x20,
  161. DSI_SP_DT_HSYNC_START = 0x21,
  162. DSI_SP_DT_SHUT_DOWN_PERIPH_CMD = 0x22,
  163. DSI_SP_DT_GENERIC_SHORT_WR_2PAR = 0x23,
  164. DSI_SP_DT_GENERIC_RD_2PAR = 0x24,
  165. DSI_SP_DT_RESERVED_25 = 0x25,
  166. DSI_SP_DT_RESERVED_26 = 0x26,
  167. DSI_SP_DT_RESERVED_27 = 0x27,
  168. DSI_SP_DT_RESERVED_28 = 0x28,
  169. DSI_LP_DT_GENERIC_LONG_WR = 0x29,
  170. DSI_LP_DT_RESERVED_2A = 0x2a,
  171. DSI_LP_DT_RESERVED_2B = 0x2b,
  172. DSI_LP_DT_PPS_YCBCR422_16B = 0x2c,
  173. DSI_LP_DT_RESERVED_2D = 0x2d,
  174. DSI_LP_DT_LPPS_RGB666_18B = 0x2e,
  175. DSI_LP_DT_RESERVED_2F = 0x2f,
  176. DSI_SP_DT_RESERVED_30 = 0x30,
  177. DSI_SP_DT_HSYNC_END = 0x31,
  178. DSI_SP_DT_TURN_ON_PERIPH_CMD = 0x32,
  179. DSI_SP_DT_RESERVED_33 = 0x33,
  180. DSI_SP_DT_RESERVED_34 = 0x34,
  181. DSI_SP_DT_RESERVED_35 = 0x35,
  182. DSI_SP_DT_RESERVED_36 = 0x36,
  183. DSI_SP_DT_SET_MAX_RETURN_PKT_SIZE = 0x37,
  184. DSI_SP_DT_RESERVED_38 = 0x38,
  185. DSI_LP_DT_DSC_LONG_WR = 0x39,
  186. DSI_LP_DT_RESERVED_3A = 0x3a,
  187. DSI_LP_DT_RESERVED_3B = 0x3b,
  188. DSI_LP_DT_RESERVED_3C = 0x3c,
  189. DSI_LP_DT_PPS_YCBCR420_12B = 0x3d,
  190. DSI_LP_DT_PPS_RGB888_24B = 0x3e,
  191. DSI_LP_DT_RESERVED_3F = 0x3f
  192. };
  193. enum mipi_tx_hs_tp_sel {
  194. MIPI_TX_HS_TP_WHOLE_FRAME_COLOR0 = 0,
  195. MIPI_TX_HS_TP_WHOLE_FRAME_COLOR1,
  196. MIPI_TX_HS_TP_V_STRIPES,
  197. MIPI_TX_HS_TP_H_STRIPES,
  198. };
  199. enum dphy_mode {
  200. MIPI_DPHY_SLAVE = 0,
  201. MIPI_DPHY_MASTER
  202. };
  203. enum dphy_tx_fsm {
  204. DPHY_TX_POWERDWN = 0,
  205. DPHY_TX_BGPON,
  206. DPHY_TX_TERMCAL,
  207. DPHY_TX_TERMCALUP,
  208. DPHY_TX_OFFSETCAL,
  209. DPHY_TX_LOCK,
  210. DPHY_TX_SRCAL,
  211. DPHY_TX_IDLE,
  212. DPHY_TX_ULP,
  213. DPHY_TX_LANESTART,
  214. DPHY_TX_CLKALIGN,
  215. DPHY_TX_DDLTUNNING,
  216. DPHY_TX_ULP_FORCE_PLL,
  217. DPHY_TX_LOCK_LOSS
  218. };
  219. struct mipi_data_type_params {
  220. u8 size_constraint_pixels;
  221. u8 size_constraint_bytes;
  222. u8 pixels_per_pclk;
  223. u8 bits_per_pclk;
  224. };
  225. struct mipi_tx_dsi_cfg {
  226. u8 hfp_blank_en; /* Horizontal front porch blanking enable */
  227. u8 eotp_en; /* End of transmission packet enable */
  228. /* Last vertical front porch blanking mode */
  229. u8 lpm_last_vfp_line;
  230. /* First vertical sync active blanking mode */
  231. u8 lpm_first_vsa_line;
  232. u8 sync_pulse_eventn; /* Sync type */
  233. u8 hfp_blanking; /* Horizontal front porch blanking mode */
  234. u8 hbp_blanking; /* Horizontal back porch blanking mode */
  235. u8 hsa_blanking; /* Horizontal sync active blanking mode */
  236. u8 v_blanking; /* Vertical timing blanking mode */
  237. };
  238. struct mipi_tx_frame_section_cfg {
  239. u32 dma_v_stride;
  240. u16 dma_v_scale_cfg;
  241. u16 width_pixels;
  242. u16 height_lines;
  243. u8 dma_packed;
  244. u8 bpp;
  245. u8 bpp_unpacked;
  246. u8 dma_h_stride;
  247. u8 data_type;
  248. u8 data_mode;
  249. u8 dma_flip_rotate_sel;
  250. };
  251. struct mipi_tx_frame_timing_cfg {
  252. u32 bpp;
  253. u32 lane_rate_mbps;
  254. u32 hsync_width;
  255. u32 h_backporch;
  256. u32 h_frontporch;
  257. u32 h_active;
  258. u16 vsync_width;
  259. u16 v_backporch;
  260. u16 v_frontporch;
  261. u16 v_active;
  262. u8 active_lanes;
  263. };
  264. struct mipi_tx_frame_sect_phcfg {
  265. u32 wc;
  266. enum mipi_data_mode data_mode;
  267. enum mipi_dsi_data_type data_type;
  268. u8 vchannel;
  269. u8 dma_packed;
  270. };
  271. struct mipi_tx_frame_cfg {
  272. struct mipi_tx_frame_section_cfg *sections[MIPI_TX_FRAME_GEN_SECTIONS];
  273. u32 hsync_width; /* in pixels */
  274. u32 h_backporch; /* in pixels */
  275. u32 h_frontporch; /* in pixels */
  276. u16 vsync_width; /* in lines */
  277. u16 v_backporch; /* in lines */
  278. u16 v_frontporch; /* in lines */
  279. };
  280. struct mipi_tx_ctrl_cfg {
  281. struct mipi_tx_frame_cfg *frames[MIPI_TX_FRAME_GEN];
  282. const struct mipi_tx_dsi_cfg *tx_dsi_cfg;
  283. u8 line_sync_pkt_en;
  284. u8 line_counter_active;
  285. u8 frame_counter_active;
  286. u8 tx_hsclkkidle_cnt;
  287. u8 tx_hsexit_cnt;
  288. u8 tx_crc_en;
  289. u8 tx_hact_wait_stop;
  290. u8 tx_always_use_hact;
  291. u8 tx_wait_trig;
  292. u8 tx_wait_all_sect;
  293. };
  294. /* configuration structure for MIPI control */
  295. struct mipi_ctrl_cfg {
  296. u8 active_lanes; /* # active lanes per controller 2/4 */
  297. u32 lane_rate_mbps; /* MBPS */
  298. u32 ref_clk_khz;
  299. u32 cfg_clk_khz;
  300. struct mipi_tx_ctrl_cfg tx_ctrl_cfg;
  301. };
  302. static inline void kmb_write_mipi(struct kmb_dsi *kmb_dsi,
  303. unsigned int reg, u32 value)
  304. {
  305. writel(value, (kmb_dsi->mipi_mmio + reg));
  306. }
  307. static inline u32 kmb_read_mipi(struct kmb_dsi *kmb_dsi, unsigned int reg)
  308. {
  309. return readl(kmb_dsi->mipi_mmio + reg);
  310. }
  311. static inline void kmb_write_bits_mipi(struct kmb_dsi *kmb_dsi,
  312. unsigned int reg, u32 offset,
  313. u32 num_bits, u32 value)
  314. {
  315. u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
  316. u32 mask = (1 << num_bits) - 1;
  317. value &= mask;
  318. mask <<= offset;
  319. reg_val &= (~mask);
  320. reg_val |= (value << offset);
  321. kmb_write_mipi(kmb_dsi, reg, reg_val);
  322. }
  323. static inline void kmb_set_bit_mipi(struct kmb_dsi *kmb_dsi,
  324. unsigned int reg, u32 offset)
  325. {
  326. u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
  327. kmb_write_mipi(kmb_dsi, reg, reg_val | (1 << offset));
  328. }
  329. static inline void kmb_clr_bit_mipi(struct kmb_dsi *kmb_dsi,
  330. unsigned int reg, u32 offset)
  331. {
  332. u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
  333. kmb_write_mipi(kmb_dsi, reg, reg_val & (~(1 << offset)));
  334. }
  335. int kmb_dsi_host_bridge_init(struct device *dev);
  336. struct kmb_dsi *kmb_dsi_init(struct platform_device *pdev);
  337. void kmb_dsi_host_unregister(struct kmb_dsi *kmb_dsi);
  338. int kmb_dsi_mode_set(struct kmb_dsi *kmb_dsi, struct drm_display_mode *mode,
  339. int sys_clk_mhz, struct drm_atomic_state *old_state);
  340. int kmb_dsi_map_mmio(struct kmb_dsi *kmb_dsi);
  341. int kmb_dsi_clk_init(struct kmb_dsi *kmb_dsi);
  342. int kmb_dsi_encoder_init(struct drm_device *dev, struct kmb_dsi *kmb_dsi);
  343. #endif /* __KMB_DSI_H__ */