[Feature][T108] [task-view-1618] config phy startup timing and gpio in sleep mode
Only Configure: No
Affected branch: GSW_V1453
Affected module: phy
Self-test: yes
Doc Update: no
Change-Id: Ib327bfa0c2fb3dceb66f55292c78477e3c63166d
diff --git a/marvell/linux/drivers/net/ethernet/asr/emac_eth.c b/marvell/linux/drivers/net/ethernet/asr/emac_eth.c
index b392f6e..ec57709 100755
--- a/marvell/linux/drivers/net/ethernet/asr/emac_eth.c
+++ b/marvell/linux/drivers/net/ethernet/asr/emac_eth.c
@@ -1918,6 +1918,9 @@
int emac_down(struct emac_priv *priv)
{
struct net_device *ndev = priv->ndev;
+ //#LYNQ_MODFIY modify for task-1618 2025/6/24 start
+ struct pinctrl_state *sleep_pins = pinctrl_lookup_state(priv->pinctrl, "sleep");
+ //#LYNQ_MODFIY modify for task-1618 2025/6/24 end
#ifdef WAN_LAN_AUTO_ADAPT
u32 phy_id;
@@ -1940,6 +1943,11 @@
if (ndev->phydev) {
phy_stop(ndev->phydev);
phy_disconnect(ndev->phydev);
+ //#LYNQ_MODFIY modify for task-1618 2025/6/24 start
+ if (IS_ERR(priv->rgmii_pins))
+ printk("could not get rgmii-pins pinstate\n");
+ pinctrl_select_state(priv->pinctrl, sleep_pins);
+ //#LYNQ_MODFIY modify for task-1618 2025/6/24 end
}
if (!priv->fix_link) {
@@ -4010,10 +4018,11 @@
struct device_node *mii_np;
struct device *dev = &priv->pdev->dev;
int ret;
- //#LYNQ_MODFIY modify for task-1618 2025/6/19 start
+ //#LYNQ_MODFIY modify for task-1618 2025/6/24 start
struct device_node *phy_np;
int phy_power_en_gpio;
- //#LYNQ_MODFIY modify for task-1618 2025/6/19 end
+ int phy_rst_gpio;
+ //#LYNQ_MODFIY modify for task-1618 2025/6/24 end
mii_np = of_get_child_by_name(dev->of_node, "mdio-bus");
if (!mii_np) {
@@ -4055,10 +4064,25 @@
}
gpio_request(phy_power_en_gpio, "phy_power_en");
gpio_direction_output(phy_power_en_gpio, 1);
- msleep(30);
+ msleep(10);
gpio_free(phy_power_en_gpio);
//#LYNQ_MODFIY modify for task-1618 2025/6/19 end
+ //#LYNQ_MODFIY modify for task-1618 2025/6/24 start
+ phy_rst_gpio = of_get_named_gpio(phy_np, "rst-gpio", 0);
+ if (phy_rst_gpio < 0) {
+ dev_err(dev, "Failed to get phy_rst gpio: %d\n", phy_rst_gpio);
+ return phy_rst_gpio;
+ }
+
+ gpio_request(phy_rst_gpio, "phy_reset");
+ gpio_direction_output(phy_rst_gpio, 0);
+ msleep(10);
+ gpio_set_value(phy_rst_gpio, 1);
+ gpio_free(phy_rst_gpio);
+ //#LYNQ_MODFIY modify for task-1618 2025/6/24 end
+
+
ret = of_mdiobus_register(priv->mii, mii_np);
err_put_node:
diff --git a/marvell/linux/drivers/net/phy/realtek.c b/marvell/linux/drivers/net/phy/realtek.c
index 096b2c1..602da0b 100755
--- a/marvell/linux/drivers/net/phy/realtek.c
+++ b/marvell/linux/drivers/net/phy/realtek.c
@@ -1001,10 +1001,12 @@
static void rtl9000Bf_reset(int gpio)
{
+ //#LYNQ_MODFIY modify for task-1618 2025/6/24 start
gpio_direction_output(gpio, 0);
- mdelay(30);
+ mdelay(10);
gpio_set_value(gpio, 1);
- mdelay(20);
+ mdelay(10);
+ //#LYNQ_MODFIY modify for task-1618 2025/6/24 end
}
static int rtl9000Bf_config_init(struct phy_device *phydev)
@@ -1155,17 +1157,20 @@
//#LYNQ_MODFIY modify for task-1618 2025/6/10 end
-//#LYNQ_MODFIY modify for task-1618 2025/6/19 start
+//#LYNQ_MODFIY modify for task-1618 2025/6/24 start
static int rtl9000Bf_suspend(struct phy_device *phydev)
{
+ int ret;
+ ret = gpio_direction_output(s_rtl9000bf_mdio_dev->rst_gpio, 0);
+ if(ret != 0){
+ printk(KERN_ERR "phy_error:reset phy error\n");
+ return ret;
+ }
+ mdelay(10);
return gpio_direction_output(s_rtl9000bf_mdio_dev->power_gpio, 0);
+
}
-static int rtl9000Bf_resume(struct phy_device *phydev)
-{
- rtl9000Bf_power_set(s_rtl9000bf_mdio_dev->power_gpio, 1);
- return rtl9000Bf_config_init(phydev);
-}
-//#LYNQ_MODFIY modify for task-1618 2025/6/19 end
+//#LYNQ_MODFIY modify for task-1618 2025/6/24 end
static struct phy_driver realtek_drvs[] = {
@@ -1316,7 +1321,6 @@
.read_status = rtl9000Bf_read_status,
//#LYNQ_MODFIY modify for task-1618 2025/6/19 start
.suspend = rtl9000Bf_suspend,
- .resume = rtl9000Bf_resume,
//#LYNQ_MODFIY modify for task-1618 2025/6/19 end
.soft_reset = rtl9000Bf_soft_reset,
},