forked from mirrors/linux
		
	phy: Add an mdio_device structure
Not all devices attached to an MDIO bus are phys. So add an mdio_device structure to represent the generic parts of an mdio device, and place this structure into the phy_device. Signed-off-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									e7f4dc3536
								
							
						
					
					
						commit
						e5a03bfd87
					
				
					 35 changed files with 165 additions and 151 deletions
				
			
		|  | @ -1235,7 +1235,7 @@ static int et131x_mii_read(struct et131x_adapter *adapter, u8 reg, u16 *value) | ||||||
| 	if (!phydev) | 	if (!phydev) | ||||||
| 		return -EIO; | 		return -EIO; | ||||||
| 
 | 
 | ||||||
| 	return et131x_phy_mii_read(adapter, phydev->addr, reg, value); | 	return et131x_phy_mii_read(adapter, phydev->mdio.addr, reg, value); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int et131x_mii_write(struct et131x_adapter *adapter, u8 addr, u8 reg, | static int et131x_mii_write(struct et131x_adapter *adapter, u8 addr, u8 reg, | ||||||
|  | @ -1462,7 +1462,7 @@ static void et1310_phy_power_switch(struct et131x_adapter *adapter, bool down) | ||||||
| 	data &= ~BMCR_PDOWN; | 	data &= ~BMCR_PDOWN; | ||||||
| 	if (down) | 	if (down) | ||||||
| 		data |= BMCR_PDOWN; | 		data |= BMCR_PDOWN; | ||||||
| 	et131x_mii_write(adapter, phydev->addr, MII_BMCR, data); | 	et131x_mii_write(adapter, phydev->mdio.addr, MII_BMCR, data); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* et131x_xcvr_init - Init the phy if we are setting it into force mode */ | /* et131x_xcvr_init - Init the phy if we are setting it into force mode */ | ||||||
|  | @ -1490,7 +1490,7 @@ static void et131x_xcvr_init(struct et131x_adapter *adapter) | ||||||
| 		else | 		else | ||||||
| 			lcr2 |= (LED_VAL_LINKON << LED_TXRX_SHIFT); | 			lcr2 |= (LED_VAL_LINKON << LED_TXRX_SHIFT); | ||||||
| 
 | 
 | ||||||
| 		et131x_mii_write(adapter, phydev->addr, PHY_LED_2, lcr2); | 		et131x_mii_write(adapter, phydev->mdio.addr, PHY_LED_2, lcr2); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -3192,14 +3192,14 @@ static void et131x_adjust_link(struct net_device *netdev) | ||||||
| 
 | 
 | ||||||
| 			et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG, | 			et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG, | ||||||
| 					®ister18); | 					®ister18); | ||||||
| 			et131x_mii_write(adapter, phydev->addr, | 			et131x_mii_write(adapter, phydev->mdio.addr, | ||||||
| 					 PHY_MPHY_CONTROL_REG, | 					 PHY_MPHY_CONTROL_REG, | ||||||
| 					 register18 | 0x4); | 					 register18 | 0x4); | ||||||
| 			et131x_mii_write(adapter, phydev->addr, PHY_INDEX_REG, | 			et131x_mii_write(adapter, phydev->mdio.addr, | ||||||
| 					 register18 | 0x8402); | 					 PHY_INDEX_REG, register18 | 0x8402); | ||||||
| 			et131x_mii_write(adapter, phydev->addr, PHY_DATA_REG, | 			et131x_mii_write(adapter, phydev->mdio.addr, | ||||||
| 					 register18 | 511); | 					 PHY_DATA_REG, register18 | 511); | ||||||
| 			et131x_mii_write(adapter, phydev->addr, | 			et131x_mii_write(adapter, phydev->mdio.addr, | ||||||
| 					 PHY_MPHY_CONTROL_REG, register18); | 					 PHY_MPHY_CONTROL_REG, register18); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -3212,8 +3212,8 @@ static void et131x_adjust_link(struct net_device *netdev) | ||||||
| 			et131x_mii_read(adapter, PHY_CONFIG, ®); | 			et131x_mii_read(adapter, PHY_CONFIG, ®); | ||||||
| 			reg &= ~ET_PHY_CONFIG_TX_FIFO_DEPTH; | 			reg &= ~ET_PHY_CONFIG_TX_FIFO_DEPTH; | ||||||
| 			reg |= ET_PHY_CONFIG_FIFO_DEPTH_32; | 			reg |= ET_PHY_CONFIG_FIFO_DEPTH_32; | ||||||
| 			et131x_mii_write(adapter, phydev->addr, PHY_CONFIG, | 			et131x_mii_write(adapter, phydev->mdio.addr, | ||||||
| 					 reg); | 					 PHY_CONFIG, reg); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		et131x_set_rx_dma_timer(adapter); | 		et131x_set_rx_dma_timer(adapter); | ||||||
|  | @ -3226,14 +3226,14 @@ static void et131x_adjust_link(struct net_device *netdev) | ||||||
| 
 | 
 | ||||||
| 			et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG, | 			et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG, | ||||||
| 					®ister18); | 					®ister18); | ||||||
| 			et131x_mii_write(adapter, phydev->addr, | 			et131x_mii_write(adapter, phydev->mdio.addr, | ||||||
| 					 PHY_MPHY_CONTROL_REG, | 					 PHY_MPHY_CONTROL_REG, | ||||||
| 					 register18 | 0x4); | 					 register18 | 0x4); | ||||||
| 			et131x_mii_write(adapter, phydev->addr, | 			et131x_mii_write(adapter, phydev->mdio.addr, | ||||||
| 					 PHY_INDEX_REG, register18 | 0x8402); | 					 PHY_INDEX_REG, register18 | 0x8402); | ||||||
| 			et131x_mii_write(adapter, phydev->addr, | 			et131x_mii_write(adapter, phydev->mdio.addr, | ||||||
| 					 PHY_DATA_REG, register18 | 511); | 					 PHY_DATA_REG, register18 | 511); | ||||||
| 			et131x_mii_write(adapter, phydev->addr, | 			et131x_mii_write(adapter, phydev->mdio.addr, | ||||||
| 					 PHY_MPHY_CONTROL_REG, register18); | 					 PHY_MPHY_CONTROL_REG, register18); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -844,7 +844,7 @@ static int init_phy(struct net_device *dev) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	netdev_dbg(dev, "attached to PHY %d UID 0x%08x Link = %d\n", | 	netdev_dbg(dev, "attached to PHY %d UID 0x%08x Link = %d\n", | ||||||
| 		   phydev->addr, phydev->phy_id, phydev->link); | 		   phydev->mdio.addr, phydev->phy_id, phydev->link); | ||||||
| 
 | 
 | ||||||
| 	priv->phydev = phydev; | 	priv->phydev = phydev; | ||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
|  | @ -2305,7 +2305,7 @@ static int b44_register_phy_one(struct b44 *bp) | ||||||
| 
 | 
 | ||||||
| 	bp->phydev = phydev; | 	bp->phydev = phydev; | ||||||
| 	bp->old_link = 0; | 	bp->old_link = 0; | ||||||
| 	bp->phy_addr = phydev->addr; | 	bp->phy_addr = phydev->mdio.addr; | ||||||
| 
 | 
 | ||||||
