diff options
author | Tom Rini <trini@ti.com> | 2013-05-07 10:09:00 -0400 |
---|---|---|
committer | Tom Rini <trini@ti.com> | 2013-05-07 10:09:00 -0400 |
commit | 7e7501f4bb0d550fbc6960e7e2fb2bc84d9795cf (patch) | |
tree | 10ee78027dbf2d1e6e0d4d454c85d40ef6c7d73c /include | |
parent | 4f4eab4d14b181c3a9447c75fd2b41b9d0d761e4 (diff) | |
parent | 88227a1d8a734cfd09ac43609abec8b66c2d2610 (diff) |
Merge branch 'master' of git://www.denx.de/git/u-boot-mmc
Diffstat (limited to 'include')
-rw-r--r-- | include/mmc.h | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/include/mmc.h b/include/mmc.h index 8bbc6b6ebe..566db59ac9 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -68,6 +68,7 @@ #define UNUSABLE_ERR -17 /* Unusable Card */ #define COMM_ERR -18 /* Communications Error */ #define TIMEOUT -19 +#define IN_PROGRESS -20 /* operation is in progress */ #define MMC_CMD_GO_IDLE_STATE 0 #define MMC_CMD_SEND_OP_COND 1 @@ -270,6 +271,10 @@ struct mmc { int (*getcd)(struct mmc *mmc); int (*getwp)(struct mmc *mmc); uint b_max; + 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 */ + uint op_cond_response; /* the response byte from the last op_cond */ }; int mmc_register(struct mmc *mmc); @@ -287,6 +292,31 @@ int mmc_getcd(struct mmc *mmc); int mmc_getwp(struct mmc *mmc); void spl_mmc_load(void) __noreturn; +/** + * 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); + #ifdef CONFIG_GENERIC_MMC #define mmc_host_is_spi(mmc) ((mmc)->host_caps & MMC_MODE_SPI) struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode); |