/* * pmu.c * * Copyright (C) 2022 Sylvain Munaut * 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; }