linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V4 1/2] ARM: at91: cpuidle: convert to platform driver
@ 2013-10-15  9:41 Daniel Lezcano
  2013-10-15  9:41 ` [PATCH V4 2/2] ARM: at91: cpuidle: Move driver to drivers/cpuidle Daniel Lezcano
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Daniel Lezcano @ 2013-10-15  9:41 UTC (permalink / raw)
  To: linux-arm-kernel

Using the platform driver model is a good way to separate the cpuidle specific
code from the low level pm code. It allows to remove the dependency between
these two components.

The platform_device is located in the pm code and a 'set' function has been
added to set the standby function from the AT91_SOC_START initialization
function. Each SoC with a cpuidle driver will set the standby function in the
platform_data field at init time. Then pm code will register the cpuidle
platform device.

The cpuidle driver will register the platform_driver and use the device's
platform_data as a standby callback in the idle path.

The at91_pm_enter function contains a { if then else } based on cpu_is_xx
similar to what was in cpuidle. This is considered dangerous when adding a new
SoC. Like the cpuidle driver, a standby ops is defined and assigned when the
SoC init function specifies what is its standby function and reused in the
at91_pm_enter's 'case' block.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 arch/arm/mach-at91/at91rm9200.c  |    3 +++
 arch/arm/mach-at91/at91sam9260.c |    3 +++
 arch/arm/mach-at91/at91sam9261.c |    3 +++
 arch/arm/mach-at91/at91sam9263.c |    3 +++
 arch/arm/mach-at91/at91sam9g45.c |    3 +++
 arch/arm/mach-at91/at91sam9rl.c  |    3 +++
 arch/arm/mach-at91/cpuidle.c     |   29 +++++++++++++++--------------
 arch/arm/mach-at91/pm.c          |   27 +++++++++++++++++++--------
 arch/arm/mach-at91/pm.h          |    4 ++++
 9 files changed, 56 insertions(+), 22 deletions(-)

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..ffe9ce7 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
@@ -351,6 +352,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..8c81c89 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
@@ -330,6 +331,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..8460f52 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
@@ -379,6 +380,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/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c
index d4ec0d9..c7986e4 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
@@ -296,6 +297,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/cpuidle.c b/arch/arm/mach-at91/cpuidle.c
index 4ec6a6d..a077437 100644
--- a/arch/arm/mach-at91/cpuidle.c
+++ b/arch/arm/mach-at91/cpuidle.c
@@ -21,26 +21,17 @@
 #include <linux/export.h>
 #include <asm/proc-fns.h>
 #include <asm/cpuidle.h>
-#include <mach/cpu.h>
-
-#include "pm.h"
 
 #define AT91_MAX_STATES	2
 
+static void (*at91_standby)(void);
+
 /* Actual code that puts the SoC in different idle states */
 static int at91_enter_idle(struct cpuidle_device *dev,
 			struct cpuidle_driver *drv,
 			       int index)
 {
-	if (cpu_is_at91rm9200())
-		at91rm9200_standby();
-	else if (cpu_is_at91sam9g45())
-		at91sam9g45_standby();
-	else if (cpu_is_at91sam9263())
-		at91sam9263_standby();
-	else
-		at91sam9_standby();
-
+	at91_standby();
 	return index;
 }
 
@@ -60,9 +51,19 @@ static struct cpuidle_driver at91_idle_driver = {
 };
 
 /* Initialize CPU idle by registering the idle states */
-static int __init at91_init_cpuidle(void)
+static int at91_cpuidle_probe(struct platform_device *dev)
 {
+	at91_standby = (void *)(dev->dev.platform_data);
+	
 	return cpuidle_register(&at91_idle_driver, NULL);
 }
 
-device_initcall(at91_init_cpuidle);
+static struct platform_driver at91_cpuidle_driver = {
+	.driver = {
+		.name = "cpuidle-at91",
+		.owner = THIS_MODULE,
+	},
+	.probe = at91_cpuidle_probe,
+};
+
+module_platform_driver(at91_cpuidle_driver);
diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c
index 15afb5d..9986542 100644
--- a/arch/arm/mach-at91/pm.c
+++ b/arch/arm/mach-at91/pm.c
@@ -39,6 +39,8 @@
 #include "at91_rstc.h"
 #include "at91_shdwc.h"
 
+static void (*at91_pm_standby)(void);
+
 static void __init show_reset_status(void)
 {
 	static char reset[] __initdata = "reset";
@@ -266,14 +268,8 @@ static int at91_pm_enter(suspend_state_t state)
 			 * For ARM 926 based chips, this requirement is weaker
 			 * as at91sam9 can access a RAM in self-refresh mode.
 			 */
-			if (cpu_is_at91rm9200())
-				at91rm9200_standby();
-			else if (cpu_is_at91sam9g45())
-				at91sam9g45_standby();
-			else if (cpu_is_at91sam9263())
-				at91sam9263_standby();
-			else
-				at91sam9_standby();
+			if (at91_pm_standby)
+				at91_pm_standby();
 			break;
 
 		case PM_SUSPEND_ON:
@@ -314,6 +310,18 @@ static const struct platform_suspend_ops at91_pm_ops = {
 	.end	= at91_pm_end,
 };
 
+static struct platform_device at91_cpuidle_device = {
+	.name = "cpuidle-at91",
+};
+
+void at91_pm_set_standby(void (*at91_standby)(void))
+{
+	if (at91_standby) {
+		at91_cpuidle_device.dev.platform_data = at91_standby;
+		at91_pm_standby = at91_standby;
+	}
+}
+
 static int __init at91_pm_init(void)
 {
 #ifdef CONFIG_AT91_SLOW_CLOCK
@@ -325,6 +333,9 @@ static int __init at91_pm_init(void)
 	/* AT91RM9200 SDRAM low-power mode cannot be used with self-refresh. */
 	if (cpu_is_at91rm9200())
 		at91_ramc_write(0, AT91RM9200_SDRAMC_LPR, 0);
+	
+	if (at91_cpuidle_device.dev.platform_data)
+		platform_device_register(&at91_cpuidle_device);
 
 	suspend_set_ops(&at91_pm_ops);
 
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.
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH V4 2/2] ARM: at91: cpuidle: Move driver to drivers/cpuidle
  2013-10-15  9:41 [PATCH V4 1/2] ARM: at91: cpuidle: convert to platform driver Daniel Lezcano
@ 2013-10-15  9:41 ` Daniel Lezcano
  2013-10-16 14:24 ` [PATCH 1/2] ARM: AT91: pm: factorize standby function Jean-Christophe PLAGNIOL-VILLARD
  2013-10-16 16:25 ` [PATCH V4 1/2] ARM: at91: cpuidle: convert to platform driver Nicolas Ferre
  2 siblings, 0 replies; 9+ messages in thread
From: Daniel Lezcano @ 2013-10-15  9:41 UTC (permalink / raw)
  To: linux-arm-kernel

As the cpuidle driver code has no more the dependency with the pm code, the
'standby' callback being passed as a parameter to the device's platform data,
we can move the cpuidle driver in the drivers/cpuidle directory.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 arch/arm/mach-at91/Makefile                        |    1 -
 drivers/cpuidle/Kconfig.arm                        |    7 +++++++
 drivers/cpuidle/Makefile                           |    1 +
 .../cpuidle.c => drivers/cpuidle/cpuidle-at91.c    |    0
 4 files changed, 8 insertions(+), 1 deletion(-)
 rename arch/arm/mach-at91/cpuidle.c => drivers/cpuidle/cpuidle-at91.c (100%)

diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index 3b0a953..c1b7370 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -98,7 +98,6 @@ obj-y				+= leds.o
 # Power Management
 obj-$(CONFIG_PM)		+= pm.o
 obj-$(CONFIG_AT91_SLOW_CLOCK)	+= pm_slowclock.o
-obj-$(CONFIG_CPU_IDLE)	+= cpuidle.o
 
 ifeq ($(CONFIG_PM_DEBUG),y)
 CFLAGS_pm.o += -DDEBUG
diff --git a/drivers/cpuidle/Kconfig.arm b/drivers/cpuidle/Kconfig.arm
index 8e36603..33a745e 100644
--- a/drivers/cpuidle/Kconfig.arm
+++ b/drivers/cpuidle/Kconfig.arm
@@ -27,6 +27,13 @@ config ARM_U8500_CPUIDLE
 	help
 	  Select this to enable cpuidle for ST-E u8500 processors
 
