|
@@ -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;
|
|
@@ -228,8 +229,16 @@ int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
|
|
|
if (ret)
|
|
|
goto err;
|
|
|
|
|
|
+#ifdef CONFIG_GPIO_SYSFS
|
|
|
+ /* Expose GPIO value over sysfs for diagnostic purposes */
|
|
|
+ gpio_export(gpios[i].gpio, false);
|
|
|
+#endif
|
|
|
+
|
|
|
INIT_WORK(&gpios[i].work, gpio_work);
|
|
|
gpios[i].jack = jack;
|
|
|
+
|
|
|
+ /* 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;
|