|
@@ -31,6 +31,7 @@
|
|
|
#include <asm/mach/irq.h>
|
|
|
#include <asm/fncpy.h>
|
|
|
#include <asm/cacheflush.h>
|
|
|
+#include <asm/system_misc.h>
|
|
|
|
|
|
#include "generic.h"
|
|
|
#include "pm.h"
|
|
@@ -354,6 +355,21 @@ static __init void at91_dt_ramc(void)
|
|
|
at91_pm_set_standby(standby);
|
|
|
}
|
|
|
|
|
|
+void at91rm9200_idle(void)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Disable the processor clock. The processor will be automatically
|
|
|
+ * re-enabled by an interrupt or by a reset.
|
|
|
+ */
|
|
|
+ writel(AT91_PMC_PCK, pmc + AT91_PMC_SCDR);
|
|
|
+}
|
|
|
+
|
|
|
+void at91sam9_idle(void)
|
|
|
+{
|
|
|
+ writel(AT91_PMC_PCK, pmc + AT91_PMC_SCDR);
|
|
|
+ cpu_do_idle();
|
|
|
+}
|
|
|
+
|
|
|
static void __init at91_pm_sram_init(void)
|
|
|
{
|
|
|
struct gen_pool *sram_pool;
|
|
@@ -411,7 +427,7 @@ static const struct of_device_id atmel_pmc_ids[] __initconst = {
|
|
|
{ /* sentinel */ },
|
|
|
};
|
|
|
|
|
|
-static void __init at91_pm_init(void)
|
|
|
+static void __init at91_pm_init(void (*pm_idle)(void))
|
|
|
{
|
|
|
struct device_node *pmc_np;
|
|
|
|
|
@@ -425,6 +441,9 @@ static void __init at91_pm_init(void)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ if (pm_idle)
|
|
|
+ arm_pm_idle = pm_idle;
|
|
|
+
|
|
|
at91_pm_sram_init();
|
|
|
|
|
|
if (at91_suspend_sram_fn)
|
|
@@ -445,7 +464,7 @@ void __init at91rm9200_pm_init(void)
|
|
|
at91_pm_data.uhp_udp_mask = AT91RM9200_PMC_UHP | AT91RM9200_PMC_UDP;
|
|
|
at91_pm_data.memctrl = AT91_MEMCTRL_MC;
|
|
|
|
|
|
- at91_pm_init();
|
|
|
+ at91_pm_init(at91rm9200_idle);
|
|
|
}
|
|
|
|
|
|
void __init at91sam9260_pm_init(void)
|
|
@@ -453,7 +472,7 @@ void __init at91sam9260_pm_init(void)
|
|
|
at91_dt_ramc();
|
|
|
at91_pm_data.memctrl = AT91_MEMCTRL_SDRAMC;
|
|
|
at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP;
|
|
|
- at91_pm_init();
|
|
|
+ at91_pm_init(at91sam9_idle);
|
|
|
}
|
|
|
|
|
|
void __init at91sam9g45_pm_init(void)
|
|
@@ -461,7 +480,7 @@ void __init at91sam9g45_pm_init(void)
|
|
|
at91_dt_ramc();
|
|
|
at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP;
|
|
|
at91_pm_data.memctrl = AT91_MEMCTRL_DDRSDR;
|
|
|
- at91_pm_init();
|
|
|
+ at91_pm_init(at91sam9_idle);
|
|
|
}
|
|
|
|
|
|
void __init at91sam9x5_pm_init(void)
|
|
@@ -469,5 +488,13 @@ void __init at91sam9x5_pm_init(void)
|
|
|
at91_dt_ramc();
|
|
|
at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP;
|
|
|
at91_pm_data.memctrl = AT91_MEMCTRL_DDRSDR;
|
|
|
- at91_pm_init();
|
|
|
+ at91_pm_init(at91sam9_idle);
|
|
|
+}
|
|
|
+
|
|
|
+void __init sama5_pm_init(void)
|
|
|
+{
|
|
|
+ at91_dt_ramc();
|
|
|
+ at91_pm_data.uhp_udp_mask = AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP;
|
|
|
+ at91_pm_data.memctrl = AT91_MEMCTRL_DDRSDR;
|
|
|
+ at91_pm_init(NULL);
|
|
|
}
|