watchdog: make imx2_wdt report boot status correctly
[~shefty/rdma-dev.git] / drivers / watchdog / imx2_wdt.c
index c44c3334003a11aa3a8cb53e5099c0309c77830f..d34a426ad1784b966f3a0cda7d5418e024acfc96 100644 (file)
@@ -46,6 +46,9 @@
 #define IMX2_WDT_SEQ1          0x5555          /* -> service sequence 1 */
 #define IMX2_WDT_SEQ2          0xAAAA          /* -> service sequence 2 */
 
+#define IMX2_WDT_WRSR          0x04            /* Reset Status Register */
+#define IMX2_WDT_WRSR_TOUT     (1 << 1)        /* -> Reset due to Timeout */
+
 #define IMX2_WDT_MAX_TIME      128
 #define IMX2_WDT_DEFAULT_TIME  60              /* in seconds */
 
@@ -175,6 +178,7 @@ static long imx2_wdt_ioctl(struct file *file, unsigned int cmd,
        void __user *argp = (void __user *)arg;
        int __user *p = argp;
        int new_value;
+       u16 val;
 
        switch (cmd) {
        case WDIOC_GETSUPPORT:
@@ -182,9 +186,13 @@ static long imx2_wdt_ioctl(struct file *file, unsigned int cmd,
                        sizeof(struct watchdog_info)) ? -EFAULT : 0;
 
        case WDIOC_GETSTATUS:
-       case WDIOC_GETBOOTSTATUS:
                return put_user(0, p);
 
+       case WDIOC_GETBOOTSTATUS:
+               val = __raw_readw(imx2_wdt.base + IMX2_WDT_WRSR);
+               new_value = val & IMX2_WDT_WRSR_TOUT ? WDIOF_CARDRESET : 0;
+               return put_user(new_value, p);
+
        case WDIOC_KEEPALIVE:
                imx2_wdt_ping();
                return 0;