|
@@ -14,7 +14,9 @@
|
|
|
#include <linux/interrupt.h>
|
|
|
#include <linux/platform_device.h>
|
|
|
#include <linux/platform_data/intel-mid_wdt.h>
|
|
|
+
|
|
|
#include <asm/intel-mid.h>
|
|
|
+#include <asm/intel_scu_ipc.h>
|
|
|
#include <asm/io_apic.h>
|
|
|
|
|
|
#define TANGIER_EXT_TIMER0_MSI 15
|
|
@@ -50,14 +52,34 @@ static struct intel_mid_wdt_pdata tangier_pdata = {
|
|
|
.probe = tangier_probe,
|
|
|
};
|
|
|
|
|
|
-static int __init register_mid_wdt(void)
|
|
|
+static int wdt_scu_status_change(struct notifier_block *nb,
|
|
|
+ unsigned long code, void *data)
|
|
|
{
|
|
|
- if (intel_mid_identify_cpu() == INTEL_MID_CPU_CHIP_TANGIER) {
|
|
|
- wdt_dev.dev.platform_data = &tangier_pdata;
|
|
|
- return platform_device_register(&wdt_dev);
|
|
|
+ if (code == SCU_DOWN) {
|
|
|
+ platform_device_unregister(&wdt_dev);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
- return -ENODEV;
|
|
|
+ return platform_device_register(&wdt_dev);
|
|
|
}
|
|
|
|
|
|
+static struct notifier_block wdt_scu_notifier = {
|
|
|
+ .notifier_call = wdt_scu_status_change,
|
|
|
+};
|
|
|
+
|
|
|
+static int __init register_mid_wdt(void)
|
|
|
+{
|
|
|
+ if (intel_mid_identify_cpu() != INTEL_MID_CPU_CHIP_TANGIER)
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
+ wdt_dev.dev.platform_data = &tangier_pdata;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We need to be sure that the SCU IPC is ready before watchdog device
|
|
|
+ * can be registered:
|
|
|
+ */
|
|
|
+ intel_scu_notifier_add(&wdt_scu_notifier);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
rootfs_initcall(register_mid_wdt);
|