From 97bb163197f3dc3405af90b5159e0f6b8a302586 Mon Sep 17 00:00:00 2001 From: Alison Wang Date: Tue, 11 Dec 2012 15:36:08 +0800 Subject: ENGR00216076-2: DCU: Update DCU driver for PM and blending issue Fix layers blending and reinitialization issue for DCU driver. Update power management part for DCU driver. Signed-off-by: Alison Wang --- drivers/video/mvf_dcu.c | 47 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) (limited to 'drivers/video/mvf_dcu.c') diff --git a/drivers/video/mvf_dcu.c b/drivers/video/mvf_dcu.c index 719e465b77e6..d9fc6fa664c7 100644 --- a/drivers/video/mvf_dcu.c +++ b/drivers/video/mvf_dcu.c @@ -138,6 +138,8 @@ static struct mfb_info mfb_template[] = { }, }; +static int total_open_layers = 0; + static int mvf_dcu_enable_panel(struct fb_info *info) { @@ -422,11 +424,6 @@ static void update_lcdc(struct fb_info *info) writel(DCU_THRESHOLD_LS_BF_VS(0x3) | DCU_THRESHOLD_OUT_BUF_HIGH(0x78) | DCU_THRESHOLD_OUT_BUF_LOW(0), dcu->base + DCU_THRESHOLD); - writel(0, dcu->base + DCU_INT_STATUS); - writel(0, dcu->base + DCU_PARR_ERR_STA_1); - writel(0, dcu->base + DCU_PARR_ERR_STA_2); - writel(0, dcu->base + DCU_PARR_ERR_STA_3); - /* Enable the DCU */ enable_lcdc(info); } @@ -718,10 +715,34 @@ static int mvf_dcu_ioctl(struct fb_info *info, unsigned int cmd, static int mvf_dcu_open(struct fb_info *info, int user) { struct mfb_info *mfbi = info->par; + struct mvf_dcu_fb_data *dcu = mfbi->parent; + int i; int ret = 0; mfbi->index = info->node; spin_lock(&dcu_lock); + + /* if first time any layer open (e.g., at boot time) reset all */ + if (total_open_layers == 0) { + + writel(0, dcu->base + DCU_INT_STATUS); + writel(0, dcu->base + DCU_PARR_ERR_STA_1); + writel(0, dcu->base + DCU_PARR_ERR_STA_2); + writel(0, dcu->base + DCU_PARR_ERR_STA_3); + + for (i = 0; i < 64; i++) { + writel(0, dcu->base + DCU_CTRLDESCLN_0(i)); + writel(0, dcu->base + DCU_CTRLDESCLN_1(i)); + writel(0, dcu->base + DCU_CTRLDESCLN_2(i)); + writel(0, dcu->base + DCU_CTRLDESCLN_3(i)); + writel(0, dcu->base + DCU_CTRLDESCLN_4(i)); + writel(0, dcu->base + DCU_CTRLDESCLN_5(i)); + writel(0, dcu->base + DCU_CTRLDESCLN_6(i)); + writel(0, dcu->base + DCU_CTRLDESCLN_7(i)); + writel(0, dcu->base + DCU_CTRLDESCLN_8(i)); + } + } + mfbi->count++; if (mfbi->count == 1) { pr_debug("open layer index %d\n", mfbi->index); @@ -729,6 +750,8 @@ static int mvf_dcu_open(struct fb_info *info, int user) ret = mvf_dcu_set_par(info); if (ret < 0) mfbi->count--; + else + total_open_layers++; } spin_unlock(&dcu_lock); @@ -747,6 +770,8 @@ static int mvf_dcu_release(struct fb_info *info, int user) ret = mvf_dcu_disable_panel(info); if (ret < 0) mfbi->count++; + else + total_open_layers--; } spin_unlock(&dcu_lock); @@ -895,21 +920,17 @@ static void free_irq_local(int irq, struct mvf_dcu_fb_data *dcu) static int mvf_dcu_suspend(struct platform_device *pdev, pm_message_t state) { - struct mvf_dcu_fb_data *dcu; - - dcu = dev_get_drvdata(&pdev->dev); - disable_lcdc(dcu->mvf_dcu_info[0]); + struct mvf_dcu_fb_data *dcu = dev_get_drvdata(&pdev->dev); + clk_disable(dcu->clk); return 0; } static int mvf_dcu_resume(struct platform_device *pdev) { - struct mvf_dcu_fb_data *dcu; - - dcu = dev_get_drvdata(&pdev->dev); - enable_lcdc(dcu->mvf_dcu_info[0]); + struct mvf_dcu_fb_data *dcu = dev_get_drvdata(&pdev->dev); + clk_enable(dcu->clk); return 0; } #else -- cgit v1.2.3 From 9d7ee1114441401aee095ca522d75ed530e2e894 Mon Sep 17 00:00:00 2001 From: Russell Robinson Jr Date: Tue, 27 Nov 2012 10:52:37 -0800 Subject: Initial phyCORE-Vybrid changes Signed-off-by: Russell Robinson Jr --- drivers/video/mvf_dcu.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) (limited to 'drivers/video/mvf_dcu.c') diff --git a/drivers/video/mvf_dcu.c b/drivers/video/mvf_dcu.c index d9fc6fa664c7..829d9443f59a 100644 --- a/drivers/video/mvf_dcu.c +++ b/drivers/video/mvf_dcu.c @@ -37,15 +37,17 @@ #define DRIVER_NAME "mvf-dcu" static struct fb_videomode __devinitdata mvf_dcu_default_mode = { - .xres = 480, - .yres = 272, - .left_margin = 2, - .right_margin = 2, - .upper_margin = 1, - .lower_margin = 1, - .hsync_len = 41, + .pixclock = 31250, + .xres = 800, + .yres = 480, + .left_margin = 42, + .right_margin = 86, + .upper_margin = 10, + .lower_margin = 33, + .hsync_len = 128, .vsync_len = 2, - .sync = FB_SYNC_COMP_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, + .sync = FB_SYNC_COMP_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT | + FB_SYNC_HOR_HIGH_ACT, .vmode = FB_VMODE_NONINTERLACED, }; @@ -63,6 +65,22 @@ static struct fb_videomode __devinitdata mvf_dcu_mode_db[] = { .sync = FB_SYNC_COMP_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, .vmode = FB_VMODE_NONINTERLACED, }, + { + .name = "pm070wl4", + .pixclock = 31250, + .xres = 800, + .yres = 480, + .left_margin = 42, + .right_margin = 86, + .upper_margin = 10, + .lower_margin = 33, + .hsync_len = 128, + .vsync_len = 2, + .sync = FB_SYNC_COMP_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT | + FB_SYNC_HOR_HIGH_ACT, + .vmode = FB_VMODE_NONINTERLACED, + }, + }; static DEFINE_SPINLOCK(dcu_lock); @@ -1001,7 +1019,7 @@ static int __devinit mvf_dcu_probe(struct platform_device *pdev) gpio_request_one(DCU_LCD_ENABLE_PIN, GPIOF_OUT_INIT_LOW, "DCU"); msleep(2); - gpio_set_value(DCU_LCD_ENABLE_PIN, 1); + gpio_set_value(DCU_LCD_ENABLE_PIN, 0); writel(0x20000000, MVF_IO_ADDRESS(MVF_TCON0_BASE_ADDR)); -- cgit v1.2.3