sdw_modify_slave_status(slave, SDW_SLAVE_ALERT);
 
+       ret = pm_runtime_get_sync(&slave->dev);
+       if (ret < 0 && ret != -EACCES) {
+               dev_err(&slave->dev, "Failed to resume device: %d\n", ret);
+               pm_runtime_put_noidle(slave->bus->dev);
+               return ret;
+       }
+
        /* Read Instat 1, Instat 2 and Instat 3 registers */
        ret = sdw_read(slave, SDW_SCP_INT1);
        if (ret < 0) {
                dev_err(slave->bus->dev,
                        "SDW_SCP_INT1 read failed:%d\n", ret);
-               return ret;
+               goto io_err;
        }
        buf = ret;
 
        if (ret < 0) {
                dev_err(slave->bus->dev,
                        "SDW_SCP_INT2/3 read failed:%d\n", ret);
-               return ret;
+               goto io_err;
        }
 
        do {
                if (ret < 0) {
                        dev_err(slave->bus->dev,
                                "SDW_SCP_INT1 write failed:%d\n", ret);
-                       return ret;
+                       goto io_err;
                }
 
                /*
                if (ret < 0) {
                        dev_err(slave->bus->dev,
                                "SDW_SCP_INT1 read failed:%d\n", ret);
-                       return ret;
+                       goto io_err;
                }
                _buf = ret;
 
                if (ret < 0) {
                        dev_err(slave->bus->dev,
                                "SDW_SCP_INT2/3 read failed:%d\n", ret);
-                       return ret;
+                       goto io_err;
                }
 
                /* Make sure no interrupts are pending */
        if (count == SDW_READ_INTR_CLEAR_RETRY)
                dev_warn(slave->bus->dev, "Reached MAX_RETRY on alert read\n");
 
+io_err:
+       pm_runtime_mark_last_busy(&slave->dev);
+       pm_runtime_put_autosuspend(&slave->dev);
+
        return ret;
 }