power: device_pm: Check if is running in pre-kernel
Don't use kernel services before in pre-kernel state. Signed-off-by: Flavio Ceolin <flavio.ceolin@intel.com>
This commit is contained in:
parent
7eba310220
commit
6d67bb1b7d
1 changed files with 21 additions and 0 deletions
|
@ -111,6 +111,16 @@ static int pm_device_request(const struct device *dev,
|
|||
}
|
||||
}
|
||||
|
||||
if (k_is_pre_kernel()) {
|
||||
/* If we are being called before the kernel was initialized
|
||||
* we can assume that the system took care of initialized
|
||||
* devices properly. It means that all dependencies were
|
||||
* satisfied and this call just incremented the reference count
|
||||
* for this device.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
k_work_submit(&dev->pm->work);
|
||||
|
||||
/* Return in case of Async request */
|
||||
|
@ -156,6 +166,14 @@ int pm_device_put_sync(const struct device *dev)
|
|||
|
||||
void pm_device_enable(const struct device *dev)
|
||||
{
|
||||
if (k_is_pre_kernel()) {
|
||||
dev->pm->dev = dev;
|
||||
dev->pm->enable = true;
|
||||
atomic_set(&dev->pm->fsm_state, PM_DEVICE_STATE_SUSPENDED);
|
||||
k_work_init(&dev->pm->work, pm_work_handler);
|
||||
return;
|
||||
}
|
||||
|
||||
k_sem_take(&dev->pm->lock, K_FOREVER);
|
||||
dev->pm->enable = true;
|
||||
|
||||
|
@ -176,6 +194,9 @@ void pm_device_enable(const struct device *dev)
|
|||
|
||||
void pm_device_disable(const struct device *dev)
|
||||
{
|
||||
__ASSERT(k_is_pre_kernel() == false, "Device should not be disabled "
|
||||
"before kernel is initialized");
|
||||
|
||||
k_sem_take(&dev->pm->lock, K_FOREVER);
|
||||
dev->pm->enable = false;
|
||||
/* Bring up the device before disabling the Idle PM */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue