* Intel Management Engine Interface (Intel MEI) Linux driver
*/
+#include <linux/cleanup.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/fcntl.h>
+#include <linux/pm_runtime.h>
#include <linux/poll.h>
#include <linux/init.h>
#include <linux/ioctl.h>
static ssize_t fw_status_show(struct device *device,
struct device_attribute *attr, char *buf)
{
- struct mei_device *dev = dev_get_drvdata(device);
+ struct mei_device *mdev = dev_get_drvdata(device);
struct mei_fw_status fw_status;
int err, i;
ssize_t cnt = 0;
- mutex_lock(&dev->device_lock);
- err = mei_fw_status(dev, &fw_status);
- mutex_unlock(&dev->device_lock);
+ if (mdev->read_fws_need_resume) {
+ err = pm_runtime_resume_and_get(mdev->parent);
+ if (err) {
+ dev_err(device, "read fw_status resume error = %d\n", err);
+ return err;
+ }
+ }
+ scoped_guard(mutex, &mdev->device_lock)
+ err = mei_fw_status(mdev, &fw_status);
+ if (mdev->read_fws_need_resume)
+ pm_runtime_put_autosuspend(mdev->parent);
if (err) {
dev_err(device, "read fw_status error = %d\n", err);
return err;
*
* @recvd_hw_ready : hw ready message received flag
* @pg_blocked : low power mode is not allowed
+ * @read_fws_need_resume: the FW status handler needs HW woken from sleep
*
* @wait_hw_ready : wait queue for receive HW ready message form FW
* @wait_pg : wait queue for receive PG message from FW
bool recvd_hw_ready;
bool pg_blocked;
+ bool read_fws_need_resume;
/*
* waiting queue for receive message from FW