Module Name:    src
Committed By:   matt
Date:           Sat Sep  7 19:47:28 UTC 2013

Modified Files:
        src/sys/arch/arm/allwinner: awin_gpio.c awin_reg.h awin_var.h
        src/sys/arch/evbarm/cubie: cubie_machdep.c

Log Message:
Finish off GPIO handler.  Add hook for other driver to access a named gpio.
Add two input gpio's for usb0.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/allwinner/awin_gpio.c
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/allwinner/awin_reg.h
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/allwinner/awin_var.h
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/evbarm/cubie/cubie_machdep.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/allwinner/awin_gpio.c
diff -u src/sys/arch/arm/allwinner/awin_gpio.c:1.3 src/sys/arch/arm/allwinner/awin_gpio.c:1.4
--- src/sys/arch/arm/allwinner/awin_gpio.c:1.3	Sat Sep  7 02:09:23 2013
+++ src/sys/arch/arm/allwinner/awin_gpio.c	Sat Sep  7 19:47:28 2013
@@ -28,15 +28,17 @@
  */
 
 #include "locators.h"
+#include "gpio.h"
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: awin_gpio.c,v 1.3 2013/09/07 02:09:23 matt Exp $");
+__KERNEL_RCSID(1, "$NetBSD: awin_gpio.c,v 1.4 2013/09/07 19:47:28 matt Exp $");
 
 #include <sys/bus.h>
 #include <sys/device.h>
 #include <sys/intr.h>
 #include <sys/systm.h>
+#include <sys/kmem.h>
 
 #include <sys/gpio.h>
 
