diff --git a/cmd/ide.c b/cmd/ide.c index 6739f0b12d..ddc87d3a0b 100644 --- a/cmd/ide.c +++ b/cmd/ide.c @@ -10,12 +10,15 @@ #include #include +#include #include #include #include #include #include #include +#include +#include #include #include @@ -31,8 +34,25 @@ int do_ide(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { if (argc == 2) { if (strncmp(argv[1], "res", 3) == 0) { + struct udevice *dev; + int ret; + puts("\nReset IDE: "); - ide_init(); + ret = uclass_find_first_device(UCLASS_IDE, &dev); + ret = device_remove(dev, DM_REMOVE_NORMAL); + if (!ret) + ret = device_chld_unbind(dev, NULL); + if (ret) { + printf("Cannot remove IDE (err=%dE)\n", ret); + return CMD_RET_FAILURE; + } + + ret = uclass_first_device_err(UCLASS_IDE, &dev); + if (ret) { + printf("Init failed (err=%dE)\n", ret); + return CMD_RET_FAILURE; + } + return 0; } } diff --git a/drivers/block/ide.c b/drivers/block/ide.c index 6f601bcf86..13770484b3 100644 --- a/drivers/block/ide.c +++ b/drivers/block/ide.c @@ -58,8 +58,6 @@ static void ide_reset(void) for (i = 0; i < CONFIG_SYS_IDE_MAXBUS; ++i) ide_bus_ok[i] = 0; - for (i = 0; i < CONFIG_SYS_IDE_MAXDEVICE; ++i) - ide_dev_desc[i].type = DEV_TYPE_UNKNOWN; ide_set_reset(1); /* assert reset */ @@ -689,9 +687,8 @@ __weak unsigned char ide_inb(int dev, int port) return val; } -void ide_init(void) +static void ide_init(void) { - struct udevice *dev; unsigned char c; int i, bus; @@ -764,8 +761,6 @@ void ide_init(void) dev_print(&ide_dev_desc[i]); } schedule(); - - uclass_first_device(UCLASS_IDE, &dev); } __weak void ide_input_swap_data(int dev, ulong *sect_buf, int words) @@ -1067,7 +1062,9 @@ static int ide_bootdev_bind(struct udevice *dev) static int ide_bootdev_hunt(struct bootdev_hunter *info, bool show) { - ide_init(); + struct udevice *dev; + + uclass_first_device(UCLASS_IDE, &dev); return 0; } @@ -1104,6 +1101,8 @@ static int ide_probe(struct udevice *udev) int i; int ret; + ide_init(); + for (i = 0; i < CONFIG_SYS_IDE_MAXDEVICE; i++) { if (ide_dev_desc[i].type != DEV_TYPE_UNKNOWN) { sprintf(name, "blk#%d", i); diff --git a/include/ide.h b/include/ide.h index 457f275c61..3f36b4340d 100644 --- a/include/ide.h +++ b/include/ide.h @@ -15,7 +15,6 @@ * Function Prototypes */ -void ide_init(void); struct blk_desc; struct udevice; ulong ide_read(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, diff --git a/test/boot/bootdev.c b/test/boot/bootdev.c index 0899c78c2c..8cf3f30e0f 100644 --- a/test/boot/bootdev.c +++ b/test/boot/bootdev.c @@ -376,7 +376,6 @@ static int bootdev_test_cmd_hunt(struct unit_test_state *uts) ut_assert_nextline("Hunting with: simple_bus"); ut_assert_nextline("Found 2 extension board(s)."); ut_assert_nextline("Hunting with: ide"); - ut_assert_nextline("Bus 0: not available "); /* mmc hunter has already been used so should not run again */ @@ -487,7 +486,6 @@ static int bootdev_test_hunt_prio(struct unit_test_state *uts) /* now try a different priority, verbosely */ ut_assertok(bootdev_hunt_prio(BOOTDEVP_5_SCAN_SLOW, true)); ut_assert_nextline("Hunting with: ide"); - ut_assert_nextline("Bus 0: not available "); ut_assert_nextline("Hunting with: usb"); ut_assert_nextline( "Bus usb@1: scanning bus usb@1 for devices... 5 USB Device(s) found");