Merge tag 'iwlwifi-next-for-kalle-2016-03-30' of https://git.kernel.org/pub/scm/linux...
[cascardo/linux.git] / drivers / watchdog / s3c2410_wdt.c
index 0093450..59e9576 100644 (file)
@@ -47,6 +47,8 @@
 #define S3C2410_WTDAT          0x04
 #define S3C2410_WTCNT          0x08
 
+#define S3C2410_WTCNT_MAXCNT   0xffff
+
 #define S3C2410_WTCON_RSTEN    (1 << 0)
 #define S3C2410_WTCON_INTEN    (1 << 2)
 #define S3C2410_WTCON_ENABLE   (1 << 5)
 #define S3C2410_WTCON_DIV64    (2 << 3)
 #define S3C2410_WTCON_DIV128   (3 << 3)
 
+#define S3C2410_WTCON_MAXDIV   0x80
+
 #define S3C2410_WTCON_PRESCALE(x)      ((x) << 8)
 #define S3C2410_WTCON_PRESCALE_MASK    (0xff << 8)
+#define S3C2410_WTCON_PRESCALE_MAX     0xff
 
 #define CONFIG_S3C2410_WATCHDOG_ATBOOT         (0)
 #define CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME   (15)
@@ -198,6 +203,14 @@ do {                                                       \
 
 /* functions */
 
+static inline unsigned int s3c2410wdt_max_timeout(struct clk *clock)
+{
+       unsigned long freq = clk_get_rate(clock);
+
+       return S3C2410_WTCNT_MAXCNT / (freq / (S3C2410_WTCON_PRESCALE_MAX + 1)
+                                      / S3C2410_WTCON_MAXDIV);
+}
+
 static inline struct s3c2410_wdt *freq_to_wdt(struct notifier_block *nb)
 {
        return container_of(nb, struct s3c2410_wdt, freq_transition);
@@ -349,7 +362,8 @@ static int s3c2410wdt_set_heartbeat(struct watchdog_device *wdd, unsigned timeou
        return 0;
 }
 
-static int s3c2410wdt_restart(struct watchdog_device *wdd)
+static int s3c2410wdt_restart(struct watchdog_device *wdd, unsigned long action,
+                             void *data)
 {
        struct s3c2410_wdt *wdt = watchdog_get_drvdata(wdd);
        void __iomem *wdt_base = wdt->reg_base;
@@ -567,6 +581,9 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
                return ret;
        }
 
+       wdt->wdt_device.min_timeout = 1;
+       wdt->wdt_device.max_timeout = s3c2410wdt_max_timeout(wdt->clock);
+
        ret = s3c2410wdt_cpufreq_register(wdt);
        if (ret < 0) {
                dev_err(dev, "failed to register cpufreq\n");