Blame view

include/mmc.h 18 KB
71f951180   wdenk   * Fix CONFIG_NET_...
1
  /*
4a6ee172c   Jerry Huang   fsl_esdhc: Use mm...
2
   * Copyright 2008,2010 Freescale Semiconductor, Inc
272cc70b2   Andy Fleming   Add MMC Framework
3
4
5
   * Andy Fleming
   *
   * Based (loosely) on the Linux code
71f951180   wdenk   * Fix CONFIG_NET_...
6
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
7
   * SPDX-License-Identifier:	GPL-2.0+
71f951180   wdenk   * Fix CONFIG_NET_...
8
9
10
11
   */
  
  #ifndef _MMC_H_
  #define _MMC_H_
71f951180   wdenk   * Fix CONFIG_NET_...
12

272cc70b2   Andy Fleming   Add MMC Framework
13
  #include <linux/list.h>
3697e5992   Peng Fan   mmc: sd: extracti...
14
  #include <linux/sizes.h>
0d986e61e   Lad, Prabhakar   da850/omap-l138: ...
15
  #include <linux/compiler.h>
07a2d42cd   Mateusz Zalega   mmc: mmc header fix
16
  #include <part.h>
272cc70b2   Andy Fleming   Add MMC Framework
17

4b7cee533   Pantelis Antoniou   mmc: Implement SD...
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  /* SD/MMC version bits; 8 flags, 8 major, 8 minor, 8 change */
  #define SD_VERSION_SD	(1U << 31)
  #define MMC_VERSION_MMC	(1U << 30)
  
  #define MAKE_SDMMC_VERSION(a, b, c)	\
  	((((u32)(a)) << 16) | ((u32)(b) << 8) | (u32)(c))
  #define MAKE_SD_VERSION(a, b, c)	\
  	(SD_VERSION_SD | MAKE_SDMMC_VERSION(a, b, c))
  #define MAKE_MMC_VERSION(a, b, c)	\
  	(MMC_VERSION_MMC | MAKE_SDMMC_VERSION(a, b, c))
  
  #define EXTRACT_SDMMC_MAJOR_VERSION(x)	\
  	(((u32)(x) >> 16) & 0xff)
  #define EXTRACT_SDMMC_MINOR_VERSION(x)	\
  	(((u32)(x) >> 8) & 0xff)
  #define EXTRACT_SDMMC_CHANGE_VERSION(x)	\
  	((u32)(x) & 0xff)
  
  #define SD_VERSION_3		MAKE_SD_VERSION(3, 0, 0)
  #define SD_VERSION_2		MAKE_SD_VERSION(2, 0, 0)
  #define SD_VERSION_1_0		MAKE_SD_VERSION(1, 0, 0)
  #define SD_VERSION_1_10		MAKE_SD_VERSION(1, 10, 0)
  
  #define MMC_VERSION_UNKNOWN	MAKE_MMC_VERSION(0, 0, 0)
  #define MMC_VERSION_1_2		MAKE_MMC_VERSION(1, 2, 0)
  #define MMC_VERSION_1_4		MAKE_MMC_VERSION(1, 4, 0)
  #define MMC_VERSION_2_2		MAKE_MMC_VERSION(2, 2, 0)
  #define MMC_VERSION_3		MAKE_MMC_VERSION(3, 0, 0)
  #define MMC_VERSION_4		MAKE_MMC_VERSION(4, 0, 0)
  #define MMC_VERSION_4_1		MAKE_MMC_VERSION(4, 1, 0)
  #define MMC_VERSION_4_2		MAKE_MMC_VERSION(4, 2, 0)
  #define MMC_VERSION_4_3		MAKE_MMC_VERSION(4, 3, 0)
  #define MMC_VERSION_4_41	MAKE_MMC_VERSION(4, 4, 1)
  #define MMC_VERSION_4_5		MAKE_MMC_VERSION(4, 5, 0)
  #define MMC_VERSION_5_0		MAKE_MMC_VERSION(5, 0, 0)
1a3619cf8   Stefan Wahren   mmc: add MMC_VERS...
53
  #define MMC_VERSION_5_1		MAKE_MMC_VERSION(5, 1, 0)
272cc70b2   Andy Fleming   Add MMC Framework
54

8caf46d18   Jaehoon Chung   mmc: remove the u...
55
56
57
58
59
  #define MMC_MODE_HS		(1 << 0)
  #define MMC_MODE_HS_52MHz	(1 << 1)
  #define MMC_MODE_4BIT		(1 << 2)
  #define MMC_MODE_8BIT		(1 << 3)
  #define MMC_MODE_SPI		(1 << 4)
5a20397b0   Rob Herring   mmc: remove the M...
60
  #define MMC_MODE_DDR_52MHz	(1 << 5)
627220364   Ɓukasz Majewski   mmc:fix: Set mmc ...
61

272cc70b2   Andy Fleming   Add MMC Framework
62
  #define SD_DATA_4BIT	0x00040000
4b7cee533   Pantelis Antoniou   mmc: Implement SD...
63
  #define IS_SD(x)	((x)->version & SD_VERSION_SD)
3f2da751b   Andrew Gabbasov   mmc: Fix typo in ...
64
  #define IS_MMC(x)	((x)->version & MMC_VERSION_MMC)
272cc70b2   Andy Fleming   Add MMC Framework
65
66
67
  
  #define MMC_DATA_READ		1
  #define MMC_DATA_WRITE		2
