Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 23 Jul 2011 17:59:37 +0000 (10:59 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 23 Jul 2011 17:59:37 +0000 (10:59 -0700)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: (297 commits)
  ALSA: asihpi - Replace with snd_ctl_boolean_mono_info()
  ALSA: asihpi - HPI version 4.08
  ALSA: asihpi - Add volume mute controls
  ALSA: asihpi - Control name updates
  ALSA: asihpi - Use size_t for sizeof result
  ALSA: asihpi - Explicitly include mutex.h
  ALSA: asihpi - Add new node and message defines
  ALSA: asihpi - Make local function static
  ALSA: asihpi - Fix minor typos and spelling
  ALSA: asihpi - Remove unused structures, macros and functions
  ALSA: asihpi - Remove spurious adapter index check
  ALSA: asihpi - Revise snd_pcm_debug_name, get rid of DEBUG_NAME macro
  ALSA: asihpi - DSP code loader API now independent of OS
  ALSA: asihpi - Remove controlex structs and associated special data transfer code
  ALSA: asihpi - Increase request and response buffer sizes
  ALSA: asihpi - Give more meaningful name to hpi request message type
  ALSA: usb-audio - Add quirk for  Roland / BOSS BR-800
  ALSA: hda - Remove a superfluous argument of via_auto_init_output()
  ALSA: hda - Fix indep-HP path (de-)activation for VT1708* codecs
  ALSA: hda - Add documentation for codec-specific mixer controls
  ...

1  2 
MAINTAINERS
include/linux/pci_ids.h
sound/soc/ep93xx/ep93xx-pcm.c

diff --combined MAINTAINERS
@@@ -1,5 -1,4 +1,5 @@@
  
 +
        List of maintainers and how to submit kernel changes
  
  Please try to follow the guidelines below.  This will make things
@@@ -534,6 -533,8 +534,8 @@@ L: device-drivers-devel@blackfin.uclinu
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  W:    http://wiki.analog.com/
  S:    Supported
+ F:    sound/soc/codecs/adau*
+ F:    sound/soc/codecs/adav*
  F:    sound/soc/codecs/ad1*
  F:    sound/soc/codecs/ssm*
  
@@@ -595,16 -596,6 +597,16 @@@ S:       Maintaine
  F:    arch/arm/lib/floppydma.S
  F:    arch/arm/include/asm/floppy.h
  
 +ARM PMU PROFILING AND DEBUGGING
 +M:    Will Deacon <will.deacon@arm.com>
 +S:    Maintained
 +F:    arch/arm/kernel/perf_event*
 +F:    arch/arm/oprofile/common.c
 +F:    arch/arm/kernel/pmu.c
 +F:    arch/arm/include/asm/pmu.h
 +F:    arch/arm/kernel/hw_breakpoint.c
 +F:    arch/arm/include/asm/hw_breakpoint.h
 +
  ARM PORT
  M:    Russell King <linux@arm.linux.org.uk>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1356,18 -1347,16 +1358,18 @@@ F:   drivers/auxdisplay
  F:    include/linux/cfag12864b.h
  
  AVR32 ARCHITECTURE
 -M:    Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com>
 +M:    Haavard Skinnemoen <hskinnemoen@gmail.com>
 +M:    Hans-Christian Egtvedt <egtvedt@samfundet.no>
  W:    http://www.atmel.com/products/AVR32/
  W:    http://avr32linux.org/
  W:    http://avrfreaks.net/
 -S:    Supported
 +S:    Maintained
  F:    arch/avr32/
  
  AVR32/AT32AP MACHINE SUPPORT
 -M:    Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com>
 -S:    Supported
 +M:    Haavard Skinnemoen <hskinnemoen@gmail.com>
 +M:    Hans-Christian Egtvedt <egtvedt@samfundet.no>
 +S:    Maintained
  F:    arch/avr32/mach-at32ap/
  
  AX.25 NETWORK LAYER
@@@ -1403,6 -1392,7 +1405,6 @@@ F:      include/linux/backlight.
  BATMAN ADVANCED
  M:    Marek Lindner <lindner_marek@yahoo.de>
  M:    Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
 -M:    Sven Eckelmann <sven@narfation.org>
  L:    b.a.t.m.a.n@lists.open-mesh.org
  W:    http://www.open-mesh.org/
  S:    Maintained
@@@ -1435,6 -1425,7 +1437,6 @@@ S:      Supporte
  F:    arch/blackfin/
  
  BLACKFIN EMAC DRIVER
 -M:    Michael Hennerich <michael.hennerich@analog.com>
  L:    uclinux-dist-devel@blackfin.uclinux.org
  W:    http://blackfin.uclinux.org
  S:    Supported
@@@ -1650,7 -1641,7 +1652,7 @@@ CAN NETWORK LAYE
  M:    Oliver Hartkopp <socketcan@hartkopp.net>
  M:    Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
  M:    Urs Thuermann <urs.thuermann@volkswagen.de>
 -L:    socketcan-core@lists.berlios.de
 +L:    socketcan-core@lists.berlios.de (subscribers-only)
  L:    netdev@vger.kernel.org
  W:    http://developer.berlios.de/projects/socketcan/
  S:    Maintained
@@@ -1662,7 -1653,7 +1664,7 @@@ F:      include/linux/can/raw.
  
  CAN NETWORK DRIVERS
  M:    Wolfgang Grandegger <wg@grandegger.com>
 -L:    socketcan-core@lists.berlios.de
 +L:    socketcan-core@lists.berlios.de (subscribers-only)
  L:    netdev@vger.kernel.org
  W:    http://developer.berlios.de/projects/socketcan/
  S:    Maintained
@@@ -1750,7 -1741,7 +1752,7 @@@ S:      Supporte
  F:    drivers/net/enic/
  
  CIRRUS LOGIC EP93XX ETHERNET DRIVER
 -M:    Lennert Buytenhek <kernel@wantstofly.org>
 +M:    Hartley Sweeten <hsweeten@visionengravers.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/arm/ep93xx_eth.c
@@@ -1900,6 -1891,7 +1902,6 @@@ L:      cpufreq@vger.kernel.or
  W:    http://www.codemonkey.org.uk/projects/cpufreq/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq.git
  S:    Maintained
 -F:    arch/x86/kernel/cpu/cpufreq/
  F:    drivers/cpufreq/
  F:    include/linux/cpufreq.h
  
@@@ -2208,7 -2200,7 +2210,7 @@@ F:      drivers/acpi/dock.
  DOCUMENTATION
  M:    Randy Dunlap <rdunlap@xenotime.net>
  L:    linux-doc@vger.kernel.org
 -T:    quilt oss.oracle.com/~rdunlap/kernel-doc-patches/current/
 +T:    quilt http://userweb.kernel.org/~rdunlap/kernel-doc-patches/current/
  S:    Maintained
  F:    Documentation/
  
@@@ -2302,7 -2294,8 +2304,7 @@@ F:      drivers/scsi/eata_pio.
  
  EBTABLES
  M:    Bart De Schuymer <bart.de.schuymer@pandora.be>
 -L:    ebtables-user@lists.sourceforge.net
 -L:    ebtables-devel@lists.sourceforge.net
 +L:    netfilter-devel@vger.kernel.org
  W:    http://ebtables.sourceforge.net/
  S:    Maintained
  F:    include/linux/netfilter_bridge/ebt_*.h
@@@ -3426,9 -3419,10 +3428,9 @@@ S:     Maintaine
  F:    drivers/net/ipg.*
  
  IPATH DRIVER
 -M:    Ralph Campbell <infinipath@qlogic.com>
 +M:    Mike Marciniszyn <infinipath@qlogic.com>
  L:    linux-rdma@vger.kernel.org
 -T:    git git://git.qlogic.com/ipath-linux-2.6
 -S:    Supported
 +S:    Maintained
  F:    drivers/infiniband/hw/ipath/
  
  IPMI SUBSYSTEM
@@@ -3828,12 -3822,6 +3830,12 @@@ S:    Maintaine
  F:    drivers/leds/
  F:    include/linux/leds.h
  
 +LEGACY EEPROM DRIVER
 +M:    Jean Delvare <khali@linux-fr.org>
 +S:    Maintained
 +F:    Documentation/misc-devices/eeprom
 +F:    drivers/misc/eeprom/eeprom.c
 +
  LEGO USB Tower driver
  M:    Juergen Stuber <starblue@users.sourceforge.net>
  L:    legousb-devel@lists.sourceforge.net
@@@ -4159,7 -4147,7 +4161,7 @@@ F:      include/linux/mm.
  F:    mm/
  
  MEMORY RESOURCE CONTROLLER
 -M:    Balbir Singh <balbir@linux.vnet.ibm.com>
 +M:    Balbir Singh <bsingharora@gmail.com>
  M:    Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
  M:    KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
  L:    linux-mm@kvack.org
@@@ -4266,7 -4254,8 +4268,7 @@@ F:      drivers/mmc
  F:    include/linux/mmc/
  
  MULTIMEDIA CARD (MMC) ETC. OVER SPI
 -M:    David Brownell <dbrownell@users.sourceforge.net>
 -S:    Odd Fixes
 +S:    Orphan
  F:    drivers/mmc/host/mmc_spi.c
  F:    include/linux/spi/mmc_spi.h
  
@@@ -4289,8 -4278,8 +4291,8 @@@ S:      Maintaine
  F:    drivers/usb/musb/
  
  MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE)
 +M:    Jon Mason <mason@myri.com>
  M:    Andrew Gallatin <gallatin@myri.com>
 -M:    Brice Goglin <brice@myri.com>
  L:    netdev@vger.kernel.org
  W:    http://www.myri.com/scs/download-Myri10GE.html
  S:    Supported
