From: Gary McGee <gary.mc...@intel.com>

Move CPU shutdown out of initiate_retention_reset() and into a new
separate function retention_reset_prepare().

Signed-off-by: Gary McGee <gary.mc...@intel.com>
---
 arch/arm/mach-axxia/ddr_retention.c |   51 ++++++++++++++++++++++-------------
 1 file changed, 33 insertions(+), 18 deletions(-)

diff --git a/arch/arm/mach-axxia/ddr_retention.c 
b/arch/arm/mach-axxia/ddr_retention.c
index 0936b30..25b0d7a 100644
--- a/arch/arm/mach-axxia/ddr_retention.c
+++ b/arch/arm/mach-axxia/ddr_retention.c
@@ -247,6 +247,37 @@ reset_elm_trace(void)
        ncr_register_write(htonl(0x000fff01), (unsigned *) (apb + 0x78000));
 }
 
+
+/*
+ * shutdown the system in preparation for a DDR retention reset.
+ * This is only needed if initiating the retention reset while the
+ * system is running in normal state (i.e. via the /proc filesystem.)
+ * If the retention reset is called from within a restart function
+ * this should not be necessary.
+ */
+void
+retention_reset_prepare(void)
+{
+       /*
+        * If the axxia device is in reset then DDR retention is not
+        * possible. Just do an emergency_restart instead.
+        */
+       if (ncr_reset_active)
+               emergency_restart();
+
+       preempt_disable();
+
+       /* send stop message to other CPUs */
+       local_irq_disable();
+       local_fiq_disable();
+       asm volatile ("dsb" : : : "memory");
+       asm volatile ("dmb" : : : "memory");
+       system_state = SYSTEM_RESTART;
+       smp_send_stop();
+       udelay(1000);
+}
+
+
 void
 initiate_retention_reset(void)
 {
@@ -273,25 +304,7 @@ initiate_retention_reset(void)
        if (NULL == nca || NULL == apb || NULL == dickens)
                BUG();
 
-       /*
-        * If the axxia device is in reset then DDR retention is not
-        * possible. Just do an emergency_restart instead.
-        */
-       if (ncr_reset_active)
-               emergency_restart();
-
        preempt_disable();
-       cpu_id = smp_processor_id();
-
-       /* send stop message to other CPUs */
-       local_irq_disable();
-       local_fiq_disable();
-       asm volatile ("dsb" : : : "memory");
-       asm volatile ("dmb" : : : "memory");
-       system_state = SYSTEM_RESTART;
-       smp_send_stop();
-       udelay(1000);
-
        flush_cache_all();
        flush_l3();
 
@@ -309,6 +322,7 @@ initiate_retention_reset(void)
        ctl_244 |= 0x000a0000;
 
        /* belts & braces: put secondary CPUs into reset */
+       cpu_id = smp_processor_id();
        value = ~(1 << cpu_id);
        value &= 0xffff;
        ncr_register_write(htonl(value), (unsigned *) (apb + 0x31030));
@@ -338,6 +352,7 @@ static ssize_t
 axxia_ddr_retention_trigger(struct file *file, const char __user *buf,
                            size_t count, loff_t *ppos)
 {
+       retention_reset_prepare();
        initiate_retention_reset();
        return 0;
 }
-- 
1.7.9.5

-- 
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to