提交 3a20a5c3 编写于 作者: T Tomas Winkler 提交者: Greg Kroah-Hartman

watchdog: mei_wdt: re-register device on event

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: NGuenter Roeck <linux@roeck-us.net>
Signed-off-by: NTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: NAlexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 ad1cd720
...@@ -481,6 +481,21 @@ static void mei_wdt_event_rx(struct mei_cl_device *cldev) ...@@ -481,6 +481,21 @@ static void mei_wdt_event_rx(struct mei_cl_device *cldev)
complete(&wdt->response); 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 * mei_wdt_event - callback for event receive
* *
...@@ -493,6 +508,9 @@ static void mei_wdt_event(struct mei_cl_device *cldev, ...@@ -493,6 +508,9 @@ static void mei_wdt_event(struct mei_cl_device *cldev,
{ {
if (events & BIT(MEI_CL_EVENT_RX)) if (events & BIT(MEI_CL_EVENT_RX))
mei_wdt_event_rx(cldev); mei_wdt_event_rx(cldev);
if (events & BIT(MEI_CL_EVENT_NOTIF))
mei_wdt_notify_event(cldev);
} }
#if IS_ENABLED(CONFIG_DEBUG_FS) #if IS_ENABLED(CONFIG_DEBUG_FS)
...@@ -605,9 +623,15 @@ static int mei_wdt_probe(struct mei_cl_device *cldev, ...@@ -605,9 +623,15 @@ static int mei_wdt_probe(struct mei_cl_device *cldev,
goto err_out; 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); 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); dev_err(&cldev->dev, "Could not register event ret=%d\n", ret);
goto err_disable; goto err_disable;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册