|
|
|
@ -27,6 +27,7 @@ |
|
|
|
|
|
|
|
|
|
#include <common.h> |
|
|
|
|
#include <command.h> |
|
|
|
|
#include <dm.h> |
|
|
|
|
#include <part.h> |
|
|
|
|
#include <asm/io.h> |
|
|
|
|
|
|
|
|
@ -68,7 +69,9 @@ static u16 ace_readw(unsigned off) |
|
|
|
|
return in16(base + off); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifndef CONFIG_BLK |
|
|
|
|
static struct blk_desc systemace_dev = { 0 }; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
static int get_cf_lock(void) |
|
|
|
|
{ |
|
|
|
@ -104,9 +107,14 @@ static void release_cf_lock(void) |
|
|
|
|
* the dev_desc) to read blocks of data. The return value is the |
|
|
|
|
* number of blocks read. A zero return indicates an error. |
|
|
|
|
*/ |
|
|
|
|
#ifdef CONFIG_BLK |
|
|
|
|
static unsigned long systemace_read(struct udevice *dev, unsigned long start, |
|
|
|
|
lbaint_t blkcnt, void *buffer) |
|
|
|
|
#else |
|
|
|
|
static unsigned long systemace_read(struct blk_desc *block_dev, |
|
|
|
|
unsigned long start, lbaint_t blkcnt, |
|
|
|
|
void *buffer) |
|
|
|
|
#endif |
|
|
|
|
{ |
|
|
|
|
int retry; |
|
|
|
|
unsigned blk_countdown; |
|
|
|
@ -225,6 +233,41 @@ static unsigned long systemace_read(struct blk_desc *block_dev, |
|
|
|
|
return blkcnt; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_BLK |
|
|
|
|
static int systemace_bind(struct udevice *dev) |
|
|
|
|
{ |
|
|
|
|
struct blk_desc *bdesc; |
|
|
|
|
struct udevice *bdev; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
ret = blk_create_devicef(dev, "systemace_blk", "blk", IF_TYPE_SYSTEMACE, |
|
|
|
|
-1, 512, 0, &bdev); |
|
|
|
|
if (ret) { |
|
|
|
|
debug("Cannot create block device\n"); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
bdesc = dev_get_uclass_platdata(bdev); |
|
|
|
|
bdesc->removable = 1; |
|
|
|
|
bdesc->part_type = PART_TYPE_UNKNOWN; |
|
|
|
|
bdesc->log2blksz = LOG2(bdesc->blksz); |
|
|
|
|
|
|
|
|
|
/* Ensure the correct bus mode (8/16 bits) gets enabled */ |
|
|
|
|
ace_writew(width == 8 ? 0 : 0x0001, 0); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static const struct blk_ops systemace_blk_ops = { |
|
|
|
|
.read = systemace_read, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
U_BOOT_DRIVER(systemace_blk) = { |
|
|
|
|
.name = "systemace_blk", |
|
|
|
|
.id = UCLASS_BLK, |
|
|
|
|
.ops = &systemace_blk_ops, |
|
|
|
|
.bind = systemace_bind, |
|
|
|
|
}; |
|
|
|
|
#else |
|
|
|
|
static int systemace_get_dev(int dev, struct blk_desc **descp) |
|
|
|
|
{ |
|
|
|
|
/* The first time through this, the systemace_dev object is
|
|
|
|
@ -257,3 +300,4 @@ U_BOOT_LEGACY_BLK(systemace) = { |
|
|
|
|
.max_devs = 1, |
|
|
|
|
.get_dev = systemace_get_dev, |
|
|
|
|
}; |
|
|
|
|
#endif |
|
|
|
|