providing kernel parameters for builtin drivers versus loadable
 modules.
 
+The watchdog core parameter watchdog.open_timeout is the maximum time,
+in seconds, for which the watchdog framework will take care of pinging
+a running hardware watchdog until userspace opens the corresponding
+/dev/watchdogN device. A value of 0 (the default) means an infinite
+timeout. Setting this to a non-zero value can be useful to ensure that
+either userspace comes up properly, or the board gets reset and allows
+fallback logic in the bootloader to try something else.
+
 
 -------------------------------------------------
 acquirewdt:
 
        struct mutex lock;
        ktime_t last_keepalive;
        ktime_t last_hw_keepalive;
+       ktime_t open_deadline;
        struct hrtimer timer;
        struct kthread_work work;
        unsigned long status;           /* Internal status bits */
 static bool handle_boot_enabled =
        IS_ENABLED(CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED);
 
+static unsigned open_timeout;
+
+static bool watchdog_past_open_deadline(struct watchdog_core_data *data)
+{
+       return ktime_after(ktime_get(), data->open_deadline);
+}
+
+static void watchdog_set_open_deadline(struct watchdog_core_data *data)
+{
+       data->open_deadline = open_timeout ?
+               ktime_get() + ktime_set(open_timeout, 0) : KTIME_MAX;
+}
+
 static inline bool watchdog_need_worker(struct watchdog_device *wdd)
 {
        /* All variables in milli-seconds */
 {
        struct watchdog_device *wdd = wd_data->wdd;
 
-       return wdd && (watchdog_active(wdd) || watchdog_hw_running(wdd));
+       if (!wdd)
+               return false;
+
+       if (watchdog_active(wdd))
+               return true;
+
+       return watchdog_hw_running(wdd) && !watchdog_past_open_deadline(wd_data);
 }
 
 static void watchdog_ping_work(struct kthread_work *work)
        if (!hw_running)
                kref_get(&wd_data->kref);
 
+       /*
+        * open_timeout only applies for the first open from
+        * userspace. Set open_deadline to infinity so that the kernel
+        * will take care of an always-running hardware watchdog in
+        * case the device gets magic-closed or WDIOS_DISABLECARD is
+        * applied.
+        */
+       wd_data->open_deadline = KTIME_MAX;
+
        /* dev/watchdog is a virtual (and thus non-seekable) filesystem */
        return stream_open(inode, file);
 
 
        /* Record time of most recent heartbeat as 'just before now'. */
        wd_data->last_hw_keepalive = ktime_sub(ktime_get(), 1);
+       watchdog_set_open_deadline(wd_data);
 
        /*
         * If the watchdog is running, prevent its driver from being unloaded,
 MODULE_PARM_DESC(handle_boot_enabled,
        "Watchdog core auto-updates boot enabled watchdogs before userspace takes over (default="
        __MODULE_STRING(IS_ENABLED(CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED)) ")");
+
+module_param(open_timeout, uint, 0644);
+MODULE_PARM_DESC(open_timeout,
+       "Maximum time (in seconds, 0 means infinity) for userspace to take over a running watchdog (default=0)");