Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/i2c Add support for AXP813 and only allow one consum...



details:   https://anonhg.NetBSD.org/src/rev/43dff713b2af
branches:  trunk
changeset: 447163:43dff713b2af
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Wed Jan 02 17:28:55 2019 +0000

description:
Add support for AXP813 and only allow one consumer per regulator at a time

diffstat:

 sys/dev/i2c/axppmic.c |  76 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 74 insertions(+), 2 deletions(-)

diffs (133 lines):

diff -r 8aa75377a41b -r 43dff713b2af sys/dev/i2c/axppmic.c
--- a/sys/dev/i2c/axppmic.c     Wed Jan 02 17:28:18 2019 +0000
+++ b/sys/dev/i2c/axppmic.c     Wed Jan 02 17:28:55 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: axppmic.c,v 1.16 2018/11/13 19:06:05 jakllsch Exp $ */
+/* $NetBSD: axppmic.c,v 1.17 2019/01/02 17:28:55 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014-2018 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -27,12 +27,13 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: axppmic.c,v 1.16 2018/11/13 19:06:05 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: axppmic.c,v 1.17 2019/01/02 17:28:55 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/device.h>
+#include <sys/atomic.h>
 #include <sys/conf.h>
 #include <sys/bus.h>
 #include <sys/kmem.h>
@@ -202,6 +203,47 @@
                0x11, __BIT(6), 0x26, __BITS(4,0)),
 };
 
+static const struct axppmic_ctrl axp813_ctrls[] = {
+       AXP_CTRL("dldo1", 700, 3300, 100,
+               0x12, __BIT(3), 0x15, __BITS(4,0)),
+       AXP_CTRL2("dldo2", 700, 4200, 100, 28, 200, 4,
+               0x12, __BIT(4), 0x16, __BITS(4,0)),
+       AXP_CTRL("dldo3", 700, 3300, 100,
+               0x12, __BIT(5), 0x17, __BITS(4,0)),
+       AXP_CTRL("dldo4", 700, 3300, 100,
+               0x12, __BIT(6), 0x18, __BITS(4,0)),
+       AXP_CTRL("eldo1", 700, 1900, 50,
+               0x12, __BIT(0), 0x19, __BITS(4,0)),
+       AXP_CTRL("eldo2", 700, 1900, 50,
+               0x12, __BIT(1), 0x1a, __BITS(4,0)),
+       AXP_CTRL("eldo3", 700, 1900, 50,
+               0x12, __BIT(2), 0x1b, __BITS(4,0)),
+       AXP_CTRL("fldo1", 700, 1450, 50,
+               0x13, __BIT(2), 0x1c, __BITS(3,0)),
+       AXP_CTRL("fldo2", 700, 1450, 50,
+               0x13, __BIT(3), 0x1d, __BITS(3,0)),
+       AXP_CTRL("dcdc1", 1600, 3400, 100,
+               0x10, __BIT(0), 0x20, __BITS(4,0)),
+       AXP_CTRL2("dcdc2", 500, 1300, 10, 70, 20, 5,
+               0x10, __BIT(1), 0x21, __BITS(6,0)),
+       AXP_CTRL2("dcdc3", 500, 1300, 10, 70, 20, 5,
+               0x10, __BIT(2), 0x22, __BITS(6,0)),
+       AXP_CTRL2("dcdc4", 500, 1300, 10, 70, 20, 5,
+               0x10, __BIT(3), 0x23, __BITS(6,0)),
+       AXP_CTRL2("dcdc5", 800, 1840, 10, 33, 20, 36,
+               0x10, __BIT(4), 0x24, __BITS(6,0)),
+       AXP_CTRL2("dcdc6", 600, 1520, 10, 51, 20, 21,
+               0x10, __BIT(5), 0x25, __BITS(6,0)),
+       AXP_CTRL2("dcdc7", 600, 1520, 10, 51, 20, 21,
+               0x10, __BIT(6), 0x26, __BITS(6,0)),
+       AXP_CTRL("aldo1", 700, 3300, 100,
+               0x13, __BIT(5), 0x28, __BITS(4,0)),
+       AXP_CTRL("aldo2", 700, 3300, 100,
+               0x13, __BIT(6), 0x29, __BITS(4,0)),
+       AXP_CTRL("aldo3", 700, 3300, 100,
+               0x13, __BIT(7), 0x2a, __BITS(4,0)),
+};
+
 struct axppmic_irq {
        u_int reg;
        uint8_t mask;
@@ -268,6 +310,7 @@
        i2c_tag_t       sc_i2c;
        i2c_addr_t      sc_addr;
        const struct axppmic_ctrl *sc_ctrl;
+       u_int           sc_inuse;
 };
 
 struct axpreg_attach_args {
@@ -305,10 +348,31 @@
        .poklirq = AXPPMIC_IRQ(2, __BIT(0)),
 };
 
+static const struct axppmic_config axp813_config = {
+       .name = "AXP813",
+       .controls = axp813_ctrls,
+       .ncontrols = __arraycount(axp813_ctrls),
+       .irq_regs = 6,
+       .has_battery = true,
+       .has_fuel_gauge = true,
+       .batsense_step = 1100,
+       .charge_step = 1000,
+       .discharge_step = 1000,
+       .maxcap_step = 1456,
+       .coulomb_step = 1456,
+       .poklirq = AXPPMIC_IRQ(5, __BIT(3)),
+       .acinirq = AXPPMIC_IRQ(1, __BITS(6,5)),
+       .vbusirq = AXPPMIC_IRQ(1, __BITS(3,2)),
+       .battirq = AXPPMIC_IRQ(2, __BITS(7,6)),
+       .chargeirq = AXPPMIC_IRQ(2, __BITS(3,2)),
+       .chargestirq = AXPPMIC_IRQ(4, __BITS(1,0)),     
+};
+
 static const struct device_compatible_entry compat_data[] = {
        { "x-powers,axp803",            (uintptr_t)&axp803_config },
        { "x-powers,axp805",            (uintptr_t)&axp805_config },
        { "x-powers,axp806",            (uintptr_t)&axp805_config },
+       { "x-powers,axp813",            (uintptr_t)&axp813_config },
        { NULL,                         0 }
 };
 
@@ -816,12 +880,20 @@
 static int
 axpreg_acquire(device_t dev)
 {
+       struct axpreg_softc *sc = device_private(dev);
+
+       if (atomic_cas_uint(&sc->sc_inuse, 0, 1) != 0)
+               return EBUSY;
+
        return 0;
 }
 
 static void
 axpreg_release(device_t dev)
 {
+       struct axpreg_softc *sc = device_private(dev);
+
+       atomic_swap_uint(&sc->sc_inuse, 0);
 }
 
 static int



Home | Main Index | Thread Index | Old Index