You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by je...@apache.org on 2021/05/20 05:23:59 UTC
[incubator-nuttx] 02/21: arch: cxd56xx: Support for suppresion of
clock change
This is an automated email from the ASF dual-hosted git repository.
jerpelea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit db340a8941769712bc5e2b93d0aae1ca48628243
Author: SPRESENSE <41...@users.noreply.github.com>
AuthorDate: Wed May 19 17:03:49 2021 +0900
arch: cxd56xx: Support for suppresion of clock change
Introduce PM_CPUFREQLOCK_FLAG_HOLD into the frequency lock mechanism in
power manager, which is used to keep the current frequency without clock
change, for example, during the transfer of a periphral.
---
arch/arm/include/cxd56xx/pm.h | 5 +++--
arch/arm/src/cxd56xx/cxd56_powermgr.c | 15 +++++++++++++++
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/arch/arm/include/cxd56xx/pm.h b/arch/arm/include/cxd56xx/pm.h
index 824a0a3..fe3ab71 100644
--- a/arch/arm/include/cxd56xx/pm.h
+++ b/arch/arm/include/cxd56xx/pm.h
@@ -62,8 +62,9 @@
/* FrequencyLock request flag definitions */
-#define PM_CPUFREQLOCK_FLAG_HV (0x0001) /* request HV */
-#define PM_CPUFREQLOCK_FLAG_LV (0x4000) /* request LV */
+#define PM_CPUFREQLOCK_FLAG_HV (0x0001) /* request HV */
+#define PM_CPUFREQLOCK_FLAG_LV (0x4000) /* request LV */
+#define PM_CPUFREQLOCK_FLAG_HOLD (0x8000) /* hold the current frequency */
/* FrequencyLock identifier tag helper macro function */
diff --git a/arch/arm/src/cxd56xx/cxd56_powermgr.c b/arch/arm/src/cxd56xx/cxd56_powermgr.c
index 489216a..00acf5f 100644
--- a/arch/arm/src/cxd56xx/cxd56_powermgr.c
+++ b/arch/arm/src/cxd56xx/cxd56_powermgr.c
@@ -577,6 +577,13 @@ void up_pm_acquire_freqlock(struct pm_cpu_freqlock_s *lock)
cxd56_pm_semtake(&g_freqlock);
+ if (lock->flag == PM_CPUFREQLOCK_FLAG_HOLD)
+ {
+ /* Return with holding the current frequency */
+
+ return;
+ }
+
for (entry = sq_peek(&g_freqlockqueue); entry; entry = sq_next(entry))
{
if (entry == (struct sq_entry_s *)lock)
@@ -616,6 +623,13 @@ void up_pm_release_freqlock(struct pm_cpu_freqlock_s *lock)
DEBUGASSERT(lock);
+ if (lock->flag == PM_CPUFREQLOCK_FLAG_HOLD)
+ {
+ /* Release holding the current frequency */
+
+ goto exit;
+ }
+
up_pm_acquire_wakelock(&g_wlock);
cxd56_pm_semtake(&g_freqlock);
@@ -634,6 +648,7 @@ void up_pm_release_freqlock(struct pm_cpu_freqlock_s *lock)
}
}
+exit:
nxsem_post(&g_freqlock);
up_pm_release_wakelock(&g_wlock);