]> Pileus Git - ~andy/linux/commitdiff
Merge branch 'next' of git://git.infradead.org/users/vkoul/slave-dma
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 18 Jan 2012 02:40:24 +0000 (18:40 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 18 Jan 2012 02:40:24 +0000 (18:40 -0800)
* 'next' of git://git.infradead.org/users/vkoul/slave-dma: (53 commits)
  ARM: mach-shmobile: specify CHCLR registers on SH7372
  dma: shdma: fix runtime PM: clear channel buffers on reset
  dma/imx-sdma: save irq flags when use spin_lock in sdma_tx_submit
  dmaengine/ste_dma40: clear LNK on channel startup
  dmaengine: intel_mid_dma: remove legacy pm interface
  ASoC: mxs: correct 'direction' of device_prep_dma_cyclic
  dmaengine: intel_mid_dma: error path fix
  dmaengine: intel_mid_dma: locking and freeing fixes
  mtd: gpmi-nand: move to dma_transfer_direction
  mtd: fix compile error for gpmi-nand
  mmc: mxs-mmc: fix the dma_transfer_direction migration
  dmaengine: add DMA_TRANS_NONE to dma_transfer_direction
  dma: mxs-dma: Don't use CLKGATE bits in CTRL0 to disable DMA channels
  dma: mxs-dma: make mxs_dma_prep_slave_sg() multi user safe
  dma: mxs-dma: Always leave mxs_dma_init() with the clock disabled.
  dma: mxs-dma: fix a typo in comment
  DMA: PL330: Remove pm_runtime_xxx calls from pl330 probe/remove
  video i.MX IPU: Fix display connections
  i.MX IPU DMA: Fix wrong burstsize settings
  dmaengine/ste_dma40: allow fixed physical channel
  ...

Fix up conflicts in drivers/dma/{Kconfig,mxs-dma.c,pl330.c}

The conflicts looked pretty trivial, but I'll ask people to verify them.

29 files changed:
1  2 
MAINTAINERS
arch/arm/mach-shmobile/setup-sh7372.c
arch/arm/plat-samsung/dma-ops.c
arch/arm/plat-samsung/include/plat/dma-ops.h
drivers/dma/amba-pl08x.c
drivers/dma/mxs-dma.c
drivers/dma/pl330.c
drivers/media/video/mx3_camera.c
drivers/media/video/timblogiw.c
drivers/misc/carma/carma-fpga-program.c
drivers/mmc/host/mmci.c
drivers/mmc/host/mxcmmc.c
drivers/mmc/host/mxs-mmc.c
drivers/mmc/host/sh_mmcif.c
drivers/mtd/nand/gpmi-nand/gpmi-lib.c
drivers/net/ethernet/micrel/ks8842.c
drivers/spi/spi-pl022.c
drivers/spi/spi-topcliff-pch.c
drivers/tty/serial/amba-pl011.c
drivers/tty/serial/pch_uart.c
drivers/tty/serial/sh-sci.c
drivers/usb/musb/ux500_dma.c
drivers/usb/renesas_usbhs/fifo.c
sound/atmel/ac97c.c
sound/soc/ep93xx/ep93xx-pcm.c
sound/soc/imx/imx-pcm-dma-mx2.c
sound/soc/mxs/mxs-pcm.c
sound/soc/samsung/dma.c
sound/soc/txx9/txx9aclc.c

diff --combined MAINTAINERS
index ece8935025e307efde7100b088d0c71a78ffc0a5,1b141d71ea13214b381752a5889e5b9c9c580cd0..341dee3b02c6e8a98c9ac722abd21cfa0501dd7b
@@@ -184,6 -184,11 +184,6 @@@ S:        Maintaine
  F:    Documentation/filesystems/9p.txt
  F:    fs/9p/
  
 -A2232 SERIAL BOARD DRIVER
 -L:    linux-m68k@lists.linux-m68k.org
 -S:    Orphan
 -F:    drivers/staging/generic_serial/ser_a2232*
 -
  AACRAID SCSI RAID DRIVER
  M:    Adaptec OEM Raid Solutions <aacraid@adaptec.com>
  L:    linux-scsi@vger.kernel.org
@@@ -342,7 -347,7 +342,7 @@@ S: Supporte
  F:    drivers/mfd/adp5520.c
  F:    drivers/video/backlight/adp5520_bl.c
  F:    drivers/leds/leds-adp5520.c
 -F:    drivers/gpio/adp5520-gpio.c
 +F:    drivers/gpio/gpio-adp5520.c
  F:    drivers/input/keyboard/adp5520-keys.c
  
  ADP5588 QWERTY KEYPAD AND IO EXPANDER DRIVER (ADP5588/ADP5587)
@@@ -351,7 -356,7 +351,7 @@@ L: device-drivers-devel@blackfin.uclinu
  W:    http://wiki.analog.com/ADP5588
  S:    Supported
  F:    drivers/input/keyboard/adp5588-keys.c
 -F:    drivers/gpio/adp5588-gpio.c
 +F:    drivers/gpio/gpio-adp5588.c
  
  ADP8860 BACKLIGHT DRIVER (ADP8860/ADP8861/ADP8863)
  M:    Michael Hennerich <michael.hennerich@analog.com>
@@@ -506,8 -511,8 +506,8 @@@ M: Joerg Roedel <joerg.roedel@amd.com
  L:    iommu@lists.linux-foundation.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu.git
  S:    Supported
 -F:    arch/x86/kernel/amd_iommu*.c
 -F:    arch/x86/include/asm/amd_iommu*.h
 +F:    drivers/iommu/amd_iommu*.[ch]
 +F:    include/linux/amd-iommu.h
  
  AMD MICROCODE UPDATE SUPPORT
  M:    Andreas Herrmann <andreas.herrmann3@amd.com>
@@@ -537,7 -542,6 +537,7 @@@ F: sound/soc/codecs/adau
  F:    sound/soc/codecs/adav*
  F:    sound/soc/codecs/ad1*
  F:    sound/soc/codecs/ssm*
 +F:    sound/soc/codecs/sigmadsp.*
  
  ANALOG DEVICES INC ASOC DRIVERS
  L:    uclinux-dist-devel@blackfin.uclinux.org
@@@ -745,6 -749,7 +745,7 @@@ M: Barry Song <baohua.song@csr.com
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/mach-prima2/
+ F:    drivers/dma/sirf-dma*
  
  ARM/EBSA110 MACHINE SUPPORT
  M:    Russell King <linux@arm.linux.org.uk>
@@@ -785,7 -790,6 +786,7 @@@ L: linux-arm-kernel@lists.infradead.or
  S:    Maintained
  T:    git git://git.pengutronix.de/git/imx/linux-2.6.git
  F:    arch/arm/mach-mx*/
 +F:    arch/arm/mach-imx/
  F:    arch/arm/plat-mxc/
  
  ARM/FREESCALE IMX51
@@@ -801,13 -805,6 +802,13 @@@ S:       Maintaine
  T:    git git://git.linaro.org/people/shawnguo/linux-2.6.git
  F:    arch/arm/mach-imx/*imx6*
  
 +ARM/FREESCALE MXS ARM ARCHITECTURE
 +M:    Shawn Guo <shawn.guo@linaro.org>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +T:    git git://git.linaro.org/people/shawnguo/linux-2.6.git
 +F:    arch/arm/mach-mxs/
 +
  ARM/GLOMATION GESBC9312SX MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -915,6 -912,7 +916,6 @@@ M: Lennert Buytenhek <kernel@wantstofly
  M:    Nicolas Pitre <nico@fluxnic.net>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Odd Fixes
 -F:    arch/arm/mach-loki/
  F:    arch/arm/mach-kirkwood/
  F:    arch/arm/mach-mv78xx0/
  F:    arch/arm/mach-orion5x/
@@@ -1049,18 -1047,35 +1050,18 @@@ ARM/SAMSUNG ARM ARCHITECTURE
  M:    Ben Dooks <ben-linux@fluff.org>
  M:    Kukjin Kim <kgene.kim@samsung.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
  W:    http://www.fluff.org/ben/linux/
  S:    Maintained
  F:    arch/arm/plat-samsung/
  F:    arch/arm/plat-s3c24xx/
  F:    arch/arm/plat-s5p/
 +F:    arch/arm/mach-s3c24*/
 +F:    arch/arm/mach-s3c64xx/
  F:    drivers/*/*s3c2410*
  F:    drivers/*/*/*s3c2410*
 -
 -ARM/S3C2410 ARM ARCHITECTURE
 -M:    Ben Dooks <ben-linux@fluff.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -W:    http://www.fluff.org/ben/linux/
 -S:    Maintained
 -F:    arch/arm/mach-s3c2410/
 -
 -ARM/S3C244x ARM ARCHITECTURE
 -M:    Ben Dooks <ben-linux@fluff.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -W:    http://www.fluff.org/ben/linux/
 -S:    Maintained
 -F:    arch/arm/mach-s3c2440/
 -F:    arch/arm/mach-s3c2443/
 -
 -ARM/S3C64xx ARM ARCHITECTURE
 -M:    Ben Dooks <ben-linux@fluff.org>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -W:    http://www.fluff.org/ben/linux/
 -S:    Maintained
 -F:    arch/arm/mach-s3c64xx/
 +F:    drivers/spi/spi-s3c*
 +F:    sound/soc/samsung/*
  
  ARM/S5P EXYNOS ARM ARCHITECTURES
  M:    Kukjin Kim <kgene.kim@samsung.com>
@@@ -1076,8 -1091,8 +1077,8 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    arch/arm/mach-s5pv210/mach-aquila.c
  F:    arch/arm/mach-s5pv210/mach-goni.c
 -F:    arch/arm/mach-exynos4/mach-universal_c210.c
 -F:    arch/arm/mach-exynos4/mach-nuri.c
 +F:    arch/arm/mach-exynos/mach-universal_c210.c
 +F:    arch/arm/mach-exynos/mach-nuri.c
  
  ARM/SAMSUNG S5P SERIES FIMC SUPPORT
  M:    Kyungmin Park <kyungmin.park@samsung.com>
@@@ -1092,7 -1107,6 +1093,7 @@@ F:      drivers/media/video/s5p-fimc
  ARM/SAMSUNG S5P SERIES Multi Format Codec (MFC) SUPPORT
  M:    Kyungmin Park <kyungmin.park@samsung.com>
  M:    Kamil Debski <k.debski@samsung.com>
 +M:     Jeongtae Park <jtp.park@samsung.com>
  L:    linux-arm-kernel@lists.infradead.org
  L:    linux-media@vger.kernel.org
  S:    Maintained
@@@ -1105,6 -1119,7 +1106,6 @@@ M:      Tomasz Stanislawski <t.stanislaws@sa
  L:    linux-arm-kernel@lists.infradead.org
  L:    linux-media@vger.kernel.org
  S:    Maintained
 -F:    arch/arm/plat-s5p/dev-tv.c
  F:    drivers/media/video/s5p-tv/
  
  ARM/SHMOBILE ARM ARCHITECTURE
@@@ -1118,6 -1133,13 +1119,6 @@@ S:     Supporte
  F:    arch/arm/mach-shmobile/
  F:    drivers/sh/
  
 -ARM/TELECHIPS ARM ARCHITECTURE
 -M:    "Hans J. Koch" <hjk@hansjkoch.de>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/plat-tcc/
 -F:    arch/arm/mach-tcc8k/
 -
  ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1139,13 -1161,14 +1140,13 @@@ L:   linux-arm-kernel@lists.infradead.or
  W:    http://www.mcuos.com
  S:    Maintained
  F:    arch/arm/mach-w90x900/
 -F:    arch/arm/mach-nuc93x/
  F:    drivers/input/keyboard/w90p910_keypad.c
  F:    drivers/input/touchscreen/w90p910_ts.c
  F:    drivers/watchdog/nuc900_wdt.c
  F:    drivers/net/ethernet/nuvoton/w90p910_ether.c
  F:    drivers/mtd/nand/nuc900_nand.c
  F:    drivers/rtc/rtc-nuc900.c
 -F:    drivers/spi/spi_nuc900.c
 +F:    drivers/spi/spi-nuc900.c
  F:    drivers/usb/host/ehci-w90x900.c
  F:    drivers/video/nuc900fb.c
  
@@@ -1170,6 -1193,7 +1171,6 @@@ L:      linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    arch/arm/mach-ux500/
  F:    drivers/dma/ste_dma40*
 -F:    drivers/mfd/ab3550*
  F:    drivers/mfd/abx500*
  F:    drivers/mfd/ab8500*
  F:    drivers/mfd/stmpe*
@@@ -1349,7 -1373,7 +1350,7 @@@ F:      drivers/net/ethernet/cadence
  ATMEL SPI DRIVER
  M:    Nicolas Ferre <nicolas.ferre@atmel.com>
  S:    Supported
 -F:    drivers/spi/atmel_spi.*
 +F:    drivers/spi/spi-atmel.*
  
  ATMEL USBA UDC DRIVER
  M:    Nicolas Ferre <nicolas.ferre@atmel.com>
@@@ -1488,7 -1512,7 +1489,7 @@@ M:      Sonic Zhang <sonic.zhang@analog.com
  L:    uclinux-dist-devel@blackfin.uclinux.org
  W:    http://blackfin.uclinux.org
  S:    Supported
 -F:    drivers/tty/serial/bfin_5xx.c
 +F:    drivers/tty/serial/bfin_uart.c
  
  BLACKFIN WATCHDOG DRIVER
  M:    Mike Frysinger <vapier.adi@gmail.com>
@@@ -1579,7 -1603,7 +1580,7 @@@ M:      Franky (Zhenhui) Lin <frankyl@broadc
  M:    Kan Yan <kanyan@broadcom.com>
  L:    linux-wireless@vger.kernel.org
  S:    Supported
 -F:    drivers/staging/brcm80211/
 +F:    drivers/net/wireless/brcm80211/
  
  BROADCOM BNX2FC 10 GIGABIT FCOE DRIVER
  M:    Bhanu Prakash Gollapudi <bprakash@broadcom.com>
@@@ -1618,7 -1642,7 +1619,7 @@@ BT8XXGPIO DRIVE
  M:    Michael Buesch <m@bues.ch>
  W:    http://bu3sch.de/btgpio.php
  S:    Maintained
 -F:    drivers/gpio/bt8xxgpio.c
 +F:    drivers/gpio/gpio-bt8xx.c
  
  BTRFS FILE SYSTEM
  M:    Chris Mason <chris.mason@oracle.com>
@@@ -1646,14 -1670,6 +1647,14 @@@ T:    git git://git.alsa-project.org/alsa-
  S:    Maintained
  F:    sound/pci/oxygen/
  
 +C6X ARCHITECTURE
 +M:    Mark Salter <msalter@redhat.com>
 +M:    Aurelien Jacquiot <a-jacquiot@ti.com>
 +L:    linux-c6x-dev@linux-c6x.org
 +W:    http://www.linux-c6x.org/wiki/index.php/Main_Page
 +S:    Maintained
 +F:    arch/c6x/
 +
  CACHEFILES: FS-CACHE BACKEND FOR CACHING ON MOUNTED FILESYSTEMS
  M:    David Howells <dhowells@redhat.com>
  L:    linux-cachefs@redhat.com
@@@ -1667,7 -1683,7 +1668,7 @@@ L:      linux-media@vger.kernel.or
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
  S:    Maintained
  F:    Documentation/video4linux/cafe_ccic
 -F:    drivers/media/video/cafe_ccic*
 +F:    drivers/media/video/marvell-ccic/
  
  CAIF NETWORK LAYER
  M:    Sjur Braendeland <sjur.brandeland@stericsson.com>
@@@ -1691,9 -1707,11 +1692,9 @@@ F:     arch/x86/include/asm/tce.
  
  CAN NETWORK LAYER
  M:    Oliver Hartkopp <socketcan@hartkopp.net>
 -M:    Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
 -M:    Urs Thuermann <urs.thuermann@volkswagen.de>
  L:    linux-can@vger.kernel.org
 -L:    netdev@vger.kernel.org
 -W:    http://developer.berlios.de/projects/socketcan/
 +W:    http://gitorious.org/linux-can
 +T:    git git://gitorious.org/linux-can/linux-can-next.git
  S:    Maintained
  F:    net/can/
  F:    include/linux/can.h
@@@ -1704,10 -1722,9 +1705,10 @@@ F:    include/linux/can/gw.
  
  CAN NETWORK DRIVERS
  M:    Wolfgang Grandegger <wg@grandegger.com>
 +M:    Marc Kleine-Budde <mkl@pengutronix.de>
  L:    linux-can@vger.kernel.org
 -L:    netdev@vger.kernel.org
 -W:    http://developer.berlios.de/projects/socketcan/
 +W:    http://gitorious.org/linux-can
 +T:    git git://gitorious.org/linux-can/linux-can-next.git
  S:    Maintained
  F:    drivers/net/can/
  F:    include/linux/can/dev.h
@@@ -1772,14 -1789,6 +1773,14 @@@ F:    include/net/cfg80211.
  F:    net/wireless/*
  X:    net/wireless/wext*
  
 +CHAR and MISC DRIVERS
 +M:    Arnd Bergmann <arnd@arndb.de>
 +M:    Greg Kroah-Hartman <greg@kroah.com>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
 +S:    Maintained
 +F:    drivers/char/*
 +F:    drivers/misc/*
 +
  CHECKPATCH
  M:    Andy Whitcroft <apw@canonical.com>
  S:    Supported
@@@ -1891,6 -1900,12 +1892,6 @@@ L:     platform-driver-x86@vger.kernel.or
  S:    Maintained
  F:    drivers/platform/x86/compal-laptop.c
  
 -COMPUTONE INTELLIPORT MULTIPORT CARD
 -W:    http://www.wittsend.com/computone.html
 -S:    Orphan
 -F:    Documentation/serial/computone.txt
 -F:    drivers/staging/tty/ip2/
 -
  CONEXANT ACCESSRUNNER USB DRIVER
  M:    Simon Arlott <cxacru@fire.lp0.eu>
  L:    accessrunner-general@lists.sourceforge.net
@@@ -1912,11 -1927,9 +1913,11 @@@ S:    Maintaine
  F:    drivers/connector/
  
  CONTROL GROUPS (CGROUPS)
 -M:    Paul Menage <paul@paulmenage.org>
 +M:    Tejun Heo <tj@kernel.org>
  M:    Li Zefan <lizf@cn.fujitsu.com>
  L:    containers@lists.linux-foundation.org
 +L:    cgroups@vger.kernel.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git
  S:    Maintained
  F:    include/linux/cgroup*
  F:    kernel/cgroup*
@@@ -2105,7 -2118,7 +2106,7 @@@ DAVICOM FAST ETHERNET (DMFE) NETWORK DR
  L:    netdev@vger.kernel.org
  S:    Orphan
  F:    Documentation/networking/dmfe.txt
 -F:    drivers/net/ethernet/tulip/dmfe.c
 +F:    drivers/net/ethernet/dec/tulip/dmfe.c
  
  DC390/AM53C974 SCSI driver
  M:    Kurt Garloff <garloff@suse.de>
@@@ -2178,13 -2191,6 +2179,13 @@@ T:    git git://git.kernel.org/pub/scm/lin
  S:    Maintained
  F:    drivers/usb/dwc3/
  
 +DEVICE FREQUENCY (DEVFREQ)
 +M:    MyungJoo Ham <myungjoo.ham@samsung.com>
 +M:    Kyungmin Park <kyungmin.park@samsung.com>
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +F:    drivers/devfreq/
 +
  DEVICE NUMBER REGISTRY
  M:    Torben Mathiasen <device@lanana.org>
  W:    http://lanana.org/docs/device-list/index.html
@@@ -2201,6 -2207,15 +2202,6 @@@ F:     drivers/md/dm
  F:    include/linux/device-mapper.h
  F:    include/linux/dm-*.h
  
 -DIGI INTL. EPCA DRIVER
 -M:    "Digi International, Inc" <Eng.Linux@digi.com>
 -L:    Eng.Linux@digi.com
 -W:    http://www.digi.com
 -S:    Orphan
 -F:    Documentation/serial/digiepca.txt
 -F:    drivers/staging/tty/epca*
 -F:    drivers/staging/tty/digi*
 -
  DIOLAN U2C-12 I2C DRIVER
  M:    Guenter Roeck <guenter.roeck@ericsson.com>
  L:    linux-i2c@vger.kernel.org
@@@ -2328,13 -2343,6 +2329,13 @@@ S:    Supporte
  F:    drivers/gpu/drm/i915
  F:    include/drm/i915*
  
 +DRM DRIVERS FOR EXYNOS
 +M:    Inki Dae <inki.dae@samsung.com>
 +L:    dri-devel@lists.freedesktop.org
 +S:    Supported
 +F:    drivers/gpu/drm/exynos
 +F:    include/drm/exynos*
 +
  DSCC4 DRIVER
  M:    Francois Romieu <romieu@fr.zoreil.com>
  L:    netdev@vger.kernel.org
@@@ -2569,7 -2577,7 +2570,7 @@@ S:      Maintaine
  F:    drivers/net/ethernet/i825xx/eexpress.*
  
  ETHERNET BRIDGE
 -M:    Stephen Hemminger <shemminger@linux-foundation.org>
 +M:    Stephen Hemminger <shemminger@vyatta.com>
  L:    bridge@lists.linux-foundation.org
  L:    netdev@vger.kernel.org
  W:    http://www.linuxfoundation.org/en/Net:Bridge
@@@ -2684,7 -2692,7 +2685,7 @@@ FIREWIRE SUBSYSTE
  M:    Stefan Richter <stefanr@s5r6.in-berlin.de>
  L:    linux1394-devel@lists.sourceforge.net
  W:    http://ieee1394.wiki.kernel.org/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394.git
  S:    Maintained
  F:    drivers/firewire/
  F:    include/linux/firewire*.h
@@@ -2821,14 -2829,6 +2822,14 @@@ L:    platform-driver-x86@vger.kernel.or
  S:    Maintained
  F:    drivers/platform/x86/fujitsu-laptop.c
  
 +FUJITSU M-5MO LS CAMERA ISP DRIVER
 +M:    Kyungmin Park <kyungmin.park@samsung.com>
 +M:    Heungjun Kim <riverful.kim@samsung.com>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    drivers/media/video/m5mols/
 +F:    include/media/m5mols.h
 +
  FUSE: FILESYSTEM IN USERSPACE
  M:    Miklos Szeredi <miklos@szeredi.hu>
  L:    fuse-devel@lists.sourceforge.net
@@@ -2912,7 -2912,6 +2913,7 @@@ F:      include/linux/gigaset_dev.
  
  GPIO SUBSYSTEM
  M:    Grant Likely <grant.likely@secretlab.ca>
 +M:    Linus Walleij <linus.walleij@stericsson.com>
  S:    Maintained
  T:    git git://git.secretlab.ca/git/linux-2.6.git
  F:    Documentation/gpio.txt
@@@ -2930,7 -2929,7 +2931,7 @@@ GRETH 10/100/1G Ethernet MAC device dri
  M:    Kristoffer Glembo <kristoffer@gaisler.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/greth*
 +F:    drivers/net/ethernet/aeroflex/
  
  GSPCA FINEPIX SUBDRIVER
  M:    Frank Zago <frank@zago.net>
@@@ -3094,7 -3093,6 +3095,7 @@@ F:      include/linux/hid
  
  HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS
  M:    Thomas Gleixner <tglx@linutronix.de>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
  S:    Maintained
  F:    Documentation/timers/
  F:    kernel/hrtimer.c
@@@ -3182,16 -3180,6 +3183,16 @@@ M:    William Irwin <wli@holomorphy.com
  S:    Maintained
  F:    fs/hugetlbfs/
  
 +Hyper-V CORE AND DRIVERS
 +M:    K. Y. Srinivasan <kys@microsoft.com>
 +M:    Haiyang Zhang <haiyangz@microsoft.com>
 +L:    devel@linuxdriverproject.org
 +S:    Maintained
 +F:    drivers/hv/
 +F:    drivers/hid/hid-hyperv.c
 +F:    drivers/net/hyperv/
 +F:    drivers/staging/hv/
 +
  I2C/SMBUS STUB DRIVER
  M:    "Mark M. Hoffman" <mhoffman@lightlink.com>
  L:    linux-i2c@vger.kernel.org
@@@ -3201,7 -3189,6 +3202,7 @@@ F:      drivers/i2c/busses/i2c-stub.
  I2C SUBSYSTEM
  M:    "Jean Delvare (PC drivers, core)" <khali@linux-fr.org>
  M:    "Ben Dooks (embedded platforms)" <ben-linux@fluff.org>
 +M:    "Wolfram Sang (embedded platforms)" <w.sang@pengutronix.de>
  L:    linux-i2c@vger.kernel.org
  W:    http://i2c.wiki.kernel.org/
  T:    quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/
@@@ -3588,7 -3575,8 +3589,7 @@@ F:      net/netfilter/ipvs
  IPWIRELESS DRIVER
  M:    Jiri Kosina <jkosina@suse.cz>
  M:    David Sterba <dsterba@suse.cz>
 -S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/ipwireless_cs.git
 +S:    Odd Fixes
  F:    drivers/tty/ipwireless/
  
  IPX NETWORK LAYER
@@@ -3614,7 -3602,7 +3615,7 @@@ F:      net/irda
  IRQ SUBSYSTEM
  M:    Thomas Gleixner <tglx@linutronix.de>
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git irq/core
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
  F:    kernel/irq/
  
  ISAPNP
@@@ -3723,7 -3711,7 +3724,7 @@@ F:      fs/jbd2
  F:    include/linux/jbd2.h
  
  JSM Neo PCI based serial card
 -M:    Breno Leitao <leitao@linux.vnet.ibm.com>
 +M:    Lucas Tavares <lucaskt@linux.vnet.ibm.com>
  L:    linux-serial@vger.kernel.org
  S:    Maintained
  F:    drivers/tty/serial/jsm/
@@@ -3783,6 -3771,7 +3784,6 @@@ S:      Odd Fixe
  
  KERNEL NFSD, SUNRPC, AND LOCKD SERVERS
  M:    "J. Bruce Fields" <bfields@fieldses.org>
 -M:    Neil Brown <neilb@suse.de>
  L:    linux-nfs@vger.kernel.org
  W:    http://nfs.sourceforge.net/
  S:    Supported
@@@ -3880,7 -3869,8 +3881,7 @@@ L:      keyrings@linux-nfs.or
  S:    Supported
  F:    Documentation/security/keys-trusted-encrypted.txt
  F:    include/keys/encrypted-type.h
 -F:    security/keys/encrypted.c
 -F:    security/keys/encrypted.h
 +F:    security/keys/encrypted-keys/
  
  KGDB / KDB /debug_core
  M:    Jason Wessel <jason.wessel@windriver.com>
@@@ -4013,7 -4003,7 +4014,7 @@@ M:      Josh Boyer <jwboyer@gmail.com
  M:    Matt Porter <mporter@kernel.crashing.org>
  W:    http://www.penguinppc.org/
  L:    linuxppc-dev@lists.ozlabs.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jwboyer/powerpc-4xx.git
 +T:    git git://git.infradead.org/users/jwboyer/powerpc-4xx.git
  S:    Maintained
  F:    arch/powerpc/platforms/40x/
  F:    arch/powerpc/platforms/44x/
@@@ -4100,7 -4090,7 +4101,7 @@@ F:      drivers/hwmon/lm90.
  LOCKDEP AND LOCKSTAT
  M:    Peter Zijlstra <peterz@infradead.org>
  M:    Ingo Molnar <mingo@redhat.com>
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/peterz/linux-2.6-lockdep.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core/locking
  S:    Maintained
  F:    Documentation/lockdep*.txt
  F:    Documentation/lockstat.txt
@@@ -4282,9 -4272,7 +4283,9 @@@ T:      git git://git.kernel.org/pub/scm/lin
  S:    Maintained
  F:    Documentation/dvb/
  F:    Documentation/video4linux/
 +F:    Documentation/DocBook/media/
  F:    drivers/media/
 +F:    drivers/staging/media/
  F:    include/media/
  F:    include/linux/dvb/
  F:    include/linux/videodev*.h
@@@ -4306,11 -4294,9 +4307,11 @@@ F:    include/linux/mm.
  F:    mm/
  
  MEMORY RESOURCE CONTROLLER
 +M:    Johannes Weiner <hannes@cmpxchg.org>
 +M:    Michal Hocko <mhocko@suse.cz>
  M:    Balbir Singh <bsingharora@gmail.com>
 -M:    Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
  M:    KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
 +L:    cgroups@vger.kernel.org
  L:    linux-mm@kvack.org
  S:    Maintained
  F:    mm/memcontrol.c
@@@ -4344,7 -4330,7 +4345,7 @@@ MIP
  M:    Ralf Baechle <ralf@linux-mips.org>
  L:    linux-mips@linux-mips.org
  W:    http://www.linux-mips.org/
 -T:    git git://git.linux-mips.org/pub/scm/linux.git
 +T:    git git://git.linux-mips.org/pub/scm/ralf/linux.git
  Q:    http://patchwork.linux-mips.org/project/linux-mips/list/
  S:    Supported
  F:    Documentation/mips/
@@@ -4477,7 -4463,7 +4478,7 @@@ S:      Supporte
  F:    drivers/infiniband/hw/nes/
  
  NETEM NETWORK EMULATOR
 -M:    Stephen Hemminger <shemminger@linux-foundation.org>
 +M:    Stephen Hemminger <shemminger@vyatta.com>
  L:    netem@lists.linux-foundation.org
  S:    Maintained
  F:    net/sched/sch_netem.c
@@@ -4691,8 -4677,6 +4692,8 @@@ Q:      http://patchwork.kernel.org/project/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
  S:    Maintained
  F:    arch/arm/*omap*/
 +F:    drivers/i2c/busses/i2c-omap.c
 +F:    include/linux/i2c-omap.h
  
  OMAP CLOCK FRAMEWORK SUPPORT
  M:    Paul Walmsley <paul@pwsan.com>
@@@ -4858,14 -4842,6 +4859,14 @@@ S:    Maintaine
  T:    git git://openrisc.net/~jonas/linux
  F:    arch/openrisc
  
 +OPENVSWITCH
 +M:    Jesse Gross <jesse@nicira.com>
 +L:    dev@openvswitch.org
 +W:    http://openvswitch.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch.git
 +S:    Maintained
 +F:    net/openvswitch/
 +
  OPL4 DRIVER
  M:    Clemens Ladisch <clemens@ladisch.de>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
@@@ -4964,7 -4940,7 +4965,7 @@@ F:      drivers/char/ppdev.
  F:    include/linux/ppdev.h
  
  PARAVIRT_OPS INTERFACE
 -M:    Jeremy Fitzhardinge <jeremy@xensource.com>
 +M:    Jeremy Fitzhardinge <jeremy@goop.org>
  M:    Chris Wright <chrisw@sous-sol.org>
  M:    Alok Kataria <akataria@vmware.com>
  M:    Rusty Russell <rusty@rustcorp.com.au>
@@@ -5100,7 -5076,6 +5101,7 @@@ M:      Peter Zijlstra <a.p.zijlstra@chello.
  M:    Paul Mackerras <paulus@samba.org>
  M:    Ingo Molnar <mingo@elte.hu>
  M:    Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
  S:    Supported
  F:    kernel/events/*
  F:    include/linux/perf_event.h
@@@ -5132,19 -5107,10 +5133,19 @@@ L:   linux-mtd@lists.infradead.or
  S:    Maintained
  F:    drivers/mtd/devices/phram.c
  
 +PICOXCELL SUPPORT
 +M:    Jamie Iles <jamie@jamieiles.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +T:    git git://github.com/jamieiles/linux-2.6-ji.git
 +S:    Supported
 +F:    arch/arm/mach-picoxcell
 +F:    drivers/*/picoxcell*
 +F:    drivers/*/*/picoxcell*
 +
  PIN CONTROL SUBSYSTEM
  M:    Linus Walleij <linus.walleij@linaro.org>
  S:    Maintained
 -F:    drivers/pinmux/
 +F:    drivers/pinctrl/
  
  PKTCDVD DRIVER
  M:    Peter Osterlund <petero2@telia.com>
@@@ -5189,7 -5155,6 +5190,7 @@@ F:      drivers/scsi/pm8001
  
  POSIX CLOCKS and TIMERS
  M:    Thomas Gleixner <tglx@linutronix.de>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
  S:    Supported
  F:    fs/timerfd.c
  F:    include/linux/timer*
@@@ -5327,27 -5292,35 +5328,27 @@@ F:   drivers/media/video/pvrusb2
  PXA2xx/PXA3xx SUPPORT
  M:    Eric Miao <eric.y.miao@gmail.com>
  M:    Russell King <linux@arm.linux.org.uk>
 +M:    Haojian Zhuang <haojian.zhuang@marvell.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +T:    git git://github.com/hzhuang1/linux.git
 +T:    git git://git.linaro.org/people/ycmiao/pxa-linux.git
  S:    Maintained
  F:    arch/arm/mach-pxa/
  F:    drivers/pcmcia/pxa2xx*
 -F:    drivers/spi/pxa2xx*
 +F:    drivers/spi/spi-pxa2xx*
  F:    drivers/usb/gadget/pxa2*
  F:    include/sound/pxa2xx-lib.h
  F:    sound/arm/pxa*
  F:    sound/soc/pxa
  
 -PXA168 SUPPORT
 -M:    Eric Miao <eric.y.miao@gmail.com>
 -M:    Jason Chagas <jason.chagas@marvell.com>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git
 -S:    Maintained
 -
 -PXA910 SUPPORT
 +MMP SUPPORT
  M:    Eric Miao <eric.y.miao@gmail.com>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git
 -S:    Maintained
 -
 -MMP2 SUPPORT (aka ARMADA610)
  M:    Haojian Zhuang <haojian.zhuang@marvell.com>
 -M:    Eric Miao <eric.y.miao@gmail.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6.git
 +T:    git git://github.com/hzhuang1/linux.git
 +T:    git git://git.linaro.org/people/ycmiao/pxa-linux.git
  S:    Maintained
 +F:    arch/arm/mach-mmp/
  
  PXA MMCI DRIVER
  S:    Orphan
@@@ -5386,7 -5359,6 +5387,7 @@@ S:      Supporte
  F:    drivers/scsi/qla4xxx/
  
  QLOGIC QLA3XXX NETWORK 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
@@@ -5557,6 -5529,11 +5558,6 @@@ M:     Maxim Levitsky <maximlevitsky@gmail.
  S:    Maintained
  F:    drivers/memstick/host/r592.*
  
 -RISCOM8 DRIVER
 -S:    Orphan
 -F:    Documentation/serial/riscom8.txt
 -F:    drivers/staging/tty/riscom8*
 -
  ROCKETPORT DRIVER
  P:    Comtrol Corp.
  W:    http://www.comtrol.com
@@@ -5672,17 -5649,12 +5673,17 @@@ F:   drivers/media/video/*7146
  F:    include/media/*7146*
  
  SAMSUNG AUDIO (ASoC) DRIVERS
 -M:    Jassi Brar <jassisinghbrar@gmail.com>
  M:    Sangbeom Kim <sbkim73@samsung.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  S:    Supported
  F:    sound/soc/samsung
  
 +SAMSUNG FRAMEBUFFER DRIVER
 +M:    Jingoo Han <jg1.han@samsung.com>
 +L:    linux-fbdev@vger.kernel.org
 +S:    Maintained
 +F:    drivers/video/s3c-fb.c
 +
  SERIAL DRIVERS
  M:    Alan Cox <alan@linux.intel.com>
  L:    linux-serial@vger.kernel.org
@@@ -5699,7 -5671,6 +5700,7 @@@ F:      drivers/dma/dw_dmac.
  TIMEKEEPING, NTP
  M:    John Stultz <johnstul@us.ibm.com>
  M:    Thomas Gleixner <tglx@linutronix.de>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
  S:    Supported
  F:    include/linux/clocksource.h
  F:    include/linux/time.h
@@@ -5724,7 -5695,6 +5725,7 @@@ F:      drivers/watchdog/sc1200wdt.
  SCHEDULER
  M:    Ingo Molnar <mingo@elte.hu>
  M:    Peter Zijlstra <peterz@infradead.org>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core
  S:    Maintained
  F:    kernel/sched*
  F:    include/linux/sched.h
@@@ -5822,14 -5792,13 +5823,14 @@@ L:   linux-mmc@vger.kernel.or
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc.git
  S:    Maintained
  F:    drivers/mmc/host/sdhci.*
 +F:    drivers/mmc/host/sdhci-pltfm.[ch]
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE, OPEN FIRMWARE BINDINGS (SDHCI-OF)
  M:    Anton Vorontsov <avorontsov@ru.mvista.com>
  L:    linuxppc-dev@lists.ozlabs.org
  L:    linux-mmc@vger.kernel.org
  S:    Maintained
 -F:    drivers/mmc/host/sdhci-of.*
 +F:    drivers/mmc/host/sdhci-pltfm.[ch]
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) SAMSUNG DRIVER
  M:    Ben Dooks <ben-linux@fluff.org>
@@@ -5846,7 -5815,7 +5847,7 @@@ F:      drivers/mmc/host/sdhci-spear.
  SECURITY SUBSYSTEM
  M:    James Morris <jmorris@namei.org>
  L:    linux-security-module@vger.kernel.org (suggested Cc:)
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security.git
  W:    http://security.wiki.kernel.org/
  S:    Supported
  F:    security/
@@@ -5908,6 -5877,7 +5909,6 @@@ F:      drivers/net/ethernet/emulex/benet
  
  SFC NETWORK DRIVER
  M:    Solarflare linux maintainers <linux-net-drivers@solarflare.com>
 -M:    Steve Hodgson <shodgson@solarflare.com>
  M:    Ben Hutchings <bhutchings@solarflare.com>
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -5972,7 -5942,6 +5973,7 @@@ L:      davinci-linux-open-source@linux.davi
  Q:    http://patchwork.kernel.org/project/linux-davinci/list/
  S:    Supported
  F:    arch/arm/mach-davinci
 +F:    drivers/i2c/busses/i2c-davinci.c
  
  SIS 190 ETHERNET DRIVER
  M:    Francois Romieu <romieu@fr.zoreil.com>
@@@ -6009,7 -5978,7 +6010,7 @@@ S:      Maintaine
  F:    drivers/usb/misc/sisusbvga/
  
  SKGE, SKY2 10/100/1000 GIGABIT ETHERNET DRIVERS
 -M:    Stephen Hemminger <shemminger@linux-foundation.org>
 +M:    Stephen Hemminger <shemminger@vyatta.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/ethernet/marvell/sk*
@@@ -6154,7 -6123,7 +6155,7 @@@ F:      sound
  SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
  M:    Liam Girdwood <lrg@ti.com>
  M:    Mark Brown <broonie@opensource.wolfsonmicro.com>
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound-2.6.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  W:    http://alsa-project.org/main/index.php/ASoC
  S:    Supported
@@@ -6209,7 -6178,9 +6210,7 @@@ M:      Viresh Kumar <viresh.kumar@st.com
  W:    http://www.st.com/spear
  S:    Maintained
  F:    arch/arm/mach-spear*/clock.c
 -F:    arch/arm/mach-spear*/include/mach/clkdev.h
  F:    arch/arm/plat-spear/clock.c
 -F:    arch/arm/plat-spear/include/plat/clkdev.h
  F:    arch/arm/plat-spear/include/plat/clock.h
  
  SPEAR PAD MULTIPLEXING SUPPORT
@@@ -6225,6 -6196,11 +6226,6 @@@ F:     arch/arm/mach-spear3xx/spear3*0_evb.
  F:    arch/arm/mach-spear6xx/spear600.c
  F:    arch/arm/mach-spear6xx/spear600_evb.c
  
 -SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
 -S:    Orphan
 -F:    Documentation/serial/specialix.txt
 -F:    drivers/staging/tty/specialix*
 -
  SPI SUBSYSTEM
  M:    Grant Likely <grant.likely@secretlab.ca>
  L:    spi-devel-general@lists.sourceforge.net
@@@ -6267,7 -6243,7 +6268,7 @@@ F:      arch/alpha/kernel/srm_env.
  
  STABLE BRANCH
  M:    Greg Kroah-Hartman <greg@kroah.com>
 -L:    stable@kernel.org
 +L:    stable@vger.kernel.org
  S:    Maintained
  
  STAGING SUBSYSTEM
@@@ -6302,6 -6278,11 +6303,6 @@@ M:     Manu Abraham <abraham.manu@gmail.com
  S:    Odd Fixes
  F:    drivers/staging/crystalhd/
  
 -STAGING - CYPRESS WESTBRIDGE SUPPORT
 -M:    David Cross <david.cross@cypress.com>
 -S:    Odd Fixes
 -F:    drivers/staging/westbridge/
 -
  STAGING - ECHO CANCELLER
  M:    Steve Underwood <steveu@coppice.org>
  M:    David Rowe <david@rowetel.com>
@@@ -6323,6 -6304,12 +6324,6 @@@ M:     David Täht <d@teklibre.com
  S:    Odd Fixes
  F:    drivers/staging/frontier/
  
 -STAGING - HYPER-V (MICROSOFT)
 -M:    Hank Janssen <hjanssen@microsoft.com>
 -M:    Haiyang Zhang <haiyangz@microsoft.com>
 -S:    Odd Fixes
 -F:    drivers/staging/hv/
 -
  STAGING - INDUSTRIAL IO
  M:    Jonathan Cameron <jic23@cam.ac.uk>
  L:    linux-iio@vger.kernel.org
@@@ -6333,7 -6320,7 +6334,7 @@@ STAGING - LIRC (LINUX INFRARED REMOTE C
  M:    Jarod Wilson <jarod@wilsonet.com>
  W:    http://www.lirc.org/
  S:    Odd Fixes
 -F:    drivers/staging/lirc/
 +F:    drivers/staging/media/lirc/
  
  STAGING - NVIDIA COMPLIANT EMBEDDED CONTROLLER INTERFACE (nvec)
  M:    Julian Andres Klode <jak@jak-linux.org>
@@@ -6369,7 -6356,7 +6370,7 @@@ F:      drivers/staging/sm7xx
  STAGING - SOFTLOGIC 6x10 MPEG CODEC
  M:    Ben Collins <bcollins@bluecherry.net>
  S:    Odd Fixes
 -F:    drivers/staging/solo6x10/
 +F:    drivers/staging/media/solo6x10/
  
  STAGING - SPEAKUP CONSOLE SPEECH DRIVER
  M:    William Hubbs <w.d.hubbs@gmail.com>
@@@ -6407,7 -6394,7 +6408,7 @@@ S:      Odd Fixe
  F:    drivers/staging/winbond/
  
  STAGING - XGI Z7,Z9,Z11 PCI DISPLAY DRIVER
 -M:    Arnaud Patard <apatard@mandriva.com>
 +M:    Arnaud Patard <arnaud.patard@rtp-net.org>
  S:    Odd Fixes
  F:    drivers/staging/xgifb/
  
@@@ -6498,13 -6485,6 +6499,13 @@@ W:    http://tcp-lp-mod.sourceforge.net
  S:    Maintained
  F:    net/ipv4/tcp_lp.c
  
 +TEAM DRIVER
 +M:    Jiri Pirko <jpirko@redhat.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    drivers/net/team/
 +F:    include/linux/if_team.h
 +
  TEGRA SUPPORT
  M:    Colin Cross <ccross@android.com>
  M:    Olof Johansson <olof@lixom.net>
@@@ -6642,7 -6622,7 +6643,7 @@@ TRACIN
  M:    Steven Rostedt <rostedt@goodmis.org>
  M:    Frederic Weisbecker <fweisbec@gmail.com>
  M:    Ingo Molnar <mingo@redhat.com>
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git perf/core
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
  S:    Maintained
  F:    Documentation/trace/ftrace.txt
  F:    arch/*/*/*/ftrace.h
@@@ -6672,7 -6652,7 +6673,7 @@@ TULIP NETWORK DRIVER
  M:    Grant Grundler <grundler@parisc-linux.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/ethernet/tulip/
 +F:    drivers/net/ethernet/dec/tulip/
  
  TUN/TAP driver
  M:    Maxim Krasnyansky <maxk@qualcomm.com>
@@@ -7392,7 -7372,7 +7393,7 @@@ M:      Thomas Gleixner <tglx@linutronix.de
  M:    Ingo Molnar <mingo@redhat.com>
  M:    "H. Peter Anvin" <hpa@zytor.com>
  M:    x86@kernel.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core
  S:    Maintained
  F:    Documentation/x86/
  F:    arch/x86/
@@@ -7412,8 -7392,8 +7413,8 @@@ S:      Maintaine
  F:    arch/x86/kernel/cpu/mcheck/*
  
  XEN HYPERVISOR INTERFACE
 -M:    Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
  M:    Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
 +M:    Jeremy Fitzhardinge <jeremy@goop.org>
  L:    xen-devel@lists.xensource.com (moderated for non-subscribers)
  L:    virtualization@lists.linux-foundation.org
  S:    Supported
@@@ -7446,8 -7426,7 +7447,8 @@@ F:      drivers/xen/*swiotlb
  
  XFS FILESYSTEM
  P:    Silicon Graphics Inc
 -M:    Alex Elder <aelder@sgi.com>
 +M:    Ben Myers <bpm@sgi.com>
 +M:    Alex Elder <elder@kernel.org>
  M:    xfs-masters@oss.sgi.com
  L:    xfs@oss.sgi.com
  W:    http://oss.sgi.com/projects/xfs
index 1ea89be63e29e1d13e7783d0d7f2ff31f64057a9,83dc940a21b793a3194742e8943494ea0e692c04..6fcf304d3cdf53869f4d7b64d701e4d5e92345ce
@@@ -445,31 -445,39 +445,39 @@@ static const struct sh_dmae_slave_confi
        },
  };
  
+ #define SH7372_CHCLR 0x220
  static const struct sh_dmae_channel sh7372_dmae_channels[] = {
        {
                .offset = 0,
                .dmars = 0,
                .dmars_bit = 0,
+               .chclr_offset = SH7372_CHCLR + 0,
        }, {
                .offset = 0x10,
                .dmars = 0,
                .dmars_bit = 8,
+               .chclr_offset = SH7372_CHCLR + 0x10,
        }, {
                .offset = 0x20,
                .dmars = 4,
                .dmars_bit = 0,
+               .chclr_offset = SH7372_CHCLR + 0x20,
        }, {
                .offset = 0x30,
                .dmars = 4,
                .dmars_bit = 8,
+               .chclr_offset = SH7372_CHCLR + 0x30,
        }, {
                .offset = 0x50,
                .dmars = 8,
                .dmars_bit = 0,
+               .chclr_offset = SH7372_CHCLR + 0x50,
        }, {
                .offset = 0x60,
                .dmars = 8,
                .dmars_bit = 8,
+               .chclr_offset = SH7372_CHCLR + 0x60,
        }
  };
  
@@@ -487,6 -495,7 +495,7 @@@ static struct sh_dmae_pdata dma_platfor
        .ts_shift       = ts_shift,
        .ts_shift_num   = ARRAY_SIZE(ts_shift),
        .dmaor_init     = DMAOR_DME,
+       .chclr_present  = 1,
  };
  
  /* Resource order important! */
@@@ -494,7 -503,7 +503,7 @@@ static struct resource sh7372_dmae0_res
        {
                /* Channel registers and DMAOR */
                .start  = 0xfe008020,
-               .end    = 0xfe00808f,
+               .end    = 0xfe00828f,
                .flags  = IORESOURCE_MEM,
        },
        {
                .flags  = IORESOURCE_MEM,
        },
        {
 -              /* DMA error IRQ */
 +              .name   = "error_irq",
                .start  = evt2irq(0x20c0),
                .end    = evt2irq(0x20c0),
                .flags  = IORESOURCE_IRQ,
@@@ -522,7 -531,7 +531,7 @@@ static struct resource sh7372_dmae1_res
        {
                /* Channel registers and DMAOR */
                .start  = 0xfe018020,
-               .end    = 0xfe01808f,
+               .end    = 0xfe01828f,
                .flags  = IORESOURCE_MEM,
        },
        {
                .flags  = IORESOURCE_MEM,
        },
        {
 -              /* DMA error IRQ */
 +              .name   = "error_irq",
                .start  = evt2irq(0x21c0),
                .end    = evt2irq(0x21c0),
                .flags  = IORESOURCE_IRQ,
@@@ -550,7 -559,7 +559,7 @@@ static struct resource sh7372_dmae2_res
        {
                /* Channel registers and DMAOR */
                .start  = 0xfe028020,
-               .end    = 0xfe02808f,
+               .end    = 0xfe02828f,
                .flags  = IORESOURCE_MEM,
        },
        {
                .flags  = IORESOURCE_MEM,
        },
        {
 -              /* DMA error IRQ */
 +              .name   = "error_irq",
                .start  = evt2irq(0x22c0),
                .end    = evt2irq(0x22c0),
                .flags  = IORESOURCE_IRQ,
@@@ -994,16 -1003,12 +1003,16 @@@ void __init sh7372_add_standard_devices
        sh7372_init_pm_domain(&sh7372_a4r);
        sh7372_init_pm_domain(&sh7372_a3rv);
        sh7372_init_pm_domain(&sh7372_a3ri);
 -      sh7372_init_pm_domain(&sh7372_a3sg);
 +      sh7372_init_pm_domain(&sh7372_a4s);
        sh7372_init_pm_domain(&sh7372_a3sp);
 +      sh7372_init_pm_domain(&sh7372_a3sg);
  
        sh7372_pm_add_subdomain(&sh7372_a4lc, &sh7372_a3rv);
        sh7372_pm_add_subdomain(&sh7372_a4r, &sh7372_a4lc);
  
 +      sh7372_pm_add_subdomain(&sh7372_a4s, &sh7372_a3sg);
 +      sh7372_pm_add_subdomain(&sh7372_a4s, &sh7372_a3sp);
 +
        platform_add_devices(sh7372_early_devices,
                            ARRAY_SIZE(sh7372_early_devices));
  
index 2cded872f22b3debd634282a408d67169ceff981,1baa8ce824324e92c63258629378b500fbc5bf1a..0747c77a2fd53d0d2a66a1f1f2377b3d7e7722f6
  
  #include <mach/dma.h>
  
 -static inline bool pl330_filter(struct dma_chan *chan, void *param)
 -{
 -      struct dma_pl330_peri *peri = chan->private;
 -      return peri->peri_id == (unsigned)param;
 -}
 -
  static unsigned samsung_dmadev_request(enum dma_ch dma_ch,
                                struct samsung_dma_info *info)
  {
        struct dma_chan *chan;
        dma_cap_mask_t mask;
        struct dma_slave_config slave_config;
 +      void *filter_param;
  
        dma_cap_zero(mask);
        dma_cap_set(info->cap, mask);
  
 -      chan = dma_request_channel(mask, pl330_filter, (void *)dma_ch);
 +      /*
 +       * If a dma channel property of a device node from device tree is
 +       * specified, use that as the fliter parameter.
 +       */
 +      filter_param = (dma_ch == DMACH_DT_PROP) ? (void *)info->dt_dmach_prop :
 +                              (void *)dma_ch;
 +      chan = dma_request_channel(mask, pl330_filter, filter_param);
  
-       if (info->direction == DMA_FROM_DEVICE) {
+       if (info->direction == DMA_DEV_TO_MEM) {
                memset(&slave_config, 0, sizeof(struct dma_slave_config));
                slave_config.direction = info->direction;
                slave_config.src_addr = info->fifo;
                slave_config.src_addr_width = info->width;
                slave_config.src_maxburst = 1;
                dmaengine_slave_config(chan, &slave_config);
-       } else if (info->direction == DMA_TO_DEVICE) {
+       } else if (info->direction == DMA_MEM_TO_DEV) {
                memset(&slave_config, 0, sizeof(struct dma_slave_config));
                slave_config.direction = info->direction;
                slave_config.dst_addr = info->fifo;
index 22eafc310bd7858a8fb10b39087fc6064e78e04c,12561152fb972642a51059aa4354d7afc0524b4b..70b6325edb997630b488d5db6ca24d68d4c23002
@@@ -17,7 -17,7 +17,7 @@@
  
  struct samsung_dma_prep_info {
        enum dma_transaction_type cap;
-       enum dma_data_direction direction;
+       enum dma_transfer_direction direction;
        dma_addr_t buf;
        unsigned long period;
        unsigned long len;
  
  struct samsung_dma_info {
        enum dma_transaction_type cap;
-       enum dma_data_direction direction;
+       enum dma_transfer_direction direction;
        enum dma_slave_buswidth width;
        dma_addr_t fifo;
        struct s3c2410_dma_client *client;
 +      struct property *dt_dmach_prop;
  };
  
  struct samsung_dma_ops {
diff --combined drivers/dma/amba-pl08x.c
index 0698695e8bf9508e0c0dac5cdad44f7f8f508c07,9ebceca1753021da3024d832ebec86bbf616123d..8a281584458b582bbb872137323ff82cdaac2eb1
@@@ -854,8 -854,10 +854,10 @@@ static int prep_phy_channel(struct pl08
        int ret;
  
        /* Check if we already have a channel */
-       if (plchan->phychan)
-               return 0;
+       if (plchan->phychan) {
+               ch = plchan->phychan;
+               goto got_channel;
+       }
  
        ch = pl08x_get_phy_channel(pl08x, plchan);
        if (!ch) {
                        return -EBUSY;
                }
                ch->signal = ret;
-               /* Assign the flow control signal to this channel */
-               if (txd->direction == DMA_TO_DEVICE)
-                       txd->ccfg |= ch->signal << PL080_CONFIG_DST_SEL_SHIFT;
-               else if (txd->direction == DMA_FROM_DEVICE)
-                       txd->ccfg |= ch->signal << PL080_CONFIG_SRC_SEL_SHIFT;
        }
  
+       plchan->phychan = ch;
        dev_dbg(&pl08x->adev->dev, "allocated physical channel %d and signal %d for xfer on %s\n",
                 ch->id,
                 ch->signal,
                 plchan->name);
  
+ got_channel:
+       /* Assign the flow control signal to this channel */
+       if (txd->direction == DMA_MEM_TO_DEV)
+               txd->ccfg |= ch->signal << PL080_CONFIG_DST_SEL_SHIFT;
+       else if (txd->direction == DMA_DEV_TO_MEM)
+               txd->ccfg |= ch->signal << PL080_CONFIG_SRC_SEL_SHIFT;
        plchan->phychan_hold++;
-       plchan->phychan = ch;
  
        return 0;
  }
@@@ -1102,10 -1105,10 +1105,10 @@@ static int dma_set_runtime_config(struc
  
        /* Transfer direction */
        plchan->runtime_direction = config->direction;
-       if (config->direction == DMA_TO_DEVICE) {
+       if (config->direction == DMA_MEM_TO_DEV) {
                addr_width = config->dst_addr_width;
                maxburst = config->dst_maxburst;
-       } else if (config->direction == DMA_FROM_DEVICE) {
+       } else if (config->direction == DMA_DEV_TO_MEM) {
                addr_width = config->src_addr_width;
                maxburst = config->src_maxburst;
        } else {
        cctl |= burst << PL080_CONTROL_SB_SIZE_SHIFT;
        cctl |= burst << PL080_CONTROL_DB_SIZE_SHIFT;
  
-       if (plchan->runtime_direction == DMA_FROM_DEVICE) {
+       if (plchan->runtime_direction == DMA_DEV_TO_MEM) {
                plchan->src_addr = config->src_addr;
                plchan->src_cctl = pl08x_cctl(cctl) | PL080_CONTROL_DST_INCR |
                        pl08x_select_bus(plchan->cd->periph_buses,
                "configured channel %s (%s) for %s, data width %d, "
                "maxburst %d words, LE, CCTL=0x%08x\n",
                dma_chan_name(chan), plchan->name,
-               (config->direction == DMA_FROM_DEVICE) ? "RX" : "TX",
+               (config->direction == DMA_DEV_TO_MEM) ? "RX" : "TX",
                addr_width,
                maxburst,
                cctl);
@@@ -1322,7 -1325,7 +1325,7 @@@ static struct dma_async_tx_descriptor *
  
  static struct dma_async_tx_descriptor *pl08x_prep_slave_sg(
                struct dma_chan *chan, struct scatterlist *sgl,
-               unsigned int sg_len, enum dma_data_direction direction,
+               unsigned int sg_len, enum dma_transfer_direction direction,
                unsigned long flags)
  {
        struct pl08x_dma_chan *plchan = to_pl08x_chan(chan);
         */
        txd->direction = direction;
  
-       if (direction == DMA_TO_DEVICE) {
+       if (direction == DMA_MEM_TO_DEV) {
                txd->cctl = plchan->dst_cctl;
                slave_addr = plchan->dst_addr;
-       } else if (direction == DMA_FROM_DEVICE) {
+       } else if (direction == DMA_DEV_TO_MEM) {
                txd->cctl = plchan->src_cctl;
                slave_addr = plchan->src_addr;
        } else {
        }
  
        if (plchan->cd->device_fc)
-               tmp = (direction == DMA_TO_DEVICE) ? PL080_FLOW_MEM2PER_PER :
+               tmp = (direction == DMA_MEM_TO_DEV) ? PL080_FLOW_MEM2PER_PER :
                        PL080_FLOW_PER2MEM_PER;
        else
-               tmp = (direction == DMA_TO_DEVICE) ? PL080_FLOW_MEM2PER :
+               tmp = (direction == DMA_MEM_TO_DEV) ? PL080_FLOW_MEM2PER :
                        PL080_FLOW_PER2MEM;
  
        txd->ccfg |= tmp << PL080_CONFIG_FLOW_CONTROL_SHIFT;
                list_add_tail(&dsg->node, &txd->dsg_list);
  
                dsg->len = sg_dma_len(sg);
-               if (direction == DMA_TO_DEVICE) {
+               if (direction == DMA_MEM_TO_DEV) {
                        dsg->src_addr = sg_phys(sg);
                        dsg->dst_addr = slave_addr;
                } else {
@@@ -2054,8 -2057,6 +2057,8 @@@ static struct amba_id pl08x_ids[] = 
        { 0, 0 },
  };
  
 +MODULE_DEVICE_TABLE(amba, pl08x_ids);
 +
  static struct amba_driver pl08x_amba_driver = {
        .drv.name       = DRIVER_NAME,
        .id_table       = pl08x_ids,
diff --combined drivers/dma/mxs-dma.c
index fc903c0ed234eae754d06911b94f73f463a3b7eb,493af2f6e33a44ac9e5153050cae7848cfab1181..b06cd4ca626fb4fd93d5ab3b7fedddbfd6ea6c25
@@@ -44,7 -44,6 +44,6 @@@
  #define HW_APBHX_CTRL0                                0x000
  #define BM_APBH_CTRL0_APB_BURST8_EN           (1 << 29)
  #define BM_APBH_CTRL0_APB_BURST_EN            (1 << 28)
- #define BP_APBH_CTRL0_CLKGATE_CHANNEL         8
  #define BP_APBH_CTRL0_RESET_CHANNEL           16
  #define HW_APBHX_CTRL1                                0x010
  #define HW_APBHX_CTRL2                                0x020
@@@ -111,6 -110,7 +110,7 @@@ struct mxs_dma_chan 
        int                             chan_irq;
        struct mxs_dma_ccw              *ccw;
        dma_addr_t                      ccw_phys;
+       int                             desc_count;
        dma_cookie_t                    last_completed;
        enum dma_status                 status;
        unsigned int                    flags;
@@@ -130,23 -130,6 +130,6 @@@ struct mxs_dma_engine 
        struct mxs_dma_chan             mxs_chans[MXS_DMA_CHANNELS];
  };
  
- static inline void mxs_dma_clkgate(struct mxs_dma_chan *mxs_chan, int enable)
- {
-       struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
-       int chan_id = mxs_chan->chan.chan_id;
-       int set_clr = enable ? MXS_CLR_ADDR : MXS_SET_ADDR;
-       /* enable apbh channel clock */
-       if (dma_is_apbh()) {
-               if (apbh_is_old())
-                       writel(1 << (chan_id + BP_APBH_CTRL0_CLKGATE_CHANNEL),
-                               mxs_dma->base + HW_APBHX_CTRL0 + set_clr);
-               else
-                       writel(1 << chan_id,
-                               mxs_dma->base + HW_APBHX_CTRL0 + set_clr);
-       }
- }
  static void mxs_dma_reset_chan(struct mxs_dma_chan *mxs_chan)
  {
        struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
@@@ -165,9 -148,6 +148,6 @@@ static void mxs_dma_enable_chan(struct 
        struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
        int chan_id = mxs_chan->chan.chan_id;
  
-       /* clkgate needs to be enabled before writing other registers */
-       mxs_dma_clkgate(mxs_chan, 1);
        /* set cmd_addr up */
        writel(mxs_chan->ccw_phys,
                mxs_dma->base + HW_APBHX_CHn_NXTCMDAR(chan_id));
  
  static void mxs_dma_disable_chan(struct mxs_dma_chan *mxs_chan)
  {
-       /* disable apbh channel clock */
-       mxs_dma_clkgate(mxs_chan, 0);
        mxs_chan->status = DMA_SUCCESS;
  }
  
@@@ -268,7 -245,7 +245,7 @@@ static irqreturn_t mxs_dma_int_handler(
        /*
         * When both completion and error of termination bits set at the
         * same time, we do not take it as an error.  IOW, it only becomes
-        * an error we need to handler here in case of ether it's (1) an bus
+        * an error we need to handle here in case of either it's (1) a bus
         * error or (2) a termination error with no completion.
         */
        stat2 = ((stat2 >> MXS_DMA_CHANNELS) & stat2) | /* (1) */
@@@ -334,14 -311,11 +311,11 @@@ static int mxs_dma_alloc_chan_resources
                        goto err_irq;
        }
  
 -      ret = clk_enable(mxs_dma->clk);
 +      ret = clk_prepare_enable(mxs_dma->clk);
        if (ret)
                goto err_clk;
  
-       /* clkgate needs to be enabled for reset to finish */
-       mxs_dma_clkgate(mxs_chan, 1);
        mxs_dma_reset_chan(mxs_chan);
-       mxs_dma_clkgate(mxs_chan, 0);
  
        dma_async_tx_descriptor_init(&mxs_chan->desc, chan);
        mxs_chan->desc.tx_submit = mxs_dma_tx_submit;
@@@ -372,12 -346,12 +346,12 @@@ static void mxs_dma_free_chan_resources
        dma_free_coherent(mxs_dma->dma_device.dev, PAGE_SIZE,
                        mxs_chan->ccw, mxs_chan->ccw_phys);
  
 -      clk_disable(mxs_dma->clk);
 +      clk_disable_unprepare(mxs_dma->clk);
  }
  
  static struct dma_async_tx_descriptor *mxs_dma_prep_slave_sg(
                struct dma_chan *chan, struct scatterlist *sgl,
-               unsigned int sg_len, enum dma_data_direction direction,
+               unsigned int sg_len, enum dma_transfer_direction direction,
                unsigned long append)
  {
        struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan);
        struct scatterlist *sg;
        int i, j;
        u32 *pio;
-       static int idx;
+       int idx = append ? mxs_chan->desc_count : 0;
  
        if (mxs_chan->status == DMA_IN_PROGRESS && !append)
                return NULL;
                idx = 0;
        }
  
-       if (direction == DMA_NONE) {
+       if (direction == DMA_TRANS_NONE) {
                ccw = &mxs_chan->ccw[idx++];
                pio = (u32 *) sgl;
  
                        ccw->bits |= CCW_CHAIN;
                        ccw->bits |= CCW_HALT_ON_TERM;
                        ccw->bits |= CCW_TERM_FLUSH;
-                       ccw->bits |= BF_CCW(direction == DMA_FROM_DEVICE ?
+                       ccw->bits |= BF_CCW(direction == DMA_DEV_TO_MEM ?
                                        MXS_DMA_CMD_WRITE : MXS_DMA_CMD_READ,
                                        COMMAND);
  
                        }
                }
        }
+       mxs_chan->desc_count = idx;
  
        return &mxs_chan->desc;
  
@@@ -472,7 -447,7 +447,7 @@@ err_out
  
  static struct dma_async_tx_descriptor *mxs_dma_prep_dma_cyclic(
                struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len,
-               size_t period_len, enum dma_data_direction direction)
+               size_t period_len, enum dma_transfer_direction direction)
  {
        struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan);
        struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
                ccw->bits |= CCW_IRQ;
                ccw->bits |= CCW_HALT_ON_TERM;
                ccw->bits |= CCW_TERM_FLUSH;
-               ccw->bits |= BF_CCW(direction == DMA_FROM_DEVICE ?
+               ccw->bits |= BF_CCW(direction == DMA_DEV_TO_MEM ?
                                MXS_DMA_CMD_WRITE : MXS_DMA_CMD_READ, COMMAND);
  
                dma_addr += period_len;
  
                i++;
        }
+       mxs_chan->desc_count = i;
  
        return &mxs_chan->desc;
  
@@@ -539,8 -515,8 +515,8 @@@ static int mxs_dma_control(struct dma_c
  
        switch (cmd) {
        case DMA_TERMINATE_ALL:
-               mxs_dma_disable_chan(mxs_chan);
                mxs_dma_reset_chan(mxs_chan);
+               mxs_dma_disable_chan(mxs_chan);
                break;
        case DMA_PAUSE:
                mxs_dma_pause_chan(mxs_chan);
@@@ -578,9 -554,9 +554,9 @@@ static int __init mxs_dma_init(struct m
  {
        int ret;
  
 -      ret = clk_enable(mxs_dma->clk);
 +      ret = clk_prepare_enable(mxs_dma->clk);
        if (ret)
-               goto err_out;
+               return ret;
  
        ret = mxs_reset_block(mxs_dma->base);
        if (ret)
        writel(MXS_DMA_CHANNELS_MASK << MXS_DMA_CHANNELS,
                mxs_dma->base + HW_APBHX_CTRL1 + MXS_SET_ADDR);
  
-       clk_disable_unprepare(mxs_dma->clk);
-       return 0;
  err_out:
 -      clk_disable(mxs_dma->clk);
++      clk_disable_unprepare(mxs_dma->clk);
        return ret;
  }
  
diff --combined drivers/dma/pl330.c
index 09adcfcd953e6841e840fb9caa663212c20c03f7,a5737575d23681680bd19ff5f24ee017a95239e2..b8ec03ee8e22e495e633ff95bf9faf0d02756dac
@@@ -19,7 -19,6 +19,7 @@@
  #include <linux/amba/pl330.h>
  #include <linux/pm_runtime.h>
  #include <linux/scatterlist.h>
 +#include <linux/of.h>
  
  #define NR_DEFAULT_DESC       16
  
@@@ -117,9 -116,6 +117,9 @@@ struct dma_pl330_desc 
        struct dma_pl330_chan *pchan;
  };
  
 +/* forward declaration */
 +static struct amba_driver pl330_driver;
 +
  static inline struct dma_pl330_chan *
  to_pchan(struct dma_chan *ch)
  {
@@@ -271,32 -267,6 +271,32 @@@ static void dma_pl330_rqcb(void *token
        tasklet_schedule(&pch->task);
  }
  
 +bool pl330_filter(struct dma_chan *chan, void *param)
 +{
 +      u8 *peri_id;
 +
 +      if (chan->device->dev->driver != &pl330_driver.drv)
 +              return false;
 +
 +#ifdef CONFIG_OF
 +      if (chan->device->dev->of_node) {
 +              const __be32 *prop_value;
 +              phandle phandle;
 +              struct device_node *node;
 +
 +              prop_value = ((struct property *)param)->value;
 +              phandle = be32_to_cpup(prop_value++);
 +              node = of_find_node_by_phandle(phandle);
 +              return ((chan->private == node) &&
 +                              (chan->chan_id == be32_to_cpup(prop_value)));
 +      }
 +#endif
 +
 +      peri_id = chan->private;
 +      return *peri_id == (unsigned)param;
 +}
 +EXPORT_SYMBOL(pl330_filter);
 +
  static int pl330_alloc_chan_resources(struct dma_chan *chan)
  {
        struct dma_pl330_chan *pch = to_pchan(chan);
@@@ -350,14 -320,14 +350,14 @@@ static int pl330_control(struct dma_cha
        case DMA_SLAVE_CONFIG:
                slave_config = (struct dma_slave_config *)arg;
  
-               if (slave_config->direction == DMA_TO_DEVICE) {
+               if (slave_config->direction == DMA_MEM_TO_DEV) {
                        if (slave_config->dst_addr)
                                pch->fifo_addr = slave_config->dst_addr;
                        if (slave_config->dst_addr_width)
                                pch->burst_sz = __ffs(slave_config->dst_addr_width);
                        if (slave_config->dst_maxburst)
                                pch->burst_len = slave_config->dst_maxburst;
-               } else if (slave_config->direction == DMA_FROM_DEVICE) {
+               } else if (slave_config->direction == DMA_DEV_TO_MEM) {
                        if (slave_config->src_addr)
                                pch->fifo_addr = slave_config->src_addr;
                        if (slave_config->src_addr_width)
@@@ -527,7 -497,7 +527,7 @@@ pluck_desc(struct dma_pl330_dmac *pdmac
  static struct dma_pl330_desc *pl330_get_desc(struct dma_pl330_chan *pch)
  {
        struct dma_pl330_dmac *pdmac = pch->dmac;
 -      struct dma_pl330_peri *peri = pch->chan.private;
 +      u8 *peri_id = pch->chan.private;
        struct dma_pl330_desc *desc;
  
        /* Pluck one desc from the pool of DMAC */
        desc->txd.cookie = 0;
        async_tx_ack(&desc->txd);
  
 -      if (peri) {
 -              desc->req.rqtype = peri->rqtype;
 -              desc->req.peri = pch->chan.chan_id;
 -      } else {
 -              desc->req.rqtype = MEMTOMEM;
 -              desc->req.peri = 0;
 -      }
 +      desc->req.peri = peri_id ? pch->chan.chan_id : 0;
  
        dma_async_tx_descriptor_init(&desc->txd, &pch->chan);
  
@@@ -621,7 -597,7 +621,7 @@@ static inline int get_burst_len(struct 
  
  static struct dma_async_tx_descriptor *pl330_prep_dma_cyclic(
                struct dma_chan *chan, dma_addr_t dma_addr, size_t len,
-               size_t period_len, enum dma_data_direction direction)
+               size_t period_len, enum dma_transfer_direction direction)
  {
        struct dma_pl330_desc *desc;
        struct dma_pl330_chan *pch = to_pchan(chan);
        }
  
        switch (direction) {
-       case DMA_TO_DEVICE:
+       case DMA_MEM_TO_DEV:
                desc->rqcfg.src_inc = 1;
                desc->rqcfg.dst_inc = 0;
 +              desc->req.rqtype = MEMTODEV;
                src = dma_addr;
                dst = pch->fifo_addr;
                break;
-       case DMA_FROM_DEVICE:
+       case DMA_DEV_TO_MEM:
                desc->rqcfg.src_inc = 0;
                desc->rqcfg.dst_inc = 1;
 +              desc->req.rqtype = DEVTOMEM;
                src = pch->fifo_addr;
                dst = dma_addr;
                break;
@@@ -672,12 -646,16 +672,12 @@@ pl330_prep_dma_memcpy(struct dma_chan *
  {
        struct dma_pl330_desc *desc;
        struct dma_pl330_chan *pch = to_pchan(chan);
 -      struct dma_pl330_peri *peri = chan->private;
        struct pl330_info *pi;
        int burst;
  
        if (unlikely(!pch || !len))
                return NULL;
  
 -      if (peri && peri->rqtype != MEMTOMEM)
 -              return NULL;
 -
        pi = &pch->dmac->pif;
  
        desc = __pl330_prep_dma_memcpy(pch, dst, src, len);
  
        desc->rqcfg.src_inc = 1;
        desc->rqcfg.dst_inc = 1;
 +      desc->req.rqtype = MEMTOMEM;
  
        /* Select max possible burst size */
        burst = pi->pcfg.data_bus_width / 8;
  
  static struct dma_async_tx_descriptor *
  pl330_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
-               unsigned int sg_len, enum dma_data_direction direction,
+               unsigned int sg_len, enum dma_transfer_direction direction,
                unsigned long flg)
  {
        struct dma_pl330_desc *first, *desc = NULL;
        struct dma_pl330_chan *pch = to_pchan(chan);
 -      struct dma_pl330_peri *peri = chan->private;
        struct scatterlist *sg;
        unsigned long flags;
        int i;
        dma_addr_t addr;
  
 -      if (unlikely(!pch || !sgl || !sg_len || !peri))
 +      if (unlikely(!pch || !sgl || !sg_len))
                return NULL;
  
 -      /* Make sure the direction is consistent */
 -      if ((direction == DMA_MEM_TO_DEV &&
 -                              peri->rqtype != MEMTODEV) ||
 -                      (direction == DMA_DEV_TO_MEM &&
 -                              peri->rqtype != DEVTOMEM)) {
 -              dev_err(pch->dmac->pif.dev, "%s:%d Invalid Direction\n",
 -                              __func__, __LINE__);
 -              return NULL;
 -      }
 -
        addr = pch->fifo_addr;
  
        first = NULL;
                else
                        list_add_tail(&desc->node, &first->node);
  
-               if (direction == DMA_TO_DEVICE) {
+               if (direction == DMA_MEM_TO_DEV) {
                        desc->rqcfg.src_inc = 1;
                        desc->rqcfg.dst_inc = 0;
 +                      desc->req.rqtype = MEMTODEV;
                        fill_px(&desc->px,
                                addr, sg_dma_address(sg), sg_dma_len(sg));
                } else {
                        desc->rqcfg.src_inc = 0;
                        desc->rqcfg.dst_inc = 1;
 +                      desc->req.rqtype = DEVTOMEM;
                        fill_px(&desc->px,
                                sg_dma_address(sg), addr, sg_dma_len(sg));
                }
@@@ -834,17 -820,7 +834,7 @@@ pl330_probe(struct amba_device *adev, c
  
        amba_set_drvdata(adev, pdmac);
  
- #ifdef CONFIG_PM_RUNTIME
-       /* to use the runtime PM helper functions */
-       pm_runtime_enable(&adev->dev);
-       /* enable the power domain */
-       if (pm_runtime_get_sync(&adev->dev)) {
-               dev_err(&adev->dev, "failed to get runtime pm\n");
-               ret = -ENODEV;
-               goto probe_err1;
-       }
- #else
+ #ifndef CONFIG_PM_RUNTIME
        /* enable dma clk */
        clk_enable(pdmac->clk);
  #endif
        INIT_LIST_HEAD(&pd->channels);
  
        /* Initialize channel parameters */
 -      num_chan = max(pdat ? (int)pdat->nr_valid_peri : 0,
 -                                      (int)pi->pcfg.num_chan);
 +      num_chan = max(pdat ? pdat->nr_valid_peri : (u8)pi->pcfg.num_peri,
 +                      (u8)pi->pcfg.num_chan);
        pdmac->peripherals = kzalloc(num_chan * sizeof(*pch), GFP_KERNEL);
  
        for (i = 0; i < num_chan; i++) {
                pch = &pdmac->peripherals[i];
 -              if (pdat) {
 -                      struct dma_pl330_peri *peri = &pdat->peri[i];
 -
 -                      switch (peri->rqtype) {
 -                      case MEMTOMEM:
 -                              dma_cap_set(DMA_MEMCPY, pd->cap_mask);
 -                              break;
 -                      case MEMTODEV:
 -                      case DEVTOMEM:
 -                              dma_cap_set(DMA_SLAVE, pd->cap_mask);
 -                              dma_cap_set(DMA_CYCLIC, pd->cap_mask);
 -                              break;
 -                      default:
 -                              dev_err(&adev->dev, "DEVTODEV Not Supported\n");
 -                              continue;
 -                      }
 -                      pch->chan.private = peri;
 -              } else {
 -                      dma_cap_set(DMA_MEMCPY, pd->cap_mask);
 -                      pch->chan.private = NULL;
 -              }
 +              if (!adev->dev.of_node)
 +                      pch->chan.private = pdat ? &pdat->peri_id[i] : NULL;
 +              else
 +                      pch->chan.private = adev->dev.of_node;
  
                INIT_LIST_HEAD(&pch->work_list);
                spin_lock_init(&pch->lock);
        }
  
        pd->dev = &adev->dev;
 +      if (pdat) {
 +              pd->cap_mask = pdat->cap_mask;
 +      } else {
 +              dma_cap_set(DMA_MEMCPY, pd->cap_mask);
 +              if (pi->pcfg.num_peri) {
 +                      dma_cap_set(DMA_SLAVE, pd->cap_mask);
 +                      dma_cap_set(DMA_CYCLIC, pd->cap_mask);
 +              }
 +      }
  
        pd->device_alloc_chan_resources = pl330_alloc_chan_resources;
        pd->device_free_chan_resources = pl330_free_chan_resources;
@@@ -977,10 -961,7 +967,7 @@@ static int __devexit pl330_remove(struc
        res = &adev->res;
        release_mem_region(res->start, resource_size(res));
  
- #ifdef CONFIG_PM_RUNTIME
-       pm_runtime_put(&adev->dev);
-       pm_runtime_disable(&adev->dev);
- #else
+ #ifndef CONFIG_PM_RUNTIME
        clk_disable(pdmac->clk);
  #endif
  
@@@ -997,8 -978,6 +984,8 @@@ static struct amba_id pl330_ids[] = 
        { 0, 0 },
  };
  
 +MODULE_DEVICE_TABLE(amba, pl330_ids);
 +
  #ifdef CONFIG_PM_RUNTIME
  static int pl330_runtime_suspend(struct device *dev)
  {
index 0cb461dd396af39ffbff65b387fdae11742d4ebf,dec2419b94569344e3094f69879f2c20e65349ed..74522773e934c18e417f36b36aed40017b35e02f
@@@ -287,7 -287,7 +287,7 @@@ static void mx3_videobuf_queue(struct v
                sg_dma_len(sg)          = new_size;
  
                txd = ichan->dma_chan.device->device_prep_slave_sg(
-                       &ichan->dma_chan, sg, 1, DMA_FROM_DEVICE,
+                       &ichan->dma_chan, sg, 1, DMA_DEV_TO_MEM,
                        DMA_PREP_INTERRUPT);
                if (!txd)
                        goto error;
@@@ -982,13 -982,12 +982,13 @@@ static int mx3_camera_querycap(struct s
        return 0;
  }
  
 -static int mx3_camera_set_bus_param(struct soc_camera_device *icd, __u32 pixfmt)
 +static int mx3_camera_set_bus_param(struct soc_camera_device *icd)
  {
        struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
        struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
        struct mx3_camera_dev *mx3_cam = ici->priv;
        struct v4l2_mbus_config cfg = {.type = V4L2_MBUS_PARALLEL,};
 +      u32 pixfmt = icd->current_fmt->host_fmt->fourcc;
        unsigned long bus_flags, common_flags;
        u32 dw, sens_conf;
        const struct soc_mbus_pixelfmt *fmt;
@@@ -1286,7 -1285,19 +1286,7 @@@ static struct platform_driver mx3_camer
        .remove         = __devexit_p(mx3_camera_remove),
  };
  
 -
 -static int __init mx3_camera_init(void)
 -{
 -      return platform_driver_register(&mx3_camera_driver);
 -}
 -
 -static void __exit mx3_camera_exit(void)
 -{
 -      platform_driver_unregister(&mx3_camera_driver);
 -}
 -
 -module_init(mx3_camera_init);
 -module_exit(mx3_camera_exit);
 +module_platform_driver(mx3_camera_driver);
  
  MODULE_DESCRIPTION("i.MX3x SoC Camera Host driver");
  MODULE_AUTHOR("Guennadi Liakhovetski <lg@denx.de>");
index 0a2d75f0406631f582b17b50aaf6c4cd11e074df,6876f7e471daf9166fbccfa89fe84aa42f7cb5ea..4ed1c7c28ae704b4f1e843cb8db0ae7b74981c02
@@@ -565,7 -565,7 +565,7 @@@ static void buffer_queue(struct videobu
        spin_unlock_irq(&fh->queue_lock);
  
        desc = fh->chan->device->device_prep_slave_sg(fh->chan,
-               buf->sg, sg_elems, DMA_FROM_DEVICE,
+               buf->sg, sg_elems, DMA_DEV_TO_MEM,
                DMA_PREP_INTERRUPT | DMA_COMPL_SKIP_SRC_UNMAP);
        if (!desc) {
                spin_lock_irq(&fh->queue_lock);
@@@ -872,7 -872,20 +872,7 @@@ static struct platform_driver timblogiw
        .remove         = __devexit_p(timblogiw_remove),
  };
  
 -/* Module functions */
 -
 -static int __init timblogiw_init(void)
 -{
 -      return platform_driver_register(&timblogiw_platform_driver);
 -}
 -
 -static void __exit timblogiw_exit(void)
 -{
 -      platform_driver_unregister(&timblogiw_platform_driver);
 -}
 -
 -module_init(timblogiw_init);
 -module_exit(timblogiw_exit);
 +module_platform_driver(timblogiw_platform_driver);
  
  MODULE_DESCRIPTION(TIMBLOGIWIN_NAME);
  MODULE_AUTHOR("Pelagicore AB <info@pelagicore.com>");
index eb5cd28bc6d8d7a1917f7f15d82b267b692315f8,20ef1eac5599eb4e9527c54d0a49c81e81d18a70..a2d25e4857e31387fc0457b5a47efc4c1e438bd0
@@@ -513,7 -513,7 +513,7 @@@ static noinline int fpga_program_dma(st
         * transaction, and then put it under external control
         */
        memset(&config, 0, sizeof(config));
-       config.direction = DMA_TO_DEVICE;
+       config.direction = DMA_MEM_TO_DEV;
        config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
        config.dst_maxburst = fpga_fifo_size(priv->regs) / 2 / 4;
        ret = chan->device->device_control(chan, DMA_SLAVE_CONFIG,
@@@ -945,7 -945,8 +945,7 @@@ static int fpga_of_remove(struct platfo
  /* CTL-CPLD Version Register */
  #define CTL_CPLD_VERSION      0x2000
  
 -static int fpga_of_probe(struct platform_device *op,
 -                       const struct of_device_id *match)
 +static int fpga_of_probe(struct platform_device *op)
  {
        struct device_node *of_node = op->dev.of_node;
        struct device *this_device;
@@@ -1106,7 -1107,7 +1106,7 @@@ static struct of_device_id fpga_of_matc
        {},
  };
  
 -static struct of_platform_driver fpga_of_driver = {
 +static struct platform_driver fpga_of_driver = {
        .probe          = fpga_of_probe,
        .remove         = fpga_of_remove,
        .driver         = {
  static int __init fpga_init(void)
  {
        led_trigger_register_simple("fpga", &ledtrig_fpga);
 -      return of_register_platform_driver(&fpga_of_driver);
 +      return platform_driver_register(&fpga_of_driver);
  }
  
  static void __exit fpga_exit(void)
  {
 -      of_unregister_platform_driver(&fpga_of_driver);
 +      platform_driver_unregister(&fpga_of_driver);
        led_trigger_unregister_simple(ledtrig_fpga);
  }
  
diff --combined drivers/mmc/host/mmci.c
index ece03b491c7db824fe7a698353f2c14f9f0cb6d2,0b44d6bbe5d74990dd06b3511474297a3b22203c..0d955ffaf44e2c3ec5961f966687da3e675819d9
@@@ -374,6 -374,7 +374,7 @@@ static int mmci_dma_prep_data(struct mm
        struct dma_chan *chan;
        struct dma_device *device;
        struct dma_async_tx_descriptor *desc;
+       enum dma_data_direction buffer_dirn;
        int nr_sg;
  
        /* Check if next job is already prepared */
        }
  
        if (data->flags & MMC_DATA_READ) {
-               conf.direction = DMA_FROM_DEVICE;
+               conf.direction = DMA_DEV_TO_MEM;
+               buffer_dirn = DMA_FROM_DEVICE;
                chan = host->dma_rx_channel;
        } else {
-               conf.direction = DMA_TO_DEVICE;
+               conf.direction = DMA_MEM_TO_DEV;
+               buffer_dirn = DMA_TO_DEVICE;
                chan = host->dma_tx_channel;
        }
  
                return -EINVAL;
  
        device = chan->device;
-       nr_sg = dma_map_sg(device->dev, data->sg, data->sg_len, conf.direction);
+       nr_sg = dma_map_sg(device->dev, data->sg, data->sg_len, buffer_dirn);
        if (nr_sg == 0)
                return -EINVAL;
  
   unmap_exit:
        if (!next)
                dmaengine_terminate_all(chan);
-       dma_unmap_sg(device->dev, data->sg, data->sg_len, conf.direction);
+       dma_unmap_sg(device->dev, data->sg, data->sg_len, buffer_dirn);
        return -ENOMEM;
  }
  
@@@ -675,8 -678,7 +678,8 @@@ mmci_data_irq(struct mmci_host *host, s
              unsigned int status)
  {
        /* First check for errors */
 -      if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_TXUNDERRUN|MCI_RXOVERRUN)) {
 +      if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_STARTBITERR|
 +                    MCI_TXUNDERRUN|MCI_RXOVERRUN)) {
                u32 remain, success;
  
                /* Terminate the DMA transfer */
@@@ -755,12 -757,8 +758,12 @@@ mmci_cmd_irq(struct mmci_host *host, st
        }
  
        if (!cmd->data || cmd->error) {
 -              if (host->data)
 +              if (host->data) {
 +                      /* Terminate the DMA transfer */
 +                      if (dma_inprogress(host))
 +                              mmci_dma_data_error(host);
                        mmci_stop_data(host);
 +              }
                mmci_request_end(host, cmd->mrq);
        } else if (!(cmd->data->flags & MMC_DATA_READ)) {
                mmci_start_data(host, cmd->data);
@@@ -960,9 -958,8 +963,9 @@@ static irqreturn_t mmci_irq(int irq, vo
                dev_dbg(mmc_dev(host->mmc), "irq0 (data+cmd) %08x\n", status);
  
                data = host->data;
 -              if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_TXUNDERRUN|
 -                            MCI_RXOVERRUN|MCI_DATAEND|MCI_DATABLOCKEND) && data)
 +              if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_STARTBITERR|
 +                            MCI_TXUNDERRUN|MCI_RXOVERRUN|MCI_DATAEND|
 +                            MCI_DATABLOCKEND) && data)
                        mmci_data_irq(host, data, status);
  
                cmd = host->cmd;
@@@ -1245,7 -1242,6 +1248,7 @@@ static int __devinit mmci_probe(struct 
        if (host->vcc == NULL)
                mmc->ocr_avail = plat->ocr_mask;
        mmc->caps = plat->capabilities;
 +      mmc->caps2 = plat->capabilities2;
  
        /*
         * We can do SGIO
@@@ -1503,8 -1499,6 +1506,8 @@@ static struct amba_id mmci_ids[] = 
        { 0, 0 },
  };
  
 +MODULE_DEVICE_TABLE(amba, mmci_ids);
 +
  static struct amba_driver mmci_driver = {
        .drv            = {
                .name   = DRIVER_NAME,
index 7088b40f95797b00172edf0bdf4f50437b18947f,a17bc121785937801210079187798f61adc3a8fe..4184b7946bbf34fd459c671a921ae6baf659e4d2
@@@ -218,6 -218,7 +218,7 @@@ static int mxcmci_setup_data(struct mxc
        unsigned int blksz = data->blksz;
        unsigned int datasize = nob * blksz;
        struct scatterlist *sg;
+       enum dma_transfer_direction slave_dirn;
        int i, nents;
  
        if (data->flags & MMC_DATA_STREAM)
                }
        }
  
-       if (data->flags & MMC_DATA_READ)
+       if (data->flags & MMC_DATA_READ) {
                host->dma_dir = DMA_FROM_DEVICE;
-       else
+               slave_dirn = DMA_DEV_TO_MEM;
+       } else {
                host->dma_dir = DMA_TO_DEVICE;
+               slave_dirn = DMA_MEM_TO_DEV;
+       }
  
        nents = dma_map_sg(host->dma->device->dev, data->sg,
                                     data->sg_len,  host->dma_dir);
                return -EINVAL;
  
        host->desc = host->dma->device->device_prep_slave_sg(host->dma,
-               data->sg, data->sg_len, host->dma_dir,
+               data->sg, data->sg_len, slave_dirn,
                DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
  
        if (!host->desc) {
@@@ -732,7 -736,6 +736,7 @@@ static void mxcmci_set_ios(struct mmc_h
                                "failed to config DMA channel. Falling back to PIO\n");
                        dma_release_channel(host->dma);
                        host->do_dma = 0;
 +                      host->dma = NULL;
                }
        }
  
@@@ -1047,7 -1050,18 +1051,7 @@@ static struct platform_driver mxcmci_dr
        }
  };
  
 -static int __init mxcmci_init(void)
 -{
 -      return platform_driver_register(&mxcmci_driver);
 -}
 -
 -static void __exit mxcmci_exit(void)
 -{
 -      platform_driver_unregister(&mxcmci_driver);
 -}
 -
 -module_init(mxcmci_init);
 -module_exit(mxcmci_exit);
 +module_platform_driver(mxcmci_driver);
  
  MODULE_DESCRIPTION("i.MX Multimedia Card Interface Driver");
  MODULE_AUTHOR("Sascha Hauer, Pengutronix");
index 4e2e019dd5c94e02a8a6b54b413dcf2e162e7777,94d7358187fd8fcf684e69a1c1ebd5e8a8abb3da..382c835d217cf23372594b230dcd7923971288d5
@@@ -154,6 -154,7 +154,7 @@@ struct mxs_mmc_host 
        struct dma_chan                 *dmach;
        struct mxs_dma_data             dma_data;
        unsigned int                    dma_dir;
+       enum dma_transfer_direction     slave_dirn;
        u32                             ssp_pio_words[SSP_PIO_NUM];
  
        unsigned int                    version;
@@@ -324,7 -325,7 +325,7 @@@ static struct dma_async_tx_descriptor *
        }
  
        desc = host->dmach->device->device_prep_slave_sg(host->dmach,
-                               sgl, sg_len, host->dma_dir, append);
+                               sgl, sg_len, host->slave_dirn, append);
        if (desc) {
                desc->callback = mxs_mmc_dma_irq_callback;
                desc->callback_param = host;
@@@ -356,6 -357,7 +357,7 @@@ static void mxs_mmc_bc(struct mxs_mmc_h
        host->ssp_pio_words[1] = cmd0;
        host->ssp_pio_words[2] = cmd1;
        host->dma_dir = DMA_NONE;
+       host->slave_dirn = DMA_TRANS_NONE;
        desc = mxs_mmc_prep_dma(host, 0);
        if (!desc)
                goto out;
@@@ -395,6 -397,7 +397,7 @@@ static void mxs_mmc_ac(struct mxs_mmc_h
        host->ssp_pio_words[1] = cmd0;
        host->ssp_pio_words[2] = cmd1;
        host->dma_dir = DMA_NONE;
+       host->slave_dirn = DMA_TRANS_NONE;
        desc = mxs_mmc_prep_dma(host, 0);
        if (!desc)
                goto out;
@@@ -433,6 -436,7 +436,7 @@@ static void mxs_mmc_adtc(struct mxs_mmc
        int i;
  
        unsigned short dma_data_dir, timeout;
+       enum dma_transfer_direction slave_dirn;
        unsigned int data_size = 0, log2_blksz;
        unsigned int blocks = data->blocks;
  
  
        if (data->flags & MMC_DATA_WRITE) {
                dma_data_dir = DMA_TO_DEVICE;
+               slave_dirn = DMA_MEM_TO_DEV;
                read = 0;
        } else {
                dma_data_dir = DMA_FROM_DEVICE;
+               slave_dirn = DMA_DEV_TO_MEM;
                read = BM_SSP_CTRL0_READ;
        }
  
        host->ssp_pio_words[1] = cmd0;
        host->ssp_pio_words[2] = cmd1;
        host->dma_dir = DMA_NONE;
+       host->slave_dirn = DMA_TRANS_NONE;
        desc = mxs_mmc_prep_dma(host, 0);
        if (!desc)
                goto out;
        WARN_ON(host->data != NULL);
        host->data = data;
        host->dma_dir = dma_data_dir;
+       host->slave_dirn = slave_dirn;
        desc = mxs_mmc_prep_dma(host, 1);
        if (!desc)
                goto out;
@@@ -713,7 -721,7 +721,7 @@@ static int mxs_mmc_probe(struct platfor
                ret = PTR_ERR(host->clk);
                goto out_iounmap;
        }
 -      clk_enable(host->clk);
 +      clk_prepare_enable(host->clk);
  
        mxs_mmc_reset(host);
  
@@@ -772,7 -780,7 +780,7 @@@ out_free_dma
        if (host->dmach)
                dma_release_channel(host->dmach);
  out_clk_put:
 -      clk_disable(host->clk);
 +      clk_disable_unprepare(host->clk);
        clk_put(host->clk);
  out_iounmap:
        iounmap(host->base);
@@@ -798,7 -806,7 +806,7 @@@ static int mxs_mmc_remove(struct platfo
        if (host->dmach)
                dma_release_channel(host->dmach);
  
 -      clk_disable(host->clk);
 +      clk_disable_unprepare(host->clk);
        clk_put(host->clk);
  
        iounmap(host->base);
@@@ -819,7 -827,7 +827,7 @@@ static int mxs_mmc_suspend(struct devic
  
        ret = mmc_suspend_host(mmc);
  
 -      clk_disable(host->clk);
 +      clk_disable_unprepare(host->clk);
  
        return ret;
  }
@@@ -830,7 -838,7 +838,7 @@@ static int mxs_mmc_resume(struct devic
        struct mxs_mmc_host *host = mmc_priv(mmc);
        int ret = 0;
  
 -      clk_enable(host->clk);
 +      clk_prepare_enable(host->clk);
  
        ret = mmc_resume_host(mmc);
  
@@@ -855,7 -863,18 +863,7 @@@ static struct platform_driver mxs_mmc_d
        },
  };
  
 -static int __init mxs_mmc_init(void)
 -{
 -      return platform_driver_register(&mxs_mmc_driver);
 -}
 -
 -static void __exit mxs_mmc_exit(void)
 -{
 -      platform_driver_unregister(&mxs_mmc_driver);
 -}
 -
 -module_init(mxs_mmc_init);
 -module_exit(mxs_mmc_exit);
 +module_platform_driver(mxs_mmc_driver);
  
  MODULE_DESCRIPTION("FREESCALE MXS MMC peripheral");
  MODULE_AUTHOR("Freescale Semiconductor");
index 4a2c5b2355f21d81887e0f92d7f3350c1c51f288,1c0c10bd2d3b115e6a43d46f72a9468f259ff821..f5d8b53be333aa9c997b0e82c1e8e69a8204eb0d
   *
   */
  
 +/*
 + * The MMCIF driver is now processing MMC requests asynchronously, according
 + * to the Linux MMC API requirement.
 + *
 + * The MMCIF driver processes MMC requests in up to 3 stages: command, optional
 + * data, and optional stop. To achieve asynchronous processing each of these
 + * stages is split into two halves: a top and a bottom half. The top half
 + * initialises the hardware, installs a timeout handler to handle completion
 + * timeouts, and returns. In case of the command stage this immediately returns
 + * control to the caller, leaving all further processing to run asynchronously.
 + * All further request processing is performed by the bottom halves.
 + *
 + * The bottom half further consists of a "hard" IRQ handler, an IRQ handler
 + * thread, a DMA completion callback, if DMA is used, a timeout work, and
 + * request- and stage-specific handler methods.
 + *
 + * Each bottom half run begins with either a hardware interrupt, a DMA callback
 + * invocation, or a timeout work run. In case of an error or a successful
 + * processing completion, the MMC core is informed and the request processing is
 + * finished. In case processing has to continue, i.e., if data has to be read
 + * from or written to the card, or if a stop command has to be sent, the next
 + * top half is called, which performs the necessary hardware handling and
 + * reschedules the timeout work. This returns the driver state machine into the
 + * bottom half waiting state.
 + */
 +
 +#include <linux/bitops.h>
  #include <linux/clk.h>
  #include <linux/completion.h>
  #include <linux/delay.h>
  #define MASK_MRBSYTO          (1 << 1)
  #define MASK_MRSPTO           (1 << 0)
  
 +#define MASK_START_CMD                (MASK_MCMDVIO | MASK_MBUFVIO | MASK_MWDATERR | \
 +                               MASK_MRDATERR | MASK_MRIDXERR | MASK_MRSPERR | \
 +                               MASK_MCCSTO | MASK_MCRCSTO | MASK_MWDATTO | \
 +                               MASK_MRDATTO | MASK_MRBSYTO | MASK_MRSPTO)
 +
  /* CE_HOST_STS1 */
  #define STS1_CMDSEQ           (1 << 31)
  
@@@ -194,21 -162,9 +194,21 @@@ enum mmcif_state 
        STATE_IOS,
  };
  
 +enum mmcif_wait_for {
 +      MMCIF_WAIT_FOR_REQUEST,
 +      MMCIF_WAIT_FOR_CMD,
 +      MMCIF_WAIT_FOR_MREAD,
 +      MMCIF_WAIT_FOR_MWRITE,
 +      MMCIF_WAIT_FOR_READ,
 +      MMCIF_WAIT_FOR_WRITE,
 +      MMCIF_WAIT_FOR_READ_END,
 +      MMCIF_WAIT_FOR_WRITE_END,
 +      MMCIF_WAIT_FOR_STOP,
 +};
 +
  struct sh_mmcif_host {
        struct mmc_host *mmc;
 -      struct mmc_data *data;
 +      struct mmc_request *mrq;
        struct platform_device *pd;
        struct sh_dmae_slave dma_slave_tx;
        struct sh_dmae_slave dma_slave_rx;
        unsigned int clk;
        int bus_width;
        bool sd_error;
 +      bool dying;
        long timeout;
        void __iomem *addr;
 -      struct completion intr_wait;
 +      u32 *pio_ptr;
 +      spinlock_t lock;                /* protect sh_mmcif_host::state */
        enum mmcif_state state;
 -      spinlock_t lock;
 +      enum mmcif_wait_for wait_for;
 +      struct delayed_work timeout_work;
 +      size_t blocksize;
 +      int sg_idx;
 +      int sg_blkidx;
        bool power;
        bool card_present;
  
@@@ -252,21 -202,19 +252,21 @@@ static inline void sh_mmcif_bitclr(stru
  static void mmcif_dma_complete(void *arg)
  {
        struct sh_mmcif_host *host = arg;
 +      struct mmc_data *data = host->mrq->data;
 +
        dev_dbg(&host->pd->dev, "Command completed\n");
  
 -      if (WARN(!host->data, "%s: NULL data in DMA completion!\n",
 +      if (WARN(!data, "%s: NULL data in DMA completion!\n",
                 dev_name(&host->pd->dev)))
                return;
  
 -      if (host->data->flags & MMC_DATA_READ)
 +      if (data->flags & MMC_DATA_READ)
                dma_unmap_sg(host->chan_rx->device->dev,
 -                           host->data->sg, host->data->sg_len,
 +                           data->sg, data->sg_len,
                             DMA_FROM_DEVICE);
        else
                dma_unmap_sg(host->chan_tx->device->dev,
 -                           host->data->sg, host->data->sg_len,
 +                           data->sg, data->sg_len,
                             DMA_TO_DEVICE);
  
        complete(&host->dma_complete);
  
  static void sh_mmcif_start_dma_rx(struct sh_mmcif_host *host)
  {
 -      struct scatterlist *sg = host->data->sg;
 +      struct mmc_data *data = host->mrq->data;
 +      struct scatterlist *sg = data->sg;
        struct dma_async_tx_descriptor *desc = NULL;
        struct dma_chan *chan = host->chan_rx;
        dma_cookie_t cookie = -EINVAL;
        int ret;
  
 -      ret = dma_map_sg(chan->device->dev, sg, host->data->sg_len,
 +      ret = dma_map_sg(chan->device->dev, sg, data->sg_len,
                         DMA_FROM_DEVICE);
        if (ret > 0) {
                host->dma_active = true;
                desc = chan->device->device_prep_slave_sg(chan, sg, ret,
-                       DMA_FROM_DEVICE, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
+                       DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        }
  
        if (desc) {
                dma_async_issue_pending(chan);
        }
        dev_dbg(&host->pd->dev, "%s(): mapped %d -> %d, cookie %d\n",
 -              __func__, host->data->sg_len, ret, cookie);
 +              __func__, data->sg_len, ret, cookie);
  
        if (!desc) {
                /* DMA failed, fall back to PIO */
        }
  
        dev_dbg(&host->pd->dev, "%s(): desc %p, cookie %d, sg[%d]\n", __func__,
 -              desc, cookie, host->data->sg_len);
 +              desc, cookie, data->sg_len);
  }
  
  static void sh_mmcif_start_dma_tx(struct sh_mmcif_host *host)
  {
 -      struct scatterlist *sg = host->data->sg;
 +      struct mmc_data *data = host->mrq->data;
 +      struct scatterlist *sg = data->sg;
        struct dma_async_tx_descriptor *desc = NULL;
        struct dma_chan *chan = host->chan_tx;
        dma_cookie_t cookie = -EINVAL;
        int ret;
  
 -      ret = dma_map_sg(chan->device->dev, sg, host->data->sg_len,
 +      ret = dma_map_sg(chan->device->dev, sg, data->sg_len,
                         DMA_TO_DEVICE);
        if (ret > 0) {
                host->dma_active = true;
                desc = chan->device->device_prep_slave_sg(chan, sg, ret,
-                       DMA_TO_DEVICE, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
+                       DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        }
  
        if (desc) {
                dma_async_issue_pending(chan);
        }
        dev_dbg(&host->pd->dev, "%s(): mapped %d -> %d, cookie %d\n",
 -              __func__, host->data->sg_len, ret, cookie);
 +              __func__, data->sg_len, ret, cookie);
  
        if (!desc) {
                /* DMA failed, fall back to PIO */
@@@ -453,7 -399,7 +453,7 @@@ static void sh_mmcif_clock_control(stru
                sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_SUP_PCLK);
        else
                sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR &
 -                      (ilog2(__rounddown_pow_of_two(host->clk / clk)) << 16));
 +                              ((fls(host->clk / clk) - 1) << 16));
  
        sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_ENABLE);
  }
@@@ -475,7 -421,7 +475,7 @@@ static void sh_mmcif_sync_reset(struct 
  static int sh_mmcif_error_manage(struct sh_mmcif_host *host)
  {
        u32 state1, state2;
 -      int ret, timeout = 10000000;
 +      int ret, timeout;
  
        host->sd_error = false;
  
        if (state1 & STS1_CMDSEQ) {
                sh_mmcif_bitset(host, MMCIF_CE_CMD_CTRL, CMD_CTRL_BREAK);
                sh_mmcif_bitset(host, MMCIF_CE_CMD_CTRL, ~CMD_CTRL_BREAK);
 -              while (1) {
 -                      timeout--;
 -                      if (timeout < 0) {
 -                              dev_err(&host->pd->dev,
 -                                      "Forceed end of command sequence timeout err\n");
 -                              return -EIO;
 -                      }
 +              for (timeout = 10000000; timeout; timeout--) {
                        if (!(sh_mmcif_readl(host->addr, MMCIF_CE_HOST_STS1)
 -                                                              & STS1_CMDSEQ))
 +                            & STS1_CMDSEQ))
                                break;
                        mdelay(1);
                }
 +              if (!timeout) {
 +                      dev_err(&host->pd->dev,
 +                              "Forced end of command sequence timeout err\n");
 +                      return -EIO;
 +              }
                sh_mmcif_sync_reset(host);
                dev_dbg(&host->pd->dev, "Forced end of command sequence\n");
                return -EIO;
        }
  
        if (state2 & STS2_CRC_ERR) {
 -              dev_dbg(&host->pd->dev, ": Happened CRC error\n");
 +              dev_dbg(&host->pd->dev, ": CRC error\n");
                ret = -EIO;
        } else if (state2 & STS2_TIMEOUT_ERR) {
 -              dev_dbg(&host->pd->dev, ": Happened Timeout error\n");
 +              dev_dbg(&host->pd->dev, ": Timeout\n");
                ret = -ETIMEDOUT;
        } else {
 -              dev_dbg(&host->pd->dev, ": Happened End/Index error\n");
 +              dev_dbg(&host->pd->dev, ": End/Index error\n");
                ret = -EIO;
        }
        return ret;
  }
  
 -static int sh_mmcif_single_read(struct sh_mmcif_host *host,
 -                                      struct mmc_request *mrq)
 +static bool sh_mmcif_next_block(struct sh_mmcif_host *host, u32 *p)
  {
 -      struct mmc_data *data = mrq->data;
 -      long time;
 -      u32 blocksize, i, *p = sg_virt(data->sg);
 +      struct mmc_data *data = host->mrq->data;
 +
 +      host->sg_blkidx += host->blocksize;
 +
 +      /* data->sg->length must be a multiple of host->blocksize? */
 +      BUG_ON(host->sg_blkidx > data->sg->length);
 +
 +      if (host->sg_blkidx == data->sg->length) {
 +              host->sg_blkidx = 0;
 +              if (++host->sg_idx < data->sg_len)
 +                      host->pio_ptr = sg_virt(++data->sg);
 +      } else {
 +              host->pio_ptr = p;
 +      }
 +
 +      if (host->sg_idx == data->sg_len)
 +              return false;
 +
 +      return true;
 +}
 +
 +static void sh_mmcif_single_read(struct sh_mmcif_host *host,
 +                               struct mmc_request *mrq)
 +{
 +      host->blocksize = (sh_mmcif_readl(host->addr, MMCIF_CE_BLOCK_SET) &
 +                         BLOCK_SIZE_MASK) + 3;
 +
 +      host->wait_for = MMCIF_WAIT_FOR_READ;
 +      schedule_delayed_work(&host->timeout_work, host->timeout);
  
        /* buf read enable */
        sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFREN);
 -      time = wait_for_completion_interruptible_timeout(&host->intr_wait,
 -                      host->timeout);
 -      if (time <= 0 || host->sd_error)
 -              return sh_mmcif_error_manage(host);
 -
 -      blocksize = (BLOCK_SIZE_MASK &
 -                      sh_mmcif_readl(host->addr, MMCIF_CE_BLOCK_SET)) + 3;
 -      for (i = 0; i < blocksize / 4; i++)
 +}
 +
 +static bool sh_mmcif_read_block(struct sh_mmcif_host *host)
 +{
 +      struct mmc_data *data = host->mrq->data;
 +      u32 *p = sg_virt(data->sg);
 +      int i;
 +
 +      if (host->sd_error) {
 +              data->error = sh_mmcif_error_manage(host);
 +              return false;
 +      }
 +
 +      for (i = 0; i < host->blocksize / 4; i++)
                *p++ = sh_mmcif_readl(host->addr, MMCIF_CE_DATA);
  
        /* buffer read end */
        sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFRE);
 -      time = wait_for_completion_interruptible_timeout(&host->intr_wait,
 -                      host->timeout);
 -      if (time <= 0 || host->sd_error)
 -              return sh_mmcif_error_manage(host);
 +      host->wait_for = MMCIF_WAIT_FOR_READ_END;
  
 -      return 0;
 +      return true;
  }
  
 -static int sh_mmcif_multi_read(struct sh_mmcif_host *host,
 -                                      struct mmc_request *mrq)
 +static void sh_mmcif_multi_read(struct sh_mmcif_host *host,
 +                              struct mmc_request *mrq)
  {
        struct mmc_data *data = mrq->data;
 -      long time;
 -      u32 blocksize, i, j, sec, *p;
 -
 -      blocksize = BLOCK_SIZE_MASK & sh_mmcif_readl(host->addr,
 -                                                   MMCIF_CE_BLOCK_SET);
 -      for (j = 0; j < data->sg_len; j++) {
 -              p = sg_virt(data->sg);
 -              for (sec = 0; sec < data->sg->length / blocksize; sec++) {
 -                      sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFREN);
 -                      /* buf read enable */
 -                      time = wait_for_completion_interruptible_timeout(&host->intr_wait,
 -                              host->timeout);
 -
 -                      if (time <= 0 || host->sd_error)
 -                              return sh_mmcif_error_manage(host);
 -
 -                      for (i = 0; i < blocksize / 4; i++)
 -                              *p++ = sh_mmcif_readl(host->addr,
 -                                                    MMCIF_CE_DATA);
 -              }
 -              if (j < data->sg_len - 1)
 -                      data->sg++;
 +
 +      if (!data->sg_len || !data->sg->length)
 +              return;
 +
 +      host->blocksize = sh_mmcif_readl(host->addr, MMCIF_CE_BLOCK_SET) &
 +              BLOCK_SIZE_MASK;
 +
 +      host->wait_for = MMCIF_WAIT_FOR_MREAD;
 +      host->sg_idx = 0;
 +      host->sg_blkidx = 0;
 +      host->pio_ptr = sg_virt(data->sg);
 +      schedule_delayed_work(&host->timeout_work, host->timeout);
 +      sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFREN);
 +}
 +
 +static bool sh_mmcif_mread_block(struct sh_mmcif_host *host)
 +{
 +      struct mmc_data *data = host->mrq->data;
 +      u32 *p = host->pio_ptr;
 +      int i;
 +
 +      if (host->sd_error) {
 +              data->error = sh_mmcif_error_manage(host);
 +              return false;
        }
 -      return 0;
 +
 +      BUG_ON(!data->sg->length);
 +
 +      for (i = 0; i < host->blocksize / 4; i++)
 +              *p++ = sh_mmcif_readl(host->addr, MMCIF_CE_DATA);
 +
 +      if (!sh_mmcif_next_block(host, p))
 +              return false;
 +
 +      schedule_delayed_work(&host->timeout_work, host->timeout);
 +      sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFREN);
 +
 +      return true;
  }
  
 -static int sh_mmcif_single_write(struct sh_mmcif_host *host,
 +static void sh_mmcif_single_write(struct sh_mmcif_host *host,
                                        struct mmc_request *mrq)
  {
 -      struct mmc_data *data = mrq->data;
 -      long time;
 -      u32 blocksize, i, *p = sg_virt(data->sg);
 +      host->blocksize = (sh_mmcif_readl(host->addr, MMCIF_CE_BLOCK_SET) &
 +                         BLOCK_SIZE_MASK) + 3;
  
 -      sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFWEN);
 +      host->wait_for = MMCIF_WAIT_FOR_WRITE;
 +      schedule_delayed_work(&host->timeout_work, host->timeout);
  
        /* buf write enable */
 -      time = wait_for_completion_interruptible_timeout(&host->intr_wait,
 -                      host->timeout);
 -      if (time <= 0 || host->sd_error)
 -              return sh_mmcif_error_manage(host);
 -
 -      blocksize = (BLOCK_SIZE_MASK &
 -                      sh_mmcif_readl(host->addr, MMCIF_CE_BLOCK_SET)) + 3;
 -      for (i = 0; i < blocksize / 4; i++)
 +      sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFWEN);
 +}
 +
 +static bool sh_mmcif_write_block(struct sh_mmcif_host *host)
 +{
 +      struct mmc_data *data = host->mrq->data;
 +      u32 *p = sg_virt(data->sg);
 +      int i;
 +
 +      if (host->sd_error) {
 +              data->error = sh_mmcif_error_manage(host);
 +              return false;
 +      }
 +
 +      for (i = 0; i < host->blocksize / 4; i++)
                sh_mmcif_writel(host->addr, MMCIF_CE_DATA, *p++);
  
        /* buffer write end */
        sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MDTRANE);
 +      host->wait_for = MMCIF_WAIT_FOR_WRITE_END;
  
 -      time = wait_for_completion_interruptible_timeout(&host->intr_wait,
 -                      host->timeout);
 -      if (time <= 0 || host->sd_error)
 -              return sh_mmcif_error_manage(host);
 -
 -      return 0;
 +      return true;
  }
  
 -static int sh_mmcif_multi_write(struct sh_mmcif_host *host,
 -                                              struct mmc_request *mrq)
 +static void sh_mmcif_multi_write(struct sh_mmcif_host *host,
 +                              struct mmc_request *mrq)
  {
        struct mmc_data *data = mrq->data;
 -      long time;
 -      u32 i, sec, j, blocksize, *p;
  
 -      blocksize = BLOCK_SIZE_MASK & sh_mmcif_readl(host->addr,
 -                                                   MMCIF_CE_BLOCK_SET);
 +      if (!data->sg_len || !data->sg->length)
 +              return;
  
 -      for (j = 0; j < data->sg_len; j++) {
 -              p = sg_virt(data->sg);
 -              for (sec = 0; sec < data->sg->length / blocksize; sec++) {
 -                      sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFWEN);
 -                      /* buf write enable*/
 -                      time = wait_for_completion_interruptible_timeout(&host->intr_wait,
 -                              host->timeout);
 +      host->blocksize = sh_mmcif_readl(host->addr, MMCIF_CE_BLOCK_SET) &
 +              BLOCK_SIZE_MASK;
  
 -                      if (time <= 0 || host->sd_error)
 -                              return sh_mmcif_error_manage(host);
 +      host->wait_for = MMCIF_WAIT_FOR_MWRITE;
 +      host->sg_idx = 0;
 +      host->sg_blkidx = 0;
 +      host->pio_ptr = sg_virt(data->sg);
 +      schedule_delayed_work(&host->timeout_work, host->timeout);
 +      sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFWEN);
 +}
  
 -                      for (i = 0; i < blocksize / 4; i++)
 -                              sh_mmcif_writel(host->addr,
 -                                              MMCIF_CE_DATA, *p++);
 -              }
 -              if (j < data->sg_len - 1)
 -                      data->sg++;
 +static bool sh_mmcif_mwrite_block(struct sh_mmcif_host *host)
 +{
 +      struct mmc_data *data = host->mrq->data;
 +      u32 *p = host->pio_ptr;
 +      int i;
 +
 +      if (host->sd_error) {
 +              data->error = sh_mmcif_error_manage(host);
 +              return false;
        }
 -      return 0;
 +
 +      BUG_ON(!data->sg->length);
 +
 +      for (i = 0; i < host->blocksize / 4; i++)
 +              sh_mmcif_writel(host->addr, MMCIF_CE_DATA, *p++);
 +
 +      if (!sh_mmcif_next_block(host, p))
 +              return false;
 +
 +      schedule_delayed_work(&host->timeout_work, host->timeout);
 +      sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFWEN);
 +
 +      return true;
  }
  
  static void sh_mmcif_get_response(struct sh_mmcif_host *host,
@@@ -714,11 -603,8 +714,11 @@@ static void sh_mmcif_get_cmd12response(
  }
  
  static u32 sh_mmcif_set_cmd(struct sh_mmcif_host *host,
 -              struct mmc_request *mrq, struct mmc_command *cmd, u32 opc)
 +                          struct mmc_request *mrq)
  {
 +      struct mmc_data *data = mrq->data;
 +      struct mmc_command *cmd = mrq->cmd;
 +      u32 opc = cmd->opcode;
        u32 tmp = 0;
  
        /* Response Type check */
                break;
        }
        /* WDAT / DATW */
 -      if (host->data) {
 +      if (data) {
                tmp |= CMD_SET_WDAT;
                switch (host->bus_width) {
                case MMC_BUS_WIDTH_1:
        if (opc == MMC_READ_MULTIPLE_BLOCK || opc == MMC_WRITE_MULTIPLE_BLOCK) {
                tmp |= CMD_SET_CMLTE | CMD_SET_CMD12EN;
                sh_mmcif_bitset(host, MMCIF_CE_BLOCK_SET,
 -                                      mrq->data->blocks << 16);
 +                              data->blocks << 16);
        }
        /* RIDXC[1:0] check bits */
        if (opc == MMC_SEND_OP_COND || opc == MMC_ALL_SEND_CID ||
                opc == MMC_SEND_CSD || opc == MMC_SEND_CID)
                tmp |= CMD_SET_CRC7C_INTERNAL;
  
 -      return opc = ((opc << 24) | tmp);
 +      return (opc << 24) | tmp;
  }
  
  static int sh_mmcif_data_trans(struct sh_mmcif_host *host,
 -                              struct mmc_request *mrq, u32 opc)
 +                             struct mmc_request *mrq, u32 opc)
  {
 -      int ret;
 -
        switch (opc) {
        case MMC_READ_MULTIPLE_BLOCK:
 -              ret = sh_mmcif_multi_read(host, mrq);
 -              break;
 +              sh_mmcif_multi_read(host, mrq);
 +              return 0;
        case MMC_WRITE_MULTIPLE_BLOCK:
 -              ret = sh_mmcif_multi_write(host, mrq);
 -              break;
 +              sh_mmcif_multi_write(host, mrq);
 +              return 0;
        case MMC_WRITE_BLOCK:
 -              ret = sh_mmcif_single_write(host, mrq);
 -              break;
 +              sh_mmcif_single_write(host, mrq);
 +              return 0;
        case MMC_READ_SINGLE_BLOCK:
        case MMC_SEND_EXT_CSD:
 -              ret = sh_mmcif_single_read(host, mrq);
 -              break;
 +              sh_mmcif_single_read(host, mrq);
 +              return 0;
        default:
                dev_err(&host->pd->dev, "UNSUPPORTED CMD = d'%08d\n", opc);
 -              ret = -EINVAL;
 -              break;
 +              return -EINVAL;
        }
 -      return ret;
  }
  
  static void sh_mmcif_start_cmd(struct sh_mmcif_host *host,
 -                      struct mmc_request *mrq, struct mmc_command *cmd)
 +                             struct mmc_request *mrq)
  {
 -      long time;
 -      int ret = 0, mask = 0;
 +      struct mmc_command *cmd = mrq->cmd;
        u32 opc = cmd->opcode;
 +      u32 mask;
  
        switch (opc) {
 -      /* respons busy check */
 +      /* response busy check */
        case MMC_SWITCH:
        case MMC_STOP_TRANSMISSION:
        case MMC_SET_WRITE_PROT:
        case MMC_CLR_WRITE_PROT:
        case MMC_ERASE:
        case MMC_GEN_CMD:
 -              mask = MASK_MRBSYE;
 +              mask = MASK_START_CMD | MASK_MRBSYE;
                break;
        default:
 -              mask = MASK_MCRSPE;
 +              mask = MASK_START_CMD | MASK_MCRSPE;
                break;
        }
 -      mask |= MASK_MCMDVIO | MASK_MBUFVIO | MASK_MWDATERR |
 -              MASK_MRDATERR | MASK_MRIDXERR | MASK_MRSPERR |
 -              MASK_MCCSTO | MASK_MCRCSTO | MASK_MWDATTO |
 -              MASK_MRDATTO | MASK_MRBSYTO | MASK_MRSPTO;
  
 -      if (host->data) {
 +      if (mrq->data) {
                sh_mmcif_writel(host->addr, MMCIF_CE_BLOCK_SET, 0);
                sh_mmcif_writel(host->addr, MMCIF_CE_BLOCK_SET,
                                mrq->data->blksz);
        }
 -      opc = sh_mmcif_set_cmd(host, mrq, cmd, opc);
 +      opc = sh_mmcif_set_cmd(host, mrq);
  
        sh_mmcif_writel(host->addr, MMCIF_CE_INT, 0xD80430C0);
        sh_mmcif_writel(host->addr, MMCIF_CE_INT_MASK, mask);
        /* set cmd */
        sh_mmcif_writel(host->addr, MMCIF_CE_CMD_SET, opc);
  
 -      time = wait_for_completion_interruptible_timeout(&host->intr_wait,
 -              host->timeout);
 -      if (time <= 0) {
 -              cmd->error = sh_mmcif_error_manage(host);
 -              return;
 -      }
 -      if (host->sd_error) {
 -              switch (cmd->opcode) {
 -              case MMC_ALL_SEND_CID:
 -              case MMC_SELECT_CARD:
 -              case MMC_APP_CMD:
 -                      cmd->error = -ETIMEDOUT;
 -                      break;
 -              default:
 -                      dev_dbg(&host->pd->dev, "Cmd(d'%d) err\n",
 -                                      cmd->opcode);
 -                      cmd->error = sh_mmcif_error_manage(host);
 -                      break;
 -              }
 -              host->sd_error = false;
 -              return;
 -      }
 -      if (!(cmd->flags & MMC_RSP_PRESENT)) {
 -              cmd->error = 0;
 -              return;
 -      }
 -      sh_mmcif_get_response(host, cmd);
 -      if (host->data) {
 -              if (!host->dma_active) {
 -                      ret = sh_mmcif_data_trans(host, mrq, cmd->opcode);
 -              } else {
 -                      long time =
 -                              wait_for_completion_interruptible_timeout(&host->dma_complete,
 -                                                                        host->timeout);
 -                      if (!time)
 -                              ret = -ETIMEDOUT;
 -                      else if (time < 0)
 -                              ret = time;
 -                      sh_mmcif_bitclr(host, MMCIF_CE_BUF_ACC,
 -                                      BUF_ACC_DMAREN | BUF_ACC_DMAWEN);
 -                      host->dma_active = false;
 -              }
 -              if (ret < 0)
 -                      mrq->data->bytes_xfered = 0;
 -              else
 -                      mrq->data->bytes_xfered =
 -                              mrq->data->blocks * mrq->data->blksz;
 -      }
 -      cmd->error = ret;
 +      host->wait_for = MMCIF_WAIT_FOR_CMD;
 +      schedule_delayed_work(&host->timeout_work, host->timeout);
  }
  
  static void sh_mmcif_stop_cmd(struct sh_mmcif_host *host,
 -              struct mmc_request *mrq, struct mmc_command *cmd)
 +                            struct mmc_request *mrq)
  {
 -      long time;
 -
 -      if (mrq->cmd->opcode == MMC_READ_MULTIPLE_BLOCK)
 +      switch (mrq->cmd->opcode) {
 +      case MMC_READ_MULTIPLE_BLOCK:
                sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MCMD12DRE);
 -      else if (mrq->cmd->opcode == MMC_WRITE_MULTIPLE_BLOCK)
 +              break;
 +      case MMC_WRITE_MULTIPLE_BLOCK:
                sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MCMD12RBE);
 -      else {
 +              break;
 +      default:
                dev_err(&host->pd->dev, "unsupported stop cmd\n");
 -              cmd->error = sh_mmcif_error_manage(host);
 +              mrq->stop->error = sh_mmcif_error_manage(host);
                return;
        }
  
 -      time = wait_for_completion_interruptible_timeout(&host->intr_wait,
 -                      host->timeout);
 -      if (time <= 0 || host->sd_error) {
 -              cmd->error = sh_mmcif_error_manage(host);
 -              return;
 -      }
 -      sh_mmcif_get_cmd12response(host, cmd);
 -      cmd->error = 0;
 +      host->wait_for = MMCIF_WAIT_FOR_STOP;
 +      schedule_delayed_work(&host->timeout_work, host->timeout);
  }
  
  static void sh_mmcif_request(struct mmc_host *mmc, struct mmc_request *mrq)
        default:
                break;
        }
 -      host->data = mrq->data;
 -      if (mrq->data) {
 -              if (mrq->data->flags & MMC_DATA_READ) {
 -                      if (host->chan_rx)
 -                              sh_mmcif_start_dma_rx(host);
 -              } else {
 -                      if (host->chan_tx)
 -                              sh_mmcif_start_dma_tx(host);
 -              }
 -      }
 -      sh_mmcif_start_cmd(host, mrq, mrq->cmd);
 -      host->data = NULL;
  
 -      if (!mrq->cmd->error && mrq->stop)
 -              sh_mmcif_stop_cmd(host, mrq, mrq->stop);
 -      host->state = STATE_IDLE;
 -      mmc_request_done(mmc, mrq);
 +      host->mrq = mrq;
 +
 +      sh_mmcif_start_cmd(host, mrq);
  }
  
  static void sh_mmcif_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
                if (host->power) {
                        pm_runtime_put(&host->pd->dev);
                        host->power = false;
 -                      if (p->down_pwr)
 +                      if (p->down_pwr && ios->power_mode == MMC_POWER_OFF)
                                p->down_pwr(host->pd);
                }
                host->state = STATE_IDLE;
@@@ -988,156 -947,9 +988,156 @@@ static struct mmc_host_ops sh_mmcif_op
        .get_cd         = sh_mmcif_get_cd,
  };
  
 -static void sh_mmcif_detect(struct mmc_host *mmc)
 +static bool sh_mmcif_end_cmd(struct sh_mmcif_host *host)
  {
 -      mmc_detect_change(mmc, 0);
 +      struct mmc_command *cmd = host->mrq->cmd;
 +      struct mmc_data *data = host->mrq->data;
 +      long time;
 +
 +      if (host->sd_error) {
 +              switch (cmd->opcode) {
 +              case MMC_ALL_SEND_CID:
 +              case MMC_SELECT_CARD:
 +              case MMC_APP_CMD:
 +                      cmd->error = -ETIMEDOUT;
 +                      host->sd_error = false;
 +                      break;
 +              default:
 +                      cmd->error = sh_mmcif_error_manage(host);
 +                      dev_dbg(&host->pd->dev, "Cmd(d'%d) error %d\n",
 +                              cmd->opcode, cmd->error);
 +                      break;
 +              }
 +              return false;
 +      }
 +      if (!(cmd->flags & MMC_RSP_PRESENT)) {
 +              cmd->error = 0;
 +              return false;
 +      }
 +
 +      sh_mmcif_get_response(host, cmd);
 +
 +      if (!data)
 +              return false;
 +
 +      if (data->flags & MMC_DATA_READ) {
 +              if (host->chan_rx)
 +                      sh_mmcif_start_dma_rx(host);
 +      } else {
 +              if (host->chan_tx)
 +                      sh_mmcif_start_dma_tx(host);
 +      }
 +
 +      if (!host->dma_active) {
 +              data->error = sh_mmcif_data_trans(host, host->mrq, cmd->opcode);
 +              if (!data->error)
 +                      return true;
 +              return false;
 +      }
 +
 +      /* Running in the IRQ thread, can sleep */
 +      time = wait_for_completion_interruptible_timeout(&host->dma_complete,
 +                                                       host->timeout);
 +      if (host->sd_error) {
 +              dev_err(host->mmc->parent,
 +                      "Error IRQ while waiting for DMA completion!\n");
 +              /* Woken up by an error IRQ: abort DMA */
 +              if (data->flags & MMC_DATA_READ)
 +                      dmaengine_terminate_all(host->chan_rx);
 +              else
 +                      dmaengine_terminate_all(host->chan_tx);
 +              data->error = sh_mmcif_error_manage(host);
 +      } else if (!time) {
 +              data->error = -ETIMEDOUT;
 +      } else if (time < 0) {
 +              data->error = time;
 +      }
 +      sh_mmcif_bitclr(host, MMCIF_CE_BUF_ACC,
 +                      BUF_ACC_DMAREN | BUF_ACC_DMAWEN);
 +      host->dma_active = false;
 +
 +      if (data->error)
 +              data->bytes_xfered = 0;
 +
 +      return false;
 +}
 +
 +static irqreturn_t sh_mmcif_irqt(int irq, void *dev_id)
 +{
 +      struct sh_mmcif_host *host = dev_id;
 +      struct mmc_request *mrq = host->mrq;
 +      struct mmc_data *data = mrq->data;
 +
 +      cancel_delayed_work_sync(&host->timeout_work);
 +
 +      /*
 +       * All handlers return true, if processing continues, and false, if the
 +       * request has to be completed - successfully or not
 +       */
 +      switch (host->wait_for) {
 +      case MMCIF_WAIT_FOR_REQUEST:
 +              /* We're too late, the timeout has already kicked in */
 +              return IRQ_HANDLED;
 +      case MMCIF_WAIT_FOR_CMD:
 +              if (sh_mmcif_end_cmd(host))
 +                      /* Wait for data */
 +                      return IRQ_HANDLED;
 +              break;
 +      case MMCIF_WAIT_FOR_MREAD:
 +              if (sh_mmcif_mread_block(host))
 +                      /* Wait for more data */
 +                      return IRQ_HANDLED;
 +              break;
 +      case MMCIF_WAIT_FOR_READ:
 +              if (sh_mmcif_read_block(host))
 +                      /* Wait for data end */
 +                      return IRQ_HANDLED;
 +              break;
 +      case MMCIF_WAIT_FOR_MWRITE:
 +              if (sh_mmcif_mwrite_block(host))
 +                      /* Wait data to write */
 +                      return IRQ_HANDLED;
 +              break;
 +      case MMCIF_WAIT_FOR_WRITE:
 +              if (sh_mmcif_write_block(host))
 +                      /* Wait for data end */
 +                      return IRQ_HANDLED;
 +              break;
 +      case MMCIF_WAIT_FOR_STOP:
 +              if (host->sd_error) {
 +                      mrq->stop->error = sh_mmcif_error_manage(host);
 +                      break;
 +              }
 +              sh_mmcif_get_cmd12response(host, mrq->stop);
 +              mrq->stop->error = 0;
 +              break;
 +      case MMCIF_WAIT_FOR_READ_END:
 +      case MMCIF_WAIT_FOR_WRITE_END:
 +              if (host->sd_error)
 +                      data->error = sh_mmcif_error_manage(host);
 +              break;
 +      default:
 +              BUG();
 +      }
 +
 +      if (host->wait_for != MMCIF_WAIT_FOR_STOP) {
 +              if (!mrq->cmd->error && data && !data->error)
 +                      data->bytes_xfered =
 +                              data->blocks * data->blksz;
 +
 +              if (mrq->stop && !mrq->cmd->error && (!data || !data->error)) {
 +                      sh_mmcif_stop_cmd(host, mrq);
 +                      if (!mrq->stop->error)
 +                              return IRQ_HANDLED;
 +              }
 +      }
 +
 +      host->wait_for = MMCIF_WAIT_FOR_REQUEST;
 +      host->state = STATE_IDLE;
 +      host->mrq = NULL;
 +      mmc_request_done(host->mmc, mrq);
 +
 +      return IRQ_HANDLED;
  }
  
  static irqreturn_t sh_mmcif_intr(int irq, void *dev_id)
  
        state = sh_mmcif_readl(host->addr, MMCIF_CE_INT);
  
 -      if (state & INT_RBSYE) {
 +      if (state & INT_ERR_STS) {
 +              /* error interrupts - process first */
 +              sh_mmcif_writel(host->addr, MMCIF_CE_INT, ~state);
 +              sh_mmcif_bitclr(host, MMCIF_CE_INT_MASK, state);
 +              err = 1;
 +      } else if (state & INT_RBSYE) {
                sh_mmcif_writel(host->addr, MMCIF_CE_INT,
                                ~(INT_RBSYE | INT_CRSPE));
                sh_mmcif_bitclr(host, MMCIF_CE_INT_MASK, MASK_MRBSYE);
                sh_mmcif_writel(host->addr, MMCIF_CE_INT,
                                ~(INT_CMD12RBE | INT_CMD12CRE));
                sh_mmcif_bitclr(host, MMCIF_CE_INT_MASK, MASK_MCMD12RBE);
 -      } else if (state & INT_ERR_STS) {
 -              /* err interrupts */
 -              sh_mmcif_writel(host->addr, MMCIF_CE_INT, ~state);
 -              sh_mmcif_bitclr(host, MMCIF_CE_INT_MASK, state);
 -              err = 1;
        } else {
                dev_dbg(&host->pd->dev, "Unsupported interrupt: 0x%x\n", state);
                sh_mmcif_writel(host->addr, MMCIF_CE_INT, ~state);
                host->sd_error = true;
                dev_dbg(&host->pd->dev, "int err state = %08x\n", state);
        }
 -      if (state & ~(INT_CMD12RBE | INT_CMD12CRE))
 -              complete(&host->intr_wait);
 -      else
 +      if (state & ~(INT_CMD12RBE | INT_CMD12CRE)) {
 +              if (!host->dma_active)
 +                      return IRQ_WAKE_THREAD;
 +              else if (host->sd_error)
 +                      mmcif_dma_complete(host);
 +      } else {
                dev_dbg(&host->pd->dev, "Unexpected IRQ 0x%x\n", state);
 +      }
  
        return IRQ_HANDLED;
  }
  
 +static void mmcif_timeout_work(struct work_struct *work)
 +{
 +      struct delayed_work *d = container_of(work, struct delayed_work, work);
 +      struct sh_mmcif_host *host = container_of(d, struct sh_mmcif_host, timeout_work);
 +      struct mmc_request *mrq = host->mrq;
 +
 +      if (host->dying)
 +              /* Don't run after mmc_remove_host() */
 +              return;
 +
 +      /*
 +       * Handle races with cancel_delayed_work(), unless
 +       * cancel_delayed_work_sync() is used
 +       */
 +      switch (host->wait_for) {
 +      case MMCIF_WAIT_FOR_CMD:
 +              mrq->cmd->error = sh_mmcif_error_manage(host);
 +              break;
 +      case MMCIF_WAIT_FOR_STOP:
 +              mrq->stop->error = sh_mmcif_error_manage(host);
 +              break;
 +      case MMCIF_WAIT_FOR_MREAD:
 +      case MMCIF_WAIT_FOR_MWRITE:
 +      case MMCIF_WAIT_FOR_READ:
 +      case MMCIF_WAIT_FOR_WRITE:
 +      case MMCIF_WAIT_FOR_READ_END:
 +      case MMCIF_WAIT_FOR_WRITE_END:
 +              mrq->data->error = sh_mmcif_error_manage(host);
 +              break;
 +      default:
 +              BUG();
 +      }
 +
 +      host->state = STATE_IDLE;
 +      host->wait_for = MMCIF_WAIT_FOR_REQUEST;
 +      host->mrq = NULL;
 +      mmc_request_done(host->mmc, mrq);
 +}
 +
  static int __devinit sh_mmcif_probe(struct platform_device *pdev)
  {
        int ret = 0, irq[2];
        host->clk = clk_get_rate(host->hclk);
        host->pd = pdev;
  
 -      init_completion(&host->intr_wait);
        spin_lock_init(&host->lock);
  
        mmc->ops = &sh_mmcif_ops;
  
        sh_mmcif_writel(host->addr, MMCIF_CE_INT_MASK, MASK_ALL);
  
 -      ret = request_irq(irq[0], sh_mmcif_intr, 0, "sh_mmc:error", host);
 +      ret = request_threaded_irq(irq[0], sh_mmcif_intr, sh_mmcif_irqt, 0, "sh_mmc:error", host);
        if (ret) {
                dev_err(&pdev->dev, "request_irq error (sh_mmc:error)\n");
                goto clean_up3;
        }
 -      ret = request_irq(irq[1], sh_mmcif_intr, 0, "sh_mmc:int", host);
 +      ret = request_threaded_irq(irq[1], sh_mmcif_intr, sh_mmcif_irqt, 0, "sh_mmc:int", host);
        if (ret) {
                free_irq(irq[0], host);
                dev_err(&pdev->dev, "request_irq error (sh_mmc:int)\n");
                goto clean_up3;
        }
  
 -      sh_mmcif_detect(host->mmc);
 +      INIT_DELAYED_WORK(&host->timeout_work, mmcif_timeout_work);
 +
 +      mmc_detect_change(host->mmc, 0);
  
        dev_info(&pdev->dev, "driver version %s\n", DRIVER_VERSION);
        dev_dbg(&pdev->dev, "chip ver H'%04x\n",
@@@ -1371,19 -1139,11 +1371,19 @@@ static int __devexit sh_mmcif_remove(st
        struct sh_mmcif_host *host = platform_get_drvdata(pdev);
        int irq[2];
  
 +      host->dying = true;
        pm_runtime_get_sync(&pdev->dev);
  
        mmc_remove_host(host->mmc);
        sh_mmcif_writel(host->addr, MMCIF_CE_INT_MASK, MASK_ALL);
  
 +      /*
 +       * FIXME: cancel_delayed_work(_sync)() and free_irq() race with the
 +       * mmc_remove_host() call above. But swapping order doesn't help either
 +       * (a query on the linux-mmc mailing list didn't bring any replies).
 +       */
 +      cancel_delayed_work_sync(&host->timeout_work);
 +
        if (host->addr)
                iounmap(host->addr);
  
@@@ -1446,7 -1206,19 +1446,7 @@@ static struct platform_driver sh_mmcif_
        },
  };
  
 -static int __init sh_mmcif_init(void)
 -{
 -      return platform_driver_register(&sh_mmcif_driver);
 -}
 -
 -static void __exit sh_mmcif_exit(void)
 -{
 -      platform_driver_unregister(&sh_mmcif_driver);
 -}
 -
 -module_init(sh_mmcif_init);
 -module_exit(sh_mmcif_exit);
 -
 +module_platform_driver(sh_mmcif_driver);
  
  MODULE_DESCRIPTION("SuperH on-chip MMC/eMMC interface driver");
  MODULE_LICENSE("GPL");
index 2a56fc6f399a871d2794445324a920eff5a0b228,c4c4d6d89cd53c1579069ae6b18e85bb1026ff0b..7f680420bfab609f7490c7fa4237271f567cdf56
@@@ -126,7 -126,7 +126,7 @@@ int gpmi_init(struct gpmi_nand_data *th
        struct resources *r = &this->resources;
        int ret;
  
 -      ret = clk_enable(r->clock);
 +      ret = clk_prepare_enable(r->clock);
        if (ret)
                goto err_out;
        ret = gpmi_reset_block(r->gpmi_regs, false);
        /* Select BCH ECC. */
        writel(BM_GPMI_CTRL1_BCH_MODE, r->gpmi_regs + HW_GPMI_CTRL1_SET);
  
 -      clk_disable(r->clock);
 +      clk_disable_unprepare(r->clock);
        return 0;
  err_out:
        return ret;
@@@ -202,7 -202,7 +202,7 @@@ int bch_set_geometry(struct gpmi_nand_d
        ecc_strength  = bch_geo->ecc_strength >> 1;
        page_size     = bch_geo->page_size;
  
 -      ret = clk_enable(r->clock);
 +      ret = clk_prepare_enable(r->clock);
        if (ret)
                goto err_out;
  
        writel(BM_BCH_CTRL_COMPLETE_IRQ_EN,
                                r->bch_regs + HW_BCH_CTRL_SET);
  
 -      clk_disable(r->clock);
 +      clk_disable_unprepare(r->clock);
        return 0;
  err_out:
        return ret;
@@@ -704,7 -704,7 +704,7 @@@ void gpmi_begin(struct gpmi_nand_data *
        int ret;
  
        /* Enable the clock. */
 -      ret = clk_enable(r->clock);
 +      ret = clk_prepare_enable(r->clock);
        if (ret) {
                pr_err("We failed in enable the clk\n");
                goto err_out;
@@@ -773,7 -773,7 +773,7 @@@ err_out
  void gpmi_end(struct gpmi_nand_data *this)
  {
        struct resources *r = &this->resources;
 -      clk_disable(r->clock);
 +      clk_disable_unprepare(r->clock);
  }
  
  /* Clears a BCH interrupt. */
@@@ -827,7 -827,7 +827,7 @@@ int gpmi_send_command(struct gpmi_nand_
        pio[1] = pio[2] = 0;
        desc = channel->device->device_prep_slave_sg(channel,
                                        (struct scatterlist *)pio,
-                                       ARRAY_SIZE(pio), DMA_NONE, 0);
+                                       ARRAY_SIZE(pio), DMA_TRANS_NONE, 0);
        if (!desc) {
                pr_err("step 1 error\n");
                return -1;
        sg_init_one(sgl, this->cmd_buffer, this->command_length);
        dma_map_sg(this->dev, sgl, 1, DMA_TO_DEVICE);
        desc = channel->device->device_prep_slave_sg(channel,
-                                       sgl, 1, DMA_TO_DEVICE, 1);
+                                       sgl, 1, DMA_MEM_TO_DEV, 1);
        if (!desc) {
                pr_err("step 2 error\n");
                return -1;
@@@ -872,7 -872,7 +872,7 @@@ int gpmi_send_data(struct gpmi_nand_dat
        pio[1] = 0;
        desc = channel->device->device_prep_slave_sg(channel,
                                        (struct scatterlist *)pio,
-                                       ARRAY_SIZE(pio), DMA_NONE, 0);
+                                       ARRAY_SIZE(pio), DMA_TRANS_NONE, 0);
        if (!desc) {
                pr_err("step 1 error\n");
                return -1;
        /* [2] send DMA request */
        prepare_data_dma(this, DMA_TO_DEVICE);
        desc = channel->device->device_prep_slave_sg(channel, &this->data_sgl,
-                                               1, DMA_TO_DEVICE, 1);
+                                               1, DMA_MEM_TO_DEV, 1);
        if (!desc) {
                pr_err("step 2 error\n");
                return -1;
@@@ -908,7 -908,7 +908,7 @@@ int gpmi_read_data(struct gpmi_nand_dat
        pio[1] = 0;
        desc = channel->device->device_prep_slave_sg(channel,
                                        (struct scatterlist *)pio,
-                                       ARRAY_SIZE(pio), DMA_NONE, 0);
+                                       ARRAY_SIZE(pio), DMA_TRANS_NONE, 0);
        if (!desc) {
                pr_err("step 1 error\n");
                return -1;
        /* [2] : send DMA request */
        prepare_data_dma(this, DMA_FROM_DEVICE);
        desc = channel->device->device_prep_slave_sg(channel, &this->data_sgl,
-                                               1, DMA_FROM_DEVICE, 1);
+                                               1, DMA_DEV_TO_MEM, 1);
        if (!desc) {
                pr_err("step 2 error\n");
                return -1;
@@@ -964,7 -964,7 +964,7 @@@ int gpmi_send_page(struct gpmi_nand_dat
  
        desc = channel->device->device_prep_slave_sg(channel,
                                        (struct scatterlist *)pio,
-                                       ARRAY_SIZE(pio), DMA_NONE, 0);
+                                       ARRAY_SIZE(pio), DMA_TRANS_NONE, 0);
        if (!desc) {
                pr_err("step 2 error\n");
                return -1;
@@@ -998,7 -998,8 +998,8 @@@ int gpmi_read_page(struct gpmi_nand_dat
                | BF_GPMI_CTRL0_XFER_COUNT(0);
        pio[1] = 0;
        desc = channel->device->device_prep_slave_sg(channel,
-                               (struct scatterlist *)pio, 2, DMA_NONE, 0);
+                               (struct scatterlist *)pio, 2,
+                               DMA_TRANS_NONE, 0);
        if (!desc) {
                pr_err("step 1 error\n");
                return -1;
        pio[5] = auxiliary;
        desc = channel->device->device_prep_slave_sg(channel,
                                        (struct scatterlist *)pio,
-                                       ARRAY_SIZE(pio), DMA_NONE, 1);
+                                       ARRAY_SIZE(pio), DMA_TRANS_NONE, 1);
        if (!desc) {
                pr_err("step 2 error\n");
                return -1;
                | BF_GPMI_CTRL0_XFER_COUNT(geo->page_size);
        pio[1] = 0;
        desc = channel->device->device_prep_slave_sg(channel,
-                               (struct scatterlist *)pio, 2, DMA_NONE, 1);
+                               (struct scatterlist *)pio, 2,
+                               DMA_TRANS_NONE, 1);
        if (!desc) {
                pr_err("step 3 error\n");
                return -1;
index 75ec87a822b8e2d1ee12486bc6cfcbf0f3e0a248,de9f2e205962bd96304ef2c20efcf0fcb447b434..0a85690a1321ecc17cf24f2398f496d60dc8d175
@@@ -459,7 -459,7 +459,7 @@@ static int ks8842_tx_frame_dma(struct s
                sg_dma_len(&ctl->sg) += 4 - sg_dma_len(&ctl->sg) % 4;
  
        ctl->adesc = ctl->chan->device->device_prep_slave_sg(ctl->chan,
-               &ctl->sg, 1, DMA_TO_DEVICE,
+               &ctl->sg, 1, DMA_MEM_TO_DEV,
                DMA_PREP_INTERRUPT | DMA_COMPL_SKIP_SRC_UNMAP);
        if (!ctl->adesc)
                return NETDEV_TX_BUSY;
@@@ -571,7 -571,7 +571,7 @@@ static int __ks8842_start_new_rx_dma(st
                sg_dma_len(sg) = DMA_BUFFER_SIZE;
  
                ctl->adesc = ctl->chan->device->device_prep_slave_sg(ctl->chan,
-                       sg, 1, DMA_FROM_DEVICE,
+                       sg, 1, DMA_DEV_TO_MEM,
                        DMA_PREP_INTERRUPT | DMA_COMPL_SKIP_SRC_UNMAP);
  
                if (!ctl->adesc)
@@@ -1264,7 -1264,18 +1264,7 @@@ static struct platform_driver ks8842_pl
        .remove         = ks8842_remove,
  };
  
 -static int __init ks8842_init(void)
 -{
 -      return platform_driver_register(&ks8842_platform_driver);
 -}
 -
 -static void __exit ks8842_exit(void)
 -{
 -      platform_driver_unregister(&ks8842_platform_driver);
 -}
 -
 -module_init(ks8842_init);
 -module_exit(ks8842_exit);
 +module_platform_driver(ks8842_platform_driver);
  
  MODULE_DESCRIPTION("Timberdale KS8842 ethernet driver");
  MODULE_AUTHOR("Mocean Laboratories <info@mocean-labs.com>");
diff --combined drivers/spi/spi-pl022.c
index f1f5efbc3404aefc4aa68dba8ded5a4c72275bdc,95400fa99d900e345781a027c8a4517558604afa..2f9cb43a239870b6db396b8507fb6a67893f1f37
@@@ -340,10 -340,6 +340,10 @@@ struct vendor_data 
   * @cur_msg: Pointer to current spi_message being processed
   * @cur_transfer: Pointer to current spi_transfer
   * @cur_chip: pointer to current clients chip(assigned from controller_state)
 + * @next_msg_cs_active: the next message in the queue has been examined
 + *  and it was found that it uses the same chip select as the previous
 + *  message, so we left it active after the previous transfer, and it's
 + *  active already.
   * @tx: current position in TX buffer to be read
   * @tx_end: end position in TX buffer to be read
   * @rx: current position in RX buffer to be written
@@@ -377,7 -373,6 +377,7 @@@ struct pl022 
        struct spi_message              *cur_msg;
        struct spi_transfer             *cur_transfer;
        struct chip_data                *cur_chip;
 +      bool                            next_msg_cs_active;
        void                            *tx;
        void                            *tx_end;
        void                            *rx;
@@@ -450,9 -445,23 +450,9 @@@ static void giveback(struct pl022 *pl02
        struct spi_transfer *last_transfer;
        unsigned long flags;
        struct spi_message *msg;
 -      void (*curr_cs_control) (u32 command);
 +      pl022->next_msg_cs_active = false;
  
 -      /*
 -       * This local reference to the chip select function
 -       * is needed because we set curr_chip to NULL
 -       * as a step toward termininating the message.
 -       */
 -      curr_cs_control = pl022->cur_chip->cs_control;
 -      spin_lock_irqsave(&pl022->queue_lock, flags);
 -      msg = pl022->cur_msg;
 -      pl022->cur_msg = NULL;
 -      pl022->cur_transfer = NULL;
 -      pl022->cur_chip = NULL;
 -      queue_work(pl022->workqueue, &pl022->pump_messages);
 -      spin_unlock_irqrestore(&pl022->queue_lock, flags);
 -
 -      last_transfer = list_entry(msg->transfers.prev,
 +      last_transfer = list_entry(pl022->cur_msg->transfers.prev,
                                        struct spi_transfer,
                                        transfer_list);
  
                 */
                udelay(last_transfer->delay_usecs);
  
 -      /*
 -       * Drop chip select UNLESS cs_change is true or we are returning
 -       * a message with an error, or next message is for another chip
 -       */
 -      if (!last_transfer->cs_change)
 -              curr_cs_control(SSP_CHIP_DESELECT);
 -      else {
 +      if (!last_transfer->cs_change) {
                struct spi_message *next_msg;
  
 -              /* Holding of cs was hinted, but we need to make sure
 -               * the next message is for the same chip.  Don't waste
 -               * time with the following tests unless this was hinted.
 +              /*
 +               * cs_change was not set. We can keep the chip select
 +               * enabled if there is message in the queue and it is
 +               * for the same spi device.
                 *
                 * We cannot postpone this until pump_messages, because
                 * after calling msg->complete (below) the driver that
                                        struct spi_message, queue);
                spin_unlock_irqrestore(&pl022->queue_lock, flags);
  
 -              /* see if the next and current messages point
 -               * to the same chip
 +              /*
 +               * see if the next and current messages point
 +               * to the same spi device.
                 */
 -              if (next_msg && next_msg->spi != msg->spi)
 +              if (next_msg && next_msg->spi != pl022->cur_msg->spi)
                        next_msg = NULL;
 -              if (!next_msg || msg->state == STATE_ERROR)
 -                      curr_cs_control(SSP_CHIP_DESELECT);
 +              if (!next_msg || pl022->cur_msg->state == STATE_ERROR)
 +                      pl022->cur_chip->cs_control(SSP_CHIP_DESELECT);
 +              else
 +                      pl022->next_msg_cs_active = true;
        }
 +
 +      spin_lock_irqsave(&pl022->queue_lock, flags);
 +      msg = pl022->cur_msg;
 +      pl022->cur_msg = NULL;
 +      pl022->cur_transfer = NULL;
 +      pl022->cur_chip = NULL;
 +      queue_work(pl022->workqueue, &pl022->pump_messages);
 +      spin_unlock_irqrestore(&pl022->queue_lock, flags);
 +
        msg->state = NULL;
        if (msg->complete)
                msg->complete(msg->context);
 -      /* This message is completed, so let's turn off the clocks & power */
 -      pm_runtime_put(&pl022->adev->dev);
  }
  
  /**
@@@ -900,11 -904,11 +900,11 @@@ static int configure_dma(struct pl022 *
  {
        struct dma_slave_config rx_conf = {
                .src_addr = SSP_DR(pl022->phybase),
-               .direction = DMA_FROM_DEVICE,
+               .direction = DMA_DEV_TO_MEM,
        };
        struct dma_slave_config tx_conf = {
                .dst_addr = SSP_DR(pl022->phybase),
-               .direction = DMA_TO_DEVICE,
+               .direction = DMA_MEM_TO_DEV,
        };
        unsigned int pages;
        int ret;
        rxdesc = rxchan->device->device_prep_slave_sg(rxchan,
                                      pl022->sgt_rx.sgl,
                                      rx_sglen,
-                                     DMA_FROM_DEVICE,
+                                     DMA_DEV_TO_MEM,
                                      DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        if (!rxdesc)
                goto err_rxdesc;
        txdesc = txchan->device->device_prep_slave_sg(txchan,
                                      pl022->sgt_tx.sgl,
                                      tx_sglen,
-                                     DMA_TO_DEVICE,
+                                     DMA_MEM_TO_DEV,
                                      DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        if (!txdesc)
                goto err_txdesc;
@@@ -1240,9 -1244,9 +1240,9 @@@ static irqreturn_t pl022_interrupt_hand
  
        if ((pl022->tx == pl022->tx_end) && (flag == 0)) {
                flag = 1;
 -              /* Disable Transmit interrupt */
 -              writew(readw(SSP_IMSC(pl022->virtbase)) &
 -                     (~SSP_IMSC_MASK_TXIM),
 +              /* Disable Transmit interrupt, enable receive interrupt */
 +              writew((readw(SSP_IMSC(pl022->virtbase)) &
 +                     ~SSP_IMSC_MASK_TXIM) | SSP_IMSC_MASK_RXIM,
                       SSP_IMSC(pl022->virtbase));
        }
  
@@@ -1348,7 -1352,7 +1348,7 @@@ static void pump_transfers(unsigned lon
                         */
                        udelay(previous->delay_usecs);
  
 -              /* Drop chip select only if cs_change is requested */
 +              /* Reselect chip select only if cs_change was requested */
                if (previous->cs_change)
                        pl022->cur_chip->cs_control(SSP_CHIP_SELECT);
        } else {
        }
  
  err_config_dma:
 -      writew(ENABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase));
 +      /* enable all interrupts except RX */
 +      writew(ENABLE_ALL_INTERRUPTS & ~SSP_IMSC_MASK_RXIM, SSP_IMSC(pl022->virtbase));
  }
  
  static void do_interrupt_dma_transfer(struct pl022 *pl022)
  {
 -      u32 irqflags = ENABLE_ALL_INTERRUPTS;
 +      /*
 +       * Default is to enable all interrupts except RX -
 +       * this will be enabled once TX is complete
 +       */
 +      u32 irqflags = ENABLE_ALL_INTERRUPTS & ~SSP_IMSC_MASK_RXIM;
 +
 +      /* Enable target chip, if not already active */
 +      if (!pl022->next_msg_cs_active)
 +              pl022->cur_chip->cs_control(SSP_CHIP_SELECT);
  
 -      /* Enable target chip */
 -      pl022->cur_chip->cs_control(SSP_CHIP_SELECT);
        if (set_up_next_transfer(pl022, pl022->cur_transfer)) {
                /* Error path */
                pl022->cur_msg->state = STATE_ERROR;
@@@ -1445,8 -1442,7 +1445,8 @@@ static void do_polling_transfer(struct 
                } else {
                        /* STATE_START */
                        message->state = STATE_RUNNING;
 -                      pl022->cur_chip->cs_control(SSP_CHIP_SELECT);
 +                      if (!pl022->next_msg_cs_active)
 +                              pl022->cur_chip->cs_control(SSP_CHIP_SELECT);
                }
  
                /* Configuration Changing Per Transfer */
@@@ -1508,28 -1504,14 +1508,28 @@@ static void pump_messages(struct work_s
        struct pl022 *pl022 =
                container_of(work, struct pl022, pump_messages);
        unsigned long flags;
 +      bool was_busy = false;
  
        /* Lock queue and check for queue work */
        spin_lock_irqsave(&pl022->queue_lock, flags);
        if (list_empty(&pl022->queue) || !pl022->running) {
 +              if (pl022->busy) {
 +                      /* nothing more to do - disable spi/ssp and power off */
 +                      writew((readw(SSP_CR1(pl022->virtbase)) &
 +                              (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase));
 +
 +                      if (pl022->master_info->autosuspend_delay > 0) {
 +                              pm_runtime_mark_last_busy(&pl022->adev->dev);
 +                              pm_runtime_put_autosuspend(&pl022->adev->dev);
 +                      } else {
 +                              pm_runtime_put(&pl022->adev->dev);
 +                      }
 +              }
                pl022->busy = false;
                spin_unlock_irqrestore(&pl022->queue_lock, flags);
                return;
        }
 +
        /* Make sure we are not already running a message */
        if (pl022->cur_msg) {
                spin_unlock_irqrestore(&pl022->queue_lock, flags);
            list_entry(pl022->queue.next, struct spi_message, queue);
  
        list_del_init(&pl022->cur_msg->queue);
 -      pl022->busy = true;
 +      if (pl022->busy)
 +              was_busy = true;
 +      else
 +              pl022->busy = true;
        spin_unlock_irqrestore(&pl022->queue_lock, flags);
  
        /* Initial message state */
  
        /* Setup the SPI using the per chip configuration */
        pl022->cur_chip = spi_get_ctldata(pl022->cur_msg->spi);
 -      /*
 -       * We enable the core voltage and clocks here, then the clocks
 -       * and core will be disabled when giveback() is called in each method
 -       * (poll/interrupt/DMA)
 -       */
 -      pm_runtime_get_sync(&pl022->adev->dev);
 +      if (!was_busy)
 +              /*
 +               * We enable the core voltage and clocks here, then the clocks
 +               * and core will be disabled when this workqueue is run again
 +               * and there is no more work to be done.
 +               */
 +              pm_runtime_get_sync(&pl022->adev->dev);
 +
        restore_state(pl022);
        flush(pl022);
  
@@@ -1605,7 -1582,6 +1605,7 @@@ static int start_queue(struct pl022 *pl
        pl022->cur_msg = NULL;
        pl022->cur_transfer = NULL;
        pl022->cur_chip = NULL;
 +      pl022->next_msg_cs_active = false;
        spin_unlock_irqrestore(&pl022->queue_lock, flags);
  
        queue_work(pl022->workqueue, &pl022->pump_messages);
@@@ -1905,7 -1881,7 +1905,7 @@@ static int pl022_setup(struct spi_devic
  {
        struct pl022_config_chip const *chip_info;
        struct chip_data *chip;
 -      struct ssp_clock_params clk_freq = {0, };
 +      struct ssp_clock_params clk_freq = { .cpsdvsr = 0, .scr = 0};
        int status = 0;
        struct pl022 *pl022 = spi_master_get_devdata(spi->master);
        unsigned int bits = spi->bits_per_word;
@@@ -2208,12 -2184,6 +2208,12 @@@ pl022_probe(struct amba_device *adev, c
                goto  err_clk_prep;
        }
  
 +      status = clk_enable(pl022->clk);
 +      if (status) {
 +              dev_err(&adev->dev, "could not enable SSP/SPI bus clock\n");
 +              goto err_no_clk_en;
 +      }
 +
        /* Disable SSP */
        writew((readw(SSP_CR1(pl022->virtbase)) & (~SSP_CR1_MASK_SSE)),
               SSP_CR1(pl022->virtbase));
        dev_dbg(dev, "probe succeeded\n");
  
        /* let runtime pm put suspend */
 -      pm_runtime_put(dev);
 +      if (platform_info->autosuspend_delay > 0) {
 +              dev_info(&adev->dev,
 +                      "will use autosuspend for runtime pm, delay %dms\n",
 +                      platform_info->autosuspend_delay);
 +              pm_runtime_set_autosuspend_delay(dev,
 +                      platform_info->autosuspend_delay);
 +              pm_runtime_use_autosuspend(dev);
 +              pm_runtime_put_autosuspend(dev);
 +      } else {
 +              pm_runtime_put(dev);
 +      }
        return 0;
  
   err_spi_register:
  
        free_irq(adev->irq[0], pl022);
   err_no_irq:
 +      clk_disable(pl022->clk);
 + err_no_clk_en:
        clk_unprepare(pl022->clk);
   err_clk_prep:
        clk_put(pl022->clk);
@@@ -2339,6 -2297,11 +2339,6 @@@ static int pl022_suspend(struct device 
                return status;
        }
  
 -      amba_vcore_enable(pl022->adev);
 -      amba_pclk_enable(pl022->adev);
 -      load_ssp_default_config(pl022);
 -      amba_pclk_disable(pl022->adev);
 -      amba_vcore_disable(pl022->adev);
        dev_dbg(dev, "suspended\n");
        return 0;
  }
@@@ -2461,8 -2424,6 +2461,8 @@@ static struct amba_id pl022_ids[] = 
        { 0, 0 },
  };
  
 +MODULE_DEVICE_TABLE(amba, pl022_ids);
 +
  static struct amba_driver pl022_driver = {
        .drv = {
                .name   = "ssp-pl022",
index 7086583b910708e80cf1b133187eb9be236ee4ff,99ec279bc46daaec1d9a9a4180e1923dcbae454d..2a6429d8c363e52b73430b9943716e273dc31438
@@@ -1,7 -1,7 +1,7 @@@
  /*
   * SPI bus driver for the Topcliff PCH used by Intel SoCs
   *
 - * Copyright (C) 2010 OKI SEMICONDUCTOR Co., LTD.
 + * Copyright (C) 2011 LAPIS Semiconductor Co., Ltd.
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
  #define PCH_CLOCK_HZ          50000000
  #define PCH_MAX_SPBR          1023
  
 -/* Definition for ML7213 by OKI SEMICONDUCTOR */
 +/* Definition for ML7213/ML7223/ML7831 by LAPIS Semiconductor */
  #define PCI_VENDOR_ID_ROHM            0x10DB
  #define PCI_DEVICE_ID_ML7213_SPI      0x802c
  #define PCI_DEVICE_ID_ML7223_SPI      0x800F
 +#define PCI_DEVICE_ID_ML7831_SPI      0x8816
  
  /*
   * Set the number of SPI instance max
   * Intel EG20T PCH :          1ch
 - * OKI SEMICONDUCTOR ML7213 IOH :     2ch
 - * OKI SEMICONDUCTOR ML7223 IOH :     1ch
 + * LAPIS Semiconductor ML7213 IOH :   2ch
 + * LAPIS Semiconductor ML7223 IOH :   1ch
 + * LAPIS Semiconductor ML7831 IOH :   1ch
  */
  #define PCH_SPI_MAX_DEV                       2
  
@@@ -220,7 -218,6 +220,7 @@@ static struct pci_device_id pch_spi_pci
        { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_GE_SPI),    1, },
        { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7213_SPI), 2, },
        { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7223_SPI), 1, },
 +      { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7831_SPI), 1, },
        { }
  };
  
@@@ -1079,7 -1076,7 +1079,7 @@@ static void pch_spi_handle_dma(struct p
        }
        sg = dma->sg_rx_p;
        desc_rx = dma->chan_rx->device->device_prep_slave_sg(dma->chan_rx, sg,
-                                       num, DMA_FROM_DEVICE,
+                                       num, DMA_DEV_TO_MEM,
                                        DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        if (!desc_rx) {
                dev_err(&data->master->dev, "%s:device_prep_slave_sg Failed\n",
        }
        sg = dma->sg_tx_p;
        desc_tx = dma->chan_tx->device->device_prep_slave_sg(dma->chan_tx,
-                                       sg, num, DMA_TO_DEVICE,
+                                       sg, num, DMA_MEM_TO_DEV,
                                        DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        if (!desc_tx) {
                dev_err(&data->master->dev, "%s:device_prep_slave_sg Failed\n",
@@@ -1756,4 -1753,4 +1756,4 @@@ MODULE_PARM_DESC(use_dma
                 "to use DMA for data transfers pass 1 else 0; default 1");
  
  MODULE_LICENSE("GPL");
 -MODULE_DESCRIPTION("Intel EG20T PCH/OKI SEMICONDUCTOR ML7xxx IOH SPI Driver");
 +MODULE_DESCRIPTION("Intel EG20T PCH/LAPIS Semiconductor ML7xxx IOH SPI Driver");
index 6958594f2fc09a4c35eb65ce6037f937b323251e,e4d5a21e1a63952263b6029a782cca6ea1cb8621..9ae024025ff356618221717d3fae6b5d296e32db
@@@ -268,7 -268,7 +268,7 @@@ static void pl011_dma_probe_initcall(st
        struct dma_slave_config tx_conf = {
                .dst_addr = uap->port.mapbase + UART01x_DR,
                .dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE,
-               .direction = DMA_TO_DEVICE,
+               .direction = DMA_MEM_TO_DEV,
                .dst_maxburst = uap->fifosize >> 1,
        };
        struct dma_chan *chan;
                struct dma_slave_config rx_conf = {
                        .src_addr = uap->port.mapbase + UART01x_DR,
                        .src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE,
-                       .direction = DMA_FROM_DEVICE,
+                       .direction = DMA_DEV_TO_MEM,
                        .src_maxburst = uap->fifosize >> 1,
                };
  
@@@ -480,7 -480,7 +480,7 @@@ static int pl011_dma_tx_refill(struct u
                return -EBUSY;
        }
  
-       desc = dma_dev->device_prep_slave_sg(chan, &dmatx->sg, 1, DMA_TO_DEVICE,
+       desc = dma_dev->device_prep_slave_sg(chan, &dmatx->sg, 1, DMA_MEM_TO_DEV,
                                             DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        if (!desc) {
                dma_unmap_sg(dma_dev->dev, &dmatx->sg, 1, DMA_TO_DEVICE);
@@@ -676,7 -676,7 +676,7 @@@ static int pl011_dma_rx_trigger_dma(str
                &uap->dmarx.sgbuf_b : &uap->dmarx.sgbuf_a;
        dma_dev = rxchan->device;
        desc = rxchan->device->device_prep_slave_sg(rxchan, &sgbuf->sg, 1,
-                                       DMA_FROM_DEVICE,
+                                       DMA_DEV_TO_MEM,
                                        DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        /*
         * If the DMA engine is busy and cannot prepare a
@@@ -1994,8 -1994,6 +1994,8 @@@ static struct amba_id pl011_ids[] = 
        { 0, 0 },
  };
  
 +MODULE_DEVICE_TABLE(amba, pl011_ids);
 +
  static struct amba_driver pl011_driver = {
        .drv = {
                .name   = "uart-pl011",
index de0f613ed6f56051df309abc3ad25ea804081006,6b8019c5b36d4736b3f3633f6290fa1adc1e0a19..17ae65762d1a465f83ae92d9e64128419c2e077c
@@@ -1,5 -1,5 +1,5 @@@
  /*
 - *Copyright (C) 2010 OKI SEMICONDUCTOR CO., LTD.
 + *Copyright (C) 2011 LAPIS Semiconductor Co., Ltd.
   *
   *This program is free software; you can redistribute it and/or modify
   *it under the terms of the GNU General Public License as published by
@@@ -25,9 -25,6 +25,9 @@@
  #include <linux/interrupt.h>
  #include <linux/io.h>
  #include <linux/dmi.h>
 +#include <linux/console.h>
 +#include <linux/nmi.h>
 +#include <linux/delay.h>
  
  #include <linux/dmaengine.h>
  #include <linux/pch_dma.h>
@@@ -49,8 -46,8 +49,8 @@@ enum 
  
  /* Set the max number of UART port
   * Intel EG20T PCH: 4 port
 - * OKI SEMICONDUCTOR ML7213 IOH: 3 port
 - * OKI SEMICONDUCTOR ML7223 IOH: 2 port
 + * LAPIS Semiconductor ML7213 IOH: 3 port
 + * LAPIS Semiconductor ML7223 IOH: 2 port
  */
  #define PCH_UART_NR   4
  
  
  #define PCI_VENDOR_ID_ROHM            0x10DB
  
 +#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
 +
 +#define DEFAULT_BAUD_RATE 1843200 /* 1.8432MHz */
 +
  struct pch_uart_buffer {
        unsigned char *buf;
        int size;
@@@ -265,8 -258,6 +265,8 @@@ enum pch_uart_num_t 
        pch_ml7213_uart2,
        pch_ml7223_uart0,
        pch_ml7223_uart1,
 +      pch_ml7831_uart0,
 +      pch_ml7831_uart1,
  };
  
  static struct pch_uart_driver_data drv_dat[] = {
        [pch_ml7213_uart2] = {PCH_UART_2LINE, 2},
        [pch_ml7223_uart0] = {PCH_UART_8LINE, 0},
        [pch_ml7223_uart1] = {PCH_UART_2LINE, 1},
 +      [pch_ml7831_uart0] = {PCH_UART_8LINE, 0},
 +      [pch_ml7831_uart1] = {PCH_UART_2LINE, 1},
  };
  
 +#ifdef CONFIG_SERIAL_PCH_UART_CONSOLE
 +static struct eg20t_port *pch_uart_ports[PCH_UART_NR];
 +#endif
  static unsigned int default_baud = 9600;
  static const int trigger_level_256[4] = { 1, 64, 128, 224 };
  static const int trigger_level_64[4] = { 1, 16, 32, 56 };
@@@ -642,7 -628,6 +642,7 @@@ static void pch_request_dma(struct uart
                dev_err(priv->port.dev, "%s:dma_request_channel FAILS(Rx)\n",
                        __func__);
                dma_release_channel(priv->chan_tx);
 +              priv->chan_tx = NULL;
                return;
        }
  
@@@ -764,7 -749,7 +764,7 @@@ static int dma_handle_rx(struct eg20t_p
        sg_dma_address(sg) = priv->rx_buf_dma;
  
        desc = priv->chan_rx->device->device_prep_slave_sg(priv->chan_rx,
-                       sg, 1, DMA_FROM_DEVICE,
+                       sg, 1, DMA_DEV_TO_MEM,
                        DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
  
        if (!desc)
@@@ -923,7 -908,7 +923,7 @@@ static unsigned int dma_handle_tx(struc
        }
  
        desc = priv->chan_tx->device->device_prep_slave_sg(priv->chan_tx,
-                                       priv->sg_tx_p, nent, DMA_TO_DEVICE,
+                                       priv->sg_tx_p, nent, DMA_MEM_TO_DEV,
                                        DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        if (!desc) {
                dev_err(priv->port.dev, "%s:device_prep_slave_sg Failed\n",
@@@ -1230,7 -1215,8 +1230,7 @@@ static void pch_uart_shutdown(struct ua
                dev_err(priv->port.dev,
                        "pch_uart_hal_set_fifo Failed(ret=%d)\n", ret);
  
 -      if (priv->use_dma_flag)
 -              pch_free_dma(port);
 +      pch_free_dma(port);
  
        free_irq(priv->port.irq, priv);
  }
@@@ -1294,7 -1280,6 +1294,7 @@@ static void pch_uart_set_termios(struc
        if (rtn)
                goto out;
  
 +      pch_uart_set_mctrl(&priv->port, priv->port.mctrl);
        /* Don't rewrite B0 */
        if (tty_termios_baud_rate(termios))
                tty_termios_encode_baud_rate(termios, baud, baud);
@@@ -1395,143 -1380,6 +1395,143 @@@ static struct uart_ops pch_uart_ops = 
        .verify_port = pch_uart_verify_port
  };
  
 +#ifdef CONFIG_SERIAL_PCH_UART_CONSOLE
 +
 +/*
 + *    Wait for transmitter & holding register to empty
 + */
 +static void wait_for_xmitr(struct eg20t_port *up, int bits)
 +{
 +      unsigned int status, tmout = 10000;
 +
 +      /* Wait up to 10ms for the character(s) to be sent. */
 +      for (;;) {
 +              status = ioread8(up->membase + UART_LSR);
 +
 +              if ((status & bits) == bits)
 +                      break;
 +              if (--tmout == 0)
 +                      break;
 +              udelay(1);
 +      }
 +
 +      /* Wait up to 1s for flow control if necessary */
 +      if (up->port.flags & UPF_CONS_FLOW) {
 +              unsigned int tmout;
 +              for (tmout = 1000000; tmout; tmout--) {
 +                      unsigned int msr = ioread8(up->membase + UART_MSR);
 +                      if (msr & UART_MSR_CTS)
 +                              break;
 +                      udelay(1);
 +                      touch_nmi_watchdog();
 +              }
 +      }
 +}
 +
 +static void pch_console_putchar(struct uart_port *port, int ch)
 +{
 +      struct eg20t_port *priv =
 +              container_of(port, struct eg20t_port, port);
 +
 +      wait_for_xmitr(priv, UART_LSR_THRE);
 +      iowrite8(ch, priv->membase + PCH_UART_THR);
 +}
 +
 +/*
 + *    Print a string to the serial port trying not to disturb
 + *    any possible real use of the port...
 + *
 + *    The console_lock must be held when we get here.
 + */
 +static void
 +pch_console_write(struct console *co, const char *s, unsigned int count)
 +{
 +      struct eg20t_port *priv;
 +
 +      unsigned long flags;
 +      u8 ier;
 +      int locked = 1;
 +
 +      priv = pch_uart_ports[co->index];
 +
 +      touch_nmi_watchdog();
 +
 +      local_irq_save(flags);
 +      if (priv->port.sysrq) {
 +              /* serial8250_handle_port() already took the lock */
 +              locked = 0;
 +      } else if (oops_in_progress) {
 +              locked = spin_trylock(&priv->port.lock);
 +      } else
 +              spin_lock(&priv->port.lock);
 +
 +      /*
 +       *      First save the IER then disable the interrupts
 +       */
 +      ier = ioread8(priv->membase + UART_IER);
 +
 +      pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_ALL_INT);
 +
 +      uart_console_write(&priv->port, s, count, pch_console_putchar);
 +
 +      /*
 +       *      Finally, wait for transmitter to become empty
 +       *      and restore the IER
 +       */
 +      wait_for_xmitr(priv, BOTH_EMPTY);
 +      iowrite8(ier, priv->membase + UART_IER);
 +
 +      if (locked)
 +              spin_unlock(&priv->port.lock);
 +      local_irq_restore(flags);
 +}
 +
 +static int __init pch_console_setup(struct console *co, char *options)
 +{
 +      struct uart_port *port;
 +      int baud = 9600;
 +      int bits = 8;
 +      int parity = 'n';
 +      int flow = 'n';
 +
 +      /*
 +       * Check whether an invalid uart number has been specified, and
 +       * if so, search for the first available port that does have
 +       * console support.
 +       */
 +      if (co->index >= PCH_UART_NR)
 +              co->index = 0;
 +      port = &pch_uart_ports[co->index]->port;
 +
 +      if (!port || (!port->iobase && !port->membase))
 +              return -ENODEV;
 +
 +      /* setup uartclock */
 +      port->uartclk = DEFAULT_BAUD_RATE;
 +
 +      if (options)
 +              uart_parse_options(options, &baud, &parity, &bits, &flow);
 +
 +      return uart_set_options(port, co, baud, parity, bits, flow);
 +}
 +
 +static struct uart_driver pch_uart_driver;
 +
 +static struct console pch_console = {
 +      .name           = PCH_UART_DRIVER_DEVICE,
 +      .write          = pch_console_write,
 +      .device         = uart_console_device,
 +      .setup          = pch_console_setup,
 +      .flags          = CON_PRINTBUFFER | CON_ANYTIME,
 +      .index          = -1,
 +      .data           = &pch_uart_driver,
 +};
 +
 +#define PCH_CONSOLE   (&pch_console)
 +#else
 +#define PCH_CONSOLE   NULL
 +#endif
 +
  static struct uart_driver pch_uart_driver = {
        .owner = THIS_MODULE,
        .driver_name = KBUILD_MODNAME,
        .major = 0,
        .minor = 0,
        .nr = PCH_UART_NR,
 +      .cons = PCH_CONSOLE,
  };
  
  static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev,
        if (!rxbuf)
                goto init_port_free_txbuf;
  
 -      base_baud = 1843200; /* 1.8432MHz */
 +      base_baud = DEFAULT_BAUD_RATE;
  
        /* quirk for CM-iTC board */
        board_name = dmi_get_system_info(DMI_BOARD_NAME);
        pci_set_drvdata(pdev, priv);
        pch_uart_hal_request(pdev, fifosize, base_baud);
  
 +#ifdef CONFIG_SERIAL_PCH_UART_CONSOLE
 +      pch_uart_ports[board->line_no] = priv;
 +#endif
        ret = uart_add_one_port(&pch_uart_driver, &priv->port);
        if (ret < 0)
                goto init_port_hal_free;
        return priv;
  
  init_port_hal_free:
 +#ifdef CONFIG_SERIAL_PCH_UART_CONSOLE
 +      pch_uart_ports[board->line_no] = NULL;
 +#endif
        free_page((unsigned long)rxbuf);
  init_port_free_txbuf:
        kfree(priv);
@@@ -1651,10 -1492,6 +1651,10 @@@ static void pch_uart_pci_remove(struct 
        priv = (struct eg20t_port *)pci_get_drvdata(pdev);
  
        pci_disable_msi(pdev);
 +
 +#ifdef CONFIG_SERIAL_PCH_UART_CONSOLE
 +      pch_uart_ports[priv->port.line] = NULL;
 +#endif
        pch_uart_exit_port(priv);
        pci_disable_device(pdev);
        kfree(priv);
@@@ -1715,10 -1552,6 +1715,10 @@@ static DEFINE_PCI_DEVICE_TABLE(pch_uart
         .driver_data = pch_ml7223_uart0},
        {PCI_DEVICE(PCI_VENDOR_ID_ROHM, 0x800D),
         .driver_data = pch_ml7223_uart1},
 +      {PCI_DEVICE(PCI_VENDOR_ID_ROHM, 0x8811),
 +       .driver_data = pch_ml7831_uart0},
 +      {PCI_DEVICE(PCI_VENDOR_ID_ROHM, 0x8812),
 +       .driver_data = pch_ml7831_uart1},
        {0,},
  };
  
index 9e62349b3d9f22cfeb59d2fcea49da4b068aac34,9900e8560452afaac369156c7694e0bff8db0c67..75085795528edd172568dedd2a82f5b160246029
@@@ -50,7 -50,6 +50,7 @@@
  #include <linux/dma-mapping.h>
  #include <linux/scatterlist.h>
  #include <linux/slab.h>
 +#include <linux/gpio.h>
  
  #ifdef CONFIG_SUPERH
  #include <asm/sh_bios.h>
@@@ -74,7 -73,6 +74,7 @@@ struct sci_port 
        struct clk              *fclk;
  
        char                    *irqstr[SCIx_NR_IRQS];
 +      char                    *gpiostr[SCIx_NR_FNS];
  
        struct dma_chan                 *chan_tx;
        struct dma_chan                 *chan_rx;
@@@ -208,25 -206,6 +208,25 @@@ static struct plat_sci_reg sci_regmap[S
                [SCLSR]         = sci_reg_invalid,
        },
  
 +      /*
 +       * Common SH-2(A) SCIF definitions for ports with FIFO data
 +       * count registers.
 +       */
 +      [SCIx_SH2_SCIF_FIFODATA_REGTYPE] = {
 +              [SCSMR]         = { 0x00, 16 },
 +              [SCBRR]         = { 0x04,  8 },
 +              [SCSCR]         = { 0x08, 16 },
 +              [SCxTDR]        = { 0x0c,  8 },
 +              [SCxSR]         = { 0x10, 16 },
 +              [SCxRDR]        = { 0x14,  8 },
 +              [SCFCR]         = { 0x18, 16 },
 +              [SCFDR]         = { 0x1c, 16 },
 +              [SCTFDR]        = sci_reg_invalid,
 +              [SCRFDR]        = sci_reg_invalid,
 +              [SCSPTR]        = { 0x20, 16 },
 +              [SCLSR]         = { 0x24, 16 },
 +      },
 +
        /*
         * Common SH-3 SCIF definitions.
         */
@@@ -476,15 -455,8 +476,15 @@@ static void sci_init_pins(struct uart_p
        if (!reg->size)
                return;
  
 -      if (!(cflag & CRTSCTS))
 -              sci_out(port, SCSPTR, 0x0080); /* Set RTS = 1 */
 +      if ((s->cfg->capabilities & SCIx_HAVE_RTSCTS) &&
 +          ((!(cflag & CRTSCTS)))) {
 +              unsigned short status;
 +
 +              status = sci_in(port, SCSPTR);
 +              status &= ~SCSPTR_CTSIO;
 +              status |= SCSPTR_RTSIO;
 +              sci_out(port, SCSPTR, status); /* Set RTS = 1 */
 +      }
  }
  
  static int sci_txfill(struct uart_port *port)
@@@ -630,7 -602,6 +630,7 @@@ static void sci_receive_chars(struct ua
                } else {
                        for (i = 0; i < count; i++) {
                                char c = sci_in(port, SCxRDR);
 +
                                status = sci_in(port, SCxSR);
  #if defined(CONFIG_CPU_SH3)
                                /* Skip "chars" during break */
                                /* Store data and status */
                                if (status & SCxSR_FER(port)) {
                                        flag = TTY_FRAME;
 +                                      port->icount.frame++;
                                        dev_notice(port->dev, "frame error\n");
                                } else if (status & SCxSR_PER(port)) {
                                        flag = TTY_PARITY;
 +                                      port->icount.parity++;
                                        dev_notice(port->dev, "parity error\n");
                                } else
                                        flag = TTY_NORMAL;
@@@ -735,8 -704,6 +735,8 @@@ static int sci_handle_errors(struct uar
         */
        if (s->cfg->overrun_bit != SCIx_NOT_SUPPORTED) {
                if (status & (1 << s->cfg->overrun_bit)) {
 +                      port->icount.overrun++;
 +
                        /* overrun error */
                        if (tty_insert_flip_char(tty, 0, TTY_OVERRUN))
                                copied++;
                        struct sci_port *sci_port = to_sci_port(port);
  
                        if (!sci_port->break_flag) {
 +                              port->icount.brk++;
 +
                                sci_port->break_flag = 1;
                                sci_schedule_break_timer(sci_port);
  
  
                } else {
                        /* frame error */
 +                      port->icount.frame++;
 +
                        if (tty_insert_flip_char(tty, 0, TTY_FRAME))
                                copied++;
  
  
        if (status & SCxSR_PER(port)) {
                /* parity error */
 +              port->icount.parity++;
 +
                if (tty_insert_flip_char(tty, 0, TTY_PARITY))
                        copied++;
  
@@@ -807,8 -768,6 +807,8 @@@ static int sci_handle_fifo_overrun(stru
        if ((sci_in(port, SCLSR) & (1 << s->cfg->overrun_bit))) {
                sci_out(port, SCLSR, 0);
  
 +              port->icount.overrun++;
 +
                tty_insert_flip_char(tty, 0, TTY_OVERRUN);
                tty_flip_buffer_push(tty);
  
@@@ -834,9 -793,6 +834,9 @@@ static int sci_handle_breaks(struct uar
                /* Debounce break */
                s->break_flag = 1;
  #endif
 +
 +              port->icount.brk++;
 +
                /* Notify of BREAK */
                if (tty_insert_flip_char(tty, 0, TTY_BREAK))
                        copied++;
@@@ -1107,67 -1063,6 +1107,67 @@@ static void sci_free_irq(struct sci_por
        }
  }
  
 +static const char *sci_gpio_names[SCIx_NR_FNS] = {
 +      "sck", "rxd", "txd", "cts", "rts",
 +};
 +
 +static const char *sci_gpio_str(unsigned int index)
 +{
 +      return sci_gpio_names[index];
 +}
 +
 +static void __devinit sci_init_gpios(struct sci_port *port)
 +{
 +      struct uart_port *up = &port->port;
 +      int i;
 +
 +      if (!port->cfg)
 +              return;
 +
 +      for (i = 0; i < SCIx_NR_FNS; i++) {
 +              const char *desc;
 +              int ret;
 +
 +              if (!port->cfg->gpios[i])
 +                      continue;
 +
 +              desc = sci_gpio_str(i);
 +
 +              port->gpiostr[i] = kasprintf(GFP_KERNEL, "%s:%s",
 +                                           dev_name(up->dev), desc);
 +
 +              /*
 +               * If we've failed the allocation, we can still continue
 +               * on with a NULL string.
 +               */
 +              if (!port->gpiostr[i])
 +                      dev_notice(up->dev, "%s string allocation failure\n",
 +                                 desc);
 +
 +              ret = gpio_request(port->cfg->gpios[i], port->gpiostr[i]);
 +              if (unlikely(ret != 0)) {
 +                      dev_notice(up->dev, "failed %s gpio request\n", desc);
 +
 +                      /*
 +                       * If we can't get the GPIO for whatever reason,
 +                       * no point in keeping the verbose string around.
 +                       */
 +                      kfree(port->gpiostr[i]);
 +              }
 +      }
 +}
 +
 +static void sci_free_gpios(struct sci_port *port)
 +{
 +      int i;
 +
 +      for (i = 0; i < SCIx_NR_FNS; i++)
 +              if (port->cfg->gpios[i]) {
 +                      gpio_free(port->cfg->gpios[i]);
 +                      kfree(port->gpiostr[i]);
 +              }
 +}
 +
  static unsigned int sci_tx_empty(struct uart_port *port)
  {
        unsigned short status = sci_in(port, SCxSR);
        return (status & SCxSR_TEND(port)) && !in_tx_fifo ? TIOCSER_TEMT : 0;
  }
  
 +/*
 + * Modem control is a bit of a mixed bag for SCI(F) ports. Generally
 + * CTS/RTS is supported in hardware by at least one port and controlled
 + * via SCSPTR (SCxPCR for SCIFA/B parts), or external pins (presently
 + * handled via the ->init_pins() op, which is a bit of a one-way street,
 + * lacking any ability to defer pin control -- this will later be
 + * converted over to the GPIO framework).
 + *
 + * Other modes (such as loopback) are supported generically on certain
 + * port types, but not others. For these it's sufficient to test for the
 + * existence of the support register and simply ignore the port type.
 + */
  static void sci_set_mctrl(struct uart_port *port, unsigned int mctrl)
  {
 -      /* This routine is used for seting signals of: DTR, DCD, CTS/RTS */
 -      /* We use SCIF's hardware for CTS/RTS, so don't need any for that. */
 -      /* If you have signals for DTR and DCD, please implement here. */
 +      if (mctrl & TIOCM_LOOP) {
 +              struct plat_sci_reg *reg;
 +
 +              /*
 +               * Standard loopback mode for SCFCR ports.
 +               */
 +              reg = sci_getreg(port, SCFCR);
 +              if (reg->size)
 +                      sci_out(port, SCFCR, sci_in(port, SCFCR) | 1);
 +      }
  }
  
  static unsigned int sci_get_mctrl(struct uart_port *port)
  {
 -      /* This routine is used for getting signals of: DTR, DCD, DSR, RI,
 -         and CTS/RTS */
 -
 -      return TIOCM_DTR | TIOCM_RTS | TIOCM_CTS | TIOCM_DSR;
 +      /*
 +       * CTS/RTS is handled in hardware when supported, while nothing
 +       * else is wired up. Keep it simple and simply assert DSR/CAR.
 +       */
 +      return TIOCM_DSR | TIOCM_CAR;
  }
  
  #ifdef CONFIG_SERIAL_SH_SCI_DMA
@@@ -1339,7 -1214,7 +1339,7 @@@ static void sci_submit_rx(struct sci_po
                struct dma_async_tx_descriptor *desc;
  
                desc = chan->device->device_prep_slave_sg(chan,
-                       sg, 1, DMA_FROM_DEVICE, DMA_PREP_INTERRUPT);
+                       sg, 1, DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT);
  
                if (desc) {
                        s->desc_rx[i] = desc;
@@@ -1454,7 -1329,7 +1454,7 @@@ static void work_fn_tx(struct work_stru
        BUG_ON(!sg_dma_len(sg));
  
        desc = chan->device->device_prep_slave_sg(chan,
-                       sg, s->sg_len_tx, DMA_TO_DEVICE,
+                       sg, s->sg_len_tx, DMA_MEM_TO_DEV,
                        DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        if (!desc) {
                /* switch to PIO */
@@@ -1555,17 -1430,12 +1555,17 @@@ static void sci_stop_rx(struct uart_por
  
  static void sci_enable_ms(struct uart_port *port)
  {
 -      /* Nothing here yet .. */
 +      /*
 +       * Not supported by hardware, always a nop.
 +       */
  }
  
  static void sci_break_ctl(struct uart_port *port, int break_state)
  {
 -      /* Nothing here yet .. */
 +      /*
 +       * Not supported by hardware. Most parts couple break and rx
 +       * interrupts together, with break detection always enabled.
 +       */
  }
  
  #ifdef CONFIG_SERIAL_SH_SCI_DMA
@@@ -1763,7 -1633,6 +1763,7 @@@ static unsigned int sci_scbrr_calc(unsi
  
  static void sci_reset(struct uart_port *port)
  {
 +      struct plat_sci_reg *reg;
        unsigned int status;
  
        do {
  
        sci_out(port, SCSCR, 0x00);     /* TE=0, RE=0, CKE1=0 */
  
 -      if (port->type != PORT_SCI)
 +      reg = sci_getreg(port, SCFCR);
 +      if (reg->size)
                sci_out(port, SCFCR, SCFCR_RFRST | SCFCR_TFRST);
  }
  
@@@ -1781,9 -1649,9 +1781,9 @@@ static void sci_set_termios(struct uart
                            struct ktermios *old)
  {
        struct sci_port *s = to_sci_port(port);
 +      struct plat_sci_reg *reg;
        unsigned int baud, smr_val, max_baud;
        int t = -1;
 -      u16 scfcr = 0;
  
        /*
         * earlyprintk comes here early on with port->uartclk set to zero.
        }
  
        sci_init_pins(port, termios->c_cflag);
 -      sci_out(port, SCFCR, scfcr | ((termios->c_cflag & CRTSCTS) ? SCFCR_MCE : 0));
 +
 +      reg = sci_getreg(port, SCFCR);
 +      if (reg->size) {
 +              unsigned short ctrl = sci_in(port, SCFCR);
 +
 +              if (s->cfg->capabilities & SCIx_HAVE_RTSCTS) {
 +                      if (termios->c_cflag & CRTSCTS)
 +                              ctrl |= SCFCR_MCE;
 +                      else
 +                              ctrl &= ~SCFCR_MCE;
 +              }
 +
 +              /*
 +               * As we've done a sci_reset() above, ensure we don't
 +               * interfere with the FIFOs while toggling MCE. As the
 +               * reset values could still be set, simply mask them out.
 +               */
 +              ctrl &= ~(SCFCR_RFRST | SCFCR_TFRST);
 +
 +              sci_out(port, SCFCR, ctrl);
 +      }
  
        sci_out(port, SCSCR, s->cfg->scscr);
  
@@@ -2025,8 -1873,6 +2025,8 @@@ static int __devinit sci_init_single(st
        struct uart_port *port = &sci_port->port;
        int ret;
  
 +      sci_port->cfg   = p;
 +
        port->ops       = &sci_uart_ops;
        port->iotype    = UPIO_MEM;
        port->line      = index;
  
                port->dev = &dev->dev;
  
 +              sci_init_gpios(sci_port);
 +
                pm_runtime_irq_safe(&dev->dev);
                pm_runtime_enable(&dev->dev);
        }
                p->error_mask |= (1 << p->overrun_bit);
        }
  
 -      sci_port->cfg           = p;
 -
        port->mapbase           = p->mapbase;
        port->type              = p->type;
        port->flags             = p->flags;
@@@ -2248,16 -2094,9 +2248,16 @@@ static int sci_runtime_suspend(struct d
        struct uart_port *port = &sci_port->port;
  
        if (uart_console(port)) {
 +              struct plat_sci_reg *reg;
 +
                sci_port->saved_smr = sci_in(port, SCSMR);
                sci_port->saved_brr = sci_in(port, SCBRR);
 -              sci_port->saved_fcr = sci_in(port, SCFCR);
 +
 +              reg = sci_getreg(port, SCFCR);
 +              if (reg->size)
 +                      sci_port->saved_fcr = sci_in(port, SCFCR);
 +              else
 +                      sci_port->saved_fcr = 0;
        }
        return 0;
  }
@@@ -2271,10 -2110,7 +2271,10 @@@ static int sci_runtime_resume(struct de
                sci_reset(port);
                sci_out(port, SCSMR, sci_port->saved_smr);
                sci_out(port, SCBRR, sci_port->saved_brr);
 -              sci_out(port, SCFCR, sci_port->saved_fcr);
 +
 +              if (sci_port->saved_fcr)
 +                      sci_out(port, SCFCR, sci_port->saved_fcr);
 +
                sci_out(port, SCSCR, sci_port->cfg->scscr);
        }
        return 0;
@@@ -2314,8 -2150,6 +2314,8 @@@ static int sci_remove(struct platform_d
        cpufreq_unregister_notifier(&port->freq_transition,
                                    CPUFREQ_TRANSITION_NOTIFIER);
  
 +      sci_free_gpios(port);
 +
        uart_remove_one_port(&sci_uart_driver, &port->port);
  
        clk_put(port->iclk);
index a163632877afa5a0a68fdbeb297c721ef2308273,f8fd0ddee14a4c6d598b77805ee41882c7c7b7a2..97cb45916c4351110e3a21fb2613c2954855ee9b
@@@ -37,6 -37,7 +37,6 @@@ struct ux500_dma_channel 
        struct dma_channel channel;
        struct ux500_dma_controller *controller;
        struct musb_hw_ep *hw_ep;
 -      struct work_struct channel_work;
        struct dma_chan *dma_chan;
        unsigned int cur_len;
        dma_cookie_t cookie;
@@@ -55,11 -56,31 +55,11 @@@ struct ux500_dma_controller 
        dma_addr_t phy_base;
  };
  
 -/* Work function invoked from DMA callback to handle tx transfers. */
 -static void ux500_tx_work(struct work_struct *data)
 -{
 -      struct ux500_dma_channel *ux500_channel = container_of(data,
 -              struct ux500_dma_channel, channel_work);
 -      struct musb_hw_ep       *hw_ep = ux500_channel->hw_ep;
 -      struct musb *musb = hw_ep->musb;
 -      unsigned long flags;
 -
 -      dev_dbg(musb->controller, "DMA tx transfer done on hw_ep=%d\n",
 -              hw_ep->epnum);
 -
 -      spin_lock_irqsave(&musb->lock, flags);
 -      ux500_channel->channel.actual_len = ux500_channel->cur_len;
 -      ux500_channel->channel.status = MUSB_DMA_STATUS_FREE;
 -      musb_dma_completion(musb, hw_ep->epnum,
 -                              ux500_channel->is_tx);
 -      spin_unlock_irqrestore(&musb->lock, flags);
 -}
 -
  /* Work function invoked from DMA callback to handle rx transfers. */
 -static void ux500_rx_work(struct work_struct *data)
 +void ux500_dma_callback(void *private_data)
  {
 -      struct ux500_dma_channel *ux500_channel = container_of(data,
 -              struct ux500_dma_channel, channel_work);
 +      struct dma_channel *channel = private_data;
 +      struct ux500_dma_channel *ux500_channel = channel->private_data;
        struct musb_hw_ep       *hw_ep = ux500_channel->hw_ep;
        struct musb *musb = hw_ep->musb;
        unsigned long flags;
        musb_dma_completion(musb, hw_ep->epnum,
                ux500_channel->is_tx);
        spin_unlock_irqrestore(&musb->lock, flags);
 -}
 -
 -void ux500_dma_callback(void *private_data)
 -{
 -      struct dma_channel *channel = (struct dma_channel *)private_data;
 -      struct ux500_dma_channel *ux500_channel = channel->private_data;
  
 -      schedule_work(&ux500_channel->channel_work);
  }
  
  static bool ux500_configure_channel(struct dma_channel *channel,
        struct musb_hw_ep *hw_ep = ux500_channel->hw_ep;
        struct dma_chan *dma_chan = ux500_channel->dma_chan;
        struct dma_async_tx_descriptor *dma_desc;
-       enum dma_data_direction direction;
+       enum dma_transfer_direction direction;
        struct scatterlist sg;
        struct dma_slave_config slave_conf;
        enum dma_slave_buswidth addr_width;
        sg_dma_address(&sg) = dma_addr;
        sg_dma_len(&sg) = len;
  
-       direction = ux500_channel->is_tx ? DMA_TO_DEVICE : DMA_FROM_DEVICE;
+       direction = ux500_channel->is_tx ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
        addr_width = (len & 0x3) ? DMA_SLAVE_BUSWIDTH_1_BYTE :
                                        DMA_SLAVE_BUSWIDTH_4_BYTES;
  
@@@ -302,6 -330,7 +302,6 @@@ static int ux500_dma_controller_start(s
        void **param_array;
        struct ux500_dma_channel *channel_array;
        u32 ch_count;
 -      void (*musb_channel_work)(struct work_struct *);
        dma_cap_mask_t mask;
  
        if ((data->num_rx_channels > UX500_MUSB_DMA_NUM_RX_CHANNELS) ||
        channel_array = controller->rx_channel;
        ch_count = data->num_rx_channels;
        param_array = data->dma_rx_param_array;
 -      musb_channel_work = ux500_rx_work;
  
        for (dir = 0; dir < 2; dir++) {
                for (ch_num = 0; ch_num < ch_count; ch_num++) {
                                return -EBUSY;
                        }
  
 -                      INIT_WORK(&ux500_channel->channel_work,
 -                              musb_channel_work);
                }
  
                /* Prepare the loop for TX channels */
                channel_array = controller->tx_channel;
                ch_count = data->num_tx_channels;
                param_array = data->dma_tx_param_array;
 -              musb_channel_work = ux500_tx_work;
                is_tx = 1;
        }
  
index b51fcd80d244b57ca75a540276ff45b1c1c3c8c0,e2f22d4b8c3a798cf039212735aa35b04d96feee..72339bd6fcab862565ee222aa4ead450f1d2945d
@@@ -56,7 -56,7 +56,7 @@@ static struct usbhs_pkt_handle usbhsf_n
  void usbhs_pkt_push(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt,
                    void (*done)(struct usbhs_priv *priv,
                                 struct usbhs_pkt *pkt),
 -                  void *buf, int len, int zero)
 +                  void *buf, int len, int zero, int sequence)
  {
        struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
        struct device *dev = usbhs_priv_to_dev(priv);
@@@ -90,7 -90,6 +90,7 @@@
        pkt->zero       = zero;
        pkt->actual     = 0;
        pkt->done       = done;
 +      pkt->sequence   = sequence;
  
        usbhs_unlock(priv, flags);
        /********************  spin unlock ******************/
@@@ -482,9 -481,6 +482,9 @@@ static int usbhsf_pio_try_push(struct u
        int i, ret, len;
        int is_short;
  
 +      usbhs_pipe_data_sequence(pipe, pkt->sequence);
 +      pkt->sequence = -1; /* -1 sequence will be ignored */
 +
        ret = usbhsf_fifo_select(pipe, fifo, 1);
        if (ret < 0)
                return 0;
@@@ -588,8 -584,6 +588,8 @@@ static int usbhsf_prepare_pop(struct us
        /*
         * pipe enable to prepare packet receive
         */
 +      usbhs_pipe_data_sequence(pipe, pkt->sequence);
 +      pkt->sequence = -1; /* -1 sequence will be ignored */
  
        usbhs_pipe_enable(pipe);
        usbhsf_rx_irq_ctrl(pipe, 1);
@@@ -647,7 -641,6 +647,7 @@@ static int usbhsf_pio_try_pop(struct us
         * "Operation" - "FIFO Buffer Memory" - "FIFO Port Function"
         */
        if (0 == rcv_len) {
 +              pkt->zero = 1;
                usbhsf_fifo_clear(pipe, fifo);
                goto usbhs_fifo_read_end;
        }
@@@ -772,10 -765,10 +772,10 @@@ static void usbhsf_dma_prepare_tasklet(
        struct dma_async_tx_descriptor *desc;
        struct dma_chan *chan = usbhsf_dma_chan_get(fifo, pkt);
        struct device *dev = usbhs_priv_to_dev(priv);
-       enum dma_data_direction dir;
+       enum dma_transfer_direction dir;
        dma_cookie_t cookie;
  
-       dir = usbhs_pipe_is_dir_in(pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
+       dir = usbhs_pipe_is_dir_in(pipe) ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV;
  
        sg_init_table(&sg, 1);
        sg_set_page(&sg, virt_to_page(pkt->dma),
@@@ -827,7 -820,7 +827,7 @@@ static int usbhsf_dma_prepare_push(stru
        if (len % 4) /* 32bit alignment */
                goto usbhsf_pio_prepare_push;
  
 -      if ((*(u32 *) pkt->buf + pkt->actual) & 0x7) /* 8byte alignment */
 +      if ((uintptr_t)(pkt->buf + pkt->actual) & 0x7) /* 8byte alignment */
                goto usbhsf_pio_prepare_push;
  
        /* get enable DMA fifo */
@@@ -904,7 -897,7 +904,7 @@@ static int usbhsf_dma_try_pop(struct us
        if (!fifo)
                goto usbhsf_pio_prepare_pop;
  
 -      if ((*(u32 *) pkt->buf + pkt->actual) & 0x7) /* 8byte alignment */
 +      if ((uintptr_t)(pkt->buf + pkt->actual) & 0x7) /* 8byte alignment */
                goto usbhsf_pio_prepare_pop;
  
        ret = usbhsf_fifo_select(pipe, fifo, 0);
diff --combined sound/atmel/ac97c.c
index 73516f69ac7ca8a33244cb300df8958ac2d77e20,cd9428b24a36110cea7279172c14d940914d7d3c..61dade6983582ce415afdbe3cf88d208bb628c46
@@@ -102,7 -102,7 +102,7 @@@ static void atmel_ac97c_dma_capture_per
  
  static int atmel_ac97c_prepare_dma(struct atmel_ac97c *chip,
                struct snd_pcm_substream *substream,
-               enum dma_data_direction direction)
+               enum dma_transfer_direction direction)
  {
        struct dma_chan                 *chan;
        struct dw_cyclic_desc           *cdesc;
                return -EINVAL;
        }
  
-       if (direction == DMA_TO_DEVICE)
+       if (direction == DMA_MEM_TO_DEV)
                chan = chip->dma.tx_chan;
        else
                chan = chip->dma.rx_chan;
                return PTR_ERR(cdesc);
        }
  
-       if (direction == DMA_TO_DEVICE) {
+       if (direction == DMA_MEM_TO_DEV) {
                cdesc->period_callback = atmel_ac97c_dma_playback_period_done;
                set_bit(DMA_TX_READY, &chip->flags);
        } else {
@@@ -393,7 -393,7 +393,7 @@@ static int atmel_ac97c_playback_prepare
        if (cpu_is_at32ap7000()) {
                if (!test_bit(DMA_TX_READY, &chip->flags))
                        retval = atmel_ac97c_prepare_dma(chip, substream,
-                                       DMA_TO_DEVICE);
+                                       DMA_MEM_TO_DEV);
        } else {
                /* Initialize and start the PDC */
                writel(runtime->dma_addr, chip->regs + ATMEL_PDC_TPR);
@@@ -484,7 -484,7 +484,7 @@@ static int atmel_ac97c_capture_prepare(
        if (cpu_is_at32ap7000()) {
                if (!test_bit(DMA_RX_READY, &chip->flags))
                        retval = atmel_ac97c_prepare_dma(chip, substream,
-                                       DMA_FROM_DEVICE);
+                                       DMA_DEV_TO_MEM);
        } else {
                /* Initialize and start the PDC */
                writel(runtime->dma_addr, chip->regs + ATMEL_PDC_RPR);
@@@ -899,10 -899,6 +899,10 @@@ static void atmel_ac97c_reset(struct at
                /* AC97 v2.2 specifications says minimum 1 us. */
                udelay(2);
                gpio_set_value(chip->reset_pin, 1);
 +      } else {
 +              ac97c_writel(chip, MR, AC97C_MR_WRST | AC97C_MR_ENA);
 +              udelay(2);
 +              ac97c_writel(chip, MR, AC97C_MR_ENA);
        }
  }
  
index 3fc96130d1a6b0ccb76470e979eb34896682e965,23de7927810c2c675dc9ca43d0b28d4366c15014..de83904498730dbf43447cdcc4ef42cd34a9d0d7
@@@ -113,9 -113,9 +113,9 @@@ static int ep93xx_pcm_open(struct snd_p
        rtd->dma_data.name = dma_params->name;
  
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-               rtd->dma_data.direction = DMA_TO_DEVICE;
+               rtd->dma_data.direction = DMA_MEM_TO_DEV;
        else
-               rtd->dma_data.direction = DMA_FROM_DEVICE;
+               rtd->dma_data.direction = DMA_DEV_TO_MEM;
  
        rtd->dma_chan = dma_request_channel(mask, ep93xx_pcm_dma_filter,
                                            &rtd->dma_data);
@@@ -286,6 -286,7 +286,6 @@@ static u64 ep93xx_pcm_dmamask = 0xfffff
  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->coherent_dma_mask)
                card->dev->coherent_dma_mask = 0xffffffff;
  
 -      if (dai->driver->playback.channels_min) {
 +      if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) {
                ret = ep93xx_pcm_preallocate_dma_buffer(pcm,
                                        SNDRV_PCM_STREAM_PLAYBACK);
                if (ret)
                        return ret;
        }
  
 -      if (dai->driver->capture.channels_min) {
 +      if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) {
                ret = ep93xx_pcm_preallocate_dma_buffer(pcm,
                                        SNDRV_PCM_STREAM_CAPTURE);
                if (ret)
@@@ -338,7 -339,18 +338,7 @@@ static struct platform_driver ep93xx_pc
        .remove = __devexit_p(ep93xx_soc_platform_remove),
  };
  
 -static int __init ep93xx_soc_platform_init(void)
 -{
 -      return platform_driver_register(&ep93xx_pcm_driver);
 -}
 -
 -static void __exit ep93xx_soc_platform_exit(void)
 -{
 -      platform_driver_unregister(&ep93xx_pcm_driver);
 -}
 -
 -module_init(ep93xx_soc_platform_init);
 -module_exit(ep93xx_soc_platform_exit);
 +module_platform_driver(ep93xx_pcm_driver);
  
  MODULE_AUTHOR("Ryan Mallon");
  MODULE_DESCRIPTION("EP93xx ALSA PCM interface");
index 1cf2fe889f6adaa885c77bf2c74da9dd9f56a3d8,7d28de9758f35ccd02d00d54da89dfec79be3e23..aecdba9f65a18b7fd23e4f9d5334aa424fcb67fe
@@@ -107,12 -107,12 +107,12 @@@ static int imx_ssi_dma_alloc(struct snd
        }
  
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-               slave_config.direction = DMA_TO_DEVICE;
+               slave_config.direction = DMA_MEM_TO_DEV;
                slave_config.dst_addr = dma_params->dma_addr;
                slave_config.dst_addr_width = buswidth;
                slave_config.dst_maxburst = dma_params->burstsize;
        } else {
-               slave_config.direction = DMA_FROM_DEVICE;
+               slave_config.direction = DMA_DEV_TO_MEM;
                slave_config.src_addr = dma_params->dma_addr;
                slave_config.src_addr_width = buswidth;
                slave_config.src_maxburst = dma_params->burstsize;
@@@ -159,7 -159,7 +159,7 @@@ static int snd_imx_pcm_hw_params(struc
                        iprtd->period_bytes * iprtd->periods,
                        iprtd->period_bytes,
                        substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
-                       DMA_TO_DEVICE : DMA_FROM_DEVICE);
+                       DMA_MEM_TO_DEV : DMA_DEV_TO_MEM);
        if (!iprtd->desc) {
                dev_err(&chan->dev->device, "cannot prepare slave dma\n");
                return -EINVAL;
@@@ -326,6 -326,16 +326,6 @@@ static struct platform_driver imx_pcm_d
        .remove = __devexit_p(imx_soc_platform_remove),
  };
  
 -static int __init snd_imx_pcm_init(void)
 -{
 -      return platform_driver_register(&imx_pcm_driver);
 -}
 -module_init(snd_imx_pcm_init);
 -
 -static void __exit snd_imx_pcm_exit(void)
 -{
 -      platform_driver_unregister(&imx_pcm_driver);
 -}
 -module_exit(snd_imx_pcm_exit);
 +module_platform_driver(imx_pcm_driver);
  MODULE_LICENSE("GPL");
  MODULE_ALIAS("platform:imx-pcm-audio");
diff --combined sound/soc/mxs/mxs-pcm.c
index 0e12f4e0a76d60ac10dab9b70ad4e12f80e0d0c7,4b48a169e89c7faf7cb83642143c6d06904b2081..105f42a394df6460e80899f22c567f3ac6192c7f
@@@ -136,7 -136,7 +136,7 @@@ static int snd_mxs_pcm_hw_params(struc
                        iprtd->period_bytes * iprtd->periods,
                        iprtd->period_bytes,
                        substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
-                       DMA_TO_DEVICE : DMA_FROM_DEVICE);
+                       DMA_MEM_TO_DEV : DMA_DEV_TO_MEM);
        if (!iprtd->desc) {
                dev_err(&chan->dev->device, "cannot prepare slave dma\n");
                return -EINVAL;
@@@ -346,7 -346,14 +346,7 @@@ static struct platform_driver mxs_pcm_d
        .remove = __devexit_p(mxs_soc_platform_remove),
  };
  
 -static int __init snd_mxs_pcm_init(void)
 -{
 -      return platform_driver_register(&mxs_pcm_driver);
 -}
 -module_init(snd_mxs_pcm_init);
 +module_platform_driver(mxs_pcm_driver);
  
 -static void __exit snd_mxs_pcm_exit(void)
 -{
 -      platform_driver_unregister(&mxs_pcm_driver);
 -}
 -module_exit(snd_mxs_pcm_exit);
 +MODULE_LICENSE("GPL");
 +MODULE_ALIAS("platform:mxs-pcm-audio");
diff --combined sound/soc/samsung/dma.c
index 427ae0d9817bb95cb09fbab000d6a2d0a35d32c8,d400ed0a71f2d9d3e1f5fe4dd4f5a72e253f6a58..e4ba17ce6b32cf3c8d3d3a0762d70c7b7c969b3c
@@@ -86,7 -86,7 +86,7 @@@ static void dma_enqueue(struct snd_pcm_
        dma_info.cap = (samsung_dma_has_circular() ? DMA_CYCLIC : DMA_SLAVE);
        dma_info.direction =
                (substream->stream == SNDRV_PCM_STREAM_PLAYBACK
-               ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
+               ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM);
        dma_info.fp = audio_buffdone;
        dma_info.fp_param = substream;
        dma_info.period = prtd->dma_period;
@@@ -171,7 -171,7 +171,7 @@@ static int dma_hw_params(struct snd_pcm
                dma_info.client = prtd->params->client;
                dma_info.direction =
                        (substream->stream == SNDRV_PCM_STREAM_PLAYBACK
-                       ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
+                       ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM);
                dma_info.width = prtd->params->dma_size;
                dma_info.fifo = prtd->params->dma_addr;
                prtd->params->ch = prtd->params->ops->request(
@@@ -403,6 -403,7 +403,6 @@@ static u64 dma_mask = DMA_BIT_MASK(32)
  static int dma_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->coherent_dma_mask)
                card->dev->coherent_dma_mask = 0xffffffff;
  
 -      if (dai->driver->playback.channels_min) {
 +      if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) {
                ret = preallocate_dma_buffer(pcm,
                        SNDRV_PCM_STREAM_PLAYBACK);
                if (ret)
                        goto out;
        }
  
 -      if (dai->driver->capture.channels_min) {
 +      if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) {
                ret = preallocate_dma_buffer(pcm,
                        SNDRV_PCM_STREAM_CAPTURE);
                if (ret)
@@@ -457,7 -458,17 +457,7 @@@ static struct platform_driver asoc_dma_
        .remove = __devexit_p(samsung_asoc_platform_remove),
  };
  
 -static int __init samsung_asoc_init(void)
 -{
 -      return platform_driver_register(&asoc_dma_driver);
 -}
 -module_init(samsung_asoc_init);
 -
 -static void __exit samsung_asoc_exit(void)
 -{
 -      platform_driver_unregister(&asoc_dma_driver);
 -}
 -module_exit(samsung_asoc_exit);
 +module_platform_driver(asoc_dma_driver);
  
  MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
  MODULE_DESCRIPTION("Samsung ASoC DMA Driver");
index 93931def0dce62b3a5e162d7c759ac82f33745f2,602bb68b8784685721d4335c725f6be64246f00b..21554611557c380ca391a9c384407a9744a056a1
@@@ -134,7 -134,7 +134,7 @@@ txx9aclc_dma_submit(struct txx9aclc_dma
        sg_dma_address(&sg) = buf_dma_addr;
        desc = chan->device->device_prep_slave_sg(chan, &sg, 1,
                dmadata->substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
-               DMA_TO_DEVICE : DMA_FROM_DEVICE,
+               DMA_MEM_TO_DEV : DMA_DEV_TO_MEM,
                DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
        if (!desc) {
                dev_err(&chan->dev->device, "cannot prepare slave dma\n");
@@@ -438,7 -438,17 +438,7 @@@ static struct platform_driver txx9aclc_
        .remove = __devexit_p(txx9aclc_soc_platform_remove),
  };
  
 -static int __init snd_txx9aclc_pcm_init(void)
 -{
 -      return platform_driver_register(&txx9aclc_pcm_driver);
 -}
 -module_init(snd_txx9aclc_pcm_init);
 -
 -static void __exit snd_txx9aclc_pcm_exit(void)
 -{
 -      platform_driver_unregister(&txx9aclc_pcm_driver);
 -}
 -module_exit(snd_txx9aclc_pcm_exit);
 +module_platform_driver(txx9aclc_pcm_driver);
  
  MODULE_AUTHOR("Atsushi Nemoto <anemo@mba.ocn.ne.jp>");
  MODULE_DESCRIPTION("TXx9 ACLC Audio DMA driver");