]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - sound/soc/s6000/s6000-pcm.c
Merge branch 'master' into tk71
[mv-sheeva.git] / sound / soc / s6000 / s6000-pcm.c
index 9c7f7f00cebb45706aa6c8f7302b4a371d469ceb..ab3ccaec72d2158d41270ee22df7f95db683eb4a 100644 (file)
@@ -65,7 +65,7 @@ static void s6000_pcm_enqueue_dma(struct snd_pcm_substream *substream)
        dma_addr_t dma_pos;
        dma_addr_t src, dst;
 
-       par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+       par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
 
        period_size = snd_pcm_lib_period_bytes(substream);
        dma_offset = prtd->period * period_size;
@@ -103,23 +103,25 @@ static irqreturn_t s6000_pcm_irq(int irq, void *data)
 {
        struct snd_pcm *pcm = data;
        struct snd_soc_pcm_runtime *runtime = pcm->private_data;
-       struct s6000_pcm_dma_params *params =
-               snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
        struct s6000_runtime_data *prtd;
        unsigned int has_xrun;
        int i, ret = IRQ_NONE;
-       u32 channel[2] = {
-               [SNDRV_PCM_STREAM_PLAYBACK] = params->dma_out,
-               [SNDRV_PCM_STREAM_CAPTURE] = params->dma_in
-       };
-
-       has_xrun = params->check_xrun(runtime->dai->cpu_dai);
 
-       for (i = 0; i < ARRAY_SIZE(channel); ++i) {
+       for (i = 0; i < 2; ++i) {
                struct snd_pcm_substream *substream = pcm->streams[i].substream;
+               struct s6000_pcm_dma_params *params =
+                                       snd_soc_dai_get_dma_data(runtime->cpu_dai, substream);
+               u32 channel;
                unsigned int pending;
 
-               if (!channel[i])
+               if (substream == SNDRV_PCM_STREAM_PLAYBACK)
+                       channel = params->dma_out;
+               else
+                       channel = params->dma_in;
+
+               has_xrun = params->check_xrun(runtime->cpu_dai);
+
+               if (!channel)
                        continue;
 
                if (unlikely(has_xrun & (1 << i)) &&
@@ -130,8 +132,8 @@ static irqreturn_t s6000_pcm_irq(int irq, void *data)
                        ret = IRQ_HANDLED;
                }
 
-               pending = s6dmac_int_sources(DMA_MASK_DMAC(channel[i]),
-                                            DMA_INDEX_CHNL(channel[i]));
+               pending = s6dmac_int_sources(DMA_MASK_DMAC(channel),
+                                            DMA_INDEX_CHNL(channel));
 
                if (pending & 1) {
                        ret = IRQ_HANDLED;
@@ -139,10 +141,10 @@ static irqreturn_t s6000_pcm_irq(int irq, void *data)
                                   snd_pcm_running(substream))) {
                                snd_pcm_period_elapsed(substream);
                                dev_dbg(pcm->dev, "period elapsed %x %x\n",
-                                      s6dmac_cur_src(DMA_MASK_DMAC(channel[i]),
-                                                  DMA_INDEX_CHNL(channel[i])),
-                                      s6dmac_cur_dst(DMA_MASK_DMAC(channel[i]),
-                                                  DMA_INDEX_CHNL(channel[i])));
+                                      s6dmac_cur_src(DMA_MASK_DMAC(channel),
+                                                  DMA_INDEX_CHNL(channel)),
+                                      s6dmac_cur_dst(DMA_MASK_DMAC(channel),
+                                                  DMA_INDEX_CHNL(channel)));
                                prtd = substream->runtime->private_data;
                                spin_lock(&prtd->lock);
                                s6000_pcm_enqueue_dma(substream);
@@ -154,16 +156,16 @@ static irqreturn_t s6000_pcm_irq(int irq, void *data)
                        if (pending & (1 << 3))
                                printk(KERN_WARNING
                                       "s6000-pcm: DMA %x Underflow\n",
-                                      channel[i]);
+                                      channel);
                        if (pending & (1 << 4))
                                printk(KERN_WARNING
                                       "s6000-pcm: DMA %x Overflow\n",
-                                      channel[i]);
+                                      channel);
                        if (pending & 0x1e0)
                                printk(KERN_WARNING
                                       "s6000-pcm: DMA %x Master Error "
                                       "(mask %x)\n",
-                                      channel[i], pending >> 5);
+                                      channel, pending >> 5);
 
                }
        }
@@ -180,7 +182,7 @@ static int s6000_pcm_start(struct snd_pcm_substream *substream)
        int srcinc;
        u32 dma;
 
-       par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+       par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
 
        spin_lock_irqsave(&prtd->lock, flags);
 
@@ -221,7 +223,7 @@ static int s6000_pcm_stop(struct snd_pcm_substream *substream)
        unsigned long flags;
        u32 channel;
 
-       par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+       par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
 
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
                channel = par->dma_out;
