diff options
author | Arindam Nath <arindam.nath@amd.com> | 2011-05-05 02:49:07 -0400 |
---|---|---|
committer | Chris Ball <cjb@laptop.org> | 2011-05-24 23:53:48 -0400 |
commit | cf2b5eea1ea0ff9b3184bc6771bcb93a9fdcd1d9 (patch) | |
tree | 36288f760fb7556952f8365c3c0cad6b445b04f6 /include | |
parent | c3ed3877625f10d600b0eca2ca48a68c46aed660 (diff) |
mmc: sdhci: add support for retuning mode 1
Host Controller v3.00 can support retuning modes 1,2 or 3 depending on
the bits 46-47 of the Capabilities register. Also, the timer count for
retuning is indicated by bits 40-43 of the same register. We initialize
timer_list for retuning the first time we execute tuning procedure. This
condition is indicated by SDHCI_NEEDS_RETUNING not being set. Since
retuning mode 1 sets a limit of 4MB on the maximum data length, we set
max_blk_count appropriately. Once the tuning timer expires, we set
SDHCI_NEEDS_RETUNING flag, and if the flag is set, we execute tuning
procedure before sending the next command. We need to restore mmc_request
structure after executing retuning procedure since host->mrq is used
inside the procedure to send CMD19. We also disable and re-enable this
flag during suspend and resume respectively, as per the spec v3.00.
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')
-rw-r--r-- | include/linux/mmc/sdhci.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index a88a799ed7c3..e902618d68f4 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h | |||
@@ -112,6 +112,7 @@ struct sdhci_host { | |||
112 | #define SDHCI_REQ_USE_DMA (1<<2) /* Use DMA for this req. */ | 112 | #define SDHCI_REQ_USE_DMA (1<<2) /* Use DMA for this req. */ |
113 | #define SDHCI_DEVICE_DEAD (1<<3) /* Device unresponsive */ | 113 | #define SDHCI_DEVICE_DEAD (1<<3) /* Device unresponsive */ |
114 | #define SDHCI_SDR50_NEEDS_TUNING (1<<4) /* SDR50 needs tuning */ | 114 | #define SDHCI_SDR50_NEEDS_TUNING (1<<4) /* SDR50 needs tuning */ |
115 | #define SDHCI_NEEDS_RETUNING (1<<5) /* Host needs retuning */ | ||
115 | 116 | ||
116 | unsigned int version; /* SDHCI spec. version */ | 117 | unsigned int version; /* SDHCI spec. version */ |
117 | 118 | ||
@@ -152,6 +153,11 @@ struct sdhci_host { | |||
152 | wait_queue_head_t buf_ready_int; /* Waitqueue for Buffer Read Ready interrupt */ | 153 | wait_queue_head_t buf_ready_int; /* Waitqueue for Buffer Read Ready interrupt */ |
153 | unsigned int tuning_done; /* Condition flag set when CMD19 succeeds */ | 154 | unsigned int tuning_done; /* Condition flag set when CMD19 succeeds */ |
154 | 155 | ||
156 | unsigned int tuning_count; /* Timer count for re-tuning */ | ||
157 | unsigned int tuning_mode; /* Re-tuning mode supported by host */ | ||
158 | #define SDHCI_TUNING_MODE_1 0 | ||
159 | struct timer_list tuning_timer; /* Timer for tuning */ | ||
160 | |||
155 | unsigned long private[0] ____cacheline_aligned; | 161 | unsigned long private[0] ____cacheline_aligned; |
156 | }; | 162 | }; |
157 | #endif /* __SDHCI_H */ | 163 | #endif /* __SDHCI_H */ |