]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
ide: Move ide_init() into probing
authorSimon Glass <sjg@chromium.org>
Tue, 25 Apr 2023 16:54:30 +0000 (10:54 -0600)
committerTom Rini <trini@konsulko.com>
Thu, 27 Apr 2023 17:51:06 +0000 (13:51 -0400)
At present the code does ide_init() as a separate operation, then calls
device_probe() to copy over the information. We can call ide_init() from
probe just as easily.

The only difference is that using 'ide init' twice will do nothing.
However it already fails to copy over the new data in that case, so the
effect is the same. For now, unbind the block devices and remove the IDE
device, which causes the bus to be probed again. Later patches will fix
this up fully, so that all blk_desc data is copied across.

Since ide_reset() is only called from ide_init(), there is no need to init
the ide_dev_desc[] array. This is already done at the end of ide_init() so
drop this code.

The call to uclass_first_device() is now within the probe() function of
the same device, so does nothing. Drop it.

Signed-off-by: Simon Glass <sjg@chromium.org>
cmd/ide.c
drivers/block/ide.c
include/ide.h
test/boot/bootdev.c

index 6739f0b12d1a5f335253277511280242adf0bd2b..ddc87d3a0bb95d0f36789267d5ac0c709c963ce6 100644 (file)
--- a/cmd/ide.c
+++ b/cmd/ide.c
 
 #include <common.h>
 #include <blk.h>
+#include <dm.h>
 #include <config.h>
 #include <watchdog.h>
 #include <command.h>
 #include <image.h>
 #include <asm/byteorder.h>
 #include <asm/io.h>
+#include <dm/device-internal.h>
+#include <dm/uclass-internal.h>
 
 #include <ide.h>
 #include <ata.h>
@@ -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;
                }
        }
index 6f601bcf864664d6a47c9134ae2c75e9f111230d..13770484b36aed04117f3c04e5c37ea9d9e47e51 100644 (file)
@@ -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);
index 457f275c61b442c0502e2abcf5129ea33b777b61..3f36b4340d061b9cf8b56734befe361e51c21a83 100644 (file)
@@ -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,
index 0899c78c2c4a0bd4f894c6214bb0de678ba8091a..8cf3f30e0f75ca44754ad2ad7098c69dbcd82707 100644 (file)
@@ -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");