|
@@ -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;
|
|
@@ -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;
|