+config ARM_AT91_CPUIDLE
+	bool "Cpu Idle Driver for the AT91 processors"
+	default y
+	depends on ARCH_AT91
+	help
+	  Select this to enable cpuidle for AT91 processors
+
 config CPU_IDLE_BIG_LITTLE
 	bool "Support for ARM big.LITTLE processors"
 	depends on ARCH_VEXPRESS_TC2_PM
diff --git a/drivers/cpuidle/Makefile b/drivers/cpuidle/Makefile
index cea5ef5..60c4ae5 100644
--- a/drivers/cpuidle/Makefile
+++ b/drivers/cpuidle/Makefile
@@ -11,4 +11,5 @@ obj-$(CONFIG_ARM_HIGHBANK_CPUIDLE)	+= cpuidle-calxeda.o
 obj-$(CONFIG_ARM_KIRKWOOD_CPUIDLE)	+= cpuidle-kirkwood.o
 obj-$(CONFIG_ARM_ZYNQ_CPUIDLE)		+= cpuidle-zynq.o
 obj-$(CONFIG_ARM_U8500_CPUIDLE)         += cpuidle-ux500.o
+obj-$(CONFIG_ARM_AT91_CPUIDLE)          += cpuidle-at91.o
 obj-$(CONFIG_CPU_IDLE_BIG_LITTLE)	+= cpuidle-big_little.o
diff --git a/arch/arm/mach-at91/cpuidle.c b/drivers/cpuidle/cpuidle-at91.c
similarity index 100%
rename from arch/arm/mach-at91/cpuidle.c
rename to drivers/cpuidle/cpuidle-at91.c
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 1/2] ARM: AT91: pm: factorize standby function
  2013-10-15  9:41 [PATCH V4 1/2] ARM: at91: cpuidle: convert to platform driver Daniel Lezcano
  2013-10-15  9:41 ` [PATCH V4 2/2] ARM: at91: cpuidle: Move driver to drivers/cpuidle Daniel Lezcano
@ 2013-10-16 14:24 ` Jean-Christophe PLAGNIOL-VILLARD
  2013-10-16 14:24   ` [PATCH 2/2] ARM: AT91: DT: pm: select ram controller standby based on DT Jean-Christophe PLAGNIOL-VILLARD
  2013-10-16 15:04   ` [PATCH 1/2] ARM: AT91: pm: factorize standby function Daniel Lezcano
  2013-10-16 16:25 ` [PATCH V4 1/2] ARM: at91: cpuidle: convert to platform driver Nicolas Ferre
  2 siblings, 2 replies; 9+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2013-10-16 14:24 UTC (permalink / raw)
  To: linux-arm-kernel

Detect presence of second bank. So we do not need to have on function per SoC

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: Nicolas Ferre <nicolas.ferre@atmel.com>
---
 arch/arm/mach-at91/at91sam9260.c |  2 +-
 arch/arm/mach-at91/at91sam9261.c |  2 +-
 arch/arm/mach-at91/at91sam9263.c |  2 +-
 arch/arm/mach-at91/at91sam9g45.c |  2 +-
 arch/arm/mach-at91/at91sam9rl.c  |  2 +-
 arch/arm/mach-at91/pm.h          | 55 ++++++++++++++++++----------------------
 6 files changed, 29 insertions(+), 36 deletions(-)

diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c
index ffe9ce7..3b43d56 100644
--- a/arch/arm/mach-at91/at91sam9260.c
+++ b/arch/arm/mach-at91/at91sam9260.c
@@ -353,7 +353,7 @@ static void __init at91sam9260_initialize(void)
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9260_gpio, 3);
 
-	at91_pm_set_standby(at91sam9_standby);
+	at91_pm_set_standby(at91sam9_sdram_standby);
 }
 
 /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c
index 1edbb6f..a0857c3 100644
--- a/arch/arm/mach-at91/at91sam9261.c
+++ b/arch/arm/mach-at91/at91sam9261.c
@@ -295,7 +295,7 @@ static void __init at91sam9261_initialize(void)
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9261_gpio, 3);
 
-	at91_pm_set_sandby(at91sam9_standby);
+	at91_pm_set_standby(at91sam9_sdram_standby);
 }
 
 /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c
index 8c81c89..103a95b 100644
--- a/arch/arm/mach-at91/at91sam9263.c
+++ b/arch/arm/mach-at91/at91sam9263.c
@@ -332,7 +332,7 @@ static void __init at91sam9263_initialize(void)
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9263_gpio, 5);
 
-	at91_pm_set_standby(at91sam9263_standby);
+	at91_pm_set_standby(at91sam9_sdram_standby);
 }
 
 /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c
index 8460f52..f29731e 100644
--- a/arch/arm/mach-at91/at91sam9g45.c
+++ b/arch/arm/mach-at91/at91sam9g45.c
@@ -381,7 +381,7 @@ static void __init at91sam9g45_initialize(void)
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9g45_gpio, 5);
 
-	at91_pm_set_standby(at91sam9g45_standby);
+	at91_pm_set_standby(at91_ddr_standby);
 }
 
 /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c
index c7986e4..9e28f41 100644
--- a/arch/arm/mach-at91/at91sam9rl.c
+++ b/arch/arm/mach-at91/at91sam9rl.c
@@ -298,7 +298,7 @@ static void __init at91sam9rl_initialize(void)
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9rl_gpio, 4);
 
-	at91_pm_set_standby(at91sam9_standby);
+	at91_pm_set_standby(at91sam9_sdram_standby);
 }
 
 /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/pm.h b/arch/arm/mach-at91/pm.h
index 76dd1a7..3ed190c 100644
--- a/arch/arm/mach-at91/pm.h
+++ b/arch/arm/mach-at91/pm.h
@@ -49,16 +49,18 @@ static inline void at91rm9200_standby(void)
 /* We manage both DDRAM/SDRAM controllers, we need more than one value to
  * remember.
  */
-static inline void at91sam9g45_standby(void)
+static inline void at91_ddr_standby(void)
 {
 	/* Those two values allow us to delay self-refresh activation
 	 * to the maximum. */
-	u32 lpr0, lpr1;
-	u32 saved_lpr0, saved_lpr1;
+	u32 lpr0, lpr1 = 0;
+	u32 saved_lpr0, saved_lpr1 = 0;
 
-	saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
-	lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
-	lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
+	if (at91_ramc_base[1]) {
+		saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
+		lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
+		lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
+	}
 
 	saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
 	lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
@@ -66,25 +68,29 @@ static inline void at91sam9g45_standby(void)
 
 	/* self-refresh mode now */
 	at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
-	at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
+	if (at91_ramc_base[1])
+		at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
 
 	cpu_do_idle();
 
 	at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0);
-	at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
+	if (at91_ramc_base[1])
+		at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
 }
 
 /* We manage both DDRAM/SDRAM controllers, we need more than one value to
  * remember.
  */
-static inline void at91sam9263_standby(void)
+static inline void at91sam9_sdram_standby(void)
 {
-	u32 lpr0, lpr1;
-	u32 saved_lpr0, saved_lpr1;
+	u32 lpr0, lpr1 = 0;
+	u32 saved_lpr0, saved_lpr1 = 0;
 
-	saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR);
-	lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB;
-	lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
+	if (at91_ramc_base[1]) {
+		saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR);
+		lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB;
+		lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
+	}
 
 	saved_lpr0 = at91_ramc_read(0, AT91_SDRAMC_LPR);
 	lpr0 = saved_lpr0 & ~AT91_SDRAMC_LPCB;
@@ -92,27 +98,14 @@ static inline void at91sam9263_standby(void)
 
 	/* self-refresh mode now */
 	at91_ramc_write(0, AT91_SDRAMC_LPR, lpr0);
-	at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1);
+	if (at91_ramc_base[1])
+		at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1);
 
 	cpu_do_idle();
 
 	at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr0);
-	at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
-}
-
-static inline void at91sam9_standby(void)
-{
-	u32 saved_lpr, lpr;
-
-	saved_lpr = at91_ramc_read(0, AT91_SDRAMC_LPR);
-
-	lpr = saved_lpr & ~AT91_SDRAMC_LPCB;
-	at91_ramc_write(0, AT91_SDRAMC_LPR, lpr |
-			AT91_SDRAMC_LPCB_SELF_REFRESH);
-
-	cpu_do_idle();
-
-	at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr);
+	if (at91_ramc_base[1])
+		at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
 }
 
 #endif
-- 
1.8.4.rc3

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/2] ARM: AT91: DT: pm: select ram controller standby based on DT
  2013-10-16 14:24 ` [PATCH 1/2] ARM: AT91: pm: factorize standby function Jean-Christophe PLAGNIOL-VILLARD