341188b9c   Haavard Skinnemoen   MMC: Consolidate ...
68
69
70
71
72
  #define MMC_CMD_GO_IDLE_STATE		0
  #define MMC_CMD_SEND_OP_COND		1
  #define MMC_CMD_ALL_SEND_CID		2
  #define MMC_CMD_SET_RELATIVE_ADDR	3
  #define MMC_CMD_SET_DSR			4
272cc70b2   Andy Fleming   Add MMC Framework
73
  #define MMC_CMD_SWITCH			6
341188b9c   Haavard Skinnemoen   MMC: Consolidate ...
74
  #define MMC_CMD_SELECT_CARD		7
272cc70b2   Andy Fleming   Add MMC Framework
75
  #define MMC_CMD_SEND_EXT_CSD		8
341188b9c   Haavard Skinnemoen   MMC: Consolidate ...
76
77
  #define MMC_CMD_SEND_CSD		9
  #define MMC_CMD_SEND_CID		10
272cc70b2   Andy Fleming   Add MMC Framework
78
  #define MMC_CMD_STOP_TRANSMISSION	12
341188b9c   Haavard Skinnemoen   MMC: Consolidate ...
79
80
81
82
  #define MMC_CMD_SEND_STATUS		13
  #define MMC_CMD_SET_BLOCKLEN		16
  #define MMC_CMD_READ_SINGLE_BLOCK	17
  #define MMC_CMD_READ_MULTIPLE_BLOCK	18
91fdabc67   Pierre Aubert   eMMC: add support...
83
  #define MMC_CMD_SET_BLOCK_COUNT         23
272cc70b2   Andy Fleming   Add MMC Framework
84
85
  #define MMC_CMD_WRITE_SINGLE_BLOCK	24
  #define MMC_CMD_WRITE_MULTIPLE_BLOCK	25
e6f99a561   Lei Wen   MMC: add erase fu...
86
87
88
  #define MMC_CMD_ERASE_GROUP_START	35
  #define MMC_CMD_ERASE_GROUP_END		36
  #define MMC_CMD_ERASE			38
341188b9c   Haavard Skinnemoen   MMC: Consolidate ...
89
  #define MMC_CMD_APP_CMD			55
d52ebf102   Thomas Chou   mmc: add generic ...
90
91
  #define MMC_CMD_SPI_READ_OCR		58
  #define MMC_CMD_SPI_CRC_ON_OFF		59
3690d6d66   Amar   MMC: APIs to supp...
92
93
94
95
  #define MMC_CMD_RES_MAN			62
  
  #define MMC_CMD62_ARG1			0xefac62ec
  #define MMC_CMD62_ARG2			0xcbaea7
341188b9c   Haavard Skinnemoen   MMC: Consolidate ...
96

341188b9c   Haavard Skinnemoen   MMC: Consolidate ...
97
  #define SD_CMD_SEND_RELATIVE_ADDR	3
272cc70b2   Andy Fleming   Add MMC Framework
98
  #define SD_CMD_SWITCH_FUNC		6
341188b9c   Haavard Skinnemoen   MMC: Consolidate ...
99
  #define SD_CMD_SEND_IF_COND		8
f022d36e8   Otavio Salvador   mmc: fsl_esdhc: A...
100
  #define SD_CMD_SWITCH_UHS18V		11
341188b9c   Haavard Skinnemoen   MMC: Consolidate ...
101
102
  
  #define SD_CMD_APP_SET_BUS_WIDTH	6
3697e5992   Peng Fan   mmc: sd: extracti...
103
  #define SD_CMD_APP_SD_STATUS		13
e6f99a561   Lei Wen   MMC: add erase fu...
104
105
  #define SD_CMD_ERASE_WR_BLK_START	32
  #define SD_CMD_ERASE_WR_BLK_END		33
341188b9c   Haavard Skinnemoen   MMC: Consolidate ...
106
  #define SD_CMD_APP_SEND_OP_COND		41
272cc70b2   Andy Fleming   Add MMC Framework
107
108
109
110
111
  #define SD_CMD_APP_SEND_SCR		51
  
  /* SCR definitions in different words */
  #define SD_HIGHSPEED_BUSY	0x00020000
  #define SD_HIGHSPEED_SUPPORTED	0x00020000
abe2c93ff   Thomas Chou   mmc: coding style...
112
113
  #define OCR_BUSY		0x80000000
  #define OCR_HCS			0x40000000
31cacbabf   Raffaele Recalcati   mmc: SEND_OP_COND...
114
115
  #define OCR_VOLTAGE_MASK	0x007FFF80
  #define OCR_ACCESS_MODE		0x60000000
272cc70b2   Andy Fleming   Add MMC Framework
116

1aa2d074a   Eric Nelson   mmc: update MMC_E...
117
118
119
120
121
122
  #define MMC_ERASE_ARG		0x00000000
  #define MMC_SECURE_ERASE_ARG	0x80000000
  #define MMC_TRIM_ARG		0x00000001
  #define MMC_DISCARD_ARG		0x00000003
  #define MMC_SECURE_TRIM1_ARG	0x80000001
  #define MMC_SECURE_TRIM2_ARG	0x80008000
e6f99a561   Lei Wen   MMC: add erase fu...
123

5d4fc8d90   Raffaele Recalcati   mmc: checking sta...
124
  #define MMC_STATUS_MASK		(~0x0206BF7F)
