mmc: Added quirks for Ricoh 1180:e823 lower base clock frequency
[linux-flexiantxendom0-natty.git] / drivers / pci / quirks.c
index 11962d7..bd73b15 100644 (file)
@@ -2755,6 +2755,29 @@ 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);