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:
parent
34251808ac
commit
fb1ee429a2
1 changed files with 25 additions and 27 deletions
|
@ -174,38 +174,36 @@ int pm_device_power_domain_add(const struct device *dev,
|
||||||
return power_domain_add_or_remove(dev, domain, true);
|
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,
|
void pm_device_children_action_run(const struct device *dev,
|
||||||
enum pm_device_action action,
|
enum pm_device_action action,
|
||||||
pm_device_action_failed_cb_t failure_cb)
|
pm_device_action_failed_cb_t failure_cb)
|
||||||
{
|
{
|
||||||
const device_handle_t *handles;
|
struct pm_visitor_context visitor_context = {
|
||||||
size_t handle_count = 0U;
|
.failure_cb = failure_cb,
|
||||||
int rc = 0;
|
.action = action
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
(void)device_supported_foreach(dev, pm_device_children_visitor, &visitor_context);
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int pm_device_state_get(const struct device *dev,
|
int pm_device_state_get(const struct device *dev,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue