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 | * |