@ 2013-10-16 14:24   ` Jean-Christophe PLAGNIOL-VILLARD
  2013-10-16 15:04   ` [PATCH 1/2] ARM: AT91: pm: factorize standby function Daniel Lezcano
  1 sibling, 0 replies; 9+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2013-10-16 14:24 UTC (permalink / raw)
  To: linux-arm-kernel

Move non-dt selection to ioremap_registers init which is only called not
non-dt board.

So we can support sam9n12/sam9x5/sama5d3 too.

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: Nicolas Ferre <nicolas.ferre@atmel.com>
---
 arch/arm/mach-at91/at91rm9200.c  |  3 +--
 arch/arm/mach-at91/at91sam9260.c |  3 +--
 arch/arm/mach-at91/at91sam9261.c |  3 +--
 arch/arm/mach-at91/at91sam9263.c |  3 +--
 arch/arm/mach-at91/at91sam9g45.c |  3 +--
 arch/arm/mach-at91/at91sam9rl.c  |  3 +--
 arch/arm/mach-at91/setup.c       | 14 +++++++++++---
 7 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c
index 0d234f2..25805f2 100644
--- a/arch/arm/mach-at91/at91rm9200.c
+++ b/arch/arm/mach-at91/at91rm9200.c
@@ -328,6 +328,7 @@ static void __init at91rm9200_ioremap_registers(void)
 {
 	at91rm9200_ioremap_st(AT91RM9200_BASE_ST);
 	at91_ioremap_ramc(0, AT91RM9200_BASE_MC, 256);
+	at91_pm_set_standby(at91rm9200_standby);
 }
 
 static void __init at91rm9200_initialize(void)
@@ -338,8 +339,6 @@ 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 3b43d56..f8629a3 100644
--- a/arch/arm/mach-at91/at91sam9260.c
+++ b/arch/arm/mach-at91/at91sam9260.c
@@ -343,6 +343,7 @@ static void __init at91sam9260_ioremap_registers(void)
 	at91sam926x_ioremap_pit(AT91SAM9260_BASE_PIT);
 	at91sam9_ioremap_smc(0, AT91SAM9260_BASE_SMC);
 	at91_ioremap_matrix(AT91SAM9260_BASE_MATRIX);
+	at91_pm_set_standby(at91sam9_sdram_standby);
 }
 
 static void __init at91sam9260_initialize(void)
@@ -352,8 +353,6 @@ static void __init at91sam9260_initialize(void)
 
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9260_gpio, 3);
-
-	at91_pm_set_standby(at91sam9_sdram_standby);
 }
 
 /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c
index a0857c3..1f3867a 100644
--- a/arch/arm/mach-at91/at91sam9261.c
+++ b/arch/arm/mach-at91/at91sam9261.c
@@ -285,6 +285,7 @@ static void __init at91sam9261_ioremap_registers(void)
 	at91sam926x_ioremap_pit(AT91SAM9261_BASE_PIT);
 	at91sam9_ioremap_smc(0, AT91SAM9261_BASE_SMC);
 	at91_ioremap_matrix(AT91SAM9261_BASE_MATRIX);
+	at91_pm_set_standby(at91sam9_sdram_standby);
 }
 
 static void __init at91sam9261_initialize(void)
@@ -294,8 +295,6 @@ static void __init at91sam9261_initialize(void)
 
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9261_gpio, 3);
-
-	at91_pm_set_standby(at91sam9_sdram_standby);
 }
 
 /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c
index 103a95b..90d455d 100644
--- a/arch/arm/mach-at91/at91sam9263.c
+++ b/arch/arm/mach-at91/at91sam9263.c
@@ -322,6 +322,7 @@ static void __init at91sam9263_ioremap_registers(void)
 	at91sam9_ioremap_smc(0, AT91SAM9263_BASE_SMC0);
 	at91sam9_ioremap_smc(1, AT91SAM9263_BASE_SMC1);
 	at91_ioremap_matrix(AT91SAM9263_BASE_MATRIX);
+	at91_pm_set_standby(at91sam9_sdram_standby);
 }
 
 static void __init at91sam9263_initialize(void)
@@ -331,8 +332,6 @@ static void __init at91sam9263_initialize(void)
 
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9263_gpio, 5);
-
-	at91_pm_set_standby(at91sam9_sdram_standby);
 }
 
 /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c
index f29731e..e9bf0b8 100644
--- a/arch/arm/mach-at91/at91sam9g45.c
+++ b/arch/arm/mach-at91/at91sam9g45.c
@@ -371,6 +371,7 @@ static void __init at91sam9g45_ioremap_registers(void)
 	at91sam926x_ioremap_pit(AT91SAM9G45_BASE_PIT);
 	at91sam9_ioremap_smc(0, AT91SAM9G45_BASE_SMC);
 	at91_ioremap_matrix(AT91SAM9G45_BASE_MATRIX);
+	at91_pm_set_standby(at91_ddr_standby);
 }
 
 static void __init at91sam9g45_initialize(void)
@@ -380,8 +381,6 @@ static void __init at91sam9g45_initialize(void)
 
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9g45_gpio, 5);
-
-	at91_pm_set_standby(at91_ddr_standby);
 }
 
 /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c
index 9e28f41..88995af 100644
--- a/arch/arm/mach-at91/at91sam9rl.c
+++ b/arch/arm/mach-at91/at91sam9rl.c
@@ -288,6 +288,7 @@ static void __init at91sam9rl_ioremap_registers(void)
 	at91sam926x_ioremap_pit(AT91SAM9RL_BASE_PIT);
 	at91sam9_ioremap_smc(0, AT91SAM9RL_BASE_SMC);
 	at91_ioremap_matrix(AT91SAM9RL_BASE_MATRIX);
+	at91_pm_set_standby(at91sam9_sdram_standby);
 }
 
 static void __init at91sam9rl_initialize(void)
@@ -297,8 +298,6 @@ static void __init at91sam9rl_initialize(void)
 
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9rl_gpio, 4);
-
-	at91_pm_set_standby(at91sam9_sdram_standby);
 }
 
 /* --------------------------------------------------------------------
diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c
index b17fbcf..094b345 100644
--- a/arch/arm/mach-at91/setup.c
+++ b/arch/arm/mach-at91/setup.c
@@ -23,6 +23,7 @@
 #include "at91_shdwc.h"
 #include "soc.h"
 #include "generic.h"
+#include "pm.h"
 
 struct at91_init_soc __initdata at91_boot_soc;
 
@@ -376,15 +377,16 @@ static void at91_dt_rstc(void)
 }
 
 static struct of_device_id ramc_ids[] = {
-	{ .compatible = "atmel,at91rm9200-sdramc" },
-	{ .compatible = "atmel,at91sam9260-sdramc" },
-	{ .compatible = "atmel,at91sam9g45-ddramc" },
+	{ .compatible = "atmel,at91rm9200-sdramc", .data = at91rm9200_standby },
+	{ .compatible = "atmel,at91sam9260-sdramc", .data = at91sam9_sdram_standby },
+	{ .compatible = "atmel,at91sam9g45-ddramc", .data = at91_ddr_standby },
 	{ /*sentinel*/ }
 };
 
 static void at91_dt_ramc(void)
 {
 	struct device_node *np;
+	const struct of_device_id *of_id;
 
 	np = of_find_matching_node(NULL, ramc_ids);
 	if (!np)
@@ -396,6 +398,12 @@ static void at91_dt_ramc(void)
 	/* the controller may have 2 banks */
 	at91_ramc_base[1] = of_iomap(np, 1);
 
+	of_id = of_match_node(ramc_ids, np);
+	if (!of_id)
+		pr_warn("AT91: ramc no standby function available\n");
+	else
+		at91_pm_set_standby(of_id->data);
+
 	of_node_put(np);
 }
 
-- 
1.8.4.rc3

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 1/2] ARM: AT91: pm: factorize standby function
  2013-10-16 14:24 ` [PATCH 1/2] ARM: AT91: pm: factorize standby function Jean-Christophe PLAGNIOL-VILLARD
  2013-10-16 14:24   ` [PATCH 2/2] ARM: AT91: DT: pm: select ram controller standby based on DT Jean-Christophe PLAGNIOL-VILLARD
@ 2013-10-16 15:04   ` Daniel Lezcano
  2013-10-16 15:48     ` Jean-Christophe PLAGNIOL-VILLARD
  1 sibling, 1 reply; 9+ messages in thread
