Blame view
drivers/mmc/sandbox_mmc.c
3.2 KB
83d290c56
|
1 |
// SPDX-License-Identifier: GPL-2.0+ |
8e6cc4617
|
2 3 4 |
/* * Copyright (c) 2015 Google, Inc * Written by Simon Glass <sjg@chromium.org> |
8e6cc4617
|
5 6 7 8 9 |
*/ #include <common.h> #include <dm.h> #include <errno.h> |
f376a3cbb
|
10 |
#include <fdtdec.h> |
8e6cc4617
|
11 12 |
#include <mmc.h> #include <asm/test.h> |
f376a3cbb
|
13 14 15 16 17 18 19 20 21 22 23 |
struct sandbox_mmc_plat { struct mmc_config cfg; struct mmc mmc; }; /** * sandbox_mmc_send_cmd() - Emulate SD commands * * This emulate an SD card version 2. Single-block reads result in zero data. * Multiple-block reads return a test string. */ |
9a46bd3fe
|
24 |
static int sandbox_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd, |
f376a3cbb
|
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
struct mmc_data *data) { switch (cmd->cmdidx) { case MMC_CMD_ALL_SEND_CID: break; case SD_CMD_SEND_RELATIVE_ADDR: cmd->response[0] = 0 << 16; /* mmc->rca */ case MMC_CMD_GO_IDLE_STATE: break; case SD_CMD_SEND_IF_COND: cmd->response[0] = 0xaa; break; case MMC_CMD_SEND_STATUS: cmd->response[0] = MMC_STATUS_RDY_FOR_DATA; break; case MMC_CMD_SELECT_CARD: break; case MMC_CMD_SEND_CSD: cmd->response[0] = 0; cmd->response[1] = 10 << 16; /* 1 << block_len */ break; case SD_CMD_SWITCH_FUNC: { |
49f89252e
|
47 48 |
if (!data) break; |
f376a3cbb
|
49 |
u32 *resp = (u32 *)data->dest; |
f376a3cbb
|
50 |
resp[7] = cpu_to_be32(SD_HIGHSPEED_BUSY); |
49f89252e
|
51 52 |
if ((cmd->cmdarg & 0xF) == UHS_SDR12_BUS_SPEED) resp[4] = (cmd->cmdarg & 0xF) << 24; |
f376a3cbb
|
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
break; } case MMC_CMD_READ_SINGLE_BLOCK: memset(data->dest, '\0', data->blocksize); break; case MMC_CMD_READ_MULTIPLE_BLOCK: strcpy(data->dest, "this is a test"); break; case MMC_CMD_STOP_TRANSMISSION: break; case SD_CMD_APP_SEND_OP_COND: cmd->response[0] = OCR_BUSY | OCR_HCS; cmd->response[1] = 0; cmd->response[2] = 0; break; case MMC_CMD_APP_CMD: break; case MMC_CMD_SET_BLOCKLEN: debug("block len %d ", cmd->cmdarg); break; case SD_CMD_APP_SEND_SCR: { u32 *scr = (u32 *)data->dest; scr[0] = cpu_to_be32(2 << 24 | 1 << 15); /* SD version 3 */ break; } default: debug("%s: Unknown command %d ", __func__, cmd->cmdidx); break; } return 0; } |
9a46bd3fe
|
88 |
static int sandbox_mmc_set_ios(struct udevice *dev) |
f376a3cbb
|
89 90 91 |
{ return 0; } |
9a46bd3fe
|
92 |
static int sandbox_mmc_get_cd(struct udevice *dev) |
f376a3cbb
|
93 94 95 |
{ return 1; } |
9a46bd3fe
|
96 |
static const struct dm_mmc_ops sandbox_mmc_ops = { |
f376a3cbb
|
97 98 |
.send_cmd = sandbox_mmc_send_cmd, .set_ios = sandbox_mmc_set_ios, |
9a46bd3fe
|
99 |
.get_cd = sandbox_mmc_get_cd, |
f376a3cbb
|
100 101 102 103 104 105 106 107 108 109 110 111 112 |
}; int sandbox_mmc_probe(struct udevice *dev) { struct sandbox_mmc_plat *plat = dev_get_platdata(dev); return mmc_init(&plat->mmc); } int sandbox_mmc_bind(struct udevice *dev) { struct sandbox_mmc_plat *plat = dev_get_platdata(dev); struct mmc_config *cfg = &plat->cfg; |
f376a3cbb
|
113 114 |
cfg->name = dev->name; |
f376a3cbb
|
115 116 117 118 119 |
cfg->host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS | MMC_MODE_8BIT; cfg->voltages = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34; cfg->f_min = 1000000; cfg->f_max = 52000000; cfg->b_max = U32_MAX; |
24f5aec36
|
120 |
return mmc_bind(dev, &plat->mmc, cfg); |
f376a3cbb
|
121 122 123 124 125 126 127 128 |
} int sandbox_mmc_unbind(struct udevice *dev) { mmc_unbind(dev); return 0; } |
8e6cc4617
|
129 130 131 132 |
static const struct udevice_id sandbox_mmc_ids[] = { { .compatible = "sandbox,mmc" }, { } }; |
f376a3cbb
|
133 |
U_BOOT_DRIVER(mmc_sandbox) = { |
8e6cc4617
|
134 135 136 |
.name = "mmc_sandbox", .id = UCLASS_MMC, .of_match = sandbox_mmc_ids, |
9a46bd3fe
|
137 |
.ops = &sandbox_mmc_ops, |
f376a3cbb
|
138 139 140 141 |
.bind = sandbox_mmc_bind, .unbind = sandbox_mmc_unbind, .probe = sandbox_mmc_probe, .platdata_auto_alloc_size = sizeof(struct sandbox_mmc_plat), |
8e6cc4617
|
142 |
}; |