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:
Flavio Ceolin 2021-05-14 15:42:14 -07:00 committed by Anas Nashif
commit 98fd9c3e65

View file

@ -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);
} }