]> Git Repo - J-linux.git/commitdiff
Merge tag 'irq-core-2023-02-20' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <[email protected]>
Tue, 21 Feb 2023 18:03:48 +0000 (10:03 -0800)
committerLinus Torvalds <[email protected]>
Tue, 21 Feb 2023 18:03:48 +0000 (10:03 -0800)
Pull irq updates from Thomas Gleixner:
 "Updates for the interrupt subsystem:

  Core:

   - Move the interrupt affinity spreading mechanism into lib/group_cpus
     so it can be used for similar spreading requirements, e.g. in the
     block multi-queue code

     This also contains a first usecase in the block multi-queue code
     which Jens asked to take along with the librarization

   - Improve irqdomain locking to close a number race conditions which
     can be observed with massive parallel device driver probing

   - Enforce and document the semantics of disable_irq() which cannot be
     invoked safely from non-sleepable context

   - Move the IPI multiplexing code from the Apple AIC driver into the
     core, so it can be reused by RISCV

  Drivers:

   - Plug OF node refcounting leaks in various drivers

   - Correctly mark level triggered interrupts in the Broadcom L2
     drivers

   - The usual small fixes and improvements

   - No new drivers for the record!"

* tag 'irq-core-2023-02-20' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (42 commits)
  irqchip/irq-bcm7120-l2: Set IRQ_LEVEL for level triggered interrupts
  irqchip/irq-brcmstb-l2: Set IRQ_LEVEL for level triggered interrupts
  irqdomain: Switch to per-domain locking
  irqchip/mvebu-odmi: Use irq_domain_create_hierarchy()
  irqchip/loongson-pch-msi: Use irq_domain_create_hierarchy()
  irqchip/gic-v3-mbi: Use irq_domain_create_hierarchy()
  irqchip/gic-v3-its: Use irq_domain_create_hierarchy()
  irqchip/gic-v2m: Use irq_domain_create_hierarchy()
  irqchip/alpine-msi: Use irq_domain_add_hierarchy()
  x86/uv: Use irq_domain_create_hierarchy()
  x86/ioapic: Use irq_domain_create_hierarchy()
  irqdomain: Clean up irq_domain_push/pop_irq()
  irqdomain: Drop leftover brackets
  irqdomain: Drop dead domain-name assignment
  irqdomain: Drop revmap mutex
  irqdomain: Fix domain registration race
  irqdomain: Fix mapping-creation race
  irqdomain: Refactor __irq_domain_alloc_irqs()
  irqdomain: Look for existing mapping only once
  irqdomain: Drop bogus fwspec-mapping error handling
  ...

1  2 
MAINTAINERS
drivers/irqchip/Kconfig
kernel/irq/irqdomain.c

diff --combined MAINTAINERS
index 82f6dfe8c2150cd30a5397bbbfe17160b71e8b0f,cb47488401952b2bc9f587601f59f655fe39d770..7ae5f8b33c8c80729037475aa6d2f0f00e59b261
@@@ -383,7 -383,7 +383,7 @@@ ACPI COMPONENT ARCHITECTURE (ACPICA
  M:    Robert Moore <[email protected]>
  M:    "Rafael J. Wysocki" <[email protected]>
  L:    [email protected]
 -L:    devel@acpica.org
 +L:    [email protected].org
  S:    Supported
  W:    https://acpica.org/
  W:    https://github.com/acpica/acpica/
@@@ -1097,12 -1097,14 +1097,12 @@@ S:   Maintaine
  F:    drivers/dma/ptdma/
  
  AMD SEATTLE DEVICE TREE SUPPORT
 -M:    Brijesh Singh <[email protected]>
  M:    Suravee Suthikulpanit <[email protected]>
  M:    Tom Lendacky <[email protected]>
  S:    Supported
  F:    arch/arm64/boot/dts/amd/
  
  AMD XGBE DRIVER
 -M:    Tom Lendacky <[email protected]>
  M:    "Shyam Sundar S K" <[email protected]>
  L:    [email protected]
  S:    Supported
@@@ -1851,6 -1853,21 +1851,6 @@@ F:     include/dt-bindings/reset/actions,
  F:    include/linux/soc/actions/
  N:    owl
  
 -ARM/ADS SPHERE MACHINE SUPPORT
 -M:    Lennert Buytenhek <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -
 -ARM/AFEB9260 MACHINE SUPPORT
 -M:    Sergey Lapin <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -
 -ARM/AJECO 1ARM MACHINE SUPPORT
 -M:    Lennert Buytenhek <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/Allwinner SoC Clock Support
  M:    Emilio López <[email protected]>
  S:    Maintained
@@@ -1871,7 -1888,7 +1871,7 @@@ F:      drivers/pinctrl/sunxi
  F:    drivers/soc/sunxi/
  N:    allwinner
  N:    sun[x456789]i
 -N:    sun50i
 +N:    sun[25]0i
  
  ARM/Amlogic Meson SoC CLOCK FRAMEWORK
  M:    Neil Armstrong <[email protected]>
@@@ -2041,6 -2058,11 +2041,6 @@@ F:     arch/arm/boot/dts/ecx-*.dts
  F:    arch/arm/boot/dts/highbank.dts
  F:    arch/arm/mach-highbank/
  
 -ARM/CAVIUM NETWORKS CNS3XXX MACHINE SUPPORT
 -M:    Krzysztof Halasa <[email protected]>
 -S:    Maintained
 -F:    arch/arm/mach-cns3xxx/
 -
  ARM/CAVIUM THUNDER NETWORK DRIVER
  M:    Sunil Goutham <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
@@@ -2069,8 -2091,8 +2069,8 @@@ M:      Hartley Sweeten <hsweeten@visionengr
  M:    Alexander Sverdlin <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 +F:    arch/arm/boot/compressed/misc-ep93xx.h
  F:    arch/arm/mach-ep93xx/
 -F:    arch/arm/mach-ep93xx/include/mach/
  
  ARM/CLKDEV SUPPORT
  M:    Russell King <[email protected]>
@@@ -2086,6 -2108,11 +2086,6 @@@ S:     Maintaine
  F:    arch/arm/boot/dts/cx92755*
  N:    digicolor
  
 -ARM/CONTEC MICRO9 MACHINE SUPPORT
 -M:    Hubert Feurstein <[email protected]>
 -S:    Maintained
 -F:    arch/arm/mach-ep93xx/micro9.c
 -
  ARM/CORESIGHT FRAMEWORK AND DRIVERS
  M:    Mathieu Poirier <[email protected]>
  M:    Suzuki K Poulose <[email protected]>
@@@ -2112,6 -2139,10 +2112,6 @@@ F:     tools/perf/arch/arm/util/pmu.
  F:    tools/perf/util/cs-etm-decoder/*
  F:    tools/perf/util/cs-etm.*
  
 -ARM/CORGI MACHINE SUPPORT
 -M:    Richard Purdie <[email protected]>
 -S:    Maintained
 -
  ARM/CORTINA SYSTEMS GEMINI ARM ARCHITECTURE
  M:    Hans Ulli Kroll <[email protected]>
  M:    Linus Walleij <[email protected]>
@@@ -2151,6 -2182,12 +2151,6 @@@ F:     include/dt-bindings/bus/moxtet.
  F:    include/linux/armada-37xx-rwtm-mailbox.h
  F:    include/linux/moxtet.h
  
 -ARM/EZX SMARTPHONES (A780, A910, A1200, E680, ROKR E2 and ROKR E6)
 -M:    Robert Jarzmik <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/mach-pxa/ezx.c
 -
  ARM/FARADAY FA526 PORT
  M:    Hans Ulli Kroll <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
@@@ -2176,9 -2213,6 +2176,9 @@@ L:      [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux.git
  X:    drivers/media/i2c/
 +F:    arch/arm64/boot/dts/freescale/
 +X:    arch/arm64/boot/dts/freescale/fsl-*
 +X:    arch/arm64/boot/dts/freescale/qoriq-*
  N:    imx
  N:    mxs
  
@@@ -2203,11 -2237,25 +2203,11 @@@ T:   git git://git.kernel.org/pub/scm/lin
  F:    arch/arm/boot/dts/vf*
  F:    arch/arm/mach-imx/*vf610*
  
 -ARM/GLOMATION GESBC9312SX MACHINE SUPPORT
 -M:    Lennert Buytenhek <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/GUMSTIX MACHINE SUPPORT
  M:    Steve Sakoman <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
  
 -ARM/H4700 (HP IPAQ HX4700) MACHINE SUPPORT
 -M:    Philipp Zabel <[email protected]>
 -M:    Paul Parsons <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/mach-pxa/hx4700.c
 -F:    arch/arm/mach-pxa/include/mach/hx4700.h
 -F:    sound/soc/pxa/hx4700.c
 -
  ARM/HISILICON SOC SUPPORT
  M:    Wei Xu <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/boot/dts/omap3-igep*
  
 -ARM/INCOME PXA270 SUPPORT
 -M:    Marek Vasut <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/mach-pxa/colibri-pxa270-income.c
 -
 -ARM/INTEL IOP32X ARM ARCHITECTURE
 -M:    Lennert Buytenhek <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -
 -ARM/INTEL IQ81342EX MACHINE SUPPORT
 -M:    Lennert Buytenhek <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -
 -ARM/INTEL IXDP2850 MACHINE SUPPORT
 -M:    Lennert Buytenhek <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/INTEL IXP4XX ARM ARCHITECTURE
  M:    Linus Walleij <[email protected]>
  M:    Imre Kaloz <[email protected]>
@@@ -2282,12 -2351,22 +2282,12 @@@ M:   Lennert Buytenhek <kernel@wantstofly
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
  
 -ARM/IP FABRICS DOUBLE ESPRESSO MACHINE SUPPORT
 -M:    Lennert Buytenhek <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/LG1K ARCHITECTURE
  M:    Chanho Min <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm64/boot/dts/lg/
  
 -ARM/LOGICPD PXA270 MACHINE SUPPORT
 -M:    Lennert Buytenhek <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/LPC18XX ARCHITECTURE
  M:    Vladimir Zapolskiy <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
@@@ -2314,6 -2393,10 +2314,6 @@@ F:     drivers/usb/host/ohci-nxp.
  F:    drivers/watchdog/pnx4008_wdt.c
  N:    lpc32xx
  
 -ARM/MAGICIAN MACHINE SUPPORT
 -M:    Philipp Zabel <[email protected]>
 -S:    Maintained
 -
  ARM/Marvell Dove/MV78xx0/Orion SOC support
  M:    Andrew Lunn <[email protected]>
  M:    Sebastian Hesselbarth <[email protected]>
@@@ -2368,14 -2451,11 +2368,14 @@@ F:   drivers/rtc/rtc-mt7622.
  
  ARM/Mediatek SoC support
  M:    Matthias Brugger <[email protected]>
 +R:    AngeloGioacchino Del Regno <[email protected]>
 +L:    [email protected]
  L:    [email protected] (moderated for non-subscribers)
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
  W:    https://mtk.wiki.kernel.org/
 -C:    irc://chat.freenode.net/linux-mediatek
 +C:    irc://irc.libera.chat/linux-mediatek
 +F:    arch/arm/boot/dts/mt2*
  F:    arch/arm/boot/dts/mt6*
  F:    arch/arm/boot/dts/mt7*
  F:    arch/arm/boot/dts/mt8*
@@@ -2383,7 -2463,7 +2383,7 @@@ F:      arch/arm/mach-mediatek
  F:    arch/arm64/boot/dts/mediatek/
  F:    drivers/soc/mediatek/
  N:    mtk
 -N:    mt[678]
 +N:    mt[2678]
  K:    mediatek
  
  ARM/Mediatek USB3 PHY DRIVER
@@@ -2445,6 -2525,12 +2445,6 @@@ F:     arch/arm/boot/dts/milbeaut
  F:    arch/arm/mach-milbeaut/
  N:    milbeaut
  
 -ARM/MIOA701 MACHINE SUPPORT
 -M:    Robert Jarzmik <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/mach-pxa/mioa701.c
 -
  ARM/MStar/Sigmastar Armv7 SoC support
  M:    Daniel Palmer <[email protected]>
  M:    Romain Perier <[email protected]>
@@@ -2465,6 -2551,10 +2465,6 @@@ F:     drivers/watchdog/msc313e_wdt.
  F:    include/dt-bindings/clock/mstar-*
  F:    include/dt-bindings/gpio/msc313-gpio.h
  
 -ARM/NEC MOBILEPRO 900/c MACHINE SUPPORT
 -M:    Michael Petchkovsky <[email protected]>
 -S:    Maintained
 -
  ARM/NOMADIK/Ux500 ARCHITECTURES
  M:    Linus Walleij <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
@@@ -2520,7 -2610,6 +2520,7 @@@ S:      Maintaine
  W:    https://github.com/neuschaefer/wpcm450/wiki
  F:    Documentation/devicetree/bindings/*/*wpcm*
  F:    arch/arm/boot/dts/nuvoton-wpcm450*
 +F:    arch/arm/configs/wpcm450_defconfig
  F:    arch/arm/mach-npcm/wpcm450.c
  F:    drivers/*/*/*wpcm*
  F:    drivers/*/*wpcm*
  S:    Maintained
  F:    arch/arm64/boot/dts/freescale/s32g*.dts*
  
 -ARM/OPENMOKO NEO FREERUNNER (GTA02) MACHINE SUPPORT
 -L:    [email protected] (subscribers-only)
 -S:    Orphan
 -W:    http://wiki.openmoko.org/wiki/Neo_FreeRunner
 -F:    arch/arm/mach-s3c/gta02.h
 -F:    arch/arm/mach-s3c/mach-gta02.c
 -
  ARM/Orion SoC/Technologic Systems TS-78xx platform support
  M:    Alexander Clouter <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
@@@ -2551,6 -2647,43 +2551,6 @@@ F:     arch/arm/mach-oxnas
  F:    drivers/power/reset/oxnas-restart.c
  N:    oxnas
  
 -ARM/PALM TREO SUPPORT
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Orphan
 -F:    arch/arm/mach-pxa/palmtreo.*
 -
 -ARM/PALMTX,PALMT5,PALMLD,PALMTE2,PALMTC SUPPORT
 -M:    Marek Vasut <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -W:    http://hackndev.com
 -F:    arch/arm/mach-pxa/include/mach/palmld.h
 -F:    arch/arm/mach-pxa/include/mach/palmtc.h
 -F:    arch/arm/mach-pxa/include/mach/palmtx.h
 -F:    arch/arm/mach-pxa/palmld.c
 -F:    arch/arm/mach-pxa/palmt5.*
 -F:    arch/arm/mach-pxa/palmtc.c
 -F:    arch/arm/mach-pxa/palmte2.*
 -F:    arch/arm/mach-pxa/palmtx.c
 -
 -ARM/PALMZ72 SUPPORT
 -M:    Sergey Lapin <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -W:    http://hackndev.com
 -F:    arch/arm/mach-pxa/palmz72.*
 -
 -ARM/PLEB SUPPORT
 -M:    Peter Chubb <[email protected]>
 -S:    Maintained
 -W:    http://www.disy.cse.unsw.edu.au/Hardware/PLEB
 -
 -ARM/PT DIGITAL BOARD PORT
 -M:    Stefan Eletzhofer <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -W:    http://www.armlinux.org.uk/
 -
  ARM/QUALCOMM SUPPORT
  M:    Andy Gross <[email protected]>
  M:    Bjorn Andersson <[email protected]>
@@@ -2594,6 -2727,11 +2594,6 @@@ F:     include/dt-bindings/*/qcom
  F:    include/linux/*/qcom*
  F:    include/linux/soc/qcom/
  
 -ARM/RADISYS ENP2611 MACHINE SUPPORT
 -M:    Lennert Buytenhek <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/RDA MICRO ARCHITECTURE
  M:    Manivannan Sadhasivam <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
@@@ -2669,7 -2807,7 +2669,7 @@@ F:      Documentation/devicetree/bindings/i2
  F:    Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.yaml
  F:    Documentation/devicetree/bindings/spi/spi-rockchip.yaml
  F:    arch/arm/boot/dts/rk3*
 -F:    arch/arm/boot/dts/rv1108*
 +F:    arch/arm/boot/dts/rv11*
  F:    arch/arm/mach-rockchip/
  F:    drivers/*/*/*rockchip*
  F:    drivers/*/*rockchip*
@@@ -2714,6 -2852,7 +2714,6 @@@ F:      include/linux/platform_data/*s3c
  F:    include/linux/serial_s3c.h
  F:    include/linux/soc/samsung/
  N:    exynos
 -N:    s3c2410
  N:    s3c64xx
  N:    s5pv210
  
@@@ -2871,7 -3010,7 +2871,7 @@@ M:      [email protected]
  L:    [email protected] (moderated for non-subscribers)
  L:    [email protected]
  S:    Maintained
 -F:    arch/arm64/boot/dts/tesla*
 +F:    arch/arm64/boot/dts/tesla/
  
  ARM/TETON BGA MACHINE SUPPORT
  M:    "Mark F. Brown" <[email protected]>
@@@ -2924,6 -3063,16 +2924,6 @@@ F:     arch/arm64/boot/dts/ti/Makefil
  F:    arch/arm64/boot/dts/ti/k3-*
  F:    include/dt-bindings/pinctrl/k3.h
  
 -ARM/THECUS N2100 MACHINE SUPPORT
 -M:    Lennert Buytenhek <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -
 -ARM/TOSA MACHINE SUPPORT
 -M:    Dmitry Eremin-Solenikov <[email protected]>
 -M:    Dirk Opfer <[email protected]>
 -S:    Maintained
 -
  ARM/TOSHIBA VISCONTI ARCHITECTURE
  M:    Nobuhiro Iwamatsu <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
@@@ -2980,7 -3129,7 +2980,7 @@@ S:      Maintaine
  F:    */*/*/vexpress*
  F:    */*/vexpress*
  F:    arch/arm/boot/dts/vexpress*
 -F:    arch/arm/mach-vexpress/
 +F:    arch/arm/mach-versatile/
  F:    arch/arm64/boot/dts/arm/
  F:    drivers/clk/versatile/clk-vexpress-osc.c
  F:    drivers/clocksource/timer-versatile.c
@@@ -2993,6 -3142,13 +2993,6 @@@ S:     Maintaine
  W:    http://www.armlinux.org.uk/
  F:    arch/arm/vfp/
  
 -ARM/VOIPAC PXA270 SUPPORT
 -M:    Marek Vasut <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/mach-pxa/include/mach/vpac270.h
 -F:    arch/arm/mach-pxa/vpac270.c
 -
  ARM/VT8500 ARM ARCHITECTURE
  L:    [email protected] (moderated for non-subscribers)
  S:    Orphan
@@@ -3010,6 -3166,13 +3010,6 @@@ F:     drivers/video/fbdev/vt8500lcdfb.
  F:    drivers/video/fbdev/wm8505fb*
  F:    drivers/video/fbdev/wmt_ge_rops.*
  
 -ARM/ZIPIT Z2 SUPPORT
 -M:    Marek Vasut <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -F:    arch/arm/mach-pxa/include/mach/z2.h
 -F:    arch/arm/mach-pxa/z2.c
 -
  ARM/ZYNQ ARCHITECTURE
  M:    Michal Simek <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
@@@ -3604,6 -3767,7 +3604,6 @@@ F:      net/bluetooth
  
  BONDING DRIVER
  M:    Jay Vosburgh <[email protected]>
 -M:    Veaceslav Falico <[email protected]>
  M:    Andy Gospodarek <[email protected]>
  L:    [email protected]
  S:    Supported
@@@ -6258,7 -6422,6 +6258,7 @@@ T:      git git://git.linbit.com/linux-drbd.
  T:    git git://git.linbit.com/drbd-8.4.git
  F:    Documentation/admin-guide/blockdev/
  F:    drivers/block/drbd/
 +F:    include/linux/drbd*
  F:    lib/lru_cache.c
  
  DRIVER COMPONENT FRAMEWORK
@@@ -6785,7 -6948,7 +6785,7 @@@ F:      drivers/gpu/drm/atmel-hlcdc
  DRM DRIVERS FOR BRIDGE CHIPS
  M:    Andrzej Hajda <[email protected]>
  M:    Neil Armstrong <[email protected]>
 -M:    Robert Foss <robert.foss@linaro.org>
 +M:    Robert Foss <rfoss@kernel.org>
  R:    Laurent Pinchart <[email protected]>
  R:    Jonas Karlman <[email protected]>
  R:    Jernej Skrabec <[email protected]>
@@@ -7453,6 -7616,7 +7453,6 @@@ S:      Maintaine
  F:    drivers/firmware/efi/test/
  
  EFI VARIABLE FILESYSTEM
 -M:    Matthew Garrett <[email protected]>
  M:    Jeremy Kerr <[email protected]>
  M:    Ard Biesheuvel <[email protected]>
  L:    [email protected]
@@@ -7581,7 -7745,6 +7581,7 @@@ R:      Jeffle Xu <[email protected]
  L:    [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
 +F:    Documentation/ABI/testing/sysfs-fs-erofs
  F:    Documentation/filesystems/erofs.rst
  F:    fs/erofs/
  F:    include/trace/events/erofs.h
@@@ -7732,11 -7895,7 +7732,11 @@@ F:    include/linux/extcon
  
  EXTRA BOOT CONFIG
  M:    Masami Hiramatsu <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +Q:    https://patchwork.kernel.org/project/linux-trace-kernel/list/
  S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
  F:    Documentation/admin-guide/bootconfig.rst
  F:    fs/proc/bootconfig.c
  F:    include/linux/bootconfig.h
@@@ -8037,7 -8196,7 +8037,7 @@@ F:      drivers/fpga/microchip-spi.
  FPU EMULATOR
  M:    Bill Metzenthen <[email protected]>
  S:    Maintained
 -W:    http://floatingpoint.sourceforge.net/emulator/index.html
 +W:    https://floatingpoint.billm.au/
  F:    arch/x86/math-emu/
  
  FRAMEBUFFER CORE
@@@ -8309,16 -8468,16 +8309,16 @@@ F:   fs/fscache
  F:    include/linux/fscache*.h
  
  FSCRYPT: FILE SYSTEM LEVEL ENCRYPTION SUPPORT
 +M:    Eric Biggers <[email protected]>
  M:    Theodore Y. Ts'o <[email protected]>
  M:    Jaegeuk Kim <[email protected]>
 -M:    Eric Biggers <[email protected]>
  L:    [email protected]
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-fscrypt/list/
 -T:    git git://git.kernel.org/pub/scm/fs/fscrypt/fscrypt.git
 +T:    git https://git.kernel.org/pub/scm/fs/fscrypt/linux.git
  F:    Documentation/filesystems/fscrypt.rst
  F:    fs/crypto/
 -F:    include/linux/fscrypt*.h
 +F:    include/linux/fscrypt.h
  F:    include/uapi/linux/fscrypt.h
  
  FSI SUBSYSTEM
@@@ -8361,10 -8520,10 +8361,10 @@@ F:   include/linux/fsnotify*.
  FSVERITY: READ-ONLY FILE-BASED AUTHENTICITY PROTECTION
  M:    Eric Biggers <[email protected]>
  M:    Theodore Y. Ts'o <[email protected]>
 -L:    [email protected]
 +L:    [email protected]
  S:    Supported
 -Q:    https://patchwork.kernel.org/project/linux-fscrypt/list/
 -T:    git git://git.kernel.org/pub/scm/fs/fscrypt/fscrypt.git fsverity
 +Q:    https://patchwork.kernel.org/project/fsverity/list/
 +T:    git https://git.kernel.org/pub/scm/fs/fsverity/linux.git
  F:    Documentation/filesystems/fsverity.rst
  F:    fs/verity/
  F:    include/linux/fsverity.h
@@@ -8412,7 -8571,6 +8412,7 @@@ F:      kernel/trace/fgraph.
  F:    arch/*/*/*/*ftrace*
  F:    arch/*/*/*ftrace*
  F:    include/*/ftrace.h
 +F:    samples/ftrace
  
  FUNGIBLE ETHERNET DRIVERS
  M:    Dimitris Michailidis <[email protected]>
@@@ -9141,7 -9299,7 +9141,7 @@@ F:      net/dsa/tag_hellcreek.
  
  HISILICON DMA DRIVER
  M:    Zhou Wang <[email protected]>
 -M:    Jie Hai <haijie1@hisilicon.com>
 +M:    Jie Hai <haijie1@huawei.com>
  L:    [email protected]
  S:    Maintained
  F:    drivers/dma/hisi_dma.c
@@@ -9831,7 -9989,7 +9831,7 @@@ S:      Maintaine
  T:    git://git.kernel.org/pub/scm/linux/kernel/git/vfs/idmapping.git
  F:    Documentation/filesystems/idmappings.rst
  F:    tools/testing/selftests/mount_setattr/
 -F:    include/linux/mnt_idmapping.h
 +F:    include/linux/mnt_idmapping.*
  
  IDT VersaClock 5 CLOCK DRIVER
  M:    Luca Ceresoli <[email protected]>
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
  F:    kernel/irq/
+ F:    include/linux/group_cpus.h
+ F:    lib/group_cpus.c
  
  IRQCHIP DRIVERS
  M:    Thomas Gleixner <[email protected]>
@@@ -14443,6 -14603,7 +14445,6 @@@ F:   tools/testing/selftests/net/ipsec.
  
  NETWORKING [IPv4/IPv6]
  M:    "David S. Miller" <[email protected]>
 -M:    Hideaki YOSHIFUJI <[email protected]>
  M:    David Ahern <[email protected]>
  L:    [email protected]
  S:    Maintained
@@@ -14475,6 -14636,7 +14477,6 @@@ F:   net/netfilter/xt_SECMARK.
  F:    net/netlabel/
  
  NETWORKING [MPTCP]
 -M:    Mat Martineau <[email protected]>
  M:    Matthieu Baerts <[email protected]>
  L:    [email protected]
  L:    [email protected]
@@@ -15155,6 -15317,7 +15157,6 @@@ Q:   http://patchwork.kernel.org/project/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
  F:    arch/arm/configs/omap1_defconfig
  F:    arch/arm/mach-omap1/
 -F:    arch/arm/plat-omap/
  F:    drivers/i2c/busses/i2c-omap.c
  F:    include/linux/platform_data/ams-delta-fiq.h
  F:    include/linux/platform_data/i2c-omap.h
@@@ -15169,6 -15332,7 +15171,6 @@@ Q:   http://patchwork.kernel.org/project/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git
  F:    arch/arm/configs/omap2plus_defconfig
  F:    arch/arm/mach-omap2/
 -F:    arch/arm/plat-omap/
  F:    drivers/bus/ti-sysc.c
  F:    drivers/i2c/busses/i2c-omap.c
  F:    drivers/irqchip/irq-omap-intc.c
@@@ -15497,7 -15661,7 +15499,7 @@@ OPENRISC ARCHITECTUR
  M:    Jonas Bonn <[email protected]>
  M:    Stefan Kristiansson <[email protected]>
  M:    Stafford Horne <[email protected]>
 -L:    [email protected].org
 +L:    [email protected].org
  S:    Maintained
  W:    http://openrisc.io
  T:    git https://github.com/openrisc/linux.git
@@@ -15588,12 -15752,6 +15590,12 @@@ S: Maintaine
  W:    https://wireless.wiki.kernel.org/en/users/Drivers/p54
  F:    drivers/net/wireless/intersil/p54/
  
 +PACKET SOCKETS
 +M:    Willem de Bruijn <[email protected]>
 +S:    Maintained
 +F:    include/uapi/linux/if_packet.h
 +F:    net/packet/af_packet.c
 +
  PACKING
  M:    Vladimir Oltean <[email protected]>
  L:    [email protected]
@@@ -15953,7 -16111,7 +15955,7 @@@ F:   drivers/pci/controller/pci-v3-semi.
  
  PCI ENDPOINT SUBSYSTEM
  M:    Lorenzo Pieralisi <[email protected]>
 -R:    Krzysztof Wilczyński <[email protected]>
 +M:    Krzysztof Wilczyński <[email protected]>
  R:    Manivannan Sadhasivam <[email protected]>
  R:    Kishon Vijay Abraham I <[email protected]>
  L:    [email protected]
@@@ -15961,7 -16119,7 +15963,7 @@@ S:   Supporte
  Q:    https://patchwork.kernel.org/project/linux-pci/list/
  B:    https://bugzilla.kernel.org
  C:    irc://irc.oftc.net/linux-pci
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lpieralisi/pci.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git
  F:    Documentation/PCI/endpoint/*
  F:    Documentation/misc-devices/pci-endpoint-test.rst
  F:    drivers/misc/pci_endpoint_test.c
@@@ -15996,7 -16154,7 +15998,7 @@@ S:   Supporte
  Q:    https://patchwork.kernel.org/project/linux-pci/list/
  B:    https://bugzilla.kernel.org
  C:    irc://irc.oftc.net/linux-pci
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git
  F:    Documentation/driver-api/pci/p2pdma.rst
  F:    drivers/pci/p2pdma.c
  F:    include/linux/pci-p2pdma.h
@@@ -16018,14 -16176,14 +16020,14 @@@ F:        drivers/pci/controller/pci-xgene-msi
  
  PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS
  M:    Lorenzo Pieralisi <[email protected]>
 +M:    Krzysztof Wilczyński <[email protected]>
  R:    Rob Herring <[email protected]>
 -R:    Krzysztof Wilczyński <[email protected]>
  L:    [email protected]
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-pci/list/
  B:    https://bugzilla.kernel.org
  C:    irc://irc.oftc.net/linux-pci
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lpieralisi/pci.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git
  F:    Documentation/devicetree/bindings/pci/
  F:    drivers/pci/controller/
  F:    drivers/pci/pci-bridge-emul.c
@@@ -16038,7 -16196,7 +16040,7 @@@ S:   Supporte
  Q:    https://patchwork.kernel.org/project/linux-pci/list/
  B:    https://bugzilla.kernel.org
  C:    irc://irc.oftc.net/linux-pci
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git
  F:    Documentation/PCI/
  F:    Documentation/devicetree/bindings/pci/
  F:    arch/x86/kernel/early-quirks.c
@@@ -17082,7 -17240,7 +17084,7 @@@ F:   Documentation/devicetree/bindings/ne
  F:    drivers/net/wwan/qcom_bam_dmux.c
  
  QUALCOMM CAMERA SUBSYSTEM DRIVER
 -M:    Robert Foss <robert.foss@linaro.org>
 +M:    Robert Foss <rfoss@kernel.org>
  M:    Todor Tomov <[email protected]>
  L:    [email protected]
  S:    Maintained
@@@ -17162,7 -17320,7 +17164,7 @@@ F:   drivers/dma/qcom/hidma
  
  QUALCOMM I2C CCI DRIVER
  M:    Loic Poulain <[email protected]>
 -M:    Robert Foss <robert.foss@linaro.org>
 +M:    Robert Foss <rfoss@kernel.org>
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
@@@ -17801,7 -17959,6 +17803,7 @@@ M:   Albert Ou <[email protected]
  L:    [email protected]
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-riscv/list/
 +C:    irc://irc.libera.chat/riscv
  P:    Documentation/riscv/patch-acceptance.rst
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux.git
  F:    arch/riscv/
  S:    Supported
  W:    https://github.com/Rust-for-Linux/linux
  B:    https://github.com/Rust-for-Linux/linux/issues
 +C:    zulip://rust-for-linux.zulipchat.com
  T:    git https://github.com/Rust-for-Linux/linux.git rust-next
  F:    Documentation/rust/
  F:    rust/
  S:    Supported
  F:    drivers/s390/scsi/zfcp_*
  
 -S3C ADC BATTERY DRIVER
 -M:    Krzysztof Kozlowski <[email protected]>
 -L:    [email protected]
 -S:    Odd Fixes
 -F:    drivers/power/supply/s3c_adc_battery.c
 -F:    include/linux/s3c_adc_battery.h
 -
 -S3C24XX SD/MMC Driver
 -M:    Ben Dooks <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Supported
 -F:    drivers/mmc/host/s3cmci.*
 -
  SAA6588 RDS RECEIVER DRIVER
  M:    Hans Verkuil <[email protected]>
  L:    [email protected]
@@@ -18362,9 -18531,11 +18364,9 @@@ F:  Documentation/devicetree/bindings/cl
  F:    Documentation/devicetree/bindings/clock/samsung,s3c*
  F:    drivers/clk/samsung/
  F:    include/dt-bindings/clock/exynos*.h
 -F:    include/dt-bindings/clock/s3c*.h
  F:    include/dt-bindings/clock/s5p*.h
  F:    include/dt-bindings/clock/samsung,*.h
  F:    include/linux/clk/samsung.h
 -F:    include/linux/platform_data/clk-s3c2410.h
  
  SAMSUNG SPI DRIVERS
  M:    Krzysztof Kozlowski <[email protected]>
@@@ -18375,6 -18546,7 +18377,6 @@@ S:   Maintaine
  F:    Documentation/devicetree/bindings/spi/samsung,spi*.yaml
  F:    drivers/spi/spi-s3c*
  F:    include/linux/platform_data/spi-s3c64xx.h
 -F:    include/linux/spi/s3c24xx-fiq.h
  
  SAMSUNG SXGBE DRIVERS
  M:    Byungho An <[email protected]>
@@@ -18508,9 -18680,9 +18510,9 @@@ F:   drivers/target
  F:    include/target/
  
  SCTP PROTOCOL
 -M:    Vlad Yasevich <[email protected]>
  M:    Neil Horman <[email protected]>
  M:    Marcelo Ricardo Leitner <[email protected]>
 +M:    Xin Long <[email protected]>
  L:    [email protected]
  S:    Maintained
  W:    http://lksctp.sourceforge.net
@@@ -18944,6 -19116,14 +18946,6 @@@ M:  Simtec Linux Team <[email protected]
  S:    Supported
  W:    http://www.simtec.co.uk/products/EB110ATX/
  
 -SIMTEC EB2410ITX (BAST)
 -M:    Simtec Linux Team <[email protected]>
 -S:    Supported
 -W:    http://www.simtec.co.uk/products/EB2410ITX/
 -F:    arch/arm/mach-s3c/bast-ide.c
 -F:    arch/arm/mach-s3c/bast-irq.c
 -F:    arch/arm/mach-s3c/mach-bast.c
 -
  SIOX
  M:    Thorsten Scherer <[email protected]>
  M:    Uwe Kleine-König <[email protected]>
  S:    Orphan
  F:    sound/soc/uniphier/
  
 +SOCKET TIMESTAMPING
 +M:    Willem de Bruijn <[email protected]>
 +S:    Maintained
 +F:    Documentation/networking/timestamping.rst
 +F:    include/uapi/linux/net_tstamp.h
 +F:    tools/testing/selftests/net/so_txtime.c
 +
  SOEKRIS NET48XX LED SUPPORT
  M:    Chris Boot <[email protected]>
  S:    Maintained
@@@ -19900,7 -20073,6 +19902,7 @@@ F:   drivers/watchdog/sunplus_wdt.
  SUPERH
  M:    Yoshinori Sato <[email protected]>
  M:    Rich Felker <[email protected]>
 +M:    John Paul Adrian Glaubitz <[email protected]>
  L:    [email protected]
  S:    Maintained
  Q:    http://patchwork.kernel.org/project/linux-sh/list/
@@@ -20133,7 -20305,8 +20135,7 @@@ S:   Maintaine
  F:    drivers/platform/x86/system76_acpi.c
  
  SYSV FILESYSTEM
 -M:    Christoph Hellwig <[email protected]>
 -S:    Maintained
 +S:    Orphan
  F:    Documentation/filesystems/sysv-fs.rst
  F:    fs/sysv/
  F:    include/linux/sysv_fs.h
@@@ -20680,6 -20853,7 +20682,6 @@@ W:   https://linuxtv.or
  Q:    http://patchwork.linuxtv.org/project/linux-media/list/
  T:    git git://linuxtv.org/mhadli/v4l-dvb-davinci_devices.git
  F:    drivers/media/platform/ti/davinci/
 -F:    drivers/staging/media/deprecated/vpfe_capture/
  F:    include/media/davinci/
  
  TI ENHANCED CAPTURE (eCAP) DRIVER
@@@ -21539,7 -21713,6 +21541,7 @@@ F:   include/uapi/linux/uvcvideo.
  
  USB WEBCAM GADGET
  M:    Laurent Pinchart <[email protected]>
 +M:    Daniel Scally <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    drivers/usb/gadget/function/*uvc*
@@@ -21575,13 -21748,6 +21577,13 @@@ T: git git://linuxtv.org/media_tree.gi
  F:    Documentation/admin-guide/media/zr364xx*
  F:    drivers/staging/media/deprecated/zr364xx/
  
 +USER DATAGRAM PROTOCOL (UDP)
 +M:    Willem de Bruijn <[email protected]>
 +S:    Maintained
 +F:    include/linux/udp.h
 +F:    net/ipv4/udp.c
 +F:    net/ipv6/udp.c
 +
  USER-MODE LINUX (UML)
  M:    Richard Weinberger <[email protected]>
  M:    Anton Ivanov <[email protected]>
@@@ -21627,9 -21793,11 +21629,9 @@@ W:  http://en.wikipedia.org/wiki/Util-li
  T:    git git://git.kernel.org/pub/scm/utils/util-linux/util-linux.git
  
  UUID HELPERS
 -M:    Christoph Hellwig <[email protected]>
  R:    Andy Shevchenko <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://git.infradead.org/users/hch/uuid.git
  F:    include/linux/uuid.h
  F:    include/uapi/linux/uuid.h
  F:    lib/test_uuid.c
@@@ -22743,13 -22911,6 +22745,13 @@@ F: Documentation/devicetree/bindings/dm
  F:    drivers/dma/xilinx/xilinx_dpdma.c
  F:    include/dt-bindings/dma/xlnx-zynqmp-dpdma.h
  
 +XILINX ZYNQMP OCM EDAC DRIVER
 +M:    Shubhrajyoti Datta <[email protected]>
 +M:    Sai Krishna Potthuri <[email protected]>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/memory-controllers/xlnx,zynqmp-ocmc-1.0.yaml
 +F:    drivers/edac/zynqmp_edac.c
 +
  XILINX ZYNQMP PSGTR PHY DRIVER
  M:    Anurag Kumar Vulisha <[email protected]>
  M:    Laurent Pinchart <[email protected]>
diff --combined drivers/irqchip/Kconfig
index d79683154f7f4dbaaa28a59082fce2cc6e5c9846,7abdb98f805d6d44cfaa5ac91a3fa38defec3f06..7dc990eb2c9baab84e2d66fed99890b808915657
@@@ -136,6 -136,11 +136,6 @@@ config BRCMSTB_L2_IR
        select GENERIC_IRQ_CHIP
        select IRQ_DOMAIN
  
 -config DAVINCI_AINTC
 -      bool
 -      select GENERIC_IRQ_CHIP
 -      select IRQ_DOMAIN
 -
  config DAVINCI_CP_INTC
        bool
        select GENERIC_IRQ_CHIP
@@@ -384,7 -389,7 +384,7 @@@ config LS_EXTIR
  
  config LS_SCFG_MSI
        def_bool y if SOC_LS1021A || ARCH_LAYERSCAPE
-       depends on PCI && PCI_MSI
+       depends on PCI_MSI
  
  config PARTITION_PERCPU
        bool
@@@ -653,6 -658,7 +653,7 @@@ config APPLE_AI
        bool "Apple Interrupt Controller (AIC)"
        depends on ARM64
        depends on ARCH_APPLE || COMPILE_TEST
+       select GENERIC_IRQ_IPI_MUX
        help
          Support for the Apple Interrupt Controller found on Apple Silicon SoCs,
          such as the M1.
diff --combined kernel/irq/irqdomain.c
index 798a9042421fc7d8e993bee632ae787c35b97a86,1983f1beeec70b2765523a8ca330fb3a3b213059..aa5b7eeeceb8d8bc991a2a738a66e9464a8f03f1
@@@ -25,6 -25,9 +25,9 @@@ static DEFINE_MUTEX(irq_domain_mutex)
  
  static struct irq_domain *irq_default_domain;
  
+ static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base,
+                                       unsigned int nr_irqs, int node, void *arg,
+                                       bool realloc, const struct irq_affinity_desc *affinity);
  static void irq_domain_check_hierarchy(struct irq_domain *domain);
  
  struct irqchip_fwid {
@@@ -114,7 -117,7 +117,7 @@@ void irq_domain_free_fwnode(struct fwno
  {
        struct irqchip_fwid *fwid;
  
 -      if (WARN_ON(!is_fwnode_irqchip(fwnode)))
 +      if (!fwnode || WARN_ON(!is_fwnode_irqchip(fwnode)))
                return;
  
        fwid = container_of(fwnode, struct irqchip_fwid, fwnode);
  }
  EXPORT_SYMBOL_GPL(irq_domain_free_fwnode);
  
- /**
-  * __irq_domain_add() - Allocate a new irq_domain data structure
-  * @fwnode: firmware node for the interrupt controller
-  * @size: Size of linear map; 0 for radix mapping only
-  * @hwirq_max: Maximum number of interrupts supported by controller
-  * @direct_max: Maximum value of direct maps; Use ~0 for no limit; 0 for no
-  *              direct mapping
-  * @ops: domain callbacks
-  * @host_data: Controller private data pointer
-  *
-  * Allocates and initializes an irq_domain structure.
-  * Returns pointer to IRQ domain, or NULL on failure.
-  */
- struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, unsigned int size,
-                                   irq_hw_number_t hwirq_max, int direct_max,
-                                   const struct irq_domain_ops *ops,
-                                   void *host_data)
+ static struct irq_domain *__irq_domain_create(struct fwnode_handle *fwnode,
+                                             unsigned int size,
+                                             irq_hw_number_t hwirq_max,
+                                             int direct_max,
+                                             const struct irq_domain_ops *ops,
+                                             void *host_data)
  {
        struct irqchip_fwid *fwid;
        struct irq_domain *domain;
  
        /* Fill structure */
        INIT_RADIX_TREE(&domain->revmap_tree, GFP_KERNEL);
-       mutex_init(&domain->revmap_mutex);
        domain->ops = ops;
        domain->host_data = host_data;
        domain->hwirq_max = hwirq_max;
  
-       if (direct_max) {
+       if (direct_max)
                domain->flags |= IRQ_DOMAIN_FLAG_NO_MAP;
-       }
  
        domain->revmap_size = size;
  
+       /*
+        * Hierarchical domains use the domain lock of the root domain
+        * (innermost domain).
+        *
+        * For non-hierarchical domains (as for root domains), the root
+        * pointer is set to the domain itself so that &domain->root->mutex
+        * always points to the right lock.
+        */
+       mutex_init(&domain->mutex);
+       domain->root = domain;
        irq_domain_check_hierarchy(domain);
  
+       return domain;
+ }
+ static void __irq_domain_publish(struct irq_domain *domain)
+ {
        mutex_lock(&irq_domain_mutex);
        debugfs_add_domain_dir(domain);
        list_add(&domain->link, &irq_domain_list);
        mutex_unlock(&irq_domain_mutex);
  
        pr_debug("Added domain %s\n", domain->name);
+ }
+ /**
+  * __irq_domain_add() - Allocate a new irq_domain data structure
+  * @fwnode: firmware node for the interrupt controller
+  * @size: Size of linear map; 0 for radix mapping only
+  * @hwirq_max: Maximum number of interrupts supported by controller
+  * @direct_max: Maximum value of direct maps; Use ~0 for no limit; 0 for no
+  *              direct mapping
+  * @ops: domain callbacks
+  * @host_data: Controller private data pointer
+  *
+  * Allocates and initializes an irq_domain structure.
+  * Returns pointer to IRQ domain, or NULL on failure.
+  */
+ struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, unsigned int size,
+                                   irq_hw_number_t hwirq_max, int direct_max,
+                                   const struct irq_domain_ops *ops,
+                                   void *host_data)
+ {
+       struct irq_domain *domain;
+       domain = __irq_domain_create(fwnode, size, hwirq_max, direct_max,
+                                    ops, host_data);
+       if (domain)
+               __irq_domain_publish(domain);
        return domain;
  }
  EXPORT_SYMBOL_GPL(__irq_domain_add);
