[linux-yocto] [PATCH 26/26] axm56xx: restart with ddr retention
Daniel Dragomir
daniel.dragomir at windriver.com
Wed Nov 16 08:57:02 PST 2016
From: Per Hallsmark <per.hallsmark at windriver.com>
dts: correcting reset address
axxia-reset: hook in platform ddr retention on reboot
Signed-off-by: Per Hallsmark <per.hallsmark at windriver.com>
---
arch/arm64/boot/dts/intel/axm56xx.dtsi | 2 +-
drivers/power/reset/Kconfig | 11 +++++++++++
drivers/power/reset/axxia-reset.c | 22 ++++++++++++++++++++++
3 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/boot/dts/intel/axm56xx.dtsi b/arch/arm64/boot/dts/intel/axm56xx.dtsi
index 4539d02..849d1e6 100644
--- a/arch/arm64/boot/dts/intel/axm56xx.dtsi
+++ b/arch/arm64/boot/dts/intel/axm56xx.dtsi
@@ -89,7 +89,7 @@
reg = <0x80 0x02c00000 0 0x40000>;
};
- reset: reset at 2010031000 {
+ reset: reset at 8002C02008 {
compatible = "intel,axm56xx-reset";
syscon = <&syscon>;
};
diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig
index 17d93a7..a263c58 100644
--- a/drivers/power/reset/Kconfig
+++ b/drivers/power/reset/Kconfig
@@ -38,6 +38,17 @@ config POWER_RESET_AXXIA
Say Y if you have an Axxia family SoC.
+if POWER_RESET_AXXIA
+config POWER_RESET_AXXIA_DDR_RETENTION
+ bool "Keep memory content"
+ depends on POWER_RESET_AXXIA
+ help
+ Keep memory content during reset. Useful to reserve memory
+ for dumps, logs etc on fatal errors that can be analysed
+ after a reboot.
+endif
+
+
config POWER_RESET_BRCMSTB
bool "Broadcom STB reset driver"
depends on ARM || MIPS || COMPILE_TEST
diff --git a/drivers/power/reset/axxia-reset.c b/drivers/power/reset/axxia-reset.c
index a4957fc..195d7cd 100644
--- a/drivers/power/reset/axxia-reset.c
+++ b/drivers/power/reset/axxia-reset.c
@@ -25,6 +25,7 @@
#include <linux/proc_fs.h>
#include <linux/reboot.h>
#include <linux/regmap.h>
+#include <asm/system_misc.h>
#define SC_PSCRATCH 0x00dc
#define SC_CRIT_WRITE_KEY 0x2000
@@ -36,6 +37,11 @@ static struct regmap *syscon;
static int ddr_retention_enabled;
+#ifdef CONFIG_POWER_RESET_AXXIA_DDR_RETENTION
+static void (*saved_arm_pm_restart)
+ (enum reboot_mode reboot_mode, const char *cmd);
+#endif
+
void
initiate_retention_reset(void)
{
@@ -51,10 +57,21 @@ initiate_retention_reset(void)
regmap_write(syscon, SC_PSCRATCH, 1);
/* trap into secure monitor to do the reset */
+#ifdef CONFIG_POWER_RESET_AXXIA_DDR_RETENTION
+ saved_arm_pm_restart(0, NULL);
+#else
machine_restart(NULL);
+#endif
}
EXPORT_SYMBOL(initiate_retention_reset);
+#ifdef CONFIG_POWER_RESET_AXXIA_DDR_RETENTION
+static void axxia_pm_restart(enum reboot_mode reboot_mode, const char *cmd)
+{
+ initiate_retention_reset();
+}
+#endif
+
static ssize_t
axxia_ddr_retention_trigger(struct file *file, const char __user *buf,
size_t count, loff_t *ppos)
@@ -125,6 +142,11 @@ static int axxia_reset_probe(struct platform_device *pdev)
if (err)
dev_err(dev, "cannot register restart handler (err=%d)\n", err);
+#ifdef CONFIG_POWER_RESET_AXXIA_DDR_RETENTION
+ saved_arm_pm_restart = arm_pm_restart;
+ arm_pm_restart = axxia_pm_restart;
+#endif
+
return err;
}
--
2.7.4
More information about the linux-yocto
mailing list