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:
Flavio Ceolin 2021-04-21 15:36:07 -07:00 committed by Anas Nashif
commit 6d67bb1b7d

View file

@ -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 */