mfd: Mask and unmask wm8350 IRQs on request and free
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Wed, 4 Nov 2009 16:10:52 +0000 (16:10 +0000)
committerSamuel Ortiz <sameo@linux.intel.com>
Sun, 13 Dec 2009 18:21:40 +0000 (19:21 +0100)
Bring the WM8350 IRQ API more in line with the generic IRQ API by
masking and unmasking interrupts as they are requested and freed.
This is mostly just a case of deleting the mask and unmask calls
from the individual drivers.

The RTC driver is changed to mask the periodic IRQ after requesting
it rather than only unmasking the alarm IRQ. If the periodic IRQ
fires in the period where it is reqested then there will be a
spurious notification but there should be no serious consequences
from this.

The CODEC drive is changed to explicitly disable headphone jack
detection prior to requesting the IRQs. This will avoid the IRQ
firing with no jack set up.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/wm8350-irq.c
drivers/power/wm8350_power.c
drivers/regulator/wm8350-regulator.c
drivers/rtc/rtc-wm8350.c
sound/soc/codecs/wm8350.c

index 2ea2b8b4c72aba1e4efb27c495f0c3474d00eb9a..c8df547c474703b45d4285cd063bd68ab4c5e636 100644 (file)
@@ -445,6 +445,8 @@ int wm8350_register_irq(struct wm8350 *wm8350, int irq,
        wm8350->irq[irq].data = data;
        mutex_unlock(&wm8350->irq_mutex);
 
+       wm8350_unmask_irq(wm8350, irq);
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(wm8350_register_irq);
@@ -454,6 +456,8 @@ int wm8350_free_irq(struct wm8350 *wm8350, int irq)
        if (irq < 0 || irq > WM8350_NUM_IRQ)
                return -EINVAL;
 
+       wm8350_mask_irq(wm8350, irq);
+
        mutex_lock(&wm8350->irq_mutex);
        wm8350->irq[irq].handler = NULL;
        mutex_unlock(&wm8350->irq_mutex);
index 6e634cf7fc141da8a2e8fea120fb4d4ca44b7a00..ad4f071e12870a26cbf6d7fb9415590947ba1833 100644 (file)
@@ -391,80 +391,54 @@ static void wm8350_init_charger(struct wm8350 *wm8350)
        /* register our interest in charger events */
        wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_HOT,
                            wm8350_charger_handler, 0, "Battery hot", wm8350);
-       wm8350_unmask_irq(wm8350, WM8350_IRQ_CHG_BAT_HOT);
        wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_COLD,
                            wm8350_charger_handler, 0, "Battery cold", wm8350);
-       wm8350_unmask_irq(wm8350, WM8350_IRQ_CHG_BAT_COLD);
        wm8350_register_irq(wm8350, WM8350_IRQ_CHG_BAT_FAIL,
                            wm8350_charger_handler, 0, "Battery fail", wm8350);
-       wm8350_unmask_irq(wm8350, WM8350_IRQ_CHG_BAT_FAIL);
        wm8350_register_irq(wm8350, WM8350_IRQ_CHG_TO,
                            wm8350_charger_handler, 0,
                            "Charger timeout", wm8350);
-       wm8350_unmask_irq(wm8350, WM8350_IRQ_CHG_TO);
        wm8350_register_irq(wm8350, WM8350_IRQ_CHG_END,
                            wm8350_charger_handler, 0,
                            "Charge end", wm8350);
-       wm8350_unmask_irq(wm8350, WM8350_IRQ_CHG_END);
        wm8350_register_irq(wm8350, WM8350_IRQ_CHG_START,
                            wm8350_charger_handler, 0,
                            "Charge start", wm8350);
-       wm8350_unmask_irq(wm8350, WM8350_IRQ_CHG_START);
        wm8350_register_irq(wm8350, WM8350_IRQ_CHG_FAST_RDY,
                            wm8350_charger_handler, 0,
                            "Fast charge ready", wm8350);
