From 65dec0f9942fa68344c3a16a77b59202ab611d66 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E6=9D=9C=E5=9D=A4=E6=98=8E?= Date: Fri, 4 Mar 2011 10:31:43 +0800 Subject: [PATCH] update gpu_shutdown & gpu_suspend --- .../XAQ2/hal/kernel/gc_hal_kernel_hardware.c | 9 ++- drivers/staging/rk29/vivante/hal/inc/gc_hal.h | 1 + .../os/linux/kernel/gc_hal_kernel_driver.c | 26 ++++----- .../hal/os/linux/kernel/gc_hal_kernel_os.c | 56 +++++++++++-------- 4 files changed, 51 insertions(+), 41 deletions(-) mode change 100644 => 100755 drivers/staging/rk29/vivante/hal/inc/gc_hal.h mode change 100755 => 100644 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 59516271291e..d323357d5a56 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,7 +2618,8 @@ gckHARDWARE_GetIdle( pollCount = Wait ? 100 : 1; /* At most, try for 1 second. */ - for (retry = 0; retry < 1000; ++retry) + //for (retry = 0; retry < 1000; ++retry) + for (retry = 0; retry < 100; ++retry) { /* If we have to wait, try 100 polls per millisecond. */ for (poll = pollCount; poll > 0; --poll) @@ -2916,13 +2917,15 @@ gckHARDWARE_SetPowerManagementState( }, /* gcvPOWER_SUSPEND */ - { /* ON */ gcvPOWER_FLAG_START | + { /* ON */ gcvPOWER_FLAG_INITIALIZE | + gcvPOWER_FLAG_START | gcvPOWER_FLAG_RELEASE | gcvPOWER_FLAG_DELAY, /* OFF */ gcvPOWER_FLAG_SAVE | gcvPOWER_FLAG_OFF | gcvPOWER_FLAG_CLOCK_OFF, - /* IDLE */ gcvPOWER_FLAG_START | + /* IDLE */ gcvPOWER_FLAG_INITIALIZE | + gcvPOWER_FLAG_START | gcvPOWER_FLAG_DELAY, /* SUSPEND */ 0, }, diff --git a/drivers/staging/rk29/vivante/hal/inc/gc_hal.h b/drivers/staging/rk29/vivante/hal/inc/gc_hal.h old mode 100644 new mode 100755 index bc46f3b06aae..861f65e35c55 --- a/drivers/staging/rk29/vivante/hal/inc/gc_hal.h +++ b/drivers/staging/rk29/vivante/hal/inc/gc_hal.h @@ -24,6 +24,7 @@ #ifndef __gc_hal_h_ #define __gc_hal_h_ +#include #include "gc_hal_types.h" #include "gc_hal_enum.h" #include "gc_hal_base.h" 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 100755 new mode 100644 index e2b3d9df485f..261c73a171d1 --- 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 @@ -702,6 +702,8 @@ static void drv_exit(void) gckGALDEVICE_Destroy(galDevice); #if ENABLE_GPU_CLOCK_BY_DRIVER && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28) + printk("gpu: %s clk_disable... ", __func__); + clk_gpu = clk_get(NULL, "gpu"); if(!IS_ERR(clk_gpu)) clk_disable(clk_gpu); @@ -710,6 +712,8 @@ 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 } @@ -786,7 +790,7 @@ static int __devinit gpu_suspend(struct platform_device *dev, pm_message_t state device = platform_get_drvdata(dev); - status = gckHARDWARE_SetPowerManagementState(device->kernel->hardware, gcvPOWER_OFF); + status = gckHARDWARE_SetPowerManagementState(device->kernel->hardware, gcvPOWER_SUSPEND); if (gcmIS_ERROR(status)) { @@ -794,6 +798,8 @@ static int __devinit gpu_suspend(struct platform_device *dev, pm_message_t state return -1; } + printk("Exit %s \n", __func__); + return 0; } @@ -806,7 +812,7 @@ static int __devinit gpu_resume(struct platform_device *dev) device = platform_get_drvdata(dev); - status = gckHARDWARE_SetPowerManagementState(device->kernel->hardware, gcvPOWER_ON); + status = gckHARDWARE_SetPowerManagementState(device->kernel->hardware, gcvPOWER_IDLE); if (gcmIS_ERROR(status)) { @@ -814,24 +820,16 @@ static int __devinit gpu_resume(struct platform_device *dev) return -1; } + printk("Exit %s \n", __func__); + return 0; } static void __devinit gpu_shutdown(struct platform_device *dev) { - gceSTATUS status; - gckGALDEVICE device; - printk("Enter %s \n", __func__); - - device = platform_get_drvdata(dev); - - status = gckHARDWARE_SetPowerManagementState(device->kernel->hardware, gcvPOWER_OFF); - - if (gcmIS_ERROR(status)) - { - printk("%s fail!\n", __func__); - } + drv_exit(); + printk("Exit %s \n", __func__); } static struct platform_driver gpu_driver = { 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 3e22d03bfe5a..e4ceae57234f 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 @@ -5932,48 +5932,56 @@ gckOS_SetGPUPower( struct clk * clk_aclk_gpu = clk_get(NULL, "aclk_gpu"); struct clk * clk_aclk_ddr_gpu = clk_get(NULL, "aclk_ddr_gpu"); struct clk * clk_hclk_gpu = clk_get(NULL, "hclk_gpu"); + static int lastpower = 0; - printk("---------- Enter gckOS_SetGPUPowerOs=0x%p Clock=%d Power=%d \n", (void*)Os, Clock, Power); + //printk("---------- gckOS_SetGPUPower Clock=%d Power=%d \n", Clock, Power); + mdelay(1); if(Clock) { - printk("---------- start gpu clk_enable...\n"); + printk("gpu: clk_enable... "); clk_enable(clk_hclk_gpu); clk_enable(clk_aclk_gpu); clk_enable(clk_aclk_ddr_gpu); clk_enable(clk_gpu); - printk("---------- end gpu clk_enable!\n"); + printk("done!\n"); } else { - printk("---------- start gpu clk_disable...\n"); + printk("gpu: clk_disable... "); clk_disable(clk_gpu); clk_disable(clk_aclk_gpu); clk_disable(clk_aclk_ddr_gpu); clk_disable(clk_hclk_gpu); - printk("---------- end gpu clk_disable!\n"); + printk("done!\n"); } + mdelay(1); if(Power) { - unsigned long flags; - printk("---------- start gpu power_domain on...\n"); - mdelay(10); - local_irq_save(flags); - mdelay(5); - pmu_set_power_domain(PD_GPU, true); - mdelay(10); - local_irq_restore(flags); - printk("---------- end gpu power_domain on!\n"); - - /* disable gpu' reset bit */ - cru_set_soft_reset(SOFT_RST_DDR_GPU_PORT, false); - cru_set_soft_reset(SOFT_RST_GPU, false); + 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("---------- start gpu power_domain off...\n"); + //printk("gpu: power off... "); //pmu_set_power_domain(PD_GPU, false); - //printk("---------- end gpu power_domain off!\n"); - - /* enable gpu' reset bit */ - cru_set_soft_reset(SOFT_RST_GPU, true); - cru_set_soft_reset(SOFT_RST_DDR_GPU_PORT, true); + //printk("done!\n"); } + lastpower = Power; #endif -- 2.34.1