Commit 1605223a authored by Thierry Escande's avatar Thierry Escande Committed by Kleber Sacilotto de Souza

ASoC: Intel: cht_bsw_max98090_ti: Fix jack initialization

BugLink: https://bugs.launchpad.net/bugs/1792310

commit 3bbda5a3 upstream.

If the ts3a227e audio accessory detection hardware is present and its
driver probed, the jack needs to be created before enabling jack
detection in the ts3a227e driver. With this patch, the jack is
instantiated in the max98090 headset init function if the ts3a227e is
present. This fixes a null pointer dereference as the jack detection
enabling function in the ts3a driver was called before the jack is
created.

[minor correction to keep error handling on jack creation the same
as before by Pierre Bossart]
Signed-off-by: default avatarThierry Escande <thierry.escande@collabora.com>
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Acked-By: default avatarVinod Koul <vinod.koul@intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
Signed-off-by: default avatarSudip Mukherjee <sudipm.mukherjee@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarStefan Bader <stefan.bader@canonical.com>
Signed-off-by: default avatarKleber Sacilotto de Souza <kleber.souza@canonical.com>
parent ebfbb75c
...@@ -131,23 +131,19 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) ...@@ -131,23 +131,19 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime)
struct cht_mc_private *ctx = snd_soc_card_get_drvdata(runtime->card); struct cht_mc_private *ctx = snd_soc_card_get_drvdata(runtime->card);
struct snd_soc_jack *jack = &ctx->jack; struct snd_soc_jack *jack = &ctx->jack;
/** if (ctx->ts3a227e_present) {
* TI supports 4 butons headset detection /*
* KEY_MEDIA * The jack has already been created in the
* KEY_VOICECOMMAND * cht_max98090_headset_init() function.
* KEY_VOLUMEUP */
* KEY_VOLUMEDOWN snd_soc_jack_notifier_register(jack, &cht_jack_nb);
*/ return 0;
if (ctx->ts3a227e_present) }
jack_type = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE |
SND_JACK_BTN_0 | SND_JACK_BTN_1 | jack_type = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE;
SND_JACK_BTN_2 | SND_JACK_BTN_3;
else
jack_type = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE;
ret = snd_soc_card_jack_new(runtime->card, "Headset Jack", ret = snd_soc_card_jack_new(runtime->card, "Headset Jack",
jack_type, jack, NULL, 0); jack_type, jack, NULL, 0);
if (ret) { if (ret) {
dev_err(runtime->dev, "Headset Jack creation failed %d\n", ret); dev_err(runtime->dev, "Headset Jack creation failed %d\n", ret);
return ret; return ret;
...@@ -203,6 +199,27 @@ static int cht_max98090_headset_init(struct snd_soc_component *component) ...@@ -203,6 +199,27 @@ static int cht_max98090_headset_init(struct snd_soc_component *component)
{ {
struct snd_soc_card *card = component->card; struct snd_soc_card *card = component->card;
struct cht_mc_private *ctx = snd_soc_card_get_drvdata(card); struct cht_mc_private *ctx = snd_soc_card_get_drvdata(card);
struct snd_soc_jack *jack = &ctx->jack;
int jack_type;
int ret;
/*
* TI supports 4 butons headset detection
* KEY_MEDIA
* KEY_VOICECOMMAND
* KEY_VOLUMEUP
* KEY_VOLUMEDOWN
*/
jack_type = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE |
SND_JACK_BTN_0 | SND_JACK_BTN_1 |
SND_JACK_BTN_2 | SND_JACK_BTN_3;
ret = snd_soc_card_jack_new(card, "Headset Jack", jack_type,
jack, NULL, 0);
if (ret) {
dev_err(card->dev, "Headset Jack creation failed %d\n", ret);
return ret;
}
return ts3a227e_enable_jack_detect(component, &ctx->jack); return ts3a227e_enable_jack_detect(component, &ctx->jack);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment