| 951 | } |
| 952 | |
| 953 | static int |
| 954 | axp8xx_sysctl(SYSCTL_HANDLER_ARGS) |
| 955 | { |
| 956 | struct axp8xx_softc *sc; |
| 957 | device_t dev = arg1; |
| 958 | enum axp8xx_sensor sensor = arg2; |
| 959 | const struct axp8xx_config *c; |
| 960 | uint8_t data; |
| 961 | int val, i, found, batt_val; |
| 962 | uint8_t lo, hi; |
| 963 | |
| 964 | sc = device_get_softc(dev); |
| 965 | c = sc->config; |
| 966 | |
| 967 | for (found = 0, i = 0; i < sc->nsensors; i++) { |
| 968 | if (sc->sensors[i].id == sensor) { |
| 969 | found = 1; |
| 970 | break; |
| 971 | } |
| 972 | } |
| 973 | |
| 974 | if (found == 0) |
| 975 | return (ENOENT); |
| 976 | |
| 977 | switch (sensor) { |
| 978 | case AXP_SENSOR_ACIN_PRESENT: |
| 979 | if (axp8xx_read(dev, AXP_POWERSRC, &data, 1) == 0) |
| 980 | val = !!(data & AXP_POWERSRC_ACIN); |
| 981 | break; |
| 982 | case AXP_SENSOR_VBUS_PRESENT: |
| 983 | if (axp8xx_read(dev, AXP_POWERSRC, &data, 1) == 0) |
| 984 | val = !!(data & AXP_POWERSRC_VBUS); |
| 985 | break; |
| 986 | case AXP_SENSOR_BATT_PRESENT: |
| 987 | if (axp8xx_read(dev, AXP_POWERMODE, &data, 1) == 0) { |
| 988 | if (data & AXP_POWERMODE_BAT_VALID) |
| 989 | val = !!(data & AXP_POWERMODE_BAT_PRESENT); |
| 990 | } |
| 991 | break; |
| 992 | case AXP_SENSOR_BATT_CHARGING: |
| 993 | if (axp8xx_read(dev, AXP_POWERMODE, &data, 1) == 0) |
| 994 | val = !!(data & AXP_POWERMODE_BAT_CHARGING); |
| 995 | break; |
| 996 | case AXP_SENSOR_BATT_CHARGE_STATE: |
| 997 | if (axp8xx_read(dev, AXP_BAT_CAP, &data, 1) == 0 && |
| 998 | (data & AXP_BAT_CAP_VALID) != 0) { |
| 999 | batt_val = (data & AXP_BAT_CAP_PERCENT); |
| 1000 | if (batt_val <= sc->shut_thres) |
| 1001 | val = BATT_CAPACITY_CRITICAL; |
| 1002 | else if (batt_val <= sc->warn_thres) |
| 1003 | val = BATT_CAPACITY_WARNING; |
| 1004 | else |
| 1005 | val = BATT_CAPACITY_NORMAL; |
| 1006 | } |
| 1007 | break; |
| 1008 | case AXP_SENSOR_BATT_CAPACITY_PERCENT: |
| 1009 | if (axp8xx_read(dev, AXP_BAT_CAP, &data, 1) == 0 && |
| 1010 | (data & AXP_BAT_CAP_VALID) != 0) |
nothing calls this directly
no test coverage detected