From: Daniel Lezcano @ 2013-10-16 15:04 UTC (permalink / raw)
  To: linux-arm-kernel

On 10/16/2013 04:24 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> Detect presence of second bank. So we do not need to have on function per SoC
>
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> Cc: Nicolas Ferre <nicolas.ferre@atmel.com>

Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>

> ---
>   arch/arm/mach-at91/at91sam9260.c |  2 +-
>   arch/arm/mach-at91/at91sam9261.c |  2 +-
>   arch/arm/mach-at91/at91sam9263.c |  2 +-
>   arch/arm/mach-at91/at91sam9g45.c |  2 +-
>   arch/arm/mach-at91/at91sam9rl.c  |  2 +-
>   arch/arm/mach-at91/pm.h          | 55 ++++++++++++++++++----------------------
>   6 files changed, 29 insertions(+), 36 deletions(-)
>
> diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c
> index ffe9ce7..3b43d56 100644
> --- a/arch/arm/mach-at91/at91sam9260.c
> +++ b/arch/arm/mach-at91/at91sam9260.c
> @@ -353,7 +353,7 @@ static void __init at91sam9260_initialize(void)
>   	/* Register GPIO subsystem */
>   	at91_gpio_init(at91sam9260_gpio, 3);
>
> -	at91_pm_set_standby(at91sam9_standby);
> +	at91_pm_set_standby(at91sam9_sdram_standby);
>   }
>
>   /* --------------------------------------------------------------------
> diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c
> index 1edbb6f..a0857c3 100644
> --- a/arch/arm/mach-at91/at91sam9261.c
> +++ b/arch/arm/mach-at91/at91sam9261.c
> @@ -295,7 +295,7 @@ static void __init at91sam9261_initialize(void)
>   	/* Register GPIO subsystem */
>   	at91_gpio_init(at91sam9261_gpio, 3);
>
> -	at91_pm_set_sandby(at91sam9_standby);
> +	at91_pm_set_standby(at91sam9_sdram_standby);
>   }
>
>   /* --------------------------------------------------------------------
> diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c
> index 8c81c89..103a95b 100644
> --- a/arch/arm/mach-at91/at91sam9263.c
> +++ b/arch/arm/mach-at91/at91sam9263.c
> @@ -332,7 +332,7 @@ static void __init at91sam9263_initialize(void)
>   	/* Register GPIO subsystem */
>   	at91_gpio_init(at91sam9263_gpio, 5);
>
> -	at91_pm_set_standby(at91sam9263_standby);
> +	at91_pm_set_standby(at91sam9_sdram_standby);
>   }
>
>   /* --------------------------------------------------------------------
> diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c
> index 8460f52..f29731e 100644
> --- a/arch/arm/mach-at91/at91sam9g45.c
> +++ b/arch/arm/mach-at91/at91sam9g45.c
> @@ -381,7 +381,7 @@ static void __init at91sam9g45_initialize(void)
>   	/* Register GPIO subsystem */
>   	at91_gpio_init(at91sam9g45_gpio, 5);
>
> -	at91_pm_set_standby(at91sam9g45_standby);
> +	at91_pm_set_standby(at91_ddr_standby);
>   }
>
>   /* --------------------------------------------------------------------
> diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c
> index c7986e4..9e28f41 100644
> --- a/arch/arm/mach-at91/at91sam9rl.c
> +++ b/arch/arm/mach-at91/at91sam9rl.c
> @@ -298,7 +298,7 @@ static void __init at91sam9rl_initialize(void)
>   	/* Register GPIO subsystem */
>   	at91_gpio_init(at91sam9rl_gpio, 4);
>
> -	at91_pm_set_standby(at91sam9_standby);
> +	at91_pm_set_standby(at91sam9_sdram_standby);
>   }
>
>   /* --------------------------------------------------------------------
> diff --git a/arch/arm/mach-at91/pm.h b/arch/arm/mach-at91/pm.h
> index 76dd1a7..3ed190c 100644
> --- a/arch/arm/mach-at91/pm.h
> +++ b/arch/arm/mach-at91/pm.h
> @@ -49,16 +49,18 @@ static inline void at91rm9200_standby(void)
>   /* We manage both DDRAM/SDRAM controllers, we need more than one value to
>    * remember.
>    */
> -static inline void at91sam9g45_standby(void)
> +static inline void at91_ddr_standby(void)
>   {
>   	/* Those two values allow us to delay self-refresh activation
>   	 * to the maximum. */
> -	u32 lpr0, lpr1;
> -	u32 saved_lpr0, saved_lpr1;
> +	u32 lpr0, lpr1 = 0;
> +	u32 saved_lpr0, saved_lpr1 = 0;
>
> -	saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
> -	lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
> -	lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
> +	if (at91_ramc_base[1]) {
> +		saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
> +		lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
> +		lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
> +	}
>
>   	saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
>   	lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
> @@ -66,25 +68,29 @@ static inline void at91sam9g45_standby(void)
>
>   	/* self-refresh mode now */
>   	at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
> -	at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
> +	if (at91_ramc_base[1])
> +		at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
>
>   	cpu_do_idle();
>
>   	at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0);
> -	at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
> +	if (at91_ramc_base[1])
> +		at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
>   }
>
>   /* We manage both DDRAM/SDRAM controllers, we need more than one value to
>    * remember.
>    */
> -static inline void at91sam9263_standby(void)
> +static inline void at91sam9_sdram_standby(void)
>   {
> -	u32 lpr0, lpr1;
> -	u32 saved_lpr0, saved_lpr1;
> +	u32 lpr0, lpr1 = 0;
> +	u32 saved_lpr0, saved_lpr1 = 0;
>
> -	saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR);
> -	lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB;
> -	lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
> +	if (at91_ramc_base[1]) {
> +		saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR);
> +		lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB;
> +		lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
> +	}
>
>   	saved_lpr0 = at91_ramc_read(0, AT91_SDRAMC_LPR);
>   	lpr0 = saved_lpr0 & ~AT91_SDRAMC_LPCB;
> @@ -92,27 +98,14 @@ static inline void at91sam9263_standby(void)
>
>   	/* self-refresh mode now */
>   	at91_ramc_write(0, AT91_SDRAMC_LPR, lpr0);
> -	at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1);
> +	if (at91_ramc_base[1])
> +		at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1);
>
>   	cpu_do_idle();
>
>   	at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr0);
> -	at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
> -}
> -
> -static inline void at91sam9_standby(void)
> -{
> -	u32 saved_lpr, lpr;
> -
> -	saved_lpr = at91_ramc_read(0, AT91_SDRAMC_LPR);
> -
> -	lpr = saved_lpr & ~AT91_SDRAMC_LPCB;
> -	at91_ramc_write(0, AT91_SDRAMC_LPR, lpr |
> -			AT91_SDRAMC_LPCB_SELF_REFRESH);
> -
> -	cpu_do_idle();
> -
> -	at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr);
> +	if (at91_ramc_base[1])
> +		at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
>   }
>
>   #endif
>


