]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
net: zynq: Add support for GEM reset
authorMichal Simek <michal.simek@xilinx.com>
Fri, 22 Oct 2021 15:09:00 +0000 (17:09 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Mon, 6 Dec 2021 12:32:48 +0000 (13:32 +0100)
Perform reset before core initialization.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/net/zynq_gem.c

index c309c3c9549901be4683a6c44d90733a2952ea9f..57a0f2551fe0d3e3c10bfacd15e85285a5a6b11d 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/cache.h>
 #include <asm/io.h>
 #include <phy.h>
+#include <reset.h>
 #include <miiphy.h>
 #include <wait_bit.h>
 #include <watchdog.h>
@@ -215,6 +216,7 @@ struct zynq_gem_priv {
        bool int_pcs;
        bool dma_64bit;
        u32 clk_en_info;
+       struct reset_ctl_bulk resets;
 };
 
 static int phy_setup_op(struct zynq_gem_priv *priv, u32 phy_addr, u32 regnum,
@@ -686,12 +688,36 @@ static int zynq_gem_miiphy_write(struct mii_dev *bus, int addr, int devad,
        return phywrite(priv, addr, reg, value);
 }
 
+static int zynq_gem_reset_init(struct udevice *dev)
+{
+       struct zynq_gem_priv *priv = dev_get_priv(dev);
+       int ret;
+
+       ret = reset_get_bulk(dev, &priv->resets);
+       if (ret == -ENOTSUPP || ret == -ENOENT)
+               return 0;
+       else if (ret)
+               return ret;
+
+       ret = reset_deassert_bulk(&priv->resets);
+       if (ret) {
+               reset_release_bulk(&priv->resets);
+               return ret;
+       }
+
+       return 0;
+}
+
 static int zynq_gem_probe(struct udevice *dev)
 {
        void *bd_space;
        struct zynq_gem_priv *priv = dev_get_priv(dev);
        int ret;
 
+       ret = zynq_gem_reset_init(dev);
+       if (ret)
+               return ret;
+
        /* Align rxbuffers to ARCH_DMA_MINALIGN */
        priv->rxbuffers = memalign(ARCH_DMA_MINALIGN, RX_BUF * PKTSIZE_ALIGN);
        if (!priv->rxbuffers)