]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Merge tag 'dmaengine-4.2-rc1' of git://git.infradead.org/users/vkoul/slave-dma
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 29 Jun 2015 16:44:45 +0000 (09:44 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 29 Jun 2015 16:44:45 +0000 (09:44 -0700)
Pull dmaengine updates from Vinod Koul:
 "This time we have support for few new devices, few new features and
  odd fixes spread thru the subsystem.

  New devices added:
   - support for CSRatlas7 dma controller
   - Allwinner H3(sun8i) controller
   - TI DMA crossbar driver on DRA7x
   - new pxa driver

  New features added:
   - memset support is bought back now that we have a user in xdmac controller
   - interleaved transfers support different source and destination strides
   - supporting DMA routers and configuration thru DT
   - support for reusing descriptors
   - xdmac memset and interleaved transfer support
   - hdmac support for interleaved transfers
   - omap-dma support for memcpy

  Others:
   - Constify platform_device_id
   - mv_xor fixes and improvements"

* tag 'dmaengine-4.2-rc1' of git://git.infradead.org/users/vkoul/slave-dma: (46 commits)
  dmaengine: xgene: fix file permission
  dmaengine: fsl-edma: clear pending interrupts on initialization
  dmaengine: xdmac: Add memset support
  Documentation: dmaengine: document DMA_CTRL_ACK
  dmaengine: virt-dma: don't always free descriptor upon completion
  dmaengine: Revert "drivers/dma: remove unused support for MEMSET operations"
  dmaengine: hdmac: Implement interleaved transfers
  dmaengine: Move icg helpers to global header
  dmaengine: mv_xor: improve descriptors list handling and reduce locking
  dmaengine: mv_xor: Enlarge descriptor pool size
  dmaengine: mv_xor: add support for a38x command in descriptor mode
  dmaengine: mv_xor: Rename function for consistent naming
  dmaengine: mv_xor: bug fix for racing condition in descriptors cleanup
  dmaengine: pl330: fix wording in mcbufsz message
  dmaengine: sirf: add CSRatlas7 SoC support
  dmaengine: xgene-dma: Fix "incorrect type in assignement" warnings
  dmaengine: fix kernel-doc documentation
  dmaengine: pxa_dma: add support for legacy transition
  dmaengine: pxa_dma: add debug information
  dmaengine: pxa: add pxa dmaengine driver
  ...

1  2 
MAINTAINERS
drivers/dma/at_xdmac.c
drivers/dma/dmaengine.c
drivers/dma/pl330.c
drivers/dma/sh/rcar-dmac.c

diff --combined MAINTAINERS
index abd7a494931996e70e188136b8a06b770de5772a,238ea990ed299a46a81eed1f75f2c80b59955181..67e0b863d2af6acfde0c9b024273918f8243762f
@@@ -51,9 -51,9 +51,9 @@@ trivial patch so apply some common sens
        or does something very odd once a month document it.
  
        PLEASE remember that submissions must be made under the terms
 -      of the OSDL certificate of contribution and should include a
 -      Signed-off-by: line.  The current version of this "Developer's
 -      Certificate of Origin" (DCO) is listed in the file
 +      of the Linux Foundation certificate of contribution and should
 +      include a Signed-off-by: line.  The current version of this
 +      "Developer's Certificate of Origin" (DCO) is listed in the file
        Documentation/SubmittingPatches.
  
  6.    Make sure you have the right to send any changes you make. If you
@@@ -259,7 -259,7 +259,7 @@@ S: Maintaine
  F:    drivers/platform/x86/acer-wmi.c
  
  ACPI
 -M:    Rafael J. Wysocki <rjw@rjwysocki.net>
 +M:    "Rafael J. Wysocki" <rjw@rjwysocki.net>
  M:    Len Brown <lenb@kernel.org>
  L:    linux-acpi@vger.kernel.org
  W:    https://01.org/linux-acpi
@@@ -280,7 -280,7 +280,7 @@@ F: tools/power/acpi
  ACPI COMPONENT ARCHITECTURE (ACPICA)
  M:    Robert Moore <robert.moore@intel.com>
  M:    Lv Zheng <lv.zheng@intel.com>
 -M:    Rafael J. Wysocki <rafael.j.wysocki@intel.com>
 +M:    "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
  L:    linux-acpi@vger.kernel.org
  L:    devel@acpica.org
  W:    https://acpica.org/
@@@ -445,7 -445,6 +445,7 @@@ F: drivers/input/misc/adxl34x.
  
  ADVANSYS SCSI DRIVER
  M:    Matthew Wilcox <matthew@wil.cx>
 +M:    Hannes Reinecke <hare@suse.de>
  L:    linux-scsi@vger.kernel.org
  S:    Maintained
  F:    Documentation/scsi/advansys.txt
@@@ -632,7 -631,7 +632,7 @@@ F: drivers/iommu/amd_iommu*.[ch
  F:    include/linux/amd-iommu.h
  
  AMD KFD
 -M:    Oded Gabbay <oded.gabbay@amd.com>
 +M:    Oded Gabbay <oded.gabbay@gmail.com>
  L:    dri-devel@lists.freedesktop.org
  T:    git git://people.freedesktop.org/~gabbayo/linux.git
  S:    Supported
@@@ -653,6 -652,7 +653,6 @@@ M: Tom Lendacky <thomas.lendacky@amd.co
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/amd/xgbe/
 -F:    drivers/net/phy/amd-xgbe-phy.c
  
  AMS (Apple Motion Sensor) DRIVER
  M:    Michael Hanselmann <linux-kernel@hansmi.ch>
@@@ -732,7 -732,7 +732,7 @@@ ANDROID DRIVER
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  M:    Arve Hjønnevåg <arve@android.com>
  M:    Riley Andrews <riandrews@android.com>
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/gregkh/staging.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
  L:    devel@driverdev.osuosl.org
  S:    Supported
  F:    drivers/android/
@@@ -892,10 -892,11 +892,10 @@@ S:      Maintaine
  F:    arch/arm/mach-alpine/
  
  ARM/ATMEL AT91RM9200 AND AT91SAM ARM ARCHITECTURES
 -M:    Andrew Victor <linux@maxim.org.za>
  M:    Nicolas Ferre <nicolas.ferre@atmel.com>
 +M:    Alexandre Belloni <alexandre.belloni@free-electrons.com>
  M:    Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -W:    http://maxim.org.za/at91_26.html
  W:    http://www.linux4sam.org
  S:    Supported
  F:    arch/arm/mach-at91/
@@@ -922,13 -923,6 +922,13 @@@ M:       Krzysztof Halasa <khalasa@piap.pl
  S:    Maintained
  F:    arch/arm/mach-cns3xxx/
  
 +ARM/CAVIUM THUNDER NETWORK DRIVER
 +M:    Sunil Goutham <sgoutham@cavium.com>
 +M:    Robert Richter <rric@kernel.org>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Supported
 +F:    drivers/net/ethernet/cavium/
 +
  ARM/CIRRUS LOGIC CLPS711X ARM ARCHITECTURE
  M:    Alexander Shiyan <shc_work@mail.ru>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -981,10 -975,9 +981,10 @@@ S:       Maintaine
  ARM/CORTINA SYSTEMS GEMINI ARM ARCHITECTURE
  M:    Hans Ulli Kroll <ulli.kroll@googlemail.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -T:    git git://git.berlios.de/gemini-board
 +T:    git git://github.com/ulli-kroll/linux.git
  S:    Maintained
  F:    arch/arm/mach-gemini/
 +F:    drivers/rtc/rtc-gemini.c
  
  ARM/CSR SIRFPRIMA2 MACHINE SUPPORT
  M:    Barry Song <baohua@kernel.org>
@@@ -997,12 -990,6 +997,12 @@@ F:       drivers/clocksource/timer-prima2.
  F:    drivers/clocksource/timer-atlas7.c
  N:    [^a-z]sirf
  
 +ARM/CONEXANT DIGICOLOR MACHINE SUPPORT
 +M:    Baruch Siach <baruch@tkos.co.il>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +N:    digicolor
 +
  ARM/EBSA110 MACHINE SUPPORT
  M:    Russell King <linux@arm.linux.org.uk>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1043,7 -1030,7 +1043,7 @@@ F:      arch/arm/include/asm/hardware/dec212
  F:    arch/arm/mach-footbridge/
  
  ARM/FREESCALE IMX / MXC ARM ARCHITECTURE
 -M:    Shawn Guo <shawn.guo@linaro.org>
 +M:    Shawn Guo <shawnguo@kernel.org>
  M:    Sascha Hauer <kernel@pengutronix.de>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
@@@ -1052,11 -1039,9 +1052,11 @@@ F:    arch/arm/mach-imx
  F:    arch/arm/mach-mxs/
  F:    arch/arm/boot/dts/imx*
  F:    arch/arm/configs/imx*_defconfig
 +F:    drivers/clk/imx/
 +F:    include/soc/imx/
  
  ARM/FREESCALE VYBRID ARM ARCHITECTURE
 -M:    Shawn Guo <shawn.guo@linaro.org>
 +M:    Shawn Guo <shawnguo@kernel.org>
  M:    Sascha Hauer <kernel@pengutronix.de>
  R:    Stefan Agner <stefan@agner.ch>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1199,17 -1184,11 +1199,17 @@@ M:   Lennert Buytenhek <kernel@wantstofly
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  
 +ARM/LPC18XX ARCHITECTURE
 +M:    Joachim Eastwood <manabian@gmail.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +N:    lpc18xx
 +
  ARM/MAGICIAN MACHINE SUPPORT
  M:    Philipp Zabel <philipp.zabel@gmail.com>
  S:    Maintained
  
 -ARM/Marvell Armada 370 and Armada XP SOC support
 +ARM/Marvell Kirkwood and Armada 370, 375, 38x, XP SOC support
  M:    Jason Cooper <jason@lakedaemon.net>
  M:    Andrew Lunn <andrew@lunn.ch>
  M:    Gregory Clement <gregory.clement@free-electrons.com>
@@@ -1218,17 -1197,12 +1218,17 @@@ L:   linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    arch/arm/mach-mvebu/
  F:    drivers/rtc/rtc-armada38x.c
 +F:    arch/arm/boot/dts/armada*
 +F:    arch/arm/boot/dts/kirkwood*
 +
  
  ARM/Marvell Berlin SoC support
  M:    Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/mach-berlin/
 +F:    arch/arm/boot/dts/berlin*
 +
  
  ARM/Marvell Dove/MV78xx0/Orion SOC support
  M:    Jason Cooper <jason@lakedaemon.net>
@@@ -1241,9 -1215,6 +1241,9 @@@ F:      arch/arm/mach-dove
  F:    arch/arm/mach-mv78xx0/
  F:    arch/arm/mach-orion5x/
  F:    arch/arm/plat-orion/
 +F:    arch/arm/boot/dts/dove*
 +F:    arch/arm/boot/dts/orion5x*
 +
  
  ARM/Orion SoC/Technologic Systems TS-78xx platform support
  M:    Alexander Clouter <alex@digriz.org.uk>
@@@ -1252,13 -1223,6 +1252,13 @@@ W:    http://www.digriz.org.uk/ts78xx/kern
  S:    Maintained
  F:    arch/arm/mach-orion5x/ts78xx-*
  
 +ARM/Mediatek RTC DRIVER
 +M:    Eddie Huang <eddie.huang@mediatek.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +L:    linux-mediatek@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    drivers/rtc/rtc-mt6397.c
 +
  ARM/Mediatek SoC support
  M:    Matthias Brugger <matthias.bgg@gmail.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1402,13 -1366,11 +1402,13 @@@ N:   rockchi
  
  ARM/SAMSUNG EXYNOS ARM ARCHITECTURES
  M:    Kukjin Kim <kgene@kernel.org>
 +M:    Krzysztof Kozlowski <k.kozlowski@samsung.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/boot/dts/s3c*
  F:    arch/arm/boot/dts/exynos*
 +F:    arch/arm64/boot/dts/exynos/
  F:    arch/arm/plat-samsung/
  F:    arch/arm/mach-s3c24*/
  F:    arch/arm/mach-s3c64xx/
@@@ -1477,10 -1439,9 +1477,10 @@@ ARM/SOCFPGA ARCHITECTUR
  M:    Dinh Nguyen <dinguyen@opensource.altera.com>
  S:    Maintained
  F:    arch/arm/mach-socfpga/
 +F:    arch/arm/boot/dts/socfpga*
 +F:    arch/arm/configs/socfpga_defconfig
  W:    http://www.rocketboards.org
 -T:    git://git.rocketboards.org/linux-socfpga.git
 -T:    git://git.rocketboards.org/linux-socfpga-next.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dinguyen/linux.git
  
  ARM/SOCFPGA CLOCK FRAMEWORK SUPPORT
  M:    Dinh Nguyen <dinguyen@opensource.altera.com>
@@@ -1512,22 -1473,12 +1512,22 @@@ F:   drivers/phy/phy-stih407-usb.
  F:    drivers/phy/phy-stih41x-usb.c
  F:    drivers/pinctrl/pinctrl-st.c
  F:    drivers/reset/sti/
 +F:    drivers/rtc/rtc-st-lpc.c
  F:    drivers/tty/serial/st-asc.c
  F:    drivers/usb/dwc3/dwc3-st.c
  F:    drivers/usb/host/ehci-st.c
  F:    drivers/usb/host/ohci-st.c
 +F:    drivers/watchdog/st_lpc_wdt.c
  F:    drivers/ata/ahci_st.c
  
 +ARM/STM32 ARCHITECTURE
 +M:    Maxime Coquelin <mcoquelin.stm32@gmail.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mcoquelin/stm32.git
 +N:    stm32
 +F:    drivers/clocksource/armv7m_systick.c
 +
  ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1574,13 -1525,6 +1574,13 @@@ F:    drivers/rtc/rtc-ab3100.
  F:    drivers/rtc/rtc-coh901331.c
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson.git
  
 +ARM/UNIPHIER ARCHITECTURE
 +M:    Masahiro Yamada <yamada.masahiro@socionext.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    arch/arm/mach-uniphier/
 +N:    uniphier
 +
  ARM/Ux500 ARM ARCHITECTURE
  M:    Linus Walleij <linus.walleij@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1658,15 -1602,6 +1658,15 @@@ S:    Maintaine
  F:    arch/arm/mach-pxa/z2.c
  F:    arch/arm/mach-pxa/include/mach/z2.h
  
 +ARM/ZTE ARCHITECTURE
 +M:    Jun Nie <jun.nie@linaro.org>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    arch/arm/mach-zx/
 +F:    drivers/clk/zte/
 +F:    Documentation/devicetree/bindings/arm/zte.txt
 +F:    Documentation/devicetree/bindings/clock/zx296702-clk.txt
 +
  ARM/ZYNQ ARCHITECTURE
  M:    Michal Simek <michal.simek@xilinx.com>
  R:    Sören Brinkmann <soren.brinkmann@xilinx.com>
@@@ -1684,12 -1619,11 +1684,12 @@@ F:   drivers/i2c/busses/i2c-cadence.
  F:    drivers/mmc/host/sdhci-of-arasan.c
  F:    drivers/edac/synopsys_edac.c
  
 -ARM SMMU DRIVER
 +ARM SMMU DRIVERS
  M:    Will Deacon <will.deacon@arm.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    drivers/iommu/arm-smmu.c
 +F:    drivers/iommu/arm-smmu-v3.c
  F:    drivers/iommu/io-pgtable-arm.c
  
  ARM64 PORT (AARCH64 ARCHITECTURE)
@@@ -1920,14 -1854,6 +1920,14 @@@ W:    http://www.attotech.co
  S:    Supported
  F:    drivers/scsi/esas2r
  
 +ATUSB IEEE 802.15.4 RADIO DRIVER
 +M:    Stefan Schmidt <stefan@osg.samsung.com>
 +L:    linux-wpan@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/ieee802154/atusb.c
 +F:    drivers/net/ieee802154/atusb.h
 +F:    drivers/net/ieee802154/at86rf230.h
 +
  AUDIT SUBSYSTEM
  M:    Paul Moore <paul@paul-moore.com>
  M:    Eric Paris <eparis@redhat.com>
@@@ -2003,7 -1929,7 +2003,7 @@@ S:      Maintaine
  F:    drivers/net/wireless/b43legacy/
  
  BACKLIGHT CLASS/SUBSYSTEM
 -M:    Jingoo Han <jg1.han@samsung.com>
 +M:    Jingoo Han <jingoohan1@gmail.com>
  M:    Lee Jones <lee.jones@linaro.org>
  S:    Maintained
  F:    drivers/video/backlight/
@@@ -2032,14 -1958,6 +2032,14 @@@ W:    http://bcache.evilpiepirate.or
  S:    Maintained:
  F:    drivers/md/bcache/
  
 +BDISP ST MEDIA DRIVER
 +M:    Fabien Dessenne <fabien.dessenne@st.com>
 +L:    linux-media@vger.kernel.org
 +T:    git git://linuxtv.org/media_tree.git
 +W:    http://linuxtv.org
 +S:    Supported
 +F:    drivers/media/platform/sti/bdisp
 +
  BEFS FILE SYSTEM
  S:    Orphan
  F:    Documentation/filesystems/befs.txt
@@@ -2124,7 -2042,6 +2124,7 @@@ M:      Jens Axboe <axboe@kernel.dk
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
  S:    Maintained
  F:    block/
 +F:    kernel/trace/blktrace.c
  
  BLOCK2MTD DRIVER
  M:    Joern Engel <joern@lazybastard.org>
@@@ -2199,9 -2116,8 +2199,9 @@@ S:      Supporte
  F:    drivers/net/ethernet/broadcom/bnx2x/
  
  BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITECTURE
 -M:    Christian Daudt <bcm@fixthebug.org>
  M:    Florian Fainelli <f.fainelli@gmail.com>
 +M:    Ray Jui <rjui@broadcom.com>
 +M:    Scott Branden <sbranden@broadcom.com>
  L:    bcm-kernel-feedback-list@broadcom.com
  T:    git git://github.com/broadcom/mach-bcm
  S:    Maintained
@@@ -2229,14 -2145,6 +2229,14 @@@ F:    arch/mips/bcm3384/
  F:    arch/mips/include/asm/mach-bcm3384/*
  F:    arch/mips/kernel/*bmips*
  
 +BROADCOM BCM47XX MIPS ARCHITECTURE
 +M:    Hauke Mehrtens <hauke@hauke-m.de>
 +M:    Rafał Miłecki <zajec5@gmail.com>
 +L:    linux-mips@linux-mips.org
 +S:    Maintained
 +F:    arch/mips/bcm47xx/*
 +F:    arch/mips/include/asm/mach-bcm47xx/*
 +
  BROADCOM BCM5301X ARM ARCHITECTURE
  M:    Hauke Mehrtens <hauke@hauke-m.de>
  L:    linux-arm-kernel@lists.infradead.org
@@@ -2260,6 -2168,7 +2260,6 @@@ S:      Maintaine
  F:    drivers/usb/gadget/udc/bcm63xx_udc.*
  
  BROADCOM BCM7XXX ARM ARCHITECTURE
 -M:    Marc Carino <marc.ceeeee@gmail.com>
  M:    Brian Norris <computersforpeace@gmail.com>
  M:    Gregory Fong <gregory.0xf0@gmail.com>
  M:    Florian Fainelli <f.fainelli@gmail.com>
@@@ -2269,7 -2178,6 +2269,7 @@@ S:      Maintaine
  F:    arch/arm/mach-bcm/*brcmstb*
  F:    arch/arm/boot/dts/bcm7*.dts*
  F:    drivers/bus/brcmstb_gisb.c
 +N:    brcmstb
  
  BROADCOM BMIPS MIPS ARCHITECTURE
  M:    Kevin Cernekee <cernekee@gmail.com>
@@@ -2327,13 -2235,6 +2327,13 @@@ N:    bcm9583
  N:    bcm583*
  N:    bcm113*
  
 +BROADCOM BRCMSTB GPIO DRIVER
 +M:    Gregory Fong <gregory.0xf0@gmail.com>
 +L:    bcm-kernel-feedback-list@broadcom.com>
 +S:    Supported
 +F:    drivers/gpio/gpio-brcmstb.c
 +F:    Documentation/devicetree/bindings/gpio/brcm,brcmstb-gpio.txt
 +
  BROADCOM KONA GPIO DRIVER
  M:    Ray Jui <rjui@broadcom.com>
  L:    bcm-kernel-feedback-list@broadcom.com
@@@ -2341,18 -2242,6 +2341,18 @@@ S:    Supporte
  F:    drivers/gpio/gpio-bcm-kona.c
  F:    Documentation/devicetree/bindings/gpio/gpio-bcm-kona.txt
  
 +BROADCOM NVRAM DRIVER
 +M:    Rafał Miłecki <zajec5@gmail.com>
 +L:    linux-mips@linux-mips.org
 +S:    Maintained
 +F:    drivers/firmware/broadcom/*
 +
 +BROADCOM STB NAND FLASH DRIVER
 +M:    Brian Norris <computersforpeace@gmail.com>
 +L:    linux-mtd@lists.infradead.org
 +S:    Maintained
 +F:    drivers/mtd/nand/brcmnand/
 +
  BROADCOM SPECIFIC AMBA DRIVER (BCMA)
  M:    Rafał Miłecki <zajec5@gmail.com>
  L:    linux-wireless@vger.kernel.org
@@@ -2523,6 -2412,7 +2523,6 @@@ L:      linux-security-module@vger.kernel.or
  S:    Supported
  F:    include/linux/capability.h
  F:    include/uapi/linux/capability.h
 -F:    security/capability.c
  F:    security/commoncap.c
  F:    kernel/capability.c
  
@@@ -2532,17 -2422,6 +2532,17 @@@ S:    Maintaine
  F:    drivers/iio/light/cm*
  F:    Documentation/devicetree/bindings/i2c/trivial-devices.txt
  
 +CAVIUM LIQUIDIO NETWORK DRIVER
 +M:     Derek Chickles <derek.chickles@caviumnetworks.com>
 +M:     Satanand Burla <satananda.burla@caviumnetworks.com>
 +M:     Felix Manlunas <felix.manlunas@caviumnetworks.com>
 +M:     Raghu Vatsavayi <raghu.vatsavayi@caviumnetworks.com>
 +L:     netdev@vger.kernel.org
 +W:     http://www.cavium.com
 +S:     Supported
 +F:     drivers/net/ethernet/cavium/
 +F:     drivers/net/ethernet/cavium/liquidio/
 +
  CC2520 IEEE-802.15.4 RADIO DRIVER
  M:    Varka Bhadram <varkabhadram@gmail.com>
  L:    linux-wpan@vger.kernel.org
@@@ -2554,6 -2433,7 +2554,6 @@@ F:      Documentation/devicetree/bindings/ne
  CELL BROADBAND ENGINE ARCHITECTURE
  M:    Arnd Bergmann <arnd@arndb.de>
  L:    linuxppc-dev@lists.ozlabs.org
 -L:    cbe-oss-dev@lists.ozlabs.org
  W:    http://www.ibm.com/developerworks/power/cell/
  S:    Supported
  F:    arch/powerpc/include/asm/cell*.h
@@@ -2563,7 -2443,7 +2563,7 @@@ F:      arch/powerpc/oprofile/*cell
  F:    arch/powerpc/platforms/cell/
  
  CEPH DISTRIBUTED FILE SYSTEM CLIENT
 -M:    Yan, Zheng <zyan@redhat.com>
 +M:    "Yan, Zheng" <zyan@redhat.com>
  M:    Sage Weil <sage@redhat.com>
  L:    ceph-devel@vger.kernel.org
  W:    http://ceph.com/
@@@ -2709,13 -2589,6 +2709,13 @@@ L:    linux-scsi@vger.kernel.or
  S:    Supported
  F:    drivers/scsi/fnic/
  
 +CISCO SCSI HBA DRIVER
 +M:    Narsimhulu Musini <nmusini@cisco.com>
 +M:    Sesidhar Baddela <sebaddel@cisco.com>
 +L:    linux-scsi@vger.kernel.org
 +S:    Supported
 +F:    drivers/scsi/snic/
 +
  CMPC ACPI DRIVER
  M:    Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
  M:    Daniel Oliveira Nascimento <don@syst.com.br>
@@@ -2723,14 -2596,6 +2723,14 @@@ L:    platform-driver-x86@vger.kernel.or
  S:    Supported
  F:    drivers/platform/x86/classmate-laptop.c
  
 +COBALT MEDIA DRIVER
 +M:    Hans Verkuil <hans.verkuil@cisco.com>
 +L:    linux-media@vger.kernel.org
 +T:    git git://linuxtv.org/media_tree.git
 +W:    http://linuxtv.org
 +S:    Supported
 +F:    drivers/media/pci/cobalt/
 +
  COCCINELLE/Semantic Patches (SmPL)
  M:    Julia Lawall <Julia.Lawall@lip6.fr>
  M:    Gilles Muller <Gilles.Muller@lip6.fr>
@@@ -2830,7 -2695,6 +2830,7 @@@ F:      drivers/connector
  CONTROL GROUP (CGROUP)
  M:    Tejun Heo <tj@kernel.org>
  M:    Li Zefan <lizefan@huawei.com>
 +M:    Johannes Weiner <hannes@cmpxchg.org>
  L:    cgroups@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git
  S:    Maintained
@@@ -2878,7 -2742,7 +2878,7 @@@ S:      Maintaine
  F:    drivers/net/ethernet/ti/cpmac.c
  
  CPU FREQUENCY DRIVERS
 -M:    Rafael J. Wysocki <rjw@rjwysocki.net>
 +M:    "Rafael J. Wysocki" <rjw@rjwysocki.net>
  M:    Viresh Kumar <viresh.kumar@linaro.org>
  L:    linux-pm@vger.kernel.org
  S:    Maintained
@@@ -2917,7 -2781,7 +2917,7 @@@ F:      drivers/cpuidle/cpuidle-exynos.
  F:    arch/arm/mach-exynos/pm.c
  
  CPUIDLE DRIVERS
 -M:    Rafael J. Wysocki <rjw@rjwysocki.net>
 +M:    "Rafael J. Wysocki" <rjw@rjwysocki.net>
  M:    Daniel Lezcano <daniel.lezcano@linaro.org>
  L:    linux-pm@vger.kernel.org
  S:    Maintained
@@@ -3003,15 -2867,6 +3003,15 @@@ S:    Maintaine
  F:    drivers/media/common/cx2341x*
  F:    include/media/cx2341x*
  
 +CX24120 MEDIA DRIVER
 +M:    Jemma Denson <jdenson@gmail.com>
 +M:    Patrick Boettcher <patrick.boettcher@posteo.de>
 +L:    linux-media@vger.kernel.org
 +W:    http://linuxtv.org/
 +Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 +S:    Maintained
 +F:    drivers/media/dvb-frontends/cx24120*
 +
  CX88 VIDEO4LINUX DRIVER
  M:    Mauro Carvalho Chehab <mchehab@osg.samsung.com>
  L:    linux-media@vger.kernel.org
@@@ -3086,7 -2941,7 +3086,7 @@@ M:      Michael Neuling <mikey@neuling.org
  L:    linuxppc-dev@lists.ozlabs.org
  S:    Supported
  F:    drivers/misc/cxl/
 -F:    include/misc/cxl.h
 +F:    include/misc/cxl*
  F:    include/uapi/misc/cxl.h
  F:    Documentation/powerpc/cxl.txt
  F:    Documentation/powerpc/cxl.txt
@@@ -3222,9 -3077,9 +3222,9 @@@ S:      Maintaine
  F:    drivers/platform/x86/dell-smo8800.c
  
  DELL LAPTOP SMM DRIVER
 -M:    Guenter Roeck <linux@roeck-us.net>
 +M:    Pali Rohár <pali.rohar@gmail.com>
  S:    Maintained
 -F:    drivers/char/i8k.c
 +F:    drivers/hwmon/dell-smm-hwmon.c
  F:    include/uapi/linux/i8k.h
  
  DELL SYSTEMS MANAGEMENT BASE DRIVER (dcdbas)
@@@ -3419,8 -3274,6 +3419,8 @@@ F:      drivers/hwmon/dme1737.
  DMI/SMBIOS SUPPORT
  M:    Jean Delvare <jdelvare@suse.de>
  S:    Maintained
 +T:    quilt http://jdelvare.nerim.net/devel/linux/jdelvare-dmi/
 +F:    Documentation/ABI/testing/sysfs-firmware-dmi-tables
  F:    drivers/firmware/dmi-id.c
  F:    drivers/firmware/dmi_scan.c
  F:    include/linux/dmi.h
@@@ -3465,17 -3318,16 +3465,17 @@@ F:   drivers/block/drbd
  F:    lib/lru_cache.c
  F:    Documentation/blockdev/drbd/
  
 -DRIVER CORE, KOBJECTS, DEBUGFS AND SYSFS
 +DRIVER CORE, KOBJECTS, DEBUGFS, KERNFS AND SYSFS
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git
  S:    Supported
  F:    Documentation/kobject.txt
  F:    drivers/base/
 -F:    fs/sysfs/
  F:    fs/debugfs/
 -F:    include/linux/kobj*
 +F:    fs/kernfs/
 +F:    fs/sysfs/
  F:    include/linux/debugfs.h
 +F:    include/linux/kobj*
  F:    lib/kobj*
  
  DRM DRIVERS
@@@ -3581,14 -3433,6 +3581,14 @@@ L:    netdev@vger.kernel.or
  S:    Maintained
  F:    drivers/net/wan/dscc4.c
  
 +DT3155 MEDIA DRIVER
 +M:    Hans Verkuil <hverkuil@xs4all.nl>
 +L:    linux-media@vger.kernel.org
 +T:    git git://linuxtv.org/media_tree.git
 +W:    http://linuxtv.org
 +S:    Odd Fixes
 +F:    drivers/media/pci/dt3155/
 +
  DVB_USB_AF9015 MEDIA DRIVER
  M:    Antti Palosaari <crope@iki.fi>
  L:    linux-media@vger.kernel.org
@@@ -3871,7 -3715,7 +3871,7 @@@ S:      Maintaine
  F:    drivers/edac/ie31200_edac.c
  
  EDAC-MPC85XX
 -M:    Johannes Thumshirn <johannes.thumshirn@men.de>
 +M:    Johannes Thumshirn <morbidrsa@gmail.com>
  L:    linux-edac@vger.kernel.org
  W:    bluesmoke.sourceforge.net
  S:    Maintained
@@@ -3898,13 -3742,6 +3898,13 @@@ W:    bluesmoke.sourceforge.ne
  S:    Maintained
  F:    drivers/edac/sb_edac.c
  
 +EDAC-XGENE
 +APPLIED MICRO (APM) X-GENE SOC EDAC
 +M:     Loc Ho <lho@apm.com>
 +S:     Supported
 +F:     drivers/edac/xgene_edac.c
 +F:     Documentation/devicetree/bindings/edac/apm-xgene-edac.txt
 +
  EDIROL UA-101/UA-1000 DRIVER
  M:    Clemens Ladisch <clemens@ladisch.de>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
@@@ -3973,11 -3810,10 +3973,11 @@@ M:   David Woodhouse <dwmw2@infradead.org
  L:    linux-embedded@vger.kernel.org
  S:    Maintained
  
 -EMULEX LPFC FC SCSI DRIVER
 -M:    James Smart <james.smart@emulex.com>
 +EMULEX/AVAGO LPFC FC/FCOE SCSI DRIVER
 +M:    James Smart <james.smart@avagotech.com>
 +M:    Dick Kennedy <dick.kennedy@avagotech.com>
  L:    linux-scsi@vger.kernel.org
 -W:    http://sourceforge.net/projects/lpfcxxxx
 +W:    http://www.avagotech.com
  S:    Supported
  F:    drivers/scsi/lpfc/
  
@@@ -4076,7 -3912,7 +4076,7 @@@ F:      drivers/extcon
  F:    Documentation/extcon/
  
  EXYNOS DP DRIVER
 -M:    Jingoo Han <jg1.han@samsung.com>
 +M:    Jingoo Han <jingoohan1@gmail.com>
  L:    dri-devel@lists.freedesktop.org
  S:    Maintained
  F:    drivers/gpu/drm/exynos/exynos_dp*
@@@ -4153,7 -3989,7 +4153,7 @@@ F:      include/uapi/scsi/fc
  
  FILE LOCKING (flock() and fcntl()/lockf())
  M:    Jeff Layton <jlayton@poochiereds.net>
 -M:    J. Bruce Fields <bfields@fieldses.org>
 +M:    "J. Bruce Fields" <bfields@fieldses.org>
  L:    linux-fsdevel@vger.kernel.org
  S:    Maintained
  F:    include/linux/fcntl.h
@@@ -4349,7 -4185,7 +4349,7 @@@ F:      sound/soc/fsl/imx
  F:    sound/soc/fsl/mpc8610_hpcd.c
  
  FREESCALE QORIQ MANAGEMENT COMPLEX DRIVER
 -M:    J. German Rivera <German.Rivera@freescale.com>
 +M:    "J. German Rivera" <German.Rivera@freescale.com>
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  F:    drivers/staging/fsl-mc/
@@@ -4535,10 -4371,11 +4535,10 @@@ F:   fs/gfs2
  F:    include/uapi/linux/gfs2_ondisk.h
  
  GIGASET ISDN DRIVERS
 -M:    Hansjoerg Lipp <hjlipp@web.de>
 -M:    Tilman Schmidt <tilman@imap.cc>
 +M:    Paul Bolle <pebolle@tiscali.nl>
  L:    gigaset307x-common@lists.sourceforge.net
  W:    http://gigaset307x.sourceforge.net/
 -S:    Maintained
 +S:    Odd Fixes
  F:    Documentation/isdn/README.gigaset
  F:    drivers/isdn/gigaset/
  F:    include/uapi/linux/gigaset_dev.h
@@@ -4631,7 -4468,7 +4631,7 @@@ S:      Maintaine
  F:    drivers/media/usb/gspca/
  
  GUID PARTITION TABLE (GPT)
 -M:    Davidlohr Bueso <davidlohr@hp.com>
 +M:    Davidlohr Bueso <dave@stgolabs.net>
  L:    linux-efi@vger.kernel.org
  S:    Maintained
  F:    block/partitions/efi.*
@@@ -4643,17 -4480,6 +4643,17 @@@ T:    git git://linuxtv.org/media_tree.gi
  S:    Maintained
  F:    drivers/media/usb/stk1160/
  
 +H8/300 ARCHITECTURE
 +M:    Yoshinori Sato <ysato@users.sourceforge.jp>
 +L:    uclinux-h8-devel@lists.sourceforge.jp
 +W:    http://uclinux-h8.sourceforge.jp
 +T:    git git://git.sourceforge.jp/gitroot/uclinux-h8/linux.git
 +S:    Maintained
 +F:    arch/h8300/
 +F:    drivers/clocksource/h8300_*.c
 +F:    drivers/clk/h8300/
 +F:    drivers/irqchip/irq-renesas-h8*.c
 +
  HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER
  M:    Frank Seidel <frank@f-seidel.de>
  L:    platform-driver-x86@vger.kernel.org
@@@ -4696,7 -4522,7 +4696,7 @@@ M:      Jean Delvare <jdelvare@suse.de
  M:    Guenter Roeck <linux@roeck-us.net>
  L:    lm-sensors@lm-sensors.org
  W:    http://www.lm-sensors.org/
 -T:    quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-hwmon/
 +T:    quilt http://jdelvare.nerim.net/devel/linux/jdelvare-hwmon/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
  S:    Maintained
  F:    Documentation/hwmon/
@@@ -4803,18 -4629,6 +4803,18 @@@ F:    drivers/hid
  F:    include/linux/hid*
  F:    include/uapi/linux/hid*
  
 +HID SENSOR HUB DRIVERS
 +M:    Jiri Kosina <jkosina@suse.cz>
 +M:    Jonathan Cameron <jic23@kernel.org>
 +M:    Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
 +L:    linux-input@vger.kernel.org
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/hid/hid-sensor*
 +F:    drivers/hid/hid-sensor-*
 +F:    drivers/iio/*/hid-*
 +F:    include/linux/hid-sensor-*
 +
  HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS
  M:    Thomas Gleixner <tglx@linutronix.de>
  L:    linux-kernel@vger.kernel.org
@@@ -4921,7 -4735,7 +4921,7 @@@ S:      Maintaine
  F:    fs/hugetlbfs/
  
  Hyper-V CORE AND DRIVERS
 -M:    K. Y. Srinivasan <kys@microsoft.com>
 +M:    "K. Y. Srinivasan" <kys@microsoft.com>
  M:    Haiyang Zhang <haiyangz@microsoft.com>
  L:    devel@linuxdriverproject.org
  S:    Maintained
@@@ -5051,23 -4865,13 +5051,23 @@@ M:   Marcelo Henrique Cerri <mhcerri@linu
  M:    Fionnuala Gunter <fin@linux.vnet.ibm.com>
  L:    linux-crypto@vger.kernel.org
  S:    Supported
 -F:    drivers/crypto/nx/
 +F:    drivers/crypto/nx/Makefile
 +F:    drivers/crypto/nx/Kconfig
 +F:    drivers/crypto/nx/nx-aes*
 +F:    drivers/crypto/nx/nx-sha*
 +F:    drivers/crypto/nx/nx.*
 +F:    drivers/crypto/nx/nx_csbcpb.h
 +F:    drivers/crypto/nx/nx_debugfs.h
  
  IBM Power 842 compression accelerator
  M:    Dan Streetman <ddstreet@us.ibm.com>
  S:    Supported
 -F:    drivers/crypto/nx/nx-842.c
 -F:    include/linux/nx842.h
 +F:    drivers/crypto/nx/Makefile
 +F:    drivers/crypto/nx/Kconfig
 +F:    drivers/crypto/nx/nx-842*
 +F:    include/linux/sw842.h
 +F:    crypto/842.c
 +F:    lib/842/
  
  IBM Power Linux RAID adapter
  M:    Brian King <brking@us.ibm.com>
@@@ -5238,19 -5042,17 +5238,19 @@@ S:   Orpha
  F:    drivers/video/fbdev/imsttfb.c
  
  INFINIBAND SUBSYSTEM
 -M:    Roland Dreier <roland@kernel.org>
 +M:    Doug Ledford <dledford@redhat.com>
  M:    Sean Hefty <sean.hefty@intel.com>
  M:    Hal Rosenstock <hal.rosenstock@gmail.com>
  L:    linux-rdma@vger.kernel.org
  W:    http://www.openfabrics.org/
  Q:    http://patchwork.kernel.org/project/linux-rdma/list/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma.git
  S:    Supported
  F:    Documentation/infiniband/
  F:    drivers/infiniband/
  F:    include/uapi/linux/if_infiniband.h
 +F:    include/uapi/rdma/
 +F:    include/rdma/
  
  INOTIFY
  M:    John McCutchan <john@johnmccutchan.com>
@@@ -5276,6 -5078,7 +5276,6 @@@ F:      include/linux/input
  INPUT MULTITOUCH (MT) PROTOCOL
  M:    Henrik Rydberg <rydberg@bitmath.org>
  L:    linux-input@vger.kernel.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rydberg/input-mt.git
  S:    Odd fixes
  F:    Documentation/input/multi-touch-protocol.txt
  F:    drivers/input/input-mt.c
@@@ -5283,7 -5086,7 +5283,7 @@@ K:      \b(ABS|SYN)_MT
  
  INTEL ASoC BDW/HSW DRIVERS
  M:    Jie Yang <yang.jie@linux.intel.com>
 -L:    alsa-devel@alsa-project.org
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  S:    Supported
  F:    sound/soc/intel/sst-haswell*
  F:    sound/soc/intel/sst-dsp*
@@@ -5460,7 -5263,6 +5460,7 @@@ M:      Tomas Winkler <tomas.winkler@intel.c
  L:    linux-kernel@vger.kernel.org
  S:    Supported
  F:    include/uapi/linux/mei.h
 +F:    include/linux/mei_cl_bus.h
  F:    drivers/misc/mei/*
  F:    Documentation/misc-devices/mei/*
  
@@@ -6003,7 -5805,6 +6003,7 @@@ F:      drivers/scsi/53c700
  LED SUBSYSTEM
  M:    Bryan Wu <cooloney@gmail.com>
  M:    Richard Purdie <rpurdie@rpsys.net>
 +M:    Jacek Anaszewski <j.anaszewski@samsung.com>
  L:    linux-leds@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds.git
  S:    Maintained
@@@ -6526,15 -6327,6 +6526,15 @@@ W:    http://linuxtv.or
  S:    Maintained
  F:    drivers/media/radio/radio-maxiradio*
  
 +MEDIA DRIVERS FOR RENESAS - VSP1
 +M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 +L:    linux-media@vger.kernel.org
 +L:    linux-sh@vger.kernel.org
 +T:    git git://linuxtv.org/media_tree.git
 +S:    Supported
 +F:    Documentation/devicetree/bindings/media/renesas,vsp1.txt
 +F:    drivers/media/platform/vsp1/
 +
  MEDIA INPUT INFRASTRUCTURE (V4L/DVB)
  M:    Mauro Carvalho Chehab <mchehab@osg.samsung.com>
  P:    LinuxTV.org Project
@@@ -6557,12 -6349,6 +6557,12 @@@ F:    include/uapi/linux/meye.
  F:    include/uapi/linux/ivtv*
  F:    include/uapi/linux/uvcvideo.h
  
 +MEDIATEK MT7601U WIRELESS LAN DRIVER
 +M:    Jakub Kicinski <kubakici@wp.pl>
 +L:    linux-wireless@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/wireless/mediatek/mt7601u/
 +
  MEGARAID SCSI/SAS DRIVERS
  M:    Kashyap Desai <kashyap.desai@avagotech.com>
  M:    Sumit Saxena <sumit.saxena@avagotech.com>
@@@ -6609,14 -6395,14 +6609,14 @@@ F:   include/linux/mtd
  F:    include/uapi/mtd/
  
  MEN A21 WATCHDOG DRIVER
 -M:    Johannes Thumshirn <johannes.thumshirn@men.de>
 +M:    Johannes Thumshirn <morbidrsa@gmail.com>
  L:    linux-watchdog@vger.kernel.org
 -S:    Supported
 +S:    Maintained
  F:    drivers/watchdog/mena21_wdt.c
  
  MEN CHAMELEON BUS (mcb)
 -M:    Johannes Thumshirn <johannes.thumshirn@men.de>
 -S:    Supported
 +M:    Johannes Thumshirn <morbidrsa@gmail.com>
 +S:    Maintained
  F:    drivers/mcb/
  F:    include/linux/mcb.h
  
@@@ -6876,7 -6662,7 +6876,7 @@@ F:      drivers/net/ethernet/natsemi/natsemi
  NATIVE INSTRUMENTS USB SOUND INTERFACE DRIVER
  M:    Daniel Mack <zonque@gmail.com>
  S:    Maintained
 -L:    alsa-devel@alsa-project.org
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  W:    http://www.native-instruments.com
  F:    sound/usb/caiaq/
  
@@@ -7164,17 -6950,6 +7164,17 @@@ T:    git git://git.rocketboards.org/linux
  S:    Maintained
  F:    arch/nios2/
  
 +NOKIA N900 POWER SUPPLY DRIVERS
 +M:    Pali Rohár <pali.rohar@gmail.com>
 +S:    Maintained
 +F:    include/linux/power/bq2415x_charger.h
 +F:    include/linux/power/bq27x00_battery.h
 +F:    include/linux/power/isp1704_charger.h
 +F:    drivers/power/bq2415x_charger.c
 +F:    drivers/power/bq27x00_battery.c
 +F:    drivers/power/isp1704_charger.c
 +F:    drivers/power/rx51_battery.c
 +
  NTB DRIVER
  M:    Jon Mason <jdmason@kudzu.us>
  M:    Dave Jiang <dave.jiang@intel.com>
@@@ -7294,7 -7069,7 +7294,7 @@@ F:      arch/arm/mach-omap2/prm
  OMAP AUDIO SUPPORT
  M:    Peter Ujfalusi <peter.ujfalusi@ti.com>
  M:    Jarkko Nikula <jarkko.nikula@bitmer.com>
 -L:    alsa-devel@alsa-project.org (subscribers-only)
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  L:    linux-omap@vger.kernel.org
  S:    Maintained
  F:    sound/soc/omap/
@@@ -7589,16 -7364,13 +7589,16 @@@ S:   Maintaine
  F:    Documentation/mn10300/
  F:    arch/mn10300/
  
 -PARALLEL PORT SUPPORT
 +PARALLEL PORT SUBSYSTEM
 +M:    Sudip Mukherjee <sudipm.mukherjee@gmail.com>
 +M:    Sudip Mukherjee <sudip@vectorindia.org>
  L:    linux-parport@lists.infradead.org (subscribers-only)
 -S:    Orphan
 +S:    Maintained
  F:    drivers/parport/
  F:    include/linux/parport*.h
  F:    drivers/char/ppdev.c
  F:    include/uapi/linux/ppdev.h
 +F:    Documentation/parport*.txt
  
  PARAVIRT_OPS INTERFACE
  M:    Jeremy Fitzhardinge <jeremy@goop.org>
@@@ -7766,7 -7538,7 +7766,7 @@@ S:      Maintaine
  F:    drivers/pci/host/*rcar*
  
  PCI DRIVER FOR SAMSUNG EXYNOS
 -M:    Jingoo Han <jg1.han@samsung.com>
 +M:    Jingoo Han <jingoohan1@gmail.com>
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
@@@ -7774,8 -7546,7 +7774,8 @@@ S:      Maintaine
  F:    drivers/pci/host/pci-exynos.c
  
  PCI DRIVER FOR SYNOPSIS DESIGNWARE
 -M:    Jingoo Han <jg1.han@samsung.com>
 +M:    Jingoo Han <jingoohan1@gmail.com>
 +M:    Pratyush Anand <pratyush.anand@gmail.com>
  L:    linux-pci@vger.kernel.org
  S:    Maintained
  F:    drivers/pci/host/*designware*
@@@ -7789,19 -7560,10 +7789,19 @@@ F:   Documentation/devicetree/bindings/pc
  F:    drivers/pci/host/pci-host-generic.c
  
  PCIE DRIVER FOR ST SPEAR13XX
 +M:    Pratyush Anand <pratyush.anand@gmail.com>
  L:    linux-pci@vger.kernel.org
 -S:    Orphan
 +S:    Maintained
  F:    drivers/pci/host/*spear*
  
 +PCI MSI DRIVER FOR APPLIEDMICRO XGENE
 +M:    Duc Dang <dhdang@apm.com>
 +L:    linux-pci@vger.kernel.org
 +L:    linux-arm-kernel@lists.infradead.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/pci/xgene-pci-msi.txt
 +F:    drivers/pci/host/pci-xgene-msi.c
 +
  PCMCIA SUBSYSTEM
  P:    Linux PCMCIA Team
  L:    linux-pcmcia@lists.infradead.org
@@@ -7842,6 -7604,7 +7842,6 @@@ F:      kernel/delayacct.
  
  PERFORMANCE EVENTS SUBSYSTEM
  M:    Peter Zijlstra <a.p.zijlstra@chello.nl>
 -M:    Paul Mackerras <paulus@samba.org>
  M:    Ingo Molnar <mingo@redhat.com>
  M:    Arnaldo Carvalho de Melo <acme@kernel.org>
  L:    linux-kernel@vger.kernel.org
@@@ -7999,7 -7762,7 +7999,7 @@@ F:      include/linux/power_supply.
  F:    drivers/power/
  
  PNP SUPPORT
 -M:    Rafael J. Wysocki <rafael.j.wysocki@intel.com>
 +M:    "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
  S:    Maintained
  F:    drivers/pnp/
  
@@@ -8068,13 -7831,14 +8068,13 @@@ F:   drivers/net/wireless/prism54
  PS3 NETWORK SUPPORT
  M:    Geoff Levand <geoff@infradead.org>
  L:    netdev@vger.kernel.org
 -L:    cbe-oss-dev@lists.ozlabs.org
 +L:    linuxppc-dev@lists.ozlabs.org
  S:    Maintained
  F:    drivers/net/ethernet/toshiba/ps3_gelic_net.*
  
  PS3 PLATFORM SUPPORT
  M:    Geoff Levand <geoff@infradead.org>
  L:    linuxppc-dev@lists.ozlabs.org
 -L:    cbe-oss-dev@lists.ozlabs.org
  S:    Maintained
  F:    arch/powerpc/boot/ps3*
  F:    arch/powerpc/include/asm/lv1call.h
@@@ -8088,8 -7852,7 +8088,8 @@@ F:      sound/ppc/snd_ps3
  
  PS3VRAM DRIVER
  M:    Jim Paris <jim@jtan.com>
 -L:    cbe-oss-dev@lists.ozlabs.org
 +M:    Geoff Levand <geoff@infradead.org>
 +L:    linuxppc-dev@lists.ozlabs.org
  S:    Maintained
  F:    drivers/block/ps3vram.c
  
@@@ -8174,6 -7937,7 +8174,7 @@@ T:      git git://github.com/hzhuang1/linux.
  T:    git git://github.com/rjarzmik/linux.git
  S:    Maintained
  F:    arch/arm/mach-pxa/
+ F:    drivers/dma/pxa*
  F:    drivers/pcmcia/pxa2xx*
  F:    drivers/spi/spi-pxa2xx*
  F:    drivers/usb/gadget/udc/pxa2*
@@@ -8353,6 -8117,8 +8354,6 @@@ P:      rt2x00 projec
  M:    Stanislaw Gruszka <sgruszka@redhat.com>
  M:    Helmut Schaa <helmut.schaa@googlemail.com>
  L:    linux-wireless@vger.kernel.org
 -L:    users@rt2x00.serialmonkey.com (moderated for non-subscribers)
 -W:    http://rt2x00.serialmonkey.com/
  S:    Maintained
  F:    drivers/net/wireless/rt2x00/
  
@@@ -8442,7 -8208,6 +8443,7 @@@ M:      Alessandro Zummo <a.zummo@towertech.
  M:    Alexandre Belloni <alexandre.belloni@free-electrons.com>
  L:    rtc-linux@googlegroups.com
  Q:    http://patchwork.ozlabs.org/project/rtc-linux/list/
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux.git
  S:    Maintained
  F:    Documentation/rtc.txt
  F:    drivers/rtc/
@@@ -8738,25 -8503,19 +8739,25 @@@ S:   Supporte
  F:    sound/soc/samsung/
  
  SAMSUNG FRAMEBUFFER DRIVER
 -M:    Jingoo Han <jg1.han@samsung.com>
 +M:    Jingoo Han <jingoohan1@gmail.com>
  L:    linux-fbdev@vger.kernel.org
  S:    Maintained
  F:    drivers/video/fbdev/s3c-fb.c
  
 -SAMSUNG MULTIFUNCTION DEVICE DRIVERS
 +SAMSUNG MULTIFUNCTION PMIC DEVICE DRIVERS
  M:    Sangbeom Kim <sbkim73@samsung.com>
 +M:    Krzysztof Kozlowski <k.kozlowski@samsung.com>
  L:    linux-kernel@vger.kernel.org
 +L:    linux-samsung-soc@vger.kernel.org
  S:    Supported
  F:    drivers/mfd/sec*.c
  F:    drivers/regulator/s2m*.c
  F:    drivers/regulator/s5m*.c
 +F:    drivers/clk/clk-s2mps11.c
 +F:    drivers/rtc/rtc-s5m.c
  F:    include/linux/mfd/samsung/
 +F:    Documentation/devicetree/bindings/regulator/s5m8767-regulator.txt
 +F:    Documentation/devicetree/bindings/mfd/s2mp*.txt
  
  SAMSUNG S5P/EXYNOS4 SOC SERIES CAMERA SUBSYSTEM DRIVERS
  M:    Kyungmin Park <kyungmin.park@samsung.com>
@@@ -8986,7 -8745,6 +8987,7 @@@ S:      Supporte
  F:    kernel/seccomp.c
  F:    include/uapi/linux/seccomp.h
  F:    include/linux/seccomp.h
 +F:    tools/testing/selftests/seccomp/*
  K:    \bsecure_computing
  K:    \bTIF_SECCOMP\b
  
@@@ -9006,7 -8764,7 +9007,7 @@@ F:      drivers/mmc/host/sdhci-spear.
  
  SECURITY SUBSYSTEM
  M:    James Morris <james.l.morris@oracle.com>
 -M:    Serge E. Hallyn <serge@hallyn.com>
 +M:    "Serge E. Hallyn" <serge@hallyn.com>
  L:    linux-security-module@vger.kernel.org (suggested Cc:)
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security.git
  W:    http://kernsec.org/
@@@ -9044,19 -8802,16 +9045,19 @@@ F:   drivers/misc/phantom.
  F:    include/uapi/linux/phantom.h
  
  SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
 -M:    Jayamohan Kallickal <jayamohan.kallickal@emulex.com>
 +M:    Jayamohan Kallickal <jayamohan.kallickal@avagotech.com>
 +M:    Minh Tran <minh.tran@avagotech.com>
 +M:    John Soni Jose <sony.john-n@avagotech.com>
  L:    linux-scsi@vger.kernel.org
 -W:    http://www.emulex.com
 +W:    http://www.avagotech.com
  S:    Supported
  F:    drivers/scsi/be2iscsi/
  
 -SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER
 -M:    Sathya Perla <sathya.perla@emulex.com>
 -M:    Subbu Seetharaman <subbu.seetharaman@emulex.com>
 -M:    Ajit Khaparde <ajit.khaparde@emulex.com>
 +Emulex 10Gbps NIC BE2, BE3-R, Lancer, Skyhawk-R DRIVER
 +M:    Sathya Perla <sathya.perla@avagotech.com>
 +M:    Ajit Khaparde <ajit.khaparde@avagotech.com>
 +M:    Padmanabh Ratnakar <padmanabh.ratnakar@avagotech.com>
 +M:    Sriharsha Basavapatna <sriharsha.basavapatna@avagotech.com>
  L:    netdev@vger.kernel.org
  W:    http://www.emulex.com
  S:    Supported
@@@ -9226,7 -8981,7 +9227,7 @@@ F:      arch/arm/mach-davinci
  F:    drivers/i2c/busses/i2c-davinci.c
  
  TI DAVINCI SERIES MEDIA DRIVER
 -M:    Lad, Prabhakar <prabhakar.csengg@gmail.com>
 +M:    "Lad, Prabhakar" <prabhakar.csengg@gmail.com>
  L:    linux-media@vger.kernel.org
  W:    http://linuxtv.org/
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
@@@ -9236,7 -8991,7 +9237,7 @@@ F:      drivers/media/platform/davinci
  F:    include/media/davinci/
  
  TI AM437X VPFE DRIVER
 -M:    Lad, Prabhakar <prabhakar.csengg@gmail.com>
 +M:    "Lad, Prabhakar" <prabhakar.csengg@gmail.com>
  L:    linux-media@vger.kernel.org
  W:    http://linuxtv.org/
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
@@@ -9245,7 -9000,7 +9246,7 @@@ S:      Maintaine
  F:    drivers/media/platform/am437x/
  
  OV2659 OMNIVISION SENSOR DRIVER
 -M:    Lad, Prabhakar <prabhakar.csengg@gmail.com>
 +M:    "Lad, Prabhakar" <prabhakar.csengg@gmail.com>
  L:    linux-media@vger.kernel.org
  W:    http://linuxtv.org/
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
@@@ -9574,6 -9329,7 +9575,6 @@@ F:      drivers/net/ethernet/toshiba/spider_
  SPU FILE SYSTEM
  M:    Jeremy Kerr <jk@ozlabs.org>
  L:    linuxppc-dev@lists.ozlabs.org
 -L:    cbe-oss-dev@lists.ozlabs.org
  W:    http://www.ibm.com/developerworks/power/cell/
  S:    Supported
  F:    Documentation/filesystems/spufs.txt
@@@ -9712,15 -9468,6 +9713,15 @@@ M:    Forest Bond <forest@alittletooquiet.
  S:    Odd Fixes
  F:    drivers/staging/vt665?/
  
 +STAGING - WILC1000 WIFI DRIVER
 +M:    Johnny Kim <johnny.kim@atmel.com>
 +M:    Rachel Kim <rachel.kim@atmel.com>
 +M:    Dean Lee <dean.lee@atmel.com>
 +M:    Chris Park <chris.park@atmel.com>
 +L:    linux-wireless@vger.kernel.org
 +S:    Supported
 +F:    drivers/staging/wilc1000/
 +
  STAGING - XGI Z7,Z9,Z11 PCI DISPLAY DRIVER
  M:    Arnaud Patard <arnaud.patard@rtp-net.org>
  S:    Odd Fixes
@@@ -9804,13 -9551,6 +9805,13 @@@ F:    arch/arc
  F:    Documentation/devicetree/bindings/arc/
  F:    drivers/tty/serial/arc_uart.c
  
 +SYSTEM CONFIGURATION (SYSCON)
 +M:    Lee Jones <lee.jones@linaro.org>
 +M:    Arnd Bergmann <arnd@arndb.de>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git
 +S:    Supported
 +F:    drivers/mfd/syscon.c
 +
  SYSV FILESYSTEM
  M:    Christoph Hellwig <hch@infradead.org>
  S:    Maintained
@@@ -9819,7 -9559,7 +9820,7 @@@ F:      fs/sysv
  F:    include/linux/sysv_fs.h
  
  TARGET SUBSYSTEM
 -M:    Nicholas A. Bellinger <nab@linux-iscsi.org>
 +M:    "Nicholas A. Bellinger" <nab@linux-iscsi.org>
  L:    linux-scsi@vger.kernel.org
  L:    target-devel@vger.kernel.org
  W:    http://www.linux-iscsi.org
@@@ -9961,7 -9701,7 +9962,7 @@@ F:      include/linux/if_team.
  F:    include/uapi/linux/if_team.h
  
  TECHNOLOGIC SYSTEMS TS-5500 PLATFORM SUPPORT
 -M:    Savoir-faire Linux Inc. <kernel@savoirfairelinux.com>
 +M:    "Savoir-faire Linux Inc." <kernel@savoirfairelinux.com>
  S:    Maintained
  F:    arch/x86/platform/ts5500/
  
@@@ -10152,12 -9892,6 +10153,12 @@@ L:  netdev@vger.kernel.or
  S:    Maintained
  F:    drivers/net/ethernet/ti/netcp*
  
 +TI TAS571X FAMILY ASoC CODEC DRIVER
 +M:    Kevin Cernekee <cernekee@chromium.org>
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Odd Fixes
 +F:    sound/soc/codecs/tas571x*
 +
  TI TWL4030 SERIES SOC CODEC DRIVER
  M:    Peter Ujfalusi <peter.ujfalusi@ti.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
@@@ -10251,7 -9985,7 +10252,7 @@@ F:    include/linux/toshiba.
  F:    include/uapi/linux/toshiba.h
  
  TMIO MMC DRIVER
 -M:    Ian Molton <ian.molton@codethink.co.uk>
 +M:    Ian Molton <ian@mnementh.co.uk>
  L:    linux-mmc@vger.kernel.org
  S:    Maintained
  F:    drivers/mmc/host/tmio_mmc*
@@@ -10332,7 -10066,6 +10333,7 @@@ M:   Greg Kroah-Hartman <gregkh@linuxfoun
  M:    Jiri Slaby <jslaby@suse.cz>
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git
 +F:    Documentation/serial/
  F:    drivers/tty/
  F:    drivers/tty/serial/serial_core.c
  F:    include/linux/serial_core.h
@@@ -10390,15 -10123,11 +10391,15 @@@ S:        Maintaine
  F:    Documentation/filesystems/ubifs.txt
  F:    fs/ubifs/
  
 -UCLINUX (AND M68KNOMMU)
 +UCLINUX (M68KNOMMU AND COLDFIRE)
  M:    Greg Ungerer <gerg@uclinux.org>
  W:    http://www.uclinux.org/
 +L:    linux-m68k@lists.linux-m68k.org
  L:    uclinux-dev@uclinux.org  (subscribers-only)
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu.git
  S:    Maintained
 +F:    arch/m68k/coldfire/
 +F:    arch/m68k/68*/
  F:    arch/m68k/*/*_no.*
  F:    arch/m68k/include/asm/*_no.*
  
@@@ -10732,13 -10461,6 +10733,13 @@@ S: Maintaine
  F:    Documentation/video4linux/zr364xx.txt
  F:    drivers/media/usb/zr364xx/
  
 +ULPI BUS
 +M:    Heikki Krogerus <heikki.krogerus@linux.intel.com>
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +F:    drivers/usb/common/ulpi.c
 +F:    include/linux/ulpi/
 +
  USER-MODE LINUX (UML)
  M:    Jeff Dike <jdike@addtoit.com>
  M:    Richard Weinberger <richard@nod.at>
@@@ -10791,12 -10513,6 +10792,12 @@@ F: drivers/vfio
  F:    include/linux/vfio.h
  F:    include/uapi/linux/vfio.h
  
 +VFIO PLATFORM DRIVER
 +M:    Baptiste Reynal <b.reynal@virtualopensystems.com>
 +L:    kvm@vger.kernel.org
 +S:    Maintained
 +F:    drivers/vfio/platform/
 +
  VIDEOBUF2 FRAMEWORK
  M:    Pawel Osciak <pawel@osciak.com>
  M:    Marek Szyprowski <m.szyprowski@samsung.com>
@@@ -10825,15 -10541,6 +10826,15 @@@ F: drivers/block/virtio_blk.
  F:    include/linux/virtio_*.h
  F:    include/uapi/linux/virtio_*.h
  
 +VIRTIO GPU DRIVER
 +M:    David Airlie <airlied@linux.ie>
 +M:    Gerd Hoffmann <kraxel@redhat.com>
 +L:    dri-devel@lists.freedesktop.org
 +L:    virtualization@lists.linux-foundation.org
 +S:    Maintained
 +F:    drivers/gpu/drm/virtio/
 +F:    include/uapi/linux/virtio_gpu.h
 +
  VIRTIO HOST (VHOST)
  M:    "Michael S. Tsirkin" <mst@redhat.com>
  L:    kvm@vger.kernel.org
@@@ -10850,7 -10557,8 +10851,7 @@@ F:   drivers/virtio/virtio_input.
  F:    include/uapi/linux/virtio_input.h
  
  VIA RHINE NETWORK DRIVER
 -M:    Roger Luethi <rl@hellgate.ch>
 -S:    Maintained
 +S:    Orphan
  F:    drivers/net/ethernet/via/via-rhine.c
  
  VIA SD/MMC CARD CONTROLLER DRIVER
@@@ -11156,7 -10864,7 +11157,7 @@@ M:   Andy Lutomirski <luto@amacapital.net
  L:    linux-kernel@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/vdso
  S:    Maintained
 -F:    arch/x86/vdso/
 +F:    arch/x86/entry/vdso/
  
  XC2028/3028 TUNER DRIVER
  M:    Mauro Carvalho Chehab <mchehab@osg.samsung.com>
@@@ -11330,7 -11038,6 +11331,7 @@@ F:   drivers/media/pci/zoran
  ZRAM COMPRESSED RAM BLOCK DEVICE DRVIER
  M:    Minchan Kim <minchan@kernel.org>
  M:    Nitin Gupta <ngupta@vflare.org>
 +R:    Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  F:    drivers/block/zram/
diff --combined drivers/dma/at_xdmac.c
index 7992164ea9ec2849f6ac3691629c47cda30aeb28,897e759b0c977e4d43f3e693ba229a966fccf0d2..cf1213de7865ecb95e20c9d273a57ec1981203a7
  #define AT_XDMAC_MBR_UBC_NDV3         (0x3 << 27)     /* Next Descriptor View 3 */
  
  #define AT_XDMAC_MAX_CHAN     0x20
 +#define AT_XDMAC_MAX_CSIZE    16      /* 16 data */
 +#define AT_XDMAC_MAX_DWIDTH   8       /* 64 bits */
  
  #define AT_XDMAC_DMA_BUSWIDTHS\
        (BIT(DMA_SLAVE_BUSWIDTH_UNDEFINED) |\
@@@ -194,17 -192,20 +194,17 @@@ struct at_xdmac_chan 
        struct dma_chan                 chan;
        void __iomem                    *ch_regs;
        u32                             mask;           /* Channel Mask */
 -      u32                             cfg[2];         /* Channel Configuration Register */
 -      #define AT_XDMAC_DEV_TO_MEM_CFG 0               /* Predifined dev to mem channel conf */
 -      #define AT_XDMAC_MEM_TO_DEV_CFG 1               /* Predifined mem to dev channel conf */
 +      u32                             cfg;            /* Channel Configuration Register */
        u8                              perid;          /* Peripheral ID */
        u8                              perif;          /* Peripheral Interface */
        u8                              memif;          /* Memory Interface */
 -      u32                             per_src_addr;
 -      u32                             per_dst_addr;
        u32                             save_cc;
        u32                             save_cim;
        u32                             save_cnda;
        u32                             save_cndc;
        unsigned long                   status;
        struct tasklet_struct           tasklet;
 +      struct dma_slave_config         sconfig;
  
        spinlock_t                      lock;
  
@@@ -235,6 -236,10 +235,10 @@@ struct at_xdmac_lld 
        dma_addr_t      mbr_sa;         /* Source Address Member */
        dma_addr_t      mbr_da;         /* Destination Address Member */
        u32             mbr_cfg;        /* Configuration Register */
+       u32             mbr_bc;         /* Block Control Register */
+       u32             mbr_ds;         /* Data Stride Register */
+       u32             mbr_sus;        /* Source Microblock Stride Register */
+       u32             mbr_dus;        /* Destination Microblock Stride Register */
  };
  
  
@@@ -358,6 -363,8 +362,8 @@@ static void at_xdmac_start_xfer(struct 
        if (at_xdmac_chan_is_cyclic(atchan)) {
                reg = AT_XDMAC_CNDC_NDVIEW_NDV1;
                at_xdmac_chan_write(atchan, AT_XDMAC_CC, first->lld.mbr_cfg);
+       } else if (first->lld.mbr_ubc & AT_XDMAC_MBR_UBC_NDV3) {
+               reg = AT_XDMAC_CNDC_NDVIEW_NDV3;
        } else {
                /*
                 * No need to write AT_XDMAC_CC reg, it will be done when the
@@@ -414,9 -421,8 +420,9 @@@ static dma_cookie_t at_xdmac_tx_submit(
        struct at_xdmac_desc    *desc = txd_to_at_desc(tx);
        struct at_xdmac_chan    *atchan = to_at_xdmac_chan(tx->chan);
        dma_cookie_t            cookie;
 +      unsigned long           irqflags;
  
 -      spin_lock_bh(&atchan->lock);
 +      spin_lock_irqsave(&atchan->lock, irqflags);
        cookie = dma_cookie_assign(tx);
  
        dev_vdbg(chan2dev(tx->chan), "%s: atchan 0x%p, add desc 0x%p to xfers_list\n",
        if (list_is_singular(&atchan->xfers_list))
                at_xdmac_start_xfer(atchan, desc);
  
 -      spin_unlock_bh(&atchan->lock);
 +      spin_unlock_irqrestore(&atchan->lock, irqflags);
        return cookie;
  }
  
@@@ -465,6 -471,33 +471,33 @@@ static struct at_xdmac_desc *at_xdmac_g
        return desc;
  }
  
+ static void at_xdmac_queue_desc(struct dma_chan *chan,
+                               struct at_xdmac_desc *prev,
+                               struct at_xdmac_desc *desc)
+ {
+       if (!prev || !desc)
+               return;
+       prev->lld.mbr_nda = desc->tx_dma_desc.phys;
+       prev->lld.mbr_ubc |= AT_XDMAC_MBR_UBC_NDE;
+       dev_dbg(chan2dev(chan), "%s: chain lld: prev=0x%p, mbr_nda=%pad\n",
+               __func__, prev, &prev->lld.mbr_nda);
+ }
+ static inline void at_xdmac_increment_block_count(struct dma_chan *chan,
+                                                 struct at_xdmac_desc *desc)
+ {
+       if (!desc)
+               return;
+       desc->lld.mbr_bc++;
+       dev_dbg(chan2dev(chan),
+               "%s: incrementing the block count of the desc 0x%p\n",
+               __func__, desc);
+ }
  static struct dma_chan *at_xdmac_xlate(struct of_phandle_args *dma_spec,
                                       struct of_dma *of_dma)
  {
        return chan;
  }
  
 +static int at_xdmac_compute_chan_conf(struct dma_chan *chan,
 +                                    enum dma_transfer_direction direction)
 +{
 +      struct at_xdmac_chan    *atchan = to_at_xdmac_chan(chan);
 +      int                     csize, dwidth;
 +
 +      if (direction == DMA_DEV_TO_MEM) {
 +              atchan->cfg =
 +                      AT91_XDMAC_DT_PERID(atchan->perid)
 +                      | AT_XDMAC_CC_DAM_INCREMENTED_AM
 +                      | AT_XDMAC_CC_SAM_FIXED_AM
 +                      | AT_XDMAC_CC_DIF(atchan->memif)
 +                      | AT_XDMAC_CC_SIF(atchan->perif)
 +                      | AT_XDMAC_CC_SWREQ_HWR_CONNECTED
 +                      | AT_XDMAC_CC_DSYNC_PER2MEM
 +                      | AT_XDMAC_CC_MBSIZE_SIXTEEN
 +                      | AT_XDMAC_CC_TYPE_PER_TRAN;
 +              csize = ffs(atchan->sconfig.src_maxburst) - 1;
 +              if (csize < 0) {
 +                      dev_err(chan2dev(chan), "invalid src maxburst value\n");
 +                      return -EINVAL;
 +              }
 +              atchan->cfg |= AT_XDMAC_CC_CSIZE(csize);
 +              dwidth = ffs(atchan->sconfig.src_addr_width) - 1;
 +              if (dwidth < 0) {
 +                      dev_err(chan2dev(chan), "invalid src addr width value\n");
 +                      return -EINVAL;
 +              }
 +              atchan->cfg |= AT_XDMAC_CC_DWIDTH(dwidth);
 +      } else if (direction == DMA_MEM_TO_DEV) {
 +              atchan->cfg =
 +                      AT91_XDMAC_DT_PERID(atchan->perid)
 +                      | AT_XDMAC_CC_DAM_FIXED_AM
 +                      | AT_XDMAC_CC_SAM_INCREMENTED_AM
 +                      | AT_XDMAC_CC_DIF(atchan->perif)
 +                      | AT_XDMAC_CC_SIF(atchan->memif)
 +                      | AT_XDMAC_CC_SWREQ_HWR_CONNECTED
 +                      | AT_XDMAC_CC_DSYNC_MEM2PER
 +                      | AT_XDMAC_CC_MBSIZE_SIXTEEN
 +                      | AT_XDMAC_CC_TYPE_PER_TRAN;
 +              csize = ffs(atchan->sconfig.dst_maxburst) - 1;
 +              if (csize < 0) {
 +                      dev_err(chan2dev(chan), "invalid src maxburst value\n");
 +                      return -EINVAL;
 +              }
 +              atchan->cfg |= AT_XDMAC_CC_CSIZE(csize);
 +              dwidth = ffs(atchan->sconfig.dst_addr_width) - 1;
 +              if (dwidth < 0) {
 +                      dev_err(chan2dev(chan), "invalid dst addr width value\n");
 +                      return -EINVAL;
 +              }
 +              atchan->cfg |= AT_XDMAC_CC_DWIDTH(dwidth);
 +      }
 +
 +      dev_dbg(chan2dev(chan), "%s: cfg=0x%08x\n", __func__, atchan->cfg);
 +
 +      return 0;
 +}
 +
 +/*
 + * Only check that maxburst and addr width values are supported by the
 + * the controller but not that the configuration is good to perform the
 + * transfer since we don't know the direction at this stage.
 + */
 +static int at_xdmac_check_slave_config(struct dma_slave_config *sconfig)
 +{
 +      if ((sconfig->src_maxburst > AT_XDMAC_MAX_CSIZE)
 +          || (sconfig->dst_maxburst > AT_XDMAC_MAX_CSIZE))
 +              return -EINVAL;
 +
 +      if ((sconfig->src_addr_width > AT_XDMAC_MAX_DWIDTH)
 +          || (sconfig->dst_addr_width > AT_XDMAC_MAX_DWIDTH))
 +              return -EINVAL;
 +
 +      return 0;
 +}
 +
  static int at_xdmac_set_slave_config(struct dma_chan *chan,
                                      struct dma_slave_config *sconfig)
  {
        struct at_xdmac_chan    *atchan = to_at_xdmac_chan(chan);
 -      u8 dwidth;
 -      int csize;
  
 -      atchan->cfg[AT_XDMAC_DEV_TO_MEM_CFG] =
 -              AT91_XDMAC_DT_PERID(atchan->perid)
 -              | AT_XDMAC_CC_DAM_INCREMENTED_AM
 -              | AT_XDMAC_CC_SAM_FIXED_AM
 -              | AT_XDMAC_CC_DIF(atchan->memif)
 -              | AT_XDMAC_CC_SIF(atchan->perif)
 -              | AT_XDMAC_CC_SWREQ_HWR_CONNECTED
 -              | AT_XDMAC_CC_DSYNC_PER2MEM
 -              | AT_XDMAC_CC_MBSIZE_SIXTEEN
 -              | AT_XDMAC_CC_TYPE_PER_TRAN;
 -      csize = at_xdmac_csize(sconfig->src_maxburst);
 -      if (csize < 0) {
 -              dev_err(chan2dev(chan), "invalid src maxburst value\n");
 -              return -EINVAL;
 -      }
 -      atchan->cfg[AT_XDMAC_DEV_TO_MEM_CFG] |= AT_XDMAC_CC_CSIZE(csize);
 -      dwidth = ffs(sconfig->src_addr_width) - 1;
 -      atchan->cfg[AT_XDMAC_DEV_TO_MEM_CFG] |= AT_XDMAC_CC_DWIDTH(dwidth);
 -
 -
 -      atchan->cfg[AT_XDMAC_MEM_TO_DEV_CFG] =
 -              AT91_XDMAC_DT_PERID(atchan->perid)
 -              | AT_XDMAC_CC_DAM_FIXED_AM
 -              | AT_XDMAC_CC_SAM_INCREMENTED_AM
 -              | AT_XDMAC_CC_DIF(atchan->perif)
 -              | AT_XDMAC_CC_SIF(atchan->memif)
 -              | AT_XDMAC_CC_SWREQ_HWR_CONNECTED
 -              | AT_XDMAC_CC_DSYNC_MEM2PER
 -              | AT_XDMAC_CC_MBSIZE_SIXTEEN
 -              | AT_XDMAC_CC_TYPE_PER_TRAN;
 -      csize = at_xdmac_csize(sconfig->dst_maxburst);
 -      if (csize < 0) {
 -              dev_err(chan2dev(chan), "invalid src maxburst value\n");
 +      if (at_xdmac_check_slave_config(sconfig)) {
 +              dev_err(chan2dev(chan), "invalid slave configuration\n");
                return -EINVAL;
        }
 -      atchan->cfg[AT_XDMAC_MEM_TO_DEV_CFG] |= AT_XDMAC_CC_CSIZE(csize);
 -      dwidth = ffs(sconfig->dst_addr_width) - 1;
 -      atchan->cfg[AT_XDMAC_MEM_TO_DEV_CFG] |= AT_XDMAC_CC_DWIDTH(dwidth);
  
 -      /* Src and dst addr are needed to configure the link list descriptor. */
 -      atchan->per_src_addr = sconfig->src_addr;
 -      atchan->per_dst_addr = sconfig->dst_addr;
 -
 -      dev_dbg(chan2dev(chan),
 -              "%s: cfg[dev2mem]=0x%08x, cfg[mem2dev]=0x%08x, per_src_addr=0x%08x, per_dst_addr=0x%08x\n",
 -              __func__, atchan->cfg[AT_XDMAC_DEV_TO_MEM_CFG],
 -              atchan->cfg[AT_XDMAC_MEM_TO_DEV_CFG],
 -              atchan->per_src_addr, atchan->per_dst_addr);
 +      memcpy(&atchan->sconfig, sconfig, sizeof(atchan->sconfig));
  
        return 0;
  }
@@@ -596,8 -596,6 +629,8 @@@ at_xdmac_prep_slave_sg(struct dma_chan 
        struct scatterlist      *sg;
        int                     i;
        unsigned int            xfer_size = 0;
 +      unsigned long           irqflags;
 +      struct dma_async_tx_descriptor  *ret = NULL;
  
        if (!sgl)
                return NULL;
                 flags);
  
        /* Protect dma_sconfig field that can be modified by set_slave_conf. */
 -      spin_lock_bh(&atchan->lock);
 +      spin_lock_irqsave(&atchan->lock, irqflags);
 +
 +      if (at_xdmac_compute_chan_conf(chan, direction))
 +              goto spin_unlock;
  
        /* Prepare descriptors. */
        for_each_sg(sgl, sg, sg_len, i) {
                mem = sg_dma_address(sg);
                if (unlikely(!len)) {
                        dev_err(chan2dev(chan), "sg data length is zero\n");
 -                      spin_unlock_bh(&atchan->lock);
 -                      return NULL;
 +                      goto spin_unlock;
                }
                dev_dbg(chan2dev(chan), "%s: * sg%d len=%u, mem=0x%08x\n",
                         __func__, i, len, mem);
                        dev_err(chan2dev(chan), "can't get descriptor\n");
                        if (first)
                                list_splice_init(&first->descs_list, &atchan->free_descs_list);
 -                      spin_unlock_bh(&atchan->lock);
 -                      return NULL;
 +                      goto spin_unlock;
                }
  
                /* Linked list descriptor setup. */
                if (direction == DMA_DEV_TO_MEM) {
 -                      desc->lld.mbr_sa = atchan->per_src_addr;
 +                      desc->lld.mbr_sa = atchan->sconfig.src_addr;
                        desc->lld.mbr_da = mem;
 -                      desc->lld.mbr_cfg = atchan->cfg[AT_XDMAC_DEV_TO_MEM_CFG];
                } else {
                        desc->lld.mbr_sa = mem;
 -                      desc->lld.mbr_da = atchan->per_dst_addr;
 -                      desc->lld.mbr_cfg = atchan->cfg[AT_XDMAC_MEM_TO_DEV_CFG];
 +                      desc->lld.mbr_da = atchan->sconfig.dst_addr;
                }
 +              desc->lld.mbr_cfg = atchan->cfg;
                dwidth = at_xdmac_get_dwidth(desc->lld.mbr_cfg);
                fixed_dwidth = IS_ALIGNED(len, 1 << dwidth)
                               ? at_xdmac_get_dwidth(desc->lld.mbr_cfg)
                desc->lld.mbr_ubc = AT_XDMAC_MBR_UBC_NDV2                       /* next descriptor view */
                        | AT_XDMAC_MBR_UBC_NDEN                                 /* next descriptor dst parameter update */
                        | AT_XDMAC_MBR_UBC_NSEN                                 /* next descriptor src parameter update */
-                       | (i == sg_len - 1 ? 0 : AT_XDMAC_MBR_UBC_NDE)          /* descriptor fetch */
                        | (len >> fixed_dwidth);                                /* microblock length */
                dev_dbg(chan2dev(chan),
                         "%s: lld: mbr_sa=%pad, mbr_da=%pad, mbr_ubc=0x%08x\n",
                         __func__, &desc->lld.mbr_sa, &desc->lld.mbr_da, desc->lld.mbr_ubc);
  
                /* Chain lld. */
-               if (prev) {
-                       prev->lld.mbr_nda = desc->tx_dma_desc.phys;
-                       dev_dbg(chan2dev(chan),
-                                "%s: chain lld: prev=0x%p, mbr_nda=%pad\n",
-                                __func__, prev, &prev->lld.mbr_nda);
-               }
+               if (prev)
+                       at_xdmac_queue_desc(chan, prev, desc);
  
                prev = desc;
                if (!first)
                xfer_size += len;
        }
  
 -      spin_unlock_bh(&atchan->lock);
  
        first->tx_dma_desc.flags = flags;
        first->xfer_size = xfer_size;
        first->direction = direction;
 +      ret = &first->tx_dma_desc;
  
 -      return &first->tx_dma_desc;
 +spin_unlock:
 +      spin_unlock_irqrestore(&atchan->lock, irqflags);
 +      return ret;
  }
  
  static struct dma_async_tx_descriptor *
@@@ -701,7 -692,6 +729,7 @@@ at_xdmac_prep_dma_cyclic(struct dma_cha
        struct at_xdmac_desc    *first = NULL, *prev = NULL;
        unsigned int            periods = buf_len / period_len;
        int                     i;
 +      unsigned long           irqflags;
  
        dev_dbg(chan2dev(chan), "%s: buf_addr=%pad, buf_len=%zd, period_len=%zd, dir=%s, flags=0x%lx\n",
                __func__, &buf_addr, buf_len, period_len,
                return NULL;
        }
  
 +      if (at_xdmac_compute_chan_conf(chan, direction))
 +              return NULL;
 +
        for (i = 0; i < periods; i++) {
                struct at_xdmac_desc    *desc = NULL;
  
 -              spin_lock_bh(&atchan->lock);
 +              spin_lock_irqsave(&atchan->lock, irqflags);
                desc = at_xdmac_get_desc(atchan);
                if (!desc) {
                        dev_err(chan2dev(chan), "can't get descriptor\n");
                        if (first)
                                list_splice_init(&first->descs_list, &atchan->free_descs_list);
 -                      spin_unlock_bh(&atchan->lock);
 +                      spin_unlock_irqrestore(&atchan->lock, irqflags);
                        return NULL;
                }
 -              spin_unlock_bh(&atchan->lock);
 +              spin_unlock_irqrestore(&atchan->lock, irqflags);
                dev_dbg(chan2dev(chan),
                        "%s: desc=0x%p, tx_dma_desc.phys=%pad\n",
                        __func__, desc, &desc->tx_dma_desc.phys);
  
                if (direction == DMA_DEV_TO_MEM) {
 -                      desc->lld.mbr_sa = atchan->per_src_addr;
 +                      desc->lld.mbr_sa = atchan->sconfig.src_addr;
                        desc->lld.mbr_da = buf_addr + i * period_len;
 -                      desc->lld.mbr_cfg = atchan->cfg[AT_XDMAC_DEV_TO_MEM_CFG];
                } else {
                        desc->lld.mbr_sa = buf_addr + i * period_len;
 -                      desc->lld.mbr_da = atchan->per_dst_addr;
 -                      desc->lld.mbr_cfg = atchan->cfg[AT_XDMAC_MEM_TO_DEV_CFG];
 +                      desc->lld.mbr_da = atchan->sconfig.dst_addr;
                }
 +              desc->lld.mbr_cfg = atchan->cfg;
                desc->lld.mbr_ubc = AT_XDMAC_MBR_UBC_NDV1
                        | AT_XDMAC_MBR_UBC_NDEN
                        | AT_XDMAC_MBR_UBC_NSEN
-                       | AT_XDMAC_MBR_UBC_NDE
                        | period_len >> at_xdmac_get_dwidth(desc->lld.mbr_cfg);
  
                dev_dbg(chan2dev(chan),
                         __func__, &desc->lld.mbr_sa, &desc->lld.mbr_da, desc->lld.mbr_ubc);
  
                /* Chain lld. */
-               if (prev) {
-                       prev->lld.mbr_nda = desc->tx_dma_desc.phys;
-                       dev_dbg(chan2dev(chan),
-                                "%s: chain lld: prev=0x%p, mbr_nda=%pad\n",
-                                __func__, prev, &prev->lld.mbr_nda);
-               }
+               if (prev)
+                       at_xdmac_queue_desc(chan, prev, desc);
  
                prev = desc;
                if (!first)
        return &first->tx_dma_desc;
  }
  
+ static inline u32 at_xdmac_align_width(struct dma_chan *chan, dma_addr_t addr)
+ {
+       u32 width;
+       /*
+        * Check address alignment to select the greater data width we
+        * can use.
+        *
+        * Some XDMAC implementations don't provide dword transfer, in
+        * this case selecting dword has the same behavior as
+        * selecting word transfers.
+        */
+       if (!(addr & 7)) {
+               width = AT_XDMAC_CC_DWIDTH_DWORD;
+               dev_dbg(chan2dev(chan), "%s: dwidth: double word\n", __func__);
+       } else if (!(addr & 3)) {
+               width = AT_XDMAC_CC_DWIDTH_WORD;
+               dev_dbg(chan2dev(chan), "%s: dwidth: word\n", __func__);
+       } else if (!(addr & 1)) {
+               width = AT_XDMAC_CC_DWIDTH_HALFWORD;
+               dev_dbg(chan2dev(chan), "%s: dwidth: half word\n", __func__);
+       } else {
+               width = AT_XDMAC_CC_DWIDTH_BYTE;
+               dev_dbg(chan2dev(chan), "%s: dwidth: byte\n", __func__);
+       }
+       return width;
+ }
+ static struct at_xdmac_desc *
+ at_xdmac_interleaved_queue_desc(struct dma_chan *chan,
+                               struct at_xdmac_chan *atchan,
+                               struct at_xdmac_desc *prev,
+                               dma_addr_t src, dma_addr_t dst,
+                               struct dma_interleaved_template *xt,
+                               struct data_chunk *chunk)
+ {
+       struct at_xdmac_desc    *desc;
+       u32                     dwidth;
+       unsigned long           flags;
+       size_t                  ublen;
+       /*
+        * WARNING: The channel configuration is set here since there is no
+        * dmaengine_slave_config call in this case. Moreover we don't know the
+        * direction, it involves we can't dynamically set the source and dest
+        * interface so we have to use the same one. Only interface 0 allows EBI
+        * access. Hopefully we can access DDR through both ports (at least on
+        * SAMA5D4x), so we can use the same interface for source and dest,
+        * that solves the fact we don't know the direction.
+        */
+       u32                     chan_cc = AT_XDMAC_CC_DIF(0)
+                                       | AT_XDMAC_CC_SIF(0)
+                                       | AT_XDMAC_CC_MBSIZE_SIXTEEN
+                                       | AT_XDMAC_CC_TYPE_MEM_TRAN;
+       dwidth = at_xdmac_align_width(chan, src | dst | chunk->size);
+       if (chunk->size >= (AT_XDMAC_MBR_UBC_UBLEN_MAX << dwidth)) {
+               dev_dbg(chan2dev(chan),
+                       "%s: chunk too big (%d, max size %lu)...\n",
+                       __func__, chunk->size,
+                       AT_XDMAC_MBR_UBC_UBLEN_MAX << dwidth);
+               return NULL;
+       }
+       if (prev)
+               dev_dbg(chan2dev(chan),
+                       "Adding items at the end of desc 0x%p\n", prev);
+       if (xt->src_inc) {
+               if (xt->src_sgl)
+                       chan_cc |=  AT_XDMAC_CC_SAM_UBS_DS_AM;
+               else
+                       chan_cc |=  AT_XDMAC_CC_SAM_INCREMENTED_AM;
+       }
+       if (xt->dst_inc) {
+               if (xt->dst_sgl)
+                       chan_cc |=  AT_XDMAC_CC_DAM_UBS_DS_AM;
+               else
+                       chan_cc |=  AT_XDMAC_CC_DAM_INCREMENTED_AM;
+       }
+       spin_lock_irqsave(&atchan->lock, flags);
+       desc = at_xdmac_get_desc(atchan);
+       spin_unlock_irqrestore(&atchan->lock, flags);
+       if (!desc) {
+               dev_err(chan2dev(chan), "can't get descriptor\n");
+               return NULL;
+       }
+       chan_cc |= AT_XDMAC_CC_DWIDTH(dwidth);
+       ublen = chunk->size >> dwidth;
+       desc->lld.mbr_sa = src;
+       desc->lld.mbr_da = dst;
+       desc->lld.mbr_sus = dmaengine_get_src_icg(xt, chunk);
+       desc->lld.mbr_dus = dmaengine_get_dst_icg(xt, chunk);
+       desc->lld.mbr_ubc = AT_XDMAC_MBR_UBC_NDV3
+               | AT_XDMAC_MBR_UBC_NDEN
+               | AT_XDMAC_MBR_UBC_NSEN
+               | ublen;
+       desc->lld.mbr_cfg = chan_cc;
+       dev_dbg(chan2dev(chan),
+               "%s: lld: mbr_sa=0x%08x, mbr_da=0x%08x, mbr_ubc=0x%08x, mbr_cfg=0x%08x\n",
+               __func__, desc->lld.mbr_sa, desc->lld.mbr_da,
+               desc->lld.mbr_ubc, desc->lld.mbr_cfg);
+       /* Chain lld. */
+       if (prev)
+               at_xdmac_queue_desc(chan, prev, desc);
+       return desc;
+ }
+ static struct dma_async_tx_descriptor *
+ at_xdmac_prep_interleaved(struct dma_chan *chan,
+                         struct dma_interleaved_template *xt,
+                         unsigned long flags)
+ {
+       struct at_xdmac_chan    *atchan = to_at_xdmac_chan(chan);
+       struct at_xdmac_desc    *prev = NULL, *first = NULL;
+       struct data_chunk       *chunk, *prev_chunk = NULL;
+       dma_addr_t              dst_addr, src_addr;
+       size_t                  dst_skip, src_skip, len = 0;
+       size_t                  prev_dst_icg = 0, prev_src_icg = 0;
+       int                     i;
+       if (!xt || (xt->numf != 1) || (xt->dir != DMA_MEM_TO_MEM))
+               return NULL;
+       dev_dbg(chan2dev(chan), "%s: src=0x%08x, dest=0x%08x, numf=%d, frame_size=%d, flags=0x%lx\n",
+               __func__, xt->src_start, xt->dst_start, xt->numf,
+               xt->frame_size, flags);
+       src_addr = xt->src_start;
+       dst_addr = xt->dst_start;
+       for (i = 0; i < xt->frame_size; i++) {
+               struct at_xdmac_desc *desc;
+               size_t src_icg, dst_icg;
+               chunk = xt->sgl + i;
+               dst_icg = dmaengine_get_dst_icg(xt, chunk);
+               src_icg = dmaengine_get_src_icg(xt, chunk);
+               src_skip = chunk->size + src_icg;
+               dst_skip = chunk->size + dst_icg;
+               dev_dbg(chan2dev(chan),
+                       "%s: chunk size=%d, src icg=%d, dst icg=%d\n",
+                       __func__, chunk->size, src_icg, dst_icg);
+               /*
+                * Handle the case where we just have the same
+                * transfer to setup, we can just increase the
+                * block number and reuse the same descriptor.
+                */
+               if (prev_chunk && prev &&
+                   (prev_chunk->size == chunk->size) &&
+                   (prev_src_icg == src_icg) &&
+                   (prev_dst_icg == dst_icg)) {
+                       dev_dbg(chan2dev(chan),
+                               "%s: same configuration that the previous chunk, merging the descriptors...\n",
+                               __func__);
+                       at_xdmac_increment_block_count(chan, prev);
+                       continue;
+               }
+               desc = at_xdmac_interleaved_queue_desc(chan, atchan,
+                                                      prev,
+                                                      src_addr, dst_addr,
+                                                      xt, chunk);
+               if (!desc) {
+                       list_splice_init(&first->descs_list,
+                                        &atchan->free_descs_list);
+                       return NULL;
+               }
+               if (!first)
+                       first = desc;
+               dev_dbg(chan2dev(chan), "%s: add desc 0x%p to descs_list 0x%p\n",
+                       __func__, desc, first);
+               list_add_tail(&desc->desc_node, &first->descs_list);
+               if (xt->src_sgl)
+                       src_addr += src_skip;
+               if (xt->dst_sgl)
+                       dst_addr += dst_skip;
+               len += chunk->size;
+               prev_chunk = chunk;
+               prev_dst_icg = dst_icg;
+               prev_src_icg = src_icg;
+               prev = desc;
+       }
+       first->tx_dma_desc.cookie = -EBUSY;
+       first->tx_dma_desc.flags = flags;
+       first->xfer_size = len;
+       return &first->tx_dma_desc;
+ }
  static struct dma_async_tx_descriptor *
  at_xdmac_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
                         size_t len, unsigned long flags)
                                        | AT_XDMAC_CC_SIF(0)
                                        | AT_XDMAC_CC_MBSIZE_SIXTEEN
                                        | AT_XDMAC_CC_TYPE_MEM_TRAN;
 +      unsigned long           irqflags;
  
        dev_dbg(chan2dev(chan), "%s: src=%pad, dest=%pad, len=%zd, flags=0x%lx\n",
                __func__, &src, &dest, len, flags);
        if (unlikely(!len))
                return NULL;
  
-       /*
-        * Check address alignment to select the greater data width we can use.
-        * Some XDMAC implementations don't provide dword transfer, in this
-        * case selecting dword has the same behavior as selecting word transfers.
-        */
-       if (!((src_addr | dst_addr) & 7)) {
-               dwidth = AT_XDMAC_CC_DWIDTH_DWORD;
-               dev_dbg(chan2dev(chan), "%s: dwidth: double word\n", __func__);
-       } else if (!((src_addr | dst_addr)  & 3)) {
-               dwidth = AT_XDMAC_CC_DWIDTH_WORD;
-               dev_dbg(chan2dev(chan), "%s: dwidth: word\n", __func__);
-       } else if (!((src_addr | dst_addr) & 1)) {
-               dwidth = AT_XDMAC_CC_DWIDTH_HALFWORD;
-               dev_dbg(chan2dev(chan), "%s: dwidth: half word\n", __func__);
-       } else {
-               dwidth = AT_XDMAC_CC_DWIDTH_BYTE;
-               dev_dbg(chan2dev(chan), "%s: dwidth: byte\n", __func__);
-       }
+       dwidth = at_xdmac_align_width(chan, src_addr | dst_addr);
  
        /* Prepare descriptors. */
        while (remaining_size) {
  
                dev_dbg(chan2dev(chan), "%s: remaining_size=%zu\n", __func__, remaining_size);
  
 -              spin_lock_bh(&atchan->lock);
 +              spin_lock_irqsave(&atchan->lock, irqflags);
                desc = at_xdmac_get_desc(atchan);
 -              spin_unlock_bh(&atchan->lock);
 +              spin_unlock_irqrestore(&atchan->lock, irqflags);
                if (!desc) {
                        dev_err(chan2dev(chan), "can't get descriptor\n");
                        if (first)
                dev_dbg(chan2dev(chan), "%s: xfer_size=%zu\n", __func__, xfer_size);
  
                /* Check remaining length and change data width if needed. */
-               if (!((src_addr | dst_addr | xfer_size) & 7)) {
-                       dwidth = AT_XDMAC_CC_DWIDTH_DWORD;
-                       dev_dbg(chan2dev(chan), "%s: dwidth: double word\n", __func__);
-               } else if (!((src_addr | dst_addr | xfer_size)  & 3)) {
-                       dwidth = AT_XDMAC_CC_DWIDTH_WORD;
-                       dev_dbg(chan2dev(chan), "%s: dwidth: word\n", __func__);
-               } else if (!((src_addr | dst_addr | xfer_size) & 1)) {
-                       dwidth = AT_XDMAC_CC_DWIDTH_HALFWORD;
-                       dev_dbg(chan2dev(chan), "%s: dwidth: half word\n", __func__);
-               } else if ((src_addr | dst_addr | xfer_size) & 1) {
-                       dwidth = AT_XDMAC_CC_DWIDTH_BYTE;
-                       dev_dbg(chan2dev(chan), "%s: dwidth: byte\n", __func__);
-               }
+               dwidth = at_xdmac_align_width(chan,
+                                             src_addr | dst_addr | xfer_size);
                chan_cc |= AT_XDMAC_CC_DWIDTH(dwidth);
  
                ublen = xfer_size >> dwidth;
                desc->lld.mbr_ubc = AT_XDMAC_MBR_UBC_NDV2
                        | AT_XDMAC_MBR_UBC_NDEN
                        | AT_XDMAC_MBR_UBC_NSEN
-                       | (remaining_size ? AT_XDMAC_MBR_UBC_NDE : 0)
                        | ublen;
                desc->lld.mbr_cfg = chan_cc;
  
                         __func__, &desc->lld.mbr_sa, &desc->lld.mbr_da, desc->lld.mbr_ubc, desc->lld.mbr_cfg);
  
                /* Chain lld. */
-               if (prev) {
-                       prev->lld.mbr_nda = desc->tx_dma_desc.phys;
-                       dev_dbg(chan2dev(chan),
-                                "%s: chain lld: prev=0x%p, mbr_nda=0x%08x\n",
-                                __func__, prev, prev->lld.mbr_nda);
-               }
+               if (prev)
+                       at_xdmac_queue_desc(chan, prev, desc);
  
                prev = desc;
                if (!first)
        return &first->tx_dma_desc;
  }
  
+ static struct at_xdmac_desc *at_xdmac_memset_create_desc(struct dma_chan *chan,
+                                                        struct at_xdmac_chan *atchan,
+                                                        dma_addr_t dst_addr,
+                                                        size_t len,
+                                                        int value)
+ {
+       struct at_xdmac_desc    *desc;
+       unsigned long           flags;
+       size_t                  ublen;
+       u32                     dwidth;
+       /*
+        * WARNING: The channel configuration is set here since there is no
+        * dmaengine_slave_config call in this case. Moreover we don't know the
+        * direction, it involves we can't dynamically set the source and dest
+        * interface so we have to use the same one. Only interface 0 allows EBI
+        * access. Hopefully we can access DDR through both ports (at least on
+        * SAMA5D4x), so we can use the same interface for source and dest,
+        * that solves the fact we don't know the direction.
+        */
+       u32                     chan_cc = AT_XDMAC_CC_DAM_INCREMENTED_AM
+                                       | AT_XDMAC_CC_SAM_INCREMENTED_AM
+                                       | AT_XDMAC_CC_DIF(0)
+                                       | AT_XDMAC_CC_SIF(0)
+                                       | AT_XDMAC_CC_MBSIZE_SIXTEEN
+                                       | AT_XDMAC_CC_MEMSET_HW_MODE
+                                       | AT_XDMAC_CC_TYPE_MEM_TRAN;
+       dwidth = at_xdmac_align_width(chan, dst_addr);
+       if (len >= (AT_XDMAC_MBR_UBC_UBLEN_MAX << dwidth)) {
+               dev_err(chan2dev(chan),
+                       "%s: Transfer too large, aborting...\n",
+                       __func__);
+               return NULL;
+       }
+       spin_lock_irqsave(&atchan->lock, flags);
+       desc = at_xdmac_get_desc(atchan);
+       spin_unlock_irqrestore(&atchan->lock, flags);
+       if (!desc) {
+               dev_err(chan2dev(chan), "can't get descriptor\n");
+               return NULL;
+       }
+       chan_cc |= AT_XDMAC_CC_DWIDTH(dwidth);
+       ublen = len >> dwidth;
+       desc->lld.mbr_da = dst_addr;
+       desc->lld.mbr_ds = value;
+       desc->lld.mbr_ubc = AT_XDMAC_MBR_UBC_NDV3
+               | AT_XDMAC_MBR_UBC_NDEN
+               | AT_XDMAC_MBR_UBC_NSEN
+               | ublen;
+       desc->lld.mbr_cfg = chan_cc;
+       dev_dbg(chan2dev(chan),
+               "%s: lld: mbr_da=0x%08x, mbr_ds=0x%08x, mbr_ubc=0x%08x, mbr_cfg=0x%08x\n",
+               __func__, desc->lld.mbr_da, desc->lld.mbr_ds, desc->lld.mbr_ubc,
+               desc->lld.mbr_cfg);
+       return desc;
+ }
+ struct dma_async_tx_descriptor *
+ at_xdmac_prep_dma_memset(struct dma_chan *chan, dma_addr_t dest, int value,
+                        size_t len, unsigned long flags)
+ {
+       struct at_xdmac_chan    *atchan = to_at_xdmac_chan(chan);
+       struct at_xdmac_desc    *desc;
+       dev_dbg(chan2dev(chan), "%s: dest=0x%08x, len=%d, pattern=0x%x, flags=0x%lx\n",
+               __func__, dest, len, value, flags);
+       if (unlikely(!len))
+               return NULL;
+       desc = at_xdmac_memset_create_desc(chan, atchan, dest, len, value);
+       list_add_tail(&desc->desc_node, &desc->descs_list);
+       desc->tx_dma_desc.cookie = -EBUSY;
+       desc->tx_dma_desc.flags = flags;
+       desc->xfer_size = len;
+       return &desc->tx_dma_desc;
+ }
  static enum dma_status
  at_xdmac_tx_status(struct dma_chan *chan, dma_cookie_t cookie,
                struct dma_tx_state *txstate)
        int                     residue;
        u32                     cur_nda, mask, value;
        u8                      dwidth = 0;
 +      unsigned long           flags;
  
        ret = dma_cookie_status(chan, cookie, txstate);
        if (ret == DMA_COMPLETE)
        if (!txstate)
                return ret;
  
 -      spin_lock_bh(&atchan->lock);
 +      spin_lock_irqsave(&atchan->lock, flags);
  
        desc = list_first_entry(&atchan->xfers_list, struct at_xdmac_desc, xfer_node);
  
         */
        if (!desc->active_xfer) {
                dma_set_residue(txstate, desc->xfer_size);
 -              spin_unlock_bh(&atchan->lock);
 -              return ret;
 +              goto spin_unlock;
        }
  
        residue = desc->xfer_size;
        }
        residue += at_xdmac_chan_read(atchan, AT_XDMAC_CUBC) << dwidth;
  
 -      spin_unlock_bh(&atchan->lock);
 -
        dma_set_residue(txstate, residue);
  
        dev_dbg(chan2dev(chan),
                 "%s: desc=0x%p, tx_dma_desc.phys=%pad, tx_status=%d, cookie=%d, residue=%d\n",
                 __func__, desc, &desc->tx_dma_desc.phys, ret, cookie, residue);
  
 +spin_unlock:
 +      spin_unlock_irqrestore(&atchan->lock, flags);
        return ret;
  }
  
@@@ -1005,9 -1250,8 +1291,9 @@@ static void at_xdmac_remove_xfer(struc
  static void at_xdmac_advance_work(struct at_xdmac_chan *atchan)
  {
        struct at_xdmac_desc    *desc;
 +      unsigned long           flags;
  
 -      spin_lock_bh(&atchan->lock);
 +      spin_lock_irqsave(&atchan->lock, flags);
  
        /*
         * If channel is enabled, do nothing, advance_work will be triggered
                        at_xdmac_start_xfer(atchan, desc);
        }
  
 -      spin_unlock_bh(&atchan->lock);
 +      spin_unlock_irqrestore(&atchan->lock, flags);
  }
  
  static void at_xdmac_handle_cyclic(struct at_xdmac_chan *atchan)
@@@ -1158,13 -1402,12 +1444,13 @@@ static int at_xdmac_device_config(struc
  {
        struct at_xdmac_chan    *atchan = to_at_xdmac_chan(chan);
        int ret;
 +      unsigned long           flags;
  
        dev_dbg(chan2dev(chan), "%s\n", __func__);
  
 -      spin_lock_bh(&atchan->lock);
 +      spin_lock_irqsave(&atchan->lock, flags);
        ret = at_xdmac_set_slave_config(chan, config);
 -      spin_unlock_bh(&atchan->lock);
 +      spin_unlock_irqrestore(&atchan->lock, flags);
  
        return ret;
  }
@@@ -1173,19 -1416,18 +1459,19 @@@ static int at_xdmac_device_pause(struc
  {
        struct at_xdmac_chan    *atchan = to_at_xdmac_chan(chan);
        struct at_xdmac         *atxdmac = to_at_xdmac(atchan->chan.device);
 +      unsigned long           flags;
  
        dev_dbg(chan2dev(chan), "%s\n", __func__);
  
        if (test_and_set_bit(AT_XDMAC_CHAN_IS_PAUSED, &atchan->status))
                return 0;
  
 -      spin_lock_bh(&atchan->lock);
 +      spin_lock_irqsave(&atchan->lock, flags);
        at_xdmac_write(atxdmac, AT_XDMAC_GRWS, atchan->mask);
        while (at_xdmac_chan_read(atchan, AT_XDMAC_CC)
               & (AT_XDMAC_CC_WRIP | AT_XDMAC_CC_RDIP))
                cpu_relax();
 -      spin_unlock_bh(&atchan->lock);
 +      spin_unlock_irqrestore(&atchan->lock, flags);
  
        return 0;
  }
@@@ -1194,19 -1436,18 +1480,19 @@@ static int at_xdmac_device_resume(struc
  {
        struct at_xdmac_chan    *atchan = to_at_xdmac_chan(chan);
        struct at_xdmac         *atxdmac = to_at_xdmac(atchan->chan.device);
 +      unsigned long           flags;
  
        dev_dbg(chan2dev(chan), "%s\n", __func__);
  
 -      spin_lock_bh(&atchan->lock);
 +      spin_lock_irqsave(&atchan->lock, flags);
        if (!at_xdmac_chan_is_paused(atchan)) {
 -              spin_unlock_bh(&atchan->lock);
 +              spin_unlock_irqrestore(&atchan->lock, flags);
                return 0;
        }
  
        at_xdmac_write(atxdmac, AT_XDMAC_GRWR, atchan->mask);
        clear_bit(AT_XDMAC_CHAN_IS_PAUSED, &atchan->status);
 -      spin_unlock_bh(&atchan->lock);
 +      spin_unlock_irqrestore(&atchan->lock, flags);
  
        return 0;
  }
@@@ -1216,11 -1457,10 +1502,11 @@@ static int at_xdmac_device_terminate_al
        struct at_xdmac_desc    *desc, *_desc;
        struct at_xdmac_chan    *atchan = to_at_xdmac_chan(chan);
        struct at_xdmac         *atxdmac = to_at_xdmac(atchan->chan.device);
 +      unsigned long           flags;
  
        dev_dbg(chan2dev(chan), "%s\n", __func__);
  
 -      spin_lock_bh(&atchan->lock);
 +      spin_lock_irqsave(&atchan->lock, flags);
        at_xdmac_write(atxdmac, AT_XDMAC_GD, atchan->mask);
        while (at_xdmac_read(atxdmac, AT_XDMAC_GS) & atchan->mask)
                cpu_relax();
                at_xdmac_remove_xfer(atchan, desc);
  
        clear_bit(AT_XDMAC_CHAN_IS_CYCLIC, &atchan->status);
 -      spin_unlock_bh(&atchan->lock);
 +      spin_unlock_irqrestore(&atchan->lock, flags);
  
        return 0;
  }
@@@ -1240,9 -1480,8 +1526,9 @@@ static int at_xdmac_alloc_chan_resource
        struct at_xdmac_chan    *atchan = to_at_xdmac_chan(chan);
        struct at_xdmac_desc    *desc;
        int                     i;
 +      unsigned long           flags;
  
 -      spin_lock_bh(&atchan->lock);
 +      spin_lock_irqsave(&atchan->lock, flags);
  
        if (at_xdmac_chan_is_enabled(atchan)) {
                dev_err(chan2dev(chan),
        dev_dbg(chan2dev(chan), "%s: allocated %d descriptors\n", __func__, i);
  
  spin_unlock:
 -      spin_unlock_bh(&atchan->lock);
 +      spin_unlock_irqrestore(&atchan->lock, flags);
        return i;
  }
  
@@@ -1445,7 -1684,9 +1731,9 @@@ static int at_xdmac_probe(struct platfo
        }
  
        dma_cap_set(DMA_CYCLIC, atxdmac->dma.cap_mask);
+       dma_cap_set(DMA_INTERLEAVE, atxdmac->dma.cap_mask);
        dma_cap_set(DMA_MEMCPY, atxdmac->dma.cap_mask);
+       dma_cap_set(DMA_MEMSET, atxdmac->dma.cap_mask);
        dma_cap_set(DMA_SLAVE, atxdmac->dma.cap_mask);
        /*
         * Without DMA_PRIVATE the driver is not able to allocate more than
        atxdmac->dma.device_tx_status                   = at_xdmac_tx_status;
        atxdmac->dma.device_issue_pending               = at_xdmac_issue_pending;
        atxdmac->dma.device_prep_dma_cyclic             = at_xdmac_prep_dma_cyclic;
+       atxdmac->dma.device_prep_interleaved_dma        = at_xdmac_prep_interleaved;
        atxdmac->dma.device_prep_dma_memcpy             = at_xdmac_prep_dma_memcpy;
+       atxdmac->dma.device_prep_dma_memset             = at_xdmac_prep_dma_memset;
        atxdmac->dma.device_prep_slave_sg               = at_xdmac_prep_slave_sg;
        atxdmac->dma.device_config                      = at_xdmac_device_config;
        atxdmac->dma.device_pause                       = at_xdmac_device_pause;
diff --combined drivers/dma/dmaengine.c
index 3ddfd1f6c23c0f0f891ed11d6f68cbcaaa3c6e03,052a2bd1a5cf64948590f903844f1a91a21a96e1..4a4cce15f25dd65c6a720d949ed0d9c922ff1cba
@@@ -267,6 -267,13 +267,13 @@@ static void dma_chan_put(struct dma_cha
        /* This channel is not in use anymore, free it */
        if (!chan->client_count && chan->device->device_free_chan_resources)
                chan->device->device_free_chan_resources(chan);
+       /* If the channel is used via a DMA request router, free the mapping */
+       if (chan->router && chan->router->route_free) {
+               chan->router->route_free(chan->router->dev, chan->route_data);
+               chan->router = NULL;
+               chan->route_data = NULL;
+       }
  }
  
  enum dma_status dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie)
@@@ -487,11 -494,7 +494,11 @@@ int dma_get_slave_caps(struct dma_chan 
        caps->directions = device->directions;
        caps->residue_granularity = device->residue_granularity;
  
 -      caps->cmd_pause = !!device->device_pause;
 +      /*
 +       * Some devices implement only pause (e.g. to get residuum) but no
 +       * resume. However cmd_pause is advertised as pause AND resume.
 +       */
 +      caps->cmd_pause = !!(device->device_pause && device->device_resume);
        caps->cmd_terminate = !!device->device_terminate_all;
  
        return 0;
@@@ -536,7 -539,7 +543,7 @@@ static struct dma_chan *private_candida
  }
  
  /**
-  * dma_request_slave_channel - try to get specific channel exclusively
+  * dma_get_slave_channel - try to get specific channel exclusively
   * @chan: target channel
   */
  struct dma_chan *dma_get_slave_channel(struct dma_chan *chan)
@@@ -648,7 -651,7 +655,7 @@@ struct dma_chan *__dma_request_channel(
  EXPORT_SYMBOL_GPL(__dma_request_channel);
  
  /**
-  * dma_request_slave_channel - try to allocate an exclusive slave channel
+  * dma_request_slave_channel_reason - try to allocate an exclusive slave channel
   * @dev:      pointer to client device structure
   * @name:     slave channel name
   *
@@@ -836,6 -839,8 +843,8 @@@ int dma_async_device_register(struct dm
                !device->device_prep_dma_pq);
        BUG_ON(dma_has_cap(DMA_PQ_VAL, device->cap_mask) &&
                !device->device_prep_dma_pq_val);
+       BUG_ON(dma_has_cap(DMA_MEMSET, device->cap_mask) &&
+               !device->device_prep_dma_memset);
        BUG_ON(dma_has_cap(DMA_INTERRUPT, device->cap_mask) &&
                !device->device_prep_dma_interrupt);
        BUG_ON(dma_has_cap(DMA_SG, device->cap_mask) &&
diff --combined drivers/dma/pl330.c
index 340f9e607cd8b90dfe75add027c18bd26d67f1e0,3781f327eedcb6ab16a919088dd9865716d8673e..f513f77b1d85471ff0997f8d9f4755deca293621
@@@ -1424,8 -1424,8 +1424,8 @@@ static int pl330_submit_req(struct pl33
                goto xfer_exit;
  
        if (ret > pl330->mcbufsz / 2) {
-               dev_info(pl330->ddma.dev, "%s:%d Trying increasing mcbufsz\n",
-                               __func__, __LINE__);
+               dev_info(pl330->ddma.dev, "%s:%d Try increasing mcbufsz (%i/%i)\n",
+                               __func__, __LINE__, ret, pl330->mcbufsz / 2);
                ret = -ENOMEM;
                goto xfer_exit;
        }
@@@ -2127,7 -2127,6 +2127,7 @@@ static int pl330_terminate_all(struct d
        struct pl330_dmac *pl330 = pch->dmac;
        LIST_HEAD(list);
  
 +      pm_runtime_get_sync(pl330->ddma.dev);
        spin_lock_irqsave(&pch->lock, flags);
        spin_lock(&pl330->lock);
        _stop(pch->thread);
        list_splice_tail_init(&pch->work_list, &pl330->desc_pool);
        list_splice_tail_init(&pch->completed_list, &pl330->desc_pool);
        spin_unlock_irqrestore(&pch->lock, flags);
 +      pm_runtime_mark_last_busy(pl330->ddma.dev);
 +      pm_runtime_put_autosuspend(pl330->ddma.dev);
  
        return 0;
  }
@@@ -2584,12 -2581,14 +2584,14 @@@ pl330_prep_dma_memcpy(struct dma_chan *
  {
        struct dma_pl330_desc *desc;
        struct dma_pl330_chan *pch = to_pchan(chan);
-       struct pl330_dmac *pl330 = pch->dmac;
+       struct pl330_dmac *pl330;
        int burst;
  
        if (unlikely(!pch || !len))
                return NULL;
  
+       pl330 = pch->dmac;
        desc = __pl330_prep_dma_memcpy(pch, dst, src, len);
        if (!desc)
                return NULL;
index e0302c784ba48039d411c75fb1a40451107fc5ab,d5423a669ea0a787c958ee660a4aa1734cae4bf8..7820d07e7beea7dd0e4a93f12fd9c3ea99ef2bf8
@@@ -183,7 -183,7 +183,7 @@@ struct rcar_dmac 
        unsigned int n_channels;
        struct rcar_dmac_chan *channels;
  
-       unsigned long modules[256 / BITS_PER_LONG];
+       DECLARE_BITMAP(modules, 256);
  };
  
  #define to_rcar_dmac(d)               container_of(d, struct rcar_dmac, engine)
@@@ -465,7 -465,6 +465,7 @@@ static dma_cookie_t rcar_dmac_tx_submit
  static int rcar_dmac_desc_alloc(struct rcar_dmac_chan *chan, gfp_t gfp)
  {
        struct rcar_dmac_desc_page *page;
 +      unsigned long flags;
        LIST_HEAD(list);
        unsigned int i;
  
                list_add_tail(&desc->node, &list);
        }
  
 -      spin_lock_irq(&chan->lock);
 +      spin_lock_irqsave(&chan->lock, flags);
        list_splice_tail(&list, &chan->desc.free);
        list_add_tail(&page->node, &chan->desc.pages);
 -      spin_unlock_irq(&chan->lock);
 +      spin_unlock_irqrestore(&chan->lock, flags);
  
        return 0;
  }
@@@ -517,7 -516,6 +517,7 @@@ static void rcar_dmac_desc_put(struct r
  static void rcar_dmac_desc_recycle_acked(struct rcar_dmac_chan *chan)
  {
        struct rcar_dmac_desc *desc, *_desc;
 +      unsigned long flags;
        LIST_HEAD(list);
  
        /*
         * list_for_each_entry_safe, isn't safe if we release the channel lock
         * around the rcar_dmac_desc_put() call.
         */
 -      spin_lock_irq(&chan->lock);
 +      spin_lock_irqsave(&chan->lock, flags);
        list_splice_init(&chan->desc.wait, &list);
 -      spin_unlock_irq(&chan->lock);
 +      spin_unlock_irqrestore(&chan->lock, flags);
  
        list_for_each_entry_safe(desc, _desc, &list, node) {
                if (async_tx_test_ack(&desc->async_tx)) {
                return;
  
        /* Put the remaining descriptors back in the wait list. */
 -      spin_lock_irq(&chan->lock);
 +      spin_lock_irqsave(&chan->lock, flags);
        list_splice(&list, &chan->desc.wait);
 -      spin_unlock_irq(&chan->lock);
 +      spin_unlock_irqrestore(&chan->lock, flags);
  }
  
  /*
  static struct rcar_dmac_desc *rcar_dmac_desc_get(struct rcar_dmac_chan *chan)
  {
        struct rcar_dmac_desc *desc;
 +      unsigned long flags;
        int ret;
  
        /* Recycle acked descriptors before attempting allocation. */
        rcar_dmac_desc_recycle_acked(chan);
  
 -      spin_lock_irq(&chan->lock);
 +      spin_lock_irqsave(&chan->lock, flags);
  
        while (list_empty(&chan->desc.free)) {
                /*
                 * allocated descriptors. If the allocation fails return an
                 * error.
                 */
 -              spin_unlock_irq(&chan->lock);
 +              spin_unlock_irqrestore(&chan->lock, flags);
                ret = rcar_dmac_desc_alloc(chan, GFP_NOWAIT);
                if (ret < 0)
                        return NULL;
 -              spin_lock_irq(&chan->lock);
 +              spin_lock_irqsave(&chan->lock, flags);
        }
  
        desc = list_first_entry(&chan->desc.free, struct rcar_dmac_desc, node);
        list_del(&desc->node);
  
 -      spin_unlock_irq(&chan->lock);
 +      spin_unlock_irqrestore(&chan->lock, flags);
  
        return desc;
  }
  static int rcar_dmac_xfer_chunk_alloc(struct rcar_dmac_chan *chan, gfp_t gfp)
  {
        struct rcar_dmac_desc_page *page;
 +      unsigned long flags;
        LIST_HEAD(list);
        unsigned int i;
  
                list_add_tail(&chunk->node, &list);
        }
  
 -      spin_lock_irq(&chan->lock);
 +      spin_lock_irqsave(&chan->lock, flags);
        list_splice_tail(&list, &chan->desc.chunks_free);
        list_add_tail(&page->node, &chan->desc.pages);
 -      spin_unlock_irq(&chan->lock);
 +      spin_unlock_irqrestore(&chan->lock, flags);
  
        return 0;
  }
@@@ -631,10 -627,9 +631,10 @@@ static struct rcar_dmac_xfer_chunk 
  rcar_dmac_xfer_chunk_get(struct rcar_dmac_chan *chan)
  {
        struct rcar_dmac_xfer_chunk *chunk;
 +      unsigned long flags;
        int ret;
  
 -      spin_lock_irq(&chan->lock);
 +      spin_lock_irqsave(&chan->lock, flags);
  
        while (list_empty(&chan->desc.chunks_free)) {
                /*
                 * allocated descriptors. If the allocation fails return an
                 * error.
                 */
 -              spin_unlock_irq(&chan->lock);
 +              spin_unlock_irqrestore(&chan->lock, flags);
                ret = rcar_dmac_xfer_chunk_alloc(chan, GFP_NOWAIT);
                if (ret < 0)
                        return NULL;
 -              spin_lock_irq(&chan->lock);
 +              spin_lock_irqsave(&chan->lock, flags);
        }
  
        chunk = list_first_entry(&chan->desc.chunks_free,
                                 struct rcar_dmac_xfer_chunk, node);
        list_del(&chunk->node);
  
 -      spin_unlock_irq(&chan->lock);
 +      spin_unlock_irqrestore(&chan->lock, flags);
  
        return chunk;
  }