Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 9 Oct 2014 10:42:04 +0000 (06:42 -0400)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 9 Oct 2014 10:42:04 +0000 (06:42 -0400)
Pull irq updates from Thomas Gleixner:
 "The irq departement delivers:

   - a cleanup series to get rid of mindlessly copied code.

   - another bunch of new pointlessly different interrupt chip drivers.

     Adding homebrewn irq chips (and timers) to SoCs must provide a
     value add which is beyond the imagination of mere mortals.

   - the usual SoC irq controller updates, IOW my second cat herding
     project"

* 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (44 commits)
  irqchip: gic-v3: Implement CPU PM notifier
  irqchip: gic-v3: Refactor gic_enable_redist to support both enabling and disabling
  irqchip: renesas-intc-irqpin: Add minimal runtime PM support
  irqchip: renesas-intc-irqpin: Add helper variable dev = &pdev->dev
  irqchip: atmel-aic5: Add sama5d4 support
  irqchip: atmel-aic5: The sama5d3 has 48 IRQs
  Documentation: bcm7120-l2: Add Broadcom BCM7120-style L2 binding
  irqchip: bcm7120-l2: Add Broadcom BCM7120-style Level 2 interrupt controller
  irqchip: renesas-irqc: Add binding docs for new R-Car Gen2 SoCs
  irqchip: renesas-irqc: Add DT binding documentation
  irqchip: renesas-intc-irqpin: Document SoC-specific bindings
  openrisc: Get rid of handle_IRQ
  arm64: Get rid of handle_IRQ
  ARM: omap2: irq: Convert to handle_domain_irq
  ARM: imx: tzic: Convert to handle_domain_irq
  ARM: imx: avic: Convert to handle_domain_irq
  irqchip: or1k-pic: Convert to handle_domain_irq
  irqchip: atmel-aic5: Convert to handle_domain_irq
  irqchip: atmel-aic: Convert to handle_domain_irq
  irqchip: gic-v3: Convert to handle_domain_irq
  ...

1  2 
MAINTAINERS
arch/arm/Kconfig
arch/arm/kernel/irq.c
arch/arm64/Kconfig
arch/arm64/kernel/irq.c
drivers/irqchip/Kconfig
drivers/irqchip/Makefile
drivers/irqchip/irq-gic-v3.c
drivers/irqchip/irq-gic.c
drivers/irqchip/irq-omap-intc.c

diff --combined MAINTAINERS
@@@ -152,9 -152,8 +152,9 @@@ F: drivers/scsi/53c700
  
  6LOWPAN GENERIC (BTLE/IEEE 802.15.4)
  M:    Alexander Aring <alex.aring@gmail.com>
 -L:    linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers)
 +M:    Jukka Rissanen <jukka.rissanen@linux.intel.com>
  L:    linux-bluetooth@vger.kernel.org
 +L:    linux-wpan@vger.kernel.org
  S:    Maintained
  F:    net/6lowpan/
  F:    include/net/6lowpan.h
