Merge branch 'rbd-sysfs' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph...
[pandora-kernel.git] / sound / soc / fsl / mpc5200_dma.c
index 3dcd146..f92dca0 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/module.h>
 #include <linux/of_device.h>
 #include <linux/slab.h>
+#include <linux/of_platform.h>
 
 #include <sound/soc.h>
 
@@ -107,7 +108,7 @@ static int psc_dma_hw_free(struct snd_pcm_substream *substream)
 static int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data;
+       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
        struct snd_pcm_runtime *runtime = substream->runtime;
        struct psc_dma_stream *s = to_psc_dma_stream(substream, psc_dma);
        struct mpc52xx_psc __iomem *regs = psc_dma->psc_regs;
@@ -212,7 +213,7 @@ static int psc_dma_open(struct snd_pcm_substream *substream)
 {
        struct snd_pcm_runtime *runtime = substream->runtime;
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data;
+       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
        struct psc_dma_stream *s;
        int rc;
 
@@ -239,7 +240,7 @@ static int psc_dma_open(struct snd_pcm_substream *substream)
 static int psc_dma_close(struct snd_pcm_substream *substream)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data;
+       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
        struct psc_dma_stream *s;
 
        dev_dbg(psc_dma->dev, "psc_dma_close(substream=%p)\n", substream);
@@ -264,7 +265,7 @@ static snd_pcm_uframes_t
 psc_dma_pointer(struct snd_pcm_substream *substream)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data;
+       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
        struct psc_dma_stream *s;
        dma_addr_t count;
 
@@ -302,11 +303,11 @@ static int psc_dma_new(struct snd_card *card, struct snd_soc_dai *dai,
                           struct snd_pcm *pcm)
 {
        struct snd_soc_pcm_runtime *rtd = pcm->private_data;
-       struct psc_dma *psc_dma = rtd->dai->cpu_dai->private_data;
+       struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai);
        size_t size = psc_dma_hardware.buffer_bytes_max;
        int rc = 0;
 
-       dev_dbg(rtd->socdev->dev, "psc_dma_new(card=%p, dai=%p, pcm=%p)\n",
+       dev_dbg(rtd->platform->dev, "psc_dma_new(card=%p, dai=%p, pcm=%p)\n",
                card, dai, pcm);
 
        if (!card->dev->dma_mask)
@@ -328,8 +329,8 @@ static int psc_dma_new(struct snd_card *card, struct snd_soc_dai *dai,
                        goto capture_alloc_err;
        }
 
-       if (rtd->socdev->card->codec->ac97)
-               rtd->socdev->card->codec->ac97->private_data = psc_dma;
+       if (rtd->codec->ac97)
+               rtd->codec->ac97->private_data = psc_dma;
 
        return 0;
 
@@ -349,7 +350,7 @@ static void psc_dma_free(struct snd_pcm *pcm)
        struct snd_pcm_substream *substream;
        int stream;
 
-       dev_dbg(rtd->socdev->dev, "psc_dma_free(pcm=%p)\n", pcm);
+       dev_dbg(rtd->platform->dev, "psc_dma_free(pcm=%p)\n", pcm);
 
        for (stream = 0; stream < 2; stream++) {
                substream = pcm->streams[stream].substream;
@@ -361,15 +362,14 @@ static void psc_dma_free(struct snd_pcm *pcm)
        }
 }
 
-struct snd_soc_platform mpc5200_audio_dma_platform = {
-       .name           = "mpc5200-psc-audio",
-       .pcm_ops        = &psc_dma_ops,
+static struct snd_soc_platform_driver mpc5200_audio_dma_platform = {
+       .ops            = &psc_dma_ops,
        .pcm_new        = &psc_dma_new,
        .pcm_free       = &psc_dma_free,
 };
-EXPORT_SYMBOL_GPL(mpc5200_audio_dma_platform);
 
-int mpc5200_audio_dma_create(struct platform_device *op)
+static int mpc5200_hpcd_probe(struct of_device *op,
+               const struct of_device_id *match)
 {
        phys_addr_t fifo;
        struct psc_dma *psc_dma;
@@ -475,7 +475,7 @@ int mpc5200_audio_dma_create(struct platform_device *op)
        dev_set_drvdata(&op->dev, psc_dma);
 
        /* Tell the ASoC OF helpers about it */
-       return snd_soc_register_platform(&mpc5200_audio_dma_platform);
+       return snd_soc_register_platform(&op->dev, &mpc5200_audio_dma_platform);
 out_irq:
        free_irq(psc_dma->irq, psc_dma);
        free_irq(psc_dma->capture.irq, &psc_dma->capture);
@@ -486,15 +486,14 @@ out_unmap:
        iounmap(regs);
        return ret;
 }
-EXPORT_SYMBOL_GPL(mpc5200_audio_dma_create);
 
-int mpc5200_audio_dma_destroy(struct platform_device *op)
+static int mpc5200_hpcd_remove(struct of_device *op)
 {
        struct psc_dma *psc_dma = dev_get_drvdata(&op->dev);
 
        dev_dbg(&op->dev, "mpc5200_audio_dma_destroy()\n");
 
-       snd_soc_unregister_platform(&mpc5200_audio_dma_platform);
+       snd_soc_unregister_platform(&op->dev);
 
        bcom_gen_bd_rx_release(psc_dma->capture.bcom_task);
        bcom_gen_bd_tx_release(psc_dma->playback.bcom_task);
@@ -510,7 +509,35 @@ int mpc5200_audio_dma_destroy(struct platform_device *op)
 
        return 0;
 }
-EXPORT_SYMBOL_GPL(mpc5200_audio_dma_destroy);
+
+static struct of_device_id mpc5200_hpcd_match[] = {
+       {
+               .compatible = "fsl,mpc5200-pcm",
+       },
+       {}
+};
+MODULE_DEVICE_TABLE(of, mpc5200_hpcd_match);
+
+static struct of_platform_driver mpc5200_hpcd_of_driver = {
+       .owner          = THIS_MODULE,
+       .name           = "mpc5200-pcm-audio",
+       .match_table    = mpc5200_hpcd_match,
+       .probe          = mpc5200_hpcd_probe,
+       .remove         = mpc5200_hpcd_remove,
+};
+
+static int __init mpc5200_hpcd_init(void)
+{
+       return of_register_platform_driver(&mpc5200_hpcd_of_driver);
+}
+
+static void __exit mpc5200_hpcd_exit(void)
+{
+       of_unregister_platform_driver(&mpc5200_hpcd_of_driver);
+}
+
+module_init(mpc5200_hpcd_init);
+module_exit(mpc5200_hpcd_exit);
 
 MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>");
 MODULE_DESCRIPTION("Freescale MPC5200 PSC in DMA mode ASoC Driver");