1296177Sjhibbits/*- 2296177Sjhibbits * Copyright (c) 2012 Semihalf. 3296177Sjhibbits * All rights reserved. 4296177Sjhibbits * 5296177Sjhibbits * Redistribution and use in source and binary forms, with or without 6296177Sjhibbits * modification, are permitted provided that the following conditions 7296177Sjhibbits * are met: 8296177Sjhibbits * 1. Redistributions of source code must retain the above copyright 9296177Sjhibbits * notice, this list of conditions and the following disclaimer. 10296177Sjhibbits * 2. Redistributions in binary form must reproduce the above copyright 11296177Sjhibbits * notice, this list of conditions and the following disclaimer in the 12296177Sjhibbits * documentation and/or other materials provided with the distribution. 13296177Sjhibbits * 14296177Sjhibbits * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15296177Sjhibbits * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16296177Sjhibbits * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17296177Sjhibbits * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18296177Sjhibbits * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19296177Sjhibbits * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20296177Sjhibbits * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21296177Sjhibbits * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22296177Sjhibbits * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23296177Sjhibbits * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24296177Sjhibbits * SUCH DAMAGE. 25296177Sjhibbits */ 26296177Sjhibbits 27296177Sjhibbits#include <sys/cdefs.h> 28296177Sjhibbits__FBSDID("$FreeBSD$"); 29296177Sjhibbits 30296177Sjhibbits#include <sys/param.h> 31296177Sjhibbits#include <sys/systm.h> 32296177Sjhibbits#include <sys/kernel.h> 33296177Sjhibbits#include <sys/bus.h> 34296177Sjhibbits#include <sys/module.h> 35296177Sjhibbits 36296177Sjhibbits#include <dev/ofw/ofw_bus.h> 37296177Sjhibbits#include <dev/ofw/ofw_bus_subr.h> 38296177Sjhibbits 39296177Sjhibbits#include <contrib/ncsw/inc/ncsw_ext.h> 40296177Sjhibbits#include <contrib/ncsw/inc/enet_ext.h> 41296177Sjhibbits 42296177Sjhibbits#include "fman.h" 43296177Sjhibbits 44296177Sjhibbits#define FFMAN_DEVSTR "Freescale Frame Manager" 45296177Sjhibbits 46296177Sjhibbitsstatic int fman_fdt_probe(device_t dev); 47296177Sjhibbits 48296177Sjhibbitsstatic device_method_t fman_methods[] = { 49296177Sjhibbits /* Device interface */ 50296177Sjhibbits DEVMETHOD(device_probe, fman_fdt_probe), 51296177Sjhibbits DEVMETHOD(device_attach, fman_attach), 52296177Sjhibbits DEVMETHOD(device_detach, fman_detach), 53296177Sjhibbits 54296177Sjhibbits DEVMETHOD(device_shutdown, fman_shutdown), 55296177Sjhibbits DEVMETHOD(device_suspend, fman_suspend), 56296177Sjhibbits DEVMETHOD(device_resume, fman_resume), 57296177Sjhibbits 58296177Sjhibbits { 0, 0 } 59296177Sjhibbits}; 60296177Sjhibbits 61296177Sjhibbitsstatic driver_t fman_driver = { 62296177Sjhibbits "fman", 63296177Sjhibbits fman_methods, 64296177Sjhibbits sizeof(struct fman_softc), 65296177Sjhibbits}; 66296177Sjhibbits 67296177Sjhibbitsstatic devclass_t fman_devclass; 68296177SjhibbitsEARLY_DRIVER_MODULE(fman, simplebus, fman_driver, fman_devclass, 0, 0, 69296177Sjhibbits BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE); 70296177Sjhibbits 71296177Sjhibbits 72296177Sjhibbitsstatic int 73296177Sjhibbitsfman_fdt_probe(device_t dev) 74296177Sjhibbits{ 75296177Sjhibbits 76296177Sjhibbits if (!ofw_bus_is_compatible(dev, "fsl,fman")) 77296177Sjhibbits return (ENXIO); 78296177Sjhibbits 79296177Sjhibbits device_set_desc(dev, FFMAN_DEVSTR); 80296177Sjhibbits 81296177Sjhibbits return (BUS_PROBE_DEFAULT); 82296177Sjhibbits} 83296177Sjhibbits 84296177Sjhibbitsuint32_t 85296177Sjhibbitsfman_get_clock(struct fman_softc *sc) 86296177Sjhibbits{ 87296177Sjhibbits device_t dev; 88296177Sjhibbits phandle_t node; 89296177Sjhibbits pcell_t fman_clock; 90296177Sjhibbits 91296177Sjhibbits dev = sc->dev; 92296177Sjhibbits node = ofw_bus_get_node(dev); 93296177Sjhibbits 94296177Sjhibbits if ((OF_getprop(node, "clock-frequency", &fman_clock, 95296177Sjhibbits sizeof(fman_clock)) <= 0) || (fman_clock == 0)) { 96296177Sjhibbits device_printf(dev, "could not acquire correct frequency " 97296177Sjhibbits "from DTS\n"); 98296177Sjhibbits 99296177Sjhibbits return (0); 100296177Sjhibbits } 101296177Sjhibbits 102296177Sjhibbits return ((uint32_t)fman_clock); 103296177Sjhibbits} 104296177Sjhibbits 105