]>
Commit | Line | Data |
---|---|---|
2e8693ee | 1 | /* |
2 | * kirkwood-openrd.c | |
3 | * | |
4 | * (c) 2010 Arnaud Patard <apatard@mandriva.com> | |
69737897 | 5 | * (c) 2010 Arnaud Patard <arnaud.patard@rtp-net.org> |
2e8693ee | 6 | * |
7 | * This program is free software; you can redistribute it and/or modify it | |
8 | * under the terms of the GNU General Public License as published by the | |
9 | * Free Software Foundation; either version 2 of the License, or (at your | |
10 | * option) any later version. | |
11 | */ | |
12 | ||
13 | #include <linux/module.h> | |
14 | #include <linux/moduleparam.h> | |
15 | #include <linux/interrupt.h> | |
16 | #include <linux/platform_device.h> | |
17 | #include <linux/slab.h> | |
18 | #include <sound/soc.h> | |
c02cecb9 | 19 | #include <linux/platform_data/asoc-kirkwood.h> |
2e8693ee | 20 | #include "../codecs/cs42l51.h" |
21 | ||
22 | static int openrd_client_hw_params(struct snd_pcm_substream *substream, | |
23 | struct snd_pcm_hw_params *params) | |
24 | { | |
25 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | |
f0fba2ad | 26 | struct snd_soc_dai *codec_dai = rtd->codec_dai; |
077a2ba4 | 27 | unsigned int freq; |
2e8693ee | 28 | |
29 | switch (params_rate(params)) { | |
30 | default: | |
31 | case 44100: | |
32 | freq = 11289600; | |
33 | break; | |
34 | case 48000: | |
35 | freq = 12288000; | |
36 | break; | |
37 | case 96000: | |
38 | freq = 24576000; | |
39 | break; | |
40 | } | |
41 | ||
42 | return snd_soc_dai_set_sysclk(codec_dai, 0, freq, SND_SOC_CLOCK_IN); | |
43 | ||
44 | } | |
45 | ||
46 | static struct snd_soc_ops openrd_client_ops = { | |
47 | .hw_params = openrd_client_hw_params, | |
48 | }; | |
49 | ||
50 | ||
51 | static struct snd_soc_dai_link openrd_client_dai[] = { | |
52 | { | |
53 | .name = "CS42L51", | |
54 | .stream_name = "CS42L51 HiFi", | |
75b9b65e | 55 | .cpu_dai_name = "i2s", |
64ddf1f8 | 56 | .platform_name = "mvebu-audio", |
c88e7b93 | 57 | .codec_dai_name = "cs42l51-hifi", |
f0fba2ad | 58 | .codec_name = "cs42l51-codec.0-004a", |
077a2ba4 | 59 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS, |
2e8693ee | 60 | .ops = &openrd_client_ops, |
61 | }, | |
62 | }; | |
63 | ||
64 | ||
65 | static struct snd_soc_card openrd_client = { | |
66 | .name = "OpenRD Client", | |
9b344ce8 | 67 | .owner = THIS_MODULE, |
2e8693ee | 68 | .dai_link = openrd_client_dai, |
69 | .num_links = ARRAY_SIZE(openrd_client_dai), | |
70 | }; | |
71 | ||
34e15fbd | 72 | static int openrd_probe(struct platform_device *pdev) |
2e8693ee | 73 | { |
6d6761aa | 74 | struct snd_soc_card *card = &openrd_client; |
2e8693ee | 75 | int ret; |
76 | ||
6d6761aa | 77 | card->dev = &pdev->dev; |
2e8693ee | 78 | |
6d6761aa AL |
79 | ret = snd_soc_register_card(card); |
80 | if (ret) | |
81 | dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", | |
82 | ret); | |
2e8693ee | 83 | return ret; |
84 | } | |
85 | ||
34e15fbd | 86 | static int openrd_remove(struct platform_device *pdev) |
2e8693ee | 87 | { |
6d6761aa AL |
88 | struct snd_soc_card *card = platform_get_drvdata(pdev); |
89 | ||
90 | snd_soc_unregister_card(card); | |
91 | return 0; | |
2e8693ee | 92 | } |
93 | ||
6d6761aa AL |
94 | static struct platform_driver openrd_driver = { |
95 | .driver = { | |
96 | .name = "openrd-client-audio", | |
97 | .owner = THIS_MODULE, | |
98 | }, | |
99 | .probe = openrd_probe, | |
34e15fbd | 100 | .remove = openrd_remove, |
6d6761aa AL |
101 | }; |
102 | ||
103 | module_platform_driver(openrd_driver); | |
2e8693ee | 104 | |
105 | /* Module information */ | |
69737897 | 106 | MODULE_AUTHOR("Arnaud Patard <arnaud.patard@rtp-net.org>"); |
2e8693ee | 107 | MODULE_DESCRIPTION("ALSA SoC OpenRD Client"); |
108 | MODULE_LICENSE("GPL"); | |
6d6761aa | 109 | MODULE_ALIAS("platform:openrd-client-audio"); |