aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles Keepax <ckeepax@opensource.cirrus.com>2017-09-04 11:41:49 -0400
committerMark Brown <broonie@kernel.org>2017-09-19 10:57:59 -0400
commit0a229b15d99e0a9761f9672f4ff7efeb18ce0ea1 (patch)
tree081b95808e20da9f428f107382c15cc1681c64cc
parent9e3f9f36a6f40bb6ba9b3844d709314121e4c106 (diff)
ASoC: arizona: Add handling for audio related device tree entries
Currently all the audio related device tree entries are handled by the MFD code, for most parts of the Arizona driver we group the device tree handling with the component that uses it and should do so here as well. Add handling in the ASoC code for the audio device tree entries, a later patch removes the MFD side handling but there is no harm in it being duplicated temporarily. Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/codecs/arizona.c136
-rw-r--r--sound/soc/codecs/arizona.h2
-rw-r--r--sound/soc/codecs/cs47l24.c8
-rw-r--r--sound/soc/codecs/wm5102.c8
-rw-r--r--sound/soc/codecs/wm5110.c8
-rw-r--r--sound/soc/codecs/wm8997.c8
-rw-r--r--sound/soc/codecs/wm8998.c8
7 files changed, 178 insertions, 0 deletions
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c
index ba5f57a58219..e6967385dccb 100644
--- a/sound/soc/codecs/arizona.c
+++ b/sound/soc/codecs/arizona.c
@@ -13,6 +13,7 @@
13#include <linux/delay.h> 13#include <linux/delay.h>
14#include <linux/gcd.h> 14#include <linux/gcd.h>
15#include <linux/module.h> 15#include <linux/module.h>
16#include <linux/of.h>
16#include <linux/pm_runtime.h> 17#include <linux/pm_runtime.h>
17#include <sound/pcm.h> 18#include <sound/pcm.h>
18#include <sound/pcm_params.h> 19#include <sound/pcm_params.h>
@@ -295,8 +296,78 @@ EXPORT_SYMBOL_GPL(arizona_init_gpio);
295 296
296int arizona_init_common(struct arizona *arizona) 297int arizona_init_common(struct arizona *arizona)
297{ 298{
299 struct arizona_pdata *pdata = &arizona->pdata;
300 unsigned int val, mask;
301 int i;
302
298 BLOCKING_INIT_NOTIFIER_HEAD(&arizona->notifier); 303 BLOCKING_INIT_NOTIFIER_HEAD(&arizona->notifier);
299 304
305 for (i = 0; i < ARIZONA_MAX_OUTPUT; ++i) {
306 /* Default is 0 so noop with defaults */
307 if (pdata->out_mono[i])
308 val = ARIZONA_OUT1_MONO;
309 else
310 val = 0;
311
312 regmap_update_bits(arizona->regmap,
313 ARIZONA_OUTPUT_PATH_CONFIG_1L + (i * 8),
314 ARIZONA_OUT1_MONO, val);
315 }
316
317 for (i = 0; i < ARIZONA_MAX_PDM_SPK; i++) {
318 if (pdata->spk_mute[i])
319 regmap_update_bits(arizona->regmap,
320 ARIZONA_PDM_SPK1_CTRL_1 + (i * 2),
321 ARIZONA_SPK1_MUTE_ENDIAN_MASK |
322 ARIZONA_SPK1_MUTE_SEQ1_MASK,
323 pdata->spk_mute[i]);
324
325 if (pdata->spk_fmt[i])
326 regmap_update_bits(arizona->regmap,
327 ARIZONA_PDM_SPK1_CTRL_2 + (i * 2),
328 ARIZONA_SPK1_FMT_MASK,
329 pdata->spk_fmt[i]);
330 }
331
332 for (i = 0; i < ARIZONA_MAX_INPUT; i++) {
333 /* Default for both is 0 so noop with defaults */
334 val = pdata->dmic_ref[i] << ARIZONA_IN1_DMIC_SUP_SHIFT;
335 if (pdata->inmode[i] & ARIZONA_INMODE_DMIC)
336 val |= 1 << ARIZONA_IN1_MODE_SHIFT;
337
338 switch (arizona->type) {
339 case WM8998:
340 case WM1814:
341 regmap_update_bits(arizona->regmap,
342 ARIZONA_ADC_DIGITAL_VOLUME_1L + (i * 8),
343 ARIZONA_IN1L_SRC_SE_MASK,
344 (pdata->inmode[i] & ARIZONA_INMODE_SE)
345 << ARIZONA_IN1L_SRC_SE_SHIFT);
346
347 regmap_update_bits(arizona->regmap,
348 ARIZONA_ADC_DIGITAL_VOLUME_1R + (i * 8),
349 ARIZONA_IN1R_SRC_SE_MASK,
350 (pdata->inmode[i] & ARIZONA_INMODE_SE)
351 << ARIZONA_IN1R_SRC_SE_SHIFT);
352
353 mask = ARIZONA_IN1_DMIC_SUP_MASK |
354 ARIZONA_IN1_MODE_MASK;
355 break;
356 default:
357 if (pdata->inmode[i] & ARIZONA_INMODE_SE)
358 val |= 1 << ARIZONA_IN1_SINGLE_ENDED_SHIFT;
359
360 mask = ARIZONA_IN1_DMIC_SUP_MASK |
361 ARIZONA_IN1_MODE_MASK |
362 ARIZONA_IN1_SINGLE_ENDED_MASK;
363 break;
364 }
365
366 regmap_update_bits(arizona->regmap,
367 ARIZONA_IN1L_CONTROL + (i * 8),
368 mask, val);
369 }
370
300 return 0; 371 return 0;
301} 372}
302EXPORT_SYMBOL_GPL(arizona_init_common); 373EXPORT_SYMBOL_GPL(arizona_init_common);
@@ -2692,6 +2763,71 @@ int arizona_lhpf_coeff_put(struct snd_kcontrol *kcontrol,
2692} 2763}
2693EXPORT_SYMBOL_GPL(arizona_lhpf_coeff_put); 2764EXPORT_SYMBOL_GPL(arizona_lhpf_coeff_put);
2694 2765
2766int arizona_of_get_audio_pdata(struct arizona *arizona)
2767{
2768 struct arizona_pdata *pdata = &arizona->pdata;
2769 struct device_node *np = arizona->dev->of_node;
2770 struct property *prop;
2771 const __be32 *cur;
2772 u32 val;
2773 u32 pdm_val[ARIZONA_MAX_PDM_SPK];
2774 int ret;
2775 int count = 0;
2776
2777 count = 0;
2778 of_property_for_each_u32(np, "wlf,inmode", prop, cur, val) {
2779 if (count == ARRAY_SIZE(pdata->inmode))
2780 break;
2781
2782 pdata->inmode[count] = val;
2783 count++;
2784 }
2785
2786 count = 0;
2787 of_property_for_each_u32(np, "wlf,dmic-ref", prop, cur, val) {
2788 if (count == ARRAY_SIZE(pdata->dmic_ref))
2789 break;
2790
2791 pdata->dmic_ref[count] = val;
2792 count++;
2793 }
2794
2795 count = 0;
2796 of_property_for_each_u32(np, "wlf,out-mono", prop, cur, val) {
2797 if (count == ARRAY_SIZE(pdata->out_mono))
2798 break;
2799
2800 pdata->out_mono[count] = !!val;
2801 count++;
2802 }
2803
2804 count = 0;
2805 of_property_for_each_u32(np, "wlf,max-channels-clocked", prop, cur, val) {
2806 if (count == ARRAY_SIZE(pdata->max_channels_clocked))
2807 break;
2808
2809 pdata->max_channels_clocked[count] = val;
2810 count++;
2811 }
2812
2813 ret = of_property_read_u32_array(np, "wlf,spk-fmt",
2814 pdm_val, ARRAY_SIZE(pdm_val));
2815
2816 if (ret >= 0)
2817 for (count = 0; count < ARRAY_SIZE(pdata->spk_fmt); ++count)
2818 pdata->spk_fmt[count] = pdm_val[count];
2819
2820 ret = of_property_read_u32_array(np, "wlf,spk-mute",
2821 pdm_val, ARRAY_SIZE(pdm_val));
2822
2823 if (ret >= 0)
2824 for (count = 0; count < ARRAY_SIZE(pdata->spk_mute); ++count)
2825 pdata->spk_mute[count] = pdm_val[count];
2826
2827 return 0;
2828}
2829EXPORT_SYMBOL_GPL(arizona_of_get_audio_pdata);
2830
2695MODULE_DESCRIPTION("ASoC Wolfson Arizona class device support"); 2831MODULE_DESCRIPTION("ASoC Wolfson Arizona class device support");
2696MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); 2832MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
2697MODULE_LICENSE("GPL"); 2833MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/arizona.h b/sound/soc/codecs/arizona.h
index 292073ca3bd9..2d198fb2ce97 100644
--- a/sound/soc/codecs/arizona.h
+++ b/sound/soc/codecs/arizona.h
@@ -351,4 +351,6 @@ static inline int arizona_unregister_notifier(struct snd_soc_codec *codec,
351 return blocking_notifier_chain_unregister(&arizona->notifier, nb); 351 return blocking_notifier_chain_unregister(&arizona->notifier, nb);
352} 352}
353 353
354int arizona_of_get_audio_pdata(struct arizona *arizona);
355
354#endif 356#endif
diff --git a/sound/soc/codecs/cs47l24.c b/sound/soc/codecs/cs47l24.c
index fdcc7318993b..0fe7d7a87ff3 100644
--- a/sound/soc/codecs/cs47l24.c
+++ b/sound/soc/codecs/cs47l24.c
@@ -1229,6 +1229,14 @@ static int cs47l24_probe(struct platform_device *pdev)
1229 if (!cs47l24) 1229 if (!cs47l24)
1230 return -ENOMEM; 1230 return -ENOMEM;
1231 1231
1232 if (IS_ENABLED(CONFIG_OF)) {
1233 if (!dev_get_platdata(arizona->dev)) {
1234 ret = arizona_of_get_audio_pdata(arizona);
1235 if (ret < 0)
1236 return ret;
1237 }
1238 }
1239
1232 platform_set_drvdata(pdev, cs47l24); 1240 platform_set_drvdata(pdev, cs47l24);
1233 1241
1234 cs47l24->core.arizona = arizona; 1242 cs47l24->core.arizona = arizona;
diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c
index 8354bdf7fc15..5a917dd73f32 100644
--- a/sound/soc/codecs/wm5102.c
+++ b/sound/soc/codecs/wm5102.c
@@ -2042,6 +2042,14 @@ static int wm5102_probe(struct platform_device *pdev)
2042 return -ENOMEM; 2042 return -ENOMEM;
2043 platform_set_drvdata(pdev, wm5102); 2043 platform_set_drvdata(pdev, wm5102);
2044 2044
2045 if (IS_ENABLED(CONFIG_OF)) {
2046 if (!dev_get_platdata(arizona->dev)) {
2047 ret = arizona_of_get_audio_pdata(arizona);
2048 if (ret < 0)
2049 return ret;
2050 }
2051 }
2052
2045 mutex_init(&arizona->dac_comp_lock); 2053 mutex_init(&arizona->dac_comp_lock);
2046 2054
2047 wm5102->core.arizona = arizona; 2055 wm5102->core.arizona = arizona;
diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c
index 0437df60be77..ba1e90ca8be4 100644
--- a/sound/soc/codecs/wm5110.c
+++ b/sound/soc/codecs/wm5110.c
@@ -2397,6 +2397,14 @@ static int wm5110_probe(struct platform_device *pdev)
2397 return -ENOMEM; 2397 return -ENOMEM;
2398 platform_set_drvdata(pdev, wm5110); 2398 platform_set_drvdata(pdev, wm5110);
2399 2399
2400 if (IS_ENABLED(CONFIG_OF)) {
2401 if (!dev_get_platdata(arizona->dev)) {
2402 ret = arizona_of_get_audio_pdata(arizona);
2403 if (ret < 0)
2404 return ret;
2405 }
2406 }
2407
2400 wm5110->core.arizona = arizona; 2408 wm5110->core.arizona = arizona;
2401 wm5110->core.num_inputs = 8; 2409 wm5110->core.num_inputs = 8;
2402 2410
diff --git a/sound/soc/codecs/wm8997.c b/sound/soc/codecs/wm8997.c
index 91c3c3e052d1..c5aef9ecdecc 100644
--- a/sound/soc/codecs/wm8997.c
+++ b/sound/soc/codecs/wm8997.c
@@ -1134,6 +1134,14 @@ static int wm8997_probe(struct platform_device *pdev)
1134 return -ENOMEM; 1134 return -ENOMEM;
1135 platform_set_drvdata(pdev, wm8997); 1135 platform_set_drvdata(pdev, wm8997);
1136 1136
1137 if (IS_ENABLED(CONFIG_OF)) {
1138 if (!dev_get_platdata(arizona->dev)) {
1139 ret = arizona_of_get_audio_pdata(arizona);
1140 if (ret < 0)
1141 return ret;
1142 }
1143 }
1144
1137 wm8997->core.arizona = arizona; 1145 wm8997->core.arizona = arizona;
1138 wm8997->core.num_inputs = 4; 1146 wm8997->core.num_inputs = 4;
1139 1147
diff --git a/sound/soc/codecs/wm8998.c b/sound/soc/codecs/wm8998.c
index 27a8e1e75f28..c59caaa75ba0 100644
--- a/sound/soc/codecs/wm8998.c
+++ b/sound/soc/codecs/wm8998.c
@@ -1398,6 +1398,14 @@ static int wm8998_probe(struct platform_device *pdev)
1398 return -ENOMEM; 1398 return -ENOMEM;
1399 platform_set_drvdata(pdev, wm8998); 1399 platform_set_drvdata(pdev, wm8998);
1400 1400
1401 if (IS_ENABLED(CONFIG_OF)) {
1402 if (!dev_get_platdata(arizona->dev)) {
1403 ret = arizona_of_get_audio_pdata(arizona);
1404 if (ret < 0)
1405 return ret;
1406 }
1407 }
1408
1401 wm8998->core.arizona = arizona; 1409 wm8998->core.arizona = arizona;
1402 wm8998->core.num_inputs = 3; /* IN1L, IN1R, IN2 */ 1410 wm8998->core.num_inputs = 3; /* IN1L, IN1R, IN2 */
1403 1411