@@@ -502,30 -535,34 +535,34 @@@ static bool irq_domain_is_nomap(struct 
  static void irq_domain_clear_mapping(struct irq_domain *domain,
                                     irq_hw_number_t hwirq)
  {
+       lockdep_assert_held(&domain->root->mutex);
        if (irq_domain_is_nomap(domain))
                return;
  
-       mutex_lock(&domain->revmap_mutex);
        if (hwirq < domain->revmap_size)
                rcu_assign_pointer(domain->revmap[hwirq], NULL);
        else
                radix_tree_delete(&domain->revmap_tree, hwirq);
-       mutex_unlock(&domain->revmap_mutex);
  }
  
  static void irq_domain_set_mapping(struct irq_domain *domain,
                                   irq_hw_number_t hwirq,
                                   struct irq_data *irq_data)
  {
+       /*
+        * This also makes sure that all domains point to the same root when
+        * called from irq_domain_insert_irq() for each domain in a hierarchy.
+        */
+       lockdep_assert_held(&domain->root->mutex);
        if (irq_domain_is_nomap(domain))
                return;
  
-       mutex_lock(&domain->revmap_mutex);
        if (hwirq < domain->revmap_size)
                rcu_assign_pointer(domain->revmap[hwirq], irq_data);
        else
                radix_tree_insert(&domain->revmap_tree, hwirq, irq_data);
-       mutex_unlock(&domain->revmap_mutex);
  }
  
  static void irq_domain_disassociate(struct irq_domain *domain, unsigned int irq)
                return;
  
        hwirq = irq_data->hwirq;
+       mutex_lock(&domain->root->mutex);
        irq_set_status_flags(irq, IRQ_NOREQUEST);
  
        /* remove chip and handler */
  
        /* Clear reverse map for this hwirq */
        irq_domain_clear_mapping(domain, hwirq);
+       mutex_unlock(&domain->root->mutex);
  }
  
