Changeset View
Changeset View
Standalone View
Standalone View
head/sys/arm/allwinner/axp81x.c
Show First 20 Lines • Show All 114 Lines • ▼ Show 20 Lines | |||||
#define AXP_VOLTCTL_DCDC7 0x26 | #define AXP_VOLTCTL_DCDC7 0x26 | ||||
#define AXP_VOLTCTL_ALDO1 0x28 | #define AXP_VOLTCTL_ALDO1 0x28 | ||||
#define AXP_VOLTCTL_ALDO2 0x29 | #define AXP_VOLTCTL_ALDO2 0x29 | ||||
#define AXP_VOLTCTL_ALDO3 0x2A | #define AXP_VOLTCTL_ALDO3 0x2A | ||||
#define AXP_VOLTCTL_STATUS (1 << 7) | #define AXP_VOLTCTL_STATUS (1 << 7) | ||||
#define AXP_VOLTCTL_MASK 0x7f | #define AXP_VOLTCTL_MASK 0x7f | ||||
#define AXP_POWERBAT 0x32 | #define AXP_POWERBAT 0x32 | ||||
#define AXP_POWERBAT_SHUTDOWN (1 << 7) | #define AXP_POWERBAT_SHUTDOWN (1 << 7) | ||||
#define AXP_CHARGERCTL1 0x33 | |||||
#define AXP_CHARGERCTL1_MIN 0 | |||||
#define AXP_CHARGERCTL1_MAX 13 | |||||
#define AXP_CHARGERCTL1_CMASK 0xf | |||||
#define AXP_IRQEN1 0x40 | #define AXP_IRQEN1 0x40 | ||||
#define AXP_IRQEN1_ACIN_HI (1 << 6) | #define AXP_IRQEN1_ACIN_HI (1 << 6) | ||||
#define AXP_IRQEN1_ACIN_LO (1 << 5) | #define AXP_IRQEN1_ACIN_LO (1 << 5) | ||||
#define AXP_IRQEN1_VBUS_HI (1 << 3) | #define AXP_IRQEN1_VBUS_HI (1 << 3) | ||||
#define AXP_IRQEN1_VBUS_LO (1 << 2) | #define AXP_IRQEN1_VBUS_LO (1 << 2) | ||||
#define AXP_IRQEN2 0x41 | #define AXP_IRQEN2 0x41 | ||||
#define AXP_IRQEN2_BAT_IN (1 << 7) | #define AXP_IRQEN2_BAT_IN (1 << 7) | ||||
#define AXP_IRQEN2_BAT_NO (1 << 6) | #define AXP_IRQEN2_BAT_NO (1 << 6) | ||||
▲ Show 20 Lines • Show All 478 Lines • ▼ Show 20 Lines | static const struct axp8xx_sensors axp8xx_common_sensors[] = { | ||||
.name = "batvolt", | .name = "batvolt", | ||||
.format = "I", | .format = "I", | ||||
.desc = "Battery Voltage", | .desc = "Battery Voltage", | ||||
}, | }, | ||||
{ | { | ||||
.id = AXP_SENSOR_BATT_CHARGE_CURRENT, | .id = AXP_SENSOR_BATT_CHARGE_CURRENT, | ||||
.name = "batchargecurrent", | .name = "batchargecurrent", | ||||
.format = "I", | .format = "I", | ||||
.desc = "Battery Charging Current", | .desc = "Average Battery Charging Current", | ||||
}, | }, | ||||
{ | { | ||||
.id = AXP_SENSOR_BATT_DISCHARGE_CURRENT, | .id = AXP_SENSOR_BATT_DISCHARGE_CURRENT, | ||||
.name = "batdischargecurrent", | .name = "batdischargecurrent", | ||||
.format = "I", | .format = "I", | ||||
.desc = "Battery Discharging Current", | .desc = "Average Battery Discharging Current", | ||||
}, | }, | ||||
{ | { | ||||
.id = AXP_SENSOR_BATT_CAPACITY_PERCENT, | .id = AXP_SENSOR_BATT_CAPACITY_PERCENT, | ||||
.name = "batcapacitypercent", | .name = "batcapacitypercent", | ||||
.format = "I", | .format = "I", | ||||
.desc = "Battery Capacity Percentage", | .desc = "Battery Capacity Percentage", | ||||
}, | }, | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 253 Lines • ▼ Show 20 Lines | axp8xx_shutdown(void *devp, int howto) | ||||
if (bootverbose) | if (bootverbose) | ||||
device_printf(dev, "Shutdown Axp8xx\n"); | device_printf(dev, "Shutdown Axp8xx\n"); | ||||
axp8xx_write(dev, AXP_POWERBAT, AXP_POWERBAT_SHUTDOWN); | axp8xx_write(dev, AXP_POWERBAT, AXP_POWERBAT_SHUTDOWN); | ||||
} | } | ||||
static int | static int | ||||
axp8xx_sysctl_chargecurrent(SYSCTL_HANDLER_ARGS) | |||||
{ | |||||
device_t dev = arg1; | |||||
uint8_t data; | |||||
int val, error; | |||||
error = axp8xx_read(dev, AXP_CHARGERCTL1, &data, 1); | |||||
if (error != 0) | |||||
return (error); | |||||
if (bootverbose) | |||||
device_printf(dev, "Raw CHARGECTL1 val: 0x%0x\n", data); | |||||
val = (data & AXP_CHARGERCTL1_CMASK); | |||||
error = sysctl_handle_int(oidp, &val, 0, req); | |||||
if (error || !req->newptr) /* error || read request */ | |||||
return (error); | |||||
if ((val < AXP_CHARGERCTL1_MIN) || (val > AXP_CHARGERCTL1_MAX)) | |||||
return (EINVAL); | |||||
val |= (data & (AXP_CHARGERCTL1_CMASK << 4)); | |||||
axp8xx_write(dev, AXP_CHARGERCTL1, val); | |||||
return (0); | |||||
} | |||||
static int | |||||
axp8xx_sysctl(SYSCTL_HANDLER_ARGS) | axp8xx_sysctl(SYSCTL_HANDLER_ARGS) | ||||
{ | { | ||||
struct axp8xx_softc *sc; | struct axp8xx_softc *sc; | ||||
device_t dev = arg1; | device_t dev = arg1; | ||||
enum axp8xx_sensor sensor = arg2; | enum axp8xx_sensor sensor = arg2; | ||||
const struct axp8xx_config *c; | const struct axp8xx_config *c; | ||||
uint8_t data; | uint8_t data; | ||||
int val, i, found, batt_val; | int val, i, found, batt_val; | ||||
▲ Show 20 Lines • Show All 576 Lines • ▼ Show 20 Lines | for (i = 0; i < sc->nsensors; i++) { | ||||
SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | ||||
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | ||||
OID_AUTO, sc->sensors[i].name, | OID_AUTO, sc->sensors[i].name, | ||||
CTLTYPE_INT | CTLFLAG_RD, | CTLTYPE_INT | CTLFLAG_RD, | ||||
dev, sc->sensors[i].id, axp8xx_sysctl, | dev, sc->sensors[i].id, axp8xx_sysctl, | ||||
sc->sensors[i].format, | sc->sensors[i].format, | ||||
sc->sensors[i].desc); | sc->sensors[i].desc); | ||||
} | } | ||||
SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | |||||
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | |||||
OID_AUTO, "batchargecurrentstep", | |||||
CTLTYPE_INT | CTLFLAG_RW, | |||||
dev, 0, axp8xx_sysctl_chargecurrent, | |||||
"I", "Battery Charging Current Step, " | |||||
"0: 200mA, 1: 400mA, 2: 600mA, 3: 800mA, " | |||||
"4: 1000mA, 5: 1200mA, 6: 1400mA, 7: 1600mA, " | |||||
"8: 1800mA, 9: 2000mA, 10: 2200mA, 11: 2400mA, " | |||||
"12: 2600mA, 13: 2800mA"); | |||||
/* Get thresholds */ | /* Get thresholds */ | ||||
if (axp8xx_read(dev, AXP_BAT_CAP_WARN, &val, 1) == 0) { | if (axp8xx_read(dev, AXP_BAT_CAP_WARN, &val, 1) == 0) { | ||||
sc->warn_thres = (val & AXP_BAT_CAP_WARN_LV1) >> 4; | sc->warn_thres = (val & AXP_BAT_CAP_WARN_LV1) >> 4; | ||||
sc->shut_thres = (val & AXP_BAT_CAP_WARN_LV2); | sc->shut_thres = (val & AXP_BAT_CAP_WARN_LV2); | ||||
if (bootverbose) { | if (bootverbose) { | ||||
device_printf(dev, | device_printf(dev, | ||||
"Raw reg val: 0x%02x\n", val); | "Raw reg val: 0x%02x\n", val); | ||||
▲ Show 20 Lines • Show All 86 Lines • Show Last 20 Lines |