ramips: mtk_eth_soc: allow multiple resets
authorLech Perczak <lech.perczak@gmail.com>
Fri, 15 Dec 2023 16:15:47 +0000 (17:15 +0100)
committerHauke Mehrtens <hauke@hauke-m.de>
Tue, 2 Jan 2024 20:56:52 +0000 (21:56 +0100)
Use devm_reset_control_array_get_exclusive to register multiple
reset lines in FE driver. This is required to reattach ESW reset to FE
driver again, based on device tree bindings.

While at that, remove unused fe_priv.rst_ppe field, and add error
message if getting the reset fails.

Fixes: 60fadae62b64 ("ramips: ethernet: ralink: move reset of the esw into the esw instead of fe")
Co-developed-by: Maxim Anisimov <maxim.anisimov.ua@gmail.com>
Signed-off-by: Maxim Anisimov <maxim.anisimov.ua@gmail.com>
[Split out of the bigger commit, provide commit mesage, refactor error
handling]
Signed-off-by: Lech Perczak <lech.perczak@gmail.com>
target/linux/ramips/files/drivers/net/ethernet/ralink/mtk_eth_soc.c
target/linux/ramips/files/drivers/net/ethernet/ralink/mtk_eth_soc.h

index b79b34893808c26149e54032515a08cd0593d5de..78b17605d276c7b65cf4ef6d5f0c71ca7e900ad9 100644 (file)
@@ -143,12 +143,12 @@ void fe_reset(u32 reset_bits)
 
 void fe_reset_fe(struct fe_priv *priv)
 {
-       if (!priv->rst_fe)
+       if (!priv->resets)
                return;
 
-       reset_control_assert(priv->rst_fe);
+       reset_control_assert(priv->resets);
        usleep_range(60, 120);
-       reset_control_deassert(priv->rst_fe);
+       reset_control_deassert(priv->resets);
        usleep_range(60, 120);
 }
 
@@ -1595,9 +1595,11 @@ static int fe_probe(struct platform_device *pdev)
 
        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;
+       priv->resets = devm_reset_control_array_get_exclusive(&pdev->dev);
+       if (IS_ERR(priv->resets)) {
+               dev_err(&pdev->dev, "Failed to get resets for FE and ESW cores: %pe\n", priv->resets);
+               priv->resets = NULL;
+       }
 
        if (soc->init_data)
                soc->init_data(soc, netdev);
index 968db366cfafd38720034f3a928adb8a89c51df0..892ffb21262494de5e063140623ec3caa8a63b9e 100644 (file)
@@ -497,8 +497,7 @@ struct fe_priv {
        struct work_struct              pending_work;
        DECLARE_BITMAP(pending_flags, FE_FLAG_MAX);
 
-       struct reset_control            *rst_ppe;
-       struct reset_control            *rst_fe;
+       struct reset_control            *resets;
        struct mtk_foe_entry            *foe_table;
        dma_addr_t                      foe_table_phys;
        struct flow_offload __rcu       **foe_flow_table;