ums: support block devices not MMC devices
[platform/kernel/u-boot.git] / board / samsung / common / ums.c
1 /*
2  * Copyright (C) 2013 Samsung Electronics
3  * Lukasz Majewski <l.majewski@samsung.com>
4  *
5  * SPDX-License-Identifier:     GPL-2.0+
6  */
7
8 #include <common.h>
9 #include <usb_mass_storage.h>
10 #include <mmc.h>
11 #include <part.h>
12
13 static int ums_read_sector(struct ums *ums_dev,
14                            ulong start, lbaint_t blkcnt, void *buf)
15 {
16         block_dev_desc_t *block_dev = ums_dev->block_dev;
17         lbaint_t blkstart = start + ums_dev->start_sector;
18         int dev_num = block_dev->dev;
19
20         return block_dev->block_read(dev_num, blkstart, blkcnt, buf);
21 }
22
23 static int ums_write_sector(struct ums *ums_dev,
24                             ulong start, lbaint_t blkcnt, const void *buf)
25 {
26         block_dev_desc_t *block_dev = ums_dev->block_dev;
27         lbaint_t blkstart = start + ums_dev->start_sector;
28         int dev_num = block_dev->dev;
29
30         return block_dev->block_write(dev_num, blkstart, blkcnt, buf);
31 }
32
33 static struct ums ums_dev = {
34         .read_sector = ums_read_sector,
35         .write_sector = ums_write_sector,
36         .name = "UMS disk",
37 };
38
39 static struct ums *ums_disk_init(struct mmc *mmc)
40 {
41         uint64_t mmc_end_sector = mmc->capacity / SECTOR_SIZE;
42         uint64_t ums_end_sector = UMS_NUM_SECTORS + UMS_START_SECTOR;
43
44         if (!mmc_end_sector) {
45                 error("MMC capacity is not valid");
46                 return NULL;
47         }
48
49         ums_dev.block_dev = &mmc->block_dev;
50
51         if (ums_end_sector <= mmc_end_sector) {
52                 ums_dev.start_sector = UMS_START_SECTOR;
53                 if (UMS_NUM_SECTORS)
54                         ums_dev.num_sectors = UMS_NUM_SECTORS;
55                 else
56                         ums_dev.num_sectors = mmc_end_sector - UMS_START_SECTOR;
57         } else {
58                 ums_dev.num_sectors = mmc_end_sector;
59                 puts("UMS: defined bad disk parameters. Using default.\n");
60         }
61
62         printf("UMS: disk start sector: %#x, count: %#x\n",
63                ums_dev.start_sector, ums_dev.num_sectors);
64
65         return &ums_dev;
66 }
67
68 struct ums *ums_init(unsigned int dev_num)
69 {
70         struct mmc *mmc = find_mmc_device(dev_num);
71
72         if (!mmc || mmc_init(mmc))
73                 return NULL;
74         return ums_disk_init(mmc);
75 }