rk_fb: rk3128: fix crash when boot when with hdmi plug
authorMark Yao <mark.yao@rock-chips.com>
Fri, 28 Nov 2014 06:32:01 +0000 (14:32 +0800)
committerMark Yao <mark.yao@rock-chips.com>
Fri, 28 Nov 2014 06:40:01 +0000 (14:40 +0800)
enable iommu when first ion buffer take effect.

drivers/video/rockchip/lcdc/rk312x_lcdc.c
drivers/video/rockchip/rk_fb.c

index 66795a6e36b69b175836e9e503958a675e609e1c..258177ba482189a21ad8a547d0f3f6e61cf21dd2 100755 (executable)
@@ -595,7 +595,7 @@ static void rk312x_lcdc_reg_restore(struct lcdc_device *lcdc_dev)
        memcpy((u8 *)lcdc_dev->regs, (u8 *)lcdc_dev->regsbak, 0xe0);
 }
 
-static void rk312x_lcdc_mmu_en(struct rk_lcdc_driver *dev_drv)
+static int rk312x_lcdc_mmu_en(struct rk_lcdc_driver *dev_drv)
 {
        u32 mask, val;
        struct lcdc_device *lcdc_dev =
@@ -610,6 +610,17 @@ static void rk312x_lcdc_mmu_en(struct rk_lcdc_driver *dev_drv)
                lcdc_msk_reg(lcdc_dev, AXI_BUS_CTRL, mask, val);
        }
        /*spin_unlock(&lcdc_dev->reg_lock);*/
+       #if defined(CONFIG_ROCKCHIP_IOMMU)
+       if (dev_drv->iommu_enabled) {
+               if (!lcdc_dev->iommu_status && dev_drv->mmu_dev) {
+                       lcdc_dev->iommu_status = 1;
+                       rockchip_iovmm_activate(dev_drv->dev);
+                       rk312x_lcdc_mmu_en(dev_drv);
+               }
+       }
+       #endif
+
+       return 0;
 }
 static int rk312x_lcdc_set_hwc_lut(struct rk_lcdc_driver *dev_drv,
                                   int *hwc_lut, int mode)
@@ -1825,31 +1836,6 @@ static int rk312x_lcdc_cfg_done(struct rk_lcdc_driver *dev_drv)
 
        spin_lock(&lcdc_dev->reg_lock);
        if (lcdc_dev->clk_on) {
-       #if defined(CONFIG_ROCKCHIP_IOMMU)
-               if (dev_drv->iommu_enabled) {
-                       if (!lcdc_dev->iommu_status && dev_drv->mmu_dev) {
-                               lcdc_dev->iommu_status = 1;
-                               /*if ((support_uboot_display() &&
-                                       (lcdc_dev->prop == PRMRY))) {
-                                       lcdc_writel(lcdc_dev,WIN0_CTRL1,0x0);
-                                       mask =  m_WIN0_EN;
-                                       val  =  v_WIN0_EN(0);
-                                       lcdc_msk_reg(lcdc_dev,
-                                                    WIN0_CTRL0, mask,val);
-                               }
-                               lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_LCDC_STANDBY,
-                                            v_LCDC_STANDBY(1));*/
-                               lcdc_msk_reg(lcdc_dev, SYS_CTRL,
-                                                      m_WIN0_EN, v_WIN0_EN(0));
-                               lcdc_cfg_done(lcdc_dev);
-                               mdelay(50);
-                               rockchip_iovmm_activate(dev_drv->dev);
-                               rk312x_lcdc_mmu_en(dev_drv);
-                               lcdc_msk_reg(lcdc_dev,
-                                            SYS_CTRL, m_WIN0_EN, v_WIN0_EN(1));
-               }
-       }
-       #endif
                for (i = 0; i < ARRAY_SIZE(lcdc_win); i++) {
                        win = dev_drv->win[i];
                        if ((win->state == 0) && (win->last_state == 1)) {
@@ -2454,6 +2440,7 @@ static struct rk_lcdc_drv_ops lcdc_drv_ops = {
        .set_hwc_lut = rk312x_lcdc_set_hwc_lut,
        .set_irq_to_cpu = rk312x_lcdc_set_irq_to_cpu,
        .dsp_black = rk312x_lcdc_dsp_black,
+       .mmu_en = rk312x_lcdc_mmu_en,
 };
 #if 0
 static const struct rk_lcdc_drvdata rk3036_lcdc_drvdata = {
index 99b12020883e2bb7bce60cc29a2f654b893414fc..dd39d61b6c3bb69016ba6ad5fe6145132d03b997 100755 (executable)
@@ -2048,6 +2048,8 @@ ext_win_exit:
        if (!g_first_buf) {
 #if defined(CONFIG_ROCKCHIP_IOMMU)
                if (dev_drv->iommu_enabled) {
+                       if (dev_drv->ops->mmu_en)
+                               dev_drv->ops->mmu_en(dev_drv);
                        freed_index = 0;
                        g_last_timeout = timeout;
                }