Commit c0ef3df8 authored by Sakari Ailus's avatar Sakari Ailus Committed by Rafael J. Wysocki
Browse files

PM: runtime: Simplify pm_runtime_get_if_active() usage



There are two ways to opportunistically increment a device's runtime PM
usage count, calling either pm_runtime_get_if_active() or
pm_runtime_get_if_in_use(). The former has an argument to tell whether to
ignore the usage count or not, and the latter simply calls the former with
ign_usage_count set to false. The other users that want to ignore the
usage_count will have to explicitly set that argument to true which is a
bit cumbersome.

To make this function more practical to use, remove the ign_usage_count
argument from the function. The main implementation is in a static
function called pm_runtime_get_conditional() and implementations of
pm_runtime_get_if_active() and pm_runtime_get_if_in_use() are moved to
runtime.c.

Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: default avatarAlex Elder <elder@linaro.org>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Takashi Iwai <tiwai@suse.de> # sound/
Reviewed-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com> # drivers/accel/ivpu/
Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com> # drivers/gpu/drm/i915/
Reviewed-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com> # drivers/pci/
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 841c3516
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -396,10 +396,9 @@ drivers/base/power/runtime.c and include/linux/pm_runtime.h:
      nonzero, increment the counter and return 1; otherwise return 0 without
      changing the counter

  `int pm_runtime_get_if_active(struct device *dev, bool ign_usage_count);`
  `int pm_runtime_get_if_active(struct device *dev);`
    - return -EINVAL if 'power.disable_depth' is nonzero; otherwise, if the
      runtime PM status is RPM_ACTIVE, and either ign_usage_count is true
      or the device's usage_count is non-zero, increment the counter and
      runtime PM status is RPM_ACTIVE, increment the counter and
      return 1; otherwise return 0 without changing the counter

  `void pm_runtime_put_noidle(struct device *dev);`
+1 −1
Original line number Diff line number Diff line
@@ -304,7 +304,7 @@ int ivpu_rpm_get_if_active(struct ivpu_device *vdev)
{
	int ret;

	ret = pm_runtime_get_if_active(vdev->drm.dev, false);
	ret = pm_runtime_get_if_in_use(vdev->drm.dev);
	drm_WARN_ON(&vdev->drm, ret < 0);

	return ret;
+33 −2
Original line number Diff line number Diff line
@@ -1176,7 +1176,7 @@ int __pm_runtime_resume(struct device *dev, int rpmflags)
EXPORT_SYMBOL_GPL(__pm_runtime_resume);

/**
 * pm_runtime_get_if_active - Conditionally bump up device usage counter.
 * pm_runtime_get_conditional - Conditionally bump up device usage counter.
 * @dev: Device to handle.
 * @ign_usage_count: Whether or not to look at the current usage counter value.
 *
@@ -1197,7 +1197,7 @@ EXPORT_SYMBOL_GPL(__pm_runtime_resume);
 * The caller is responsible for decrementing the runtime PM usage counter of
 * @dev after this function has returned a positive value for it.
 */
int pm_runtime_get_if_active(struct device *dev, bool ign_usage_count)
static int pm_runtime_get_conditional(struct device *dev, bool ign_usage_count)
{
	unsigned long flags;
	int retval;
@@ -1218,8 +1218,39 @@ int pm_runtime_get_if_active(struct device *dev, bool ign_usage_count)

	return retval;
}

/**
 * pm_runtime_get_if_active - Bump up runtime PM usage counter if the device is
 *			      in active state
 * @dev: Target device.
 *
 * Increment the runtime PM usage counter of @dev if its runtime PM status is
 * %RPM_ACTIVE, in which case it returns 1. If the device is in a different
 * state, 0 is returned. -EINVAL is returned if runtime PM is disabled for the
 * device, in which case also the usage_count will remain unmodified.
 */
int pm_runtime_get_if_active(struct device *dev)
{
	return pm_runtime_get_conditional(dev, true);
}
EXPORT_SYMBOL_GPL(pm_runtime_get_if_active);

/**
 * pm_runtime_get_if_in_use - Conditionally bump up runtime PM usage counter.
 * @dev: Target device.
 *
 * Increment the runtime PM usage counter of @dev if its runtime PM status is
 * %RPM_ACTIVE and its runtime PM usage counter is greater than 0, in which case
 * it returns 1. If the device is in a different state or its usage_count is 0,
 * 0 is returned. -EINVAL is returned if runtime PM is disabled for the device,
 * in which case also the usage_count will remain unmodified.
 */
int pm_runtime_get_if_in_use(struct device *dev)
{
	return pm_runtime_get_conditional(dev, false);
}
EXPORT_SYMBOL_GPL(pm_runtime_get_if_in_use);

/**
 * __pm_runtime_set_status - Set runtime PM status of a device.
 * @dev: Device to handle.
+4 −1
Original line number Diff line number Diff line
@@ -246,7 +246,10 @@ static intel_wakeref_t __intel_runtime_pm_get_if_active(struct intel_runtime_pm
		 * function, since the power state is undefined. This applies
		 * atm to the late/early system suspend/resume handlers.
		 */
		if (pm_runtime_get_if_active(rpm->kdev, ignore_usecount) <= 0)
		if ((ignore_usecount &&
		     pm_runtime_get_if_active(rpm->kdev) <= 0) ||
		    (!ignore_usecount &&
		     pm_runtime_get_if_in_use(rpm->kdev) <= 0))
			return 0;
	}

+1 −1
Original line number Diff line number Diff line
@@ -330,7 +330,7 @@ int xe_pm_runtime_put(struct xe_device *xe)

int xe_pm_runtime_get_if_active(struct xe_device *xe)
{
	return pm_runtime_get_if_active(xe->drm.dev, true);
	return pm_runtime_get_if_active(xe->drm.dev);
}

void xe_pm_assert_unbounded_bridge(struct xe_device *xe)
Loading