Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 632e270e authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

PM / Runtime: Return special error code if runtime PM is disabled



Some callers of pm_runtime_get_sync() and other runtime PM helper
functions, scsi_autopm_get_host() and scsi_autopm_get_device() in
particular, need to distinguish error codes returned when runtime PM
is disabled (i.e. power.disable_depth is nonzero for the given
device) from error codes returned in other situations.  For this
reason, make the runtime PM helper functions return -EACCES when
power.disable_depth is nonzero and ensure that this error code
won't be returned by them in any other circumstances.  Modify
scsi_autopm_get_host() and scsi_autopm_get_device() to check the
error code returned by pm_runtime_get_sync() and ignore -EACCES.

Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
parent 455716e9
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -291,7 +291,8 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h:
    - execute the subsystem-level suspend callback for the device; returns 0 on
      success, 1 if the device's run-time PM status was already 'suspended', or
      error code on failure, where -EAGAIN or -EBUSY means it is safe to attempt
      to suspend the device again in future
      to suspend the device again in future and -EACCES means that
      'power.disable_depth' is different from 0

  int pm_runtime_autosuspend(struct device *dev);
    - same as pm_runtime_suspend() except that the autosuspend delay is taken
@@ -304,7 +305,8 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h:
      success, 1 if the device's run-time PM status was already 'active' or
      error code on failure, where -EAGAIN means it may be safe to attempt to
      resume the device again in future, but 'power.runtime_error' should be
      checked additionally
      checked additionally, and -EACCES means that 'power.disable_depth' is
      different from 0

  int pm_request_idle(struct device *dev);
    - submit a request to execute the subsystem-level idle callback for the
+5 −4
Original line number Diff line number Diff line
@@ -135,8 +135,9 @@ static int rpm_check_suspend_allowed(struct device *dev)

	if (dev->power.runtime_error)
		retval = -EINVAL;
	else if (atomic_read(&dev->power.usage_count) > 0
	    || dev->power.disable_depth > 0)
	else if (dev->power.disable_depth > 0)
		retval = -EACCES;
	else if (atomic_read(&dev->power.usage_count) > 0)
		retval = -EAGAIN;
	else if (!pm_children_suspended(dev))
		retval = -EBUSY;
@@ -262,7 +263,7 @@ static int rpm_callback(int (*cb)(struct device *), struct device *dev)
		spin_lock_irq(&dev->power.lock);
	}
	dev->power.runtime_error = retval;
	return retval;
	return retval != -EACCES ? retval : -EIO;
}

/**
@@ -458,7 +459,7 @@ static int rpm_resume(struct device *dev, int rpmflags)
	if (dev->power.runtime_error)
		retval = -EINVAL;
	else if (dev->power.disable_depth > 0)
		retval = -EAGAIN;
		retval = -EACCES;
	if (retval)
		goto out;

+4 −4
Original line number Diff line number Diff line
@@ -144,9 +144,9 @@ int scsi_autopm_get_device(struct scsi_device *sdev)
	int	err;

	err = pm_runtime_get_sync(&sdev->sdev_gendev);
	if (err < 0)
	if (err < 0 && err !=-EACCES)
		pm_runtime_put_sync(&sdev->sdev_gendev);
	else if (err > 0)
	else
		err = 0;
	return err;
}
@@ -173,9 +173,9 @@ int scsi_autopm_get_host(struct Scsi_Host *shost)
	int	err;

	err = pm_runtime_get_sync(&shost->shost_gendev);
	if (err < 0)
	if (err < 0 && err !=-EACCES)
		pm_runtime_put_sync(&shost->shost_gendev);
	else if (err > 0)
	else
		err = 0;
	return err;
}