6b2221b00   Andrew Gabbasov   mmc: Handle switc...
125
  #define MMC_STATUS_SWITCH_ERROR	(1 << 7)
abe2c93ff   Thomas Chou   mmc: coding style...
126
127
  #define MMC_STATUS_RDY_FOR_DATA (1 << 8)
  #define MMC_STATUS_CURR_STATE	(0xf << 9)
ed018b21d   Thomas Chou   mmc_spi: generate...
128
  #define MMC_STATUS_ERROR	(1 << 19)
5d4fc8d90   Raffaele Recalcati   mmc: checking sta...
129

d617c426a   Jan Kloetzke   mmc: make mmc_sen...
130
  #define MMC_STATE_PRG		(7 << 9)
272cc70b2   Andy Fleming   Add MMC Framework
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
  #define MMC_VDD_165_195		0x00000080	/* VDD voltage 1.65 - 1.95 */
  #define MMC_VDD_20_21		0x00000100	/* VDD voltage 2.0 ~ 2.1 */
  #define MMC_VDD_21_22		0x00000200	/* VDD voltage 2.1 ~ 2.2 */
  #define MMC_VDD_22_23		0x00000400	/* VDD voltage 2.2 ~ 2.3 */
  #define MMC_VDD_23_24		0x00000800	/* VDD voltage 2.3 ~ 2.4 */
  #define MMC_VDD_24_25		0x00001000	/* VDD voltage 2.4 ~ 2.5 */
  #define MMC_VDD_25_26		0x00002000	/* VDD voltage 2.5 ~ 2.6 */
  #define MMC_VDD_26_27		0x00004000	/* VDD voltage 2.6 ~ 2.7 */
  #define MMC_VDD_27_28		0x00008000	/* VDD voltage 2.7 ~ 2.8 */
  #define MMC_VDD_28_29		0x00010000	/* VDD voltage 2.8 ~ 2.9 */
  #define MMC_VDD_29_30		0x00020000	/* VDD voltage 2.9 ~ 3.0 */
  #define MMC_VDD_30_31		0x00040000	/* VDD voltage 3.0 ~ 3.1 */
  #define MMC_VDD_31_32		0x00080000	/* VDD voltage 3.1 ~ 3.2 */
  #define MMC_VDD_32_33		0x00100000	/* VDD voltage 3.2 ~ 3.3 */
  #define MMC_VDD_33_34		0x00200000	/* VDD voltage 3.3 ~ 3.4 */
  #define MMC_VDD_34_35		0x00400000	/* VDD voltage 3.4 ~ 3.5 */
  #define MMC_VDD_35_36		0x00800000	/* VDD voltage 3.5 ~ 3.6 */
  
  #define MMC_SWITCH_MODE_CMD_SET		0x00 /* Change the command set */
  #define MMC_SWITCH_MODE_SET_BITS	0x01 /* Set bits in EXT_CSD byte
  						addressed by index which are
  						1 in value field */
  #define MMC_SWITCH_MODE_CLEAR_BITS	0x02 /* Clear bits in EXT_CSD byte
  						addressed by index, which are
  						1 in value field */
  #define MMC_SWITCH_MODE_WRITE_BYTE	0x03 /* Set target byte to value */
  
  #define SD_SWITCH_CHECK		0
  #define SD_SWITCH_SWITCH	1
  
  /*
   * EXT_CSD fields
   */
a7f852b68   Diego Santa Cruz   mmc: read the siz...
164
165
  #define EXT_CSD_ENH_START_ADDR		136	/* R/W */
  #define EXT_CSD_ENH_SIZE_MULT		140	/* R/W */
f866a46d6   Stephen Warren   mmc: report capac...
166
  #define EXT_CSD_GP_SIZE_MULT		143	/* R/W */
d7b291299   Markus Niebel   MMC: fix user cap...
167
  #define EXT_CSD_PARTITION_SETTING	155	/* R/W */
1937e5aa3   Oliver Metz   mmc: Fix erase_gr...
168
  #define EXT_CSD_PARTITIONS_ATTRIBUTE	156	/* R/W */
ac9da0e08   Diego Santa Cruz   mmc: add API to d...
169
  #define EXT_CSD_MAX_ENH_SIZE_MULT	157	/* R */
0560db18e   Lei Wen   mmc: change magic...
170
  #define EXT_CSD_PARTITIONING_SUPPORT	160	/* RO */
33ace362f   Tom Rini   mmc: Add 'mmc rst...
171
  #define EXT_CSD_RST_N_FUNCTION		162	/* R/W */
8dda5b0e6   Diego Santa Cruz   mmc: extend the m...
172
173
  #define EXT_CSD_WR_REL_PARAM		166	/* R */
  #define EXT_CSD_WR_REL_SET		167	/* R/W */
f866a46d6   Stephen Warren   mmc: report capac...
174
  #define EXT_CSD_RPMB_MULT		168	/* RO */
0560db18e   Lei Wen   mmc: change magic...
175
  #define EXT_CSD_ERASE_GROUP_DEF		175	/* R/W */
3690d6d66   Amar   MMC: APIs to supp...
176
  #define EXT_CSD_BOOT_BUS_WIDTH		177
