diff options
author | Pierre Ossman <drzeus@drzeus.cx> | 2008-06-28 12:28:51 -0400 |
---|---|---|
committer | Pierre Ossman <drzeus@drzeus.cx> | 2008-07-15 08:14:44 -0400 |
commit | 2134a922c6e75c779983cad5d8aae832275f5a0d (patch) | |
tree | fb77a7a82cc62c9e788044cc7117b2cd72368c15 /drivers/mmc/host/sdhci-pci.c | |
parent | 93fc48c785f6266e67663b3cbbf24579b53fe5cf (diff) |
sdhci: scatter-gather (ADMA) support
Add support for the scatter-gather DMA mode present on newer controllers.
As the mode requires 32-bit alignment, non-aligned chunks are handled by
using a bounce buffer.
Also add some new quirks to handle controllers that have bugs in the
ADMA engine.
Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Diffstat (limited to 'drivers/mmc/host/sdhci-pci.c')
-rw-r--r-- | drivers/mmc/host/sdhci-pci.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index 0716dcffd511..deb607c52c0d 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c | |||
@@ -142,6 +142,7 @@ static int jmicron_probe(struct sdhci_pci_chip *chip) | |||
142 | if (chip->pdev->revision == 0) { | 142 | if (chip->pdev->revision == 0) { |
143 | chip->quirks |= SDHCI_QUIRK_32BIT_DMA_ADDR | | 143 | chip->quirks |= SDHCI_QUIRK_32BIT_DMA_ADDR | |
144 | SDHCI_QUIRK_32BIT_DMA_SIZE | | 144 | SDHCI_QUIRK_32BIT_DMA_SIZE | |
145 | SDHCI_QUIRK_32BIT_ADMA_SIZE | | ||
145 | SDHCI_QUIRK_RESET_AFTER_REQUEST; | 146 | SDHCI_QUIRK_RESET_AFTER_REQUEST; |
146 | } | 147 | } |
147 | 148 | ||
@@ -206,6 +207,22 @@ static void jmicron_enable_mmc(struct sdhci_host *host, int on) | |||
206 | 207 | ||
207 | static int jmicron_probe_slot(struct sdhci_pci_slot *slot) | 208 | static int jmicron_probe_slot(struct sdhci_pci_slot *slot) |
208 | { | 209 | { |
210 | if (slot->chip->pdev->revision == 0) { | ||
211 | u16 version; | ||
212 | |||
213 | version = readl(slot->host->ioaddr + SDHCI_HOST_VERSION); | ||
214 | version = (version & SDHCI_VENDOR_VER_MASK) >> | ||
215 | SDHCI_VENDOR_VER_SHIFT; | ||
216 | |||
217 | /* | ||
218 | * Older versions of the chip have lots of nasty glitches | ||
219 | * in the ADMA engine. It's best just to avoid it | ||
220 | * completely. | ||
221 | */ | ||
222 | if (version < 0xAC) | ||
223 | slot->host->quirks |= SDHCI_QUIRK_BROKEN_ADMA; | ||
224 | } | ||
225 | |||
209 | /* | 226 | /* |
210 | * The secondary interface requires a bit set to get the | 227 | * The secondary interface requires a bit set to get the |
211 | * interrupts. | 228 | * interrupts. |