From 68609f11d59121c4e1a7441dfc5cb61258739c35 Mon Sep 17 00:00:00 2001 From: yxj Date: Mon, 12 Nov 2012 09:34:49 +0800 Subject: [PATCH] rk2928 lcdc:switch all lcdc io to gpio mode when hdmi plug in --- drivers/video/rockchip/lcdc/rk2928_lcdc.c | 14 +++++++++++++- drivers/video/rockchip/rk_fb.c | 5 +++++ include/linux/rk_fb.h | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/video/rockchip/lcdc/rk2928_lcdc.c b/drivers/video/rockchip/lcdc/rk2928_lcdc.c index fe8cc8d9c1ba..55434bc83c5f 100644 --- a/drivers/video/rockchip/lcdc/rk2928_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk2928_lcdc.c @@ -1006,6 +1006,16 @@ static int rk2928_fb_get_layer(struct rk_lcdc_device_driver *dev_drv,const char return layer_id; } +static int rk2928_lcdc_hdmi_process(struct rk_lcdc_device_driver *dev_drv,int mode) +{ + if(mode) + rk2928_lcdc_iomux(dev_drv->screen0,0); //switch to gpio mode,to avoid current leakage + else + rk2928_lcdc_iomux(dev_drv->screen0,1); //switch to gpio mode,to avoid current leakage + + return 0; + +} int rk2928_lcdc_early_suspend(struct rk_lcdc_device_driver *dev_drv) { struct rk2928_lcdc_device *lcdc_dev = container_of(dev_drv,struct rk2928_lcdc_device,driver); @@ -1042,6 +1052,7 @@ int rk2928_lcdc_early_suspend(struct rk_lcdc_device_driver *dev_drv) } + int rk2928_lcdc_early_resume(struct rk_lcdc_device_driver *dev_drv) { struct rk2928_lcdc_device *lcdc_dev = container_of(dev_drv,struct rk2928_lcdc_device,driver); @@ -1123,6 +1134,7 @@ static struct rk_lcdc_device_driver lcdc_driver = { .fps_mgr = rk2928_lcdc_fps_mgr, .fb_get_layer = rk2928_fb_get_layer, .fb_layer_remap = rk2928_fb_layer_remap, + .lcdc_hdmi_process = rk2928_lcdc_hdmi_process, }; #ifdef CONFIG_PM static int rk2928_lcdc_suspend(struct platform_device *pdev, pm_message_t state) @@ -1298,7 +1310,7 @@ static int __init rk2928_lcdc_init(void) static void __exit rk2928_lcdc_exit(void) { - platform_driver_unregister(&rk2928lcdc_driver); + platform_driver_unregister(&rk2928lcdc_driver); } diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index cf44ce11fc64..586f1618932b 100644 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -748,6 +748,9 @@ int rk_fb_switch_screen(rk_screen *screen ,int enable ,int lcdc_id) ret = info->fbops->fb_open(info,1); ret = dev_drv->load_screen(dev_drv,1); ret = info->fbops->fb_set_par(info); + if(dev_drv->lcdc_hdmi_process) + dev_drv->lcdc_hdmi_process(dev_drv,enable); + #if defined(CONFIG_DUAL_LCDC_DUAL_DISP_IN_KERNEL) if(likely(inf->num_lcdc == 2)) { @@ -964,6 +967,8 @@ static int init_lcdc_device_driver(struct rk_lcdc_device_driver *dev_drv, dev_drv->set_dsp_lut = def_drv->set_dsp_lut; if(def_drv->read_dsp_lut) dev_drv->read_dsp_lut = def_drv->read_dsp_lut; + if(def_drv->lcdc_hdmi_process) + dev_drv->lcdc_hdmi_process = def_drv->lcdc_hdmi_process; init_layer_par(dev_drv); init_completion(&dev_drv->frame_done); spin_lock_init(&dev_drv->cpl_lock); diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h index 1ab21b6f1d11..feb79735ff00 100644 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -236,6 +236,7 @@ struct rk_lcdc_device_driver{ int (*fb_layer_remap)(struct rk_lcdc_device_driver *dev_drv,enum fb_win_map_order order); int (*set_dsp_lut)(struct rk_lcdc_device_driver *dev_drv,int *lut); int (*read_dsp_lut)(struct rk_lcdc_device_driver *dev_drv,int *lut); + int (*lcdc_hdmi_process)(struct rk_lcdc_device_driver *dev_drv,int mode); //some lcdc need to some process in hdmi mode }; -- 2.34.1