mmc.h 29.8 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0+ */
2
/*
3
 * Copyright 2008,2010 Freescale Semiconductor, Inc
Andy Fleming's avatar
Andy Fleming committed
4
5
6
 * Andy Fleming
 *
 * Based (loosely) on the Linux code
7
8
9
10
11
 */

#ifndef _MMC_H_
#define _MMC_H_

12
#include <linux/bitops.h>
Andy Fleming's avatar
Andy Fleming committed
13
#include <linux/list.h>
14
#include <linux/sizes.h>
15
#include <linux/compiler.h>
16
#include <linux/dma-direction.h>
Mateusz Zalega's avatar
Mateusz Zalega committed
17
#include <part.h>
Andy Fleming's avatar
Andy Fleming committed
18

19
20
struct bd_info;

21
22
23
24
25
26
27
#if CONFIG_IS_ENABLED(MMC_HS200_SUPPORT)
#define MMC_SUPPORTS_TUNING
#endif
#if CONFIG_IS_ENABLED(MMC_UHS_SUPPORT)
#define MMC_SUPPORTS_TUNING
#endif

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
53
54
55
56
57
58
59
/* 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)
60
#define MMC_VERSION_4_4		MAKE_MMC_VERSION(4, 4, 0)
61
62
63
#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)
Stefan Wahren's avatar
Stefan Wahren committed
64
#define MMC_VERSION_5_1		MAKE_MMC_VERSION(5, 1, 0)
Andy Fleming's avatar
Andy Fleming committed
65

Jean-Jacques Hiblot's avatar
Jean-Jacques Hiblot committed
66
67
68
69
#define MMC_CAP(mode)		(1 << mode)
#define MMC_MODE_HS		(MMC_CAP(MMC_HS) | MMC_CAP(SD_HS))
#define MMC_MODE_HS_52MHz	MMC_CAP(MMC_HS_52)
#define MMC_MODE_DDR_52MHz	MMC_CAP(MMC_DDR_52)
70
#define MMC_MODE_HS200		MMC_CAP(MMC_HS_200)
Peng Fan's avatar
Peng Fan committed
71
#define MMC_MODE_HS400		MMC_CAP(MMC_HS_400)
72
#define MMC_MODE_HS400_ES	MMC_CAP(MMC_HS_400_ES)
Jean-Jacques Hiblot's avatar
Jean-Jacques Hiblot committed
73

74
75
76
77
#define MMC_CAP_NONREMOVABLE	BIT(14)
#define MMC_CAP_NEEDS_POLL	BIT(15)
#define MMC_CAP_CD_ACTIVE_HIGH  BIT(16)

Jean-Jacques Hiblot's avatar
Jean-Jacques Hiblot committed
78
79
#define MMC_MODE_8BIT		BIT(30)
#define MMC_MODE_4BIT		BIT(29)
80
#define MMC_MODE_1BIT		BIT(28)
Jean-Jacques Hiblot's avatar
Jean-Jacques Hiblot committed
81
82
#define MMC_MODE_SPI		BIT(27)

83

Andy Fleming's avatar
Andy Fleming committed
84
85
#define SD_DATA_4BIT	0x00040000

86
#define IS_SD(x)	((x)->version & SD_VERSION_SD)
87
#define IS_MMC(x)	((x)->version & MMC_VERSION_MMC)
Andy Fleming's avatar
Andy Fleming committed
88
89
90
91

#define MMC_DATA_READ		1
#define MMC_DATA_WRITE		2

92
93
94
95
96
#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
Andy Fleming's avatar
Andy Fleming committed
97
#define MMC_CMD_SWITCH			6
98
#define MMC_CMD_SELECT_CARD		7
Andy Fleming's avatar
Andy Fleming committed
99
#define MMC_CMD_SEND_EXT_CSD		8
100
101
#define MMC_CMD_SEND_CSD		9
#define MMC_CMD_SEND_CID		10
Andy Fleming's avatar
Andy Fleming committed
102
#define MMC_CMD_STOP_TRANSMISSION	12
103
104
105
106
#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
107
#define MMC_CMD_SEND_TUNING_BLOCK		19
108
#define MMC_CMD_SEND_TUNING_BLOCK_HS200	21
109
#define MMC_CMD_SET_BLOCK_COUNT         23
Andy Fleming's avatar
Andy Fleming committed
110
111
#define MMC_CMD_WRITE_SINGLE_BLOCK	24
#define MMC_CMD_WRITE_MULTIPLE_BLOCK	25
112
113
114
#define MMC_CMD_ERASE_GROUP_START	35
#define MMC_CMD_ERASE_GROUP_END		36
#define MMC_CMD_ERASE			38
115
#define MMC_CMD_APP_CMD			55
Thomas Chou's avatar
Thomas Chou committed
116
117
#define MMC_CMD_SPI_READ_OCR		58
#define MMC_CMD_SPI_CRC_ON_OFF		59
118
119
120
121
122
#define MMC_CMD_RES_MAN			62

#define MMC_CMD62_ARG1			0xefac62ec
#define MMC_CMD62_ARG2			0xcbaea7

123
124

#define SD_CMD_SEND_RELATIVE_ADDR	3
Andy Fleming's avatar
Andy Fleming committed
125
#define SD_CMD_SWITCH_FUNC		6
126
#define SD_CMD_SEND_IF_COND		8
127
#define SD_CMD_SWITCH_UHS18V		11
128
129

#define SD_CMD_APP_SET_BUS_WIDTH	6
130
#define SD_CMD_APP_SD_STATUS		13
131
132
#define SD_CMD_ERASE_WR_BLK_START	32
#define SD_CMD_ERASE_WR_BLK_END		33
133
#define SD_CMD_APP_SEND_OP_COND		41
Andy Fleming's avatar
Andy Fleming committed
134
135
#define SD_CMD_APP_SEND_SCR		51

136
137
static inline bool mmc_is_tuning_cmd(uint cmdidx)
{
138
139
	if ((cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200) ||
	    (cmdidx == MMC_CMD_SEND_TUNING_BLOCK))
140
141
142
143
		return true;
	return false;
}

Andy Fleming's avatar
Andy Fleming committed
144
145
146
147
/* SCR definitions in different words */
#define SD_HIGHSPEED_BUSY	0x00020000
#define SD_HIGHSPEED_SUPPORTED	0x00020000

