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