mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-25 06:00:43 +00:00
block: ide: Fix block read/write with driver model
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>
This commit is contained in:
parent
eb81b1a4d3
commit
68e6f221ed
3 changed files with 75 additions and 1 deletions
|
@ -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,
|
||||
|
|
|
@ -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) = {
|
||||
|
|
|
@ -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) */
|
||||
|
|
Loading…
Reference in a new issue