osd: osd: screen blank when boot [1/1]

PD#172587

Problem:
screen blank when boot

Solution:
modify free_scale_switch

Verify:
verified on tl1 dev board

Change-Id: I3c53e832c83c71bd8e98f71fcd654865a467df3c
Signed-off-by: Jian Cao <jian.cao@amlogic.com>
This commit is contained in:
Jian Cao
2018-11-15 17:37:14 +08:00
committed by Luan Yuan
parent 53e798105c
commit d0d69c9aaf
2 changed files with 35 additions and 24 deletions

View File

@@ -2929,9 +2929,18 @@ static ssize_t free_scale_switch(struct device *device,
ret = kstrtoint(buf, 0, &res);
free_scale_enable = res;
osd_switch_free_scale(
(fb_info->node == DEV_OSD0) ? DEV_OSD1 : DEV_OSD0,
0, 0, fb_info->node, 1, free_scale_enable);
if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE)
osd_switch_free_scale(
(fb_info->node == DEV_OSD0) ? DEV_OSD0 : DEV_OSD1,
1, free_scale_enable, fb_info->node, 1,
free_scale_enable);
else
osd_switch_free_scale(
(fb_info->node == DEV_OSD0) ? DEV_OSD1 : DEV_OSD0,
0, 0, fb_info->node, 1,
free_scale_enable);
osd_log_info("free_scale_switch to fb%d, mode: 0x%x\n",
fb_info->node, free_scale_enable);
return count;

View File

@@ -3018,8 +3018,6 @@ void osd_switch_free_scale(
int i = 0;
int count = (pxp_mode == 1)?3:WAIT_AFBC_READY_COUNT;
if (osd_hw.osd_meson_dev.osd_ver == OSD_HIGH_ONE)
return;
osd_log_info("osd[%d] enable: %d scale:0x%x (%s)\n",
pre_index, pre_enable, pre_scale, current->comm);
osd_log_info("osd[%d] enable: %d scale:0x%x (%s)\n",
@@ -3036,16 +3034,17 @@ void osd_switch_free_scale(
if (i > 0)
osd_log_info("osd[%d]: wait %d vsync first buffer ready.\n",
next_index, i);
h_enable = (pre_scale & 0xffff0000 ? 1 : 0);
v_enable = (pre_scale & 0xffff ? 1 : 0);
osd_hw.free_scale[pre_index].h_enable = h_enable;
osd_hw.free_scale[pre_index].v_enable = v_enable;
osd_hw.free_scale_enable[pre_index] = pre_scale;
osd_hw.free_scale_backup[pre_index].h_enable = h_enable;
osd_hw.free_scale_backup[pre_index].v_enable = v_enable;
osd_hw.free_scale_enable_backup[pre_index] = pre_scale;
osd_hw.enable[pre_index] = pre_enable;
if (pre_index != next_index) {
h_enable = (pre_scale & 0xffff0000 ? 1 : 0);
v_enable = (pre_scale & 0xffff ? 1 : 0);
osd_hw.free_scale[pre_index].h_enable = h_enable;
osd_hw.free_scale[pre_index].v_enable = v_enable;
osd_hw.free_scale_enable[pre_index] = pre_scale;
osd_hw.free_scale_backup[pre_index].h_enable = h_enable;
osd_hw.free_scale_backup[pre_index].v_enable = v_enable;
osd_hw.free_scale_enable_backup[pre_index] = pre_scale;
osd_hw.enable[pre_index] = pre_enable;
}
h_enable = (next_scale & 0xffff0000 ? 1 : 0);
v_enable = (next_scale & 0xffff ? 1 : 0);
osd_hw.free_scale[next_index].h_enable = h_enable;
@@ -3066,14 +3065,16 @@ void osd_switch_free_scale(
osd_afbc_dec_enable = 0;
osd_hw.reg[OSD_GBL_ALPHA].update_func(next_index);
}
osd_hw.reg[OSD_COLOR_MODE].update_func(pre_index);
if (pre_scale)
osd_hw.reg[OSD_FREESCALE_COEF].update_func(pre_index);
osd_hw.reg[DISP_GEOMETRY].update_func(pre_index);
osd_hw.reg[DISP_FREESCALE_ENABLE].update_func(pre_index);
osd_hw.reg[OSD_ENABLE].update_func(pre_index);
if (pre_index != next_index) {
osd_hw.reg[OSD_COLOR_MODE].update_func(pre_index);
if (pre_scale)
osd_hw.reg[OSD_FREESCALE_COEF].
update_func(pre_index);
osd_hw.reg[DISP_GEOMETRY].update_func(pre_index);
osd_hw.reg[DISP_FREESCALE_ENABLE].
update_func(pre_index);
osd_hw.reg[OSD_ENABLE].update_func(pre_index);
}
osd_hw.reg[OSD_COLOR_MODE].update_func(next_index);
if (next_scale)
osd_hw.reg
@@ -3085,7 +3086,8 @@ void osd_switch_free_scale(
spin_unlock_irqrestore(&osd_lock, lock_flags);
osd_wait_vsync_hw();
} else {
osd_enable_hw(pre_index, pre_enable);
if (pre_index != next_index)
osd_enable_hw(pre_index, pre_enable);
osd_enable_hw(next_index, next_enable);
}
}