-- 
  <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/2] ARM: AT91: pm: factorize standby function
  2013-10-16 15:04   ` [PATCH 1/2] ARM: AT91: pm: factorize standby function Daniel Lezcano
@ 2013-10-16 15:48     ` Jean-Christophe PLAGNIOL-VILLARD
  2013-10-16 16:04       ` Daniel Lezcano
  0 siblings, 1 reply; 9+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2013-10-16 15:48 UTC (permalink / raw)
  To: linux-arm-kernel

On 17:04 Wed 16 Oct     , Daniel Lezcano wrote:
> On 10/16/2013 04:24 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> >Detect presence of second bank. So we do not need to have on function per SoC
> >
> >Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> >Cc: Nicolas Ferre <nicolas.ferre@atmel.com>
> 
> Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>

as discuss with Nico please take via your tree with my Ack

Acked-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>

Best Regards,
J.
> 
> >---
> >  arch/arm/mach-at91/at91sam9260.c |  2 +-
> >  arch/arm/mach-at91/at91sam9261.c |  2 +-
> >  arch/arm/mach-at91/at91sam9263.c |  2 +-
> >  arch/arm/mach-at91/at91sam9g45.c |  2 +-
> >  arch/arm/mach-at91/at91sam9rl.c  |  2 +-
> >  arch/arm/mach-at91/pm.h          | 55 ++++++++++++++++++----------------------
> >  6 files changed, 29 insertions(+), 36 deletions(-)
> >
> >diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c
> >index ffe9ce7..3b43d56 100644
> >--- a/arch/arm/mach-at91/at91sam9260.c
> >+++ b/arch/arm/mach-at91/at91sam9260.c
> >@@ -353,7 +353,7 @@ static void __init at91sam9260_initialize(void)
> >  	/* Register GPIO subsystem */
> >  	at91_gpio_init(at91sam9260_gpio, 3);
> >
> >-	at91_pm_set_standby(at91sam9_standby);
> >+	at91_pm_set_standby(at91sam9_sdram_standby);
> >  }
> >
> >  /* --------------------------------------------------------------------
> >diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c
> >index 1edbb6f..a0857c3 100644
> >--- a/arch/arm/mach-at91/at91sam9261.c
> >+++ b/arch/arm/mach-at91/at91sam9261.c
> >@@ -295,7 +295,7 @@ static void __init at91sam9261_initialize(void)
> >  	/* Register GPIO subsystem */
> >  	at91_gpio_init(at91sam9261_gpio, 3);
> >
> >-	at91_pm_set_sandby(at91sam9_standby);
> >+	at91_pm_set_standby(at91sam9_sdram_standby);
> >  }
> >
> >  /* --------------------------------------------------------------------
> >diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c
> >index 8c81c89..103a95b 100644
> >--- a/arch/arm/mach-at91/at91sam9263.c
> >+++ b/arch/arm/mach-at91/at91sam9263.c
> >@@ -332,7 +332,7 @@ static void __init at91sam9263_initialize(void)
> >  	/* Register GPIO subsystem */
> >  	at91_gpio_init(at91sam9263_gpio, 5);
> >
> >-	at91_pm_set_standby(at91sam9263_standby);
> >+	at91_pm_set_standby(at91sam9_sdram_standby);
> >  }
> >
> >  /* --------------------------------------------------------------------
> >diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c
> >index 8460f52..f29731e 100644
> >--- a/arch/arm/mach-at91/at91sam9g45.c
> >+++ b/arch/arm/mach-at91/at91sam9g45.c
> >@@ -381,7 +381,7 @@ static void __init at91sam9g45_initialize(void)
> >  	/* Register GPIO subsystem */
> >  	at91_gpio_init(at91sam9g45_gpio, 5);
> >
> >-	at91_pm_set_standby(at91sam9g45_standby);
> >+	at91_pm_set_standby(at91_ddr_standby);
> >  }
> >
> >  /* --------------------------------------------------------------------
> >diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c
> >index c7986e4..9e28f41 100644
> >--- a/arch/arm/mach-at91/at91sam9rl.c
> >+++ b/arch/arm/mach-at91/at91sam9rl.c
> >@@ -298,7 +298,7 @@ static void __init at91sam9rl_initialize(void)
> >  	/* Register GPIO subsystem */
> >  	at91_gpio_init(at91sam9rl_gpio, 4);
> >
> >-	at91_pm_set_standby(at91sam9_standby);
> >+	at91_pm_set_standby(at91sam9_sdram_standby);
> >  }
> >
> >  /* --------------------------------------------------------------------
> >diff --git a/arch/arm/mach-at91/pm.h b/arch/arm/mach-at91/pm.h
> >index 76dd1a7..3ed190c 100644
> >--- a/arch/arm/mach-at91/pm.h
> >+++ b/arch/arm/mach-at91/pm.h
> >@@ -49,16 +49,18 @@ static inline void at91rm9200_standby(void)
> >  /* We manage both DDRAM/SDRAM controllers, we need more than one value to
> >   * remember.
> >   */
> >-static inline void at91sam9g45_standby(void)
> >+static inline void at91_ddr_standby(void)
> >  {
> >  	/* Those two values allow us to delay self-refresh activation
> >  	 * to the maximum. */
> >-	u32 lpr0, lpr1;
> >-	u32 saved_lpr0, saved_lpr1;
> >+	u32 lpr0, lpr1 = 0;
> >+	u32 saved_lpr0, saved_lpr1 = 0;
> >
> >-	saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
> >-	lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
> >-	lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
> >+	if (at91_ramc_base[1]) {
> >+		saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
> >+		lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
> >+		lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
> >+	}
> >
> >  	saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
> >  	lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
> >@@ -66,25 +68,29 @@ static inline void at91sam9g45_standby(void)
> >
> >  	/* self-refresh mode now */
> >  	at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
> >-	at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
> >+	if (at91_ramc_base[1])
> >+		at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
> >
> >  	cpu_do_idle();
> >
> >  	at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0);
> >-	at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
> >+	if (at91_ramc_base[1])
> >+		at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
> >  }
> >
> >  /* We manage both DDRAM/SDRAM controllers, we need more than one value to
> >   * remember.
> >   */
> >-static inline void at91sam9263_standby(void)
> >+static inline void at91sam9_sdram_standby(void)
> >  {
> >-	u32 lpr0, lpr1;
> >-	u32 saved_lpr0, saved_lpr1;
> >+	u32 lpr0, lpr1 = 0;
> >+	u32 saved_lpr0, saved_lpr1 = 0;
> >
> >-	saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR);
> >-	lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB;
> >-	lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
> >+	if (at91_ramc_base[1]) {
> >+		saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR);
> >+		lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB;
> >+		lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
> >+	}
> >
> >  	saved_lpr0 = at91_ramc_read(0, AT91_SDRAMC_LPR);
> >  	lpr0 = saved_lpr0 & ~AT91_SDRAMC_LPCB;
> >@@ -92,27 +98,14 @@ static inline void at91sam9263_standby(void)
> >
> >  	/* self-refresh mode now */
> >  	at91_ramc_write(0, AT91_SDRAMC_LPR, lpr0);
> >-	at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1);
> >+	if (at91_ramc_base[1])
> >+		at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1);
> >
> >  	cpu_do_idle();
> >
> >  	at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr0);
> >-	at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
> >-}
> >-
> >-static inline void at91sam9_standby(void)
> >-{
> >-	u32 saved_lpr, lpr;
> >-
> >-	saved_lpr = at91_ramc_read(0, AT91_SDRAMC_LPR);
> >-
> >-	lpr = saved_lpr & ~AT91_SDRAMC_LPCB;
> >-	at91_ramc_write(0, AT91_SDRAMC_LPR, lpr |
> >-			AT91_SDRAMC_LPCB_SELF_REFRESH);
> >-
> >-	cpu_do_idle();
> >-
> >-	at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr);
> >+	if (at91_ramc_base[1])
> >+		at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
> >  }
> >
> >  #endif
> >
> 
> 
> -- 
>  <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs
> 
> Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
> <http://twitter.com/#!/linaroorg> Twitter |
> <http://www.linaro.org/linaro-blog/> Blog
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/2] ARM: AT91: pm: factorize standby function
  2013-10-16 15:48     ` Jean-Christophe PLAGNIOL-VILLARD
@ 2013-10-16 16:04       ` Daniel Lezcano
  2013-10-16 16:07         ` Jean-Christophe PLAGNIOL-VILLARD
  0 siblings, 1 reply; 9+ messages in thread
From: Daniel Lezcano @ 2013-10-16 16:04 UTC (permalink / raw)
  To: linux-arm-kernel

On 10/16/2013 05:48 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 17:04 Wed 16 Oct     , Daniel Lezcano wrote:
>> On 10/16/2013 04:24 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
>>> Detect presence of second bank. So we do not need to have on function per SoC
>>>
>>> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
>>> Cc: Nicolas Ferre <nicolas.ferre@atmel.com>
>>
>> Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>
>
> as discuss with Nico please take via your tree with my Ack
>
> Acked-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>

As they are based on my previous patches:

[PATCH V4 1/2] ARM: at91: cpuidle: convert to platform driver
[PATCH V4 2/2] ARM: at91: cpuidle: Move driver to drivers/cpuidle

Shall I assume they are acked-by you ?

Shall I take the patch:

[PATCH 2/2] ARM: AT91: DT: pm: select ram controller standby based on DT

also with your acked-by ?

Thanks
   -- Daniel

