Commit 3bbda5a3 authored by Thierry Escande's avatar Thierry Escande Committed by Mark Brown

ASoC: Intel: cht_bsw_max98090_ti: Fix jack initialization

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>
parent c809fb1e
...@@ -166,23 +166,19 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) ...@@ -166,23 +166,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
*/ */
if (ctx->ts3a227e_present) snd_soc_jack_notifier_register(jack, &cht_jack_nb);
jack_type = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE | return 0;
SND_JACK_BTN_0 | SND_JACK_BTN_1 | }
SND_JACK_BTN_2 | SND_JACK_BTN_3;
else
jack_type = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE; 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;
...@@ -257,6 +253,27 @@ static int cht_max98090_headset_init(struct snd_soc_component *component) ...@@ -257,6 +253,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