Module Name:    src
Committed By:   kardel
Date:           Sun Apr  6 17:59:39 UTC 2014

Modified Files:
        src/distrib/sets/lists/man: mi
        src/doc: CHANGES
        src/share/man/man4: Makefile
        src/sys/arch/evbarm/conf: RPI
        src/sys/dev/spi: files.spi
Added Files:
        src/share/man/man4: mcp23s17gpio.4
        src/sys/dev/spi: mcp23s17.c mcp23s17.h

Log Message:
add Microchip MCP23S17 GPIO driver
(via SPI interface)


To generate a diff of this commit:
cvs rdiff -u -r1.1467 -r1.1468 src/distrib/sets/lists/man/mi
cvs rdiff -u -r1.1910 -r1.1911 src/doc/CHANGES
cvs rdiff -u -r1.611 -r1.612 src/share/man/man4/Makefile
cvs rdiff -u -r0 -r1.1 src/share/man/man4/mcp23s17gpio.4
cvs rdiff -u -r1.42 -r1.43 src/sys/arch/evbarm/conf/RPI
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/spi/files.spi
cvs rdiff -u -r0 -r1.1 src/sys/dev/spi/mcp23s17.c src/sys/dev/spi/mcp23s17.h

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

Modified files:

Index: src/distrib/sets/lists/man/mi
diff -u src/distrib/sets/lists/man/mi:1.1467 src/distrib/sets/lists/man/mi:1.1468
--- src/distrib/sets/lists/man/mi:1.1467	Tue Apr  1 21:40:46 2014
+++ src/distrib/sets/lists/man/mi	Sun Apr  6 17:59:39 2014
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1467 2014/04/01 21:40:46 christos Exp $
+# $NetBSD: mi,v 1.1468 2014/04/06 17:59:39 kardel Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -1391,6 +1391,7 @@
 ./usr/share/man/cat4/mlx.0			man-sys-catman		.cat
 ./usr/share/man/cat4/mly.0			man-sys-catman		.cat
 ./usr/share/man/cat4/module.0			man-obsolete		obsolete
+./usr/share/man/cat4/mcp23s17gpio.0		man-sys-catman		.cat
 ./usr/share/man/cat4/mpii.0			man-sys-catman		.cat
 ./usr/share/man/cat4/mpl115a.0			man-sys-catman		.cat
 ./usr/share/man/cat4/mpls.0			man-sys-catman		.cat
@@ -4387,6 +4388,7 @@
 ./usr/share/man/html4/mlx.html			man-sys-htmlman		html
 ./usr/share/man/html4/mly.html			man-sys-htmlman		html
 ./usr/share/man/html4/module.html		man-obsolete		obsolete
+./usr/share/man/html4/mcp23s17gpio.html		man-sys-htmlman		html
 ./usr/share/man/html4/mpii.html			man-sys-htmlman		html
 ./usr/share/man/html4/mpl115a.html		man-sys-htmlman		html
 ./usr/share/man/html4/mpls.html			man-sys-htmlman		html
@@ -7231,6 +7233,7 @@
 ./usr/share/man/man4/mlx.4			man-sys-man		.man
 ./usr/share/man/man4/mly.4			man-sys-man		.man
 ./usr/share/man/man4/module.4			man-obsolete		obsolete
+./usr/share/man/man4/mcp23s17gpio.4		man-sys-man		.man
 ./usr/share/man/man4/mpii.4			man-sys-man		.man
 ./usr/share/man/man4/mpl115a.4			man-sys-man		.man
 ./usr/share/man/man4/mpls.4			man-sys-man		.man

Index: src/doc/CHANGES
diff -u src/doc/CHANGES:1.1910 src/doc/CHANGES:1.1911
--- src/doc/CHANGES:1.1910	Sat Apr  5 02:25:44 2014
+++ src/doc/CHANGES	Sun Apr  6 17:59:39 2014
@@ -1,4 +1,4 @@
-# LIST OF CHANGES FROM LAST RELEASE:			<$Revision: 1.1910 $>
+# LIST OF CHANGES FROM LAST RELEASE:			<$Revision: 1.1911 $>
 #
 #
 # [Note: This file does not mention every change made to the NetBSD source tree.
