From 4be8dc7ff69182610b40a078b9815bcdf27e0c49 Mon Sep 17 00:00:00 2001 From: Benjamin Herrenschmidt Date: Sun, 1 May 2005 08:58:43 -0700 Subject: [PATCH] ppc64: improve g5 sound headphone mute This patch fixes a couple more issues with the management of the GPIOs dealing with headphone and line out mute on the G5. It should fix the remaining problems of people not getting any sound out of the headphone jack. Signed-off-by: Benjamin Herrenschmidt Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- sound/ppc/tumbler.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/sound/ppc/tumbler.c b/sound/ppc/tumbler.c index c71807e069e..f3e010793a6 100644 --- a/sound/ppc/tumbler.c +++ b/sound/ppc/tumbler.c @@ -177,11 +177,22 @@ static void write_audio_gpio(pmac_gpio_t *gp, int active) if (! gp->addr) return; active = active ? gp->active_val : gp->inactive_val; - do_gpio_write(gp, active); DBG("(I) gpio %x write %d\n", gp->addr, active); } +static int check_audio_gpio(pmac_gpio_t *gp) +{ + int ret; + + if (! gp->addr) + return 0; + + ret = do_gpio_read(gp); + + return (ret & 0xd) == (gp->active_val & 0xd); +} + static int read_audio_gpio(pmac_gpio_t *gp) { int ret; @@ -683,7 +694,7 @@ static int tumbler_get_mute_switch(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_ } if (gp == NULL) return -EINVAL; - ucontrol->value.integer.value[0] = ! read_audio_gpio(gp); + ucontrol->value.integer.value[0] = !check_audio_gpio(gp); return 0; } @@ -711,7 +722,7 @@ static int tumbler_put_mute_switch(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_ } if (gp == NULL) return -EINVAL; - val = ! read_audio_gpio(gp); + val = ! check_audio_gpio(gp); if (val != ucontrol->value.integer.value[0]) { write_audio_gpio(gp, ! ucontrol->value.integer.value[0]); return 1; @@ -897,11 +908,11 @@ static int tumbler_detect_lineout(pmac_t *chip) static void check_mute(pmac_t *chip, pmac_gpio_t *gp, int val, int do_notify, snd_kcontrol_t *sw) { - //pmac_tumbler_t *mix = chip->mixer_data; - if (val != read_audio_gpio(gp)) { + if (check_audio_gpio(gp) != val) { write_audio_gpio(gp, val); if (do_notify) - snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &sw->id); + snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, + &sw->id); } } -- cgit v1.2.3