rk fb: add consider vop full mutile area for vsync register check
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / lcdc / rk3036_lcdc.c
1 /*
2  * drivers/video/rockchip/lcdc/rk3036_lcdc.c
3  *
4  * Copyright (C) 2014 ROCKCHIP, Inc.
5  * Author:zhengyang<zhengyang@rock-chips.com>
6  * This software is licensed under the terms of the GNU General Public
7  * License version 2, as published by the Free Software Foundation, and
8  * may be copied, distributed, and modified under those terms.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  */
16
17 #include <linux/module.h>
18 #include <linux/kernel.h>
19 #include <linux/errno.h>
20 #include <linux/string.h>
21 #include <linux/mm.h>
22 #include <linux/slab.h>
23 #include <linux/device.h>
24 #include <linux/delay.h>
25 #include <linux/init.h>
26 #include <linux/interrupt.h>
27 #include <linux/platform_device.h>
28 #include <linux/clk.h>
29 #include <asm/div64.h>
30 #include <linux/uaccess.h>
31 #include <linux/rockchip/cpu.h>
32 #include <linux/rockchip/iomap.h>
33 #include <linux/rockchip/grf.h>
34 #include <linux/rockchip/common.h>
35 #include <dt-bindings/clock/rk_system_status.h>
36 #if defined(CONFIG_ION_ROCKCHIP)
37 #include <linux/rockchip-iovmm.h>
38 #endif
39 #include "rk3036_lcdc.h"
40
41 static int dbg_thresd;
42 module_param(dbg_thresd, int, S_IRUGO | S_IWUSR);
43
44 #define DBG(level, x...) do {                   \
45         if (unlikely(dbg_thresd >= level))      \
46                 dev_info(dev_drv->dev, x);              \
47         } while (0)
48
49 #define grf_writel(offset, v)   do { \
50         writel_relaxed(v, RK_GRF_VIRT + offset); \
51         dsb(); \
52         } while (0)
53
54 static struct rk_lcdc_win lcdc_win[] = {
55         [0] = {
56                .name = "win0",
57                .id = 0,
58                .support_3d = false,
59                },
60         [1] = {
61                .name = "win1",
62                .id = 1,
63                .support_3d = false,
64                },
65         [2] = {
66                .name = "hwc",
67                .id = 2,
68                .support_3d = false,
69                },
70 };
71
72 static irqreturn_t rk3036_lcdc_isr(int irq, void *dev_id)
73 {
74         struct lcdc_device *lcdc_dev =
75             (struct lcdc_device *)dev_id;
76         ktime_t timestamp = ktime_get();
77         u32 int_reg = lcdc_readl(lcdc_dev, INT_STATUS);
78
79         if (int_reg & m_FS_INT_STA) {
80                 timestamp = ktime_get();
81                 lcdc_msk_reg(lcdc_dev, INT_STATUS, m_FS_INT_CLEAR,
82                              v_FS_INT_CLEAR(1));
83                 /*if (lcdc_dev->driver.wait_fs) {*/
84                 if (0) {
85                         spin_lock(&(lcdc_dev->driver.cpl_lock));
86                         complete(&(lcdc_dev->driver.frame_done));
87                         spin_unlock(&(lcdc_dev->driver.cpl_lock));
88                 }
89                 lcdc_dev->driver.vsync_info.timestamp = timestamp;
90                 wake_up_interruptible_all(&lcdc_dev->driver.vsync_info.wait);
91
92         } else if (int_reg & m_LF_INT_STA) {
93                 lcdc_msk_reg(lcdc_dev, INT_STATUS, m_LF_INT_CLEAR,
94                              v_LF_INT_CLEAR(1));
95         }
96         return IRQ_HANDLED;
97 }
98
99 static int rk3036_lcdc_clk_enable(struct lcdc_device *lcdc_dev)
100 {
101 #ifdef CONFIG_RK_FPGA
102         lcdc_dev->clk_on = 1;
103         return 0;
104 #endif
105         if (!lcdc_dev->clk_on) {
106                 clk_prepare_enable(lcdc_dev->hclk);
107                 clk_prepare_enable(lcdc_dev->dclk);
108                 clk_prepare_enable(lcdc_dev->aclk);
109 /*              clk_prepare_enable(lcdc_dev->pd);*/
110                 spin_lock(&lcdc_dev->reg_lock);
111                 lcdc_dev->clk_on = 1;
112                 spin_unlock(&lcdc_dev->reg_lock);
113         }
114
115         return 0;
116 }
117
118 static int rk3036_lcdc_clk_disable(struct lcdc_device *lcdc_dev)
119 {
120 #ifdef CONFIG_RK_FPGA
121         lcdc_dev->clk_on = 0;
122         return 0;
123 #endif
124         if (lcdc_dev->clk_on) {
125                 spin_lock(&lcdc_dev->reg_lock);
126                 lcdc_dev->clk_on = 0;
127                 spin_unlock(&lcdc_dev->reg_lock);
128                 mdelay(25);
129                 clk_disable_unprepare(lcdc_dev->dclk);
130                 clk_disable_unprepare(lcdc_dev->hclk);
131                 clk_disable_unprepare(lcdc_dev->aclk);
132 /*              clk_disable_unprepare(lcdc_dev->pd);*/
133         }
134
135         return 0;
136 }
137
138 static int rk3036_lcdc_enable_irq(struct rk_lcdc_driver *dev_drv)
139 {
140         u32 mask, val;
141         struct lcdc_device *lcdc_dev = container_of(dev_drv,
142                                         struct lcdc_device, driver);
143         mask = m_FS_INT_CLEAR | m_FS_INT_EN;
144         val = v_FS_INT_CLEAR(1) | v_FS_INT_EN(1);
145         lcdc_msk_reg(lcdc_dev, INT_STATUS, mask, val);
146         return 0;
147 }
148 /*
149 static int rk3036_lcdc_disable_irq(struct lcdc_device *lcdc_dev)
150 {
151         u32 mask, val;
152
153         spin_lock(&lcdc_dev->reg_lock);
154         if (likely(lcdc_dev->clk_on)) {
155                 mask = m_FS_INT_CLEAR | m_FS_INT_EN;
156                 val = v_FS_INT_CLEAR(0) | v_FS_INT_EN(0);
157                 lcdc_msk_reg(lcdc_dev, INT_STATUS, mask, val);
158                 spin_unlock(&lcdc_dev->reg_lock);
159         } else {
160                 spin_unlock(&lcdc_dev->reg_lock);
161         }
162         mdelay(1);
163         return 0;
164 }*/
165
166 static void rk_lcdc_read_reg_defalut_cfg(struct lcdc_device
167                                              *lcdc_dev)
168 {
169         int reg = 0;
170         u32 value = 0;
171
172         spin_lock(&lcdc_dev->reg_lock);
173         for (reg = 0; reg < 0xe0; reg += 4)
174                 value = lcdc_readl(lcdc_dev, reg);
175
176         spin_unlock(&lcdc_dev->reg_lock);
177 }
178
179 static int rk3036_lcdc_alpha_cfg(struct lcdc_device *lcdc_dev)
180 {
181         int win0_top = 0;
182         u32 mask, val;
183         enum data_format win0_format = lcdc_dev->driver.win[0]->area[0].format;
184         enum data_format win1_format = lcdc_dev->driver.win[1]->area[0].format;
185
186         int win0_alpha_en = ((win0_format == ARGB888) ||
187                                 (win0_format == ABGR888)) ? 1 : 0;
188         int win1_alpha_en = ((win1_format == ARGB888) ||
189                                 (win1_format == ABGR888)) ? 1 : 0;
190         int atv_layer_cnt = lcdc_dev->driver.win[0]->state +
191                         lcdc_dev->driver.win[1]->state;
192         u32 *_pv = (u32 *)lcdc_dev->regsbak;
193
194         _pv += (DSP_CTRL0 >> 2);
195         win0_top = ((*_pv) & (m_WIN0_TOP)) >> 8;
196
197         if (win0_top && (atv_layer_cnt >= 2) && (win0_alpha_en)) {
198                 mask =  m_WIN0_ALPHA_EN | m_WIN1_ALPHA_EN |
199                         m_WIN1_PREMUL_SCALE;
200                 val = v_WIN0_ALPHA_EN(1) | v_WIN1_ALPHA_EN(0) |
201                         v_WIN1_PREMUL_SCALE(0);
202                 lcdc_msk_reg(lcdc_dev, ALPHA_CTRL, mask, val);
203
204                 mask = m_WIN0_ALPHA_MODE | m_PREMUL_ALPHA_ENABLE |
205                         m_ALPHA_MODE_SEL1;
206                 val = v_WIN0_ALPHA_MODE(1) | v_PREMUL_ALPHA_ENABLE(1) |
207                         v_ALPHA_MODE_SEL1(0);
208                 lcdc_msk_reg(lcdc_dev, DSP_CTRL0, mask, val);
209         } else if ((!win0_top) && (atv_layer_cnt >= 2) &&
210                    (win1_alpha_en)) {
211                 mask =  m_WIN0_ALPHA_EN | m_WIN1_ALPHA_EN |
212                         m_WIN1_PREMUL_SCALE;
213                 val = v_WIN0_ALPHA_EN(0) | v_WIN1_ALPHA_EN(1) |
214                         v_WIN1_PREMUL_SCALE(0);
215                 lcdc_msk_reg(lcdc_dev, ALPHA_CTRL, mask, val);
216
217                 mask = m_WIN1_ALPHA_MODE | m_PREMUL_ALPHA_ENABLE |
218                         m_ALPHA_MODE_SEL1;
219                 val = v_WIN1_ALPHA_MODE(1) | v_PREMUL_ALPHA_ENABLE(1) |
220                         v_ALPHA_MODE_SEL1(0);
221                 lcdc_msk_reg(lcdc_dev, DSP_CTRL0, mask, val);
222         } else {
223                 mask = m_WIN0_ALPHA_EN | m_WIN1_ALPHA_EN;
224                 val = v_WIN0_ALPHA_EN(0) | v_WIN1_ALPHA_EN(0);
225                 lcdc_msk_reg(lcdc_dev, ALPHA_CTRL, mask, val);
226         }
227
228         if (lcdc_dev->driver.win[2]->state == 1) {
229                 mask =  m_HWC_ALPAH_EN;
230                 val = v_HWC_ALPAH_EN(1);
231                 lcdc_msk_reg(lcdc_dev, ALPHA_CTRL, mask, val);
232
233                 mask =  m_HWC_ALPHA_MODE;
234                 val = v_HWC_ALPHA_MODE(1);
235                 lcdc_msk_reg(lcdc_dev, DSP_CTRL0, mask, val);
236         } else {
237                 mask =  m_HWC_ALPAH_EN;
238                 val = v_HWC_ALPAH_EN(0);
239                 lcdc_msk_reg(lcdc_dev, ALPHA_CTRL, mask, val);
240         }
241
242         return 0;
243 }
244
245 static void lcdc_layer_update_regs(struct lcdc_device *lcdc_dev,
246                                    struct rk_lcdc_win *win)
247 {
248         u32 mask, val;
249         int hwc_size;
250
251         if (win->state == 1) {
252                 if (win->id == 0) {
253                         mask = m_WIN0_EN | m_WIN0_FORMAT | m_WIN0_RB_SWAP;
254                         val = v_WIN0_EN(win->state) |
255                               v_WIN0_FORMAT(win->area[0].fmt_cfg) |
256                               v_WIN0_RB_SWAP(win->area[0].swap_rb);
257                         lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
258                         lcdc_writel(lcdc_dev, WIN0_SCL_FACTOR_YRGB,
259                                     v_X_SCL_FACTOR(win->scale_yrgb_x) |
260                                     v_Y_SCL_FACTOR(win->scale_yrgb_y));
261                         lcdc_writel(lcdc_dev, WIN0_SCL_FACTOR_CBR,
262                                     v_X_SCL_FACTOR(win->scale_cbcr_x) |
263                                     v_Y_SCL_FACTOR(win->scale_cbcr_y));
264                         lcdc_msk_reg(lcdc_dev, WIN0_VIR,
265                                      m_YRGB_VIR | m_CBBR_VIR,
266                                      v_YRGB_VIR(win->area[0].y_vir_stride) |
267                                      v_CBBR_VIR(win->area[0].uv_vir_stride));
268                         lcdc_writel(lcdc_dev, WIN0_ACT_INFO,
269                                     v_ACT_WIDTH(win->area[0].xact) |
270                                     v_ACT_HEIGHT(win->area[0].yact));
271                         lcdc_writel(lcdc_dev, WIN0_DSP_ST,
272                                     v_DSP_STX(win->area[0].dsp_stx) |
273                                     v_DSP_STY(win->area[0].dsp_sty));
274                         lcdc_writel(lcdc_dev, WIN0_DSP_INFO,
275                                     v_DSP_WIDTH(win->post_cfg.xsize) |
276                                     v_DSP_HEIGHT(win->post_cfg.ysize));
277
278                         lcdc_writel(lcdc_dev, WIN0_YRGB_MST,
279                                     win->area[0].y_addr);
280                         lcdc_writel(lcdc_dev, WIN0_CBR_MST,
281                                     win->area[0].uv_addr);
282                 } else if (win->id == 1) {
283                         mask = m_WIN1_EN | m_WIN1_FORMAT | m_WIN1_RB_SWAP;
284                         val = v_WIN1_EN(win->state) |
285                               v_WIN1_FORMAT(win->area[0].fmt_cfg) |
286                               v_WIN1_RB_SWAP(win->area[0].swap_rb);
287                         lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
288                         lcdc_writel(lcdc_dev, WIN1_SCL_FACTOR_YRGB,
289                                     v_X_SCL_FACTOR(win->scale_yrgb_x) |
290                                     v_Y_SCL_FACTOR(win->scale_yrgb_y));
291
292                         lcdc_msk_reg(lcdc_dev, WIN1_VIR, m_YRGB_VIR,
293                                      v_YRGB_VIR(win->area[0].y_vir_stride));
294                         lcdc_writel(lcdc_dev, WIN1_ACT_INFO,
295                                     v_ACT_WIDTH(win->area[0].xact) |
296                                     v_ACT_HEIGHT(win->area[0].yact));
297                         lcdc_writel(lcdc_dev, WIN1_DSP_INFO,
298                                     v_DSP_WIDTH(win->post_cfg.xsize) |
299                                     v_DSP_HEIGHT(win->post_cfg.ysize));
300                         lcdc_writel(lcdc_dev, WIN1_DSP_ST,
301                                     v_DSP_STX(win->area[0].dsp_stx) |
302                                     v_DSP_STY(win->area[0].dsp_sty));
303                         lcdc_writel(lcdc_dev, WIN1_MST, win->area[0].y_addr);
304                 } else if (win->id == 2) {
305                         mask = m_HWC_EN | m_HWC_LODAD_EN;
306                         val = v_HWC_EN(win->state) | v_HWC_LODAD_EN(1);
307                         lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val);
308                         if ((win->area[0].xsize == 32) &&
309                             (win->area[0].ysize == 32))
310                                 hwc_size = 0;
311                         else if ((win->area[0].xsize == 64) &&
312                                  (win->area[0].ysize == 64))
313                                 hwc_size = 1;
314                         else
315                                 dev_err(lcdc_dev->dev,
316                                         "unsupport hwc size:x=%d,y=%d\n",
317                                         win->area[0].xsize,
318                                         win->area[0].ysize);
319                         lcdc_writel(lcdc_dev, HWC_DSP_ST,
320                                     v_DSP_STX(win->area[0].dsp_stx) |
321                                     v_DSP_STY(win->area[0].dsp_sty));
322                         lcdc_writel(lcdc_dev, HWC_MST, win->area[0].y_addr);
323                 }
324         } else {
325                 win->area[0].y_addr = 0;
326                 win->area[0].uv_addr = 0;
327                 if (win->id == 0) {
328                         lcdc_msk_reg(lcdc_dev,
329                                      SYS_CTRL, m_WIN0_EN, v_WIN0_EN(0));
330                         lcdc_writel(lcdc_dev, WIN0_YRGB_MST,
331                                     win->area[0].y_addr);
332                         lcdc_writel(lcdc_dev, WIN0_CBR_MST,
333                                     win->area[0].uv_addr);
334                 } else if (win->id == 1) {
335                         lcdc_msk_reg(lcdc_dev,
336                                      SYS_CTRL, m_WIN1_EN, v_WIN1_EN(0));
337                         lcdc_writel(lcdc_dev, WIN1_MST, win->area[0].y_addr);
338                 } else if (win->id == 2) {
339                         lcdc_msk_reg(lcdc_dev,
340                                      SYS_CTRL, m_HWC_EN | m_HWC_LODAD_EN,
341                                      v_HWC_EN(0) | v_HWC_LODAD_EN(0));
342                         lcdc_writel(lcdc_dev, HWC_MST, win->area[0].y_addr);
343                 }
344         }
345         rk3036_lcdc_alpha_cfg(lcdc_dev);
346 }
347
348 static void lcdc_layer_enable(struct lcdc_device *lcdc_dev,
349                               unsigned int win_id, bool open)
350 {
351         spin_lock(&lcdc_dev->reg_lock);
352         if (likely(lcdc_dev->clk_on) &&
353             lcdc_dev->driver.win[win_id]->state != open) {
354                 if (open) {
355                         if (!lcdc_dev->atv_layer_cnt) {
356                                 dev_info(lcdc_dev->dev,
357                                          "wakeup from standby!\n");
358                                 lcdc_dev->standby = 0;
359                         }
360                         lcdc_dev->atv_layer_cnt |= (1 << win_id);
361                 } else if ((lcdc_dev->atv_layer_cnt & (1 << win_id)) && (!open)) {
362                         lcdc_dev->atv_layer_cnt &= ~(1 << win_id);
363                 }
364                 lcdc_dev->driver.win[win_id]->state = open;
365                 if (!open) {
366                         lcdc_layer_update_regs(lcdc_dev,
367                                                lcdc_dev->driver.win[win_id]);
368                         lcdc_cfg_done(lcdc_dev);
369                 }
370                 /*if no layer used,disable lcdc*/
371                 if (!lcdc_dev->atv_layer_cnt) {
372                         dev_info(lcdc_dev->dev,
373                                  "no layer is used, go to standby!\n");
374                         lcdc_dev->standby = 1;
375                 }
376         }
377         spin_unlock(&lcdc_dev->reg_lock);
378 }
379 /*
380 static int rk3036_lcdc_reg_update(struct rk_lcdc_driver *dev_drv)
381 {
382         struct lcdc_device *lcdc_dev =
383             container_of(dev_drv, struct lcdc_device, driver);
384         struct rk_lcdc_win *win0 = lcdc_dev->driver.win[0];
385         struct rk_lcdc_win *win1 = lcdc_dev->driver.win[1];
386         int timeout;
387         unsigned long flags;
388
389         spin_lock(&lcdc_dev->reg_lock);
390         if (likely(lcdc_dev->clk_on)) {
391                 lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_LCDC_STANDBY,
392                              v_LCDC_STANDBY(lcdc_dev->standby));
393                 lcdc_layer_update_regs(lcdc_dev, win0);
394                 lcdc_layer_update_regs(lcdc_dev, win1);
395                 rk3036_lcdc_alpha_cfg(lcdc_dev);
396                 lcdc_cfg_done(lcdc_dev);
397         }
398         spin_unlock(&lcdc_dev->reg_lock);
399         if (0) {
400                 spin_lock_irqsave(&dev_drv->cpl_lock, flags);
401                 init_completion(&dev_drv->frame_done);
402                 spin_unlock_irqrestore(&dev_drv->cpl_lock, flags);
403                 timeout = wait_for_completion_timeout(&dev_drv->frame_done,
404                                                       msecs_to_jiffies
405                                                       (dev_drv->cur_screen->ft
406                                                        + 5));
407                 if (!timeout && (!dev_drv->frame_done.done)) {
408                         dev_warn(lcdc_dev->dev,
409                                  "wait for new frame start time out!\n");
410                         return -ETIMEDOUT;
411                 }
412         }
413         DBG(2, "%s for lcdc%d\n", __func__, lcdc_dev->id);
414         return 0;
415 }
416 */
417 static void rk3036_lcdc_reg_restore(struct lcdc_device *lcdc_dev)
418 {
419         memcpy((u8 *)lcdc_dev->regs, (u8 *)lcdc_dev->regsbak, 0xe0);
420 }
421
422 static void rk3036_lcdc_mmu_en(struct rk_lcdc_driver *dev_drv)
423 {
424         u32 mask, val;
425         struct lcdc_device *lcdc_dev =
426             container_of(dev_drv, struct lcdc_device, driver);
427
428         /*spin_lock(&lcdc_dev->reg_lock);*/
429         if (likely(lcdc_dev->clk_on)) {
430                 mask = m_MMU_EN | m_AXI_MAX_OUTSTANDING_EN |
431                         m_AXI_OUTSTANDING_MAX_NUM;
432                 val = v_MMU_EN(1) | v_AXI_OUTSTANDING_MAX_NUM(31) |
433                         v_AXI_MAX_OUTSTANDING_EN(1);
434                 lcdc_msk_reg(lcdc_dev, AXI_BUS_CTRL, mask, val);
435         }
436         /*spin_unlock(&lcdc_dev->reg_lock);*/
437 }
438
439 static int rk3036_lcdc_set_hwc_lut(struct rk_lcdc_driver *dev_drv,
440                                    int *hwc_lut, int mode)
441 {
442         int i = 0;
443         int __iomem *c;
444         int v;
445         int len = 256*4;
446
447         struct lcdc_device *lcdc_dev =
448                         container_of(dev_drv, struct lcdc_device, driver);
449         if (dev_drv->hwc_lut == NULL)
450                 dev_drv->hwc_lut = devm_kzalloc(lcdc_dev->dev, len, GFP_KERNEL);
451
452         spin_lock(&lcdc_dev->reg_lock);
453         lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_HWC_LUT_EN, v_HWC_LUT_EN(0));
454         lcdc_cfg_done(lcdc_dev);
455         mdelay(25);
456         for (i = 0; i < 256; i++) {
457                 if (mode == 1)
458                         dev_drv->hwc_lut[i] = hwc_lut[i];
459                 v = dev_drv->hwc_lut[i];
460                 c = lcdc_dev->hwc_lut_addr_base + i;
461                 writel_relaxed(v, c);
462         }
463         lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_HWC_LUT_EN, v_HWC_LUT_EN(1));
464         lcdc_cfg_done(lcdc_dev);
465         spin_unlock(&lcdc_dev->reg_lock);
466         return 0;
467 }
468
469 #if 0
470 static int rk3036_lcdc_set_dclk(struct rk_lcdc_driver *dev_drv)
471 {
472 #ifdef CONFIG_RK_FPGA
473         return 0;
474 #endif
475         int ret, fps;
476         struct lcdc_device *lcdc_dev =
477             container_of(dev_drv, struct lcdc_device, driver);
478         struct rk_screen *screen = dev_drv->cur_screen;
479
480         ret = clk_set_rate(lcdc_dev->dclk, screen->mode.pixclock);
481         if (ret)
482                 dev_err(dev_drv->dev,
483                         "set lcdc%d dclk failed\n", lcdc_dev->id);
484         lcdc_dev->pixclock =
485                  div_u64(1000000000000llu, clk_get_rate(lcdc_dev->dclk));
486         lcdc_dev->driver.pixclock = lcdc_dev->pixclock;
487
488         fps = rk_fb_calc_fps(screen, lcdc_dev->pixclock);
489         screen->ft = 1000 / fps;
490         dev_info(lcdc_dev->dev, "%s: dclk:%lu>>fps:%d ",
491                  lcdc_dev->driver.name, clk_get_rate(lcdc_dev->dclk), fps);
492         return 0;
493 }
494 #endif
495 /********do basic init*********/
496 static int rk3036_lcdc_pre_init(struct rk_lcdc_driver *dev_drv)
497 {
498         struct lcdc_device *lcdc_dev = container_of(dev_drv,
499                                 struct lcdc_device, driver);
500
501         if (lcdc_dev->pre_init)
502                 return 0;
503         lcdc_dev->hclk = devm_clk_get(lcdc_dev->dev, "hclk_lcdc");
504         lcdc_dev->aclk = devm_clk_get(lcdc_dev->dev, "aclk_lcdc");
505         lcdc_dev->dclk = devm_clk_get(lcdc_dev->dev, "dclk_lcdc");
506 /*      lcdc_dev->pd   = devm_clk_get(lcdc_dev->dev, "pd_lcdc"); */
507
508         if (/*IS_ERR(lcdc_dev->pd) ||*/ (IS_ERR(lcdc_dev->aclk)) ||
509             (IS_ERR(lcdc_dev->dclk)) || (IS_ERR(lcdc_dev->hclk))) {
510                 dev_err(lcdc_dev->dev, "failed to get lcdc%d clk source\n",
511                         lcdc_dev->id);
512         }
513
514         rk_disp_pwr_enable(dev_drv);
515         rk3036_lcdc_clk_enable(lcdc_dev);
516
517         /*backup reg config at uboot*/
518         rk_lcdc_read_reg_defalut_cfg(lcdc_dev);
519         if (lcdc_readl(lcdc_dev, AXI_BUS_CTRL) & m_TVE_DAC_DCLK_EN)
520                 dev_drv->cur_screen->type = SCREEN_TVOUT;
521
522         lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_AUTO_GATING_EN,
523                      v_AUTO_GATING_EN(0));
524         lcdc_cfg_done(lcdc_dev);
525         if (dev_drv->iommu_enabled)
526                 /*disable win0 to workaround iommu pagefault*/
527                 lcdc_layer_enable(lcdc_dev, 0, 0);
528         lcdc_dev->pre_init = true;
529
530         return 0;
531 }
532
533 static int rk3036_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen)
534 {
535         int ret = -EINVAL;
536         int fps;
537         u16 face = 0;
538         struct lcdc_device *lcdc_dev = container_of(dev_drv,
539                                                 struct lcdc_device, driver);
540         struct rk_screen *screen = dev_drv->cur_screen;
541         u16 right_margin = screen->mode.right_margin;
542         u16 left_margin = screen->mode.left_margin;
543         u16 lower_margin = screen->mode.lower_margin;
544         u16 upper_margin = screen->mode.upper_margin;
545         u16 x_res = screen->mode.xres;
546         u16 y_res = screen->mode.yres;
547         u32 mask, val;
548
549         spin_lock(&lcdc_dev->reg_lock);
550         if (likely(lcdc_dev->clk_on)) {
551                 switch (screen->type) {
552                 case SCREEN_HDMI:
553                         mask = m_HDMI_DCLK_EN;
554                         val = v_HDMI_DCLK_EN(1);
555                         if (screen->pixelrepeat) {
556                                 mask |= m_CORE_CLK_DIV_EN;
557                                 val |= v_CORE_CLK_DIV_EN(1);
558                         } else {
559                                 mask |= m_CORE_CLK_DIV_EN;
560                                 val |= v_CORE_CLK_DIV_EN(0);
561                         }
562                         lcdc_msk_reg(lcdc_dev, AXI_BUS_CTRL, mask, val);
563                         mask = (1 << 4) | (1 << 5) | (1 << 6);
564                         val = (screen->pin_hsync << 4) |
565                                 (screen->pin_vsync << 5) |
566                                 (screen->pin_den << 6);
567                         grf_writel(RK3036_GRF_SOC_CON2, (mask << 16) | val);
568                         break;
569                 case SCREEN_TVOUT:
570                         mask = m_TVE_DAC_DCLK_EN;
571                         val = v_TVE_DAC_DCLK_EN(1);
572                         if (screen->pixelrepeat) {
573                                 mask |= m_CORE_CLK_DIV_EN;
574                                 val |= v_CORE_CLK_DIV_EN(1);
575                         } else {
576                                 mask |= m_CORE_CLK_DIV_EN;
577                                 val |= v_CORE_CLK_DIV_EN(0);
578                         }
579                         lcdc_msk_reg(lcdc_dev, AXI_BUS_CTRL, mask, val);
580                         if ((x_res == 720) && (y_res == 576)) {
581                                 lcdc_msk_reg(lcdc_dev, DSP_CTRL0,
582                                              m_TVE_MODE, v_TVE_MODE(TV_PAL));
583                         } else if ((x_res == 720) && (y_res == 480)) {
584                                 lcdc_msk_reg(lcdc_dev, DSP_CTRL0,
585                                              m_TVE_MODE, v_TVE_MODE(TV_NTSC));
586                         } else {
587                                 dev_err(lcdc_dev->dev,
588                                         "unsupported video timing!\n");
589                                 return -1;
590                         }
591                         break;
592                 default:
593                         dev_err(lcdc_dev->dev, "un supported interface!\n");
594                         break;
595                 }
596
597                 mask = m_DSP_OUT_FORMAT | m_HSYNC_POL | m_VSYNC_POL |
598                     m_DEN_POL | m_DCLK_POL;
599                 val = v_DSP_OUT_FORMAT(face) |
600                         v_HSYNC_POL(screen->pin_hsync) |
601                         v_VSYNC_POL(screen->pin_vsync) |
602                         v_DEN_POL(screen->pin_den) |
603                         v_DCLK_POL(screen->pin_dclk);
604                 lcdc_msk_reg(lcdc_dev, DSP_CTRL0, mask, val);
605
606                 mask = m_BG_COLOR | m_DSP_BG_SWAP | m_DSP_RB_SWAP |
607                     m_DSP_RG_SWAP | m_DSP_DELTA_SWAP |
608                     m_DSP_DUMMY_SWAP | m_BLANK_EN;
609
610                 val = v_BG_COLOR(0x000000) | v_DSP_BG_SWAP(screen->swap_gb) |
611                     v_DSP_RB_SWAP(screen->swap_rb) |
612                     v_DSP_RG_SWAP(screen->swap_rg) |
613                     v_DSP_DELTA_SWAP(screen->swap_delta) |
614                                      v_DSP_DUMMY_SWAP(screen->swap_dumy) |
615                                                       v_BLANK_EN(0) |
616                                      v_BLACK_EN(0);
617                 lcdc_msk_reg(lcdc_dev, DSP_CTRL1, mask, val);
618                 val =
619                     v_HSYNC(screen->mode.hsync_len) | v_HORPRD(screen->mode.
620                                                                hsync_len +
621                                                                left_margin +
622                                                                x_res +
623                                                                right_margin);
624                 lcdc_writel(lcdc_dev, DSP_HTOTAL_HS_END, val);
625                 val = v_HAEP(screen->mode.hsync_len + left_margin + x_res) |
626                     v_HASP(screen->mode.hsync_len + left_margin);
627                 lcdc_writel(lcdc_dev, DSP_HACT_ST_END, val);
628
629                 if (screen->mode.vmode == FB_VMODE_INTERLACED) {
630                         /*First Field Timing*/
631                         lcdc_writel(lcdc_dev, DSP_VTOTAL_VS_END,
632                                     v_VSYNC(screen->mode.vsync_len) |
633                                     v_VERPRD(2 * (screen->mode.vsync_len +
634                                                   upper_margin + lower_margin)
635                                              + y_res + 1));
636                         lcdc_writel(lcdc_dev, DSP_VACT_ST_END,
637                                     v_VAEP(screen->mode.vsync_len +
638                                         upper_margin + y_res/2) |
639                                     v_VASP(screen->mode.vsync_len +
640                                         upper_margin));
641                         /*Second Field Timing*/
642                         lcdc_writel(lcdc_dev, DSP_VS_ST_END_F1,
643                                     v_VSYNC_ST_F1(screen->mode.vsync_len +
644                                                   upper_margin + y_res/2 +
645                                                   lower_margin) |
646                                     v_VSYNC_END_F1(2 * screen->mode.vsync_len
647                                                    + upper_margin + y_res/2 +
648                                                    lower_margin));
649                         lcdc_writel(lcdc_dev, DSP_VACT_ST_END_F1,
650                                     v_VAEP(2 * (screen->mode.vsync_len +
651                                                 upper_margin) + y_res +
652                                                 lower_margin + 1) |
653                                     v_VASP(2 * (screen->mode.vsync_len +
654                                                 upper_margin) + y_res/2 +
655                                                 lower_margin + 1));
656
657                         lcdc_msk_reg(lcdc_dev, DSP_CTRL0,
658                                      m_INTERLACE_DSP_EN |
659                                      m_INTERLACE_DSP_POL |
660                                      m_WIN1_DIFF_DCLK_EN |
661                                      m_WIN0_YRGB_DEFLICK_EN |
662                                      m_WIN0_CBR_DEFLICK_EN |
663                                      m_WIN0_INTERLACE_EN |
664                                      m_WIN1_INTERLACE_EN,
665                                      v_INTERLACE_DSP_EN(1) |
666                                      v_INTERLACE_DSP_POL(0) |
667                                      v_WIN1_DIFF_DCLK_EN(1) |
668                                      v_WIN0_YRGB_DEFLICK_EN(1) |
669                                      v_WIN0_CBR_DEFLICK_EN(1) |
670                                      v_WIN0_INTERLACE_EN(1) |
671                                      v_WIN1_INTERLACE_EN(1));
672                 } else {
673                         val = v_VSYNC(screen->mode.vsync_len) |
674                               v_VERPRD(screen->mode.vsync_len + upper_margin +
675                                         y_res + lower_margin);
676                         lcdc_writel(lcdc_dev, DSP_VTOTAL_VS_END, val);
677
678                         val = v_VAEP(screen->mode.vsync_len +
679                                      upper_margin + y_res) |
680                             v_VASP(screen->mode.vsync_len +
681                                    screen->mode.upper_margin);
682                         lcdc_writel(lcdc_dev, DSP_VACT_ST_END, val);
683
684                         lcdc_msk_reg(lcdc_dev, DSP_CTRL0,
685                                      m_INTERLACE_DSP_EN |
686                                      m_WIN1_DIFF_DCLK_EN |
687                                      m_WIN0_YRGB_DEFLICK_EN |
688                                      m_WIN0_CBR_DEFLICK_EN |
689                                      m_WIN0_INTERLACE_EN |
690                                      m_WIN1_INTERLACE_EN,
691                                      v_INTERLACE_DSP_EN(0) |
692                                      v_WIN1_DIFF_DCLK_EN(0) |
693                                      v_WIN0_YRGB_DEFLICK_EN(0) |
694                                      v_WIN0_CBR_DEFLICK_EN(0) |
695                                      v_WIN0_INTERLACE_EN(1) |
696                                      v_WIN1_INTERLACE_EN(1));
697                 }
698         }
699         spin_unlock(&lcdc_dev->reg_lock);
700
701         ret = clk_set_rate(lcdc_dev->dclk, screen->mode.pixclock);
702         if (ret)
703                 dev_err(dev_drv->dev,
704                         "set lcdc%d dclk failed\n", lcdc_dev->id);
705         lcdc_dev->pixclock =
706             div_u64(1000000000000llu, clk_get_rate(lcdc_dev->dclk));
707         lcdc_dev->driver.pixclock = lcdc_dev->pixclock;
708
709         fps = rk_fb_calc_fps(screen, lcdc_dev->pixclock);
710         screen->ft = 1000 / fps;
711         dev_info(lcdc_dev->dev, "%s: dclk:%lu>>fps:%d ",
712                  lcdc_dev->driver.name, clk_get_rate(lcdc_dev->dclk), fps);
713         if (dev_drv->trsm_ops && dev_drv->trsm_ops->enable)
714                 dev_drv->trsm_ops->enable();
715         if (screen->init)
716                 screen->init();
717
718         return 0;
719 }
720
721 static int rk3036_lcdc_open(struct rk_lcdc_driver *dev_drv, int win_id,
722                             bool open)
723 {
724         struct lcdc_device *lcdc_dev = container_of(dev_drv,
725                                         struct lcdc_device, driver);
726
727         /*enable clk,when first layer open */
728         if ((open) && (!lcdc_dev->atv_layer_cnt)) {
729                 rk3036_lcdc_pre_init(dev_drv);
730                 rk3036_lcdc_clk_enable(lcdc_dev);
731         #if defined(CONFIG_ROCKCHIP_IOMMU)
732                 if (dev_drv->iommu_enabled) {
733                         if (!dev_drv->mmu_dev) {
734                                 dev_drv->mmu_dev =
735                                 rk_fb_get_sysmmu_device_by_compatible(
736                                         dev_drv->mmu_dts_name);
737                                 if (dev_drv->mmu_dev) {
738                                         rk_fb_platform_set_sysmmu(dev_drv->mmu_dev,
739                                                                   dev_drv->dev);
740                                 } else {
741                                         dev_err(dev_drv->dev,
742                                                 "failed to get iommu device\n"
743                                                 );
744                                         return -1;
745                                 }
746                         }
747                 }
748         #endif
749                 rk3036_lcdc_reg_restore(lcdc_dev);
750                 /*if (dev_drv->iommu_enabled)
751                         rk3036_lcdc_mmu_en(dev_drv);*/
752                 if ((support_uboot_display() && (lcdc_dev->prop == PRMRY))) {
753                         /*rk3036_lcdc_set_dclk(dev_drv);*/
754                         rk3036_lcdc_enable_irq(dev_drv);
755                 } else {
756                         rk3036_load_screen(dev_drv, 1);
757                 }
758         }
759
760         if (win_id < ARRAY_SIZE(lcdc_win))
761                 lcdc_layer_enable(lcdc_dev, win_id, open);
762         else
763                 dev_err(lcdc_dev->dev, "invalid win id:%d\n", win_id);
764
765         /*when all layer closed,disable clk */
766 /*
767         if ((!open) && (!lcdc_dev->atv_layer_cnt)) {
768                 rk3036_lcdc_disable_irq(lcdc_dev);
769                 rk3036_lcdc_reg_update(dev_drv);
770                 #if defined(CONFIG_ROCKCHIP_IOMMU)
771                 if (dev_drv->iommu_enabled) {
772                         if (dev_drv->mmu_dev)
773                                 rockchip_iovmm_deactivate(dev_drv->dev);
774                 }
775                 #endif
776                 rk3036_lcdc_clk_disable(lcdc_dev);
777         }
778 */
779         return 0;
780 }
781
782 static int rk3036_lcdc_set_par(struct rk_lcdc_driver *dev_drv, int win_id)
783 {
784         struct lcdc_device *lcdc_dev =
785                         container_of(dev_drv, struct lcdc_device, driver);
786         struct rk_screen *screen = dev_drv->cur_screen;
787         struct rk_lcdc_win *win = NULL;
788         char fmt[9] = "NULL";
789
790         if (!screen) {
791                 dev_err(dev_drv->dev, "screen is null!\n");
792                 return -ENOENT;
793         }
794
795         if (win_id == 0) {
796                 win = dev_drv->win[0];
797         } else if (win_id == 1) {
798                 win = dev_drv->win[1];
799         } else if (win_id == 2) {
800                 win = dev_drv->win[2];
801         } else {
802                 dev_err(dev_drv->dev, "un supported win number:%d\n", win_id);
803                 return -EINVAL;
804         }
805
806         spin_lock(&lcdc_dev->reg_lock);
807         win->post_cfg.xpos = win->area[0].xpos * (dev_drv->overscan.left +
808                 dev_drv->overscan.right)/200 + screen->mode.xres *
809                         (100 - dev_drv->overscan.left) / 200;
810
811         win->post_cfg.ypos = win->area[0].ypos * (dev_drv->overscan.top +
812                 dev_drv->overscan.bottom)/200 +
813                 screen->mode.yres *
814                         (100 - dev_drv->overscan.top) / 200;
815         win->post_cfg.xsize = win->area[0].xsize *
816                                 (dev_drv->overscan.left +
817                                 dev_drv->overscan.right)/200;
818         win->post_cfg.ysize = win->area[0].ysize *
819                                 (dev_drv->overscan.top +
820                                 dev_drv->overscan.bottom)/200;
821
822         win->area[0].dsp_stx = win->post_cfg.xpos + screen->mode.left_margin +
823                                 screen->mode.hsync_len;
824         if (screen->mode.vmode == FB_VMODE_INTERLACED) {
825                 win->post_cfg.ysize /= 2;
826                 win->area[0].dsp_sty = win->post_cfg.ypos/2 +
827                                         screen->mode.upper_margin +
828                                         screen->mode.vsync_len;
829         } else {
830                 win->area[0].dsp_sty = win->post_cfg.ypos +
831                                         screen->mode.upper_margin +
832                                         screen->mode.vsync_len;
833         }
834         win->scale_yrgb_x = calscale(win->area[0].xact, win->post_cfg.xsize);
835         win->scale_yrgb_y = calscale(win->area[0].yact, win->post_cfg.ysize);
836
837         switch (win->area[0].format) {
838         case ARGB888:
839                 win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
840                 win->area[0].swap_rb = 0;
841                 break;
842         case XBGR888:
843                 win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
844                 win->area[0].swap_rb = 1;
845                 break;
846         case ABGR888:
847                 win->area[0].fmt_cfg = VOP_FORMAT_ARGB888;
848                 win->area[0].swap_rb = 1;
849                 break;
850         case RGB888:
851                 win->area[0].fmt_cfg = VOP_FORMAT_RGB888;
852                 win->area[0].swap_rb = 0;
853                 break;
854         case RGB565:
855                 win->area[0].fmt_cfg = VOP_FORMAT_RGB565;
856                 win->area[0].swap_rb = 0;
857                 break;
858         case YUV444:
859                 if (win_id == 0) {
860                         win->area[0].fmt_cfg = VOP_FORMAT_YCBCR444;
861                         win->scale_cbcr_x = calscale(win->area[0].xact,
862                                                      win->post_cfg.xsize);
863                         win->scale_cbcr_y = calscale(win->area[0].yact,
864                                                      win->post_cfg.ysize);
865                         win->area[0].swap_rb = 0;
866                 } else {
867                         dev_err(lcdc_dev->driver.dev,
868                                 "%s:un supported format!\n",
869                                 __func__);
870                 }
871                 break;
872         case YUV422:
873                 if (win_id == 0) {
874                         win->area[0].fmt_cfg = VOP_FORMAT_YCBCR422;
875                         win->scale_cbcr_x = calscale((win->area[0].xact / 2),
876                                                      win->post_cfg.xsize);
877                         win->scale_cbcr_y = calscale(win->area[0].yact,
878                                                      win->post_cfg.ysize);
879                         win->area[0].swap_rb = 0;
880                 } else {
881                         dev_err(lcdc_dev->driver.dev,
882                                 "%s:un supported format!\n",
883                                 __func__);
884                 }
885                 break;
886         case YUV420:
887                 if (win_id == 0) {
888                         win->area[0].fmt_cfg = VOP_FORMAT_YCBCR420;
889                         win->scale_cbcr_x = calscale(win->area[0].xact / 2,
890                                                      win->post_cfg.xsize);
891                         win->scale_cbcr_y = calscale(win->area[0].yact / 2,
892                                                      win->post_cfg.ysize);
893                         win->area[0].swap_rb = 0;
894                 } else {
895                         dev_err(lcdc_dev->driver.dev,
896                                 "%s:un supported format!\n",
897                                 __func__);
898                 }
899                 break;
900         default:
901                 dev_err(lcdc_dev->driver.dev, "%s:un supported format!\n",
902                         __func__);
903                 break;
904         }
905         spin_unlock(&lcdc_dev->reg_lock);
906
907         DBG(2, "lcdc%d>>%s\n"
908                 ">>format:%s>>>xact:%d>>yact:%d>>xsize:%d>>ysize:%d\n"
909                 ">>xvir:%d>>yvir:%d>>xpos:%d>>ypos:%d>>\n", lcdc_dev->id,
910                 __func__, get_format_string(win->area[0].format, fmt),
911                 win->area[0].xact, win->area[0].yact, win->post_cfg.xsize,
912                 win->post_cfg.ysize, win->area[0].xvir, win->area[0].yvir,
913                 win->post_cfg.xpos, win->post_cfg.ypos);
914         return 0;
915 }
916
917 static int rk3036_lcdc_pan_display(struct rk_lcdc_driver *dev_drv, int win_id)
918 {
919         struct lcdc_device *lcdc_dev = container_of(dev_drv,
920                                                 struct lcdc_device, driver);
921         struct rk_lcdc_win *win = NULL;
922         struct rk_screen *screen = dev_drv->cur_screen;
923
924         if (!screen) {
925                 dev_err(dev_drv->dev, "screen is null!\n");
926                 return -ENOENT;
927         }
928
929         if (win_id == 0) {
930                 win = dev_drv->win[0];
931         } else if (win_id == 1) {
932                 win = dev_drv->win[1];
933         } else if (win_id == 2) {
934                 win = dev_drv->win[2];
935         } else {
936                 dev_err(dev_drv->dev, "invalid win number:%d!\n", win_id);
937                 return -EINVAL;
938         }
939
940         spin_lock(&lcdc_dev->reg_lock);
941         if (likely(lcdc_dev->clk_on)) {
942                 win->area[0].y_addr = win->area[0].smem_start +
943                                         win->area[0].y_offset;
944                 win->area[0].uv_addr = win->area[0].cbr_start +
945                                         win->area[0].c_offset;
946                 if (win->area[0].y_addr)
947                         lcdc_layer_update_regs(lcdc_dev, win);
948                 /*lcdc_cfg_done(lcdc_dev);*/
949         }
950         spin_unlock(&lcdc_dev->reg_lock);
951
952         DBG(2, "lcdc%d>>%s:y_addr:0x%x>>uv_addr:0x%x>>offset:%d\n",
953             lcdc_dev->id, __func__, win->area[0].y_addr,
954             win->area[0].uv_addr, win->area[0].y_offset);
955          /* this is the first frame of the system,
956                 enable frame start interrupt*/
957         if ((dev_drv->first_frame))  {
958                 dev_drv->first_frame = 0;
959                 rk3036_lcdc_enable_irq(dev_drv);
960         }
961         return 0;
962 }
963
964 static int rk3036_lcdc_ioctl(struct rk_lcdc_driver *dev_drv, unsigned int cmd,
965                              unsigned long arg, int win_id)
966 {
967         struct lcdc_device *lcdc_dev = container_of(dev_drv,
968                                         struct lcdc_device, driver);
969         u32 panel_size[2];
970         void __user *argp = (void __user *)arg;
971         struct color_key_cfg clr_key_cfg;
972
973         switch (cmd) {
974         case RK_FBIOGET_PANEL_SIZE:
975                 panel_size[0] = lcdc_dev->screen->mode.xres;
976                 panel_size[1] = lcdc_dev->screen->mode.yres;
977                 if (copy_to_user(argp, panel_size, 8))
978                         return -EFAULT;
979                 break;
980         case RK_FBIOPUT_COLOR_KEY_CFG:
981                 if (copy_from_user(&clr_key_cfg, argp,
982                                    sizeof(struct color_key_cfg)))
983                         return -EFAULT;
984                 lcdc_writel(lcdc_dev, WIN0_COLOR_KEY,
985                             clr_key_cfg.win0_color_key_cfg);
986                 lcdc_writel(lcdc_dev, WIN1_COLOR_KEY,
987                             clr_key_cfg.win1_color_key_cfg);
988                 break;
989
990         default:
991                 break;
992         }
993         return 0;
994 }
995
996 static int rk3036_lcdc_get_win_id(struct rk_lcdc_driver *dev_drv,
997                                   const char *id)
998 {
999         int win_id = 0;
1000
1001         mutex_lock(&dev_drv->fb_win_id_mutex);
1002         if (!strcmp(id, "fb0"))
1003                 win_id = dev_drv->fb0_win_id;
1004         else if (!strcmp(id, "fb1"))
1005                 win_id = dev_drv->fb1_win_id;
1006         else if (!strcmp(id, "fb2"))
1007                 win_id = dev_drv->fb2_win_id;
1008         mutex_unlock(&dev_drv->fb_win_id_mutex);
1009
1010         return win_id;
1011 }
1012
1013 static int rk3036_lcdc_get_win_state(struct rk_lcdc_driver *dev_drv,
1014                                      int win_id,
1015                                      int area_id)
1016 {
1017         return dev_drv->win[win_id]->state;
1018 }
1019
1020 static int rk3036_lcdc_ovl_mgr(struct rk_lcdc_driver *dev_drv, int swap,
1021                                bool set)
1022 {
1023         struct lcdc_device *lcdc_dev =
1024             container_of(dev_drv, struct lcdc_device, driver);
1025         struct rk_lcdc_win *win0 = lcdc_dev->driver.win[0];
1026         struct rk_lcdc_win *win1 = lcdc_dev->driver.win[1];
1027         int ovl, needswap = 0;
1028
1029         if (!swap) {
1030                 if (win0->z_order >= 0 &&
1031                     win1->z_order >= 0 &&
1032                     win0->z_order > win1->z_order)
1033                         needswap = 1;
1034                 else
1035                         needswap = 0;
1036         } else {
1037                 needswap = swap;
1038         }
1039         spin_lock(&lcdc_dev->reg_lock);
1040         if (lcdc_dev->clk_on) {
1041                 if (set) {
1042                         lcdc_msk_reg(lcdc_dev, DSP_CTRL0, m_WIN0_TOP,
1043                                      v_WIN0_TOP(needswap));
1044                         ovl = swap;
1045                 } else {
1046                         ovl = lcdc_read_bit(lcdc_dev, DSP_CTRL0, m_WIN0_TOP);
1047                 }
1048         } else {
1049                 ovl = -EPERM;
1050         }
1051         spin_unlock(&lcdc_dev->reg_lock);
1052
1053         return ovl;
1054 }
1055
1056 static int rk3036_lcdc_early_suspend(struct rk_lcdc_driver *dev_drv)
1057 {
1058         struct lcdc_device *lcdc_dev = container_of(dev_drv,
1059                                         struct lcdc_device, driver);
1060         if (dev_drv->suspend_flag)
1061                 return 0;
1062         dev_drv->suspend_flag = 1;
1063         flush_kthread_worker(&dev_drv->update_regs_worker);
1064
1065         if (dev_drv->trsm_ops && dev_drv->trsm_ops->disable)
1066                 dev_drv->trsm_ops->disable();
1067         spin_lock(&lcdc_dev->reg_lock);
1068         if (likely(lcdc_dev->clk_on)) {
1069                 lcdc_msk_reg(lcdc_dev, DSP_CTRL1, m_BLANK_EN,
1070                              v_BLANK_EN(1));
1071                 lcdc_msk_reg(lcdc_dev, INT_STATUS, m_FS_INT_CLEAR,
1072                              v_FS_INT_CLEAR(1));
1073                 lcdc_msk_reg(lcdc_dev, DSP_CTRL1, m_DSP_OUT_ZERO,
1074                              v_DSP_OUT_ZERO(1));
1075                 lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_LCDC_STANDBY,
1076                              v_LCDC_STANDBY(1));
1077                 lcdc_cfg_done(lcdc_dev);
1078                 if (dev_drv->iommu_enabled) {
1079                         if (dev_drv->mmu_dev)
1080                                 rockchip_iovmm_deactivate(dev_drv->dev);
1081                 }
1082                 spin_unlock(&lcdc_dev->reg_lock);
1083         } else {
1084                 spin_unlock(&lcdc_dev->reg_lock);
1085                 return 0;
1086         }
1087         rk3036_lcdc_clk_disable(lcdc_dev);
1088         rk_disp_pwr_disable(dev_drv);
1089         return 0;
1090 }
1091
1092 static int rk3036_lcdc_early_resume(struct rk_lcdc_driver *dev_drv)
1093 {
1094         struct lcdc_device *lcdc_dev =
1095             container_of(dev_drv, struct lcdc_device, driver);
1096
1097         if (!dev_drv->suspend_flag)
1098                 return 0;
1099         rk_disp_pwr_enable(dev_drv);
1100         dev_drv->suspend_flag = 0;
1101
1102         if (lcdc_dev->atv_layer_cnt) {
1103                 rk3036_lcdc_clk_enable(lcdc_dev);
1104                 rk3036_lcdc_reg_restore(lcdc_dev);
1105                 /*set hwc lut*/
1106                 rk3036_lcdc_set_hwc_lut(dev_drv, dev_drv->hwc_lut, 0);
1107
1108                 spin_lock(&lcdc_dev->reg_lock);
1109
1110                 lcdc_msk_reg(lcdc_dev, DSP_CTRL1, m_DSP_OUT_ZERO,
1111                              v_DSP_OUT_ZERO(0));
1112                 lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_LCDC_STANDBY,
1113                              v_LCDC_STANDBY(0));
1114                 lcdc_msk_reg(lcdc_dev, DSP_CTRL1, m_BLANK_EN,
1115                              v_BLANK_EN(0));
1116                 lcdc_cfg_done(lcdc_dev);
1117                 if (dev_drv->iommu_enabled) {
1118                         if (dev_drv->mmu_dev)
1119                                 rockchip_iovmm_activate(dev_drv->dev);
1120                 }
1121                 spin_unlock(&lcdc_dev->reg_lock);
1122         }
1123
1124         if (dev_drv->trsm_ops && dev_drv->trsm_ops->enable)
1125                 dev_drv->trsm_ops->enable();
1126         return 0;
1127 }
1128
1129
1130 static int rk3036_lcdc_blank(struct rk_lcdc_driver *dev_drv,
1131                              int win_id, int blank_mode)
1132 {
1133         switch (blank_mode) {
1134         case FB_BLANK_UNBLANK:
1135                 rk3036_lcdc_early_resume(dev_drv);
1136                 break;
1137         case FB_BLANK_NORMAL:
1138                 rk3036_lcdc_early_suspend(dev_drv);
1139                 break;
1140         default:
1141                 rk3036_lcdc_early_suspend(dev_drv);
1142                 break;
1143         }
1144
1145         dev_info(dev_drv->dev, "blank mode:%d\n", blank_mode);
1146
1147         return 0;
1148 }
1149
1150 static int rk3036_lcdc_cfg_done(struct rk_lcdc_driver *dev_drv)
1151 {
1152         struct lcdc_device *lcdc_dev =
1153             container_of(dev_drv, struct lcdc_device, driver);
1154         int i;
1155         struct rk_lcdc_win *win = NULL;
1156
1157         spin_lock(&lcdc_dev->reg_lock);
1158         if (lcdc_dev->clk_on) {
1159                 #if defined(CONFIG_ROCKCHIP_IOMMU)
1160                 if (dev_drv->iommu_enabled) {
1161                         if (!lcdc_dev->iommu_status && dev_drv->mmu_dev) {
1162                                 lcdc_dev->iommu_status = 1;
1163                                 if (support_uboot_display() &&
1164                                     lcdc_dev->prop == PRMRY) {
1165                                         lcdc_msk_reg(lcdc_dev, SYS_CTRL,
1166                                                      m_WIN0_EN,
1167                                                      v_WIN0_EN(0));
1168                                 }
1169                                 lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_LCDC_STANDBY,
1170                                              v_LCDC_STANDBY(1));
1171                                 lcdc_cfg_done(lcdc_dev);
1172                                 mdelay(50);
1173                                 rockchip_iovmm_activate(dev_drv->dev);
1174                                 rk3036_lcdc_mmu_en(dev_drv);
1175                         }
1176                 }
1177                 #endif
1178                 lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_LCDC_STANDBY,
1179                              v_LCDC_STANDBY(lcdc_dev->standby));
1180                 for (i = 0; i < ARRAY_SIZE(lcdc_win); i++) {
1181                         win = dev_drv->win[i];
1182                         if ((win->state == 0) && (win->last_state == 1))
1183                                 lcdc_layer_update_regs(lcdc_dev, win);
1184                         win->last_state = win->state;
1185                 }
1186                 lcdc_cfg_done(lcdc_dev);
1187         }
1188         spin_unlock(&lcdc_dev->reg_lock);
1189         return 0;
1190 }
1191
1192 /*
1193         a:[-30~0]:
1194             sin_hue = sin(a)*256 +0x100;
1195             cos_hue = cos(a)*256;
1196         a:[0~30]
1197             sin_hue = sin(a)*256;
1198             cos_hue = cos(a)*256;
1199 */
1200 static int rk3036_lcdc_get_bcsh_hue(struct rk_lcdc_driver *dev_drv,
1201                                     bcsh_hue_mode mode)
1202 {
1203         struct lcdc_device *lcdc_dev =
1204             container_of(dev_drv, struct lcdc_device, driver);
1205         u32 val;
1206
1207         spin_lock(&lcdc_dev->reg_lock);
1208         if (lcdc_dev->clk_on) {
1209                 val = lcdc_readl(lcdc_dev, BCSH_H);
1210                 switch (mode) {
1211                 case H_SIN:
1212                         val &= m_BCSH_SIN_HUE;
1213                         break;
1214                 case H_COS:
1215                         val &= m_BCSH_COS_HUE;
1216                         val >>= 8;
1217                         break;
1218                 default:
1219                         break;
1220                 }
1221         }
1222         spin_unlock(&lcdc_dev->reg_lock);
1223
1224         return val;
1225 }
1226
1227
1228 static int rk3036_lcdc_set_bcsh_hue(struct rk_lcdc_driver *dev_drv,
1229                                     int sin_hue, int cos_hue)
1230 {
1231         struct lcdc_device *lcdc_dev =
1232             container_of(dev_drv, struct lcdc_device, driver);
1233         u32 mask, val;
1234
1235         spin_lock(&lcdc_dev->reg_lock);
1236         if (lcdc_dev->clk_on) {
1237                 mask = m_BCSH_SIN_HUE | m_BCSH_COS_HUE;
1238                 val = v_BCSH_SIN_HUE(sin_hue) | v_BCSH_COS_HUE(cos_hue);
1239                 lcdc_msk_reg(lcdc_dev, BCSH_H, mask, val);
1240                 lcdc_cfg_done(lcdc_dev);
1241         }
1242         spin_unlock(&lcdc_dev->reg_lock);
1243
1244         return 0;
1245 }
1246
1247 static int rk3036_lcdc_set_bcsh_bcs(struct rk_lcdc_driver *dev_drv,
1248                                     bcsh_bcs_mode mode, int value)
1249 {
1250         struct lcdc_device *lcdc_dev =
1251             container_of(dev_drv, struct lcdc_device, driver);
1252         u32 mask, val;
1253
1254         spin_lock(&lcdc_dev->reg_lock);
1255         if (lcdc_dev->clk_on) {
1256                 switch (mode) {
1257                 case BRIGHTNESS:
1258                 /*from 0 to 255,typical is 128*/
1259                         if (value < 0x20)
1260                                 value += 0x20;
1261                         else if (value >= 0x20)
1262                                 value = value - 0x20;
1263                         mask =  m_BCSH_BRIGHTNESS;
1264                         val = v_BCSH_BRIGHTNESS(value);
1265                         break;
1266                 case CONTRAST:
1267                 /*from 0 to 510,typical is 256*/
1268                         mask =  m_BCSH_CONTRAST;
1269                         val =  v_BCSH_CONTRAST(value);
1270                         break;
1271                 case SAT_CON:
1272                 /*from 0 to 1015,typical is 256*/
1273                         mask = m_BCSH_SAT_CON;
1274                         val = v_BCSH_SAT_CON(value);
1275                         break;
1276                 default:
1277                         break;
1278                 }
1279                 lcdc_msk_reg(lcdc_dev, BCSH_BCS, mask, val);
1280                 lcdc_cfg_done(lcdc_dev);
1281         }
1282         spin_unlock(&lcdc_dev->reg_lock);
1283         return val;
1284 }
1285
1286 static int rk3036_lcdc_get_bcsh_bcs(struct rk_lcdc_driver *dev_drv,
1287                                     bcsh_bcs_mode mode)
1288 {
1289         struct lcdc_device *lcdc_dev =
1290             container_of(dev_drv, struct lcdc_device, driver);
1291         u32 val;
1292
1293         spin_lock(&lcdc_dev->reg_lock);
1294         if (lcdc_dev->clk_on) {
1295                 val = lcdc_readl(lcdc_dev, BCSH_BCS);
1296                 switch (mode) {
1297                 case BRIGHTNESS:
1298                         val &= m_BCSH_BRIGHTNESS;
1299                         if (val > 0x20)
1300                                 val -= 0x20;
1301                         else if (val == 0x20)
1302                                 val = -32;
1303                         break;
1304                 case CONTRAST:
1305                         val &= m_BCSH_CONTRAST;
1306                         val >>= 8;
1307                         break;
1308                 case SAT_CON:
1309                         val &= m_BCSH_SAT_CON;
1310                         val >>= 16;
1311                         break;
1312                 default:
1313                         break;
1314                 }
1315         }
1316         spin_unlock(&lcdc_dev->reg_lock);
1317         return val;
1318 }
1319
1320
1321 static int rk3036_lcdc_open_bcsh(struct rk_lcdc_driver *dev_drv, bool open)
1322 {
1323         struct lcdc_device *lcdc_dev =
1324             container_of(dev_drv, struct lcdc_device, driver);
1325         u32 mask, val;
1326
1327         spin_lock(&lcdc_dev->reg_lock);
1328         if (lcdc_dev->clk_on) {
1329                 if (open) {
1330                         lcdc_writel(lcdc_dev, BCSH_CTRL,
1331                                     v_BCSH_EN(1) | v_BCSH_OUT_MODE(3));
1332                         lcdc_writel(lcdc_dev, BCSH_BCS,
1333                                     v_BCSH_BRIGHTNESS(0x00) |
1334                                     v_BCSH_CONTRAST(0x80) |
1335                                     v_BCSH_SAT_CON(0x80));
1336                         lcdc_writel(lcdc_dev, BCSH_H, v_BCSH_COS_HUE(0x80));
1337                 } else {
1338                         mask = m_BCSH_EN;
1339                         val = v_BCSH_EN(0);
1340                         lcdc_msk_reg(lcdc_dev, BCSH_CTRL, mask, val);
1341                 }
1342                 lcdc_cfg_done(lcdc_dev);
1343         }
1344         spin_unlock(&lcdc_dev->reg_lock);
1345         return 0;
1346 }
1347
1348 static int rk3036_lcdc_set_overscan(struct rk_lcdc_driver *dev_drv,
1349                                     struct overscan *overscan)
1350 {
1351         int i;
1352
1353         dev_drv->overscan = *overscan;
1354         for (i = 0; i < dev_drv->lcdc_win_num; i++) {
1355                 if (dev_drv->win[i] && dev_drv->win[i]->state) {
1356                         rk3036_lcdc_set_par(dev_drv, i);
1357                         rk3036_lcdc_pan_display(dev_drv, i);
1358                 }
1359         }
1360         rk3036_lcdc_cfg_done(dev_drv);
1361         return 0;
1362 }
1363
1364 static int rk3036_fb_win_remap(struct rk_lcdc_driver *dev_drv, u16 order)
1365 {
1366         struct rk_lcdc_win_area area;
1367         int fb2_win_id, fb1_win_id, fb0_win_id;
1368
1369         mutex_lock(&dev_drv->fb_win_id_mutex);
1370         if (order == FB_DEFAULT_ORDER)
1371                 order = FB0_WIN0_FB1_WIN1_FB2_WIN2;
1372
1373         fb2_win_id = order / 100;
1374         fb1_win_id = (order / 10) % 10;
1375         fb0_win_id = order % 10;
1376
1377         if (fb0_win_id != dev_drv->fb0_win_id) {
1378                 area = dev_drv->win[(int)dev_drv->fb0_win_id]->area[0];
1379                 dev_drv->win[(int)dev_drv->fb0_win_id]->area[0] =
1380                         dev_drv->win[fb0_win_id]->area[0];
1381                 dev_drv->win[fb0_win_id]->area[0] = area;
1382                 dev_drv->fb0_win_id = fb0_win_id;
1383         }
1384         dev_drv->fb1_win_id = fb1_win_id;
1385         dev_drv->fb2_win_id = fb2_win_id;
1386
1387         mutex_unlock(&dev_drv->fb_win_id_mutex);
1388
1389         return 0;
1390 }
1391
1392 static int rk3036_lcdc_fps_mgr(struct rk_lcdc_driver *dev_drv, int fps,
1393                                bool set)
1394 {
1395         struct lcdc_device *lcdc_dev =
1396             container_of(dev_drv, struct lcdc_device, driver);
1397         struct rk_screen *screen = dev_drv->cur_screen;
1398         u64 ft = 0;
1399         u32 dotclk;
1400         int ret;
1401         u32 pixclock;
1402         u32 x_total, y_total;
1403
1404         if (set) {
1405                 ft = div_u64(1000000000000llu, fps);
1406                 x_total =
1407                     screen->mode.upper_margin + screen->mode.lower_margin +
1408                     screen->mode.yres + screen->mode.vsync_len;
1409                 y_total =
1410                     screen->mode.left_margin + screen->mode.right_margin +
1411                     screen->mode.xres + screen->mode.hsync_len;
1412                 dev_drv->pixclock = div_u64(ft, x_total * y_total);
1413                 dotclk = div_u64(1000000000000llu, dev_drv->pixclock);
1414                 ret = clk_set_rate(lcdc_dev->dclk, dotclk);
1415         }
1416
1417         pixclock = div_u64(1000000000000llu, clk_get_rate(lcdc_dev->dclk));
1418         lcdc_dev->pixclock = pixclock;
1419         dev_drv->pixclock = pixclock;
1420         fps = rk_fb_calc_fps(lcdc_dev->screen, pixclock);
1421         screen->ft = 1000 / fps;        /*one frame time in ms */
1422
1423         if (set)
1424                 dev_info(dev_drv->dev, "%s:dclk:%lu,fps:%d\n", __func__,
1425                          clk_get_rate(lcdc_dev->dclk), fps);
1426
1427         return fps;
1428 }
1429
1430 static int rk3036_lcdc_poll_vblank(struct rk_lcdc_driver *dev_drv)
1431 {
1432         struct lcdc_device *lcdc_dev =
1433             container_of(dev_drv, struct lcdc_device, driver);
1434         u32 int_reg;
1435         int ret;
1436
1437         if (lcdc_dev->clk_on) {
1438                 int_reg = lcdc_readl(lcdc_dev, INT_STATUS);
1439                 if (int_reg & m_LF_INT_STA) {
1440                         lcdc_msk_reg(lcdc_dev, INT_STATUS, m_LF_INT_CLEAR,
1441                                      v_LF_INT_CLEAR(1));
1442                         ret = RK_LF_STATUS_FC;
1443                 } else {
1444                         ret = RK_LF_STATUS_FR;
1445                 }
1446         } else {
1447                 ret = RK_LF_STATUS_NC;
1448         }
1449
1450         return ret;
1451 }
1452
1453 static int rk3036_lcdc_get_dsp_addr(struct rk_lcdc_driver *dev_drv,
1454                                     unsigned int dsp_addr[][4])
1455 {
1456         struct lcdc_device *lcdc_dev =
1457             container_of(dev_drv, struct lcdc_device, driver);
1458
1459         if (lcdc_dev->clk_on) {
1460                 dsp_addr[0][0] = lcdc_readl(lcdc_dev, WIN0_YRGB_MST);
1461                 dsp_addr[1][0] = lcdc_readl(lcdc_dev, WIN1_MST);
1462         }
1463         return 0;
1464 }
1465
1466 static ssize_t rk3036_lcdc_get_disp_info(struct rk_lcdc_driver *dev_drv,
1467                                          char *buf, int win_id)
1468 {
1469         struct rk_lcdc_win *win = NULL;
1470         char fmt[9] = "NULL";
1471         u32     size;
1472
1473         if (win_id < ARRAY_SIZE(lcdc_win)) {
1474                 win = dev_drv->win[win_id];
1475         } else {
1476                 dev_err(dev_drv->dev, "invalid win number:%d!\n", win_id);
1477                 return 0;
1478         }
1479
1480         size = snprintf(buf, PAGE_SIZE, "win%d: %s\n", win_id,
1481                         get_format_string(win->area[0].format, fmt));
1482         size += snprintf(buf + size, PAGE_SIZE - size,
1483                          "      xact %d yact %d xvir %d yvir %d\n",
1484                 win->area[0].xact, win->area[0].yact,
1485                 win->area[0].xvir, win->area[0].yvir);
1486         size += snprintf(buf + size, PAGE_SIZE - size,
1487                          "      xpos %d ypos %d xsize %d ysize %d\n",
1488                 win->area[0].xpos, win->area[0].ypos,
1489                 win->area[0].xsize, win->area[0].ysize);
1490         size += snprintf(buf + size, PAGE_SIZE - size,
1491                          "      yaddr 0x%x uvaddr 0x%x\n",
1492                 win->area[0].y_addr, win->area[0].uv_addr);
1493         return size;
1494 }
1495
1496 static int rk3036_lcdc_reg_dump(struct rk_lcdc_driver *dev_drv)
1497 {
1498         struct lcdc_device *lcdc_dev = container_of(dev_drv,
1499                                                 struct lcdc_device,
1500                                                 driver);
1501         int *cbase = (int *)lcdc_dev->regs;
1502         int *regsbak = (int *)lcdc_dev->regsbak;
1503         int i, j;
1504
1505         dev_info(dev_drv->dev, "back up reg:\n");
1506         for (i = 0; i <= (0xDC >> 4); i++) {
1507                 for (j = 0; j < 4; j++)
1508                         dev_info(dev_drv->dev, "%08x  ",
1509                                  *(regsbak + i * 4 + j));
1510                 dev_info(dev_drv->dev, "\n");
1511         }
1512
1513         dev_info(dev_drv->dev, "lcdc reg:\n");
1514         for (i = 0; i <= (0xDC >> 4); i++) {
1515                 for (j = 0; j < 4; j++)
1516                         dev_info(dev_drv->dev, "%08x  ",
1517                                  readl_relaxed(cbase + i * 4 + j));
1518                 dev_info(dev_drv->dev, "\n");
1519         }
1520         return 0;
1521 }
1522
1523 static struct rk_lcdc_drv_ops lcdc_drv_ops = {
1524         .open                   = rk3036_lcdc_open,
1525         .load_screen            = rk3036_load_screen,
1526         .set_par                = rk3036_lcdc_set_par,
1527         .pan_display            = rk3036_lcdc_pan_display,
1528         .blank                  = rk3036_lcdc_blank,
1529         .ioctl                  = rk3036_lcdc_ioctl,
1530         .get_win_state          = rk3036_lcdc_get_win_state,
1531         .ovl_mgr                = rk3036_lcdc_ovl_mgr,
1532         .get_disp_info          = rk3036_lcdc_get_disp_info,
1533         .fps_mgr                = rk3036_lcdc_fps_mgr,
1534         .fb_get_win_id          = rk3036_lcdc_get_win_id,
1535         .fb_win_remap           = rk3036_fb_win_remap,
1536         .poll_vblank            = rk3036_lcdc_poll_vblank,
1537         .get_dsp_addr           = rk3036_lcdc_get_dsp_addr,
1538         .cfg_done               = rk3036_lcdc_cfg_done,
1539         .dump_reg               = rk3036_lcdc_reg_dump,
1540         .set_dsp_bcsh_hue       = rk3036_lcdc_set_bcsh_hue,
1541         .set_dsp_bcsh_bcs       = rk3036_lcdc_set_bcsh_bcs,
1542         .get_dsp_bcsh_hue       = rk3036_lcdc_get_bcsh_hue,
1543         .get_dsp_bcsh_bcs       = rk3036_lcdc_get_bcsh_bcs,
1544         .open_bcsh              = rk3036_lcdc_open_bcsh,
1545         .set_overscan           = rk3036_lcdc_set_overscan,
1546         .set_hwc_lut            = rk3036_lcdc_set_hwc_lut,
1547 };
1548
1549 static int rk3036_lcdc_parse_dt(struct lcdc_device *lcdc_dev)
1550 {
1551         struct device_node *np = lcdc_dev->dev->of_node;
1552         int val;
1553
1554 #if defined(CONFIG_ROCKCHIP_IOMMU)
1555         if (of_property_read_u32(np, "rockchip,iommu-enabled", &val))
1556                 lcdc_dev->driver.iommu_enabled = 0;
1557         else
1558                 lcdc_dev->driver.iommu_enabled = val;
1559 #else
1560         lcdc_dev->driver.iommu_enabled = 0;
1561 #endif
1562         if (of_property_read_u32(np, "rockchip,fb-win-map", &val))
1563                 lcdc_dev->driver.fb_win_map = FB_DEFAULT_ORDER;
1564         else
1565                 lcdc_dev->driver.fb_win_map = val;
1566
1567         return 0;
1568 }
1569
1570 static int rk3036_lcdc_probe(struct platform_device *pdev)
1571 {
1572         struct lcdc_device *lcdc_dev = NULL;
1573         struct rk_lcdc_driver *dev_drv;
1574         struct device *dev = &pdev->dev;
1575         struct resource *res;
1576         int ret;
1577
1578         lcdc_dev = devm_kzalloc(dev,
1579                                 sizeof(struct lcdc_device), GFP_KERNEL);
1580         if (!lcdc_dev) {
1581                 dev_err(&pdev->dev, "rk3036 lcdc device kmalloc fail!");
1582                 return -ENOMEM;
1583         }
1584         platform_set_drvdata(pdev, lcdc_dev);
1585         lcdc_dev->dev = dev;
1586         rk3036_lcdc_parse_dt(lcdc_dev);
1587
1588         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1589         lcdc_dev->reg_phy_base = res->start;
1590         lcdc_dev->len = resource_size(res);
1591         lcdc_dev->regs = devm_ioremap_resource(dev, res);
1592         if (IS_ERR(lcdc_dev->regs))
1593                 return PTR_ERR(lcdc_dev->regs);
1594
1595         lcdc_dev->regsbak = devm_kzalloc(dev, lcdc_dev->len, GFP_KERNEL);
1596         if (IS_ERR(lcdc_dev->regsbak))
1597                 return PTR_ERR(lcdc_dev->regsbak);
1598
1599         lcdc_dev->hwc_lut_addr_base = (lcdc_dev->regs + HWC_LUT_ADDR);
1600         lcdc_dev->prop = PRMRY;
1601         dev_set_name(lcdc_dev->dev, "lcdc%d", lcdc_dev->id);
1602         dev_drv = &lcdc_dev->driver;
1603         dev_drv->dev = dev;
1604         dev_drv->prop = PRMRY;
1605         dev_drv->id = lcdc_dev->id;
1606         dev_drv->ops = &lcdc_drv_ops;
1607         dev_drv->lcdc_win_num = ARRAY_SIZE(lcdc_win);
1608         spin_lock_init(&lcdc_dev->reg_lock);
1609
1610         lcdc_dev->irq = platform_get_irq(pdev, 0);
1611         if (lcdc_dev->irq < 0) {
1612                 dev_err(&pdev->dev, "cannot find IRQ for lcdc%d\n",
1613                         lcdc_dev->id);
1614                 return -ENXIO;
1615         }
1616
1617         ret = devm_request_irq(dev, lcdc_dev->irq, rk3036_lcdc_isr,
1618                                IRQF_DISABLED | IRQF_SHARED,
1619                                dev_name(dev), lcdc_dev);
1620         if (ret) {
1621                 dev_err(&pdev->dev, "cannot requeset irq %d - err %d\n",
1622                         lcdc_dev->irq, ret);
1623                 return ret;
1624         }
1625
1626         if (dev_drv->iommu_enabled)
1627                 strcpy(dev_drv->mmu_dts_name, VOP_IOMMU_COMPATIBLE_NAME);
1628
1629         ret = rk_fb_register(dev_drv, lcdc_win, lcdc_dev->id);
1630         if (ret < 0) {
1631                 dev_err(dev, "register fb for lcdc%d failed!\n", lcdc_dev->id);
1632                 return ret;
1633         }
1634         lcdc_dev->screen = dev_drv->screen0;
1635
1636         dev_info(dev, "lcdc probe ok, iommu %s\n",
1637                  dev_drv->iommu_enabled ? "enabled" : "disabled");
1638
1639         return 0;
1640 }
1641
1642 #if defined(CONFIG_PM)
1643 static int rk3036_lcdc_suspend(struct platform_device *pdev,
1644                                pm_message_t state)
1645 {
1646         return 0;
1647 }
1648
1649 static int rk3036_lcdc_resume(struct platform_device *pdev)
1650 {
1651         return 0;
1652 }
1653 #else
1654 #define rk3036_lcdc_suspend NULL
1655 #define rk3036_lcdc_resume  NULL
1656 #endif
1657
1658 static int rk3036_lcdc_remove(struct platform_device *pdev)
1659 {
1660         return 0;
1661 }
1662
1663 static void rk3036_lcdc_shutdown(struct platform_device *pdev)
1664 {
1665 }
1666
1667 #if defined(CONFIG_OF)
1668 static const struct of_device_id rk3036_lcdc_dt_ids[] = {
1669         {.compatible = "rockchip,rk3036-lcdc",},
1670         {}
1671 };
1672 #endif
1673
1674 static struct platform_driver rk3036_lcdc_driver = {
1675         .probe = rk3036_lcdc_probe,
1676         .remove = rk3036_lcdc_remove,
1677         .driver = {
1678                 .name = "rk3036-lcdc",
1679                 .owner = THIS_MODULE,
1680                 .of_match_table = of_match_ptr(rk3036_lcdc_dt_ids),
1681         },
1682         .suspend = rk3036_lcdc_suspend,
1683         .resume = rk3036_lcdc_resume,
1684         .shutdown = rk3036_lcdc_shutdown,
1685 };
1686
1687 static int __init rk3036_lcdc_module_init(void)
1688 {
1689         return platform_driver_register(&rk3036_lcdc_driver);
1690 }
1691
1692 static void __exit rk3036_lcdc_module_exit(void)
1693 {
1694         platform_driver_unregister(&rk3036_lcdc_driver);
1695 }
1696
1697 fs_initcall(rk3036_lcdc_module_init);
1698 module_exit(rk3036_lcdc_module_exit);