Commit 43fc3571 authored by Lucas Tanure's avatar Lucas Tanure Committed by Mark Brown

ASoC: cs42l42: Set clock source for both ways of stream

Move the enable/disable of clocks to cs42l42_mute_stream so the record
path also get clocks.
Signed-off-by: default avatarLucas Tanure <tanureal@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20210306185553.62053-10-tanureal@opensource.cirrus.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 621d65f3
...@@ -784,52 +784,63 @@ static int cs42l42_set_sysclk(struct snd_soc_dai *dai, ...@@ -784,52 +784,63 @@ static int cs42l42_set_sysclk(struct snd_soc_dai *dai,
return 0; return 0;
} }
static int cs42l42_mute(struct snd_soc_dai *dai, int mute, int direction) static int cs42l42_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
{ {
struct snd_soc_component *component = dai->component; struct snd_soc_component *component = dai->component;
struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
unsigned int regval; unsigned int regval;
u8 fullScaleVol; u8 fullScaleVol;
if (mute) { if (mute) {
/* Mark SCLK as not present to turn on the internal
* oscillator.
*/
snd_soc_component_update_bits(component, CS42L42_OSC_SWITCH,
CS42L42_SCLK_PRESENT_MASK, 0);
snd_soc_component_update_bits(component, CS42L42_PLL_CTL1,
CS42L42_PLL_START_MASK,
0 << CS42L42_PLL_START_SHIFT);
/* Mute the headphone */ /* Mute the headphone */
snd_soc_component_update_bits(component, CS42L42_HP_CTL, if (stream == SNDRV_PCM_STREAM_PLAYBACK)
CS42L42_HP_ANA_AMUTE_MASK | snd_soc_component_update_bits(component, CS42L42_HP_CTL,
CS42L42_HP_ANA_BMUTE_MASK, CS42L42_HP_ANA_AMUTE_MASK |
CS42L42_HP_ANA_AMUTE_MASK | CS42L42_HP_ANA_BMUTE_MASK,
CS42L42_HP_ANA_BMUTE_MASK); CS42L42_HP_ANA_AMUTE_MASK |
CS42L42_HP_ANA_BMUTE_MASK);
cs42l42->stream_use &= ~(1 << stream);
if(!cs42l42->stream_use) {
/*
* Switch to the internal oscillator.
* SCLK must remain running until after this clock switch.
* Without a source of clock the I2C bus doesn't work.
*/
snd_soc_component_update_bits(component, CS42L42_OSC_SWITCH,
CS42L42_SCLK_PRESENT_MASK, 0);
snd_soc_component_update_bits(component, CS42L42_PLL_CTL1,
CS42L42_PLL_START_MASK, 0);
}
} else { } else {
snd_soc_component_update_bits(component, CS42L42_PLL_CTL1, if (!cs42l42->stream_use) {
CS42L42_PLL_START_MASK, /* SCLK must be running before codec unmute */
1 << CS42L42_PLL_START_SHIFT); snd_soc_component_update_bits(component, CS42L42_PLL_CTL1,
/* Read the headphone load */ CS42L42_PLL_START_MASK, 1);
regval = snd_soc_component_read(component, CS42L42_LOAD_DET_RCSTAT);
if (((regval & CS42L42_RLA_STAT_MASK) >> /* Mark SCLK as present, turn off internal oscillator */
CS42L42_RLA_STAT_SHIFT) == CS42L42_RLA_STAT_15_OHM) { snd_soc_component_update_bits(component, CS42L42_OSC_SWITCH,
fullScaleVol = CS42L42_HP_FULL_SCALE_VOL_MASK; CS42L42_SCLK_PRESENT_MASK,
} else { CS42L42_SCLK_PRESENT_MASK);
fullScaleVol = 0;
} }
cs42l42->stream_use |= 1 << stream;
if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
/* Read the headphone load */
regval = snd_soc_component_read(component, CS42L42_LOAD_DET_RCSTAT);
if (((regval & CS42L42_RLA_STAT_MASK) >> CS42L42_RLA_STAT_SHIFT) ==
CS42L42_RLA_STAT_15_OHM) {
fullScaleVol = CS42L42_HP_FULL_SCALE_VOL_MASK;
} else {
fullScaleVol = 0;
}
/* Un-mute the headphone, set the full scale volume flag */ /* Un-mute the headphone, set the full scale volume flag */
snd_soc_component_update_bits(component, CS42L42_HP_CTL, snd_soc_component_update_bits(component, CS42L42_HP_CTL,
CS42L42_HP_ANA_AMUTE_MASK | CS42L42_HP_ANA_AMUTE_MASK |
CS42L42_HP_ANA_BMUTE_MASK | CS42L42_HP_ANA_BMUTE_MASK |
CS42L42_HP_FULL_SCALE_VOL_MASK, fullScaleVol); CS42L42_HP_FULL_SCALE_VOL_MASK, fullScaleVol);
}
/* Mark SCLK as present, turn off internal oscillator */
snd_soc_component_update_bits(component, CS42L42_OSC_SWITCH,
CS42L42_SCLK_PRESENT_MASK,
CS42L42_SCLK_PRESENT_MASK);
} }
return 0; return 0;
...@@ -844,8 +855,7 @@ static const struct snd_soc_dai_ops cs42l42_ops = { ...@@ -844,8 +855,7 @@ static const struct snd_soc_dai_ops cs42l42_ops = {
.hw_params = cs42l42_pcm_hw_params, .hw_params = cs42l42_pcm_hw_params,
.set_fmt = cs42l42_set_dai_fmt, .set_fmt = cs42l42_set_dai_fmt,
.set_sysclk = cs42l42_set_sysclk, .set_sysclk = cs42l42_set_sysclk,
.mute_stream = cs42l42_mute, .mute_stream = cs42l42_mute_stream,
.no_capture_mute = 1,
}; };
static struct snd_soc_dai_driver cs42l42_dai = { static struct snd_soc_dai_driver cs42l42_dai = {
......
...@@ -768,6 +768,7 @@ struct cs42l42_private { ...@@ -768,6 +768,7 @@ struct cs42l42_private {
u8 bias_thresholds[CS42L42_NUM_BIASES]; u8 bias_thresholds[CS42L42_NUM_BIASES];
u8 hs_bias_ramp_rate; u8 hs_bias_ramp_rate;
u8 hs_bias_ramp_time; u8 hs_bias_ramp_time;
u8 stream_use;
}; };
#endif /* __CS42L42_H__ */ #endif /* __CS42L42_H__ */
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