diff options
author | Leonard Crestez <leonard.crestez@nxp.com> | 2017-05-31 06:29:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-06-01 15:02:30 -0400 |
commit | 79e498a9c7da0737829ff864aae44df434105676 (patch) | |
tree | 63a902dfff27414dffa9c2b0130abb9f12ac31be | |
parent | e6f4292ae0a1e73fae26ced57de13a48f71ad1fa (diff) |
net: phy: micrel: Restore led_mode and clk_sel on resume
These bits seem to be lost after a suspend/resume cycle so just set them
again. Do this by splitting the handling of these bits into a function
that is also called on resume.
This patch fixes ethernet suspend/resume on imx6ul-14x14-evk boards.
Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/phy/micrel.c | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 6a5fd18f062c..b9252b8d81ff 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c | |||
@@ -268,23 +268,12 @@ out: | |||
268 | return ret; | 268 | return ret; |
269 | } | 269 | } |
270 | 270 | ||
271 | static int kszphy_config_init(struct phy_device *phydev) | 271 | /* Some config bits need to be set again on resume, handle them here. */ |
272 | static int kszphy_config_reset(struct phy_device *phydev) | ||
272 | { | 273 | { |
273 | struct kszphy_priv *priv = phydev->priv; | 274 | struct kszphy_priv *priv = phydev->priv; |
274 | const struct kszphy_type *type; | ||
275 | int ret; | 275 | int ret; |
276 | 276 | ||
277 | if (!priv) | ||
278 | return 0; | ||
279 | |||
280 | type = priv->type; | ||
281 | |||
282 | if (type->has_broadcast_disable) | ||
283 | kszphy_broadcast_disable(phydev); | ||
284 | |||
285 | if (type->has_nand_tree_disable) | ||
286 | kszphy_nand_tree_disable(phydev); | ||
287 | |||
288 | if (priv->rmii_ref_clk_sel) { | 277 | if (priv->rmii_ref_clk_sel) { |
289 | ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val); | 278 | ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val); |
290 | if (ret) { | 279 | if (ret) { |
@@ -295,11 +284,30 @@ static int kszphy_config_init(struct phy_device *phydev) | |||
295 | } | 284 | } |
296 | 285 | ||
297 | if (priv->led_mode >= 0) | 286 | if (priv->led_mode >= 0) |
298 | kszphy_setup_led(phydev, type->led_mode_reg, priv->led_mode); | 287 | kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode); |
299 | 288 | ||
300 | return 0; | 289 | return 0; |
301 | } | 290 | } |
302 | 291 | ||
292 | static int kszphy_config_init(struct phy_device *phydev) | ||
293 | { | ||
294 | struct kszphy_priv *priv = phydev->priv; | ||
295 | const struct kszphy_type *type; | ||
296 | |||
297 | if (!priv) | ||
298 | return 0; | ||
299 | |||
300 | type = priv->type; | ||
301 | |||
302 | if (type->has_broadcast_disable) | ||
303 | kszphy_broadcast_disable(phydev); | ||
304 | |||
305 | if (type->has_nand_tree_disable) | ||
306 | kszphy_nand_tree_disable(phydev); | ||
307 | |||
308 | return kszphy_config_reset(phydev); | ||
309 | } | ||
310 | |||
303 | static int ksz8041_config_init(struct phy_device *phydev) | 311 | static int ksz8041_config_init(struct phy_device *phydev) |
304 | { | 312 | { |
305 | struct device_node *of_node = phydev->mdio.dev.of_node; | 313 | struct device_node *of_node = phydev->mdio.dev.of_node; |
@@ -700,8 +708,14 @@ static int kszphy_suspend(struct phy_device *phydev) | |||
700 | 708 | ||
701 | static int kszphy_resume(struct phy_device *phydev) | 709 | static int kszphy_resume(struct phy_device *phydev) |
702 | { | 710 | { |
711 | int ret; | ||
712 | |||
703 | genphy_resume(phydev); | 713 | genphy_resume(phydev); |
704 | 714 | ||
715 | ret = kszphy_config_reset(phydev); | ||
716 | if (ret) | ||
717 | return ret; | ||
718 | |||
705 | /* Enable PHY Interrupts */ | 719 | /* Enable PHY Interrupts */ |
706 | if (phy_interrupt_is_valid(phydev)) { | 720 | if (phy_interrupt_is_valid(phydev)) { |
707 | phydev->interrupts = PHY_INTERRUPT_ENABLED; | 721 | phydev->interrupts = PHY_INTERRUPT_ENABLED; |