From b3653bd712b846783dddb00c7f9d5f332d9c561d Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E9=BB=84=E6=B6=9B?= Date: Sat, 25 Dec 2010 13:36:18 +0800 Subject: [PATCH] rk29: pmu_set_power_domain wait power on or off; close more clock --- arch/arm/mach-rk29/clock.c | 7 +------ arch/arm/mach-rk29/include/mach/pmu.h | 11 +++++++---- arch/arm/mach-rk29/vpu.c | 5 ----- .../hal/os/linux/kernel/gc_hal_kernel_driver.c | 2 ++ .../hal/os/linux/kernel/gc_hal_kernel_os.c | 15 +++++++++------ 5 files changed, 19 insertions(+), 21 deletions(-) diff --git a/arch/arm/mach-rk29/clock.c b/arch/arm/mach-rk29/clock.c index cdf713a6562b..1b00f04f61db 100755 --- a/arch/arm/mach-rk29/clock.c +++ b/arch/arm/mach-rk29/clock.c @@ -2305,11 +2305,6 @@ static void __init rk29_clock_common_init(void) static void __init clk_enable_init_clocks(void) { - clk_enable_nolock(&clk_hclk_cpu_display); - clk_enable_nolock(&clk_aclk_ddr_gpu); - clk_enable_nolock(&clk_hclk_disp_matrix); - clk_enable_nolock(&clk_aclk_disp_matrix); - clk_enable_nolock(&clk_aclk_ddr_lcdc); clk_enable_nolock(&clk_nandc); clk_enable_nolock(&clk_aclk_cpu_peri); clk_enable_nolock(&clk_aclk_ddr_peri); @@ -2343,7 +2338,7 @@ static int __init clk_disable_unused(void) pmu_set_power_domain(PD_VCODEC, false); // pmu_set_power_domain(PD_DISPLAY, false); -// pmu_set_power_domain(PD_GPU, false); + pmu_set_power_domain(PD_GPU, false); return 0; } diff --git a/arch/arm/mach-rk29/include/mach/pmu.h b/arch/arm/mach-rk29/include/mach/pmu.h index 779eacfcd1a0..da22426fa587 100644 --- a/arch/arm/mach-rk29/include/mach/pmu.h +++ b/arch/arm/mach-rk29/include/mach/pmu.h @@ -40,6 +40,11 @@ enum pmu_power_domain { PD_MINI, }; +static inline bool pmu_power_domain_is_on(enum pmu_power_domain pd) +{ + return !(readl(RK29_PMU_BASE + PMU_PD_ST) & (1 << pd)); +} + static inline void pmu_set_power_domain(enum pmu_power_domain pd, bool on) { unsigned long flags; @@ -50,11 +55,9 @@ static inline void pmu_set_power_domain(enum pmu_power_domain pd, bool on) else writel(readl(RK29_PMU_BASE + PMU_PD_CON) | (1 << pd), RK29_PMU_BASE + PMU_PD_CON); local_irq_restore(flags); -} -static inline bool pmu_power_domain_is_on(enum pmu_power_domain pd) -{ - return !(readl(RK29_PMU_BASE + PMU_PD_ST) & (1 << pd)); + while (pmu_power_domain_is_on(pd) != on) + ; } #endif diff --git a/arch/arm/mach-rk29/vpu.c b/arch/arm/mach-rk29/vpu.c index 35ccca7a3e02..e4c707058f1c 100644 --- a/arch/arm/mach-rk29/vpu.c +++ b/arch/arm/mach-rk29/vpu.c @@ -105,11 +105,6 @@ static void vpu_power_on(void) return; pr_debug("power domain on\n"); pmu_set_power_domain(PD_VCODEC, true); - udelay(10); // max 5358 ns - while (!pmu_power_domain_is_on(PD_VCODEC)) { - pr_debug("waiting for on\n"); - msleep(1); - } clk_enable(aclk_vepu); clk_enable(hclk_vepu); clk_enable(aclk_ddr_vepu); 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 c09b616eeedb..36f9dc74575a 100644 --- 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 @@ -490,6 +490,8 @@ static int drv_init(void) } clk_enable(clk_aclk_gpu); + clk_enable(clk_get(NULL, "aclk_ddr_gpu")); + // clk_gpu clk_gpu = clk_get(NULL, "gpu"); if (IS_ERR(clk_gpu)) 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 a56afb5d304e..7326be921799 100644 --- 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 @@ -5890,16 +5890,19 @@ gckOS_SetGPUPower( struct clk * clk_gpu = clk_get(NULL, "gpu"); 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"); if(Clock) { - if(!IS_ERR(clk_hclk_gpu)) clk_enable(clk_hclk_gpu); - if(!IS_ERR(clk_aclk_gpu)) clk_enable(clk_aclk_gpu); - if(!IS_ERR(clk_gpu)) clk_enable(clk_gpu); + clk_enable(clk_hclk_gpu); + clk_enable(clk_aclk_gpu); + clk_enable(clk_aclk_ddr_gpu); + clk_enable(clk_gpu); } else { - if(!IS_ERR(clk_gpu)) clk_disable(clk_gpu); - if(!IS_ERR(clk_aclk_gpu)) clk_disable(clk_aclk_gpu); - if(!IS_ERR(clk_hclk_gpu)) clk_disable(clk_hclk_gpu); + clk_disable(clk_gpu); + clk_disable(clk_aclk_gpu); + clk_disable(clk_aclk_ddr_gpu); + clk_disable(clk_hclk_gpu); } if(Power) { -- 2.34.1