diff --git a/arch/arm/mach-at91/at91rm9200.c 
b/arch/arm/mach-at91/at91rm9200.c
index 4aad93d..0d234f2 100644
--- a/arch/arm/mach-at91/at91rm9200.c
+++ b/arch/arm/mach-at91/at91rm9200.c
@@ -27,6 +27,7 @@
  #include "generic.h"
  #include "clock.h"
  #include "sam9_smc.h"
+#include "pm.h"

  /* --------------------------------------------------------------------
   *  Clocks
@@ -337,6 +338,8 @@ static void __init at91rm9200_initialize(void)
  	/* Initialize GPIO subsystem */
  	at91_gpio_init(at91rm9200_gpio,
  		cpu_is_at91rm9200_bga() ? AT91RM9200_BGA : AT91RM9200_PQFP);
+
+	at91_pm_set_standby(at91rm9200_standby);
  }


diff --git a/arch/arm/mach-at91/at91sam9260.c 
b/arch/arm/mach-at91/at91sam9260.c
index 5de6074..9fd7aa6 100644
--- a/arch/arm/mach-at91/at91sam9260.c
+++ b/arch/arm/mach-at91/at91sam9260.c
@@ -28,6 +28,7 @@
  #include "generic.h"
  #include "clock.h"
  #include "sam9_smc.h"
+#include "pm.h"

  /* --------------------------------------------------------------------
   *  Clocks
@@ -307,7 +308,6 @@ static struct at91_gpio_bank at91sam9260_gpio[] 
__initdata = {
  /* --------------------------------------------------------------------
   *  AT91SAM9260 processor initialization
   * -------------------------------------------------------------------- */
-
  static void __init at91sam9xe_map_io(void)
  {
  	unsigned long sram_size;
@@ -351,6 +351,8 @@ static void __init at91sam9260_initialize(void)

  	/* Register GPIO subsystem */
  	at91_gpio_init(at91sam9260_gpio, 3);
+
+	at91_pm_set_standby(at91sam9_standby);
  }

  /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/at91sam9261.c 
b/arch/arm/mach-at91/at91sam9261.c
index 0e07932..1edbb6f 100644
--- a/arch/arm/mach-at91/at91sam9261.c
+++ b/arch/arm/mach-at91/at91sam9261.c
@@ -27,6 +27,7 @@
  #include "generic.h"
  #include "clock.h"
  #include "sam9_smc.h"
+#include "pm.h"

  /* --------------------------------------------------------------------
   *  Clocks
@@ -293,6 +294,8 @@ static void __init at91sam9261_initialize(void)

  	/* Register GPIO subsystem */
  	at91_gpio_init(at91sam9261_gpio, 3);
+
+	at91_pm_set_sandby(at91sam9_standby);
  }

  /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/at91sam9263.c 
b/arch/arm/mach-at91/at91sam9263.c
index 6ce7d18..b222d59 100644
--- a/arch/arm/mach-at91/at91sam9263.c
+++ b/arch/arm/mach-at91/at91sam9263.c
@@ -26,6 +26,7 @@
  #include "generic.h"
  #include "clock.h"
  #include "sam9_smc.h"
+#include "pm.h"

  /* --------------------------------------------------------------------
   *  Clocks
@@ -304,7 +305,6 @@ static struct at91_gpio_bank at91sam9263_gpio[] 
__initdata = {
  /* --------------------------------------------------------------------
   *  AT91SAM9263 processor initialization
   * -------------------------------------------------------------------- */
-
  static void __init at91sam9263_map_io(void)
  {
  	at91_init_sram(0, AT91SAM9263_SRAM0_BASE, AT91SAM9263_SRAM0_SIZE);
@@ -330,6 +330,8 @@ static void __init at91sam9263_initialize(void)

  	/* Register GPIO subsystem */
  	at91_gpio_init(at91sam9263_gpio, 5);
+
+	at91_pm_set_standby(at91sam9263_standby);
  }

  /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/at91sam9g45.c 
b/arch/arm/mach-at91/at91sam9g45.c
index 474ee04..4186f37 100644
--- a/arch/arm/mach-at91/at91sam9g45.c
+++ b/arch/arm/mach-at91/at91sam9g45.c
@@ -26,6 +26,7 @@
  #include "generic.h"
  #include "clock.h"
  #include "sam9_smc.h"
