6
* @author Alexander Kalmuk
14
#include <hw_watchdog.h>
16
#include <sys_clock_mgr.h>
17
#include <sys_power_mgr.h>
21
#include <framework/mod/options.h>
22
#include <hal/cpu_idle.h>
25
#include <kernel/irq.h>
26
#include <kernel/time/clock_source.h>
27
#include <kernel/time/time.h>
30
#include <config/custom_config_qspi.h>
32
extern const struct clock_source *cs_jiffies;
34
static void switch_jiffies_to(int freq) {
35
struct clock_source *cs = (struct clock_source *)cs_jiffies;
36
struct time_counter_device *cd = cs->counter_device;
40
clock_source_set_periodic(cs, clock_freq());
43
void clk_update_hook(void) {
44
static uint16_t cur_clk = 1 << CRG_TOP_CLK_CTRL_REG_RUNNING_AT_XTAL32M_Pos;
48
((1 << CRG_TOP_CLK_CTRL_REG_RUNNING_AT_LP_CLK_Pos) \
49
| (1 << CRG_TOP_CLK_CTRL_REG_RUNNING_AT_RC32M_Pos) \
50
| (1 << CRG_TOP_CLK_CTRL_REG_RUNNING_AT_XTAL32M_Pos) \
51
| (1 << CRG_TOP_CLK_CTRL_REG_RUNNING_AT_PLL96M_Pos))
53
clk = CRG_TOP->CLK_CTRL_REG & FREQ_MASK;
56
case (1 << CRG_TOP_CLK_CTRL_REG_RUNNING_AT_XTAL32M_Pos):
58
switch_jiffies_to(32000000);
61
case (1 << CRG_TOP_CLK_CTRL_REG_RUNNING_AT_PLL96M_Pos):
63
switch_jiffies_to(96000000);
66
case (1 << CRG_TOP_CLK_CTRL_REG_RUNNING_AT_LP_CLK_Pos):
67
case (1 << CRG_TOP_CLK_CTRL_REG_RUNNING_AT_RC32M_Pos):
77
extern int deepsleep_enter(void);
79
static uint32_t arch_deepsleep_flags = 0;
81
void arch_deepsleep_disable(uint32_t mask) {
85
arch_deepsleep_flags |= mask;
89
void arch_deepsleep_enable(uint32_t mask) {
93
{ arch_deepsleep_flags &= ~mask; }
97
static uint32_t arch_deepsleep_start(ipl_t *ipl) {
100
return arch_deepsleep_flags;
103
static void arch_deepsleep_finish(ipl_t ipl) {
107
void arch_cpu_idle(void) {
112
if (arch_deepsleep_start(&ipl)) {
113
__asm__ __volatile__("wfi");
118
arch_deepsleep_finish(ipl);