aboutsummaryrefslogtreecommitdiff
path: root/drivers/ata/sata.c
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2024-10-07 09:06:49 -0600
committerTom Rini <trini@konsulko.com>2024-10-07 09:06:49 -0600
commitc530f6079c70219e01022142b404bf8a6b572366 (patch)
tree7696586afaf4c0ae8a94ef811abd7d4a2276eb64 /drivers/ata/sata.c
parentf919c3a889f0ec7d63a48b5d0ed064386b0980bd (diff)
parent28dc47038edc4e93f32d75a357131bcf01a18d85 (diff)
downloadu-boot-master.zip
u-boot-master.tar.gz
u-boot-master.tar.bz2
Merge branch 'next'HEADmaster
Diffstat (limited to 'drivers/ata/sata.c')
-rw-r--r--drivers/ata/sata.c48
1 files changed, 26 insertions, 22 deletions
diff --git a/drivers/ata/sata.c b/drivers/ata/sata.c
index 84437d3..89cd516 100644
--- a/drivers/ata/sata.c
+++ b/drivers/ata/sata.c
@@ -9,9 +9,12 @@
* Dave Liu <daveliu@freescale.com>
*/
+#define LOG_CATEGORY UCLASS_AHCI
+
#include <ahci.h>
#include <blk.h>
#include <dm.h>
+#include <log.h>
#include <part.h>
#include <sata.h>
#include <dm/device-internal.h>
@@ -49,38 +52,39 @@ int sata_scan(struct udevice *dev)
int sata_rescan(bool verbose)
{
+ struct uclass *uc;
+ struct udevice *dev; /* SATA controller */
int ret;
- struct udevice *dev;
if (verbose)
- printf("Removing devices on SATA bus...\n");
-
- blk_unbind_all(UCLASS_AHCI);
-
- ret = uclass_find_first_device(UCLASS_AHCI, &dev);
- if (ret || !dev) {
- printf("Cannot find SATA device (err=%d)\n", ret);
- return -ENOENT;
- }
-
- ret = device_remove(dev, DM_REMOVE_NORMAL);
- if (ret) {
- printf("Cannot remove SATA device '%s' (err=%d)\n", dev->name, ret);
- return -ENOSYS;
+ printf("scanning bus for devices...\n");
+
+ ret = uclass_get(UCLASS_AHCI, &uc);
+ if (ret)
+ return ret;
+
+ /* Remove all children of SATA devices (blk and bootdev) */
+ uclass_foreach_dev(dev, uc) {
+ log_debug("unbind %s\n", dev->name);
+ ret = device_chld_remove(dev, NULL, DM_REMOVE_NORMAL);
+ if (!ret)
+ ret = device_chld_unbind(dev, NULL);
+ if (ret && verbose) {
+ log_err("Unbinding from %s failed (%dE)\n",
+ dev->name, ret);
+ }
}
if (verbose)
printf("Rescanning SATA bus for devices...\n");
- ret = uclass_probe_all(UCLASS_AHCI);
-
- if (ret == -ENODEV) {
- if (verbose)
- printf("No SATA block device found\n");
- return 0;
+ uclass_foreach_dev_probe(UCLASS_AHCI, dev) {
+ ret = sata_scan(dev);
+ if (ret && verbose)
+ log_err("Scanning %s failed (%dE)\n", dev->name, ret);
}
- return ret;
+ return 0;
}
static unsigned long sata_bread(struct udevice *dev, lbaint_t start,