1179595Sbenno/*-
2179595Sbenno * Copyright (c) 2008 Benno Rice
3179595Sbenno * All rights reserved.
4179595Sbenno *
5179595Sbenno * Redistribution and use in source and binary forms, with or without
6179595Sbenno * modification, are permitted provided that the following conditions
7179595Sbenno * are met:
8179595Sbenno * 1. Redistributions of source code must retain the above copyright
9179595Sbenno *    notice, this list of conditions and the following disclaimer.
10179595Sbenno * 2. Redistributions in binary form must reproduce the above copyright
11179595Sbenno *    notice, this list of conditions and the following disclaimer in the
12179595Sbenno *    documentation and/or other materials provided with the distribution.
13179595Sbenno *
14179595Sbenno * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15179595Sbenno * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16179595Sbenno * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17179595Sbenno * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18179595Sbenno * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19179595Sbenno * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20179595Sbenno * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21179595Sbenno * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22179595Sbenno * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23179595Sbenno * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24179595Sbenno *
25179595Sbenno */
26179595Sbenno
27179595Sbenno#include <sys/cdefs.h>
28179595Sbenno__FBSDID("$FreeBSD$");
29179595Sbenno
30179595Sbenno#include <sys/param.h>
31259342Sian#include <sys/bus.h>
32179595Sbenno#include <sys/kernel.h>
33259342Sian#include <sys/module.h>
34179595Sbenno#include <sys/socket.h>
35259342Sian#include <sys/systm.h>
36259342Sian#include <sys/taskqueue.h>
37179595Sbenno
38179595Sbenno#include <machine/bus.h>
39179595Sbenno#include <machine/resource.h>
40179595Sbenno
41236987Simp#include <net/ethernet.h>
42179595Sbenno#include <net/if.h>
43179595Sbenno#include <net/if_arp.h>
44179595Sbenno#include <net/if_media.h>
45179595Sbenno
46179595Sbenno#include <dev/smc/if_smcvar.h>
47179595Sbenno
48179595Sbenno#include <dev/mii/mii.h>
49179595Sbenno#include <dev/mii/miivar.h>
50179595Sbenno
51179595Sbenno#include "miibus_if.h"
52179595Sbenno
53179595Sbenno#include <arm/xscale/pxa/pxareg.h>
54179595Sbenno#include <arm/xscale/pxa/pxavar.h>
55179595Sbenno
56179595Sbennostatic int		smc_smi_probe(device_t);
57179595Sbennostatic int		smc_smi_attach(device_t);
58179595Sbennostatic int		smc_smi_detach(device_t);
59179595Sbenno
60179595Sbennostatic int
61179595Sbennosmc_smi_probe(device_t dev)
62179595Sbenno{
63179595Sbenno	struct	smc_softc *sc;
64179595Sbenno
65179595Sbenno	sc = device_get_softc(dev);
66179595Sbenno	sc->smc_usemem = 1;
67179595Sbenno
68179595Sbenno	if (smc_probe(dev) != 0) {
69179595Sbenno		return (ENXIO);
70179595Sbenno	}
71179595Sbenno	return (0);
72179595Sbenno}
73179595Sbenno
74179595Sbennostatic int
75179595Sbennosmc_smi_attach(device_t dev)
76179595Sbenno{
77179595Sbenno	int	err;
78179595Sbenno 	struct	smc_softc *sc;
79179595Sbenno
80179595Sbenno	sc = device_get_softc(dev);
81179595Sbenno
82179595Sbenno	err = smc_attach(dev);
83179595Sbenno	if (err) {
84179595Sbenno		return (err);
85179595Sbenno	}
86179595Sbenno
87179595Sbenno	return (0);
88179595Sbenno}
89179595Sbenno
90179595Sbennostatic int
91179595Sbennosmc_smi_detach(device_t dev)
92179595Sbenno{
93179595Sbenno
94179595Sbenno	smc_detach(dev);
95179595Sbenno
96179595Sbenno	return (0);
97179595Sbenno}
98179595Sbenno
99179595Sbennostatic device_method_t smc_smi_methods[] = {
100179595Sbenno	/* Device interface */
101179595Sbenno	DEVMETHOD(device_probe,		smc_smi_probe),
102179595Sbenno	DEVMETHOD(device_attach,	smc_smi_attach),
103179595Sbenno	DEVMETHOD(device_detach,	smc_smi_detach),
104179595Sbenno
105179595Sbenno	/* MII interface */
106179595Sbenno	DEVMETHOD(miibus_readreg,	smc_miibus_readreg),
107179595Sbenno	DEVMETHOD(miibus_writereg,	smc_miibus_writereg),
108179595Sbenno	DEVMETHOD(miibus_statchg,	smc_miibus_statchg),
109179595Sbenno
110179595Sbenno	{ 0, 0 }
111179595Sbenno};
112179595Sbenno
113179595Sbennostatic driver_t smc_smi_driver = {
114179595Sbenno	"smc",
115179595Sbenno	smc_smi_methods,
116179595Sbenno	sizeof(struct smc_softc),
117179595Sbenno};
118179595Sbenno
119179595Sbennoextern devclass_t smc_devclass;
120179595Sbenno
121179595SbennoDRIVER_MODULE(smc, smi, smc_smi_driver, smc_devclass, 0, 0);
122179595SbennoDRIVER_MODULE(miibus, smc, miibus_driver, miibus_devclass, 0, 0);
123179595SbennoMODULE_DEPEND(smc, smi, 1, 1, 1);
124179595SbennoMODULE_DEPEND(smc, ether, 1, 1, 1);
125179595SbennoMODULE_DEPEND(smc, miibus, 1, 1, 1);
126