From: yzq Date: Mon, 23 Jul 2012 09:47:06 +0000 (+0800) Subject: rk2928 lvds support X-Git-Tag: firefly_0821_release~8912^2~71 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=4c9e1d535cc0074da7f39ea5e0f9d27d3d449c9d;p=firefly-linux-kernel-4.4.55.git rk2928 lvds support --- diff --git a/drivers/video/rockchip/Kconfig b/drivers/video/rockchip/Kconfig index 04ba7263c5ac..267b5b5a222e 100755 --- a/drivers/video/rockchip/Kconfig +++ b/drivers/video/rockchip/Kconfig @@ -75,3 +75,4 @@ config THREE_FB_BUFFER select y if android support three buffer,like Jelly Bean source "drivers/video/rockchip/hdmi/Kconfig" source "drivers/video/rockchip/rga/Kconfig" +source "drivers/video/rockchip/lvds/Kconfig" diff --git a/drivers/video/rockchip/Makefile b/drivers/video/rockchip/Makefile index 68967a49fc80..0f1a3880879e 100755 --- a/drivers/video/rockchip/Makefile +++ b/drivers/video/rockchip/Makefile @@ -5,3 +5,4 @@ obj-$(CONFIG_LCDC_RK2928) += chips/rk2928_lcdc.o obj-$(CONFIG_LCDC_RK31) += chips/rk31_lcdc.o obj-$(CONFIG_RGA_RK30) += rga/ obj-$(CONFIG_RK_HDMI) += hdmi/ +obj-$(CONFIG_RK_LVDS) += lvds/ diff --git a/drivers/video/rockchip/chips/rk2928_lcdc.c b/drivers/video/rockchip/chips/rk2928_lcdc.c index 5298a8e98291..71146072f545 100755 --- a/drivers/video/rockchip/chips/rk2928_lcdc.c +++ b/drivers/video/rockchip/chips/rk2928_lcdc.c @@ -31,7 +31,7 @@ #include #include #include "rk2928_lcdc.h" - +#include "../lvds/rk_lvds.h" @@ -68,6 +68,10 @@ static int init_rk2928_lcdc(struct rk_lcdc_device_driver *dev_drv) { printk(KERN_ERR "failed to get lcdc%d clk source\n",lcdc_dev->id); } +#ifdef CONFIG_RK_LVDS + rk_lvds_register(lcdc_dev->screen); +#endif + clk_enable(lcdc_dev->pd); clk_enable(lcdc_dev->hclk); //enable aclk and hclk for register config clk_enable(lcdc_dev->aclk); @@ -685,6 +689,9 @@ 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); + if(lcdc_dev->screen->sscreen_set != NULL) + lcdc_dev->screen->sscreen_set(lcdc_dev->screen , 0); + spin_lock(&lcdc_dev->reg_lock); if(likely(lcdc_dev->clk_on)) { @@ -733,6 +740,9 @@ int rk2928_lcdc_early_resume(struct rk_lcdc_device_driver *dev_drv) lcdc_dev->clk_on = 1; spin_unlock(&lcdc_dev->reg_lock); + if(lcdc_dev->screen->sscreen_set != NULL) + lcdc_dev->screen->sscreen_set(lcdc_dev->screen , 1); + return 0; } static irqreturn_t rk2928_lcdc_isr(int irq, void *dev_id) diff --git a/drivers/video/rockchip/lvds/Kconfig b/drivers/video/rockchip/lvds/Kconfig new file mode 100755 index 000000000000..1577242cb924 --- /dev/null +++ b/drivers/video/rockchip/lvds/Kconfig @@ -0,0 +1,2 @@ +config RK_LVDS + bool "RK_LVDS support" diff --git a/drivers/video/rockchip/lvds/Makefile b/drivers/video/rockchip/lvds/Makefile new file mode 100755 index 000000000000..f410fda78ee1 --- /dev/null +++ b/drivers/video/rockchip/lvds/Makefile @@ -0,0 +1,6 @@ +# +# Makefile for LVDS linux kernel module. +# + + +obj-$(CONFIG_RK_LVDS) += rk_lvds.o diff --git a/drivers/video/rockchip/lvds/rk_lvds.c b/drivers/video/rockchip/lvds/rk_lvds.c new file mode 100644 index 000000000000..0fd1656120cb --- /dev/null +++ b/drivers/video/rockchip/lvds/rk_lvds.c @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include +#include "rk_lvds.h" + +static void rk_output_lvds(rk_screen *screen) +{ + LVDSWrReg(m_PD_PLL(1)|m_PD_PLL(0)|m_PDN(1)|m_OEN(0) \ + |m_DS(DS_10PF)|m_MSBSEL(DATA_D0_MSB) \ + |m_OUT_FORMAT(screen->hw_format) \ + |m_LCDC_SEL(FROM_LCDC0)); +} + +static void rk_output_lvttl(rk_screen *screen) +{ + LVDSWrReg(m_PD_PLL(0)|m_PD_PLL(1)|m_PDN(0)|m_OEN(1) \ + |m_DS(DS_10PF)|m_MSBSEL(DATA_D0_MSB) \ + |m_OUT_FORMAT(screen->hw_format) \ + |m_LCDC_SEL(FROM_LCDC0)); +} + +static void rk_output_disable(void) +{ + LVDSWrReg(m_PD_PLL(0)|m_PD_PLL(0)|m_PDN(0)|m_OEN(0)); +} + +static int rk_lvds_set_param(rk_screen *screen,bool enable ) +{ + if(OUT_ENABLE == enable){ + switch(screen->type){ + case SCREEN_LVDS: + rk_output_lvds(screen); + break; + case SCREEN_RGB: + rk_output_lvttl(screen); + break; + default: + printk("%s>>>>LVDS not support this screen type %d,power down LVDS\n",__func__,screen->type); + rk_output_disable(); + break; + } + }else{ + rk_output_disable(); + } + return 0; +} + +int rk_lvds_register(rk_screen *screen) +{ + if(screen->sscreen_set == NULL) + screen->sscreen_set = rk_lvds_set_param; + + rk_lvds_set_param(screen , OUT_ENABLE); + + return 0; +} diff --git a/drivers/video/rockchip/lvds/rk_lvds.h b/drivers/video/rockchip/lvds/rk_lvds.h new file mode 100644 index 000000000000..3916fad54a90 --- /dev/null +++ b/drivers/video/rockchip/lvds/rk_lvds.h @@ -0,0 +1,93 @@ +#ifndef RK_LVDS_H_ +#define RK_LVDS_H + +#define LVDS_CON0_OFFSET 0x150 +#define LVDS_CON0_REG (RK2928_GRF_PHYS + LVDS_CON0_OFFSET) + +#define LVDSRdReg() __raw_readl(LVDS_CON0_REG) +#define LVDSWrReg(val) __raw_writel( val ,LVDS_CON0_REG) + +#define m_value(x,offset,mask) \ + ((mask<<(offset+8)) | (x&mask)<