exynos_mipi_dsi_lowlevel.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2012 Samsung Electronics
  4. *
  5. * Author: InKi Dae <inki.dae@samsung.com>
  6. * Author: Donghwa Lee <dh09.lee@samsung.com>
  7. */
  8. #include <common.h>
  9. #include <asm/arch/dsim.h>
  10. #include <asm/arch/mipi_dsim.h>
  11. #include <asm/arch/power.h>
  12. #include <asm/arch/cpu.h>
  13. #include "exynos_mipi_dsi_lowlevel.h"
  14. #include "exynos_mipi_dsi_common.h"
  15. void exynos_mipi_dsi_func_reset(struct mipi_dsim_device *dsim)
  16. {
  17. unsigned int reg;
  18. struct exynos_mipi_dsim *mipi_dsim =
  19. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  20. reg = readl(&mipi_dsim->swrst);
  21. reg |= DSIM_FUNCRST;
  22. writel(reg, &mipi_dsim->swrst);
  23. }
  24. void exynos_mipi_dsi_sw_reset(struct mipi_dsim_device *dsim)
  25. {
  26. unsigned int reg = 0;
  27. struct exynos_mipi_dsim *mipi_dsim =
  28. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  29. reg = readl(&mipi_dsim->swrst);
  30. reg |= DSIM_SWRST;
  31. reg |= DSIM_FUNCRST;
  32. writel(reg, &mipi_dsim->swrst);
  33. }
  34. void exynos_mipi_dsi_sw_release(struct mipi_dsim_device *dsim)
  35. {
  36. struct exynos_mipi_dsim *mipi_dsim =
  37. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  38. unsigned int reg = readl(&mipi_dsim->intsrc);
  39. reg |= INTSRC_SWRST_RELEASE;
  40. writel(reg, &mipi_dsim->intsrc);
  41. }
  42. void exynos_mipi_dsi_set_interrupt_mask(struct mipi_dsim_device *dsim,
  43. unsigned int mode, unsigned int mask)
  44. {
  45. struct exynos_mipi_dsim *mipi_dsim =
  46. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  47. unsigned int reg = readl(&mipi_dsim->intmsk);
  48. if (mask)
  49. reg |= mode;
  50. else
  51. reg &= ~mode;
  52. writel(reg, &mipi_dsim->intmsk);
  53. }
  54. void exynos_mipi_dsi_init_fifo_pointer(struct mipi_dsim_device *dsim,
  55. unsigned int cfg)
  56. {
  57. unsigned int reg;
  58. struct exynos_mipi_dsim *mipi_dsim =
  59. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  60. reg = readl(&mipi_dsim->fifoctrl);
  61. writel(reg & ~(cfg), &mipi_dsim->fifoctrl);
  62. udelay(10 * 1000);
  63. reg |= cfg;
  64. writel(reg, &mipi_dsim->fifoctrl);
  65. }
  66. /*
  67. * this function set PLL P, M and S value in D-PHY
  68. */
  69. void exynos_mipi_dsi_set_phy_tunning(struct mipi_dsim_device *dsim,
  70. unsigned int value)
  71. {
  72. struct exynos_mipi_dsim *mipi_dsim =
  73. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  74. writel(DSIM_AFC_CTL(value), &mipi_dsim->phyacchr);
  75. }
  76. void exynos_mipi_dsi_set_main_disp_resol(struct mipi_dsim_device *dsim,
  77. unsigned int width_resol, unsigned int height_resol)
  78. {
  79. unsigned int reg;
  80. struct exynos_mipi_dsim *mipi_dsim =
  81. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  82. /* standby should be set after configuration so set to not ready*/
  83. reg = (readl(&mipi_dsim->mdresol)) & ~(DSIM_MAIN_STAND_BY);
  84. writel(reg, &mipi_dsim->mdresol);
  85. /* reset resolution */
  86. reg &= ~(DSIM_MAIN_VRESOL(0x7ff) | DSIM_MAIN_HRESOL(0x7ff));
  87. reg |= DSIM_MAIN_VRESOL(height_resol) | DSIM_MAIN_HRESOL(width_resol);
  88. reg |= DSIM_MAIN_STAND_BY;
  89. writel(reg, &mipi_dsim->mdresol);
  90. }
  91. void exynos_mipi_dsi_set_main_disp_vporch(struct mipi_dsim_device *dsim,
  92. unsigned int cmd_allow, unsigned int vfront, unsigned int vback)
  93. {
  94. unsigned int reg;
  95. struct exynos_mipi_dsim *mipi_dsim =
  96. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  97. reg = (readl(&mipi_dsim->mvporch)) &
  98. ~((DSIM_CMD_ALLOW_MASK) | (DSIM_STABLE_VFP_MASK) |
  99. (DSIM_MAIN_VBP_MASK));
  100. reg |= ((cmd_allow & 0xf) << DSIM_CMD_ALLOW_SHIFT) |
  101. ((vfront & 0x7ff) << DSIM_STABLE_VFP_SHIFT) |
  102. ((vback & 0x7ff) << DSIM_MAIN_VBP_SHIFT);
  103. writel(reg, &mipi_dsim->mvporch);
  104. }
  105. void exynos_mipi_dsi_set_main_disp_hporch(struct mipi_dsim_device *dsim,
  106. unsigned int front, unsigned int back)
  107. {
  108. unsigned int reg;
  109. struct exynos_mipi_dsim *mipi_dsim =
  110. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  111. reg = (readl(&mipi_dsim->mhporch)) &
  112. ~((DSIM_MAIN_HFP_MASK) | (DSIM_MAIN_HBP_MASK));
  113. reg |= (front << DSIM_MAIN_HFP_SHIFT) | (back << DSIM_MAIN_HBP_SHIFT);
  114. writel(reg, &mipi_dsim->mhporch);
  115. }
  116. void exynos_mipi_dsi_set_main_disp_sync_area(struct mipi_dsim_device *dsim,
  117. unsigned int vert, unsigned int hori)
  118. {
  119. unsigned int reg;
  120. struct exynos_mipi_dsim *mipi_dsim =
  121. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  122. reg = (readl(&mipi_dsim->msync)) &
  123. ~((DSIM_MAIN_VSA_MASK) | (DSIM_MAIN_HSA_MASK));
  124. reg |= ((vert & 0x3ff) << DSIM_MAIN_VSA_SHIFT) |
  125. (hori << DSIM_MAIN_HSA_SHIFT);
  126. writel(reg, &mipi_dsim->msync);
  127. }
  128. void exynos_mipi_dsi_set_sub_disp_resol(struct mipi_dsim_device *dsim,
  129. unsigned int vert, unsigned int hori)
  130. {
  131. unsigned int reg;
  132. struct exynos_mipi_dsim *mipi_dsim =
  133. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  134. reg = (readl(&mipi_dsim->sdresol)) &
  135. ~(DSIM_SUB_STANDY_MASK);
  136. writel(reg, &mipi_dsim->sdresol);
  137. reg &= ~(DSIM_SUB_VRESOL_MASK) | ~(DSIM_SUB_HRESOL_MASK);
  138. reg |= ((vert & 0x7ff) << DSIM_SUB_VRESOL_SHIFT) |
  139. ((hori & 0x7ff) << DSIM_SUB_HRESOL_SHIFT);
  140. writel(reg, &mipi_dsim->sdresol);
  141. /* DSIM STANDBY */
  142. reg |= (1 << DSIM_SUB_STANDY_SHIFT);
  143. writel(reg, &mipi_dsim->sdresol);
  144. }
  145. void exynos_mipi_dsi_init_config(struct mipi_dsim_device *dsim)
  146. {
  147. struct mipi_dsim_config *dsim_config = dsim->dsim_config;
  148. struct exynos_mipi_dsim *mipi_dsim =
  149. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  150. unsigned int cfg = (readl(&mipi_dsim->config)) &
  151. ~((1 << DSIM_EOT_PACKET_SHIFT) |
  152. (0x1f << DSIM_HSA_MODE_SHIFT) |
  153. (0x3 << DSIM_NUM_OF_DATALANE_SHIFT));
  154. cfg |= (dsim_config->auto_flush << DSIM_AUTO_FLUSH_SHIFT) |
  155. (dsim_config->eot_disable << DSIM_EOT_PACKET_SHIFT) |
  156. (dsim_config->auto_vertical_cnt << DSIM_AUTO_MODE_SHIFT) |
  157. (dsim_config->hse << DSIM_HSE_MODE_SHIFT) |
  158. (dsim_config->hfp << DSIM_HFP_MODE_SHIFT) |
  159. (dsim_config->hbp << DSIM_HBP_MODE_SHIFT) |
  160. (dsim_config->hsa << DSIM_HSA_MODE_SHIFT) |
  161. (dsim_config->e_no_data_lane << DSIM_NUM_OF_DATALANE_SHIFT);
  162. writel(cfg, &mipi_dsim->config);
  163. }
  164. void exynos_mipi_dsi_display_config(struct mipi_dsim_device *dsim,
  165. struct mipi_dsim_config *dsim_config)
  166. {
  167. struct exynos_mipi_dsim *mipi_dsim =
  168. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  169. u32 reg = (readl(&mipi_dsim->config)) &
  170. ~((0x3 << DSIM_BURST_MODE_SHIFT) | (1 << DSIM_VIDEO_MODE_SHIFT)
  171. | (0x3 << DSIM_MAINVC_SHIFT) | (0x7 << DSIM_MAINPIX_SHIFT)
  172. | (0x3 << DSIM_SUBVC_SHIFT) | (0x7 << DSIM_SUBPIX_SHIFT));
  173. if (dsim_config->e_interface == DSIM_VIDEO)
  174. reg |= (1 << DSIM_VIDEO_MODE_SHIFT);
  175. else if (dsim_config->e_interface == DSIM_COMMAND)
  176. reg &= ~(1 << DSIM_VIDEO_MODE_SHIFT);
  177. else {
  178. printf("unknown lcd type.\n");
  179. return;
  180. }
  181. /* main lcd */
  182. reg |= ((u8) (dsim_config->e_burst_mode) & 0x3) << DSIM_BURST_MODE_SHIFT
  183. | ((u8) (dsim_config->e_virtual_ch) & 0x3) << DSIM_MAINVC_SHIFT
  184. | ((u8) (dsim_config->e_pixel_format) & 0x7) << DSIM_MAINPIX_SHIFT;
  185. writel(reg, &mipi_dsim->config);
  186. }
  187. void exynos_mipi_dsi_enable_lane(struct mipi_dsim_device *dsim,
  188. unsigned int lane, unsigned int enable)
  189. {
  190. unsigned int reg;
  191. struct exynos_mipi_dsim *mipi_dsim =
  192. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  193. reg = readl(&mipi_dsim->config);
  194. if (enable)
  195. reg |= DSIM_LANE_ENx(lane);
  196. else
  197. reg &= ~DSIM_LANE_ENx(lane);
  198. writel(reg, &mipi_dsim->config);
  199. }
  200. void exynos_mipi_dsi_set_data_lane_number(struct mipi_dsim_device *dsim,
  201. unsigned int count)
  202. {
  203. unsigned int cfg;
  204. struct exynos_mipi_dsim *mipi_dsim =
  205. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  206. /* get the data lane number. */
  207. cfg = DSIM_NUM_OF_DATA_LANE(count);
  208. writel(cfg, &mipi_dsim->config);
  209. }
  210. void exynos_mipi_dsi_enable_afc(struct mipi_dsim_device *dsim,
  211. unsigned int enable, unsigned int afc_code)
  212. {
  213. struct exynos_mipi_dsim *mipi_dsim =
  214. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  215. unsigned int reg = readl(&mipi_dsim->phyacchr);
  216. reg = 0;
  217. if (enable) {
  218. reg |= DSIM_AFC_EN;
  219. reg &= ~(0x7 << DSIM_AFC_CTL_SHIFT);
  220. reg |= DSIM_AFC_CTL(afc_code);
  221. } else
  222. reg &= ~DSIM_AFC_EN;
  223. writel(reg, &mipi_dsim->phyacchr);
  224. }
  225. void exynos_mipi_dsi_enable_pll_bypass(struct mipi_dsim_device *dsim,
  226. unsigned int enable)
  227. {
  228. struct exynos_mipi_dsim *mipi_dsim =
  229. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  230. unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
  231. ~(DSIM_PLL_BYPASS_EXTERNAL);
  232. reg |= enable << DSIM_PLL_BYPASS_SHIFT;
  233. writel(reg, &mipi_dsim->clkctrl);
  234. }
  235. void exynos_mipi_dsi_pll_freq_band(struct mipi_dsim_device *dsim,
  236. unsigned int freq_band)
  237. {
  238. struct exynos_mipi_dsim *mipi_dsim =
  239. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  240. unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
  241. ~(0x1f << DSIM_FREQ_BAND_SHIFT);
  242. reg |= ((freq_band & 0x1f) << DSIM_FREQ_BAND_SHIFT);
  243. writel(reg, &mipi_dsim->pllctrl);
  244. }
  245. void exynos_mipi_dsi_pll_freq(struct mipi_dsim_device *dsim,
  246. unsigned int pre_divider, unsigned int main_divider,
  247. unsigned int scaler)
  248. {
  249. struct exynos_mipi_dsim *mipi_dsim =
  250. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  251. unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
  252. ~(0x7ffff << 1);
  253. reg |= ((pre_divider & 0x3f) << DSIM_PREDIV_SHIFT) |
  254. ((main_divider & 0x1ff) << DSIM_MAIN_SHIFT) |
  255. ((scaler & 0x7) << DSIM_SCALER_SHIFT);
  256. writel(reg, &mipi_dsim->pllctrl);
  257. }
  258. void exynos_mipi_dsi_pll_stable_time(struct mipi_dsim_device *dsim,
  259. unsigned int lock_time)
  260. {
  261. struct exynos_mipi_dsim *mipi_dsim =
  262. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  263. writel(lock_time, &mipi_dsim->plltmr);
  264. }
  265. void exynos_mipi_dsi_enable_pll(struct mipi_dsim_device *dsim,
  266. unsigned int enable)
  267. {
  268. struct exynos_mipi_dsim *mipi_dsim =
  269. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  270. unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
  271. ~(0x1 << DSIM_PLL_EN_SHIFT);
  272. reg |= ((enable & 0x1) << DSIM_PLL_EN_SHIFT);
  273. writel(reg, &mipi_dsim->pllctrl);
  274. }
  275. void exynos_mipi_dsi_set_byte_clock_src(struct mipi_dsim_device *dsim,
  276. unsigned int src)
  277. {
  278. struct exynos_mipi_dsim *mipi_dsim =
  279. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  280. unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
  281. ~(0x3 << DSIM_BYTE_CLK_SRC_SHIFT);
  282. reg |= ((unsigned int) src) << DSIM_BYTE_CLK_SRC_SHIFT;
  283. writel(reg, &mipi_dsim->clkctrl);
  284. }
  285. void exynos_mipi_dsi_enable_byte_clock(struct mipi_dsim_device *dsim,
  286. unsigned int enable)
  287. {
  288. struct exynos_mipi_dsim *mipi_dsim =
  289. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  290. unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
  291. ~(1 << DSIM_BYTE_CLKEN_SHIFT);
  292. reg |= enable << DSIM_BYTE_CLKEN_SHIFT;
  293. writel(reg, &mipi_dsim->clkctrl);
  294. }
  295. void exynos_mipi_dsi_set_esc_clk_prs(struct mipi_dsim_device *dsim,
  296. unsigned int enable, unsigned int prs_val)
  297. {
  298. struct exynos_mipi_dsim *mipi_dsim =
  299. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  300. unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
  301. ~((1 << DSIM_ESC_CLKEN_SHIFT) | (0xffff));
  302. reg |= enable << DSIM_ESC_CLKEN_SHIFT;
  303. if (enable)
  304. reg |= prs_val;
  305. writel(reg, &mipi_dsim->clkctrl);
  306. }
  307. void exynos_mipi_dsi_enable_esc_clk_on_lane(struct mipi_dsim_device *dsim,
  308. unsigned int lane_sel, unsigned int enable)
  309. {
  310. struct exynos_mipi_dsim *mipi_dsim =
  311. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  312. unsigned int reg = readl(&mipi_dsim->clkctrl);
  313. if (enable)
  314. reg |= DSIM_LANE_ESC_CLKEN(lane_sel);
  315. else
  316. reg &= ~DSIM_LANE_ESC_CLKEN(lane_sel);
  317. writel(reg, &mipi_dsim->clkctrl);
  318. }
  319. void exynos_mipi_dsi_force_dphy_stop_state(struct mipi_dsim_device *dsim,
  320. unsigned int enable)
  321. {
  322. struct exynos_mipi_dsim *mipi_dsim =
  323. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  324. unsigned int reg = (readl(&mipi_dsim->escmode)) &
  325. ~(0x1 << DSIM_FORCE_STOP_STATE_SHIFT);
  326. reg |= ((enable & 0x1) << DSIM_FORCE_STOP_STATE_SHIFT);
  327. writel(reg, &mipi_dsim->escmode);
  328. }
  329. unsigned int exynos_mipi_dsi_is_lane_state(struct mipi_dsim_device *dsim)
  330. {
  331. struct exynos_mipi_dsim *mipi_dsim =
  332. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  333. unsigned int reg = readl(&mipi_dsim->status);
  334. /**
  335. * check clock and data lane states.
  336. * if MIPI-DSI controller was enabled at bootloader then
  337. * TX_READY_HS_CLK is enabled otherwise STOP_STATE_CLK.
  338. * so it should be checked for two case.
  339. */
  340. if ((reg & DSIM_STOP_STATE_DAT(0xf)) &&
  341. ((reg & DSIM_STOP_STATE_CLK) ||
  342. (reg & DSIM_TX_READY_HS_CLK)))
  343. return 1;
  344. else
  345. return 0;
  346. }
  347. void exynos_mipi_dsi_set_stop_state_counter(struct mipi_dsim_device *dsim,
  348. unsigned int cnt_val)
  349. {
  350. struct exynos_mipi_dsim *mipi_dsim =
  351. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  352. unsigned int reg = (readl(&mipi_dsim->escmode)) &
  353. ~(0x7ff << DSIM_STOP_STATE_CNT_SHIFT);
  354. reg |= ((cnt_val & 0x7ff) << DSIM_STOP_STATE_CNT_SHIFT);
  355. writel(reg, &mipi_dsim->escmode);
  356. }
  357. void exynos_mipi_dsi_set_bta_timeout(struct mipi_dsim_device *dsim,
  358. unsigned int timeout)
  359. {
  360. struct exynos_mipi_dsim *mipi_dsim =
  361. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  362. unsigned int reg = (readl(&mipi_dsim->timeout)) &
  363. ~(0xff << DSIM_BTA_TOUT_SHIFT);
  364. reg |= (timeout << DSIM_BTA_TOUT_SHIFT);
  365. writel(reg, &mipi_dsim->timeout);
  366. }
  367. void exynos_mipi_dsi_set_lpdr_timeout(struct mipi_dsim_device *dsim,
  368. unsigned int timeout)
  369. {
  370. struct exynos_mipi_dsim *mipi_dsim =
  371. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  372. unsigned int reg = (readl(&mipi_dsim->timeout)) &
  373. ~(0xffff << DSIM_LPDR_TOUT_SHIFT);
  374. reg |= (timeout << DSIM_LPDR_TOUT_SHIFT);
  375. writel(reg, &mipi_dsim->timeout);
  376. }
  377. void exynos_mipi_dsi_set_cpu_transfer_mode(struct mipi_dsim_device *dsim,
  378. unsigned int lp)
  379. {
  380. struct exynos_mipi_dsim *mipi_dsim =
  381. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  382. unsigned int reg = readl(&mipi_dsim->escmode);
  383. reg &= ~DSIM_CMD_LPDT_LP;
  384. if (lp)
  385. reg |= DSIM_CMD_LPDT_LP;
  386. writel(reg, &mipi_dsim->escmode);
  387. }
  388. void exynos_mipi_dsi_set_lcdc_transfer_mode(struct mipi_dsim_device *dsim,
  389. unsigned int lp)
  390. {
  391. struct exynos_mipi_dsim *mipi_dsim =
  392. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  393. unsigned int reg = readl(&mipi_dsim->escmode);
  394. reg &= ~DSIM_TX_LPDT_LP;
  395. if (lp)
  396. reg |= DSIM_TX_LPDT_LP;
  397. writel(reg, &mipi_dsim->escmode);
  398. }
  399. void exynos_mipi_dsi_enable_hs_clock(struct mipi_dsim_device *dsim,
  400. unsigned int enable)
  401. {
  402. struct exynos_mipi_dsim *mipi_dsim =
  403. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  404. unsigned int reg = (readl(&mipi_dsim->clkctrl)) &
  405. ~(1 << DSIM_TX_REQUEST_HSCLK_SHIFT);
  406. reg |= enable << DSIM_TX_REQUEST_HSCLK_SHIFT;
  407. writel(reg, &mipi_dsim->clkctrl);
  408. }
  409. void exynos_mipi_dsi_dp_dn_swap(struct mipi_dsim_device *dsim,
  410. unsigned int swap_en)
  411. {
  412. struct exynos_mipi_dsim *mipi_dsim =
  413. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  414. unsigned int reg = readl(&mipi_dsim->phyacchr1);
  415. reg &= ~(0x3 << DSIM_DPDN_SWAP_DATA_SHIFT);
  416. reg |= (swap_en & 0x3) << DSIM_DPDN_SWAP_DATA_SHIFT;
  417. writel(reg, &mipi_dsim->phyacchr1);
  418. }
  419. void exynos_mipi_dsi_hs_zero_ctrl(struct mipi_dsim_device *dsim,
  420. unsigned int hs_zero)
  421. {
  422. struct exynos_mipi_dsim *mipi_dsim =
  423. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  424. unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
  425. ~(0xf << DSIM_ZEROCTRL_SHIFT);
  426. reg |= ((hs_zero & 0xf) << DSIM_ZEROCTRL_SHIFT);
  427. writel(reg, &mipi_dsim->pllctrl);
  428. }
  429. void exynos_mipi_dsi_prep_ctrl(struct mipi_dsim_device *dsim, unsigned int prep)
  430. {
  431. struct exynos_mipi_dsim *mipi_dsim =
  432. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  433. unsigned int reg = (readl(&mipi_dsim->pllctrl)) &
  434. ~(0x7 << DSIM_PRECTRL_SHIFT);
  435. reg |= ((prep & 0x7) << DSIM_PRECTRL_SHIFT);
  436. writel(reg, &mipi_dsim->pllctrl);
  437. }
  438. void exynos_mipi_dsi_clear_interrupt(struct mipi_dsim_device *dsim)
  439. {
  440. struct exynos_mipi_dsim *mipi_dsim =
  441. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  442. unsigned int reg = readl(&mipi_dsim->intsrc);
  443. reg |= INTSRC_PLL_STABLE;
  444. writel(reg, &mipi_dsim->intsrc);
  445. }
  446. void exynos_mipi_dsi_clear_all_interrupt(struct mipi_dsim_device *dsim)
  447. {
  448. struct exynos_mipi_dsim *mipi_dsim =
  449. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  450. writel(0xffffffff, &mipi_dsim->intsrc);
  451. }
  452. unsigned int exynos_mipi_dsi_is_pll_stable(struct mipi_dsim_device *dsim)
  453. {
  454. unsigned int reg;
  455. struct exynos_mipi_dsim *mipi_dsim =
  456. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  457. reg = readl(&mipi_dsim->status);
  458. return reg & DSIM_PLL_STABLE ? 1 : 0;
  459. }
  460. unsigned int exynos_mipi_dsi_get_fifo_state(struct mipi_dsim_device *dsim)
  461. {
  462. struct exynos_mipi_dsim *mipi_dsim =
  463. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  464. return readl(&mipi_dsim->fifoctrl) & ~(0x1f);
  465. }
  466. void exynos_mipi_dsi_wr_tx_header(struct mipi_dsim_device *dsim,
  467. unsigned int di, const unsigned char data0, const unsigned char data1)
  468. {
  469. struct exynos_mipi_dsim *mipi_dsim =
  470. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  471. unsigned int reg = (DSIM_PKTHDR_DAT1(data1) | DSIM_PKTHDR_DAT0(data0) |
  472. DSIM_PKTHDR_DI(di));
  473. writel(reg, &mipi_dsim->pkthdr);
  474. }
  475. unsigned int _exynos_mipi_dsi_get_frame_done_status(struct mipi_dsim_device
  476. *dsim)
  477. {
  478. struct exynos_mipi_dsim *mipi_dsim =
  479. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  480. unsigned int reg = readl(&mipi_dsim->intsrc);
  481. return (reg & INTSRC_FRAME_DONE) ? 1 : 0;
  482. }
  483. void _exynos_mipi_dsi_clear_frame_done(struct mipi_dsim_device *dsim)
  484. {
  485. struct exynos_mipi_dsim *mipi_dsim =
  486. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  487. unsigned int reg = readl(&mipi_dsim->intsrc);
  488. writel(reg | INTSRC_FRAME_DONE, &mipi_dsim->intsrc);
  489. }
  490. void exynos_mipi_dsi_wr_tx_data(struct mipi_dsim_device *dsim,
  491. unsigned int tx_data)
  492. {
  493. struct exynos_mipi_dsim *mipi_dsim =
  494. (struct exynos_mipi_dsim *)samsung_get_base_mipi_dsim();
  495. writel(tx_data, &mipi_dsim->payload);
  496. }