@@@ -4584,8 -4573,9 +4586,8 @@@ S:      Maintaine
  F:    drivers/mmc/host/omap.c
  
  OMAP HS MMC SUPPORT
 -M:    Madhusudhan Chikkature <madhu.cr@ti.com>
  L:    linux-omap@vger.kernel.org
 -S:    Maintained
 +S:    Orphan
  F:    drivers/mmc/host/omap_hsmmc.c
  
  OMAP RANDOM NUMBER GENERATOR SUPPORT
@@@ -4615,6 -4605,7 +4617,6 @@@ F:      drivers/media/video/omap3isp/
  
  OMAP USB SUPPORT
  M:    Felipe Balbi <balbi@ti.com>
 -M:    David Brownell <dbrownell@users.sourceforge.net>
  L:    linux-usb@vger.kernel.org
  L:    linux-omap@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
@@@ -4903,7 -4894,7 +4905,7 @@@ F:      mm/percpu*.
  F:    arch/*/include/asm/percpu.h
  
  PER-TASK DELAY ACCOUNTING
 -M:    Balbir Singh <balbir@linux.vnet.ibm.com>
 +M:    Balbir Singh <bsingharora@gmail.com>
  S:    Maintained
  F:    include/linux/delayacct.h
  F:    kernel/delayacct.c
@@@ -4958,7 -4949,6 +4960,7 @@@ T:      git git://git.kernel.org/pub/scm/lin
  F:    drivers/input/serio/i8042-unicore32io.h
  F:    drivers/i2c/busses/i2c-puv3.c
  F:    drivers/video/fb-puv3.c
 +F:    drivers/rtc/rtc-puv3.c
  
  PMC SIERRA MaxRAID DRIVER
  M:    Anil Ravindranath <anil_ravindranath@pmc-sierra.com>
@@@ -4991,7 -4981,7 +4993,7 @@@ F:      drivers/power/power_supply
  
  PNP SUPPORT
  M:    Adam Belay <abelay@mit.edu>
 -M:    Bjorn Helgaas <bjorn.helgaas@hp.com>
 +M:    Bjorn Helgaas <bhelgaas@google.com>
  S:    Maintained
  F:    drivers/pnp/
  
@@@ -5151,12 -5141,6 +5153,12 @@@ M:    Robert Jarzmik <robert.jarzmik@free.
  L:    rtc-linux@googlegroups.com
  S:    Maintained
  
 +QIB DRIVER
 +M:    Mike Marciniszyn <infinipath@qlogic.com>
 +L:    linux-rdma@vger.kernel.org
 +S:    Supported
 +F:    drivers/infiniband/hw/qib/
 +
  QLOGIC QLA1280 SCSI DRIVER
  M:    Michael Reed <mdr@sgi.com>
  L:    linux-scsi@vger.kernel.org
@@@ -5196,7 -5180,6 +5198,7 @@@ S:      Supporte
  F:    drivers/net/qlcnic/
  
  QLOGIC QLGE 10Gb ETHERNET DRIVER
 +M:    Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
  M:    Ron Mercer <ron.mercer@qlogic.com>
  M:    linux-driver@qlogic.com
  L:    netdev@vger.kernel.org
@@@ -6003,6 -5986,7 +6005,6 @@@ F:      Documentation/serial/specialix.tx
  F:    drivers/staging/tty/specialix*
  
  SPI SUBSYSTEM
 -M:    David Brownell <dbrownell@users.sourceforge.net>
  M:    Grant Likely <grant.likely@secretlab.ca>
  L:    spi-devel-general@lists.sourceforge.net
  Q:    http://patchwork.kernel.org/project/spi-devel-general/list/
@@@ -6118,7 -6102,7 +6120,7 @@@ F:      include/target
  F:    Documentation/target/
  
  TASKSTATS STATISTICS INTERFACE
 -M:    Balbir Singh <balbir@linux.vnet.ibm.com>
 +M:    Balbir Singh <bsingharora@gmail.com>
  S:    Maintained
  F:    Documentation/accounting/taskstats*
  F:    include/linux/taskstats*
@@@ -6247,14 -6231,9 +6249,14 @@@ F:    drivers/char/toshiba.
  F:    include/linux/toshiba.h
  
  TMIO MMC DRIVER
 +M:    Guennadi Liakhovetski <g.liakhovetski@gmx.de>
  M:    Ian Molton <ian@mnementh.co.uk>
 +L:    linux-mmc@vger.kernel.org
  S:    Maintained
 -F:    drivers/mmc/host/tmio_mmc.*
 +F:    drivers/mmc/host/tmio_mmc*
 +F:    drivers/mmc/host/sh_mobile_sdhi.c
 +F:    include/linux/mmc/tmio.h
 +F:    include/linux/mmc/sh_mobile_sdhi.h
  
  TMPFS (SHMEM FILESYSTEM)
  M:    Hugh Dickins <hughd@google.com>
@@@ -6331,7 -6310,7 +6333,7 @@@ F:      drivers/scsi/u14-34f.
  
  UBI FILE SYSTEM (UBIFS)
  M:    Artem Bityutskiy <dedekind1@gmail.com>
 -M:    Adrian Hunter <adrian.hunter@nokia.com>
 +M:    Adrian Hunter <adrian.hunter@intel.com>
  L:    linux-mtd@lists.infradead.org
  T:    git git://git.infradead.org/ubifs-2.6.git
  W:    http://www.linux-mtd.infradead.org/doc/ubifs.html
@@@ -6455,9 -6434,9 +6457,9 @@@ S:      Maintaine
  F:    drivers/usb/misc/rio500*
  
  USB EHCI DRIVER
 -M:    David Brownell <dbrownell@users.sourceforge.net>
 +M:    Alan Stern <stern@rowland.harvard.edu>
  L:    linux-usb@vger.kernel.org
 -S:    Odd Fixes
 +S:    Maintained
  F:    Documentation/usb/ehci.txt
  F:    drivers/usb/host/ehci*
  
@@@ -6471,10 -6450,9 +6473,10 @@@ S:    Maintaine
  F:    drivers/media/video/et61x251/
  
  USB GADGET/PERIPHERAL SUBSYSTEM
 -M:    David Brownell <dbrownell@users.sourceforge.net>
 +M:    Felipe Balbi <balbi@ti.com>
  L:    linux-usb@vger.kernel.org
  W:    http://www.linux-usb.org/gadget
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
  S:    Maintained
  F:    drivers/usb/gadget/
  F:    include/linux/usb/gadget*
@@@ -6484,15 -6462,9 +6486,15 @@@ M:    Jiri Kosina <jkosina@suse.cz
  L:    linux-usb@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git
  S:    Maintained
 -F:    Documentation/usb/hiddev.txt
 +F:    Documentation/hid/hiddev.txt
  F:    drivers/hid/usbhid/
  
 +USB/IP DRIVERS
 +M:    Matt Mooney <mfm@muteddisk.com>
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +F:    drivers/staging/usbip/
 +
  USB ISP116X DRIVER
  M:    Olav Kongas <ok@artecdesign.ee>
  L:    linux-usb@vger.kernel.org
@@@ -6522,9 -6494,9 +6524,9 @@@ S:      Maintaine
  F:    sound/usb/midi.*
  
  USB OHCI DRIVER
 -M:    David Brownell <dbrownell@users.sourceforge.net>
 +M:    Alan Stern <stern@rowland.harvard.edu>
  L:    linux-usb@vger.kernel.org
 -S:    Odd Fixes
 +S:    Maintained
  F:    Documentation/usb/ohci.txt
  F:    drivers/usb/host/ohci*
  
@@@ -6750,15 -6722,6 +6752,15 @@@ S:    Maintaine
  F:    Documentation/filesystems/vfat.txt
  F:    fs/fat/
  
 +VIDEOBUF2 FRAMEWORK
 +M:    Pawel Osciak <pawel@osciak.com>
 +M:    Marek Szyprowski <m.szyprowski@samsung.com>
 +M:    Kyungmin Park <kyungmin.park@samsung.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    drivers/media/video/videobuf2-*
 +F:    include/media/videobuf2-*
 +
  VIRTIO CONSOLE DRIVER
  M:    Amit Shah <amit.shah@redhat.com>
  L:    virtualization@lists.linux-foundation.org
@@@ -7036,13 -6999,6 +7038,13 @@@ T:    git git://git.kernel.org/pub/scm/lin
  S:    Maintained
  F:    drivers/platform/x86
  
 +X86 MCE INFRASTRUCTURE
 +M:    Tony Luck <tony.luck@intel.com>
 +M:    Borislav Petkov <bp@amd64.org>
 +L:    linux-edac@vger.kernel.org
 +S:    Maintained
 +F:    arch/x86/kernel/cpu/mcheck/*
 +
  XEN HYPERVISOR INTERFACE
  M:    Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
  M:    Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
diff --combined include/linux/pci_ids.h
  #define PCI_SUBDEVICE_ID_CREATIVE_SB08801     0x0041
  #define PCI_SUBDEVICE_ID_CREATIVE_SB08802     0x0042
  #define PCI_SUBDEVICE_ID_CREATIVE_SB08803     0x0043
+ #define PCI_SUBDEVICE_ID_CREATIVE_SB1270      0x0062
  #define PCI_SUBDEVICE_ID_CREATIVE_HENDRIX     0x6000
  
  #define PCI_VENDOR_ID_ECTIVA          0x1102 /* duplicate: CREATIVE */
  #define PCI_DEVICE_ID_RICOH_RL5C476   0x0476
  #define PCI_DEVICE_ID_RICOH_RL5C478   0x0478
  #define PCI_DEVICE_ID_RICOH_R5C822    0x0822
 +#define PCI_DEVICE_ID_RICOH_R5CE823   0xe823
  #define PCI_DEVICE_ID_RICOH_R5C832    0x0832
  #define PCI_DEVICE_ID_RICOH_R5C843    0x0843
  
  #define PCI_DEVICE_ID_TIGON3_5761E    0x1680
  #define PCI_DEVICE_ID_TIGON3_5761     0x1681
  #define PCI_DEVICE_ID_TIGON3_5764     0x1684
 +#define PCI_DEVICE_ID_NX2_57800               0x168a
 +#define PCI_DEVICE_ID_NX2_57840               0x168d
 +#define PCI_DEVICE_ID_NX2_57810               0x168e
  #define PCI_DEVICE_ID_TIGON3_5787M    0x1693
  #define PCI_DEVICE_ID_TIGON3_5782     0x1696
  #define PCI_DEVICE_ID_TIGON3_5784     0x1698
  #define PCI_DEVICE_ID_TIGON3_5787     0x169b
  #define PCI_DEVICE_ID_TIGON3_5788     0x169c
  #define PCI_DEVICE_ID_TIGON3_5789     0x169d
 +#define PCI_DEVICE_ID_NX2_57800_MF    0x16a5
  #define PCI_DEVICE_ID_TIGON3_5702X    0x16a6
  #define PCI_DEVICE_ID_TIGON3_5703X    0x16a7
  #define PCI_DEVICE_ID_TIGON3_5704S    0x16a8
 +#define PCI_DEVICE_ID_NX2_57800_VF    0x16a9
  #define PCI_DEVICE_ID_NX2_5706S               0x16aa
 +#define PCI_DEVICE_ID_NX2_57840_MF    0x16ab
  #define PCI_DEVICE_ID_NX2_5708S               0x16ac
 +#define PCI_DEVICE_ID_NX2_57840_VF    0x16ad
 +#define PCI_DEVICE_ID_NX2_57810_MF    0x16ae
 +#define PCI_DEVICE_ID_NX2_57810_VF    0x16af
  #define PCI_DEVICE_ID_TIGON3_5702A3   0x16c6
  #define PCI_DEVICE_ID_TIGON3_5703A3   0x16c7
  #define PCI_DEVICE_ID_TIGON3_5781     0x16dd
