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