diff options
Diffstat (limited to 'drivers/net/phy/micrel.c')
| -rw-r--r-- | drivers/net/phy/micrel.c | 44 | 
1 files changed, 30 insertions, 14 deletions
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 6a5fd18f062c..8b2038844ba9 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@ -268,23 +268,12 @@ out:  	return ret;  } -static int kszphy_config_init(struct phy_device *phydev) +/* Some config bits need to be set again on resume, handle them here. */ +static int kszphy_config_reset(struct phy_device *phydev)  {  	struct kszphy_priv *priv = phydev->priv; -	const struct kszphy_type *type;  	int ret; -	if (!priv) -		return 0; - -	type = priv->type; - -	if (type->has_broadcast_disable) -		kszphy_broadcast_disable(phydev); - -	if (type->has_nand_tree_disable) -		kszphy_nand_tree_disable(phydev); -  	if (priv->rmii_ref_clk_sel) {  		ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val);  		if (ret) { @@ -295,11 +284,30 @@ static int kszphy_config_init(struct phy_device *phydev)  	}  	if (priv->led_mode >= 0) -		kszphy_setup_led(phydev, type->led_mode_reg, priv->led_mode); +		kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode);  	return 0;  } +static int kszphy_config_init(struct phy_device *phydev) +{ +	struct kszphy_priv *priv = phydev->priv; +	const struct kszphy_type *type; + +	if (!priv) +		return 0; + +	type = priv->type; + +	if (type->has_broadcast_disable) +		kszphy_broadcast_disable(phydev); + +	if (type->has_nand_tree_disable) +		kszphy_nand_tree_disable(phydev); + +	return kszphy_config_reset(phydev); +} +  static int ksz8041_config_init(struct phy_device *phydev)  {  	struct device_node *of_node = phydev->mdio.dev.of_node; @@ -611,6 +619,8 @@ static int ksz9031_read_status(struct phy_device *phydev)  	if ((regval & 0xFF) == 0xFF) {  		phy_init_hw(phydev);  		phydev->link = 0; +		if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev)) +			phydev->drv->config_intr(phydev);  	}  	return 0; @@ -700,8 +710,14 @@ static int kszphy_suspend(struct phy_device *phydev)  static int kszphy_resume(struct phy_device *phydev)  { +	int ret; +  	genphy_resume(phydev); +	ret = kszphy_config_reset(phydev); +	if (ret) +		return ret; +  	/* Enable PHY Interrupts */  	if (phy_interrupt_is_valid(phydev)) {  		phydev->interrupts = PHY_INTERRUPT_ENABLED;  | 
