Merge branch 'topic/asoc' into for-linus
authorTakashi Iwai <tiwai@suse.de>
Mon, 25 Oct 2010 08:00:30 +0000 (10:00 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 25 Oct 2010 08:00:30 +0000 (10:00 +0200)
Conflicts:
arch/powerpc/platforms/85xx/p1022_ds.c

1  2 
arch/powerpc/platforms/85xx/p1022_ds.c
sound/soc/davinci/davinci-sffsdr.c
sound/soc/s3c24xx/neo1973_gta02_wm8753.c
sound/soc/s3c24xx/neo1973_wm8753.c
sound/soc/s3c24xx/s3c-dma.c

@@@ -8,7 -8,6 +8,6 @@@
   * Copyright 2010 Freescale Semiconductor, Inc.
   *
   * This file is taken from the Freescale P1022DS BSP, with modifications:
-  * 1) No DIU support (pending rewrite of DIU code)
   * 2) No AMP support
   * 3) No PCI endpoint support
   *
  
  #include <linux/pci.h>
  #include <linux/of_platform.h>
 -#include <linux/lmb.h>
  #include <linux/memblock.h>
+ #include <asm/div64.h>
  #include <asm/mpic.h>
  #include <asm/swiotlb.h>
  
  #include <sysdev/fsl_soc.h>
  #include <sysdev/fsl_pci.h>
