forked from mirrors/linux
		
	Marvell phy: add functions to suspend and resume both interfaces: fiber and copper links.
These functions used standards registers in a different page for both interfaces: copper and fiber. Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: Charles-Antoine Couret <charles-antoine.couret@nexvision.fr> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									78301ebe9b
								
							
						
					
					
						commit
						3758be3dc1
					
				
					 1 changed files with 71 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -1224,6 +1224,75 @@ static int marvell_read_status(struct phy_device *phydev)
 | 
			
		|||
	phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* marvell_suspend
 | 
			
		||||
 *
 | 
			
		||||
 * Some Marvell's phys have two modes: fiber and copper.
 | 
			
		||||
 * Both need to be suspended
 | 
			
		||||
 */
 | 
			
		||||
static int marvell_suspend(struct phy_device *phydev)
 | 
			
		||||
{
 | 
			
		||||
	int err;
 | 
			
		||||
 | 
			
		||||
	/* Suspend the fiber mode first */
 | 
			
		||||
	if (!(phydev->supported & SUPPORTED_FIBRE)) {
 | 
			
		||||
		err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_FIBER);
 | 
			
		||||
		if (err < 0)
 | 
			
		||||
			goto error;
 | 
			
		||||
 | 
			
		||||
		/* With the page set, use the generic suspend */
 | 
			
		||||
		err = genphy_suspend(phydev);
 | 
			
		||||
		if (err < 0)
 | 
			
		||||
			goto error;
 | 
			
		||||
 | 
			
		||||
		/* Then, the copper link */
 | 
			
		||||
		err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
 | 
			
		||||
		if (err < 0)
 | 
			
		||||
			goto error;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* With the page set, use the generic suspend */
 | 
			
		||||
	return genphy_suspend(phydev);
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
	phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* marvell_resume
 | 
			
		||||
 *
 | 
			
		||||
 * Some Marvell's phys have two modes: fiber and copper.
 | 
			
		||||
 * Both need to be resumed
 | 
			
		||||
 */
 | 
			
		||||
static int marvell_resume(struct phy_device *phydev)
 | 
			
		||||
{
 | 
			
		||||
	int err;
 | 
			
		||||
 | 
			
		||||
	/* Resume the fiber mode first */
 | 
			
		||||
	if (!(phydev->supported & SUPPORTED_FIBRE)) {
 | 
			
		||||
		err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_FIBER);
 | 
			
		||||
		if (err < 0)
 | 
			
		||||
			goto error;
 | 
			
		||||
 | 
			
		||||
		/* With the page set, use the generic resume */
 | 
			
		||||
		err = genphy_resume(phydev);
 | 
			
		||||
		if (err < 0)
 | 
			
		||||
			goto error;
 | 
			
		||||
 | 
			
		||||
		/* Then, the copper link */
 | 
			
		||||
		err = phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
 | 
			
		||||
		if (err < 0)
 | 
			
		||||
			goto error;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* With the page set, use the generic resume */
 | 
			
		||||
	return genphy_resume(phydev);
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
	phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_M1111_COPPER);
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int marvell_aneg_done(struct phy_device *phydev)
 | 
			
		||||
{
 | 
			
		||||
	int retval = phy_read(phydev, MII_M1011_PHY_STATUS);
 | 
			
		||||
| 
						 | 
				
			
			@ -1611,8 +1680,8 @@ static struct phy_driver marvell_drivers[] = {
 | 
			
		|||
		.ack_interrupt = &marvell_ack_interrupt,
 | 
			
		||||
		.config_intr = &marvell_config_intr,
 | 
			
		||||
		.did_interrupt = &m88e1121_did_interrupt,
 | 
			
		||||
		.resume = &genphy_resume,
 | 
			
		||||
		.suspend = &genphy_suspend,
 | 
			
		||||
		.resume = &marvell_resume,
 | 
			
		||||
		.suspend = &marvell_suspend,
 | 
			
		||||
		.get_sset_count = marvell_get_sset_count,
 | 
			
		||||
		.get_strings = marvell_get_strings,
 | 
			
		||||
		.get_stats = marvell_get_stats,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue