ASoC: pxa: switch to new ac97 bus support
[linux-2.6-microblaze.git] / sound / soc / pxa / pxa2xx-ac97.c
index 9f77965..f8a3aa6 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/dmaengine.h>
 #include <linux/dma/pxa-dma.h>
 
+#include <sound/ac97/controller.h>
 #include <sound/core.h>
 #include <sound/ac97_codec.h>
 #include <sound/soc.h>
 #include <mach/regs-ac97.h>
 #include <mach/audio.h>
 
-static void pxa2xx_ac97_warm_reset(struct snd_ac97 *ac97)
+static void pxa2xx_ac97_warm_reset(struct ac97_controller *adrv)
 {
        pxa2xx_ac97_try_warm_reset();
 
        pxa2xx_ac97_finish_reset();
 }
 
-static void pxa2xx_ac97_cold_reset(struct snd_ac97 *ac97)
+static void pxa2xx_ac97_cold_reset(struct ac97_controller *adrv)
 {
        pxa2xx_ac97_try_cold_reset();
 
        pxa2xx_ac97_finish_reset();
 }
 
-static unsigned short pxa2xx_ac97_legacy_read(struct snd_ac97 *ac97,
-                                             unsigned short reg)
+static int pxa2xx_ac97_read_actrl(struct ac97_controller *adrv, int slot,
+                                 unsigned short reg)
 {
-       int ret;
-
-       ret = pxa2xx_ac97_read(ac97->num, reg);
-       if (ret < 0)
-               return 0;
-       else
-               return (unsigned short)(ret & 0xffff);
+       return pxa2xx_ac97_read(slot, reg);
 }
 
-static void pxa2xx_ac97_legacy_write(struct snd_ac97 *ac97,
-                                    unsigned short reg, unsigned short val)
+static int pxa2xx_ac97_write_actrl(struct ac97_controller *adrv, int slot,
+                                  unsigned short reg, unsigned short val)
 {
-       int ret;
-
-       ret = pxa2xx_ac97_write(ac97->num, reg, val);
+       return pxa2xx_ac97_write(slot, reg, val);
 }
 
-static struct snd_ac97_bus_ops pxa2xx_ac97_ops = {
-       .read   = pxa2xx_ac97_legacy_read,
-       .write  = pxa2xx_ac97_legacy_write,
+static struct ac97_controller_ops pxa2xx_ac97_ops = {
+       .read   = pxa2xx_ac97_read_actrl,
+       .write  = pxa2xx_ac97_write_actrl,
        .warm_reset     = pxa2xx_ac97_warm_reset,
        .reset  = pxa2xx_ac97_cold_reset,
 };
@@ -233,6 +226,9 @@ MODULE_DEVICE_TABLE(of, pxa2xx_ac97_dt_ids);
 static int pxa2xx_ac97_dev_probe(struct platform_device *pdev)
 {
        int ret;
+       struct ac97_controller *ctrl;
+       pxa2xx_audio_ops_t *pdata = pdev->dev.platform_data;
+       void **codecs_pdata;
 
        if (pdev->id != -1) {
                dev_err(&pdev->dev, "PXA2xx has only one AC97 port.\n");
@@ -245,10 +241,14 @@ static int pxa2xx_ac97_dev_probe(struct platform_device *pdev)
                return ret;
        }
 
-       ret = snd_soc_set_ac97_ops(&pxa2xx_ac97_ops);
-       if (ret != 0)
-               return ret;
+       codecs_pdata = pdata ? pdata->codec_pdata : NULL;
+       ctrl = snd_ac97_controller_register(&pxa2xx_ac97_ops, &pdev->dev,
+                                           AC97_SLOTS_AVAILABLE_ALL,
+                                           codecs_pdata);
+       if (IS_ERR(ctrl))
+               return PTR_ERR(ctrl);
 
+       platform_set_drvdata(pdev, ctrl);
        /* Punt most of the init to the SoC probe; we may need the machine
         * driver to do interesting things with the clocking to get us up
         * and running.
@@ -259,8 +259,10 @@ static int pxa2xx_ac97_dev_probe(struct platform_device *pdev)
 
 static int pxa2xx_ac97_dev_remove(struct platform_device *pdev)
 {
+       struct ac97_controller *ctrl = platform_get_drvdata(pdev);
+
        snd_soc_unregister_component(&pdev->dev);
-       snd_soc_set_ac97_ops(NULL);
+       snd_ac97_controller_unregister(ctrl);
        pxa2xx_ac97_hw_remove(pdev);
        return 0;
 }