1*a3e1c0adSHeiner Kallweit // SPDX-License-Identifier: GPL-2.0+ 2*a3e1c0adSHeiner Kallweit /* MDIO Bus provider interface 3*a3e1c0adSHeiner Kallweit * 4*a3e1c0adSHeiner Kallweit * Author: Andy Fleming 5*a3e1c0adSHeiner Kallweit * 6*a3e1c0adSHeiner Kallweit * Copyright (c) 2004 Freescale Semiconductor, Inc. 7*a3e1c0adSHeiner Kallweit */ 8*a3e1c0adSHeiner Kallweit 9*a3e1c0adSHeiner Kallweit #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 10*a3e1c0adSHeiner Kallweit 11*a3e1c0adSHeiner Kallweit #include <linux/delay.h> 12*a3e1c0adSHeiner Kallweit #include <linux/device.h> 13*a3e1c0adSHeiner Kallweit #include <linux/errno.h> 14*a3e1c0adSHeiner Kallweit #include <linux/etherdevice.h> 15*a3e1c0adSHeiner Kallweit #include <linux/ethtool.h> 16*a3e1c0adSHeiner Kallweit #include <linux/gpio/consumer.h> 17*a3e1c0adSHeiner Kallweit #include <linux/init.h> 18*a3e1c0adSHeiner Kallweit #include <linux/io.h> 19*a3e1c0adSHeiner Kallweit #include <linux/kernel.h> 20*a3e1c0adSHeiner Kallweit #include <linux/micrel_phy.h> 21*a3e1c0adSHeiner Kallweit #include <linux/mii.h> 22*a3e1c0adSHeiner Kallweit #include <linux/mm.h> 23*a3e1c0adSHeiner Kallweit #include <linux/netdevice.h> 24*a3e1c0adSHeiner Kallweit #include <linux/of_device.h> 25*a3e1c0adSHeiner Kallweit #include <linux/of_mdio.h> 26*a3e1c0adSHeiner Kallweit #include <linux/phy.h> 27*a3e1c0adSHeiner Kallweit #include <linux/slab.h> 28*a3e1c0adSHeiner Kallweit #include <linux/string.h> 29*a3e1c0adSHeiner Kallweit #include <linux/uaccess.h> 30*a3e1c0adSHeiner Kallweit #include <linux/unistd.h> 31*a3e1c0adSHeiner Kallweit 32*a3e1c0adSHeiner Kallweit #include "mdio-boardinfo.h" 33*a3e1c0adSHeiner Kallweit 34*a3e1c0adSHeiner Kallweit /** 35*a3e1c0adSHeiner Kallweit * mdiobus_alloc_size - allocate a mii_bus structure 36*a3e1c0adSHeiner Kallweit * @size: extra amount of memory to allocate for private storage. 37*a3e1c0adSHeiner Kallweit * If non-zero, then bus->priv is points to that memory. 38*a3e1c0adSHeiner Kallweit * 39*a3e1c0adSHeiner Kallweit * Description: called by a bus driver to allocate an mii_bus 40*a3e1c0adSHeiner Kallweit * structure to fill in. 41*a3e1c0adSHeiner Kallweit */ 42*a3e1c0adSHeiner Kallweit struct mii_bus *mdiobus_alloc_size(size_t size) 43*a3e1c0adSHeiner Kallweit { 44*a3e1c0adSHeiner Kallweit struct mii_bus *bus; 45*a3e1c0adSHeiner Kallweit size_t aligned_size = ALIGN(sizeof(*bus), NETDEV_ALIGN); 46*a3e1c0adSHeiner Kallweit size_t alloc_size; 47*a3e1c0adSHeiner Kallweit int i; 48*a3e1c0adSHeiner Kallweit 49*a3e1c0adSHeiner Kallweit /* If we alloc extra space, it should be aligned */ 50*a3e1c0adSHeiner Kallweit if (size) 51*a3e1c0adSHeiner Kallweit alloc_size = aligned_size + size; 52*a3e1c0adSHeiner Kallweit else 53*a3e1c0adSHeiner Kallweit alloc_size = sizeof(*bus); 54*a3e1c0adSHeiner Kallweit 55*a3e1c0adSHeiner Kallweit bus = kzalloc(alloc_size, GFP_KERNEL); 56*a3e1c0adSHeiner Kallweit if (!bus) 57*a3e1c0adSHeiner Kallweit return NULL; 58*a3e1c0adSHeiner Kallweit 59*a3e1c0adSHeiner Kallweit bus->state = MDIOBUS_ALLOCATED; 60*a3e1c0adSHeiner Kallweit if (size) 61*a3e1c0adSHeiner Kallweit bus->priv = (void *)bus + aligned_size; 62*a3e1c0adSHeiner Kallweit 63*a3e1c0adSHeiner Kallweit /* Initialise the interrupts to polling and 64-bit seqcounts */ 64*a3e1c0adSHeiner Kallweit for (i = 0; i < PHY_MAX_ADDR; i++) { 65*a3e1c0adSHeiner Kallweit bus->irq[i] = PHY_POLL; 66*a3e1c0adSHeiner Kallweit u64_stats_init(&bus->stats[i].syncp); 67*a3e1c0adSHeiner Kallweit } 68*a3e1c0adSHeiner Kallweit 69*a3e1c0adSHeiner Kallweit return bus; 70*a3e1c0adSHeiner Kallweit } 71*a3e1c0adSHeiner Kallweit EXPORT_SYMBOL(mdiobus_alloc_size); 72*a3e1c0adSHeiner Kallweit 73*a3e1c0adSHeiner Kallweit #if IS_ENABLED(CONFIG_OF_MDIO) 74*a3e1c0adSHeiner Kallweit /* Walk the list of subnodes of a mdio bus and look for a node that 75*a3e1c0adSHeiner Kallweit * matches the mdio device's address with its 'reg' property. If 76*a3e1c0adSHeiner Kallweit * found, set the of_node pointer for the mdio device. This allows 77*a3e1c0adSHeiner Kallweit * auto-probed phy devices to be supplied with information passed in 78*a3e1c0adSHeiner Kallweit * via DT. 79*a3e1c0adSHeiner Kallweit * If a PHY package is found, PHY is searched also there. 80*a3e1c0adSHeiner Kallweit */ 81*a3e1c0adSHeiner Kallweit static int of_mdiobus_find_phy(struct device *dev, struct mdio_device *mdiodev, 82*a3e1c0adSHeiner Kallweit struct device_node *np) 83*a3e1c0adSHeiner Kallweit { 84*a3e1c0adSHeiner Kallweit struct device_node *child; 85*a3e1c0adSHeiner Kallweit 86*a3e1c0adSHeiner Kallweit for_each_available_child_of_node(np, child) { 87*a3e1c0adSHeiner Kallweit int addr; 88*a3e1c0adSHeiner Kallweit 89*a3e1c0adSHeiner Kallweit if (of_node_name_eq(child, "ethernet-phy-package")) { 90*a3e1c0adSHeiner Kallweit /* Validate PHY package reg presence */ 91*a3e1c0adSHeiner Kallweit if (!of_property_present(child, "reg")) { 92*a3e1c0adSHeiner Kallweit of_node_put(child); 93*a3e1c0adSHeiner Kallweit return -EINVAL; 94*a3e1c0adSHeiner Kallweit } 95*a3e1c0adSHeiner Kallweit 96*a3e1c0adSHeiner Kallweit if (!of_mdiobus_find_phy(dev, mdiodev, child)) { 97*a3e1c0adSHeiner Kallweit /* The refcount for the PHY package will be 98*a3e1c0adSHeiner Kallweit * incremented later when PHY join the Package. 99*a3e1c0adSHeiner Kallweit */ 100*a3e1c0adSHeiner Kallweit of_node_put(child); 101*a3e1c0adSHeiner Kallweit return 0; 102*a3e1c0adSHeiner Kallweit } 103*a3e1c0adSHeiner Kallweit 104*a3e1c0adSHeiner Kallweit continue; 105*a3e1c0adSHeiner Kallweit } 106*a3e1c0adSHeiner Kallweit 107*a3e1c0adSHeiner Kallweit addr = of_mdio_parse_addr(dev, child); 108*a3e1c0adSHeiner Kallweit if (addr < 0) 109*a3e1c0adSHeiner Kallweit continue; 110*a3e1c0adSHeiner Kallweit 111*a3e1c0adSHeiner Kallweit if (addr == mdiodev->addr) { 112*a3e1c0adSHeiner Kallweit device_set_node(dev, of_fwnode_handle(child)); 113*a3e1c0adSHeiner Kallweit /* The refcount on "child" is passed to the mdio 114*a3e1c0adSHeiner Kallweit * device. Do _not_ use of_node_put(child) here. 115*a3e1c0adSHeiner Kallweit */ 116*a3e1c0adSHeiner Kallweit return 0; 117*a3e1c0adSHeiner Kallweit } 118*a3e1c0adSHeiner Kallweit } 119*a3e1c0adSHeiner Kallweit 120*a3e1c0adSHeiner Kallweit return -ENODEV; 121*a3e1c0adSHeiner Kallweit } 122*a3e1c0adSHeiner Kallweit 123*a3e1c0adSHeiner Kallweit static void of_mdiobus_link_mdiodev(struct mii_bus *bus, 124*a3e1c0adSHeiner Kallweit struct mdio_device *mdiodev) 125*a3e1c0adSHeiner Kallweit { 126*a3e1c0adSHeiner Kallweit struct device *dev = &mdiodev->dev; 127*a3e1c0adSHeiner Kallweit 128*a3e1c0adSHeiner Kallweit if (dev->of_node || !bus->dev.of_node) 129*a3e1c0adSHeiner Kallweit return; 130*a3e1c0adSHeiner Kallweit 131*a3e1c0adSHeiner Kallweit of_mdiobus_find_phy(dev, mdiodev, bus->dev.of_node); 132*a3e1c0adSHeiner Kallweit } 133*a3e1c0adSHeiner Kallweit #endif 134*a3e1c0adSHeiner Kallweit 135*a3e1c0adSHeiner Kallweit /** 136*a3e1c0adSHeiner Kallweit * mdiobus_create_device - create a full MDIO device given 137*a3e1c0adSHeiner Kallweit * a mdio_board_info structure 138*a3e1c0adSHeiner Kallweit * @bus: MDIO bus to create the devices on 139*a3e1c0adSHeiner Kallweit * @bi: mdio_board_info structure describing the devices 140*a3e1c0adSHeiner Kallweit * 141*a3e1c0adSHeiner Kallweit * Returns 0 on success or < 0 on error. 142*a3e1c0adSHeiner Kallweit */ 143*a3e1c0adSHeiner Kallweit static int mdiobus_create_device(struct mii_bus *bus, 144*a3e1c0adSHeiner Kallweit struct mdio_board_info *bi) 145*a3e1c0adSHeiner Kallweit { 146*a3e1c0adSHeiner Kallweit struct mdio_device *mdiodev; 147*a3e1c0adSHeiner Kallweit int ret = 0; 148*a3e1c0adSHeiner Kallweit 149*a3e1c0adSHeiner Kallweit mdiodev = mdio_device_create(bus, bi->mdio_addr); 150*a3e1c0adSHeiner Kallweit if (IS_ERR(mdiodev)) 151*a3e1c0adSHeiner Kallweit return -ENODEV; 152*a3e1c0adSHeiner Kallweit 153*a3e1c0adSHeiner Kallweit strscpy(mdiodev->modalias, bi->modalias, 154*a3e1c0adSHeiner Kallweit sizeof(mdiodev->modalias)); 155*a3e1c0adSHeiner Kallweit mdiodev->bus_match = mdio_device_bus_match; 156*a3e1c0adSHeiner Kallweit mdiodev->dev.platform_data = (void *)bi->platform_data; 157*a3e1c0adSHeiner Kallweit 158*a3e1c0adSHeiner Kallweit ret = mdio_device_register(mdiodev); 159*a3e1c0adSHeiner Kallweit if (ret) 160*a3e1c0adSHeiner Kallweit mdio_device_free(mdiodev); 161*a3e1c0adSHeiner Kallweit 162*a3e1c0adSHeiner Kallweit return ret; 163*a3e1c0adSHeiner Kallweit } 164*a3e1c0adSHeiner Kallweit 165*a3e1c0adSHeiner Kallweit static struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr, bool c45) 166*a3e1c0adSHeiner Kallweit { 167*a3e1c0adSHeiner Kallweit struct phy_device *phydev = ERR_PTR(-ENODEV); 168*a3e1c0adSHeiner Kallweit struct fwnode_handle *fwnode; 169*a3e1c0adSHeiner Kallweit char node_name[16]; 170*a3e1c0adSHeiner Kallweit int err; 171*a3e1c0adSHeiner Kallweit 172*a3e1c0adSHeiner Kallweit phydev = get_phy_device(bus, addr, c45); 173*a3e1c0adSHeiner Kallweit if (IS_ERR(phydev)) 174*a3e1c0adSHeiner Kallweit return phydev; 175*a3e1c0adSHeiner Kallweit 176*a3e1c0adSHeiner Kallweit #if IS_ENABLED(CONFIG_OF_MDIO) 177*a3e1c0adSHeiner Kallweit /* For DT, see if the auto-probed phy has a corresponding child 178*a3e1c0adSHeiner Kallweit * in the bus node, and set the of_node pointer in this case. 179*a3e1c0adSHeiner Kallweit */ 180*a3e1c0adSHeiner Kallweit of_mdiobus_link_mdiodev(bus, &phydev->mdio); 181*a3e1c0adSHeiner Kallweit #endif 182*a3e1c0adSHeiner Kallweit 183*a3e1c0adSHeiner Kallweit /* Search for a swnode for the phy in the swnode hierarchy of the bus. 184*a3e1c0adSHeiner Kallweit * If there is no swnode for the phy provided, just ignore it. 185*a3e1c0adSHeiner Kallweit */ 186*a3e1c0adSHeiner Kallweit if (dev_fwnode(&bus->dev) && !dev_fwnode(&phydev->mdio.dev)) { 187*a3e1c0adSHeiner Kallweit snprintf(node_name, sizeof(node_name), "ethernet-phy@%d", 188*a3e1c0adSHeiner Kallweit addr); 189*a3e1c0adSHeiner Kallweit fwnode = fwnode_get_named_child_node(dev_fwnode(&bus->dev), 190*a3e1c0adSHeiner Kallweit node_name); 191*a3e1c0adSHeiner Kallweit if (fwnode) 192*a3e1c0adSHeiner Kallweit device_set_node(&phydev->mdio.dev, fwnode); 193*a3e1c0adSHeiner Kallweit } 194*a3e1c0adSHeiner Kallweit 195*a3e1c0adSHeiner Kallweit err = phy_device_register(phydev); 196*a3e1c0adSHeiner Kallweit if (err) { 197*a3e1c0adSHeiner Kallweit phy_device_free(phydev); 198*a3e1c0adSHeiner Kallweit return ERR_PTR(-ENODEV); 199*a3e1c0adSHeiner Kallweit } 200*a3e1c0adSHeiner Kallweit 201*a3e1c0adSHeiner Kallweit return phydev; 202*a3e1c0adSHeiner Kallweit } 203*a3e1c0adSHeiner Kallweit 204*a3e1c0adSHeiner Kallweit /** 205*a3e1c0adSHeiner Kallweit * mdiobus_scan_c22 - scan one address on a bus for C22 MDIO devices. 206*a3e1c0adSHeiner Kallweit * @bus: mii_bus to scan 207*a3e1c0adSHeiner Kallweit * @addr: address on bus to scan 208*a3e1c0adSHeiner Kallweit * 209*a3e1c0adSHeiner Kallweit * This function scans one address on the MDIO bus, looking for 210*a3e1c0adSHeiner Kallweit * devices which can be identified using a vendor/product ID in 211*a3e1c0adSHeiner Kallweit * registers 2 and 3. Not all MDIO devices have such registers, but 212*a3e1c0adSHeiner Kallweit * PHY devices typically do. Hence this function assumes anything 213*a3e1c0adSHeiner Kallweit * found is a PHY, or can be treated as a PHY. Other MDIO devices, 214*a3e1c0adSHeiner Kallweit * such as switches, will probably not be found during the scan. 215*a3e1c0adSHeiner Kallweit */ 216*a3e1c0adSHeiner Kallweit struct phy_device *mdiobus_scan_c22(struct mii_bus *bus, int addr) 217*a3e1c0adSHeiner Kallweit { 218*a3e1c0adSHeiner Kallweit return mdiobus_scan(bus, addr, false); 219*a3e1c0adSHeiner Kallweit } 220*a3e1c0adSHeiner Kallweit EXPORT_SYMBOL(mdiobus_scan_c22); 221*a3e1c0adSHeiner Kallweit 222*a3e1c0adSHeiner Kallweit /** 223*a3e1c0adSHeiner Kallweit * mdiobus_scan_c45 - scan one address on a bus for C45 MDIO devices. 224*a3e1c0adSHeiner Kallweit * @bus: mii_bus to scan 225*a3e1c0adSHeiner Kallweit * @addr: address on bus to scan 226*a3e1c0adSHeiner Kallweit * 227*a3e1c0adSHeiner Kallweit * This function scans one address on the MDIO bus, looking for 228*a3e1c0adSHeiner Kallweit * devices which can be identified using a vendor/product ID in 229*a3e1c0adSHeiner Kallweit * registers 2 and 3. Not all MDIO devices have such registers, but 230*a3e1c0adSHeiner Kallweit * PHY devices typically do. Hence this function assumes anything 231*a3e1c0adSHeiner Kallweit * found is a PHY, or can be treated as a PHY. Other MDIO devices, 232*a3e1c0adSHeiner Kallweit * such as switches, will probably not be found during the scan. 233*a3e1c0adSHeiner Kallweit */ 234*a3e1c0adSHeiner Kallweit static struct phy_device *mdiobus_scan_c45(struct mii_bus *bus, int addr) 235*a3e1c0adSHeiner Kallweit { 236*a3e1c0adSHeiner Kallweit return mdiobus_scan(bus, addr, true); 237*a3e1c0adSHeiner Kallweit } 238*a3e1c0adSHeiner Kallweit 239*a3e1c0adSHeiner Kallweit static int mdiobus_scan_bus_c22(struct mii_bus *bus) 240*a3e1c0adSHeiner Kallweit { 241*a3e1c0adSHeiner Kallweit int i; 242*a3e1c0adSHeiner Kallweit 243*a3e1c0adSHeiner Kallweit for (i = 0; i < PHY_MAX_ADDR; i++) { 244*a3e1c0adSHeiner Kallweit if ((bus->phy_mask & BIT(i)) == 0) { 245*a3e1c0adSHeiner Kallweit struct phy_device *phydev; 246*a3e1c0adSHeiner Kallweit 247*a3e1c0adSHeiner Kallweit phydev = mdiobus_scan_c22(bus, i); 248*a3e1c0adSHeiner Kallweit if (IS_ERR(phydev) && (PTR_ERR(phydev) != -ENODEV)) 249*a3e1c0adSHeiner Kallweit return PTR_ERR(phydev); 250*a3e1c0adSHeiner Kallweit } 251*a3e1c0adSHeiner Kallweit } 252*a3e1c0adSHeiner Kallweit return 0; 253*a3e1c0adSHeiner Kallweit } 254*a3e1c0adSHeiner Kallweit 255*a3e1c0adSHeiner Kallweit static int mdiobus_scan_bus_c45(struct mii_bus *bus) 256*a3e1c0adSHeiner Kallweit { 257*a3e1c0adSHeiner Kallweit int i; 258*a3e1c0adSHeiner Kallweit 259*a3e1c0adSHeiner Kallweit for (i = 0; i < PHY_MAX_ADDR; i++) { 260*a3e1c0adSHeiner Kallweit if ((bus->phy_mask & BIT(i)) == 0) { 261*a3e1c0adSHeiner Kallweit struct phy_device *phydev; 262*a3e1c0adSHeiner Kallweit 263*a3e1c0adSHeiner Kallweit /* Don't scan C45 if we already have a C22 device */ 264*a3e1c0adSHeiner Kallweit if (bus->mdio_map[i]) 265*a3e1c0adSHeiner Kallweit continue; 266*a3e1c0adSHeiner Kallweit 267*a3e1c0adSHeiner Kallweit phydev = mdiobus_scan_c45(bus, i); 268*a3e1c0adSHeiner Kallweit if (IS_ERR(phydev) && (PTR_ERR(phydev) != -ENODEV)) 269*a3e1c0adSHeiner Kallweit return PTR_ERR(phydev); 270*a3e1c0adSHeiner Kallweit } 271*a3e1c0adSHeiner Kallweit } 272*a3e1c0adSHeiner Kallweit return 0; 273*a3e1c0adSHeiner Kallweit } 274*a3e1c0adSHeiner Kallweit 275*a3e1c0adSHeiner Kallweit /* There are some C22 PHYs which do bad things when where is a C45 276*a3e1c0adSHeiner Kallweit * transaction on the bus, like accepting a read themselves, and 277*a3e1c0adSHeiner Kallweit * stomping over the true devices reply, to performing a write to 278*a3e1c0adSHeiner Kallweit * themselves which was intended for another device. Now that C22 279*a3e1c0adSHeiner Kallweit * devices have been found, see if any of them are bad for C45, and if we 280*a3e1c0adSHeiner Kallweit * should skip the C45 scan. 281*a3e1c0adSHeiner Kallweit */ 282*a3e1c0adSHeiner Kallweit static bool mdiobus_prevent_c45_scan(struct mii_bus *bus) 283*a3e1c0adSHeiner Kallweit { 284*a3e1c0adSHeiner Kallweit int i; 285*a3e1c0adSHeiner Kallweit 286*a3e1c0adSHeiner Kallweit for (i = 0; i < PHY_MAX_ADDR; i++) { 287*a3e1c0adSHeiner Kallweit struct phy_device *phydev; 288*a3e1c0adSHeiner Kallweit u32 oui; 289*a3e1c0adSHeiner Kallweit 290*a3e1c0adSHeiner Kallweit phydev = mdiobus_get_phy(bus, i); 291*a3e1c0adSHeiner Kallweit if (!phydev) 292*a3e1c0adSHeiner Kallweit continue; 293*a3e1c0adSHeiner Kallweit oui = phydev->phy_id >> 10; 294*a3e1c0adSHeiner Kallweit 295*a3e1c0adSHeiner Kallweit if (oui == MICREL_OUI) 296*a3e1c0adSHeiner Kallweit return true; 297*a3e1c0adSHeiner Kallweit } 298*a3e1c0adSHeiner Kallweit return false; 299*a3e1c0adSHeiner Kallweit } 300*a3e1c0adSHeiner Kallweit 301*a3e1c0adSHeiner Kallweit /** 302*a3e1c0adSHeiner Kallweit * __mdiobus_register - bring up all the PHYs on a given bus and attach them to bus 303*a3e1c0adSHeiner Kallweit * @bus: target mii_bus 304*a3e1c0adSHeiner Kallweit * @owner: module containing bus accessor functions 305*a3e1c0adSHeiner Kallweit * 306*a3e1c0adSHeiner Kallweit * Description: Called by a bus driver to bring up all the PHYs 307*a3e1c0adSHeiner Kallweit * on a given bus, and attach them to the bus. Drivers should use 308*a3e1c0adSHeiner Kallweit * mdiobus_register() rather than __mdiobus_register() unless they 309*a3e1c0adSHeiner Kallweit * need to pass a specific owner module. MDIO devices which are not 310*a3e1c0adSHeiner Kallweit * PHYs will not be brought up by this function. They are expected 311*a3e1c0adSHeiner Kallweit * to be explicitly listed in DT and instantiated by of_mdiobus_register(). 312*a3e1c0adSHeiner Kallweit * 313*a3e1c0adSHeiner Kallweit * Returns 0 on success or < 0 on error. 314*a3e1c0adSHeiner Kallweit */ 315*a3e1c0adSHeiner Kallweit int __mdiobus_register(struct mii_bus *bus, struct module *owner) 316*a3e1c0adSHeiner Kallweit { 317*a3e1c0adSHeiner Kallweit struct mdio_device *mdiodev; 318*a3e1c0adSHeiner Kallweit struct gpio_desc *gpiod; 319*a3e1c0adSHeiner Kallweit bool prevent_c45_scan; 320*a3e1c0adSHeiner Kallweit int i, err; 321*a3e1c0adSHeiner Kallweit 322*a3e1c0adSHeiner Kallweit if (!bus || !bus->name) 323*a3e1c0adSHeiner Kallweit return -EINVAL; 324*a3e1c0adSHeiner Kallweit 325*a3e1c0adSHeiner Kallweit /* An access method always needs both read and write operations */ 326*a3e1c0adSHeiner Kallweit if (!!bus->read != !!bus->write || !!bus->read_c45 != !!bus->write_c45) 327*a3e1c0adSHeiner Kallweit return -EINVAL; 328*a3e1c0adSHeiner Kallweit 329*a3e1c0adSHeiner Kallweit /* At least one method is mandatory */ 330*a3e1c0adSHeiner Kallweit if (!bus->read && !bus->read_c45) 331*a3e1c0adSHeiner Kallweit return -EINVAL; 332*a3e1c0adSHeiner Kallweit 333*a3e1c0adSHeiner Kallweit if (bus->parent && bus->parent->of_node) 334*a3e1c0adSHeiner Kallweit bus->parent->of_node->fwnode.flags |= 335*a3e1c0adSHeiner Kallweit FWNODE_FLAG_NEEDS_CHILD_BOUND_ON_ADD; 336*a3e1c0adSHeiner Kallweit 337*a3e1c0adSHeiner Kallweit WARN(bus->state != MDIOBUS_ALLOCATED && 338*a3e1c0adSHeiner Kallweit bus->state != MDIOBUS_UNREGISTERED, 339*a3e1c0adSHeiner Kallweit "%s: not in ALLOCATED or UNREGISTERED state\n", bus->id); 340*a3e1c0adSHeiner Kallweit 341*a3e1c0adSHeiner Kallweit bus->owner = owner; 342*a3e1c0adSHeiner Kallweit bus->dev.parent = bus->parent; 343*a3e1c0adSHeiner Kallweit bus->dev.class = &mdio_bus_class; 344*a3e1c0adSHeiner Kallweit bus->dev.groups = NULL; 345*a3e1c0adSHeiner Kallweit dev_set_name(&bus->dev, "%s", bus->id); 346*a3e1c0adSHeiner Kallweit 347*a3e1c0adSHeiner Kallweit /* If the bus state is allocated, we're registering a fresh bus 348*a3e1c0adSHeiner Kallweit * that may have a fwnode associated with it. Grab a reference 349*a3e1c0adSHeiner Kallweit * to the fwnode. This will be dropped when the bus is released. 350*a3e1c0adSHeiner Kallweit * If the bus was set to unregistered, it means that the bus was 351*a3e1c0adSHeiner Kallweit * previously registered, and we've already grabbed a reference. 352*a3e1c0adSHeiner Kallweit */ 353*a3e1c0adSHeiner Kallweit if (bus->state == MDIOBUS_ALLOCATED) 354*a3e1c0adSHeiner Kallweit fwnode_handle_get(dev_fwnode(&bus->dev)); 355*a3e1c0adSHeiner Kallweit 356*a3e1c0adSHeiner Kallweit /* We need to set state to MDIOBUS_UNREGISTERED to correctly release 357*a3e1c0adSHeiner Kallweit * the device in mdiobus_free() 358*a3e1c0adSHeiner Kallweit * 359*a3e1c0adSHeiner Kallweit * State will be updated later in this function in case of success 360*a3e1c0adSHeiner Kallweit */ 361*a3e1c0adSHeiner Kallweit bus->state = MDIOBUS_UNREGISTERED; 362*a3e1c0adSHeiner Kallweit 363*a3e1c0adSHeiner Kallweit err = device_register(&bus->dev); 364*a3e1c0adSHeiner Kallweit if (err) { 365*a3e1c0adSHeiner Kallweit pr_err("mii_bus %s failed to register\n", bus->id); 366*a3e1c0adSHeiner Kallweit return -EINVAL; 367*a3e1c0adSHeiner Kallweit } 368*a3e1c0adSHeiner Kallweit 369*a3e1c0adSHeiner Kallweit mutex_init(&bus->mdio_lock); 370*a3e1c0adSHeiner Kallweit mutex_init(&bus->shared_lock); 371*a3e1c0adSHeiner Kallweit 372*a3e1c0adSHeiner Kallweit /* assert bus level PHY GPIO reset */ 373*a3e1c0adSHeiner Kallweit gpiod = devm_gpiod_get_optional(&bus->dev, "reset", GPIOD_OUT_HIGH); 374*a3e1c0adSHeiner Kallweit if (IS_ERR(gpiod)) { 375*a3e1c0adSHeiner Kallweit err = dev_err_probe(&bus->dev, PTR_ERR(gpiod), 376*a3e1c0adSHeiner Kallweit "mii_bus %s couldn't get reset GPIO\n", 377*a3e1c0adSHeiner Kallweit bus->id); 378*a3e1c0adSHeiner Kallweit device_del(&bus->dev); 379*a3e1c0adSHeiner Kallweit return err; 380*a3e1c0adSHeiner Kallweit } else if (gpiod) { 381*a3e1c0adSHeiner Kallweit bus->reset_gpiod = gpiod; 382*a3e1c0adSHeiner Kallweit fsleep(bus->reset_delay_us); 383*a3e1c0adSHeiner Kallweit gpiod_set_value_cansleep(gpiod, 0); 384*a3e1c0adSHeiner Kallweit if (bus->reset_post_delay_us > 0) 385*a3e1c0adSHeiner Kallweit fsleep(bus->reset_post_delay_us); 386*a3e1c0adSHeiner Kallweit } 387*a3e1c0adSHeiner Kallweit 388*a3e1c0adSHeiner Kallweit if (bus->reset) { 389*a3e1c0adSHeiner Kallweit err = bus->reset(bus); 390*a3e1c0adSHeiner Kallweit if (err) 391*a3e1c0adSHeiner Kallweit goto error_reset_gpiod; 392*a3e1c0adSHeiner Kallweit } 393*a3e1c0adSHeiner Kallweit 394*a3e1c0adSHeiner Kallweit if (bus->read) { 395*a3e1c0adSHeiner Kallweit err = mdiobus_scan_bus_c22(bus); 396*a3e1c0adSHeiner Kallweit if (err) 397*a3e1c0adSHeiner Kallweit goto error; 398*a3e1c0adSHeiner Kallweit } 399*a3e1c0adSHeiner Kallweit 400*a3e1c0adSHeiner Kallweit prevent_c45_scan = mdiobus_prevent_c45_scan(bus); 401*a3e1c0adSHeiner Kallweit 402*a3e1c0adSHeiner Kallweit if (!prevent_c45_scan && bus->read_c45) { 403*a3e1c0adSHeiner Kallweit err = mdiobus_scan_bus_c45(bus); 404*a3e1c0adSHeiner Kallweit if (err) 405*a3e1c0adSHeiner Kallweit goto error; 406*a3e1c0adSHeiner Kallweit } 407*a3e1c0adSHeiner Kallweit 408*a3e1c0adSHeiner Kallweit mdiobus_setup_mdiodev_from_board_info(bus, mdiobus_create_device); 409*a3e1c0adSHeiner Kallweit 410*a3e1c0adSHeiner Kallweit bus->state = MDIOBUS_REGISTERED; 411*a3e1c0adSHeiner Kallweit dev_dbg(&bus->dev, "probed\n"); 412*a3e1c0adSHeiner Kallweit return 0; 413*a3e1c0adSHeiner Kallweit 414*a3e1c0adSHeiner Kallweit error: 415*a3e1c0adSHeiner Kallweit for (i = 0; i < PHY_MAX_ADDR; i++) { 416*a3e1c0adSHeiner Kallweit mdiodev = bus->mdio_map[i]; 417*a3e1c0adSHeiner Kallweit if (!mdiodev) 418*a3e1c0adSHeiner Kallweit continue; 419*a3e1c0adSHeiner Kallweit 420*a3e1c0adSHeiner Kallweit mdiodev->device_remove(mdiodev); 421*a3e1c0adSHeiner Kallweit mdiodev->device_free(mdiodev); 422*a3e1c0adSHeiner Kallweit } 423*a3e1c0adSHeiner Kallweit error_reset_gpiod: 424*a3e1c0adSHeiner Kallweit /* Put PHYs in RESET to save power */ 425*a3e1c0adSHeiner Kallweit if (bus->reset_gpiod) 426*a3e1c0adSHeiner Kallweit gpiod_set_value_cansleep(bus->reset_gpiod, 1); 427*a3e1c0adSHeiner Kallweit 428*a3e1c0adSHeiner Kallweit device_del(&bus->dev); 429*a3e1c0adSHeiner Kallweit return err; 430*a3e1c0adSHeiner Kallweit } 431*a3e1c0adSHeiner Kallweit EXPORT_SYMBOL(__mdiobus_register); 432*a3e1c0adSHeiner Kallweit 433*a3e1c0adSHeiner Kallweit void mdiobus_unregister(struct mii_bus *bus) 434*a3e1c0adSHeiner Kallweit { 435*a3e1c0adSHeiner Kallweit struct mdio_device *mdiodev; 436*a3e1c0adSHeiner Kallweit int i; 437*a3e1c0adSHeiner Kallweit 438*a3e1c0adSHeiner Kallweit if (WARN_ON_ONCE(bus->state != MDIOBUS_REGISTERED)) 439*a3e1c0adSHeiner Kallweit return; 440*a3e1c0adSHeiner Kallweit bus->state = MDIOBUS_UNREGISTERED; 441*a3e1c0adSHeiner Kallweit 442*a3e1c0adSHeiner Kallweit for (i = 0; i < PHY_MAX_ADDR; i++) { 443*a3e1c0adSHeiner Kallweit mdiodev = bus->mdio_map[i]; 444*a3e1c0adSHeiner Kallweit if (!mdiodev) 445*a3e1c0adSHeiner Kallweit continue; 446*a3e1c0adSHeiner Kallweit 447*a3e1c0adSHeiner Kallweit if (mdiodev->reset_gpio) 448*a3e1c0adSHeiner Kallweit gpiod_put(mdiodev->reset_gpio); 449*a3e1c0adSHeiner Kallweit 450*a3e1c0adSHeiner Kallweit mdiodev->device_remove(mdiodev); 451*a3e1c0adSHeiner Kallweit mdiodev->device_free(mdiodev); 452*a3e1c0adSHeiner Kallweit } 453*a3e1c0adSHeiner Kallweit 454*a3e1c0adSHeiner Kallweit /* Put PHYs in RESET to save power */ 455*a3e1c0adSHeiner Kallweit if (bus->reset_gpiod) 456*a3e1c0adSHeiner Kallweit gpiod_set_value_cansleep(bus->reset_gpiod, 1); 457*a3e1c0adSHeiner Kallweit 458*a3e1c0adSHeiner Kallweit device_del(&bus->dev); 459*a3e1c0adSHeiner Kallweit } 460*a3e1c0adSHeiner Kallweit EXPORT_SYMBOL(mdiobus_unregister); 461*a3e1c0adSHeiner Kallweit 462*a3e1c0adSHeiner Kallweit /** 463*a3e1c0adSHeiner Kallweit * mdiobus_free - free a struct mii_bus 464*a3e1c0adSHeiner Kallweit * @bus: mii_bus to free 465*a3e1c0adSHeiner Kallweit * 466*a3e1c0adSHeiner Kallweit * This function releases the reference to the underlying device 467*a3e1c0adSHeiner Kallweit * object in the mii_bus. If this is the last reference, the mii_bus 468*a3e1c0adSHeiner Kallweit * will be freed. 469*a3e1c0adSHeiner Kallweit */ 470*a3e1c0adSHeiner Kallweit void mdiobus_free(struct mii_bus *bus) 471*a3e1c0adSHeiner Kallweit { 472*a3e1c0adSHeiner Kallweit /* For compatibility with error handling in drivers. */ 473*a3e1c0adSHeiner Kallweit if (bus->state == MDIOBUS_ALLOCATED) { 474*a3e1c0adSHeiner Kallweit kfree(bus); 475*a3e1c0adSHeiner Kallweit return; 476*a3e1c0adSHeiner Kallweit } 477*a3e1c0adSHeiner Kallweit 478*a3e1c0adSHeiner Kallweit WARN(bus->state != MDIOBUS_UNREGISTERED, 479*a3e1c0adSHeiner Kallweit "%s: not in UNREGISTERED state\n", bus->id); 480*a3e1c0adSHeiner Kallweit bus->state = MDIOBUS_RELEASED; 481*a3e1c0adSHeiner Kallweit 482*a3e1c0adSHeiner Kallweit put_device(&bus->dev); 483*a3e1c0adSHeiner Kallweit } 484*a3e1c0adSHeiner Kallweit EXPORT_SYMBOL(mdiobus_free); 485