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

#ifndef _MMC_H_
#define _MMC_H_

Andy Fleming's avatar
Andy Fleming committed
13
#include <linux/list.h>
14
#include <linux/compiler.h>
Mateusz Zalega's avatar
Mateusz Zalega committed
15
#include <part.h>
Andy Fleming's avatar
Andy Fleming committed
16

17 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
/* 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)
Stefan Wahren's avatar
Stefan Wahren committed
52
#define MMC_VERSION_5_1		MAKE_MMC_VERSION(5, 1, 0)
Andy Fleming's avatar
Andy Fleming committed
53

54 55 56 57 58
#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)
59
#define MMC_MODE_DDR_52MHz	(1 << 5)
60

Andy Fleming's avatar
Andy Fleming committed
61 62
#define SD_DATA_4BIT	0x00040000

63
#define IS_SD(x)	((x)->version & SD_VERSION_SD)
64
#define IS_MMC(x)	((x)->version & MMC_VERSION_MMC)
Andy Fleming's avatar
Andy Fleming committed
65 66 67 68

#define MMC_DATA_READ		1
#define MMC_DATA_WRITE		2

69 70 71 72 73
#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
74
#define MMC_CMD_SWITCH			6
75
#define MMC_CMD_SELECT_CARD		7
Andy Fleming's avatar
Andy Fleming committed
76
#define MMC_CMD_SEND_EXT_CSD		8
77 78
#define MMC_CMD_SEND_CSD		9
#define MMC_CMD_SEND_CID		10
Andy Fleming's avatar
Andy Fleming committed
79
#define MMC_CMD_STOP_TRANSMISSION	12
80 81 82 83
#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
84
#define MMC_CMD_SET_BLOCK_COUNT         23
Andy Fleming's avatar
Andy Fleming committed
85 86
#define MMC_CMD_WRITE_SINGLE_BLOCK	24
#define MMC_CMD_WRITE_MULTIPLE_BLOCK	25
87 88 89
#define MMC_CMD_ERASE_GROUP_START	35
#define MMC_CMD_ERASE_GROUP_END		36
#define MMC_CMD_ERASE			38
90
#define MMC_CMD_APP_CMD			55
91 92
#define MMC_CMD_SPI_READ_OCR		58
#define MMC_CMD_SPI_CRC_ON_OFF		59
93 94 95 96 97
#define MMC_CMD_RES_MAN			62

#define MMC_CMD62_ARG1			0xefac62ec
#define MMC_CMD62_ARG2			0xcbaea7

98 99

#define SD_CMD_SEND_RELATIVE_ADDR	3
Andy Fleming's avatar
Andy Fleming committed
100
#define SD_CMD_SWITCH_FUNC		6
101
#define SD_CMD_SEND_IF_COND		8
102
#define SD_CMD_SWITCH_UHS18V		11
103 104

#define SD_CMD_APP_SET_BUS_WIDTH	6
105 106
#define SD_CMD_ERASE_WR_BLK_START	32
#define SD_CMD_ERASE_WR_BLK_END		33
107
#define SD_CMD_APP_SEND_OP_COND		41
Andy Fleming's avatar
Andy Fleming committed
108 109 110 111 112 113
#define SD_CMD_APP_SEND_SCR		51

/* SCR definitions in different words */
#define SD_HIGHSPEED_BUSY	0x00020000
#define SD_HIGHSPEED_SUPPORTED	0x00020000

114 115
#define OCR_BUSY		0x80000000
#define OCR_HCS			0x40000000
116 117
#define OCR_VOLTAGE_MASK	0x007FFF80
#define OCR_ACCESS_MODE		0x60000000
Andy Fleming's avatar
Andy Fleming committed
118

119 120 121 122 123 124
#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
125

126
#define MMC_STATUS_MASK		(~0x0206BF7F)
127
#define MMC_STATUS_SWITCH_ERROR	(1 << 7)
128 129
#define MMC_STATUS_RDY_FOR_DATA (1 << 8)
#define MMC_STATUS_CURR_STATE	(0xf << 9)
130
#define MMC_STATUS_ERROR	(1 << 19)
131

132 133
#define MMC_STATE_PRG		(7 << 9)

Andy Fleming's avatar
Andy Fleming committed
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 164 165 166
#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
 */