>>> ---
>>>   arch/arm/mach-at91/at91sam9260.c |  2 +-
>>>   arch/arm/mach-at91/at91sam9261.c |  2 +-
>>>   arch/arm/mach-at91/at91sam9263.c |  2 +-
>>>   arch/arm/mach-at91/at91sam9g45.c |  2 +-
>>>   arch/arm/mach-at91/at91sam9rl.c  |  2 +-
>>>   arch/arm/mach-at91/pm.h          | 55 ++++++++++++++++++----------------------
>>>   6 files changed, 29 insertions(+), 36 deletions(-)
>>>
>>> diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c
>>> index ffe9ce7..3b43d56 100644
>>> --- a/arch/arm/mach-at91/at91sam9260.c
>>> +++ b/arch/arm/mach-at91/at91sam9260.c
>>> @@ -353,7 +353,7 @@ static void __init at91sam9260_initialize(void)
>>>   	/* Register GPIO subsystem */
>>>   	at91_gpio_init(at91sam9260_gpio, 3);
>>>
>>> -	at91_pm_set_standby(at91sam9_standby);
>>> +	at91_pm_set_standby(at91sam9_sdram_standby);
>>>   }
>>>
>>>   /* --------------------------------------------------------------------
>>> diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c
>>> index 1edbb6f..a0857c3 100644
>>> --- a/arch/arm/mach-at91/at91sam9261.c
>>> +++ b/arch/arm/mach-at91/at91sam9261.c
>>> @@ -295,7 +295,7 @@ static void __init at91sam9261_initialize(void)
>>>   	/* Register GPIO subsystem */
>>>   	at91_gpio_init(at91sam9261_gpio, 3);
>>>
>>> -	at91_pm_set_sandby(at91sam9_standby);
>>> +	at91_pm_set_standby(at91sam9_sdram_standby);
>>>   }
>>>
>>>   /* --------------------------------------------------------------------
>>> diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c
>>> index 8c81c89..103a95b 100644
>>> --- a/arch/arm/mach-at91/at91sam9263.c
>>> +++ b/arch/arm/mach-at91/at91sam9263.c
>>> @@ -332,7 +332,7 @@ static void __init at91sam9263_initialize(void)
>>>   	/* Register GPIO subsystem */
>>>   	at91_gpio_init(at91sam9263_gpio, 5);
>>>
>>> -	at91_pm_set_standby(at91sam9263_standby);
>>> +	at91_pm_set_standby(at91sam9_sdram_standby);
>>>   }
>>>
>>>   /* --------------------------------------------------------------------
>>> diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c
>>> index 8460f52..f29731e 100644
>>> --- a/arch/arm/mach-at91/at91sam9g45.c
>>> +++ b/arch/arm/mach-at91/at91sam9g45.c
>>> @@ -381,7 +381,7 @@ static void __init at91sam9g45_initialize(void)
>>>   	/* Register GPIO subsystem */
>>>   	at91_gpio_init(at91sam9g45_gpio, 5);
>>>
>>> -	at91_pm_set_standby(at91sam9g45_standby);
>>> +	at91_pm_set_standby(at91_ddr_standby);
>>>   }
>>>
>>>   /* --------------------------------------------------------------------
>>> diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c
>>> index c7986e4..9e28f41 100644
>>> --- a/arch/arm/mach-at91/at91sam9rl.c
>>> +++ b/arch/arm/mach-at91/at91sam9rl.c
>>> @@ -298,7 +298,7 @@ static void __init at91sam9rl_initialize(void)
>>>   	/* Register GPIO subsystem */
>>>   	at91_gpio_init(at91sam9rl_gpio, 4);
>>>
>>> -	at91_pm_set_standby(at91sam9_standby);
>>> +	at91_pm_set_standby(at91sam9_sdram_standby);
>>>   }
>>>
>>>   /* --------------------------------------------------------------------
>>> diff --git a/arch/arm/mach-at91/pm.h b/arch/arm/mach-at91/pm.h
>>> index 76dd1a7..3ed190c 100644
>>> --- a/arch/arm/mach-at91/pm.h
>>> +++ b/arch/arm/mach-at91/pm.h
>>> @@ -49,16 +49,18 @@ static inline void at91rm9200_standby(void)
>>>   /* We manage both DDRAM/SDRAM controllers, we need more than one value to
>>>    * remember.
>>>    */
>>> -static inline void at91sam9g45_standby(void)
>>> +static inline void at91_ddr_standby(void)
>>>   {
>>>   	/* Those two values allow us to delay self-refresh activation
>>>   	 * to the maximum. */
>>> -	u32 lpr0, lpr1;
>>> -	u32 saved_lpr0, saved_lpr1;
>>> +	u32 lpr0, lpr1 = 0;
>>> +	u32 saved_lpr0, saved_lpr1 = 0;
>>>
>>> -	saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
>>> -	lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
>>> -	lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
>>> +	if (at91_ramc_base[1]) {
>>> +		saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
>>> +		lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
>>> +		lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
>>> +	}
>>>
>>>   	saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
>>>   	lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
>>> @@ -66,25 +68,29 @@ static inline void at91sam9g45_standby(void)
>>>
>>>   	/* self-refresh mode now */
>>>   	at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
>>> -	at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
>>> +	if (at91_ramc_base[1])
>>> +		at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
>>>
>>>   	cpu_do_idle();
>>>
>>>   	at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0);
>>> -	at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
>>> +	if (at91_ramc_base[1])
>>> +		at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
>>>   }
>>>
>>>   /* We manage both DDRAM/SDRAM controllers, we need more than one value to
>>>    * remember.
>>>    */
>>> -static inline void at91sam9263_standby(void)
>>> +static inline void at91sam9_sdram_standby(void)
>>>   {
>>> -	u32 lpr0, lpr1;
>>> -	u32 saved_lpr0, saved_lpr1;
>>> +	u32 lpr0, lpr1 = 0;
>>> +	u32 saved_lpr0, saved_lpr1 = 0;
>>>
>>> -	saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR);
>>> -	lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB;
>>> -	lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
>>> +	if (at91_ramc_base[1]) {
>>> +		saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR);
>>> +		lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB;
>>> +		lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
>>> +	}
>>>
>>>   	saved_lpr0 = at91_ramc_read(0, AT91_SDRAMC_LPR);
>>>   	lpr0 = saved_lpr0 & ~AT91_SDRAMC_LPCB;
>>> @@ -92,27 +98,14 @@ static inline void at91sam9263_standby(void)
>>>
>>>   	/* self-refresh mode now */
>>>   	at91_ramc_write(0, AT91_SDRAMC_LPR, lpr0);
>>> -	at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1);
>>> +	if (at91_ramc_base[1])
>>> +		at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1);
>>>
>>>   	cpu_do_idle();
>>>
>>>   	at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr0);
>>> -	at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
>>> -}
>>> -
>>> -static inline void at91sam9_standby(void)
>>> -{
>>> -	u32 saved_lpr, lpr;
>>> -
>>> -	saved_lpr = at91_ramc_read(0, AT91_SDRAMC_LPR);
>>> -
>>> -	lpr = saved_lpr & ~AT91_SDRAMC_LPCB;
>>> -	at91_ramc_write(0, AT91_SDRAMC_LPR, lpr |
>>> -			AT91_SDRAMC_LPCB_SELF_REFRESH);
>>> -
>>> -	cpu_do_idle();
>>> -
>>> -	at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr);
>>> +	if (at91_ramc_base[1])
>>> +		at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
>>>   }
>>>
>>>   #endif
>>>
>>
>>
>> --
>>   <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs
>>
>> Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
>> <http://twitter.com/#!/linaroorg> Twitter |
>> <http://www.linaro.org/linaro-blog/> Blog
>>
>>
>> _______________________________________________
>> linux-arm-kernel mailing list
>> linux-arm-kernel at lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel


-- 
  <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/2] ARM: AT91: pm: factorize standby function
  2013-10-16 16:04       ` Daniel Lezcano
@ 2013-10-16 16:07         ` Jean-Christophe PLAGNIOL-VILLARD
  0 siblings, 0 replies; 9+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2013-10-16 16:07 UTC (permalink / raw)
  To: linux-arm-kernel

On 18:04 Wed 16 Oct     , Daniel Lezcano wrote:
> On 10/16/2013 05:48 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> >On 17:04 Wed 16 Oct     , Daniel Lezcano wrote:
> >>On 10/16/2013 04:24 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> >>>Detect presence of second bank. So we do not need to have on function per SoC
> >>>
> >>>Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> >>>Cc: Nicolas Ferre <nicolas.ferre@atmel.com>
> >>
> >>Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>
> >
> >as discuss with Nico please take via your tree with my Ack
> >
> >Acked-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> 
> As they are based on my previous patches:
> 
> [PATCH V4 1/2] ARM: at91: cpuidle: convert to platform driver
> [PATCH V4 2/2] ARM: at91: cpuidle: Move driver to drivers/cpuidle
> 
> Shall I assume they are acked-by you ?

