ums: move IO support code to common location
[oweals/u-boot.git] / common / cmd_usb_mass_storage.c
index 31b7eb0b57ef5dd7ac9217bc441d25804dcaac75..9888ed4f17563face2a0233d343a236b834f809d 100644 (file)
@@ -9,9 +9,55 @@
 #include <common.h>
 #include <command.h>
 #include <g_dnl.h>
+#include <mmc.h>
+#include <part.h>
 #include <usb.h>
 #include <usb_mass_storage.h>
 
+static int ums_read_sector(struct ums *ums_dev,
+                          ulong start, lbaint_t blkcnt, void *buf)
+{
+       block_dev_desc_t *block_dev = ums_dev->block_dev;
+       lbaint_t blkstart = start + ums_dev->start_sector;
+       int dev_num = block_dev->dev;
+
+       return block_dev->block_read(dev_num, blkstart, blkcnt, buf);
+}
+
+static int ums_write_sector(struct ums *ums_dev,
+                           ulong start, lbaint_t blkcnt, const void *buf)
+{
+       block_dev_desc_t *block_dev = ums_dev->block_dev;
+       lbaint_t blkstart = start + ums_dev->start_sector;
+       int dev_num = block_dev->dev;
+
+       return block_dev->block_write(dev_num, blkstart, blkcnt, buf);
+}
+
+static struct ums ums_dev = {
+       .read_sector = ums_read_sector,
+       .write_sector = ums_write_sector,
+       .name = "UMS disk",
+};
+
+struct ums *ums_init(unsigned int dev_num)
+{
+       struct mmc *mmc = NULL;
+
+       mmc = find_mmc_device(dev_num);
+       if (!mmc || mmc_init(mmc))
+               return NULL;
+
+       ums_dev.block_dev = &mmc->block_dev;
+       ums_dev.start_sector = 0;
+       ums_dev.num_sectors = mmc->capacity / SECTOR_SIZE;
+
+       printf("UMS: disk start sector: %#x, count: %#x\n",
+              ums_dev.start_sector, ums_dev.num_sectors);
+
+       return &ums_dev;
+}
+
 int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,
                               int argc, char * const argv[])
 {