148
149
150
151
152
153
154
155
156
157
158
159
160
#define UHS_SDR12_BUS_SPEED	0
#define HIGH_SPEED_BUS_SPEED	1
#define UHS_SDR25_BUS_SPEED	1
#define UHS_SDR50_BUS_SPEED	2
#define UHS_SDR104_BUS_SPEED	3
#define UHS_DDR50_BUS_SPEED	4

#define SD_MODE_UHS_SDR12	BIT(UHS_SDR12_BUS_SPEED)
#define SD_MODE_UHS_SDR25	BIT(UHS_SDR25_BUS_SPEED)
#define SD_MODE_UHS_SDR50	BIT(UHS_SDR50_BUS_SPEED)
#define SD_MODE_UHS_SDR104	BIT(UHS_SDR104_BUS_SPEED)
#define SD_MODE_UHS_DDR50	BIT(UHS_DDR50_BUS_SPEED)

161
162
#define OCR_BUSY		0x80000000
#define OCR_HCS			0x40000000
163
#define OCR_S18R		0x1000000
164
165
#define OCR_VOLTAGE_MASK	0x007FFF80
#define OCR_ACCESS_MODE		0x60000000
Andy Fleming's avatar
Andy Fleming committed
166

167
168
169
170
171
172
#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
173

174
#define MMC_STATUS_MASK		(~0x0206BF7F)
175
#define MMC_STATUS_SWITCH_ERROR	(1 << 7)
176
177
#define MMC_STATUS_RDY_FOR_DATA (1 << 8)
#define MMC_STATUS_CURR_STATE	(0xf << 9)
178
#define MMC_STATUS_ERROR	(1 << 19)
179

180
#define MMC_STATE_PRG		(7 << 9)
181
#define MMC_STATE_TRANS		(4 << 9)
182

Andy Fleming's avatar
Andy Fleming committed
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
#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
 */
216
217
#define EXT_CSD_ENH_START_ADDR		136	/* R/W */
#define EXT_CSD_ENH_SIZE_MULT		140	/* R/W */
218
#define EXT_CSD_GP_SIZE_MULT		143	/* R/W */
219
#define EXT_CSD_PARTITION_SETTING	155	/* R/W */
220
#define EXT_CSD_PARTITIONS_ATTRIBUTE	156	/* R/W */
221
#define EXT_CSD_MAX_ENH_SIZE_MULT	157	/* R */
222
#define EXT_CSD_PARTITIONING_SUPPORT	160	/* RO */
223
#define EXT_CSD_RST_N_FUNCTION		162	/* R/W */
Tomas Melin's avatar
Tomas Melin committed
224
#define EXT_CSD_BKOPS_EN		163	/* R/W & R/W/E */
225
226
#define EXT_CSD_WR_REL_PARAM		166	/* R */
#define EXT_CSD_WR_REL_SET		167	/* R/W */
227
#define EXT_CSD_RPMB_MULT		168	/* RO */
228
229
230
#define EXT_CSD_USER_WP			171	/* R/W & R/W/C_P & R/W/E_P */
#define EXT_CSD_BOOT_WP			173	/* R/W & R/W/C_P */
#define EXT_CSD_BOOT_WP_STATUS		174	/* R */
231
#define EXT_CSD_ERASE_GROUP_DEF		175	/* R/W */
232
#define EXT_CSD_BOOT_BUS_WIDTH		177
233
234
#define EXT_CSD_PART_CONF		179	/* R/W */
#define EXT_CSD_BUS_WIDTH		183	/* R/W */
235
#define EXT_CSD_STROBE_SUPPORT		184	/* R/W */
236
237
238
#define EXT_CSD_HS_TIMING		185	/* R/W */
#define EXT_CSD_REV			192	/* RO */
#define EXT_CSD_CARD_TYPE		196	/* RO */
239
#define EXT_CSD_PART_SWITCH_TIME	199	/* RO */
240
#define EXT_CSD_SEC_CNT			212	/* RO, 4 bytes */
241
#define EXT_CSD_HC_WP_GRP_SIZE		221	/* RO */
242
#define EXT_CSD_HC_ERASE_GRP_SIZE	224	/* RO */
243
#define EXT_CSD_BOOT_MULT		226	/* RO */
244
#define EXT_CSD_GENERIC_CMD6_TIME       248     /* RO */
Tomas Melin's avatar
Tomas Melin committed
245
#define EXT_CSD_BKOPS_SUPPORT		502	/* RO */
Andy Fleming's avatar
Andy Fleming committed
246
247
248
249
250

/*
 * EXT_CSD field definitions
 */

251
252
253
#define EXT_CSD_CMD_SET_NORMAL		(1 << 0)
#define EXT_CSD_CMD_SET_SECURE		(1 << 1)
#define EXT_CSD_CMD_SET_CPSECURE	(1 << 2)
Andy Fleming's avatar
Andy Fleming committed
254

255
256
#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 */
257
258
259
260
#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)
Andy Fleming's avatar
Andy Fleming committed
261

262
263
264
265
266
267
#define EXT_CSD_CARD_TYPE_HS200_1_8V	BIT(4)	/* Card can run at 200MHz */
						/* SDR mode @1.8V I/O */
#define EXT_CSD_CARD_TYPE_HS200_1_2V	BIT(5)	/* Card can run at 200MHz */
						/* SDR mode @1.2V I/O */
#define EXT_CSD_CARD_TYPE_HS200		(EXT_CSD_CARD_TYPE_HS200_1_8V | \
					 EXT_CSD_CARD_TYPE_HS200_1_2V)
Peng Fan's avatar
Peng Fan committed
268
269
270
271
#define EXT_CSD_CARD_TYPE_HS400_1_8V	BIT(6)
#define EXT_CSD_CARD_TYPE_HS400_1_2V	BIT(7)
#define EXT_CSD_CARD_TYPE_HS400		(EXT_CSD_CARD_TYPE_HS400_1_8V | \
					 EXT_CSD_CARD_TYPE_HS400_1_2V)
272

Andy Fleming's avatar
Andy Fleming committed
273
274
275
#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 */
276
277
#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 */
278
#define EXT_CSD_DDR_FLAG	BIT(2)	/* Flag for DDR mode */
279
#define EXT_CSD_BUS_WIDTH_STROBE BIT(7)	/* Enhanced strobe mode */
280

281
282
#define EXT_CSD_TIMING_LEGACY	0	/* no high speed */
#define EXT_CSD_TIMING_HS	1	/* HS */
283
#define EXT_CSD_TIMING_HS200	2	/* HS200 */
Peng Fan's avatar
Peng Fan committed
284
#define EXT_CSD_TIMING_HS400	3	/* HS400 */
285
#define EXT_CSD_DRV_STR_SHIFT	4	/* Driver Strength shift */
286

287
288
289
290
291
292
293
294
295
#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)

296
297
298
299
#define EXT_CSD_EXTRACT_BOOT_ACK(x)		(((x) >> 6) & 0x1)
#define EXT_CSD_EXTRACT_BOOT_PART(x)		(((x) >> 3) & 0x7)
#define EXT_CSD_EXTRACT_PARTITION_ACCESS(x)	((x) & 0x7)

300
301
302
#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)
303

304
305
#define EXT_CSD_PARTITION_SETTING_COMPLETED	(1 << 0)

306
307
308
#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 */

309
310
#define EXT_CSD_HS_CTRL_REL	(1 << 0)	/* host controlled WR_REL_SET */

311
312
313
314
#define EXT_CSD_BOOT_WP_B_SEC_WP_SEL	(0x80)	/* enable partition selector */
#define EXT_CSD_BOOT_WP_B_PWR_WP_SEC_SEL (0x02)	/* partition selector to protect */
#define EXT_CSD_BOOT_WP_B_PWR_WP_EN	(0x01)	/* power-on write-protect */

315
316
317
#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 */

318
319
320
#define R1_ILLEGAL_COMMAND		(1 << 22)
#define R1_APP_CMD			(1 << 5)

Andy Fleming's avatar
Andy Fleming committed
321
#define MMC_RSP_PRESENT (1 << 0)
322
323
324
325
#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 */
Andy Fleming's avatar
Andy Fleming committed
326

327
328
#define MMC_RSP_NONE	(0)
#define MMC_RSP_R1	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
Andy Fleming's avatar
Andy Fleming committed
329
330
#define MMC_RSP_R1b	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE| \
			MMC_RSP_BUSY)
331
332
333
334
335
336
#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)
Andy Fleming's avatar
Andy Fleming committed
337

