Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=1f090bf5245115e404103d35e7f5597bfe653aac
Commit:     1f090bf5245115e404103d35e7f5597bfe653aac
Parent:     488b5ec871191359b9b79262a3d48456dae7ea5f
Author:     Philip Langdale <[EMAIL PROTECTED]>
AuthorDate: Sat Dec 29 00:11:42 2007 -0800
Committer:  Pierre Ossman <[EMAIL PROTECTED]>
CommitDate: Fri Feb 8 09:02:46 2008 +0100

    mmc: Handle suspend/resume in Ricoh MMC disabler
    
    As pci config space is reinitialised on a suspend/resume cycle, the
    disabler needs to work its magic at resume time. For symmetry this
    change also explicitly enables the controller at suspend time but
    it's not strictly necessary.
    
    Signed-off-by: Philipl Langdale <[EMAIL PROTECTED]>
    Signed-off-by: Pierre Ossman <[EMAIL PROTECTED]>
---
 drivers/mmc/host/ricoh_mmc.c |   97 +++++++++++++++++++++++++++++++-----------
 1 files changed, 72 insertions(+), 25 deletions(-)

diff --git a/drivers/mmc/host/ricoh_mmc.c b/drivers/mmc/host/ricoh_mmc.c
index 1e87045..898e799 100644
--- a/drivers/mmc/host/ricoh_mmc.c
+++ b/drivers/mmc/host/ricoh_mmc.c
@@ -41,6 +41,46 @@ static const struct pci_device_id pci_ids[] __devinitdata = {
 
 MODULE_DEVICE_TABLE(pci, pci_ids);
 
+static int ricoh_mmc_disable(struct pci_dev *fw_dev)
+{
+       u8 write_enable;
+       u8 disable;
+
+       pci_read_config_byte(fw_dev, 0xCB, &disable);
+       if (disable & 0x02) {
+               printk(KERN_INFO DRIVER_NAME
+                      ": Controller already disabled. Nothing to do.\n");
+               return -ENODEV;
+       }
+
+       pci_read_config_byte(fw_dev, 0xCA, &write_enable);
+       pci_write_config_byte(fw_dev, 0xCA, 0x57);
+       pci_write_config_byte(fw_dev, 0xCB, disable | 0x02);
+       pci_write_config_byte(fw_dev, 0xCA, write_enable);
+
+       printk(KERN_INFO DRIVER_NAME
+              ": Controller is now disabled.\n");
+
+       return 0;
+}
+
+static int ricoh_mmc_enable(struct pci_dev *fw_dev)
+{
+       u8 write_enable;
+       u8 disable;
+
+       pci_read_config_byte(fw_dev, 0xCA, &write_enable);
+       pci_read_config_byte(fw_dev, 0xCB, &disable);
+       pci_write_config_byte(fw_dev, 0xCA, 0x57);
+       pci_write_config_byte(fw_dev, 0xCB, disable & ~0x02);
+       pci_write_config_byte(fw_dev, 0xCA, write_enable);
+
+       printk(KERN_INFO DRIVER_NAME
+              ": Controller is now re-enabled.\n");
+
+       return 0;
+}
+
 static int __devinit ricoh_mmc_probe(struct pci_dev *pdev,
                                     const struct pci_device_id *ent)
 {
@@ -61,26 +101,12 @@ static int __devinit ricoh_mmc_probe(struct pci_dev *pdev,
        while ((fw_dev = pci_get_device(PCI_VENDOR_ID_RICOH, 
PCI_DEVICE_ID_RICOH_R5C832, fw_dev))) {
                if (PCI_SLOT(pdev->devfn) == PCI_SLOT(fw_dev->devfn) &&
                    pdev->bus == fw_dev->bus) {
-                       u8 write_enable;
-                       u8 disable;
-
-                       pci_read_config_byte(fw_dev, 0xCB, &disable);
-                       if (disable & 0x02) {
-                               printk(KERN_INFO DRIVER_NAME
-                                      ": Controller already disabled. Nothing 
to do.\n");
+                       if (ricoh_mmc_disable(fw_dev) != 0) {
                                return -ENODEV;
                        }
 
-                       pci_read_config_byte(fw_dev, 0xCA, &write_enable);
-                       pci_write_config_byte(fw_dev, 0xCA, 0x57);
-                       pci_write_config_byte(fw_dev, 0xCB, disable | 0x02);
-                       pci_write_config_byte(fw_dev, 0xCA, write_enable);
-
                        pci_set_drvdata(pdev, fw_dev);
 
-                       printk(KERN_INFO DRIVER_NAME
-                              ": Controller is now disabled.\n");
-
                        break;
                }
        }
@@ -96,30 +122,51 @@ static int __devinit ricoh_mmc_probe(struct pci_dev *pdev,
 
 static void __devexit ricoh_mmc_remove(struct pci_dev *pdev)
 {
-       u8 write_enable;
-       u8 disable;
        struct pci_dev *fw_dev = NULL;
 
        fw_dev = pci_get_drvdata(pdev);
        BUG_ON(fw_dev == NULL);
 
-       pci_read_config_byte(fw_dev, 0xCA, &write_enable);
-       pci_read_config_byte(fw_dev, 0xCB, &disable);
-       pci_write_config_byte(fw_dev, 0xCA, 0x57);
-       pci_write_config_byte(fw_dev, 0xCB, disable & ~0x02);
-       pci_write_config_byte(fw_dev, 0xCA, write_enable);
-
-       printk(KERN_INFO DRIVER_NAME
-              ": Controller is now re-enabled.\n");
+       ricoh_mmc_enable(fw_dev);
 
        pci_set_drvdata(pdev, NULL);
 }
 
+static int ricoh_mmc_suspend (struct pci_dev *pdev, pm_message_t state)
+{
+       struct pci_dev *fw_dev = NULL;
+
+       fw_dev = pci_get_drvdata(pdev);
+       BUG_ON(fw_dev == NULL);
+
+       printk(KERN_INFO DRIVER_NAME ": Suspending.\n");
+
+       ricoh_mmc_enable(fw_dev);
+
+       return 0;
+}
+
+static int ricoh_mmc_resume (struct pci_dev *pdev)
+{
+       struct pci_dev *fw_dev = NULL;
+
+       fw_dev = pci_get_drvdata(pdev);
+       BUG_ON(fw_dev == NULL);
+
+       printk(KERN_INFO DRIVER_NAME ": Resuming.\n");
+
+       ricoh_mmc_disable(fw_dev);
+
+       return 0;
+}
+
 static struct pci_driver ricoh_mmc_driver = {
        .name =         DRIVER_NAME,
        .id_table =     pci_ids,
        .probe =        ricoh_mmc_probe,
        .remove =       __devexit_p(ricoh_mmc_remove),
+       .suspend =      ricoh_mmc_suspend,
+       .resume =       ricoh_mmc_resume,
 };
 
 /*****************************************************************************\
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to