forked from Minki/linux
Merge remote-tracking branches 'asoc/fix/adav80x', 'asoc/fix/arizona', 'asoc/fix/max98090', 'asoc/fix/rt5640', 'asoc/fix/samsung' and 'asoc/fix/wm8994' into asoc-linus
This commit is contained in:
commit
a1780653b9
@ -865,7 +865,6 @@ const struct regmap_config adav80x_regmap_config = {
|
||||
.val_bits = 8,
|
||||
.pad_bits = 1,
|
||||
.reg_bits = 7,
|
||||
.read_flag_mask = 0x01,
|
||||
|
||||
.max_register = ADAV80X_PLL_OUTE,
|
||||
|
||||
|
@ -1756,17 +1756,6 @@ int arizona_init_dai(struct arizona_priv *priv, int id)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(arizona_init_dai);
|
||||
|
||||
static irqreturn_t arizona_fll_clock_ok(int irq, void *data)
|
||||
{
|
||||
struct arizona_fll *fll = data;
|
||||
|
||||
arizona_fll_dbg(fll, "clock OK\n");
|
||||
|
||||
complete(&fll->ok);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static struct {
|
||||
unsigned int min;
|
||||
unsigned int max;
|
||||
@ -2048,17 +2037,18 @@ static int arizona_is_enabled_fll(struct arizona_fll *fll)
|
||||
static int arizona_enable_fll(struct arizona_fll *fll)
|
||||
{
|
||||
struct arizona *arizona = fll->arizona;
|
||||
unsigned long time_left;
|
||||
bool use_sync = false;
|
||||
int already_enabled = arizona_is_enabled_fll(fll);
|
||||
struct arizona_fll_cfg cfg;
|
||||
int i;
|
||||
unsigned int val;
|
||||
|
||||
if (already_enabled < 0)
|
||||
return already_enabled;
|
||||
|
||||
if (already_enabled) {
|
||||
/* Facilitate smooth refclk across the transition */
|
||||
regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x7,
|
||||
regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x9,
|
||||
ARIZONA_FLL1_GAIN_MASK, 0);
|
||||
regmap_update_bits_async(fll->arizona->regmap, fll->base + 1,
|
||||
ARIZONA_FLL1_FREERUN,
|
||||
@ -2110,9 +2100,6 @@ static int arizona_enable_fll(struct arizona_fll *fll)
|
||||
if (!already_enabled)
|
||||
pm_runtime_get(arizona->dev);
|
||||
|
||||
/* Clear any pending completions */
|
||||
try_wait_for_completion(&fll->ok);
|
||||
|
||||
regmap_update_bits_async(arizona->regmap, fll->base + 1,
|
||||
ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA);
|
||||
if (use_sync)
|
||||
@ -2124,10 +2111,24 @@ static int arizona_enable_fll(struct arizona_fll *fll)
|
||||
regmap_update_bits_async(arizona->regmap, fll->base + 1,
|
||||
ARIZONA_FLL1_FREERUN, 0);
|
||||
|
||||
time_left = wait_for_completion_timeout(&fll->ok,
|
||||
msecs_to_jiffies(250));
|
||||
if (time_left == 0)
|
||||
arizona_fll_dbg(fll, "Waiting for FLL lock...\n");
|
||||
val = 0;
|
||||
for (i = 0; i < 15; i++) {
|
||||
if (i < 5)
|
||||
usleep_range(200, 400);
|
||||
else
|
||||
msleep(20);
|
||||
|
||||
regmap_read(arizona->regmap,
|
||||
ARIZONA_INTERRUPT_RAW_STATUS_5,
|
||||
&val);
|
||||
if (val & (ARIZONA_FLL1_CLOCK_OK_STS << (fll->id - 1)))
|
||||
break;
|
||||
}
|
||||
if (i == 15)
|
||||
arizona_fll_warn(fll, "Timed out waiting for lock\n");
|
||||
else
|
||||
arizona_fll_dbg(fll, "FLL locked (%d polls)\n", i);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -2212,11 +2213,8 @@ EXPORT_SYMBOL_GPL(arizona_set_fll);
|
||||
int arizona_init_fll(struct arizona *arizona, int id, int base, int lock_irq,
|
||||
int ok_irq, struct arizona_fll *fll)
|
||||
{
|
||||
int ret;
|
||||
unsigned int val;
|
||||
|
||||
init_completion(&fll->ok);
|
||||
|
||||
fll->id = id;
|
||||
fll->base = base;
|
||||
fll->arizona = arizona;
|
||||
@ -2238,13 +2236,6 @@ int arizona_init_fll(struct arizona *arizona, int id, int base, int lock_irq,
|
||||
snprintf(fll->clock_ok_name, sizeof(fll->clock_ok_name),
|
||||
"FLL%d clock OK", id);
|
||||
|
||||
ret = arizona_request_irq(arizona, ok_irq, fll->clock_ok_name,
|
||||
arizona_fll_clock_ok, fll);
|
||||
if (ret != 0) {
|
||||
dev_err(arizona->dev, "Failed to get FLL%d clock OK IRQ: %d\n",
|
||||
id, ret);
|
||||
}
|
||||
|
||||
regmap_update_bits(arizona->regmap, fll->base + 1,
|
||||
ARIZONA_FLL1_FREERUN, 0);
|
||||
|
||||
|
@ -242,7 +242,6 @@ struct arizona_fll {
|
||||
int id;
|
||||
unsigned int base;
|
||||
unsigned int vco_mult;
|
||||
struct completion ok;
|
||||
|
||||
unsigned int fout;
|
||||
int sync_src;
|
||||
|
@ -850,6 +850,19 @@ static int max98090_micinput_event(struct snd_soc_dapm_widget *w,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int max98090_shdn_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
||||
struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec);
|
||||
|
||||
if (event & SND_SOC_DAPM_POST_PMU)
|
||||
max98090->shdn_pending = true;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static const char *mic1_mux_text[] = { "IN12", "IN56" };
|
||||
|
||||
static SOC_ENUM_SINGLE_DECL(mic1_mux_enum,
|
||||
@ -1158,9 +1171,11 @@ static const struct snd_soc_dapm_widget max98090_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_SUPPLY("SDOEN", M98090_REG_IO_CONFIGURATION,
|
||||
M98090_SDOEN_SHIFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("DMICL_ENA", M98090_REG_DIGITAL_MIC_ENABLE,
|
||||
M98090_DIGMICL_SHIFT, 0, NULL, 0),
|
||||
M98090_DIGMICL_SHIFT, 0, max98090_shdn_event,
|
||||
SND_SOC_DAPM_POST_PMU),
|
||||
SND_SOC_DAPM_SUPPLY("DMICR_ENA", M98090_REG_DIGITAL_MIC_ENABLE,
|
||||
M98090_DIGMICR_SHIFT, 0, NULL, 0),
|
||||
M98090_DIGMICR_SHIFT, 0, max98090_shdn_event,
|
||||
SND_SOC_DAPM_POST_PMU),
|
||||
SND_SOC_DAPM_SUPPLY("AHPF", M98090_REG_FILTER_CONFIG,
|
||||
M98090_AHPF_SHIFT, 0, NULL, 0),
|
||||
|
||||
@ -1205,10 +1220,12 @@ static const struct snd_soc_dapm_widget max98090_dapm_widgets[] = {
|
||||
&max98090_right_adc_mixer_controls[0],
|
||||
ARRAY_SIZE(max98090_right_adc_mixer_controls)),
|
||||
|
||||
SND_SOC_DAPM_ADC("ADCL", NULL, M98090_REG_INPUT_ENABLE,
|
||||
M98090_ADLEN_SHIFT, 0),
|
||||
SND_SOC_DAPM_ADC("ADCR", NULL, M98090_REG_INPUT_ENABLE,
|
||||
M98090_ADREN_SHIFT, 0),
|
||||
SND_SOC_DAPM_ADC_E("ADCL", NULL, M98090_REG_INPUT_ENABLE,
|
||||
M98090_ADLEN_SHIFT, 0, max98090_shdn_event,
|
||||
SND_SOC_DAPM_POST_PMU),
|
||||
SND_SOC_DAPM_ADC_E("ADCR", NULL, M98090_REG_INPUT_ENABLE,
|
||||
M98090_ADREN_SHIFT, 0, max98090_shdn_event,
|
||||
SND_SOC_DAPM_POST_PMU),
|
||||
|
||||
SND_SOC_DAPM_AIF_OUT("AIFOUTL", "HiFi Capture", 0,
|
||||
SND_SOC_NOPM, 0, 0),
|
||||
@ -2536,9 +2553,26 @@ static int max98090_remove(struct snd_soc_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void max98090_seq_notifier(struct snd_soc_dapm_context *dapm,
|
||||
enum snd_soc_dapm_type event, int subseq)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm);
|
||||
struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec);
|
||||
|
||||
if (max98090->shdn_pending) {
|
||||
snd_soc_update_bits(codec, M98090_REG_DEVICE_SHUTDOWN,
|
||||
M98090_SHDNN_MASK, 0);
|
||||
msleep(40);
|
||||
snd_soc_update_bits(codec, M98090_REG_DEVICE_SHUTDOWN,
|
||||
M98090_SHDNN_MASK, M98090_SHDNN_MASK);
|
||||
max98090->shdn_pending = false;
|
||||
}
|
||||
}
|
||||
|
||||
static struct snd_soc_codec_driver soc_codec_dev_max98090 = {
|
||||
.probe = max98090_probe,
|
||||
.remove = max98090_remove,
|
||||
.seq_notifier = max98090_seq_notifier,
|
||||
.set_bias_level = max98090_set_bias_level,
|
||||
};
|
||||
|
||||
|
@ -1543,6 +1543,7 @@ struct max98090_priv {
|
||||
unsigned int pa2en;
|
||||
unsigned int sidetone;
|
||||
bool master;
|
||||
bool shdn_pending;
|
||||
};
|
||||
|
||||
int max98090_mic_detect(struct snd_soc_codec *codec,
|
||||
|
@ -984,6 +984,35 @@ static int rt5640_hp_event(struct snd_soc_dapm_widget *w,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rt5640_lout_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
hp_amp_power_on(codec);
|
||||
snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
|
||||
RT5640_PWR_LM, RT5640_PWR_LM);
|
||||
snd_soc_update_bits(codec, RT5640_OUTPUT,
|
||||
RT5640_L_MUTE | RT5640_R_MUTE, 0);
|
||||
break;
|
||||
|
||||
case SND_SOC_DAPM_PRE_PMD:
|
||||
snd_soc_update_bits(codec, RT5640_OUTPUT,
|
||||
RT5640_L_MUTE | RT5640_R_MUTE,
|
||||
RT5640_L_MUTE | RT5640_R_MUTE);
|
||||
snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
|
||||
RT5640_PWR_LM, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rt5640_hp_power_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
@ -1179,13 +1208,16 @@ static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = {
|
||||
0, rt5640_spo_l_mix, ARRAY_SIZE(rt5640_spo_l_mix)),
|
||||
SND_SOC_DAPM_MIXER("SPOR MIX", SND_SOC_NOPM, 0,
|
||||
0, rt5640_spo_r_mix, ARRAY_SIZE(rt5640_spo_r_mix)),
|
||||
SND_SOC_DAPM_MIXER("LOUT MIX", RT5640_PWR_ANLG1, RT5640_PWR_LM_BIT, 0,
|
||||
SND_SOC_DAPM_MIXER("LOUT MIX", SND_SOC_NOPM, 0, 0,
|
||||
rt5640_lout_mix, ARRAY_SIZE(rt5640_lout_mix)),
|
||||
SND_SOC_DAPM_SUPPLY_S("Improve HP Amp Drv", 1, SND_SOC_NOPM,
|
||||
0, 0, rt5640_hp_power_event, SND_SOC_DAPM_POST_PMU),
|
||||
SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0,
|
||||
rt5640_hp_event,
|
||||
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
||||
SND_SOC_DAPM_PGA_S("LOUT amp", 1, SND_SOC_NOPM, 0, 0,
|
||||
rt5640_lout_event,
|
||||
SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
|
||||
SND_SOC_DAPM_SUPPLY("HP L Amp", RT5640_PWR_ANLG1,
|
||||
RT5640_PWR_HP_L_BIT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("HP R Amp", RT5640_PWR_ANLG1,
|
||||
@ -1500,8 +1532,10 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
|
||||
{"HP R Playback", "Switch", "HP Amp"},
|
||||
{"HPOL", NULL, "HP L Playback"},
|
||||
{"HPOR", NULL, "HP R Playback"},
|
||||
{"LOUTL", NULL, "LOUT MIX"},
|
||||
{"LOUTR", NULL, "LOUT MIX"},
|
||||
|
||||
{"LOUT amp", NULL, "LOUT MIX"},
|
||||
{"LOUTL", NULL, "LOUT amp"},
|
||||
{"LOUTR", NULL, "LOUT amp"},
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route rt5640_specific_dapm_routes[] = {
|
||||
|
@ -1942,14 +1942,16 @@ static const struct snd_soc_dapm_route intercon[] = {
|
||||
{ "AIF2ADCDAT", NULL, "AIF2ADC Mux" },
|
||||
|
||||
/* AIF3 output */
|
||||
{ "AIF3ADCDAT", "AIF1ADCDAT", "AIF1ADC1L" },
|
||||
{ "AIF3ADCDAT", "AIF1ADCDAT", "AIF1ADC1R" },
|
||||
{ "AIF3ADCDAT", "AIF1ADCDAT", "AIF1ADC2L" },
|
||||
{ "AIF3ADCDAT", "AIF1ADCDAT", "AIF1ADC2R" },
|
||||
{ "AIF3ADCDAT", "AIF2ADCDAT", "AIF2ADCL" },
|
||||
{ "AIF3ADCDAT", "AIF2ADCDAT", "AIF2ADCR" },
|
||||
{ "AIF3ADCDAT", "AIF2DACDAT", "AIF2DACL" },
|
||||
{ "AIF3ADCDAT", "AIF2DACDAT", "AIF2DACR" },
|
||||
{ "AIF3ADC Mux", "AIF1ADCDAT", "AIF1ADC1L" },
|
||||
{ "AIF3ADC Mux", "AIF1ADCDAT", "AIF1ADC1R" },
|
||||
{ "AIF3ADC Mux", "AIF1ADCDAT", "AIF1ADC2L" },
|
||||
{ "AIF3ADC Mux", "AIF1ADCDAT", "AIF1ADC2R" },
|
||||
{ "AIF3ADC Mux", "AIF2ADCDAT", "AIF2ADCL" },
|
||||
{ "AIF3ADC Mux", "AIF2ADCDAT", "AIF2ADCR" },
|
||||
{ "AIF3ADC Mux", "AIF2DACDAT", "AIF2DACL" },
|
||||
{ "AIF3ADC Mux", "AIF2DACDAT", "AIF2DACR" },
|
||||
|
||||
{ "AIF3ADCDAT", NULL, "AIF3ADC Mux" },
|
||||
|
||||
/* Loopback */
|
||||
{ "AIF1 Loopback", "ADCDAT", "AIF1ADCDAT" },
|
||||
|
@ -116,15 +116,6 @@ static int arndale_audio_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int arndale_audio_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct snd_soc_card *card = platform_get_drvdata(pdev);
|
||||
|
||||
snd_soc_unregister_card(card);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id samsung_arndale_rt5631_of_match[] __maybe_unused = {
|
||||
{ .compatible = "samsung,arndale-rt5631", },
|
||||
{ .compatible = "samsung,arndale-alc5631", },
|
||||
@ -139,7 +130,6 @@ static struct platform_driver arndale_audio_driver = {
|
||||
.of_match_table = of_match_ptr(samsung_arndale_rt5631_of_match),
|
||||
},
|
||||
.probe = arndale_audio_probe,
|
||||
.remove = arndale_audio_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(arndale_audio_driver);
|
||||
|
Loading…
Reference in New Issue
Block a user