0560db18e   Lei Wen   mmc: change magic...
177
178
179
180
181
182
  #define EXT_CSD_PART_CONF		179	/* R/W */
  #define EXT_CSD_BUS_WIDTH		183	/* R/W */
  #define EXT_CSD_HS_TIMING		185	/* R/W */
  #define EXT_CSD_REV			192	/* RO */
  #define EXT_CSD_CARD_TYPE		196	/* RO */
  #define EXT_CSD_SEC_CNT			212	/* RO, 4 bytes */
f866a46d6   Stephen Warren   mmc: report capac...
183
  #define EXT_CSD_HC_WP_GRP_SIZE		221	/* RO */
0560db18e   Lei Wen   mmc: change magic...
184
  #define EXT_CSD_HC_ERASE_GRP_SIZE	224	/* RO */
8948ea830   Stephen Warren   mmc: detect boot ...
185
  #define EXT_CSD_BOOT_MULT		226	/* RO */
272cc70b2   Andy Fleming   Add MMC Framework
186
187
188
189
  
  /*
   * EXT_CSD field definitions
   */
abe2c93ff   Thomas Chou   mmc: coding style...
190
191
192
  #define EXT_CSD_CMD_SET_NORMAL		(1 << 0)
  #define EXT_CSD_CMD_SET_SECURE		(1 << 1)
  #define EXT_CSD_CMD_SET_CPSECURE	(1 << 2)
272cc70b2   Andy Fleming   Add MMC Framework
193

abe2c93ff   Thomas Chou   mmc: coding style...
194
195
  #define EXT_CSD_CARD_TYPE_26	(1 << 0)	/* Card can run at 26MHz */
  #define EXT_CSD_CARD_TYPE_52	(1 << 1)	/* Card can run at 52MHz */
d22e3d46a   Jaehoon Chung   mmc: support the ...
196
197
198
199
  #define EXT_CSD_CARD_TYPE_DDR_1_8V	(1 << 2)
  #define EXT_CSD_CARD_TYPE_DDR_1_2V	(1 << 3)
  #define EXT_CSD_CARD_TYPE_DDR_52	(EXT_CSD_CARD_TYPE_DDR_1_8V \
  					| EXT_CSD_CARD_TYPE_DDR_1_2V)
272cc70b2   Andy Fleming   Add MMC Framework
200
201
202
203
  
  #define EXT_CSD_BUS_WIDTH_1	0	/* Card is in 1 bit mode */
  #define EXT_CSD_BUS_WIDTH_4	1	/* Card is in 4 bit mode */
  #define EXT_CSD_BUS_WIDTH_8	2	/* Card is in 8 bit mode */
d22e3d46a   Jaehoon Chung   mmc: support the ...
204
205
  #define EXT_CSD_DDR_BUS_WIDTH_4	5	/* Card is in 4 bit DDR mode */
  #define EXT_CSD_DDR_BUS_WIDTH_8	6	/* Card is in 8 bit DDR mode */
341188b9c   Haavard Skinnemoen   MMC: Consolidate ...
206

3690d6d66   Amar   MMC: APIs to supp...
207
208
209
210
211
212
213
214
  #define EXT_CSD_BOOT_ACK_ENABLE			(1 << 6)
  #define EXT_CSD_BOOT_PARTITION_ENABLE		(1 << 3)
  #define EXT_CSD_PARTITION_ACCESS_ENABLE		(1 << 0)
  #define EXT_CSD_PARTITION_ACCESS_DISABLE	(0 << 0)
  
  #define EXT_CSD_BOOT_ACK(x)		(x << 6)
  #define EXT_CSD_BOOT_PART_NUM(x)	(x << 3)
  #define EXT_CSD_PARTITION_ACCESS(x)	(x << 0)
5a99b9de1   Tom Rini   cmd_mmc.c: Add bo...
215
216
217
  #define EXT_CSD_BOOT_BUS_WIDTH_MODE(x)	(x << 3)
  #define EXT_CSD_BOOT_BUS_WIDTH_RESET(x)	(x << 2)
  #define EXT_CSD_BOOT_BUS_WIDTH_WIDTH(x)	(x)
3690d6d66   Amar   MMC: APIs to supp...
218

d7b291299   Markus Niebel   MMC: fix user cap...
219
  #define EXT_CSD_PARTITION_SETTING_COMPLETED	(1 << 0)
c3dbb4f9b   Diego Santa Cruz   mmc: extend mmcin...
220
221
  #define EXT_CSD_ENH_USR		(1 << 0)	/* user data area is enhanced */
  #define EXT_CSD_ENH_GP(x)	(1 << ((x)+1))	/* GP part (x+1) is enhanced */
8dda5b0e6   Diego Santa Cruz   mmc: extend the m...
222
223
224
225
  #define EXT_CSD_HS_CTRL_REL	(1 << 0)	/* host controlled WR_REL_SET */
  
  #define EXT_CSD_WR_DATA_REL_USR		(1 << 0)	/* user data area WR_REL */
  #define EXT_CSD_WR_DATA_REL_GP(x)	(1 << ((x)+1))	/* GP part (x+1) WR_REL */
1de97f985   Andy Fleming   Eliminated arch-s...
226
227
  #define R1_ILLEGAL_COMMAND		(1 << 22)
  #define R1_APP_CMD			(1 << 5)
272cc70b2   Andy Fleming   Add MMC Framework
228
  #define MMC_RSP_PRESENT (1 << 0)
