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