Merge tag 'efi-2022-01-rc2-2' of https://source.denx.de/u-boot/custodians/u-boot-efi
[platform/kernel/u-boot.git] / drivers / ata / dwc_ahsata.c
index c2e28fe..6d42548 100644 (file)
@@ -6,20 +6,25 @@
 
 #include <common.h>
 #include <ahci.h>
+#include <blk.h>
 #include <cpu_func.h>
 #include <dm.h>
 #include <dwc_ahsata.h>
 #include <fis.h>
 #include <libata.h>
+#include <log.h>
 #include <malloc.h>
 #include <memalign.h>
+#include <part.h>
 #include <sata.h>
+#include <asm/cache.h>
 #include <asm/io.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/mach-imx/sata.h>
 #include <linux/bitops.h>
 #include <linux/ctype.h>
+#include <linux/delay.h>
 #include <linux/errno.h>
 #include "dwc_ahsata_priv.h"
 
@@ -223,7 +228,7 @@ static int ahci_host_init(struct ahci_uc_priv *uc_priv)
 
                /* Wait for COMINIT bit 26 (DIAG_X) in SERR */
                timeout = 1000;
-               while (!(readl(&port_mmio->serr) | SATA_PORT_SERR_DIAG_X)
+               while (!(readl(&port_mmio->serr) & SATA_PORT_SERR_DIAG_X)
                        && --timeout)
                        ;
                if (timeout <= 0) {
@@ -450,7 +455,6 @@ static int ahci_port_start(struct ahci_uc_priv *uc_priv, u8 port)
 
        mem = (u32)malloc(AHCI_PORT_PRIV_DMA_SZ + 1024);
        if (!mem) {
-               free(pp);
                printf("No mem for table!\n");
                return -ENOMEM;
        }
@@ -847,6 +851,9 @@ static int ahci_init_one(int pdev)
        struct ahci_uc_priv *uc_priv = NULL;
 
        uc_priv = malloc(sizeof(struct ahci_uc_priv));
+       if (!uc_priv)
+               return -ENOMEM;
+
        memset(uc_priv, 0, sizeof(struct ahci_uc_priv));
        uc_priv->dev = pdev;
 
@@ -871,6 +878,8 @@ static int ahci_init_one(int pdev)
        return 0;
 
 err_out:
+       if (uc_priv)
+               free(uc_priv);
        return rc;
 }
 
@@ -914,6 +923,9 @@ int reset_sata(int dev)
        while (readl(&host_mmio->ghc) & SATA_HOST_GHC_HR)
                udelay(100);
 
+       free(uc_priv);
+       memset(&sata_dev_desc[dev], 0, sizeof(struct blk_desc));
+
        return 0;
 }
 
@@ -1007,7 +1019,7 @@ int dwc_ahsata_scan(struct udevice *dev)
                }
        }
 
-       desc = dev_get_uclass_platdata(blk);
+       desc = dev_get_uclass_plat(blk);
        ret = dwc_ahsata_scan_common(uc_priv, desc);
        if (ret) {
                debug("%s: Failed to scan bus\n", __func__);
@@ -1042,7 +1054,7 @@ int dwc_ahsata_probe(struct udevice *dev)
 static ulong dwc_ahsata_read(struct udevice *blk, lbaint_t blknr,
                             lbaint_t blkcnt, void *buffer)
 {
-       struct blk_desc *desc = dev_get_uclass_platdata(blk);
+       struct blk_desc *desc = dev_get_uclass_plat(blk);
        struct udevice *dev = dev_get_parent(blk);
        struct ahci_uc_priv *uc_priv;
 
@@ -1053,7 +1065,7 @@ static ulong dwc_ahsata_read(struct udevice *blk, lbaint_t blknr,
 static ulong dwc_ahsata_write(struct udevice *blk, lbaint_t blknr,
                              lbaint_t blkcnt, const void *buffer)
 {
-       struct blk_desc *desc = dev_get_uclass_platdata(blk);
+       struct blk_desc *desc = dev_get_uclass_plat(blk);
        struct udevice *dev = dev_get_parent(blk);
        struct ahci_uc_priv *uc_priv;