yes
> 
> Shall I take the patch:
> 
> [PATCH 2/2] ARM: AT91: DT: pm: select ram controller standby based on DT
> 
> also with your acked-by ?
I wrote it so no ;-)

Best Regards,
J.
> 
> Thanks
>   -- Daniel
> 
> >>>---
> >>>  arch/arm/mach-at91/at91sam9260.c |  2 +-
> >>>  arch/arm/mach-at91/at91sam9261.c |  2 +-
> >>>  arch/arm/mach-at91/at91sam9263.c |  2 +-
> >>>  arch/arm/mach-at91/at91sam9g45.c |  2 +-
> >>>  arch/arm/mach-at91/at91sam9rl.c  |  2 +-
> >>>  arch/arm/mach-at91/pm.h          | 55 ++++++++++++++++++----------------------
> >>>  6 files changed, 29 insertions(+), 36 deletions(-)
> >>>
> >>>diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c
> >>>index ffe9ce7..3b43d56 100644
> >>>--- a/arch/arm/mach-at91/at91sam9260.c
> >>>+++ b/arch/arm/mach-at91/at91sam9260.c
> >>>@@ -353,7 +353,7 @@ static void __init at91sam9260_initialize(void)
> >>>  	/* Register GPIO subsystem */
> >>>  	at91_gpio_init(at91sam9260_gpio, 3);
> >>>
> >>>-	at91_pm_set_standby(at91sam9_standby);
> >>>+	at91_pm_set_standby(at91sam9_sdram_standby);
> >>>  }
> >>>
> >>>  /* --------------------------------------------------------------------
> >>>diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c
> >>>index 1edbb6f..a0857c3 100644
> >>>--- a/arch/arm/mach-at91/at91sam9261.c
> >>>+++ b/arch/arm/mach-at91/at91sam9261.c
> >>>@@ -295,7 +295,7 @@ static void __init at91sam9261_initialize(void)
> >>>  	/* Register GPIO subsystem */
> >>>  	at91_gpio_init(at91sam9261_gpio, 3);
> >>>
> >>>-	at91_pm_set_sandby(at91sam9_standby);
> >>>+	at91_pm_set_standby(at91sam9_sdram_standby);
> >>>  }
> >>>
> >>>  /* --------------------------------------------------------------------
> >>>diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c
> >>>index 8c81c89..103a95b 100644
> >>>--- a/arch/arm/mach-at91/at91sam9263.c
> >>>+++ b/arch/arm/mach-at91/at91sam9263.c
> >>>@@ -332,7 +332,7 @@ static void __init at91sam9263_initialize(void)
> >>>  	/* Register GPIO subsystem */
> >>>  	at91_gpio_init(at91sam9263_gpio, 5);
> >>>
> >>>-	at91_pm_set_standby(at91sam9263_standby);
> >>>+	at91_pm_set_standby(at91sam9_sdram_standby);
> >>>  }
> >>>
> >>>  /* --------------------------------------------------------------------
> >>>diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c
> >>>index 8460f52..f29731e 100644
> >>>--- a/arch/arm/mach-at91/at91sam9g45.c
> >>>+++ b/arch/arm/mach-at91/at91sam9g45.c
> >>>@@ -381,7 +381,7 @@ static void __init at91sam9g45_initialize(void)
> >>>  	/* Register GPIO subsystem */
> >>>  	at91_gpio_init(at91sam9g45_gpio, 5);
> >>>
> >>>-	at91_pm_set_standby(at91sam9g45_standby);
> >>>+	at91_pm_set_standby(at91_ddr_standby);
> >>>  }
> >>>
> >>>  /* --------------------------------------------------------------------
> >>>diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c
> >>>index c7986e4..9e28f41 100644
> >>>--- a/arch/arm/mach-at91/at91sam9rl.c
> >>>+++ b/arch/arm/mach-at91/at91sam9rl.c
> >>>@@ -298,7 +298,7 @@ static void __init at91sam9rl_initialize(void)
> >>>  	/* Register GPIO subsystem */
> >>>  	at91_gpio_init(at91sam9rl_gpio, 4);
> >>>
> >>>-	at91_pm_set_standby(at91sam9_standby);
> >>>+	at91_pm_set_standby(at91sam9_sdram_standby);
> >>>  }
> >>>
> >>>  /* --------------------------------------------------------------------
> >>>diff --git a/arch/arm/mach-at91/pm.h b/arch/arm/mach-at91/pm.h
> >>>index 76dd1a7..3ed190c 100644
> >>>--- a/arch/arm/mach-at91/pm.h
> >>>+++ b/arch/arm/mach-at91/pm.h
> >>>@@ -49,16 +49,18 @@ static inline void at91rm9200_standby(void)
> >>>  /* We manage both DDRAM/SDRAM controllers, we need more than one value to
> >>>   * remember.
> >>>   */
> >>>-static inline void at91sam9g45_standby(void)
> >>>+static inline void at91_ddr_standby(void)
> >>>  {
> >>>  	/* Those two values allow us to delay self-refresh activation
> >>>  	 * to the maximum. */
> >>>-	u32 lpr0, lpr1;
> >>>-	u32 saved_lpr0, saved_lpr1;
> >>>+	u32 lpr0, lpr1 = 0;
> >>>+	u32 saved_lpr0, saved_lpr1 = 0;
> >>>
> >>>-	saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
> >>>-	lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
> >>>-	lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
> >>>+	if (at91_ramc_base[1]) {
> >>>+		saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
> >>>+		lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
> >>>+		lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
> >>>+	}
> >>>
> >>>  	saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
> >>>  	lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
> >>>@@ -66,25 +68,29 @@ static inline void at91sam9g45_standby(void)
> >>>
> >>>  	/* self-refresh mode now */
> >>>  	at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
> >>>-	at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
> >>>+	if (at91_ramc_base[1])
> >>>+		at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
> >>>
> >>>  	cpu_do_idle();
> >>>
> >>>  	at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0);
> >>>-	at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
> >>>+	if (at91_ramc_base[1])
> >>>+		at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
> >>>  }
> >>>
> >>>  /* We manage both DDRAM/SDRAM controllers, we need more than one value to
> >>>   * remember.
> >>>   */
> >>>-static inline void at91sam9263_standby(void)
> >>>+static inline void at91sam9_sdram_standby(void)
> >>>  {
> >>>-	u32 lpr0, lpr1;
> >>>-	u32 saved_lpr0, saved_lpr1;
> >>>+	u32 lpr0, lpr1 = 0;
> >>>+	u32 saved_lpr0, saved_lpr1 = 0;
> >>>
> >>>-	saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR);
> >>>-	lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB;
> >>>-	lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
> >>>+	if (at91_ramc_base[1]) {
> >>>+		saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR);
> >>>+		lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB;
> >>>+		lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
> >>>+	}
> >>>
> >>>  	saved_lpr0 = at91_ramc_read(0, AT91_SDRAMC_LPR);
> >>>  	lpr0 = saved_lpr0 & ~AT91_SDRAMC_LPCB;
> >>>@@ -92,27 +98,14 @@ static inline void at91sam9263_standby(void)
> >>>
> >>>  	/* self-refresh mode now */
> >>>  	at91_ramc_write(0, AT91_SDRAMC_LPR, lpr0);
> >>>-	at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1);
> >>>+	if (at91_ramc_base[1])
> >>>+		at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1);
> >>>
> >>>  	cpu_do_idle();
> >>>
> >>>  	at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr0);
> >>>-	at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
> >>>-}
> >>>-
> >>>-static inline void at91sam9_standby(void)
> >>>-{
> >>>-	u32 saved_lpr, lpr;
> >>>-
> >>>-	saved_lpr = at91_ramc_read(0, AT91_SDRAMC_LPR);
> >>>-
> >>>-	lpr = saved_lpr & ~AT91_SDRAMC_LPCB;
> >>>-	at91_ramc_write(0, AT91_SDRAMC_LPR, lpr |
> >>>-			AT91_SDRAMC_LPCB_SELF_REFRESH);
> >>>-
> >>>-	cpu_do_idle();
> >>>-
> >>>-	at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr);
> >>>+	if (at91_ramc_base[1])
> >>>+		at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
> >>>  }
> >>>
> >>>  #endif
> >>>
> >>
> >>
> >>--
> >>  <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs
> >>
> >>Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
> >><http://twitter.com/#!/linaroorg> Twitter |
> >><http://www.linaro.org/linaro-blog/> Blog
> >>
> >>
> >>_______________________________________________
> >>linux-arm-kernel mailing list
> >>linux-arm-kernel at lists.infradead.org
> >>http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> 
> 
> -- 
>  <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs
> 
> Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
> <http://twitter.com/#!/linaroorg> Twitter |
> <http://www.linaro.org/linaro-blog/> Blog
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH V4 1/2] ARM: at91: cpuidle: convert to platform driver
  2013-10-15  9:41 [PATCH V4 1/2] ARM: at91: cpuidle: convert to platform driver Daniel Lezcano
  2013-10-15  9:41 ` [PATCH V4 2/2] ARM: at91: cpuidle: Move driver to drivers/cpuidle Daniel Lezcano
  2013-10-16 14:24 ` [PATCH 1/2] ARM: AT91: pm: factorize standby function Jean-Christophe PLAGNIOL-VILLARD
