From 2191056110deaeff97798404ec20808b1f36ca9e Mon Sep 17 00:00:00 2001 From: hjc Date: Fri, 26 Sep 2014 16:01:07 +0800 Subject: [PATCH] rk3036 hdmi: support uboot display logo --- arch/arm/boot/dts/rk3128-box.dts | 1 + .../hdmi/chips/rk3036/rk3036_hdmi_hw.c | 12 ++++-- drivers/video/rockchip/hdmi/rk_hdmi.h | 2 + drivers/video/rockchip/hdmi/rk_hdmi_task.c | 42 +++++++++++++++---- 4 files changed, 46 insertions(+), 11 deletions(-) diff --git a/arch/arm/boot/dts/rk3128-box.dts b/arch/arm/boot/dts/rk3128-box.dts index d71b76e77aad..4bfd4993fcbd 100755 --- a/arch/arm/boot/dts/rk3128-box.dts +++ b/arch/arm/boot/dts/rk3128-box.dts @@ -191,6 +191,7 @@ &fb { rockchip,disp-mode = ; + rockchip,uboot-logo-on = <0>; }; &lcdc { diff --git a/drivers/video/rockchip/hdmi/chips/rk3036/rk3036_hdmi_hw.c b/drivers/video/rockchip/hdmi/chips/rk3036/rk3036_hdmi_hw.c index 4fd7ada73849..df65daa3c4cb 100755 --- a/drivers/video/rockchip/hdmi/chips/rk3036/rk3036_hdmi_hw.c +++ b/drivers/video/rockchip/hdmi/chips/rk3036/rk3036_hdmi_hw.c @@ -721,6 +721,10 @@ void rk3036_hdmi_control_output(struct hdmi *hdmi_drv, int enable) struct rk_hdmi_device *hdmi_dev = container_of(hdmi_drv, struct rk_hdmi_device, driver); + if (hdmi_drv->uboot_logo) { + hdmi_drv->uboot_logo = 0; + return; + } if (enable) { if (hdmi_drv->pwr_mode == LOWER_PWR) @@ -801,6 +805,7 @@ static int rk3036_hdmi_debug(struct hdmi *hdmi_drv,int cmd) switch(cmd) { case 0: printk("%s[%d]:cmd=%d\n",__func__,__LINE__,cmd); + rk3036_hdmi_irq(hdmi_drv); break; case 1: printk("%s[%d]:cmd=%d\n",__func__,__LINE__,cmd); @@ -830,9 +835,10 @@ int rk3036_hdmi_initial(struct hdmi *hdmi_drv) hdmi_drv->insert = rk3036_hdmi_insert; hdmi_drv->ops = &hdmi_drv_ops; - rk3036_hdmi_reset_pclk(); - rk3036_hdmi_reset(hdmi_drv); - + if (!hdmi_drv->uboot_logo) { + rk3036_hdmi_reset_pclk(); + rk3036_hdmi_reset(hdmi_drv); + } if (hdmi_drv->hdcp_power_on_cb) rc = hdmi_drv->hdcp_power_on_cb(); diff --git a/drivers/video/rockchip/hdmi/rk_hdmi.h b/drivers/video/rockchip/hdmi/rk_hdmi.h index d962ff83f33d..ff5bb3d9553b 100755 --- a/drivers/video/rockchip/hdmi/rk_hdmi.h +++ b/drivers/video/rockchip/hdmi/rk_hdmi.h @@ -363,6 +363,8 @@ struct hdmi { int yscale; /* y directoon scale value */ int tmdsclk; /* TDMS Clock frequency */ int pixclock; /* Pixel Clcok frequency */ + int uboot_logo; + int uboot_vic; struct list_head pwrlist_head; diff --git a/drivers/video/rockchip/hdmi/rk_hdmi_task.c b/drivers/video/rockchip/hdmi/rk_hdmi_task.c index 0728b04125b0..49ca854ef940 100755 --- a/drivers/video/rockchip/hdmi/rk_hdmi_task.c +++ b/drivers/video/rockchip/hdmi/rk_hdmi_task.c @@ -9,7 +9,7 @@ #define HDMI_MAX_ID 1 static char *envp[] = { "INTERFACE=HDMI", NULL }; - +static int uboot_vic; static void hdmi_sys_show_state(struct hdmi *hdmi) { switch (hdmi->state) { @@ -48,13 +48,22 @@ static void hdmi_sys_show_state(struct hdmi *hdmi) int hdmi_sys_init(struct hdmi *hdmi) { - hdmi->hotplug = HDMI_HPD_REMOVED; - hdmi->state = HDMI_SLEEP; - hdmi->enable = HDMI_ENABLE; + hdmi->uboot_logo = support_uboot_display(); + printk("%s,uboot-logo=%d,uboot_vic=%d\n",__func__,hdmi->uboot_logo,uboot_vic); + if (hdmi->uboot_logo) { + hdmi->hotplug = HDMI_HPD_ACTIVED; + hdmi->state = PLAY_BACK; + hdmi->enable = HDMI_ENABLE; + hdmi->display = HDMI_DISABLE; + hdmi->vic = uboot_vic; + } else { + hdmi->hotplug = HDMI_HPD_REMOVED; + hdmi->state = HDMI_SLEEP; + hdmi->enable = HDMI_ENABLE; + hdmi->display = HDMI_DISABLE; + hdmi->vic = HDMI_VIDEO_DEFAULT_MODE; + } hdmi->autoconfig = HDMI_AUTO_CONFIGURE; - hdmi->display = HDMI_DISABLE; - - hdmi->vic = HDMI_VIDEO_DEFAULT_MODE; hdmi->audio.channel = HDMI_AUDIO_DEFAULT_CHANNEL; hdmi->audio.rate = HDMI_AUDIO_DEFAULT_RATE; hdmi->audio.word_length = HDMI_AUDIO_DEFAULT_WORD_LENGTH; @@ -211,6 +220,10 @@ void hdmi_work(struct work_struct *work) hdmi->hotplug = hotplug; } else if (hotplug == HDMI_HPD_REMOVED) { hdmi_sys_sleep(hdmi); + } else if (hotplug == HDMI_HPD_ACTIVED) { + if (hdmi->insert) + hdmi->insert(hdmi); + hdmi->state = READ_PARSE_EDID; } do { hdmi_sys_show_state(hdmi); @@ -239,6 +252,9 @@ void hdmi_work(struct work_struct *work) #endif rockchip_set_system_status(SYS_STATUS_HDMI); } + if (hdmi->uboot_logo) { + hdmi->state = CONFIG_AUDIO; + } break; case SYSTEM_CONFIG: if (hdmi->remove) @@ -296,7 +312,17 @@ void hdmi_work(struct work_struct *work) } while ((hdmi->state != state_last || (rc != HDMI_ERROR_SUCESS)) && trytimes < HDMI_MAX_TRY_TIMES); - hdmi_dbg(hdmi->dev, "[%s] done\n", __func__); mutex_unlock(&work_mutex); } + +static int __init bootloader_setup(char *str) +{ + if(str) { + printk("hdmi init vic is %s\n", str); + sscanf(str, "%d", &uboot_vic); + } + /*uboot_vic = 16;*/ + return 0; +} +early_param("hdmi.vic", bootloader_setup); -- 2.34.1