* [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).