ASoC: Intel: cht_bsw_max98090: add gpio-based jack detection
Jacks are created but only enabled when the external TI chip is present, this probably never worked as well. Forklift the gpio-based code from the legacy byt-max98090 driver, with however a less strict error check. It's fine to let users enjoy their device even if jack detection doesn't work - it almost never does without quirks... Tested on Lenovo100s 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>
This commit is contained in:
parent
3bbda5a386
commit
355b3552d5
|
@ -159,6 +159,40 @@ static struct notifier_block cht_jack_nb = {
|
||||||
.notifier_call = cht_ti_jack_event,
|
.notifier_call = cht_ti_jack_event,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct snd_soc_jack_pin hs_jack_pins[] = {
|
||||||
|
{
|
||||||
|
.pin = "Headphone",
|
||||||
|
.mask = SND_JACK_HEADPHONE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pin = "Headset Mic",
|
||||||
|
.mask = SND_JACK_MICROPHONE,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct snd_soc_jack_gpio hs_jack_gpios[] = {
|
||||||
|
{
|
||||||
|
.name = "hp",
|
||||||
|
.report = SND_JACK_HEADPHONE | SND_JACK_LINEOUT,
|
||||||
|
.debounce_time = 200,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "mic",
|
||||||
|
.invert = 1,
|
||||||
|
.report = SND_JACK_MICROPHONE,
|
||||||
|
.debounce_time = 200,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct acpi_gpio_params hp_gpios = { 0, 0, false };
|
||||||
|
static const struct acpi_gpio_params mic_gpios = { 1, 0, false };
|
||||||
|
|
||||||
|
static const struct acpi_gpio_mapping acpi_max98090_gpios[] = {
|
||||||
|
{ "hp-gpios", &hp_gpios, 1 },
|
||||||
|
{ "mic-gpios", &mic_gpios, 1 },
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
|
||||||
static int cht_codec_init(struct snd_soc_pcm_runtime *runtime)
|
static int cht_codec_init(struct snd_soc_pcm_runtime *runtime)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -178,15 +212,29 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime)
|
||||||
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,
|
||||||
|
hs_jack_pins, ARRAY_SIZE(hs_jack_pins));
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (ctx->ts3a227e_present)
|
if (ctx->ts3a227e_present)
|
||||||
snd_soc_jack_notifier_register(jack, &cht_jack_nb);
|
snd_soc_jack_notifier_register(jack, &cht_jack_nb);
|
||||||
|
|
||||||
|
ret = snd_soc_jack_add_gpiods(runtime->card->dev->parent, jack,
|
||||||
|
ARRAY_SIZE(hs_jack_gpios),
|
||||||
|
hs_jack_gpios);
|
||||||
|
if (ret) {
|
||||||
|
/*
|
||||||
|
* flag error but don't bail if jack detect is broken
|
||||||
|
* due to platform issues or bad BIOS/configuration
|
||||||
|
*/
|
||||||
|
dev_err(runtime->dev,
|
||||||
|
"jack detection gpios not added, error %d\n", ret);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The firmware might enable the clock at
|
* The firmware might enable the clock at
|
||||||
* boot (this information may or may not
|
* boot (this information may or may not
|
||||||
|
@ -363,6 +411,7 @@ static struct snd_soc_card snd_soc_card_cht = {
|
||||||
|
|
||||||
static int snd_cht_mc_probe(struct platform_device *pdev)
|
static int snd_cht_mc_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
|
struct device *dev = &pdev->dev;
|
||||||
int ret_val = 0;
|
int ret_val = 0;
|
||||||
struct cht_mc_private *drv;
|
struct cht_mc_private *drv;
|
||||||
|
|
||||||
|
@ -375,6 +424,11 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
|
||||||
/* no need probe TI jack detection chip */
|
/* no need probe TI jack detection chip */
|
||||||
snd_soc_card_cht.aux_dev = NULL;
|
snd_soc_card_cht.aux_dev = NULL;
|
||||||
snd_soc_card_cht.num_aux_devs = 0;
|
snd_soc_card_cht.num_aux_devs = 0;
|
||||||
|
|
||||||
|
ret_val = devm_acpi_dev_add_driver_gpios(dev->parent,
|
||||||
|
acpi_max98090_gpios);
|
||||||
|
if (ret_val)
|
||||||
|
dev_dbg(dev, "Unable to add GPIO mapping table\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* register the soc card */
|
/* register the soc card */
|
||||||
|
|
Loading…
Reference in New Issue