95 lines
1.4 KiB
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;
|
|
}
|