From 0208ee3eda4a7126910f1d66f278a5b4533782f5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E6=9D=9C=E5=9D=A4=E6=98=8E?= Date: Wed, 9 Mar 2011 18:39:05 +0800 Subject: [PATCH] add gpu's earlysuspend & remove soft reset before poweron --- .../XAQ2/hal/kernel/gc_hal_kernel_hardware.c | 3 +- .../vivante/hal/kernel/gc_hal_kernel_event.c | 2 + .../os/linux/kernel/gc_hal_kernel_driver.c | 66 ++++++++++++++++++- .../hal/os/linux/kernel/gc_hal_kernel_os.c | 19 ------ 4 files changed, 68 insertions(+), 22 deletions(-) mode change 100644 => 100755 drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_event.c mode change 100644 => 100755 drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c diff --git a/drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c b/drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c index d323357d5a56..5c7461a8b7ce 100755 --- a/drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c +++ b/drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c @@ -2618,8 +2618,7 @@ gckHARDWARE_GetIdle( pollCount = Wait ? 100 : 1; /* At most, try for 1 second. */ - //for (retry = 0; retry < 1000; ++retry) - for (retry = 0; retry < 100; ++retry) + for (retry = 0; retry < 200; ++retry) { /* If we have to wait, try 100 polls per millisecond. */ for (poll = pollCount; poll > 0; --poll) diff --git a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_event.c b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_event.c old mode 100644 new mode 100755 index da4256519d97..122bca943301 --- a/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_event.c +++ b/drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_event.c @@ -979,6 +979,8 @@ gckEVENT_Interrupt( /* Combine current interrupt status with pending flags. */ Event->pending |= Data; + //printk("& "); + /* Success. */ gcmkFOOTER_NO(); return gcvSTATUS_OK; diff --git a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c old mode 100644 new mode 100755 index 261c73a171d1..7ef485080f36 --- a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c +++ b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include "gc_hal_kernel_linux.h" #include "gc_hal_driver.h" @@ -33,6 +35,7 @@ #include #endif #include +#include MODULE_DESCRIPTION("Vivante Graphics Driver"); MODULE_LICENSE("GPL"); @@ -566,6 +569,19 @@ static int drv_init(void) // enable ram clock gate writel(readl(RK29_GRF_BASE+0xc0) & ~0x100000, RK29_GRF_BASE+0xc0); + +#if 1 + printk("%s : gpu reset... ", __func__); + mdelay(2); + cru_set_soft_reset(SOFT_RST_GPU, true); + cru_set_soft_reset(SOFT_RST_DDR_GPU_PORT, true); + mdelay(1); + cru_set_soft_reset(SOFT_RST_DDR_GPU_PORT, false); + cru_set_soft_reset(SOFT_RST_GPU, false); + mdelay(2); + printk("done!\n"); +#endif + #endif if (showArgs) @@ -712,7 +728,7 @@ static void drv_exit(void) clk_hclk_gpu = clk_get(NULL, "hclk_gpu"); if(!IS_ERR(clk_hclk_gpu)) clk_disable(clk_hclk_gpu); - + printk("done!\n"); #endif } @@ -729,6 +745,49 @@ module_exit(drv_exit); #endif + +#if CONFIG_HAS_EARLYSUSPEND +static void gpu_early_suspend(struct early_suspend *h) +{ + gceSTATUS status; + + printk("Enter %s \n", __func__); + + status = gckHARDWARE_SetPowerManagementState(galDevice->kernel->hardware, gcvPOWER_SUSPEND); + + if (gcmIS_ERROR(status)) + { + printk("%s fail!\n", __func__); + return; + } + + printk("Exit %s \n", __func__); +} + +static void gpu_early_resume(struct early_suspend *h) +{ + gceSTATUS status; + + printk("Enter %s \n", __func__); + + status = gckHARDWARE_SetPowerManagementState(galDevice->kernel->hardware, gcvPOWER_IDLE); + + if (gcmIS_ERROR(status)) + { + printk("%s fail!\n", __func__); + return; + } + + printk("Exit %s \n", __func__); +} + +struct early_suspend gpu_early_suspend_info = { + .suspend = gpu_early_suspend, + .resume = gpu_early_resume, + .level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1, +}; +#endif + static int __devinit gpu_probe(struct platform_device *pdev) { int ret = -ENODEV; @@ -763,6 +822,10 @@ static int __devinit gpu_probe(struct platform_device *pdev) add_timer(&gpu_timer); #endif +#if CONFIG_HAS_EARLYSUSPEND + register_early_suspend(&gpu_early_suspend_info); +#endif + ret = drv_init(); if(!ret) { platform_set_drvdata(pdev,galDevice); @@ -832,6 +895,7 @@ static void __devinit gpu_shutdown(struct platform_device *dev) printk("Exit %s \n", __func__); } + static struct platform_driver gpu_driver = { .probe = gpu_probe, .remove = gpu_remove, diff --git a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c index e4ceae57234f..b6bcbe3b158b 100755 --- a/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c +++ b/drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c @@ -37,7 +37,6 @@ #include #include -#include #if !USE_NEW_LINUX_SIGNAL #define USER_SIGNAL_TABLE_LEN_INIT 64 @@ -5936,7 +5935,6 @@ gckOS_SetGPUPower( //printk("---------- gckOS_SetGPUPower Clock=%d Power=%d \n", Clock, Power); - mdelay(1); if(Clock) { printk("gpu: clk_enable... "); clk_enable(clk_hclk_gpu); @@ -5952,29 +5950,12 @@ gckOS_SetGPUPower( clk_disable(clk_hclk_gpu); printk("done!\n"); } - mdelay(1); if(Power) { if(lastpower != Power) { printk("gpu: power on... "); pmu_set_power_domain(PD_GPU, true); printk("done!\n"); - - printk("gpu: reset... "); - mdelay(1); - cru_set_soft_reset(SOFT_RST_GPU, true); - cru_set_soft_reset(SOFT_RST_DDR_GPU_PORT, true); - mdelay(2); - cru_set_soft_reset(SOFT_RST_DDR_GPU_PORT, false); - cru_set_soft_reset(SOFT_RST_GPU, false); - mdelay(1); - cru_set_soft_reset(SOFT_RST_GPU, true); - cru_set_soft_reset(SOFT_RST_DDR_GPU_PORT, true); - mdelay(2); - cru_set_soft_reset(SOFT_RST_DDR_GPU_PORT, false); - cru_set_soft_reset(SOFT_RST_GPU, false); - mdelay(1); - printk("done!\n"); } } else { //printk("gpu: power off... "); -- 2.34.1