PM: runtime: Allow to call __pm_runtime_set_status() from atomic context
The only two users of __pm_runtime_set_status() are pm_runtime_set_active() and pm_runtime_set_suspended(). These are widely used and should be called from non-atomic context to work as expected. However, it would be convenient to allow them be called from atomic context too, as shown from a subsequent change, so let's add support for this. Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Tested-by: Maulik Shah <quic_mkshah@quicinc.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
e5a3b0c5b6
commit
13966517d4
@ -1210,12 +1210,13 @@ int __pm_runtime_set_status(struct device *dev, unsigned int status)
|
|||||||
{
|
{
|
||||||
struct device *parent = dev->parent;
|
struct device *parent = dev->parent;
|
||||||
bool notify_parent = false;
|
bool notify_parent = false;
|
||||||
|
unsigned long flags;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
if (status != RPM_ACTIVE && status != RPM_SUSPENDED)
|
if (status != RPM_ACTIVE && status != RPM_SUSPENDED)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
spin_lock_irq(&dev->power.lock);
|
spin_lock_irqsave(&dev->power.lock, flags);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prevent PM-runtime from being enabled for the device or return an
|
* Prevent PM-runtime from being enabled for the device or return an
|
||||||
@ -1226,7 +1227,7 @@ int __pm_runtime_set_status(struct device *dev, unsigned int status)
|
|||||||
else
|
else
|
||||||
error = -EAGAIN;
|
error = -EAGAIN;
|
||||||
|
|
||||||
spin_unlock_irq(&dev->power.lock);
|
spin_unlock_irqrestore(&dev->power.lock, flags);
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
@ -1247,7 +1248,7 @@ int __pm_runtime_set_status(struct device *dev, unsigned int status)
|
|||||||
device_links_read_unlock(idx);
|
device_links_read_unlock(idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irq(&dev->power.lock);
|
spin_lock_irqsave(&dev->power.lock, flags);
|
||||||
|
|
||||||
if (dev->power.runtime_status == status || !parent)
|
if (dev->power.runtime_status == status || !parent)
|
||||||
goto out_set;
|
goto out_set;
|
||||||
@ -1288,7 +1289,7 @@ int __pm_runtime_set_status(struct device *dev, unsigned int status)
|
|||||||
dev->power.runtime_error = 0;
|
dev->power.runtime_error = 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
spin_unlock_irq(&dev->power.lock);
|
spin_unlock_irqrestore(&dev->power.lock, flags);
|
||||||
|
|
||||||
if (notify_parent)
|
if (notify_parent)
|
||||||
pm_request_idle(parent);
|
pm_request_idle(parent);
|
||||||
|
Loading…
Reference in New Issue
Block a user