From: 杜坤明 Date: Fri, 18 Mar 2011 10:12:06 +0000 (+0800) Subject: gpu: add power open/close support X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=e104972abb7faed5de5f6aa092e341e29f49e1f4;p=firefly-linux-kernel-4.4.55.git gpu: add power open/close support --- 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 index 72cfb34c5dae..5a516f3118ea 100755 --- 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 @@ -36,6 +36,7 @@ #endif #include #include +#include MODULE_DESCRIPTION("Vivante Graphics Driver"); MODULE_LICENSE("GPL"); @@ -85,6 +86,8 @@ unsigned long coreClock = 552*1000000; module_param(coreClock, ulong, 0644); #endif +int shutdown = 0; + static int drv_open(struct inode *inode, struct file *filp); static int drv_release(struct inode *inode, struct file *filp); static int drv_ioctl(struct inode *inode, struct file *filp, @@ -254,6 +257,11 @@ int drv_ioctl(struct inode *inode, private = filp->private_data; + if(shutdown) + { + return -ENOTTY; + } + if (private == gcvNULL) { gcmkTRACE_ZONE(gcvLEVEL_ERROR, gcvZONE_DRIVER, @@ -573,16 +581,15 @@ static int drv_init(void) // enable ram clock gate writel(readl(RK29_GRF_BASE+0xc0) & ~0x100000, RK29_GRF_BASE+0xc0); -#if 1 - mdelay(2); - printk("%s : gpu reset... ", __func__); - 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); +#if 0 + // power on gpu + printk("%s : gpu power on... ", __func__); + clk_disable(clk_get(NULL, "aclk_ddr_gpu")); + udelay(10); + pmu_set_power_domain(PD_GPU, true); + udelay(10); + clk_enable(clk_get(NULL, "aclk_ddr_gpu")); printk("done!\n"); - mdelay(2); #endif printk("%s : gpu clk_disable... ", __func__); @@ -726,25 +733,35 @@ static void drv_exit(void) unregister_chrdev(major, DRV_NAME); #endif - mdelay(50); + shutdown = 1; + + msleep(50); gckGALDEVICE_Stop(galDevice); - mdelay(50); + msleep(50); gckGALDEVICE_Destroy(galDevice); - mdelay(50); + msleep(50); #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); - - clk_aclk_gpu = clk_get(NULL, "aclk_gpu"); - if(!IS_ERR(clk_aclk_gpu)) clk_disable(clk_aclk_gpu); + printk("%s : gpu power off... ", __func__); + pmu_set_power_domain(PD_GPU, false); + printk("done!\n"); + msleep(10); + + printk("%s : gpu clk_disable... ", __func__); clk_hclk_gpu = clk_get(NULL, "hclk_gpu"); if(!IS_ERR(clk_hclk_gpu)) clk_disable(clk_hclk_gpu); + clk_disable(clk_get(NULL, "aclk_ddr_gpu")); + + clk_aclk_gpu = clk_get(NULL, "aclk_gpu"); + if(!IS_ERR(clk_aclk_gpu)) clk_disable(clk_aclk_gpu); + + clk_gpu = clk_get(NULL, "gpu"); + if(!IS_ERR(clk_gpu)) clk_disable(clk_gpu); printk("done!\n"); + msleep(10); + #endif } @@ -768,9 +785,9 @@ static void gpu_early_suspend(struct early_suspend *h) printk("Enter %s \n", __func__); - mdelay(50); //Wait for gpu finish + msleep(50); //Wait for gpu finish - status = gckHARDWARE_SetPowerManagementState(galDevice->kernel->hardware, gcvPOWER_SUSPEND); + status = gckHARDWARE_SetPowerManagementState(galDevice->kernel->hardware, gcvPOWER_OFF); if (gcmIS_ERROR(status)) { @@ -789,7 +806,7 @@ static void gpu_early_resume(struct early_suspend *h) status = gckHARDWARE_SetPowerManagementState(galDevice->kernel->hardware, gcvPOWER_IDLE); - mdelay(50); + msleep(50); if (gcmIS_ERROR(status)) { @@ -872,9 +889,9 @@ static int __devinit gpu_suspend(struct platform_device *dev, pm_message_t state device = platform_get_drvdata(dev); - mdelay(50); //Wait for gpu finish + msleep(50); //Wait for gpu finish - status = gckHARDWARE_SetPowerManagementState(device->kernel->hardware, gcvPOWER_SUSPEND); + status = gckHARDWARE_SetPowerManagementState(device->kernel->hardware, gcvPOWER_OFF); if (gcmIS_ERROR(status)) { @@ -898,7 +915,7 @@ static int __devinit gpu_resume(struct platform_device *dev) status = gckHARDWARE_SetPowerManagementState(device->kernel->hardware, gcvPOWER_IDLE); - mdelay(50); + msleep(50); if (gcmIS_ERROR(status)) { 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 28a0e29e7ae4..ae9002ad5c4e 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,6 +37,7 @@ #include #include +#include #if !USE_NEW_LINUX_SIGNAL #define USER_SIGNAL_TABLE_LEN_INIT 64 @@ -5936,9 +5937,9 @@ gckOS_SetGPUPower( //printk("---------- gckOS_SetGPUPower Clock=%d Power=%d \n", Clock, Power); + mdelay(1); if(lastclock!=Clock) { - mdelay(10); if(Clock) { printk("gpu: clk_enable... "); clk_enable(clk_gpu); @@ -5954,24 +5955,30 @@ gckOS_SetGPUPower( clk_disable(clk_gpu); printk("done!\n"); } - mdelay(10); } lastclock = Clock; + + mdelay(1); if(lastpower!=Power) { if(Power) { printk("gpu: power on... "); + if(lastclock) clk_disable(clk_aclk_ddr_gpu); + mdelay(1); pmu_set_power_domain(PD_GPU, true); + mdelay(1); + if(lastclock) clk_enable(clk_aclk_ddr_gpu); printk("done!\n"); } else { - //printk("gpu: power off... "); - //pmu_set_power_domain(PD_GPU, false); - //printk("done!\n"); + printk("gpu: power off... "); + pmu_set_power_domain(PD_GPU, false); + printk("done!\n"); } } lastpower = Power; + mdelay(1); #endif gcmkFOOTER_NO();