|
@@ -129,6 +129,21 @@ static int pnx4008_wdt_set_timeout(struct watchdog_device *wdd,
|
|
|
static int pnx4008_restart_handler(struct watchdog_device *wdd,
|
|
|
unsigned long mode, void *cmd)
|
|
|
{
|
|
|
+ const char *boot_cmd = cmd;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Verify if a "cmd" passed from the userspace program rebooting
|
|
|
+ * the system; if available, handle it.
|
|
|
+ * - For details, see the 'reboot' syscall in kernel/reboot.c
|
|
|
+ * - If the received "cmd" is not supported, use the default mode.
|
|
|
+ */
|
|
|
+ if (boot_cmd) {
|
|
|
+ if (boot_cmd[0] == 'h')
|
|
|
+ mode = REBOOT_HARD;
|
|
|
+ else if (boot_cmd[0] == 's')
|
|
|
+ mode = REBOOT_SOFT;
|
|
|
+ }
|
|
|
+
|
|
|
if (mode == REBOOT_SOFT) {
|
|
|
/* Force match output active */
|
|
|
writel(EXT_MATCH0, WDTIM_EMR(wdt_base));
|