svn commit: r344219 - head/sys/arm/allwinner
Ganbold Tsagaankhuu
ganbold at FreeBSD.org
Sun Feb 17 01:16:28 UTC 2019
Author: ganbold
Date: Sun Feb 17 01:16:27 2019
New Revision: 344219
URL: https://svnweb.freebsd.org/changeset/base/344219
Log:
Add sysctl for setting battery charging current.
The charging current can be set using steps
from 0: 200mA to 13: 2800mA (200mA/step).
While there, fix battery charging current related
sensor descriptions.
Reviewed by: manu
Differential Revision: https://reviews.freebsd.org/D19212
Modified:
head/sys/arm/allwinner/axp81x.c
Modified: head/sys/arm/allwinner/axp81x.c
==============================================================================
--- head/sys/arm/allwinner/axp81x.c Sat Feb 16 23:57:38 2019 (r344218)
+++ head/sys/arm/allwinner/axp81x.c Sun Feb 17 01:16:27 2019 (r344219)
@@ -120,6 +120,10 @@ MALLOC_DEFINE(M_AXP8XX_REG, "AXP8xx regulator", "AXP8x
#define AXP_VOLTCTL_MASK 0x7f
#define AXP_POWERBAT 0x32
#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_ACIN_HI (1 << 6)
#define AXP_IRQEN1_ACIN_LO (1 << 5)
@@ -614,13 +618,13 @@ static const struct axp8xx_sensors axp8xx_common_senso
.id = AXP_SENSOR_BATT_CHARGE_CURRENT,
.name = "batchargecurrent",
.format = "I",
- .desc = "Battery Charging Current",
+ .desc = "Average Battery Charging Current",
},
{
.id = AXP_SENSOR_BATT_DISCHARGE_CURRENT,
.name = "batdischargecurrent",
.format = "I",
- .desc = "Battery Discharging Current",
+ .desc = "Average Battery Discharging Current",
},
{
.id = AXP_SENSOR_BATT_CAPACITY_PERCENT,
@@ -890,6 +894,33 @@ axp8xx_shutdown(void *devp, int howto)
}
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)
{
struct axp8xx_softc *sc;
@@ -1482,6 +1513,16 @@ axp8xx_attach(device_t dev)
sc->sensors[i].format,
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 */
if (axp8xx_read(dev, AXP_BAT_CAP_WARN, &val, 1) == 0) {
More information about the svn-src-all
mailing list