Module Name:    src
Committed By:   jmcneill
Date:           Sun Jul  2 21:13:06 UTC 2017

Modified Files:
        src/sys/arch/arm/sunxi: sunxi_gpio.c

Log Message:
Fix some register definitions.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/sunxi/sunxi_gpio.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/sunxi/sunxi_gpio.c
diff -u src/sys/arch/arm/sunxi/sunxi_gpio.c:1.3 src/sys/arch/arm/sunxi/sunxi_gpio.c:1.4
--- src/sys/arch/arm/sunxi/sunxi_gpio.c:1.3	Sun Jul  2 18:19:26 2017
+++ src/sys/arch/arm/sunxi/sunxi_gpio.c	Sun Jul  2 21:13:06 2017
@@ -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 <jmcne...@invisible.ca>
@@ -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 @@ __KERNEL_RCSID(0, "$NetBSD: sunxi_gpio.c
 
 #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 @@ sunxi_gpio_setfunc(struct sunxi_gpio_sof
 			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 @@ sunxi_gpio_setpull(struct sunxi_gpio_sof
 		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 @@ sunxi_gpio_setdrv(struct sunxi_gpio_soft
 	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 @@ sunxi_gpio_write(device_t dev, void *pri
 	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 @@ sunxi_gpio_write(device_t dev, void *pri
 
 	/* 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 = {

Reply via email to