From d8311b6493c55f60553f0c0ad61dfb7353fb7d29 Mon Sep 17 00:00:00 2001
From: Juha Niskanen Description:
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 very early in the initialization sequence before any other device drivers are initialize (since they may attempt to register with the power management subsystem).
+This function must be called very early in the initialization sequence before any other device drivers are initialized (since they may attempt to register with the power management subsystem).
Input Parameters:
None
@@ -6843,7 +6843,27 @@ int pm_register(FAR struct pm_callback_s *callbacks);
Zero ( Function Prototype: Description:
+ This function is called by a device driver in order to unregister previously registered power management event callbacks.
+ Refer to the PM Callback section for more details.
+ Input Parameters:
+ OK) on success; otherwise a negated errno value is returned.
6.5.2.3
+pm_activity()6.5.2.3
+pm_unregister()
+#include <nuttx/power/pm.h>
+int pm_unregister(FAR struct pm_callback_s *callbacks);
+
+
+
+callbacks
+ struct pm_callback_s providing the driver callback functions.
+
Returned Value:
+Zero (OK) on success; otherwise a negated errno value is returned.
+
pm_activity()Function Prototype:
#include <nuttx/power/pm.h> @@ -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!). -6.5.2.4
+pm_checkstate()6.5.2.5
pm_checkstate()Function Prototype:
#include <nuttx/power/pm.h> @@ -6902,7 +6922,7 @@ enum pm_state_e pm_checkstate(int domain); The recommended power management state. -6.5.2.5
+pm_changestate()6.5.2.6
pm_changestate()Function Prototype:
#include <nuttx/power/pm.h> diff --git a/arch/arm/src/stm32f7/stm32_exti_wakeup.c b/arch/arm/src/stm32f7/stm32_exti_wakeup.c new file mode 100644 index 00000000000..b02f2b2bf72 --- /dev/null +++ b/arch/arm/src/stm32f7/stm32_exti_wakeup.c @@ -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+ * Juha Niskanen + * + * 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 +#include +#include + +#include +#include +#include + +#include + +#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; +} diff --git a/drivers/power/Make.defs b/drivers/power/Make.defs index 7ec75e93305..2b97dc22e4a 100644 --- a/drivers/power/Make.defs +++ b/drivers/power/Make.defs @@ -42,7 +42,7 @@ POWER_CFLAGS = ifeq ($(CONFIG_PM),y) 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 diff --git a/drivers/power/pm.h b/drivers/power/pm.h index 03e405910b2..1e677b9fa88 100644 --- a/drivers/power/pm.h +++ b/drivers/power/pm.h @@ -1,7 +1,7 @@ /**************************************************************************** * 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 * * Redistribution and use in source and binary forms, with or without diff --git a/drivers/power/pm_register.c b/drivers/power/pm_register.c index 06046313585..4f200ff5720 100644 --- a/drivers/power/pm_register.c +++ b/drivers/power/pm_register.c @@ -64,7 +64,7 @@ * callback functions. * * Returned Value: - * Zero (OK) on success; otherwise a negater errno value is returned. + * Zero (OK) on success; otherwise a negated errno value is returned. * ****************************************************************************/ diff --git a/drivers/power/pm_unregister.c b/drivers/power/pm_unregister.c new file mode 100644 index 00000000000..d63a8ec8874 --- /dev/null +++ b/drivers/power/pm_unregister.c @@ -0,0 +1,90 @@ +/**************************************************************************** + * drivers/power/pm_unregister.c + * + * Copyright (C) 2018 Gregory Nutt. All rights reserved. + * Author: Juha Niskanen + * + * 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 + +#include +#include + +#include + +#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 */ + diff --git a/include/nuttx/power/pm.h b/include/nuttx/power/pm.h index 92df1c77491..1be4e2be31d 100644 --- a/include/nuttx/power/pm.h +++ b/include/nuttx/power/pm.h @@ -386,12 +386,30 @@ void pm_initialize(void); * callback functions. * * 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); +/**************************************************************************** + * 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 * @@ -503,6 +521,7 @@ int pm_changestate(int domain, enum pm_state_e newstate); # define pm_initialize() # define pm_register(cb) (0) +# define pm_unregister(cb) (0) # define pm_activity(domain,prio) # define pm_checkstate(domain) (0) # define pm_changestate(domain,state)