int irq_domain_associate(struct irq_domain *domain, unsigned int virq,
-                        irq_hw_number_t hwirq)
static int irq_domain_associate_locked(struct irq_domain *domain, unsigned int virq,
+                                      irq_hw_number_t hwirq)
  {
        struct irq_data *irq_data = irq_get_irq_data(virq);
        int ret;
        if (WARN(irq_data->domain, "error: virq%i is already associated", virq))
                return -EINVAL;
  
-       mutex_lock(&irq_domain_mutex);
        irq_data->hwirq = hwirq;
        irq_data->domain = domain;
        if (domain->ops->map) {
                        }
                        irq_data->domain = NULL;
                        irq_data->hwirq = 0;
-                       mutex_unlock(&irq_domain_mutex);
                        return ret;
                }
-               /* If not already assigned, give the domain the chip's name */
-               if (!domain->name && irq_data->chip)
-                       domain->name = irq_data->chip->name;
        }
  
        domain->mapcount++;
        irq_domain_set_mapping(domain, hwirq, irq_data);
-       mutex_unlock(&irq_domain_mutex);
  
        irq_clear_status_flags(virq, IRQ_NOREQUEST);
  
        return 0;
  }
+ int irq_domain_associate(struct irq_domain *domain, unsigned int virq,
+                        irq_hw_number_t hwirq)
+ {
+       int ret;
+       mutex_lock(&domain->root->mutex);
+       ret = irq_domain_associate_locked(domain, virq, hwirq);
+       mutex_unlock(&domain->root->mutex);
+       return ret;
+ }
  EXPORT_SYMBOL_GPL(irq_domain_associate);
  
  void irq_domain_associate_many(struct irq_domain *domain, unsigned int irq_base,
        pr_debug("%s(%s, irqbase=%i, hwbase=%i, count=%i)\n", __func__,
                of_node_full_name(of_node), irq_base, (int)hwirq_base, count);
  
-       for (i = 0; i < count; i++) {
+       for (i = 0; i < count; i++)
                irq_domain_associate(domain, irq_base + i, hwirq_base + i);
-       }
  }
  EXPORT_SYMBOL_GPL(irq_domain_associate_many);
  
