]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mmc: mmci: Break out error check in busy detect
authorLinus Walleij <linus.walleij@linaro.org>
Fri, 16 Jun 2023 20:42:22 +0000 (22:42 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 19 Jun 2023 11:14:26 +0000 (13:14 +0200)
The busy detect callback for Ux500 checks for an error
in the status in the first if() clause. The only practical
reason is that if an error occurs, the if()-clause is not
executed, and the code falls through to the last
if()-clause if (host->busy_status) which will clear and
disable the irq. Make this explicit instead: it is easier
to read.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20230405-pl180-busydetect-fix-v7-4-69a7164f2a61@linaro.org
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/mmci.c

index 93981046eb88fd2e63f0416f823675a9616935a5..9f92f39fec14d21f2d52d832a03b7ad259496be8 100644 (file)
@@ -675,6 +675,15 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk)
 {
        void __iomem *base = host->base;
 
+       if (status & err_msk) {
+               /* Stop any ongoing busy detection if an error occurs */
+               writel(host->variant->busy_detect_mask, base + MMCICLEAR);
+               writel(readl(base + MMCIMASK0) &
+                      ~host->variant->busy_detect_mask, base + MMCIMASK0);
+               host->busy_status = 0;
+               return true;
+       }
+
        /*
         * Before unmasking for the busy end IRQ, confirm that the
         * command was sent successfully. To keep track of having a
@@ -688,7 +697,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk)
         * while, to allow it to be set, but tests indicates that it
         * isn't needed.
         */
-       if (!host->busy_status && !(status & err_msk)) {
+       if (!host->busy_status) {
                status = readl(base + MMCISTATUS);
                if (status & host->variant->busy_detect_flag) {
                        writel(readl(base + MMCIMASK0) |