diff options
Diffstat (limited to 'drivers/pci/quirks.c')
| -rw-r--r-- | drivers/pci/quirks.c | 25 | 
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index e8a140669f90..1196f61a4ab6 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -2758,9 +2758,34 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev)  	dev_notice(&dev->dev, "proprietary Ricoh MMC controller disabled (via firewire function)\n");  	dev_notice(&dev->dev, "MMC cards are now supported by standard SDHCI controller\n"); + +	/* +	 * RICOH 0xe823 SD/MMC card reader fails to recognize +	 * certain types of SD/MMC cards. Lowering the SD base +	 * clock frequency from 200Mhz to 50Mhz fixes this issue. +	 * +	 * 0x150 - SD2.0 mode enable for changing base clock +	 *	   frequency to 50Mhz +	 * 0xe1  - Base clock frequency +	 * 0x32  - 50Mhz new clock frequency +	 * 0xf9  - Key register for 0x150 +	 * 0xfc  - key register for 0xe1 +	 */ +	if (dev->device == PCI_DEVICE_ID_RICOH_R5CE823) { +		pci_write_config_byte(dev, 0xf9, 0xfc); +		pci_write_config_byte(dev, 0x150, 0x10); +		pci_write_config_byte(dev, 0xf9, 0x00); +		pci_write_config_byte(dev, 0xfc, 0x01); +		pci_write_config_byte(dev, 0xe1, 0x32); +		pci_write_config_byte(dev, 0xfc, 0x00); + +		dev_notice(&dev->dev, "MMC controller base frequency changed to 50Mhz.\n"); +	}  }  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832);  DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832); +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832);  #endif /*CONFIG_MMC_RICOH_MMC*/  #if defined(CONFIG_DMAR) || defined(CONFIG_INTR_REMAP)  |