abe2c93ff   Thomas Chou   mmc: coding style...
229
230
231
232
  #define MMC_RSP_136	(1 << 1)		/* 136 bit response */
  #define MMC_RSP_CRC	(1 << 2)		/* expect valid crc */
  #define MMC_RSP_BUSY	(1 << 3)		/* card may send busy */
  #define MMC_RSP_OPCODE	(1 << 4)		/* response contains opcode */
272cc70b2   Andy Fleming   Add MMC Framework
233

abe2c93ff   Thomas Chou   mmc: coding style...
234
235
  #define MMC_RSP_NONE	(0)
  #define MMC_RSP_R1	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
272cc70b2   Andy Fleming   Add MMC Framework
236
237
  #define MMC_RSP_R1b	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE| \
  			MMC_RSP_BUSY)
abe2c93ff   Thomas Chou   mmc: coding style...
238
239
240
241
242
243
  #define MMC_RSP_R2	(MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC)
  #define MMC_RSP_R3	(MMC_RSP_PRESENT)
  #define MMC_RSP_R4	(MMC_RSP_PRESENT)
  #define MMC_RSP_R5	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
  #define MMC_RSP_R6	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
  #define MMC_RSP_R7	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
272cc70b2   Andy Fleming   Add MMC Framework
244

bc897b1d4   Lei Wen   mmc: enable parti...
245
246
247
  #define MMCPART_NOAVAILABLE	(0xff)
  #define PART_ACCESS_MASK	(0x7)
  #define PART_SUPPORT		(0x1)
c3dbb4f9b   Diego Santa Cruz   mmc: extend mmcin...
248
  #define ENHNCD_SUPPORT		(0x2)
1937e5aa3   Oliver Metz   mmc: Fix erase_gr...
249
  #define PART_ENH_ATTRIB		(0x1f)
71f951180   wdenk   * Fix CONFIG_NET_...
250

8bfa195e4   Simon Glass   mmc: Define a con...
251
252
  /* Maximum block size for MMC */
  #define MMC_MAX_BLOCK_LEN	512
3690d6d66   Amar   MMC: APIs to supp...
253
254
255
256
  /* The number of MMC physical partitions.  These consist of:
   * boot partitions (2), general purpose partitions (4) in MMC v4.4.
   */
  #define MMC_NUM_BOOT_PARTITION	2
91fdabc67   Pierre Aubert   eMMC: add support...
257
  #define MMC_PART_RPMB           3       /* RPMB partition number */
3690d6d66   Amar   MMC: APIs to supp...
258

e7ecf7cb5   Simon Glass   dm: mmc: Add an M...
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
  /* Driver model support */
  
  /**
   * struct mmc_uclass_priv - Holds information about a device used by the uclass
   */
  struct mmc_uclass_priv {
  	struct mmc *mmc;
  };
  
  /**
   * mmc_get_mmc_dev() - get the MMC struct pointer for a device
   *
   * Provided that the device is already probed and ready for use, this value
   * will be available.
   *
   * @dev:	Device
   * @return associated mmc struct pointer if available, else NULL
   */
  struct mmc *mmc_get_mmc_dev(struct udevice *dev);
  
  /* End of driver model support */
1de97f985   Andy Fleming   Eliminated arch-s...
280
281
282
283
284
285
286
287
  struct mmc_cid {
  	unsigned long psn;
  	unsigned short oid;
  	unsigned char mid;
  	unsigned char prv;
  	unsigned char mdt;
  	char pnm[7];
  };
272cc70b2   Andy Fleming   Add MMC Framework
288
289
290
291
  struct mmc_cmd {
  	ushort cmdidx;
  	uint resp_type;
  	uint cmdarg;
0b453ffe2   Rabin Vincent   mmc: fix response...
292
  	uint response[4];
272cc70b2   Andy Fleming   Add MMC Framework
293
294
295
296
297
298
299
300
301
302
303
  };
  
  struct mmc_data {
  	union {
  		char *dest;
  		const char *src; /* src buffers don't get written to */
  	};
  	uint flags;
  	uint blocks;
  	uint blocksize;
  };
ab769f227   Pantelis Antoniou   mmc: Remove ops f...
304
305
  /* forward decl. */
  struct mmc;
8ca51e51c   Simon Glass   dm: mmc: Add a wa...
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
  #ifdef CONFIG_DM_MMC_OPS
  struct dm_mmc_ops {
  	/**
  	 * send_cmd() - Send a command to the MMC device
  	 *
  	 * @dev:	Device to receive the command
  	 * @cmd:	Command to send
  	 * @data:	Additional data to send/receive
  	 * @return 0 if OK, -ve on error
  	 */
  	int (*send_cmd)(struct udevice *dev, struct mmc_cmd *cmd,
  			struct mmc_data *data);
  
  	/**
  	 * set_ios() - Set the I/O speed/width for an MMC device
  	 *
  	 * @dev:	Device to update
  	 * @return 0 if OK, -ve on error
  	 */
  	int (*set_ios)(struct udevice *dev);
  
  	/**
  	 * get_cd() - See whether a card is present
  	 *
  	 * @dev:	Device to check
  	 * @return 0 if not present, 1 if present, -ve on error
  	 */
  	int (*get_cd)(struct udevice *dev);
  
  	/**
  	 * get_wp() - See whether a card has write-protect enabled
  	 *
  	 * @dev:	Device to check
  	 * @return 0 if write-enabled, 1 if write-protected, -ve on error
  	 */
  	int (*get_wp)(struct udevice *dev);
  };
  
  #define mmc_get_ops(dev)        ((struct dm_mmc_ops *)(dev)->driver->ops)
  
  int dm_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
  		    struct mmc_data *data);
  int dm_mmc_set_ios(struct udevice *dev);
  int dm_mmc_get_cd(struct udevice *dev);
  int dm_mmc_get_wp(struct udevice *dev);
  
  /* Transition functions for compatibility */
  int mmc_set_ios(struct mmc *mmc);
  int mmc_getcd(struct mmc *mmc);
  int mmc_getwp(struct mmc *mmc);
  
  #else
