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