Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7232398a authored by Thierry Reding's avatar Thierry Reding
Browse files

ARM: tegra: Convert PMC to a driver



This commit converts the PMC support code to a platform driver. Because
the boot process needs to call into this driver very early, also set up
a minimal environment via an early initcall.

Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
parent 24fa5af8
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -2,9 +2,7 @@ asflags-y += -march=armv7-a

obj-y                                   += io.o
obj-y                                   += irq.o
obj-y					+= pmc.o
obj-y					+= flowctrl.o
obj-y					+= powergate.o
obj-y					+= pm.o
obj-y					+= reset.o
obj-y					+= reset-handler.o
+0 −7
Original line number Diff line number Diff line
@@ -28,13 +28,6 @@
void __init tegra_map_common_io(void);
void __init tegra_init_irq(void);

int __init tegra_powergate_init(void);
#if defined(CONFIG_ARCH_TEGRA_2x_SOC) && defined(CONFIG_DEBUG_FS)
int __init tegra_powergate_debugfs_init(void);
#else
static inline int tegra_powergate_debugfs_init(void) { return 0; }
#endif

void __init tegra_paz00_wifikill_init(void);

#endif
+1 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <linux/smp.h>

#include <soc/tegra/fuse.h>
#include <soc/tegra/pmc.h>

#include <asm/cacheflush.h>
#include <asm/mach-types.h>
@@ -31,7 +32,6 @@
#include "common.h"
#include "flowctrl.h"
#include "iomap.h"
#include "pmc.h"
#include "reset.h"

static cpumask_t tegra_cpu_init_mask;
+24 −8
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@
#include <linux/suspend.h>

#include <soc/tegra/fuse.h>
#include <soc/tegra/pm.h>
#include <soc/tegra/pmc.h>

#include <asm/cacheflush.h>
#include <asm/idmap.h>
@@ -38,7 +40,6 @@

#include "flowctrl.h"
#include "iomap.h"
#include "pmc.h"
#include "pm.h"
#include "reset.h"
#include "sleep.h"
@@ -167,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();
@@ -268,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);
@@ -281,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);
@@ -307,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();

@@ -355,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()) {
+1 −9
Original line number Diff line number Diff line
@@ -21,12 +21,11 @@
#ifndef _MACH_TEGRA_PM_H_
#define _MACH_TEGRA_PM_H_

#include "pmc.h"

struct tegra_lp1_iram {
	void	*start_addr;
	void	*end_addr;
};

extern struct tegra_lp1_iram tegra_lp1_iram;
extern void (*tegra_sleep_core_finish)(unsigned long v2p);

@@ -42,15 +41,8 @@ void tegra_idle_lp2_last(void);
extern void (*tegra_tear_down_cpu)(void);

#ifdef CONFIG_PM_SLEEP
enum tegra_suspend_mode tegra_pm_validate_suspend_mode(
				enum tegra_suspend_mode mode);
void tegra_init_suspend(void);
#else
static inline enum tegra_suspend_mode tegra_pm_validate_suspend_mode(
				enum tegra_suspend_mode mode)
{
	return TEGRA_SUSPEND_NONE;
}
static inline void tegra_init_suspend(void) {}
#endif

Loading