Skip to content

Commit

Permalink
ASoC: da7213: Add checking of SRM lock status before enabling DAI
Browse files Browse the repository at this point in the history
When the codec is DAI clk slave, and the SRM feature of the PLL
is being used, the enabling of the DAI should occur only after
the PLL has locked to the incoming WCLK. This update adds checking
to the the DAI widget event, so it waits for SRM to lock. There is
also a timeout if that lock doesn't occur within a given time.

Signed-off-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Adam Thomson authored and Mark Brown committed May 10, 2016
1 parent a0d5cae commit d575b0b
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 0 deletions.
23 changes: 23 additions & 0 deletions sound/soc/codecs/da7213.c
Original file line number Diff line number Diff line change
Expand Up @@ -734,6 +734,9 @@ static int da7213_dai_event(struct snd_soc_dapm_widget *w,
{
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
u8 pll_ctrl, pll_status;
int i = 0;
bool srm_lock = false;

switch (event) {
case SND_SOC_DAPM_PRE_PMU:
Expand All @@ -742,6 +745,26 @@ static int da7213_dai_event(struct snd_soc_dapm_widget *w,
snd_soc_update_bits(codec, DA7213_DAI_CLK_MODE,
DA7213_DAI_CLK_EN_MASK,
DA7213_DAI_CLK_EN_MASK);

/* Slave mode, if SRM not enabled no need for status checks */
pll_ctrl = snd_soc_read(codec, DA7213_PLL_CTRL);
if (!(pll_ctrl & DA7213_PLL_SRM_EN))
return 0;

/* Check SRM has locked */
do {
pll_status = snd_soc_read(codec, DA7213_PLL_STATUS);
if (pll_status & DA7219_PLL_SRM_LOCK) {
srm_lock = true;
} else {
++i;
msleep(50);
}
} while ((i < DA7213_SRM_CHECK_RETRIES) & (!srm_lock));

if (!srm_lock)
dev_warn(codec->dev, "SRM failed to lock\n");

return 0;
case SND_SOC_DAPM_POST_PMD:
/* Disable DAI clks if in master mode */
Expand Down
4 changes: 4 additions & 0 deletions sound/soc/codecs/da7213.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,9 @@
* Bit fields
*/

/* DA7213_PLL_STATUS = 0x03 */
#define DA7219_PLL_SRM_LOCK (0x1 << 1)

/* DA7213_SR = 0x22 */
#define DA7213_SR_8000 (0x1 << 0)
#define DA7213_SR_11025 (0x2 << 0)
Expand Down Expand Up @@ -502,6 +505,7 @@
#define DA7213_PLL_INDIV_10_20_MHZ_VAL 4
#define DA7213_PLL_INDIV_20_40_MHZ_VAL 8
#define DA7213_PLL_INDIV_40_54_MHZ_VAL 16
#define DA7213_SRM_CHECK_RETRIES 8

enum da7213_clk_src {
DA7213_CLKSRC_MCLK = 0,
Expand Down

0 comments on commit d575b0b

Please sign in to comment.