[alsa-devel] [RFC PATCH] ASoC: ams-delta: Take control over audio mute GPIO pins

Peter Ujfalusi peter.ujfalusi at ti.com
Mon Sep 9 09:56:09 CEST 2019



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 at ti.com>

> Fixes: 1137ceee76ba ("ARM: OMAP1: ams-delta: Don't request unused GPIOs")
> Signed-off-by: Janusz Krzysztofik <jmkrzyszt at gmail.com>
> ---
>  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


More information about the Alsa-devel mailing list