@@@ -686,17 -685,6 +686,17 @@@ L:       alsa-devel@alsa-project.org (moderat
  W:    http://blackfin.uclinux.org/
  S:    Supported
  F:    sound/soc/blackfin/*
 + 
 +ANALOG DEVICES INC IIO DRIVERS
 +M:    Lars-Peter Clausen <lars@metafoo.de>
 +M:    Michael Hennerich <Michael.Hennerich@analog.com>
 +W:    http://wiki.analog.com/
 +W:    http://ez.analog.com/community/linux-device-drivers
 +S:    Supported
 +F:    drivers/iio/*/ad*
 +X:    drivers/iio/*/adjd*
 +F:    drivers/staging/iio/*/ad*
 +F:    staging/iio/trigger/iio-trig-bfin-timer.c
  
  AOA (Apple Onboard Audio) ALSA DRIVER
  M:    Johannes Berg <johannes@sipsolutions.net>
@@@ -847,12 -835,6 +847,12 @@@ M:       Emilio López <emilio@elopez.com.ar
  S:    Maintained
  F:    drivers/clk/sunxi/
  
 +ARM/Amlogic MesonX SoC support
 +M:    Carlo Caione <carlo@caione.org>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +N:    meson[x68]
 +
  ARM/ATMEL AT91RM9200 AND AT91SAM ARM ARCHITECTURES
  M:    Andrew Victor <linux@maxim.org.za>
  M:    Nicolas Ferre <nicolas.ferre@atmel.com>
@@@ -879,9 -861,10 +879,9 @@@ S:        Maintaine
  F:    arch/arm/mach-highbank/
  
  ARM/CAVIUM NETWORKS CNS3XXX MACHINE SUPPORT
 -M:    Anton Vorontsov <anton@enomsg.org>
 +M:    Krzysztof Halasa <khalasa@piap.pl>
  S:    Maintained
  F:    arch/arm/mach-cns3xxx/
 -T:    git git://git.infradead.org/users/cbou/linux-cns3xxx.git
  
  ARM/CIRRUS LOGIC CLPS711X ARM ARCHITECTURE
  M:    Alexander Shiyan <shc_work@mail.ru>
@@@ -981,7 -964,7 +981,7 @@@ F: arch/arm/include/asm/hardware/dec212
  F:    arch/arm/mach-footbridge/
  
  ARM/FREESCALE IMX / MXC ARM ARCHITECTURE
 -M:    Shawn Guo <shawn.guo@freescale.com>
 +M:    Shawn Guo <shawn.guo@linaro.org>
  M:    Sascha Hauer <kernel@pengutronix.de>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
@@@ -1042,20 -1025,24 +1042,20 @@@ F:   arch/arm/mach-pxa/colibri-pxa270-inc
  
  ARM/INTEL IOP32X ARM ARCHITECTURE
  M:    Lennert Buytenhek <kernel@wantstofly.org>
 -M:    Dan Williams <dan.j.williams@intel.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  
  ARM/INTEL IOP33X ARM ARCHITECTURE
 -M:    Dan Williams <dan.j.williams@intel.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Maintained
 +S:    Orphan
  
  ARM/INTEL IOP13XX ARM ARCHITECTURE
  M:    Lennert Buytenhek <kernel@wantstofly.org>
 -M:    Dan Williams <dan.j.williams@intel.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  
  ARM/INTEL IQ81342EX MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
 -M:    Dan Williams <dan.j.williams@intel.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  
@@@ -1066,7 -1053,7 +1066,7 @@@ S:      Maintaine
  
  ARM/INTEL IXP4XX ARM ARCHITECTURE
  M:    Imre Kaloz <kaloz@openwrt.org>
 -M:    Krzysztof Halasa <khc@pm.waw.pl>
 +M:    Krzysztof Halasa <khalasa@piap.pl>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/mach-ixp4xx/
@@@ -1080,6 -1067,7 +1080,6 @@@ F:      drivers/pcmcia/pxa2xx_stargate2.
  
  ARM/INTEL XSC3 (MANZANO) ARM CORE
  M:    Lennert Buytenhek <kernel@wantstofly.org>
 -M:    Dan Williams <dan.j.williams@intel.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  
@@@ -1162,16 -1150,6 +1162,16 @@@ W:    http://www.digriz.org.uk/ts78xx/kern
  S:    Maintained
  F:    arch/arm/mach-orion5x/ts78xx-*
  
 +ARM/Mediatek SoC support
 +M:    Matthias Brugger <matthias.bgg@gmail.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    arch/arm/boot/dts/mt6*
 +F:    arch/arm/boot/dts/mt8*
 +F:    arch/arm/mach-mediatek/
 +N:    mtk
 +K:    mediatek
 +
  ARM/MICREL KS8695 ARCHITECTURE
  M:    Greg Ungerer <gerg@uclinux.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1299,15 -1277,9 +1299,15 @@@ F:    drivers/scsi/arm
  ARM/Rockchip SoC support
  M:    Heiko Stuebner <heiko@sntech.de>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +L:    linux-rockchip@lists.infradead.org
  S:    Maintained
 +F:    arch/arm/boot/dts/rk3*
  F:    arch/arm/mach-rockchip/
 +F:    drivers/clk/rockchip/
 +F:    drivers/i2c/busses/i2c-rk3x.c
  F:    drivers/*/*rockchip*
 +F:    drivers/*/*/*rockchip*
 +F:    sound/soc/rockchip/
  
  ARM/SAMSUNG ARM ARCHITECTURES
  M:    Ben Dooks <ben-linux@fluff.org>
@@@ -1383,6 -1355,7 +1383,6 @@@ F:      arch/arm/boot/dts/sh
  F:    arch/arm/configs/ape6evm_defconfig
  F:    arch/arm/configs/armadillo800eva_defconfig
  F:    arch/arm/configs/bockw_defconfig
 -F:    arch/arm/configs/genmai_defconfig
  F:    arch/arm/configs/koelsch_defconfig
  F:    arch/arm/configs/kzm9g_defconfig
  F:    arch/arm/configs/lager_defconfig
@@@ -1393,23 -1366,15 +1393,23 @@@ F:   arch/arm/mach-shmobile
  F:    drivers/sh/
  
  ARM/SOCFPGA ARCHITECTURE
 -M:    Dinh Nguyen <dinguyen@altera.com>
 +M:    Dinh Nguyen <dinguyen@opensource.altera.com>
  S:    Maintained
  F:    arch/arm/mach-socfpga/
 +W:    http://www.rocketboards.org
 +T:    git://git.rocketboards.org/linux-socfpga.git
 +T:    git://git.rocketboards.org/linux-socfpga-next.git
  
  ARM/SOCFPGA CLOCK FRAMEWORK SUPPORT
 -M:    Dinh Nguyen <dinguyen@altera.com>
 +M:    Dinh Nguyen <dinguyen@opensource.altera.com>
  S:    Maintained
  F:    drivers/clk/socfpga/
  
 +ARM/SOCFPGA EDAC SUPPORT
 +M:    Thor Thayer <tthayer@opensource.altera.com>
 +S:    Maintained
 +F:    drivers/edac/altera_edac.
 +
  ARM/STI ARCHITECTURE
  M:    Srinivas Kandagatla <srinivas.kandagatla@gmail.com>
  M:    Maxime Coquelin <maxime.coquelin@st.com>
@@@ -1421,17 -1386,12 +1421,17 @@@ S:   Maintaine
  F:    arch/arm/mach-sti/
  F:    arch/arm/boot/dts/sti*
  F:    drivers/clocksource/arm_global_timer.c
 -F:    drivers/reset/sti/
 -F:    drivers/pinctrl/pinctrl-st.c
 -F:    drivers/media/rc/st_rc.c
  F:    drivers/i2c/busses/i2c-st.c
 -F:    drivers/tty/serial/st-asc.c
 +F:    drivers/media/rc/st_rc.c
  F:    drivers/mmc/host/sdhci-st.c
 +F:    drivers/phy/phy-stih407-usb.c
 +F:    drivers/phy/phy-stih41x-usb.c
 +F:    drivers/pinctrl/pinctrl-st.c
 +F:    drivers/reset/sti/
 +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
  
  ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
@@@ -1596,9 -1556,9 +1596,9 @@@ F:      drivers/platform/x86/asus*.
  F:    drivers/platform/x86/eeepc*.c
  
  ASYNCHRONOUS TRANSFERS/TRANSFORMS (IOAT) API
 -M:    Dan Williams <dan.j.williams@intel.com>
 +R:    Dan Williams <dan.j.williams@intel.com>
  W:    http://sourceforge.net/projects/xscaleiop
 -S:    Maintained
 +S:    Odd fixes
  F:    Documentation/crypto/async-tx-api.txt
  F:    crypto/async_tx/
  F:    drivers/dma/
@@@ -1650,7 -1610,6 +1650,7 @@@ L:      wil6210@qca.qualcomm.co
  S:    Supported
  W:    http://wireless.kernel.org/en/users/Drivers/wil6210
  F:    drivers/net/wireless/ath/wil6210/
 +F:    include/uapi/linux/wil6210_uapi.h
  
  CARL9170 LINUX COMMUNITY WIRELESS DRIVER
  M:    Christian Lamparter <chunkeey@googlemail.com>
@@@ -1700,12 -1659,6 +1700,12 @@@ M:    Nicolas Ferre <nicolas.ferre@atmel.c
  S:    Supported
  F:    drivers/tty/serial/atmel_serial.c
  
 +ATMEL Audio ALSA driver
 +M:    Bo Shen <voice.shen@atmel.com>
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Supported
 +F:    sound/soc/atmel
 +
  ATMEL DMA DRIVER
  M:    Nicolas Ferre <nicolas.ferre@atmel.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1890,12 -1843,6 +1890,12 @@@ S:    Orpha
  F:    Documentation/filesystems/befs.txt
  F:    fs/befs/
  
 +BECKHOFF CX5020 ETHERCAT MASTER DRIVER
 +M: Dariusz Marcinkiewicz <reksio@newterm.pl>
 +L: netdev@vger.kernel.org
 +S: Maintained
 +F: drivers/net/ethernet/ec_bhf.c
 +
  BFS FILE SYSTEM
  M:    "Tigran A. Aivazian" <tigran@aivazian.fsnet.co.uk>
  S:    Maintained
@@@ -2045,7 -1992,6 +2045,7 @@@ F:      drivers/net/ethernet/broadcom/bnx2x
  BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITECTURE
  M:    Christian Daudt <bcm@fixthebug.org>
  M:    Matt Porter <mporter@linaro.org>
 +M:    Florian Fainelli <f.fainelli@gmail.com>
  L:    bcm-kernel-feedback-list@broadcom.com
  T:    git git://github.com/broadcom/mach-bcm
  S:    Maintained
@@@ -2075,14 -2021,6 +2075,14 @@@ F:    arch/arm/mach-bcm/bcm_5301x.
  F:    arch/arm/boot/dts/bcm5301x.dtsi
  F:    arch/arm/boot/dts/bcm470*
  
 +BROADCOM BCM63XX ARM ARCHITECTURE
 +M:    Florian Fainelli <f.fainelli@gmail.com>
 +L:    linux-arm-kernel@lists.infradead.org
 +T:    git git://git.github.com/brcm/linux.git
 +S:    Maintained
 +F:    arch/arm/mach-bcm/bcm63xx.c
 +F:    arch/arm/include/debug/bcm63xx.S
 +
  BROADCOM BCM7XXX ARM ARCHITECTURE
  M:    Marc Carino <marc.ceeeee@gmail.com>
  M:    Brian Norris <computersforpeace@gmail.com>
@@@ -2121,7 -2059,7 +2121,7 @@@ S:      Supporte
  F:    drivers/scsi/bnx2i/
  
  BROADCOM KONA GPIO DRIVER
 -M:    Markus Mayer <markus.mayer@linaro.org>
 +M:    Ray Jui <rjui@broadcom.com>
  L:    bcm-kernel-feedback-list@broadcom.com
  S:    Supported
  F:    drivers/gpio/gpio-bcm-kona.c
@@@ -2148,7 -2086,7 +2148,7 @@@ S:      Supporte
  F:    drivers/scsi/bfa/
  
  BROCADE BNA 10 GIGABIT ETHERNET DRIVER
 -M:    Rasesh Mody <rmody@brocade.com>
 +M:    Rasesh Mody <rasesh.mody@qlogic.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/brocade/bna/
@@@ -2898,7 -2836,6 +2898,7 @@@ F:      drivers/platform/x86/dell-wmi.
  DESIGNWARE USB2 DRD IP DRIVER
  M:    Paul Zimmerman <paulz@synopsys.com>
  L:    linux-usb@vger.kernel.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
  S:    Maintained
  F:    drivers/usb/dwc2/
  
@@@ -2910,13 -2847,6 +2910,13 @@@ T:    git git://git.kernel.org/pub/scm/lin
  S:    Maintained
  F:    drivers/usb/dwc3/
  
 +DEVICE COREDUMP (DEV_COREDUMP)
 +M:    Johannes Berg <johannes@sipsolutions.net>
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +F:    drivers/base/devcoredump.c
 +F:    include/linux/devcoredump.h
 +
  DEVICE FREQUENCY (DEVFREQ)
  M:    MyungJoo Ham <myungjoo.ham@samsung.com>
  M:    Kyungmin Park <kyungmin.park@samsung.com>
@@@ -3047,11 -2977,13 +3047,11 @@@ T:   git git://git.linaro.org/people/sumi
  
  DMA GENERIC OFFLOAD ENGINE SUBSYSTEM
  M:    Vinod Koul <vinod.koul@intel.com>
 -M:    Dan Williams <dan.j.williams@intel.com>
  L:    dmaengine@vger.kernel.org
  Q:    https://patchwork.kernel.org/project/linux-dmaengine/list/
 -S:    Supported
 +S:    Maintained
  F:    drivers/dma/
  F:    include/linux/dma*
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx.git
  T:    git git://git.infradead.org/users/vkoul/slave-dma.git (slave-dma)
  
  DME1737 HARDWARE MONITOR DRIVER
@@@ -3068,14 -3000,14 +3068,14 @@@ S:   Supporte
  F:    drivers/acpi/dock.c
  
  DOCUMENTATION
 -M:    Randy Dunlap <rdunlap@infradead.org>
 +M:    Jiri Kosina <jkosina@suse.cz>
  L:    linux-doc@vger.kernel.org
 -T:    quilt http://www.infradead.org/~rdunlap/Doc/patches/
  S:    Maintained
  F:    Documentation/
  X:    Documentation/ABI/
  X:    Documentation/devicetree/
  X:    Documentation/[a-z][a-z]_[A-Z][A-Z]/
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/doc.git
  
  DOUBLETALK DRIVER
  M:    "James R. Van Zandt" <jrv@vanzandt.mv.com>
@@@ -3183,17 -3115,6 +3183,17 @@@ F:    include/linux/host1x.
  F:    include/uapi/drm/tegra_drm.h
  F:    Documentation/devicetree/bindings/gpu/nvidia,tegra20-host1x.txt
  
 +DRM DRIVERS FOR RENESAS
 +M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 +L:    dri-devel@lists.freedesktop.org
 +L:    linux-sh@vger.kernel.org
 +T:    git git://people.freedesktop.org/~airlied/linux
 +S:    Supported
 +F:    drivers/gpu/drm/rcar-du/
 +F:    drivers/gpu/drm/shmobile/
 +F:    include/linux/platform_data/rcar-du.h
 +F:    include/linux/platform_data/shmob_drm.h
 +
  DSBR100 USB FM RADIO DRIVER
  M:    Alexey Klimov <klimov.linux@gmail.com>
  L:    linux-media@vger.kernel.org
@@@ -3607,11 -3528,6 +3607,11 @@@ T:    git git://git.kernel.org/pub/scm/lin
  F:    drivers/video/fbdev/s1d13xxxfb.c
  F:    include/video/s1d13xxxfb.h
  
 +ET131X NETWORK DRIVER
 +M:    Mark Einon <mark.einon@gmail.com>
 +S:    Odd Fixes
 +F:    drivers/net/ethernet/agere/
 +
  ETHERNET BRIDGE
  M:    Stephen Hemminger <stephen@networkplumber.org>
  L:    bridge@lists.linux-foundation.org
@@@ -3927,13 -3843,10 +3927,13 @@@ F:   drivers/tty/serial/ucc_uart.
  
  FREESCALE SOC SOUND DRIVERS
  M:    Timur Tabi <timur@tabi.org>
 +M:    Nicolin Chen <nicoleotsuka@gmail.com>
 +M:    Xiubo Li <Li.Xiubo@freescale.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  L:    linuxppc-dev@lists.ozlabs.org
  S:    Maintained
  F:    sound/soc/fsl/fsl*
 +F:    sound/soc/fsl/imx*
  F:    sound/soc/fsl/mpc8610_hpcd.c
  
  FREEVXFS FILESYSTEM
@@@ -4533,12 -4446,6 +4533,12 @@@ F:    include/linux/i2c-*.
  F:    include/uapi/linux/i2c.h
  F:    include/uapi/linux/i2c-*.h
  
 +I2C ACPI SUPPORT
 +M:    Mika Westerberg <mika.westerberg@linux.intel.com>
 +L:    linux-i2c@vger.kernel.org
 +L:    linux-acpi@vger.kernel.org
 +S:    Maintained
 +
  I2C-TAOS-EVM DRIVER
  M:    Jean Delvare <jdelvare@suse.de>
  L:    linux-i2c@vger.kernel.org
@@@ -4657,14 -4564,13 +4657,14 @@@ F:   drivers/idle/i7300_idle.
  
  IEEE 802.15.4 SUBSYSTEM
  M:    Alexander Aring <alex.aring@gmail.com>
 -L:    linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers)
 -W:    http://apps.sourceforge.net/trac/linux-zigbee
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git
 +L:    linux-wpan@vger.kernel.org
 +W:    https://github.com/linux-wpan
 +T:    git git://github.com/linux-wpan/linux-wpan-next.git
  S:    Maintained
  F:    net/ieee802154/
  F:    net/mac802154/
  F:    drivers/net/ieee802154/
 +F:    Documentation/networking/ieee802154.txt
  
  IGUANAWORKS USB IR TRANSCEIVER
  M:    Sean Young <sean@mess.org>
@@@ -4674,9 -4580,6 +4674,9 @@@ F:      drivers/media/rc/iguanair.
  
  IIO SUBSYSTEM AND DRIVERS
  M:    Jonathan Cameron <jic23@kernel.org>
 +R:    Hartmut Knaack <knaack.h@gmx.de>
 +R:    Lars-Peter Clausen <lars@metafoo.de>
 +R:    Peter Meerwald <pmeerw@pmeerw.net>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
  F:    drivers/iio/
@@@ -4814,8 -4717,8 +4814,8 @@@ F:      arch/x86/kernel/cpu/microcode/core
  F:    arch/x86/kernel/cpu/microcode/intel*
  
  INTEL I/OAT DMA DRIVER
 -M:    Dan Williams <dan.j.williams@intel.com>
  M:    Dave Jiang <dave.jiang@intel.com>
 +R:    Dan Williams <dan.j.williams@intel.com>
  L:    dmaengine@vger.kernel.org
  Q:    https://patchwork.kernel.org/project/linux-dmaengine/list/
  S:    Supported
@@@ -4830,12 -4733,12 +4830,12 @@@ F:   drivers/iommu/intel-iommu.
  F:    include/linux/intel-iommu.h
  
  INTEL IOP-ADMA DMA DRIVER
 -M:    Dan Williams <dan.j.williams@intel.com>
 +R:    Dan Williams <dan.j.williams@intel.com>
  S:    Odd fixes
  F:    drivers/dma/iop-adma.c
  
  INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
 -M:    Krzysztof Halasa <khc@pm.waw.pl>
 +M:    Krzysztof Halasa <khalasa@piap.pl>
  S:    Maintained
  F:    arch/arm/mach-ixp4xx/include/mach/qmgr.h
  F:    arch/arm/mach-ixp4xx/include/mach/npe.h
@@@ -4849,14 -4752,14 +4849,14 @@@ M:   Deepak Saxena <dsaxena@plexity.net
  S:    Maintained
  F:    drivers/char/hw_random/ixp4xx-rng.c
  
 -INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/igbvf/ixgb/ixgbe/ixgbevf/i40e/i40evf)
 +INTEL ETHERNET DRIVERS (e100/e1000/e1000e/fm10k/igb/igbvf/ixgb/ixgbe/ixgbevf/i40e/i40evf)
  M:    Jeff Kirsher <jeffrey.t.kirsher@intel.com>
  M:    Jesse Brandeburg <jesse.brandeburg@intel.com>
  M:    Bruce Allan <bruce.w.allan@intel.com>
  M:    Carolyn Wyborny <carolyn.wyborny@intel.com>
  M:    Don Skidmore <donald.c.skidmore@intel.com>
  M:    Greg Rose <gregory.v.rose@intel.com>
 -M:    Alex Duyck <alexander.h.duyck@intel.com>
 +M:    Matthew Vick <matthew.vick@intel.com>
  M:    John Ronciak <john.ronciak@intel.com>
  M:    Mitch Williams <mitch.a.williams@intel.com>
  M:    Linux NICS <linux.nics@intel.com>
@@@ -5045,6 -4948,7 +5045,7 @@@ L:      linux-kernel@vger.kernel.or
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
  T:    git git://git.infradead.org/users/jcooper/linux.git irqchip/core
+ F:    Documentation/devicetree/bindings/interrupt-controller/
  F:    drivers/irqchip/
  
  IRQ DOMAINS (IRQ NUMBER MAPPING LIBRARY)
@@@ -5544,7 -5448,7 +5545,7 @@@ F:      drivers/macintosh
  LINUX FOR POWERPC EMBEDDED MPC5XXX
  M:    Anatolij Gustschin <agust@denx.de>
  L:    linuxppc-dev@lists.ozlabs.org
 -T:    git git://git.denx.de/linux-2.6-agust.git
 +T:    git git://git.denx.de/linux-denx-agust.git
  S:    Maintained
  F:    arch/powerpc/platforms/512x/
  F:    arch/powerpc/platforms/52xx/
@@@ -6069,12 -5973,6 +6070,12 @@@ T:    git git://linuxtv.org/media_tree.gi
  S:    Maintained
  F:    drivers/media/radio/radio-mr800.c
  
 +MRF24J40 IEEE 802.15.4 RADIO DRIVER
 +M:    Alan Ott <alan@signal11.us>
 +L:    linux-wpan@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/ieee802154/mrf24j40.c
 +
  MSI LAPTOP SUPPORT
  M:    "Lee, Chun-Yi" <jlee@suse.com>
  L:    platform-driver-x86@vger.kernel.org
@@@ -6437,7 -6335,7 +6438,7 @@@ M:      Lauro Ramos Venancio <lauro.venancio
  M:    Aloisio Almeida Jr <aloisio.almeida@openbossa.org>
  M:    Samuel Ortiz <sameo@linux.intel.com>
  L:    linux-wireless@vger.kernel.org
 -L:    linux-nfc@lists.01.org (moderated for non-subscribers)
 +L:    linux-nfc@lists.01.org (subscribers-only)
  S:    Supported
  F:    net/nfc/
  F:    include/net/nfc/
@@@ -6488,8 -6386,7 +6489,8 @@@ F:      Documentation/scsi/NinjaSCSI.tx
  F:    drivers/scsi/nsp32*
  
  NTB DRIVER
 -M:    Jon Mason <jon.mason@intel.com>
 +M:    Jon Mason <jdmason@kudzu.us>
 +M:    Dave Jiang <dave.jiang@intel.com>
  S:    Supported
  W:    https://github.com/jonmason/ntb/wiki
  T:    git git://github.com/jonmason/ntb.git
@@@ -6940,7 -6837,7 +6941,7 @@@ F:      arch/x86/kernel/quirks.
  
  PCI DRIVER FOR IMX6
  M:    Richard Zhu <r65037@freescale.com>
 -M:    Shawn Guo <shawn.guo@freescale.com>
 +M:    Lucas Stach <l.stach@pengutronix.de>
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
@@@ -6962,14 -6859,6 +6963,14 @@@ S:    Supporte
  F:    Documentation/devicetree/bindings/pci/nvidia,tegra20-pcie.txt
  F:    drivers/pci/host/pci-tegra.c
  
 +PCI DRIVER FOR TI DRA7XX
 +M:    Kishon Vijay Abraham I <kishon@ti.com>
 +L:    linux-omap@vger.kernel.org
 +L:    linux-pci@vger.kernel.org
 +S:    Supported
 +F:    Documentation/devicetree/bindings/pci/ti-pci.txt
 +F:    drivers/pci/host/pci-dra7xx.c
 +
  PCI DRIVER FOR RENESAS R-CAR
  M:    Simon Horman <horms@verge.net.au>
  L:    linux-pci@vger.kernel.org
@@@ -7118,7 -7007,7 +7119,7 @@@ S:      Maintaine
  F:    drivers/pinctrl/sh-pfc/
  
  PIN CONTROLLER - SAMSUNG
 -M:    Tomasz Figa <t.figa@samsung.com>
 +M:    Tomasz Figa <tomasz.figa@gmail.com>
  M:    Thomas Abraham <thomas.abraham@linaro.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
@@@ -7361,12 -7250,12 +7362,12 @@@ F:   drivers/video/backlight/pwm_bl.
  F:    include/linux/pwm_backlight.h
  
  PXA2xx/PXA3xx SUPPORT
 -M:    Eric Miao <eric.y.miao@gmail.com>
 -M:    Russell King <linux@arm.linux.org.uk>
 +M:    Daniel Mack <daniel@zonque.org>
  M:    Haojian Zhuang <haojian.zhuang@gmail.com>
 +M:    Robert Jarzmik <robert.jarzmik@free.fr>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  T:    git git://github.com/hzhuang1/linux.git
 -T:    git git://git.linaro.org/people/ycmiao/pxa-linux.git
 +T:    git git://github.com/rjarzmik/linux.git
  S:    Maintained
  F:    arch/arm/mach-pxa/
  F:    drivers/pcmcia/pxa2xx*
@@@ -7443,15 -7332,15 +7444,15 @@@ F:   drivers/net/ethernet/qlogic/qla3xxx.
  
  QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
  M:    Shahed Shaikh <shahed.shaikh@qlogic.com>
 -M:    Dept-HSGLinuxNICDev@qlogic.com
 +M:    Dept-GELinuxNICDev@qlogic.com
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/qlogic/qlcnic/
  
  QLOGIC QLGE 10Gb ETHERNET DRIVER
 -M:    Shahed Shaikh <shahed.shaikh@qlogic.com>
 -M:    Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
 -M:    Ron Mercer <ron.mercer@qlogic.com>
 +M:    Harish Patil <harish.patil@qlogic.com>
 +M:    Sudarsana Kalluru <sudarsana.kalluru@qlogic.com>
 +M:    Dept-GELinuxNICDev@qlogic.com
  M:    linux-driver@qlogic.com
  L:    netdev@vger.kernel.org
  S:    Supported
@@@ -7554,12 -7443,13 +7555,12 @@@ F:   drivers/video/fbdev/aty/aty128fb.
  
  RALINK RT2X00 WIRELESS LAN DRIVER
  P:    rt2x00 project
 -M:    Ivo van Doorn <IvDoorn@gmail.com>
 +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
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ivd/rt2x00.git
  F:    drivers/net/wireless/rt2x00/
  
  RAMDISK RAM BLOCK DEVICE DRIVER
@@@ -7661,7 -7551,6 +7662,7 @@@ F:      fs/reiserfs
  
  REGISTER MAP ABSTRACTION
  M:    Mark Brown <broonie@kernel.org>
 +L:    linux-kernel@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git
  S:    Supported
  F:    drivers/base/regmap/
@@@ -7964,8 -7853,7 +7965,8 @@@ S:      Supporte
  F:    drivers/media/i2c/s5k5baf.c
  
  SAMSUNG SOC CLOCK DRIVERS
 -M:    Tomasz Figa <t.figa@samsung.com>
 +M:    Sylwester Nawrocki <s.nawrocki@samsung.com>
 +M:    Tomasz Figa <tomasz.figa@gmail.com>
  S:    Supported
  L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
  F:    drivers/clk/samsung/
@@@ -7978,19 -7866,6 +7979,19 @@@ S:    Supporte
  L:    netdev@vger.kernel.org
  F:    drivers/net/ethernet/samsung/sxgbe/
  
 +SAMSUNG USB2 PHY DRIVER
 +M:    Kamil Debski <k.debski@samsung.com>
 +L:    linux-kernel@vger.kernel.org
 +S:    Supported
 +F:    Documentation/devicetree/bindings/phy/samsung-phy.txt
 +F:    Documentation/phy/samsung-usb2.txt
 +F:    drivers/phy/phy-exynos4210-usb2.c
 +F:    drivers/phy/phy-exynos4x12-usb2.c
 +F:    drivers/phy/phy-exynos5250-usb2.c
 +F:    drivers/phy/phy-s5pv210-usb2.c
 +F:    drivers/phy/phy-samsung-usb2.c
 +F:    drivers/phy/phy-samsung-usb2.h
 +
  SERIAL DRIVERS
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  L:    linux-serial@vger.kernel.org
@@@ -8759,6 -8634,11 +8760,6 @@@ M:     H Hartley Sweeten <hsweeten@visionen
  S:    Odd Fixes
  F:    drivers/staging/comedi/
  
 -STAGING - ET131X NETWORK DRIVER
 -M:    Mark Einon <mark.einon@gmail.com>
 -S:    Odd Fixes
 -F:    drivers/staging/et131x/
 -
  STAGING - FLARION FT1000 DRIVERS
  M:    Marek Belisko <marek.belisko@gmail.com>
  S:    Odd Fixes
@@@ -8776,14 -8656,6 +8777,14 @@@ W:    http://www.lirc.org
  S:    Odd Fixes
  F:    drivers/staging/media/lirc/
  
 +STAGING - LUSTRE PARALLEL FILESYSTEM
 +M:    Oleg Drokin <oleg.drokin@intel.com>
 +M:    Andreas Dilger <andreas.dilger@intel.com>
 +L:    HPDD-discuss@lists.01.org (moderated for non-subscribers)
 +W:    http://lustre.opensfs.org/
 +S:    Maintained
 +F:    drivers/staging/lustre
 +
  STAGING - NVIDIA COMPLIANT EMBEDDED CONTROLLER INTERFACE (nvec)
  M:    Julian Andres Klode <jak@jak-linux.org>
  M:    Marc Dietrich <marvin24@gmx.de>
@@@ -9077,13 -8949,17 +9078,13 @@@ F:   drivers/media/rc/ttusbir.
  TEGRA ARCHITECTURE SUPPORT
  M:    Stephen Warren <swarren@wwwdotorg.org>
  M:    Thierry Reding <thierry.reding@gmail.com>
 +M:    Alexandre Courbot <gnurou@gmail.com>
  L:    linux-tegra@vger.kernel.org
  Q:    http://patchwork.ozlabs.org/project/linux-tegra/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux.git
  S:    Supported
  N:    [^a-z]tegra
  
 -TEGRA ASOC DRIVER
 -M:    Stephen Warren <swarren@wwwdotorg.org>
 -S:    Supported
 -F:    sound/soc/tegra/
 -
  TEGRA CLOCK DRIVER
  M:    Peter De Schrijver <pdeschrijver@nvidia.com>
  M:    Prashant Gaikwad <pgaikwad@nvidia.com>
@@@ -9095,6 -8971,11 +9096,6 @@@ M:     Laxman Dewangan <ldewangan@nvidia.co
  S:    Supported
  F:    drivers/dma/tegra20-apb-dma.c
  
 -TEGRA GPIO DRIVER
 -M:    Stephen Warren <swarren@wwwdotorg.org>
 -S:    Supported
 -F:    drivers/gpio/gpio-tegra.c
 -
  TEGRA I2C DRIVER
  M:    Laxman Dewangan <ldewangan@nvidia.com>
  S:    Supported
@@@ -9111,6 -8992,11 +9112,6 @@@ M:     Laxman Dewangan <ldewangan@nvidia.co
  S:    Supported
  F:    drivers/input/keyboard/tegra-kbc.c
  
 -TEGRA PINCTRL DRIVER
 -M:    Stephen Warren <swarren@wwwdotorg.org>
 -S:    Supported
 -F:    drivers/pinctrl/pinctrl-tegra*
 -
  TEGRA PWM DRIVER
  M:    Thierry Reding <thierry.reding@gmail.com>
  S:    Supported
@@@ -9201,15 -9087,6 +9202,15 @@@ F:    drivers/misc/tifm
  F:    drivers/mmc/host/tifm_sd.c
  F:    include/linux/tifm.h
  
 +TI KEYSTONE MULTICORE NAVIGATOR DRIVERS
 +M:    Santosh Shilimkar <santosh.shilimkar@ti.com>
 +L:    linux-kernel@vger.kernel.org
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    drivers/soc/ti/*
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ssantosh/linux-keystone.git
 +
 +
  TI LM49xxx FAMILY ASoC CODEC DRIVERS
  M:    M R Swami Reddy <mr.swami.reddy@ti.com>
  M:    Vishwas A Deshpande <vishwas.a.deshpande@ti.com>
@@@ -9639,14 -9516,6 +9640,14 @@@ S:    Maintaine
  F:    Documentation/usb/ohci.txt
  F:    drivers/usb/host/ohci*
  
 +USB OVER IP DRIVER
 +M:    Valentina Manea <valentina.manea.m@gmail.com>
 +M:    Shuah Khan <shuah.kh@samsung.com>
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +F:    drivers/usb/usbip/
 +F:    tools/usb/usbip/
 +
  USB PEGASUS DRIVER
  M:    Petko Manolov <petkan@nucleusys.com>
  L:    linux-usb@vger.kernel.org
@@@ -9745,7 -9614,7 +9746,7 @@@ USB WEBCAM GADGE
  M:    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  L:    linux-usb@vger.kernel.org
  S:    Maintained
 -F:    drivers/usb/gadget/function/*uvc*.c
 +F:    drivers/usb/gadget/function/*uvc*
  F:    drivers/usb/gadget/legacy/webcam.c
  
  USB WIRELESS RNDIS DRIVER (rndis_wlan)
@@@ -9959,7 -9828,6 +9960,7 @@@ F:      drivers/scsi/vmw_pvscsi.
  VOLTAGE AND CURRENT REGULATOR FRAMEWORK
  M:    Liam Girdwood <lgirdwood@gmail.com>
  M:    Mark Brown <broonie@kernel.org>
 +L:    linux-kernel@vger.kernel.org
  W:    http://opensource.wolfsonmicro.com/node/15
  W:    http://www.slimlogic.co.uk/?p=48
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git
@@@ -10148,9 -10016,9 +10149,9 @@@ F:   Documentation/x86
  F:    arch/x86/
  
  X86 PLATFORM DRIVERS
 -M:    Matthew Garrett <matthew.garrett@nebula.com>
 +M:    Darren Hart <dvhart@infradead.org>
  L:    platform-driver-x86@vger.kernel.org
 -T:    git git://cavan.codon.org.uk/platform-drivers-x86.git
 +T:    git git://git.infradead.org/users/dvhart/linux-platform-drivers-x86.git
  S:    Maintained
  F:    drivers/platform/x86/
  
@@@ -10253,12 -10121,6 +10254,12 @@@ L: linux-serial@vger.kernel.or
  S:    Maintained
  F:    drivers/tty/serial/uartlite.c
  
 +XILLYBUS DRIVER
 +M:    Eli Billauer <eli.billauer@gmail.com>
 +L:    linux-kernel@vger.kernel.org
 +S:    Supported
 +F:    drivers/char/xillybus/
 +
  XTENSA XTFPGA PLATFORM SUPPORT
  M:    Max Filippov <jcmvbkbc@gmail.com>
  L:    linux-xtensa@linux-xtensa.org
diff --combined arch/arm/Kconfig
@@@ -24,6 -24,7 +24,7 @@@ config AR
        select GENERIC_SMP_IDLE_THREAD
        select GENERIC_STRNCPY_FROM_USER
        select GENERIC_STRNLEN_USER
+       select HANDLE_DOMAIN_IRQ
        select HARDIRQS_SW_RESEND
        select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT)
        select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL
@@@ -387,7 -388,6 +388,7 @@@ config ARCH_CLPS711
        select CPU_ARM720T
        select GENERIC_CLOCKEVENTS
        select MFD_SYSCON
 +      select SOC_BUS
        help
          Support for Cirrus Logic 711x/721x/731x based boards.
  
@@@ -651,7 -651,6 +652,7 @@@ config ARCH_SHMOBILE_LEGAC
        select ARCH_SHMOBILE
        select ARM_PATCH_PHYS_VIRT if MMU
        select CLKDEV_LOOKUP
 +      select CPU_V7
        select GENERIC_CLOCKEVENTS
        select HAVE_ARM_SCU if SMP
        select HAVE_ARM_TWD if SMP
        select NO_IOPORT_MAP
        select PINCTRL
        select PM_GENERIC_DOMAINS if PM
 +      select SH_CLK_CPG
        select SPARSE_IRQ
        help
          Support for Renesas ARM SoC platforms using a non-multiplatform
@@@ -891,8 -889,6 +892,8 @@@ source "arch/arm/mach-keystone/Kconfig
  
  source "arch/arm/mach-ks8695/Kconfig"
  
 +source "arch/arm/mach-meson/Kconfig"
 +
  source "arch/arm/mach-msm/Kconfig"
  
  source "arch/arm/mach-moxart/Kconfig"
@@@ -1410,15 -1406,6 +1411,15 @@@ config MCP
          for (multi-)cluster based systems, such as big.LITTLE based
          systems.
  
 +config MCPM_QUAD_CLUSTER
 +      bool
 +      depends on MCPM
 +      help
 +        To avoid wasting resources unnecessarily, MCPM only supports up
 +        to 2 clusters by default.
 +        Platforms with 3 or 4 clusters that use MCPM must select this
 +        option to allow the additional clusters to be managed.
 +
  config BIG_LITTLE
        bool "big.LITTLE support (Experimental)"
        depends on CPU_V7 && SMP
@@@ -1997,6 -1984,8 +1998,6 @@@ config XIP_PHYS_ADD
  config KEXEC
        bool "Kexec system call (EXPERIMENTAL)"
        depends on (!SMP || PM_SLEEP_SMP)
 -      select CRYPTO
 -      select CRYPTO_SHA256
        help
          kexec is a system call that implements the ability to shutdown your
          current kernel, and to start another kernel.  It is like a reboot
diff --combined arch/arm/kernel/irq.c
@@@ -65,24 -65,7 +65,7 @@@ int arch_show_interrupts(struct seq_fil
   */
  void handle_IRQ(unsigned int irq, struct pt_regs *regs)
  {
-       struct pt_regs *old_regs = set_irq_regs(regs);
-       irq_enter();
-       /*
-        * Some hardware gives randomly wrong interrupts.  Rather
-        * than crashing, do something sensible.
-        */
-       if (unlikely(irq >= nr_irqs)) {
-               if (printk_ratelimit())
-                       printk(KERN_WARNING "Bad IRQ%u\n", irq);
-               ack_bad_irq(irq);
-       } else {
-               generic_handle_irq(irq);
-       }
-       irq_exit();
-       set_irq_regs(old_regs);
+       __handle_domain_irq(NULL, irq, false, regs);
  }
  
  /*
@@@ -175,7 -158,7 +158,7 @@@ static bool migrate_one_irq(struct irq_
        c = irq_data_get_irq_chip(d);
        if (!c->irq_set_affinity)
                pr_debug("IRQ%u: unable to set affinity\n", d->irq);
 -      else if (c->irq_set_affinity(d, affinity, true) == IRQ_SET_MASK_OK && ret)
 +      else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret)
                cpumask_copy(d->affinity, affinity);
  
        return ret;
@@@ -205,8 -188,8 +188,8 @@@ void migrate_irqs(void
                raw_spin_unlock(&desc->lock);
  
                if (affinity_broken && printk_ratelimit())
 -                      pr_warning("IRQ%u no longer affine to CPU%u\n", i,
 -                              smp_processor_id());
 +                      pr_warn("IRQ%u no longer affine to CPU%u\n",
 +                              i, smp_processor_id());
        }
  
        local_irq_restore(flags);
diff --combined arch/arm64/Kconfig
@@@ -30,12 -30,12 +30,13 @@@ config ARM6
        select GENERIC_STRNCPY_FROM_USER
        select GENERIC_STRNLEN_USER
        select GENERIC_TIME_VSYSCALL
+       select HANDLE_DOMAIN_IRQ
        select HARDIRQS_SW_RESEND
        select HAVE_ARCH_AUDITSYSCALL
        select HAVE_ARCH_JUMP_LABEL
        select HAVE_ARCH_KGDB
        select HAVE_ARCH_TRACEHOOK
 +      select HAVE_BPF_JIT
        select HAVE_C_RECORDMCOUNT
        select HAVE_CC_STACKPROTECTOR
        select HAVE_DEBUG_BUGVERBOSE
@@@ -135,11 -135,6 +136,11 @@@ source "kernel/Kconfig.freezer
  
  menu "Platform selection"
  
 +config ARCH_THUNDER
 +      bool "Cavium Inc. Thunder SoC Family"
 +      help
 +        This enables support for Cavium's Thunder Family of SoCs.
 +
  config ARCH_VEXPRESS
        bool "ARMv8 software model (Versatile Express)"
        select ARCH_REQUIRE_GPIOLIB
@@@ -258,11 -253,11 +259,11 @@@ config SCHED_SM
          places. If unsure say N here.
  
  config NR_CPUS
 -      int "Maximum number of CPUs (2-32)"
 -      range 2 32
 +      int "Maximum number of CPUs (2-64)"
 +      range 2 64
        depends on SMP
        # These have to remain sorted largest to smallest
 -      default "8"
 +      default "64"
  
  config HOTPLUG_CPU
        bool "Support for hot-pluggable CPUs"
diff --combined arch/arm64/kernel/irq.c
@@@ -40,33 -40,6 +40,6 @@@ int arch_show_interrupts(struct seq_fil
        return 0;
  }
  
- /*
-  * handle_IRQ handles all hardware IRQ's.  Decoded IRQs should
-  * not come via this function.  Instead, they should provide their
-  * own 'handler'.  Used by platform code implementing C-based 1st
-  * level decoding.
-  */
- void handle_IRQ(unsigned int irq, struct pt_regs *regs)
- {
-       struct pt_regs *old_regs = set_irq_regs(regs);
-       irq_enter();
-       /*
-        * Some hardware gives randomly wrong interrupts.  Rather
-        * than crashing, do something sensible.
-        */
-       if (unlikely(irq >= nr_irqs)) {
-               pr_warn_ratelimited("Bad IRQ%u\n", irq);
-               ack_bad_irq(irq);
-       } else {
-               generic_handle_irq(irq);
-       }
-       irq_exit();
-       set_irq_regs(old_regs);
- }
  void __init set_handle_irq(void (*handle_irq)(struct pt_regs *))
  {
        if (handle_arch_irq)
@@@ -97,15 -70,19 +70,15 @@@ static bool migrate_one_irq(struct irq_
        if (irqd_is_per_cpu(d) || !cpumask_test_cpu(smp_processor_id(), affinity))
                return false;
  
 -      if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids)
 +      if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) {
 +              affinity = cpu_online_mask;
                ret = true;
 +      }
  
 -      /*
 -       * when using forced irq_set_affinity we must ensure that the cpu
 -       * being offlined is not present in the affinity mask, it may be
 -       * selected as the target CPU otherwise
 -       */
 -      affinity = cpu_online_mask;
        c = irq_data_get_irq_chip(d);
        if (!c->irq_set_affinity)
                pr_debug("IRQ%u: unable to set affinity\n", d->irq);
 -      else if (c->irq_set_affinity(d, affinity, true) == IRQ_SET_MASK_OK && ret)
 +      else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret)
                cpumask_copy(d->affinity, affinity);
  
        return ret;
