aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>2017-04-24 17:34:33 -0400
committerMark Brown <broonie@kernel.org>2017-04-25 11:39:42 -0400
commitcb67d7651676e8c8f2e40587ef591da057806c57 (patch)
tree4329a99b688553dc02b928ac8456a271eb00ec53
parent0b2c9f88b94cd40f6a27641f0bac02a7ba185e39 (diff)
ASoC: bytcr_rt5640: log quirk configuration errors
Now that quirks can be overridden with a module parameter, log errors so that non-sensical quirks introduced by mistake are identified. Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/intel/boards/bytcr_rt5640.c100
1 files changed, 75 insertions, 25 deletions
diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c
index 5ca09cadf39f..f063368edef9 100644
--- a/sound/soc/intel/boards/bytcr_rt5640.c
+++ b/sound/soc/intel/boards/bytcr_rt5640.c
@@ -57,6 +57,7 @@ enum {
57struct byt_rt5640_private { 57struct byt_rt5640_private {
58 struct clk *mclk; 58 struct clk *mclk;
59}; 59};
60static bool is_bytcr;
60 61
61static unsigned long byt_rt5640_quirk = BYT_RT5640_MCLK_EN; 62static unsigned long byt_rt5640_quirk = BYT_RT5640_MCLK_EN;
62static unsigned int quirk_override; 63static unsigned int quirk_override;
@@ -65,30 +66,79 @@ MODULE_PARM_DESC(quirk, "Board-specific quirk override");
65 66
66static void log_quirks(struct device *dev) 67static void log_quirks(struct device *dev)
67{ 68{
68 if (BYT_RT5640_MAP(byt_rt5640_quirk) == BYT_RT5640_DMIC1_MAP) 69 int map;
69 dev_info(dev, "quirk DMIC1_MAP enabled"); 70 bool has_dmic = false;
70 if (BYT_RT5640_MAP(byt_rt5640_quirk) == BYT_RT5640_DMIC2_MAP) 71 bool has_mclk = false;
71 dev_info(dev, "quirk DMIC2_MAP enabled"); 72 bool has_ssp0 = false;
72 if (BYT_RT5640_MAP(byt_rt5640_quirk) == BYT_RT5640_IN1_MAP) 73 bool has_ssp0_aif1 = false;
73 dev_info(dev, "quirk IN1_MAP enabled"); 74 bool has_ssp0_aif2 = false;
74 if (BYT_RT5640_MAP(byt_rt5640_quirk) == BYT_RT5640_IN3_MAP) 75 bool has_ssp2_aif2 = false;
75 dev_info(dev, "quirk IN3_MAP enabled"); 76
76 if (byt_rt5640_quirk & BYT_RT5640_DMIC_EN) 77 map = BYT_RT5640_MAP(byt_rt5640_quirk);
77 dev_info(dev, "quirk DMIC enabled"); 78 switch (map) {
79 case BYT_RT5640_DMIC1_MAP:
80 dev_info(dev, "quirk DMIC1_MAP enabled\n");
81 has_dmic = true;
82 break;
83 case BYT_RT5640_DMIC2_MAP:
84 dev_info(dev, "quirk DMIC2_MAP enabled\n");
85 has_dmic = true;
86 break;
87 case BYT_RT5640_IN1_MAP:
88 dev_info(dev, "quirk IN1_MAP enabled\n");
89 break;
90 case BYT_RT5640_IN3_MAP:
91 dev_info(dev, "quirk IN3_MAP enabled\n");
92 break;
93 default:
94 dev_err(dev, "quirk map 0x%x is not supported, microphone input will not work\n", map);
95 break;
96 }
97 if (byt_rt5640_quirk & BYT_RT5640_DMIC_EN) {
98 if (has_dmic)
99 dev_info(dev, "quirk DMIC enabled\n");
100 else
101 dev_err(dev, "quirk DMIC enabled but no DMIC input set, will be ignored\n");
102 }
78 if (byt_rt5640_quirk & BYT_RT5640_MONO_SPEAKER) 103 if (byt_rt5640_quirk & BYT_RT5640_MONO_SPEAKER)
79 dev_info(dev, "quirk MONO_SPEAKER enabled"); 104 dev_info(dev, "quirk MONO_SPEAKER enabled\n");
80 if (byt_rt5640_quirk & BYT_RT5640_DIFF_MIC) 105 if (byt_rt5640_quirk & BYT_RT5640_DIFF_MIC) {
81 dev_info(dev, "quirk DIFF_MIC enabled"); 106 if (!has_dmic)
82 if (byt_rt5640_quirk & BYT_RT5640_SSP2_AIF2) 107 dev_info(dev, "quirk DIFF_MIC enabled\n");
83 dev_info(dev, "quirk SSP2_AIF2 enabled"); 108 else
84 if (byt_rt5640_quirk & BYT_RT5640_SSP0_AIF1) 109 dev_info(dev, "quirk DIFF_MIC enabled but DMIC input selected, will be ignored\n");
85 dev_info(dev, "quirk SSP0_AIF1 enabled"); 110 }
86 if (byt_rt5640_quirk & BYT_RT5640_SSP0_AIF2) 111 if (byt_rt5640_quirk & BYT_RT5640_SSP0_AIF1) {
87 dev_info(dev, "quirk SSP0_AIF2 enabled"); 112 dev_info(dev, "quirk SSP0_AIF1 enabled\n");
88 if (byt_rt5640_quirk & BYT_RT5640_MCLK_EN) 113 has_ssp0 = true;
89 dev_info(dev, "quirk MCLK_EN enabled"); 114 has_ssp0_aif1 = true;
90 if (byt_rt5640_quirk & BYT_RT5640_MCLK_25MHZ) 115 }
91 dev_info(dev, "quirk MCLK_25MHZ enabled"); 116 if (byt_rt5640_quirk & BYT_RT5640_SSP0_AIF2) {
117 dev_info(dev, "quirk SSP0_AIF2 enabled\n");
118 has_ssp0 = true;
119 has_ssp0_aif2 = true;
120 }
121 if (byt_rt5640_quirk & BYT_RT5640_SSP2_AIF2) {
122 dev_info(dev, "quirk SSP2_AIF2 enabled\n");
123 has_ssp2_aif2 = true;
124 }
125 if (is_bytcr && !has_ssp0)
126 dev_err(dev, "Invalid routing, bytcr detected but no SSP0-based quirk, audio cannot work with SSP2 on bytcr\n");
127 if (has_ssp0_aif1 && has_ssp0_aif2)
128 dev_err(dev, "Invalid routing, SSP0 cannot be connected to both AIF1 and AIF2\n");
129 if (has_ssp0 && has_ssp2_aif2)
130 dev_err(dev, "Invalid routing, cannot have both SSP0 and SSP2 connected to codec\n");
131
132 if (byt_rt5640_quirk & BYT_RT5640_MCLK_EN) {
133 dev_info(dev, "quirk MCLK_EN enabled\n");
134 has_mclk = true;
135 }
136 if (byt_rt5640_quirk & BYT_RT5640_MCLK_25MHZ) {
137 if (has_mclk)
138 dev_info(dev, "quirk MCLK_25MHZ enabled\n");
139 else
140 dev_err(dev, "quirk MCLK_25MHZ enabled but quirk MCLK not selected, will be ignored\n");
141 }
92} 142}
93 143
94 144
@@ -132,7 +182,7 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w,
132 ret = clk_prepare_enable(priv->mclk); 182 ret = clk_prepare_enable(priv->mclk);
133 if (ret < 0) { 183 if (ret < 0) {
134 dev_err(card->dev, 184 dev_err(card->dev,
135 "could not configure MCLK state"); 185 "could not configure MCLK state\n");
136 return ret; 186 return ret;
137 } 187 }
138 } 188 }
@@ -714,8 +764,8 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
714 int i; 764 int i;
715 int dai_index; 765 int dai_index;
716 struct byt_rt5640_private *priv; 766 struct byt_rt5640_private *priv;
717 bool is_bytcr = false;
718 767
768 is_bytcr = false;
719 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_ATOMIC); 769 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_ATOMIC);
720 if (!priv) 770 if (!priv)
721 return -ENOMEM; 771 return -ENOMEM;