From d0d69c9aaf5e339b29cf1b52e09716be5ebcf4a1 Mon Sep 17 00:00:00 2001 From: Jian Cao Date: Thu, 15 Nov 2018 17:37:14 +0800 Subject: [PATCH] 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 --- drivers/amlogic/media/osd/osd_fb.c | 15 ++++++++++--- drivers/amlogic/media/osd/osd_hw.c | 44 ++++++++++++++++++++------------------ 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/drivers/amlogic/media/osd/osd_fb.c b/drivers/amlogic/media/osd/osd_fb.c index 1739a83..d2d0805 100644 --- a/drivers/amlogic/media/osd/osd_fb.c +++ b/drivers/amlogic/media/osd/osd_fb.c @@ -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; diff --git a/drivers/amlogic/media/osd/osd_hw.c b/drivers/amlogic/media/osd/osd_hw.c index e30780f..8d843e3 100644 --- a/drivers/amlogic/media/osd/osd_hw.c +++ b/drivers/amlogic/media/osd/osd_hw.c @@ -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); } } -- 2.7.4