diff --combined drivers/irqchip/Kconfig
@@@ -75,11 -75,6 +75,11 @@@ config OR1K_PI
        bool
        select IRQ_DOMAIN
  
 +config OMAP_IRQCHIP
 +      bool
 +      select GENERIC_IRQ_CHIP
 +      select IRQ_DOMAIN
 +
  config ORION_IRQCHIP
        bool
        select IRQ_DOMAIN
@@@ -114,7 -109,14 +114,14 @@@ config XTENSA_M
  config IRQ_CROSSBAR
        bool
        help
 -        Support for a CROSSBAR ip that preceeds the main interrupt controller.
 +        Support for a CROSSBAR ip that precedes the main interrupt controller.
          The primary irqchip invokes the crossbar's callback which inturn allocates
          a free irq and configures the IP. Thus the peripheral interrupts are
          routed to one of the free irqchip interrupt lines.
+ config KEYSTONE_IRQ
+       tristate "Keystone 2 IRQ controller IP"
+       depends on ARCH_KEYSTONE
+       help
+               Support for Texas Instruments Keystone 2 IRQ controller IP which
+               is part of the Keystone 2 IPC mechanism
diff --combined drivers/irqchip/Makefile
@@@ -2,6 -2,7 +2,7 @@@ obj-$(CONFIG_IRQCHIP)                    += irqchip.
  
  obj-$(CONFIG_ARCH_BCM2835)            += irq-bcm2835.o
  obj-$(CONFIG_ARCH_EXYNOS)             += exynos-combiner.o