@@ -382,3 +382,5 @@ Changes from NetBSD 6.0 to NetBSD 7.0:
 	ptyfs: Allow multiple mounts and support proper device visibility
 	     in chroots (Ilya Zykov) [christos 20140404]
 	i386: Switched to GCC 4.8.  [christos 20140404]
+	mcp23s17gpio: Add Microchip MCP23S17 16-bit GPIO chip driver.
+		e.g. Rasberry Pi interface boards [kardel 20140406]
\ No newline at end of file

Index: src/share/man/man4/Makefile
diff -u src/share/man/man4/Makefile:1.611 src/share/man/man4/Makefile:1.612
--- src/share/man/man4/Makefile:1.611	Wed Mar 19 15:26:41 2014
+++ src/share/man/man4/Makefile	Sun Apr  6 17:59:39 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.611 2014/03/19 15:26:41 nonaka Exp $
+#	$NetBSD: Makefile,v 1.612 2014/04/06 17:59:39 kardel Exp $
 #	@(#)Makefile	8.1 (Berkeley) 6/18/93
 
 MAN=	aac.4 ac97.4 acardide.4 aceride.4 acphy.4 \
@@ -37,7 +37,8 @@ MAN=	aac.4 ac97.4 acardide.4 aceride.4 a
 	jme.4 jmide.4 joy.4 \
 	kloader.4 kse.4 ksyms.4 kttcp.4 \
 	lc.4 ld.4 lii.4 lo.4 lua.4 lxtphy.4 \
-	mainbus.4 makphy.4 malo.4 mbe.4 mca.4 mcclock.4 md.4 mfb.4 mfi.4 mhzc.4 \
+	mainbus.4 makphy.4 malo.4 mbe.4 mca.4 mcclock.4 mcp23s17gpio.4 md.4 mfb.4 \
+	mfi.4 mhzc.4 \
 	micphy.4 midi.4 mii.4 mk48txx.4 mlx.4 mly.4 mpls.4 mpii.4 mpt.4 mpu.4 mtd.4 \
 	mtio.4 msm6242b.4 multicast.4 mvsata.4 \
 	nadb.4 ne.4 neo.4 netintro.4 nfe.4 nfsmb.4 njata.4 njs.4 \

Index: src/sys/arch/evbarm/conf/RPI
diff -u src/sys/arch/evbarm/conf/RPI:1.42 src/sys/arch/evbarm/conf/RPI:1.43
--- src/sys/arch/evbarm/conf/RPI:1.42	Fri Jan 31 08:18:03 2014
+++ src/sys/arch/evbarm/conf/RPI	Sun Apr  6 17:59:39 2014
@@ -1,5 +1,5 @@
 #
-#	$NetBSD: RPI,v 1.42 2014/01/31 08:18:03 skrll Exp $
+#	$NetBSD: RPI,v 1.43 2014/04/06 17:59:39 kardel Exp $
 #
 #	RPi -- Raspberry Pi
 #
@@ -225,6 +225,15 @@ iic* at i2cbus?
 bcmspi* at obio?
 spi* at spibus?
 
+# PIFace or other boards using that chip (needs gpio)
+#mcp23s17gpio0 at spi? slave 0 flags 0
+#mcp23s17gpio1 at spi? slave 0 flags 1 
+#mcp23s17gpio2 at spi? slave 0 flags 2
+#mcp23s17gpio3 at spi? slave 0 flags 3
+
+# gpio support (e. g. mcp23s17gpio)
+#gpio*		at gpiobus?
+
 # various options for wscons - we try to look as much like a standard
 # sun console as possible
 options 	WSEMUL_VT100		# sun terminal emulation

Index: src/sys/dev/spi/files.spi
diff -u src/sys/dev/spi/files.spi:1.3 src/sys/dev/spi/files.spi:1.4
--- src/sys/dev/spi/files.spi:1.3	Tue Feb 25 20:09:37 2014
+++ src/sys/dev/spi/files.spi	Sun Apr  6 17:59:39 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: files.spi,v 1.3 2014/02/25 20:09:37 rkujawa Exp $
+#	$NetBSD: files.spi,v 1.4 2014/04/06 17:59:39 kardel Exp $
 
 define	spibus { }
 
