aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass2016-05-01 11:36:22 -0600
committerSimon Glass2016-05-17 09:54:43 -0600
commit145df842b443a2f2323a11f6e61223e3767dc55c (patch)
treec8c9fddf279f073e19773de1df958f438617ba19
parent38bd29beaaf51f92d986ef63e5539f0bd0d371d8 (diff)
dm: ide: Add support for driver-model block devices
Add driver-model block-device support to the IDE implementation. Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r--common/ide.c32
-rw-r--r--include/ide.h8
2 files changed, 40 insertions, 0 deletions
diff --git a/common/ide.c b/common/ide.c
index 5dc90d45ec0..ac5b91c01ad 100644
--- a/common/ide.c
+++ b/common/ide.c
@@ -7,6 +7,7 @@
#include <common.h>
#include <ata.h>
+#include <dm.h>
#include <ide.h>
#include <watchdog.h>
#include <asm/io.h>
@@ -873,8 +874,10 @@ void ide_init(void)
ide_dev_desc[i].log2blksz =
LOG2_INVALID(typeof(ide_dev_desc[i].log2blksz));
ide_dev_desc[i].lba = 0;
+#ifndef CONFIG_BLK
ide_dev_desc[i].block_read = ide_read;
ide_dev_desc[i].block_write = ide_write;
+#endif
if (!ide_bus_ok[IDE_BUS(i)])
continue;
ide_led(led, 1); /* LED on */
@@ -975,9 +978,17 @@ __weak void ide_input_data(int dev, ulong *sect_buf, int words)
#endif /* CONFIG_IDE_SWAP_IO */
+#ifdef CONFIG_BLK
+ulong ide_read(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
+ void *buffer)
+#else
ulong ide_read(struct blk_desc *block_dev, lbaint_t blknr, lbaint_t blkcnt,
void *buffer)
+#endif
{
+#ifdef CONFIG_BLK
+ struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
+#endif
int device = block_dev->devnum;
ulong n = 0;
unsigned char c;
@@ -1097,9 +1108,17 @@ IDE_READ_E:
return n;
}
+#ifdef CONFIG_BLK
+ulong ide_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
+ const void *buffer)
+#else
ulong ide_write(struct blk_desc *block_dev, lbaint_t blknr, lbaint_t blkcnt,
const void *buffer)
+#endif
{
+#ifdef CONFIG_BLK
+ struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
+#endif
int device = block_dev->devnum;
ulong n = 0;
unsigned char c;
@@ -1191,9 +1210,22 @@ int ide_device_present(int dev)
}
#endif
+#ifdef CONFIG_BLK
+static const struct blk_ops ide_blk_ops = {
+ .read = ide_read,
+ .write = ide_write,
+};
+
+U_BOOT_DRIVER(ide_blk) = {
+ .name = "ide_blk",
+ .id = UCLASS_BLK,
+ .ops = &ide_blk_ops,
+};
+#else
U_BOOT_LEGACY_BLK(ide) = {
.if_typename = "ide",
.if_type = IF_TYPE_IDE,
.max_devs = CONFIG_SYS_IDE_MAXDEVICE,
.desc = ide_dev_desc,
};
+#endif
diff --git a/include/ide.h b/include/ide.h
index a4e65cf2a94..9b0a4a96fa5 100644
--- a/include/ide.h
+++ b/include/ide.h
@@ -34,10 +34,18 @@ void ide_led(uchar led, uchar status);
void ide_init(void);
struct blk_desc;
+struct udevice;
+#ifdef CONFIG_BLK
+ulong ide_read(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
+ void *buffer);
+ulong ide_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
+ const void *buffer);
+#else
ulong ide_read(struct blk_desc *block_dev, lbaint_t blknr, lbaint_t blkcnt,
void *buffer);
ulong ide_write(struct blk_desc *block_dev, lbaint_t blknr, lbaint_t blkcnt,
const void *buffer);
+#endif
#ifdef CONFIG_IDE_PREINIT
int ide_preinit(void);