167 168
#define EXT_CSD_ENH_START_ADDR		136	/* R/W */
#define EXT_CSD_ENH_SIZE_MULT		140	/* R/W */
169
#define EXT_CSD_GP_SIZE_MULT		143	/* R/W */
170
#define EXT_CSD_PARTITION_SETTING	155	/* R/W */
171
#define EXT_CSD_PARTITIONS_ATTRIBUTE	156	/* R/W */
172
#define EXT_CSD_MAX_ENH_SIZE_MULT	157	/* R */
173
#define EXT_CSD_PARTITIONING_SUPPORT	160	/* RO */
174
#define EXT_CSD_RST_N_FUNCTION		162	/* R/W */
175 176
#define EXT_CSD_WR_REL_PARAM		166	/* R */
#define EXT_CSD_WR_REL_SET		167	/* R/W */
177
#define EXT_CSD_RPMB_MULT		168	/* RO */
178
#define EXT_CSD_ERASE_GROUP_DEF		175	/* R/W */
179
#define EXT_CSD_BOOT_BUS_WIDTH		177
180 181 182 183 184 185
#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 */
186
#define EXT_CSD_HC_WP_GRP_SIZE		221	/* RO */
187
#define EXT_CSD_HC_ERASE_GRP_SIZE	224	/* RO */
188
#define EXT_CSD_BOOT_MULT		226	/* RO */
Andy Fleming's avatar
Andy Fleming committed
189 190 191 192 193

/*
 * EXT_CSD field definitions
 */

194 195 196
#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
197

198 199
#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 */
200 201 202 203
#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
204 205 206 207

#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 */
208 209
#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 */
210

211 212 213 214 215 216 217 218 219
#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)

220 221 222
#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)
223

224 225
#define EXT_CSD_PARTITION_SETTING_COMPLETED	(1 << 0)

226 227 228
#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 */

229 230 231 232 233
#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 */

234 235 236
#define R1_ILLEGAL_COMMAND		(1 << 22)
#define R1_APP_CMD			(1 << 5)

Andy Fleming's avatar
Andy Fleming committed
237
#define MMC_RSP_PRESENT (1 << 0)
238 239 240 241
#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
242

243 244
#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
245 246
#define MMC_RSP_R1b	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE| \
			MMC_RSP_BUSY)
247 248 249 250 251 252
#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
253

254 255 256
#define MMCPART_NOAVAILABLE	(0xff)
#define PART_ACCESS_MASK	(0x7)
#define PART_SUPPORT		(0x1)
257
#define ENHNCD_SUPPORT		(0x2)
258
#define PART_ENH_ATTRIB		(0x1f)
259

260 261 262
/* Maximum block size for MMC */
#define MMC_MAX_BLOCK_LEN	512

263 264 265 266
/* 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
267
#define MMC_PART_RPMB           3       /* RPMB partition number */
268

Simon Glass's avatar
Simon Glass committed
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290
/* 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 */

291 292 293 294 295 296 297 298 299
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
300 301 302 303
struct mmc_cmd {
	ushort cmdidx;
	uint resp_type;
	uint cmdarg;
304
	uint response[4];
Andy Fleming's avatar
Andy Fleming committed
305 306 307 308 309 310 311 312 313 314 315 316
};

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

317 318 319
/* forward decl. */
struct mmc;

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 358 359 360 361 362 363 364 365 366 367 368 369 370 371
#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
372 373 374 375 376 377 378 379
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);
};
380
#endif
381

382 383
struct mmc_config {
	const char *name;
384
#ifndef CONFIG_DM_MMC_OPS
385
	const struct mmc_ops *ops;
386
#endif
387 388 389 390 391 392 393 394
	uint host_caps;
	uint voltages;
	uint f_min;
	uint f_max;
	uint b_max;
	unsigned char part_type;
};

395 396 397 398 399 400
/*
 * 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
401
struct mmc {
402
#ifndef CONFIG_BLK
Andy Fleming's avatar
Andy Fleming committed
403
	struct list_head link;
404
#endif
405
	const struct mmc_config *cfg;	/* provided configuration */
Andy Fleming's avatar
Andy Fleming committed
406
	uint version;
407
	void *priv;
408
	uint has_init;
Andy Fleming's avatar
Andy Fleming committed
409 410 411 412 413
	int high_capacity;
	uint bus_width;
	uint clock;
	uint card_caps;
	uint ocr;
Markus Niebel's avatar
Markus Niebel committed
414 415
	uint dsr;
	uint dsr_imp;
Andy Fleming's avatar
Andy Fleming committed
416 417
	uint scr[2];
	uint csd[4];
418
	uint cid[4];
Andy Fleming's avatar
Andy Fleming committed
419
	ushort rca;
420 421
	u8 part_support;
	u8 part_attr;
422
	u8 wr_rel_set;
