[ARM] 5063/1: pxa: add clk support for pxa2xx I2S
authoreric miao <eric.y.miao@gmail.com>
Mon, 26 May 2008 02:28:09 +0000 (03:28 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 7 Jul 2008 12:23:37 +0000 (13:23 +0100)
Signed-off-by: Eric Miao <eric.miao@marvell.com>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
sound/soc/pxa/pxa2xx-i2s.c

index 425071030970bf07fae6f50b3d863cf89d7c9022..e130346732ba6d126632058429a3295f17950773 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/module.h>
 #include <linux/device.h>
 #include <linux/delay.h>
+#include <linux/clk.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/initval.h>
@@ -40,6 +41,7 @@ struct pxa_i2s_port {
        u32 fmt;
 };
 static struct pxa_i2s_port pxa_i2s;
+static struct clk *clk_i2s;
 
 static struct pxa2xx_pcm_dma_params pxa2xx_i2s_pcm_stereo_out = {
        .name                   = "I2S PCM Stereo out",
@@ -82,6 +84,10 @@ static int pxa2xx_i2s_startup(struct snd_pcm_substream *substream)
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_soc_cpu_dai *cpu_dai = rtd->dai->cpu_dai;
 
+       clk_i2s = clk_get(NULL, "I2SCLK");
+       if (IS_ERR(clk_i2s))
+               return PTR_ERR(clk_i2s);
+
        if (!cpu_dai->active) {
                SACR0 |= SACR0_RST;
                SACR0 = 0;
@@ -149,7 +155,7 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream,
        pxa_gpio_mode(gpio_bus[pxa_i2s.master].tx);
        pxa_gpio_mode(gpio_bus[pxa_i2s.master].frm);
        pxa_gpio_mode(gpio_bus[pxa_i2s.master].clk);
-       pxa_set_cken(CKEN_I2S, 1);
+       clk_enable(clk_i2s);
        pxa_i2s_wait();
 
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
@@ -234,8 +240,10 @@ static void pxa2xx_i2s_shutdown(struct snd_pcm_substream *substream)
        if (SACR1 & (SACR1_DREC | SACR1_DRPL)) {
                SACR0 &= ~SACR0_ENB;
                pxa_i2s_wait();
-               pxa_set_cken(CKEN_I2S, 0);
+               clk_disable(clk_i2s);
        }
+
+       clk_put(clk_i2s);
 }
 
 #ifdef CONFIG_PM