mfd: Add more checks for WM8994 being active during suspend
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Sat, 13 Aug 2011 05:37:48 +0000 (14:37 +0900)
committerSamuel Ortiz <sameo@linux.intel.com>
Mon, 24 Oct 2011 12:09:10 +0000 (14:09 +0200)
Enhancements to the WM8994 audio driver and new features on more modern
devices in the series mean that we can no longer rely on VMID being active
as an indication that the device is active. Add further checks for digital
paths and microphone detection.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/wm8994-core.c

index 1f15743460a0ddfc70c0faa5ecb676a81660dcf4..9b01a22c3e707bef6ce37910af96fe33eed310ed 100644 (file)
@@ -281,6 +281,40 @@ static int wm8994_suspend(struct device *dev)
                return 0;
        }
 
+       ret = wm8994_reg_read(wm8994, WM8994_POWER_MANAGEMENT_4);
+       if (ret < 0) {
+               dev_err(dev, "Failed to read power status: %d\n", ret);
+       } else if (ret & (WM8994_AIF2ADCL_ENA | WM8994_AIF2ADCR_ENA |
+                         WM8994_AIF1ADC2L_ENA | WM8994_AIF1ADC2R_ENA |
+                         WM8994_AIF1ADC1L_ENA | WM8994_AIF1ADC1R_ENA)) {
+               dev_dbg(dev, "CODEC still active, ignoring suspend\n");
+               return 0;
+       }
+
+       ret = wm8994_reg_read(wm8994, WM8994_POWER_MANAGEMENT_5);
+       if (ret < 0) {
+               dev_err(dev, "Failed to read power status: %d\n", ret);
+       } else if (ret & (WM8994_AIF2DACL_ENA | WM8994_AIF2DACR_ENA |
+                         WM8994_AIF1DAC2L_ENA | WM8994_AIF1DAC2R_ENA |
+                         WM8994_AIF1DAC1L_ENA | WM8994_AIF1DAC1R_ENA)) {
+               dev_dbg(dev, "CODEC still active, ignoring suspend\n");
+               return 0;
+       }
+
+       switch (wm8994->type) {
+       case WM8958:
+               ret = wm8994_reg_read(wm8994, WM8958_MIC_DETECT_1);
+               if (ret < 0) {
+                       dev_err(dev, "Failed to read power status: %d\n", ret);
+               } else if (ret & WM8958_MICD_ENA) {
+                       dev_dbg(dev, "CODEC still active, ignoring suspend\n");
+                       return 0;
+               }
+               break;
+       default:
+               break;
+       }
+
        /* Disable LDO pulldowns while the device is suspended if we
         * don't know that something will be driving them. */
        if (!wm8994->ldo_ena_always_driven)