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