diff options
author | apatard@mandriva.com <apatard@mandriva.com> | 2010-05-31 07:49:15 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-05-31 08:16:37 -0400 |
commit | 2e8693ee79ff316add7d78964900af2312158d13 (patch) | |
tree | 9fc54cc1bd0df5aad44d4e32d8c619f68e5644f6 /sound | |
parent | f9b95980f87f021f8c69646738929189838ad035 (diff) |
ASoC: kirkwood: Add audio support to openrd client platforms
This patch is adding support for openrd client platforms. It's using
the cs42l51 codec and has one mic and one speaker plugs.
Signed-off-by: Arnaud Patard <apatard@mandriva.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/kirkwood/Kconfig | 9 | ||||
-rw-r--r-- | sound/soc/kirkwood/Makefile | 3 | ||||
-rw-r--r-- | sound/soc/kirkwood/kirkwood-openrd.c | 126 |
3 files changed, 138 insertions, 0 deletions
diff --git a/sound/soc/kirkwood/Kconfig b/sound/soc/kirkwood/Kconfig index 5e151544cec1..16ec2a2dba4d 100644 --- a/sound/soc/kirkwood/Kconfig +++ b/sound/soc/kirkwood/Kconfig | |||
@@ -9,3 +9,12 @@ config SND_KIRKWOOD_SOC | |||
9 | config SND_KIRKWOOD_SOC_I2S | 9 | config SND_KIRKWOOD_SOC_I2S |
10 | tristate | 10 | tristate |
11 | 11 | ||
12 | config SND_KIRKWOOD_SOC_OPENRD | ||
13 | tristate "SoC Audio support for Kirkwood Openrd Client" | ||
14 | depends on SND_KIRKWOOD_SOC && MACH_OPENRD_CLIENT | ||
15 | select SND_KIRKWOOD_SOC_I2S | ||
16 | select SND_SOC_CS42L51 | ||
17 | help | ||
18 | Say Y if you want to add support for SoC audio on | ||
19 | Openrd Client. | ||
20 | |||
diff --git a/sound/soc/kirkwood/Makefile b/sound/soc/kirkwood/Makefile index 89dd3e19e159..33a16dcab5b5 100644 --- a/sound/soc/kirkwood/Makefile +++ b/sound/soc/kirkwood/Makefile | |||
@@ -4,3 +4,6 @@ snd-soc-kirkwood-i2s-objs := kirkwood-i2s.o | |||
4 | obj-$(CONFIG_SND_KIRKWOOD_SOC) += snd-soc-kirkwood.o | 4 | obj-$(CONFIG_SND_KIRKWOOD_SOC) += snd-soc-kirkwood.o |
5 | obj-$(CONFIG_SND_KIRKWOOD_SOC_I2S) += snd-soc-kirkwood-i2s.o | 5 | obj-$(CONFIG_SND_KIRKWOOD_SOC_I2S) += snd-soc-kirkwood-i2s.o |
6 | 6 | ||
7 | snd-soc-openrd-objs := kirkwood-openrd.o | ||
8 | |||
9 | obj-$(CONFIG_SND_KIRKWOOD_SOC_OPENRD) += snd-soc-openrd.o | ||
diff --git a/sound/soc/kirkwood/kirkwood-openrd.c b/sound/soc/kirkwood/kirkwood-openrd.c new file mode 100644 index 000000000000..0353d06bc41a --- /dev/null +++ b/sound/soc/kirkwood/kirkwood-openrd.c | |||
@@ -0,0 +1,126 @@ | |||
1 | /* | ||
2 | * kirkwood-openrd.c | ||
3 | * | ||
4 | * (c) 2010 Arnaud Patard <apatard@mandriva.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the | ||
8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
9 | * option) any later version. | ||
10 | */ | ||
11 | |||
12 | #include <linux/module.h> | ||
13 | #include <linux/moduleparam.h> | ||
14 | #include <linux/interrupt.h> | ||
15 | #include <linux/platform_device.h> | ||
16 | #include <linux/slab.h> | ||
17 | #include <sound/soc.h> | ||
18 | #include <mach/kirkwood.h> | ||
19 | #include <plat/audio.h> | ||
20 | #include <asm/mach-types.h> | ||
21 | #include "kirkwood-i2s.h" | ||
22 | #include "kirkwood-dma.h" | ||
23 | #include "../codecs/cs42l51.h" | ||
24 | |||
25 | static int openrd_client_hw_params(struct snd_pcm_substream *substream, | ||
26 | struct snd_pcm_hw_params *params) | ||
27 | { | ||
28 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | ||
29 | struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; | ||
30 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; | ||
31 | int ret; | ||
32 | unsigned int freq, fmt; | ||
33 | |||
34 | fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS; | ||
35 | ret = snd_soc_dai_set_fmt(cpu_dai, fmt); | ||
36 | if (ret < 0) | ||
37 | return ret; | ||
38 | |||
39 | ret = snd_soc_dai_set_fmt(codec_dai, fmt); | ||
40 | if (ret < 0) | ||
41 | return ret; | ||
42 | |||
43 | switch (params_rate(params)) { | ||
44 | default: | ||
45 | case 44100: | ||
46 | freq = 11289600; | ||
47 | break; | ||
48 | case 48000: | ||
49 | freq = 12288000; | ||
50 | break; | ||
51 | case 96000: | ||
52 | freq = 24576000; | ||
53 | break; | ||
54 | } | ||
55 | |||
56 | return snd_soc_dai_set_sysclk(codec_dai, 0, freq, SND_SOC_CLOCK_IN); | ||
57 | |||
58 | } | ||
59 | |||
60 | static struct snd_soc_ops openrd_client_ops = { | ||
61 | .hw_params = openrd_client_hw_params, | ||
62 | }; | ||
63 | |||
64 | |||
65 | static struct snd_soc_dai_link openrd_client_dai[] = { | ||
66 | { | ||
67 | .name = "CS42L51", | ||
68 | .stream_name = "CS42L51 HiFi", | ||
69 | .cpu_dai = &kirkwood_i2s_dai, | ||
70 | .codec_dai = &cs42l51_dai, | ||
71 | .ops = &openrd_client_ops, | ||
72 | }, | ||
73 | }; | ||
74 | |||
75 | |||
76 | static struct snd_soc_card openrd_client = { | ||
77 | .name = "OpenRD Client", | ||
78 | .platform = &kirkwood_soc_platform, | ||
79 | .dai_link = openrd_client_dai, | ||
80 | .num_links = ARRAY_SIZE(openrd_client_dai), | ||
81 | }; | ||
82 | |||
83 | static struct snd_soc_device openrd_client_snd_devdata = { | ||
84 | .card = &openrd_client, | ||
85 | .codec_dev = &soc_codec_device_cs42l51, | ||
86 | }; | ||
87 | |||
88 | static struct platform_device *openrd_client_snd_device; | ||
89 | |||
90 | static int __init openrd_client_init(void) | ||
91 | { | ||
92 | int ret; | ||
93 | |||
94 | if (!machine_is_openrd_client()) | ||
95 | return 0; | ||
96 | |||
97 | openrd_client_snd_device = platform_device_alloc("soc-audio", -1); | ||
98 | if (!openrd_client_snd_device) | ||
99 | return -ENOMEM; | ||
100 | |||
101 | platform_set_drvdata(openrd_client_snd_device, | ||
102 | &openrd_client_snd_devdata); | ||
103 | openrd_client_snd_devdata.dev = &openrd_client_snd_device->dev; | ||
104 | |||
105 | ret = platform_device_add(openrd_client_snd_device); | ||
106 | if (ret) { | ||
107 | printk(KERN_ERR "%s: platform_device_add failed\n", __func__); | ||
108 | platform_device_put(openrd_client_snd_device); | ||
109 | } | ||
110 | |||
111 | return ret; | ||
112 | } | ||
113 | |||
114 | static void __exit openrd_client_exit(void) | ||
115 | { | ||
116 | platform_device_unregister(openrd_client_snd_device); | ||
117 | } | ||
118 | |||
119 | module_init(openrd_client_init); | ||
120 | module_exit(openrd_client_exit); | ||
121 | |||
122 | /* Module information */ | ||
123 | MODULE_AUTHOR("Arnaud Patard <apatard@mandriva.com>"); | ||
124 | MODULE_DESCRIPTION("ALSA SoC OpenRD Client"); | ||
125 | MODULE_LICENSE("GPL"); | ||
126 | MODULE_ALIAS("platform:soc-audio"); | ||