ab769f227   Pantelis Antoniou   mmc: Remove ops f...
358
359
360
361
362
363
364
365
  struct mmc_ops {
  	int (*send_cmd)(struct mmc *mmc,
  			struct mmc_cmd *cmd, struct mmc_data *data);
  	void (*set_ios)(struct mmc *mmc);
  	int (*init)(struct mmc *mmc);
  	int (*getcd)(struct mmc *mmc);
  	int (*getwp)(struct mmc *mmc);
  };
8ca51e51c   Simon Glass   dm: mmc: Add a wa...
366
  #endif
ab769f227   Pantelis Antoniou   mmc: Remove ops f...
367

93bfd6167   Pantelis Antoniou   mmc: Split mmc st...
368
369
  struct mmc_config {
  	const char *name;
8ca51e51c   Simon Glass   dm: mmc: Add a wa...
370
  #ifndef CONFIG_DM_MMC_OPS
93bfd6167   Pantelis Antoniou   mmc: Split mmc st...
371
  	const struct mmc_ops *ops;
8ca51e51c   Simon Glass   dm: mmc: Add a wa...
372
  #endif
93bfd6167   Pantelis Antoniou   mmc: Split mmc st...
373
374
375
376
377
378
379
  	uint host_caps;
  	uint voltages;
  	uint f_min;
  	uint f_max;
  	uint b_max;
  	unsigned char part_type;
  };
3697e5992   Peng Fan   mmc: sd: extracti...
380
381
382
383
384
  struct sd_ssr {
  	unsigned int au;		/* In sectors */
  	unsigned int erase_timeout;	/* In milliseconds */
  	unsigned int erase_offset;	/* In milliseconds */
  };
8ca51e51c   Simon Glass   dm: mmc: Add a wa...
385
386
387
388
389
390
  /*
   * With CONFIG_DM_MMC enabled, struct mmc can be accessed from the MMC device
   * with mmc_get_mmc_dev().
   *
   * TODO struct mmc should be in mmc_private but it's hard to fix right now
   */
272cc70b2   Andy Fleming   Add MMC Framework
391
  struct mmc {
33fb211dd   Simon Glass   dm: mmc: Add supp...
392
  #ifndef CONFIG_BLK
272cc70b2   Andy Fleming   Add MMC Framework
393
  	struct list_head link;
33fb211dd   Simon Glass   dm: mmc: Add supp...
394
  #endif
93bfd6167   Pantelis Antoniou   mmc: Split mmc st...
395
  	const struct mmc_config *cfg;	/* provided configuration */
272cc70b2   Andy Fleming   Add MMC Framework
396
  	uint version;
93bfd6167   Pantelis Antoniou   mmc: Split mmc st...
397
  	void *priv;
bc897b1d4   Lei Wen   mmc: enable parti...
398
  	uint has_init;
272cc70b2   Andy Fleming   Add MMC Framework
399
400
401
402
  	int high_capacity;
  	uint bus_width;
  	uint clock;
  	uint card_caps;
272cc70b2   Andy Fleming   Add MMC Framework
403
  	uint ocr;
ab71188ce   Markus Niebel   mmc: add setdsr s...
404
405
  	uint dsr;
  	uint dsr_imp;
272cc70b2   Andy Fleming   Add MMC Framework
406
407
  	uint scr[2];
  	uint csd[4];
0b453ffe2   Rabin Vincent   mmc: fix response...
408
  	uint cid[4];
272cc70b2   Andy Fleming   Add MMC Framework
409
  	ushort rca;
c3dbb4f9b   Diego Santa Cruz   mmc: extend mmcin...
410
411
  	u8 part_support;
  	u8 part_attr;
9e41a00b5   Diego Santa Cruz   mmc: extend mmcin...
412
  	u8 wr_rel_set;
bc897b1d4   Lei Wen   mmc: enable parti...
413
  	char part_config;
272cc70b2   Andy Fleming   Add MMC Framework
414
415
416
  	uint tran_speed;
  	uint read_bl_len;
  	uint write_bl_len;
a4ff9f83f   Diego Santa Cruz   mmc: fix erase_gr...
417
  	uint erase_grp_size;	/* in 512-byte sectors */
037dc0ab5   Diego Santa Cruz   mmc: read the hig...
418
  	uint hc_wp_grp_size;	/* in 512-byte sectors */
3697e5992   Peng Fan   mmc: sd: extracti...
419
  	struct sd_ssr	ssr;	/* SD status register */
272cc70b2   Andy Fleming   Add MMC Framework
420
  	u64 capacity;
f866a46d6   Stephen Warren   mmc: report capac...
421
422
423
424
  	u64 capacity_user;
  	u64 capacity_boot;
  	u64 capacity_rpmb;
  	u64 capacity_gp[4];
a7f852b68   Diego Santa Cruz   mmc: read the siz...
425
426
  	u64 enh_user_start;
  	u64 enh_user_size;
33fb211dd   Simon Glass   dm: mmc: Add supp...
427
  #ifndef CONFIG_BLK
4101f6879   Simon Glass   dm: Drop the bloc...
428
  	struct blk_desc block_dev;
33fb211dd   Simon Glass   dm: mmc: Add supp...
429
  #endif
e95504497   Che-Liang Chiou   mmc: Split device...
430
431
432
  	char op_cond_pending;	/* 1 if we are waiting on an op_cond command */
  	char init_in_progress;	/* 1 if we have done mmc_start_init() */
  	char preinit;		/* start init as early as possible */
786e8f818   Andrew Gabbasov   mmc: Fix handling...
433
  	int ddr_mode;
cffe5d86c   Simon Glass   dm: mmc: Set up t...
434
435
436
  #ifdef CONFIG_DM_MMC
  	struct udevice *dev;	/* Device for this MMC controller */
  #endif
272cc70b2   Andy Fleming   Add MMC Framework
437
  };