@@@ -668,6 -714,34 +714,34 @@@ unsigned int irq_create_direct_mapping(
  EXPORT_SYMBOL_GPL(irq_create_direct_mapping);
  #endif
  
+ static unsigned int irq_create_mapping_affinity_locked(struct irq_domain *domain,
+                                                      irq_hw_number_t hwirq,
+                                                      const struct irq_affinity_desc *affinity)
+ {
+       struct device_node *of_node = irq_domain_get_of_node(domain);
+       int virq;
+       pr_debug("irq_create_mapping(0x%p, 0x%lx)\n", domain, hwirq);
+       /* Allocate a virtual interrupt number */
+       virq = irq_domain_alloc_descs(-1, 1, hwirq, of_node_to_nid(of_node),
+                                     affinity);
+       if (virq <= 0) {
+               pr_debug("-> virq allocation failed\n");
+               return 0;
+       }
+       if (irq_domain_associate_locked(domain, virq, hwirq)) {
+               irq_free_desc(virq);
+               return 0;
+       }
+       pr_debug("irq %lu on domain %s mapped to virtual irq %u\n",
+               hwirq, of_node_full_name(of_node), virq);
+       return virq;
+ }
  /**
   * irq_create_mapping_affinity() - Map a hardware interrupt into linux irq space
   * @domain: domain owning this hardware interrupt or NULL for default domain
   * on the number returned from that call.
   */
  unsigned int irq_create_mapping_affinity(struct irq_domain *domain,
-                                      irq_hw_number_t hwirq,
-                                      const struct irq_affinity_desc *affinity)
+                                        irq_hw_number_t hwirq,
+                                        const struct irq_affinity_desc *affinity)
  {
-       struct device_node *of_node;
        int virq;
  
-       pr_debug("irq_create_mapping(0x%p, 0x%lx)\n", domain, hwirq);
        /* Look for default domain if necessary */
        if (domain == NULL)
                domain = irq_default_domain;
                WARN(1, "%s(, %lx) called with NULL domain\n", __func__, hwirq);
                return 0;
        }
