You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/04/01 16:11:09 UTC

[incubator-nuttx] 01/02: power: unify lock states

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit ae21df2ed3c560d4ea4ed1f1446fd1f2a396861a
Author: zhuyanlin <zh...@xiaomi.com>
AuthorDate: Tue Mar 15 20:42:34 2022 +0800

    power: unify lock states
    
    unify critical_section and nxsem with pm_lock/pm_unlock
    
    Signed-off-by: zhuyanlin <zh...@xiaomi.com>
---
 drivers/power/Make.defs                      |  2 +-
 drivers/power/activity_governor.c            |  8 ++---
 drivers/power/greedy_governor.c              |  4 +--
 drivers/power/pm.h                           | 41 +++++++++++----------
 drivers/power/pm_activity.c                  |  8 ++---
 drivers/power/pm_autoupdate.c                |  4 +--
 drivers/power/pm_changestate.c               |  4 +--
 drivers/power/{pm_unregister.c => pm_lock.c} | 53 ++++++++++++++--------------
 drivers/power/pm_register.c                  | 15 ++++----
 drivers/power/pm_unregister.c                | 13 +++----
 10 files changed, 74 insertions(+), 78 deletions(-)

diff --git a/drivers/power/Make.defs b/drivers/power/Make.defs
index e012547..7c1ecb0 100644
--- a/drivers/power/Make.defs
+++ b/drivers/power/Make.defs
@@ -23,7 +23,7 @@
 ifeq ($(CONFIG_PM),y)
 
 CSRCS += pm_initialize.c pm_activity.c pm_changestate.c pm_checkstate.c
-CSRCS += pm_register.c pm_unregister.c pm_autoupdate.c pm_governor.c
+CSRCS += pm_register.c pm_unregister.c pm_autoupdate.c pm_governor.c pm_lock.c
 
 # Governor implementations
 
diff --git a/drivers/power/activity_governor.c b/drivers/power/activity_governor.c
index 05b4046..dcd44c1 100644
--- a/drivers/power/activity_governor.c
+++ b/drivers/power/activity_governor.c
@@ -235,7 +235,7 @@ static void governor_activity(int domain, int count)
     {
       /* Add the activity count to the accumulated counts. */
 
-      flags = enter_critical_section();
+      flags = pm_lock();
       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);
         }
 
-      leave_critical_section(flags);
+      pm_unlock(flags);
     }
 }
 
@@ -476,7 +476,7 @@ static enum pm_state_e governor_checkstate(int domain)
    * logic in governor_activity().
    */
 
-  flags = enter_critical_section();
+  flags = pm_lock();
 
   /* 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)
         }
     }
 
-  leave_critical_section(flags);
+  pm_unlock(flags);
 
   return pdomstate->recommended;
 }
diff --git a/drivers/power/greedy_governor.c b/drivers/power/greedy_governor.c
index 09b35c0..43c839d 100644
--- a/drivers/power/greedy_governor.c
+++ b/drivers/power/greedy_governor.c
@@ -123,7 +123,7 @@ static enum pm_state_e greedy_governor_checkstate(int domain)
    * invoked, which modifies the stay count which we are about to read
    */
 
-  flags = enter_critical_section();
+  flags = pm_lock();
 
   /* Find the lowest power-level which is not locked. */
 
@@ -132,7 +132,7 @@ static enum pm_state_e greedy_governor_checkstate(int domain)
       state++;
     }
 
-  leave_critical_section(flags);
+  pm_unlock(flags);
 
   /* Return the found state */
 
diff --git a/drivers/power/pm.h b/drivers/power/pm.h
index 42821bf..c067e12 100644
--- a/drivers/power/pm.h
+++ b/drivers/power/pm.h
@@ -42,27 +42,6 @@
  ****************************************************************************/
 
 /****************************************************************************
- * Name: pm_lock
- *
- * Description:
- *   Lock the power management registry.  NOTE: This function may return
- *   an error if a signal is received while what (errno == EINTR).
- *
- ****************************************************************************/
-
-#define pm_lock() nxsem_wait(&g_pmglobals.regsem);
-
-/****************************************************************************
- * Name: pm_unlock
- *
- * Description:
- *   Unlock the power management registry.
- *
- ****************************************************************************/
-
-#define pm_unlock() nxsem_post(&g_pmglobals.regsem);
-
-/****************************************************************************
  * Public Types
  ****************************************************************************/
 