338
339
340
#define MMCPART_NOAVAILABLE	(0xff)
#define PART_ACCESS_MASK	(0x7)
#define PART_SUPPORT		(0x1)
341
#define ENHNCD_SUPPORT		(0x2)
342
#define PART_ENH_ATTRIB		(0x1f)
343

344
345
#define MMC_QUIRK_RETRY_SEND_CID	BIT(0)
#define MMC_QUIRK_RETRY_SET_BLOCKLEN	BIT(1)
346
#define MMC_QUIRK_RETRY_APP_CMD	BIT(2)
347

348
349
enum mmc_voltage {
	MMC_SIGNAL_VOLTAGE_000 = 0,
350
351
352
	MMC_SIGNAL_VOLTAGE_120 = 1,
	MMC_SIGNAL_VOLTAGE_180 = 2,
	MMC_SIGNAL_VOLTAGE_330 = 4,
353
354
};

355
356
357
358
#define MMC_ALL_SIGNAL_VOLTAGE (MMC_SIGNAL_VOLTAGE_120 |\
				MMC_SIGNAL_VOLTAGE_180 |\
				MMC_SIGNAL_VOLTAGE_330)

359
360
361
/* Maximum block size for MMC */
#define MMC_MAX_BLOCK_LEN	512

362
363
364
365
/* 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
366
#define MMC_PART_RPMB           3       /* RPMB partition number */
367

Ashok Reddy Soma's avatar
Ashok Reddy Soma committed
368
369
370
371
372
373
374
375
376
377
378
379
380
/* timing specification used */
#define MMC_TIMING_LEGACY	0
#define MMC_TIMING_MMC_HS	1
#define MMC_TIMING_SD_HS	2
#define MMC_TIMING_UHS_SDR12	3
#define MMC_TIMING_UHS_SDR25	4
#define MMC_TIMING_UHS_SDR50	5
#define MMC_TIMING_UHS_SDR104	6
#define MMC_TIMING_UHS_DDR50	7
#define MMC_TIMING_MMC_DDR52	8
#define MMC_TIMING_MMC_HS200	9
#define MMC_TIMING_MMC_HS400	10

Simon Glass's avatar
Simon Glass committed
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
/* 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
397
 * Return: associated mmc struct pointer if available, else NULL
Simon Glass's avatar
Simon Glass committed
398
 */
399
struct mmc *mmc_get_mmc_dev(const struct udevice *dev);
Simon Glass's avatar
Simon Glass committed
400
401
402

/* End of driver model support */

403
404
405
406
407
408
409
410
411
struct mmc_cid {
	unsigned long psn;
	unsigned short oid;
	unsigned char mid;
	unsigned char prv;
	unsigned char mdt;
	char pnm[7];
};

Andy Fleming's avatar
Andy Fleming committed
412
413
414
415
struct mmc_cmd {
	ushort cmdidx;
	uint resp_type;
	uint cmdarg;
416
	uint response[4];
Andy Fleming's avatar
Andy Fleming committed
417
418
419
420
421
422
423
424
425
426
427
428
};

struct mmc_data {
	union {
		char *dest;
		const char *src; /* src buffers don't get written to */
	};
	uint flags;
	uint blocks;
	uint blocksize;
};

429
430
431
/* forward decl. */
struct mmc;

Simon Glass's avatar
Simon Glass committed
432
#if CONFIG_IS_ENABLED(DM_MMC)
433
struct dm_mmc_ops {
Faiz Abbas's avatar
Faiz Abbas committed
434
435
436
437
438
439
440
441
	/**
	 * deferred_probe() - Some configurations that need to be deferred
	 * to just before enumerating the device
	 *
	 * @dev:	Device to init
	 * @return 0 if Ok, -ve if error
	 */
	int (*deferred_probe)(struct udevice *dev);
Yangbo Lu's avatar
Yangbo Lu committed
442
443
444
445
446
447
448
449
	/**
	 * reinit() - Re-initialization to clear old configuration for
	 * mmc rescan.
	 *
	 * @dev:	Device to reinit
	 * @return 0 if Ok, -ve if error
	 */
	int (*reinit)(struct udevice *dev);
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
	/**
	 * 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);
484

485
#ifdef MMC_SUPPORTS_TUNING
486
487
488
489
490
491
492
493
	/**
	 * execute_tuning() - Start the tuning process
	 *
	 * @dev:	Device to start the tuning
	 * @opcode:	Command opcode to send
	 * @return 0 if OK, -ve on error
	 */
	int (*execute_tuning)(struct udevice *dev, uint opcode);
494
#endif
495
496
497
498
499
500
501

	/**
	 * wait_dat0() - wait until dat0 is in the target state
	 *		(CLK must be running during the wait)
	 *
	 * @dev:	Device to check
	 * @state:	target state
502
	 * @timeout_us:	timeout in us
503
504
	 * @return 0 if dat0 is in the target state, -ve on error
	 */
505
	int (*wait_dat0)(struct udevice *dev, int state, int timeout_us);
506
507
508
509
510

#if CONFIG_IS_ENABLED(MMC_HS400_ES_SUPPORT)
	/* set_enhanced_strobe() - set HS400 enhanced strobe */
	int (*set_enhanced_strobe)(struct udevice *dev);
#endif
511
512
513
514
515
516
517
518
519
520

	/**
	 * host_power_cycle - host specific tasks in power cycle sequence
	 *		      Called between mmc_power_off() and
	 *		      mmc_power_on()
	 *
	 * @dev:	Device to check
	 * @return 0 if not present, 1 if present, -ve on error
	 */
	int (*host_power_cycle)(struct udevice *dev);
521
522
523
524
525
526
527
528
529
530
531
532
533

	/**
	 * get_b_max - get maximum length of single transfer
	 *	       Called before reading blocks from the card,
	 *	       useful for system which have e.g. DMA limits
	 *	       on various memory ranges.
	 *
	 * @dev:	Device to check
	 * @dst:	Destination buffer in memory
	 * @blkcnt:	Total number of blocks in this transfer
	 * @return maximum number of blocks for this transfer
	 */
	int (*get_b_max)(struct udevice *dev, void *dst, lbaint_t blkcnt);
534
535
536
537
538
539
540
541

	/**
	 * hs400_prepare_ddr - prepare to switch to DDR mode
	 *
	 * @dev:	Device to check
	 * @return 0 if success, -ve on error
	 */
	int (*hs400_prepare_ddr)(struct udevice *dev);
542
543
544
545
546
547
548
549
};

#define mmc_get_ops(dev)        ((struct dm_mmc_ops *)(dev)->driver->ops)

/* Transition functions for compatibility */
int mmc_set_ios(struct mmc *mmc);
int mmc_getcd(struct mmc *mmc);
int mmc_getwp(struct mmc *mmc);
550
int mmc_execute_tuning(struct mmc *mmc, uint opcode);
551
int mmc_wait_dat0(struct mmc *mmc, int state, int timeout_us);
552
int mmc_set_enhanced_strobe(struct mmc *mmc);
553
int mmc_host_power_cycle(struct mmc *mmc);
Faiz Abbas's avatar
Faiz Abbas committed
554
int mmc_deferred_probe(struct mmc *mmc);
Yangbo Lu's avatar
Yangbo Lu committed
555
int mmc_reinit(struct mmc *mmc);
556
int mmc_get_b_max(struct mmc *mmc, void *dst, lbaint_t blkcnt);
557
int mmc_hs400_prepare_ddr(struct mmc *mmc);
558
#else
559
560
561
struct mmc_ops {
	int (*send_cmd)(struct mmc *mmc,
			struct mmc_cmd *cmd, struct mmc_data *data);
562
	int (*set_ios)(struct mmc *mmc);
563
564
565
	int (*init)(struct mmc *mmc);
	int (*getcd)(struct mmc *mmc);
	int (*getwp)(struct mmc *mmc);
566
	int (*host_power_cycle)(struct mmc *mmc);
567
	int (*get_b_max)(struct mmc *mmc, void *dst, lbaint_t blkcnt);
568
	int (*wait_dat0)(struct mmc *mmc, int state, int timeout_us);
569
};
570
571
572
573
574

static inline int mmc_hs400_prepare_ddr(struct mmc *mmc)
{
	return 0;
}
575
#endif
576

577
578
struct mmc_config {
	const char *name;
Simon Glass's avatar
Simon Glass committed
579
#if !CONFIG_IS_ENABLED(DM_MMC)
580
	const struct mmc_ops *ops;
581
#endif
582
583
584
585
586
587
	uint host_caps;
	uint voltages;
	uint f_min;
	uint f_max;
	uint b_max;
	unsigned char part_type;
588
589
590
#ifdef CONFIG_MMC_PWRSEQ
	struct udevice *pwr_dev;
#endif
591
592
};

593
594
595
596
597
598
struct sd_ssr {
	unsigned int au;		/* In sectors */
	unsigned int erase_timeout;	/* In milliseconds */
	unsigned int erase_offset;	/* In milliseconds */
};

Jean-Jacques Hiblot's avatar
Jean-Jacques Hiblot committed
599
600
601
602
enum bus_mode {
	MMC_LEGACY,
	MMC_HS,
	SD_HS,
603
604
	MMC_HS_52,
	MMC_DDR_52,
Jean-Jacques Hiblot's avatar
Jean-Jacques Hiblot committed
605
606
607
608
	UHS_SDR12,
	UHS_SDR25,
	UHS_SDR50,
	UHS_DDR50,
609
	UHS_SDR104,
Jean-Jacques Hiblot's avatar
Jean-Jacques Hiblot committed
610
	MMC_HS_200,
Peng Fan's avatar
Peng Fan committed
611
	MMC_HS_400,
612
	MMC_HS_400_ES,
Jean-Jacques Hiblot's avatar
Jean-Jacques Hiblot committed
613
614
615
616
	MMC_MODES_END
};

const char *mmc_mode_name(enum bus_mode mode);
617
void mmc_dump_capabilities(const char *text, uint caps);
Jean-Jacques Hiblot's avatar
Jean-Jacques Hiblot committed
618