@@ -31,3 +31,7 @@ device	mcp48x1dac
 attach	mcp48x1dac at spi
 file	dev/spi/mcp48x1.c		mcp48x1dac	
 
+# MCP23S17 16-bit GPIO
+device	mcp23s17gpio: gpiobus
+attach	mcp23s17gpio at spi
+file	dev/spi/mcp23s17.c		mcp23s17gpio

Added files:

Index: src/share/man/man4/mcp23s17gpio.4
diff -u /dev/null src/share/man/man4/mcp23s17gpio.4:1.1
--- /dev/null	Sun Apr  6 17:59:39 2014
+++ src/share/man/man4/mcp23s17gpio.4	Sun Apr  6 17:59:39 2014
@@ -0,0 +1,61 @@
+.\"	$NetBSD: mcp23s17gpio.4,v 1.1 2014/04/06 17:59:39 kardel Exp $
+.\"
+.\"Copyright (c) 2014 Frank Kardel
+.\"All rights reserved.
+.\"
+.\"Redistribution and use in source and binary forms, with or without
+.\"modification, are permitted provided that the following conditions
+.\"are met:
+.\"1. Redistributions of source code must retain the above copyright
+.\"   notice, this list of conditions and the following disclaimer.
+.\"2. Redistributions in binary form must reproduce the above copyright
+.\"   notice, this list of conditions and the following disclaimer in the
+.\"   documentation and/or other materials provided with the distribution.
+.\"
+.\"THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS
+.\"``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\"TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\"PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\"BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\"CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\"SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\"INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\"CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\"ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\"POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd April 6th, 2014
+.Dt MCP23S17GPIO 4
+.Os
+.Sh NAME
+.Nm mcp23s17gpio
+.Nd Driver for MCP23S17 gpio chip via SPI bus
+.Sh SYNOPSIS
+.Cd "mcp23s17gpio0 at spi? slave 0 flags 0"
+.Cd "mcp23s17gpio1 at spi? slave 0 flags 1"
+.Cd "mcp23s17gpio2 at spi? slave 0 flags 2"
+.Cd "mcp23s17gpio3 at spi? slave 0 flags 3"
+.Cd "gpio* at gpiobus?"
+.Sh DESCRIPTION
+The
+.Nm
+driver supports up to 8 instances of the MCP23S17 16-bit GPIO chips. Access to
+the pins is provided by the
+.Xr gpio 4
+interface. The
+.Nm flags argument selects the hardware address of the chip instance.
+.Sh SEE ALSO
+.Xr spi 4 ,
+.Xr intro 4 ,
+.Xr gpio 4
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Nx 7.0 .
+.Sh AUTHORS
+.An -nosplit
+The
+.Nm
+driver was written by
+.An Frank Kardel Aq Mt kar...@netbsd.org .

