diff options
author | Arindam Nath <arindam.nath@amd.com> | 2011-05-05 02:49:03 -0400 |
---|---|---|
committer | Chris Ball <cjb@laptop.org> | 2011-05-24 23:53:46 -0400 |
commit | 3a3035114307cd55e024662bb295a87b849f0bd4 (patch) | |
tree | 764f881c7a677641abaa211128f27a37c9613d90 /include/linux/mmc | |
parent | 5371c927bcd06a5c9dd6785bab2d452b87d9abc6 (diff) |
mmc: sd: report correct speed and capacity of uhs cards
Since only UHS-I cards respond with S18A set in response to ACMD41,
we set the card as ultra-high-speed after successfull initialization.
We need to decide whether a card is SDXC based on the C_SIZE field
of CSDv2.0 register. According to Physical Layer spec v3.01, the
minimum value of C_SIZE for SDXC card is 00FFFFh.
Tested by Zhangfei Gao with a Toshiba uhs card and general hs card,
on mmp2 in SDMA mode.
Signed-off-by: Arindam Nath <arindam.nath@amd.com>
Reviewed-by: Philip Rakity <prakity@marvell.com>
Tested-by: Philip Rakity <prakity@marvell.com>
Acked-by: Zhangfei Gao <zhangfei.gao@marvell.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'include/linux/mmc')
-rw-r--r-- | include/linux/mmc/card.h | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 47b5ad3960b7..d8dffc992ce2 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
@@ -30,6 +30,7 @@ struct mmc_csd { | |||
30 | unsigned short cmdclass; | 30 | unsigned short cmdclass; |
31 | unsigned short tacc_clks; | 31 | unsigned short tacc_clks; |
32 | unsigned int tacc_ns; | 32 | unsigned int tacc_ns; |
33 | unsigned int c_size; | ||
33 | unsigned int r2w_factor; | 34 | unsigned int r2w_factor; |
34 | unsigned int max_dtr; | 35 | unsigned int max_dtr; |
35 | unsigned int erase_size; /* In sectors */ | 36 | unsigned int erase_size; /* In sectors */ |
@@ -158,6 +159,8 @@ struct mmc_card { | |||
158 | #define MMC_STATE_HIGHSPEED (1<<2) /* card is in high speed mode */ | 159 | #define MMC_STATE_HIGHSPEED (1<<2) /* card is in high speed mode */ |
159 | #define MMC_STATE_BLOCKADDR (1<<3) /* card uses block-addressing */ | 160 | #define MMC_STATE_BLOCKADDR (1<<3) /* card uses block-addressing */ |
160 | #define MMC_STATE_HIGHSPEED_DDR (1<<4) /* card is in high speed mode */ | 161 | #define MMC_STATE_HIGHSPEED_DDR (1<<4) /* card is in high speed mode */ |
162 | #define MMC_STATE_ULTRAHIGHSPEED (1<<5) /* card is in ultra high speed mode */ | ||
163 | #define MMC_CARD_SDXC (1<<6) /* card is SDXC */ | ||
161 | unsigned int quirks; /* card quirks */ | 164 | unsigned int quirks; /* card quirks */ |
162 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ | 165 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ |
163 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ | 166 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ |
@@ -293,12 +296,16 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data) | |||
293 | #define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED) | 296 | #define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED) |
294 | #define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR) | 297 | #define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR) |
295 | #define mmc_card_ddr_mode(c) ((c)->state & MMC_STATE_HIGHSPEED_DDR) | 298 | #define mmc_card_ddr_mode(c) ((c)->state & MMC_STATE_HIGHSPEED_DDR) |
299 | #define mmc_sd_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) | ||
300 | #define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC) | ||
296 | 301 | ||
297 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) | 302 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) |
298 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) | 303 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) |
299 | #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) | 304 | #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) |
300 | #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR) | 305 | #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR) |
301 | #define mmc_card_set_ddr_mode(c) ((c)->state |= MMC_STATE_HIGHSPEED_DDR) | 306 | #define mmc_card_set_ddr_mode(c) ((c)->state |= MMC_STATE_HIGHSPEED_DDR) |
307 | #define mmc_sd_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED) | ||
308 | #define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC) | ||
302 | 309 | ||
303 | static inline int mmc_card_lenient_fn0(const struct mmc_card *c) | 310 | static inline int mmc_card_lenient_fn0(const struct mmc_card *c) |
304 | { | 311 | { |