mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 14:21:47 +00:00
ASoC: ams-delta: Take control over audio mute GPIO pins
Since commit1137ceee76
("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. Commit2afdb4c41d
("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. Fixes:1137ceee76
("ARM: OMAP1: ams-delta: Don't request unused GPIOs") Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com> Reviewed-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Link: https://lore.kernel.org/r/20190907111650.15440-1-jmkrzyszt@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
2ec42f3147
commit
73681f4f14
@ -245,8 +245,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"),
|
||||
@ -475,6 +475,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),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
@ -589,8 +593,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),
|
||||
{},
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user