-       pr_debug("-> using domain @%p\n", domain);
  
-       of_node = irq_domain_get_of_node(domain);
+       mutex_lock(&domain->root->mutex);
  
        /* Check if mapping already exists */
        virq = irq_find_mapping(domain, hwirq);
        if (virq) {
-               pr_debug("-> existing mapping on virq %d\n", virq);
-               return virq;
-       }
-       /* Allocate a virtual interrupt number */
-       virq = irq_domain_alloc_descs(-1, 1, hwirq, of_node_to_nid(of_node),
-                                     affinity);
-       if (virq <= 0) {
-               pr_debug("-> virq allocation failed\n");
-               return 0;
+               pr_debug("existing mapping on virq %d\n", virq);
+               goto out;
        }
  
-       if (irq_domain_associate(domain, virq, hwirq)) {
-               irq_free_desc(virq);
-               return 0;
-       }
-       pr_debug("irq %lu on domain %s mapped to virtual irq %u\n",
-               hwirq, of_node_full_name(of_node), virq);
+       virq = irq_create_mapping_affinity_locked(domain, hwirq, affinity);
+ out:
+       mutex_unlock(&domain->root->mutex);
  
        return virq;
  }
@@@ -789,6 -847,8 +847,8 @@@ unsigned int irq_create_fwspec_mapping(
        if (WARN_ON(type & ~IRQ_TYPE_SENSE_MASK))
                type &= IRQ_TYPE_SENSE_MASK;
  
+       mutex_lock(&domain->root->mutex);
        /*
         * If we've already configured this interrupt,
         * don't do it again, or hell will break loose.
                 * interrupt number.
                 */
                if (type == IRQ_TYPE_NONE || type == irq_get_trigger_type(virq))
-                       return virq;
+                       goto out;
  
                /*
                 * If the trigger type has not been set yet, then set
                 */
                if (irq_get_trigger_type(virq) == IRQ_TYPE_NONE) {
                        irq_data = irq_get_irq_data(virq);
-                       if (!irq_data)
-                               return 0;
+                       if (!irq_data) {
+                               virq = 0;
+                               goto out;
+                       }
  
                        irqd_set_trigger_type(irq_data, type);
-                       return virq;
+                       goto out;
                }
  
                pr_warn("type mismatch, failed to map hwirq-%lu for %s!\n",
                        hwirq, of_node_full_name(to_of_node(fwspec->fwnode)));
-               return 0;
+               virq = 0;
+               goto out;
        }
  
        if (irq_domain_is_hierarchy(domain)) {
-               virq = irq_domain_alloc_irqs(domain, 1, NUMA_NO_NODE, fwspec);
-               if (virq <= 0)
-                       return 0;
+               virq = irq_domain_alloc_irqs_locked(domain, -1, 1, NUMA_NO_NODE,
+                                                   fwspec, false, NULL);
+               if (virq <= 0) {
+                       virq = 0;
+                       goto out;
+               }
        } else {
                /* Create mapping */
-               virq = irq_create_mapping(domain, hwirq);
+               virq = irq_create_mapping_affinity_locked(domain, hwirq, NULL);
                if (!virq)
-                       return virq;
+                       goto out;
        }
  
        irq_data = irq_get_irq_data(virq);
