drivers/power: add pm_unregister

This commit is contained in:
Juha Niskanen
2018-03-06 07:59:17 -06:00
committed by Gregory Nutt
parent 0b277da5fa
commit d8311b6493
7 changed files with 290 additions and 8 deletions
+24 -4
View File
@@ -6814,7 +6814,7 @@ void pm_initialize(void);
</pre></ul> </pre></ul>
<p><b>Description:</b> <p><b>Description:</b>
This function is called by MCU-specific one-time at power on reset in order to initialize the power management capabilities. This function is called by MCU-specific one-time at power on reset in order to initialize the power management capabilities.
This function must be called <i>very</i> early in the initialization sequence <i>before</i> any other device drivers are initialize (since they may attempt to register with the power management subsystem). This function must be called <i>very</i> early in the initialization sequence <i>before</i> any other device drivers are initialized (since they may attempt to register with the power management subsystem).
</p> </p>
<p><b>Input Parameters:</b> <p><b>Input Parameters:</b>
None None
@@ -6843,7 +6843,27 @@ int pm_register(FAR struct pm_callback_s *callbacks);
Zero (<code>OK</code>) on success; otherwise a negated <code>errno</code> value is returned. Zero (<code>OK</code>) on success; otherwise a negated <code>errno</code> value is returned.
</p> </p>
<h4><a name="pmactivity">6.5.2.3 <code>pm_activity()</code></a></h4> <h4><a name="pmunregister">6.5.2.3 <code>pm_unregister()</code></a></h4>
<p><b>Function Prototype:</b></p>
<ul><pre>
#include &lt;nuttx/power/pm.h&gt;
int pm_unregister(FAR struct pm_callback_s *callbacks);
</pre></ul>
<p><b>Description:</b>
This function is called by a device driver in order to unregister previously registered power management event callbacks.
Refer to the <a href="#pmcallbacks">PM Callback</a> section for more details.
</p>
<p><b>Input Parameters:</b>
<dl>
<dt><code>callbacks</code>
<dd>An instance of <code>struct pm_callback_s</code> providing the driver callback functions.
</dl>
</p>
<p><b>Returned Value:</b>
Zero (<code>OK</code>) on success; otherwise a negated <code>errno</code> value is returned.
</p>
<h4><a name="pmactivity">6.5.2.4 <code>pm_activity()</code></a></h4>
<p><b>Function Prototype:</b></p> <p><b>Function Prototype:</b></p>
<ul><pre> <ul><pre>
#include &lt;nuttx/power/pm.h&gt; #include &lt;nuttx/power/pm.h&gt;
@@ -6872,7 +6892,7 @@ void pm_activity(int domain, int priority);
This function may be called from an interrupt handler (this is the ONLY PM function that may be called from an interrupt handler!). This function may be called from an interrupt handler (this is the ONLY PM function that may be called from an interrupt handler!).
</p> </p>
<h4><a name="pmcheckstate">6.5.2.4 <code>pm_checkstate()</code></a></h4> <h4><a name="pmcheckstate">6.5.2.5 <code>pm_checkstate()</code></a></h4>
<p><b>Function Prototype:</b></p> <p><b>Function Prototype:</b></p>
<ul><pre> <ul><pre>
#include &lt;nuttx/power/pm.h&gt; #include &lt;nuttx/power/pm.h&gt;
@@ -6902,7 +6922,7 @@ enum pm_state_e pm_checkstate(int domain);
The recommended power management state. The recommended power management state.
</p> </p>
<h4><a name="pmchangestate">6.5.2.5 <code>pm_changestate()</code></a></h4> <h4><a name="pmchangestate">6.5.2.6 <code>pm_changestate()</code></a></h4>
<p><b>Function Prototype:</b></p> <p><b>Function Prototype:</b></p>
<ul><pre> <ul><pre>
#include &lt;nuttx/power/pm.h&gt; #include &lt;nuttx/power/pm.h&gt;
+153
View File
@@ -0,0 +1,153 @@
/****************************************************************************
* arch/arm/src/stm32f7/stm32_exti_wakeup.c
*
* Copyright (C) 2009, 2012, 2017-2018 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
* Juha Niskanen <juha.niskanen@haltian.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/irq.h>
#include <nuttx/arch.h>
#include <stdint.h>
#include <stdbool.h>
#include <errno.h>
#include <arch/irq.h>
#include "up_arch.h"
#include "chip.h"
#include "stm32_gpio.h"
#include "stm32_exti.h"
/****************************************************************************
* Private Data
****************************************************************************/
/* Interrupt handlers attached to the RTC WAKEUP EXTI */
static xcpt_t g_wakeup_callback;
static void *g_callback_arg;
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: stm32_exti_wakeup_isr
*
* Description:
* EXTI periodic WAKEUP interrupt service routine/dispatcher
*
****************************************************************************/
static int stm32_exti_wakeup_isr(int irq, void *context, FAR void *arg)
{
int ret = OK;
/* Dispatch the interrupt to the handler */
if (g_wakeup_callback != NULL)
{
ret = g_wakeup_callback(irq, context, g_callback_arg);
}
/* Clear the pending EXTI interrupt */
putreg32(EXTI_RTC_WAKEUP, STM32_EXTI_PR);
return ret;
}
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: stm32_exti_wakeup
*
* Description:
* Sets/clears EXTI wakeup interrupt.
*
* Input Parameters:
* - rising/falling edge: enables interrupt on rising/falling edges
* - event: generate event when set
* - func: when non-NULL, generate interrupt
*
* Returned Value:
* Zero (OK) on success; a negated errno value on failure indicating the
* nature of the failure.
*
****************************************************************************/
int stm32_exti_wakeup(bool risingedge, bool fallingedge, bool event,
xcpt_t func, void *arg)
{
g_wakeup_callback = func;
g_callback_arg = arg;
/* Install external interrupt handlers (if not already attached) */
if (func)
{
irq_attach(STM32_IRQ_RTC_WKUP, stm32_exti_wakeup_isr, NULL);
up_enable_irq(STM32_IRQ_RTC_WKUP);
}
else
{
up_disable_irq(STM32_IRQ_RTC_WKUP);
}
/* Configure rising/falling edges */
modifyreg32(STM32_EXTI_RTSR,
risingedge ? 0 : EXTI_RTC_WAKEUP,
risingedge ? EXTI_RTC_WAKEUP : 0);
modifyreg32(STM32_EXTI_FTSR,
fallingedge ? 0 : EXTI_RTC_WAKEUP,
fallingedge ? EXTI_RTC_WAKEUP : 0);
/* Enable Events and Interrupts */
modifyreg32(STM32_EXTI_EMR,
event ? 0 : EXTI_RTC_WAKEUP,
event ? EXTI_RTC_WAKEUP : 0);
modifyreg32(STM32_EXTI_IMR,
func ? 0 : EXTI_RTC_WAKEUP,
func ? EXTI_RTC_WAKEUP : 0);
return OK;
}
+1 -1
View File
@@ -42,7 +42,7 @@ POWER_CFLAGS =
ifeq ($(CONFIG_PM),y) ifeq ($(CONFIG_PM),y)
CSRCS += pm_activity.c pm_changestate.c pm_checkstate.c pm_initialize.c CSRCS += pm_activity.c pm_changestate.c pm_checkstate.c pm_initialize.c
CSRCS += pm_register.c pm_update.c CSRCS += pm_register.c pm_unregister.c pm_update.c
# Include power management in the build # Include power management in the build
+1 -1
View File
@@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
* drivers/power/pm * drivers/power/pm
* *
* Copyright (C) 2011-2012, 2016 Gregory Nutt. All rights reserved. * Copyright (C) 2011-2012, 2016, 2018 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> * Author: Gregory Nutt <gnutt@nuttx.org>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
+1 -1
View File
@@ -64,7 +64,7 @@
* callback functions. * callback functions.
* *
* Returned Value: * Returned Value:
* Zero (OK) on success; otherwise a negater errno value is returned. * Zero (OK) on success; otherwise a negated errno value is returned.
* *
****************************************************************************/ ****************************************************************************/
+90
View File
@@ -0,0 +1,90 @@
/****************************************************************************
* drivers/power/pm_unregister.c
*
* Copyright (C) 2018 Gregory Nutt. All rights reserved.
* Author: Juha Niskanen <juha.niskanen@haltian.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <queue.h>
#include <assert.h>
#include <nuttx/power/pm.h>
#include "pm.h"
#ifdef CONFIG_PM
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: pm_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
* callback functions.
*
* Returned value:
* Zero (OK) on success; otherwise a negated errno value is returned.
*
****************************************************************************/
int pm_unregister(FAR struct pm_callback_s *callbacks)
{
int ret;
DEBUGASSERT(callbacks);
/* Remove entry from the list of registered callbacks. */
ret = pm_lock();
if (ret == OK)
{
sq_rem(&callbacks->entry, &g_pmglobals.registry);
pm_unlock();
}
return ret;
}
#endif /* CONFIG_PM */
+20 -1
View File
@@ -386,12 +386,30 @@ void pm_initialize(void);
* callback functions. * callback functions.
* *
* Returned Value: * Returned Value:
* Zero (OK) on success; otherwise a negater errno value is returned. * Zero (OK) on success; otherwise a negated errno value is returned.
* *
****************************************************************************/ ****************************************************************************/
int pm_register(FAR struct pm_callback_s *callbacks); int pm_register(FAR struct pm_callback_s *callbacks);
/****************************************************************************
* Name: pm_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
* callback functions.
*
* Returned value:
* Zero (OK) on success; otherwise a negated errno value is returned.
*
****************************************************************************/
int pm_unregister(FAR struct pm_callback_s *callbacks);
/**************************************************************************** /****************************************************************************
* Name: pm_activity * Name: pm_activity
* *
@@ -503,6 +521,7 @@ int pm_changestate(int domain, enum pm_state_e newstate);
# define pm_initialize() # define pm_initialize()
# define pm_register(cb) (0) # define pm_register(cb) (0)
# define pm_unregister(cb) (0)
# define pm_activity(domain,prio) # define pm_activity(domain,prio)
# define pm_checkstate(domain) (0) # define pm_checkstate(domain) (0)
# define pm_changestate(domain,state) # define pm_changestate(domain,state)