619
620
static inline bool mmc_is_mode_ddr(enum bus_mode mode)
{
621
622
623
624
	if (mode == MMC_DDR_52)
		return true;
#if CONFIG_IS_ENABLED(MMC_UHS_SUPPORT)
	else if (mode == UHS_DDR50)
625
		return true;
Peng Fan's avatar
Peng Fan committed
626
627
628
629
#endif
#if CONFIG_IS_ENABLED(MMC_HS400_SUPPORT)
	else if (mode == MMC_HS_400)
		return true;
630
631
632
633
#endif
#if CONFIG_IS_ENABLED(MMC_HS400_ES_SUPPORT)
	else if (mode == MMC_HS_400_ES)
		return true;
634
#endif
635
636
637
638
	else
		return false;
}

639
640
641
642
643
644
#define UHS_CAPS (MMC_CAP(UHS_SDR12) | MMC_CAP(UHS_SDR25) | \
		  MMC_CAP(UHS_SDR50) | MMC_CAP(UHS_SDR104) | \
		  MMC_CAP(UHS_DDR50))

static inline bool supports_uhs(uint caps)
{
645
#if CONFIG_IS_ENABLED(MMC_UHS_SUPPORT)
646
	return (caps & UHS_CAPS) ? true : false;
647
648
649
#else
	return false;
#endif
650
651
}

652
653
654
655
656
657
/*
 * 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
 */
Andy Fleming's avatar
Andy Fleming committed
658
struct mmc {
659
#if !CONFIG_IS_ENABLED(BLK)
Andy Fleming's avatar
Andy Fleming committed
660
	struct list_head link;
661
#endif
662
	const struct mmc_config *cfg;	/* provided configuration */
Andy Fleming's avatar
Andy Fleming committed
663
	uint version;
664
	void *priv;
665
	uint has_init;
Andy Fleming's avatar
Andy Fleming committed
666
	int high_capacity;
667
	bool clk_disable; /* true if the clock can be turned off */
Andy Fleming's avatar
Andy Fleming committed
668
669
	uint bus_width;
	uint clock;
Faiz Abbas's avatar
Faiz Abbas committed
670
	uint saved_clock;
671
	enum mmc_voltage signal_voltage;
Andy Fleming's avatar
Andy Fleming committed
672
	uint card_caps;
673
	uint host_caps;
Andy Fleming's avatar
Andy Fleming committed
674
	uint ocr;
Markus Niebel's avatar
Markus Niebel committed
675
676
	uint dsr;
	uint dsr_imp;
Andy Fleming's avatar
Andy Fleming committed
677
678
	uint scr[2];
	uint csd[4];
679
	uint cid[4];
Andy Fleming's avatar
Andy Fleming committed
680
	ushort rca;
681
682
	u8 part_support;
	u8 part_attr;
683
	u8 wr_rel_set;
684
	u8 part_config;
685
686
	u8 gen_cmd6_time;	/* units: 10 ms */
	u8 part_switch_time;	/* units: 10 ms */
Andy Fleming's avatar
Andy Fleming committed
687
	uint tran_speed;
Jean-Jacques Hiblot's avatar
Jean-Jacques Hiblot committed
688
	uint legacy_speed; /* speed for the legacy mode provided by the card */
Andy Fleming's avatar
Andy Fleming committed
689
	uint read_bl_len;
690
#if CONFIG_IS_ENABLED(MMC_WRITE)
Andy Fleming's avatar
Andy Fleming committed
691
	uint write_bl_len;
692
	uint erase_grp_size;	/* in 512-byte sectors */
693
#endif
694
#if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
695
	uint hc_wp_grp_size;	/* in 512-byte sectors */
696
#endif
697
#if CONFIG_IS_ENABLED(MMC_WRITE)
698
	struct sd_ssr	ssr;	/* SD status register */
699
#endif
Andy Fleming's avatar
Andy Fleming committed
700
	u64 capacity;
701
702
703
704
	u64 capacity_user;
	u64 capacity_boot;
	u64 capacity_rpmb;
	u64 capacity_gp[4];
705
#ifndef CONFIG_SPL_BUILD
706
707
	u64 enh_user_start;
	u64 enh_user_size;
708
#endif
709
#if !CONFIG_IS_ENABLED(BLK)
710
	struct blk_desc block_dev;
711
#endif
712
713
714
	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 */
715
	int ddr_mode;
716
#if CONFIG_IS_ENABLED(DM_MMC)
717
	struct udevice *dev;	/* Device for this MMC controller */
718
719
720
721
#if CONFIG_IS_ENABLED(DM_REGULATOR)
	struct udevice *vmmc_supply;	/* Main voltage regulator (Vcc)*/
	struct udevice *vqmmc_supply;	/* IO voltage regulator (Vccq)*/
#endif
722
#endif
723
	u8 *ext_csd;
724
725
	u32 cardtype;		/* cardtype read from the MMC */
	enum mmc_voltage current_voltage;
726
727
728
729
730
731
	enum bus_mode selected_mode; /* mode currently used */
	enum bus_mode best_mode; /* best mode is the supported mode with the
				  * highest bandwidth. It may not always be the
				  * operating mode due to limitations when
				  * accessing the boot partitions
				  */
732
	u32 quirks;
Yangbo Lu's avatar
Yangbo Lu committed
733
	u8 hs400_tuning;
734
735

