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