ac9da0e08   Diego Santa Cruz   mmc: add API to d...
438
439
440
441
  struct mmc_hwpart_conf {
  	struct {
  		uint enh_start;	/* in 512-byte sectors */
  		uint enh_size;	/* in 512-byte sectors, if 0 no enh area */
8dda5b0e6   Diego Santa Cruz   mmc: extend the m...
442
443
  		unsigned wr_rel_change : 1;
  		unsigned wr_rel_set : 1;
ac9da0e08   Diego Santa Cruz   mmc: add API to d...
444
445
446
  	} user;
  	struct {
  		uint size;	/* in 512-byte sectors */
8dda5b0e6   Diego Santa Cruz   mmc: extend the m...
447
448
449
  		unsigned enhanced : 1;
  		unsigned wr_rel_change : 1;
  		unsigned wr_rel_set : 1;
ac9da0e08   Diego Santa Cruz   mmc: add API to d...
450
451
452
453
454
455
456
457
  	} gp_part[4];
  };
  
  enum mmc_hwpart_conf_mode {
  	MMC_HWPART_CONF_CHECK,
  	MMC_HWPART_CONF_SET,
  	MMC_HWPART_CONF_COMPLETE,
  };
93bfd6167   Pantelis Antoniou   mmc: Split mmc st...
458
  struct mmc *mmc_create(const struct mmc_config *cfg, void *priv);
ad27dd5e1   Simon Glass   dm: mmc: Add a wa...
459
460
461
462
463
464
465
466
467
468
469
470
471
472
  
  /**
   * mmc_bind() - Set up a new MMC device ready for probing
   *
   * A child block device is bound with the IF_TYPE_MMC interface type. This
   * allows the device to be used with CONFIG_BLK
   *
   * @dev:	MMC device to set up
   * @mmc:	MMC struct
   * @cfg:	MMC configuration
   * @return 0 if OK, -ve on error
   */
  int mmc_bind(struct udevice *dev, struct mmc *mmc,
  	     const struct mmc_config *cfg);
93bfd6167   Pantelis Antoniou   mmc: Split mmc st...
473
  void mmc_destroy(struct mmc *mmc);
ad27dd5e1   Simon Glass   dm: mmc: Add a wa...
474
475
476
477
478
479
480
481
  
  /**
   * mmc_unbind() - Unbind a MMC device's child block device
   *
   * @dev:	MMC device
   * @return 0 if OK, -ve on error
   */
  int mmc_unbind(struct udevice *dev);
272cc70b2   Andy Fleming   Add MMC Framework
482
483
484
  int mmc_initialize(bd_t *bis);
  int mmc_init(struct mmc *mmc);
  int mmc_read(struct mmc *mmc, u64 src, uchar *dst, int size);
4a6ee172c   Jerry Huang   fsl_esdhc: Use mm...
485
  void mmc_set_clock(struct mmc *mmc, uint clock);
272cc70b2   Andy Fleming   Add MMC Framework
486
  struct mmc *find_mmc_device(int dev_num);
89716964d   Steve Sakoman   mmc: add function...
487
  int mmc_set_dev(int dev_num);
272cc70b2   Andy Fleming   Add MMC Framework
488
  void print_mmc_devices(char separator);
46683f3da   Kever Yang   mmc-uclass: corre...
489
490
491
492
493
494
  
  /**
   * get_mmc_num() - get the total MMC device number
   *
   * @return 0 if there is no MMC device, else the number of devices
   */
ea6ebe217   Lei Wen   cmd_mmc: eliminat...
495
  int get_mmc_num(void);
ac9da0e08   Diego Santa Cruz   mmc: add API to d...
496
497
  int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
  		      enum mmc_hwpart_conf_mode mode);
8ca51e51c   Simon Glass   dm: mmc: Add a wa...
498
499
  
  #ifndef CONFIG_DM_MMC_OPS
48972d907   Thierry Reding   mmc: Implement ca...
500
  int mmc_getcd(struct mmc *mmc);
750121c35   Jeroen Hofstee   mmc: prevent some...
501
  int board_mmc_getcd(struct mmc *mmc);
d23d8d7e0   Nikita Kiryanov   mmc: add support ...
502
  int mmc_getwp(struct mmc *mmc);
750121c35   Jeroen Hofstee   mmc: prevent some...
503
  int board_mmc_getwp(struct mmc *mmc);
8ca51e51c   Simon Glass   dm: mmc: Add a wa...
504
  #endif
