Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/powerpc/ibm4xx/dev Add driver for On-chip General P...
details: https://anonhg.NetBSD.org/src/rev/8b99d17b5ea6
branches: trunk
changeset: 573247:8b99d17b5ea6
user: shige <shige%NetBSD.org@localhost>
date: Sun Jan 23 19:22:22 2005 +0000
description:
Add driver for On-chip General Purpose I/O.
diffstat:
sys/arch/powerpc/ibm4xx/dev/gpio_opb.c | 216 +++++++++++++++++++++++++++++++++
sys/arch/powerpc/ibm4xx/dev/gpioreg.h | 33 ++++-
sys/arch/powerpc/ibm4xx/dev/gpiovar.h | 63 +++++++++
3 files changed, 306 insertions(+), 6 deletions(-)
diffs (truncated from 332 to 300 lines):
diff -r 3d14f7123ffd -r 8b99d17b5ea6 sys/arch/powerpc/ibm4xx/dev/gpio_opb.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/powerpc/ibm4xx/dev/gpio_opb.c Sun Jan 23 19:22:22 2005 +0000
@@ -0,0 +1,216 @@
+/* $NetBSD: gpio_opb.c,v 1.1 2005/01/23 19:22:22 shige Exp $ */
+
+/*
+ * Copyright (c) 2004 Shigeyuki Fukushima.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 "locators.h"
+
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/systm.h>
+
+#include <machine/pio.h>
+
+#include <powerpc/ibm4xx/dcr405gp.h>
+#include <powerpc/ibm4xx/dev/opbvar.h>
+#include <powerpc/ibm4xx/dev/gpioreg.h>
+#include <powerpc/ibm4xx/dev/gpiovar.h>
+
+struct gpio_softc {
+ struct device sc_dev; /* device generic */
+ struct gpio_controller sc_gpio; /* GPIO controller */
+ u_long sc_addr; /* GPIO controller address */
+};
+
+static int gpio_print(void *, const char *);
+static int gpio_search(struct device *, struct cfdata *,
+ const locdesc_t *ldesc, void *aux);
+static int gpio_match(struct device *, struct cfdata *, void *);
+static void gpio_attach(struct device *, struct device *, void *);
+
+static int gpio_or_read(void *, int);
+static int gpio_tcr_read(void *, int);
+static int gpio_odr_read(void *, int);
+static int gpio_ir_read(void *, int);
+static void gpio_or_write(void *arg, int addr, int bit);
+static void gpio_tcr_write(void *arg, int addr, int bit);
+static void gpio_odr_write(void *arg, int addr, int bit);
+
+static int gpio_read_bit(void *, int, int);
+static void gpio_write_bit(void *, int, int, int);
+static uint32_t gpio_read(void *, int);
+static void gpio_write(void *, int, uint32_t);
+
+CFATTACH_DECL(gpio, sizeof(struct gpio_softc),
+ gpio_match, gpio_attach, NULL, NULL);
+
+static int
+gpio_print(void *aux, const char *pnp)
+{
+ struct gpio_attach_args *gaa = aux;
+
+ aprint_normal(" addr GPIO#%d", gaa->ga_addr);
+
+ return (UNCONF);
+}
+
+static int
+gpio_search(struct device *parent, struct cfdata *cf,
+ const locdesc_t *ldesc, void *aux)
+{
+ struct gpio_softc *sc = (void *)parent;
+ struct gpio_attach_args gaa;
+
+ gaa.ga_tag = &sc->sc_gpio;
+ gaa.ga_addr = cf->cf_loc[GPIOCF_ADDR];
+
+ if (config_match(parent, cf, &gaa) > 0)
+ config_attach(parent, cf, &gaa, gpio_print);
+
+ return (0);
+}
+
+static int
+gpio_match(struct device *parent, struct cfdata *cf, void *args)
+{
+ struct opb_attach_args *oaa = args;
+
+ if (strcmp(oaa->opb_name, cf->cf_name) != 0)
+ return (0);
+
+ return (1);
+}
+
+static void
+gpio_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct gpio_softc *sc = (struct gpio_softc *)self;
+ struct opb_attach_args *oaa = aux;
+
+ aprint_naive(": GPIO controller\n");
+ aprint_normal(": On-Chip GPIO controller\n");
+
+ sc->sc_addr = oaa->opb_addr;
+ sc->sc_gpio.cookie = sc;
+ sc->sc_gpio.io_or_read = gpio_or_read;
+ sc->sc_gpio.io_tcr_read = gpio_tcr_read;
+ sc->sc_gpio.io_odr_read = gpio_odr_read;
+ sc->sc_gpio.io_ir_read = gpio_ir_read;
+ sc->sc_gpio.io_or_write = gpio_or_write;
+ sc->sc_gpio.io_tcr_write = gpio_tcr_write;
+ sc->sc_gpio.io_odr_write = gpio_odr_write;
+
+ (void) config_search_ia(gpio_search, self, "gpio", NULL);
+}
+
+static int
+gpio_or_read(void *arg, int addr)
+{
+ return (gpio_read_bit(arg, GPIO_OR, addr));
+}
+
+static int
+gpio_tcr_read(void *arg, int addr)
+{
+ return (gpio_read_bit(arg, GPIO_TCR, addr));
+}
+
+static int
+gpio_odr_read(void *arg, int addr)
+{
+ return (gpio_read_bit(arg, GPIO_ODR, addr));
+}
+
+static int
+gpio_ir_read(void *arg, int addr)
+{
+ gpio_write_bit(arg, GPIO_ODR, addr, 0);
+ gpio_write_bit(arg, GPIO_TCR, addr, 0);
+ return (gpio_read_bit(arg, GPIO_ODR, addr));
+}
+
+static void
+gpio_or_write(void *arg, int addr, int bit)
+{
+ gpio_write_bit(arg, GPIO_ODR, addr, 0);
+ gpio_write_bit(arg, GPIO_TCR, addr, 1);
+ gpio_write_bit(arg, GPIO_OR, addr, bit);
+}
+
+static void
+gpio_tcr_write(void *arg, int addr, int bit)
+{
+ gpio_write_bit(arg, GPIO_TCR, addr, bit);
+}
+
+static void
+gpio_odr_write(void *arg, int addr, int bit)
+{
+ gpio_write_bit(arg, GPIO_ODR, addr, bit);
+}
+
+static int
+gpio_read_bit(void *arg, int offset, int addr)
+{
+ uint32_t rv = gpio_read(arg, offset);
+ uint32_t mask = GPIO_SBIT(addr);
+
+ return ((rv & mask) >> GPIO_SHIFT(addr));
+}
+
+void
+gpio_write_bit(void *arg, int offset, int addr, int bit)
+{
+ uint32_t rv = gpio_read(arg, offset);
+ uint32_t mask = GPIO_SBIT(addr);
+
+ rv = rv & ~mask;
+ rv = rv | ((bit << GPIO_SHIFT(addr)) & mask);
+ gpio_write(arg, offset, rv);
+}
+
+static uint32_t
+gpio_read(void *arg, int offset)
+{
+ struct gpio_softc *sc = arg;
+ uint32_t rv;
+
+ rv = inl(sc->sc_addr + offset);
+
+ return rv;
+}
+
+static void
+gpio_write(void *arg, int offset, uint32_t out)
+{
+ struct gpio_softc *sc = arg;
+
+ outl((sc->sc_addr + offset), out);
+}
diff -r 3d14f7123ffd -r 8b99d17b5ea6 sys/arch/powerpc/ibm4xx/dev/gpioreg.h
--- a/sys/arch/powerpc/ibm4xx/dev/gpioreg.h Sun Jan 23 19:10:23 2005 +0000
+++ b/sys/arch/powerpc/ibm4xx/dev/gpioreg.h Sun Jan 23 19:22:22 2005 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: gpioreg.h,v 1.1 2002/08/13 04:57:49 simonb Exp $ */
+/* $NetBSD: gpioreg.h,v 1.2 2005/01/23 19:22:22 shige Exp $ */
/*
* Copyright 2001 Wasabi Systems, Inc.
@@ -38,9 +38,30 @@
#ifndef _IBM4XX_GPIOREG_H_
#define _IBM4XX_GPIOREG_H_
-/* GPIO Registers */
-#define GPIO_OR 0x00 /* Output */
-#define GPIO_TCR 0x04 /* Three-State Control */
-#define GPIO_ODR 0x18 /* Open Drain */
-#define GPIO_IR 0x1c /* Input */
+/*
+ * GPIO Registers
+ */
+
+/*
+ * GPIO ODR Control Logic:
+ * ODR OR Out TCR TS_Ctrl Module I/O 3-State Driver
+ * 0 X X 0 0 Forced to high impedance state
+ * 0 0 0 1 1 Drive 0
+ * 0 1 1 1 1 Drive 1
+ * 1 0 0 X 1 Drive 0
+ * 1 1 0 X 0 Forced to high impedance state
+ */
+
+/* GPIO Registers 0x00-0x7f */
+#define GPIO_NREG (0x80)
+
+#define GPIO_SHIFT(n) (31 - n)
+#define GPIO_SBIT(n) (1 << GPIO_SHIFT(n))
+
+/* Offset */
+#define GPIO_OR (0x00) /* Output */
+#define GPIO_TCR (0x04) /* Three-State Control */
+#define GPIO_ODR (0x18) /* Open Drain */
+#define GPIO_IR (0x1c) /* Input */
+
#endif /* _IBM4XX_GPIOREG_H_ */
diff -r 3d14f7123ffd -r 8b99d17b5ea6 sys/arch/powerpc/ibm4xx/dev/gpiovar.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/powerpc/ibm4xx/dev/gpiovar.h Sun Jan 23 19:22:22 2005 +0000
@@ -0,0 +1,63 @@
+/* $NetBSD: gpiovar.h,v 1.1 2005/01/23 19:22:22 shige Exp $ */
+
+/*
+ * Copyright (c) 2003 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Steve C. Woodford and Jason R. Thorpe for Wasabi Systems, Inc.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed for the NetBSD Project by
+ * Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ * or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC
+ * 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
Home |
Main Index |
Thread Index |
Old Index