Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/i2c FDT-ize X-Powers AXP805/806 PMIC dr...
details: https://anonhg.NetBSD.org/src/rev/86daf52f656d
branches: trunk
changeset: 318670:86daf52f656d
user: jmcneill <jmcneill%NetBSD.org@localhost>
date: Thu May 03 01:15:49 2018 +0000
description:
FDT-ize X-Powers AXP805/806 PMIC driver.
diffstat:
sys/dev/i2c/axp806.c | 362 +++++++++++++++++++++++++------------------------
sys/dev/i2c/axp806.h | 41 -----
sys/dev/i2c/files.i2c | 10 +-
3 files changed, 189 insertions(+), 224 deletions(-)
diffs (truncated from 545 to 300 lines):
diff -r 355dd91683fe -r 86daf52f656d sys/dev/i2c/axp806.c
--- a/sys/dev/i2c/axp806.c Thu May 03 01:14:54 2018 +0000
+++ b/sys/dev/i2c/axp806.c Thu May 03 01:15:49 2018 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: axp806.c,v 1.1 2014/12/07 00:33:26 jmcneill Exp $ */
+/* $NetBSD: axp806.c,v 1.2 2018/05/03 01:15:49 jmcneill Exp $ */
/*-
- * Copyright (c) 2014 Jared D. McNeill <jmcneill%invisible.ca@localhost>
+ * Copyright (c) 2014-2018 Jared McNeill <jmcneill%invisible.ca@localhost>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,10 +26,8 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#define AXP_DEBUG
-
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: axp806.c,v 1.1 2014/12/07 00:33:26 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: axp806.c,v 1.2 2018/05/03 01:15:49 jmcneill Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -40,7 +38,8 @@
#include <sys/kmem.h>
#include <dev/i2c/i2cvar.h>
-#include <dev/i2c/axp806.h>
+
+#include <dev/fdt/fdtvar.h>
#define AXP_STARTUP_SOURCE_REG 0x00
#define AXP_IC_TYPE_REG 0x03
@@ -117,35 +116,35 @@
.c_voltage_reg = AXP_##vreg##_REG, .c_voltage_mask = (vmask) }
static const struct axp806_ctrl axp806_ctrls[] = {
- AXP_CTRL2("DCDCA", 600, 1520, 10, 51, 20, 21,
+ AXP_CTRL2("dcdca", 600, 1520, 10, 51, 20, 21,
OUT_CTRL1, __BIT(0), DCDCA_CTRL, __BITS(6,0)),
- AXP_CTRL("DCDCB", 1000, 2550, 50,
+ AXP_CTRL("dcdcb", 1000, 2550, 50,
OUT_CTRL1, __BIT(1), DCDCB_CTRL, __BITS(4,0)),
- AXP_CTRL2("DCDCC", 600, 1520, 10, 51, 20, 21,
+ AXP_CTRL2("dcdcc", 600, 1520, 10, 51, 20, 21,
OUT_CTRL1, __BIT(2), DCDCC_CTRL, __BITS(6,0)),
- AXP_CTRL2("DCDCD", 600, 3300, 20, 46, 100, 18,
+ AXP_CTRL2("dcdcd", 600, 3300, 20, 46, 100, 18,
OUT_CTRL1, __BIT(3), DCDCD_CTRL, __BITS(5,0)),
- AXP_CTRL("DCDCE", 1100, 3400, 100,
+ AXP_CTRL("dcdce", 1100, 3400, 100,
OUT_CTRL1, __BIT(4), DCDCE_CTRL, __BITS(4,0)),
- AXP_CTRL("ALDO1", 700, 3300, 100,
+ AXP_CTRL("aldo1", 700, 3300, 100,
OUT_CTRL1, __BIT(5), ALDO1_CTRL, __BITS(4,0)),
- AXP_CTRL("ALDO2", 700, 3400, 100,
+ AXP_CTRL("aldo2", 700, 3400, 100,
OUT_CTRL1, __BIT(6), ALDO2_CTRL, __BITS(4,0)),
- AXP_CTRL("ALDO3", 700, 3300, 100,
+ AXP_CTRL("aldo3", 700, 3300, 100,
OUT_CTRL1, __BIT(7), ALDO3_CTRL, __BITS(4,0)),
- AXP_CTRL("BLDO1", 700, 1900, 100,
+ AXP_CTRL("bldo1", 700, 1900, 100,
OUT_CTRL2, __BIT(0), BLDO1_CTRL, __BITS(3,0)),
- AXP_CTRL("BLDO2", 700, 1900, 100,
+ AXP_CTRL("bldo2", 700, 1900, 100,
OUT_CTRL2, __BIT(1), BLDO2_CTRL, __BITS(3,0)),
- AXP_CTRL("BLDO3", 700, 1900, 100,
+ AXP_CTRL("bldo3", 700, 1900, 100,
OUT_CTRL2, __BIT(2), BLDO3_CTRL, __BITS(3,0)),
- AXP_CTRL("BLDO4", 700, 1900, 100,
+ AXP_CTRL("bldo4", 700, 1900, 100,
OUT_CTRL2, __BIT(3), BLDO4_CTRL, __BITS(3,0)),
- AXP_CTRL("CLDO1", 700, 3300, 100,
+ AXP_CTRL("cldo1", 700, 3300, 100,
OUT_CTRL2, __BIT(4), CLDO1_CTRL, __BITS(4,0)),
- AXP_CTRL2("CLDO2", 700, 4200, 100, 28, 200, 4,
+ AXP_CTRL2("cldo2", 700, 4200, 100, 28, 200, 4,
OUT_CTRL2, __BIT(5), CLDO2_CTRL, __BITS(4,0)),
- AXP_CTRL("CLDO3", 700, 3300, 100,
+ AXP_CTRL("cldo3", 700, 3300, 100,
OUT_CTRL2, __BIT(6), CLDO3_CTRL, __BITS(4,0)),
};
@@ -153,117 +152,47 @@
device_t sc_dev;
i2c_tag_t sc_i2c;
i2c_addr_t sc_addr;
+ int sc_phandle;
+};
- u_int sc_nctrl;
- struct axp806_ctrl *sc_ctrl;
+struct axp806reg_softc {
+ device_t sc_dev;
+ i2c_tag_t sc_i2c;
+ i2c_addr_t sc_addr;
+ const struct axp806_ctrl *sc_ctrl;
};
-static int axp806_match(device_t, cfdata_t, void *);
-static void axp806_attach(device_t, device_t, void *);
+struct axp806reg_attach_args {
+ const struct axp806_ctrl *reg_ctrl;
+ int reg_phandle;
+ i2c_tag_t reg_i2c;
+ i2c_addr_t reg_addr;
+};
-static int axp806_read(struct axp806_softc *, uint8_t, uint8_t *);
-static int axp806_write(struct axp806_softc *, uint8_t, uint8_t);
-
-static void axp806_print(struct axp806_ctrl *c);
-
-CFATTACH_DECL_NEW(axp806pm, sizeof(struct axp806_softc),
- axp806_match, axp806_attach, NULL, NULL);
+static const char *compatible[] = {
+ "x-powers,axp805",
+ "x-powers,axp806",
+ NULL
+};
static int
-axp806_match(device_t parent, cfdata_t match, void *aux)
-{
- return 1;
-}
-
-static void
-axp806_attach(device_t parent, device_t self, void *aux)
+axp806_read(i2c_tag_t tag, i2c_addr_t addr, uint8_t reg, uint8_t *val)
{
- struct axp806_softc *sc = device_private(self);
- struct i2c_attach_args *ia = aux;
- u_int n;
-
- sc->sc_dev = self;
- sc->sc_i2c = ia->ia_tag;
- sc->sc_addr = ia->ia_addr;
-
- aprint_naive("\n");
- aprint_normal("\n");
-
- sc->sc_nctrl = __arraycount(axp806_ctrls);
- sc->sc_ctrl = kmem_alloc(sizeof(axp806_ctrls), KM_SLEEP);
- memcpy(sc->sc_ctrl, axp806_ctrls, sizeof(axp806_ctrls));
- for (n = 0; n < sc->sc_nctrl; n++) {
- sc->sc_ctrl[n].c_dev = self;
- }
-
-#ifdef AXP_DEBUG
- for (n = 0; n < sc->sc_nctrl; n++) {
- axp806_print(&sc->sc_ctrl[n]);
- }
-#endif
-}
-
-static int
-axp806_read(struct axp806_softc *sc, uint8_t reg, uint8_t *val)
-{
- return iic_smbus_read_byte(sc->sc_i2c, sc->sc_addr, reg, val,
+ return iic_smbus_read_byte(tag, addr, reg, val,
cold ? I2C_F_POLL : 0);
}
static int
-axp806_write(struct axp806_softc *sc, uint8_t reg, uint8_t val)
+axp806_write(i2c_tag_t tag, i2c_addr_t addr, uint8_t reg, uint8_t val)
{
- return iic_smbus_write_byte(sc->sc_i2c, sc->sc_addr, reg, val,
+ return iic_smbus_write_byte(tag, addr, reg, val,
cold ? I2C_F_POLL : 0);
}
-static void
-axp806_print(struct axp806_ctrl *c)
+static int
+axp806_set_voltage(i2c_tag_t tag, i2c_addr_t addr, const struct axp806_ctrl *c, u_int min, u_int max)
{
- struct axp806_softc *sc = device_private(c->c_dev);
- u_int voltage;
- bool enabled;
-
- device_printf(sc->sc_dev, "%s:", c->c_name);
- if (c->c_voltage_reg) {
- if (axp806_get_voltage(c, &voltage)) {
- printf(" [??? V]");
- } else {
- printf(" [%d.%03dV]", voltage / 1000,
- voltage % 1000);
- }
- }
- if (c->c_enable_reg) {
- if (axp806_is_enabled(c, &enabled)) {
- printf(" [unknown state]");
- } else {
- printf(" [%s]", enabled ? "ON" : "OFF");
- }
- }
- printf("\n");
-}
-
-struct axp806_ctrl *
-axp806_lookup(device_t dev, const char *name)
-{
- struct axp806_softc *sc = device_private(dev);
- struct axp806_ctrl *c;
- u_int n;
-
- for (n = 0; n < sc->sc_nctrl; n++) {
- c = &sc->sc_ctrl[n];
- if (strcmp(c->c_name, name) == 0) {
- return c;
- }
- }
-
- return NULL;
-}
-
-int
-axp806_set_voltage(struct axp806_ctrl *c, u_int min, u_int max)
-{
- struct axp806_softc *sc = device_private(c->c_dev);
+ const int flags = (cold ? I2C_F_POLL : 0);
u_int vol, reg_val;
int nstep, error;
uint8_t val;
@@ -290,35 +219,30 @@
if (vol > max)
return EINVAL;
- iic_acquire_bus(sc->sc_i2c, 0);
- if ((error = axp806_read(sc, c->c_voltage_reg, &val)) != 0)
- goto done;
- val &= ~c->c_voltage_mask;
- val |= __SHIFTIN(reg_val, c->c_voltage_mask);
- error = axp806_write(sc, c->c_voltage_reg, val);
+ iic_acquire_bus(tag, flags);
+ if ((error = axp806_read(tag, addr, c->c_voltage_reg, &val)) == 0) {
+ val &= ~c->c_voltage_mask;
+ val |= __SHIFTIN(reg_val, c->c_voltage_mask);
+ error = axp806_write(tag, addr, c->c_voltage_reg, val);
+ }
+ iic_release_bus(tag, flags);
-done:
- iic_release_bus(sc->sc_i2c, 0);
-#ifdef AXP_DEBUG
- if (error == 0)
- axp806_print(c);
-#endif
return error;
}
-int
-axp806_get_voltage(struct axp806_ctrl *c, u_int *pvol)
+static int
+axp806_get_voltage(i2c_tag_t tag, i2c_addr_t addr, const struct axp806_ctrl *c, u_int *pvol)
{
- struct axp806_softc *sc = device_private(c->c_dev);
+ const int flags = (cold ? I2C_F_POLL : 0);
int reg_val, error;
uint8_t val;
if (!c->c_voltage_mask)
return EINVAL;
- iic_acquire_bus(sc->sc_i2c, 0);
- error = axp806_read(sc, c->c_voltage_reg, &val);
- iic_release_bus(sc->sc_i2c, 0);
+ iic_acquire_bus(tag, flags);
+ error = axp806_read(tag, addr, c->c_voltage_reg, &val);
+ iic_release_bus(tag, flags);
if (error)
return error;
@@ -333,72 +257,152 @@
return 0;
}
-int
-axp806_is_enabled(struct axp806_ctrl *c, bool *penabled)
+static int
+axp806_match(device_t parent, cfdata_t match, void *aux)
{
- struct axp806_softc *sc = device_private(c->c_dev);
- uint8_t val;
- int error;
+ struct i2c_attach_args *ia = aux;
+
+ if (ia->ia_name != NULL)
+ return iic_compat_match(ia, compatible);
+
+ return 1;
+}
+
+static void
+axp806_attach(device_t parent, device_t self, void *aux)
Home |
Main Index |
Thread Index |
Old Index