@@ -154,6 +133,26 @@ EXTERN struct pm_global_s g_pmglobals;
 
 void pm_auto_updatestate(int domain);
 
+/****************************************************************************
+ * Name: pm_lock
+ *
+ * Description:
+ *   Lock the power management operation.
+ *
+ ****************************************************************************/
+
+irqstate_t pm_lock(void);
+
+/****************************************************************************
+ * Name: pm_unlock
+ *
+ * Description:
+ *   Unlock the power management operation.
+ *
+ ****************************************************************************/
+
+void pm_unlock(irqstate_t flags);
+
 #undef EXTERN
 #if defined(__cplusplus)
 }
diff --git a/drivers/power/pm_activity.c b/drivers/power/pm_activity.c
index d3c73dc..e0f4a7f 100644
--- a/drivers/power/pm_activity.c
+++ b/drivers/power/pm_activity.c
@@ -111,11 +111,11 @@ void pm_stay(int domain, enum pm_state_e state)
   DEBUGASSERT(domain >= 0 && domain < CONFIG_PM_NDOMAINS);
   pdom = &g_pmglobals.domain[domain];
 
-  flags = enter_critical_section();
+  flags = pm_lock();
   DEBUGASSERT(state < PM_COUNT);
   DEBUGASSERT(pdom->stay[state] < UINT16_MAX);
   pdom->stay[state]++;
-  leave_critical_section(flags);
+  pm_unlock(flags);
 
   pm_auto_updatestate(domain);
 }
@@ -151,11 +151,11 @@ void pm_relax(int domain, enum pm_state_e state)
   DEBUGASSERT(domain >= 0 && domain < CONFIG_PM_NDOMAINS);
   pdom = &g_pmglobals.domain[domain];
 
-  flags = enter_critical_section();
+  flags = pm_lock();
   DEBUGASSERT(state < PM_COUNT);
   DEBUGASSERT(pdom->stay[state] > 0);
   pdom->stay[state]--;
-  leave_critical_section(flags);
+  pm_unlock(flags);
 
   pm_auto_updatestate(domain);
 }
diff --git a/drivers/power/pm_autoupdate.c b/drivers/power/pm_autoupdate.c
index b0d7601..78463f0 100644
--- a/drivers/power/pm_autoupdate.c
+++ b/drivers/power/pm_autoupdate.c
@@ -109,9 +109,9 @@ void pm_auto_update(int domain, bool auto_update)
   DEBUGASSERT(domain >= 0 && domain < CONFIG_PM_NDOMAINS);
   pdom = &g_pmglobals.domain[domain];
 
-  flags = enter_critical_section();
+  flags = pm_lock();
   pdom->auto_update = auto_update;
-  leave_critical_section(flags);
+  pm_unlock(flags);
 }
 
 #endif /* CONFIG_PM */
diff --git a/drivers/power/pm_changestate.c b/drivers/power/pm_changestate.c
index d38dd0d..e9d804c 100644
--- a/drivers/power/pm_changestate.c
+++ b/drivers/power/pm_changestate.c
@@ -213,7 +213,7 @@ int pm_changestate(int domain, enum pm_state_e newstate)
    * re-enabled.
    */
 
-  flags = enter_critical_section();
+  flags = pm_lock();
 
   /* First, prepare the drivers for the state change.  In this phase,
    * drivers may refuse the state state change.
@@ -249,7 +249,7 @@ int pm_changestate(int domain, enum pm_state_e newstate)
 
   /* Restore the interrupt state */
 
-  leave_critical_section(flags);
+  pm_unlock(flags);
   return ret;
 }
 