@@ -48,6 +50,10 @@ __KERNEL_RCSID(1, "$NetBSD: awin_gpio.c,
 static int awin_gpio_match(device_t, cfdata_t, void *);
 static void awin_gpio_attach(device_t, device_t, void *);
 
+static int awin_gpio_pin_read(void *, int);
+static void awin_gpio_pin_write(void *, int, int);
+static void awin_gpio_pin_ctl(void *, int, int);
+
 static const int ist_maps[] = {
 	[IST_LEVEL_LOW] =	AWIN_PIO_EINT_LOW_LEVEL,
 	[IST_LEVEL_HIGH] =	AWIN_PIO_EINT_HIGH_LEVEL,
@@ -57,7 +63,9 @@ static const int ist_maps[] = {
 };
 
 struct awin_gpio_pin_cfg {
-	uint32_t val[4];
+	uint32_t cfg[4];
+	uint32_t drv[2];
+	uint32_t pul[2];
 };
 
 static struct awin_gpio_pin_group {
@@ -65,21 +73,101 @@ static struct awin_gpio_pin_group {
 	uint32_t grp_pin_inuse_mask;
 	bus_space_handle_t grp_bsh;
 	struct awin_gpio_pin_cfg grp_cfg;
+	struct gpio_chipset_tag grp_gc_tag;
+	const char grp_nc_name[6];
 } pin_groups[] = {
-	[0] = { .grp_pin_mask = __BIT(AWIN_PIO_PA_PINS) - 1 },
-	[1] = { .grp_pin_mask = __BIT(AWIN_PIO_PB_PINS) - 1 },
-	[2] = { .grp_pin_mask = __BIT(AWIN_PIO_PC_PINS) - 1 },
-	[3] = { .grp_pin_mask = __BIT(AWIN_PIO_PD_PINS) - 1 },
-	[4] = { .grp_pin_mask = __BIT(AWIN_PIO_PE_PINS) - 1 },
-	[5] = { .grp_pin_mask = __BIT(AWIN_PIO_PF_PINS) - 1 },
-	[6] = { .grp_pin_mask = __BIT(AWIN_PIO_PG_PINS) - 1 },
-	[7] = { .grp_pin_mask = __BIT(AWIN_PIO_PH_PINS) - 1 },
-	[8] = { .grp_pin_mask = __BIT(AWIN_PIO_PI_PINS) - 1 },
+	[0] = {
+		.grp_pin_mask = __BIT(AWIN_PIO_PA_PINS) - 1,
+		.grp_gc_tag = {
+			.gp_cookie = &pin_groups[0],
+			.gp_pin_read = awin_gpio_pin_read,
+			.gp_pin_write = awin_gpio_pin_write,
+			.gp_pin_ctl = awin_gpio_pin_ctl,
+		},
+		.grp_nc_name = "nc-pa",
+	},
+	[1] = {
+		.grp_pin_mask = __BIT(AWIN_PIO_PB_PINS) - 1,
+		.grp_gc_tag = {
+			.gp_cookie = &pin_groups[1],
+			.gp_pin_read = awin_gpio_pin_read,
+			.gp_pin_write = awin_gpio_pin_write,
+			.gp_pin_ctl = awin_gpio_pin_ctl,
+		},
+		.grp_nc_name = "nc-pb",
+	},
+	[2] = {
+		.grp_pin_mask = __BIT(AWIN_PIO_PC_PINS) - 1,
+		.grp_gc_tag = {
+			.gp_cookie = &pin_groups[2],
+			.gp_pin_read = awin_gpio_pin_read,
+			.gp_pin_write = awin_gpio_pin_write,
+			.gp_pin_ctl = awin_gpio_pin_ctl,
+		},
+		.grp_nc_name = "nc-pc",
+	},
+	[3] = {
+		.grp_pin_mask = __BIT(AWIN_PIO_PD_PINS) - 1,
+		.grp_gc_tag = {
+			.gp_cookie = &pin_groups[3],
+			.gp_pin_read = awin_gpio_pin_read,
+			.gp_pin_write = awin_gpio_pin_write,
+			.gp_pin_ctl = awin_gpio_pin_ctl,
+		},
+		.grp_nc_name = "nc-pd",
+	},
+	[4] = {
+		.grp_pin_mask = __BIT(AWIN_PIO_PE_PINS) - 1,
+		.grp_gc_tag = {
+			.gp_cookie = &pin_groups[4],
+			.gp_pin_read = awin_gpio_pin_read,
+			.gp_pin_write = awin_gpio_pin_write,
+			.gp_pin_ctl = awin_gpio_pin_ctl,
+		},
+		.grp_nc_name = "nc-pe",
+	},
+	[5] = {
+		.grp_pin_mask = __BIT(AWIN_PIO_PF_PINS) - 1,
+		.grp_gc_tag = {
+			.gp_cookie = &pin_groups[5],
+			.gp_pin_read = awin_gpio_pin_read,
+			.gp_pin_write = awin_gpio_pin_write,
+			.gp_pin_ctl = awin_gpio_pin_ctl,
+		},
+		.grp_nc_name = "nc-pf",
+	},
+	[6] = {
+		.grp_pin_mask = __BIT(AWIN_PIO_PG_PINS) - 1,
+		.grp_gc_tag = {
+			.gp_cookie = &pin_groups[6],
+			.gp_pin_read = awin_gpio_pin_read,
+			.gp_pin_write = awin_gpio_pin_write,
+			.gp_pin_ctl = awin_gpio_pin_ctl,
+		},
+		.grp_nc_name = "nc-pg",
+	},
+	[7] = {
+		.grp_pin_mask = __BIT(AWIN_PIO_PH_PINS) - 1,
+		.grp_gc_tag = {
+			.gp_cookie = &pin_groups[7],
+			.gp_pin_read = awin_gpio_pin_read,
+			.gp_pin_write = awin_gpio_pin_write,
+			.gp_pin_ctl = awin_gpio_pin_ctl,
+		},
+		.grp_nc_name = "nc-ph",
+	},
+	[8] = {
+		.grp_pin_mask = __BIT(AWIN_PIO_PI_PINS) - 1,
+		.grp_gc_tag = {
+			.gp_cookie = &pin_groups[8],
+			.gp_pin_read = awin_gpio_pin_read,
+			.gp_pin_write = awin_gpio_pin_write,
+			.gp_pin_ctl = awin_gpio_pin_ctl,
+		},
+		.grp_nc_name = "nc-pi",
+	},
 };
 
-struct awin_eint_info {
-	uint32_t grp_pin ;
-};
 
 static struct awin_gpio_softc {
 	device_t sc_dev;
@@ -108,12 +196,74 @@ awin_gpio_match(device_t parent, cfdata_
 	return 1;
 }
 
+#if NGPIO > 0
+static void
+awin_gpio_config_pins(device_t self)
+{
+	struct awin_gpio_softc * const sc = &awin_gpio_sc;
+
+	/*
+	 * First find out how many pins we can offer.
+	 */
+	size_t pin_count = 0;
+	for (u_int i = 0; i < __arraycount(pin_groups); i++) {
+		struct awin_gpio_pin_group * const grp = &pin_groups[i];
+
+		pin_count +=
+		    popcount32(grp->grp_pin_mask & ~grp->grp_pin_inuse_mask);
+	}
+
+	/*
+	 * Allocate the pin data.
+	 */
+	gpio_pin_t * const pins = kmem_zalloc(sizeof(gpio_pin_t) * pin_count,
+	    KM_SLEEP);
+	KASSERT(pins != NULL);
+
+	const int pincaps = GPIO_PIN_INPUT | GPIO_PIN_OUTPUT
+		| GPIO_PIN_PULLUP | GPIO_PIN_PULLDOWN;
+
+	gpio_pin_t *pin = pins;
+	for (u_int i = 0; i < __arraycount(pin_groups); i++) {
+		struct awin_gpio_pin_group * const grp = &pin_groups[i];
+		uint32_t mask = grp->grp_pin_mask & ~grp->grp_pin_inuse_mask;
+
+		/* 
+		 * If this group has no bits to provide, skip it.
+		 */
+		if (mask == 0)
+			continue;
+
+		struct gpiobus_attach_args gba = {
+			.gba_gc = &grp->grp_gc_tag,
+			.gba_pins = pin,
+		};
+
+		uint32_t data = bus_space_read_4(sc->sc_bst, grp->grp_bsh,
+		    AWIN_PIO_DAT_REG);
+		for (int num = 0; mask != 0; mask >>= 1, data >>= 1, num++) {
+			if (mask & 1) {
+				pin->pin_num = num + (i << 5);
+				pin->pin_caps = pincaps;
+				pin->pin_flags = pincaps;
+				pin->pin_state = (data & 1) != 0;
+				pin++;
+			}
+		}
+
+		gba.gba_npins = pin - gba.gba_pins;
+		config_found_ia(self, "gpiobus", &gba, gpiobus_print);
+	}
+}
+#endif /* NGPIO > 0 */
+
 static void
 awin_gpio_attach(device_t parent, device_t self, void *aux)
 {
 	struct awin_gpio_softc * const sc = &awin_gpio_sc;
 	struct awinio_attach_args * const aio = aux;
 	const struct awin_locators * const loc = &aio->aio_loc;
+	prop_dictionary_t dict = device_properties(self);
 
 	sc->sc_dev = self;
 
@@ -123,24 +273,54 @@ awin_gpio_attach(device_t parent, device
 
 	aprint_naive("\n");
 	aprint_normal("\n");
+
+	for (u_int i = 0; i < __arraycount(pin_groups); i++) {
+		struct awin_gpio_pin_group * const grp = &pin_groups[i];
+
+		/*
+		 * See if this group has any unconnected pins and make sure
+		 * we won't use them.
+		 */
+		uint32_t nc;
+		if (prop_dictionary_get_uint32(dict, grp->grp_nc_name, &nc)) {
+			KASSERT((~grp->grp_pin_mask & nc) == 0);
+			KASSERT((grp->grp_pin_inuse_mask & ~nc) == 0);
+			grp->grp_pin_mask &= ~nc;
+		}
+	}
+
+#if NGPIO > 0
+	config_defer(self, awin_gpio_config_pins);
+#endif
 }
 
 static u_int
 awin_gpio_get_pin_func(const struct awin_gpio_pin_cfg *cfg, u_int pin)
 {
 	const u_int shift = (pin & 7) << 2;
-	const u_int i = pin >> 3;
-	return (cfg->val[i] >> shift) & 0x0f;
+	const u_int i = (pin >> 3) & 3;
+
+	return (cfg->cfg[i] >> shift) & 0x0f;
 }
 
 static void
 awin_gpio_set_pin_func(struct awin_gpio_pin_cfg *cfg, u_int pin, u_int func)
 {
 	const u_int shift = (pin & 7) << 2;
-	const u_int i = pin >> 3;
+	const u_int i = (pin >> 3) & 3;
 	
-	cfg->val[i] &= ~(0x0f << shift);
-	cfg->val[i] |= func << shift;
+	cfg->cfg[i] &= ~(0x0f << shift);
+	cfg->cfg[i] |= func << shift;
+}
+
+static void
+awin_gpio_set_pin_pull(struct awin_gpio_pin_cfg *cfg, u_int pin, u_int pull)
+{
+	const u_int shift = (pin & 15) << 1;
+	const u_int i = (pin >> 4) & 1;
+	
+	cfg->pul[i] &= ~(0x03 << shift);
+	cfg->pul[i] |= pull << shift;
 }
 
 static void
@@ -148,10 +328,22 @@ awin_gpio_update_cfg_regs(bus_space_tag_
     const struct awin_gpio_pin_cfg *ncfg)
 {
 	for (u_int i = 0; i < 4; i++) {
-		if (grp->grp_cfg.val[i] != ncfg->val[i]) {
+		if (grp->grp_cfg.cfg[i] != ncfg->cfg[i]) {
 			bus_space_write_4(bst, grp->grp_bsh,
-			    AWIN_PIO_CFG0_REG + 4 * i, ncfg->val[i]);	
-			grp->grp_cfg.val[i] = ncfg->val[i];
+			    AWIN_PIO_CFG0_REG + 4 * i, ncfg->cfg[i]);	
+			grp->grp_cfg.cfg[i] = ncfg->cfg[i];
+		}
+	}
+	for (u_int i = 0; i < 2; i++) {
+		if (grp->grp_cfg.drv[i] != ncfg->drv[i]) {
+			bus_space_write_4(bst, grp->grp_bsh,
+			    AWIN_PIO_DRV0_REG + 4 * i, ncfg->drv[i]);	
+			grp->grp_cfg.drv[i] = ncfg->drv[i];
+		}
+		if (grp->grp_cfg.pul[i] != ncfg->pul[i]) {
+			bus_space_write_4(bst, grp->grp_bsh,
+			    AWIN_PIO_PUL0_REG + 4 * i, ncfg->pul[i]);	
+			grp->grp_cfg.pul[i] = ncfg->pul[i];
 		}
 	}
 }
@@ -173,9 +365,17 @@ awin_gpio_init(void)
 		    offset, AWIN_PIO_GRP_SIZE, &grp->grp_bsh);
 
 		for (u_int j = 0; j < 4; j++) {
-			grp->grp_cfg.val[j] = bus_space_read_4(sc->sc_bst,
+			grp->grp_cfg.cfg[j] = bus_space_read_4(sc->sc_bst,
 			    grp->grp_bsh, AWIN_PIO_CFG0_REG + j * 4);
 		}
+		grp->grp_cfg.drv[0] = bus_space_read_4(sc->sc_bst,
+		    grp->grp_bsh, AWIN_PIO_DRV0_REG);
+		grp->grp_cfg.drv[1] = bus_space_read_4(sc->sc_bst,
+		    grp->grp_bsh, AWIN_PIO_DRV1_REG);
+		grp->grp_cfg.pul[0] = bus_space_read_4(sc->sc_bst,
+		    grp->grp_bsh, AWIN_PIO_PUL0_REG);
+		grp->grp_cfg.pul[1] = bus_space_read_4(sc->sc_bst,
+		    grp->grp_bsh, AWIN_PIO_PUL1_REG);
 
 		for (uint32_t j = 0, mask = 1;
 		     (mask & grp->grp_pin_mask) != 0;
@@ -329,3 +529,89 @@ awin_gpio_pinset_release(const struct aw
 	 */
 	grp->grp_pin_inuse_mask &= ~req->pinset_mask;
 }
+
+static int
+awin_gpio_pin_read(void *cookie, int pin)
+{
+	struct awin_gpio_pin_group * const grp = cookie;
+
+	KASSERT(pin < 32);
+
+	return (bus_space_read_4(awin_gpio_sc.sc_bst, grp->grp_bsh,
+	    AWIN_PIO_DAT_REG) >> pin) & 1;
+}
+
+static void
+awin_gpio_pin_write(void *cookie, int pin, int value)
+{
+	struct awin_gpio_pin_group * const grp = cookie;
+
+	KASSERT(pin < 32);
+
+	awin_reg_set_clear(awin_gpio_sc.sc_bst, grp->grp_bsh,
+	    AWIN_PIO_DAT_REG, value ? __BIT(pin) : 0, __BIT(pin));
+}
+
+static void
+awin_gpio_pin_ctl(void *cookie, int pin, int flags)
+{
+	struct awin_gpio_pin_group * const grp = cookie;
+	struct awin_gpio_pin_cfg ncfg = grp->grp_cfg;
+
+	u_int pull_value = AWIN_PIO_PULL_NONE;
+	if (flags & GPIO_PIN_PULLUP) {
+		pull_value = AWIN_PIO_PULL_UP;
+	} else if (flags & GPIO_PIN_PULLDOWN) {
+		pull_value = AWIN_PIO_PULL_DOWN;
+	}
+	awin_gpio_set_pin_pull(&ncfg, pin, pull_value);
+
+	if (flags & GPIO_PIN_INPUT) {
+		awin_gpio_set_pin_func(&ncfg, pin, AWIN_PIO_FUNC_INPUT);
+	} else if (flags & GPIO_PIN_OUTPUT) {
+		awin_gpio_set_pin_func(&ncfg, pin, AWIN_PIO_FUNC_INPUT);
+	}
+
+	/*
+	 * Now update any config register that changed.
+	 */
+	awin_gpio_update_cfg_regs(&awin_bs_tag, grp, &ncfg);
+}
+
+bool
+awin_gpio_pin_reserve(const char *name, struct awin_gpio_pindata *pd)
+{
+	struct awin_gpio_softc * const sc = &awin_gpio_sc;
+	prop_dictionary_t dict = device_properties(sc->sc_dev);
+	const char *pin_data;
+
+	if (!prop_dictionary_get_cstring_nocopy(dict, name, &pin_data))
+		return false;
+
+	KASSERT(pin_data[0] == '>' || pin_data[0] == '<');
+	KASSERT(pin_data[1] == 'P');
+
+	KASSERT('A' <= pin_data[2] && pin_data[2] <= 'I');
+	struct awin_gpio_pin_group * const grp = &pin_groups[pin_data[2] - 'A'];
+
+	u_int pin = pin_data[3] - '0';
+	KASSERT(pin < 10);
+	if (pin_data[4] != 0) {
+		KASSERT(pin_data[5] == 0);
+		pin = pin * 10 + pin_data[4] - '0';
+	}
+
+	KASSERT(pin < 32);
+	KASSERT(grp->grp_pin_mask & __BIT(pin));
+	KASSERT((grp->grp_pin_inuse_mask & __BIT(pin)) == 0);
+
+	struct awin_gpio_pin_cfg ncfg = grp->grp_cfg;
+	awin_gpio_set_pin_func(&ncfg, pin,
+	   pin_data[0] == '<' ? AWIN_PIO_FUNC_INPUT : AWIN_PIO_FUNC_OUTPUT);
+
+	grp->grp_pin_inuse_mask &= ~__BIT(pin);
+
+	pd->pd_gc = &grp->grp_gc_tag;
+	pd->pd_pin = pin;
+	return true;
+}

Index: src/sys/arch/arm/allwinner/awin_reg.h
diff -u src/sys/arch/arm/allwinner/awin_reg.h:1.4 src/sys/arch/arm/allwinner/awin_reg.h:1.5
--- src/sys/arch/arm/allwinner/awin_reg.h:1.4	Sat Sep  7 00:35:52 2013
+++ src/sys/arch/arm/allwinner/awin_reg.h	Sat Sep  7 19:47:28 2013
@@ -197,25 +197,25 @@
 #define AWIN_DRAM_PLDTR_REG		0x023C
 #define AWIN_DRAM_HPCR0_REG		0x0240
 #define AWIN_DRAM_HPCRn_REG(n)		(0x0240+4*(n))
-#define AWIN_DRAM_HPCR_USB1		AWIN_DRAM_HPCRn_REG(4)
-#define AWIN_DRAM_HPCR_USB2		AWIN_DRAM_HPCRn_REG(5)
+#define AWIN_DRAM_HPCR_USB1_REG		AWIN_DRAM_HPCRn_REG(4)
+#define AWIN_DRAM_HPCR_USB2_REG		AWIN_DRAM_HPCRn_REG(5)
 #define AWIN_DRAM_CSEL_REG		0x02E0
 
-#define	AWIN_DRAM_DCR_IO_WIDTH		__BITS(2,1)
-#define	AWIN_DRAM_DCR_IO_WIDTH_16BIT	2
-#define	AWIN_DRAM_DCR_IO_WIDTH_8BIT	1
-#define	AWIN_DRAM_DCR_CHIP_DENSITY	__BITS(5,3)
-#define	AWIN_DRAM_DCR_CHIP_DENSITY_256M	0
-#define	AWIN_DRAM_DCR_CHIP_DENSITY_512M	1
-#define	AWIN_DRAM_DCR_CHIP_DENSITY_1G	2
-#define	AWIN_DRAM_DCR_CHIP_DENSITY_2G	3
-#define	AWIN_DRAM_DCR_CHIP_DENSITY_4G	4
-#define	AWIN_DRAM_DCR_CHIP_DENSITY_8G	5
-#define	AWIN_DRAM_DCR_BUS_WIDTH		__BITS(8,6)
+#define AWIN_DRAM_DCR_IO_WIDTH		__BITS(2,1)
+#define AWIN_DRAM_DCR_IO_WIDTH_16BIT	2
+#define AWIN_DRAM_DCR_IO_WIDTH_8BIT	1
+#define AWIN_DRAM_DCR_CHIP_DENSITY	__BITS(5,3)
+#define AWIN_DRAM_DCR_CHIP_DENSITY_256M	0
+#define AWIN_DRAM_DCR_CHIP_DENSITY_512M	1
+#define AWIN_DRAM_DCR_CHIP_DENSITY_1G	2
+#define AWIN_DRAM_DCR_CHIP_DENSITY_2G	3
+#define AWIN_DRAM_DCR_CHIP_DENSITY_4G	4
+#define AWIN_DRAM_DCR_CHIP_DENSITY_8G	5
+#define AWIN_DRAM_DCR_BUS_WIDTH		__BITS(8,6)
 #define AWIN_DRAM_DCR_BUS_WIDTH_32BIT	3
 #define AWIN_DRAM_DCR_BUS_WIDTH_16BIT	1
 #define AWIN_DRAM_DCR_BUS_WIDTH_8BIT	0
-#define	AWIN_DRAM_DCR_RANK_SEL		__BITS(11,10)
+#define AWIN_DRAM_DCR_RANK_SEL		__BITS(11,10)
 
 #define AWIN_DRAM_HPCR_READ_CNT_EN	__BIT(31)
 #define AWIN_DRAM_HPCR_RWRITE_CNT_EN	__BIT(30)
@@ -299,23 +299,23 @@
 #define AWIN_AHCI_P0PHYSR_REG          0x017C
 
 
-#define	AWIN_PLL1_CFG_REG		0x0000
-#define	AWIN_PLL1_TUN_REG		0x0004
-#define	AWIN_PLL2_CFG_REG		0x0008
-#define	AWIN_PLL2_TUN_REG		0x000C
-#define	AWIN_PLL3_CFG_REG		0x0010
-#define	AWIN_PLL4_CFG_REG		0x0018
-#define	AWIN_PLL5_CFG_REG		0x0020
-#define	AWIN_PLL5_TUN_REG		0x0024
-#define	AWIN_PLL6_CFG_REG		0x0028
-#define	AWIN_PLL6_TUN_REG		0x002C
-#define	AWIN_PLL7_CFG_REG		0x0030
-#define	AWIN_PLL1_TUN2_REG		0x0038
-#define	AWIN_PLL6_TUN2_REG		0x003C
-#define	AWIN_PLL8_CFG_REG		0x0040
-#define	AWIN_OSC24M_CFG_REG		0x0050
-#define	AWIN_CPU_AHB_APB0_CFG_REG	0x0054
-#define	AWIN_APB1_CLK_DIV_REG		0x0058
+#define AWIN_PLL1_CFG_REG		0x0000
+#define AWIN_PLL1_TUN_REG		0x0004
+#define AWIN_PLL2_CFG_REG		0x0008
+#define AWIN_PLL2_TUN_REG		0x000C
+#define AWIN_PLL3_CFG_REG		0x0010
+#define AWIN_PLL4_CFG_REG		0x0018
+#define AWIN_PLL5_CFG_REG		0x0020
+#define AWIN_PLL5_TUN_REG		0x0024
+#define AWIN_PLL6_CFG_REG		0x0028
+#define AWIN_PLL6_TUN_REG		0x002C
+#define AWIN_PLL7_CFG_REG		0x0030
+#define AWIN_PLL1_TUN2_REG		0x0038
+#define AWIN_PLL6_TUN2_REG		0x003C
+#define AWIN_PLL8_CFG_REG		0x0040
+#define AWIN_OSC24M_CFG_REG		0x0050
+#define AWIN_CPU_AHB_APB0_CFG_REG	0x0054
+#define AWIN_APB1_CLK_DIV_REG		0x0058
 #define AWIN_AXI_GATING_REG		0x005C
 #define AWIN_AHB_GATING0_REG		0x0060
 #define AWIN_AHB_GATING1_REG		0x0064
@@ -373,19 +373,19 @@
 
 #define AWIN_OSC24M_CFG_ENABLE		__BIT(0)
 
-#define	AWIN_PLL_CFG_ENABLE		__BIT(31)
-#define	AWIN_PLL_CFG_BYPASS		__BIT(30)
+#define AWIN_PLL_CFG_ENABLE		__BIT(31)
+#define AWIN_PLL_CFG_BYPASS		__BIT(30)
 #define AWIN_PLL5_CFG_DDR_CLK_EN	__BIT(29)
-#define	AWIN_PLL_CFG_EXG_MODE		__BIT(25)
-#define	AWIN_PLL_CFG_OUT_EXP_DIVP	__BITS(17,16)
+#define AWIN_PLL_CFG_EXG_MODE		__BIT(25)
+#define AWIN_PLL_CFG_OUT_EXP_DIVP	__BITS(17,16)
 #define AWIN_PLL6_CFG_SATA_CLK_EN	__BIT(14)
-#define	AWIN_PLL_CFG_FACTOR_N		__BITS(12,8)
+#define AWIN_PLL_CFG_FACTOR_N		__BITS(12,8)
 #define AWIN_PLL5_CFG_LDO_EN		__BIT(7)
-#define	AWIN_PLL_CFG_FACTOR_K		__BITS(5,4)
-#define	AWIN_PLL5_CFG_FACTOR_M1		__BITS(3,2)
+#define AWIN_PLL_CFG_FACTOR_K		__BITS(5,4)
+#define AWIN_PLL5_CFG_FACTOR_M1		__BITS(3,2)
 #define AWIN_PLL1_SIG_DELT_PAT_IN	__BIT(3)
 #define AWIN_PLL1_SIG_DELT_PAT_EN	__BIT(2)
-#define	AWIN_PLL_CFG_FACTOR_M		__BITS(1,0)
+#define AWIN_PLL_CFG_FACTOR_M		__BITS(1,0)
 
 #define AWIN_CPU_CLK_SRC_SEL		__BITS(17,16)
 #define AWIN_CPU_CLK_SRC_SEL_LOSC	0
@@ -394,48 +394,48 @@
 #define AWIN_CPU_CLK_SRC_SEL_200MHZ	3
 #define AWIN_APB0_CLK_RATIO		__BITS(9,8)
 
-#define	AWIN_AHB_GATING0_STIMER		__BIT(28)
-#define	AWIN_AHB_GATING0_SATA		__BIT(25)
-#define	AWIN_AHB_GATING0_PATA		__BIT(24)
-#define	AWIN_AHB_GATING0_SPI3		__BIT(23)
-#define	AWIN_AHB_GATING0_SPI2		__BIT(22)
-#define	AWIN_AHB_GATING0_SPI1		__BIT(21)
-#define	AWIN_AHB_GATING0_SPI0		__BIT(20)
-#define	AWIN_AHB_GATING0_TS		__BIT(18)
-#define	AWIN_AHB_GATING0_EMAC		__BIT(17)
-#define	AWIN_AHB_GATING0_ACE		__BIT(16)
-#define	AWIN_AHB_GATING0_SDRAM		__BIT(14)
-#define	AWIN_AHB_GATING0_NAND		__BIT(13)
-#define	AWIN_AHB_GATING0_NC12		__BIT(12)
-#define	AWIN_AHB_GATING0_SDMMC3		__BIT(11)
-#define	AWIN_AHB_GATING0_SDMMC2		__BIT(10)
-#define	AWIN_AHB_GATING0_SDMMC1		__BIT(9)
-#define	AWIN_AHB_GATING0_SDMMC0		__BIT(8)
-#define	AWIN_AHB_GATING0_BIST		__BIT(7)
-#define	AWIN_AHB_GATING0_DMA		__BIT(6)
-#define	AWIN_AHB_GATING0_SS		__BIT(5)
-#define	AWIN_AHB_GATING0_USB_OHCI1	__BIT(4)
-#define	AWIN_AHB_GATING0_USB_EHCI1	__BIT(3)
-#define	AWIN_AHB_GATING0_USB_OHCI0	__BIT(1)
-#define	AWIN_AHB_GATING0_USB_EHCI0	__BIT(1)
-#define	AWIN_AHB_GATING0_USB0		__BIT(0)
-
-#define	AWIN_AHB_GATING1_MALI400	__BIT(20)
-#define	AWIN_AHB_GATING1_MP		__BIT(18)
-#define	AWIN_AHB_GATING1_GMAC		__BIT(17)
-#define	AWIN_AHB_GATING1_DE_FE1		__BIT(15)
-#define	AWIN_AHB_GATING1_DE_FE0		__BIT(14)
-#define	AWIN_AHB_GATING1_DE_BE1		__BIT(13)
-#define	AWIN_AHB_GATING1_DE_BE0		__BIT(12)
-#define	AWIN_AHB_GATING1_HDMI		__BIT(11)
-#define	AWIN_AHB_GATING1_CSI1		__BIT(9)
-#define	AWIN_AHB_GATING1_CSI0		__BIT(8)
-#define	AWIN_AHB_GATING1_LCD1		__BIT(5)
-#define	AWIN_AHB_GATING1_LCD0		__BIT(4)
-#define	AWIN_AHB_GATING1_TVE1		__BIT(3)
-#define	AWIN_AHB_GATING1_TVE0		__BIT(2)
-#define	AWIN_AHB_GATING1_TVD		__BIT(1)
-#define	AWIN_AHB_GATING1_VE		__BIT(0)
+#define AWIN_AHB_GATING0_STIMER		__BIT(28)
+#define AWIN_AHB_GATING0_SATA		__BIT(25)
+#define AWIN_AHB_GATING0_PATA		__BIT(24)
+#define AWIN_AHB_GATING0_SPI3		__BIT(23)
+#define AWIN_AHB_GATING0_SPI2		__BIT(22)
+#define AWIN_AHB_GATING0_SPI1		__BIT(21)
+#define AWIN_AHB_GATING0_SPI0		__BIT(20)
+#define AWIN_AHB_GATING0_TS		__BIT(18)
+#define AWIN_AHB_GATING0_EMAC		__BIT(17)
+#define AWIN_AHB_GATING0_ACE		__BIT(16)
+#define AWIN_AHB_GATING0_SDRAM		__BIT(14)
+#define AWIN_AHB_GATING0_NAND		__BIT(13)
+#define AWIN_AHB_GATING0_NC12		__BIT(12)
+#define AWIN_AHB_GATING0_SDMMC3		__BIT(11)
+#define AWIN_AHB_GATING0_SDMMC2		__BIT(10)
+#define AWIN_AHB_GATING0_SDMMC1		__BIT(9)
+#define AWIN_AHB_GATING0_SDMMC0		__BIT(8)
+#define AWIN_AHB_GATING0_BIST		__BIT(7)
+#define AWIN_AHB_GATING0_DMA		__BIT(6)
+#define AWIN_AHB_GATING0_SS		__BIT(5)
+#define AWIN_AHB_GATING0_USB_OHCI1	__BIT(4)
+#define AWIN_AHB_GATING0_USB_EHCI1	__BIT(3)
+#define AWIN_AHB_GATING0_USB_OHCI0	__BIT(1)
+#define AWIN_AHB_GATING0_USB_EHCI0	__BIT(1)
+#define AWIN_AHB_GATING0_USB0		__BIT(0)
+
+#define AWIN_AHB_GATING1_MALI400	__BIT(20)
+#define AWIN_AHB_GATING1_MP		__BIT(18)
+#define AWIN_AHB_GATING1_GMAC		__BIT(17)
+#define AWIN_AHB_GATING1_DE_FE1		__BIT(15)
+#define AWIN_AHB_GATING1_DE_FE0		__BIT(14)
+#define AWIN_AHB_GATING1_DE_BE1		__BIT(13)
+#define AWIN_AHB_GATING1_DE_BE0		__BIT(12)
+#define AWIN_AHB_GATING1_HDMI		__BIT(11)
+#define AWIN_AHB_GATING1_CSI1		__BIT(9)
+#define AWIN_AHB_GATING1_CSI0		__BIT(8)
+#define AWIN_AHB_GATING1_LCD1		__BIT(5)
+#define AWIN_AHB_GATING1_LCD0		__BIT(4)
+#define AWIN_AHB_GATING1_TVE1		__BIT(3)
+#define AWIN_AHB_GATING1_TVE0		__BIT(2)
+#define AWIN_AHB_GATING1_TVD		__BIT(1)
+#define AWIN_AHB_GATING1_VE		__BIT(0)
 
 #define AWIN_APB_GATING0_KEYPAD		__BIT(10)
 #define AWIN_APB_GATING0_IIS2		__BIT(8)
@@ -505,35 +505,48 @@
 #define AWIN_DRAM_CLK_CSI0_DCLK_ENABLE	__BIT(1)
 #define AWIN_DRAM_CLK_VE_DCLK_ENABLE	__BIT(0)
 
-#define	AWIN_GMAC_CLK_TXC_DIV		__BITS(9,8)
-#define	AWIN_GMAC_CLK_TXC_DIV_1000	0
-#define	AWIN_GMAC_CLK_TXC_DIV_100	1
-#define	AWIN_GMAC_CLK_TXC_DIV_10	2
-#define	AWIN_GMAC_CLK_RXDC		__BITS(7,5)
-#define	AWIN_GMAC_CLK_RXIE		__BIT(4)
-#define	AWIN_GMAC_CLK_TXIE		__BIT(3)
-#define	AWIN_GMAC_CLK_PIT		__BIT(2)
-#define	AWIN_GMAC_CLK_TCS		__BITS(1,0)
-#define	AWIN_GMAC_CLK_TCS_MII		0
-#define	AWIN_GMAC_CLK_TCS_EXT_125	1
-#define	AWIN_GMAC_CLK_TCS_INT_RGMII	2
-
-#define	AWIN_CLK_OUT_ENABLE		__BIT(31)
-#define	AWIN_CLK_OUT_SRC_SEL		__BITS(25,24)
-#define	AWIN_CLK_OUT_SRC_SEL_32K	0
-#define	AWIN_CLK_OUT_SRC_SEL_LOSC	1
-#define	AWIN_CLK_OUT_SRC_SEL_OSC24M	2
-#define	AWIN_CLK_OUT_SRC_FACTOR_N	__BITS(21,20)
-#define	AWIN_CLK_OUT_SRC_FACTOR_M	__BITS(12,8)
+#define AWIN_GMAC_CLK_TXC_DIV		__BITS(9,8)
+#define AWIN_GMAC_CLK_TXC_DIV_1000	0
+#define AWIN_GMAC_CLK_TXC_DIV_100	1
+#define AWIN_GMAC_CLK_TXC_DIV_10	2
+#define AWIN_GMAC_CLK_RXDC		__BITS(7,5)
+#define AWIN_GMAC_CLK_RXIE		__BIT(4)
+#define AWIN_GMAC_CLK_TXIE		__BIT(3)
+#define AWIN_GMAC_CLK_PIT		__BIT(2)
+#define AWIN_GMAC_CLK_TCS		__BITS(1,0)
+#define AWIN_GMAC_CLK_TCS_MII		0
+#define AWIN_GMAC_CLK_TCS_EXT_125	1
+#define AWIN_GMAC_CLK_TCS_INT_RGMII	2
+
+#define AWIN_CLK_OUT_ENABLE		__BIT(31)
+#define AWIN_CLK_OUT_SRC_SEL		__BITS(25,24)
+#define AWIN_CLK_OUT_SRC_SEL_32K	0
+#define AWIN_CLK_OUT_SRC_SEL_LOSC	1
+#define AWIN_CLK_OUT_SRC_SEL_OSC24M	2
+#define AWIN_CLK_OUT_SRC_FACTOR_N	__BITS(21,20)
+#define AWIN_CLK_OUT_SRC_FACTOR_M	__BITS(12,8)
 
 /* USB device offsets */
-#define	AWIN_EHCI_OFFSET		0x0000
-#define	AWIN_EHCI_SIZE			0x0400
-#define	AWIN_OHCI_OFFSET		0x0400
-#define	AWIN_OHCI_SIZE			0x0400
+#define AWIN_USB0_PHY_CSR_REG		0x0404
+#define AWIN_EHCI_OFFSET		0x0000
+#define AWIN_EHCI_SIZE			0x0400
+#define AWIN_OHCI_OFFSET		0x0400
+#define AWIN_OHCI_SIZE			0x0400
+#define	AWIN_USB_PMU_IRQ_REG		0x0800
+
+#define AWIN_USB0_PHY_CSR_ADDR		__BITS(15,8)
+#define AWIN_USB0_PHY_CSR_DAT		__BIT(7)
+#define AWIN_USB0_PHY_CSR_CLK2		__BIT(2)
+#define AWIN_USB0_PHY_CSR_CLK1		__BIT(1)
+#define AWIN_USB0_PHY_CSR_CLK0		__BIT(0)
+
+#define	AWIN_USB_PMU_IRQ_AHB_INCR8	__BIT(10)
+#define	AWIN_USB_PMU_IRQ_AHB_INCR4	__BIT(9)
+#define	AWIN_USB_PMU_IRQ_AHB_INCRX	__BIT(8)
+#define	AWIN_USB_PMU_IRQ_ULPI_BYPASS	__BIT(0)
 
 /* PATA Definitions */
-#define	AWIN_PATA_CTL_REG		0x0100	/* XXX Bogus */
+#define AWIN_PATA_CTL_REG		0x0100	/* XXX Bogus */
 
 /* A10 Interrupt Register Definitions */
 #define AWIN_INTC_VECTOR_REG		0x0000
@@ -576,7 +589,7 @@
 #define AWIN_PIO_DRV1_REG		0x0018
 #define AWIN_PIO_PUL0_REG		0x001c
 #define AWIN_PIO_PUL1_REG		0x0020
-#define	AWIN_PIO_GRP_SIZE		0x0024
+#define AWIN_PIO_GRP_SIZE		0x0024
 #define AWIN_PIO_INT_CFG0_REG		0x0200
 #define AWIN_PIO_INT_CFG1_REG		0x0204
 #define AWIN_PIO_INT_CFG2_REG		0x0208
@@ -588,10 +601,15 @@
 #define AWIN_PIO_SDR_PAD_PUL_REG	0x0224
 
 #define AWIN_PIO_CFG_PINMASK(pin)	(7 << (4*((pin) & 7)))
-#define	AWIN_PIO_DRV_MASK(pin)		((x) << (2*((pin) & 15))) 
+#define AWIN_PIO_DRV_MASK(pin)		((x) << (2*((pin) & 15))) 
+#define AWIN_PIO_PULn(v, pin)		((v) << (2*((pin) & 15))) 
 
 #define AWIN_PIO_FUNC_INPUT		0x0
-#define AWIN_PIO_FUNC_OUTPUT		0x0
+#define AWIN_PIO_FUNC_OUTPUT		0x1
+
+#define AWIN_PIO_PULL_NONE		0x0
+#define AWIN_PIO_PULL_UP		0x1
+#define AWIN_PIO_PULL_DOWN		0x2
 
 #define AWIN_PIO_EINT_POSITIVE_EDGE	0x0
 #define AWIN_PIO_EINT_NEGATIVE_EDGE	0x1
@@ -893,8 +911,8 @@
 #define AWIN_LOSC_CNT64_LOW_REG		0x0294
 #define AWIN_LOSC_CNT64_HIGH_REG	0x0298
 
-#define	AWIN_CPU_CORE_RESET		__BIT(1)
-#define	AWIN_CPU_RESET			__BIT(0)
+#define AWIN_CPU_CORE_RESET		__BIT(1)
+#define AWIN_CPU_RESET			__BIT(0)
 
 /* High Speed Timer (A20) */
 #define AWIN_HSTMR_IRQ_EN_REG		0x0000

Index: src/sys/arch/arm/allwinner/awin_var.h
diff -u src/sys/arch/arm/allwinner/awin_var.h:1.5 src/sys/arch/arm/allwinner/awin_var.h:1.6
--- src/sys/arch/arm/allwinner/awin_var.h:1.5	Sat Sep  7 02:10:02 2013
+++ src/sys/arch/arm/allwinner/awin_var.h	Sat Sep  7 19:47:28 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: awin_var.h,v 1.5 2013/09/07 02:10:02 matt Exp $ */
+/* $NetBSD: awin_var.h,v 1.6 2013/09/07 19:47:28 matt Exp $ */
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -33,6 +33,9 @@
 
 #include <sys/types.h>
 #include <sys/bus.h>
+#include <sys/gpio.h>
+
+#include <dev/gpio/gpiovar.h>
 
 struct awin_locators {
 	const char *loc_name;
@@ -63,6 +66,11 @@ struct awin_gpio_pinset {
 	uint32_t pinset_mask;
 };
 
+struct awin_gpio_pindata {
+	gpio_chipset_tag_t pd_gc;
+	int pd_pin;
+};
+
 extern struct bus_space awin_bs_tag;
 extern struct bus_space awin_a4x_bs_tag;
 extern bus_space_handle_t awin_core_bsh;
@@ -76,9 +84,16 @@ void	awin_gpio_init(void);
 bool	awin_gpio_pinset_available(const struct awin_gpio_pinset *);
 void	awin_gpio_pinset_acquire(const struct awin_gpio_pinset *);
 void	awin_gpio_pinset_release(const struct awin_gpio_pinset *);
+bool	awin_gpio_pin_reserve(const char *, struct awin_gpio_pindata *);
 
 void	awin_wdog_reset(void);
 
+static inline void
+awin_gpio_pindata_write(const struct awin_gpio_pindata *pd, int value)
+{
+	gpiobus_pin_write(pd->pd_gc, pd->pd_pin, value);
+}
+
 static void inline
 awin_reg_set_clear(bus_space_tag_t bst, bus_space_handle_t bsh,
     bus_size_t o, uint32_t set_mask, uint32_t clr_mask)

Index: src/sys/arch/evbarm/cubie/cubie_machdep.c
diff -u src/sys/arch/evbarm/cubie/cubie_machdep.c:1.5 src/sys/arch/evbarm/cubie/cubie_machdep.c:1.6
--- src/sys/arch/evbarm/cubie/cubie_machdep.c:1.5	Sat Sep  7 03:34:20 2013
+++ src/sys/arch/evbarm/cubie/cubie_machdep.c	Sat Sep  7 19:47:28 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: cubie_machdep.c,v 1.5 2013/09/07 03:34:20 matt Exp $ */
+/*	$NetBSD: cubie_machdep.c,v 1.6 2013/09/07 19:47:28 matt Exp $ */
 
 /*
  * Machine dependent functions for kernel setup for TI OSK5912 board.
@@ -125,7 +125,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cubie_machdep.c,v 1.5 2013/09/07 03:34:20 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cubie_machdep.c,v 1.6 2013/09/07 19:47:28 matt Exp $");
 
 #include "opt_machdep.h"
 #include "opt_ddb.h"
@@ -517,14 +517,16 @@ cubie_device_register(device_t self, voi
 		/*
 		 * These are GPIOs being used for various functions.
 		 */
-		prop_dictionary_set_cstring(dict, "out-satapwren", "PB8");
-		prop_dictionary_set_cstring(dict, "out-usb0drv", "PB9");
-		prop_dictionary_set_cstring(dict, "out-usb1drv", "PH6");
-		prop_dictionary_set_cstring(dict, "out-usb2drv", "PH3");
-		prop_dictionary_set_cstring(dict, "out-hdd5ven", "PH17");
-		prop_dictionary_set_cstring(dict, "out-emacpwren", "PH19");
-		prop_dictionary_set_cstring(dict, "out-status-led1", "PH21");
-		prop_dictionary_set_cstring(dict, "out-status-led2", "PH20");
+		prop_dictionary_set_cstring(dict, "satapwren", ">PB8");
+		prop_dictionary_set_cstring(dict, "usb0drv", ">PB9");
+		prop_dictionary_set_cstring(dict, "usb2drv", ">PH3");
+		prop_dictionary_set_cstring(dict, "usb0iddet", "<PH4");
+		prop_dictionary_set_cstring(dict, "usb0vbusdet", "<PH5");
+		prop_dictionary_set_cstring(dict, "usb1drv", ">PH6");
+		prop_dictionary_set_cstring(dict, "hdd5ven", ">PH17");
+		prop_dictionary_set_cstring(dict, "emacpwren", ">PH19");
+		prop_dictionary_set_cstring(dict, "status-led1", ">PH21");
+		prop_dictionary_set_cstring(dict, "status-led2", ">PH20");
 
 		/*
 		 * These pins have no connections.

Reply via email to