diff options
Diffstat (limited to 'arch/arm/mach-tegra/pm.c')
| -rw-r--r-- | arch/arm/mach-tegra/pm.c | 63 | 
1 files changed, 40 insertions, 23 deletions
diff --git a/arch/arm/mach-tegra/pm.c b/arch/arm/mach-tegra/pm.c index f55b05a29b55..b0f48a3946fa 100644 --- a/arch/arm/mach-tegra/pm.c +++ b/arch/arm/mach-tegra/pm.c @@ -16,30 +16,32 @@   * along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include <linux/kernel.h> -#include <linux/spinlock.h> -#include <linux/io.h> +#include <linux/clk/tegra.h>  #include <linux/cpumask.h> -#include <linux/delay.h>  #include <linux/cpu_pm.h> -#include <linux/suspend.h> +#include <linux/delay.h>  #include <linux/err.h> +#include <linux/io.h> +#include <linux/kernel.h>  #include <linux/slab.h> -#include <linux/clk/tegra.h> +#include <linux/spinlock.h> +#include <linux/suspend.h> + +#include <soc/tegra/fuse.h> +#include <soc/tegra/pm.h> +#include <soc/tegra/pmc.h> -#include <asm/smp_plat.h>  #include <asm/cacheflush.h> -#include <asm/suspend.h>  #include <asm/idmap.h>  #include <asm/proc-fns.h> +#include <asm/smp_plat.h> +#include <asm/suspend.h>  #include <asm/tlbflush.h> -#include "iomap.h" -#include "reset.h"  #include "flowctrl.h" -#include "fuse.h" +#include "iomap.h"  #include "pm.h" -#include "pmc.h" +#include "reset.h"  #include "sleep.h"  #ifdef CONFIG_PM_SLEEP @@ -53,7 +55,7 @@ static int (*tegra_sleep_func)(unsigned long v2p);  static void tegra_tear_down_cpu_init(void)  { -	switch (tegra_chip_id) { +	switch (tegra_get_chip_id()) {  	case TEGRA20:  		if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))  			tegra_tear_down_cpu = tegra20_tear_down_cpu; @@ -143,7 +145,7 @@ bool tegra_set_cpu_in_lp2(void)  	if ((phy_cpu_id == 0) && cpumask_equal(cpu_lp2_mask, cpu_online_mask))  		last_cpu = true; -	else if (tegra_chip_id == TEGRA20 && phy_cpu_id == 1) +	else if (tegra_get_chip_id() == TEGRA20 && phy_cpu_id == 1)  		tegra20_cpu_set_resettable_soon();  	spin_unlock(&tegra_lp2_lock); @@ -166,9 +168,29 @@ static int tegra_sleep_cpu(unsigned long v2p)  	return 0;  } +static void tegra_pm_set(enum tegra_suspend_mode mode) +{ +	u32 value; + +	switch (tegra_get_chip_id()) { +	case TEGRA20: +	case TEGRA30: +		break; +	default: +		/* Turn off CRAIL */ +		value = flowctrl_read_cpu_csr(0); +		value &= ~FLOW_CTRL_CSR_ENABLE_EXT_MASK; +		value |= FLOW_CTRL_CSR_ENABLE_EXT_CRAIL; +		flowctrl_write_cpu_csr(0, value); +		break; +	} + +	tegra_pmc_enter_suspend_mode(mode); +} +  void tegra_idle_lp2_last(void)  { -	tegra_pmc_pm_set(TEGRA_SUSPEND_LP2); +	tegra_pm_set(TEGRA_SUSPEND_LP2);  	cpu_cluster_pm_enter();  	suspend_cpu_complex(); @@ -212,7 +234,7 @@ static int tegra_sleep_core(unsigned long v2p)   */  static bool tegra_lp1_iram_hook(void)  { -	switch (tegra_chip_id) { +	switch (tegra_get_chip_id()) {  	case TEGRA20:  		if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))  			tegra20_lp1_iram_hook(); @@ -242,7 +264,7 @@ static bool tegra_lp1_iram_hook(void)  static bool tegra_sleep_core_init(void)  { -	switch (tegra_chip_id) { +	switch (tegra_get_chip_id()) {  	case TEGRA20:  		if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))  			tegra20_sleep_core_init(); @@ -267,8 +289,6 @@ static bool tegra_sleep_core_init(void)  static void tegra_suspend_enter_lp1(void)  { -	tegra_pmc_suspend(); -  	/* copy the reset vector & SDRAM shutdown code into IRAM */  	memcpy(iram_save_addr, IO_ADDRESS(TEGRA_IRAM_LPx_RESUME_AREA),  		iram_save_size); @@ -280,8 +300,6 @@ static void tegra_suspend_enter_lp1(void)  static void tegra_suspend_exit_lp1(void)  { -	tegra_pmc_resume(); -  	/* restore IRAM */  	memcpy(IO_ADDRESS(TEGRA_IRAM_LPx_RESUME_AREA), iram_save_addr,  		iram_save_size); @@ -306,7 +324,7 @@ static int tegra_suspend_enter(suspend_state_t state)  	pr_info("Entering suspend state %s\n", lp_state[mode]); -	tegra_pmc_pm_set(mode); +	tegra_pm_set(mode);  	local_fiq_disable(); @@ -354,7 +372,6 @@ void __init tegra_init_suspend(void)  		return;  	tegra_tear_down_cpu_init(); -	tegra_pmc_suspend_init();  	if (mode >= TEGRA_SUSPEND_LP1) {  		if (!tegra_lp1_iram_hook() || !tegra_sleep_core_init()) {  |