diff options
author | Lars-Peter Clausen <lars@metafoo.de> | 2014-05-27 04:53:21 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-05-27 15:54:51 -0400 |
commit | cb07ef36fe2d4f633b69d8c2c7629366509da488 (patch) | |
tree | 86fcd0eb15f8e92a0988f48de76caac7441ba8a2 /sound/soc/blackfin/bfin-eval-adau1x81.c | |
parent | 5dcdbee9cf9411f0c35c4d52cc127b7a851c852f (diff) |
ASoC: Blackfin: ADAU1X81 eval board support
This patch adds a ASoC machine driver to support the EVAL-ADAU1X81 board
connected to a Analog Devices BF5XX evaluation board.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound/soc/blackfin/bfin-eval-adau1x81.c')
-rw-r--r-- | sound/soc/blackfin/bfin-eval-adau1x81.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/sound/soc/blackfin/bfin-eval-adau1x81.c b/sound/soc/blackfin/bfin-eval-adau1x81.c new file mode 100644 index 000000000000..5c380f6aed1a --- /dev/null +++ b/sound/soc/blackfin/bfin-eval-adau1x81.c | |||
@@ -0,0 +1,130 @@ | |||
1 | /* | ||
2 | * Machine driver for EVAL-ADAU1x81 on Analog Devices bfin | ||
3 | * evaluation boards. | ||
4 | * | ||
5 | * Copyright 2011-2014 Analog Devices Inc. | ||
6 | * Author: Lars-Peter Clausen <lars@metafoo.de> | ||
7 | * | ||
8 | * Licensed under the GPL-2 or later. | ||
9 | */ | ||
10 | |||
11 | #include <linux/module.h> | ||
12 | #include <linux/device.h> | ||
13 | #include <linux/slab.h> | ||
14 | #include <sound/core.h> | ||
15 | #include <sound/pcm.h> | ||
16 | #include <sound/soc.h> | ||
17 | #include <sound/pcm_params.h> | ||
18 | |||
19 | #include "../codecs/adau17x1.h" | ||
20 | |||
21 | static const struct snd_soc_dapm_widget bfin_eval_adau1x81_dapm_widgets[] = { | ||
22 | SND_SOC_DAPM_LINE("Stereo In", NULL), | ||
23 | SND_SOC_DAPM_LINE("Beep", NULL), | ||
24 | |||
25 | SND_SOC_DAPM_SPK("Speaker", NULL), | ||
26 | SND_SOC_DAPM_HP("Headphone", NULL), | ||
27 | }; | ||
28 | |||
29 | static const struct snd_soc_dapm_route bfin_eval_adau1x81_dapm_routes[] = { | ||
30 | { "BEEP", NULL, "Beep" }, | ||
31 | { "LMIC", NULL, "Stereo In" }, | ||
32 | { "LMIC", NULL, "Stereo In" }, | ||
33 | |||
34 | { "Headphone", NULL, "AOUTL" }, | ||
35 | { "Headphone", NULL, "AOUTR" }, | ||
36 | { "Speaker", NULL, "SP" }, | ||
37 | }; | ||
38 | |||
39 | static int bfin_eval_adau1x81_hw_params(struct snd_pcm_substream *substream, | ||
40 | struct snd_pcm_hw_params *params) | ||
41 | { | ||
42 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | ||
43 | struct snd_soc_dai *codec_dai = rtd->codec_dai; | ||
44 | int pll_rate; | ||
45 | int ret; | ||
46 | |||
47 | switch (params_rate(params)) { | ||
48 | case 48000: | ||
49 | case 8000: | ||
50 | case 12000: | ||
51 | case 16000: | ||
52 | case 24000: | ||
53 | case 32000: | ||
54 | case 96000: | ||
55 | pll_rate = 48000 * 1024; | ||
56 | break; | ||
57 | case 44100: | ||
58 | case 7350: | ||
59 | case 11025: | ||
60 | case 14700: | ||
61 | case 22050: | ||
62 | case 29400: | ||
63 | case 88200: | ||
64 | pll_rate = 44100 * 1024; | ||
65 | break; | ||
66 | default: | ||
67 | return -EINVAL; | ||
68 | } | ||
69 | |||
70 | ret = snd_soc_dai_set_pll(codec_dai, ADAU17X1_PLL, | ||
71 | ADAU17X1_PLL_SRC_MCLK, 12288000, pll_rate); | ||
72 | if (ret) | ||
73 | return ret; | ||
74 | |||
75 | ret = snd_soc_dai_set_sysclk(codec_dai, ADAU17X1_CLK_SRC_PLL, pll_rate, | ||
76 | SND_SOC_CLOCK_IN); | ||
77 | |||
78 | return ret; | ||
79 | } | ||
80 | |||
81 | static const struct snd_soc_ops bfin_eval_adau1x81_ops = { | ||
82 | .hw_params = bfin_eval_adau1x81_hw_params, | ||
83 | }; | ||
84 | |||
85 | static struct snd_soc_dai_link bfin_eval_adau1x81_dai = { | ||
86 | .name = "adau1x81", | ||
87 | .stream_name = "adau1x81", | ||
88 | .cpu_dai_name = "bfin-i2s.0", | ||
89 | .codec_dai_name = "adau-hifi", | ||
90 | .platform_name = "bfin-i2s-pcm-audio", | ||
91 | .codec_name = "adau1781.0-0038", | ||
92 | .ops = &bfin_eval_adau1x81_ops, | ||
93 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | | ||
94 | SND_SOC_DAIFMT_CBM_CFM, | ||
95 | }; | ||
96 | |||
97 | static struct snd_soc_card bfin_eval_adau1x81 = { | ||
98 | .name = "bfin-eval-adau1x81", | ||
99 | .driver_name = "eval-adau1x81", | ||
100 | .dai_link = &bfin_eval_adau1x81_dai, | ||
101 | .num_links = 1, | ||
102 | |||
103 | .dapm_widgets = bfin_eval_adau1x81_dapm_widgets, | ||
104 | .num_dapm_widgets = ARRAY_SIZE(bfin_eval_adau1x81_dapm_widgets), | ||
105 | .dapm_routes = bfin_eval_adau1x81_dapm_routes, | ||
106 | .num_dapm_routes = ARRAY_SIZE(bfin_eval_adau1x81_dapm_routes), | ||
107 | .fully_routed = true, | ||
108 | }; | ||
109 | |||
110 | static int bfin_eval_adau1x81_probe(struct platform_device *pdev) | ||
111 | { | ||
112 | bfin_eval_adau1x81.dev = &pdev->dev; | ||
113 | |||
114 | return devm_snd_soc_register_card(&pdev->dev, &bfin_eval_adau1x81); | ||
115 | } | ||
116 | |||
117 | static struct platform_driver bfin_eval_adau1x81_driver = { | ||
118 | .driver = { | ||
119 | .name = "bfin-eval-adau1x81", | ||
120 | .owner = THIS_MODULE, | ||
121 | .pm = &snd_soc_pm_ops, | ||
122 | }, | ||
123 | .probe = bfin_eval_adau1x81_probe, | ||
124 | }; | ||
125 | module_platform_driver(bfin_eval_adau1x81_driver); | ||
126 | |||
127 | MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); | ||
128 | MODULE_DESCRIPTION("ALSA SoC bfin adau1x81 driver"); | ||
129 | MODULE_LICENSE("GPL"); | ||
130 | MODULE_ALIAS("platform:bfin-eval-adau1x81"); | ||