ramips: ethernet: ralink: use the reset controller api for esw & ephy
authorAlexander Couzens <lynxis@fe80.eu>
Wed, 9 Jun 2021 21:35:54 +0000 (23:35 +0200)
committerAlexander Couzens <lynxis@fe80.eu>
Fri, 25 Jun 2021 08:52:50 +0000 (10:52 +0200)
Instead of writing direct into the reset registers.

Signed-off-by: Alexander Couzens <lynxis@fe80.eu>
target/linux/ramips/dts/mt7628an.dtsi
target/linux/ramips/dts/rt3050.dtsi
target/linux/ramips/dts/rt3352.dtsi
target/linux/ramips/dts/rt5350.dtsi
target/linux/ramips/files/drivers/net/ethernet/ralink/esw_rt3050.c

index d622aa90776d8013b005e267163b25a29f7849c5..9bf20cecdd1a80301ad5662893deb67dda66f473 100644 (file)
                compatible = "mediatek,mt7628-esw", "ralink,rt3050-esw";
                reg = <0x10110000 0x8000>;
 
-               resets = <&rstctrl 23>;
-               reset-names = "esw";
+               resets = <&rstctrl 23 &rstctrl 24>;
+               reset-names = "esw", "ephy";
 
                interrupt-parent = <&intc>;
                interrupts = <17>;
index 0cecd5d8cf022a5f3b3833f8efd1744d88f15f32..492474fdc43f74325df78f28cd6569dda0d18143 100644 (file)
                compatible = "ralink,rt3050-esw";
                reg = <0x10110000 0x8000>;
 
-               resets = <&rstctrl 23>;
-               reset-names = "esw";
+               resets = <&rstctrl 23 &rstctrl 24>;
+               reset-names = "esw", "ephy";
 
                interrupt-parent = <&intc>;
                interrupts = <17>;
index 84d6ed5905870d7f1f62ef28e57734d7bf6cbc40..608222cb5c96a5ba0502be0c59e366a95b6c87b3 100644 (file)
                compatible = "ralink,rt3352-esw", "ralink,rt3050-esw";
                reg = <0x10110000 0x8000>;
 
-               resets = <&rstctrl 23>;
-               reset-names = "esw";
+               resets = <&rstctrl 23 &rstctrl 24>;
+               reset-names = "esw", "ephy";
 
                interrupt-parent = <&intc>;
                interrupts = <17>;
index ac4c6d9db259c428c4952f0b5b0c253df567056f..1058069016695becba8bc746d5729e2c072bb114 100644 (file)
                compatible = "ralink,rt5350-esw", "ralink,rt3050-esw";
                reg = <0x10110000 0x8000>;
 
-               resets = <&rstctrl 23>;
-               reset-names = "esw";
+               resets = <&rstctrl 23 &rstctrl 24>;
+               reset-names = "esw", "ephy";
 
                interrupt-parent = <&intc>;
                interrupts = <17>;
index 292f11a1700e03862e35a772a64e4f56da818b59..cd6ae075950e71ffe8b0f5287124eb09f5ac741f 100644 (file)
 #include <linux/kernel.h>
 #include <linux/platform_device.h>
 #include <asm/mach-ralink/ralink_regs.h>
+#include <linux/of_device.h>
 #include <linux/of_irq.h>
 
 #include <linux/switch.h>
+#include <linux/reset.h>
 
 #include "mtk_eth_soc.h"
 
 
 #define RT5350_ESW_REG_PXTPC(_x)       (0x150 + (4 * _x))
 #define RT5350_EWS_REG_LED_POLARITY    0x168
-#define RT5350_RESET_EPHY              BIT(24)
 
 enum {
        /* Global attributes. */
@@ -232,6 +233,8 @@ struct rt305x_esw {
        int                     led_frequency;
        struct esw_vlan vlans[RT305X_ESW_NUM_VLANS];
        struct esw_port ports[RT305X_ESW_NUM_PORTS];
+       struct reset_control    *rst_esw;
+       struct reset_control    *rst_ephy;
 
 };
 
@@ -254,6 +257,29 @@ static inline void esw_rmw_raw(struct rt305x_esw *esw, unsigned reg,
        __raw_writel(t | val, esw->base + reg);
 }
 
+static void esw_reset(struct rt305x_esw *esw)
+{
+       if (!esw->rst_esw)
+               return;
+
+       reset_control_assert(esw->rst_esw);
+       usleep_range(60, 120);
+       reset_control_deassert(esw->rst_esw);
+       /* the esw takes long to reset otherwise the board hang */
+       msleep(10);
+}
+
+static void esw_reset_ephy(struct rt305x_esw *esw)
+{
+       if (!esw->rst_ephy)
+               return;
+
+       reset_control_assert(esw->rst_ephy);
+       usleep_range(60, 120);
+       reset_control_deassert(esw->rst_ephy);
+       usleep_range(60, 120);
+}
+
 static void esw_rmw(struct rt305x_esw *esw, unsigned reg,
                    unsigned long mask, unsigned long val)
 {
@@ -505,8 +531,7 @@ static void esw_hw_init(struct rt305x_esw *esw)
                esw->ports[i].disable = (port_disable & (1 << i)) != 0;
 
        if (ralink_soc == RT305X_SOC_RT3352) {
-               /* reset EPHY */
-               fe_reset(RT5350_RESET_EPHY);
+               esw_reset_ephy(esw);
 
                rt305x_mii_write(esw, 0, 31, 0x8000);
                for (i = 0; i < 5; i++) {
@@ -556,8 +581,7 @@ static void esw_hw_init(struct rt305x_esw *esw)
                /* select local register */
                rt305x_mii_write(esw, 0, 31, 0x8000);
        } else if (ralink_soc == RT305X_SOC_RT5350) {
-               /* reset EPHY */
-               fe_reset(RT5350_RESET_EPHY);
+               esw_reset_ephy(esw);
 
                /* set the led polarity */
                esw_w32(esw, esw->reg_led_polarity & 0x1F,
@@ -614,8 +638,7 @@ static void esw_hw_init(struct rt305x_esw *esw)
        } else if (ralink_soc == MT762X_SOC_MT7628AN || ralink_soc == MT762X_SOC_MT7688) {
                int i;
 
-               /* reset EPHY */
-               fe_reset(RT5350_RESET_EPHY);
+               esw_reset_ephy(esw);
 
                /* set the led polarity */
                esw_w32(esw, esw->reg_led_polarity & 0x1F,
@@ -1385,6 +1408,13 @@ static int esw_probe(struct platform_device *pdev)
        if (reg_init)
                esw->reg_led_polarity = be32_to_cpu(*reg_init);
 
+       esw->rst_esw = devm_reset_control_get(&pdev->dev, "esw");
+       if (IS_ERR(esw->rst_esw))
+               esw->rst_esw = NULL;
+       esw->rst_ephy = devm_reset_control_get(&pdev->dev, "ephy");
+       if (IS_ERR(esw->rst_ephy))
+               esw->rst_ephy = NULL;
+
        swdev = &esw->swdev;
        swdev->of_node = pdev->dev.of_node;
        swdev->name = "rt305x-esw";