diff --git a/drivers/power/pm_unregister.c b/drivers/power/pm_lock.c
similarity index 68%
copy from drivers/power/pm_unregister.c
copy to drivers/power/pm_lock.c
index bc9d0a6..0e12224 100644
--- a/drivers/power/pm_unregister.c
+++ b/drivers/power/pm_lock.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * drivers/power/pm_unregister.c
+ * drivers/power/pm_lock.c
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -24,51 +24,52 @@
 
 #include <nuttx/config.h>
 
-#include <queue.h>
-#include <assert.h>
-
+#include <nuttx/arch.h>
+#include <nuttx/irq.h>
 #include <nuttx/power/pm.h>
-
+#include <sched.h>
 #include "pm.h"
 
-#ifdef CONFIG_PM
+#if defined(CONFIG_PM)
 
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
 
 /****************************************************************************
- * Name: pm_unregister
+ * Name: pm_lock
  *
  * 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
- *               callback functions.
- *
- * Returned Value:
- *    Zero (OK) on success; otherwise a negated errno value is returned.
+ *   Lock the power management operation.
  *
  ****************************************************************************/
 
-int pm_unregister(FAR struct pm_callback_s *callbacks)
+irqstate_t pm_lock(void)
 {
-  int ret;
+  if (!up_interrupt_context() && !sched_idletask())
+    {
+      nxsem_wait_uninterruptible(&g_pmglobals.regsem);
+    }
 
-  DEBUGASSERT(callbacks);
+  return enter_critical_section();
+}
 
-  /* Remove entry from the list of registered callbacks. */
+/****************************************************************************
+ * Name: pm_unlock
+ *
+ * Description:
+ *   Unlock the power management operation.
+ *
+ ****************************************************************************/
 
-  ret = pm_lock();
-  if (ret == OK)
+void pm_unlock(irqstate_t flags)
+{
+  leave_critical_section(flags);
+
+  if (!up_interrupt_context() && !sched_idletask())
     {
-      dq_rem(&callbacks->entry, &g_pmglobals.registry);
-      pm_unlock();
+      nxsem_post(&g_pmglobals.regsem);
     }
-
-  return ret;
 }
 
 #endif /* CONFIG_PM */
diff --git a/drivers/power/pm_register.c b/drivers/power/pm_register.c
index fa95b8e..f676e8c 100644
--- a/drivers/power/pm_register.c
+++ b/drivers/power/pm_register.c
@@ -56,20 +56,19 @@
 
 int pm_register(FAR struct pm_callback_s *callbacks)
 {
-  int ret;
+  irqstate_t flags;
 
   DEBUGASSERT(callbacks);
 
   /* Add the new entry to the end of the list of registered callbacks */
 
-  ret = pm_lock();
-  if (ret == OK)
-    {
-      dq_addlast(&callbacks->entry, &g_pmglobals.registry);
-      pm_unlock();
-    }
+  flags = pm_lock();
 
-  return ret;
+  dq_addlast(&callbacks->entry, &g_pmglobals.registry);
+
+  pm_unlock(flags);
+
+  return 0;
 }
 
 #endif /* CONFIG_PM */
diff --git a/drivers/power/pm_unregister.c b/drivers/power/pm_unregister.c
index bc9d0a6..cf3a963 100644
--- a/drivers/power/pm_unregister.c
+++ b/drivers/power/pm_unregister.c
@@ -55,20 +55,17 @@
 
 int pm_unregister(FAR struct pm_callback_s *callbacks)
 {
-  int ret;
+  irqstate_t flags;
 
   DEBUGASSERT(callbacks);
 
   /* Remove entry from the list of registered callbacks. */
 
-  ret = pm_lock();
-  if (ret == OK)
-    {
-      dq_rem(&callbacks->entry, &g_pmglobals.registry);
-      pm_unlock();
-    }
+  flags = pm_lock();
+  dq_rem(&callbacks->entry, &g_pmglobals.registry);
+  pm_unlock(flags);
 
-  return ret;
+  return 0;
 }
 
 #endif /* CONFIG_PM */