ab71188ce   Markus Niebel   mmc: add setdsr s...
505
  int mmc_set_dsr(struct mmc *mmc, u16 val);
3690d6d66   Amar   MMC: APIs to supp...
506
507
508
  /* Function to change the size of boot partition and rpmb partitions */
  int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
  					unsigned long rpmbsize);
792970b0a   Tom Rini   cmd_mmc.c: Add 'p...
509
510
  /* Function to modify the PARTITION_CONFIG field of EXT_CSD */
  int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access);
5a99b9de1   Tom Rini   cmd_mmc.c: Add bo...
511
512
  /* Function to modify the BOOT_BUS_WIDTH field of EXT_CSD */
  int mmc_set_boot_bus_width(struct mmc *mmc, u8 width, u8 reset, u8 mode);
33ace362f   Tom Rini   mmc: Add 'mmc rst...
513
514
  /* Function to modify the RST_n_FUNCTION field of EXT_CSD */
  int mmc_set_rst_n_function(struct mmc *mmc, u8 enable);
91fdabc67   Pierre Aubert   eMMC: add support...
515
516
517
518
519
520
521
  /* Functions to read / write the RPMB partition */
  int mmc_rpmb_set_key(struct mmc *mmc, void *key);
  int mmc_rpmb_get_counter(struct mmc *mmc, unsigned long *counter);
  int mmc_rpmb_read(struct mmc *mmc, void *addr, unsigned short blk,
  		  unsigned short cnt, unsigned char *key);
  int mmc_rpmb_write(struct mmc *mmc, void *addr, unsigned short blk,
  		   unsigned short cnt, unsigned char *key);
e95504497   Che-Liang Chiou   mmc: Split device...
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
  /**
   * Start device initialization and return immediately; it does not block on
   * polling OCR (operation condition register) status.  Then you should call
   * mmc_init, which would block on polling OCR status and complete the device
   * initializatin.
   *
   * @param mmc	Pointer to a MMC device struct
   * @return 0 on success, IN_PROGRESS on waiting for OCR status, <0 on error.
   */
  int mmc_start_init(struct mmc *mmc);
  
  /**
   * Set preinit flag of mmc device.
   *
   * This will cause the device to be pre-inited during mmc_initialize(),
   * which may save boot time if the device is not accessed until later.
   * Some eMMC devices take 200-300ms to init, but unfortunately they
   * must be sent a series of commands to even get them to start preparing
   * for operation.
   *
   * @param mmc		Pointer to a MMC device struct
   * @param preinit	preinit flag value
   */
  void mmc_set_preinit(struct mmc *mmc, int preinit);
8687d5c80   Paul Burton   mmc: size optimiz...
546
  #ifdef CONFIG_MMC_SPI
0b2da7e20   Tom Rini   blackfin: mmc: Co...
547
  #define mmc_host_is_spi(mmc)	((mmc)->cfg->host_caps & MMC_MODE_SPI)
8687d5c80   Paul Burton   mmc: size optimiz...
548
549
550
  #else
  #define mmc_host_is_spi(mmc)	0
  #endif
d52ebf102   Thomas Chou   mmc: add generic ...
551
  struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode);
1592ef859   Reinhard Meyer   AT91: MCI: add SD...
552

95de9ab20   Paul Kocialkowski   mmc: Board-specif...
553
  void board_mmc_power_init(void);
3c7ca9670   Fabio Estevam   mmc: Add a protot...
554
  int board_mmc_init(bd_t *bis);
750121c35   Jeroen Hofstee   mmc: prevent some...
555
  int cpu_mmc_init(bd_t *bis);
aeb805558   Jeroen Hofstee   mmc: add prototyp...
556
  int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr);
aa844fe10   Clemens Gruber   mmc: add missing ...
557
  int mmc_get_env_dev(void);
3c7ca9670   Fabio Estevam   mmc: Add a protot...
558

91785f70b   Simon Glass   x86: mmc: Move co...
559
560
561
562
563
564
565
566
  struct pci_device_id;
  
  /**
   * pci_mmc_init() - set up PCI MMC devices
   *
   * This finds all the matching PCI IDs and sets them up as MMC devices.
   *
   * @name:		Name to use for devices
4abe8e40a   Simon Glass   dm: Convert PCI M...
567
   * @mmc_supported:	PCI IDs to search for, terminated by {0, 0}
91785f70b   Simon Glass   x86: mmc: Move co...
568
   */
4abe8e40a   Simon Glass   dm: Convert PCI M...
569
  int pci_mmc_init(const char *name, struct pci_device_id *mmc_supported);
91785f70b   Simon Glass   x86: mmc: Move co...
570

93bfd6167   Pantelis Antoniou   mmc: Split mmc st...
571
572
573
574
  /* Set block count limit because of 16 bit register limit on some hardware*/
  #ifndef CONFIG_SYS_MMC_MAX_BLK_COUNT
  #define CONFIG_SYS_MMC_MAX_BLK_COUNT 65535
  #endif
cb5ec33d9   Simon Glass   dm: mmc: Add a fu...
575
576
577
578
579
580
581
  /**
   * mmc_get_blk_desc() - Get the block descriptor for an MMC device
   *
   * @mmc:	MMC device
   * @return block device if found, else NULL
   */
  struct blk_desc *mmc_get_blk_desc(struct mmc *mmc);
71f951180   wdenk   * Fix CONFIG_NET_...
582
  #endif /* _MMC_H_ */