rk fb: fix uboot display logo kernel open iommu splash
authorhjc <hjc@rock-chips.com>
Sat, 11 Oct 2014 03:48:22 +0000 (11:48 +0800)
committerhjc <hjc@rock-chips.com>
Sat, 11 Oct 2014 10:30:36 +0000 (18:30 +0800)
drivers/video/rockchip/lcdc/rk312x_lcdc.c
drivers/video/rockchip/lcdc/rk312x_lcdc.h
drivers/video/rockchip/rk_fb.c

index f600bdbd6680be0044972c544dd0a54df7822140..d87484207e6f3f81a85addf14a3855a76cc969dc 100755 (executable)
@@ -582,7 +582,7 @@ static void rk312x_lcdc_mmu_en(struct rk_lcdc_driver *dev_drv)
        struct lcdc_device *lcdc_dev =
            container_of(dev_drv, struct lcdc_device, driver);
 
-       spin_lock(&lcdc_dev->reg_lock);
+       //spin_lock(&lcdc_dev->reg_lock);
        if (likely(lcdc_dev->clk_on)) {
                mask = m_MMU_EN | m_AXI_MAX_OUTSTANDING_EN |
                        m_AXI_OUTSTANDING_MAX_NUM;
@@ -590,7 +590,7 @@ static void rk312x_lcdc_mmu_en(struct rk_lcdc_driver *dev_drv)
                        v_AXI_MAX_OUTSTANDING_EN(1);
                lcdc_msk_reg(lcdc_dev, AXI_BUS_CTRL, mask, val);
        }
-       spin_unlock(&lcdc_dev->reg_lock);
+       //spin_unlock(&lcdc_dev->reg_lock);
 }
 static int rk312x_lcdc_set_hwc_lut(struct rk_lcdc_driver *dev_drv, int *hwc_lut,int mode)
 {
@@ -706,12 +706,12 @@ static int rk312x_lcdc_pre_init(struct rk_lcdc_driver *dev_drv)
 
        lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_AUTO_GATING_EN, v_AUTO_GATING_EN(0));
        lcdc_cfg_done(lcdc_dev);
-       if (dev_drv->iommu_enabled) {/* disable all wins to workaround iommu pagefault */
+       /*if (dev_drv->iommu_enabled) {// disable all wins to workaround iommu pagefault 
                lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN0_EN | m_WIN1_EN,
                             v_WIN0_EN(0) | v_WIN1_EN(0));
                lcdc_cfg_done(lcdc_dev); 
                while(lcdc_readl(lcdc_dev, SYS_CTRL) & (m_WIN0_EN | m_WIN1_EN));
-       }
+       }*/
        if ((dev_drv->ops->open_bcsh)&&(dev_drv->output_color == COLOR_YCBCR))
                dev_drv->ops->open_bcsh(dev_drv,1);
        lcdc_dev->pre_init = true;
@@ -1335,13 +1335,13 @@ static int rk312x_lcdc_open(struct rk_lcdc_driver *dev_drv, int win_id,
                                        return -1;
                                }
                        }
-                       if (dev_drv->mmu_dev)
-                               rockchip_iovmm_activate(dev_drv->dev);
+                       /*if (dev_drv->mmu_dev)
+                               rockchip_iovmm_activate(dev_drv->dev);*/
                }
 #endif
                rk312x_lcdc_reg_restore(lcdc_dev);
-               if (dev_drv->iommu_enabled)
-                       rk312x_lcdc_mmu_en(dev_drv);
+               /*if (dev_drv->iommu_enabled)
+                       rk312x_lcdc_mmu_en(dev_drv);*/
                if ((support_uboot_display() && (lcdc_dev->prop == PRMRY))) {
                        /*rk312x_lcdc_set_dclk(dev_drv);*/
                        rk312x_lcdc_enable_irq(dev_drv);
@@ -1733,8 +1733,31 @@ static int rk312x_lcdc_cfg_done(struct rk_lcdc_driver *dev_drv)
        struct lcdc_device *lcdc_dev = container_of(dev_drv,
                                                    struct lcdc_device, driver);
        spin_lock(&lcdc_dev->reg_lock);
-       if (lcdc_dev->clk_on)
+       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_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_LCDC_STANDBY,
+                                            v_LCDC_STANDBY(0));                                
+               }
+       }
+       #endif
                lcdc_cfg_done(lcdc_dev);
+
+       }
        spin_unlock(&lcdc_dev->reg_lock);
        return 0;
 }
index 9defd111dfb384c854353554aa91af64e3816e8f..eeeed0db495029062681708d8f66e053096727af 100755 (executable)
@@ -691,6 +691,7 @@ struct lcdc_device {
 
        u32 standby;                    /* 1:standby,0:work */
        struct backlight_device *backlight;
+       u32 iommu_status;
 };
 
 static inline void lcdc_writel(struct lcdc_device *lcdc_dev, u32 offset, u32 v)
index eda5748ad05202a4552359257078f2c5d8fcffb6..ad9b02803fc205fa73ef01b36dc8c42ff44aa3e5 100755 (executable)
@@ -1438,7 +1438,7 @@ void rk_fd_fence_wait(struct rk_lcdc_driver *dev_drv, struct sync_fence *fence)
        if (err < 0)
                printk("error waiting on fence\n");
 }
-
+#if 0
 static int rk_fb_copy_from_loader(struct fb_info *info)
 {
        struct rk_lcdc_driver *dev_drv = (struct rk_lcdc_driver *)info->par;
@@ -1466,7 +1466,7 @@ static int rk_fb_copy_from_loader(struct fb_info *info)
                                      info->fix.smem_start);
        return 0;
 }
-
+#endif
 #ifdef CONFIG_ROCKCHIP_IOMMU
 static int g_last_addr[4];
 int g_last_timeout;
@@ -3927,8 +3927,8 @@ int rk_fb_register(struct rk_lcdc_driver *dev_drv,
                rk_fb_alloc_buffer(main_fbi, 0);        /* only alloc memory for main fb */
                dev_drv->uboot_logo = support_uboot_display();
                if (support_uboot_display()) {
-                       if (dev_drv->iommu_enabled) 
-                               rk_fb_copy_from_loader(main_fbi);
+                       /*if (dev_drv->iommu_enabled) 
+                               rk_fb_copy_from_loader(main_fbi);*/
                        return 0;
                }
                main_fbi->fbops->fb_set_par(main_fbi);