ramips: ethernet: ralink: add fe_reset_fe() to reset fe via reset controller
authorAlexander Couzens <lynxis@fe80.eu>
Wed, 9 Jun 2021 21:08:07 +0000 (23:08 +0200)
committerAlexander Couzens <lynxis@fe80.eu>
Fri, 25 Jun 2021 08:52:50 +0000 (10:52 +0200)
The dts defines the reset fe for all architectures. However
the soc code used direct register access of the reset controller.
Replace the custom soc reset with a generic fe_reset_fe().

Signed-off-by: Alexander Couzens <lynxis@fe80.eu>
target/linux/ramips/files/drivers/net/ethernet/ralink/mtk_eth_soc.c
target/linux/ramips/files/drivers/net/ethernet/ralink/mtk_eth_soc.h
target/linux/ramips/files/drivers/net/ethernet/ralink/soc_rt2880.c
target/linux/ramips/files/drivers/net/ethernet/ralink/soc_rt3050.c
target/linux/ramips/files/drivers/net/ethernet/ralink/soc_rt3883.c

index f0afb4877ab01bd3212ea80b6af301974b32f2fc..8a088bd5ceaedc95ed6d59df453cd4118a29892d 100644 (file)
@@ -141,6 +141,17 @@ void fe_reset(u32 reset_bits)
        usleep_range(10, 20);
 }
 
+void fe_reset_fe(struct fe_priv *priv)
+{
+       if (!priv->rst_fe)
+               return;
+
+       reset_control_assert(priv->rst_fe);
+       usleep_range(60, 120);
+       reset_control_deassert(priv->rst_fe);
+       usleep_range(60, 120);
+}
+
 static inline void fe_int_disable(u32 mask)
 {
        fe_reg_w32(fe_reg_r32(FE_REG_FE_INT_ENABLE) & ~mask,
@@ -1360,7 +1371,10 @@ static int __init fe_init(struct net_device *dev)
        const char *mac_addr;
        int err;
 
-       priv->soc->reset_fe(priv);
+       if (priv->soc->reset_fe)
+               priv->soc->reset_fe(priv);
+       else
+               fe_reset_fe(priv);
 
        if (priv->soc->switch_init)
                if (priv->soc->switch_init(priv)) {
@@ -1579,6 +1593,12 @@ static int fe_probe(struct platform_device *pdev)
                goto err_free_dev;
        }
 
+       priv = netdev_priv(netdev);
+       spin_lock_init(&priv->page_lock);
+       priv->rst_fe = devm_reset_control_get(&pdev->dev, "fe");
+       if (IS_ERR(priv->rst_fe))
+               priv->rst_fe = NULL;
+
        if (soc->init_data)
                soc->init_data(soc, netdev);
        netdev->vlan_features = netdev->hw_features &
@@ -1593,8 +1613,6 @@ static int fe_probe(struct platform_device *pdev)
        if (fe_reg_table[FE_REG_FE_DMA_VID_BASE])
                netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
 
-       priv = netdev_priv(netdev);
-       spin_lock_init(&priv->page_lock);
        if (fe_reg_table[FE_REG_FE_COUNTER_BASE]) {
                priv->hw_stats = kzalloc(sizeof(*priv->hw_stats), GFP_KERNEL);
                if (!priv->hw_stats) {
index eb170986a88df7f9f1bc1bc0848b205316439bc0..968db366cfafd38720034f3a928adb8a89c51df0 100644 (file)
@@ -498,6 +498,7 @@ struct fe_priv {
        DECLARE_BITMAP(pending_flags, FE_FLAG_MAX);
 
        struct reset_control            *rst_ppe;
+       struct reset_control            *rst_fe;
        struct mtk_foe_entry            *foe_table;
        dma_addr_t                      foe_table_phys;
        struct flow_offload __rcu       **foe_flow_table;
@@ -517,6 +518,7 @@ void fe_reg_w32(u32 val, enum fe_reg reg);
 u32 fe_reg_r32(enum fe_reg reg);
 
 void fe_reset(u32 reset_bits);
+void fe_reset_fe(struct fe_priv *priv);
 
 static inline void *priv_netdev(struct fe_priv *priv)
 {
index ab3ac1e4f3714f57b28c2bbee4b32c5b20af687e..f36904950db87b67588a6f255b43c025f4fb4b31 100644 (file)
@@ -19,8 +19,6 @@
 #include "mtk_eth_soc.h"
 #include "mdio_rt2880.h"
 
-#define RT2880_RESET_FE                        BIT(18)
-
 static void rt2880_init_data(struct fe_soc_data *data,
                             struct net_device *netdev)
 {
@@ -33,11 +31,6 @@ static void rt2880_init_data(struct fe_soc_data *data,
        /* netdev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_RXCSUM; */
 }
 
-void rt2880_fe_reset(struct fe_priv *priv)
-{
-       fe_reset(RT2880_RESET_FE);
-}
-
 static int rt2880_fwd_config(struct fe_priv *priv)
 {
        int ret;
@@ -55,7 +48,6 @@ static int rt2880_fwd_config(struct fe_priv *priv)
 
 struct fe_soc_data rt2880_data = {
        .init_data = rt2880_init_data,
-       .reset_fe = rt2880_fe_reset,
        .fwd_config = rt2880_fwd_config,
        .pdma_glo_cfg = FE_PDMA_SIZE_8DWORDS,
        .checksum_bit = RX_DMA_L4VALID,
index cdc27e056b61aef057f5584a2508a24b2dc0a0af..6aedf0265a371179772a3cc459499fcb85cbabd2 100644 (file)
@@ -69,11 +69,6 @@ static int rt3050_fwd_config(struct fe_priv *priv)
        return 0;
 }
 
-static void rt305x_fe_reset(struct fe_priv *priv)
-{
-       fe_reset(RT305X_RESET_FE);
-}
-
 static void rt5350_init_data(struct fe_soc_data *data,
                             struct net_device *netdev)
 {
@@ -127,7 +122,6 @@ static void rt5350_fe_reset(struct fe_priv *priv)
 
 static struct fe_soc_data rt3050_data = {
        .init_data = rt305x_init_data,
-       .reset_fe = rt305x_fe_reset,
        .fwd_config = rt3050_fwd_config,
        .pdma_glo_cfg = FE_PDMA_SIZE_8DWORDS,
        .checksum_bit = RX_DMA_L4VALID,
index afcc3da4e457226206c978b148d7f68d046fd918..7b61e9c40731cda3cecb19f4290876811c39eee4 100644 (file)
 #include "mtk_eth_soc.h"
 #include "mdio_rt2880.h"
 
-#define RT3883_RSTCTRL_FE              BIT(21)
-
-static void rt3883_fe_reset(struct fe_priv *priv)
-{
-       fe_reset(RT3883_RSTCTRL_FE);
-}
-
 static int rt3883_fwd_config(struct fe_priv *priv)
 {
        int ret;
@@ -54,7 +47,6 @@ static void rt3883_init_data(struct fe_soc_data *data,
 
 static struct fe_soc_data rt3883_data = {
        .init_data = rt3883_init_data,
-       .reset_fe = rt3883_fe_reset,
        .fwd_config = rt3883_fwd_config,
        .pdma_glo_cfg = FE_PDMA_SIZE_8DWORDS,
        .rx_int = FE_RX_DONE_INT,