diff options
author | Lars-Peter Clausen <lars@metafoo.de> | 2011-06-27 11:04:02 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-06-28 12:12:44 -0400 |
commit | aef05294df7ac2b55920dd40977bf9835d4bf3f1 (patch) | |
tree | c8d06d820dd24e0d2fee00f85f2bbacf2a0ca78d /sound/soc/blackfin | |
parent | cc52688a08880021d31a109f36ee4a78c10ba214 (diff) |
ASoC: Blackfin: Add machine driver for EVAL-ADAV80X boards
Add a machine driver to support the EVAL-ADAV801 and EVAL-ADAV803 boards
connected to a Analog Devices BF5XX evaluation board.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Acked-by: Mike Frysinger <vapier@gentoo.org>
Acked-by: Liam Girdwood <lrg@ti.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/blackfin')
-rw-r--r-- | sound/soc/blackfin/Kconfig | 13 | ||||
-rw-r--r-- | sound/soc/blackfin/Makefile | 2 | ||||
-rw-r--r-- | sound/soc/blackfin/bfin-eval-adav80x.c | 173 |
3 files changed, 188 insertions, 0 deletions
diff --git a/sound/soc/blackfin/Kconfig b/sound/soc/blackfin/Kconfig index fa6a6d2abffc..fe9d548a6837 100644 --- a/sound/soc/blackfin/Kconfig +++ b/sound/soc/blackfin/Kconfig | |||
@@ -27,6 +27,19 @@ config SND_SOC_BFIN_EVAL_ADAU1701 | |||
27 | board connected to one of the Blackfin evaluation boards like the | 27 | board connected to one of the Blackfin evaluation boards like the |
28 | BF5XX-STAMP or BF5XX-EZKIT. | 28 | BF5XX-STAMP or BF5XX-EZKIT. |
29 | 29 | ||
30 | config SND_SOC_BFIN_EVAL_ADAV80X | ||
31 | tristate "Support for the EVAL-ADAV80X boards on Blackfin eval boards" | ||
32 | depends on SND_BF5XX_I2S && (SPI_MASTER || I2C) | ||
33 | select SND_BF5XX_SOC_I2S | ||
34 | select SND_SOC_ADAV80X | ||
35 | help | ||
36 | Say Y if you want to add support for the Analog Devices EVAL-ADAV801 or | ||
37 | EVAL-ADAV803 board connected to one of the Blackfin evaluation boards | ||
38 | like the BF5XX-STAMP or BF5XX-EZKIT. | ||
39 | |||
40 | Note: This driver assumes that the ADAV80X digital record and playback | ||
41 | interfaces are connected to the first SPORT port on the BF5XX board. | ||
42 | |||
30 | config SND_BF5XX_SOC_AD73311 | 43 | config SND_BF5XX_SOC_AD73311 |
31 | tristate "SoC AD73311 Audio support for Blackfin" | 44 | tristate "SoC AD73311 Audio support for Blackfin" |
32 | depends on SND_BF5XX_I2S | 45 | depends on SND_BF5XX_I2S |
diff --git a/sound/soc/blackfin/Makefile b/sound/soc/blackfin/Makefile index f01bff63177d..6018bf52a234 100644 --- a/sound/soc/blackfin/Makefile +++ b/sound/soc/blackfin/Makefile | |||
@@ -22,6 +22,7 @@ snd-ssm2602-objs := bf5xx-ssm2602.o | |||
22 | snd-ad73311-objs := bf5xx-ad73311.o | 22 | snd-ad73311-objs := bf5xx-ad73311.o |
23 | snd-ad193x-objs := bf5xx-ad193x.o | 23 | snd-ad193x-objs := bf5xx-ad193x.o |
24 | snd-soc-bfin-eval-adau1701-objs := bfin-eval-adau1701.o | 24 | snd-soc-bfin-eval-adau1701-objs := bfin-eval-adau1701.o |
25 | snd-soc-bfin-eval-adav80x-objs := bfin-eval-adav80x.o | ||
25 | 26 | ||
26 | obj-$(CONFIG_SND_BF5XX_SOC_AD1836) += snd-ad1836.o | 27 | obj-$(CONFIG_SND_BF5XX_SOC_AD1836) += snd-ad1836.o |
27 | obj-$(CONFIG_SND_BF5XX_SOC_AD1980) += snd-ad1980.o | 28 | obj-$(CONFIG_SND_BF5XX_SOC_AD1980) += snd-ad1980.o |
@@ -29,3 +30,4 @@ obj-$(CONFIG_SND_BF5XX_SOC_SSM2602) += snd-ssm2602.o | |||
29 | obj-$(CONFIG_SND_BF5XX_SOC_AD73311) += snd-ad73311.o | 30 | obj-$(CONFIG_SND_BF5XX_SOC_AD73311) += snd-ad73311.o |
30 | obj-$(CONFIG_SND_BF5XX_SOC_AD193X) += snd-ad193x.o | 31 | obj-$(CONFIG_SND_BF5XX_SOC_AD193X) += snd-ad193x.o |
31 | obj-$(CONFIG_SND_SOC_BFIN_EVAL_ADAU1701) += snd-soc-bfin-eval-adau1701.o | 32 | obj-$(CONFIG_SND_SOC_BFIN_EVAL_ADAU1701) += snd-soc-bfin-eval-adau1701.o |
33 | obj-$(CONFIG_SND_SOC_BFIN_EVAL_ADAV80X) += snd-soc-bfin-eval-adav80x.o | ||
diff --git a/sound/soc/blackfin/bfin-eval-adav80x.c b/sound/soc/blackfin/bfin-eval-adav80x.c new file mode 100644 index 000000000000..8d014d01626e --- /dev/null +++ b/sound/soc/blackfin/bfin-eval-adav80x.c | |||
@@ -0,0 +1,173 @@ | |||
1 | /* | ||
2 | * Machine driver for EVAL-ADAV801 and EVAL-ADAV803 on Analog Devices bfin | ||
3 | * evaluation boards. | ||
4 | * | ||
5 | * Copyright 2011 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/init.h> | ||
12 | #include <linux/platform_device.h> | ||
13 | #include <sound/core.h> | ||
14 | #include <sound/pcm.h> | ||
15 | #include <sound/soc.h> | ||
16 | |||
17 | #include "../codecs/adav80x.h" | ||
18 | |||
19 | static const struct snd_soc_dapm_widget bfin_eval_adav80x_dapm_widgets[] = { | ||
20 | SND_SOC_DAPM_LINE("Line Out", NULL), | ||
21 | SND_SOC_DAPM_LINE("Line In", NULL), | ||
22 | }; | ||
23 | |||
24 | static const struct snd_soc_dapm_route bfin_eval_adav80x_dapm_routes[] = { | ||
25 | { "Line Out", NULL, "VOUTL" }, | ||
26 | { "Line Out", NULL, "VOUTR" }, | ||
27 | |||
28 | { "VINL", NULL, "Line In" }, | ||
29 | { "VINR", NULL, "Line In" }, | ||
30 | }; | ||
31 | |||
32 | static int bfin_eval_adav80x_hw_params(struct snd_pcm_substream *substream, | ||
33 | struct snd_pcm_hw_params *params) | ||
34 | { | ||
35 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | ||
36 | struct snd_soc_dai *cpu_dai = rtd->cpu_dai; | ||
37 | struct snd_soc_dai *codec_dai = rtd->codec_dai; | ||
38 | int ret; | ||
39 | |||
40 | ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S | | ||
41 | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); | ||
42 | if (ret) | ||
43 | return ret; | ||
44 | |||
45 | ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S | | ||
46 | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); | ||
47 | if (ret) | ||
48 | return ret; | ||
49 | |||
50 | ret = snd_soc_dai_set_pll(codec_dai, ADAV80X_PLL1, ADAV80X_PLL_SRC_XTAL, | ||
51 | 27000000, params_rate(params) * 256); | ||
52 | if (ret) | ||
53 | return ret; | ||
54 | |||
55 | ret = snd_soc_dai_set_sysclk(codec_dai, ADAV80X_CLK_PLL1, | ||
56 | params_rate(params) * 256, SND_SOC_CLOCK_IN); | ||
57 | |||
58 | return ret; | ||
59 | } | ||
60 | |||
61 | static int bfin_eval_adav80x_codec_init(struct snd_soc_pcm_runtime *rtd) | ||
62 | { | ||
63 | struct snd_soc_dai *codec_dai = rtd->codec_dai; | ||
64 | |||
65 | snd_soc_dai_set_sysclk(codec_dai, ADAV80X_CLK_SYSCLK1, 0, | ||
66 | SND_SOC_CLOCK_OUT); | ||
67 | snd_soc_dai_set_sysclk(codec_dai, ADAV80X_CLK_SYSCLK2, 0, | ||
68 | SND_SOC_CLOCK_OUT); | ||
69 | snd_soc_dai_set_sysclk(codec_dai, ADAV80X_CLK_SYSCLK3, 0, | ||
70 | SND_SOC_CLOCK_OUT); | ||
71 | |||
72 | snd_soc_dai_set_sysclk(codec_dai, ADAV80X_CLK_XTAL, 2700000, 0); | ||
73 | |||
74 | return 0; | ||
75 | } | ||
76 | |||
77 | static struct snd_soc_ops bfin_eval_adav80x_ops = { | ||
78 | .hw_params = bfin_eval_adav80x_hw_params, | ||
79 | }; | ||
80 | |||
81 | static struct snd_soc_dai_link bfin_eval_adav80x_dais[] = { | ||
82 | { | ||
83 | .name = "adav80x", | ||
84 | .stream_name = "ADAV80x HiFi", | ||
85 | .cpu_dai_name = "bfin-i2s.0", | ||
86 | .codec_dai_name = "adav80x-hifi", | ||
87 | .platform_name = "bfin-i2s-pcm-audio", | ||
88 | .init = bfin_eval_adav80x_codec_init, | ||
89 | .ops = &bfin_eval_adav80x_ops, | ||
90 | }, | ||
91 | }; | ||
92 | |||
93 | static struct snd_soc_card bfin_eval_adav80x = { | ||
94 | .name = "bfin-eval-adav80x", | ||
95 | .dai_link = bfin_eval_adav80x_dais, | ||
96 | .num_links = ARRAY_SIZE(bfin_eval_adav80x_dais), | ||
97 | |||
98 | .dapm_widgets = bfin_eval_adav80x_dapm_widgets, | ||
99 | .num_dapm_widgets = ARRAY_SIZE(bfin_eval_adav80x_dapm_widgets), | ||
100 | .dapm_routes = bfin_eval_adav80x_dapm_routes, | ||
101 | .num_dapm_routes = ARRAY_SIZE(bfin_eval_adav80x_dapm_routes), | ||
102 | }; | ||
103 | |||
104 | enum bfin_eval_adav80x_type { | ||
105 | BFIN_EVAL_ADAV801, | ||
106 | BFIN_EVAL_ADAV803, | ||
107 | }; | ||
108 | |||
109 | static int bfin_eval_adav80x_probe(struct platform_device *pdev) | ||
110 | { | ||
111 | struct snd_soc_card *card = &bfin_eval_adav80x; | ||
112 | const char *codec_name; | ||
113 | |||
114 | switch (platform_get_device_id(pdev)->driver_data) { | ||
115 | case BFIN_EVAL_ADAV801: | ||
116 | codec_name = "spi0.1"; | ||
117 | break; | ||
118 | case BFIN_EVAL_ADAV803: | ||
119 | codec_name = "adav803.0-0034"; | ||
120 | break; | ||
121 | default: | ||
122 | return -EINVAL; | ||
123 | } | ||
124 | |||
125 | bfin_eval_adav80x_dais[0].codec_name = codec_name; | ||
126 | |||
127 | card->dev = &pdev->dev; | ||
128 | |||
129 | return snd_soc_register_card(&bfin_eval_adav80x); | ||
130 | } | ||
131 | |||
132 | static int __devexit bfin_eval_adav80x_remove(struct platform_device *pdev) | ||
133 | { | ||
134 | struct snd_soc_card *card = platform_get_drvdata(pdev); | ||
135 | |||
136 | snd_soc_unregister_card(card); | ||
137 | |||
138 | return 0; | ||
139 | } | ||
140 | |||
141 | static const struct platform_device_id bfin_eval_adav80x_ids[] = { | ||
142 | { "bfin-eval-adav801", BFIN_EVAL_ADAV801 }, | ||
143 | { "bfin-eval-adav803", BFIN_EVAL_ADAV803 }, | ||
144 | { }, | ||
145 | }; | ||
146 | MODULE_DEVICE_TABLE(platform, bfin_eval_adav80x_ids); | ||
147 | |||
148 | static struct platform_driver bfin_eval_adav80x_driver = { | ||
149 | .driver = { | ||
150 | .name = "bfin-eval-adav80x", | ||
151 | .owner = THIS_MODULE, | ||
152 | .pm = &snd_soc_pm_ops, | ||
153 | }, | ||
154 | .probe = bfin_eval_adav80x_probe, | ||
155 | .remove = __devexit_p(bfin_eval_adav80x_remove), | ||
156 | .id_table = bfin_eval_adav80x_ids, | ||
157 | }; | ||
158 | |||
159 | static int __init bfin_eval_adav80x_init(void) | ||
160 | { | ||
161 | return platform_driver_register(&bfin_eval_adav80x_driver); | ||
162 | } | ||
163 | module_init(bfin_eval_adav80x_init); | ||
164 | |||
165 | static void __exit bfin_eval_adav80x_exit(void) | ||
166 | { | ||
167 | platform_driver_unregister(&bfin_eval_adav80x_driver); | ||
168 | } | ||
169 | module_exit(bfin_eval_adav80x_exit); | ||
170 | |||
171 | MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); | ||
172 | MODULE_DESCRIPTION("ALSA SoC bfin adav80x driver"); | ||
173 | MODULE_LICENSE("GPL"); | ||