|
@@ -15,6 +15,7 @@
|
|
|
*/
|
|
|
|
|
|
#include <linux/io.h>
|
|
|
+#include <linux/reboot.h>
|
|
|
#include <linux/mfd/syscon.h>
|
|
|
#include <linux/of_address.h>
|
|
|
#include <linux/regmap.h>
|
|
@@ -92,9 +93,17 @@ u32 zynq_slcr_get_device_id(void)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * zynq_slcr_system_reset - Reset the entire system.
|
|
|
+ * zynq_slcr_system_restart - Restart the entire system.
|
|
|
+ *
|
|
|
+ * @nb: Pointer to restart notifier block (unused)
|
|
|
+ * @action: Reboot mode (unused)
|
|
|
+ * @data: Restart handler private data (unused)
|
|
|
+ *
|
|
|
+ * Return: 0 always
|
|
|
*/
|
|
|
-void zynq_slcr_system_reset(void)
|
|
|
+static
|
|
|
+int zynq_slcr_system_restart(struct notifier_block *nb,
|
|
|
+ unsigned long action, void *data)
|
|
|
{
|
|
|
u32 reboot;
|
|
|
|
|
@@ -113,8 +122,14 @@ void zynq_slcr_system_reset(void)
|
|
|
zynq_slcr_read(&reboot, SLCR_REBOOT_STATUS_OFFSET);
|
|
|
zynq_slcr_write(reboot & 0xF0FFFFFF, SLCR_REBOOT_STATUS_OFFSET);
|
|
|
zynq_slcr_write(1, SLCR_PS_RST_CTRL_OFFSET);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
+static struct notifier_block zynq_slcr_restart_nb = {
|
|
|
+ .notifier_call = zynq_slcr_system_restart,
|
|
|
+ .priority = 192,
|
|
|
+};
|
|
|
+
|
|
|
/**
|
|
|
* zynq_slcr_cpu_start - Start cpu
|
|
|
* @cpu: cpu number
|
|
@@ -219,6 +234,8 @@ int __init zynq_early_slcr_init(void)
|
|
|
/* unlock the SLCR so that registers can be changed */
|
|
|
zynq_slcr_unlock();
|
|
|
|
|
|
+ register_restart_handler(&zynq_slcr_restart_nb);
|
|
|
+
|
|
|
pr_info("%s mapped to %p\n", np->name, zynq_slcr_base);
|
|
|
|
|
|
of_node_put(np);
|