watchdog: mei_wdt: re-register device on event
authorTomas Winkler <tomas.winkler@intel.com>
Sun, 7 Feb 2016 20:46:50 +0000 (22:46 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 7 Feb 2016 21:00:52 +0000 (13:00 -0800)
For Intel SKL platform the ME device can inform the host via
asynchronous notification that the watchdog feature was activated
on the device. The activation doesn't require reboot.
In that case the driver registers the watchdog device with the kernel.

Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/watchdog/mei_wdt.c

index b93474ec34a1932c86e558b5767f0c2913161375..630bd189f16788fac980690b745bede9a02e85ff 100644 (file)
@@ -481,6 +481,21 @@ out:
                complete(&wdt->response);
 }
 
+/*
+ * mei_wdt_notify_event - callback for event notification
+ *
+ * @cldev: bus device
+ */
+static void mei_wdt_notify_event(struct mei_cl_device *cldev)
+{
+       struct mei_wdt *wdt = mei_cldev_get_drvdata(cldev);
+
+       if (wdt->state != MEI_WDT_NOT_REQUIRED)
+               return;
+
+       mei_wdt_register(wdt);
+}
+
 /**
  * mei_wdt_event - callback for event receive
  *
@@ -493,6 +508,9 @@ static void mei_wdt_event(struct mei_cl_device *cldev,
 {
        if (events & BIT(MEI_CL_EVENT_RX))
                mei_wdt_event_rx(cldev);
+
+       if (events & BIT(MEI_CL_EVENT_NOTIF))
+               mei_wdt_notify_event(cldev);
 }
 
 #if IS_ENABLED(CONFIG_DEBUG_FS)
@@ -605,9 +623,15 @@ static int mei_wdt_probe(struct mei_cl_device *cldev,
                goto err_out;
        }
 
-       ret = mei_cldev_register_event_cb(wdt->cldev, BIT(MEI_CL_EVENT_RX),
+       ret = mei_cldev_register_event_cb(wdt->cldev,
+                                         BIT(MEI_CL_EVENT_RX) |
+                                         BIT(MEI_CL_EVENT_NOTIF),
                                          mei_wdt_event, NULL);
-       if (ret) {
+
+       /* on legacy devices notification is not supported
+        * this doesn't fail the registration for RX event
+        */
+       if (ret && ret != -EOPNOTSUPP) {
                dev_err(&cldev->dev, "Could not register event ret=%d\n", ret);
                goto err_disable;
        }