} 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);
}
/*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);
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;
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);
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);
} 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_msk_reg(lcdc_dev, SYS_CTRL, m_HWC_EN, v_HWC_EN(0));
+ 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 | m_HWC_LODAD_EN,
+ v_HWC_EN(0) | v_HWC_LODAD_EN(0));
+ lcdc_writel(lcdc_dev, HWC_MST, win->area[0].y_addr);
+ }
}
rk312x_lcdc_alpha_cfg(lcdc_dev);
}
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) {
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);
}
}
dev_drv->ops->ovl_mgr(dev_drv, 0, 1);
- if (rk_fb->disp_policy == DISPLAY_POLICY_BOX)
- dev_drv->ops->cfg_done(dev_drv);
+
#if defined(CONFIG_RK_HDMI)
if ((rk_fb->disp_mode == DUAL)
&& (hdmi_get_hotplug() == HDMI_HPD_ACTIVED)
for (i = 0; i < dev_drv->lcdc_win_num; i++) {
if (dev_drv->win[i]->state == 1) {
if (rk_fb->disp_policy == DISPLAY_POLICY_BOX &&
- (dev_drv->win[i]->area[0].format == YUV420 ||
- dev_drv->win[i]->area[0].format == YUV420_A ||
- !strcmp(dev_drv->win[i]->name, "hwc"))) {
+ (!strcmp(dev_drv->win[i]->name, "hwc"))) {
continue;
} else {
u32 new_start =
if ((rk_fb->disp_policy ==
DISPLAY_POLICY_BOX) &&
- (new_start == 0x0 ||
- dev_drv->suspend_flag))
+ (dev_drv->suspend_flag))
continue;
if (unlikely(new_start != reg_start)) {
wait_for_vsync = true;
if ((area_par->xpos + area_par->xsize > screen->mode.xres) ||
(area_par->ypos + area_par->ysize > screen->mode.yres) ||
(area_par->xsize <= 0) || (area_par->ysize <= 0)) {
- pr_err("check config var fail 1:\n"
+ pr_warn("check config var fail 1:\n"
"xpos=%d,xsize=%d,xres=%d\n"
"ypos=%d,ysize=%d,yres=%d\n",
area_par->xpos, area_par->xsize, screen->mode.xres,
if (!usr_fd) {
fix->smem_start = 0;
fix->mmio_start = 0;
+ dev_drv->ops->open(dev_drv, win_id, 0);
break;
}
usr_fd = yuv_phy[0];
offset = yuv_phy[1] - yuv_phy[0];
-
if (!usr_fd) {
fix->smem_start = 0;
fix->mmio_start = 0;
if (dev_drv->ops->set_screen_scaler)
dev_drv->ops->set_screen_scaler(dev_drv, dev_drv->screen0, 0);
}
-
+ if (dev_drv->uboot_logo && (screen->type != dev_drv->cur_screen->type))
+ dev_drv->uboot_logo = 0;
if (!enable) {
/* if screen type is different, we do not disable lcdc. */
if (dev_drv->cur_screen->type != screen->type)