]> git.sur5r.net Git - u-boot/blobdiff - include/mmc.h
spi: exynos: Support SPI_PREAMBLE mode
[u-boot] / include / mmc.h
index d5b3a9ea383af16169ba417eb43b7f661ab0847a..566db59ac9fdd5e682f5866b34673164e49e8d15 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/compiler.h>
 
 #define SD_VERSION_SD  0x20000
+#define SD_VERSION_3   (SD_VERSION_SD | 0x300)
 #define SD_VERSION_2   (SD_VERSION_SD | 0x200)
 #define SD_VERSION_1_0 (SD_VERSION_SD | 0x100)
 #define SD_VERSION_1_10        (SD_VERSION_SD | 0x10a)
@@ -67,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
 #define PART_ACCESS_MASK       (0x7)
 #define PART_SUPPORT           (0x1)
 
+/* Maximum block size for MMC */
+#define MMC_MAX_BLOCK_LEN      512
+
 struct mmc_cid {
        unsigned long psn;
        unsigned short oid;
@@ -266,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);
@@ -283,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);