/* * drivers/net/phy/mdio_bus.c * * MDIO Bus interface * * Author: Andy Fleming * * Copyright (c) 2004 Freescale Semiconductor, Inc. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* mdio_bus_match * * description: Given a PHY device, and a PHY driver, return 1 if * the driver supports the device. Otherwise, return 0 */ static int mdio_bus_match(struct device *dev, struct device_driver *drv) { struct phy_device *phydev = to_phy_device(dev); struct phy_driver *phydrv = to_phy_driver(drv); return (phydrv->phy_id == (phydev->phy_id & phydrv->phy_id_mask)); } /* Suspend and resume. Copied from platform_suspend and * platform_resume */ static int mdio_bus_suspend(struct device * dev, u32 state) { int ret = 0; struct device_driver *drv = dev->driver; if (drv && drv->suspend) { ret = drv->suspend(dev, state, SUSPEND_DISABLE); if (ret == 0) ret = drv->suspend(dev, state, SUSPEND_SAVE_STATE); if (ret == 0) ret = drv->suspend(dev, state, SUSPEND_POWER_DOWN); } return ret; } static int mdio_bus_resume(struct device * dev) { int ret = 0; struct device_driver *drv = dev->driver; if (drv && drv->resume) { ret = drv->resume(dev, RESUME_POWER_ON); if (ret == 0) ret = drv->resume(dev, RESUME_RESTORE_STATE); if (ret == 0) ret = drv->resume(dev, RESUME_ENABLE); } return ret; } struct bus_type mdio_bus_type = { .name = "mdio_bus", .match = mdio_bus_match, .suspend = mdio_bus_suspend, .resume = mdio_bus_resume, }; int __init mdio_bus_init(void) { return bus_register(&mdio_bus_type); }