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