diff options
| -rw-r--r-- | sound/soc/pxa/pxa2xx-i2s.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/sound/soc/pxa/pxa2xx-i2s.c b/sound/soc/pxa/pxa2xx-i2s.c index 425071030970..e130346732ba 100644 --- a/sound/soc/pxa/pxa2xx-i2s.c +++ b/sound/soc/pxa/pxa2xx-i2s.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
| 19 | #include <linux/device.h> | 19 | #include <linux/device.h> |
| 20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
| 21 | #include <linux/clk.h> | ||
| 21 | #include <sound/core.h> | 22 | #include <sound/core.h> |
| 22 | #include <sound/pcm.h> | 23 | #include <sound/pcm.h> |
| 23 | #include <sound/initval.h> | 24 | #include <sound/initval.h> |
| @@ -40,6 +41,7 @@ struct pxa_i2s_port { | |||
| 40 | u32 fmt; | 41 | u32 fmt; |
| 41 | }; | 42 | }; |
| 42 | static struct pxa_i2s_port pxa_i2s; | 43 | static struct pxa_i2s_port pxa_i2s; |
| 44 | static struct clk *clk_i2s; | ||
| 43 | 45 | ||
| 44 | static struct pxa2xx_pcm_dma_params pxa2xx_i2s_pcm_stereo_out = { | 46 | static struct pxa2xx_pcm_dma_params pxa2xx_i2s_pcm_stereo_out = { |
| 45 | .name = "I2S PCM Stereo out", | 47 | .name = "I2S PCM Stereo out", |
| @@ -82,6 +84,10 @@ static int pxa2xx_i2s_startup(struct snd_pcm_substream *substream) | |||
| 82 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 84 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 83 | struct snd_soc_cpu_dai *cpu_dai = rtd->dai->cpu_dai; | 85 | struct snd_soc_cpu_dai *cpu_dai = rtd->dai->cpu_dai; |
| 84 | 86 | ||
| 87 | clk_i2s = clk_get(NULL, "I2SCLK"); | ||
| 88 | if (IS_ERR(clk_i2s)) | ||
| 89 | return PTR_ERR(clk_i2s); | ||
| 90 | |||
| 85 | if (!cpu_dai->active) { | 91 | if (!cpu_dai->active) { |
| 86 | SACR0 |= SACR0_RST; | 92 | SACR0 |= SACR0_RST; |
| 87 | SACR0 = 0; | 93 | SACR0 = 0; |
| @@ -149,7 +155,7 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream, | |||
| 149 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].tx); | 155 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].tx); |
| 150 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].frm); | 156 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].frm); |
| 151 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].clk); | 157 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].clk); |
| 152 | pxa_set_cken(CKEN_I2S, 1); | 158 | clk_enable(clk_i2s); |
| 153 | pxa_i2s_wait(); | 159 | pxa_i2s_wait(); |
| 154 | 160 | ||
| 155 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 161 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| @@ -234,8 +240,10 @@ static void pxa2xx_i2s_shutdown(struct snd_pcm_substream *substream) | |||
| 234 | if (SACR1 & (SACR1_DREC | SACR1_DRPL)) { | 240 | if (SACR1 & (SACR1_DREC | SACR1_DRPL)) { |
| 235 | SACR0 &= ~SACR0_ENB; | 241 | SACR0 &= ~SACR0_ENB; |
| 236 | pxa_i2s_wait(); | 242 | pxa_i2s_wait(); |
| 237 | pxa_set_cken(CKEN_I2S, 0); | 243 | clk_disable(clk_i2s); |
| 238 | } | 244 | } |
| 245 | |||
| 246 | clk_put(clk_i2s); | ||
| 239 | } | 247 | } |
| 240 | 248 | ||
| 241 | #ifdef CONFIG_PM | 249 | #ifdef CONFIG_PM |
