aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/codecs/da7213.c23
-rw-r--r--sound/soc/codecs/da7213.h4
2 files changed, 27 insertions, 0 deletions
diff --git a/sound/soc/codecs/da7213.c b/sound/soc/codecs/da7213.c
index 701bd6204747..680d11116ccf 100644
--- a/sound/soc/codecs/da7213.c
+++ b/sound/soc/codecs/da7213.c
@@ -734,6 +734,9 @@ static int da7213_dai_event(struct snd_soc_dapm_widget *w,
734{ 734{
735 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); 735 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
736 struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec); 736 struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
737 u8 pll_ctrl, pll_status;
738 int i = 0;
739 bool srm_lock = false;
737 740
738 switch (event) { 741 switch (event) {
739 case SND_SOC_DAPM_PRE_PMU: 742 case SND_SOC_DAPM_PRE_PMU:
@@ -742,6 +745,26 @@ static int da7213_dai_event(struct snd_soc_dapm_widget *w,
742 snd_soc_update_bits(codec, DA7213_DAI_CLK_MODE, 745 snd_soc_update_bits(codec, DA7213_DAI_CLK_MODE,
743 DA7213_DAI_CLK_EN_MASK, 746 DA7213_DAI_CLK_EN_MASK,
744 DA7213_DAI_CLK_EN_MASK); 747 DA7213_DAI_CLK_EN_MASK);
748
749 /* Slave mode, if SRM not enabled no need for status checks */
750 pll_ctrl = snd_soc_read(codec, DA7213_PLL_CTRL);
751 if (!(pll_ctrl & DA7213_PLL_SRM_EN))
752 return 0;
753
754 /* Check SRM has locked */
755 do {
756 pll_status = snd_soc_read(codec, DA7213_PLL_STATUS);
757 if (pll_status & DA7219_PLL_SRM_LOCK) {
758 srm_lock = true;
759 } else {
760 ++i;
761 msleep(50);
762 }
763 } while ((i < DA7213_SRM_CHECK_RETRIES) & (!srm_lock));
764
765 if (!srm_lock)
766 dev_warn(codec->dev, "SRM failed to lock\n");
767
745 return 0; 768 return 0;
746 case SND_SOC_DAPM_POST_PMD: 769 case SND_SOC_DAPM_POST_PMD:
747 /* Disable DAI clks if in master mode */ 770 /* Disable DAI clks if in master mode */
diff --git a/sound/soc/codecs/da7213.h b/sound/soc/codecs/da7213.h
index 5de5c2997e0c..af75340dea63 100644
--- a/sound/soc/codecs/da7213.h
+++ b/sound/soc/codecs/da7213.h
@@ -142,6 +142,9 @@
142 * Bit fields 142 * Bit fields
143 */ 143 */
144 144
145/* DA7213_PLL_STATUS = 0x03 */
146#define DA7219_PLL_SRM_LOCK (0x1 << 1)
147
145/* DA7213_SR = 0x22 */ 148/* DA7213_SR = 0x22 */
146#define DA7213_SR_8000 (0x1 << 0) 149#define DA7213_SR_8000 (0x1 << 0)
147#define DA7213_SR_11025 (0x2 << 0) 150#define DA7213_SR_11025 (0x2 << 0)
@@ -502,6 +505,7 @@
502#define DA7213_PLL_INDIV_10_20_MHZ_VAL 4 505#define DA7213_PLL_INDIV_10_20_MHZ_VAL 4
503#define DA7213_PLL_INDIV_20_40_MHZ_VAL 8 506#define DA7213_PLL_INDIV_20_40_MHZ_VAL 8
504#define DA7213_PLL_INDIV_40_54_MHZ_VAL 16 507#define DA7213_PLL_INDIV_40_54_MHZ_VAL 16
508#define DA7213_SRM_CHECK_RETRIES 8
505 509
506enum da7213_clk_src { 510enum da7213_clk_src {
507 DA7213_CLKSRC_MCLK = 0, 511 DA7213_CLKSRC_MCLK = 0,