mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	Backport the mdio-bus reset gpio support from 4.12 and use it instead of toggling the reset ourself. Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
		
			
				
	
	
		
			44 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From df0c8d911abf6ba97b2c2fc3c5a12769e0b081a3 Mon Sep 17 00:00:00 2001
 | |
| From: Florian Fainelli <f.fainelli@gmail.com>
 | |
| Date: Thu, 11 May 2017 11:24:16 -0700
 | |
| Subject: [PATCH] net: phy: Call bus->reset() after releasing PHYs from reset
 | |
| 
 | |
| The API convention makes it that a given MDIO bus reset should be able
 | |
| to access PHY devices in its reset() callback and perform additional
 | |
| MDIO accesses in order to bring the bus and PHYs in a working state.
 | |
| 
 | |
| Commit 69226896ad63 ("mdio_bus: Issue GPIO RESET to PHYs.") broke that
 | |
| contract by first calling bus->reset() and then release all PHYs from
 | |
| reset using their shared GPIO line, so restore the expected
 | |
| functionality here.
 | |
| 
 | |
| Fixes: 69226896ad63 ("mdio_bus: Issue GPIO RESET to PHYs.")
 | |
| Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
 | |
| Signed-off-by: David S. Miller <davem@davemloft.net>
 | |
| ---
 | |
|  drivers/net/phy/mdio_bus.c | 6 +++---
 | |
|  1 file changed, 3 insertions(+), 3 deletions(-)
 | |
| 
 | |
| --- a/drivers/net/phy/mdio_bus.c
 | |
| +++ b/drivers/net/phy/mdio_bus.c
 | |
| @@ -279,9 +279,6 @@ int __mdiobus_register(struct mii_bus *b
 | |
|  
 | |
|  	mutex_init(&bus->mdio_lock);
 | |
|  
 | |
| -	if (bus->reset)
 | |
| -		bus->reset(bus);
 | |
| -
 | |
|  	/* de-assert bus level PHY GPIO resets */
 | |
|  	if (bus->num_reset_gpios > 0) {
 | |
|  		bus->reset_gpiod = devm_kcalloc(&bus->dev,
 | |
| @@ -311,6 +308,9 @@ int __mdiobus_register(struct mii_bus *b
 | |
|  		}
 | |
|  	}
 | |
|  
 | |
| +	if (bus->reset)
 | |
| +		bus->reset(bus);
 | |
| +
 | |
|  	for (i = 0; i < PHY_MAX_ADDR; i++) {
 | |
|  		if ((bus->phy_mask & (1 << i)) == 0) {
 | |
|  			struct phy_device *phydev;
 |