+ obj-$(CONFIG_ARCH_HIP04)              += irq-hip04.o
  obj-$(CONFIG_ARCH_MMP)                        += irq-mmp.o
  obj-$(CONFIG_ARCH_MVEBU)              += irq-armada-370-xp.o
  obj-$(CONFIG_ARCH_MXS)                        += irq-mxs.o
@@@ -13,7 -14,6 +14,7 @@@ obj-$(CONFIG_ARCH_MOXART)             += irq-moxar
  obj-$(CONFIG_CLPS711X_IRQCHIP)                += irq-clps711x.o
  obj-$(CONFIG_OR1K_PIC)                        += irq-or1k-pic.o
  obj-$(CONFIG_ORION_IRQCHIP)           += irq-orion.o
 +obj-$(CONFIG_OMAP_IRQCHIP)            += irq-omap-intc.o
  obj-$(CONFIG_ARCH_SUNXI)              += irq-sun4i.o
  obj-$(CONFIG_ARCH_SUNXI)              += irq-sunxi-nmi.o
  obj-$(CONFIG_ARCH_SPEAR3XX)           += spear-shirq.o
@@@ -34,4 -34,6 +35,6 @@@ obj-$(CONFIG_TB10X_IRQC)              += irq-tb10x.
  obj-$(CONFIG_XTENSA)                  += irq-xtensa-pic.o
  obj-$(CONFIG_XTENSA_MX)                       += irq-xtensa-mx.o
  obj-$(CONFIG_IRQ_CROSSBAR)            += irq-crossbar.o
- obj-$(CONFIG_BRCMSTB_L2_IRQ)          += irq-brcmstb-l2.o
+ obj-$(CONFIG_BRCMSTB_L2_IRQ)          += irq-brcmstb-l2.o \
+                                          irq-bcm7120-l2.o
+ obj-$(CONFIG_KEYSTONE_IRQ)            += irq-keystone.o
@@@ -16,6 -16,7 +16,7 @@@
   */
  
  #include <linux/cpu.h>
+ #include <linux/cpu_pm.h>
  #include <linux/delay.h>
  #include <linux/interrupt.h>
  #include <linux/of.h>
@@@ -36,7 -37,7 +37,7 @@@
  struct gic_chip_data {
        void __iomem            *dist_base;
        void __iomem            **redist_base;
 -      void __percpu __iomem   **rdist;
 +      void __iomem * __percpu *rdist;
        struct irq_domain       *domain;
        u64                     redist_stride;
        u32                     redist_regions;
@@@ -104,7 -105,7 +105,7 @@@ static void gic_redist_wait_for_rwp(voi
  }
  
  /* Low level accessors */
 -static u64 gic_read_iar(void)
 +static u64 __maybe_unused gic_read_iar(void)
  {
        u64 irqstat;
  
        return irqstat;
  }
  
 -static void gic_write_pmr(u64 val)
 +static void __maybe_unused gic_write_pmr(u64 val)
  {
        asm volatile("msr_s " __stringify(ICC_PMR_EL1) ", %0" : : "r" (val));
  }
  
 -static void gic_write_ctlr(u64 val)
 +static void __maybe_unused gic_write_ctlr(u64 val)
  {
        asm volatile("msr_s " __stringify(ICC_CTLR_EL1) ", %0" : : "r" (val));
        isb();
  }
  
 -static void gic_write_grpen1(u64 val)
 +static void __maybe_unused gic_write_grpen1(u64 val)
  {
        asm volatile("msr_s " __stringify(ICC_GRPEN1_EL1) ", %0" : : "r" (val));
        isb();
  }
  
 -static void gic_write_sgi1r(u64 val)
 +static void __maybe_unused gic_write_sgi1r(u64 val)
  {
        asm volatile("msr_s " __stringify(ICC_SGI1R_EL1) ", %0" : : "r" (val));
  }
@@@ -155,7 -156,7 +156,7 @@@ static void gic_enable_sre(void
                pr_err("GIC: unable to set SRE (disabled at EL2), panic ahead\n");
  }
  
- static void gic_enable_redist(void)
+ static void gic_enable_redist(bool enable)
  {
        void __iomem *rbase;
        u32 count = 1000000;    /* 1s! */
  
        rbase = gic_data_rdist_rd_base();
  
-       /* Wake up this CPU redistributor */
        val = readl_relaxed(rbase + GICR_WAKER);
-       val &= ~GICR_WAKER_ProcessorSleep;
+       if (enable)
+               /* Wake up this CPU redistributor */
+               val &= ~GICR_WAKER_ProcessorSleep;
+       else
+               val |= GICR_WAKER_ProcessorSleep;
        writel_relaxed(val, rbase + GICR_WAKER);
  
-       while (readl_relaxed(rbase + GICR_WAKER) & GICR_WAKER_ChildrenAsleep) {
-               count--;
-               if (!count) {
-                       pr_err_ratelimited("redist didn't wake up...\n");
-                       return;
-               }
+       if (!enable) {          /* Check that GICR_WAKER is writeable */
+               val = readl_relaxed(rbase + GICR_WAKER);
+               if (!(val & GICR_WAKER_ProcessorSleep))
+                       return; /* No PM support in this redistributor */
+       }
+       while (count--) {
+               val = readl_relaxed(rbase + GICR_WAKER);
+               if (enable ^ (val & GICR_WAKER_ChildrenAsleep))
+                       break;
                cpu_relax();
                udelay(1);
        };
+       if (!count)
+               pr_err_ratelimited("redistributor failed to %s...\n",
+                                  enable ? "wakeup" : "sleep");
  }
  
  /*
@@@ -200,6 -211,19 +211,6 @@@ static void gic_poke_irq(struct irq_dat
        rwp_wait();
  }
  
 -static int gic_peek_irq(struct irq_data *d, u32 offset)
 -{
 -      u32 mask = 1 << (gic_irq(d) % 32);
 -      void __iomem *base;
 -
 -      if (gic_irq_in_rdist(d))
 -              base = gic_data_rdist_sgi_base();
 -      else
 -              base = gic_data.dist_base;
 -
 -      return !!(readl_relaxed(base + offset + (gic_irq(d) / 32) * 4) & mask);
 -}
 -
  static void gic_mask_irq(struct irq_data *d)
  {
        gic_poke_irq(d, GICD_ICENABLER);
@@@ -261,14 -285,13 +272,13 @@@ static asmlinkage void __exception_irq_
                irqnr = gic_read_iar();
  
                if (likely(irqnr > 15 && irqnr < 1020)) {
-                       u64 irq = irq_find_mapping(gic_data.domain, irqnr);
-                       if (likely(irq)) {
-                               handle_IRQ(irq, regs);
-                               continue;
+                       int err;
+                       err = handle_domain_irq(gic_data.domain, irqnr, regs);
+                       if (err) {
+                               WARN_ONCE(true, "Unexpected SPI received!\n");
+                               gic_write_eoir(irqnr);
                        }
-                       WARN_ONCE(true, "Unexpected SPI received!\n");
-                       gic_write_eoir(irqnr);
+                       continue;
                }
                if (irqnr < 16) {
                        gic_write_eoir(irqnr);
@@@ -360,6 -383,21 +370,21 @@@ static int gic_populate_rdist(void
        return -ENODEV;
  }
  
+ static void gic_cpu_sys_reg_init(void)
+ {
+       /* Enable system registers */
+       gic_enable_sre();
+       /* Set priority mask register */
+       gic_write_pmr(DEFAULT_PMR_VALUE);
+       /* EOI deactivates interrupt too (mode 0) */
+       gic_write_ctlr(ICC_CTLR_EL1_EOImode_drop_dir);
+       /* ... and let's hit the road... */
+       gic_write_grpen1(1);
+ }
  static void gic_cpu_init(void)
  {
        void __iomem *rbase;
        if (gic_populate_rdist())
                return;
  
-       gic_enable_redist();
+       gic_enable_redist(true);
  
        rbase = gic_data_rdist_sgi_base();
  
        gic_cpu_config(rbase, gic_redist_wait_for_rwp);
  
-       /* Enable system registers */
-       gic_enable_sre();
-       /* Set priority mask register */
-       gic_write_pmr(DEFAULT_PMR_VALUE);
-       /* EOI deactivates interrupt too (mode 0) */
-       gic_write_ctlr(ICC_CTLR_EL1_EOImode_drop_dir);
-       /* ... and let's hit the road... */
-       gic_write_grpen1(1);
+       /* initialise system registers */
+       gic_cpu_sys_reg_init();
  }
  
  #ifdef CONFIG_SMP
 +static int gic_peek_irq(struct irq_data *d, u32 offset)
 +{
 +      u32 mask = 1 << (gic_irq(d) % 32);
 +      void __iomem *base;
 +
 +      if (gic_irq_in_rdist(d))
 +              base = gic_data_rdist_sgi_base();
 +      else
 +              base = gic_data.dist_base;
 +
 +      return !!(readl_relaxed(base + offset + (gic_irq(d) / 32) * 4) & mask);
 +}
 +
  static int gic_secondary_init(struct notifier_block *nfb,
                              unsigned long action, void *hcpu)
  {
@@@ -533,6 -549,33 +549,33 @@@ static int gic_set_affinity(struct irq_
  #define gic_smp_init()                do { } while(0)
  #endif
  
+ #ifdef CONFIG_CPU_PM
+ static int gic_cpu_pm_notifier(struct notifier_block *self,
+                              unsigned long cmd, void *v)
+ {
+       if (cmd == CPU_PM_EXIT) {
+               gic_enable_redist(true);
+               gic_cpu_sys_reg_init();
+       } else if (cmd == CPU_PM_ENTER) {
+               gic_write_grpen1(0);
+               gic_enable_redist(false);
+       }
+       return NOTIFY_OK;
+ }
+ static struct notifier_block gic_cpu_pm_notifier_block = {
+       .notifier_call = gic_cpu_pm_notifier,
+ };
+ static void gic_cpu_pm_init(void)
+ {
+       cpu_pm_register_notifier(&gic_cpu_pm_notifier_block);
+ }
+ #else
+ static inline void gic_cpu_pm_init(void) { }
+ #endif /* CONFIG_CPU_PM */
  static struct irq_chip gic_chip = {
        .name                   = "GICv3",
        .irq_mask               = gic_mask_irq,
@@@ -672,6 -715,7 +715,7 @@@ static int __init gic_of_init(struct de
        gic_smp_init();
        gic_dist_init();
        gic_cpu_init();
+       gic_cpu_pm_init();
  
        return 0;
  
@@@ -270,8 -270,7 +270,7 @@@ static void __exception_irq_entry gic_h
                irqnr = irqstat & GICC_IAR_INT_ID_MASK;
  
                if (likely(irqnr > 15 && irqnr < 1021)) {
-                       irqnr = irq_find_mapping(gic->domain, irqnr);
-                       handle_IRQ(irqnr, regs);
+                       handle_domain_irq(gic->domain, irqnr, regs);
                        continue;
                }
                if (irqnr < 16) {
@@@ -298,8 -297,8 +297,8 @@@ static void gic_handle_cascade_irq(unsi
        status = readl_relaxed(gic_data_cpu_base(chip_data) + GIC_CPU_INTACK);
        raw_spin_unlock(&irq_controller_lock);
  
-       gic_irq = (status & 0x3ff);
-       if (gic_irq == 1023)
+       gic_irq = (status & GICC_IAR_INT_ID_MASK);
+       if (gic_irq == GICC_INT_SPURIOUS)
                goto out;
  
        cascade_irq = irq_find_mapping(chip_data->domain, gic_irq);
@@@ -353,6 -352,21 +352,21 @@@ static u8 gic_get_cpumask(struct gic_ch
        return mask;
  }
  
+ static void gic_cpu_if_up(void)
+ {
+       void __iomem *cpu_base = gic_data_cpu_base(&gic_data[0]);
+       u32 bypass = 0;
+       /*
+       * Preserve bypass disable bits to be written back later
+       */
+       bypass = readl(cpu_base + GIC_CPU_CTRL);
+       bypass &= GICC_DIS_BYPASS_MASK;
+       writel_relaxed(bypass | GICC_ENABLE, cpu_base + GIC_CPU_CTRL);
+ }
  static void __init gic_dist_init(struct gic_chip_data *gic)
  {
        unsigned int i;
        unsigned int gic_irqs = gic->gic_irqs;
        void __iomem *base = gic_data_dist_base(gic);
  
-       writel_relaxed(0, base + GIC_DIST_CTRL);
+       writel_relaxed(GICD_DISABLE, base + GIC_DIST_CTRL);
  
        /*
         * Set all global interrupts to this CPU only.
  
        gic_dist_config(base, gic_irqs, NULL);
  
-       writel_relaxed(1, base + GIC_DIST_CTRL);
+       writel_relaxed(GICD_ENABLE, base + GIC_DIST_CTRL);
  }
  
  static void gic_cpu_init(struct gic_chip_data *gic)
  
        gic_cpu_config(dist_base, NULL);
  
-       writel_relaxed(0xf0, base + GIC_CPU_PRIMASK);
-       writel_relaxed(1, base + GIC_CPU_CTRL);
+       writel_relaxed(GICC_INT_PRI_THRESHOLD, base + GIC_CPU_PRIMASK);
+       gic_cpu_if_up();
  }
  
  void gic_cpu_if_down(void)
  {
        void __iomem *cpu_base = gic_data_cpu_base(&gic_data[0]);
-       writel_relaxed(0, cpu_base + GIC_CPU_CTRL);
+       u32 val = 0;
+       val = readl(cpu_base + GIC_CPU_CTRL);
+       val &= ~GICC_ENABLE;
+       writel_relaxed(val, cpu_base + GIC_CPU_CTRL);
  }
  
  #ifdef CONFIG_CPU_PM
@@@ -467,14 -485,14 +485,14 @@@ static void gic_dist_restore(unsigned i
        if (!dist_base)
                return;
  
-       writel_relaxed(0, dist_base + GIC_DIST_CTRL);
+       writel_relaxed(GICD_DISABLE, dist_base + GIC_DIST_CTRL);
  
        for (i = 0; i < DIV_ROUND_UP(gic_irqs, 16); i++)
                writel_relaxed(gic_data[gic_nr].saved_spi_conf[i],
                        dist_base + GIC_DIST_CONFIG + i * 4);
  
        for (i = 0; i < DIV_ROUND_UP(gic_irqs, 4); i++)
-               writel_relaxed(0xa0a0a0a0,
+               writel_relaxed(GICD_INT_DEF_PRI_X4,
                        dist_base + GIC_DIST_PRI + i * 4);
  
        for (i = 0; i < DIV_ROUND_UP(gic_irqs, 4); i++)
                writel_relaxed(gic_data[gic_nr].saved_spi_enable[i],
                        dist_base + GIC_DIST_ENABLE_SET + i * 4);
  
-       writel_relaxed(1, dist_base + GIC_DIST_CTRL);
+       writel_relaxed(GICD_ENABLE, dist_base + GIC_DIST_CTRL);
  }
  
  static void gic_cpu_save(unsigned int gic_nr)
@@@ -539,10 -557,11 +557,11 @@@ static void gic_cpu_restore(unsigned in
                writel_relaxed(ptr[i], dist_base + GIC_DIST_CONFIG + i * 4);
  
        for (i = 0; i < DIV_ROUND_UP(32, 4); i++)
-               writel_relaxed(0xa0a0a0a0, dist_base + GIC_DIST_PRI + i * 4);
+               writel_relaxed(GICD_INT_DEF_PRI_X4,
+                                       dist_base + GIC_DIST_PRI + i * 4);
  
-       writel_relaxed(0xf0, cpu_base + GIC_CPU_PRIMASK);
-       writel_relaxed(1, cpu_base + GIC_CPU_CTRL);
+       writel_relaxed(GICC_INT_PRI_THRESHOLD, cpu_base + GIC_CPU_PRIMASK);
+       gic_cpu_if_up();
  }
  
  static int gic_notifier(struct notifier_block *self, unsigned long cmd,       void *v)
@@@ -867,7 -886,7 +886,7 @@@ static int gic_routable_irq_domain_xlat
        return 0;
  }
  
 -const struct irq_domain_ops gic_default_routable_irq_domain_ops = {
 +static const struct irq_domain_ops gic_default_routable_irq_domain_ops = {
        .map = gic_routable_irq_domain_map,
        .unmap = gic_routable_irq_domain_unmap,
        .xlate = gic_routable_irq_domain_xlate,
index f3814e7,0000000..28718d3
mode 100644,000000..100644
--- /dev/null
@@@ -1,403 -1,0 +1,402 @@@
-                       irqnr = irq_find_mapping(domain, irqnr);
-                       handle_IRQ(irqnr, regs);
 +/*
 + * linux/arch/arm/mach-omap2/irq.c
 + *
 + * Interrupt handler for OMAP2 boards.
 + *
 + * Copyright (C) 2005 Nokia Corporation
 + * Author: Paul Mundt <paul.mundt@nokia.com>
 + *
 + * This file is subject to the terms and conditions of the GNU General Public
 + * License. See the file "COPYING" in the main directory of this archive
 + * for more details.
 + */
 +#include <linux/kernel.h>
 +#include <linux/module.h>
 +#include <linux/init.h>
 +#include <linux/interrupt.h>
 +#include <linux/io.h>
 +
 +#include <asm/exception.h>
 +#include <linux/irqdomain.h>
 +#include <linux/of.h>
 +#include <linux/of_address.h>
 +#include <linux/of_irq.h>
 +
 +#include "irqchip.h"
 +
 +/* Define these here for now until we drop all board-files */
 +#define OMAP24XX_IC_BASE      0x480fe000
 +#define OMAP34XX_IC_BASE      0x48200000
 +
 +/* selected INTC register offsets */
 +
 +#define INTC_REVISION         0x0000
 +#define INTC_SYSCONFIG                0x0010
 +#define INTC_SYSSTATUS                0x0014
 +#define INTC_SIR              0x0040
 +#define INTC_CONTROL          0x0048
 +#define INTC_PROTECTION               0x004C
 +#define INTC_IDLE             0x0050
 +#define INTC_THRESHOLD                0x0068
 +#define INTC_MIR0             0x0084
 +#define INTC_MIR_CLEAR0               0x0088
 +#define INTC_MIR_SET0         0x008c
 +#define INTC_PENDING_IRQ0     0x0098
 +#define INTC_PENDING_IRQ1     0x00b8
 +#define INTC_PENDING_IRQ2     0x00d8
 +#define INTC_PENDING_IRQ3     0x00f8
 +#define INTC_ILR0             0x0100
 +
 +#define ACTIVEIRQ_MASK                0x7f    /* omap2/3 active interrupt bits */
 +#define INTCPS_NR_ILR_REGS    128
 +#define INTCPS_NR_MIR_REGS    4
 +
 +#define INTC_IDLE_FUNCIDLE    (1 << 0)
 +#define INTC_IDLE_TURBO               (1 << 1)
 +
 +#define INTC_PROTECTION_ENABLE        (1 << 0)
 +
 +struct omap_intc_regs {
 +      u32 sysconfig;
 +      u32 protection;
 +      u32 idle;
 +      u32 threshold;
 +      u32 ilr[INTCPS_NR_ILR_REGS];
 +      u32 mir[INTCPS_NR_MIR_REGS];
 +};
 +static struct omap_intc_regs intc_context;
 +
 +static struct irq_domain *domain;
 +static void __iomem *omap_irq_base;
 +static int omap_nr_pending = 3;
 +static int omap_nr_irqs = 96;
 +
 +static void intc_writel(u32 reg, u32 val)
 +{
 +      writel_relaxed(val, omap_irq_base + reg);
 +}
 +
 +static u32 intc_readl(u32 reg)
 +{
 +      return readl_relaxed(omap_irq_base + reg);
 +}
 +
 +void omap_intc_save_context(void)
 +{
 +      int i;
 +
 +      intc_context.sysconfig =
 +              intc_readl(INTC_SYSCONFIG);
 +      intc_context.protection =
 +              intc_readl(INTC_PROTECTION);
 +      intc_context.idle =
 +              intc_readl(INTC_IDLE);
 +      intc_context.threshold =
 +              intc_readl(INTC_THRESHOLD);
 +
 +      for (i = 0; i < omap_nr_irqs; i++)
 +              intc_context.ilr[i] =
 +                      intc_readl((INTC_ILR0 + 0x4 * i));
 +      for (i = 0; i < INTCPS_NR_MIR_REGS; i++)
 +              intc_context.mir[i] =
 +                      intc_readl(INTC_MIR0 + (0x20 * i));
 +}
 +
 +void omap_intc_restore_context(void)
 +{
 +      int i;
 +
 +      intc_writel(INTC_SYSCONFIG, intc_context.sysconfig);
 +      intc_writel(INTC_PROTECTION, intc_context.protection);
 +      intc_writel(INTC_IDLE, intc_context.idle);
 +      intc_writel(INTC_THRESHOLD, intc_context.threshold);
 +
 +      for (i = 0; i < omap_nr_irqs; i++)
 +              intc_writel(INTC_ILR0 + 0x4 * i,
 +                              intc_context.ilr[i]);
 +
 +      for (i = 0; i < INTCPS_NR_MIR_REGS; i++)
 +              intc_writel(INTC_MIR0 + 0x20 * i,
 +                      intc_context.mir[i]);
 +      /* MIRs are saved and restore with other PRCM registers */
 +}
 +
 +void omap3_intc_prepare_idle(void)
 +{
 +      /*
 +       * Disable autoidle as it can stall interrupt controller,
 +       * cf. errata ID i540 for 3430 (all revisions up to 3.1.x)
 +       */
 +      intc_writel(INTC_SYSCONFIG, 0);
 +      intc_writel(INTC_IDLE, INTC_IDLE_TURBO);
 +}
 +
 +void omap3_intc_resume_idle(void)
 +{
 +      /* Re-enable autoidle */
 +      intc_writel(INTC_SYSCONFIG, 1);
 +      intc_writel(INTC_IDLE, 0);
 +}
 +
 +/* XXX: FIQ and additional INTC support (only MPU at the moment) */
 +static void omap_ack_irq(struct irq_data *d)
 +{
 +      intc_writel(INTC_CONTROL, 0x1);
 +}
 +
 +static void omap_mask_ack_irq(struct irq_data *d)
 +{
 +      irq_gc_mask_disable_reg(d);
 +      omap_ack_irq(d);
 +}
 +
 +static void __init omap_irq_soft_reset(void)
 +{
 +      unsigned long tmp;
 +
 +      tmp = intc_readl(INTC_REVISION) & 0xff;
 +
 +      pr_info("IRQ: Found an INTC at 0x%p (revision %ld.%ld) with %d interrupts\n",
 +              omap_irq_base, tmp >> 4, tmp & 0xf, omap_nr_irqs);
 +
 +      tmp = intc_readl(INTC_SYSCONFIG);
 +      tmp |= 1 << 1;  /* soft reset */
 +      intc_writel(INTC_SYSCONFIG, tmp);
 +
 +      while (!(intc_readl(INTC_SYSSTATUS) & 0x1))
 +              /* Wait for reset to complete */;
 +
 +      /* Enable autoidle */
 +      intc_writel(INTC_SYSCONFIG, 1 << 0);
 +}
 +
 +int omap_irq_pending(void)
 +{
 +      int i;
 +
 +      for (i = 0; i < omap_nr_pending; i++)
 +              if (intc_readl(INTC_PENDING_IRQ0 + (0x20 * i)))
 +                      return 1;
 +      return 0;
 +}
 +
 +void omap3_intc_suspend(void)
 +{
 +      /* A pending interrupt would prevent OMAP from entering suspend */
 +      omap_ack_irq(NULL);
 +}
 +
 +static int __init omap_alloc_gc_of(struct irq_domain *d, void __iomem *base)
 +{
 +      int ret;
 +      int i;
 +
 +      ret = irq_alloc_domain_generic_chips(d, 32, 1, "INTC",
 +                      handle_level_irq, IRQ_NOREQUEST | IRQ_NOPROBE,
 +                      IRQ_LEVEL, 0);
 +      if (ret) {
 +              pr_warn("Failed to allocate irq chips\n");
 +              return ret;
 +      }
 +
 +      for (i = 0; i < omap_nr_pending; i++) {
 +              struct irq_chip_generic *gc;
 +              struct irq_chip_type *ct;
 +
 +              gc = irq_get_domain_generic_chip(d, 32 * i);
 +              gc->reg_base = base;
 +              ct = gc->chip_types;
 +
 +              ct->type = IRQ_TYPE_LEVEL_MASK;
 +              ct->handler = handle_level_irq;
 +
 +              ct->chip.irq_ack = omap_mask_ack_irq;
 +              ct->chip.irq_mask = irq_gc_mask_disable_reg;
 +              ct->chip.irq_unmask = irq_gc_unmask_enable_reg;
 +
 +              ct->chip.flags |= IRQCHIP_SKIP_SET_WAKE;
 +
 +              ct->regs.enable = INTC_MIR_CLEAR0 + 32 * i;
 +              ct->regs.disable = INTC_MIR_SET0 + 32 * i;
 +      }
 +
 +      return 0;
 +}
 +
 +static void __init omap_alloc_gc_legacy(void __iomem *base,
 +              unsigned int irq_start, unsigned int num)
 +{
 +      struct irq_chip_generic *gc;
 +      struct irq_chip_type *ct;
 +
 +      gc = irq_alloc_generic_chip("INTC", 1, irq_start, base,
 +                      handle_level_irq);
 +      ct = gc->chip_types;
 +      ct->chip.irq_ack = omap_mask_ack_irq;
 +      ct->chip.irq_mask = irq_gc_mask_disable_reg;
 +      ct->chip.irq_unmask = irq_gc_unmask_enable_reg;
 +      ct->chip.flags |= IRQCHIP_SKIP_SET_WAKE;
 +
 +      ct->regs.enable = INTC_MIR_CLEAR0;
 +      ct->regs.disable = INTC_MIR_SET0;
 +      irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE,
 +                      IRQ_NOREQUEST | IRQ_NOPROBE, 0);
 +}
 +
 +static int __init omap_init_irq_of(struct device_node *node)
 +{
 +      int ret;
 +
 +      omap_irq_base = of_iomap(node, 0);
 +      if (WARN_ON(!omap_irq_base))
 +              return -ENOMEM;
 +
 +      domain = irq_domain_add_linear(node, omap_nr_irqs,
 +                      &irq_generic_chip_ops, NULL);
 +
 +      omap_irq_soft_reset();
 +
 +      ret = omap_alloc_gc_of(domain, omap_irq_base);
 +      if (ret < 0)
 +              irq_domain_remove(domain);
 +
 +      return ret;
 +}
 +
 +static int __init omap_init_irq_legacy(u32 base)
 +{
 +      int j, irq_base;
 +
 +      omap_irq_base = ioremap(base, SZ_4K);
 +      if (WARN_ON(!omap_irq_base))
 +              return -ENOMEM;
 +
 +      irq_base = irq_alloc_descs(-1, 0, omap_nr_irqs, 0);
 +      if (irq_base < 0) {
 +              pr_warn("Couldn't allocate IRQ numbers\n");
 +              irq_base = 0;
 +      }
 +
 +      domain = irq_domain_add_legacy(NULL, omap_nr_irqs, irq_base, 0,
 +                      &irq_domain_simple_ops, NULL);
 +
 +      omap_irq_soft_reset();
 +
 +      for (j = 0; j < omap_nr_irqs; j += 32)
 +              omap_alloc_gc_legacy(omap_irq_base + j, j + irq_base, 32);
 +
 +      return 0;
 +}
 +
 +static void __init omap_irq_enable_protection(void)
 +{
 +      u32 reg;
 +
 +      reg = intc_readl(INTC_PROTECTION);
 +      reg |= INTC_PROTECTION_ENABLE;
 +      intc_writel(INTC_PROTECTION, reg);
 +}
 +
 +static int __init omap_init_irq(u32 base, struct device_node *node)
 +{
 +      int ret;
 +
 +      if (node)
 +              ret = omap_init_irq_of(node);
 +      else
 +              ret = omap_init_irq_legacy(base);
 +
 +      if (ret == 0)
 +              omap_irq_enable_protection();
 +
 +      return ret;
 +}
 +
 +static asmlinkage void __exception_irq_entry
 +omap_intc_handle_irq(struct pt_regs *regs)
 +{
 +      u32 irqnr = 0;
 +      int handled_irq = 0;
 +      int i;
 +
 +      do {
 +              for (i = 0; i < omap_nr_pending; i++) {
 +                      irqnr = intc_readl(INTC_PENDING_IRQ0 + (0x20 * i));
 +                      if (irqnr)
 +                              goto out;
 +              }
 +
 +out:
 +              if (!irqnr)
 +                      break;
 +
 +              irqnr = intc_readl(INTC_SIR);
 +              irqnr &= ACTIVEIRQ_MASK;
 +
 +              if (irqnr) {
++                      handle_domain_irq(domain, irqnr, regs);
 +                      handled_irq = 1;
 +              }
 +      } while (irqnr);
 +
 +      /*
 +       * If an irq is masked or deasserted while active, we will
 +       * keep ending up here with no irq handled. So remove it from
 +       * the INTC with an ack.
 +       */
 +      if (!handled_irq)
 +              omap_ack_irq(NULL);
 +}
 +
 +void __init omap2_init_irq(void)
 +{
 +      omap_nr_irqs = 96;
 +      omap_nr_pending = 3;
 +      omap_init_irq(OMAP24XX_IC_BASE, NULL);
 +      set_handle_irq(omap_intc_handle_irq);
 +}
 +
 +void __init omap3_init_irq(void)
 +{
 +      omap_nr_irqs = 96;
 +      omap_nr_pending = 3;
 +      omap_init_irq(OMAP34XX_IC_BASE, NULL);
 +      set_handle_irq(omap_intc_handle_irq);
 +}
 +
 +void __init ti81xx_init_irq(void)
 +{
 +      omap_nr_irqs = 96;
 +      omap_nr_pending = 4;
 +      omap_init_irq(OMAP34XX_IC_BASE, NULL);
 +      set_handle_irq(omap_intc_handle_irq);
 +}
 +
 +static int __init intc_of_init(struct device_node *node,
 +                           struct device_node *parent)
 +{
 +      int ret;
 +
 +      omap_nr_pending = 3;
 +      omap_nr_irqs = 96;
 +
 +      if (WARN_ON(!node))
 +              return -ENODEV;
 +
 +      if (of_device_is_compatible(node, "ti,am33xx-intc")) {
 +              omap_nr_irqs = 128;
 +              omap_nr_pending = 4;
 +      }
 +
 +      ret = omap_init_irq(-1, of_node_get(node));
 +      if (ret < 0)
 +              return ret;
 +
 +      set_handle_irq(omap_intc_handle_irq);
 +
 +      return 0;
 +}
 +
 +IRQCHIP_DECLARE(omap2_intc, "ti,omap2-intc", intc_of_init);
 +IRQCHIP_DECLARE(omap3_intc, "ti,omap3-intc", intc_of_init);
 +IRQCHIP_DECLARE(am33xx_intc, "ti,am33xx-intc", intc_of_init);