]> xenbits.xensource.com Git - people/andrewcoop/seabios.git/commitdiff
sdcard: Power down controller on failure
authorKevin O'Connor <kevin@koconnor.net>
Tue, 11 Aug 2015 15:59:34 +0000 (11:59 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Mon, 17 Aug 2015 16:11:24 +0000 (12:11 -0400)
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
src/hw/sdcard.c

index 7474c320981bb2e0f3f4d653ddee47ae41ef559c..4dd93cb0883418964f3facd0b60dc50e8bdceb72 100644 (file)
@@ -413,22 +413,22 @@ sdcard_controller_setup(void *data)
         return;
     int ret = sdcard_set_frequency(regs, 400);
     if (ret)
-        return;
+        goto fail;
     msleep(SDHCI_CLOCK_ON_TIME);
 
     // Initialize card
     int card_type = sdcard_card_setup(regs, volt);
     if (card_type < 0)
-        return;
+        goto fail;
     ret = sdcard_set_frequency(regs, 25000);
     if (ret)
-        return;
+        goto fail;
 
     // Register drive
     struct sddrive_s *drive = malloc_fseg(sizeof(*drive));
     if (!drive) {
         warn_noalloc();
-        return;
+        goto fail;
     }
     memset(drive, 0, sizeof(*drive));
     drive->drive.type = DTYPE_SDCARD;
@@ -441,6 +441,10 @@ sdcard_controller_setup(void *data)
             , pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf), pci_bdf_to_fn(bdf));
     char *desc = znprintf(MAXDESCSIZE, "SD Card"); // XXX
     boot_add_hd(&drive->drive, desc, bootprio_find_pci_device(pci));
+    return;
+fail:
+    writeb(&regs->power_control, 0);
+    writew(&regs->clock_control, 0);
 }
 
 void