-       if (!irq_data) {
-               if (irq_domain_is_hierarchy(domain))
-                       irq_domain_free_irqs(virq, 1);
-               else
-                       irq_dispose_mapping(virq);
-               return 0;
+       if (WARN_ON(!irq_data)) {
+               virq = 0;
+               goto out;
        }
  
        /* Store trigger type */
        irqd_set_trigger_type(irq_data, type);
+ out:
+       mutex_unlock(&domain->root->mutex);
  
        return virq;
  }
@@@ -1102,12 -1167,16 +1167,16 @@@ struct irq_domain *irq_domain_create_hi
        struct irq_domain *domain;
  
        if (size)
-               domain = irq_domain_create_linear(fwnode, size, ops, host_data);
+               domain = __irq_domain_create(fwnode, size, size, 0, ops, host_data);
        else
-               domain = irq_domain_create_tree(fwnode, ops, host_data);
+               domain = __irq_domain_create(fwnode, 0, ~0, 0, ops, host_data);
        if (domain) {
+               domain->root = parent->root;
                domain->parent = parent;
                domain->flags |= flags;
+               __irq_domain_publish(domain);
        }
  
        return domain;
@@@ -1123,10 -1192,6 +1192,6 @@@ static void irq_domain_insert_irq(int v
  
                domain->mapcount++;
                irq_domain_set_mapping(domain, data->hwirq, data);
-               /* If not already assigned, give the domain the chip's name */
-               if (!domain->name && data->chip)
-                       domain->name = data->chip->name;
        }
  
        irq_clear_status_flags(virq, IRQ_NOREQUEST);
@@@ -1426,40 -1491,12 +1491,12 @@@ int irq_domain_alloc_irqs_hierarchy(str
        return domain->ops->alloc(domain, irq_base, nr_irqs, arg);
  }
  
- /**
-  * __irq_domain_alloc_irqs - Allocate IRQs from domain
-  * @domain:   domain to allocate from
-  * @irq_base: allocate specified IRQ number if irq_base >= 0
-  * @nr_irqs:  number of IRQs to allocate
-  * @node:     NUMA node id for memory allocation
-  * @arg:      domain specific argument
-  * @realloc:  IRQ descriptors have already been allocated if true
-  * @affinity: Optional irq affinity mask for multiqueue devices
-  *
-  * Allocate IRQ numbers and initialized all data structures to support
-  * hierarchy IRQ domains.
-  * Parameter @realloc is mainly to support legacy IRQs.
-  * Returns error code or allocated IRQ number
-  *
-  * The whole process to setup an IRQ has been split into two steps.
-  * The first step, __irq_domain_alloc_irqs(), is to allocate IRQ
-  * descriptor and required hardware resources. The second step,
-  * irq_domain_activate_irq(), is to program the hardware with preallocated
-  * resources. In this way, it's easier to rollback when failing to
-  * allocate resources.
-  */
- int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base,
-                           unsigned int nr_irqs, int node, void *arg,
-                           bool realloc, const struct irq_affinity_desc *affinity)
+ static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base,
+                                       unsigned int nr_irqs, int node, void *arg,
+                                       bool realloc, const struct irq_affinity_desc *affinity)
  {
        int i, ret, virq;
  
-       if (domain == NULL) {
-               domain = irq_default_domain;
-               if (WARN(!domain, "domain is NULL; cannot allocate IRQ\n"))
-                       return -EINVAL;
-       }
        if (realloc && irq_base >= 0) {
                virq = irq_base;
        } else {
                goto out_free_desc;
        }
  
-       mutex_lock(&irq_domain_mutex);
        ret = irq_domain_alloc_irqs_hierarchy(domain, virq, nr_irqs, arg);
-       if (ret < 0) {
-               mutex_unlock(&irq_domain_mutex);
+       if (ret < 0)
                goto out_free_irq_data;
-       }
  
        for (i = 0; i < nr_irqs; i++) {
                ret = irq_domain_trim_hierarchy(virq + i);
-               if (ret) {
-                       mutex_unlock(&irq_domain_mutex);
+               if (ret)
                        goto out_free_irq_data;
-               }
        }
-       
        for (i = 0; i < nr_irqs; i++)
                irq_domain_insert_irq(virq + i);
-       mutex_unlock(&irq_domain_mutex);
  
        return virq;
  
@@@ -1505,6 -1536,48 +1536,48 @@@ out_free_desc
        irq_free_descs(virq, nr_irqs);
        return ret;
  }
+ /**
+  * __irq_domain_alloc_irqs - Allocate IRQs from domain
+  * @domain:   domain to allocate from
+  * @irq_base: allocate specified IRQ number if irq_base >= 0
+  * @nr_irqs:  number of IRQs to allocate
+  * @node:     NUMA node id for memory allocation
+  * @arg:      domain specific argument
+  * @realloc:  IRQ descriptors have already been allocated if true
+  * @affinity: Optional irq affinity mask for multiqueue devices
+  *
+  * Allocate IRQ numbers and initialized all data structures to support
+  * hierarchy IRQ domains.
+  * Parameter @realloc is mainly to support legacy IRQs.
+  * Returns error code or allocated IRQ number
+  *
+  * The whole process to setup an IRQ has been split into two steps.
+  * The first step, __irq_domain_alloc_irqs(), is to allocate IRQ
+  * descriptor and required hardware resources. The second step,
+  * irq_domain_activate_irq(), is to program the hardware with preallocated
+  * resources. In this way, it's easier to rollback when failing to
+  * allocate resources.
+  */
+ int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base,
+                           unsigned int nr_irqs, int node, void *arg,
+                           bool realloc, const struct irq_affinity_desc *affinity)
+ {
+       int ret;
+       if (domain == NULL) {
+               domain = irq_default_domain;
+               if (WARN(!domain, "domain is NULL; cannot allocate IRQ\n"))
+                       return -EINVAL;
+       }
+       mutex_lock(&domain->root->mutex);
+       ret = irq_domain_alloc_irqs_locked(domain, irq_base, nr_irqs, node, arg,
+                                          realloc, affinity);
+       mutex_unlock(&domain->root->mutex);
+       return ret;
+ }
  EXPORT_SYMBOL_GPL(__irq_domain_alloc_irqs);
  
  /* The irq_data was moved, fix the revmap to refer to the new location */
