From 1933f9648da2d45f8af690e920f522ac5fac61c2 Mon Sep 17 00:00:00 2001 From: buxiasen Date: Fri, 31 May 2024 17:18:53 +0800 Subject: [PATCH] pm: remove pm global, make per domain isolated After change, when CONFIG_PM_NDOMAINS > 1, the pm_register will not able to get notificaion from not PM_IDLE_DOMAIN. Should use pm_domain_register as a replacement. Isolate domains from global callbacks can decrease not necessary execution, and reduce the lock instruction requirements. Signed-off-by: buxiasen --- drivers/power/pm/activity_governor.c | 6 ++-- drivers/power/pm/greedy_governor.c | 2 +- drivers/power/pm/pm.h | 30 +++++-------------- drivers/power/pm/pm_activity.c | 16 +++++----- drivers/power/pm/pm_autoupdate.c | 4 +-- drivers/power/pm/pm_changestate.c | 42 +++++++++++++++------------ drivers/power/pm/pm_checkstate.c | 4 +-- drivers/power/pm/pm_governor.c | 12 ++++---- drivers/power/pm/pm_initialize.c | 15 ++-------- drivers/power/pm/pm_lock.c | 4 +-- drivers/power/pm/pm_procfs.c | 15 +++++----- drivers/power/pm/pm_register.c | 28 +++++++----------- drivers/power/pm/pm_unregister.c | 19 ++++++------ drivers/power/pm/stability_governor.c | 2 +- include/nuttx/power/pm.h | 20 ++++++++----- 15 files changed, 100 insertions(+), 119 deletions(-) diff --git a/drivers/power/pm/activity_governor.c b/drivers/power/pm/activity_governor.c index c3fbf0cb4d..a2a7460a79 100644 --- a/drivers/power/pm/activity_governor.c +++ b/drivers/power/pm/activity_governor.c @@ -317,7 +317,7 @@ static void governor_update(int domain, int16_t accum) DEBUGASSERT(domain >= 0 && domain < CONFIG_PM_NDOMAINS); pdomstate = &g_pm_activity_governor.domain_states[domain]; - state = g_pmglobals.domain[domain].state; + state = g_pmdomains[domain].state; #if CONFIG_PM_GOVERNOR_MEMORY > 1 /* We won't bother to do anything until we have accumulated @@ -469,7 +469,7 @@ static enum pm_state_e governor_checkstate(int domain) /* Get a convenience pointer to minimize all of the indexing */ pdomstate = &g_pm_activity_governor.domain_states[domain]; - pdom = &g_pmglobals.domain[domain]; + pdom = &g_pmdomains[domain]; /* Check for the end of the current time slice. This must be performed * with interrupts disabled so that it does not conflict with the similar @@ -563,7 +563,7 @@ static void governor_timer(int domain, enum pm_state_e newstate) TIME_SLICE_TICKS * CONFIG_PM_GOVERNOR_SLEEPENTER_COUNT }; - pdom = &g_pmglobals.domain[domain]; + pdom = &g_pmdomains[domain]; pdomstate = &g_pm_activity_governor.domain_states[domain]; if (newstate < PM_SLEEP && dq_empty(&pdom->wakelock[newstate])) diff --git a/drivers/power/pm/greedy_governor.c b/drivers/power/pm/greedy_governor.c index 621c0cb476..23850502c9 100644 --- a/drivers/power/pm/greedy_governor.c +++ b/drivers/power/pm/greedy_governor.c @@ -94,7 +94,7 @@ static enum pm_state_e greedy_governor_checkstate(int domain) irqstate_t flags; int state; - pdom = &g_pmglobals.domain[domain]; + pdom = &g_pmdomains[domain]; state = PM_NORMAL; /* We disable interrupts since pm_stay()/pm_relax() could be simultaneously diff --git a/drivers/power/pm/pm.h b/drivers/power/pm/pm.h index b934e653b1..bccef012cf 100644 --- a/drivers/power/pm/pm.h +++ b/drivers/power/pm/pm.h @@ -53,6 +53,12 @@ struct pm_domain_s uint8_t state; + /* Registry is a doubly-linked list of registered power management + * callback structures. + */ + + dq_queue_t registry; + /* The power state lock count */ struct dq_queue_s wakelock[PM_COUNT]; @@ -87,28 +93,6 @@ struct pm_domain_s rmutex_t lock; }; -/* This structure encapsulates all of the global data used by the PM system */ - -struct pm_global_s -{ - /* This rmutex manages mutually exclusive access to the power management - * registry. It must be initialized to the value 1. - */ - - rmutex_t reglock; - - /* registry is a doubly-linked list of registered power management - * callback structures. To ensure mutually exclusive access, this list - * must be locked by calling pm_lock() before it is accessed. - */ - - dq_queue_t registry; - - /* The state information for each PM domain */ - - struct pm_domain_s domain[CONFIG_PM_NDOMAINS]; -}; - /**************************************************************************** * Public Data ****************************************************************************/ @@ -124,7 +108,7 @@ extern "C" /* All PM global data: */ -EXTERN struct pm_global_s g_pmglobals; +EXTERN struct pm_domain_s g_pmdomains[CONFIG_PM_NDOMAINS]; /**************************************************************************** * Public Function Prototypes diff --git a/drivers/power/pm/pm_activity.c b/drivers/power/pm/pm_activity.c index 2c51bd05b9..96062be7df 100644 --- a/drivers/power/pm/pm_activity.c +++ b/drivers/power/pm/pm_activity.c @@ -54,14 +54,14 @@ static void pm_waklock_cb(wdparm_t arg) #ifdef CONFIG_PM_PROCFS static void pm_wakelock_stats_rm(FAR struct pm_wakelock_s *wakelock) { - FAR struct pm_domain_s *pdom = &g_pmglobals.domain[wakelock->domain]; + FAR struct pm_domain_s *pdom = &g_pmdomains[wakelock->domain]; dq_rem(&wakelock->fsnode, &pdom->wakelockall); } static void pm_wakelock_stats(FAR struct pm_wakelock_s *wakelock, bool stay) { - FAR struct pm_domain_s *pdom = &g_pmglobals.domain[wakelock->domain]; + FAR struct pm_domain_s *pdom = &g_pmdomains[wakelock->domain]; struct timespec ts; if (stay) @@ -121,9 +121,9 @@ void pm_activity(int domain, int priority) { DEBUGASSERT(domain >= 0 && domain < CONFIG_PM_NDOMAINS); - if (g_pmglobals.domain[domain].governor->activity) + if (g_pmdomains[domain].governor->activity) { - g_pmglobals.domain[domain].governor->activity(domain, priority); + g_pmdomains[domain].governor->activity(domain, priority); } pm_auto_updatestate(domain); @@ -301,7 +301,7 @@ void pm_wakelock_uninit(FAR struct pm_wakelock_s *wakelock) /* Get a convenience pointer to minimize all of the indexing */ domain = wakelock->domain; - pdom = &g_pmglobals.domain[domain]; + pdom = &g_pmdomains[domain]; dq = &pdom->wakelock[wakelock->state]; wdog = &wakelock->wdog; @@ -350,7 +350,7 @@ void pm_wakelock_stay(FAR struct pm_wakelock_s *wakelock) /* Get a convenience pointer to minimize all of the indexing */ domain = wakelock->domain; - pdom = &g_pmglobals.domain[domain]; + pdom = &g_pmdomains[domain]; dq = &pdom->wakelock[wakelock->state]; flags = pm_domain_lock(domain); @@ -397,7 +397,7 @@ void pm_wakelock_relax(FAR struct pm_wakelock_s *wakelock) /* Get a convenience pointer to minimize all of the indexing */ domain = wakelock->domain; - pdom = &g_pmglobals.domain[domain]; + pdom = &g_pmdomains[domain]; dq = &pdom->wakelock[wakelock->state]; flags = pm_domain_lock(domain); @@ -448,7 +448,7 @@ void pm_wakelock_staytimeout(FAR struct pm_wakelock_s *wakelock, int ms) /* Get a convenience pointer to minimize all of the indexing */ domain = wakelock->domain; - pdom = &g_pmglobals.domain[domain]; + pdom = &g_pmdomains[domain]; dq = &pdom->wakelock[wakelock->state]; wdog = &wakelock->wdog; diff --git a/drivers/power/pm/pm_autoupdate.c b/drivers/power/pm/pm_autoupdate.c index d36a90f021..0579c3a32a 100644 --- a/drivers/power/pm/pm_autoupdate.c +++ b/drivers/power/pm/pm_autoupdate.c @@ -73,7 +73,7 @@ static void pm_auto_updatestate_cb(FAR void *arg) void pm_auto_updatestate(int domain) { FAR struct pm_domain_s *pdom; - pdom = &g_pmglobals.domain[domain]; + pdom = &g_pmdomains[domain]; if (pdom->auto_update) { @@ -113,7 +113,7 @@ void pm_auto_update(int domain, bool auto_update) irqstate_t flags; DEBUGASSERT(domain >= 0 && domain < CONFIG_PM_NDOMAINS); - pdom = &g_pmglobals.domain[domain]; + pdom = &g_pmdomains[domain]; flags = pm_domain_lock(domain); pdom->auto_update = auto_update; diff --git a/drivers/power/pm/pm_changestate.c b/drivers/power/pm/pm_changestate.c index 6773508073..0ac3419f7d 100644 --- a/drivers/power/pm/pm_changestate.c +++ b/drivers/power/pm/pm_changestate.c @@ -106,7 +106,7 @@ static void pm_stats_preparefail(int domain, int newstate, int ret) { struct timespec ts; - FAR struct pm_preparefail_s *pf = &callback->preparefail[domain]; + FAR struct pm_preparefail_s *pf = &callback->preparefail; if (pf->state != PM_RESTORE) { @@ -153,20 +153,23 @@ static void pm_stats_preparefail(int domain, static int pm_prepall(int domain, enum pm_state_e newstate, bool restore) { + FAR struct pm_domain_s *pdom; + FAR struct pm_callback_s *cb; FAR dq_entry_t *entry; int ret = OK; - if (newstate <= g_pmglobals.domain[domain].state) + pdom = &g_pmdomains[domain]; + if (newstate <= pdom->state) { /* Visit each registered callback structure in normal order. */ - for (entry = dq_peek(&g_pmglobals.registry); + for (entry = dq_peek(&pdom->registry); entry && ret == OK; entry = dq_next(entry)) { /* Is the prepare callback supported? */ - FAR struct pm_callback_s *cb = (FAR struct pm_callback_s *)entry; + cb = (FAR struct pm_callback_s *)entry; if (cb->prepare) { /* Yes.. prepare the driver */ @@ -183,13 +186,13 @@ static int pm_prepall(int domain, enum pm_state_e newstate, bool restore) { /* Visit each registered callback structure in reverse order. */ - for (entry = dq_tail(&g_pmglobals.registry); + for (entry = dq_tail(&pdom->registry); entry && ret == OK; entry = dq_prev(entry)) { /* Is the prepare callback supported? */ - FAR struct pm_callback_s *cb = (FAR struct pm_callback_s *)entry; + cb = (FAR struct pm_callback_s *)entry; if (cb->prepare) { /* Yes.. prepare the driver */ @@ -227,18 +230,21 @@ static int pm_prepall(int domain, enum pm_state_e newstate, bool restore) static inline void pm_changeall(int domain, enum pm_state_e newstate) { + FAR struct pm_domain_s *pdom; + FAR struct pm_callback_s *cb; FAR dq_entry_t *entry; - if (newstate <= g_pmglobals.domain[domain].state) + pdom = &g_pmdomains[domain]; + if (newstate <= pdom->state) { /* Visit each registered callback structure in normal order. */ - for (entry = dq_peek(&g_pmglobals.registry); + for (entry = dq_peek(&pdom->registry); entry; entry = dq_next(entry)) { /* Is the notification callback supported? */ - FAR struct pm_callback_s *cb = (FAR struct pm_callback_s *)entry; + cb = (FAR struct pm_callback_s *)entry; if (cb->notify) { /* Yes.. notify the driver */ @@ -251,12 +257,12 @@ static inline void pm_changeall(int domain, enum pm_state_e newstate) { /* Visit each registered callback structure in reverse order. */ - for (entry = dq_tail(&g_pmglobals.registry); + for (entry = dq_tail(&pdom->registry); entry; entry = dq_prev(entry)) { /* Is the notification callback supported? */ - FAR struct pm_callback_s *cb = (FAR struct pm_callback_s *)entry; + cb = (FAR struct pm_callback_s *)entry; if (cb->notify) { /* Yes.. notify the driver */ @@ -327,15 +333,15 @@ int pm_changestate(int domain, enum pm_state_e newstate) * Revert to the preceding state. */ - newstate = g_pmglobals.domain[domain].state; + newstate = g_pmdomains[domain].state; pm_prepall(domain, newstate, true); } } /* Statistics */ - pm_stats(&g_pmglobals.domain[domain], - g_pmglobals.domain[domain].state, newstate); + pm_stats(&g_pmdomains[domain], + g_pmdomains[domain].state, newstate); /* All drivers have agreed to the state change (or, one or more have * disagreed and the state has been reverted). Set the new state. @@ -345,16 +351,16 @@ int pm_changestate(int domain, enum pm_state_e newstate) /* Notify governor of (possible) state change */ - if (g_pmglobals.domain[domain].governor->statechanged) + if (g_pmdomains[domain].governor->statechanged) { - g_pmglobals.domain[domain].governor->statechanged(domain, newstate); + g_pmdomains[domain].governor->statechanged(domain, newstate); } /* Domain state update after statechanged done */ if (newstate != PM_RESTORE) { - g_pmglobals.domain[domain].state = newstate; + g_pmdomains[domain].state = newstate; } /* Restore the interrupt state */ @@ -380,7 +386,7 @@ int pm_changestate(int domain, enum pm_state_e newstate) enum pm_state_e pm_querystate(int domain) { DEBUGASSERT(domain >= 0 && domain < CONFIG_PM_NDOMAINS); - return g_pmglobals.domain[domain].state; + return g_pmdomains[domain].state; } #endif /* CONFIG_PM */ diff --git a/drivers/power/pm/pm_checkstate.c b/drivers/power/pm/pm_checkstate.c index 096d1ceb38..5b4f13bb26 100644 --- a/drivers/power/pm/pm_checkstate.c +++ b/drivers/power/pm/pm_checkstate.c @@ -73,9 +73,9 @@ enum pm_state_e pm_checkstate(int domain) { DEBUGASSERT(domain >= 0 && domain < CONFIG_PM_NDOMAINS); - if (g_pmglobals.domain[domain].governor->checkstate) + if (g_pmdomains[domain].governor->checkstate) { - return g_pmglobals.domain[domain].governor->checkstate(domain); + return g_pmdomains[domain].governor->checkstate(domain); } return PM_NORMAL; diff --git a/drivers/power/pm/pm_governor.c b/drivers/power/pm/pm_governor.c index 2c66934a14..9d5a5eb737 100644 --- a/drivers/power/pm/pm_governor.c +++ b/drivers/power/pm/pm_governor.c @@ -75,17 +75,17 @@ int pm_set_governor(int domain, FAR const struct pm_governor_s *gov) return -EINVAL; } - if (g_pmglobals.domain[domain].governor && - g_pmglobals.domain[domain].governor->deinitialize) + if (g_pmdomains[domain].governor && + g_pmdomains[domain].governor->deinitialize) { - g_pmglobals.domain[domain].governor->deinitialize(); + g_pmdomains[domain].governor->deinitialize(); } - g_pmglobals.domain[domain].governor = gov; + g_pmdomains[domain].governor = gov; - if (g_pmglobals.domain[domain].governor->initialize) + if (g_pmdomains[domain].governor->initialize) { - g_pmglobals.domain[domain].governor->initialize(); + g_pmdomains[domain].governor->initialize(); } return 0; diff --git a/drivers/power/pm/pm_initialize.c b/drivers/power/pm/pm_initialize.c index 38488bc820..f44279c4e1 100644 --- a/drivers/power/pm/pm_initialize.c +++ b/drivers/power/pm/pm_initialize.c @@ -38,16 +38,7 @@ /* All PM global data: */ -/* Initialize the registry and the PM global data structures. The PM - * global data structure resides in .data which is zeroed at boot time. So - * it is only required to initialize non-zero elements of the PM global - * data structure here. - */ - -struct pm_global_s g_pmglobals = -{ - NXRMUTEX_INITIALIZER -}; +struct pm_domain_s g_pmdomains[CONFIG_PM_NDOMAINS]; /**************************************************************************** * Public Functions @@ -98,10 +89,10 @@ void pm_initialize(void) pm_set_governor(i, gov); #if defined(CONFIG_PM_PROCFS) - clock_systime_timespec(&g_pmglobals.domain[i].start); + clock_systime_timespec(&g_pmdomains[i].start); #endif - nxrmutex_init(&g_pmglobals.domain[i].lock); + nxrmutex_init(&g_pmdomains[i].lock); #if CONFIG_PM_GOVERNOR_EXPLICIT_RELAX for (state = 0; state < PM_COUNT; state++) diff --git a/drivers/power/pm/pm_lock.c b/drivers/power/pm/pm_lock.c index 54dff8410d..ee945996ab 100644 --- a/drivers/power/pm/pm_lock.c +++ b/drivers/power/pm/pm_lock.c @@ -59,12 +59,12 @@ void pm_unlock(FAR rmutex_t *lock, irqstate_t flags) irqstate_t pm_domain_lock(int domain) { - return pm_lock(&g_pmglobals.domain[domain].lock); + return pm_lock(&g_pmdomains[domain].lock); } void pm_domain_unlock(int domain, irqstate_t flags) { - pm_unlock(&g_pmglobals.domain[domain].lock, flags); + pm_unlock(&g_pmdomains[domain].lock, flags); } #endif /* CONFIG_PM */ diff --git a/drivers/power/pm/pm_procfs.c b/drivers/power/pm/pm_procfs.c index 5aea817018..199fc41f9e 100644 --- a/drivers/power/pm/pm_procfs.c +++ b/drivers/power/pm/pm_procfs.c @@ -288,7 +288,7 @@ static ssize_t pm_read_state(FAR struct file *filep, FAR char *buffer, /* Recover our private data from the struct file instance */ pmfile = (FAR struct pm_file_s *)filep->f_priv; - dom = &g_pmglobals.domain[pmfile->domain]; + dom = &g_pmdomains[pmfile->domain]; DEBUGASSERT(pmfile); DEBUGASSERT(dom); @@ -378,7 +378,7 @@ static ssize_t pm_read_wakelock(FAR struct file *filep, FAR char *buffer, /* Recover our private data from the struct file instance */ pmfile = (FAR struct pm_file_s *)filep->f_priv; - dom = &g_pmglobals.domain[pmfile->domain]; + dom = &g_pmdomains[pmfile->domain]; DEBUGASSERT(pmfile); DEBUGASSERT(dom); @@ -464,7 +464,7 @@ static ssize_t pm_read_preparefail(FAR struct file *filep, FAR char *buffer, /* Recover our private data from the struct file instance */ pmfile = (FAR struct pm_file_s *)filep->f_priv; - dom = &g_pmglobals.domain[pmfile->domain]; + dom = &g_pmdomains[pmfile->domain]; DEBUGASSERT(pmfile); DEBUGASSERT(dom); @@ -480,11 +480,12 @@ static ssize_t pm_read_preparefail(FAR struct file *filep, FAR char *buffer, totalsize += copysize; flags = pm_domain_lock(pmfile->domain); - for (entry = dq_peek(&g_pmglobals.registry); + + for (entry = dq_peek(&dom->registry); entry; entry = dq_next(entry)) { cb = (FAR struct pm_callback_s *)entry; - pf = &cb->preparefail[pmfile->domain]; + pf = &cb->preparefail; for (state = 0; state < PM_COUNT; state++) { sum += pf->duration[state].tv_sec; @@ -492,13 +493,13 @@ static ssize_t pm_read_preparefail(FAR struct file *filep, FAR char *buffer, } sum = sum ? sum : 1; - for (entry = dq_peek(&g_pmglobals.registry); + for (entry = dq_peek(&dom->registry); entry; entry = dq_next(entry)) { time_t total = 0; cb = (FAR struct pm_callback_s *)entry; - pf = &cb->preparefail[pmfile->domain]; + pf = &cb->preparefail; for (state = 0; state < PM_COUNT; state++) { total += pf->duration[state].tv_sec; diff --git a/drivers/power/pm/pm_register.c b/drivers/power/pm/pm_register.c index b671062f67..84e155ac01 100644 --- a/drivers/power/pm/pm_register.c +++ b/drivers/power/pm/pm_register.c @@ -39,14 +39,15 @@ ****************************************************************************/ /**************************************************************************** - * Name: pm_register + * Name: pm_domain_register * * Description: * This function is called by a device driver in order to register to * receive power management event callbacks. * * Input Parameters: - * callbacks - An instance of struct pm_callback_s providing the driver + * domain - Target register domain. + * cb - An instance of struct pm_callback_s providing the driver * callback functions. * * Returned Value: @@ -54,27 +55,20 @@ * ****************************************************************************/ -int pm_register(FAR struct pm_callback_s *callbacks) +int pm_domain_register(int domain, FAR struct pm_callback_s *cb) { irqstate_t flags; - - DEBUGASSERT(callbacks); + FAR struct pm_domain_s *pdom = &g_pmdomains[domain]; + flags = pm_lock(&pdom->lock); /* Add the new entry to the end of the list of registered callbacks */ - flags = pm_lock(&g_pmglobals.reglock); - dq_addlast(&callbacks->entry, &g_pmglobals.registry); - -#ifdef CONFIG_PM_PROCFS - for (int domain = 0; domain < CONFIG_PM_NDOMAINS; domain++) - { - callbacks->preparefail[domain].state = PM_RESTORE; - } + dq_addlast(&cb->entry, &pdom->registry); +#if defined (CONFIG_PM_PROCFS) + cb->preparefail.state = PM_RESTORE; #endif - - pm_unlock(&g_pmglobals.reglock, flags); - - return 0; + pm_unlock(&pdom->lock, flags); + return OK; } #endif /* CONFIG_PM */ diff --git a/drivers/power/pm/pm_unregister.c b/drivers/power/pm/pm_unregister.c index f591f1391b..9cb003215a 100644 --- a/drivers/power/pm/pm_unregister.c +++ b/drivers/power/pm/pm_unregister.c @@ -38,14 +38,15 @@ ****************************************************************************/ /**************************************************************************** - * Name: pm_unregister + * Name: pm_domain_unregister * * Description: * This function is called by a device driver in order to unregister * previously registered power management event callbacks. * * Input parameters: - * callbacks - An instance of struct pm_callback_s providing the driver + * domain - Target unregister domain. + * cb - An instance of struct pm_callback_s providing the driver * callback functions. * * Returned Value: @@ -53,19 +54,17 @@ * ****************************************************************************/ -int pm_unregister(FAR struct pm_callback_s *callbacks) +int pm_domain_unregister(int domain, FAR struct pm_callback_s *cb) { irqstate_t flags; - - DEBUGASSERT(callbacks); + struct pm_domain_s *pdom = &g_pmdomains[domain]; + flags = pm_lock(&pdom->lock); /* Remove entry from the list of registered callbacks. */ - flags = pm_lock(&g_pmglobals.reglock); - dq_rem(&callbacks->entry, &g_pmglobals.registry); - pm_unlock(&g_pmglobals.reglock, flags); - - return 0; + dq_rem(&cb->entry, &pdom->registry); + pm_unlock(&pdom->lock, flags); + return OK; } #endif /* CONFIG_PM */ diff --git a/drivers/power/pm/stability_governor.c b/drivers/power/pm/stability_governor.c index c2fd6ff6f0..66d4fe9db7 100644 --- a/drivers/power/pm/stability_governor.c +++ b/drivers/power/pm/stability_governor.c @@ -158,7 +158,7 @@ static enum pm_state_e stability_governor_checkstate(int domain) bool wdog_wakeup; gdom = &g_stability_governor.domain[domain]; - pdom = &g_pmglobals.domain[domain]; + pdom = &g_pmdomains[domain]; state = PM_NORMAL; /* We disable interrupts since pm_stay()/pm_relax() could be simultaneously diff --git a/include/nuttx/power/pm.h b/include/nuttx/power/pm.h index 3bdd491f3e..54d6f16ce5 100644 --- a/include/nuttx/power/pm.h +++ b/include/nuttx/power/pm.h @@ -222,7 +222,7 @@ struct pm_callback_s enum pm_state_e pmstate); #ifdef CONFIG_PM_PROCFS - struct pm_preparefail_s preparefail[CONFIG_PM_NDOMAINS]; + struct pm_preparefail_s preparefail; #endif }; @@ -440,14 +440,15 @@ int pm_set_governor(int domain, FAR const struct pm_governor_s *gov); void pm_auto_update(int domain, bool auto_update); /**************************************************************************** - * Name: pm_register + * Name: pm_domain_register * * Description: * This function is called by a device driver in order to register to * receive power management event callbacks. * * Input Parameters: - * callbacks - An instance of struct pm_callback_s providing the driver + * domain - Target register domain. + * cb - An instance of struct pm_callback_s providing the driver * callback functions. * * Returned Value: @@ -455,17 +456,20 @@ void pm_auto_update(int domain, bool auto_update); * ****************************************************************************/ -int pm_register(FAR struct pm_callback_s *callbacks); +int pm_domain_register(int domain, FAR struct pm_callback_s *cb); + +#define pm_register(cb) pm_domain_register(PM_IDLE_DOMAIN, cb) /**************************************************************************** - * Name: pm_unregister + * Name: pm_domain_unregister * * Description: * This function is called by a device driver in order to unregister * previously registered power management event callbacks. * * Input parameters: - * callbacks - An instance of struct pm_callback_s providing the driver + * domain - Target unregister domain. + * cb - An instance of struct pm_callback_s providing the driver * callback functions. * * Returned Value: @@ -473,7 +477,9 @@ int pm_register(FAR struct pm_callback_s *callbacks); * ****************************************************************************/ -int pm_unregister(FAR struct pm_callback_s *callbacks); +int pm_domain_unregister(int domain, FAR struct pm_callback_s *cb); + +#define pm_unregister(cb) pm_domain_unregister(PM_IDLE_DOMAIN, cb) /**************************************************************************** * Name: pm_activity