From 38c6f20d176c8c6651c1daaf426e904f0871adf3 Mon Sep 17 00:00:00 2001 From: ligd Date: Fri, 30 Dec 2022 13:42:31 +0800 Subject: [PATCH] pm: add pm_domain_lock/unlock support Signed-off-by: ligd --- drivers/power/pm/activity_governor.c | 8 ++--- drivers/power/pm/greedy_governor.c | 8 ++--- drivers/power/pm/pm.h | 46 +++++++++++++++++++++++++--- drivers/power/pm/pm_activity.c | 16 +++++----- drivers/power/pm/pm_autoupdate.c | 8 ++--- drivers/power/pm/pm_changestate.c | 4 +-- drivers/power/pm/pm_lock.c | 40 +++++++++--------------- drivers/power/pm/pm_procfs.c | 8 ++--- 8 files changed, 82 insertions(+), 56 deletions(-) diff --git a/drivers/power/pm/activity_governor.c b/drivers/power/pm/activity_governor.c index 125aa95a45..64b8eb0fd1 100644 --- a/drivers/power/pm/activity_governor.c +++ b/drivers/power/pm/activity_governor.c @@ -235,7 +235,7 @@ static void governor_activity(int domain, int count) { /* Add the activity count to the accumulated counts. */ - flags = pm_lock(domain); + flags = pm_domain_lock(domain); accum = (uint32_t)pdomstate->accum + count; /* Make sure that we do not overflow the underlying representation */ @@ -275,7 +275,7 @@ static void governor_activity(int domain, int count) governor_update(domain, tmp); } - pm_unlock(domain, flags); + pm_domain_unlock(domain, flags); } } @@ -476,7 +476,7 @@ static enum pm_state_e governor_checkstate(int domain) * logic in governor_activity(). */ - flags = pm_lock(domain); + flags = pm_domain_lock(domain); /* Check the elapsed time. In periods of low activity, time slicing is * controlled by IDLE loop polling; in periods of higher activity, time @@ -515,7 +515,7 @@ static enum pm_state_e governor_checkstate(int domain) } } - pm_unlock(domain, flags); + pm_domain_unlock(domain, flags); return pdomstate->recommended; } diff --git a/drivers/power/pm/greedy_governor.c b/drivers/power/pm/greedy_governor.c index bd039ab0d7..d0eb25fc15 100644 --- a/drivers/power/pm/greedy_governor.c +++ b/drivers/power/pm/greedy_governor.c @@ -119,7 +119,7 @@ static enum pm_state_e greedy_governor_checkstate(int domain) * invoked, which modifies the stay count which we are about to read */ - flags = pm_lock(domain); + flags = pm_domain_lock(domain); if (!WDOG_ISACTIVE(&pdomstate->wdog)) { @@ -131,7 +131,7 @@ static enum pm_state_e greedy_governor_checkstate(int domain) } } - pm_unlock(domain, flags); + pm_domain_unlock(domain, flags); /* Return the found state */ @@ -159,7 +159,7 @@ static void greedy_governor_activity(int domain, int count) pdomstate = &g_pm_greedy_governor.domain_states[domain]; count = count ? count : 1; - flags = pm_lock(domain); + flags = pm_domain_lock(domain); if (TICK2SEC(wd_gettime(&pdomstate->wdog)) < count) { @@ -167,7 +167,7 @@ static void greedy_governor_activity(int domain, int count) greedy_governor_timer_cb, (wdparm_t)domain); } - pm_unlock(domain, flags); + pm_domain_unlock(domain, flags); } /**************************************************************************** diff --git a/drivers/power/pm/pm.h b/drivers/power/pm/pm.h index 6e91211ede..36998f2f71 100644 --- a/drivers/power/pm/pm.h +++ b/drivers/power/pm/pm.h @@ -133,11 +133,14 @@ EXTERN struct pm_global_s g_pmglobals; * Lock the power management operation. * * Input Parameters: - * domain - The PM domain to lock + * lock - The lock subjuct + * + * Returned Value: + * Return current state * ****************************************************************************/ -irqstate_t pm_lock(int domain); +irqstate_t pm_lock(FAR rmutex_t *lock); /**************************************************************************** * Name: pm_unlock @@ -146,11 +149,46 @@ irqstate_t pm_lock(int domain); * Unlock the power management operation. * * Input Parameters: - * domain - The PM domain to unlock + * lock - The lock subjuct + * + * Returned Value: + * None * ****************************************************************************/ -void pm_unlock(int domain, irqstate_t flags); +void pm_unlock(FAR rmutex_t *lock, irqstate_t flags); + +/**************************************************************************** + * Name: pm_domain_lock + * + * Description: + * Lock the power management operation. + * + * Input Parameters: + * domain - The PM domain to lock + * + * Returned Value: + * Return current state + * + ****************************************************************************/ + +irqstate_t pm_domain_lock(int domain); + +/**************************************************************************** + * Name: pm_domain_unlock + * + * Description: + * Unlock the power management operation. + * + * Input Parameters: + * domain - The PM domain to unlock + * + * Returned Value: + * None + * + ****************************************************************************/ + +void pm_domain_unlock(int domain, irqstate_t flags); /**************************************************************************** * Name: pm_wakelock_global_init diff --git a/drivers/power/pm/pm_activity.c b/drivers/power/pm/pm_activity.c index b3cb8b7424..ff6dab8adb 100644 --- a/drivers/power/pm/pm_activity.c +++ b/drivers/power/pm/pm_activity.c @@ -305,7 +305,7 @@ void pm_wakelock_uninit(FAR struct pm_wakelock_s *wakelock) dq = &pdom->wakelock[wakelock->state]; wdog = &wakelock->wdog; - flags = pm_lock(domain); + flags = pm_domain_lock(domain); if (wakelock->count > 0) { @@ -316,7 +316,7 @@ void pm_wakelock_uninit(FAR struct pm_wakelock_s *wakelock) wd_cancel(wdog); pm_wakelock_stats_rm(wakelock); - pm_unlock(domain, flags); + pm_domain_unlock(domain, flags); } /**************************************************************************** @@ -353,7 +353,7 @@ void pm_wakelock_stay(FAR struct pm_wakelock_s *wakelock) pdom = &g_pmglobals.domain[domain]; dq = &pdom->wakelock[wakelock->state]; - flags = pm_lock(domain); + flags = pm_domain_lock(domain); DEBUGASSERT(wakelock->count < UINT32_MAX); if (wakelock->count++ == 0) @@ -362,7 +362,7 @@ void pm_wakelock_stay(FAR struct pm_wakelock_s *wakelock) pm_wakelock_stats(wakelock, true); } - pm_unlock(domain, flags); + pm_domain_unlock(domain, flags); pm_auto_updatestate(domain); } @@ -400,7 +400,7 @@ void pm_wakelock_relax(FAR struct pm_wakelock_s *wakelock) pdom = &g_pmglobals.domain[domain]; dq = &pdom->wakelock[wakelock->state]; - flags = pm_lock(domain); + flags = pm_domain_lock(domain); DEBUGASSERT(wakelock->count > 0); if (--wakelock->count == 0) @@ -409,7 +409,7 @@ void pm_wakelock_relax(FAR struct pm_wakelock_s *wakelock) pm_wakelock_stats(wakelock, false); } - pm_unlock(domain, flags); + pm_domain_unlock(domain, flags); pm_auto_updatestate(domain); } @@ -452,7 +452,7 @@ void pm_wakelock_staytimeout(FAR struct pm_wakelock_s *wakelock, int ms) dq = &pdom->wakelock[wakelock->state]; wdog = &wakelock->wdog; - flags = pm_lock(domain); + flags = pm_domain_lock(domain); if (!WDOG_ISACTIVE(wdog)) { @@ -469,7 +469,7 @@ void pm_wakelock_staytimeout(FAR struct pm_wakelock_s *wakelock, int ms) wd_start(wdog, MSEC2TICK(ms), pm_waklock_cb, (wdparm_t)wakelock); } - pm_unlock(domain, flags); + pm_domain_unlock(domain, flags); pm_auto_updatestate(domain); } diff --git a/drivers/power/pm/pm_autoupdate.c b/drivers/power/pm/pm_autoupdate.c index f017932dd3..5b8e9e0277 100644 --- a/drivers/power/pm/pm_autoupdate.c +++ b/drivers/power/pm/pm_autoupdate.c @@ -44,12 +44,12 @@ static void pm_auto_updatestate_cb(FAR void *arg) enum pm_state_e newstate; irqstate_t flags; - flags = pm_lock(domain); + flags = pm_domain_lock(domain); newstate = pm_checkstate(domain); pm_changestate(domain, newstate); - pm_unlock(domain, flags); + pm_domain_unlock(domain, flags); } /**************************************************************************** @@ -114,9 +114,9 @@ void pm_auto_update(int domain, bool auto_update) DEBUGASSERT(domain >= 0 && domain < CONFIG_PM_NDOMAINS); pdom = &g_pmglobals.domain[domain]; - flags = pm_lock(domain); + flags = pm_domain_lock(domain); pdom->auto_update = auto_update; - pm_unlock(domain, flags); + pm_domain_unlock(domain, flags); } #endif /* CONFIG_PM */ diff --git a/drivers/power/pm/pm_changestate.c b/drivers/power/pm/pm_changestate.c index 4c06b265a7..a6ed4702e6 100644 --- a/drivers/power/pm/pm_changestate.c +++ b/drivers/power/pm/pm_changestate.c @@ -242,7 +242,7 @@ int pm_changestate(int domain, enum pm_state_e newstate) * re-enabled. */ - flags = pm_lock(domain); + flags = pm_domain_lock(domain); if (newstate != PM_RESTORE) { @@ -286,7 +286,7 @@ int pm_changestate(int domain, enum pm_state_e newstate) /* Restore the interrupt state */ - pm_unlock(domain, flags); + pm_domain_unlock(domain, flags); return ret; } diff --git a/drivers/power/pm/pm_lock.c b/drivers/power/pm/pm_lock.c index a59c2db9a7..54dff8410d 100644 --- a/drivers/power/pm/pm_lock.c +++ b/drivers/power/pm/pm_lock.c @@ -37,46 +37,34 @@ * Public Functions ****************************************************************************/ -/**************************************************************************** - * Name: pm_lock - * - * Description: - * Lock the power management operation. - * - * Input Parameters: - * domain - The PM domain to lock - * - ****************************************************************************/ - -irqstate_t pm_lock(int domain) +irqstate_t pm_lock(FAR rmutex_t *lock) { if (!up_interrupt_context() && !sched_idletask()) { - nxrmutex_lock(&g_pmglobals.domain[domain].lock); + nxrmutex_lock(lock); } return enter_critical_section(); } -/**************************************************************************** - * Name: pm_unlock - * - * Description: - * Unlock the power management operation. - * - * Input Parameters: - * domain - The PM domain to unlock - * - ****************************************************************************/ - -void pm_unlock(int domain, irqstate_t flags) +void pm_unlock(FAR rmutex_t *lock, irqstate_t flags) { leave_critical_section(flags); if (!up_interrupt_context() && !sched_idletask()) { - nxrmutex_unlock(&g_pmglobals.domain[domain].lock); + nxrmutex_unlock(lock); } } +irqstate_t pm_domain_lock(int domain) +{ + return pm_lock(&g_pmglobals.domain[domain].lock); +} + +void pm_domain_unlock(int domain, irqstate_t flags) +{ + pm_unlock(&g_pmglobals.domain[domain].lock, flags); +} + #endif /* CONFIG_PM */ diff --git a/drivers/power/pm/pm_procfs.c b/drivers/power/pm/pm_procfs.c index bd6ad8bb7a..d4b8585a19 100644 --- a/drivers/power/pm/pm_procfs.c +++ b/drivers/power/pm/pm_procfs.c @@ -268,7 +268,7 @@ static ssize_t pm_read_state(FAR struct file *filep, FAR char *buffer, totalsize += copysize; - flags = pm_lock(pmfile->domain); + flags = pm_domain_lock(pmfile->domain); for (state = 0; state < PM_COUNT; state++) { @@ -300,7 +300,7 @@ static ssize_t pm_read_state(FAR struct file *filep, FAR char *buffer, totalsize += copysize; } - pm_unlock(pmfile->domain, flags); + pm_domain_unlock(pmfile->domain, flags); filep->f_pos += totalsize; return totalsize; @@ -340,7 +340,7 @@ static ssize_t pm_read_wakelock(FAR struct file *filep, FAR char *buffer, totalsize += copysize; - flags = pm_lock(pmfile->domain); + flags = pm_domain_lock(pmfile->domain); entry = dq_peek(&dom->wakelockall); for (; entry && totalsize < buflen; entry = dq_next(entry)) @@ -374,7 +374,7 @@ static ssize_t pm_read_wakelock(FAR struct file *filep, FAR char *buffer, totalsize += copysize; } - pm_unlock(pmfile->domain, flags); + pm_domain_unlock(pmfile->domain, flags); filep->f_pos += totalsize; return totalsize;