Index: src/sys/dev/spi/mcp23s17.c
diff -u /dev/null src/sys/dev/spi/mcp23s17.c:1.1
--- /dev/null	Sun Apr  6 17:59:39 2014
+++ src/sys/dev/spi/mcp23s17.c	Sun Apr  6 17:59:39 2014
@@ -0,0 +1,301 @@
+/*      $NetBSD: mcp23s17.c,v 1.1 2014/04/06 17:59:39 kardel Exp $ */
+
+/*-
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Frank Kardel.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: mcp23s17.c,v 1.1 2014/04/06 17:59:39 kardel Exp $");
+
+/* 
+ * Driver for Microchip MCP23S17 GPIO
+ *
+ * see: http://ww1.microchip.com/downloads/en/DeviceDoc/21952b.pdf
+ */
+
+#include "gpio.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/kernel.h>
+#include <sys/types.h>
+#include <sys/gpio.h>
+#include <sys/sysctl.h>
+
+#include <dev/gpio/gpiovar.h>
+
+#include <dev/spi/spivar.h>
+
+#include <dev/spi/mcp23s17.h>
+
+/* #define MCP23S17_DEBUG */
+#ifdef MCP23S17_DEBUG
+int mcp23S17debug = 3;
+#define DPRINTF(l, x)	do { if (l <= mcp23S17debug) { printf x; } } while (0)
+#else
+#define DPRINTF(l, x)
+#endif
+
+struct mcp23s17gpio_softc {
+	device_t                sc_dev;
+	struct spi_handle      *sc_sh; 
+	uint8_t                 sc_ha;   /* hardware address */
+	uint8_t                 sc_bank; /* addressing scheme */
+	struct gpio_chipset_tag	sc_gpio_gc;
+	gpio_pin_t		sc_gpio_pins[MCP23x17_GPIO_NPINS];
+};
+
+static int	mcp23s17gpio_match(device_t, cfdata_t, void *);
+static void	mcp23s17gpio_attach(device_t, device_t, void *);
+
+static void     mcp23s17gpio_write(struct mcp23s17gpio_softc *, uint8_t, uint8_t);
+
+#if NGPIO > 0
+static uint8_t  mcp23s17gpio_read(struct mcp23s17gpio_softc *, uint8_t);
+
+static int      mcp23s17gpio_gpio_pin_read(void *, int);
+static void     mcp23s17gpio_gpio_pin_write(void *, int, int);
+static void     mcp23s17gpio_gpio_pin_ctl(void *, int, int);
+#endif
+
+CFATTACH_DECL_NEW(mcp23s17gpio, sizeof(struct mcp23s17gpio_softc),
+		  mcp23s17gpio_match, mcp23s17gpio_attach, NULL, NULL);
+
+static int
+mcp23s17gpio_match(device_t parent, cfdata_t cf, void *aux)
+{
+	struct spi_attach_args *sa = aux;
+
+	/* MCP23S17 has no way to detect it! */
+
+	/* run at 10MHz */
+	if (spi_configure(sa->sa_handle, SPI_MODE_0, 10000000))
+		return 0;
+
+	return 1;
+}
+
+static void
+mcp23s17gpio_attach(device_t parent, device_t self, void *aux)
+{
+	struct mcp23s17gpio_softc *sc;
+	struct spi_attach_args *sa;
+#if NGPIO > 0
+	int i;
+	struct gpiobus_attach_args gba;
+#endif
+
+	sa = aux;
+	sc = device_private(self);
+	sc->sc_dev = self;
+	sc->sc_sh = sa->sa_handle;
+	sc->sc_bank = 0;
+	sc->sc_ha = device_cfdata(sc->sc_dev)->cf_flags & 0x7;
+
+	aprint_naive(": GPIO\n");	
+	aprint_normal(": MCP23S17 GPIO (ha=%d)\n", sc->sc_ha);
+
+	DPRINTF(1, ("%s: initialize (HAEN|SEQOP)\n", device_xname(sc->sc_dev)));
+
+	/* basic setup */
+	mcp23s17gpio_write(sc, MCP23x17_IOCONA(sc->sc_bank), MCP23x17_IOCON_HAEN|MCP23x17_IOCON_SEQOP);
+
+#if NGPIO > 0
+	for (i = 0; i < MCP23x17_GPIO_NPINS; i++) {
+		sc->sc_gpio_pins[i].pin_num = i;
+		sc->sc_gpio_pins[i].pin_caps = GPIO_PIN_INPUT |
+			GPIO_PIN_OUTPUT |
+			GPIO_PIN_PUSHPULL | GPIO_PIN_TRISTATE |
+			GPIO_PIN_PULLUP |
+			GPIO_PIN_INVIN;
+		
+		/* read initial state */
+		sc->sc_gpio_pins[i].pin_state =
+			mcp23s17gpio_gpio_pin_read(sc, i);
+	}
+
+	/* create controller tag */
+	sc->sc_gpio_gc.gp_cookie = sc;
+	sc->sc_gpio_gc.gp_pin_read = mcp23s17gpio_gpio_pin_read;
+	sc->sc_gpio_gc.gp_pin_write = mcp23s17gpio_gpio_pin_write;
+	sc->sc_gpio_gc.gp_pin_ctl = mcp23s17gpio_gpio_pin_ctl;
+	
+	gba.gba_gc = &sc->sc_gpio_gc;
+	gba.gba_pins = sc->sc_gpio_pins;
+	gba.gba_npins = MCP23x17_GPIO_NPINS;
+
+	config_found_ia(self, "gpiobus", &gba, gpiobus_print);
+#else
+	aprint_normal_dev(sc->sc_dev, "no GPIO configured in kernel");
+#endif
+}
+
+#if NGPIO > 0
+static uint8_t
+mcp23s17gpio_read(struct mcp23s17gpio_softc *sc, uint8_t addr)
+{
+	uint8_t buf[2];
+	uint8_t val = 0;
+	int rc;
+
+	buf[0] = MCP23x17_OP_READ(sc->sc_ha);
+	buf[1] = addr;
+
+	rc = spi_send_recv(sc->sc_sh, 2, buf, 1, &val);
+	if (rc != 0)
+	{
+		aprint_normal_dev(sc->sc_dev, "SPI send_recv failed rc=%d\n", rc); 
+	}
+
+	DPRINTF(3, ("%s: read(0x%02x) @0x%02x->0x%02x\n", device_xname(sc->sc_dev), buf[0], addr, val));
+	return val;
+}
+#endif
+
+static void
+mcp23s17gpio_write(struct mcp23s17gpio_softc *sc, uint8_t addr, uint8_t val)
+{
+	uint8_t buf[3];
+	int rc;
+
+	buf[0] = MCP23x17_OP_WRITE(sc->sc_ha);
+	buf[1] = addr;
+	buf[2] = val;
+
+	rc = spi_send(sc->sc_sh, 3, buf);
+	if (rc != 0)
+	{
+		aprint_normal_dev(sc->sc_dev, "SPI send failed rc=%d\n", rc); 
+	}
+	DPRINTF(3, ("%s: write(0x%02x) @0x%02x<-0x%02x\n", device_xname(sc->sc_dev), buf[0], addr, val));
+}
+
+#if NGPIO > 0
+/* GPIO support functions */
+static int
+mcp23s17gpio_gpio_pin_read(void *arg, int pin)
+{
+	struct mcp23s17gpio_softc *sc = arg;
+	int epin = pin & MCP23x17_GPIO_NPINS_MASK;
+	uint8_t data;
+	uint8_t addr;
+	int val;
+
+	if (epin < 8) {
+		addr = MCP23x17_GPIOA(sc->sc_bank);
+	} else {
+		addr = MCP23x17_GPIOB(sc->sc_bank);
+		epin = pin - 8;
+	}
+
+	data = mcp23s17gpio_read(sc, addr);
+
+	val = data & (1 << epin) ? GPIO_PIN_HIGH : GPIO_PIN_LOW;
+
+	DPRINTF(2, ("%s: gpio_read pin %d->%d\n", device_xname(sc->sc_dev), pin, (val == GPIO_PIN_HIGH)));
+	
+	return val;
+}
+
+static void
+mcp23s17gpio_gpio_pin_write(void *arg, int pin, int value)
+{
+	struct mcp23s17gpio_softc *sc = arg;
+	int epin = pin & MCP23x17_GPIO_NPINS_MASK;
+	uint8_t data;
+	uint8_t addr;
+
+	if (epin < 8) {
+		addr = MCP23x17_OLATA(sc->sc_bank);
+	} else {
+		addr = MCP23x17_OLATB(sc->sc_bank);
+		epin = pin - 8;
+	}
+
+	data = mcp23s17gpio_read(sc, addr);
+
+	if (value == GPIO_PIN_HIGH) {
+		data |= 1 << epin;
+	} else {
+		data &= ~(1 << epin);
+	}
+
+	mcp23s17gpio_write(sc, addr, data);
+
+	DPRINTF(2, ("%s: gpio_write pin %d<-%d\n", device_xname(sc->sc_dev), pin, (value == GPIO_PIN_HIGH)));
+}
+
+static void
+mcp23s17gpio_gpio_pin_ctl(void *arg, int pin, int flags)
+{
+	struct mcp23s17gpio_softc *sc = arg;
+	int epin = pin & MCP23x17_GPIO_NPINS_MASK;
+	uint8_t bit;
+	uint8_t port;
+	uint8_t data;
+
+	if (epin < 8) {
+		port = 0;
+	} else {
+		port = 1;
+		epin = pin - 8;
+	}
+
+	bit = 1 << epin;
+
+	DPRINTF(2, ("%s: gpio_ctl pin %d flags 0x%x\n", device_xname(sc->sc_dev), pin, flags));
+
+	if (flags & (GPIO_PIN_OUTPUT|GPIO_PIN_INPUT)) {
+		data = mcp23s17gpio_read(sc, MCP23x17_IODIR(sc->sc_bank, port));
+		if ((flags & GPIO_PIN_INPUT) || !(flags & GPIO_PIN_OUTPUT)) {
+			/* for safety INPUT will overide output */
+			data |= bit;
+		} else {
+			data &= ~bit;
+		}
+		mcp23s17gpio_write(sc, MCP23x17_IODIR(sc->sc_bank, port), data);
+	}
+
+	data = mcp23s17gpio_read(sc, MCP23x17_IPOL(sc->sc_bank, port));
+	if (flags & GPIO_PIN_INVIN) {
+		data |= bit;
+	} else {
+		data &= ~bit;
+	}
+	mcp23s17gpio_write(sc, MCP23x17_IPOL(sc->sc_bank, port), data);
+
+	data = mcp23s17gpio_read(sc, MCP23x17_GPPU(sc->sc_bank, port));
+	if (flags & GPIO_PIN_PULLUP) {
+		data |= bit;
+	} else {
+		data &= ~bit;
+	}
+	mcp23s17gpio_write(sc, MCP23x17_GPPU(sc->sc_bank, port), data);
+} 
+#endif /* NGPIO > 0 */
Index: src/sys/dev/spi/mcp23s17.h
diff -u /dev/null src/sys/dev/spi/mcp23s17.h:1.1
--- /dev/null	Sun Apr  6 17:59:39 2014
+++ src/sys/dev/spi/mcp23s17.h	Sun Apr  6 17:59:39 2014
@@ -0,0 +1,96 @@
+/*      $NetBSD: mcp23s17.h,v 1.1 2014/04/06 17:59:39 kardel Exp $ */
+
+/*-
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Frank Kardel.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef MCP23S17_H
+#define MCP23S17_H
+
+/*
+ * SPI connected 16-bit general purpose parallel I/O
+ *
+ * see http://ww1.microchip.com/downloads/en/DeviceDoc/21952b.pdf
+ */
+
+/* resources */
+#define MCP23x17_GPIO_NPINS	16
+#define MCP23x17_GPIO_NPINS_MASK (MCP23x17_GPIO_NPINS-1)
+
+/* address layout */
+#define MCP23x17_BANKADDR(BANK, ADDR, PORT) (((BANK) == 1) ? ((PORT) << 4 | (ADDR)) : ((ADDR)<<1 | (PORT)))
+
+#define MCP23x17_IODIR(BANK, PORT) MCP23x17_BANKADDR(BANK, 0x0, PORT)
+#define MCP23x17_IODIRA(BANK)   MCP23x17_IODIR(BANK, 0)
+#define MCP23x17_IODIRB(BANK)   MCP23x17_IODIR(BANK, 1)
+#define MCP23x17_IPOL(BANK, PORT) MCP23x17_BANKADDR(BANK, 0x1, PORT)
+#define MCP23x17_IPOLA(BANK)    MCP23x17_IPOL(BANK, 0)
+#define MCP23x17_IPOLB(BANK)    MCP23x17_IPOL(BANK, 1)
+#define MCP23x17_GPINTEN(BANK, PORT) MCP23x17_BANKADDR(BANK, 0x2, PORT)
+#define MCP23x17_GPINTENA(BANK) MCP23x17_GPINTEN(BANK, 0)
+#define MCP23x17_GPINTENB(BANK) MCP23x17_GPINTEN(BANK, 1)
+#define MCP23x17_DEFVAL(BANK, PORT)  MCP23x17_BANKADDR(BANK, 0x3, PORT)
+#define MCP23x17_DEFVALA(BANK)  MCP23x17_DEFVAL(BANK, 0)
+#define MCP23x17_DEFVALB(BANK)  MCP23x17_DEFVAL(BANK, 1)
+#define MCP23x17_INTCON(BANK, PORT)  MCP23x17_BANKADDR(BANK, 0x4, PORT)
+#define MCP23x17_INTCONA(BANK)  MCP23x17_INTCON(BANK, 0)
+#define MCP23x17_INTCONB(BANK)  MCP23x17_INTCON(BANK, 0)
+#define MCP23x17_IOCON(BANK, PORT)   MCP23x17_BANKADDR(BANK, 0x5, PORT)
+#define MCP23x17_IOCONA(BANK)   MCP23x17_IOCON(BANK, 0)
+#define MCP23x17_IOCONB(BANK)   MCP23x17_IOCON(BANK, 1)
+#define MCP23x17_GPPU(BANK, PORT)    MCP23x17_BANKADDR(BANK, 0x6, PORT)
+#define MCP23x17_GPPUA(BANK)     MCP23x17_GPPU(BANK, 0)
+#define MCP23x17_GPPUB(BANK)     MCP23x17_GPPU(BANK, 1)
+#define MCP23x17_INTF(BANK, PORT)    MCP23x17_BANKADDR(BANK, 0x7, PORT)
+#define MCP23x17_INTFA(BANK)    MCP23x17_INTF(BANK, 0)
+#define MCP23x17_INTFB(BANK)    MCP23x17_INTF(BANK, 1)
+#define MCP23x17_INTCAP(BANK, PORT)  MCP23x17_BANKADDR(BANK, 0x8, PORT)
+#define MCP23x17_INTCAPA(BANK)  MCP23x17_INTCAP(BANK, 0)
+#define MCP23x17_INTCAPB(BANK)  MCP23x17_INTCAP(BANK, 1)
+#define MCP23x17_GPIO(BANK, PORT)    MCP23x17_BANKADDR(BANK, 0x9, PORT)
+#define MCP23x17_GPIOA(BANK)    MCP23x17_GPIO(BANK, 0)
+#define MCP23x17_GPIOB(BANK)    MCP23x17_GPIO(BANK, 1)
+#define MCP23x17_OLAT(BANK, PORT)    MCP23x17_BANKADDR(BANK, 0xA, PORT)
+#define MCP23x17_OLATA(BANK)    MCP23x17_OLAT(BANK, 0)
+#define MCP23x17_OLATB(BANK)    MCP23x17_OLAT(BANK, 1)
+
+/* commands */
+#define MCP23x17_OP_BASE_WR     0x40 /* write register */
+#define MCP23x17_OP_BASE_RD     0x41 /* read register */
+#define MCP23x17_OP_READ(HA)    (MCP23x17_OP_BASE_RD|(HA)<<1)
+#define MCP23x17_OP_WRITE(HA)   (MCP23x17_OP_BASE_WR|(HA)<<1)
+
+/* bits */
+#define MCP23x17_IOCON_BANK	__BIT(7) /* select address layout */
+#define MCP23x17_IOCON_MIRROR	__BIT(6) /* mirror INTA/INTB interrupt outputs */
+#define MCP23x17_IOCON_SEQOP	__BIT(5) /* sequential address operation */
+#define MCP23x17_IOCON_DISLW	__BIT(4) /* slew rate SDA output */
+#define MCP23x17_IOCON_HAEN	__BIT(3) /* hardware address enable bit (only MCP23S17) */
+#define MCP23x17_IOCON_ODR	__BIT(2) /* configure INT pin as open drain */
+#define MCP23x17_IOCON_INTPOL	__BIT(1) /* INT pin polarity (unless ODR is set) */
+
+#endif

Reply via email to