Remove comment related to another uC
[lpc82x] / core / pmu.c
1 /****************************************************************************
2  *   core/pmu.c
3  *
4  * Sleep, deep sleep, power-down and deep power-down control.
5  *
6  * Copyright 2012 Nathael Pajani <nathael.pajani@ed3l.fr>
7  *
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  *
22  *************************************************************************** */
25 #include "lib/stdint.h"
27 #include "core/lpc_regs.h"
28 #include "core/lpc_core.h"
29 #include "core/system.h"
30 #include "core/pmu.h"
31 #include "lib/errno.h"
36 /* PMU unit */
37 int save_gp_retain(uint32_t* values, uint8_t nb, uint8_t offset)
38 {
39         struct lpc_pm_unit* pmu = LPC_PMU;
40         int i = 0;
42         if ((offset + nb) > 4) {
43                 return -EINVAL;
44         }
45         for (i = 0; i < nb; i++) {
46                 pmu->gp_data[offset + i] = values[i];
47         }
48         return 0;
49 }
51 int read_gp_retain(uint32_t* values, uint8_t nb, uint8_t offset)
52 {
53         struct lpc_pm_unit* pmu = LPC_PMU;
54         int i = 0;
56         if ((offset + nb) > 4) {
57                 return -EINVAL;
58         }
59         for (i = 0; i < nb; i++) {
60                 values[i] = pmu->gp_data[offset + i];
61         }
62         return 0;
63 }
66 /* Enter simplest sleep state
67  * - Return to thread mode after interrupt or event
68  * - do not enter "deep" sleep or power-down mode
69  * - if "wake_sources_is_all_intrs" is set to 1, also wake up from unconfigured
70  *   interrupt sources
71  * This function returns after the next interrupt or event.
72  */
73 void enter_sleep(int wake_sources_is_all_intrs)
74 {
75         struct syst_ctrl_block_regs* scb = LPC_SCB;
77         /* Configure SCR for sleep mode */
78         if (wake_sources_is_all_intrs == 1) {
79                 scb->scr = SCB_SCR_SEVONPEND; /* Wakeup from any interrupt, even those not enabled */
80         } else {
81                 scb->scr = 0;
82         }
83         wfe();
84 }
87 /* Enter deep sleep.
88  * NOTE : entering deep sleep implies a lot of side effects. I'll try to list them all here
89  *  so this can be done right.
90  *
91  */
92 void enter_deep_sleep(void)
93 {
94         struct lpc_sys_config* sys_config = LPC_SYS_CONFIG;
96         /* Ask for the same clock status when waking up */
97         sys_config->powerdown_wake_cfg = sys_config->powerdown_run_cfg;
98         /* Set deep_sleep config */
99         if (system_brown_out_detection_enabled()) {
100                 sys_config->powerdown_sleep_cfg = LPC_DEEP_SLEEP_CFG_NOWDTLOCK_BOD_ON;
101         } else {
102                 sys_config->powerdown_sleep_cfg = LPC_DEEP_SLEEP_CFG_NOWDTLOCK_BOD_OFF;
103         }
104         /* Enter deep sleep */
105         /* FIXME */