diff options
Diffstat (limited to 'arch/riscv32/soc/pulpino/pulpino_idle.c')
-rw-r--r-- | arch/riscv32/soc/pulpino/pulpino_idle.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/arch/riscv32/soc/pulpino/pulpino_idle.c b/arch/riscv32/soc/pulpino/pulpino_idle.c new file mode 100644 index 000000000..d95086e96 --- /dev/null +++ b/arch/riscv32/soc/pulpino/pulpino_idle.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2016 Jean-Paul Etienne <fractalclone@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <toolchain.h> +#include <irq.h> +#include <soc.h> + +#include <logging/kernel_event_logger.h> + +static ALWAYS_INLINE void pulpino_idle(unsigned int key) +{ +#ifdef CONFIG_KERNEL_EVENT_LOGGER_SLEEP + _sys_k_event_logger_enter_sleep(); +#endif + /* unlock interrupts */ + irq_unlock(key); + + /* Put CPU core to sleep via SCR register */ + PULP_SCR = 0x01; + + /* Wait for interrupt */ + SOC_WFI; +} + +/** + * + * @brief Power save idle routine + * + * This function will be called by the kernel idle loop or possibly within + * an implementation of _sys_power_save_idle in the microkernel when the + * '_sys_power_save_flag' variable is non-zero. + * + * @return N/A + */ +void k_cpu_idle(void) +{ + pulpino_idle(SOC_MSTATUS_IEN); +} + +/** + * + * @brief Atomically re-enable interrupts and enter low power mode + * + * INTERNAL + * The requirements for k_cpu_atomic_idle() are as follows: + * 1) The enablement of interrupts and entering a low-power mode needs to be + * atomic, i.e. there should be no period of time where interrupts are + * enabled before the processor enters a low-power mode. See the comments + * in k_lifo_get(), for example, of the race condition that + * occurs if this requirement is not met. + * + * 2) After waking up from the low-power mode, the interrupt lockout state + * must be restored as indicated in the 'imask' input parameter. + * + * @return N/A + */ +void k_cpu_atomic_idle(unsigned int key) +{ + pulpino_idle(key); +} |