| 	phy_attached_info(phydev); | 	phy_attached_info(phydev); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -401,7 +401,7 @@ int bcmgenet_mii_probe(struct net_device *dev) | ||||||
| 	 * Ethernet MAC ISRs | 	 * Ethernet MAC ISRs | ||||||
| 	 */ | 	 */ | ||||||
| 	if (priv->internal_phy) | 	if (priv->internal_phy) | ||||||
| 		priv->mii_bus->irq[phydev->addr] = PHY_IGNORE_INTERRUPT; | 		priv->mii_bus->irq[phydev->mdio.addr] = PHY_IGNORE_INTERRUPT; | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -2366,8 +2366,8 @@ static int sbmac_mii_probe(struct net_device *dev) | ||||||
| 		return -ENXIO; | 		return -ENXIO; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	phy_dev = phy_connect(dev, dev_name(&phy_dev->dev), &sbmac_mii_poll, | 	phy_dev = phy_connect(dev, dev_name(&phy_dev->mdio.dev), | ||||||
| 			      PHY_INTERFACE_MODE_GMII); | 			      &sbmac_mii_poll, PHY_INTERFACE_MODE_GMII); | ||||||
| 	if (IS_ERR(phy_dev)) { | 	if (IS_ERR(phy_dev)) { | ||||||
| 		printk(KERN_ERR "%s: could not attach to PHY\n", dev->name); | 		printk(KERN_ERR "%s: could not attach to PHY\n", dev->name); | ||||||
| 		return PTR_ERR(phy_dev); | 		return PTR_ERR(phy_dev); | ||||||
|  |  | ||||||
|  | @ -1295,7 +1295,7 @@ int dtsec_init(struct fman_mac *dtsec) | ||||||
| 
 | 
 | ||||||
| 	err = init(dtsec->regs, dtsec_drv_param, dtsec->phy_if, | 	err = init(dtsec->regs, dtsec_drv_param, dtsec->phy_if, | ||||||
| 		   dtsec->max_speed, (u8 *)eth_addr, dtsec->exceptions, | 		   dtsec->max_speed, (u8 *)eth_addr, dtsec->exceptions, | ||||||
| 		   dtsec->tbiphy->addr); | 		   dtsec->tbiphy->mdio.addr); | ||||||
| 	if (err) { | 	if (err) { | ||||||
| 		free_init_resources(dtsec); | 		free_init_resources(dtsec); | ||||||
| 		pr_err("DTSEC version doesn't support this i/f mode\n"); | 		pr_err("DTSEC version doesn't support this i/f mode\n"); | ||||||
|  | @ -1434,11 +1434,11 @@ struct fman_mac *dtsec_config(struct fman_mac_params *params) | ||||||
| 	dtsec->tbiphy = of_phy_find_device(params->internal_phy_node); | 	dtsec->tbiphy = of_phy_find_device(params->internal_phy_node); | ||||||
| 	if (!dtsec->tbiphy) { | 	if (!dtsec->tbiphy) { | ||||||
| 		pr_err("of_phy_find_device (TBI PHY) failed\n"); | 		pr_err("of_phy_find_device (TBI PHY) failed\n"); | ||||||
| 		put_device(&dtsec->tbiphy->dev); | 		put_device(&dtsec->tbiphy->mdio.dev); | ||||||
| 		goto err_dtsec_drv_param; | 		goto err_dtsec_drv_param; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	put_device(&dtsec->tbiphy->dev); | 	put_device(&dtsec->tbiphy->mdio.dev); | ||||||
| 
 | 
 | ||||||
| 	/* Save FMan revision */ | 	/* Save FMan revision */ | ||||||
| 	fman_get_revision(dtsec->fm, &dtsec->fm_rev_info); | 	fman_get_revision(dtsec->fm, &dtsec->fm_rev_info); | ||||||
|  |  | ||||||
|  | @ -1054,15 +1054,15 @@ int memac_init(struct fman_mac *memac) | ||||||
| 			 * register address space and access each one of 4 | 			 * register address space and access each one of 4 | ||||||
| 			 * ports inside QSGMII. | 			 * ports inside QSGMII. | ||||||
| 			 */ | 			 */ | ||||||
| 			phy_addr = memac->pcsphy->addr; | 			phy_addr = memac->pcsphy->mdio.addr; | ||||||
| 			qsmgii_phy_addr = (u8)((phy_addr << 2) | i); | 			qsmgii_phy_addr = (u8)((phy_addr << 2) | i); | ||||||
| 			memac->pcsphy->addr = qsmgii_phy_addr; | 			memac->pcsphy->mdio.addr = qsmgii_phy_addr; | ||||||
| 			if (memac->basex_if) | 			if (memac->basex_if) | ||||||
| 				setup_sgmii_internal_phy_base_x(memac); | 				setup_sgmii_internal_phy_base_x(memac); | ||||||
| 			else | 			else | ||||||
| 				setup_sgmii_internal_phy(memac, fixed_link); | 				setup_sgmii_internal_phy(memac, fixed_link); | ||||||
| 
 | 
 | ||||||
| 			memac->pcsphy->addr = phy_addr; | 			memac->pcsphy->mdio.addr = phy_addr; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -254,7 +254,7 @@ static void restart(struct net_device *dev) | ||||||
| 	int r; | 	int r; | ||||||
| 	u32 addrhi, addrlo; | 	u32 addrhi, addrlo; | ||||||
| 
 | 
 | ||||||
| 	struct mii_bus* mii = fep->phydev->bus; | 	struct mii_bus *mii = fep->phydev->mdio.bus; | ||||||
| 	struct fec_info* fec_inf = mii->priv; | 	struct fec_info* fec_inf = mii->priv; | ||||||
| 
 | 
 | ||||||
| 	r = whack_reset(fep->fec.fecp); | 	r = whack_reset(fep->fec.fecp); | ||||||
|  |  | ||||||
|  | @ -1834,7 +1834,7 @@ static void gfar_configure_serdes(struct net_device *dev) | ||||||
| 	 * several seconds for it to come back. | 	 * several seconds for it to come back. | ||||||
| 	 */ | 	 */ | ||||||
| 	if (phy_read(tbiphy, MII_BMSR) & BMSR_LSTATUS) { | 	if (phy_read(tbiphy, MII_BMSR) & BMSR_LSTATUS) { | ||||||
| 		put_device(&tbiphy->dev); | 		put_device(&tbiphy->mdio.dev); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -1849,7 +1849,7 @@ static void gfar_configure_serdes(struct net_device *dev) | ||||||
| 		  BMCR_ANENABLE | BMCR_ANRESTART | BMCR_FULLDPLX | | 		  BMCR_ANENABLE | BMCR_ANRESTART | BMCR_FULLDPLX | | ||||||
| 		  BMCR_SPEED1000); | 		  BMCR_SPEED1000); | ||||||
| 
 | 
 | ||||||
| 	put_device(&tbiphy->dev); | 	put_device(&tbiphy->mdio.dev); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int __gfar_is_rx_idle(struct gfar_private *priv) | static int __gfar_is_rx_idle(struct gfar_private *priv) | ||||||
|  |  | ||||||
|  | @ -1385,7 +1385,7 @@ static int adjust_enet_interface(struct ucc_geth_private *ugeth) | ||||||
| 		value &= ~0x1000;	/* Turn off autonegotiation */ | 		value &= ~0x1000;	/* Turn off autonegotiation */ | ||||||
| 		phy_write(tbiphy, ENET_TBI_MII_CR, value); | 		phy_write(tbiphy, ENET_TBI_MII_CR, value); | ||||||
| 
 | 
 | ||||||
| 		put_device(&tbiphy->dev); | 		put_device(&tbiphy->mdio.dev); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	init_check_frame_length_mode(ug_info->lengthCheckRx, &ug_regs->maccfg2); | 	init_check_frame_length_mode(ug_info->lengthCheckRx, &ug_regs->maccfg2); | ||||||
|  | @ -1705,7 +1705,7 @@ static void uec_configure_serdes(struct net_device *dev) | ||||||
| 	 * several seconds for it to come back. | 	 * several seconds for it to come back. | ||||||
| 	 */ | 	 */ | ||||||
| 	if (phy_read(tbiphy, ENET_TBI_MII_SR) & TBISR_LSTATUS) { | 	if (phy_read(tbiphy, ENET_TBI_MII_SR) & TBISR_LSTATUS) { | ||||||
| 		put_device(&tbiphy->dev); | 		put_device(&tbiphy->mdio.dev); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -71,7 +71,7 @@ static void hns_get_mdix_mode(struct net_device *net_dev, | ||||||
| 	struct hns_nic_priv *priv = netdev_priv(net_dev); | 	struct hns_nic_priv *priv = netdev_priv(net_dev); | ||||||
| 	struct phy_device *phy_dev = priv->phy; | 	struct phy_device *phy_dev = priv->phy; | ||||||
| 
 | 
 | ||||||
| 	if (!phy_dev || !phy_dev->bus) { | 	if (!phy_dev || !phy_dev->mdio.bus) { | ||||||
| 		cmd->eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID; | 		cmd->eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID; | ||||||
| 		cmd->eth_tp_mdix = ETH_TP_MDI_INVALID; | 		cmd->eth_tp_mdix = ETH_TP_MDI_INVALID; | ||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
|  | @ -3133,7 +3133,7 @@ static int mv643xx_eth_probe(struct platform_device *pdev) | ||||||
| 		if (!mp->phy) | 		if (!mp->phy) | ||||||
| 			err = -ENODEV; | 			err = -ENODEV; | ||||||
| 		else | 		else | ||||||
| 			phy_addr_set(mp, mp->phy->addr); | 			phy_addr_set(mp, mp->phy->mdio.addr); | ||||||
| 	} else if (pd->phy_addr != MV643XX_ETH_PHY_NONE) { | 	} else if (pd->phy_addr != MV643XX_ETH_PHY_NONE) { | ||||||
| 		mp->phy = phy_scan(mp, pd->phy_addr); | 		mp->phy = phy_scan(mp, pd->phy_addr); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -3714,7 +3714,7 @@ static int mvneta_probe(struct platform_device *pdev) | ||||||
| 
 | 
 | ||||||
| 		mvneta_fixed_link_update(pp, phy); | 		mvneta_fixed_link_update(pp, phy); | ||||||
| 
 | 
 | ||||||
| 		put_device(&phy->dev); | 		put_device(&phy->mdio.dev); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
|  | @ -864,8 +864,8 @@ static int smsc911x_phy_loopbacktest(struct net_device *dev) | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < 10; i++) { | 	for (i = 0; i < 10; i++) { | ||||||
| 		/* Set PHY to 10/FD, no ANEG, and loopback mode */ | 		/* Set PHY to 10/FD, no ANEG, and loopback mode */ | ||||||
| 		smsc911x_mii_write(phy_dev->bus, phy_dev->addr,	MII_BMCR, | 		smsc911x_mii_write(phy_dev->mdio.bus, phy_dev->mdio.addr, | ||||||
| 			BMCR_LOOPBACK | BMCR_FULLDPLX); | 				   MII_BMCR, BMCR_LOOPBACK | BMCR_FULLDPLX); | ||||||
| 
 | 
 | ||||||
| 		/* Enable MAC tx/rx, FD */ | 		/* Enable MAC tx/rx, FD */ | ||||||
| 		spin_lock_irqsave(&pdata->mac_lock, flags); | 		spin_lock_irqsave(&pdata->mac_lock, flags); | ||||||
|  | @ -893,7 +893,7 @@ static int smsc911x_phy_loopbacktest(struct net_device *dev) | ||||||
| 	spin_unlock_irqrestore(&pdata->mac_lock, flags); | 	spin_unlock_irqrestore(&pdata->mac_lock, flags); | ||||||
| 
 | 
 | ||||||
| 	/* Cancel PHY loopback mode */ | 	/* Cancel PHY loopback mode */ | ||||||
| 	smsc911x_mii_write(phy_dev->bus, phy_dev->addr, MII_BMCR, 0); | 	smsc911x_mii_write(phy_dev->mdio.bus, phy_dev->mdio.addr, MII_BMCR, 0); | ||||||
| 
 | 
 | ||||||
| 	smsc911x_reg_write(pdata, TX_CFG, 0); | 	smsc911x_reg_write(pdata, TX_CFG, 0); | ||||||
| 	smsc911x_reg_write(pdata, RX_CFG, 0); | 	smsc911x_reg_write(pdata, RX_CFG, 0); | ||||||
|  | @ -1021,7 +1021,7 @@ static int smsc911x_mii_probe(struct net_device *dev) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	SMSC_TRACE(pdata, probe, "PHY: addr %d, phy_id 0x%08X", | 	SMSC_TRACE(pdata, probe, "PHY: addr %d, phy_id 0x%08X", | ||||||
| 		   phydev->addr, phydev->phy_id); | 		   phydev->mdio.addr, phydev->phy_id); | ||||||
| 
 | 
 | ||||||
| 	ret = phy_connect_direct(dev, phydev, &smsc911x_phy_adjust_link, | 	ret = phy_connect_direct(dev, phydev, &smsc911x_phy_adjust_link, | ||||||
| 				 pdata->config.phy_interface); | 				 pdata->config.phy_interface); | ||||||
|  | @ -1988,7 +1988,8 @@ smsc911x_ethtool_getregs(struct net_device *dev, struct ethtool_regs *regs, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i <= 31; i++) | 	for (i = 0; i <= 31; i++) | ||||||
| 		data[j++] = smsc911x_mii_read(phy_dev->bus, phy_dev->addr, i); | 		data[j++] = smsc911x_mii_read(phy_dev->mdio.bus, | ||||||
|  | 					      phy_dev->mdio.addr, i); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void smsc911x_eeprom_enable_access(struct smsc911x_data *pdata) | static void smsc911x_eeprom_enable_access(struct smsc911x_data *pdata) | ||||||
|  |  | ||||||
|  | @ -315,7 +315,8 @@ smsc9420_ethtool_getregs(struct net_device *dev, struct ethtool_regs *regs, | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i <= 31; i++) | 	for (i = 0; i <= 31; i++) | ||||||
| 		data[j++] = smsc9420_mii_read(phy_dev->bus, phy_dev->addr, i); | 		data[j++] = smsc9420_mii_read(phy_dev->mdio.bus, | ||||||
|  | 					      phy_dev->mdio.addr, i); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void smsc9420_eeprom_enable_access(struct smsc9420_pdata *pd) | static void smsc9420_eeprom_enable_access(struct smsc9420_pdata *pd) | ||||||
|  |  | ||||||
|  | @ -2050,7 +2050,8 @@ static int cpsw_probe_dt(struct cpsw_priv *priv, | ||||||
| 			if (!phy_dev) | 			if (!phy_dev) | ||||||
| 				return -ENODEV; | 				return -ENODEV; | ||||||
| 			snprintf(slave_data->phy_id, sizeof(slave_data->phy_id), | 			snprintf(slave_data->phy_id, sizeof(slave_data->phy_id), | ||||||
| 				 PHY_ID_FMT, phy_dev->bus->id, phy_dev->addr); | 				 PHY_ID_FMT, phy_dev->mdio.bus->id, | ||||||
|  | 				 phy_dev->mdio.addr); | ||||||
| 		} else if (parp) { | 		} else if (parp) { | ||||||
| 			u32 phyid; | 			u32 phyid; | ||||||
| 			struct device_node *mdio_node; | 			struct device_node *mdio_node; | ||||||
|  |  | ||||||
|  | @ -396,7 +396,7 @@ static int davinci_mdio_probe(struct platform_device *pdev) | ||||||
| 		phy = data->bus->phy_map[addr]; | 		phy = data->bus->phy_map[addr]; | ||||||
| 		if (phy) { | 		if (phy) { | ||||||
| 			dev_info(dev, "phy[%d]: device %s, driver %s\n", | 			dev_info(dev, "phy[%d]: device %s, driver %s\n", | ||||||
| 				 phy->addr, phydev_name(phy), | 				 phy->mdio.addr, phydev_name(phy), | ||||||
| 				 phy->drv ? phy->drv->name : "unknown"); | 				 phy->drv ? phy->drv->name : "unknown"); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -827,7 +827,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev) | ||||||
| 			dev_info(dev, | 			dev_info(dev, | ||||||
| 				 "MDIO of the phy is not registered yet\n"); | 				 "MDIO of the phy is not registered yet\n"); | ||||||
| 		else | 		else | ||||||
| 			put_device(&phydev->dev); | 			put_device(&phydev->mdio.dev); | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -190,7 +190,7 @@ static int at803x_resume(struct phy_device *phydev) | ||||||
| 
 | 
 | ||||||
| static int at803x_probe(struct phy_device *phydev) | static int at803x_probe(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	struct device *dev = &phydev->dev; | 	struct device *dev = &phydev->mdio.dev; | ||||||
| 	struct at803x_priv *priv; | 	struct at803x_priv *priv; | ||||||
| 	struct gpio_desc *gpiod_reset; | 	struct gpio_desc *gpiod_reset; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -40,10 +40,10 @@ static int bcm87xx_of_reg_init(struct phy_device *phydev) | ||||||
| 	const __be32 *paddr_end; | 	const __be32 *paddr_end; | ||||||
| 	int len, ret; | 	int len, ret; | ||||||
| 
 | 
 | ||||||
| 	if (!phydev->dev.of_node) | 	if (!phydev->mdio.dev.of_node) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	paddr = of_get_property(phydev->dev.of_node, | 	paddr = of_get_property(phydev->mdio.dev.of_node, | ||||||
| 				"broadcom,c45-reg-init", &len); | 				"broadcom,c45-reg-init", &len); | ||||||
| 	if (!paddr) | 	if (!paddr) | ||||||
| 		return 0; | 		return 0; | ||||||
|  |  | ||||||
|  | @ -220,9 +220,10 @@ static void rx_timestamp_work(struct work_struct *work); | ||||||
| 
 | 
 | ||||||
| #define BROADCAST_ADDR 31 | #define BROADCAST_ADDR 31 | ||||||
| 
 | 
 | ||||||
| static inline int broadcast_write(struct mii_bus *bus, u32 regnum, u16 val) | static inline int broadcast_write(struct phy_device *phydev, u32 regnum, | ||||||
|  | 				  u16 val) | ||||||
| { | { | ||||||
| 	return mdiobus_write(bus, BROADCAST_ADDR, regnum, val); | 	return mdiobus_write(phydev->mdio.bus, BROADCAST_ADDR, regnum, val); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Caller must hold extreg_lock. */ | /* Caller must hold extreg_lock. */ | ||||||
|  | @ -232,7 +233,7 @@ static int ext_read(struct phy_device *phydev, int page, u32 regnum) | ||||||
| 	int val; | 	int val; | ||||||
| 
 | 
 | ||||||
| 	if (dp83640->clock->page != page) { | 	if (dp83640->clock->page != page) { | ||||||
| 		broadcast_write(phydev->bus, PAGESEL, page); | 		broadcast_write(phydev, PAGESEL, page); | ||||||
| 		dp83640->clock->page = page; | 		dp83640->clock->page = page; | ||||||
| 	} | 	} | ||||||
| 	val = phy_read(phydev, regnum); | 	val = phy_read(phydev, regnum); | ||||||
|  | @ -247,11 +248,11 @@ static void ext_write(int broadcast, struct phy_device *phydev, | ||||||
| 	struct dp83640_private *dp83640 = phydev->priv; | 	struct dp83640_private *dp83640 = phydev->priv; | ||||||
| 
 | 
 | ||||||
| 	if (dp83640->clock->page != page) { | 	if (dp83640->clock->page != page) { | ||||||
| 		broadcast_write(phydev->bus, PAGESEL, page); | 		broadcast_write(phydev, PAGESEL, page); | ||||||
| 		dp83640->clock->page = page; | 		dp83640->clock->page = page; | ||||||
| 	} | 	} | ||||||
| 	if (broadcast) | 	if (broadcast) | ||||||
| 		broadcast_write(phydev->bus, regnum, val); | 		broadcast_write(phydev, regnum, val); | ||||||
| 	else | 	else | ||||||
| 		phy_write(phydev, regnum, val); | 		phy_write(phydev, regnum, val); | ||||||
| } | } | ||||||
|  | @ -1039,7 +1040,7 @@ static int choose_this_phy(struct dp83640_clock *clock, | ||||||
| 	if (chosen_phy == -1 && !clock->chosen) | 	if (chosen_phy == -1 && !clock->chosen) | ||||||
| 		return 1; | 		return 1; | ||||||
| 
 | 
 | ||||||
| 	if (chosen_phy == phydev->addr) | 	if (chosen_phy == phydev->mdio.addr) | ||||||
| 		return 1; | 		return 1; | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
|  | @ -1103,10 +1104,10 @@ static int dp83640_probe(struct phy_device *phydev) | ||||||
| 	struct dp83640_private *dp83640; | 	struct dp83640_private *dp83640; | ||||||
| 	int err = -ENOMEM, i; | 	int err = -ENOMEM, i; | ||||||
| 
 | 
 | ||||||
| 	if (phydev->addr == BROADCAST_ADDR) | 	if (phydev->mdio.addr == BROADCAST_ADDR) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	clock = dp83640_clock_get_bus(phydev->bus); | 	clock = dp83640_clock_get_bus(phydev->mdio.bus); | ||||||
| 	if (!clock) | 	if (!clock) | ||||||
| 		goto no_clock; | 		goto no_clock; | ||||||
| 
 | 
 | ||||||
|  | @ -1132,7 +1133,8 @@ static int dp83640_probe(struct phy_device *phydev) | ||||||
| 
 | 
 | ||||||
| 	if (choose_this_phy(clock, phydev)) { | 	if (choose_this_phy(clock, phydev)) { | ||||||
| 		clock->chosen = dp83640; | 		clock->chosen = dp83640; | ||||||
| 		clock->ptp_clock = ptp_clock_register(&clock->caps, &phydev->dev); | 		clock->ptp_clock = ptp_clock_register(&clock->caps, | ||||||
|  | 						      &phydev->mdio.dev); | ||||||
| 		if (IS_ERR(clock->ptp_clock)) { | 		if (IS_ERR(clock->ptp_clock)) { | ||||||
| 			err = PTR_ERR(clock->ptp_clock); | 			err = PTR_ERR(clock->ptp_clock); | ||||||
| 			goto no_register; | 			goto no_register; | ||||||
|  | @ -1158,7 +1160,7 @@ static void dp83640_remove(struct phy_device *phydev) | ||||||
| 	struct list_head *this, *next; | 	struct list_head *this, *next; | ||||||
| 	struct dp83640_private *tmp, *dp83640 = phydev->priv; | 	struct dp83640_private *tmp, *dp83640 = phydev->priv; | ||||||
| 
 | 
 | ||||||
| 	if (phydev->addr == BROADCAST_ADDR) | 	if (phydev->mdio.addr == BROADCAST_ADDR) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	enable_status_frames(phydev, false); | 	enable_status_frames(phydev, false); | ||||||
|  |  | ||||||
|  | @ -103,7 +103,7 @@ static int dp83867_config_intr(struct phy_device *phydev) | ||||||
| static int dp83867_of_init(struct phy_device *phydev) | static int dp83867_of_init(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	struct dp83867_private *dp83867 = phydev->priv; | 	struct dp83867_private *dp83867 = phydev->priv; | ||||||
| 	struct device *dev = &phydev->dev; | 	struct device *dev = &phydev->mdio.dev; | ||||||
| 	struct device_node *of_node = dev->of_node; | 	struct device_node *of_node = dev->of_node; | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
|  | @ -137,7 +137,7 @@ static int dp83867_config_init(struct phy_device *phydev) | ||||||
| 	u16 val, delay; | 	u16 val, delay; | ||||||
| 
 | 
 | ||||||
| 	if (!phydev->priv) { | 	if (!phydev->priv) { | ||||||
| 		dp83867 = devm_kzalloc(&phydev->dev, sizeof(*dp83867), | 		dp83867 = devm_kzalloc(&phydev->mdio.dev, sizeof(*dp83867), | ||||||
| 				       GFP_KERNEL); | 				       GFP_KERNEL); | ||||||
| 		if (!dp83867) | 		if (!dp83867) | ||||||
| 			return -ENOMEM; | 			return -ENOMEM; | ||||||
|  |  | ||||||
|  | @ -197,11 +197,11 @@ int fixed_phy_set_link_update(struct phy_device *phydev, | ||||||
| 	struct fixed_mdio_bus *fmb = &platform_fmb; | 	struct fixed_mdio_bus *fmb = &platform_fmb; | ||||||
| 	struct fixed_phy *fp; | 	struct fixed_phy *fp; | ||||||
| 
 | 
 | ||||||
| 	if (!phydev || !phydev->bus) | 	if (!phydev || !phydev->mdio.bus) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	list_for_each_entry(fp, &fmb->phys, node) { | 	list_for_each_entry(fp, &fmb->phys, node) { | ||||||
| 		if (fp->addr == phydev->addr) { | 		if (fp->addr == phydev->mdio.addr) { | ||||||
| 			fp->link_update = link_update; | 			fp->link_update = link_update; | ||||||
| 			fp->phydev = phydev; | 			fp->phydev = phydev; | ||||||
| 			return 0; | 			return 0; | ||||||
|  | @ -219,11 +219,11 @@ int fixed_phy_update_state(struct phy_device *phydev, | ||||||
| 	struct fixed_mdio_bus *fmb = &platform_fmb; | 	struct fixed_mdio_bus *fmb = &platform_fmb; | ||||||
| 	struct fixed_phy *fp; | 	struct fixed_phy *fp; | ||||||
| 
 | 
 | ||||||
| 	if (!phydev || phydev->bus != fmb->mii_bus) | 	if (!phydev || phydev->mdio.bus != fmb->mii_bus) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	list_for_each_entry(fp, &fmb->phys, node) { | 	list_for_each_entry(fp, &fmb->phys, node) { | ||||||
| 		if (fp->addr == phydev->addr) { | 		if (fp->addr == phydev->mdio.addr) { | ||||||
| #define _UPD(x) if (changed->x) \ | #define _UPD(x) if (changed->x) \ | ||||||
| 	fp->status.x = status->x | 	fp->status.x = status->x | ||||||
| 			_UPD(link); | 			_UPD(link); | ||||||
|  | @ -344,7 +344,7 @@ struct phy_device *fixed_phy_register(unsigned int irq, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	of_node_get(np); | 	of_node_get(np); | ||||||
| 	phy->dev.of_node = np; | 	phy->mdio.dev.of_node = np; | ||||||
| 	phy->is_pseudo_fixed_link = true; | 	phy->is_pseudo_fixed_link = true; | ||||||
| 
 | 
 | ||||||
| 	switch (status->speed) { | 	switch (status->speed) { | ||||||
|  |  | ||||||
|  | @ -53,43 +53,43 @@ static int ip175c_config_init(struct phy_device *phydev) | ||||||
| 	if (full_reset_performed == 0) { | 	if (full_reset_performed == 0) { | ||||||
| 
 | 
 | ||||||
| 		/* master reset */ | 		/* master reset */ | ||||||
| 		err = mdiobus_write(phydev->bus, 30, 0, 0x175c); | 		err = mdiobus_write(phydev->mdio.bus, 30, 0, 0x175c); | ||||||
| 		if (err < 0) | 		if (err < 0) | ||||||
| 			return err; | 			return err; | ||||||
| 
 | 
 | ||||||
| 		/* ensure no bus delays overlap reset period */ | 		/* ensure no bus delays overlap reset period */ | ||||||
| 		err = mdiobus_read(phydev->bus, 30, 0); | 		err = mdiobus_read(phydev->mdio.bus, 30, 0); | ||||||
| 
 | 
 | ||||||
| 		/* data sheet specifies reset period is 2 msec */ | 		/* data sheet specifies reset period is 2 msec */ | ||||||
| 		mdelay(2); | 		mdelay(2); | ||||||
| 
 | 
 | ||||||
| 		/* enable IP175C mode */ | 		/* enable IP175C mode */ | ||||||
| 		err = mdiobus_write(phydev->bus, 29, 31, 0x175c); | 		err = mdiobus_write(phydev->mdio.bus, 29, 31, 0x175c); | ||||||
| 		if (err < 0) | 		if (err < 0) | ||||||
| 			return err; | 			return err; | ||||||
| 
 | 
 | ||||||
| 		/* Set MII0 speed and duplex (in PHY mode) */ | 		/* Set MII0 speed and duplex (in PHY mode) */ | ||||||
| 		err = mdiobus_write(phydev->bus, 29, 22, 0x420); | 		err = mdiobus_write(phydev->mdio.bus, 29, 22, 0x420); | ||||||
| 		if (err < 0) | 		if (err < 0) | ||||||
| 			return err; | 			return err; | ||||||
| 
 | 
 | ||||||
| 		/* reset switch ports */ | 		/* reset switch ports */ | ||||||
| 		for (i = 0; i < 5; i++) { | 		for (i = 0; i < 5; i++) { | ||||||
| 			err = mdiobus_write(phydev->bus, i, | 			err = mdiobus_write(phydev->mdio.bus, i, | ||||||
| 					    MII_BMCR, BMCR_RESET); | 					    MII_BMCR, BMCR_RESET); | ||||||
| 			if (err < 0) | 			if (err < 0) | ||||||
| 				return err; | 				return err; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		for (i = 0; i < 5; i++) | 		for (i = 0; i < 5; i++) | ||||||
| 			err = mdiobus_read(phydev->bus, i, MII_BMCR); | 			err = mdiobus_read(phydev->mdio.bus, i, MII_BMCR); | ||||||
| 
 | 
 | ||||||
| 		mdelay(2); | 		mdelay(2); | ||||||
| 
 | 
 | ||||||
| 		full_reset_performed = 1; | 		full_reset_performed = 1; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (phydev->addr != 4) { | 	if (phydev->mdio.addr != 4) { | ||||||
| 		phydev->state = PHY_RUNNING; | 		phydev->state = PHY_RUNNING; | ||||||
| 		phydev->speed = SPEED_100; | 		phydev->speed = SPEED_100; | ||||||
| 		phydev->duplex = DUPLEX_FULL; | 		phydev->duplex = DUPLEX_FULL; | ||||||
|  | @ -184,7 +184,7 @@ static int ip101a_g_config_init(struct phy_device *phydev) | ||||||
| 
 | 
 | ||||||
| static int ip175c_read_status(struct phy_device *phydev) | static int ip175c_read_status(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	if (phydev->addr == 4) /* WAN port */ | 	if (phydev->mdio.addr == 4) /* WAN port */ | ||||||
| 		genphy_read_status(phydev); | 		genphy_read_status(phydev); | ||||||
| 	else | 	else | ||||||
| 		/* Don't need to read status for switch ports */ | 		/* Don't need to read status for switch ports */ | ||||||
|  | @ -195,7 +195,7 @@ static int ip175c_read_status(struct phy_device *phydev) | ||||||
| 
 | 
 | ||||||
| static int ip175c_config_aneg(struct phy_device *phydev) | static int ip175c_config_aneg(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	if (phydev->addr == 4) /* WAN port */ | 	if (phydev->mdio.addr == 4) /* WAN port */ | ||||||
| 		genphy_config_aneg(phydev); | 		genphy_config_aneg(phydev); | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
|  | @ -300,10 +300,11 @@ static int marvell_of_reg_init(struct phy_device *phydev) | ||||||
| 	const __be32 *paddr; | 	const __be32 *paddr; | ||||||
| 	int len, i, saved_page, current_page, page_changed, ret; | 	int len, i, saved_page, current_page, page_changed, ret; | ||||||
| 
 | 
 | ||||||
| 	if (!phydev->dev.of_node) | 	if (!phydev->mdio.dev.of_node) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	paddr = of_get_property(phydev->dev.of_node, "marvell,reg-init", &len); | 	paddr = of_get_property(phydev->mdio.dev.of_node, | ||||||
|  | 				"marvell,reg-init", &len); | ||||||
| 	if (!paddr || len < (4 * sizeof(*paddr))) | 	if (!paddr || len < (4 * sizeof(*paddr))) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
|  | @ -1060,7 +1061,7 @@ static int marvell_probe(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	struct marvell_priv *priv; | 	struct marvell_priv *priv; | ||||||
| 
 | 
 | ||||||
| 	priv = devm_kzalloc(&phydev->dev, sizeof(*priv), GFP_KERNEL); | 	priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); | ||||||
| 	if (!priv) | 	if (!priv) | ||||||
| 		return -ENOMEM; | 		return -ENOMEM; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -200,16 +200,16 @@ EXPORT_SYMBOL(of_mdio_find_bus); | ||||||
|  * the phy. This allows auto-probed pyh devices to be supplied with information |  * the phy. This allows auto-probed pyh devices to be supplied with information | ||||||
|  * passed in via DT. |  * passed in via DT. | ||||||
|  */ |  */ | ||||||
| static void of_mdiobus_link_phydev(struct mii_bus *mdio, | static void of_mdiobus_link_phydev(struct mii_bus *bus, | ||||||
| 				   struct phy_device *phydev) | 				   struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	struct device *dev = &phydev->dev; | 	struct device *dev = &phydev->mdio.dev; | ||||||
| 	struct device_node *child; | 	struct device_node *child; | ||||||
| 
 | 
 | ||||||
| 	if (dev->of_node || !mdio->dev.of_node) | 	if (dev->of_node || !bus->dev.of_node) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	for_each_available_child_of_node(mdio->dev.of_node, child) { | 	for_each_available_child_of_node(bus->dev.of_node, child) { | ||||||
| 		int addr; | 		int addr; | ||||||
| 		int ret; | 		int ret; | ||||||
| 
 | 
 | ||||||
|  | @ -227,7 +227,7 @@ static void of_mdiobus_link_phydev(struct mii_bus *mdio, | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if (addr == phydev->addr) { | 		if (addr == phydev->mdio.addr) { | ||||||
| 			dev->of_node = child; | 			dev->of_node = child; | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
|  | @ -522,7 +522,7 @@ static int mdio_bus_match(struct device *dev, struct device_driver *drv) | ||||||
| 
 | 
 | ||||||
| static bool mdio_bus_phy_may_suspend(struct phy_device *phydev) | static bool mdio_bus_phy_may_suspend(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	struct device_driver *drv = phydev->dev.driver; | 	struct device_driver *drv = phydev->mdio.dev.driver; | ||||||
| 	struct phy_driver *phydrv = to_phy_driver(drv); | 	struct phy_driver *phydrv = to_phy_driver(drv); | ||||||
| 	struct net_device *netdev = phydev->attached_dev; | 	struct net_device *netdev = phydev->attached_dev; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -350,7 +350,7 @@ static int ksz9021_load_values_from_of(struct phy_device *phydev, | ||||||
| 
 | 
 | ||||||
| static int ksz9021_config_init(struct phy_device *phydev) | static int ksz9021_config_init(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	const struct device *dev = &phydev->dev; | 	const struct device *dev = &phydev->mdio.dev; | ||||||
| 	const struct device_node *of_node = dev->of_node; | 	const struct device_node *of_node = dev->of_node; | ||||||
| 	const struct device *dev_walker; | 	const struct device *dev_walker; | ||||||
| 
 | 
 | ||||||
|  | @ -358,7 +358,7 @@ static int ksz9021_config_init(struct phy_device *phydev) | ||||||
| 	 * properties in the MAC node. Walk up the tree of devices to | 	 * properties in the MAC node. Walk up the tree of devices to | ||||||
| 	 * find a device with an OF node. | 	 * find a device with an OF node. | ||||||
| 	 */ | 	 */ | ||||||
| 	dev_walker = &phydev->dev; | 	dev_walker = &phydev->mdio.dev; | ||||||
| 	do { | 	do { | ||||||
| 		of_node = dev_walker->of_node; | 		of_node = dev_walker->of_node; | ||||||
| 		dev_walker = dev_walker->parent; | 		dev_walker = dev_walker->parent; | ||||||
|  | @ -471,7 +471,7 @@ static int ksz9031_center_flp_timing(struct phy_device *phydev) | ||||||
| 
 | 
 | ||||||
| static int ksz9031_config_init(struct phy_device *phydev) | static int ksz9031_config_init(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	const struct device *dev = &phydev->dev; | 	const struct device *dev = &phydev->mdio.dev; | ||||||
| 	const struct device_node *of_node = dev->of_node; | 	const struct device_node *of_node = dev->of_node; | ||||||
| 	static const char *clk_skews[2] = {"rxc-skew-ps", "txc-skew-ps"}; | 	static const char *clk_skews[2] = {"rxc-skew-ps", "txc-skew-ps"}; | ||||||
| 	static const char *rx_data_skews[4] = { | 	static const char *rx_data_skews[4] = { | ||||||
|  | @ -630,12 +630,12 @@ static void kszphy_get_stats(struct phy_device *phydev, | ||||||
| static int kszphy_probe(struct phy_device *phydev) | static int kszphy_probe(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	const struct kszphy_type *type = phydev->drv->driver_data; | 	const struct kszphy_type *type = phydev->drv->driver_data; | ||||||
| 	const struct device_node *np = phydev->dev.of_node; | 	const struct device_node *np = phydev->mdio.dev.of_node; | ||||||
| 	struct kszphy_priv *priv; | 	struct kszphy_priv *priv; | ||||||
| 	struct clk *clk; | 	struct clk *clk; | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	priv = devm_kzalloc(&phydev->dev, sizeof(*priv), GFP_KERNEL); | 	priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); | ||||||
| 	if (!priv) | 	if (!priv) | ||||||
| 		return -ENOMEM; | 		return -ENOMEM; | ||||||
| 
 | 
 | ||||||
|  | @ -658,7 +658,7 @@ static int kszphy_probe(struct phy_device *phydev) | ||||||
| 		priv->led_mode = -1; | 		priv->led_mode = -1; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	clk = devm_clk_get(&phydev->dev, "rmii-ref"); | 	clk = devm_clk_get(&phydev->mdio.dev, "rmii-ref"); | ||||||
| 	/* NOTE: clk may be NULL if building without CONFIG_HAVE_CLK */ | 	/* NOTE: clk may be NULL if building without CONFIG_HAVE_CLK */ | ||||||
| 	if (!IS_ERR_OR_NULL(clk)) { | 	if (!IS_ERR_OR_NULL(clk)) { | ||||||
| 		unsigned long rate = clk_get_rate(clk); | 		unsigned long rate = clk_get_rate(clk); | ||||||
|  |  | ||||||
|  | @ -68,7 +68,7 @@ int lan88xx_suspend(struct phy_device *phydev) | ||||||
| 
 | 
 | ||||||
| static int lan88xx_probe(struct phy_device *phydev) | static int lan88xx_probe(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	struct device *dev = &phydev->dev; | 	struct device *dev = &phydev->mdio.dev; | ||||||
| 	struct lan88xx_priv *priv; | 	struct lan88xx_priv *priv; | ||||||
| 
 | 
 | ||||||
| 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); | 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); | ||||||
|  | @ -89,7 +89,7 @@ static int lan88xx_probe(struct phy_device *phydev) | ||||||
| 
 | 
 | ||||||
| static void lan88xx_remove(struct phy_device *phydev) | static void lan88xx_remove(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	struct device *dev = &phydev->dev; | 	struct device *dev = &phydev->mdio.dev; | ||||||
| 	struct lan88xx_priv *priv = phydev->priv; | 	struct lan88xx_priv *priv = phydev->priv; | ||||||
| 
 | 
 | ||||||
| 	if (priv) | 	if (priv) | ||||||
|  |  | ||||||
|  | @ -319,7 +319,7 @@ int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd) | ||||||
| { | { | ||||||
| 	u32 speed = ethtool_cmd_speed(cmd); | 	u32 speed = ethtool_cmd_speed(cmd); | ||||||
| 
 | 
 | ||||||
| 	if (cmd->phy_address != phydev->addr) | 	if (cmd->phy_address != phydev->mdio.addr) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	/* We make sure that we don't pass unsupported values in to the PHY */ | 	/* We make sure that we don't pass unsupported values in to the PHY */ | ||||||
|  | @ -375,7 +375,7 @@ int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd) | ||||||
| 		cmd->port = PORT_BNC; | 		cmd->port = PORT_BNC; | ||||||
| 	else | 	else | ||||||
| 		cmd->port = PORT_MII; | 		cmd->port = PORT_MII; | ||||||
| 	cmd->phy_address = phydev->addr; | 	cmd->phy_address = phydev->mdio.addr; | ||||||
| 	cmd->transceiver = phy_is_internal(phydev) ? | 	cmd->transceiver = phy_is_internal(phydev) ? | ||||||
| 		XCVR_INTERNAL : XCVR_EXTERNAL; | 		XCVR_INTERNAL : XCVR_EXTERNAL; | ||||||
| 	cmd->autoneg = phydev->autoneg; | 	cmd->autoneg = phydev->autoneg; | ||||||
|  | @ -403,16 +403,17 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd) | ||||||
| 
 | 
 | ||||||
| 	switch (cmd) { | 	switch (cmd) { | ||||||
| 	case SIOCGMIIPHY: | 	case SIOCGMIIPHY: | ||||||
| 		mii_data->phy_id = phydev->addr; | 		mii_data->phy_id = phydev->mdio.addr; | ||||||
| 		/* fall through */ | 		/* fall through */ | ||||||
| 
 | 
 | ||||||
| 	case SIOCGMIIREG: | 	case SIOCGMIIREG: | ||||||
| 		mii_data->val_out = mdiobus_read(phydev->bus, mii_data->phy_id, | 		mii_data->val_out = mdiobus_read(phydev->mdio.bus, | ||||||
|  | 						 mii_data->phy_id, | ||||||
| 						 mii_data->reg_num); | 						 mii_data->reg_num); | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	case SIOCSMIIREG: | 	case SIOCSMIIREG: | ||||||
| 		if (mii_data->phy_id == phydev->addr) { | 		if (mii_data->phy_id == phydev->mdio.addr) { | ||||||
| 			switch (mii_data->reg_num) { | 			switch (mii_data->reg_num) { | ||||||
| 			case MII_BMCR: | 			case MII_BMCR: | ||||||
| 				if ((val & (BMCR_RESET | BMCR_ANENABLE)) == 0) { | 				if ((val & (BMCR_RESET | BMCR_ANENABLE)) == 0) { | ||||||
|  | @ -445,10 +446,10 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		mdiobus_write(phydev->bus, mii_data->phy_id, | 		mdiobus_write(phydev->mdio.bus, mii_data->phy_id, | ||||||
| 			      mii_data->reg_num, val); | 			      mii_data->reg_num, val); | ||||||
| 
 | 
 | ||||||
| 		if (mii_data->phy_id == phydev->addr && | 		if (mii_data->phy_id == phydev->mdio.addr && | ||||||
| 		    mii_data->reg_num == MII_BMCR && | 		    mii_data->reg_num == MII_BMCR && | ||||||
| 		    val & BMCR_RESET) | 		    val & BMCR_RESET) | ||||||
| 			return phy_init_hw(phydev); | 			return phy_init_hw(phydev); | ||||||
|  | @ -643,7 +644,7 @@ int phy_start_interrupts(struct phy_device *phydev) | ||||||
| 	if (request_irq(phydev->irq, phy_interrupt, 0, "phy_interrupt", | 	if (request_irq(phydev->irq, phy_interrupt, 0, "phy_interrupt", | ||||||
| 			phydev) < 0) { | 			phydev) < 0) { | ||||||
| 		pr_warn("%s: Can't get IRQ %d (PHY)\n", | 		pr_warn("%s: Can't get IRQ %d (PHY)\n", | ||||||
| 			phydev->bus->name, phydev->irq); | 			phydev->mdio.bus->name, phydev->irq); | ||||||
| 		phydev->irq = PHY_POLL; | 		phydev->irq = PHY_POLL; | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
|  | @ -1041,11 +1042,11 @@ static inline void mmd_phy_indirect(struct mii_bus *bus, int prtad, int devad, | ||||||
| int phy_read_mmd_indirect(struct phy_device *phydev, int prtad, int devad) | int phy_read_mmd_indirect(struct phy_device *phydev, int prtad, int devad) | ||||||
| { | { | ||||||
| 	struct phy_driver *phydrv = phydev->drv; | 	struct phy_driver *phydrv = phydev->drv; | ||||||
| 	int addr = phydev->addr; | 	int addr = phydev->mdio.addr; | ||||||
| 	int value = -1; | 	int value = -1; | ||||||
| 
 | 
 | ||||||
| 	if (!phydrv->read_mmd_indirect) { | 	if (!phydrv->read_mmd_indirect) { | ||||||
| 		struct mii_bus *bus = phydev->bus; | 		struct mii_bus *bus = phydev->mdio.bus; | ||||||
| 
 | 
 | ||||||
| 		mutex_lock(&bus->mdio_lock); | 		mutex_lock(&bus->mdio_lock); | ||||||
| 		mmd_phy_indirect(bus, prtad, devad, addr); | 		mmd_phy_indirect(bus, prtad, devad, addr); | ||||||
|  | @ -1079,10 +1080,10 @@ void phy_write_mmd_indirect(struct phy_device *phydev, int prtad, | ||||||
| 				   int devad, u32 data) | 				   int devad, u32 data) | ||||||
| { | { | ||||||
| 	struct phy_driver *phydrv = phydev->drv; | 	struct phy_driver *phydrv = phydev->drv; | ||||||
| 	int addr = phydev->addr; | 	int addr = phydev->mdio.addr; | ||||||
| 
 | 
 | ||||||
| 	if (!phydrv->write_mmd_indirect) { | 	if (!phydrv->write_mmd_indirect) { | ||||||
| 		struct mii_bus *bus = phydev->bus; | 		struct mii_bus *bus = phydev->mdio.bus; | ||||||
| 
 | 
 | ||||||
| 		mutex_lock(&bus->mdio_lock); | 		mutex_lock(&bus->mdio_lock); | ||||||
| 		mmd_phy_indirect(bus, prtad, devad, addr); | 		mmd_phy_indirect(bus, prtad, devad, addr); | ||||||
|  |  | ||||||
|  | @ -43,7 +43,7 @@ MODULE_LICENSE("GPL"); | ||||||
| 
 | 
 | ||||||
| void phy_device_free(struct phy_device *phydev) | void phy_device_free(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	put_device(&phydev->dev); | 	put_device(&phydev->mdio.dev); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(phy_device_free); | EXPORT_SYMBOL(phy_device_free); | ||||||
| 
 | 
 | ||||||
|  | @ -65,7 +65,7 @@ static DEFINE_MUTEX(phy_fixup_lock); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * phy_register_fixup - creates a new phy_fixup and adds it to the list |  * phy_register_fixup - creates a new phy_fixup and adds it to the list | ||||||
|  * @bus_id: A string which matches phydev->dev.bus_id (or PHY_ANY_ID) |  * @bus_id: A string which matches phydev->mdio.dev.bus_id (or PHY_ANY_ID) | ||||||
|  * @phy_uid: Used to match against phydev->phy_id (the UID of the PHY) |  * @phy_uid: Used to match against phydev->phy_id (the UID of the PHY) | ||||||
|  *	It can also be PHY_ANY_UID |  *	It can also be PHY_ANY_UID | ||||||
|  * @phy_uid_mask: Applied to phydev->phy_id and fixup->phy_uid before |  * @phy_uid_mask: Applied to phydev->phy_id and fixup->phy_uid before | ||||||
|  | @ -153,13 +153,19 @@ struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id, | ||||||
| 				     struct phy_c45_device_ids *c45_ids) | 				     struct phy_c45_device_ids *c45_ids) | ||||||
| { | { | ||||||
| 	struct phy_device *dev; | 	struct phy_device *dev; | ||||||
|  | 	struct mdio_device *mdiodev; | ||||||
| 
 | 
 | ||||||
| 	/* We allocate the device, and initialize the default values */ | 	/* We allocate the device, and initialize the default values */ | ||||||
| 	dev = kzalloc(sizeof(*dev), GFP_KERNEL); | 	dev = kzalloc(sizeof(*dev), GFP_KERNEL); | ||||||
| 	if (!dev) | 	if (!dev) | ||||||
| 		return ERR_PTR(-ENOMEM); | 		return ERR_PTR(-ENOMEM); | ||||||
| 
 | 
 | ||||||
| 	dev->dev.release = phy_device_release; | 	mdiodev = &dev->mdio; | ||||||
|  | 	mdiodev->dev.release = phy_device_release; | ||||||
|  | 	mdiodev->dev.parent = &bus->dev; | ||||||
|  | 	mdiodev->dev.bus = &mdio_bus_type; | ||||||
|  | 	mdiodev->bus = bus; | ||||||
|  | 	mdiodev->addr = addr; | ||||||
| 
 | 
 | ||||||
| 	dev->speed = 0; | 	dev->speed = 0; | ||||||
| 	dev->duplex = -1; | 	dev->duplex = -1; | ||||||
|  | @ -171,15 +177,11 @@ struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id, | ||||||
| 	dev->autoneg = AUTONEG_ENABLE; | 	dev->autoneg = AUTONEG_ENABLE; | ||||||
| 
 | 
 | ||||||
| 	dev->is_c45 = is_c45; | 	dev->is_c45 = is_c45; | ||||||
| 	dev->addr = addr; |  | ||||||
| 	dev->phy_id = phy_id; | 	dev->phy_id = phy_id; | ||||||
| 	if (c45_ids) | 	if (c45_ids) | ||||||
| 		dev->c45_ids = *c45_ids; | 		dev->c45_ids = *c45_ids; | ||||||
| 	dev->bus = bus; |  | ||||||
| 	dev->dev.parent = &bus->dev; |  | ||||||
| 	dev->dev.bus = &mdio_bus_type; |  | ||||||
| 	dev->irq = bus->irq ? bus->irq[addr] : PHY_POLL; | 	dev->irq = bus->irq ? bus->irq[addr] : PHY_POLL; | ||||||
| 	dev_set_name(&dev->dev, PHY_ID_FMT, bus->id, addr); | 	dev_set_name(&mdiodev->dev, PHY_ID_FMT, bus->id, addr); | ||||||
| 
 | 
 | ||||||
| 	dev->state = PHY_DOWN; | 	dev->state = PHY_DOWN; | ||||||
| 
 | 
 | ||||||
|  | @ -199,7 +201,7 @@ struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id, | ||||||
| 	 */ | 	 */ | ||||||
| 	request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT, MDIO_ID_ARGS(phy_id)); | 	request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT, MDIO_ID_ARGS(phy_id)); | ||||||
| 
 | 
 | ||||||
| 	device_initialize(&dev->dev); | 	device_initialize(&mdiodev->dev); | ||||||
| 
 | 
 | ||||||
| 	return dev; | 	return dev; | ||||||
| } | } | ||||||
|  | @ -382,27 +384,27 @@ int phy_device_register(struct phy_device *phydev) | ||||||
| 	int err; | 	int err; | ||||||
| 
 | 
 | ||||||
| 	/* Don't register a phy if one is already registered at this address */ | 	/* Don't register a phy if one is already registered at this address */ | ||||||
| 	if (phydev->bus->phy_map[phydev->addr]) | 	if (phydev->mdio.bus->phy_map[phydev->mdio.addr]) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 	phydev->bus->phy_map[phydev->addr] = phydev; | 	phydev->mdio.bus->phy_map[phydev->mdio.addr] = phydev; | ||||||
| 
 | 
 | ||||||
| 	/* Run all of the fixups for this PHY */ | 	/* Run all of the fixups for this PHY */ | ||||||
| 	err = phy_scan_fixups(phydev); | 	err = phy_scan_fixups(phydev); | ||||||
| 	if (err) { | 	if (err) { | ||||||
| 		pr_err("PHY %d failed to initialize\n", phydev->addr); | 		pr_err("PHY %d failed to initialize\n", phydev->mdio.addr); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	err = device_add(&phydev->dev); | 	err = device_add(&phydev->mdio.dev); | ||||||
| 	if (err) { | 	if (err) { | ||||||
| 		pr_err("PHY %d failed to add\n", phydev->addr); | 		pr_err("PHY %d failed to add\n", phydev->mdio.addr); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| 
 | 
 | ||||||
|  out: |  out: | ||||||
| 	phydev->bus->phy_map[phydev->addr] = NULL; | 	phydev->mdio.bus->phy_map[phydev->mdio.addr] = NULL; | ||||||
| 	return err; | 	return err; | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(phy_device_register); | EXPORT_SYMBOL(phy_device_register); | ||||||
|  | @ -417,10 +419,10 @@ EXPORT_SYMBOL(phy_device_register); | ||||||
|  */ |  */ | ||||||
| void phy_device_remove(struct phy_device *phydev) | void phy_device_remove(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	struct mii_bus *bus = phydev->bus; | 	struct mii_bus *bus = phydev->mdio.bus; | ||||||
| 	int addr = phydev->addr; | 	int addr = phydev->mdio.addr; | ||||||
| 
 | 
 | ||||||
| 	device_del(&phydev->dev); | 	device_del(&phydev->mdio.dev); | ||||||
| 	bus->phy_map[addr] = NULL; | 	bus->phy_map[addr] = NULL; | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(phy_device_remove); | EXPORT_SYMBOL(phy_device_remove); | ||||||
|  | @ -617,13 +619,13 @@ EXPORT_SYMBOL(phy_attached_info); | ||||||
| void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) | void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) | ||||||
| { | { | ||||||
| 	if (!fmt) { | 	if (!fmt) { | ||||||
| 		dev_info(&phydev->dev, ATTACHED_FMT "\n", | 		dev_info(&phydev->mdio.dev, ATTACHED_FMT "\n", | ||||||
| 			 phydev->drv->name, phydev_name(phydev), | 			 phydev->drv->name, phydev_name(phydev), | ||||||
| 			 phydev->irq); | 			 phydev->irq); | ||||||
| 	} else { | 	} else { | ||||||
| 		va_list ap; | 		va_list ap; | ||||||
| 
 | 
 | ||||||
| 		dev_info(&phydev->dev, ATTACHED_FMT, | 		dev_info(&phydev->mdio.dev, ATTACHED_FMT, | ||||||
| 			 phydev->drv->name, phydev_name(phydev), | 			 phydev->drv->name, phydev_name(phydev), | ||||||
| 			 phydev->irq); | 			 phydev->irq); | ||||||
| 
 | 
 | ||||||
|  | @ -652,8 +654,8 @@ EXPORT_SYMBOL(phy_attached_print); | ||||||
| int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, | int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, | ||||||
| 		      u32 flags, phy_interface_t interface) | 		      u32 flags, phy_interface_t interface) | ||||||
| { | { | ||||||
| 	struct mii_bus *bus = phydev->bus; | 	struct mii_bus *bus = phydev->mdio.bus; | ||||||
| 	struct device *d = &phydev->dev; | 	struct device *d = &phydev->mdio.dev; | ||||||
| 	int err; | 	int err; | ||||||
| 
 | 
 | ||||||
| 	if (!try_module_get(bus->owner)) { | 	if (!try_module_get(bus->owner)) { | ||||||
|  | @ -771,8 +773,8 @@ void phy_detach(struct phy_device *phydev) | ||||||
| 	 * real driver could be loaded | 	 * real driver could be loaded | ||||||
| 	 */ | 	 */ | ||||||
| 	for (i = 0; i < ARRAY_SIZE(genphy_driver); i++) { | 	for (i = 0; i < ARRAY_SIZE(genphy_driver); i++) { | ||||||
| 		if (phydev->dev.driver == &genphy_driver[i].driver) { | 		if (phydev->mdio.dev.driver == &genphy_driver[i].driver) { | ||||||
| 			device_release_driver(&phydev->dev); | 			device_release_driver(&phydev->mdio.dev); | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -781,16 +783,16 @@ void phy_detach(struct phy_device *phydev) | ||||||
| 	 * The phydev might go away on the put_device() below, so avoid | 	 * The phydev might go away on the put_device() below, so avoid | ||||||
| 	 * a use-after-free bug by reading the underlying bus first. | 	 * a use-after-free bug by reading the underlying bus first. | ||||||
| 	 */ | 	 */ | ||||||
| 	bus = phydev->bus; | 	bus = phydev->mdio.bus; | ||||||
| 
 | 
 | ||||||
| 	put_device(&phydev->dev); | 	put_device(&phydev->mdio.dev); | ||||||
| 	module_put(bus->owner); | 	module_put(bus->owner); | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(phy_detach); | EXPORT_SYMBOL(phy_detach); | ||||||
| 
 | 
 | ||||||
| int phy_suspend(struct phy_device *phydev) | int phy_suspend(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver); | 	struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver); | ||||||
| 	struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL }; | 	struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL }; | ||||||
| 	int ret = 0; | 	int ret = 0; | ||||||
| 
 | 
 | ||||||
|  | @ -813,7 +815,7 @@ EXPORT_SYMBOL(phy_suspend); | ||||||
| 
 | 
 | ||||||
| int phy_resume(struct phy_device *phydev) | int phy_resume(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver); | 	struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver); | ||||||
| 	int ret = 0; | 	int ret = 0; | ||||||
| 
 | 
 | ||||||
| 	if (phydrv->resume) | 	if (phydrv->resume) | ||||||
|  | @ -1330,7 +1332,7 @@ EXPORT_SYMBOL(phy_set_max_speed); | ||||||
| 
 | 
 | ||||||
| static void of_set_phy_supported(struct phy_device *phydev) | static void of_set_phy_supported(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	struct device_node *node = phydev->dev.of_node; | 	struct device_node *node = phydev->mdio.dev.of_node; | ||||||
| 	u32 max_speed; | 	u32 max_speed; | ||||||
| 
 | 
 | ||||||
| 	if (!IS_ENABLED(CONFIG_OF_MDIO)) | 	if (!IS_ENABLED(CONFIG_OF_MDIO)) | ||||||
|  | @ -1354,7 +1356,7 @@ static void of_set_phy_supported(struct phy_device *phydev) | ||||||
| static int phy_probe(struct device *dev) | static int phy_probe(struct device *dev) | ||||||
| { | { | ||||||
| 	struct phy_device *phydev = to_phy_device(dev); | 	struct phy_device *phydev = to_phy_device(dev); | ||||||
| 	struct device_driver *drv = phydev->dev.driver; | 	struct device_driver *drv = phydev->mdio.dev.driver; | ||||||
| 	struct phy_driver *phydrv = to_phy_driver(drv); | 	struct phy_driver *phydrv = to_phy_driver(drv); | ||||||
| 	int err = 0; | 	int err = 0; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -44,7 +44,7 @@ static int smsc_phy_ack_interrupt(struct phy_device *phydev) | ||||||
| static int smsc_phy_config_init(struct phy_device *phydev) | static int smsc_phy_config_init(struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	int __maybe_unused len; | 	int __maybe_unused len; | ||||||
| 	struct device *dev __maybe_unused = &phydev->dev; | 	struct device *dev __maybe_unused = &phydev->mdio.dev; | ||||||
| 	struct device_node *of_node __maybe_unused = dev->of_node; | 	struct device_node *of_node __maybe_unused = dev->of_node; | ||||||
| 	int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS); | 	int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS); | ||||||
| 	int enable_energy = 1; | 	int enable_energy = 1; | ||||||
|  |  | ||||||
|  | @ -75,7 +75,7 @@ static int of_mdiobus_register_phy(struct mii_bus *mdio, struct device_node *chi | ||||||
| 	/* Associate the OF node with the device structure so it
 | 	/* Associate the OF node with the device structure so it
 | ||||||
| 	 * can be looked up later */ | 	 * can be looked up later */ | ||||||
| 	of_node_get(child); | 	of_node_get(child); | ||||||
| 	phy->dev.of_node = child; | 	phy->mdio.dev.of_node = child; | ||||||
| 
 | 
 | ||||||
| 	/* All data is now stored in the phy struct;
 | 	/* All data is now stored in the phy struct;
 | ||||||
| 	 * register it */ | 	 * register it */ | ||||||
|  | @ -233,7 +233,7 @@ struct phy_device *of_phy_connect(struct net_device *dev, | ||||||
| 	ret = phy_connect_direct(dev, phy, hndlr, iface); | 	ret = phy_connect_direct(dev, phy, hndlr, iface); | ||||||
| 
 | 
 | ||||||
| 	/* refcount is held by phy_connect_direct() on success */ | 	/* refcount is held by phy_connect_direct() on success */ | ||||||
| 	put_device(&phy->dev); | 	put_device(&phy->mdio.dev); | ||||||
| 
 | 
 | ||||||
| 	return ret ? NULL : phy; | 	return ret ? NULL : phy; | ||||||
| } | } | ||||||
|  | @ -263,7 +263,7 @@ struct phy_device *of_phy_attach(struct net_device *dev, | ||||||
| 	ret = phy_attach_direct(dev, phy, flags, iface); | 	ret = phy_attach_direct(dev, phy, flags, iface); | ||||||
| 
 | 
 | ||||||
| 	/* refcount is held by phy_attach_direct() on success */ | 	/* refcount is held by phy_attach_direct() on success */ | ||||||
| 	put_device(&phy->dev); | 	put_device(&phy->mdio.dev); | ||||||
| 
 | 
 | ||||||
| 	return ret ? NULL : phy; | 	return ret ? NULL : phy; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -13,6 +13,15 @@ | ||||||
| 
 | 
 | ||||||
| struct mii_bus; | struct mii_bus; | ||||||
| 
 | 
 | ||||||
|  | struct mdio_device { | ||||||
|  | 	struct device dev; | ||||||
|  | 
 | ||||||
|  | 	struct mii_bus *bus; | ||||||
|  | 	/* Bus address of the MDIO device (0-31) */ | ||||||
|  | 	int addr; | ||||||
|  | }; | ||||||
|  | #define to_mdio_device(d) container_of(d, struct mdio_device, dev) | ||||||
|  | 
 | ||||||
| static inline bool mdio_phy_id_is_c45(int phy_id) | static inline bool mdio_phy_id_is_c45(int phy_id) | ||||||
| { | { | ||||||
| 	return (phy_id & MDIO_PHY_ID_C45) && !(phy_id & ~MDIO_PHY_ID_C45_MASK); | 	return (phy_id & MDIO_PHY_ID_C45) && !(phy_id & ~MDIO_PHY_ID_C45_MASK); | ||||||
|  |  | ||||||
|  | @ -358,14 +358,12 @@ struct phy_c45_device_ids { | ||||||
|  * handling, as well as handling shifts in PHY hardware state |  * handling, as well as handling shifts in PHY hardware state | ||||||
|  */ |  */ | ||||||
| struct phy_device { | struct phy_device { | ||||||
|  | 	struct mdio_device mdio; | ||||||
|  | 
 | ||||||
| 	/* Information about the PHY type */ | 	/* Information about the PHY type */ | ||||||
| 	/* And management functions */ | 	/* And management functions */ | ||||||
| 	struct phy_driver *drv; | 	struct phy_driver *drv; | ||||||
| 
 | 
 | ||||||
| 	struct mii_bus *bus; |  | ||||||
| 
 |  | ||||||
| 	struct device dev; |  | ||||||
| 
 |  | ||||||
| 	u32 phy_id; | 	u32 phy_id; | ||||||
| 
 | 
 | ||||||
| 	struct phy_c45_device_ids c45_ids; | 	struct phy_c45_device_ids c45_ids; | ||||||
|  | @ -381,9 +379,6 @@ struct phy_device { | ||||||
| 
 | 
 | ||||||
| 	phy_interface_t interface; | 	phy_interface_t interface; | ||||||
| 
 | 
 | ||||||
| 	/* Bus address of the PHY (0-31) */ |  | ||||||
| 	int addr; |  | ||||||
| 
 |  | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * forced speed & duplex (no autoneg) | 	 * forced speed & duplex (no autoneg) | ||||||
| 	 * partner speed & duplex & pause (autoneg) | 	 * partner speed & duplex & pause (autoneg) | ||||||
|  | @ -432,7 +427,8 @@ struct phy_device { | ||||||
| 
 | 
 | ||||||
| 	void (*adjust_link)(struct net_device *dev); | 	void (*adjust_link)(struct net_device *dev); | ||||||
| }; | }; | ||||||
| #define to_phy_device(d) container_of(d, struct phy_device, dev) | #define to_phy_device(d) container_of(to_mdio_device(d), \ | ||||||
|  | 				      struct phy_device, mdio) | ||||||
| 
 | 
 | ||||||
| /* struct phy_driver: Driver structure for a particular PHY type
 | /* struct phy_driver: Driver structure for a particular PHY type
 | ||||||
|  * |  * | ||||||
|  | @ -622,7 +618,7 @@ static inline int phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum) | ||||||
| 	if (!phydev->is_c45) | 	if (!phydev->is_c45) | ||||||
| 		return -EOPNOTSUPP; | 		return -EOPNOTSUPP; | ||||||
| 
 | 
 | ||||||
| 	return mdiobus_read(phydev->bus, phydev->addr, | 	return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, | ||||||
| 			    MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff)); | 			    MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -648,7 +644,7 @@ int phy_read_mmd_indirect(struct phy_device *phydev, int prtad, int devad); | ||||||
|  */ |  */ | ||||||
| static inline int phy_read(struct phy_device *phydev, u32 regnum) | static inline int phy_read(struct phy_device *phydev, u32 regnum) | ||||||
| { | { | ||||||
| 	return mdiobus_read(phydev->bus, phydev->addr, regnum); | 	return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, regnum); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -663,7 +659,7 @@ static inline int phy_read(struct phy_device *phydev, u32 regnum) | ||||||
|  */ |  */ | ||||||
| static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val) | static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val) | ||||||
| { | { | ||||||
| 	return mdiobus_write(phydev->bus, phydev->addr, regnum, val); | 	return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, regnum, val); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -726,7 +722,7 @@ static inline int phy_write_mmd(struct phy_device *phydev, int devad, | ||||||
| 
 | 
 | ||||||
| 	regnum = MII_ADDR_C45 | ((devad & 0x1f) << 16) | (regnum & 0xffff); | 	regnum = MII_ADDR_C45 | ((devad & 0x1f) << 16) | (regnum & 0xffff); | ||||||
| 
 | 
 | ||||||
| 	return mdiobus_write(phydev->bus, phydev->addr, regnum, val); | 	return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, regnum, val); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -776,14 +772,14 @@ static inline int phy_read_status(struct phy_device *phydev) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #define phydev_err(_phydev, format, args...)	\ | #define phydev_err(_phydev, format, args...)	\ | ||||||
| 	dev_err(&_phydev->dev, format, ##args) | 	dev_err(&_phydev->mdio.dev, format, ##args) | ||||||
| 
 | 
 | ||||||
| #define phydev_dbg(_phydev, format, args...)	\ | #define phydev_dbg(_phydev, format, args...)	\ | ||||||
| 	dev_dbg(&_phydev->dev, format, ##args) | 	dev_dbg(&_phydev->mdio.dev, format, ##args); | ||||||
| 
 | 
 | ||||||
| static inline const char *phydev_name(const struct phy_device *phydev) | static inline const char *phydev_name(const struct phy_device *phydev) | ||||||
| { | { | ||||||
| 	return dev_name(&phydev->dev); | 	return dev_name(&phydev->mdio.dev); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) | void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) | ||||||
|  |  | ||||||
|  | @ -439,7 +439,7 @@ static void dsa_switch_destroy(struct dsa_switch *ds) | ||||||
| 		if (of_phy_is_fixed_link(port_dn)) { | 		if (of_phy_is_fixed_link(port_dn)) { | ||||||
| 			phydev = of_phy_find_device(port_dn); | 			phydev = of_phy_find_device(port_dn); | ||||||
| 			if (phydev) { | 			if (phydev) { | ||||||
| 				int addr = phydev->addr; | 				int addr = phydev->mdio.addr; | ||||||
| 
 | 
 | ||||||
| 				phy_device_free(phydev); | 				phy_device_free(phydev); | ||||||
| 				of_node_put(port_dn); | 				of_node_put(port_dn); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Andrew Lunn
						Andrew Lunn