X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=drivers%2Fvideo%2Frockchip%2Flcdc%2Frk3036_lcdc.c;h=dbaf15bfafe4c72448ba72d43f2e2296315629a2;hb=eab94f6acfa516bb9913f68abc6392b3d4abc5eb;hp=da1b70bc5efd2bde0b0ebaf5d205ab91e8922a63;hpb=b9c889d03e6c97b54dbd84eb8835d914842511d4;p=firefly-linux-kernel-4.4.55.git diff --git a/drivers/video/rockchip/lcdc/rk3036_lcdc.c b/drivers/video/rockchip/lcdc/rk3036_lcdc.c index da1b70bc5efd..dbaf15bfafe4 100755 --- a/drivers/video/rockchip/lcdc/rk3036_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3036_lcdc.c @@ -324,15 +324,23 @@ static void lcdc_layer_update_regs(struct lcdc_device *lcdc_dev, } else { win->area[0].y_addr = 0; win->area[0].uv_addr = 0; - if (win->id == 0) + if (win->id == 0) { lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN0_EN, v_WIN0_EN(0)); - else if (win->id == 1) + lcdc_writel(lcdc_dev, WIN0_YRGB_MST, + win->area[0].y_addr); + lcdc_writel(lcdc_dev, WIN0_CBR_MST, + win->area[0].uv_addr); + } else if (win->id == 1) { lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_WIN1_EN, v_WIN1_EN(0)); - else if (win->id == 2) + lcdc_writel(lcdc_dev, WIN1_MST, win->area[0].y_addr); + } else if (win->id == 2) { lcdc_msk_reg(lcdc_dev, - SYS_CTRL, m_HWC_EN, v_HWC_EN(0)); + SYS_CTRL, m_HWC_EN | m_HWC_LODAD_EN, + v_HWC_EN(0) | v_HWC_LODAD_EN(0)); + lcdc_writel(lcdc_dev, HWC_MST, win->area[0].y_addr); + } } rk3036_lcdc_alpha_cfg(lcdc_dev); } @@ -508,6 +516,9 @@ static int rk3036_lcdc_pre_init(struct rk_lcdc_driver *dev_drv) /*backup reg config at uboot*/ rk_lcdc_read_reg_defalut_cfg(lcdc_dev); + if (lcdc_readl(lcdc_dev, AXI_BUS_CTRL) & m_TVE_DAC_DCLK_EN) + dev_drv->cur_screen->type = SCREEN_TVOUT; + lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_AUTO_GATING_EN, v_AUTO_GATING_EN(0)); lcdc_cfg_done(lcdc_dev); @@ -615,7 +626,7 @@ static int rk3036_load_screen(struct rk_lcdc_driver *dev_drv, bool initscreen) v_HASP(screen->mode.hsync_len + left_margin); lcdc_writel(lcdc_dev, DSP_HACT_ST_END, val); - if (screen->mode.vmode == FB_VMODE_INTERLACED) { + if (screen->mode.vmode & FB_VMODE_INTERLACED) { /*First Field Timing*/ lcdc_writel(lcdc_dev, DSP_VTOTAL_VS_END, v_VSYNC(screen->mode.vsync_len) | @@ -717,7 +728,6 @@ static int rk3036_lcdc_open(struct rk_lcdc_driver *dev_drv, int win_id, if ((open) && (!lcdc_dev->atv_layer_cnt)) { rk3036_lcdc_pre_init(dev_drv); rk3036_lcdc_clk_enable(lcdc_dev); - #if defined(CONFIG_ROCKCHIP_IOMMU) if (dev_drv->iommu_enabled) { if (!dev_drv->mmu_dev) { dev_drv->mmu_dev = @@ -734,7 +744,6 @@ 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);*/ @@ -756,12 +765,10 @@ static int rk3036_lcdc_open(struct rk_lcdc_driver *dev_drv, int win_id, if ((!open) && (!lcdc_dev->atv_layer_cnt)) { rk3036_lcdc_disable_irq(lcdc_dev); rk3036_lcdc_reg_update(dev_drv); - #if defined(CONFIG_ROCKCHIP_IOMMU) if (dev_drv->iommu_enabled) { if (dev_drv->mmu_dev) rockchip_iovmm_deactivate(dev_drv->dev); } - #endif rk3036_lcdc_clk_disable(lcdc_dev); } */ @@ -810,7 +817,7 @@ static int rk3036_lcdc_set_par(struct rk_lcdc_driver *dev_drv, int win_id) win->area[0].dsp_stx = win->post_cfg.xpos + screen->mode.left_margin + screen->mode.hsync_len; - if (screen->mode.vmode == FB_VMODE_INTERLACED) { + if (screen->mode.vmode & FB_VMODE_INTERLACED) { win->post_cfg.ysize /= 2; win->area[0].dsp_sty = win->post_cfg.ypos/2 + screen->mode.upper_margin + @@ -1000,7 +1007,8 @@ static int rk3036_lcdc_get_win_id(struct rk_lcdc_driver *dev_drv, } static int rk3036_lcdc_get_win_state(struct rk_lcdc_driver *dev_drv, - int win_id) + int win_id, + int area_id) { return dev_drv->win[win_id]->state; } @@ -1015,7 +1023,9 @@ static int rk3036_lcdc_ovl_mgr(struct rk_lcdc_driver *dev_drv, int swap, int ovl, needswap = 0; if (!swap) { - if (win0->z_order > win1->z_order) + if (win0->z_order >= 0 && + win1->z_order >= 0 && + win0->z_order > win1->z_order) needswap = 1; else needswap = 0; @@ -1138,12 +1148,10 @@ static int rk3036_lcdc_cfg_done(struct rk_lcdc_driver *dev_drv) struct lcdc_device *lcdc_dev = container_of(dev_drv, struct lcdc_device, driver); int i; - unsigned int mask, val; struct rk_lcdc_win *win = NULL; 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; @@ -1161,35 +1169,12 @@ static int rk3036_lcdc_cfg_done(struct rk_lcdc_driver *dev_drv) rk3036_lcdc_mmu_en(dev_drv); } } - #endif lcdc_msk_reg(lcdc_dev, SYS_CTRL, m_LCDC_STANDBY, v_LCDC_STANDBY(lcdc_dev->standby)); for (i = 0; i < ARRAY_SIZE(lcdc_win); i++) { win = dev_drv->win[i]; - if ((win->state == 0) && (win->last_state == 1)) { - switch (win->id) { - case 0: - mask = m_WIN0_EN; - val = v_WIN0_EN(0); - lcdc_msk_reg(lcdc_dev, SYS_CTRL, - mask, val); - break; - case 1: - mask = m_WIN1_EN; - val = v_WIN1_EN(0); - lcdc_msk_reg(lcdc_dev, SYS_CTRL, - mask, val); - break; - case 2: - mask = m_HWC_EN; - val = v_HWC_EN(0); - lcdc_msk_reg(lcdc_dev, SYS_CTRL, - mask, val); - break; - default: - break; - } - } + if ((win->state == 0) && (win->last_state == 1)) + lcdc_layer_update_regs(lcdc_dev, win); win->last_state = win->state; } lcdc_cfg_done(lcdc_dev); @@ -1460,14 +1445,14 @@ static int rk3036_lcdc_poll_vblank(struct rk_lcdc_driver *dev_drv) } static int rk3036_lcdc_get_dsp_addr(struct rk_lcdc_driver *dev_drv, - unsigned int *dsp_addr) + unsigned int dsp_addr[][4]) { struct lcdc_device *lcdc_dev = container_of(dev_drv, struct lcdc_device, driver); if (lcdc_dev->clk_on) { - dsp_addr[0] = lcdc_readl(lcdc_dev, WIN0_YRGB_MST); - dsp_addr[1] = lcdc_readl(lcdc_dev, WIN1_MST); + dsp_addr[0][0] = lcdc_readl(lcdc_dev, WIN0_YRGB_MST); + dsp_addr[1][0] = lcdc_readl(lcdc_dev, WIN1_MST); } return 0; } @@ -1560,14 +1545,10 @@ static int rk3036_lcdc_parse_dt(struct lcdc_device *lcdc_dev) struct device_node *np = lcdc_dev->dev->of_node; int val; -#if defined(CONFIG_ROCKCHIP_IOMMU) if (of_property_read_u32(np, "rockchip,iommu-enabled", &val)) lcdc_dev->driver.iommu_enabled = 0; else lcdc_dev->driver.iommu_enabled = val; -#else - lcdc_dev->driver.iommu_enabled = 0; -#endif if (of_property_read_u32(np, "rockchip,fb-win-map", &val)) lcdc_dev->driver.fb_win_map = FB_DEFAULT_ORDER; else