@@@ -1512,11 -1585,12 +1585,12 @@@ static void irq_domain_fix_revmap(struc
  {
        void __rcu **slot;
  
+       lockdep_assert_held(&d->domain->root->mutex);
        if (irq_domain_is_nomap(d->domain))
                return;
  
        /* Fix up the revmap. */
-       mutex_lock(&d->domain->revmap_mutex);
        if (d->hwirq < d->domain->revmap_size) {
                /* Not using radix tree */
                rcu_assign_pointer(d->domain->revmap[d->hwirq], d);
                if (slot)
                        radix_tree_replace_slot(&d->domain->revmap_tree, slot, d);
        }
-       mutex_unlock(&d->domain->revmap_mutex);
  }
  
  /**
   */
  int irq_domain_push_irq(struct irq_domain *domain, int virq, void *arg)
  {
-       struct irq_data *child_irq_data;
-       struct irq_data *root_irq_data = irq_get_irq_data(virq);
+       struct irq_data *irq_data = irq_get_irq_data(virq);
+       struct irq_data *parent_irq_data;
        struct irq_desc *desc;
        int rv = 0;
  
        if (WARN_ON(!irq_domain_is_hierarchy(domain)))
                return -EINVAL;
  
-       if (!root_irq_data)
+       if (!irq_data)
                return -EINVAL;
  
-       if (domain->parent != root_irq_data->domain)
+       if (domain->parent != irq_data->domain)
                return -EINVAL;
  
-       child_irq_data = kzalloc_node(sizeof(*child_irq_data), GFP_KERNEL,
-                                     irq_data_get_node(root_irq_data));
-       if (!child_irq_data)
+       parent_irq_data = kzalloc_node(sizeof(*parent_irq_data), GFP_KERNEL,
+                                      irq_data_get_node(irq_data));
+       if (!parent_irq_data)
                return -ENOMEM;
  
-       mutex_lock(&irq_domain_mutex);
+       mutex_lock(&domain->root->mutex);
  
        /* Copy the original irq_data. */
-       *child_irq_data = *root_irq_data;
+       *parent_irq_data = *irq_data;
  
        /*
-        * Overwrite the root_irq_data, which is embedded in struct
-        * irq_desc, with values for this domain.
+        * Overwrite the irq_data, which is embedded in struct irq_desc, with
+        * values for this domain.
         */
-       root_irq_data->parent_data = child_irq_data;
-       root_irq_data->domain = domain;
-       root_irq_data->mask = 0;
-       root_irq_data->hwirq = 0;
-       root_irq_data->chip = NULL;
-       root_irq_data->chip_data = NULL;
+       irq_data->parent_data = parent_irq_data;
+       irq_data->domain = domain;
+       irq_data->mask = 0;
+       irq_data->hwirq = 0;
+       irq_data->chip = NULL;
+       irq_data->chip_data = NULL;
  
        /* May (probably does) set hwirq, chip, etc. */
        rv = irq_domain_alloc_irqs_hierarchy(domain, virq, 1, arg);
        if (rv) {
                /* Restore the original irq_data. */
-               *root_irq_data = *child_irq_data;
-               kfree(child_irq_data);
+               *irq_data = *parent_irq_data;
+               kfree(parent_irq_data);
                goto error;
        }
  
-       irq_domain_fix_revmap(child_irq_data);
-       irq_domain_set_mapping(domain, root_irq_data->hwirq, root_irq_data);
+       irq_domain_fix_revmap(parent_irq_data);
+       irq_domain_set_mapping(domain, irq_data->hwirq, irq_data);
  error:
-       mutex_unlock(&irq_domain_mutex);
+       mutex_unlock(&domain->root->mutex);
  
        return rv;
  }
@@@ -1623,8 -1695,8 +1695,8 @@@ EXPORT_SYMBOL_GPL(irq_domain_push_irq)
   */
  int irq_domain_pop_irq(struct irq_domain *domain, int virq)
  {
-       struct irq_data *root_irq_data = irq_get_irq_data(virq);
-       struct irq_data *child_irq_data;
+       struct irq_data *irq_data = irq_get_irq_data(virq);
+       struct irq_data *parent_irq_data;
        struct irq_data *tmp_irq_data;
        struct irq_desc *desc;
  
        if (domain == NULL)
                return -EINVAL;
  
-       if (!root_irq_data)
+       if (!irq_data)
                return -EINVAL;
  
        tmp_irq_data = irq_domain_get_irq_data(domain, virq);
  
        /* We can only "pop" if this domain is at the top of the list */
-       if (WARN_ON(root_irq_data != tmp_irq_data))
+       if (WARN_ON(irq_data != tmp_irq_data))
                return -EINVAL;
  
-       if (WARN_ON(root_irq_data->domain != domain))
+       if (WARN_ON(irq_data->domain != domain))
                return -EINVAL;
  
-       child_irq_data = root_irq_data->parent_data;
-       if (WARN_ON(!child_irq_data))
+       parent_irq_data = irq_data->parent_data;
+       if (WARN_ON(!parent_irq_data))
                return -EINVAL;
  
-       mutex_lock(&irq_domain_mutex);
+       mutex_lock(&domain->root->mutex);
  
-       root_irq_data->parent_data = NULL;
+       irq_data->parent_data = NULL;
  
-       irq_domain_clear_mapping(domain, root_irq_data->hwirq);
+       irq_domain_clear_mapping(domain, irq_data->hwirq);
        irq_domain_free_irqs_hierarchy(domain, virq, 1);
  
        /* Restore the original irq_data. */
-       *root_irq_data = *child_irq_data;
+       *irq_data = *parent_irq_data;
  
-       irq_domain_fix_revmap(root_irq_data);
+       irq_domain_fix_revmap(irq_data);
  
-       mutex_unlock(&irq_domain_mutex);
+       mutex_unlock(&domain->root->mutex);
  
-       kfree(child_irq_data);
+       kfree(parent_irq_data);
  
        return 0;
  }
@@@ -1690,17 -1762,20 +1762,20 @@@ EXPORT_SYMBOL_GPL(irq_domain_pop_irq)
  void irq_domain_free_irqs(unsigned int virq, unsigned int nr_irqs)
  {
        struct irq_data *data = irq_get_irq_data(virq);
+       struct irq_domain *domain;
        int i;
  
        if (WARN(!data || !data->domain || !data->domain->ops->free,
                 "NULL pointer, cannot free irq\n"))
                return;
  
-       mutex_lock(&irq_domain_mutex);
+       domain = data->domain;
+       mutex_lock(&domain->root->mutex);
        for (i = 0; i < nr_irqs; i++)
                irq_domain_remove_irq(virq + i);
-       irq_domain_free_irqs_hierarchy(data->domain, virq, nr_irqs);
-       mutex_unlock(&irq_domain_mutex);
+       irq_domain_free_irqs_hierarchy(domain, virq, nr_irqs);
+       mutex_unlock(&domain->root->mutex);
  
        irq_domain_free_irq_data(virq, nr_irqs);
        irq_free_descs(virq, nr_irqs);
@@@ -1865,6 -1940,13 +1940,13 @@@ void irq_domain_set_info(struct irq_dom
        irq_set_handler_data(virq, handler_data);
  }
  
+ static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base,
+                                       unsigned int nr_irqs, int node, void *arg,
+                                       bool realloc, const struct irq_affinity_desc *affinity)
+ {
+       return -EINVAL;
+ }
  static void irq_domain_check_hierarchy(struct irq_domain *domain)
  {
  }
@@@ -1915,7 -1997,7 +1997,7 @@@ static void debugfs_add_domain_dir(stru
  
  static void debugfs_remove_domain_dir(struct irq_domain *d)
  {
 -      debugfs_remove(debugfs_lookup(d->name, domain_dir));
 +      debugfs_lookup_and_remove(d->name, domain_dir);
  }
  
  void __init irq_domain_debugfs_init(struct dentry *root)
This page took 0.218162 seconds and 4 git commands to generate.