Blame view

drivers/mmc/sandbox_mmc.c 3.2 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
8e6cc4617   Simon Glass   dm: test: Add a t...
2
3
4
  /*
   * Copyright (c) 2015 Google, Inc
   * Written by Simon Glass <sjg@chromium.org>
8e6cc4617   Simon Glass   dm: test: Add a t...
5
6
7
8
9
   */
  
  #include <common.h>
  #include <dm.h>
  #include <errno.h>
f376a3cbb   Simon Glass   dm: mmc: sandbox:...
10
  #include <fdtdec.h>
8e6cc4617   Simon Glass   dm: test: Add a t...
11
12
  #include <mmc.h>
  #include <asm/test.h>
f376a3cbb   Simon Glass   dm: mmc: sandbox:...
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   Simon Glass   dm: sandbox: Conv...
24
  static int sandbox_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
f376a3cbb   Simon Glass   dm: mmc: sandbox:...
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   Jean-Jacques Hiblot   dm: mmc: sandbox:...
47
48
  		if (!data)
  			break;
f376a3cbb   Simon Glass   dm: mmc: sandbox:...
49
  		u32 *resp = (u32 *)data->dest;
f376a3cbb   Simon Glass   dm: mmc: sandbox:...
50
  		resp[7] = cpu_to_be32(SD_HIGHSPEED_BUSY);
49f89252e   Jean-Jacques Hiblot   dm: mmc: sandbox:...
51
52
  		if ((cmd->cmdarg & 0xF) == UHS_SDR12_BUS_SPEED)
  			resp[4] = (cmd->cmdarg & 0xF) << 24;
f376a3cbb   Simon Glass   dm: mmc: sandbox:...
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   Simon Glass   dm: sandbox: Conv...
88
  static int sandbox_mmc_set_ios(struct udevice *dev)
f376a3cbb   Simon Glass   dm: mmc: sandbox:...
89
90
91
  {
  	return 0;
  }
9a46bd3fe   Simon Glass   dm: sandbox: Conv...
92
  static int sandbox_mmc_get_cd(struct udevice *dev)
f376a3cbb   Simon Glass   dm: mmc: sandbox:...
93
94
95
  {
  	return 1;
  }
9a46bd3fe   Simon Glass   dm: sandbox: Conv...
96
  static const struct dm_mmc_ops sandbox_mmc_ops = {
f376a3cbb   Simon Glass   dm: mmc: sandbox:...
97
98
  	.send_cmd = sandbox_mmc_send_cmd,
  	.set_ios = sandbox_mmc_set_ios,
9a46bd3fe   Simon Glass   dm: sandbox: Conv...
99
  	.get_cd = sandbox_mmc_get_cd,
f376a3cbb   Simon Glass   dm: mmc: sandbox:...
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   Simon Glass   dm: mmc: sandbox:...
113
114
  
  	cfg->name = dev->name;
f376a3cbb   Simon Glass   dm: mmc: sandbox:...
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   Masahiro Yamada   mmc: squash lines...
120
  	return mmc_bind(dev, &plat->mmc, cfg);
f376a3cbb   Simon Glass   dm: mmc: sandbox:...
121
122
123
124
125
126
127
128
  }
  
  int sandbox_mmc_unbind(struct udevice *dev)
  {
  	mmc_unbind(dev);
  
  	return 0;
  }
8e6cc4617   Simon Glass   dm: test: Add a t...
129
130
131
132
  static const struct udevice_id sandbox_mmc_ids[] = {
  	{ .compatible = "sandbox,mmc" },
  	{ }
  };
f376a3cbb   Simon Glass   dm: mmc: sandbox:...
133
  U_BOOT_DRIVER(mmc_sandbox) = {
8e6cc4617   Simon Glass   dm: test: Add a t...
134
135
136
  	.name		= "mmc_sandbox",
  	.id		= UCLASS_MMC,
  	.of_match	= sandbox_mmc_ids,
9a46bd3fe   Simon Glass   dm: sandbox: Conv...
137
  	.ops		= &sandbox_mmc_ops,
f376a3cbb   Simon Glass   dm: mmc: sandbox:...
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   Simon Glass   dm: test: Add a t...
142
  };