Module Name: src
Committed By: christos
Date: Thu Aug 11 09:05:43 UTC 2016
Modified Files:
src/sys/dev/tc: files.tc tcdevs
Added Files:
src/sys/dev/tc: slhci_tcu.c tcu.c
Log Message:
TURBOchannel usb/gpio driver from Felix Deichmann
To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/sys/dev/tc/files.tc
cvs rdiff -u -r0 -r1.1 src/sys/dev/tc/slhci_tcu.c src/sys/dev/tc/tcu.c
cvs rdiff -u -r1.21 -r1.22 src/sys/dev/tc/tcdevs
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/tc/files.tc
diff -u src/sys/dev/tc/files.tc:1.33 src/sys/dev/tc/files.tc:1.34
--- src/sys/dev/tc/files.tc:1.33 Wed Feb 27 18:49:11 2008
+++ src/sys/dev/tc/files.tc Thu Aug 11 05:05:42 2016
@@ -1,4 +1,4 @@
-# $NetBSD: files.tc,v 1.33 2008/02/27 23:49:11 matt Exp $
+# $NetBSD: files.tc,v 1.34 2016/08/11 09:05:42 christos Exp $
#
# Config file and device description for machine-independent
# TURBOchannel code. Included by ports that need it.
@@ -100,3 +100,11 @@ file dev/tc/pxg.c p
device sfbp: wsemuldisplaydev, rasops32, rasops8
attach sfbp at tc
file dev/tc/sfbplus.c sfbp needs-flag
+
+# TC-USB
+device tcu { } : gpiobus
+attach tcu at tc
+file dev/tc/tcu.c tcu
+
+attach slhci at tcu with slhci_tcu
+file dev/tc/slhci_tcu.c slhci_tcu needs-flag
Index: src/sys/dev/tc/tcdevs
diff -u src/sys/dev/tc/tcdevs:1.21 src/sys/dev/tc/tcdevs:1.22
--- src/sys/dev/tc/tcdevs:1.21 Wed Jan 21 09:34:18 2009
+++ src/sys/dev/tc/tcdevs Thu Aug 11 05:05:42 2016
@@ -1,4 +1,4 @@
-$NetBSD: tcdevs,v 1.21 2009/01/21 14:34:18 jnemeth Exp $
+$NetBSD: tcdevs,v 1.22 2016/08/11 09:05:42 christos Exp $
/*
* Copyright (c) 1996 Christopher G. Demetriou
@@ -83,6 +83,7 @@ device PMAZC-AA tcds 53c94 TCDS Fast SCS
device PMTNV-AA ??? Non-volatile RAM option card
device T1D4PKT ds DECWRL Turbochannel T1
device T3PKT tt DECWRL Turbochannel T3
+device TC-USB tcu flxd TC-USB
# the following entries are unconfirmed
#device PMAF-CA fza DEC FDDIcontroller 700C (DEFZA; copper)
Added files:
Index: src/sys/dev/tc/slhci_tcu.c
diff -u /dev/null src/sys/dev/tc/slhci_tcu.c:1.1
--- /dev/null Thu Aug 11 05:05:43 2016
+++ src/sys/dev/tc/slhci_tcu.c Thu Aug 11 05:05:42 2016
@@ -0,0 +1,101 @@
+/* $NetBSD: slhci_tcu.c,v 1.1 2016/08/11 09:05:42 christos Exp $ */
+
+/*-
+ * Copyright (c) 2016, Felix Deichmann
+ * 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 COPYRIGHT HOLDERS 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.
+ */
+
+/*
+ * flxd TC-USB - TURBOchannel USB host option
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: slhci_tcu.c,v 1.1 2016/08/11 09:05:42 christos Exp $");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+
+#include <sys/bus.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usbdivar.h>
+
+#include <dev/ic/sl811hsreg.h>
+#include <dev/ic/sl811hsvar.h>
+
+#include <dev/tc/tcvar.h>
+
+struct slhci_tcu_softc {
+ struct slhci_softc sc;
+};
+
+static int slhci_tcu_match(device_t, cfdata_t, void *);
+static void slhci_tcu_attach(device_t, device_t, void *);
+
+CFATTACH_DECL_NEW(slhci_tcu, sizeof(struct slhci_tcu_softc),
+ slhci_tcu_match, slhci_tcu_attach, NULL, slhci_activate);
+
+static int
+slhci_tcu_match(device_t parent, cfdata_t cf, void *aux)
+{
+
+ /* Always match. */
+ return 1;
+}
+
+#define SLHCI_TCU_STRIDE 4
+#define SLHCI_TCU_IMAX 500 /* mA */
+
+static void
+slhci_tcu_attach(device_t parent, device_t self, void *aux)
+{
+ struct slhci_tcu_softc *tsc = device_private(self);
+ struct slhci_softc *sc = &tsc->sc;
+ struct tc_attach_args *ta = aux;
+ bus_space_tag_t iot = ta->ta_memt;
+ bus_space_handle_t ioh;
+ int error;
+
+ sc->sc_dev = self;
+ sc->sc_bus.ub_hcpriv = sc;
+
+ aprint_normal("\n");
+
+ error = bus_space_map(iot, ta->ta_addr,
+ SLHCI_TCU_STRIDE * SL11_PORTSIZE, 0, &ioh);
+ if (error) {
+ aprint_error_dev(self, "bus_space_map() failed (%d)\n", error);
+ return;
+ }
+
+ slhci_preinit(sc, NULL, iot, ioh, SLHCI_TCU_IMAX, SLHCI_TCU_STRIDE);
+
+ tc_intr_establish(device_parent(parent), ta->ta_cookie, IPL_USB,
+ slhci_intr, sc);
+
+ if (slhci_attach(sc))
+ aprint_error_dev(self, "slhci_attach() failed\n");
+}
Index: src/sys/dev/tc/tcu.c
diff -u /dev/null src/sys/dev/tc/tcu.c:1.1
--- /dev/null Thu Aug 11 05:05:43 2016
+++ src/sys/dev/tc/tcu.c Thu Aug 11 05:05:42 2016
@@ -0,0 +1,221 @@
+/* $NetBSD: tcu.c,v 1.1 2016/08/11 09:05:42 christos Exp $ */
+
+/*-
+ * Copyright (c) 2016, Felix Deichmann
+ * 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 COPYRIGHT HOLDERS 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.
+ */
+
+/*
+ * flxd TC-USB - TURBOchannel USB host option
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: tcu.c,v 1.1 2016/08/11 09:05:42 christos Exp $");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/gpio.h>
+
+#include <sys/bus.h>
+
+#include <dev/tc/tcvar.h>
+
+#include <dev/gpio/gpiovar.h>
+
+#include "gpio.h"
+#include "slhci_tcu.h"
+
+#define TCU_GPIO_NPINS 8
+#define TCU_GPIO_OFFS 0x80
+#define TCU_GPIO_SIZE (3 * 4)
+#define TCU_GPIO_DIR 0x0
+#define TCU_GPIO_IN 0x4
+#define TCU_GPIO_OUT 0x8
+
+struct tcu_softc {
+#if NGPIO > 0
+ kmutex_t sc_gpio_mtx;
+ struct gpio_chipset_tag sc_gpio_gc;
+ gpio_pin_t sc_gpio_pins[TCU_GPIO_NPINS];
+ bus_space_tag_t sc_gpio_iot;
+ bus_space_handle_t sc_gpio_ioh;
+#endif /* NGPIO > 0 */
+};
+
+static int tcu_match(device_t, cfdata_t, void *);
+static void tcu_attach(device_t, device_t, void *);
+
+#if NSLHCI_TCU > 0
+static int tcu_print(void *, const char *);
+#endif /* NSLHCI_TCU > 0 */
+#if NGPIO > 0
+static void tcu_gpio_attach(device_t, device_t, void *);
+static int tcu_gpio_read(void *, int);
+static void tcu_gpio_write(void *, int, int);
+static void tcu_gpio_ctl(void *, int, int);
+#endif /* NGPIO > 0 */
+
+CFATTACH_DECL_NEW(tcu, sizeof(struct tcu_softc),
+ tcu_match, tcu_attach, NULL, NULL);
+
+static int
+tcu_match(device_t parent, cfdata_t cf, void *aux)
+{
+ struct tc_attach_args *ta = aux;
+
+ if (strncmp("TC-USB ", ta->ta_modname, TC_ROM_LLEN))
+ return 0;
+
+ return 1;
+}
+
+static void
+tcu_attach(device_t parent, device_t self, void *aux)
+{
+
+ printf(": TC-USB\n");
+#if NSLHCI_TCU > 0
+ /* Attach slhci. */
+ (void)config_found_ia(self, "tcu", aux, tcu_print);
+#endif /* NSLHCI_TCU > 0 */
+#if NGPIO > 0
+ /* Attach gpio(bus). */
+ tcu_gpio_attach(parent, self, aux);
+#endif /* NGPIO > 0 */
+}
+
+#if NSLHCI_TCU > 0
+static int
+tcu_print(void *aux, const char *pnp)
+{
+
+ /* This function is only used for "slhci at tcu". */
+ if (pnp)
+ aprint_normal("slhci at %s", pnp);
+
+ return UNCONF;
+}
+#endif /* NSLHCI_TCU > 0 */
+
+#if NGPIO > 0
+static void
+tcu_gpio_attach(device_t parent, device_t self, void *aux)
+{
+ struct tcu_softc *sc = device_private(self);
+ struct tc_attach_args *ta = aux;
+ struct gpiobus_attach_args gba;
+ bus_space_tag_t iot = ta->ta_memt;
+ uint32_t v;
+ int error;
+
+ sc->sc_gpio_iot = iot;
+
+ error = bus_space_map(iot, ta->ta_addr + TCU_GPIO_OFFS, TCU_GPIO_SIZE,
+ 0, &sc->sc_gpio_ioh);
+ if (error) {
+ aprint_error_dev(self, "bus_space_map() failed (%d)\n", error);
+ return;
+ }
+
+ mutex_init(&sc->sc_gpio_mtx, MUTEX_DEFAULT, IPL_NONE);
+
+ v = bus_space_read_4(sc->sc_gpio_iot, sc->sc_gpio_ioh, TCU_GPIO_DIR);
+
+ for (int pin = 0; pin < TCU_GPIO_NPINS; pin++) {
+ sc->sc_gpio_pins[pin].pin_num = pin;
+ sc->sc_gpio_pins[pin].pin_caps = GPIO_PIN_INPUT |
+ GPIO_PIN_OUTPUT;
+ sc->sc_gpio_pins[pin].pin_flags = (v & (UINT32_C(1) << pin)) ?
+ GPIO_PIN_OUTPUT : GPIO_PIN_INPUT;
+ sc->sc_gpio_pins[pin].pin_state = tcu_gpio_read(sc, pin);
+ }
+
+ sc->sc_gpio_gc.gp_cookie = sc;
+ sc->sc_gpio_gc.gp_pin_read = tcu_gpio_read;
+ sc->sc_gpio_gc.gp_pin_write = tcu_gpio_write;
+ sc->sc_gpio_gc.gp_pin_ctl = tcu_gpio_ctl;
+
+ memset(&gba, 0, sizeof(gba));
+
+ gba.gba_gc = &sc->sc_gpio_gc;
+ gba.gba_pins = sc->sc_gpio_pins;
+ gba.gba_npins = TCU_GPIO_NPINS;
+
+ (void)config_found_ia(self, "gpiobus", &gba, gpiobus_print);
+}
+
+static int
+tcu_gpio_read(void *arg, int pin)
+{
+ struct tcu_softc *sc = arg;
+ uint32_t v;
+
+ mutex_enter(&sc->sc_gpio_mtx);
+ v = bus_space_read_4(sc->sc_gpio_iot, sc->sc_gpio_ioh, TCU_GPIO_IN);
+ mutex_exit(&sc->sc_gpio_mtx);
+
+ return (v & (UINT32_C(1) << pin)) ? GPIO_PIN_HIGH : GPIO_PIN_LOW;
+}
+
+static void
+tcu_gpio_write(void *arg, int pin, int val)
+{
+ struct tcu_softc *sc = arg;
+ uint32_t v;
+
+ mutex_enter(&sc->sc_gpio_mtx);
+
+ v = bus_space_read_4(sc->sc_gpio_iot, sc->sc_gpio_ioh, TCU_GPIO_OUT);
+
+ if (val == GPIO_PIN_LOW)
+ v &= ~(UINT32_C(1) << pin);
+ else if (val == GPIO_PIN_HIGH)
+ v |= (UINT32_C(1) << pin);
+
+ bus_space_write_4(sc->sc_gpio_iot, sc->sc_gpio_ioh, TCU_GPIO_OUT, v);
+
+ mutex_exit(&sc->sc_gpio_mtx);
+}
+
+static void
+tcu_gpio_ctl(void *arg, int pin, int flags)
+{
+ struct tcu_softc *sc = arg;
+ uint32_t v;
+
+ mutex_enter(&sc->sc_gpio_mtx);
+
+ v = bus_space_read_4(sc->sc_gpio_iot, sc->sc_gpio_ioh, TCU_GPIO_DIR);
+
+ if (flags & GPIO_PIN_INPUT)
+ v &= ~(UINT32_C(1) << pin);
+ if (flags & GPIO_PIN_OUTPUT)
+ v |= (UINT32_C(1) << pin);
+
+ bus_space_write_4(sc->sc_gpio_iot, sc->sc_gpio_ioh, TCU_GPIO_DIR, v);
+
+ mutex_exit(&sc->sc_gpio_mtx);
+}
+#endif /* NGPIO > 0 */