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 /drivers/mmc/core/sd.c | |
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 'drivers/mmc/core/sd.c')
-rw-r--r-- | drivers/mmc/core/sd.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index 8e2d8012e4cb..732c3171ceca 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c | |||
@@ -130,7 +130,7 @@ static int mmc_decode_csd(struct mmc_card *card) | |||
130 | break; | 130 | break; |
131 | case 1: | 131 | case 1: |
132 | /* | 132 | /* |
133 | * This is a block-addressed SDHC card. Most | 133 | * This is a block-addressed SDHC or SDXC card. Most |
134 | * interesting fields are unused and have fixed | 134 | * interesting fields are unused and have fixed |
135 | * values. To avoid getting tripped by buggy cards, | 135 | * values. To avoid getting tripped by buggy cards, |
136 | * we assume those fixed values ourselves. | 136 | * we assume those fixed values ourselves. |
@@ -144,6 +144,11 @@ static int mmc_decode_csd(struct mmc_card *card) | |||
144 | e = UNSTUFF_BITS(resp, 96, 3); | 144 | e = UNSTUFF_BITS(resp, 96, 3); |
145 | csd->max_dtr = tran_exp[e] * tran_mant[m]; | 145 | csd->max_dtr = tran_exp[e] * tran_mant[m]; |
146 | csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); | 146 | csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); |
147 | csd->c_size = UNSTUFF_BITS(resp, 48, 22); | ||
148 | |||
149 | /* SDXC cards have a minimum C_SIZE of 0x00FFFF */ | ||
150 | if (csd->c_size >= 0xFFFF) | ||
151 | mmc_card_set_ext_capacity(card); | ||
147 | 152 | ||
148 | m = UNSTUFF_BITS(resp, 48, 22); | 153 | m = UNSTUFF_BITS(resp, 48, 22); |
149 | csd->capacity = (1 + m) << 10; | 154 | csd->capacity = (1 + m) << 10; |
@@ -911,6 +916,9 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr, | |||
911 | err = mmc_sd_init_uhs_card(card); | 916 | err = mmc_sd_init_uhs_card(card); |
912 | if (err) | 917 | if (err) |
913 | goto free_card; | 918 | goto free_card; |
919 | |||
920 | /* Card is an ultra-high-speed card */ | ||
921 | mmc_sd_card_set_uhs(card); | ||
914 | } else { | 922 | } else { |
915 | /* | 923 | /* |
916 | * Attempt to change to high-speed (if supported) | 924 | * Attempt to change to high-speed (if supported) |