pm: device_runtime: Fix enable / disable runtime pm
Device pm runtime should only be enabled if device supports pm. Signed-off-by: Flavio Ceolin <flavio.ceolin@intel.com>
This commit is contained in:
parent
378a19d2a8
commit
98fd9c3e65
1 changed files with 19 additions and 8 deletions
|
@ -184,14 +184,20 @@ void pm_device_enable(const struct device *dev)
|
||||||
SYS_PORT_TRACING_FUNC_ENTER(pm, device_enable, dev);
|
SYS_PORT_TRACING_FUNC_ENTER(pm, device_enable, dev);
|
||||||
if (k_is_pre_kernel()) {
|
if (k_is_pre_kernel()) {
|
||||||
dev->pm->dev = dev;
|
dev->pm->dev = dev;
|
||||||
dev->pm->enable = true;
|
if (dev->pm_control != NULL) {
|
||||||
atomic_set(&dev->pm->state, PM_DEVICE_STATE_SUSPEND);
|
dev->pm->enable = true;
|
||||||
k_work_init_delayable(&dev->pm->work, pm_work_handler);
|
atomic_set(&dev->pm->state, PM_DEVICE_STATE_SUSPEND);
|
||||||
SYS_PORT_TRACING_FUNC_EXIT(pm, device_enable, dev);
|
k_work_init_delayable(&dev->pm->work, pm_work_handler);
|
||||||
return;
|
}
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
key = k_spin_lock(&dev->pm->lock);
|
key = k_spin_lock(&dev->pm->lock);
|
||||||
|
if (dev->pm_control == NULL) {
|
||||||
|
dev->pm->enable = false;
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
dev->pm->enable = true;
|
dev->pm->enable = true;
|
||||||
|
|
||||||
/* During the driver init, device can set the
|
/* During the driver init, device can set the
|
||||||
|
@ -205,7 +211,10 @@ void pm_device_enable(const struct device *dev)
|
||||||
} else {
|
} else {
|
||||||
k_work_schedule(&dev->pm->work, K_NO_WAIT);
|
k_work_schedule(&dev->pm->work, K_NO_WAIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out_unlock:
|
||||||
k_spin_unlock(&dev->pm->lock, key);
|
k_spin_unlock(&dev->pm->lock, key);
|
||||||
|
out:
|
||||||
SYS_PORT_TRACING_FUNC_EXIT(pm, device_enable, dev);
|
SYS_PORT_TRACING_FUNC_EXIT(pm, device_enable, dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,9 +227,11 @@ void pm_device_disable(const struct device *dev)
|
||||||
"before kernel is initialized");
|
"before kernel is initialized");
|
||||||
|
|
||||||
key = k_spin_lock(&dev->pm->lock);
|
key = k_spin_lock(&dev->pm->lock);
|
||||||
dev->pm->enable = false;
|
if (dev->pm->enable) {
|
||||||
/* Bring up the device before disabling the Idle PM */
|
dev->pm->enable = false;
|
||||||
k_work_schedule(&dev->pm->work, K_NO_WAIT);
|
/* Bring up the device before disabling the Idle PM */
|
||||||
|
k_work_schedule(&dev->pm->work, K_NO_WAIT);
|
||||||
|
}
|
||||||
k_spin_unlock(&dev->pm->lock, key);
|
k_spin_unlock(&dev->pm->lock, key);
|
||||||
SYS_PORT_TRACING_FUNC_EXIT(pm, device_disable, dev);
|
SYS_PORT_TRACING_FUNC_EXIT(pm, device_disable, dev);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue