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 +#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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include + +#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 +#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. */