@ 2013-10-16 16:25 ` Nicolas Ferre
  2 siblings, 0 replies; 9+ messages in thread
From: Nicolas Ferre @ 2013-10-16 16:25 UTC (permalink / raw)
  To: linux-arm-kernel

On 15/10/2013 11:41, Daniel Lezcano :
> Using the platform driver model is a good way to separate the cpuidle specific
> code from the low level pm code. It allows to remove the dependency between
> these two components.
>
> The platform_device is located in the pm code and a 'set' function has been
> added to set the standby function from the AT91_SOC_START initialization
> function. Each SoC with a cpuidle driver will set the standby function in the
> platform_data field at init time. Then pm code will register the cpuidle
> platform device.
>
> The cpuidle driver will register the platform_driver and use the device's
> platform_data as a standby callback in the idle path.
>
> The at91_pm_enter function contains a { if then else } based on cpu_is_xx
> similar to what was in cpuidle. This is considered dangerous when adding a new
> SoC. Like the cpuidle driver, a standby ops is defined and assigned when the
> SoC init function specifies what is its standby function and reused in the
> at91_pm_enter's 'case' block.
>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>

Daniel,

You can add my :

Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>

To your 2 patches and the additional 2 by Jean-Christophe. As said by 
Jean-Christophe, it can be easier for us if you take the whole series 
through your git tree.

Thanks a lot to both of you.

Bye,

> ---
>   arch/arm/mach-at91/at91rm9200.c  |    3 +++
>   arch/arm/mach-at91/at91sam9260.c |    3 +++
>   arch/arm/mach-at91/at91sam9261.c |    3 +++
>   arch/arm/mach-at91/at91sam9263.c |    3 +++
>   arch/arm/mach-at91/at91sam9g45.c |    3 +++
>   arch/arm/mach-at91/at91sam9rl.c  |    3 +++
>   arch/arm/mach-at91/cpuidle.c     |   29 +++++++++++++++--------------
>   arch/arm/mach-at91/pm.c          |   27 +++++++++++++++++++--------
>   arch/arm/mach-at91/pm.h          |    4 ++++
>   9 files changed, 56 insertions(+), 22 deletions(-)
>
> 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..ffe9ce7 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
> @@ -351,6 +352,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..8c81c89 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
> @@ -330,6 +331,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..8460f52 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
> @@ -379,6 +380,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/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c
> index d4ec0d9..c7986e4 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
> @@ -296,6 +297,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/cpuidle.c b/arch/arm/mach-at91/cpuidle.c
> index 4ec6a6d..a077437 100644
> --- a/arch/arm/mach-at91/cpuidle.c
> +++ b/arch/arm/mach-at91/cpuidle.c
> @@ -21,26 +21,17 @@
>   #include <linux/export.h>
>   #include <asm/proc-fns.h>
>   #include <asm/cpuidle.h>
> -#include <mach/cpu.h>
> -
> -#include "pm.h"
>
>   #define AT91_MAX_STATES	2
>
> +static void (*at91_standby)(void);
> +
>   /* Actual code that puts the SoC in different idle states */
>   static int at91_enter_idle(struct cpuidle_device *dev,
>   			struct cpuidle_driver *drv,
>   			       int index)
>   {
> -	if (cpu_is_at91rm9200())
> -		at91rm9200_standby();
> -	else if (cpu_is_at91sam9g45())
> -		at91sam9g45_standby();
> -	else if (cpu_is_at91sam9263())
> -		at91sam9263_standby();
> -	else
> -		at91sam9_standby();
> -
> +	at91_standby();
>   	return index;
>   }
>
> @@ -60,9 +51,19 @@ static struct cpuidle_driver at91_idle_driver = {
>   };
>
>   /* Initialize CPU idle by registering the idle states */
> -static int __init at91_init_cpuidle(void)
> +static int at91_cpuidle_probe(struct platform_device *dev)
>   {
> +	at91_standby = (void *)(dev->dev.platform_data);
> +	
>   	return cpuidle_register(&at91_idle_driver, NULL);
>   }
>
> -device_initcall(at91_init_cpuidle);
> +static struct platform_driver at91_cpuidle_driver = {
> +	.driver = {
> +		.name = "cpuidle-at91",
> +		.owner = THIS_MODULE,
> +	},
> +	.probe = at91_cpuidle_probe,
> +};
> +
> +module_platform_driver(at91_cpuidle_driver);
> diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c
> index 15afb5d..9986542 100644
> --- a/arch/arm/mach-at91/pm.c
> +++ b/arch/arm/mach-at91/pm.c
> @@ -39,6 +39,8 @@
>   #include "at91_rstc.h"
>   #include "at91_shdwc.h"
>
> +static void (*at91_pm_standby)(void);
> +
>   static void __init show_reset_status(void)
>   {
>   	static char reset[] __initdata = "reset";
> @@ -266,14 +268,8 @@ static int at91_pm_enter(suspend_state_t state)
>   			 * For ARM 926 based chips, this requirement is weaker
>   			 * as at91sam9 can access a RAM in self-refresh mode.
>   			 */
> -			if (cpu_is_at91rm9200())
> -				at91rm9200_standby();
> -			else if (cpu_is_at91sam9g45())
> -				at91sam9g45_standby();
> -			else if (cpu_is_at91sam9263())
> -				at91sam9263_standby();
> -			else
> -				at91sam9_standby();
> +			if (at91_pm_standby)
> +				at91_pm_standby();
>   			break;
>
>   		case PM_SUSPEND_ON:
> @@ -314,6 +310,18 @@ static const struct platform_suspend_ops at91_pm_ops = {
>   	.end	= at91_pm_end,
>   };
>
> +static struct platform_device at91_cpuidle_device = {
> +	.name = "cpuidle-at91",
> +};
> +
> +void at91_pm_set_standby(void (*at91_standby)(void))
> +{
> +	if (at91_standby) {
> +		at91_cpuidle_device.dev.platform_data = at91_standby;
> +		at91_pm_standby = at91_standby;
> +	}
> +}
> +
>   static int __init at91_pm_init(void)
>   {
>   #ifdef CONFIG_AT91_SLOW_CLOCK
> @@ -325,6 +333,9 @@ static int __init at91_pm_init(void)
>   	/* AT91RM9200 SDRAM low-power mode cannot be used with self-refresh. */
>   	if (cpu_is_at91rm9200())
>   		at91_ramc_write(0, AT91RM9200_SDRAMC_LPR, 0);
> +	
> +	if (at91_cpuidle_device.dev.platform_data)
> +		platform_device_register(&at91_cpuidle_device);
>
>   	suspend_set_ops(&at91_pm_ops);
>
> 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.
>


-- 
Nicolas Ferre

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2013-10-16 16:25 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-15  9:41 [PATCH V4 1/2] ARM: at91: cpuidle: convert to platform driver Daniel Lezcano
2013-10-15  9:41 ` [PATCH V4 2/2] ARM: at91: cpuidle: Move driver to drivers/cpuidle Daniel Lezcano
2013-10-16 14:24 ` [PATCH 1/2] ARM: AT91: pm: factorize standby function Jean-Christophe PLAGNIOL-VILLARD
2013-10-16 14:24   ` [PATCH 2/2] ARM: AT91: DT: pm: select ram controller standby based on DT Jean-Christophe PLAGNIOL-VILLARD
2013-10-16 15:04   ` [PATCH 1/2] ARM: AT91: pm: factorize standby function Daniel Lezcano
2013-10-16 15:48     ` Jean-Christophe PLAGNIOL-VILLARD
2013-10-16 16:04       ` Daniel Lezcano
2013-10-16 16:07         ` Jean-Christophe PLAGNIOL-VILLARD
2013-10-16 16:25 ` [PATCH V4 1/2] ARM: at91: cpuidle: convert to platform driver Nicolas Ferre

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).