	enum bus_mode user_speed_mode; /* input speed mode from user */
Andy Fleming's avatar
Andy Fleming committed
736
737
};

738
739
740
741
742
743
#if CONFIG_IS_ENABLED(DM_MMC)
#define mmc_to_dev(_mmc)	_mmc->dev
#else
#define mmc_to_dev(_mmc)	NULL
#endif

744
745
746
747
struct mmc_hwpart_conf {
	struct {
		uint enh_start;	/* in 512-byte sectors */
		uint enh_size;	/* in 512-byte sectors, if 0 no enh area */
748
749
		unsigned wr_rel_change : 1;
		unsigned wr_rel_set : 1;
750
751
752
	} user;
	struct {
		uint size;	/* in 512-byte sectors */
753
754
755
		unsigned enhanced : 1;
		unsigned wr_rel_change : 1;
		unsigned wr_rel_set : 1;
756
757
758
759
760
761
762
763
764
	} gp_part[4];
};

enum mmc_hwpart_conf_mode {
	MMC_HWPART_CONF_CHECK,
	MMC_HWPART_CONF_SET,
	MMC_HWPART_CONF_COMPLETE,
};

765
struct mmc *mmc_create(const struct mmc_config *cfg, void *priv);
766
767
768
769

/**
 * mmc_bind() - Set up a new MMC device ready for probing
 *
770
 * A child block device is bound with the UCLASS_MMC interface type. This
771
772
773
774
775
 * allows the device to be used with CONFIG_BLK
 *
 * @dev:	MMC device to set up
 * @mmc:	MMC struct
 * @cfg:	MMC configuration
776
 * Return: 0 if OK, -ve on error
777
778
779
 */
int mmc_bind(struct udevice *dev, struct mmc *mmc,
	     const struct mmc_config *cfg);
780
void mmc_destroy(struct mmc *mmc);
781
782
783
784
785

/**
 * mmc_unbind() - Unbind a MMC device's child block device
 *
 * @dev:	MMC device
786
 * Return: 0 if OK, -ve on error
787
788
 */
int mmc_unbind(struct udevice *dev);
789
int mmc_initialize(struct bd_info *bis);
790
int mmc_init_device(int num);
Andy Fleming's avatar
Andy Fleming committed
791
int mmc_init(struct mmc *mmc);
792
int mmc_send_tuning(struct mmc *mmc, u32 opcode, int *cmd_error);
793
int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data);
794
795
int mmc_deinit(struct mmc *mmc);

796
797
798
799
800
/**
 * mmc_of_parse() - Parse the device tree to get the capabilities of the host
 *
 * @dev:	MMC device
 * @cfg:	MMC configuration
801
 * Return: 0 if OK, -ve on error
802
803
804
 */
int mmc_of_parse(struct udevice *dev, struct mmc_config *cfg);

805
806
807
808
809
810
#ifdef CONFIG_MMC_PWRSEQ
/**
 * mmc_pwrseq_get_power() - get a power device from device tree
 *
 * @dev:	MMC device
 * @cfg:	MMC configuration
811
 * Return: 0 if OK, -ve on error
812
813
814
815
 */
int mmc_pwrseq_get_power(struct udevice *dev, struct mmc_config *cfg);
#endif

Andy Fleming's avatar
Andy Fleming committed
816
int mmc_read(struct mmc *mmc, u64 src, uchar *dst, int size);
817

818
819
820
821
/**
 * mmc_voltage_to_mv() - Convert a mmc_voltage in mV
 *
 * @voltage:	The mmc_voltage to convert
822
 * Return: the value in mV if OK, -EINVAL on error (invalid mmc_voltage value)
823
824
825
 */
int mmc_voltage_to_mv(enum mmc_voltage voltage);

826
827
828
829
830
/**
 * mmc_set_clock() - change the bus clock
 * @mmc:	MMC struct
 * @clock:	bus frequency in Hz
 * @disable:	flag indicating if the clock must on or off
831
 * Return: 0 if OK, -ve on error
832
833
834
 */
int mmc_set_clock(struct mmc *mmc, uint clock, bool disable);

835
836
837
#define MMC_CLK_ENABLE		false
#define MMC_CLK_DISABLE		true

Andy Fleming's avatar
Andy Fleming committed
838
struct mmc *find_mmc_device(int dev_num);
839
int mmc_set_dev(int dev_num);
Andy Fleming's avatar
Andy Fleming committed
840
void print_mmc_devices(char separator);
841
842
843
844

/**
 * get_mmc_num() - get the total MMC device number
 *
845
 * Return: 0 if there is no MMC device, else the number of devices
846
 */