+ #include <asm/fsl_guts.h>
+ #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE)
+ /*
+  * Board-specific initialization of the DIU.  This code should probably be
+  * executed when the DIU is opened, rather than in arch code, but the DIU
+  * driver does not have a mechanism for this (yet).
+  *
+  * This is especially problematic on the P1022DS because the local bus (eLBC)
+  * and the DIU video signals share the same pins, which means that enabling the
+  * DIU will disable access to NOR flash.
+  */
+ /* DIU Pixel Clock bits of the CLKDVDR Global Utilities register */
+ #define CLKDVDR_PXCKEN                0x80000000
+ #define CLKDVDR_PXCKINV               0x10000000
+ #define CLKDVDR_PXCKDLY               0x06000000
+ #define CLKDVDR_PXCLK_MASK    0x00FF0000
+ /* Some ngPIXIS register definitions */
+ #define PX_BRDCFG1_DVIEN      0x80
+ #define PX_BRDCFG1_DFPEN      0x40
+ #define PX_BRDCFG1_BACKLIGHT  0x20
+ #define PX_BRDCFG1_DDCEN      0x10
+ /*
+  * DIU Area Descriptor
+  *
+  * Note that we need to byte-swap the value before it's written to the AD
+  * register.  So even though the registers don't look like they're in the same
+  * bit positions as they are on the MPC8610, the same value is written to the
+  * AD register on the MPC8610 and on the P1022.
+  */
+ #define AD_BYTE_F             0x10000000
+ #define AD_ALPHA_C_MASK               0x0E000000
+ #define AD_ALPHA_C_SHIFT      25
+ #define AD_BLUE_C_MASK                0x01800000
+ #define AD_BLUE_C_SHIFT               23
+ #define AD_GREEN_C_MASK               0x00600000
+ #define AD_GREEN_C_SHIFT      21
+ #define AD_RED_C_MASK         0x00180000
+ #define AD_RED_C_SHIFT                19
+ #define AD_PALETTE            0x00040000
+ #define AD_PIXEL_S_MASK               0x00030000
+ #define AD_PIXEL_S_SHIFT      16
+ #define AD_COMP_3_MASK                0x0000F000
+ #define AD_COMP_3_SHIFT               12
+ #define AD_COMP_2_MASK                0x00000F00
+ #define AD_COMP_2_SHIFT               8
+ #define AD_COMP_1_MASK                0x000000F0
+ #define AD_COMP_1_SHIFT               4
+ #define AD_COMP_0_MASK                0x0000000F
+ #define AD_COMP_0_SHIFT               0
+ #define MAKE_AD(alpha, red, blue, green, size, c0, c1, c2, c3) \
+       cpu_to_le32(AD_BYTE_F | (alpha << AD_ALPHA_C_SHIFT) | \
+       (blue << AD_BLUE_C_SHIFT) | (green << AD_GREEN_C_SHIFT) | \
+       (red << AD_RED_C_SHIFT) | (c3 << AD_COMP_3_SHIFT) | \
+       (c2 << AD_COMP_2_SHIFT) | (c1 << AD_COMP_1_SHIFT) | \
+       (c0 << AD_COMP_0_SHIFT) | (size << AD_PIXEL_S_SHIFT))
+ /**
+  * p1022ds_get_pixel_format: return the Area Descriptor for a given pixel depth
+  *
+  * The Area Descriptor is a 32-bit value that determine which bits in each
+  * pixel are to be used for each color.
+  */
+ static unsigned int p1022ds_get_pixel_format(unsigned int bits_per_pixel,
+       int monitor_port)
+ {
+       switch (bits_per_pixel) {
+       case 32:
+               /* 0x88883316 */
+               return MAKE_AD(3, 2, 0, 1, 3, 8, 8, 8, 8);
+       case 24:
+               /* 0x88082219 */
+               return MAKE_AD(4, 0, 1, 2, 2, 0, 8, 8, 8);
+       case 16:
+               /* 0x65053118 */
+               return MAKE_AD(4, 2, 1, 0, 1, 5, 6, 5, 0);
+       default:
+               pr_err("fsl-diu: unsupported pixel depth %u\n", bits_per_pixel);
+               return 0;
+       }
+ }
+ /**
+  * p1022ds_set_gamma_table: update the gamma table, if necessary
+  *
+  * On some boards, the gamma table for some ports may need to be modified.
+  * This is not the case on the P1022DS, so we do nothing.
+ */
+ static void p1022ds_set_gamma_table(int monitor_port, char *gamma_table_base)
+ {
+ }
+ /**
+  * p1022ds_set_monitor_port: switch the output to a different monitor port
+  *
+  */
+ static void p1022ds_set_monitor_port(int monitor_port)
+ {
+       struct device_node *pixis_node;
+       u8 __iomem *brdcfg1;
+       pixis_node = of_find_compatible_node(NULL, NULL, "fsl,p1022ds-pixis");
+       if (!pixis_node) {
+               pr_err("p1022ds: missing ngPIXIS node\n");
+               return;
+       }
+       brdcfg1 = of_iomap(pixis_node, 0);
+       if (!brdcfg1) {
+               pr_err("p1022ds: could not map ngPIXIS registers\n");
+               return;
+       }
+       brdcfg1 += 9;   /* BRDCFG1 is at offset 9 in the ngPIXIS */
+       switch (monitor_port) {
+       case 0: /* DVI */
+               /* Enable the DVI port, disable the DFP and the backlight */
+               clrsetbits_8(brdcfg1, PX_BRDCFG1_DFPEN | PX_BRDCFG1_BACKLIGHT,
+                            PX_BRDCFG1_DVIEN);
+               break;
+       case 1: /* Single link LVDS */
+               /* Enable the DFP port, disable the DVI and the backlight */
+               clrsetbits_8(brdcfg1, PX_BRDCFG1_DVIEN | PX_BRDCFG1_BACKLIGHT,
+                            PX_BRDCFG1_DFPEN);
+               break;
+       default:
+               pr_err("p1022ds: unsupported monitor port %i\n", monitor_port);
+       }
+ }
+ /**
+  * p1022ds_set_pixel_clock: program the DIU's clock
+  *
+  * @pixclock: the wavelength, in picoseconds, of the clock
+  */
+ void p1022ds_set_pixel_clock(unsigned int pixclock)
+ {
+       struct device_node *guts_np = NULL;
+       struct ccsr_guts_85xx __iomem *guts;
+       unsigned long freq;
+       u64 temp;
+       u32 pxclk;
+       /* Map the global utilities registers. */
+       guts_np = of_find_compatible_node(NULL, NULL, "fsl,p1022-guts");
+       if (!guts_np) {
+               pr_err("p1022ds: missing global utilties device node\n");
+               return;
+       }
+       guts = of_iomap(guts_np, 0);
+       of_node_put(guts_np);
+       if (!guts) {
+               pr_err("p1022ds: could not map global utilties device\n");
+               return;
+       }
+       /* Convert pixclock from a wavelength to a frequency */
+       temp = 1000000000000ULL;
+       do_div(temp, pixclock);
+       freq = temp;
+       /* pixclk is the ratio of the platform clock to the pixel clock */
+       pxclk = DIV_ROUND_CLOSEST(fsl_get_sys_freq(), freq);
+       /* Disable the pixel clock, and set it to non-inverted and no delay */
+       clrbits32(&guts->clkdvdr,
+                 CLKDVDR_PXCKEN | CLKDVDR_PXCKDLY | CLKDVDR_PXCLK_MASK);
+       /* Enable the clock and set the pxclk */
+       setbits32(&guts->clkdvdr, CLKDVDR_PXCKEN | (pxclk << 16));
+ }
+ /**
+  * p1022ds_show_monitor_port: show the current monitor
+  *
+  * This function returns a string indicating whether the current monitor is
+  * set to DVI or LVDS.
+  */
+ ssize_t p1022ds_show_monitor_port(int monitor_port, char *buf)
+ {
+       return sprintf(buf, "%c0 - DVI\n%c1 - Single link LVDS\n",
+               monitor_port == 0 ? '*' : ' ', monitor_port == 1 ? '*' : ' ');
+ }
+ /**
+  * p1022ds_set_sysfs_monitor_port: set the monitor port for sysfs
+  */
+ int p1022ds_set_sysfs_monitor_port(int val)
+ {
+       return val < 2 ? val : 0;
+ }
+ #endif
  
  void __init p1022_ds_pic_init(void)
  {
@@@ -92,12 -291,21 +290,21 @@@ static void __init p1022_ds_setup_arch(
        }
  #endif
  
+ #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE)
+       diu_ops.get_pixel_format        = p1022ds_get_pixel_format;
+       diu_ops.set_gamma_table         = p1022ds_set_gamma_table;
+       diu_ops.set_monitor_port        = p1022ds_set_monitor_port;
+       diu_ops.set_pixel_clock         = p1022ds_set_pixel_clock;
+       diu_ops.show_monitor_port       = p1022ds_show_monitor_port;
+       diu_ops.set_sysfs_monitor_port  = p1022ds_set_sysfs_monitor_port;
+ #endif
  #ifdef CONFIG_SMP
        mpc85xx_smp_init();
  #endif
  
  #ifdef CONFIG_SWIOTLB
 -      if (lmb_end_of_DRAM() > max) {
 +      if (memblock_end_of_DRAM() > max) {
                ppc_swiotlb_enable = 1;
                set_pci_dma_ops(&swiotlb_dma_ops);
                ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb;
@@@ -29,7 -29,6 +29,6 @@@
  #include <asm/plat-sffsdr/sffsdr-fpga.h>
  #endif
  
- #include <mach/mcbsp.h>
  #include <mach/edma.h>
  
  #include "../codecs/pcm3008.h"
@@@ -48,7 -47,7 +47,7 @@@ static int sffsdr_hw_params(struct snd_
                            struct snd_pcm_hw_params *params)
  {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        int fs;
        int ret = 0;
  
@@@ -85,15 -84,16 +84,16 @@@ static struct snd_soc_ops sffsdr_ops = 
  static struct snd_soc_dai_link sffsdr_dai = {
        .name = "PCM3008", /* Codec name */
        .stream_name = "PCM3008 HiFi",
-       .cpu_dai = &davinci_i2s_dai,
-       .codec_dai = &pcm3008_dai,
+       .cpu_dai_name = "davinci-asp.0",
+       .codec_dai_name = "pcm3008-hifi",
+       .codec_name = "pcm3008-codec",
+       .platform_name = "davinci-pcm-audio",
        .ops = &sffsdr_ops,
  };
  
  /* davinci-sffsdr audio machine driver */
  static struct snd_soc_card snd_soc_sffsdr = {
        .name = "DaVinci SFFSDR",
-       .platform = &davinci_soc_platform,
        .dai_link = &sffsdr_dai,
        .num_links = 1,
  };
@@@ -106,11 -106,12 +106,12 @@@ static struct pcm3008_setup_data sffsdr
        .pdda_pin = GPIO(38),
  };
  
- /* sffsdr audio subsystem */
- static struct snd_soc_device sffsdr_snd_devdata = {
-       .card = &snd_soc_sffsdr,
-       .codec_dev = &soc_codec_dev_pcm3008,
-       .codec_data = &sffsdr_pcm3008_setup,
+ struct platform_device pcm3008_codec = {
+               .name = "pcm3008-codec",
+               .id = 0,
+               .dev = {
+                               .platform_data = &sffsdr_pcm3008_setup,
+               },
  };
  
  static struct resource sffsdr_snd_resources[] = {
@@@ -135,14 -136,15 +136,15 @@@ static int __init sffsdr_init(void
        if (!machine_is_sffsdr())
                return -EINVAL;
  
+       platform_device_register(&pcm3008_codec);
        sffsdr_snd_device = platform_device_alloc("soc-audio", 0);
        if (!sffsdr_snd_device) {
                printk(KERN_ERR "platform device allocation failed\n");
                return -ENOMEM;
        }
  
-       platform_set_drvdata(sffsdr_snd_device, &sffsdr_snd_devdata);
-       sffsdr_snd_devdata.dev = &sffsdr_snd_device->dev;
+       platform_set_drvdata(sffsdr_snd_device, &snd_soc_sffsdr);
        platform_device_add_data(sffsdr_snd_device, &sffsdr_snd_data,
                                 sizeof(sffsdr_snd_data));
  
                                            sffsdr_snd_resources,
                                            ARRAY_SIZE(sffsdr_snd_resources));
        if (ret) {
 -              printk(KERN_ERR "platform device add ressources failed\n");
 +              printk(KERN_ERR "platform device add resources failed\n");
                goto error;
        }
  
@@@ -168,6 -170,7 +170,7 @@@ error
  static void __exit sffsdr_exit(void)
  {
        platform_device_unregister(sffsdr_snd_device);
+       platform_device_unregister(&pcm3008_codec);
  }
  
  module_init(sffsdr_init);
@@@ -41,8 -41,8 +41,8 @@@ static int neo1973_gta02_hifi_hw_params
        struct snd_pcm_hw_params *params)
  {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
-       struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+       struct snd_soc_dai *codec_dai = rtd->codec_dai;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        unsigned int pll_out = 0, bclk = 0;
        int ret = 0;
        unsigned long iis_clkrate;
  static int neo1973_gta02_hifi_hw_free(struct snd_pcm_substream *substream)
  {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+       struct snd_soc_dai *codec_dai = rtd->codec_dai;
  
        /* disable the PLL */
        return snd_soc_dai_set_pll(codec_dai, WM8753_PLL1, 0, 0, 0);
@@@ -149,7 -149,7 +149,7 @@@ static int neo1973_gta02_voice_hw_param
        struct snd_pcm_hw_params *params)
  {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+       struct snd_soc_dai *codec_dai = rtd->codec_dai;
        unsigned int pcmdiv = 0;
        int ret = 0;
        unsigned long iis_clkrate;
        if (ret < 0)
                return ret;
  
 -      /* configue and enable PLL for 12.288MHz output */
 +      /* configure and enable PLL for 12.288MHz output */
        ret = snd_soc_dai_set_pll(codec_dai, WM8753_PLL2, 0,
                iis_clkrate / 4, 12288000);
        if (ret < 0)
  static int neo1973_gta02_voice_hw_free(struct snd_pcm_substream *substream)
  {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+       struct snd_soc_dai *codec_dai = rtd->codec_dai;
  
        /* disable the PLL */
        return snd_soc_dai_set_pll(codec_dai, WM8753_PLL2, 0, 0, 0);
@@@ -262,7 -262,7 +262,7 @@@ static int lm4853_event(struct snd_soc_
                        struct snd_kcontrol *k,
                        int event)
  {
-       gpio_set_value(GTA02_GPIO_AMP_SHUT, SND_SOC_DAPM_EVENT_OFF(value));
+       gpio_set_value(GTA02_GPIO_AMP_SHUT, SND_SOC_DAPM_EVENT_OFF(event));
  
        return 0;
  }
@@@ -330,8 -330,9 +330,9 @@@ static const struct snd_kcontrol_new wm
   * This is an example machine initialisation for a wm8753 connected to a
   * neo1973 GTA02.
   */
- static int neo1973_gta02_wm8753_init(struct snd_soc_codec *codec)
+ static int neo1973_gta02_wm8753_init(struct snd_soc_pcm_runtime *rtd)
  {
+       struct snd_soc_codec *codec = rtd->codec;
        int err;
  
        /* set up NC codec pins */
  /*
   * BT Codec DAI
   */
- static struct snd_soc_dai bt_dai = {
-       .name = "Bluetooth",
-       .id = 0,
+ static struct snd_soc_dai_driver bt_dai = {
+       .name = "bluetooth-dai",
        .playback = {
                .channels_min = 1,
                .channels_max = 1,
@@@ -397,32 -397,30 +397,30 @@@ static struct snd_soc_dai_link neo1973_
  { /* Hifi Playback - for similatious use with voice below */
        .name = "WM8753",
        .stream_name = "WM8753 HiFi",
-       .cpu_dai = &s3c24xx_i2s_dai,
-       .codec_dai = &wm8753_dai[WM8753_DAI_HIFI],
+       .cpu_dai_name = "s3c24xx-i2s",
+       .codec_dai_name = "wm8753-hifi",
        .init = neo1973_gta02_wm8753_init,
+       .platform_name = "s3c24xx-pcm-audio",
+       .codec_name = "wm8753-codec.0-0x1a",
        .ops = &neo1973_gta02_hifi_ops,
  },
  { /* Voice via BT */
        .name = "Bluetooth",
        .stream_name = "Voice",
-       .cpu_dai = &bt_dai,
-       .codec_dai = &wm8753_dai[WM8753_DAI_VOICE],
+       .cpu_dai_name = "bluetooth-dai",
+       .codec_dai_name = "wm8753-voice",
        .ops = &neo1973_gta02_voice_ops,
+       .codec_name = "wm8753-codec.0-0x1a",
+       .platform_name = "s3c24xx-pcm-audio",
  },
  };
  
  static struct snd_soc_card neo1973_gta02 = {
        .name = "neo1973-gta02",
-       .platform = &s3c24xx_soc_platform,
        .dai_link = neo1973_gta02_dai,
        .num_links = ARRAY_SIZE(neo1973_gta02_dai),
  };
  
- static struct snd_soc_device neo1973_gta02_snd_devdata = {
-       .card = &neo1973_gta02,
-       .codec_dev = &soc_codec_dev_wm8753,
- };
  static struct platform_device *neo1973_gta02_snd_device;
  
  static int __init neo1973_gta02_init(void)
                return -ENODEV;
        }
  
-       /* register bluetooth DAI here */
-       ret = snd_soc_register_dai(&bt_dai);
-       if (ret)
-               return ret;
        neo1973_gta02_snd_device = platform_device_alloc("soc-audio", -1);
        if (!neo1973_gta02_snd_device)
                return -ENOMEM;
  
-       platform_set_drvdata(neo1973_gta02_snd_device,
-                       &neo1973_gta02_snd_devdata);
-       neo1973_gta02_snd_devdata.dev = &neo1973_gta02_snd_device->dev;
+       /* register bluetooth DAI here */
+       ret = snd_soc_register_dai(&neo1973_gta02_snd_device->dev, -1, &bt_dai);
+       if (ret) {
+               platform_device_put(neo1973_gta02_snd_device);
+               return ret;
+       }
+       platform_set_drvdata(neo1973_gta02_snd_device, &neo1973_gta02);
        ret = platform_device_add(neo1973_gta02_snd_device);
  
        if (ret) {
                goto err_unregister_device;
        }
  
-       ret = gpio_direction_output(GTA02_GPIO_AMP_HP_IN, 1);
+       ret = gpio_direction_output(GTA02_GPIO_HP_IN, 1);
        if (ret) {
                pr_err("gta02_wm8753: Failed to configure GPIO %d\n", GTA02_GPIO_HP_IN);
                goto err_free_gpio_hp_in;
@@@ -493,7 -491,7 +491,7 @@@ module_init(neo1973_gta02_init)
  
  static void __exit neo1973_gta02_exit(void)
  {
-       snd_soc_unregister_dai(&bt_dai);
+       snd_soc_unregister_dai(&neo1973_gta02_snd_device->dev, -1);
        platform_device_unregister(neo1973_gta02_snd_device);
        gpio_free(GTA02_GPIO_HP_IN);
        gpio_free(GTA02_GPIO_AMP_SHUT);
@@@ -57,8 -57,8 +57,8 @@@ static int neo1973_hifi_hw_params(struc
        struct snd_pcm_hw_params *params)
  {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
-       struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+       struct snd_soc_dai *codec_dai = rtd->codec_dai;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        unsigned int pll_out = 0, bclk = 0;
        int ret = 0;
        unsigned long iis_clkrate;
  static int neo1973_hifi_hw_free(struct snd_pcm_substream *substream)
  {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+       struct snd_soc_dai *codec_dai = rtd->codec_dai;
  
        pr_debug("Entered %s\n", __func__);
  
@@@ -167,7 -167,7 +167,7 @@@ static int neo1973_voice_hw_params(stru
        struct snd_pcm_hw_params *params)
  {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+       struct snd_soc_dai *codec_dai = rtd->codec_dai;
        unsigned int pcmdiv = 0;
        int ret = 0;
        unsigned long iis_clkrate;
        if (ret < 0)
                return ret;
  
 -      /* configue and enable PLL for 12.288MHz output */
 +      /* configure and enable PLL for 12.288MHz output */
        ret = snd_soc_dai_set_pll(codec_dai, WM8753_PLL2, 0,
                iis_clkrate / 4, 12288000);
        if (ret < 0)
  static int neo1973_voice_hw_free(struct snd_pcm_substream *substream)
  {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+       struct snd_soc_dai *codec_dai = rtd->codec_dai;
  
        pr_debug("Entered %s\n", __func__);
  
@@@ -499,8 -499,9 +499,9 @@@ static const struct snd_kcontrol_new wm
   * neo1973 II. It is missing logic to detect hp/mic insertions and logic
   * to re-route the audio in such an event.
   */
- static int neo1973_wm8753_init(struct snd_soc_codec *codec)
+ static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd)
  {
+       struct snd_soc_codec *codec = rtd->codec;
        int err;
  
        pr_debug("Entered %s\n", __func__);
   * BT Codec DAI
   */
  static struct snd_soc_dai bt_dai = {
-       .name = "Bluetooth",
-       .id = 0,
+       .name = "bluetooth-dai",
        .playback = {
                .channels_min = 1,
                .channels_max = 1,
@@@ -556,32 -556,30 +556,30 @@@ static struct snd_soc_dai_link neo1973_
  { /* Hifi Playback - for similatious use with voice below */
        .name = "WM8753",
        .stream_name = "WM8753 HiFi",
-       .cpu_dai = &s3c24xx_i2s_dai,
-       .codec_dai = &wm8753_dai[WM8753_DAI_HIFI],
+       .platform_name = "s3c24xx-pcm-audio",
+       .cpu_dai_name = "s3c24xx-i2s",
+       .codec_dai_name = "wm8753-hifi",
+       .codec_name = "wm8753-codec.0-0x1a",
        .init = neo1973_wm8753_init,
        .ops = &neo1973_hifi_ops,
  },
  { /* Voice via BT */
        .name = "Bluetooth",
        .stream_name = "Voice",
-       .cpu_dai = &bt_dai,
-       .codec_dai = &wm8753_dai[WM8753_DAI_VOICE],
+       .platform_name = "s3c24xx-pcm-audio",
+       .cpu_dai_name = "bluetooth-dai",
+       .codec_dai_name = "wm8753-voice",
+       .codec_name = "wm8753-codec.0-0x1a",
        .ops = &neo1973_voice_ops,
  },
  };
  
  static struct snd_soc_card neo1973 = {
        .name = "neo1973",
-       .platform = &s3c24xx_soc_platform,
        .dai_link = neo1973_dai,
        .num_links = ARRAY_SIZE(neo1973_dai),
  };
  
- static struct snd_soc_device neo1973_snd_devdata = {
-       .card = &neo1973,
-       .codec_dev = &soc_codec_dev_wm8753,
- };
  static int lm4857_i2c_probe(struct i2c_client *client,
                            const struct i2c_device_id *id)
  {
@@@ -673,8 -671,7 +671,7 @@@ static int __init neo1973_init(void
        if (!neo1973_snd_device)
                return -ENOMEM;
  
-       platform_set_drvdata(neo1973_snd_device, &neo1973_snd_devdata);
-       neo1973_snd_devdata.dev = &neo1973_snd_device->dev;
+       platform_set_drvdata(neo1973_snd_device, &neo1973);
        ret = platform_device_add(neo1973_snd_device);
  
        if (ret) {
@@@ -94,7 -94,8 +94,7 @@@ static void s3c_dma_enqueue(struct snd_
  
                if ((pos + len) > prtd->dma_end) {
                        len  = prtd->dma_end - pos;
 -                      pr_debug(KERN_DEBUG "%s: corrected dma len %ld\n",
 -                             __func__, len);
 +                      pr_debug("%s: corrected dma len %ld\n", __func__, len);
                }
  
                ret = s3c2410_dma_enqueue(prtd->params->channel,
@@@ -146,7 -147,7 +146,7 @@@ static int s3c_dma_hw_params(struct snd
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        unsigned long totbytes = params_buffer_bytes(params);
        struct s3c_dma_params *dma =
-               snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
+               snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
        int ret = 0;
  
  
@@@ -440,14 -441,14 +440,14 @@@ static int s3c_dma_new(struct snd_card 
        if (!card->dev->coherent_dma_mask)
                card->dev->coherent_dma_mask = 0xffffffff;
  
-       if (dai->playback.channels_min) {
+       if (dai->driver->playback.channels_min) {
                ret = s3c_preallocate_dma_buffer(pcm,
                        SNDRV_PCM_STREAM_PLAYBACK);
                if (ret)
                        goto out;
        }
  
-       if (dai->capture.channels_min) {
+       if (dai->driver->capture.channels_min) {
                ret = s3c_preallocate_dma_buffer(pcm,
                        SNDRV_PCM_STREAM_CAPTURE);
                if (ret)
        return ret;
  }
  
- struct snd_soc_platform s3c24xx_soc_platform = {
-       .name           = "s3c24xx-audio",
-       .pcm_ops        = &s3c_dma_ops,
+ static struct snd_soc_platform_driver s3c24xx_soc_platform = {
+       .ops            = &s3c_dma_ops,
        .pcm_new        = s3c_dma_new,
        .pcm_free       = s3c_dma_free_dma_buffers,
  };
- EXPORT_SYMBOL_GPL(s3c24xx_soc_platform);
  
- static int __init s3c24xx_soc_platform_init(void)
+ static int __devinit s3c24xx_soc_platform_probe(struct platform_device *pdev)
  {
-       return snd_soc_register_platform(&s3c24xx_soc_platform);
+       return snd_soc_register_platform(&pdev->dev, &s3c24xx_soc_platform);
  }
- module_init(s3c24xx_soc_platform_init);
  
- static void __exit s3c24xx_soc_platform_exit(void)
+ static int __devexit s3c24xx_soc_platform_remove(struct platform_device *pdev)
  {
-       snd_soc_unregister_platform(&s3c24xx_soc_platform);
+       snd_soc_unregister_platform(&pdev->dev);
+       return 0;
+ }
+ static struct platform_driver s3c24xx_pcm_driver = {
+       .driver = {
+               .name = "s3c24xx-pcm-audio",
+               .owner = THIS_MODULE,
+       },
+       .probe = s3c24xx_soc_platform_probe,
+       .remove = __devexit_p(s3c24xx_soc_platform_remove),
+ };
+ static int __init snd_s3c24xx_pcm_init(void)
+ {
+       return platform_driver_register(&s3c24xx_pcm_driver);
+ }
+ module_init(snd_s3c24xx_pcm_init);
+ static void __exit snd_s3c24xx_pcm_exit(void)
+ {
+       platform_driver_unregister(&s3c24xx_pcm_driver);
  }
- module_exit(s3c24xx_soc_platform_exit);
+ module_exit(snd_s3c24xx_pcm_exit);
  
  MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
  MODULE_DESCRIPTION("Samsung S3C Audio DMA module");
  MODULE_LICENSE("GPL");
+ MODULE_ALIAS("platform:s3c24xx-pcm-audio");