Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/arm/sunxi Fix some register definitions.



details:   https://anonhg.NetBSD.org/src/rev/4a93b96194d0
branches:  trunk
changeset: 354884:4a93b96194d0
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Sun Jul 02 21:13:06 2017 +0000

description:
Fix some register definitions.

diffstat:

 sys/arch/arm/sunxi/sunxi_gpio.c |  35 ++++++++++++++++++++---------------
 1 files changed, 20 insertions(+), 15 deletions(-)

diffs (103 lines):

diff -r 7ad03e4a4697 -r 4a93b96194d0 sys/arch/arm/sunxi/sunxi_gpio.c
--- a/sys/arch/arm/sunxi/sunxi_gpio.c   Sun Jul 02 18:27:45 2017 +0000
+++ b/sys/arch/arm/sunxi/sunxi_gpio.c   Sun Jul 02 21:13:06 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_gpio.c,v 1.3 2017/07/02 18:19:26 jmcneill Exp $ */
+/* $NetBSD: sunxi_gpio.c,v 1.4 2017/07/02 21:13:06 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -29,7 +29,7 @@
 #include "opt_soc.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunxi_gpio.c,v 1.3 2017/07/02 18:19:26 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_gpio.c,v 1.4 2017/07/02 21:13:06 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -44,17 +44,17 @@
 
 #include <arm/sunxi/sunxi_gpio.h>
 
-#define        SUNXI_GPIO_PORT(port)           (0x20 * (port))
-#define SUNXI_GPIO_CFG(port, pin)      (SUNXI_GPIO_PORT(port) + (0x4 * ((pin) / 8)))
+#define        SUNXI_GPIO_PORT(port)           (0x24 * (port))
+#define SUNXI_GPIO_CFG(port, pin)      (SUNXI_GPIO_PORT(port) + 0x00 + (0x4 * ((pin) / 8)))
 #define  SUNXI_GPIO_CFG_PINMASK(pin)   (0x7 << (((pin) % 8) * 4))
 #define        SUNXI_GPIO_DATA(port)           (SUNXI_GPIO_PORT(port) + 0x10)
 #define        SUNXI_GPIO_DRV(port, pin)       (SUNXI_GPIO_PORT(port) + 0x14 + (0x4 * ((pin) / 16)))
-#define  SUNXI_GPIO_DRV_PINMASK(pin)   (0x3 << (((pin) % 16) * 4))
+#define  SUNXI_GPIO_DRV_PINMASK(pin)   (0x3 << (((pin) % 16) * 2))
 #define        SUNXI_GPIO_PULL(port, pin)      (SUNXI_GPIO_PORT(port) + 0x1c + (0x4 * ((pin) / 16)))
 #define         SUNXI_GPIO_PULL_DISABLE        0
 #define         SUNXI_GPIO_PULL_UP             1
 #define         SUNXI_GPIO_PULL_DOWN           2
-#define  SUNXI_GPIO_PULL_PINMASK(pin)  (0x3 << (((pin) % 16) * 4))
+#define  SUNXI_GPIO_PULL_PINMASK(pin)  (0x3 << (((pin) % 16) * 2))
 
 static const struct of_compat_data compat_data[] = {
 #ifdef SOC_SUN6I_A31
@@ -140,6 +140,10 @@
                        cfg = GPIO_READ(sc, cfg_reg);
                        cfg &= ~cfg_mask;
                        cfg |= __SHIFTIN(n, cfg_mask);
+#ifdef SUNXI_GPIO_DEBUG
+                       device_printf(sc->sc_dev, "P%c%02d cfg %08x -> %08x\n",
+                           pin_def->port + 'A', pin_def->pin, GPIO_READ(sc, cfg_reg), cfg);
+#endif
                        GPIO_WRITE(sc, cfg_reg, cfg);
                        return 0;
                }
@@ -169,6 +173,10 @@
                pull |= __SHIFTIN(SUNXI_GPIO_PULL_DOWN, pull_mask);
        else
                pull |= __SHIFTIN(SUNXI_GPIO_PULL_DISABLE, pull_mask);
+#ifdef SUNXI_GPIO_DEBUG
+       device_printf(sc->sc_dev, "P%c%02d pull %08x -> %08x\n",
+           pin_def->port + 'A', pin_def->pin, GPIO_READ(sc, pull_reg), pull);
+#endif
        GPIO_WRITE(sc, pull_reg, pull);
 
        return 0;
@@ -189,6 +197,10 @@
        drv = GPIO_READ(sc, drv_reg);
        drv &= ~drv_mask;
        drv |= __SHIFTIN((drive_strength / 10) - 1, drv_mask);
+#ifdef SUNXI_GPIO_DEBUG
+       device_printf(sc->sc_dev, "P%c%02d drv %08x -> %08x\n",
+           pin_def->port + 'A', pin_def->pin, GPIO_READ(sc, drv_reg), drv);
+#endif
        GPIO_WRITE(sc, drv_reg, drv);
 
        return 0;
@@ -284,9 +296,6 @@
        struct sunxi_gpio_pin *pin = priv;
        const struct sunxi_gpio_pins *pin_def = pin->pin_def;
        uint32_t data;
-#ifdef SUNXI_GPIO_DEBUG
-       uint32_t old_data;
-#endif
 
        KASSERT(sc == pin->pin_sc);
 
@@ -298,17 +307,13 @@
 
        /* XXX locking */
        data = GPIO_READ(sc, data_reg);
-#ifdef SUNXI_GPIO_DEBUG
-       old_data = data;
-#endif
        data &= ~data_mask;
        data |= __SHIFTIN(val, data_mask);
-       GPIO_WRITE(sc, data_reg, data_mask);
-
 #ifdef SUNXI_GPIO_DEBUG
        device_printf(dev, "P%c%02d wr %08x -> %08x\n",
-           pin_def->port + 'A', pin_def->pin, old_data, data);
+           pin_def->port + 'A', pin_def->pin, GPIO_READ(sc, data_reg), data);
 #endif
+       GPIO_WRITE(sc, data_reg, data_mask);
 }
 
 static struct fdtbus_gpio_controller_func sunxi_gpio_funcs = {



Home | Main Index | Thread Index | Old Index