+#include "pm.h"

  /* --------------------------------------------------------------------
   *  Clocks
@@ -355,7 +356,6 @@ static struct at91_gpio_bank at91sam9g45_gpio[] 
__initdata = {
  /* --------------------------------------------------------------------
   *  AT91SAM9G45 processor initialization
   * -------------------------------------------------------------------- */
-
  static void __init at91sam9g45_map_io(void)
  {
  	at91_init_sram(0, AT91SAM9G45_SRAM_BASE, AT91SAM9G45_SRAM_SIZE);
@@ -379,6 +379,8 @@ static void __init at91sam9g45_initialize(void)

  	/* Register GPIO subsystem */
  	at91_gpio_init(at91sam9g45_gpio, 5);
+
+	at91_pm_set_standby(at91sam9g45_standby);
  }

  /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/at91sam9n12.c 
b/arch/arm/mach-at91/at91sam9n12.c
index c7d670d..cc61e09 100644
--- a/arch/arm/mach-at91/at91sam9n12.c
+++ b/arch/arm/mach-at91/at91sam9n12.c
@@ -21,6 +21,7 @@
  #include "generic.h"
  #include "clock.h"
  #include "sam9_smc.h"
+#include "pm.h"

  /* --------------------------------------------------------------------
   *  Clocks
@@ -217,13 +218,18 @@ static void __init at91sam9n12_register_clocks(void)
  /* --------------------------------------------------------------------
   *  AT91SAM9N12 processor initialization
   * -------------------------------------------------------------------- */
-
  static void __init at91sam9n12_map_io(void)
  {
  	at91_init_sram(0, AT91SAM9N12_SRAM_BASE, AT91SAM9N12_SRAM_SIZE);
  }

+static void __init at91sam9n12_initialize(void)
+{
+	at91_pm_set_standby(at91sam9_standby);
+}
+
  AT91_SOC_START(at91sam9n12)
  	.map_io = at91sam9n12_map_io,
  	.register_clocks = at91sam9n12_register_clocks,
+	.init = at91sam9n12_initialize,
  AT91_SOC_END
diff --git a/arch/arm/mach-at91/at91sam9rl.c 
b/arch/arm/mach-at91/at91sam9rl.c
index d4ec0d9..b0c8cb6 100644
--- a/arch/arm/mach-at91/at91sam9rl.c
+++ b/arch/arm/mach-at91/at91sam9rl.c
@@ -27,6 +27,7 @@
  #include "generic.h"
  #include "clock.h"
  #include "sam9_smc.h"
+#include "pm.h"

  /* --------------------------------------------------------------------
   *  Clocks
@@ -261,7 +262,6 @@ static struct at91_gpio_bank at91sam9rl_gpio[] 
__initdata = {
  /* --------------------------------------------------------------------
   *  AT91SAM9RL processor initialization
   * -------------------------------------------------------------------- */
-
  static void __init at91sam9rl_map_io(void)
  {
  	unsigned long sram_size;
@@ -296,6 +296,8 @@ static void __init at91sam9rl_initialize(void)

  	/* Register GPIO subsystem */
  	at91_gpio_init(at91sam9rl_gpio, 4);
+
+	at91_pm_set_standby(at91sam9_standby);
  }

  /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/at91sam9x5.c 
b/arch/arm/mach-at91/at91sam9x5.c
index 916e5a1..9ef7bc6 100644
--- a/arch/arm/mach-at91/at91sam9x5.c
+++ b/arch/arm/mach-at91/at91sam9x5.c
@@ -21,6 +21,7 @@
  #include "generic.h"
  #include "clock.h"
  #include "sam9_smc.h"
+#include "pm.h"

  /* --------------------------------------------------------------------
   *  Clocks
@@ -316,12 +317,15 @@ static void __init at91sam9x5_register_clocks(void)
  /* --------------------------------------------------------------------
   *  AT91SAM9x5 processor initialization
   * -------------------------------------------------------------------- */
-
  static void __init at91sam9x5_map_io(void)
  {
  	at91_init_sram(0, AT91SAM9X5_SRAM_BASE, AT91SAM9X5_SRAM_SIZE);
  }

