|
@@ -50,3 +50,26 @@ void __init scu_enable(void __iomem *scu_base)
|
|
|
*/
|
|
|
flush_cache_all();
|
|
|
}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Set the executing CPUs power mode as defined. This will be in
|
|
|
+ * preparation for it executing a WFI instruction.
|
|
|
+ *
|
|
|
+ * This function must be called with preemption disabled, and as it
|
|
|
+ * has the side effect of disabling coherency, caches must have been
|
|
|
+ * flushed. Interrupts must also have been disabled.
|
|
|
+ */
|
|
|
+int scu_power_mode(void __iomem *scu_base, unsigned int mode)
|
|
|
+{
|
|
|
+ unsigned int val;
|
|
|
+ int cpu = smp_processor_id();
|
|
|
+
|
|
|
+ if (mode > 3 || mode == 1 || cpu > 3)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ val = __raw_readb(scu_base + SCU_CPU_STATUS + cpu) & ~0x03;
|
|
|
+ val |= mode;
|
|
|
+ __raw_writeb(val, scu_base + SCU_CPU_STATUS + cpu);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|