Commit 98608076 authored by Pierre Ossman's avatar Pierre Ossman Committed by Russell King

[MMC] sdhci: force DMA on some controllers

Some controllers incorrectly report that the cannot do DMA.  Forcefully enable
it for those that we know it works fine on.
Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 645289dc
...@@ -33,6 +33,7 @@ static unsigned int debug_forcedma = 0; ...@@ -33,6 +33,7 @@ static unsigned int debug_forcedma = 0;
static unsigned int debug_quirks = 0; static unsigned int debug_quirks = 0;
#define SDHCI_QUIRK_CLOCK_BEFORE_RESET (1<<0) #define SDHCI_QUIRK_CLOCK_BEFORE_RESET (1<<0)
#define SDHCI_QUIRK_FORCE_DMA (1<<1)
static const struct pci_device_id pci_ids[] __devinitdata = { static const struct pci_device_id pci_ids[] __devinitdata = {
{ {
...@@ -40,7 +41,24 @@ static const struct pci_device_id pci_ids[] __devinitdata = { ...@@ -40,7 +41,24 @@ static const struct pci_device_id pci_ids[] __devinitdata = {
.device = PCI_DEVICE_ID_RICOH_R5C822, .device = PCI_DEVICE_ID_RICOH_R5C822,
.subvendor = PCI_VENDOR_ID_IBM, .subvendor = PCI_VENDOR_ID_IBM,
.subdevice = PCI_ANY_ID, .subdevice = PCI_ANY_ID,
.driver_data = SDHCI_QUIRK_CLOCK_BEFORE_RESET, .driver_data = SDHCI_QUIRK_CLOCK_BEFORE_RESET |
SDHCI_QUIRK_FORCE_DMA,
},
{
.vendor = PCI_VENDOR_ID_RICOH,
.device = PCI_DEVICE_ID_RICOH_R5C822,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
.driver_data = SDHCI_QUIRK_FORCE_DMA,
},
{
.vendor = PCI_VENDOR_ID_TI,
.device = PCI_DEVICE_ID_TI_XX21_XX11_SD,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
.driver_data = SDHCI_QUIRK_FORCE_DMA,
}, },
{ /* Generic SD host controller */ { /* Generic SD host controller */
...@@ -1190,7 +1208,9 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot) ...@@ -1190,7 +1208,9 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
else if (debug_forcedma) { else if (debug_forcedma) {
DBG("DMA forced on\n"); DBG("DMA forced on\n");
host->flags |= SDHCI_USE_DMA; host->flags |= SDHCI_USE_DMA;
} else if ((pdev->class & 0x0000FF) != PCI_SDHCI_IFDMA) } else if (chip->quirks & SDHCI_QUIRK_FORCE_DMA)
host->flags |= SDHCI_USE_DMA;
else if ((pdev->class & 0x0000FF) != PCI_SDHCI_IFDMA)
DBG("Controller doesn't have DMA interface\n"); DBG("Controller doesn't have DMA interface\n");
else if (!(caps & SDHCI_CAN_DO_DMA)) else if (!(caps & SDHCI_CAN_DO_DMA))
DBG("Controller doesn't have DMA capability\n"); DBG("Controller doesn't have DMA capability\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment