1234861Sadrian/*- 2234861Sadrian * Copyright (c) 2011-2012 Stefan Bethke. 3234861Sadrian * All rights reserved. 4234861Sadrian * 5234861Sadrian * Redistribution and use in source and binary forms, with or without 6234861Sadrian * modification, are permitted provided that the following conditions 7234861Sadrian * are met: 8234861Sadrian * 1. Redistributions of source code must retain the above copyright 9234861Sadrian * notice, this list of conditions and the following disclaimer. 10234861Sadrian * 2. Redistributions in binary form must reproduce the above copyright 11234861Sadrian * notice, this list of conditions and the following disclaimer in the 12234861Sadrian * documentation and/or other materials provided with the distribution. 13234861Sadrian * 14234861Sadrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15234861Sadrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16234861Sadrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17234861Sadrian * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18234861Sadrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19234861Sadrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20234861Sadrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21234861Sadrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22234861Sadrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23234861Sadrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24234861Sadrian * SUCH DAMAGE. 25234861Sadrian * 26234861Sadrian * $FreeBSD$ 27234861Sadrian */ 28234861Sadrian 29234861Sadrian#include <sys/param.h> 30234861Sadrian#include <sys/bus.h> 31234861Sadrian#include <sys/systm.h> 32292738Sadrian#include <sys/module.h> 33234861Sadrian 34292738Sadrian#include <dev/mdio/mdio.h> 35234861Sadrian 36234861Sadrian#include "mdio_if.h" 37234861Sadrian 38234861Sadrianstatic void 39234861Sadrianmdio_identify(driver_t *driver, device_t parent) 40234861Sadrian{ 41234861Sadrian 42234861Sadrian if (device_find_child(parent, mdio_driver.name, -1) == NULL) 43234861Sadrian BUS_ADD_CHILD(parent, 0, mdio_driver.name, -1); 44234861Sadrian} 45234861Sadrian 46234861Sadrianstatic int 47234861Sadrianmdio_probe(device_t dev) 48234861Sadrian{ 49234861Sadrian 50234861Sadrian device_set_desc(dev, "MDIO"); 51234861Sadrian 52234861Sadrian return (BUS_PROBE_SPECIFIC); 53234861Sadrian} 54234861Sadrian 55234861Sadrianstatic int 56234861Sadrianmdio_attach(device_t dev) 57234861Sadrian{ 58234861Sadrian 59234861Sadrian bus_generic_probe(dev); 60234861Sadrian bus_enumerate_hinted_children(dev); 61234861Sadrian return (bus_generic_attach(dev)); 62234861Sadrian} 63234861Sadrian 64234861Sadrianstatic int 65234861Sadrianmdio_detach(device_t dev) 66234861Sadrian{ 67234861Sadrian 68234861Sadrian bus_generic_detach(dev); 69234861Sadrian return (0); 70234861Sadrian} 71234861Sadrian 72234861Sadrianstatic int 73234861Sadrianmdio_readreg(device_t dev, int phy, int reg) 74234861Sadrian{ 75234861Sadrian 76234861Sadrian return (MDIO_READREG(device_get_parent(dev), phy, reg)); 77234861Sadrian} 78234861Sadrian 79234861Sadrianstatic int 80234861Sadrianmdio_writereg(device_t dev, int phy, int reg, int val) 81234861Sadrian{ 82234861Sadrian 83234861Sadrian return (MDIO_WRITEREG(device_get_parent(dev), phy, reg, val)); 84234861Sadrian} 85234861Sadrian 86292750Sadrianstatic int 87292750Sadrianmdio_readextreg(device_t dev, int phy, int devad, int reg) 88292750Sadrian{ 89292750Sadrian 90292750Sadrian return (MDIO_READEXTREG(device_get_parent(dev), phy, devad, reg)); 91292750Sadrian} 92292750Sadrian 93292750Sadrianstatic int 94292750Sadrianmdio_writeextreg(device_t dev, int phy, int devad, int reg, 95292750Sadrian int val) 96292750Sadrian{ 97292750Sadrian 98292750Sadrian return (MDIO_WRITEEXTREG(device_get_parent(dev), phy, devad, reg, val)); 99292750Sadrian} 100292750Sadrian 101234861Sadrianstatic void 102234861Sadrianmdio_hinted_child(device_t dev, const char *name, int unit) 103234861Sadrian{ 104234861Sadrian 105234861Sadrian device_add_child(dev, name, unit); 106234861Sadrian} 107234861Sadrian 108234861Sadrianstatic device_method_t mdio_methods[] = { 109234861Sadrian /* device interface */ 110234861Sadrian DEVMETHOD(device_identify, mdio_identify), 111234861Sadrian DEVMETHOD(device_probe, mdio_probe), 112234861Sadrian DEVMETHOD(device_attach, mdio_attach), 113234861Sadrian DEVMETHOD(device_detach, mdio_detach), 114234861Sadrian DEVMETHOD(device_shutdown, bus_generic_shutdown), 115234861Sadrian 116234861Sadrian /* bus interface */ 117234861Sadrian DEVMETHOD(bus_add_child, device_add_child_ordered), 118234861Sadrian DEVMETHOD(bus_hinted_child, mdio_hinted_child), 119234861Sadrian 120234861Sadrian /* MDIO access */ 121234861Sadrian DEVMETHOD(mdio_readreg, mdio_readreg), 122234861Sadrian DEVMETHOD(mdio_writereg, mdio_writereg), 123292750Sadrian DEVMETHOD(mdio_readextreg, mdio_readextreg), 124292750Sadrian DEVMETHOD(mdio_writeextreg, mdio_writeextreg), 125234861Sadrian 126234861Sadrian DEVMETHOD_END 127234861Sadrian}; 128234861Sadrian 129234861Sadriandriver_t mdio_driver = { 130234861Sadrian "mdio", 131234861Sadrian mdio_methods, 132234861Sadrian 0 133234861Sadrian}; 134234861Sadrian 135234861Sadriandevclass_t mdio_devclass; 136292738Sadrian 137292738SadrianMODULE_VERSION(mdio, 1); 138