#include <linux/spi/spi.h>
 #include <linux/spi/ads7846.h>
 
+#include <sound/atmel-abdac.h>
+
 #include <video/atmel_lcdc.h>
 
 #include <asm/setup.h>
 /* Initialized by bootloader-specific startup code. */
 struct tag *bootloader_tags __initdata;
 
+static struct atmel_abdac_pdata __initdata abdac0_data = {
+};
+
 struct eth_addr {
        u8 addr[6];
 };
 
        spi1_board_info[0].irq = gpio_to_irq(GPIO_PIN_PB(3));
 
-       set_abdac_rate(at32_add_device_abdac(0));
+       set_abdac_rate(at32_add_device_abdac(0, &abdac0_data));
 
        at32_add_device_pwm(1 << atmel_pwm_bl_pdata.pwm_channel);
        at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info));
 
 #include <mach/portmux.h>
 #include <mach/sram.h>
 
+#include <sound/atmel-abdac.h>
+
 #include <video/atmel_lcdc.h>
 
 #include "clock.h"
        .index          = 6,
 };
 
-struct platform_device *__init at32_add_device_abdac(unsigned int id)
+struct platform_device *__init
+at32_add_device_abdac(unsigned int id, struct atmel_abdac_pdata *data)
 {
-       struct platform_device *pdev;
-       u32 pin_mask;
+       struct platform_device  *pdev;
+       struct dw_dma_slave     *dws;
+       u32                     pin_mask;
 
-       if (id != 0)
+       if (id != 0 || !data)
                return NULL;
 
-       pdev = platform_device_alloc("abdac", id);
+       pdev = platform_device_alloc("atmel_abdac", id);
        if (!pdev)
                return NULL;
 
        if (platform_device_add_resources(pdev, abdac0_resource,
                                ARRAY_SIZE(abdac0_resource)))
-               goto err_add_resources;
+               goto out_free_resources;
+
+       dws = &data->dws;
+
+       dws->dma_dev = &dw_dmac0_device.dev;
+       dws->reg_width = DW_DMA_SLAVE_WIDTH_32BIT;
+       dws->cfg_hi = DWC_CFGH_DST_PER(2);
+       dws->cfg_lo &= ~(DWC_CFGL_HS_DST_POL | DWC_CFGL_HS_SRC_POL);
+
+       if (platform_device_add_data(pdev, data,
+                               sizeof(struct atmel_abdac_pdata)))
+               goto out_free_resources;
 
        pin_mask  = (1 << 20) | (1 << 22);      /* DATA1 & DATAN1 */
        pin_mask |= (1 << 21) | (1 << 23);      /* DATA0 & DATAN0 */
        platform_device_add(pdev);
        return pdev;
 
-err_add_resources:
+out_free_resources:
        platform_device_put(pdev);
        return NULL;
 }
 
  * in this array is chip-dependent.
  */
 extern unsigned long at32_board_osc_rates[];
-  
+
 /*
  * This used to add essential system devices, but this is now done
  * automatically. Please don't use it in new board code.
 struct platform_device *
 at32_add_device_ac97c(unsigned int id, struct ac97c_platform_data *data);
 
-struct platform_device *at32_add_device_abdac(unsigned int id);
+struct atmel_abdac_pdata;
+struct platform_device *
+at32_add_device_abdac(unsigned int id, struct atmel_abdac_pdata *data);
+
 struct platform_device *at32_add_device_psif(unsigned int id);
 
 struct cf_platform_data {