Skip to content

Commit

Permalink
ASoC: Jack handling enhancements as suggested by subsystem maintainer
Browse files Browse the repository at this point in the history
The patch adds a few small enhancements to the ASoC jack handling, as
suggested by Mark in his comments to my Amstrad Delta driver, and a few fixes
for related bugs found while learning Mark's code and testing results.

Enhancements:
1. Update status of an ASoC jack while associating it with new gpios.
2. Really update DAPM pins while associating them with an ASoC jack.
3. Export ASoC jack gpios over gpiolib sysfs for diagnostic purposes.

Fixes:
1. Apply mask on jack status report before using it, just for case.
2. While updating jack associated DAPM pins, use full resulting jack status,
   not the status report passed as an argument.

Created and tested on linux-2.6.31-rc3

Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
Janusz Krzysztofik authored and Mark Brown committed Jul 24, 2009
1 parent 474828a commit 178b699
Showing 1 changed file with 16 additions and 4 deletions.
20 changes: 16 additions & 4 deletions sound/soc/soc-jack.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 178b699

Please sign in to comment.