Merge remote-tracking branch 'asoc/topic/intel' into asoc-next
这个提交包含在:
@@ -126,7 +126,7 @@ static int broadwell_rt286_hw_params(struct snd_pcm_substream *substream,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct snd_soc_ops broadwell_rt286_ops = {
|
||||
static const struct snd_soc_ops broadwell_rt286_ops = {
|
||||
.hw_params = broadwell_rt286_hw_params,
|
||||
};
|
||||
|
||||
|
@@ -30,6 +30,7 @@
|
||||
#define BXT_DIALOG_CODEC_DAI "da7219-hifi"
|
||||
#define BXT_MAXIM_CODEC_DAI "HiFi"
|
||||
#define DUAL_CHANNEL 2
|
||||
#define QUAD_CHANNEL 4
|
||||
|
||||
static struct snd_soc_jack broxton_headset;
|
||||
|
||||
@@ -182,6 +183,16 @@ static struct snd_pcm_hw_constraint_list constraints_channels = {
|
||||
.mask = 0,
|
||||
};
|
||||
|
||||
static unsigned int channels_quad[] = {
|
||||
QUAD_CHANNEL,
|
||||
};
|
||||
|
||||
static struct snd_pcm_hw_constraint_list constraints_channels_quad = {
|
||||
.count = ARRAY_SIZE(channels_quad),
|
||||
.list = channels_quad,
|
||||
.mask = 0,
|
||||
};
|
||||
|
||||
static int bxt_fe_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
@@ -258,7 +269,10 @@ static int broxton_dmic_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
{
|
||||
struct snd_interval *channels = hw_param_interval(params,
|
||||
SNDRV_PCM_HW_PARAM_CHANNELS);
|
||||
channels->min = channels->max = DUAL_CHANNEL;
|
||||
if (params_channels(params) == 2)
|
||||
channels->min = channels->max = 2;
|
||||
else
|
||||
channels->min = channels->max = 4;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -267,9 +281,9 @@ static int broxton_dmic_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
|
||||
runtime->hw.channels_max = DUAL_CHANNEL;
|
||||
runtime->hw.channels_min = runtime->hw.channels_max = QUAD_CHANNEL;
|
||||
snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
|
||||
&constraints_channels);
|
||||
&constraints_channels_quad);
|
||||
|
||||
return snd_pcm_hw_constraint_list(substream->runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
|
||||
@@ -348,7 +362,7 @@ static struct snd_soc_dai_link broxton_dais[] = {
|
||||
.dynamic = 1,
|
||||
.ops = &broxton_refcap_ops,
|
||||
},
|
||||
[BXT_DPCM_AUDIO_DMIC_CP]
|
||||
[BXT_DPCM_AUDIO_DMIC_CP] =
|
||||
{
|
||||
.name = "Bxt Audio DMIC cap",
|
||||
.stream_name = "dmiccap",
|
||||
|
@@ -57,9 +57,7 @@ struct byt_rt5640_private {
|
||||
struct clk *mclk;
|
||||
};
|
||||
|
||||
static unsigned long byt_rt5640_quirk = BYT_RT5640_DMIC1_MAP |
|
||||
BYT_RT5640_DMIC_EN |
|
||||
BYT_RT5640_MCLK_EN;
|
||||
static unsigned long byt_rt5640_quirk = BYT_RT5640_MCLK_EN;
|
||||
|
||||
static void log_quirks(struct device *dev)
|
||||
{
|
||||
@@ -689,6 +687,10 @@ static bool is_valleyview(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
struct acpi_chan_package { /* ACPICA seems to require 64 bit integers */
|
||||
u64 aif_value; /* 1: AIF1, 2: AIF2 */
|
||||
u64 mclock_value; /* usually 25MHz (0x17d7940), ignored */
|
||||
};
|
||||
|
||||
static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
|
||||
{
|
||||
@@ -698,6 +700,7 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
|
||||
int i;
|
||||
int dai_index;
|
||||
struct byt_rt5640_private *priv;
|
||||
bool is_bytcr = false;
|
||||
|
||||
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_ATOMIC);
|
||||
if (!priv)
|
||||
@@ -734,10 +737,61 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
|
||||
struct sst_platform_info *p_info = mach->pdata;
|
||||
const struct sst_res_info *res_info = p_info->res_info;
|
||||
|
||||
/* TODO: use CHAN package info from BIOS to detect AIF1/AIF2 */
|
||||
if (res_info->acpi_ipc_irq_index == 0) {
|
||||
if (res_info->acpi_ipc_irq_index == 0)
|
||||
is_bytcr = true;
|
||||
}
|
||||
|
||||
if (is_bytcr) {
|
||||
/*
|
||||
* Baytrail CR platforms may have CHAN package in BIOS, try
|
||||
* to find relevant routing quirk based as done on Windows
|
||||
* platforms. We have to read the information directly from the
|
||||
* BIOS, at this stage the card is not created and the links
|
||||
* with the codec driver/pdata are non-existent
|
||||
*/
|
||||
|
||||
struct acpi_chan_package chan_package;
|
||||
|
||||
/* format specified: 2 64-bit integers */
|
||||
struct acpi_buffer format = {sizeof("NN"), "NN"};
|
||||
struct acpi_buffer state = {0, NULL};
|
||||
struct sst_acpi_package_context pkg_ctx;
|
||||
bool pkg_found = false;
|
||||
|
||||
state.length = sizeof(chan_package);
|
||||
state.pointer = &chan_package;
|
||||
|
||||
pkg_ctx.name = "CHAN";
|
||||
pkg_ctx.length = 2;
|
||||
pkg_ctx.format = &format;
|
||||
pkg_ctx.state = &state;
|
||||
pkg_ctx.data_valid = false;
|
||||
|
||||
pkg_found = sst_acpi_find_package_from_hid(mach->id, &pkg_ctx);
|
||||
if (pkg_found) {
|
||||
if (chan_package.aif_value == 1) {
|
||||
dev_info(&pdev->dev, "BIOS Routing: AIF1 connected\n");
|
||||
byt_rt5640_quirk |= BYT_RT5640_SSP0_AIF1;
|
||||
} else if (chan_package.aif_value == 2) {
|
||||
dev_info(&pdev->dev, "BIOS Routing: AIF2 connected\n");
|
||||
byt_rt5640_quirk |= BYT_RT5640_SSP0_AIF2;
|
||||
} else {
|
||||
dev_info(&pdev->dev, "BIOS Routing isn't valid, ignored\n");
|
||||
pkg_found = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!pkg_found) {
|
||||
/* no BIOS indications, assume SSP0-AIF2 connection */
|
||||
byt_rt5640_quirk |= BYT_RT5640_SSP0_AIF2;
|
||||
}
|
||||
|
||||
/* change defaults for Baytrail-CR capture */
|
||||
byt_rt5640_quirk |= BYT_RT5640_IN1_MAP;
|
||||
byt_rt5640_quirk |= BYT_RT5640_DIFF_MIC;
|
||||
} else {
|
||||
byt_rt5640_quirk |= (BYT_RT5640_DMIC1_MAP |
|
||||
BYT_RT5640_DMIC_EN);
|
||||
}
|
||||
|
||||
/* check quirks before creating card */
|
||||
|
@@ -25,12 +25,14 @@
|
||||
#include <sound/jack.h>
|
||||
#include "../../codecs/rt5670.h"
|
||||
#include "../atom/sst-atom-controls.h"
|
||||
#include "../common/sst-acpi.h"
|
||||
|
||||
/* The platform clock #3 outputs 19.2Mhz clock to codec as I2S MCLK */
|
||||
#define CHT_PLAT_CLK_3_HZ 19200000
|
||||
#define CHT_CODEC_DAI "rt5670-aif1"
|
||||
|
||||
static struct snd_soc_jack cht_bsw_headset;
|
||||
static char cht_bsw_codec_name[16];
|
||||
|
||||
/* Headset jack detection DAPM pins */
|
||||
static struct snd_soc_jack_pin cht_bsw_headset_pins[] = {
|
||||
@@ -339,9 +341,33 @@ static struct snd_soc_card snd_soc_card_cht = {
|
||||
.resume_post = cht_resume_post,
|
||||
};
|
||||
|
||||
#define RT5672_I2C_DEFAULT "i2c-10EC5670:00"
|
||||
|
||||
static int snd_cht_mc_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret_val = 0;
|
||||
struct sst_acpi_mach *mach = pdev->dev.platform_data;
|
||||
const char *i2c_name;
|
||||
int i;
|
||||
|
||||
strcpy(cht_bsw_codec_name, RT5672_I2C_DEFAULT);
|
||||
|
||||
/* fixup codec name based on HID */
|
||||
if (mach) {
|
||||
i2c_name = sst_acpi_find_name_from_hid(mach->id);
|
||||
if (i2c_name) {
|
||||
snprintf(cht_bsw_codec_name, sizeof(cht_bsw_codec_name),
|
||||
"i2c-%s", i2c_name);
|
||||
for (i = 0; i < ARRAY_SIZE(cht_dailink); i++) {
|
||||
if (!strcmp(cht_dailink[i].codec_name,
|
||||
RT5672_I2C_DEFAULT)) {
|
||||
cht_dailink[i].codec_name =
|
||||
cht_bsw_codec_name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* register the soc card */
|
||||
snd_soc_card_cht.dev = &pdev->dev;
|
||||
|
@@ -81,9 +81,9 @@ static struct snd_soc_jack_zone mfld_zones[] = {
|
||||
};
|
||||
|
||||
/* sound card controls */
|
||||
static const char *headset_switch_text[] = {"Earpiece", "Headset"};
|
||||
static const char * const headset_switch_text[] = {"Earpiece", "Headset"};
|
||||
|
||||
static const char *lo_text[] = {"Vibra", "Headset", "IHF", "None"};
|
||||
static const char * const lo_text[] = {"Vibra", "Headset", "IHF", "None"};
|
||||
|
||||
static const struct soc_enum headset_enum =
|
||||
SOC_ENUM_SINGLE_EXT(2, headset_switch_text);
|
||||
|
在新工单中引用
屏蔽一个用户