exynos_mipi_dsi_lowlevel.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. /* linux/drivers/video/exynos/exynos_mipi_dsi_lowlevel.c
  2. *
  3. * Samsung SoC MIPI-DSI lowlevel driver.
  4. *
  5. * Copyright (c) 2012 Samsung Electronics Co., Ltd
  6. *
  7. * InKi Dae, <inki.dae@samsung.com>
  8. * Donghwa Lee, <dh09.lee@samsung.com>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License version 2 as
  12. * published by the Free Software Foundation.
  13. */
  14. #include <linux/module.h>
  15. #include <linux/kernel.h>
  16. #include <linux/errno.h>
  17. #include <linux/mutex.h>
  18. #include <linux/wait.h>
  19. #include <linux/delay.h>
  20. #include <linux/fs.h>
  21. #include <linux/mm.h>
  22. #include <linux/ctype.h>
  23. #include <linux/io.h>
  24. #include <video/exynos_mipi_dsim.h>
  25. #include <mach/map.h>
  26. #include "exynos_mipi_dsi_regs.h"
  27. void exynos_mipi_dsi_func_reset(struct mipi_dsim_device *dsim)
  28. {
  29. unsigned int reg;
  30. reg = readl(dsim->reg_base + EXYNOS_DSIM_SWRST);
  31. reg |= DSIM_FUNCRST;
  32. writel(reg, dsim->reg_base + EXYNOS_DSIM_SWRST);
  33. }
  34. void exynos_mipi_dsi_sw_reset(struct mipi_dsim_device *dsim)
  35. {
  36. unsigned int reg;
  37. reg = readl(dsim->reg_base + EXYNOS_DSIM_SWRST);
  38. reg |= DSIM_SWRST;
  39. writel(reg, dsim->reg_base + EXYNOS_DSIM_SWRST);
  40. }
  41. void exynos_mipi_dsi_sw_reset_release(struct mipi_dsim_device *dsim)
  42. {
  43. unsigned int reg;
  44. reg = readl(dsim->reg_base + EXYNOS_DSIM_INTSRC);
  45. reg |= INTSRC_SW_RST_RELEASE;
  46. writel(reg, dsim->reg_base + EXYNOS_DSIM_INTSRC);
  47. }
  48. int exynos_mipi_dsi_get_sw_reset_release(struct mipi_dsim_device *dsim)
  49. {
  50. return (readl(dsim->reg_base + EXYNOS_DSIM_INTSRC)) &
  51. INTSRC_SW_RST_RELEASE;
  52. }
  53. unsigned int exynos_mipi_dsi_read_interrupt_mask(struct mipi_dsim_device *dsim)
  54. {
  55. unsigned int reg;
  56. reg = readl(dsim->reg_base + EXYNOS_DSIM_INTMSK);
  57. return reg;
  58. }
  59. void exynos_mipi_dsi_set_interrupt_mask(struct mipi_dsim_device *dsim,
  60. unsigned int mode, unsigned int mask)
  61. {
  62. unsigned int reg = 0;
  63. if (mask)
  64. reg |= mode;
  65. else
  66. reg &= ~mode;
  67. writel(reg, dsim->reg_base + EXYNOS_DSIM_INTMSK);
  68. }
  69. void exynos_mipi_dsi_init_fifo_pointer(struct mipi_dsim_device *dsim,
  70. unsigned int cfg)
  71. {
  72. unsigned int reg;
  73. reg = readl(dsim->reg_base + EXYNOS_DSIM_FIFOCTRL);
  74. writel(reg & ~(cfg), dsim->reg_base + EXYNOS_DSIM_FIFOCTRL);
  75. mdelay(10);
  76. reg |= cfg;
  77. writel(reg, dsim->reg_base + EXYNOS_DSIM_FIFOCTRL);
  78. }
  79. /*
  80. * this function set PLL P, M and S value in D-PHY
  81. */
  82. void exynos_mipi_dsi_set_phy_tunning(struct mipi_dsim_device *dsim,
  83. unsigned int value)
  84. {
  85. writel(DSIM_AFC_CTL(value), dsim->reg_base + EXYNOS_DSIM_PHYACCHR);
  86. }
  87. void exynos_mipi_dsi_set_main_stand_by(struct mipi_dsim_device *dsim,
  88. unsigned int enable)
  89. {
  90. unsigned int reg;
  91. reg = readl(dsim->reg_base + EXYNOS_DSIM_MDRESOL);
  92. reg &= ~DSIM_MAIN_STAND_BY;
  93. if (enable)
  94. reg |= DSIM_MAIN_STAND_BY;
  95. writel(reg, dsim->reg_base + EXYNOS_DSIM_MDRESOL);
  96. }
  97. void exynos_mipi_dsi_set_main_disp_resol(struct mipi_dsim_device *dsim,
  98. unsigned int width_resol, unsigned int height_resol)
  99. {
  100. unsigned int reg;
  101. /* standby should be set after configuration so set to not ready*/
  102. reg = (readl(dsim->reg_base + EXYNOS_DSIM_MDRESOL)) &
  103. ~(DSIM_MAIN_STAND_BY);
  104. writel(reg, dsim->reg_base + EXYNOS_DSIM_MDRESOL);
  105. reg &= ~((0x7ff << 16) | (0x7ff << 0));
  106. reg |= DSIM_MAIN_VRESOL(height_resol) | DSIM_MAIN_HRESOL(width_resol);
  107. reg |= DSIM_MAIN_STAND_BY;
  108. writel(reg, dsim->reg_base + EXYNOS_DSIM_MDRESOL);
  109. }
  110. void exynos_mipi_dsi_set_main_disp_vporch(struct mipi_dsim_device *dsim,
  111. unsigned int cmd_allow, unsigned int vfront, unsigned int vback)
  112. {
  113. unsigned int reg;
  114. reg = (readl(dsim->reg_base + EXYNOS_DSIM_MVPORCH)) &
  115. ~((DSIM_CMD_ALLOW_MASK) | (DSIM_STABLE_VFP_MASK) |
  116. (DSIM_MAIN_VBP_MASK));
  117. reg |= (DSIM_CMD_ALLOW_SHIFT(cmd_allow & 0xf) |
  118. DSIM_STABLE_VFP_SHIFT(vfront & 0x7ff) |
  119. DSIM_MAIN_VBP_SHIFT(vback & 0x7ff));
  120. writel(reg, dsim->reg_base + EXYNOS_DSIM_MVPORCH);
  121. }
  122. void exynos_mipi_dsi_set_main_disp_hporch(struct mipi_dsim_device *dsim,
  123. unsigned int front, unsigned int back)
  124. {
  125. unsigned int reg;
  126. reg = (readl(dsim->reg_base + EXYNOS_DSIM_MHPORCH)) &
  127. ~((DSIM_MAIN_HFP_MASK) | (DSIM_MAIN_HBP_MASK));
  128. reg |= DSIM_MAIN_HFP_SHIFT(front) | DSIM_MAIN_HBP_SHIFT(back);
  129. writel(reg, dsim->reg_base + EXYNOS_DSIM_MHPORCH);
  130. }
  131. void exynos_mipi_dsi_set_main_disp_sync_area(struct mipi_dsim_device *dsim,
  132. unsigned int vert, unsigned int hori)
  133. {
  134. unsigned int reg;
  135. reg = (readl(dsim->reg_base + EXYNOS_DSIM_MSYNC)) &
  136. ~((DSIM_MAIN_VSA_MASK) | (DSIM_MAIN_HSA_MASK));
  137. reg |= (DSIM_MAIN_VSA_SHIFT(vert & 0x3ff) |
  138. DSIM_MAIN_HSA_SHIFT(hori));
  139. writel(reg, dsim->reg_base + EXYNOS_DSIM_MSYNC);
  140. }
  141. void exynos_mipi_dsi_set_sub_disp_resol(struct mipi_dsim_device *dsim,
  142. unsigned int vert, unsigned int hori)
  143. {
  144. unsigned int reg;
  145. reg = (readl(dsim->reg_base + EXYNOS_DSIM_SDRESOL)) &
  146. ~(DSIM_SUB_STANDY_MASK);
  147. writel(reg, dsim->reg_base + EXYNOS_DSIM_SDRESOL);
  148. reg &= ~(DSIM_SUB_VRESOL_MASK) | ~(DSIM_SUB_HRESOL_MASK);
  149. reg |= (DSIM_SUB_VRESOL_SHIFT(vert & 0x7ff) |
  150. DSIM_SUB_HRESOL_SHIFT(hori & 0x7ff));
  151. writel(reg, dsim->reg_base + EXYNOS_DSIM_SDRESOL);
  152. reg |= DSIM_SUB_STANDY_SHIFT(1);
  153. writel(reg, dsim->reg_base + EXYNOS_DSIM_SDRESOL);
  154. }
  155. void exynos_mipi_dsi_init_config(struct mipi_dsim_device *dsim)
  156. {
  157. struct mipi_dsim_config *dsim_config = dsim->dsim_config;
  158. unsigned int cfg = (readl(dsim->reg_base + EXYNOS_DSIM_CONFIG)) &
  159. ~((1 << 28) | (0x1f << 20) | (0x3 << 5));
  160. cfg = ((DSIM_AUTO_FLUSH(dsim_config->auto_flush)) |
  161. (DSIM_EOT_DISABLE(dsim_config->eot_disable)) |
  162. (DSIM_AUTO_MODE_SHIFT(dsim_config->auto_vertical_cnt)) |
  163. (DSIM_HSE_MODE_SHIFT(dsim_config->hse)) |
  164. (DSIM_HFP_MODE_SHIFT(dsim_config->hfp)) |
  165. (DSIM_HBP_MODE_SHIFT(dsim_config->hbp)) |
  166. (DSIM_HSA_MODE_SHIFT(dsim_config->hsa)) |
  167. (DSIM_NUM_OF_DATALANE_SHIFT(dsim_config->e_no_data_lane)));
  168. writel(cfg, dsim->reg_base + EXYNOS_DSIM_CONFIG);
  169. }
  170. void exynos_mipi_dsi_display_config(struct mipi_dsim_device *dsim,
  171. struct mipi_dsim_config *dsim_config)
  172. {
  173. u32 reg = (readl(dsim->reg_base + EXYNOS_DSIM_CONFIG)) &
  174. ~((0x3 << 26) | (1 << 25) | (0x3 << 18) | (0x7 << 12) |
  175. (0x3 << 16) | (0x7 << 8));
  176. if (dsim_config->e_interface == DSIM_VIDEO)
  177. reg |= (1 << 25);
  178. else if (dsim_config->e_interface == DSIM_COMMAND)
  179. reg &= ~(1 << 25);
  180. else {
  181. dev_err(dsim->dev, "unknown lcd type.\n");
  182. return;
  183. }
  184. /* main lcd */
  185. reg |= ((u8) (dsim_config->e_burst_mode) & 0x3) << 26 |
  186. ((u8) (dsim_config->e_virtual_ch) & 0x3) << 18 |
  187. ((u8) (dsim_config->e_pixel_format) & 0x7) << 12;
  188. writel(reg, dsim->reg_base + EXYNOS_DSIM_CONFIG);
  189. }
  190. void exynos_mipi_dsi_enable_lane(struct mipi_dsim_device *dsim, unsigned int lane,
  191. unsigned int enable)
  192. {
  193. unsigned int reg;
  194. reg = readl(dsim->reg_base + EXYNOS_DSIM_CONFIG);
  195. if (enable)
  196. reg |= DSIM_LANE_ENx(lane);
  197. else
  198. reg &= ~DSIM_LANE_ENx(lane);
  199. writel(reg, dsim->reg_base + EXYNOS_DSIM_CONFIG);
  200. }
  201. void exynos_mipi_dsi_set_data_lane_number(struct mipi_dsim_device *dsim,
  202. unsigned int count)
  203. {
  204. unsigned int cfg;
  205. /* get the data lane number. */
  206. cfg = DSIM_NUM_OF_DATALANE_SHIFT(count);
  207. writel(cfg, dsim->reg_base + EXYNOS_DSIM_CONFIG);
  208. }
  209. void exynos_mipi_dsi_enable_afc(struct mipi_dsim_device *dsim, unsigned int enable,
  210. unsigned int afc_code)
  211. {
  212. unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_PHYACCHR);
  213. if (enable) {
  214. reg |= (1 << 14);
  215. reg &= ~(0x7 << 5);
  216. reg |= (afc_code & 0x7) << 5;
  217. } else
  218. reg &= ~(1 << 14);
  219. writel(reg, dsim->reg_base + EXYNOS_DSIM_PHYACCHR);
  220. }
  221. void exynos_mipi_dsi_enable_pll_bypass(struct mipi_dsim_device *dsim,
  222. unsigned int enable)
  223. {
  224. unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_CLKCTRL)) &
  225. ~(DSIM_PLL_BYPASS_SHIFT(0x1));
  226. reg |= DSIM_PLL_BYPASS_SHIFT(enable);
  227. writel(reg, dsim->reg_base + EXYNOS_DSIM_CLKCTRL);
  228. }
  229. void exynos_mipi_dsi_set_pll_pms(struct mipi_dsim_device *dsim, unsigned int p,
  230. unsigned int m, unsigned int s)
  231. {
  232. unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_PLLCTRL);
  233. reg |= ((p & 0x3f) << 13) | ((m & 0x1ff) << 4) | ((s & 0x7) << 1);
  234. writel(reg, dsim->reg_base + EXYNOS_DSIM_PLLCTRL);
  235. }
  236. void exynos_mipi_dsi_pll_freq_band(struct mipi_dsim_device *dsim,
  237. unsigned int freq_band)
  238. {
  239. unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_PLLCTRL)) &
  240. ~(DSIM_FREQ_BAND_SHIFT(0x1f));
  241. reg |= DSIM_FREQ_BAND_SHIFT(freq_band & 0x1f);
  242. writel(reg, dsim->reg_base + EXYNOS_DSIM_PLLCTRL);
  243. }
  244. void exynos_mipi_dsi_pll_freq(struct mipi_dsim_device *dsim,
  245. unsigned int pre_divider, unsigned int main_divider,
  246. unsigned int scaler)
  247. {
  248. unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_PLLCTRL)) &
  249. ~(0x7ffff << 1);
  250. reg |= (pre_divider & 0x3f) << 13 | (main_divider & 0x1ff) << 4 |
  251. (scaler & 0x7) << 1;
  252. writel(reg, dsim->reg_base + EXYNOS_DSIM_PLLCTRL);
  253. }
  254. void exynos_mipi_dsi_pll_stable_time(struct mipi_dsim_device *dsim,
  255. unsigned int lock_time)
  256. {
  257. writel(lock_time, dsim->reg_base + EXYNOS_DSIM_PLLTMR);
  258. }
  259. void exynos_mipi_dsi_enable_pll(struct mipi_dsim_device *dsim, unsigned int enable)
  260. {
  261. unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_PLLCTRL)) &
  262. ~(DSIM_PLL_EN_SHIFT(0x1));
  263. reg |= DSIM_PLL_EN_SHIFT(enable & 0x1);
  264. writel(reg, dsim->reg_base + EXYNOS_DSIM_PLLCTRL);
  265. }
  266. void exynos_mipi_dsi_set_byte_clock_src(struct mipi_dsim_device *dsim,
  267. unsigned int src)
  268. {
  269. unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_CLKCTRL)) &
  270. ~(DSIM_BYTE_CLK_SRC_SHIFT(0x3));
  271. reg |= (DSIM_BYTE_CLK_SRC_SHIFT(src));
  272. writel(reg, dsim->reg_base + EXYNOS_DSIM_CLKCTRL);
  273. }
  274. void exynos_mipi_dsi_enable_byte_clock(struct mipi_dsim_device *dsim,
  275. unsigned int enable)
  276. {
  277. unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_CLKCTRL)) &
  278. ~(DSIM_BYTE_CLKEN_SHIFT(0x1));
  279. reg |= DSIM_BYTE_CLKEN_SHIFT(enable);
  280. writel(reg, dsim->reg_base + EXYNOS_DSIM_CLKCTRL);
  281. }
  282. void exynos_mipi_dsi_set_esc_clk_prs(struct mipi_dsim_device *dsim,
  283. unsigned int enable, unsigned int prs_val)
  284. {
  285. unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_CLKCTRL)) &
  286. ~(DSIM_ESC_CLKEN_SHIFT(0x1) | 0xffff);
  287. reg |= DSIM_ESC_CLKEN_SHIFT(enable);
  288. if (enable)
  289. reg |= prs_val;
  290. writel(reg, dsim->reg_base + EXYNOS_DSIM_CLKCTRL);
  291. }
  292. void exynos_mipi_dsi_enable_esc_clk_on_lane(struct mipi_dsim_device *dsim,
  293. unsigned int lane_sel, unsigned int enable)
  294. {
  295. unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_CLKCTRL);
  296. if (enable)
  297. reg |= DSIM_LANE_ESC_CLKEN(lane_sel);
  298. else
  299. reg &= ~DSIM_LANE_ESC_CLKEN(lane_sel);
  300. writel(reg, dsim->reg_base + EXYNOS_DSIM_CLKCTRL);
  301. }
  302. void exynos_mipi_dsi_force_dphy_stop_state(struct mipi_dsim_device *dsim,
  303. unsigned int enable)
  304. {
  305. unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_ESCMODE)) &
  306. ~(DSIM_FORCE_STOP_STATE_SHIFT(0x1));
  307. reg |= (DSIM_FORCE_STOP_STATE_SHIFT(enable & 0x1));
  308. writel(reg, dsim->reg_base + EXYNOS_DSIM_ESCMODE);
  309. }
  310. unsigned int exynos_mipi_dsi_is_lane_state(struct mipi_dsim_device *dsim)
  311. {
  312. unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_STATUS);
  313. /**
  314. * check clock and data lane states.
  315. * if MIPI-DSI controller was enabled at bootloader then
  316. * TX_READY_HS_CLK is enabled otherwise STOP_STATE_CLK.
  317. * so it should be checked for two case.
  318. */
  319. if ((reg & DSIM_STOP_STATE_DAT(0xf)) &&
  320. ((reg & DSIM_STOP_STATE_CLK) ||
  321. (reg & DSIM_TX_READY_HS_CLK)))
  322. return 1;
  323. return 0;
  324. }
  325. void exynos_mipi_dsi_set_stop_state_counter(struct mipi_dsim_device *dsim,
  326. unsigned int cnt_val)
  327. {
  328. unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_ESCMODE)) &
  329. ~(DSIM_STOP_STATE_CNT_SHIFT(0x7ff));
  330. reg |= (DSIM_STOP_STATE_CNT_SHIFT(cnt_val & 0x7ff));
  331. writel(reg, dsim->reg_base + EXYNOS_DSIM_ESCMODE);
  332. }
  333. void exynos_mipi_dsi_set_bta_timeout(struct mipi_dsim_device *dsim,
  334. unsigned int timeout)
  335. {
  336. unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_TIMEOUT)) &
  337. ~(DSIM_BTA_TOUT_SHIFT(0xff));
  338. reg |= (DSIM_BTA_TOUT_SHIFT(timeout));
  339. writel(reg, dsim->reg_base + EXYNOS_DSIM_TIMEOUT);
  340. }
  341. void exynos_mipi_dsi_set_lpdr_timeout(struct mipi_dsim_device *dsim,
  342. unsigned int timeout)
  343. {
  344. unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_TIMEOUT)) &
  345. ~(DSIM_LPDR_TOUT_SHIFT(0xffff));
  346. reg |= (DSIM_LPDR_TOUT_SHIFT(timeout));
  347. writel(reg, dsim->reg_base + EXYNOS_DSIM_TIMEOUT);
  348. }
  349. void exynos_mipi_dsi_set_cpu_transfer_mode(struct mipi_dsim_device *dsim,
  350. unsigned int lp)
  351. {
  352. unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_ESCMODE);
  353. reg &= ~DSIM_CMD_LPDT_LP;
  354. if (lp)
  355. reg |= DSIM_CMD_LPDT_LP;
  356. writel(reg, dsim->reg_base + EXYNOS_DSIM_ESCMODE);
  357. }
  358. void exynos_mipi_dsi_set_lcdc_transfer_mode(struct mipi_dsim_device *dsim,
  359. unsigned int lp)
  360. {
  361. unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_ESCMODE);
  362. reg &= ~DSIM_TX_LPDT_LP;
  363. if (lp)
  364. reg |= DSIM_TX_LPDT_LP;
  365. writel(reg, dsim->reg_base + EXYNOS_DSIM_ESCMODE);
  366. }
  367. void exynos_mipi_dsi_enable_hs_clock(struct mipi_dsim_device *dsim,
  368. unsigned int enable)
  369. {
  370. unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_CLKCTRL)) &
  371. ~(DSIM_TX_REQUEST_HSCLK_SHIFT(0x1));
  372. reg |= DSIM_TX_REQUEST_HSCLK_SHIFT(enable);
  373. writel(reg, dsim->reg_base + EXYNOS_DSIM_CLKCTRL);
  374. }
  375. void exynos_mipi_dsi_dp_dn_swap(struct mipi_dsim_device *dsim,
  376. unsigned int swap_en)
  377. {
  378. unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_PHYACCHR1);
  379. reg &= ~(0x3 << 0);
  380. reg |= (swap_en & 0x3) << 0;
  381. writel(reg, dsim->reg_base + EXYNOS_DSIM_PHYACCHR1);
  382. }
  383. void exynos_mipi_dsi_hs_zero_ctrl(struct mipi_dsim_device *dsim,
  384. unsigned int hs_zero)
  385. {
  386. unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_PLLCTRL)) &
  387. ~(0xf << 28);
  388. reg |= ((hs_zero & 0xf) << 28);
  389. writel(reg, dsim->reg_base + EXYNOS_DSIM_PLLCTRL);
  390. }
  391. void exynos_mipi_dsi_prep_ctrl(struct mipi_dsim_device *dsim, unsigned int prep)
  392. {
  393. unsigned int reg = (readl(dsim->reg_base + EXYNOS_DSIM_PLLCTRL)) &
  394. ~(0x7 << 20);
  395. reg |= ((prep & 0x7) << 20);
  396. writel(reg, dsim->reg_base + EXYNOS_DSIM_PLLCTRL);
  397. }
  398. unsigned int exynos_mipi_dsi_read_interrupt(struct mipi_dsim_device *dsim)
  399. {
  400. return readl(dsim->reg_base + EXYNOS_DSIM_INTSRC);
  401. }
  402. void exynos_mipi_dsi_clear_interrupt(struct mipi_dsim_device *dsim,
  403. unsigned int src)
  404. {
  405. unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_INTSRC);
  406. reg |= src;
  407. writel(reg, dsim->reg_base + EXYNOS_DSIM_INTSRC);
  408. }
  409. void exynos_mipi_dsi_set_interrupt(struct mipi_dsim_device *dsim,
  410. unsigned int src, unsigned int enable)
  411. {
  412. unsigned int reg = 0;
  413. if (enable)
  414. reg |= src;
  415. else
  416. reg &= ~src;
  417. writel(reg, dsim->reg_base + EXYNOS_DSIM_INTSRC);
  418. }
  419. unsigned int exynos_mipi_dsi_is_pll_stable(struct mipi_dsim_device *dsim)
  420. {
  421. unsigned int reg;
  422. reg = readl(dsim->reg_base + EXYNOS_DSIM_STATUS);
  423. return reg & (1 << 31) ? 1 : 0;
  424. }
  425. unsigned int exynos_mipi_dsi_get_fifo_state(struct mipi_dsim_device *dsim)
  426. {
  427. return readl(dsim->reg_base + EXYNOS_DSIM_FIFOCTRL) & ~(0x1f);
  428. }
  429. void exynos_mipi_dsi_wr_tx_header(struct mipi_dsim_device *dsim,
  430. unsigned int di, unsigned int data0, unsigned int data1)
  431. {
  432. unsigned int reg = (data1 << 16) | (data0 << 8) | ((di & 0x3f) << 0);
  433. writel(reg, dsim->reg_base + EXYNOS_DSIM_PKTHDR);
  434. }
  435. void exynos_mipi_dsi_rd_tx_header(struct mipi_dsim_device *dsim,
  436. unsigned int di, unsigned int data0)
  437. {
  438. unsigned int reg = (data0 << 8) | (di << 0);
  439. writel(reg, dsim->reg_base + EXYNOS_DSIM_PKTHDR);
  440. }
  441. unsigned int exynos_mipi_dsi_rd_rx_fifo(struct mipi_dsim_device *dsim)
  442. {
  443. return readl(dsim->reg_base + EXYNOS_DSIM_RXFIFO);
  444. }
  445. unsigned int _exynos_mipi_dsi_get_frame_done_status(struct mipi_dsim_device *dsim)
  446. {
  447. unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_INTSRC);
  448. return (reg & INTSRC_FRAME_DONE) ? 1 : 0;
  449. }
  450. void _exynos_mipi_dsi_clear_frame_done(struct mipi_dsim_device *dsim)
  451. {
  452. unsigned int reg = readl(dsim->reg_base + EXYNOS_DSIM_INTSRC);
  453. writel(reg | INTSRC_FRAME_DONE, dsim->reg_base +
  454. EXYNOS_DSIM_INTSRC);
  455. }
  456. void exynos_mipi_dsi_wr_tx_data(struct mipi_dsim_device *dsim,
  457. unsigned int tx_data)
  458. {
  459. writel(tx_data, dsim->reg_base + EXYNOS_DSIM_PAYLOAD);
  460. }