847
int get_mmc_num(void);
848
int mmc_switch_part(struct mmc *mmc, unsigned int part_num);
849
850
int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
		      enum mmc_hwpart_conf_mode mode);
851

Simon Glass's avatar
Simon Glass committed
852
#if !CONFIG_IS_ENABLED(DM_MMC)
853
int mmc_getcd(struct mmc *mmc);
854
int board_mmc_getcd(struct mmc *mmc);
855
int mmc_getwp(struct mmc *mmc);
856
int board_mmc_getwp(struct mmc *mmc);
857
858
#endif

Markus Niebel's avatar
Markus Niebel committed
859
int mmc_set_dsr(struct mmc *mmc, u16 val);
860
861
862
/* 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);
863
864
/* 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);
865
866
/* 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);
867
868
/* Function to modify the RST_n_FUNCTION field of EXT_CSD */
int mmc_set_rst_n_function(struct mmc *mmc, u8 enable);
869
870
871
872
873
874
875
/* 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);
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894

/**
 * mmc_rpmb_route_frames() - route RPMB data frames
 * @mmc		Pointer to a MMC device struct
 * @req		Request data frames
 * @reqlen	Length of data frames in bytes
 * @rsp		Supplied buffer for response data frames
 * @rsplen	Length of supplied buffer for response data frames
 *
 * The RPMB data frames are routed to/from some external entity, for
 * example a Trusted Exectuion Environment in an arm TrustZone protected
 * secure world. It's expected that it's the external entity who is in
 * control of the RPMB key.
 *
 * Returns 0 on success, < 0 on error.
 */
int mmc_rpmb_route_frames(struct mmc *mmc, void *req, unsigned long reqlen,
			  void *rsp, unsigned long rsplen);

Tomas Melin's avatar
Tomas Melin committed
895
896
897
898
#ifdef CONFIG_CMD_BKOPS_ENABLE
int mmc_set_bkops_enable(struct mmc *mmc);
#endif

899
900
901
902
903
904
/**
 * Start device initialization and return immediately; it does not block on
 * polling OCR (operation condition register) status. Useful for checking
 * the presence of SD/eMMC when no card detect logic is available.
 *
 * @param mmc	Pointer to a MMC device struct
905
 * @param quiet	Be quiet, do not print error messages when card is not detected.
906
 * Return: 0 on success, <0 on error.
907
 */
908
int mmc_get_op_cond(struct mmc *mmc, bool quiet);
909

910
911
912
913
914
915
916
/**
 * 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
917
 * Return: 0 on success, <0 on error.
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
 */
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);

935
#ifdef CONFIG_MMC_SPI
936
#define mmc_host_is_spi(mmc)	((mmc)->cfg->host_caps & MMC_MODE_SPI)
937
938
939
#else
#define mmc_host_is_spi(mmc)	0
#endif
940

Sean Anderson's avatar
Sean Anderson committed
941
942
#define mmc_dev(x)	((x)->dev)

943
void board_mmc_power_init(void);
944
945
int board_mmc_init(struct bd_info *bis);
int cpu_mmc_init(struct bd_info *bis);
946
int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr);
947
948
949
# ifdef CONFIG_SYS_MMC_ENV_PART
extern uint mmc_get_env_part(struct mmc *mmc);
# endif
950
int mmc_get_env_dev(void);
951

952
953
954
/* Minimum partition switch timeout in units of 10-milliseconds */
#define MMC_MIN_PART_SWITCH_TIME	30 /* 300 ms */

955
956
957
958
/**
 * mmc_get_blk_desc() - Get the block descriptor for an MMC device
 *
 * @mmc:	MMC device
959
 * Return: block descriptor if found, else NULL
960
961
962
 */
struct blk_desc *mmc_get_blk_desc(struct mmc *mmc);

963
964
965
966
967
968
969
970
971
972
/**
 * mmc_get_blk() - Get the block device for an MMC device
 *
 * @dev:	MMC device
 * @blkp:	Returns pointer to probed block device on sucesss
 *
 * Return: 0 on success, -ve on error
 */
int mmc_get_blk(struct udevice *dev, struct udevice **blkp);

973
974
975
976
977
978
979
980
981
982
983
/**
 * mmc_send_ext_csd() - read the extended CSD register
 *
 * @mmc:	MMC device
 * @ext_csd	a cache aligned buffer of length MMC_MAX_BLOCK_LEN allocated by
 *		the caller, e.g. using
 *		ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN)
 * Return:	0 for success
 */
int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd);

984
985
986
987
988
989
990
991
992
/**
 * mmc_boot_wp() - power on write protect boot partitions
 *
 * The boot partitions are write protected until the next power cycle.
 *
 * Return:	0 for success
 */
int mmc_boot_wp(struct mmc *mmc);

993
994
995
996
997
998
999
1000
/**
 * mmc_boot_wp_single_partition() - set write protection to a boot partition.
 *
 * This function sets a single boot partition to protect and leave the
 * other partition writable.
 *
 * @param mmc the mmc device.
 * @param partition 0 - first boot partition, 1 - second boot partition.
For faster browsing, not all history is shown. View entire blame