block: ide: Fix block read/write with driver model
authorBin Meng <bmeng.cn@gmail.com>
Sun, 10 Sep 2017 12:12:51 +0000 (05:12 -0700)
committerTom Rini <trini@konsulko.com>
Sun, 10 Sep 2017 16:27:37 +0000 (12:27 -0400)
This converts the IDE driver to driver model so that block read and
write are fully functional.

Fixes: b7c6baef ("x86: Convert MMC to driver model")
Reported-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Tested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
drivers/block/blk-uclass.c
drivers/block/ide.c
include/dm/uclass-id.h

index 3aec569d124be830afa3100f1eff6e8bb2d0e280..3c5a87b60a8f385cee652254ddb983f177aa9db4 100644 (file)
@@ -26,7 +26,7 @@ static const char *if_typename_str[IF_TYPE_COUNT] = {
 };
 
 static enum uclass_id if_type_uclass_id[IF_TYPE_COUNT] = {
-       [IF_TYPE_IDE]           = UCLASS_INVALID,
+       [IF_TYPE_IDE]           = UCLASS_IDE,
        [IF_TYPE_SCSI]          = UCLASS_SCSI,
        [IF_TYPE_ATAPI]         = UCLASS_INVALID,
        [IF_TYPE_USB]           = UCLASS_MASS_STORAGE,
index ce51153099bdbc574d522c845e30f076da48f3b6..ed3b27e6e7590a4869edd948f7bd99dedb15229c 100644 (file)
@@ -827,12 +827,20 @@ void ide_init(void)
                ide_ident(&ide_dev_desc[i]);
                dev_print(&ide_dev_desc[i]);
 
+#ifndef CONFIG_BLK
                if ((ide_dev_desc[i].lba > 0) && (ide_dev_desc[i].blksz > 0)) {
                        /* initialize partition type */
                        part_init(&ide_dev_desc[i]);
                }
+#endif
        }
        WATCHDOG_RESET();
+
+#ifdef CONFIG_BLK
+       struct udevice *dev;
+
+       uclass_first_device(UCLASS_IDE, &dev);
+#endif
 }
 
 /* We only need to swap data if we are running on a big endian cpu. */
@@ -1147,6 +1155,26 @@ int ide_device_present(int dev)
 #endif
 
 #ifdef CONFIG_BLK
+static int ide_blk_probe(struct udevice *udev)
+{
+       struct blk_desc *desc = dev_get_uclass_platdata(udev);
+
+       /* fill in device vendor/product/rev strings */
+       strncpy(desc->vendor, ide_dev_desc[desc->devnum].vendor,
+               BLK_VEN_SIZE);
+       desc->vendor[BLK_VEN_SIZE] = '\0';
+       strncpy(desc->product, ide_dev_desc[desc->devnum].product,
+               BLK_PRD_SIZE);
+       desc->product[BLK_PRD_SIZE] = '\0';
+       strncpy(desc->revision, ide_dev_desc[desc->devnum].revision,
+               BLK_REV_SIZE);
+       desc->revision[BLK_REV_SIZE] = '\0';
+
+       part_init(desc);
+
+       return 0;
+}
+
 static const struct blk_ops ide_blk_ops = {
        .read   = ide_read,
        .write  = ide_write,
@@ -1156,6 +1184,51 @@ U_BOOT_DRIVER(ide_blk) = {
        .name           = "ide_blk",
        .id             = UCLASS_BLK,
        .ops            = &ide_blk_ops,
+       .probe          = ide_blk_probe,
+};
+
+static int ide_probe(struct udevice *udev)
+{
+       struct udevice *blk_dev;
+       char name[20];
+       int blksz;
+       lbaint_t size;
+       int i;
+       int ret;
+
+       for (i = 0; i < CONFIG_SYS_IDE_MAXDEVICE; i++) {
+               if (ide_dev_desc[i].type != DEV_TYPE_UNKNOWN) {
+                       sprintf(name, "blk#%d", i);
+
+                       blksz = ide_dev_desc[i].blksz;
+                       size = blksz * ide_dev_desc[i].lba;
+                       ret = blk_create_devicef(udev, "ide_blk", name,
+                                                IF_TYPE_IDE, i,
+                                                blksz, size, &blk_dev);
+                       if (ret)
+                               return ret;
+               }
+       }
+
+       return 0;
+}
+
+U_BOOT_DRIVER(ide) = {
+       .name           = "ide",
+       .id             = UCLASS_IDE,
+       .probe          = ide_probe,
+};
+
+struct pci_device_id ide_supported[] = {
+       { PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_IDE << 8, 0xffff00) },
+       { }
+};
+
+U_BOOT_PCI_DEVICE(ide, ide_supported);
+
+UCLASS_DRIVER(ide) = {
+       .name           = "ide",
+       .id             = UCLASS_IDE,
 };
 #else
 U_BOOT_LEGACY_BLK(ide) = {
index 1a501992db26b9ed555b712f0b53060d47ed7500..3fc20834aedd1973800501bbe62e4681eb79dc60 100644 (file)
@@ -41,6 +41,7 @@ enum uclass_id {
        UCLASS_I2C_EEPROM,      /* I2C EEPROM device */
        UCLASS_I2C_GENERIC,     /* Generic I2C device */
        UCLASS_I2C_MUX,         /* I2C multiplexer */
+       UCLASS_IDE,             /* IDE device */
        UCLASS_IRQ,             /* Interrupt controller */
        UCLASS_KEYBOARD,        /* Keyboard input device */
        UCLASS_LED,             /* Light-emitting diode (LED) */