add gpu's earlysuspend & remove soft reset before poweron
author杜坤明 <dkm@rockchip.com>
Wed, 9 Mar 2011 10:39:05 +0000 (18:39 +0800)
committer杜坤明 <dkm@rockchip.com>
Wed, 9 Mar 2011 10:39:05 +0000 (18:39 +0800)
drivers/staging/rk29/vivante/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c
drivers/staging/rk29/vivante/hal/kernel/gc_hal_kernel_event.c [changed mode: 0644->0755]
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_driver.c [changed mode: 0644->0755]
drivers/staging/rk29/vivante/hal/os/linux/kernel/gc_hal_kernel_os.c

index d323357d5a56bc38b4a27d62a131a6aed95d368a..5c7461a8b7ce72db7b53d9361eb5ad8c080f04f6 100755 (executable)
@@ -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)
old mode 100644 (file)
new mode 100755 (executable)
index da42565..122bca9
@@ -979,6 +979,8 @@ gckEVENT_Interrupt(
     /* Combine current interrupt status with pending flags. */
     Event->pending |= Data;
 
+    //printk("& ");
+
     /* Success. */
     gcmkFOOTER_NO();
     return gcvSTATUS_OK;
old mode 100644 (file)
new mode 100755 (executable)
index 261c73a..7ef4850
@@ -24,6 +24,8 @@
 #include <linux/device.h>
 #include <linux/miscdevice.h>
 #include <linux/slab.h>
+#include <linux/earlysuspend.h>
+#include <linux/delay.h>
 
 #include "gc_hal_kernel_linux.h"
 #include "gc_hal_driver.h"
@@ -33,6 +35,7 @@
 #include <linux/platform_device.h>
 #endif
 #include <mach/rk29_iomap.h>
+#include <mach/cru.h>
 
 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,
index e4ceae57234fba0839d1c373f59a21c0a1bfe593..b6bcbe3b158b5b9d2f025bd40670691009882350 100755 (executable)
@@ -37,7 +37,6 @@
 
 #include <linux/delay.h>
 #include <mach/pmu.h>
-#include <mach/cru.h>
 
 #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... ");