[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/arch/arm/boot/dts/asr1806-p301.dts b/marvell/linux/arch/arm/boot/dts/asr1806-p301.dts
index 9633dbb..dea3101 100755
--- a/marvell/linux/arch/arm/boot/dts/asr1806-p301.dts
+++ b/marvell/linux/arch/arm/boot/dts/asr1806-p301.dts
@@ -50,9 +50,11 @@
eth0: asr-eth@0xd4281800 {
compatible = "asr,asr-eth";
- pinctrl-names = "default", "rgmii-pins";
+ pinctrl-names = "default", "rgmii-pins", "sleep";
pinctrl-0 = <&emac_pmx_func0 &emac_pmx_func2 &emac_pmx_func3>;
- pinctrl-1 = <&emac_pmx_func0 &emac_pmx_func1 &emac_pmx_func2 &emac_pmx_func3>;
+ pinctrl-1 = <&emac_pmx_func0 &emac_pmx_func1 &emac_pmx_func2 &emac_pmx_func3>;
+ pinctrl-2 = <&emac_pmx_func0_slp &emac_pmx_func1_slp &emac_pmx_func2_slp>;
+
reg = <0xd4281800 0x200>;
interrupts = <10 11>;
lpm-qos = <PM_QOS_CPUIDLE_BLOCK_AXI>;
@@ -847,6 +849,45 @@
>;
DS_MEDIUM;PULL_UP;EDGE_NONE;SL_NORMAL;
};
+
+ emac_pmx_func0_slp: emac_pmx_func0_slp {
+ pinctrl-single,pins = <
+ GPIO00 AF1 /* GMAC1_RX_DV */
+ GPIO01 AF1 /* GMAC1_RX_D0 */
+ GPIO02 AF1 /* GMAC1_RX_D1 */
+ GPIO03 AF1 /* GMAC1_RX_CLK */
+ /* GPIO04 AF1 GMAC1_RX_D2 */
+ /* GPIO05 AF1 GMAC1_RX_D3 */
+ GPIO06 AF1 /* GMAC1_TX_D0 */
+ GPIO07 AF1 /* GMAC1_TX_D1 */
+ /* GPIO12 AF1 GMAC1_TX_CLK */
+ /* GPIO13 AF1 GMAC1_TX_D2 */
+ /* GPIO14 AF1 GMAC1_TX_D3 */
+ GPIO15 AF1 /* GMAC1_TX_EN */
+ GPIO16 AF1 /* GMAC1_TX_MDC */
+ /* GPIO17 AF1 GMAC1_TX_MDIO */
+ >;
+ DS_OFF;PULL_DOWN;EDGE_NONE;SL_NORMAL;
+ };
+
+ emac_pmx_func1_slp: emac_pmx_func1_slp {
+ pinctrl-single,pins = <
+ GPIO04 AF1 /* GMAC1_RX_D2 */
+ GPIO05 AF1 /* GMAC1_RX_D3 */
+ GPIO12 AF1 /* GMAC1_TX_CLK */
+ GPIO13 AF1 /* GMAC1_TX_D2 */
+ GPIO14 AF1 /* GMAC1_TX_D3 */
+ >;
+ DS_OFF;PULL_DOWN;EDGE_NONE;SL_NORMAL;
+ };
+ emac_pmx_func2_slp: emac_pmx_func2_slp {
+ pinctrl-single,pins = <
+ GPIO17 AF1 /* GMAC1_TX_MDIO */
+ GPIO18 AF1 /* GMAC1_TX_INT_N */
+ >;
+ DS_OFF;PULL_DOWN;EDGE_NONE;SL_NORMAL;
+ };
+
emac_pmx_func3: emac_pmx_func3 {
pinctrl-single,pins = <
GPIO42 AF0 /* RESET */
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,
},