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