+static void __init at91sam9x5_initialize(void)
+{
+	at91_pm_set_standby(at91sam9_standby);
+}
  /* --------------------------------------------------------------------
   *  Interrupt initialization
   * -------------------------------------------------------------------- */
@@ -329,4 +333,5 @@ static void __init at91sam9x5_map_io(void)
  AT91_SOC_START(at91sam9x5)
  	.map_io = at91sam9x5_map_io,
  	.register_clocks = at91sam9x5_register_clocks,
+	.init = at91sam9x5_initialize,
  AT91_SOC_END
diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c
index debdbf8..42b955c 100644
--- a/arch/arm/mach-at91/pm.c
+++ b/arch/arm/mach-at91/pm.c
@@ -318,6 +318,11 @@ static struct platform_device at91_cpuidle_device = {
  	.name = "cpuidle-at91",
  };

+void at91_pm_set_standby(void (*at91_standby)(void))
+{
+	at91_cpuidle_device.dev.platform_data = at91_standby;	
+}
+
  static int __init at91_pm_init(void)
  {
  #ifdef CONFIG_AT91_SLOW_CLOCK
@@ -327,16 +332,8 @@ static int __init at91_pm_init(void)
  	pr_info("AT91: Power Management%s\n", (slow_clock ? " (with slow 
clock mode)" : ""));

  	/* AT91RM9200 SDRAM low-power mode cannot be used with self-refresh. */
-	if (cpu_is_at91rm9200()) {
-		at91_cpuidle_device.dev.platform_data = at91rm9200_standby;
+	if (cpu_is_at91rm9200())
  		at91_ramc_write(0, AT91RM9200_SDRAMC_LPR, 0);
-	} else if (cpu_is_at91sam9g45()) {
-		at91_cpuidle_device.dev.platform_data = at91sam9g45_standby;
-	} else if (cpu_is_at91sam9263()) {
-		at91_cpuidle_device.dev.platform_data = at91sam9263_standby;
-	} else {
-		at91_cpuidle_device.dev.platform_data = at91sam9_standby;
-	}
  	
  	platform_device_register(&at91_cpuidle_device);

diff --git a/arch/arm/mach-at91/pm.h b/arch/arm/mach-at91/pm.h
index 2f5908f..76dd1a7 100644
--- a/arch/arm/mach-at91/pm.h
+++ b/arch/arm/mach-at91/pm.h
@@ -11,9 +11,13 @@
  #ifndef __ARCH_ARM_MACH_AT91_PM
  #define __ARCH_ARM_MACH_AT91_PM

+#include <asm/proc-fns.h>
+
  #include <mach/at91_ramc.h>
  #include <mach/at91rm9200_sdramc.h>

+extern void at91_pm_set_standby(void (*at91_standby)(void));
+
  /*
   * The AT91RM9200 goes into self-refresh mode with this command, and will
   * terminate self-refresh automatically on the next SDRAM access.
diff --git a/arch/arm/mach-at91/sama5d3.c b/arch/arm/mach-at91/sama5d3.c
index 4012797..9a53db6 100644
--- a/arch/arm/mach-at91/sama5d3.c
+++ b/arch/arm/mach-at91/sama5d3.c
@@ -21,6 +21,7 @@
  #include "generic.h"
  #include "clock.h"
  #include "sam9_smc.h"
+#include "pm.h"

  /* --------------------------------------------------------------------
   *  Clocks
@@ -365,13 +366,18 @@ static void __init sama5d3_register_clocks(void)
  /* --------------------------------------------------------------------
   *  AT91SAM9x5 processor initialization
   * -------------------------------------------------------------------- */
-
  static void __init sama5d3_map_io(void)
  {
  	at91_init_sram(0, SAMA5D3_SRAM_BASE, SAMA5D3_SRAM_SIZE);
  }

+static void __init sama5d3_initialize(void)
+{
+	at91_set_standby(at91sam9_standby);
+}
+
  AT91_SOC_START(sama5d3)
  	.map_io = sama5d3_map_io,
  	.register_clocks = sama5d3_register_clocks,
+	.init = sama5d3_initialize,
  AT91_SOC_END
