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