diff options
author | Andrei Warkentin <andreiw@motorola.com> | 2011-05-23 16:06:36 -0400 |
---|---|---|
committer | Chris Ball <cjb@laptop.org> | 2011-05-25 16:48:46 -0400 |
commit | d0c97cfb81ebc5b416c0f92fa2fc18d2773e3023 (patch) | |
tree | dbf0fa49bdad896d283a7f392c156483d9687d4b /include/linux/mmc | |
parent | c59de9287993b5c36f9005f745a3ce0b1008131d (diff) |
mmc: core: Use CMD23 for multiblock transfers when we can.
CMD23-prefixed instead of open-ended multiblock transfers
have a performance advantage on some MMC cards.
Signed-off-by: Andrei Warkentin <andreiw@motorola.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'include/linux/mmc')
-rw-r--r-- | include/linux/mmc/card.h | 1 | ||||
-rw-r--r-- | include/linux/mmc/core.h | 1 | ||||
-rw-r--r-- | include/linux/mmc/host.h | 6 | ||||
-rw-r--r-- | include/linux/mmc/mmc.h | 6 |
4 files changed, 14 insertions, 0 deletions
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 7190aa2096f7..4a0e27baaea0 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
@@ -171,6 +171,7 @@ struct mmc_card { | |||
171 | #define MMC_QUIRK_NONSTD_FUNC_IF (1<<4) /* SDIO card has nonstd function interfaces */ | 171 | #define MMC_QUIRK_NONSTD_FUNC_IF (1<<4) /* SDIO card has nonstd function interfaces */ |
172 | #define MMC_QUIRK_DISABLE_CD (1<<5) /* disconnect CD/DAT[3] resistor */ | 172 | #define MMC_QUIRK_DISABLE_CD (1<<5) /* disconnect CD/DAT[3] resistor */ |
173 | #define MMC_QUIRK_INAND_CMD38 (1<<6) /* iNAND devices have broken CMD38 */ | 173 | #define MMC_QUIRK_INAND_CMD38 (1<<6) /* iNAND devices have broken CMD38 */ |
174 | #define MMC_QUIRK_BLK_NO_CMD23 (1<<7) /* Avoid CMD23 for regular multiblock */ | ||
174 | 175 | ||
175 | unsigned int erase_size; /* erase size in sectors */ | 176 | unsigned int erase_size; /* erase size in sectors */ |
176 | unsigned int erase_shift; /* if erase unit is power 2 */ | 177 | unsigned int erase_shift; /* if erase unit is power 2 */ |
diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h index cbe8d55f64c4..b6718e549a51 100644 --- a/include/linux/mmc/core.h +++ b/include/linux/mmc/core.h | |||
@@ -120,6 +120,7 @@ struct mmc_data { | |||
120 | }; | 120 | }; |
121 | 121 | ||
122 | struct mmc_request { | 122 | struct mmc_request { |
123 | struct mmc_command *sbc; /* SET_BLOCK_COUNT for multiblock */ | ||
123 | struct mmc_command *cmd; | 124 | struct mmc_command *cmd; |
124 | struct mmc_data *data; | 125 | struct mmc_data *data; |
125 | struct mmc_command *stop; | 126 | struct mmc_command *stop; |
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index de32e6aa018a..e946bd10fe3f 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
@@ -210,6 +210,7 @@ struct mmc_host { | |||
210 | #define MMC_CAP_MAX_CURRENT_400 (1 << 27) /* Host max current limit is 400mA */ | 210 | #define MMC_CAP_MAX_CURRENT_400 (1 << 27) /* Host max current limit is 400mA */ |
211 | #define MMC_CAP_MAX_CURRENT_600 (1 << 28) /* Host max current limit is 600mA */ | 211 | #define MMC_CAP_MAX_CURRENT_600 (1 << 28) /* Host max current limit is 600mA */ |
212 | #define MMC_CAP_MAX_CURRENT_800 (1 << 29) /* Host max current limit is 800mA */ | 212 | #define MMC_CAP_MAX_CURRENT_800 (1 << 29) /* Host max current limit is 800mA */ |
213 | #define MMC_CAP_CMD23 (1 << 30) /* CMD23 supported. */ | ||
213 | 214 | ||
214 | mmc_pm_flag_t pm_caps; /* supported pm features */ | 215 | mmc_pm_flag_t pm_caps; /* supported pm features */ |
215 | 216 | ||
@@ -366,5 +367,10 @@ static inline int mmc_card_wake_sdio_irq(struct mmc_host *host) | |||
366 | { | 367 | { |
367 | return host->pm_flags & MMC_PM_WAKE_SDIO_IRQ; | 368 | return host->pm_flags & MMC_PM_WAKE_SDIO_IRQ; |
368 | } | 369 | } |
370 | |||
371 | static inline int mmc_host_cmd23(struct mmc_host *host) | ||
372 | { | ||
373 | return host->caps & MMC_CAP_CMD23; | ||
374 | } | ||
369 | #endif | 375 | #endif |
370 | 376 | ||
diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index 9fa5a73f393d..ac26a685cca8 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h | |||
@@ -83,6 +83,12 @@ | |||
83 | #define MMC_APP_CMD 55 /* ac [31:16] RCA R1 */ | 83 | #define MMC_APP_CMD 55 /* ac [31:16] RCA R1 */ |
84 | #define MMC_GEN_CMD 56 /* adtc [0] RD/WR R1 */ | 84 | #define MMC_GEN_CMD 56 /* adtc [0] RD/WR R1 */ |
85 | 85 | ||
86 | static inline bool mmc_op_multi(u32 opcode) | ||
87 | { | ||
88 | return opcode == MMC_WRITE_MULTIPLE_BLOCK || | ||
89 | opcode == MMC_READ_MULTIPLE_BLOCK; | ||
90 | } | ||
91 | |||
86 | /* | 92 | /* |
87 | * MMC_SWITCH argument format: | 93 | * MMC_SWITCH argument format: |
88 | * | 94 | * |