423
	char part_config;
Andy Fleming's avatar
Andy Fleming committed
424 425 426
	uint tran_speed;
	uint read_bl_len;
	uint write_bl_len;
427
	uint erase_grp_size;	/* in 512-byte sectors */
428
	uint hc_wp_grp_size;	/* in 512-byte sectors */
Andy Fleming's avatar
Andy Fleming committed
429
	u64 capacity;
430 431 432 433
	u64 capacity_user;
	u64 capacity_boot;
	u64 capacity_rpmb;
	u64 capacity_gp[4];
434 435
	u64 enh_user_start;
	u64 enh_user_size;
436
#ifndef CONFIG_BLK
437
	struct blk_desc block_dev;
438
#endif
439 440 441
	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 */
442
	int ddr_mode;
443 444 445
#ifdef CONFIG_DM_MMC
	struct udevice *dev;	/* Device for this MMC controller */
#endif
Andy Fleming's avatar
Andy Fleming committed
446 447
};

448 449 450 451
struct mmc_hwpart_conf {
	struct {
		uint enh_start;	/* in 512-byte sectors */
		uint enh_size;	/* in 512-byte sectors, if 0 no enh area */
452 453
		unsigned wr_rel_change : 1;
		unsigned wr_rel_set : 1;
454 455 456
	} user;
	struct {
		uint size;	/* in 512-byte sectors */
457 458 459
		unsigned enhanced : 1;
		unsigned wr_rel_change : 1;
		unsigned wr_rel_set : 1;
460 461 462 463 464 465 466 467 468
	} gp_part[4];
};

enum mmc_hwpart_conf_mode {
	MMC_HWPART_CONF_CHECK,
	MMC_HWPART_CONF_SET,
	MMC_HWPART_CONF_COMPLETE,
};

469
struct mmc *mmc_create(const struct mmc_config *cfg, void *priv);
470 471 472 473 474 475 476 477 478 479 480 481 482 483

/**
 * 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);
484
void mmc_destroy(struct mmc *mmc);
485 486 487 488 489 490 491 492

/**
 * 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);
Andy Fleming's avatar
Andy Fleming committed
493 494 495
int mmc_initialize(bd_t *bis);
int mmc_init(struct mmc *mmc);
int mmc_read(struct mmc *mmc, u64 src, uchar *dst, int size);
496
void mmc_set_clock(struct mmc *mmc, uint clock);
Andy Fleming's avatar
Andy Fleming committed
497
struct mmc *find_mmc_device(int dev_num);
498
int mmc_set_dev(int dev_num);
Andy Fleming's avatar
Andy Fleming committed
499
void print_mmc_devices(char separator);
500 501 502 503 504 505

/**
 * get_mmc_num() - get the total MMC device number
 *
 * @return 0 if there is no MMC device, else the number of devices
 */
506
int get_mmc_num(void);
507 508
int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
		      enum mmc_hwpart_conf_mode mode);
509 510

#ifndef CONFIG_DM_MMC_OPS
511
int mmc_getcd(struct mmc *mmc);
512
int board_mmc_getcd(struct mmc *mmc);
513
int mmc_getwp(struct mmc *mmc);
514
int board_mmc_getwp(struct mmc *mmc);
515 516
#endif

Markus Niebel's avatar
Markus Niebel committed
517
int mmc_set_dsr(struct mmc *mmc, u16 val);
518 519 520
/* 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);
521 522
/* 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);
523 524
/* 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);
525 526
/* Function to modify the RST_n_FUNCTION field of EXT_CSD */
int mmc_set_rst_n_function(struct mmc *mmc, u8 enable);
527 528 529 530 531 532 533
/* 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);
534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558
/**
 * 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);

559
#ifdef CONFIG_MMC_SPI
560
#define mmc_host_is_spi(mmc)	((mmc)->cfg->host_caps & MMC_MODE_SPI)
561 562 563
#else
#define mmc_host_is_spi(mmc)	0
#endif
564
struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode);
565

566
void board_mmc_power_init(void);
567
int board_mmc_init(bd_t *bis);
568
int cpu_mmc_init(bd_t *bis);
569
int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr);
570
int mmc_get_env_dev(void);
571

572 573 574 575 576 577 578 579
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
580
 * @mmc_supported:	PCI IDs to search for, terminated by {0, 0}
581
 */
582
int pci_mmc_init(const char *name, struct pci_device_id *mmc_supported);
583

584 585 586 587 588
/* 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

589 590 591 592 593 594 595 596
/**
 * 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);

597
#endif /* _MMC_H_ */