@@ -246,7 +248,7 @@ static int s6000_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
        struct s6000_pcm_dma_params *par;
        int ret;
 
-       par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+       par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
 
        ret = par->trigger(substream, cmd, 0);
        if (ret < 0)
@@ -291,7 +293,7 @@ static snd_pcm_uframes_t s6000_pcm_pointer(struct snd_pcm_substream *substream)
        unsigned int offset;
        dma_addr_t count;
 
-       par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+       par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
 
        spin_lock_irqsave(&prtd->lock, flags);
 
@@ -321,7 +323,7 @@ static int s6000_pcm_open(struct snd_pcm_substream *substream)
        struct s6000_runtime_data *prtd;
        int ret;
 
-       par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+       par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
        snd_soc_set_runtime_hwparams(substream, &s6000_pcm_hardware);
 
        ret = snd_pcm_hw_constraint_step(runtime, 0,
@@ -385,7 +387,7 @@ static int s6000_pcm_hw_params(struct snd_pcm_substream *substream,
                return ret;
        }
 
-       par = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+       par = snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
 
        if (par->same_rate) {
                spin_lock(&par->lock);
@@ -407,7 +409,7 @@ static int s6000_pcm_hw_free(struct snd_pcm_substream *substream)
 {
        struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
        struct s6000_pcm_dma_params *par =
-               snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+               snd_soc_dai_get_dma_data(soc_runtime->cpu_dai, substream);
 
        spin_lock(&par->lock);
        par->in_use &= ~(1 << substream->stream);
@@ -433,7 +435,7 @@ static void s6000_pcm_free(struct snd_pcm *pcm)
 {
        struct snd_soc_pcm_runtime *runtime = pcm->private_data;
        struct s6000_pcm_dma_params *params =
-               snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+               snd_soc_dai_get_dma_data(runtime->cpu_dai, pcm->streams[0].substream);
 
        free_irq(params->irq, pcm);
        snd_pcm_lib_preallocate_free_for_all(pcm);
@@ -448,7 +450,8 @@ static int s6000_pcm_new(struct snd_card *card,
        struct s6000_pcm_dma_params *params;
        int res;
 
-       params = snd_soc_dai_get_dma_data(soc_runtime->dai->cpu_dai, substream);
+       params = snd_soc_dai_get_dma_data(runtime->cpu_dai,
+                       pcm->streams[0].substream);
 
        if (!card->dev->dma_mask)
                card->dev->dma_mask = &s6000_pcm_dmamask;
@@ -470,7 +473,7 @@ static int s6000_pcm_new(struct snd_card *card,
        }
 
        res = request_irq(params->irq, s6000_pcm_irq, IRQF_SHARED,
-                         s6000_soc_platform.name, pcm);
+                         "s6000-audio", pcm);
        if (res) {
                printk(KERN_ERR "s6000-pcm couldn't get IRQ\n");
                return res;
@@ -490,25 +493,44 @@ static int s6000_pcm_new(struct snd_card *card,
        return 0;
 }
 
-struct snd_soc_platform s6000_soc_platform = {
-       .name =         "s6000-audio",
-       .pcm_ops =      &s6000_pcm_ops,
+static struct snd_soc_platform_driver s6000_soc_platform = {
+       .ops =          &s6000_pcm_ops,
        .pcm_new =      s6000_pcm_new,
        .pcm_free =     s6000_pcm_free,
 };
-EXPORT_SYMBOL_GPL(s6000_soc_platform);
 
-static int __init s6000_pcm_init(void)
+static int __devinit s6000_soc_platform_probe(struct platform_device *pdev)
+{
+       return snd_soc_register_platform(&pdev->dev, &s6000_soc_platform);
+}
+
+static int __devexit s6000_soc_platform_remove(struct platform_device *pdev)
+{
+       snd_soc_unregister_platform(&pdev->dev);
+       return 0;
+}
+
+static struct platform_driver s6000_pcm_driver = {
+       .driver = {
+                       .name = "s6000-pcm-audio",
+                       .owner = THIS_MODULE,
+       },
+
+       .probe = s6000_soc_platform_probe,
+       .remove = __devexit_p(s6000_soc_platform_remove),
+};
+
+static int __init snd_s6000_pcm_init(void)
 {
-       return snd_soc_register_platform(&s6000_soc_platform);
+       return platform_driver_register(&s6000_pcm_driver);
 }
-module_init(s6000_pcm_init);
+module_init(snd_s6000_pcm_init);
 
-static void __exit s6000_pcm_exit(void)
+static void __exit snd_s6000_pcm_exit(void)
 {
-       snd_soc_unregister_platform(&s6000_soc_platform);
+       platform_driver_unregister(&s6000_pcm_driver);
 }
-module_exit(s6000_pcm_exit);
+module_exit(snd_s6000_pcm_exit);
 
 MODULE_AUTHOR("Daniel Gloeckner");
 MODULE_DESCRIPTION("Stretch s6000 family PCM DMA module");