Commit dea38fc5 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'asoc/fix/ak4613', 'asoc/fix/atmel',...

Merge remote-tracking branches 'asoc/fix/ak4613', 'asoc/fix/atmel', 'asoc/fix/compress', 'asoc/fix/cs35l35' and 'asoc/fix/da7219' into asoc-linus
...@@ -227,7 +227,7 @@ int tse850_put_ana(struct snd_kcontrol *kctrl, ...@@ -227,7 +227,7 @@ int tse850_put_ana(struct snd_kcontrol *kctrl,
static const char * const mux_text[] = { "Mixer", "Loop" }; static const char * const mux_text[] = { "Mixer", "Loop" };
static const struct soc_enum mux_enum = static const struct soc_enum mux_enum =
SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, mux_text); SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(mux_text), mux_text);
static const struct snd_kcontrol_new mux1 = static const struct snd_kcontrol_new mux1 =
SOC_DAPM_ENUM_EXT("MUX1", mux_enum, tse850_get_mux1, tse850_put_mux1); SOC_DAPM_ENUM_EXT("MUX1", mux_enum, tse850_get_mux1, tse850_put_mux1);
...@@ -252,7 +252,7 @@ static const char * const ana_text[] = { ...@@ -252,7 +252,7 @@ static const char * const ana_text[] = {
}; };
static const struct soc_enum ana_enum = static const struct soc_enum ana_enum =
SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 9, ana_text); SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(ana_text), ana_text);
static const struct snd_kcontrol_new out = static const struct snd_kcontrol_new out =
SOC_DAPM_ENUM_EXT("ANA", ana_enum, tse850_get_ana, tse850_put_ana); SOC_DAPM_ENUM_EXT("ANA", ana_enum, tse850_get_ana, tse850_put_ana);
......
...@@ -345,7 +345,7 @@ static int ak4613_dai_hw_params(struct snd_pcm_substream *substream, ...@@ -345,7 +345,7 @@ static int ak4613_dai_hw_params(struct snd_pcm_substream *substream,
if (ak4613_dai_fmt_matching(priv->iface, is_play, fmt, width)) if (ak4613_dai_fmt_matching(priv->iface, is_play, fmt, width))
iface = priv->iface; iface = priv->iface;
} else { } else {
for (i = ARRAY_SIZE(ak4613_iface); i >= 0; i--) { for (i = ARRAY_SIZE(ak4613_iface) - 1; i >= 0; i--) {
if (!ak4613_dai_fmt_matching(ak4613_iface + i, if (!ak4613_dai_fmt_matching(ak4613_iface + i,
is_play, is_play,
fmt, width)) fmt, width))
......
...@@ -162,6 +162,14 @@ static bool cs35l35_precious_register(struct device *dev, unsigned int reg) ...@@ -162,6 +162,14 @@ static bool cs35l35_precious_register(struct device *dev, unsigned int reg)
} }
} }
static void cs35l35_reset(struct cs35l35_private *cs35l35)
{
gpiod_set_value_cansleep(cs35l35->reset_gpio, 0);
usleep_range(2000, 2100);
gpiod_set_value_cansleep(cs35l35->reset_gpio, 1);
usleep_range(1000, 1100);
}
static int cs35l35_wait_for_pdn(struct cs35l35_private *cs35l35) static int cs35l35_wait_for_pdn(struct cs35l35_private *cs35l35)
{ {
int ret; int ret;
...@@ -1454,7 +1462,7 @@ static int cs35l35_i2c_probe(struct i2c_client *i2c_client, ...@@ -1454,7 +1462,7 @@ static int cs35l35_i2c_probe(struct i2c_client *i2c_client,
} }
} }
gpiod_set_value_cansleep(cs35l35->reset_gpio, 1); cs35l35_reset(cs35l35);
init_completion(&cs35l35->pdn_done); init_completion(&cs35l35->pdn_done);
......
...@@ -115,19 +115,21 @@ static void da7219_aad_hptest_work(struct work_struct *work) ...@@ -115,19 +115,21 @@ static void da7219_aad_hptest_work(struct work_struct *work)
struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec);
u16 tonegen_freq_hptest; u16 tonegen_freq_hptest;
u8 pll_srm_sts, gain_ramp_ctrl, accdet_cfg8; u8 pll_srm_sts, pll_ctrl, gain_ramp_ctrl, accdet_cfg8;
int report = 0, ret = 0; int report = 0, ret = 0;
/* Lock DAPM and any Kcontrols that are affected by this test */ /* Lock DAPM, Kcontrols affected by this test and the PLL */
snd_soc_dapm_mutex_lock(dapm); snd_soc_dapm_mutex_lock(dapm);
mutex_lock(&da7219->lock); mutex_lock(&da7219->ctrl_lock);
mutex_lock(&da7219->pll_lock);
/* Ensure MCLK is available for HP test procedure */ /* Ensure MCLK is available for HP test procedure */
if (da7219->mclk) { if (da7219->mclk) {
ret = clk_prepare_enable(da7219->mclk); ret = clk_prepare_enable(da7219->mclk);
if (ret) { if (ret) {
dev_err(codec->dev, "Failed to enable mclk - %d\n", ret); dev_err(codec->dev, "Failed to enable mclk - %d\n", ret);
mutex_unlock(&da7219->lock); mutex_unlock(&da7219->pll_lock);
mutex_unlock(&da7219->ctrl_lock);
snd_soc_dapm_mutex_unlock(dapm); snd_soc_dapm_mutex_unlock(dapm);
return; return;
} }
...@@ -136,12 +138,21 @@ static void da7219_aad_hptest_work(struct work_struct *work) ...@@ -136,12 +138,21 @@ static void da7219_aad_hptest_work(struct work_struct *work)
/* /*
* If MCLK not present, then we're using the internal oscillator and * If MCLK not present, then we're using the internal oscillator and
* require different frequency settings to achieve the same result. * require different frequency settings to achieve the same result.
*
* If MCLK is present, but PLL is not enabled then we enable it here to
* ensure a consistent detection procedure.
*/ */
pll_srm_sts = snd_soc_read(codec, DA7219_PLL_SRM_STS); pll_srm_sts = snd_soc_read(codec, DA7219_PLL_SRM_STS);
if (pll_srm_sts & DA7219_PLL_SRM_STS_MCLK) if (pll_srm_sts & DA7219_PLL_SRM_STS_MCLK) {
tonegen_freq_hptest = cpu_to_le16(DA7219_AAD_HPTEST_RAMP_FREQ); tonegen_freq_hptest = cpu_to_le16(DA7219_AAD_HPTEST_RAMP_FREQ);
else
pll_ctrl = snd_soc_read(codec, DA7219_PLL_CTRL);
if ((pll_ctrl & DA7219_PLL_MODE_MASK) == DA7219_PLL_MODE_BYPASS)
da7219_set_pll(codec, DA7219_SYSCLK_PLL,
DA7219_PLL_FREQ_OUT_98304);
} else {
tonegen_freq_hptest = cpu_to_le16(DA7219_AAD_HPTEST_RAMP_FREQ_INT_OSC); tonegen_freq_hptest = cpu_to_le16(DA7219_AAD_HPTEST_RAMP_FREQ_INT_OSC);
}
/* Ensure gain ramping at fastest rate */ /* Ensure gain ramping at fastest rate */
gain_ramp_ctrl = snd_soc_read(codec, DA7219_GAIN_RAMP_CTRL); gain_ramp_ctrl = snd_soc_read(codec, DA7219_GAIN_RAMP_CTRL);
...@@ -302,11 +313,17 @@ static void da7219_aad_hptest_work(struct work_struct *work) ...@@ -302,11 +313,17 @@ static void da7219_aad_hptest_work(struct work_struct *work)
snd_soc_update_bits(codec, DA7219_HP_R_CTRL, DA7219_HP_R_AMP_OE_MASK, snd_soc_update_bits(codec, DA7219_HP_R_CTRL, DA7219_HP_R_AMP_OE_MASK,
DA7219_HP_R_AMP_OE_MASK); DA7219_HP_R_AMP_OE_MASK);
/* Restore PLL to previous configuration, if re-configured */
if ((pll_srm_sts & DA7219_PLL_SRM_STS_MCLK) &&
((pll_ctrl & DA7219_PLL_MODE_MASK) == DA7219_PLL_MODE_BYPASS))
da7219_set_pll(codec, DA7219_SYSCLK_MCLK, 0);
/* Remove MCLK, if previously enabled */ /* Remove MCLK, if previously enabled */
if (da7219->mclk) if (da7219->mclk)
clk_disable_unprepare(da7219->mclk); clk_disable_unprepare(da7219->mclk);
mutex_unlock(&da7219->lock); mutex_unlock(&da7219->pll_lock);
mutex_unlock(&da7219->ctrl_lock);
snd_soc_dapm_mutex_unlock(dapm); snd_soc_dapm_mutex_unlock(dapm);
/* /*
......
...@@ -260,9 +260,9 @@ static int da7219_volsw_locked_get(struct snd_kcontrol *kcontrol, ...@@ -260,9 +260,9 @@ static int da7219_volsw_locked_get(struct snd_kcontrol *kcontrol,
struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec);
int ret; int ret;
mutex_lock(&da7219->lock); mutex_lock(&da7219->ctrl_lock);
ret = snd_soc_get_volsw(kcontrol, ucontrol); ret = snd_soc_get_volsw(kcontrol, ucontrol);
mutex_unlock(&da7219->lock); mutex_unlock(&da7219->ctrl_lock);
return ret; return ret;
} }
...@@ -274,9 +274,9 @@ static int da7219_volsw_locked_put(struct snd_kcontrol *kcontrol, ...@@ -274,9 +274,9 @@ static int da7219_volsw_locked_put(struct snd_kcontrol *kcontrol,
struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec);
int ret; int ret;
mutex_lock(&da7219->lock); mutex_lock(&da7219->ctrl_lock);
ret = snd_soc_put_volsw(kcontrol, ucontrol); ret = snd_soc_put_volsw(kcontrol, ucontrol);
mutex_unlock(&da7219->lock); mutex_unlock(&da7219->ctrl_lock);
return ret; return ret;
} }
...@@ -288,9 +288,9 @@ static int da7219_enum_locked_get(struct snd_kcontrol *kcontrol, ...@@ -288,9 +288,9 @@ static int da7219_enum_locked_get(struct snd_kcontrol *kcontrol,
struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec);
int ret; int ret;
mutex_lock(&da7219->lock); mutex_lock(&da7219->ctrl_lock);
ret = snd_soc_get_enum_double(kcontrol, ucontrol); ret = snd_soc_get_enum_double(kcontrol, ucontrol);
mutex_unlock(&da7219->lock); mutex_unlock(&da7219->ctrl_lock);
return ret; return ret;
} }
...@@ -302,9 +302,9 @@ static int da7219_enum_locked_put(struct snd_kcontrol *kcontrol, ...@@ -302,9 +302,9 @@ static int da7219_enum_locked_put(struct snd_kcontrol *kcontrol,
struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec);
int ret; int ret;
mutex_lock(&da7219->lock); mutex_lock(&da7219->ctrl_lock);
ret = snd_soc_put_enum_double(kcontrol, ucontrol); ret = snd_soc_put_enum_double(kcontrol, ucontrol);
mutex_unlock(&da7219->lock); mutex_unlock(&da7219->ctrl_lock);
return ret; return ret;
} }
...@@ -424,9 +424,9 @@ static int da7219_tonegen_freq_get(struct snd_kcontrol *kcontrol, ...@@ -424,9 +424,9 @@ static int da7219_tonegen_freq_get(struct snd_kcontrol *kcontrol,
u16 val; u16 val;
int ret; int ret;
mutex_lock(&da7219->lock); mutex_lock(&da7219->ctrl_lock);
ret = regmap_raw_read(da7219->regmap, reg, &val, sizeof(val)); ret = regmap_raw_read(da7219->regmap, reg, &val, sizeof(val));
mutex_unlock(&da7219->lock); mutex_unlock(&da7219->ctrl_lock);
if (ret) if (ret)
return ret; return ret;
...@@ -458,9 +458,9 @@ static int da7219_tonegen_freq_put(struct snd_kcontrol *kcontrol, ...@@ -458,9 +458,9 @@ static int da7219_tonegen_freq_put(struct snd_kcontrol *kcontrol,
*/ */
val = cpu_to_le16(ucontrol->value.integer.value[0]); val = cpu_to_le16(ucontrol->value.integer.value[0]);
mutex_lock(&da7219->lock); mutex_lock(&da7219->ctrl_lock);
ret = regmap_raw_write(da7219->regmap, reg, &val, sizeof(val)); ret = regmap_raw_write(da7219->regmap, reg, &val, sizeof(val));
mutex_unlock(&da7219->lock); mutex_unlock(&da7219->ctrl_lock);
return ret; return ret;
} }
...@@ -801,7 +801,7 @@ static int da7219_dai_event(struct snd_soc_dapm_widget *w, ...@@ -801,7 +801,7 @@ static int da7219_dai_event(struct snd_soc_dapm_widget *w,
++i; ++i;
msleep(50); msleep(50);
} }
} while ((i < DA7219_SRM_CHECK_RETRIES) && (!srm_lock)); } while ((i < DA7219_SRM_CHECK_RETRIES) & (!srm_lock));
if (!srm_lock) if (!srm_lock)
dev_warn(codec->dev, "SRM failed to lock\n"); dev_warn(codec->dev, "SRM failed to lock\n");
...@@ -1129,6 +1129,8 @@ static int da7219_set_dai_sysclk(struct snd_soc_dai *codec_dai, ...@@ -1129,6 +1129,8 @@ static int da7219_set_dai_sysclk(struct snd_soc_dai *codec_dai,
return -EINVAL; return -EINVAL;
} }
mutex_lock(&da7219->pll_lock);
switch (clk_id) { switch (clk_id) {
case DA7219_CLKSRC_MCLK_SQR: case DA7219_CLKSRC_MCLK_SQR:
snd_soc_update_bits(codec, DA7219_PLL_CTRL, snd_soc_update_bits(codec, DA7219_PLL_CTRL,
...@@ -1141,6 +1143,7 @@ static int da7219_set_dai_sysclk(struct snd_soc_dai *codec_dai, ...@@ -1141,6 +1143,7 @@ static int da7219_set_dai_sysclk(struct snd_soc_dai *codec_dai,
break; break;
default: default:
dev_err(codec_dai->dev, "Unknown clock source %d\n", clk_id); dev_err(codec_dai->dev, "Unknown clock source %d\n", clk_id);
mutex_unlock(&da7219->pll_lock);
return -EINVAL; return -EINVAL;
} }
...@@ -1152,19 +1155,20 @@ static int da7219_set_dai_sysclk(struct snd_soc_dai *codec_dai, ...@@ -1152,19 +1155,20 @@ static int da7219_set_dai_sysclk(struct snd_soc_dai *codec_dai,
if (ret) { if (ret) {
dev_err(codec_dai->dev, "Failed to set clock rate %d\n", dev_err(codec_dai->dev, "Failed to set clock rate %d\n",
freq); freq);
mutex_unlock(&da7219->pll_lock);
return ret; return ret;
} }
} }
da7219->mclk_rate = freq; da7219->mclk_rate = freq;
mutex_unlock(&da7219->pll_lock);
return 0; return 0;
} }
static int da7219_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, int da7219_set_pll(struct snd_soc_codec *codec, int source, unsigned int fout)
int source, unsigned int fref, unsigned int fout)
{ {
struct snd_soc_codec *codec = codec_dai->codec;
struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec); struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec);
u8 pll_ctrl, indiv_bits, indiv; u8 pll_ctrl, indiv_bits, indiv;
...@@ -1237,6 +1241,20 @@ static int da7219_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, ...@@ -1237,6 +1241,20 @@ static int da7219_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
return 0; return 0;
} }
static int da7219_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
int source, unsigned int fref, unsigned int fout)
{
struct snd_soc_codec *codec = codec_dai->codec;
struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec);
int ret;
mutex_lock(&da7219->pll_lock);
ret = da7219_set_pll(codec, source, fout);
mutex_unlock(&da7219->pll_lock);
return ret;
}
static int da7219_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) static int da7219_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
{ {
struct snd_soc_codec *codec = codec_dai->codec; struct snd_soc_codec *codec = codec_dai->codec;
...@@ -1741,7 +1759,8 @@ static int da7219_probe(struct snd_soc_codec *codec) ...@@ -1741,7 +1759,8 @@ static int da7219_probe(struct snd_soc_codec *codec)
unsigned int rev; unsigned int rev;
int ret; int ret;
mutex_init(&da7219->lock); mutex_init(&da7219->ctrl_lock);
mutex_init(&da7219->pll_lock);
/* Regulator configuration */ /* Regulator configuration */
ret = da7219_handle_supplies(codec); ret = da7219_handle_supplies(codec);
......
...@@ -810,7 +810,8 @@ struct da7219_priv { ...@@ -810,7 +810,8 @@ struct da7219_priv {
bool wakeup_source; bool wakeup_source;
struct regulator_bulk_data supplies[DA7219_NUM_SUPPLIES]; struct regulator_bulk_data supplies[DA7219_NUM_SUPPLIES];
struct regmap *regmap; struct regmap *regmap;
struct mutex lock; struct mutex ctrl_lock;
struct mutex pll_lock;
struct clk *mclk; struct clk *mclk;
unsigned int mclk_rate; unsigned int mclk_rate;
...@@ -821,4 +822,6 @@ struct da7219_priv { ...@@ -821,4 +822,6 @@ struct da7219_priv {
u8 gain_ramp_ctrl; u8 gain_ramp_ctrl;
}; };
int da7219_set_pll(struct snd_soc_codec *codec, int source, unsigned int fout);
#endif /* __DA7219_H */ #endif /* __DA7219_H */
...@@ -81,7 +81,8 @@ static int soc_compr_open(struct snd_compr_stream *cstream) ...@@ -81,7 +81,8 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
static int soc_compr_open_fe(struct snd_compr_stream *cstream) static int soc_compr_open_fe(struct snd_compr_stream *cstream)
{ {
struct snd_soc_pcm_runtime *fe = cstream->private_data; struct snd_soc_pcm_runtime *fe = cstream->private_data;
struct snd_pcm_substream *fe_substream = fe->pcm->streams[0].substream; struct snd_pcm_substream *fe_substream =
fe->pcm->streams[cstream->direction].substream;
struct snd_soc_platform *platform = fe->platform; struct snd_soc_platform *platform = fe->platform;
struct snd_soc_dai *cpu_dai = fe->cpu_dai; struct snd_soc_dai *cpu_dai = fe->cpu_dai;
struct snd_soc_dpcm *dpcm; struct snd_soc_dpcm *dpcm;
...@@ -467,7 +468,8 @@ static int soc_compr_set_params_fe(struct snd_compr_stream *cstream, ...@@ -467,7 +468,8 @@ static int soc_compr_set_params_fe(struct snd_compr_stream *cstream,
struct snd_compr_params *params) struct snd_compr_params *params)
{ {
struct snd_soc_pcm_runtime *fe = cstream->private_data; struct snd_soc_pcm_runtime *fe = cstream->private_data;
struct snd_pcm_substream *fe_substream = fe->pcm->streams[0].substream; struct snd_pcm_substream *fe_substream =
fe->pcm->streams[cstream->direction].substream;
struct snd_soc_platform *platform = fe->platform; struct snd_soc_platform *platform = fe->platform;
struct snd_soc_dai *cpu_dai = fe->cpu_dai; struct snd_soc_dai *cpu_dai = fe->cpu_dai;
int ret = 0, stream; int ret = 0, stream;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment