Merge branch 'topic/soundcore-preclaim' into for-linus
[pandora-kernel.git] / sound / soc / soc-jack.c
index 28346fb..1d455ab 100644 (file)
@@ -73,14 +73,15 @@ void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask)
        oldstatus = jack->status;
 
        jack->status &= ~mask;
-       jack->status |= status;
+       jack->status |= status & mask;
 
-       /* The DAPM sync is expensive enough to be worth skipping */
-       if (jack->status == oldstatus)
+       /* The DAPM sync is expensive enough to be worth skipping.
+        * However, empty mask means pin synchronization is desired. */
+       if (mask && (jack->status == oldstatus))
                goto out;
 
        list_for_each_entry(pin, &jack->pins, list) {
-               enable = pin->mask & status;
+               enable = pin->mask & jack->status;
 
                if (pin->invert)
                        enable = !enable;
@@ -220,6 +221,9 @@ int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
                if (ret)
                        goto err;
 
+               INIT_WORK(&gpios[i].work, gpio_work);
+               gpios[i].jack = jack;
+
                ret = request_irq(gpio_to_irq(gpios[i].gpio),
                                gpio_handler,
                                IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
@@ -228,8 +232,13 @@ int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
                if (ret)
                        goto err;
 
-               INIT_WORK(&gpios[i].work, gpio_work);
-               gpios[i].jack = jack;
+#ifdef CONFIG_GPIO_SYSFS
+               /* Expose GPIO value over sysfs for diagnostic purposes */
+               gpio_export(gpios[i].gpio, false);
+#endif
+
+               /* Update initial jack status */
+               snd_soc_jack_gpio_detect(&gpios[i]);
        }
 
        return 0;
@@ -258,6 +267,9 @@ void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,
        int i;
 
        for (i = 0; i < count; i++) {
+#ifdef CONFIG_GPIO_SYSFS
+               gpio_unexport(gpios[i].gpio);
+#endif
                free_irq(gpio_to_irq(gpios[i].gpio), &gpios[i]);
                gpio_free(gpios[i].gpio);
                gpios[i].jack = NULL;