@@@ -16,7 -16,6 +16,7 @@@
  #include <linux/init.h>
  #include <linux/device.h>
  #include <linux/slab.h>
 +#include <linux/dmaengine.h>
  #include <linux/dma-mapping.h>
  
  #include <sound/core.h>
@@@ -54,34 -53,43 +54,34 @@@ static const struct snd_pcm_hardware ep
  
  struct ep93xx_runtime_data
  {
 -      struct ep93xx_dma_m2p_client    cl;
 -      struct ep93xx_pcm_dma_params    *params;
        int                             pointer_bytes;
 -      struct tasklet_struct           period_tasklet;
        int                             periods;
 -      struct ep93xx_dma_buffer        buf[32];
 +      int                             period_bytes;
 +      struct dma_chan                 *dma_chan;
 +      struct ep93xx_dma_data          dma_data;
  };
  
 -static void ep93xx_pcm_period_elapsed(unsigned long data)
 +static void ep93xx_pcm_dma_callback(void *data)
  {
 -      struct snd_pcm_substream *substream = (struct snd_pcm_substream *)data;
 -      snd_pcm_period_elapsed(substream);
 -}
 +      struct snd_pcm_substream *substream = data;
 +      struct ep93xx_runtime_data *rtd = substream->runtime->private_data;
  
 -static void ep93xx_pcm_buffer_started(void *cookie,
 -                                    struct ep93xx_dma_buffer *buf)
 -{
 +      rtd->pointer_bytes += rtd->period_bytes;
 +      rtd->pointer_bytes %= rtd->period_bytes * rtd->periods;
 +
 +      snd_pcm_period_elapsed(substream);
  }
  
 -static void ep93xx_pcm_buffer_finished(void *cookie, 
 -                                     struct ep93xx_dma_buffer *buf, 
 -                                     int bytes, int error)
 +static bool ep93xx_pcm_dma_filter(struct dma_chan *chan, void *filter_param)
  {
 -      struct snd_pcm_substream *substream = cookie;
 -      struct ep93xx_runtime_data *rtd = substream->runtime->private_data;
 -
 -      if (buf == rtd->buf + rtd->periods - 1)
 -              rtd->pointer_bytes = 0;
 -      else
 -              rtd->pointer_bytes += buf->size;
 +      struct ep93xx_dma_data *data = filter_param;
  
 -      if (!error) {
 -              ep93xx_dma_m2p_submit_recursive(&rtd->cl, buf);
 -              tasklet_schedule(&rtd->period_tasklet);
 -      } else {
 -              snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
 +      if (data->direction == ep93xx_dma_chan_direction(chan)) {
 +              chan->private = data;
 +              return true;
        }
 +
 +      return false;
  }
  
  static int ep93xx_pcm_open(struct snd_pcm_substream *substream)
        struct snd_soc_dai *cpu_dai = soc_rtd->cpu_dai;
        struct ep93xx_pcm_dma_params *dma_params;
        struct ep93xx_runtime_data *rtd;    
 +      dma_cap_mask_t mask;
        int ret;
  
 -      dma_params = snd_soc_dai_get_dma_data(cpu_dai, substream);
 +      ret = snd_pcm_hw_constraint_integer(substream->runtime,
 +                                          SNDRV_PCM_HW_PARAM_PERIODS);
 +      if (ret < 0)
 +              return ret;
 +
        snd_soc_set_runtime_hwparams(substream, &ep93xx_pcm_hardware);
  
        rtd = kmalloc(sizeof(*rtd), GFP_KERNEL);
        if (!rtd) 
                return -ENOMEM;
  
 -      memset(&rtd->period_tasklet, 0, sizeof(rtd->period_tasklet));
 -      rtd->period_tasklet.func = ep93xx_pcm_period_elapsed;
 -      rtd->period_tasklet.data = (unsigned long)substream;
 -
 -      rtd->cl.name = dma_params->name;
 -      rtd->cl.flags = dma_params->dma_port | EP93XX_DMA_M2P_IGNORE_ERROR |
 -              ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
 -               EP93XX_DMA_M2P_TX : EP93XX_DMA_M2P_RX);
 -      rtd->cl.cookie = substream;
 -      rtd->cl.buffer_started = ep93xx_pcm_buffer_started;
 -      rtd->cl.buffer_finished = ep93xx_pcm_buffer_finished;
 -      ret = ep93xx_dma_m2p_client_register(&rtd->cl);
 -      if (ret < 0) {
 +      dma_cap_zero(mask);
 +      dma_cap_set(DMA_SLAVE, mask);
 +      dma_cap_set(DMA_CYCLIC, mask);
 +
 +      dma_params = snd_soc_dai_get_dma_data(cpu_dai, substream);
 +      rtd->dma_data.port = dma_params->dma_port;
 +      rtd->dma_data.name = dma_params->name;
 +
 +      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 +              rtd->dma_data.direction = DMA_TO_DEVICE;
 +      else
 +              rtd->dma_data.direction = DMA_FROM_DEVICE;
 +
 +      rtd->dma_chan = dma_request_channel(mask, ep93xx_pcm_dma_filter,
 +                                          &rtd->dma_data);
 +      if (!rtd->dma_chan) {
                kfree(rtd);
 -              return ret;
 +              return -EINVAL;
        }
        
        substream->runtime->private_data = rtd;
@@@ -132,52 -132,31 +132,52 @@@ static int ep93xx_pcm_close(struct snd_
  {
        struct ep93xx_runtime_data *rtd = substream->runtime->private_data;
  
 -      ep93xx_dma_m2p_client_unregister(&rtd->cl);
 +      dma_release_channel(rtd->dma_chan);
        kfree(rtd);
        return 0;
  }
  
 +static int ep93xx_pcm_dma_submit(struct snd_pcm_substream *substream)
 +{
 +      struct snd_pcm_runtime *runtime = substream->runtime;
 +      struct ep93xx_runtime_data *rtd = runtime->private_data;
 +      struct dma_chan *chan = rtd->dma_chan;
 +      struct dma_device *dma_dev = chan->device;
 +      struct dma_async_tx_descriptor *desc;
 +
 +      rtd->pointer_bytes = 0;
 +      desc = dma_dev->device_prep_dma_cyclic(chan, runtime->dma_addr,
 +                                             rtd->period_bytes * rtd->periods,
 +                                             rtd->period_bytes,
 +                                             rtd->dma_data.direction);
 +      if (!desc)
 +              return -EINVAL;
 +
 +      desc->callback = ep93xx_pcm_dma_callback;
 +      desc->callback_param = substream;
 +
 +      dmaengine_submit(desc);
 +      return 0;
 +}
 +
 +static void ep93xx_pcm_dma_flush(struct snd_pcm_substream *substream)
 +{
 +      struct snd_pcm_runtime *runtime = substream->runtime;
 +      struct ep93xx_runtime_data *rtd = runtime->private_data;
 +
 +      dmaengine_terminate_all(rtd->dma_chan);
 +}
 +
  static int ep93xx_pcm_hw_params(struct snd_pcm_substream *substream,
                                struct snd_pcm_hw_params *params)
  {
        struct snd_pcm_runtime *runtime = substream->runtime;
        struct ep93xx_runtime_data *rtd = runtime->private_data;
 -      size_t totsize = params_buffer_bytes(params);
 -      size_t period = params_period_bytes(params);
 -      int i;
  
        snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer);
 -      runtime->dma_bytes = totsize;
 -
 -      rtd->periods = (totsize + period - 1) / period;
 -      for (i = 0; i < rtd->periods; i++) {
 -              rtd->buf[i].bus_addr = runtime->dma_addr + (i * period);
 -              rtd->buf[i].size = period;
 -              if ((i + 1) * period > totsize)
 -                      rtd->buf[i].size = totsize - (i * period);
 -      }
  
 +      rtd->periods = params_periods(params);
 +      rtd->period_bytes = params_period_bytes(params);
        return 0;
  }
  
@@@ -189,20 -168,24 +189,20 @@@ static int ep93xx_pcm_hw_free(struct sn
  
  static int ep93xx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
  {
 -      struct ep93xx_runtime_data *rtd = substream->runtime->private_data;
        int ret;
 -      int i;
  
        ret = 0;
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_START:
        case SNDRV_PCM_TRIGGER_RESUME:
        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
 -              rtd->pointer_bytes = 0;
 -              for (i = 0; i < rtd->periods; i++)
 -                      ep93xx_dma_m2p_submit(&rtd->cl, rtd->buf + i);
 +              ret = ep93xx_pcm_dma_submit(substream);
                break;
  
        case SNDRV_PCM_TRIGGER_STOP:
        case SNDRV_PCM_TRIGGER_SUSPEND:
        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 -              ep93xx_dma_m2p_flush(&rtd->cl);
 +              ep93xx_pcm_dma_flush(substream);
                break;
  
        default:
@@@ -283,9 -266,11 +283,11 @@@ static void ep93xx_pcm_free_dma_buffers
  
  static u64 ep93xx_pcm_dmamask = 0xffffffff;
  
- static int ep93xx_pcm_new(struct snd_card *card, struct snd_soc_dai *dai,
-                         struct snd_pcm *pcm)
+ static int ep93xx_pcm_new(struct snd_soc_pcm_runtime *rtd)
  {
+       struct snd_card *card = rtd->card->snd_card;
+       struct snd_soc_dai *dai = rtd->cpu_dai;
+       struct snd_pcm *pcm = rtd->pcm;
        int ret = 0;
  
        if (!card->dev->dma_mask)