diff --git a/arch/arm/boot/dts/amlogic/mesong12a.dtsi b/arch/arm/boot/dts/amlogic/mesong12a.dtsi index 1b0d05d7ba16..92e01c793c1e 100644 --- a/arch/arm/boot/dts/amlogic/mesong12a.dtsi +++ b/arch/arm/boot/dts/amlogic/mesong12a.dtsi @@ -301,8 +301,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0xff3f0000 0x10000 0xff634540 0x8 - 0xff64c000 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0xff64c000 0xa0 + 0xffd01008 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm/boot/dts/amlogic/mesong12b.dtsi b/arch/arm/boot/dts/amlogic/mesong12b.dtsi index 00566c792eae..1ad3e9768013 100644 --- a/arch/arm/boot/dts/amlogic/mesong12b.dtsi +++ b/arch/arm/boot/dts/amlogic/mesong12b.dtsi @@ -356,8 +356,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0xff3f0000 0x10000 0xff634540 0x8 - 0xff64c000 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0xff64c000 0xa0 + 0xffd01008 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm/boot/dts/amlogic/mesong12b_a.dtsi b/arch/arm/boot/dts/amlogic/mesong12b_a.dtsi index 3f910ea749b2..0098edd8fbea 100644 --- a/arch/arm/boot/dts/amlogic/mesong12b_a.dtsi +++ b/arch/arm/boot/dts/amlogic/mesong12b_a.dtsi @@ -356,8 +356,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0xff3f0000 0x10000 0xff634540 0x8 - 0xff64c000 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0xff64c000 0xa0 + 0xffd01008 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm/boot/dts/amlogic/mesonsm1.dtsi b/arch/arm/boot/dts/amlogic/mesonsm1.dtsi index 9c3622a5551d..a7e807dcd820 100644 --- a/arch/arm/boot/dts/amlogic/mesonsm1.dtsi +++ b/arch/arm/boot/dts/amlogic/mesonsm1.dtsi @@ -301,8 +301,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0xff3f0000 0x10000 0xff634540 0x8 - 0xff64c000 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0xff64c000 0xa0 + 0xffd01008 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm/boot/dts/amlogic/mesontm2.dtsi b/arch/arm/boot/dts/amlogic/mesontm2.dtsi index 1636abe85cf1..deafb0ad989b 100644 --- a/arch/arm/boot/dts/amlogic/mesontm2.dtsi +++ b/arch/arm/boot/dts/amlogic/mesontm2.dtsi @@ -318,8 +318,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0xff3f0000 0x10000 0xff634540 0x8 - 0xff64c000 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0xff64c000 0xa0 + 0xffd01008 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm64/boot/dts/amlogic/mesong12a.dtsi b/arch/arm64/boot/dts/amlogic/mesong12a.dtsi index a1df287c0d96..6fea11acd662 100644 --- a/arch/arm64/boot/dts/amlogic/mesong12a.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesong12a.dtsi @@ -301,8 +301,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0x0 0xff3f0000 0x0 0x10000 0x0 0xff634540 0x0 0x8 - 0x0 0xff64c000 0x0 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0x0 0xff64c000 0x0 0xa0 + 0x0 0xffd01008 0x0 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm64/boot/dts/amlogic/mesong12b.dtsi b/arch/arm64/boot/dts/amlogic/mesong12b.dtsi index 8bb3ff4b708a..9efe4d3809fa 100644 --- a/arch/arm64/boot/dts/amlogic/mesong12b.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesong12b.dtsi @@ -356,8 +356,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0x0 0xff3f0000 0x0 0x10000 0x0 0xff634540 0x0 0x8 - 0x0 0xff64c000 0x0 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0x0 0xff64c000 0x0 0xa0 + 0x0 0xffd01008 0x0 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm64/boot/dts/amlogic/mesong12b_a.dtsi b/arch/arm64/boot/dts/amlogic/mesong12b_a.dtsi index 592a6a6ab346..28efb267620c 100644 --- a/arch/arm64/boot/dts/amlogic/mesong12b_a.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesong12b_a.dtsi @@ -356,8 +356,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0x0 0xff3f0000 0x0 0x10000 0x0 0xff634540 0x0 0x8 - 0x0 0xff64c000 0x0 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0x0 0xff64c000 0x0 0xa0 + 0x0 0xffd01008 0x0 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi b/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi index 8309aa06b122..3fff1d549500 100644 --- a/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi @@ -301,8 +301,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0x0 0xff3f0000 0x0 0x10000 0x0 0xff634540 0x0 0x8 - 0x0 0xff64c000 0x0 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0x0 0xff64c000 0x0 0xa0 + 0x0 0xffd01008 0x0 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm64/boot/dts/amlogic/mesontm2.dtsi b/arch/arm64/boot/dts/amlogic/mesontm2.dtsi index 2b650f8a6428..323b79fdc1ab 100644 --- a/arch/arm64/boot/dts/amlogic/mesontm2.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesontm2.dtsi @@ -299,8 +299,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0x0 0xff3f0000 0x0 0x10000 0x0 0xff634540 0x0 0x8 - 0x0 0xff64c000 0x0 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0x0 0xff64c000 0x0 0xa0 + 0x0 0xffd01008 0x0 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c index ed459b93d4b3..a4cdb8ec4fc2 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c @@ -55,6 +55,9 @@ static unsigned int is_internal_phy; struct meson_dwmac_data { bool g12a_phy; }; + +void __iomem *ee_reset_base; +struct platform_device *ppdev; #endif struct meson_dwmac { @@ -313,6 +316,7 @@ static void __iomem *g12a_network_interface_setup(struct platform_device *pdev) int auto_cali_idx = -1; is_internal_phy = 0; + ppdev = pdev; pr_debug("g12a_network_interface_setup\n"); /*map PRG_ETH_REG */ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "eth_cfg"); @@ -330,6 +334,21 @@ static void __iomem *g12a_network_interface_setup(struct platform_device *pdev) REG_ETH_reg0_addr = addr; pr_info(" REG0:Addr = %p\n", REG_ETH_reg0_addr); + /*map ETH_RESET address*/ + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "eth_reset"); + if (!res) { + dev_err(&pdev->dev, "Unable to get resource(%d)\n", __LINE__); + ee_reset_base = NULL; + } else { + addr = devm_ioremap_resource(dev, res); + if (IS_ERR(addr)) { + dev_err(&pdev->dev, "Unable to map reset base\n"); + return NULL; + } + ee_reset_base = addr; + pr_info(" ee eth reset:Addr = %p\n", ee_reset_base); + } + /*map ETH_PLL address*/ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "eth_pll"); if (!res) { @@ -494,6 +513,10 @@ static int meson6_dwmac_resume(struct device *dev) struct pinctrl_state *turnon_tes = NULL; pr_info("resuem inter = %d\n", is_internal_phy); if ((is_internal_phy) && (support_mac_wol == 0)) { + if (ee_reset_base) + writel((1 << 11), (void __iomem *) + (unsigned long)ee_reset_base); + pin_ctrl = devm_pinctrl_get(dev); if (IS_ERR_OR_NULL(pin_ctrl)) { pr_info("pinctrl is null\n"); @@ -504,7 +527,13 @@ static int meson6_dwmac_resume(struct device *dev) devm_pinctrl_put(pin_ctrl); pin_ctrl = NULL; } - dwmac_meson_recover_analog(dev); + if (!ee_reset_base) { + dwmac_meson_recover_analog(dev); + } else { + dwmac_meson_cfg_pll(phy_analog_config_addr, ppdev); + dwmac_meson_cfg_analog(phy_analog_config_addr, ppdev); + dwmac_meson_cfg_ctrl(phy_analog_config_addr, ppdev); + } } ret = stmmac_pltfr_resume(dev); return ret;