xmas-snoopy/firmware/main/pmu.c

95 lines
1.4 KiB
C

/*
* pmu.c
*
* Copyright (C) 2022 Sylvain Munaut <tnt@246tNt.com>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#include "config.h"
#include "pmu.h"
struct wb_pmu {
uint32_t ctrl;
uint32_t stat;
} __attribute__((packed,aligned(4)));
#define PMU_CTRL_SYS_SHUTDOWN (1 << 7)
#define PMU_CTRL_SYS_SUSPEND (1 << 6)
#define PMU_CTRL_USB_OFF (1 << 5)
#define PMU_CTRL_USB_ON (1 << 4)
#define PMU_CTRL_BOOT_EXEC (1 << 2)
#define PMU_CTRL_BOOT_SEL(n) (((n) & 3) << 0)
#define PMU_STAT_USB (1 << 4)
#define PMU_STAT_CHARGING (1 << 3)
#define PMU_STAT_VBUS (1 << 2)
#define PMU_STAT_BTN_MSK (3 << 0)
static volatile struct wb_pmu * const pmu_regs= (void*)(PMU_BASE);
void
pmu_sys_suspend(void)
{
pmu_regs->ctrl = PMU_CTRL_SYS_SUSPEND;
}
void
pmu_sys_shutdown(void)
{
pmu_regs->ctrl = PMU_CTRL_SYS_SHUTDOWN;
}
void
pmu_sys_reboot(int n)
{
pmu_regs->ctrl = PMU_CTRL_BOOT_SEL(n) | PMU_CTRL_BOOT_EXEC;
}
void
pmu_usb_enable(void)
{
pmu_regs->ctrl = PMU_CTRL_USB_ON;
}
void
pmu_usb_disable(void)
{
pmu_regs->ctrl = PMU_CTRL_USB_OFF;
}
void
pmu_usb_set_state(bool state)
{
pmu_regs->ctrl = state ? PMU_CTRL_USB_ON : PMU_CTRL_USB_OFF;
}
bool
pmu_usb_state(void)
{
return !!(pmu_regs->stat & PMU_STAT_USB);
}
bool
pmu_is_charging(void)
{
return !!(pmu_regs->stat & PMU_STAT_CHARGING);
}
bool
pmu_is_vbus_present(void)
{
return !!(pmu_regs->stat & PMU_STAT_VBUS);
}
uint8_t
pmu_get_buttons(void)
{
return pmu_regs->stat & PMU_STAT_BTN_MSK;
}