#endif
#include <mach/rk29_iomap.h>
#include <mach/cru.h>
+#include <mach/pmu.h>
MODULE_DESCRIPTION("Vivante Graphics Driver");
MODULE_LICENSE("GPL");
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,
private = filp->private_data;
+ if(shutdown)
+ {
+ return -ENOTTY;
+ }
+
if (private == gcvNULL)
{
gcmkTRACE_ZONE(gcvLEVEL_ERROR, gcvZONE_DRIVER,
// 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__);
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
}
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))
{
status = gckHARDWARE_SetPowerManagementState(galDevice->kernel->hardware, gcvPOWER_IDLE);
- mdelay(50);
+ msleep(50);
if (gcmIS_ERROR(status))
{
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))
{
status = gckHARDWARE_SetPowerManagementState(device->kernel->hardware, gcvPOWER_IDLE);
- mdelay(50);
+ msleep(50);
if (gcmIS_ERROR(status))
{
#include <linux/delay.h>
#include <mach/pmu.h>
+#include <mach/cru.h>
#if !USE_NEW_LINUX_SIGNAL
#define USER_SIGNAL_TABLE_LEN_INIT 64
//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);
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();