diff options
author | Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> | 2017-04-24 17:34:33 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-04-25 11:39:42 -0400 |
commit | cb67d7651676e8c8f2e40587ef591da057806c57 (patch) | |
tree | 4329a99b688553dc02b928ac8456a271eb00ec53 | |
parent | 0b2c9f88b94cd40f6a27641f0bac02a7ba185e39 (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.c | 100 |
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 { | |||
57 | struct byt_rt5640_private { | 57 | struct byt_rt5640_private { |
58 | struct clk *mclk; | 58 | struct clk *mclk; |
59 | }; | 59 | }; |
60 | static bool is_bytcr; | ||
60 | 61 | ||
61 | static unsigned long byt_rt5640_quirk = BYT_RT5640_MCLK_EN; | 62 | static unsigned long byt_rt5640_quirk = BYT_RT5640_MCLK_EN; |
62 | static unsigned int quirk_override; | 63 | static unsigned int quirk_override; |
@@ -65,30 +66,79 @@ MODULE_PARM_DESC(quirk, "Board-specific quirk override"); | |||
65 | 66 | ||
66 | static void log_quirks(struct device *dev) | 67 | static 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; |