pm: device: rework pm_device_children_action_run

Rework the implementation of `pm_device_children_action_run` to use the
common `device_supported_foreach` iterator.

Signed-off-by: Jordan Yates <jordan.yates@data61.csiro.au>
This commit is contained in:
Jordan Yates 2023-01-22 12:23:09 +10:00 committed by Fabio Baltieri
commit fb1ee429a2

View file

@ -174,38 +174,36 @@ int pm_device_power_domain_add(const struct device *dev,
return power_domain_add_or_remove(dev, domain, true);
}
struct pm_visitor_context {
pm_device_action_failed_cb_t failure_cb;
enum pm_device_action action;
};
static int pm_device_children_visitor(const struct device *dev, void *context)
{
struct pm_visitor_context *visitor_context = context;
int rc;
rc = pm_device_action_run(dev, visitor_context->action);
if ((visitor_context->failure_cb != NULL) && (rc < 0)) {
/* Stop the iteration if the callback requests it */
if (!visitor_context->failure_cb(dev, rc)) {
return rc;
}
}
return 0;
}
void pm_device_children_action_run(const struct device *dev,
enum pm_device_action action,
pm_device_action_failed_cb_t failure_cb)
{
const device_handle_t *handles;
size_t handle_count = 0U;
int rc = 0;
struct pm_visitor_context visitor_context = {
.failure_cb = failure_cb,
.action = action
};
/*
* We don't use device_supported_foreach here because we don't want the
* early exit behaviour of that function. Even if the N'th device fails
* to PM_DEVICE_ACTION_TURN_ON for example, we still want to run the
* action on the N+1'th device.
*/
handles = device_supported_handles_get(dev, &handle_count);
for (size_t i = 0U; i < handle_count; ++i) {
device_handle_t dh = handles[i];
const struct device *cdev = device_from_handle(dh);
if (cdev == NULL) {
continue;
}
rc = pm_device_action_run(cdev, action);
if ((failure_cb != NULL) && (rc < 0)) {
/* Stop the iteration if the callback requests it */
if (!failure_cb(cdev, rc)) {
break;
}
}
}
(void)device_supported_foreach(dev, pm_device_children_visitor, &visitor_context);
}
int pm_device_state_get(const struct device *dev,