10aeed3e9SJustin Hibbits /*-
20aeed3e9SJustin Hibbits * Copyright (c) 2012 Semihalf.
30aeed3e9SJustin Hibbits * All rights reserved.
40aeed3e9SJustin Hibbits *
50aeed3e9SJustin Hibbits * Redistribution and use in source and binary forms, with or without
60aeed3e9SJustin Hibbits * modification, are permitted provided that the following conditions
70aeed3e9SJustin Hibbits * are met:
80aeed3e9SJustin Hibbits * 1. Redistributions of source code must retain the above copyright
90aeed3e9SJustin Hibbits * notice, this list of conditions and the following disclaimer.
100aeed3e9SJustin Hibbits * 2. Redistributions in binary form must reproduce the above copyright
110aeed3e9SJustin Hibbits * notice, this list of conditions and the following disclaimer in the
120aeed3e9SJustin Hibbits * documentation and/or other materials provided with the distribution.
130aeed3e9SJustin Hibbits *
140aeed3e9SJustin Hibbits * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
150aeed3e9SJustin Hibbits * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
160aeed3e9SJustin Hibbits * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
170aeed3e9SJustin Hibbits * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
180aeed3e9SJustin Hibbits * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
190aeed3e9SJustin Hibbits * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
200aeed3e9SJustin Hibbits * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
210aeed3e9SJustin Hibbits * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
220aeed3e9SJustin Hibbits * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
230aeed3e9SJustin Hibbits * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
240aeed3e9SJustin Hibbits * SUCH DAMAGE.
250aeed3e9SJustin Hibbits */
260aeed3e9SJustin Hibbits
270aeed3e9SJustin Hibbits #include <sys/param.h>
280aeed3e9SJustin Hibbits #include <sys/systm.h>
290aeed3e9SJustin Hibbits #include <sys/kernel.h>
300aeed3e9SJustin Hibbits #include <sys/bus.h>
310aeed3e9SJustin Hibbits #include <sys/module.h>
320aeed3e9SJustin Hibbits
3347cabd04SJustin Hibbits #include <dev/fdt/simplebus.h>
340aeed3e9SJustin Hibbits #include <dev/ofw/ofw_bus.h>
350aeed3e9SJustin Hibbits #include <dev/ofw/ofw_bus_subr.h>
360aeed3e9SJustin Hibbits
370aeed3e9SJustin Hibbits #include <contrib/ncsw/inc/ncsw_ext.h>
380aeed3e9SJustin Hibbits #include <contrib/ncsw/inc/enet_ext.h>
390aeed3e9SJustin Hibbits
400aeed3e9SJustin Hibbits #include "fman.h"
410aeed3e9SJustin Hibbits
420aeed3e9SJustin Hibbits #define FFMAN_DEVSTR "Freescale Frame Manager"
430aeed3e9SJustin Hibbits
440aeed3e9SJustin Hibbits static int fman_fdt_probe(device_t dev);
450aeed3e9SJustin Hibbits
460aeed3e9SJustin Hibbits static device_method_t fman_methods[] = {
470aeed3e9SJustin Hibbits /* Device interface */
480aeed3e9SJustin Hibbits DEVMETHOD(device_probe, fman_fdt_probe),
490aeed3e9SJustin Hibbits DEVMETHOD(device_attach, fman_attach),
500aeed3e9SJustin Hibbits DEVMETHOD(device_detach, fman_detach),
510aeed3e9SJustin Hibbits
520aeed3e9SJustin Hibbits DEVMETHOD(device_shutdown, fman_shutdown),
530aeed3e9SJustin Hibbits DEVMETHOD(device_suspend, fman_suspend),
54852ba100SJustin Hibbits DEVMETHOD(device_resume, fman_resume_dev),
550aeed3e9SJustin Hibbits
56a32b5435SJustin Hibbits DEVMETHOD(bus_alloc_resource, fman_alloc_resource),
57a32b5435SJustin Hibbits DEVMETHOD(bus_activate_resource, fman_activate_resource),
58a32b5435SJustin Hibbits DEVMETHOD(bus_release_resource, fman_release_resource),
590aeed3e9SJustin Hibbits { 0, 0 }
600aeed3e9SJustin Hibbits };
610aeed3e9SJustin Hibbits
6247cabd04SJustin Hibbits DEFINE_CLASS_1(fman, fman_driver, fman_methods,
6347cabd04SJustin Hibbits sizeof(struct fman_softc), simplebus_driver);
64d1524801SJohn Baldwin EARLY_DRIVER_MODULE(fman, simplebus, fman_driver, 0, 0,
650aeed3e9SJustin Hibbits BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE);
660aeed3e9SJustin Hibbits
670aeed3e9SJustin Hibbits
680aeed3e9SJustin Hibbits static int
fman_fdt_probe(device_t dev)690aeed3e9SJustin Hibbits fman_fdt_probe(device_t dev)
700aeed3e9SJustin Hibbits {
710aeed3e9SJustin Hibbits
72*41e85e8eSJustin Hibbits if (!ofw_bus_status_okay(dev))
73*41e85e8eSJustin Hibbits return (ENXIO);
74*41e85e8eSJustin Hibbits
750aeed3e9SJustin Hibbits if (!ofw_bus_is_compatible(dev, "fsl,fman"))
760aeed3e9SJustin Hibbits return (ENXIO);
770aeed3e9SJustin Hibbits
780aeed3e9SJustin Hibbits device_set_desc(dev, FFMAN_DEVSTR);
790aeed3e9SJustin Hibbits
800aeed3e9SJustin Hibbits return (BUS_PROBE_DEFAULT);
810aeed3e9SJustin Hibbits }
820aeed3e9SJustin Hibbits
830aeed3e9SJustin Hibbits uint32_t
fman_get_clock(struct fman_softc * sc)840aeed3e9SJustin Hibbits fman_get_clock(struct fman_softc *sc)
850aeed3e9SJustin Hibbits {
860aeed3e9SJustin Hibbits device_t dev;
870aeed3e9SJustin Hibbits phandle_t node;
880aeed3e9SJustin Hibbits pcell_t fman_clock;
890aeed3e9SJustin Hibbits
9047cabd04SJustin Hibbits dev = sc->sc_base.dev;
910aeed3e9SJustin Hibbits node = ofw_bus_get_node(dev);
920aeed3e9SJustin Hibbits
930aeed3e9SJustin Hibbits if ((OF_getprop(node, "clock-frequency", &fman_clock,
940aeed3e9SJustin Hibbits sizeof(fman_clock)) <= 0) || (fman_clock == 0)) {
950aeed3e9SJustin Hibbits device_printf(dev, "could not acquire correct frequency "
960aeed3e9SJustin Hibbits "from DTS\n");
970aeed3e9SJustin Hibbits
980aeed3e9SJustin Hibbits return (0);
990aeed3e9SJustin Hibbits }
1000aeed3e9SJustin Hibbits
1010aeed3e9SJustin Hibbits return ((uint32_t)fman_clock);
1020aeed3e9SJustin Hibbits }
1030aeed3e9SJustin Hibbits
104