[alsa-devel] [PATCH 0/2] Add ACPI table for the ts3a227e driver
Hi,
This series adds ACPI match table for the ts3a227e driver. The ts3a227e is an Autonomous Audio Accessory Detection and Configuration Switch used to detect audio accessory features like jack plugging and unplugging, mic presence, and button pressed events.
This series also fixes a null pointer dereference occurring in the TI max9890 driver when the ts3a227e hardware is present and its driver probed. The jack detection was enabled in the ts3a227e driver before the jack structure was allocated, causing the null pointer access.
Regards, Thierry
Fang, Yang A (1): ASoC: ts3a227e: add acpi table
Thierry Escande (1): ASoc: cht_bsw_max98090_ti: Fix jack initialization
sound/soc/codecs/ts3a227e.c | 10 ++++++ sound/soc/intel/boards/cht_bsw_max98090_ti.c | 52 +++++++++++++++++----------- 2 files changed, 41 insertions(+), 21 deletions(-)
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.
Signed-off-by: Thierry Escande thierry.escande@collabora.com --- sound/soc/intel/boards/cht_bsw_max98090_ti.c | 50 +++++++++++++++++----------- 1 file changed, 30 insertions(+), 20 deletions(-)
diff --git a/sound/soc/intel/boards/cht_bsw_max98090_ti.c b/sound/soc/intel/boards/cht_bsw_max98090_ti.c index 742bc0d..f17e474 100644 --- a/sound/soc/intel/boards/cht_bsw_max98090_ti.c +++ b/sound/soc/intel/boards/cht_bsw_max98090_ti.c @@ -128,30 +128,21 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) struct cht_mc_private *ctx = snd_soc_card_get_drvdata(runtime->card); struct snd_soc_jack *jack = &ctx->jack;
- /** - * TI supports 4 butons headset detection - * KEY_MEDIA - * KEY_VOICECOMMAND - * KEY_VOLUMEUP - * KEY_VOLUMEDOWN - */ - if (ctx->ts3a227e_present) - jack_type = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE | - 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; + if (ctx->ts3a227e_present) { + /* + * The jack has already been created in the + * cht_max98090_headset_init() function. + */ + snd_soc_jack_notifier_register(jack, &cht_jack_nb); + return 0; + } + + jack_type = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE;
ret = snd_soc_card_jack_new(runtime->card, "Headset Jack", jack_type, jack, NULL, 0); - - if (ret) { + if (ret) dev_err(runtime->dev, "Headset Jack creation failed %d\n", ret); - return ret; - } - - if (ctx->ts3a227e_present) - snd_soc_jack_notifier_register(jack, &cht_jack_nb);
return ret; } @@ -200,6 +191,25 @@ static int cht_max98090_headset_init(struct snd_soc_component *component) { struct snd_soc_card *card = component->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) + return ret;
return ts3a227e_enable_jack_detect(component, &ctx->jack); }
On 05/02/2017 05:11 AM, Thierry Escande wrote:
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.
is this in any way related to https://bugzilla.kernel.org/show_bug.cgi?id=151521 " Sound not working on Acer Chromebook R11 (CYAN) braswell / cherryview / cherry trail"
I provided a similar patch and didn't see any followup. https://bugzilla.kernel.org/attachment.cgi?id=254867 Thanks -Pierre
Signed-off-by: Thierry Escande thierry.escande@collabora.com
sound/soc/intel/boards/cht_bsw_max98090_ti.c | 50 +++++++++++++++++----------- 1 file changed, 30 insertions(+), 20 deletions(-)
diff --git a/sound/soc/intel/boards/cht_bsw_max98090_ti.c b/sound/soc/intel/boards/cht_bsw_max98090_ti.c index 742bc0d..f17e474 100644 --- a/sound/soc/intel/boards/cht_bsw_max98090_ti.c +++ b/sound/soc/intel/boards/cht_bsw_max98090_ti.c @@ -128,30 +128,21 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) struct cht_mc_private *ctx = snd_soc_card_get_drvdata(runtime->card); struct snd_soc_jack *jack = &ctx->jack;
- /**
- TI supports 4 butons headset detection
- KEY_MEDIA
- KEY_VOICECOMMAND
- KEY_VOLUMEUP
- KEY_VOLUMEDOWN
- */
- if (ctx->ts3a227e_present)
jack_type = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE |
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;
if (ctx->ts3a227e_present) {
/*
* The jack has already been created in the
* cht_max98090_headset_init() function.
*/
snd_soc_jack_notifier_register(jack, &cht_jack_nb);
return 0;
}
jack_type = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE;
ret = snd_soc_card_jack_new(runtime->card, "Headset Jack", jack_type, jack, NULL, 0);
- if (ret) {
- if (ret) dev_err(runtime->dev, "Headset Jack creation failed %d\n", ret);
return ret;
}
if (ctx->ts3a227e_present)
snd_soc_jack_notifier_register(jack, &cht_jack_nb);
return ret; }
@@ -200,6 +191,25 @@ static int cht_max98090_headset_init(struct snd_soc_component *component) { struct snd_soc_card *card = component->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)
return ret;
return ts3a227e_enable_jack_detect(component, &ctx->jack); }
Hi,
On 04/05/2017 19:01, Pierre-Louis Bossart wrote:
On 05/02/2017 05:11 AM, Thierry Escande wrote:
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.
is this in any way related to https://bugzilla.kernel.org/show_bug.cgi?id=151521 " Sound not working on Acer Chromebook R11 (CYAN) braswell / cherryview / cherry trail"
I provided a similar patch and didn't see any followup. https://bugzilla.kernel.org/attachment.cgi?id=254867 Thanks -Pierre
That's the exact same issue.
I fixed it by creating the jack in the aux_dev .init() function since it's how this is done in the rockchip max98090 driver.
Regards, Thierry
Signed-off-by: Thierry Escande thierry.escande@collabora.com
sound/soc/intel/boards/cht_bsw_max98090_ti.c | 50 +++++++++++++++++----------- 1 file changed, 30 insertions(+), 20 deletions(-)
diff --git a/sound/soc/intel/boards/cht_bsw_max98090_ti.c b/sound/soc/intel/boards/cht_bsw_max98090_ti.c index 742bc0d..f17e474 100644 --- a/sound/soc/intel/boards/cht_bsw_max98090_ti.c +++ b/sound/soc/intel/boards/cht_bsw_max98090_ti.c @@ -128,30 +128,21 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) struct cht_mc_private *ctx = snd_soc_card_get_drvdata(runtime->card); struct snd_soc_jack *jack = &ctx->jack;
- /**
- TI supports 4 butons headset detection
- KEY_MEDIA
- KEY_VOICECOMMAND
- KEY_VOLUMEUP
- KEY_VOLUMEDOWN
- */
- if (ctx->ts3a227e_present)
jack_type = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE |
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;
- if (ctx->ts3a227e_present) {
/*
* The jack has already been created in the
* cht_max98090_headset_init() function.
*/
snd_soc_jack_notifier_register(jack, &cht_jack_nb);
return 0;
- }
- jack_type = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE; ret = snd_soc_card_jack_new(runtime->card, "Headset Jack", jack_type, jack, NULL, 0);
- if (ret) {
- if (ret) dev_err(runtime->dev, "Headset Jack creation failed %d\n",
ret);
return ret;
- }
- if (ctx->ts3a227e_present)
}snd_soc_jack_notifier_register(jack, &cht_jack_nb); return ret;
@@ -200,6 +191,25 @@ static int cht_max98090_headset_init(struct snd_soc_component *component) { struct snd_soc_card *card = component->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)
}return ret; return ts3a227e_enable_jack_detect(component, &ctx->jack);
On 5/5/17 7:37 AM, Thierry Escande wrote:
Hi,
On 04/05/2017 19:01, Pierre-Louis Bossart wrote:
On 05/02/2017 05:11 AM, Thierry Escande wrote:
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.
is this in any way related to https://bugzilla.kernel.org/show_bug.cgi?id=151521 " Sound not working on Acer Chromebook R11 (CYAN) braswell / cherryview / cherry trail"
I provided a similar patch and didn't see any followup. https://bugzilla.kernel.org/attachment.cgi?id=254867 Thanks -Pierre
That's the exact same issue.
I fixed it by creating the jack in the aux_dev .init() function since it's how this is done in the rockchip max98090 driver.
ok, so do you get sound on Cyan chromebooks with these two fixes? it'd be worth adding a reference to the bugzilla # in the commit message.
Regards, Thierry
Signed-off-by: Thierry Escande thierry.escande@collabora.com
sound/soc/intel/boards/cht_bsw_max98090_ti.c | 50 +++++++++++++++++----------- 1 file changed, 30 insertions(+), 20 deletions(-)
diff --git a/sound/soc/intel/boards/cht_bsw_max98090_ti.c b/sound/soc/intel/boards/cht_bsw_max98090_ti.c index 742bc0d..f17e474 100644 --- a/sound/soc/intel/boards/cht_bsw_max98090_ti.c +++ b/sound/soc/intel/boards/cht_bsw_max98090_ti.c @@ -128,30 +128,21 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime) struct cht_mc_private *ctx = snd_soc_card_get_drvdata(runtime->card); struct snd_soc_jack *jack = &ctx->jack;
- /**
- TI supports 4 butons headset detection
- KEY_MEDIA
- KEY_VOICECOMMAND
- KEY_VOLUMEUP
- KEY_VOLUMEDOWN
- */
- if (ctx->ts3a227e_present)
jack_type = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE |
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;
- if (ctx->ts3a227e_present) {
/*
* The jack has already been created in the
* cht_max98090_headset_init() function.
*/
snd_soc_jack_notifier_register(jack, &cht_jack_nb);
return 0;
- }
- jack_type = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE; ret = snd_soc_card_jack_new(runtime->card, "Headset Jack", jack_type, jack, NULL, 0);
- if (ret) {
- if (ret) dev_err(runtime->dev, "Headset Jack creation failed %d\n",
ret);
return ret;
- }
- if (ctx->ts3a227e_present)
}snd_soc_jack_notifier_register(jack, &cht_jack_nb); return ret;
@@ -200,6 +191,25 @@ static int cht_max98090_headset_init(struct snd_soc_component *component) { struct snd_soc_card *card = component->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)
}return ret; return ts3a227e_enable_jack_detect(component, &ctx->jack);
From: "Fang, Yang A" yang.a.fang@intel.com
This patch adds the acpi match table for the ts3a227e audio accessory detection device. This enables headset features like jack plug/unplug notifications, mic presence, and button pressed events.
Signed-off-by: Fang, Yang A yang.a.fang@intel.com Signed-off-by: Thierry Escande thierry.escande@collabora.com --- sound/soc/codecs/ts3a227e.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/sound/soc/codecs/ts3a227e.c b/sound/soc/codecs/ts3a227e.c index 4356843..738e04b 100644 --- a/sound/soc/codecs/ts3a227e.c +++ b/sound/soc/codecs/ts3a227e.c @@ -15,6 +15,7 @@ #include <linux/module.h> #include <linux/of_gpio.h> #include <linux/regmap.h> +#include <linux/acpi.h>
#include <sound/core.h> #include <sound/jack.h> @@ -374,11 +375,20 @@ static const struct of_device_id ts3a227e_of_match[] = { }; MODULE_DEVICE_TABLE(of, ts3a227e_of_match);
+#ifdef CONFIG_ACPI +static struct acpi_device_id ts3a227e_acpi_match[] = { + { "104C227E", 0 }, + {}, +}; +MODULE_DEVICE_TABLE(acpi, ts3a227e_acpi_match); +#endif + static struct i2c_driver ts3a227e_driver = { .driver = { .name = "ts3a227e", .pm = &ts3a227e_pm, .of_match_table = of_match_ptr(ts3a227e_of_match), + .acpi_match_table = ACPI_PTR(ts3a227e_acpi_match), }, .probe = ts3a227e_i2c_probe, .id_table = ts3a227e_i2c_ids,
The patch
ASoC: ts3a227e: add acpi table
has been applied to the asoc tree at
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying to this mail.
Thanks, Mark
From a10953f5d33b2334c8fb1799084ab49347a59821 Mon Sep 17 00:00:00 2001
From: "Fang, Yang A" yang.a.fang@intel.com Date: Fri, 8 Sep 2017 00:13:07 -0500 Subject: [PATCH] ASoC: ts3a227e: add acpi table
This patch adds the acpi match table for the ts3a227e audio accessory detection device. This enables headset features like jack plug/unplug notifications, mic presence, and button pressed events.
Signed-off-by: Fang, Yang A yang.a.fang@intel.com Signed-off-by: Thierry Escande thierry.escande@collabora.com Signed-off-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com Acked-By: Vinod Koul vinod.koul@intel.com Signed-off-by: Mark Brown broonie@kernel.org --- sound/soc/codecs/ts3a227e.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/sound/soc/codecs/ts3a227e.c b/sound/soc/codecs/ts3a227e.c index 43568435c208..738e04b09116 100644 --- a/sound/soc/codecs/ts3a227e.c +++ b/sound/soc/codecs/ts3a227e.c @@ -15,6 +15,7 @@ #include <linux/module.h> #include <linux/of_gpio.h> #include <linux/regmap.h> +#include <linux/acpi.h>
#include <sound/core.h> #include <sound/jack.h> @@ -374,11 +375,20 @@ static const struct of_device_id ts3a227e_of_match[] = { }; MODULE_DEVICE_TABLE(of, ts3a227e_of_match);
+#ifdef CONFIG_ACPI +static struct acpi_device_id ts3a227e_acpi_match[] = { + { "104C227E", 0 }, + {}, +}; +MODULE_DEVICE_TABLE(acpi, ts3a227e_acpi_match); +#endif + static struct i2c_driver ts3a227e_driver = { .driver = { .name = "ts3a227e", .pm = &ts3a227e_pm, .of_match_table = of_match_ptr(ts3a227e_of_match), + .acpi_match_table = ACPI_PTR(ts3a227e_acpi_match), }, .probe = ts3a227e_i2c_probe, .id_table = ts3a227e_i2c_ids,
participants (3)
-
Mark Brown
-
Pierre-Louis Bossart
-
Thierry Escande