Skip to content

Commit

Permalink
net: phy: micrel: Restore led_mode and clk_sel on resume
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Leonard Crestez authored and David S. Miller committed Jun 1, 2017
1 parent e6f4292 commit 79e498a
Showing 1 changed file with 28 additions and 14 deletions.
42 changes: 28 additions & 14 deletions drivers/net/phy/micrel.c
Original file line number Diff line number Diff line change
Expand Up @@ -268,23 +268,12 @@ static int kszphy_nand_tree_disable(struct phy_device *phydev)
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) {
Expand All @@ -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;
Expand Down Expand Up @@ -700,8 +708,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;
Expand Down

0 comments on commit 79e498a

Please sign in to comment.