On 07/09/2019 14.16, Janusz Krzysztofik wrote: > Since commit 1137ceee76ba ("ARM: OMAP1: ams-delta: Don't request unused > GPIOs"), on-board audio has appeared muted. It has been discovered that > believed to be unused GPIO pins "hookflash1" and "hookflash2" need to be > set low for audible sound in handsfree and handset mode respectively. > > According to Amstrad E3 wiki, the purpose of both pins hasn't been > clearly identified. Original Amstrad software used to produce a high > pulse on them when the phone was taken off hook or recall was pressed. > With the current findings, we can assume the pins provide a kind of > audio mute function, separately for handset and handsfree operation > modes. > > Commit 2afdb4c41d78 ("ARM: OMAP1: ams-delta: Fix audio permanently > muted") attempted to fix the issue temporarily by hogging the GPIO pin > "hookflash1" renamed to "audio_mute", however the fix occurred > incomplete as it restored audible sound only for handsfree mode. > > Stop hogging that pin, rename the pins to "handsfree_mute" and > "handset_mute" respectively and implement appropriate DAPM event > callbacks for "Speaker" and "Earpiece" DAPM widgets. Reviewed-by: Peter Ujfalusi <peter.ujfalusi@xxxxxx> > Fixes: 1137ceee76ba ("ARM: OMAP1: ams-delta: Don't request unused GPIOs") > Signed-off-by: Janusz Krzysztofik <jmkrzyszt@xxxxxxxxx> > --- > arch/arm/mach-omap1/board-ams-delta.c | 10 +++++---- > sound/soc/ti/ams-delta.c | 31 +++++++++++++++++++++++++-- > 2 files changed, 35 insertions(+), 6 deletions(-) > > diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c > index e47a6fbcfd6e..a2aa7a12b374 100644 > --- a/arch/arm/mach-omap1/board-ams-delta.c > +++ b/arch/arm/mach-omap1/board-ams-delta.c > @@ -246,8 +246,8 @@ static struct platform_device latch2_gpio_device = { > #define LATCH2_PIN_SCARD_CMDVCC 11 > #define LATCH2_PIN_MODEM_NRESET 12 > #define LATCH2_PIN_MODEM_CODEC 13 > -#define LATCH2_PIN_AUDIO_MUTE 14 > -#define LATCH2_PIN_HOOKFLASH 15 > +#define LATCH2_PIN_HANDSFREE_MUTE 14 > +#define LATCH2_PIN_HANDSET_MUTE 15 > > static struct regulator_consumer_supply modem_nreset_consumers[] = { > REGULATOR_SUPPLY("RESET#", "serial8250.1"), > @@ -476,6 +476,10 @@ static struct gpiod_lookup_table ams_delta_audio_gpio_table = { > "hook_switch", 0), > GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_MODEM_CODEC, > "modem_codec", 0), > + GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_HANDSFREE_MUTE, > + "handsfree_mute", 0), > + GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_HANDSET_MUTE, > + "handset_mute", 0), > { }, > }, > }; > @@ -590,8 +594,6 @@ static int gpiochip_match_by_label(struct gpio_chip *chip, void *data) > static struct gpiod_hog ams_delta_gpio_hogs[] = { > GPIO_HOG(LATCH2_LABEL, LATCH2_PIN_KEYBRD_DATAOUT, "keybrd_dataout", > GPIO_ACTIVE_HIGH, GPIOD_OUT_LOW), > - GPIO_HOG(LATCH2_LABEL, LATCH2_PIN_AUDIO_MUTE, "audio_mute", > - GPIO_ACTIVE_HIGH, GPIOD_OUT_LOW), > {}, > }; > > diff --git a/sound/soc/ti/ams-delta.c b/sound/soc/ti/ams-delta.c > index dee8fc70a64f..8e2fb81ad05c 100644 > --- a/sound/soc/ti/ams-delta.c > +++ b/sound/soc/ti/ams-delta.c > @@ -23,14 +23,31 @@ > #include "omap-mcbsp.h" > #include "../codecs/cx20442.h" > > +static struct gpio_desc *handset_mute; > +static struct gpio_desc *handsfree_mute; > + > +static int ams_delta_event_handset(struct snd_soc_dapm_widget *w, > + struct snd_kcontrol *k, int event) > +{ > + gpiod_set_value_cansleep(handset_mute, !SND_SOC_DAPM_EVENT_ON(event)); > + return 0; > +} > + > +static int ams_delta_event_handsfree(struct snd_soc_dapm_widget *w, > + struct snd_kcontrol *k, int event) > +{ > + gpiod_set_value_cansleep(handsfree_mute, !SND_SOC_DAPM_EVENT_ON(event)); > + return 0; > +} > + > /* Board specific DAPM widgets */ > static const struct snd_soc_dapm_widget ams_delta_dapm_widgets[] = { > /* Handset */ > SND_SOC_DAPM_MIC("Mouthpiece", NULL), > - SND_SOC_DAPM_HP("Earpiece", NULL), > + SND_SOC_DAPM_HP("Earpiece", ams_delta_event_handset), > /* Handsfree/Speakerphone */ > SND_SOC_DAPM_MIC("Microphone", NULL), > - SND_SOC_DAPM_SPK("Speaker", NULL), > + SND_SOC_DAPM_SPK("Speaker", ams_delta_event_handsfree), > }; > > /* How they are connected to codec pins */ > @@ -542,6 +559,16 @@ static int ams_delta_probe(struct platform_device *pdev) > > card->dev = &pdev->dev; > > + handset_mute = devm_gpiod_get(card->dev, "handset_mute", > + GPIOD_OUT_HIGH); > + if (IS_ERR(handset_mute)) > + return PTR_ERR(handset_mute); > + > + handsfree_mute = devm_gpiod_get(card->dev, "handsfree_mute", > + GPIOD_OUT_HIGH); > + if (IS_ERR(handsfree_mute)) > + return PTR_ERR(handsfree_mute); > + > ret = snd_soc_register_card(card); > if (ret) { > dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret); > - Péter Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki