diff options
Diffstat (limited to 'sound/soc/at91/eti_b1_wm8731.c')
-rw-r--r-- | sound/soc/at91/eti_b1_wm8731.c | 64 |
1 files changed, 51 insertions, 13 deletions
diff --git a/sound/soc/at91/eti_b1_wm8731.c b/sound/soc/at91/eti_b1_wm8731.c index d955cacf2d0d..089cdc9e7265 100644 --- a/sound/soc/at91/eti_b1_wm8731.c +++ b/sound/soc/at91/eti_b1_wm8731.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * eti_b1_wm8731 -- SoC audio for Endrelia ETI_B1. | 2 | * eti_b1_wm8731 -- SoC audio for AT91RM9200-based Endrelia ETI_B1 board. |
3 | * | 3 | * |
4 | * Author: Frank Mandarino <fmandarino@endrelia.com> | 4 | * Author: Frank Mandarino <fmandarino@endrelia.com> |
5 | * Endrelia Technologies Inc. | 5 | * Endrelia Technologies Inc. |
@@ -37,12 +37,12 @@ | |||
37 | #include <sound/soc.h> | 37 | #include <sound/soc.h> |
38 | #include <sound/soc-dapm.h> | 38 | #include <sound/soc-dapm.h> |
39 | 39 | ||
40 | #include <asm/arch/at91rm9200.h> | ||
41 | #include <asm/arch/gpio.h> | ||
42 | #include <asm/arch/hardware.h> | 40 | #include <asm/arch/hardware.h> |
41 | #include <asm/arch/at91_pio.h> | ||
42 | #include <asm/arch/gpio.h> | ||
43 | 43 | ||
44 | #include "../codecs/wm8731.h" | 44 | #include "../codecs/wm8731.h" |
45 | #include "at91rm9200-pcm.h" | 45 | #include "at91-pcm.h" |
46 | 46 | ||
47 | #if 0 | 47 | #if 0 |
48 | #define DBG(x...) printk(KERN_INFO "eti_b1_wm8731:" x) | 48 | #define DBG(x...) printk(KERN_INFO "eti_b1_wm8731:" x) |
@@ -50,10 +50,18 @@ | |||
50 | #define DBG(x...) | 50 | #define DBG(x...) |
51 | #endif | 51 | #endif |
52 | 52 | ||
53 | #define AT91_PIO_TF1 (1 << (AT91_PIN_PB6 - PIN_BASE) % 32) | ||
54 | #define AT91_PIO_TK1 (1 << (AT91_PIN_PB7 - PIN_BASE) % 32) | ||
55 | #define AT91_PIO_TD1 (1 << (AT91_PIN_PB8 - PIN_BASE) % 32) | ||
56 | #define AT91_PIO_RD1 (1 << (AT91_PIN_PB9 - PIN_BASE) % 32) | ||
57 | #define AT91_PIO_RK1 (1 << (AT91_PIN_PB10 - PIN_BASE) % 32) | ||
58 | #define AT91_PIO_RF1 (1 << (AT91_PIN_PB11 - PIN_BASE) % 32) | ||
59 | |||
60 | |||
53 | static struct clk *pck1_clk; | 61 | static struct clk *pck1_clk; |
54 | static struct clk *pllb_clk; | 62 | static struct clk *pllb_clk; |
55 | 63 | ||
56 | static int eti_b1_startup(snd_pcm_substream_t *substream) | 64 | static int eti_b1_startup(struct snd_pcm_substream *substream) |
57 | { | 65 | { |
58 | /* Start PCK1 clock. */ | 66 | /* Start PCK1 clock. */ |
59 | clk_enable(pck1_clk); | 67 | clk_enable(pck1_clk); |
@@ -62,7 +70,7 @@ static int eti_b1_startup(snd_pcm_substream_t *substream) | |||
62 | return 0; | 70 | return 0; |
63 | } | 71 | } |
64 | 72 | ||
65 | static void eti_b1_shutdown(snd_pcm_substream_t *substream) | 73 | static void eti_b1_shutdown(struct snd_pcm_substream *substream) |
66 | { | 74 | { |
67 | /* Stop PCK1 clock. */ | 75 | /* Stop PCK1 clock. */ |
68 | clk_disable(pck1_clk); | 76 | clk_disable(pck1_clk); |
@@ -138,7 +146,7 @@ unsigned int eti_b1_config_sysclk(struct snd_soc_pcm_runtime *rtd, | |||
138 | static struct snd_soc_dai_link eti_b1_dai = { | 146 | static struct snd_soc_dai_link eti_b1_dai = { |
139 | .name = "WM8731", | 147 | .name = "WM8731", |
140 | .stream_name = "WM8731", | 148 | .stream_name = "WM8731", |
141 | .cpu_dai = &at91rm9200_i2s_dai[1], | 149 | .cpu_dai = &at91_i2s_dai[1], |
142 | .codec_dai = &wm8731_dai, | 150 | .codec_dai = &wm8731_dai, |
143 | .init = eti_b1_wm8731_init, | 151 | .init = eti_b1_wm8731_init, |
144 | .config_sysclk = eti_b1_config_sysclk, | 152 | .config_sysclk = eti_b1_config_sysclk, |
@@ -157,7 +165,7 @@ static struct wm8731_setup_data eti_b1_wm8731_setup = { | |||
157 | 165 | ||
158 | static struct snd_soc_device eti_b1_snd_devdata = { | 166 | static struct snd_soc_device eti_b1_snd_devdata = { |
159 | .machine = &snd_soc_machine_eti_b1, | 167 | .machine = &snd_soc_machine_eti_b1, |
160 | .platform = &at91rm9200_soc_platform, | 168 | .platform = &at91_soc_platform, |
161 | .codec_dev = &soc_codec_dev_wm8731, | 169 | .codec_dev = &soc_codec_dev_wm8731, |
162 | .codec_data = &eti_b1_wm8731_setup, | 170 | .codec_data = &eti_b1_wm8731_setup, |
163 | }; | 171 | }; |
@@ -168,22 +176,41 @@ static int __init eti_b1_init(void) | |||
168 | { | 176 | { |
169 | int ret; | 177 | int ret; |
170 | u32 ssc_pio_lines; | 178 | u32 ssc_pio_lines; |
179 | struct at91_ssc_periph *ssc = eti_b1_dai.cpu_dai->private_data; | ||
180 | |||
181 | if (!request_mem_region(AT91RM9200_BASE_SSC1, SZ_16K, "soc-audio")) { | ||
182 | DBG("SSC1 memory region is busy\n"); | ||
183 | return -EBUSY; | ||
184 | } | ||
185 | |||
186 | ssc->base = ioremap(AT91RM9200_BASE_SSC1, SZ_16K); | ||
187 | if (!ssc->base) { | ||
188 | DBG("SSC1 memory ioremap failed\n"); | ||
189 | ret = -ENOMEM; | ||
190 | goto fail_release_mem; | ||
191 | } | ||
192 | |||
193 | ssc->pid = AT91RM9200_ID_SSC1; | ||
171 | 194 | ||
172 | eti_b1_snd_device = platform_device_alloc("soc-audio", -1); | 195 | eti_b1_snd_device = platform_device_alloc("soc-audio", -1); |
173 | if (!eti_b1_snd_device) | 196 | if (!eti_b1_snd_device) { |
174 | return -ENOMEM; | 197 | DBG("platform device allocation failed\n"); |
198 | ret = -ENOMEM; | ||
199 | goto fail_io_unmap; | ||
200 | } | ||
175 | 201 | ||
176 | platform_set_drvdata(eti_b1_snd_device, &eti_b1_snd_devdata); | 202 | platform_set_drvdata(eti_b1_snd_device, &eti_b1_snd_devdata); |
177 | eti_b1_snd_devdata.dev = &eti_b1_snd_device->dev; | 203 | eti_b1_snd_devdata.dev = &eti_b1_snd_device->dev; |
178 | 204 | ||
179 | ret = platform_device_add(eti_b1_snd_device); | 205 | ret = platform_device_add(eti_b1_snd_device); |
180 | if (ret) { | 206 | if (ret) { |
207 | DBG("platform device add failed\n"); | ||
181 | platform_device_put(eti_b1_snd_device); | 208 | platform_device_put(eti_b1_snd_device); |
182 | return ret; | 209 | goto fail_io_unmap; |
183 | } | 210 | } |
184 | 211 | ||
185 | ssc_pio_lines = AT91_PB6_TF1 | AT91_PB7_TK1 | AT91_PB8_TD1 | 212 | ssc_pio_lines = AT91_PIO_TF1 | AT91_PIO_TK1 | AT91_PIO_TD1 |
186 | | AT91_PB9_RD1 /* | AT91_PB10_RK1 | AT91_PB11_RF1 */; | 213 | | AT91_PIO_RD1 /* | AT91_PIO_RK1 | AT91_PIO_RF1 */; |
187 | 214 | ||
188 | /* Reset all PIO registers and assign lines to peripheral A */ | 215 | /* Reset all PIO registers and assign lines to peripheral A */ |
189 | at91_sys_write(AT91_PIOB + PIO_PDR, ssc_pio_lines); | 216 | at91_sys_write(AT91_PIOB + PIO_PDR, ssc_pio_lines); |
@@ -211,14 +238,25 @@ static int __init eti_b1_init(void) | |||
211 | at91_set_B_periph(AT91_PIN_PA24, 0); | 238 | at91_set_B_periph(AT91_PIN_PA24, 0); |
212 | 239 | ||
213 | return ret; | 240 | return ret; |
241 | |||
242 | fail_io_unmap: | ||
243 | iounmap(ssc->base); | ||
244 | fail_release_mem: | ||
245 | release_mem_region(AT91RM9200_BASE_SSC1, SZ_16K); | ||
246 | return ret; | ||
214 | } | 247 | } |
215 | 248 | ||
216 | static void __exit eti_b1_exit(void) | 249 | static void __exit eti_b1_exit(void) |
217 | { | 250 | { |
251 | struct at91_ssc_periph *ssc = eti_b1_dai.cpu_dai->private_data; | ||
252 | |||
218 | clk_put(pck1_clk); | 253 | clk_put(pck1_clk); |
219 | clk_put(pllb_clk); | 254 | clk_put(pllb_clk); |
220 | 255 | ||
221 | platform_device_unregister(eti_b1_snd_device); | 256 | platform_device_unregister(eti_b1_snd_device); |
257 | |||
258 | iounmap(ssc->base); | ||
259 | release_mem_region(AT91RM9200_BASE_SSC1, SZ_16K); | ||
222 | } | 260 | } |
223 | 261 | ||
224 | module_init(eti_b1_init); | 262 | module_init(eti_b1_init); |