summaryrefslogtreecommitdiff
path: root/sys/dev/scc
diff options
context:
space:
mode:
authorMarcel Moolenaar <marcel@FreeBSD.org>2006-04-01 04:51:56 +0000
committerMarcel Moolenaar <marcel@FreeBSD.org>2006-04-01 04:51:56 +0000
commitffc08b2147740cc10894d007ae0ab0c8facbe207 (patch)
tree3c1feb43db0867fdcbe32589f10d96a99652ff54 /sys/dev/scc
parent9fe1984e64a5f501170f342edec1d9f4ddb86e5f (diff)
Notes
Diffstat (limited to 'sys/dev/scc')
-rw-r--r--sys/dev/scc/scc_bfe.h4
-rw-r--r--sys/dev/scc/scc_bfe_ebus.c5
-rw-r--r--sys/dev/scc/scc_bfe_macio.c87
-rw-r--r--sys/dev/scc/scc_bfe_sbus.c5
-rw-r--r--sys/dev/scc/scc_core.c10
-rw-r--r--sys/dev/scc/scc_dev_sab82532.c4
-rw-r--r--sys/dev/scc/scc_dev_z8530.c4
7 files changed, 101 insertions, 18 deletions
diff --git a/sys/dev/scc/scc_bfe.h b/sys/dev/scc/scc_bfe.h
index f1e85a1253ed..cb59422389e6 100644
--- a/sys/dev/scc/scc_bfe.h
+++ b/sys/dev/scc/scc_bfe.h
@@ -103,8 +103,6 @@ struct scc_class {
u_int cl_class; /* SCC bus class ID. */
u_int cl_modes; /* Supported modes (bitset). */
int cl_range;
- u_int cl_rclk;
- u_int cl_regshft;
};
extern struct scc_class scc_sab82532_class;
@@ -139,7 +137,7 @@ extern char scc_driver_name[];
int scc_bfe_attach(device_t dev);
int scc_bfe_detach(device_t dev);
-int scc_bfe_probe(device_t dev);
+int scc_bfe_probe(device_t dev, u_int, u_int);
struct resource *scc_bus_alloc_resource(device_t, device_t, int, int *,
u_long, u_long, u_long, u_int);
diff --git a/sys/dev/scc/scc_bfe_ebus.c b/sys/dev/scc/scc_bfe_ebus.c
index 4e5d2effade5..5d67143d4247 100644
--- a/sys/dev/scc/scc_bfe_ebus.c
+++ b/sys/dev/scc/scc_bfe_ebus.c
@@ -42,6 +42,9 @@ __FBSDID("$FreeBSD$");
#include <dev/scc/scc_bfe.h>
+#define EBUS_REGSHFT 0
+#define EBUS_RCLK 29491200
+
static int
scc_ebus_probe(device_t dev)
{
@@ -56,7 +59,7 @@ scc_ebus_probe(device_t dev)
if (!strcmp(nm, "se") || !strcmp(cmpt, "sab82532")) {
device_set_desc(dev, "Siemens SAB 82532 dual channel SCC");
sc->sc_class = &scc_sab82532_class;
- return (scc_bfe_probe(dev));
+ return (scc_bfe_probe(dev, EBUS_REGSHFT, EBUS_RCLK));
}
return (ENXIO);
}
diff --git a/sys/dev/scc/scc_bfe_macio.c b/sys/dev/scc/scc_bfe_macio.c
new file mode 100644
index 000000000000..e0e73182f018
--- /dev/null
+++ b/sys/dev/scc/scc_bfe_macio.c
@@ -0,0 +1,87 @@
+/*-
+ * Copyright (c) 2006 Marcel Moolenaar
+ * 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 ``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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+
+#include <dev/ofw/ofw_bus.h>
+
+#include <machine/bus.h>
+#include <sys/rman.h>
+#include <machine/resource.h>
+
+#include <dev/scc/scc_bfe.h>
+
+#define MACIO_REGSHFT 4
+#define MACIO_RCLK 230400
+
+static int
+scc_macio_probe(device_t dev)
+{
+ struct scc_softc *sc;
+ const char *nm;
+
+ sc = device_get_softc(dev);
+ nm = ofw_bus_get_name(dev);
+ if (!strcmp(nm, "escc")) {
+ device_set_desc(dev, "Zilog Z8530 dual channel SCC");
+ sc->sc_class = &scc_z8530_class;
+ return (scc_bfe_probe(dev, MACIO_REGSHFT, MACIO_RCLK));
+ }
+ return (ENXIO);
+}
+
+static device_method_t scc_macio_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, scc_macio_probe),
+ DEVMETHOD(device_attach, scc_bfe_attach),
+ DEVMETHOD(device_detach, scc_bfe_detach),
+
+ DEVMETHOD(bus_alloc_resource, scc_bus_alloc_resource),
+ DEVMETHOD(bus_release_resource, scc_bus_release_resource),
+ DEVMETHOD(bus_get_resource, scc_bus_get_resource),
+ DEVMETHOD(bus_read_ivar, scc_bus_read_ivar),
+ DEVMETHOD(bus_setup_intr, scc_bus_setup_intr),
+ DEVMETHOD(bus_teardown_intr, scc_bus_teardown_intr),
+ DEVMETHOD(bus_print_child, bus_generic_print_child),
+ DEVMETHOD(bus_driver_added, bus_generic_driver_added),
+ { 0, 0 }
+};
+
+static driver_t scc_macio_driver = {
+ scc_driver_name,
+ scc_macio_methods,
+ sizeof(struct scc_softc),
+};
+
+DRIVER_MODULE(scc, macio, scc_macio_driver, scc_devclass, 0, 0);
diff --git a/sys/dev/scc/scc_bfe_sbus.c b/sys/dev/scc/scc_bfe_sbus.c
index 11e2a49081e4..dc39d7c90e34 100644
--- a/sys/dev/scc/scc_bfe_sbus.c
+++ b/sys/dev/scc/scc_bfe_sbus.c
@@ -42,6 +42,9 @@ __FBSDID("$FreeBSD$");
#include <dev/scc/scc_bfe.h>
+#define SBUS_REGSHFT 1
+#define SBUS_RCLK 307200
+
static int
scc_sbus_probe(device_t dev)
{
@@ -53,7 +56,7 @@ scc_sbus_probe(device_t dev)
if (!strcmp(nm, "zs")) {
device_set_desc(dev, "Zilog Z8530 dual channel SCC");
sc->sc_class = &scc_z8530_class;
- return (scc_bfe_probe(dev));
+ return (scc_bfe_probe(dev, SBUS_REGSHFT, SBUS_RCLK));
}
return (ENXIO);
}
diff --git a/sys/dev/scc/scc_core.c b/sys/dev/scc/scc_core.c
index a4079866cfd0..2cad7ea7bc07 100644
--- a/sys/dev/scc/scc_core.c
+++ b/sys/dev/scc/scc_core.c
@@ -313,7 +313,7 @@ scc_bfe_detach(device_t dev)
}
int
-scc_bfe_probe(device_t dev)
+scc_bfe_probe(device_t dev, u_int regshft, u_int rclk)
{
struct scc_softc *sc;
struct scc_class *cl;
@@ -362,8 +362,8 @@ scc_bfe_probe(device_t dev)
sc->sc_bas.bsh = rman_get_bushandle(sc->sc_rres);
sc->sc_bas.bst = rman_get_bustag(sc->sc_rres);
sc->sc_bas.range = size;
- sc->sc_bas.rclk = sc->sc_class->cl_rclk;
- sc->sc_bas.regshft = sc->sc_class->cl_regshft;
+ sc->sc_bas.rclk = rclk;
+ sc->sc_bas.regshft = regshft;
error = SCC_PROBE(sc);
bus_release_resource(dev, sc->sc_rtype, sc->sc_rrid, sc->sc_rres);
@@ -442,13 +442,13 @@ scc_bus_read_ivar(device_t dev, device_t child, int index, uintptr_t *result)
*result = cl->cl_class;
break;
case SCC_IVAR_CLOCK:
- *result = cl->cl_rclk;
+ *result = sc->sc_bas.rclk;
break;
case SCC_IVAR_MODE:
*result = m->m_mode;
break;
case SCC_IVAR_REGSHFT:
- *result = cl->cl_regshft;
+ *result = sc->sc_bas.regshft;
break;
case SCC_IVAR_HWMTX:
*result = (uintptr_t)&sc->sc_hwmtx;
diff --git a/sys/dev/scc/scc_dev_sab82532.c b/sys/dev/scc/scc_dev_sab82532.c
index e7393eda2bda..f8845c517cf3 100644
--- a/sys/dev/scc/scc_dev_sab82532.c
+++ b/sys/dev/scc/scc_dev_sab82532.c
@@ -42,8 +42,6 @@ __FBSDID("$FreeBSD$");
#include "scc_if.h"
-#define DEFAULT_RCLK 29491200
-
static int sab82532_bfe_attach(struct scc_softc *, int);
static int sab82532_bfe_iclear(struct scc_softc *, struct scc_chan *);
static int sab82532_bfe_ipend(struct scc_softc *);
@@ -65,8 +63,6 @@ struct scc_class scc_sab82532_class = {
.cl_class = SCC_CLASS_SAB82532,
.cl_modes = SCC_MODE_ASYNC | SCC_MODE_BISYNC | SCC_MODE_HDLC,
.cl_range = SAB_CHANLEN,
- .cl_rclk = DEFAULT_RCLK,
- .cl_regshft = 0
};
static int
diff --git a/sys/dev/scc/scc_dev_z8530.c b/sys/dev/scc/scc_dev_z8530.c
index 1af8880d7c42..6b1704762169 100644
--- a/sys/dev/scc/scc_dev_z8530.c
+++ b/sys/dev/scc/scc_dev_z8530.c
@@ -42,8 +42,6 @@ __FBSDID("$FreeBSD$");
#include "scc_if.h"
-#define DEFAULT_RCLK 307200
-
static int z8530_bfe_attach(struct scc_softc *, int);
static int z8530_bfe_iclear(struct scc_softc *, struct scc_chan *);
static int z8530_bfe_ipend(struct scc_softc *);
@@ -65,8 +63,6 @@ struct scc_class scc_z8530_class = {
.cl_class = SCC_CLASS_Z8530,
.cl_modes = SCC_MODE_ASYNC | SCC_MODE_BISYNC | SCC_MODE_HDLC,
.cl_range = (CHAN_B - CHAN_A) << 1,
- .cl_rclk = DEFAULT_RCLK,
- .cl_regshft = 1,
};
/* Multiplexed I/O. */