-       wm8350_unmask_irq(wm8350, WM8350_IRQ_CHG_FAST_RDY);
        wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P9,
                            wm8350_charger_handler, 0,
                            "Battery <3.9V", wm8350);
-       wm8350_unmask_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P9);
        wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P1,
                            wm8350_charger_handler, 0,
                            "Battery <3.1V", wm8350);
-       wm8350_unmask_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P1);
        wm8350_register_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_2P85,
                            wm8350_charger_handler, 0,
                            "Battery <2.85V", wm8350);
 
-       wm8350_unmask_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_2P85);
-
        /* and supply change events */
        wm8350_register_irq(wm8350, WM8350_IRQ_EXT_USB_FB,
                            wm8350_charger_handler, 0, "USB", wm8350);
-       wm8350_unmask_irq(wm8350, WM8350_IRQ_EXT_USB_FB);
        wm8350_register_irq(wm8350, WM8350_IRQ_EXT_WALL_FB,
                            wm8350_charger_handler, 0, "Wall", wm8350);
-       wm8350_unmask_irq(wm8350, WM8350_IRQ_EXT_WALL_FB);
        wm8350_register_irq(wm8350, WM8350_IRQ_EXT_BAT_FB,
                            wm8350_charger_handler, 0, "Battery", wm8350);
-       wm8350_unmask_irq(wm8350, WM8350_IRQ_EXT_BAT_FB);
 }
 
 static void free_charger_irq(struct wm8350 *wm8350)
 {
-       wm8350_mask_irq(wm8350, WM8350_IRQ_CHG_BAT_HOT);
        wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_HOT);
-       wm8350_mask_irq(wm8350, WM8350_IRQ_CHG_BAT_COLD);
        wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_COLD);
-       wm8350_mask_irq(wm8350, WM8350_IRQ_CHG_BAT_FAIL);
        wm8350_free_irq(wm8350, WM8350_IRQ_CHG_BAT_FAIL);
-       wm8350_mask_irq(wm8350, WM8350_IRQ_CHG_TO);
        wm8350_free_irq(wm8350, WM8350_IRQ_CHG_TO);
-       wm8350_mask_irq(wm8350, WM8350_IRQ_CHG_END);
        wm8350_free_irq(wm8350, WM8350_IRQ_CHG_END);
-       wm8350_mask_irq(wm8350, WM8350_IRQ_CHG_START);
        wm8350_free_irq(wm8350, WM8350_IRQ_CHG_START);
-       wm8350_mask_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P9);
        wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P9);
-       wm8350_mask_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P1);
        wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_3P1);
-       wm8350_mask_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_2P85);
        wm8350_free_irq(wm8350, WM8350_IRQ_CHG_VBATT_LT_2P85);
-       wm8350_mask_irq(wm8350, WM8350_IRQ_EXT_USB_FB);
        wm8350_free_irq(wm8350, WM8350_IRQ_EXT_USB_FB);
-       wm8350_mask_irq(wm8350, WM8350_IRQ_EXT_WALL_FB);
        wm8350_free_irq(wm8350, WM8350_IRQ_EXT_WALL_FB);
-       wm8350_mask_irq(wm8350, WM8350_IRQ_EXT_BAT_FB);
        wm8350_free_irq(wm8350, WM8350_IRQ_EXT_BAT_FB);
 }
 
index 8c289fd4add2955ac041524604d002fe2e9b8d40..1bbff099a546af37a1e4e2179ca52f9ffa478962 100644 (file)
@@ -1399,8 +1399,6 @@ static int wm8350_regulator_probe(struct platform_device *pdev)
                return ret;
        }
 
-       wm8350_unmask_irq(wm8350, wm8350_reg[pdev->id].irq);
-
        return 0;
 }
 
@@ -1409,7 +1407,6 @@ static int wm8350_regulator_remove(struct platform_device *pdev)
        struct regulator_dev *rdev = platform_get_drvdata(pdev);
        struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
 
-       wm8350_mask_irq(wm8350, wm8350_reg[pdev->id].irq);
        wm8350_free_irq(wm8350, wm8350_reg[pdev->id].irq);
 
        regulator_unregister(rdev);
index 56e56e552813a0e1c08459cbb9f7baf31de07f30..f16486635a8efab098e21e22c1ada0c42f91b2da 100644 (file)
@@ -459,17 +459,14 @@ static int wm8350_rtc_probe(struct platform_device *pdev)
                return ret;
        }
 
-       wm8350_mask_irq(wm8350, WM8350_IRQ_RTC_SEC);
-       wm8350_mask_irq(wm8350, WM8350_IRQ_RTC_PER);
-
        wm8350_register_irq(wm8350, WM8350_IRQ_RTC_SEC,
                            wm8350_rtc_update_handler, 0,
                            "RTC Seconds", wm8350);
+       wm8350_mask_irq(wm8350, WM8350_IRQ_RTC_SEC);
 
        wm8350_register_irq(wm8350, WM8350_IRQ_RTC_ALM,
                            wm8350_rtc_alarm_handler, 0,
                            "RTC Alarm", wm8350);
-       wm8350_unmask_irq(wm8350, WM8350_IRQ_RTC_ALM);
 
        return 0;
 }
@@ -479,8 +476,6 @@ static int __devexit wm8350_rtc_remove(struct platform_device *pdev)
        struct wm8350 *wm8350 = platform_get_drvdata(pdev);
        struct wm8350_rtc *wm_rtc = &wm8350->rtc;
 
-       wm8350_mask_irq(wm8350, WM8350_IRQ_RTC_SEC);
-
        wm8350_free_irq(wm8350, WM8350_IRQ_RTC_SEC);
        wm8350_free_irq(wm8350, WM8350_IRQ_RTC_ALM);
 
index 17a327d67fd5c84471b9b17c506df622a46f8290..ebbf11b653a4f3042708ae966c952e6ca46545da 100644 (file)
@@ -1426,8 +1426,6 @@ int wm8350_hp_jack_detect(struct snd_soc_codec *codec, enum wm8350_jack which,
        /* Sync status */
        wm8350_hp_jack_handler(irq, priv);
 
-       wm8350_unmask_irq(wm8350, irq);
-
        return 0;
 }
 EXPORT_SYMBOL_GPL(wm8350_hp_jack_detect);
@@ -1485,8 +1483,10 @@ static int wm8350_probe(struct platform_device *pdev)
        wm8350_set_bits(wm8350, WM8350_ROUT2_VOLUME,
                        WM8350_OUT2_VU | WM8350_OUT2R_MUTE);
 
-       wm8350_mask_irq(wm8350, WM8350_IRQ_CODEC_JCK_DET_L);
-       wm8350_mask_irq(wm8350, WM8350_IRQ_CODEC_JCK_DET_R);
+       /* Make sure jack detect is disabled to start off with */
+       wm8350_clear_bits(wm8350, WM8350_JACK_DETECT,
+                         WM8350_JDL_ENA | WM8350_JDR_ENA);
+
        wm8350_register_irq(wm8350, WM8350_IRQ_CODEC_JCK_DET_L,
                            wm8350_hp_jack_handler, 0, "Left jack detect",
                            priv);
@@ -1521,8 +1521,6 @@ static int wm8350_remove(struct platform_device *pdev)
                          WM8350_JDL_ENA | WM8350_JDR_ENA);
        wm8350_clear_bits(wm8350, WM8350_POWER_MGMT_4, WM8350_TOCLK_ENA);
 
-       wm8350_mask_irq(wm8350, WM8350_IRQ_CODEC_JCK_DET_L);
-       wm8350_mask_irq(wm8350, WM8350_IRQ_CODEC_JCK_DET_R);
        wm8350_free_irq(wm8350, WM8350_IRQ_CODEC_JCK_DET_L);
        wm8350_free_irq(wm8350, WM8350_IRQ_CODEC_JCK_DET_R);