ASoC: Intel: Add jack detection for Broadwell
Add jack dectection and event reporting for Broadwell. It use combo jack on BDW platform, which including Mic Jack pin and Headphone jack pin. Signed-off-by: Jie Yang <yang.jie@intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Родитель
7fb73c74ff
Коммит
c1e99c913b
|
@ -19,6 +19,7 @@
|
||||||
#include <sound/core.h>
|
#include <sound/core.h>
|
||||||
#include <sound/pcm.h>
|
#include <sound/pcm.h>
|
||||||
#include <sound/soc.h>
|
#include <sound/soc.h>
|
||||||
|
#include <sound/jack.h>
|
||||||
#include <sound/pcm_params.h>
|
#include <sound/pcm_params.h>
|
||||||
|
|
||||||
#include "sst-dsp.h"
|
#include "sst-dsp.h"
|
||||||
|
@ -26,8 +27,26 @@
|
||||||
|
|
||||||
#include "../codecs/rt286.h"
|
#include "../codecs/rt286.h"
|
||||||
|
|
||||||
|
static struct snd_soc_jack broadwell_headset;
|
||||||
|
/* Headset jack detection DAPM pins */
|
||||||
|
static struct snd_soc_jack_pin broadwell_headset_pins[] = {
|
||||||
|
{
|
||||||
|
.pin = "Mic Jack",
|
||||||
|
.mask = SND_JACK_MICROPHONE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.pin = "Headphone Jack",
|
||||||
|
.mask = SND_JACK_HEADPHONE,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct snd_kcontrol_new broadwell_controls[] = {
|
||||||
|
SOC_DAPM_PIN_SWITCH("Speaker"),
|
||||||
|
SOC_DAPM_PIN_SWITCH("Headphone Jack"),
|
||||||
|
};
|
||||||
|
|
||||||
static const struct snd_soc_dapm_widget broadwell_widgets[] = {
|
static const struct snd_soc_dapm_widget broadwell_widgets[] = {
|
||||||
SND_SOC_DAPM_HP("Headphones", NULL),
|
SND_SOC_DAPM_HP("Headphone Jack", NULL),
|
||||||
SND_SOC_DAPM_SPK("Speaker", NULL),
|
SND_SOC_DAPM_SPK("Speaker", NULL),
|
||||||
SND_SOC_DAPM_MIC("Mic Jack", NULL),
|
SND_SOC_DAPM_MIC("Mic Jack", NULL),
|
||||||
SND_SOC_DAPM_MIC("DMIC1", NULL),
|
SND_SOC_DAPM_MIC("DMIC1", NULL),
|
||||||
|
@ -42,7 +61,7 @@ static const struct snd_soc_dapm_route broadwell_rt286_map[] = {
|
||||||
{"Speaker", NULL, "SPOL"},
|
{"Speaker", NULL, "SPOL"},
|
||||||
|
|
||||||
/* HP jack connectors - unknown if we have jack deteck */
|
/* HP jack connectors - unknown if we have jack deteck */
|
||||||
{"Headphones", NULL, "HPO Pin"},
|
{"Headphone Jack", NULL, "HPO Pin"},
|
||||||
|
|
||||||
/* other jacks */
|
/* other jacks */
|
||||||
{"MIC1", NULL, "Mic Jack"},
|
{"MIC1", NULL, "Mic Jack"},
|
||||||
|
@ -57,6 +76,27 @@ static const struct snd_soc_dapm_route broadwell_rt286_map[] = {
|
||||||
{"AIF1 Playback", NULL, "SSP0 CODEC OUT"},
|
{"AIF1 Playback", NULL, "SSP0 CODEC OUT"},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int broadwell_rt286_codec_init(struct snd_soc_pcm_runtime *rtd)
|
||||||
|
{
|
||||||
|
struct snd_soc_codec *codec = rtd->codec;
|
||||||
|
int ret = 0;
|
||||||
|
ret = snd_soc_jack_new(codec, "Headset",
|
||||||
|
SND_JACK_HEADSET | SND_JACK_BTN_0, &broadwell_headset);
|
||||||
|
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = snd_soc_jack_add_pins(&broadwell_headset,
|
||||||
|
ARRAY_SIZE(broadwell_headset_pins),
|
||||||
|
broadwell_headset_pins);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
rt286_mic_detect(codec, &broadwell_headset);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int broadwell_ssp0_fixup(struct snd_soc_pcm_runtime *rtd,
|
static int broadwell_ssp0_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||||
struct snd_pcm_hw_params *params)
|
struct snd_pcm_hw_params *params)
|
||||||
{
|
{
|
||||||
|
@ -116,7 +156,7 @@ static int broadwell_rtd_init(struct snd_soc_pcm_runtime *rtd)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* always connected - check HP for jack detect */
|
/* always connected - check HP for jack detect */
|
||||||
snd_soc_dapm_enable_pin(dapm, "Headphones");
|
snd_soc_dapm_enable_pin(dapm, "Headphone Jack");
|
||||||
snd_soc_dapm_enable_pin(dapm, "Speaker");
|
snd_soc_dapm_enable_pin(dapm, "Speaker");
|
||||||
snd_soc_dapm_enable_pin(dapm, "Mic Jack");
|
snd_soc_dapm_enable_pin(dapm, "Mic Jack");
|
||||||
snd_soc_dapm_enable_pin(dapm, "Line Jack");
|
snd_soc_dapm_enable_pin(dapm, "Line Jack");
|
||||||
|
@ -196,6 +236,7 @@ static struct snd_soc_dai_link broadwell_rt286_dais[] = {
|
||||||
.no_pcm = 1,
|
.no_pcm = 1,
|
||||||
.codec_name = "i2c-INT343A:00",
|
.codec_name = "i2c-INT343A:00",
|
||||||
.codec_dai_name = "rt286-aif1",
|
.codec_dai_name = "rt286-aif1",
|
||||||
|
.init = broadwell_rt286_codec_init,
|
||||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
|
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
|
||||||
SND_SOC_DAIFMT_CBS_CFS,
|
SND_SOC_DAIFMT_CBS_CFS,
|
||||||
.ignore_suspend = 1,
|
.ignore_suspend = 1,
|
||||||
|
@ -213,6 +254,8 @@ static struct snd_soc_card broadwell_rt286 = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.dai_link = broadwell_rt286_dais,
|
.dai_link = broadwell_rt286_dais,
|
||||||
.num_links = ARRAY_SIZE(broadwell_rt286_dais),
|
.num_links = ARRAY_SIZE(broadwell_rt286_dais),
|
||||||
|
.controls = broadwell_controls,
|
||||||
|
.num_controls = ARRAY_SIZE(broadwell_controls),
|
||||||
.dapm_widgets = broadwell_widgets,
|
.dapm_widgets = broadwell_widgets,
|
||||||
.num_dapm_widgets = ARRAY_SIZE(broadwell_widgets),
|
.num_dapm_widgets = ARRAY_SIZE(broadwell_widgets),
|
||||||
.dapm_routes = broadwell_rt286_map,
|
.dapm_routes = broadwell_rt286_map,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче