From fc5a12b87682d144654b1488f2352607af27de6e Mon Sep 17 00:00:00 2001 From: Zheng Yang Date: Wed, 15 Oct 2014 14:31:21 +0800 Subject: [PATCH] rk3036 lcdc: fix uboot display logo kernel open iommu splash --- drivers/video/rockchip/lcdc/rk3036_lcdc.c | 77 +++++++++++++++-------- drivers/video/rockchip/lcdc/rk3036_lcdc.h | 1 + 2 files changed, 52 insertions(+), 26 deletions(-) diff --git a/drivers/video/rockchip/lcdc/rk3036_lcdc.c b/drivers/video/rockchip/lcdc/rk3036_lcdc.c index b0dd1294a4d6..25fc4c4c5936 100755 --- a/drivers/video/rockchip/lcdc/rk3036_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3036_lcdc.c @@ -222,7 +222,7 @@ static int rk3036_lcdc_alpha_cfg(struct lcdc_device *lcdc_dev) lcdc_msk_reg(lcdc_dev, ALPHA_CTRL, mask, val); } - if(lcdc_dev->driver.win[2]->state == 1) { + if (lcdc_dev->driver.win[2]->state == 1) { mask = m_HWC_ALPAH_EN; val = v_HWC_ALPAH_EN(1); lcdc_msk_reg(lcdc_dev, ALPHA_CTRL, mask, val); @@ -302,13 +302,17 @@ static void lcdc_layer_update_regs(struct lcdc_device *lcdc_dev, mask = m_HWC_EN | m_HWC_LODAD_EN; val = v_HWC_EN(win->state) | v_HWC_LODAD_EN(1); lcdc_msk_reg(lcdc_dev, SYS_CTRL, mask, val); - if((win->area[0].xsize == 32) &&(win->area[0].ysize == 32)) + if ((win->area[0].xsize == 32) && + (win->area[0].ysize == 32)) hwc_size = 0; - else if((win->area[0].xsize == 64) &&(win->area[0].ysize == 64)) + else if ((win->area[0].xsize == 64) && + (win->area[0].ysize == 64)) hwc_size = 1; else - dev_err(lcdc_dev->dev,"unsupport hwc size:x=%d,y=%d\n", - win->area[0].xsize,win->area[0].ysize); + dev_err(lcdc_dev->dev, + "unsupport hwc size:x=%d,y=%d\n", + win->area[0].xsize, + win->area[0].ysize); lcdc_writel(lcdc_dev, HWC_DSP_ST, v_DSP_STX(win->area[0].dsp_stx) | v_DSP_STY(win->area[0].dsp_sty)); @@ -411,7 +415,7 @@ static void rk3036_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; @@ -419,38 +423,40 @@ static void rk3036_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 rk3036_lcdc_set_hwc_lut(struct rk_lcdc_driver *dev_drv, int *hwc_lut,int mode) +static int rk3036_lcdc_set_hwc_lut(struct rk_lcdc_driver *dev_drv, + int *hwc_lut, int mode) { int i = 0; int __iomem *c; int v; - int len=256*4; + int len = 256*4; + struct lcdc_device *lcdc_dev = - container_of(dev_drv, struct lcdc_device, driver); - if(dev_drv->hwc_lut == NULL) { + container_of(dev_drv, struct lcdc_device, driver); + if (dev_drv->hwc_lut == NULL) dev_drv->hwc_lut = devm_kzalloc(lcdc_dev->dev, len, GFP_KERNEL); - } + spin_lock(&lcdc_dev->reg_lock); lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_HWC_LUT_EN, v_HWC_LUT_EN(0)); lcdc_cfg_done(lcdc_dev); mdelay(25); for (i = 0; i < 256; i++) { - if(mode == 1) + if (mode == 1) dev_drv->hwc_lut[i] = hwc_lut[i]; v = dev_drv->hwc_lut[i]; c = lcdc_dev->hwc_lut_addr_base + i; writel_relaxed(v, c); } lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_HWC_LUT_EN, v_HWC_LUT_EN(1)); - lcdc_cfg_done(lcdc_dev); - spin_unlock(&lcdc_dev->reg_lock); - + lcdc_cfg_done(lcdc_dev); + spin_unlock(&lcdc_dev->reg_lock); return 0; - } + +#if 0 static int rk3036_lcdc_set_dclk(struct rk_lcdc_driver *dev_drv) { #ifdef CONFIG_RK_FPGA @@ -475,7 +481,7 @@ static int rk3036_lcdc_set_dclk(struct rk_lcdc_driver *dev_drv) lcdc_dev->driver.name, clk_get_rate(lcdc_dev->dclk), fps); return 0; } - +#endif /********do basic init*********/ static int rk3036_lcdc_pre_init(struct rk_lcdc_driver *dev_drv) { @@ -717,8 +723,7 @@ static int rk3036_lcdc_open(struct rk_lcdc_driver *dev_drv, int win_id, dev_drv->mmu_dts_name); if (dev_drv->mmu_dev) { rk_fb_platform_set_sysmmu(dev_drv->mmu_dev, - dev_drv->dev); - rockchip_iovmm_activate(dev_drv->dev); + dev_drv->dev); } else { dev_err(dev_drv->dev, "failed to get iommu device\n" @@ -729,10 +734,10 @@ static int rk3036_lcdc_open(struct rk_lcdc_driver *dev_drv, int win_id, } #endif rk3036_lcdc_reg_restore(lcdc_dev); - if (dev_drv->iommu_enabled) - rk3036_lcdc_mmu_en(dev_drv); + /*if (dev_drv->iommu_enabled) + rk3036_lcdc_mmu_en(dev_drv);*/ if ((support_uboot_display() && (lcdc_dev->prop == PRMRY))) { - rk3036_lcdc_set_dclk(dev_drv); + /*rk3036_lcdc_set_dclk(dev_drv);*/ rk3036_lcdc_enable_irq(dev_drv); } else { rk3036_load_screen(dev_drv, 1); @@ -913,7 +918,7 @@ static int rk3036_lcdc_pan_display(struct rk_lcdc_driver *dev_drv, int win_id) win = dev_drv->win[1]; } else if (win_id == 2) { win = dev_drv->win[2]; - }else { + } else { dev_err(dev_drv->dev, "invalid win number:%d!\n", win_id); return -EINVAL; } @@ -1122,6 +1127,26 @@ static int rk3036_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_msk_reg(lcdc_dev, SYS_CTRL, + m_WIN0_EN, + v_WIN0_EN(0)); + } + 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); + rk3036_lcdc_mmu_en(dev_drv); + } + } + #endif + lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_LCDC_STANDBY, v_LCDC_STANDBY(lcdc_dev->standby)); lcdc_cfg_done(lcdc_dev); @@ -1469,7 +1494,7 @@ static struct rk_lcdc_drv_ops lcdc_drv_ops = { .get_dsp_bcsh_bcs = rk3036_lcdc_get_bcsh_bcs, .open_bcsh = rk3036_lcdc_open_bcsh, .set_overscan = rk3036_lcdc_set_overscan, - .set_hwc_lut = rk3036_lcdc_set_hwc_lut, + .set_hwc_lut = rk3036_lcdc_set_hwc_lut, }; static int rk3036_lcdc_parse_dt(struct lcdc_device *lcdc_dev) @@ -1523,7 +1548,7 @@ static int rk3036_lcdc_probe(struct platform_device *pdev) return PTR_ERR(lcdc_dev->regsbak); lcdc_dev->hwc_lut_addr_base = (lcdc_dev->regs + HWC_LUT_ADDR); - + lcdc_dev->prop = PRMRY; dev_set_name(lcdc_dev->dev, "lcdc%d", lcdc_dev->id); dev_drv = &lcdc_dev->driver; dev_drv->dev = dev; diff --git a/drivers/video/rockchip/lcdc/rk3036_lcdc.h b/drivers/video/rockchip/lcdc/rk3036_lcdc.h index b2b75e125cfd..3c988e59d4b8 100755 --- a/drivers/video/rockchip/lcdc/rk3036_lcdc.h +++ b/drivers/video/rockchip/lcdc/rk3036_lcdc.h @@ -503,6 +503,7 @@ struct lcdc_device { u32 pixclock; u32 standby; /*1:standby,0:work*/ + u32 iommu_status; }; static inline -- 2.34.1