]> Git Repo - J-linux.git/commitdiff
Merge tag 'char-misc-6.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
authorLinus Torvalds <[email protected]>
Thu, 18 Jan 2024 00:47:17 +0000 (16:47 -0800)
committerLinus Torvalds <[email protected]>
Thu, 18 Jan 2024 00:47:17 +0000 (16:47 -0800)
Pull char/misc and other driver updates from Greg KH:
 "Here is the big set of char/misc and other driver subsystem changes
  for 6.8-rc1.

  Other than lots of binder driver changes (as you can see by the merge
  conflicts) included in here are:

   - lots of iio driver updates and additions

   - spmi driver updates

   - eeprom driver updates

   - firmware driver updates

   - ocxl driver updates

   - mhi driver updates

   - w1 driver updates

   - nvmem driver updates

   - coresight driver updates

   - platform driver remove callback api changes

   - tags.sh script updates

   - bus_type constant marking cleanups

   - lots of other small driver updates

  All of these have been in linux-next for a while with no reported
  issues"

* tag 'char-misc-6.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (341 commits)
  android: removed duplicate linux/errno
  uio: Fix use-after-free in uio_open
  drivers: soc: xilinx: add check for platform
  firmware: xilinx: Export function to use in other module
  scripts/tags.sh: remove find_sources
  scripts/tags.sh: use -n to test archinclude
  scripts/tags.sh: add local annotation
  scripts/tags.sh: use more portable -path instead of -wholename
  scripts/tags.sh: Update comment (addition of gtags)
  firmware: zynqmp: Convert to platform remove callback returning void
  firmware: turris-mox-rwtm: Convert to platform remove callback returning void
  firmware: stratix10-svc: Convert to platform remove callback returning void
  firmware: stratix10-rsu: Convert to platform remove callback returning void
  firmware: raspberrypi: Convert to platform remove callback returning void
  firmware: qemu_fw_cfg: Convert to platform remove callback returning void
  firmware: mtk-adsp-ipc: Convert to platform remove callback returning void
  firmware: imx-dsp: Convert to platform remove callback returning void
  firmware: coreboot_table: Convert to platform remove callback returning void
  firmware: arm_scpi: Convert to platform remove callback returning void
  firmware: arm_scmi: Convert to platform remove callback returning void
  ...

21 files changed:
1  2 
.mailmap
Documentation/devicetree/bindings/trivial-devices.yaml
Documentation/devicetree/bindings/vendor-prefixes.yaml
MAINTAINERS
drivers/android/binder.c
drivers/android/binder_alloc.c
drivers/base/property.c
drivers/bus/moxtet.c
drivers/edac/versal_edac.c
drivers/firmware/arm_scmi/driver.c
drivers/fpga/dfl.c
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
drivers/iio/magnetometer/tmag5273.c
drivers/interconnect/qcom/icc-rpm.c
drivers/misc/vmw_vmci/vmci_handle_array.h
drivers/of/platform.c
drivers/pci/endpoint/functions/pci-epf-mhi.c
drivers/soc/xilinx/xlnx_event_manager.c
drivers/soc/xilinx/zynqmp_power.c
include/linux/property.h
scripts/checkpatch.pl

diff --combined .mailmap
index cc0c58c560b396f7988ba6f8d79408f9539a2db7,5d9fbd5ae71ef9106dc02897e6a8d860ac76db76..04998f7bda81816b4bb1dd321f80393a80ae9a67
+++ b/.mailmap
@@@ -191,10 -191,6 +191,10 @@@ Gao Xiang <[email protected]> <gaoxiang2
 +Geliang Tang <[email protected]> <[email protected]>
 +Geliang Tang <[email protected]> <[email protected]>
 +Geliang Tang <[email protected]> <[email protected]>
 +Geliang Tang <[email protected]> <[email protected]>
  Georgi Djakov <[email protected]> <[email protected]>
  Gerald Schaefer <[email protected]> <[email protected]>
  Gerald Schaefer <[email protected]> <[email protected]>
@@@ -270,9 -266,6 +270,9 @@@ Jens Osterkamp <[email protected]
  Jernej Skrabec <[email protected]> <[email protected]>
  Jessica Zhang <[email protected]> <[email protected]>
@@@ -363,6 -356,7 +363,6 @@@ Maheshwar Ajja <[email protected]
  Malathi Gottam <[email protected]> <[email protected]>
  Manikanta Pubbisetty <[email protected]> <[email protected]>
  Manivannan Sadhasivam <[email protected]> <[email protected]>
 -Manivannan Sadhasivam <[email protected]> <[email protected]>
  Manoj Basapathi <[email protected]> <[email protected]>
  Marcin Nowakowski <[email protected]> <[email protected]>
  Marc Zyngier <[email protected]> <[email protected]>
@@@ -376,7 -370,7 +376,7 @@@ Martin Kepplinger <[email protected]> <
  Martin Kepplinger <[email protected]> <[email protected]>
  Martin Kepplinger <[email protected]> <[email protected]>
  Martyna Szapar-Mudlaw <[email protected]> <[email protected]>
 -Mathieu Othacehe <[email protected]>
 +Mathieu Othacehe <[email protected]> <[email protected]>
  Mat Martineau <[email protected]> <[email protected]>
  Mat Martineau <[email protected]> <[email protected]>
  Matthew Wilcox <[email protected]> <[email protected]>
@@@ -390,9 -384,10 +390,10 @@@ Matthias Fuchs <[email protected]> <matt
  Matthieu Baerts <[email protected]> <[email protected]>
  Matthieu CASTET <[email protected]>
  Matti Vaittinen <[email protected]> <[email protected]>
- Matt Ranostay <[email protected]> <[email protected]>
- Matt Ranostay <[email protected]> Matthew Ranostay <[email protected]>
- Matt Ranostay <[email protected]> <[email protected]>
+ Matt Ranostay <[email protected]> <[email protected]>
+ Matt Ranostay <[email protected]> <[email protected]>
+ Matt Ranostay <[email protected]> Matthew Ranostay <[email protected]>
+ Matt Ranostay <[email protected]> <[email protected]>
  Matt Redfearn <[email protected]> <[email protected]>
  Maulik Shah <[email protected]> <[email protected]>
  Mauro Carvalho Chehab <[email protected]> <[email protected]>
@@@ -435,7 -430,6 +436,7 @@@ Muna Sinada <[email protected]
  Murali Nalajala <[email protected]> <[email protected]>
  Mythri P K <[email protected]>
  Nadia Yvette Chambers <[email protected]> William Lee Irwin III <[email protected]>
 +Naoya Horiguchi <[email protected]> <[email protected]>
  Nathan Chancellor <[email protected]> <[email protected]>
  Neeraj Upadhyay <[email protected]> <[email protected]>
  Neil Armstrong <[email protected]> <[email protected]>
@@@ -477,8 -471,6 +478,8 @@@ Paul E. McKenney <[email protected]> <
  Paul E. McKenney <[email protected]> <[email protected]>
  Paul Mackerras <[email protected]> <[email protected]>
  Paul Mackerras <[email protected]> <[email protected]>
  Pavankumar Kondeti <[email protected]> <[email protected]>
  Peter A Jonsson <[email protected]>
  Peter Oruba <[email protected]>
@@@ -503,9 -495,6 +504,9 @@@ Ralf Baechle <[email protected]
  Ralf Wildenhues <[email protected]>
  Ram Chandra Jangir <[email protected]> <[email protected]>
  Randy Dunlap <[email protected]> <[email protected]>
 +Randy Dunlap <[email protected]> <[email protected]>
 +Randy Dunlap <[email protected]> <[email protected]>
 +Randy Dunlap <[email protected]> <[email protected]>
  Ravi Kumar Bokka <[email protected]> <[email protected]>
  Ravi Kumar Siddojigari <[email protected]> <[email protected]>
  RĂ©mi Denis-Courmont <[email protected]>
@@@ -546,8 -535,6 +547,8 @@@ Sebastian Reichel <[email protected]> <seb
  Sebastian Reichel <[email protected]> <[email protected]>
  Sedat Dilek <[email protected]> <[email protected]>
  Senthilkumar N L <[email protected]> <[email protected]>
 +Serge Hallyn <[email protected]> <[email protected]>
 +Serge Hallyn <[email protected]> <[email protected]>
  Seth Forshee <[email protected]> <[email protected]>
  Shannon Nelson <[email protected]> <[email protected]>
  Shannon Nelson <[email protected]> <[email protected]>
@@@ -584,7 -571,6 +585,7 @@@ Surabhi Vishnoi <quic_svishnoi@quicinc.
  Takashi YOSHII <[email protected]>
  Tamizh Chelvam Raja <[email protected]> <[email protected]>
 +Tanzir Hasan <[email protected]> <[email protected]>
  Tejun Heo <[email protected]>
  Tomeu Vizoso <[email protected]> <[email protected]>
  Thomas Graf <[email protected]>
@@@ -611,9 -597,6 +612,9 @@@ Uwe Kleine-König <u.kleine-koenig@peng
  Uwe Kleine-König <[email protected]>
  Uwe Kleine-König <[email protected]>
  Uwe Kleine-König <[email protected]>
 +Vadim Fedorenko <[email protected]> <[email protected]>
 +Vadim Fedorenko <[email protected]> <[email protected]>
 +Vadim Fedorenko <[email protected]> <[email protected]>
  Valdis Kletnieks <[email protected]>
  Varadarajan Narayanan <[email protected]> <[email protected]>
@@@ -648,5 -631,4 +649,5 @@@ Wolfram Sang <[email protected]> <w.sang@p
  Wolfram Sang <[email protected]> <[email protected]>
  Yusuke Goda <[email protected]>
index 21d1f066f87518ceed6f0500ccb466b73d0fcc39,27164e921927618b8346289f3443040af90eb283..79dcd92c4a43452e4e92f943add7638b45a45f21
@@@ -49,6 -49,8 +49,6 @@@ properties
            - ams,iaq-core
              # i2c serial eeprom (24cxx)
            - at,24c08
 -            # i2c trusted platform module (TPM)
 -          - atmel,at97sc3204t
              # ATSHA204 - i2c h/w symmetric crypto module
            - atmel,atsha204
              # ATSHA204A - i2c h/w symmetric crypto module
            - fsl,mpl3115
              # MPR121: Proximity Capacitive Touch Sensor Controller
            - fsl,mpr121
 +            # Monolithic Power Systems Inc. multi-phase controller mp2856
 +          - mps,mp2856
 +            # Monolithic Power Systems Inc. multi-phase controller mp2857
 +          - mps,mp2857
              # Monolithic Power Systems Inc. multi-phase controller mp2888
            - mps,mp2888
              # Monolithic Power Systems Inc. multi-phase controller mp2971
            - mps,mp2973
              # Monolithic Power Systems Inc. multi-phase controller mp2975
            - mps,mp2975
 +            # Monolithic Power Systems Inc. multi-phase hot-swap controller mp5990
 +          - mps,mp5990
              # Honeywell Humidicon HIH-6130 humidity/temperature sensor
            - honeywell,hi6130
              # IBM Common Form Factor Power Supply Versions (all versions)
            - infineon,ir38263
              # Infineon IRPS5401 Voltage Regulator (PMIC)
            - infineon,irps5401
 -            # Infineon SLB9635 (Soft-) I2C TPM (old protocol, max 100khz)
 -          - infineon,slb9635tt
 -            # Infineon SLB9645 I2C TPM (new protocol, max 400khz)
 -          - infineon,slb9645tt
 -            # Infineon SLB9673 I2C TPM 2.0
 -          - infineon,slb9673
              # Infineon TLV493D-A1B6 I2C 3D Magnetic Sensor
            - infineon,tlv493d-a1b6
              # Infineon Multi-phase Digital VR Controller xdpe11280
            - isil,isl29030
              # Intersil ISL68137 Digital Output Configurable PWM Controller
            - isil,isl68137
+             # Intersil ISL76682 Ambient Light Sensor
+           - isil,isl76682
              # Linear Technology LTC2488
            - lineartechnology,ltc2488
              # 5 Bit Programmable, Pulse-Width Modulator
            - national,lm85
              # I2C Â±0.33°C Accurate, 12-Bit + Sign Temperature Sensor and Thermal Window Comparator
            - national,lm92
 -            # i2c trusted platform module (TPM)
 -          - nuvoton,npct501
 -            # i2c trusted platform module (TPM2)
 -          - nuvoton,npct601
              # Nuvoton Temperature Sensor
            - nuvoton,w83773g
              # OKI ML86V7667 video decoder
            - silabs,si7020
              # Skyworks SKY81452: Six-Channel White LED Driver with Touch Panel Bias Supply
            - skyworks,sky81452
 -            # Socionext SynQuacer TPM MMIO module
 -          - socionext,synquacer-tpm-mmio
              # SparkFun Qwiic Joystick (COM-15168) with i2c interface
            - sparkfun,qwiic-joystick
              # i2c serial eeprom (24cxx)
            - winbond,w83793
              # Vicor Corporation Digital Supervisor
            - vicor,pli1209bc
 -            # i2c trusted platform module (TPM)
 -          - winbond,wpct301
  
  required:
    - compatible
index 02aaa1f538b2928599e289432a80f154588cec0d,aedbdbd947abf753398b29e950782be460d406ff..1a0dc04f1db47865766c3c71981cbdbd64c8343e
@@@ -79,8 -79,6 +79,8 @@@ patternProperties
      description: ALFA Network Inc.
    "^allegro,.*":
      description: Allegro DVT
 +  "^alliedvision,.*":
 +    description: Allied Vision Technologies GmbH
    "^allo,.*":
      description: Allo.com
    "^allwinner,.*":
      description: Andes Technology Corporation
    "^anvo,.*":
      description: Anvo-Systems Dresden GmbH
+   "^aosong,.*":
+     description: Guangzhou Aosong Electronic Co., Ltd.
    "^apm,.*":
      description: Applied Micro Circuits Corporation (APM)
    "^apple,.*":
      description: CompuLab Ltd.
    "^congatec,.*":
      description: congatec GmbH
 +  "^coolpi,.*":
 +    description: cool-pi.com
    "^coreriver,.*":
      description: CORERIVER Semiconductor Co.,Ltd.
    "^corpro,.*":
      description: Digi International Inc.
    "^digilent,.*":
      description: Diglent, Inc.
 +  "^dimonoff,.*":
 +    description: Dimonoff inc.
    "^diodes,.*":
      description: Diodes, Inc.
    "^dioo,.*":
      description: Fairphone B.V.
    "^faraday,.*":
      description: Faraday Technology Corporation
 +  "^fascontek,.*":
 +    description: Fascontek
    "^fastrax,.*":
      description: Fastrax Oy
    "^fcs,.*":
      description: Fujitsu Ltd.
    "^fxtec,.*":
      description: FX Technology Ltd.
 +  "^galaxycore,.*":
 +    description: GalaxyCore Inc.
    "^gardena,.*":
      description: GARDENA GmbH
    "^gateway,.*":
      description: Hewlett Packard Enterprise
    "^hsg,.*":
      description: HannStar Display Co.
 +  "^htc,.*":
 +    description: HTC Corporation
    "^huawei,.*":
      description: Huawei Technologies Co., Ltd.
    "^hugsun,.*":
      description: Shenzhen Roofull Technology Co, Ltd
    "^roseapplepi,.*":
      description: RoseapplePi.org
 +  "^rve,.*":
 +    description: Recharge VĂ©hicule Ă‰lectrique (RVE) inc.
    "^saef,.*":
      description: Saef Technology Limited
    "^samsung,.*":
      description: Skyworks Solutions, Inc.
    "^smartlabs,.*":
      description: SmartLabs LLC
 +  "^smi,.*":
 +    description: Silicon Motion Technology Corporation
    "^smsc,.*":
      description: Standard Microsystems Corporation
    "^snps,.*":
      description: Technologic Systems
    "^techstar,.*":
      description: Shenzhen Techstar Electronics Co., Ltd.
 +  "^techwell,.*":
 +    description: Techwell, Inc.
    "^teejet,.*":
      description: TeeJet
    "^teltonika,.*":
      description: TPO
    "^tq,.*":
      description: TQ-Systems GmbH
 +  "^transpeed,.*":
 +    description: Transpeed
    "^traverse,.*":
      description: Traverse Technologies Australia Pty Ltd
    "^tronfy,.*":
diff --combined MAINTAINERS
index 67d09557c956620d59ba055152967fa0b974698f,35147477e8e4e97e0ebccd1efc86fcb831e3d9e7..2d94c72c37422f56275fe86ef6481368fa0d38e3
@@@ -699,15 -699,6 +699,15 @@@ S:       Maintaine
  F:    Documentation/devicetree/bindings/media/allegro,al5e.yaml
  F:    drivers/media/platform/allegro-dvt/
  
 +ALLIED VISION ALVIUM CAMERA DRIVER
 +M:    Tommaso Merciai <[email protected]>
 +M:    Martin Hecht <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/media/i2c/alliedvision,alvium-csi2.yaml
 +F:    drivers/media/i2c/alvium-csi2.c
 +F:    drivers/media/i2c/alvium-csi2.h
 +
  ALLWINNER A10 CSI DRIVER
  M:    Maxime Ripard <[email protected]>
  L:    [email protected]
@@@ -890,6 -881,14 +890,14 @@@ Q:       https://patchwork.kernel.org/project
  F:    drivers/infiniband/hw/efa/
  F:    include/uapi/rdma/efa-abi.h
  
+ AMD AXI W1 DRIVER
+ M:    Kris Chaplin <[email protected]>
+ R:    Thomas Delev <[email protected]>
+ R:    Michal Simek <[email protected]>
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/w1/amd,axi-1wire-host.yaml
+ F:    drivers/w1/masters/amd_axi_w1.c
  AMD CDX BUS DRIVER
  M:    Nipun Gupta <[email protected]>
  M:    Nikhil Agarwal <[email protected]>
@@@ -1123,6 -1122,14 +1131,14 @@@ F:    Documentation/ABI/testing/sysfs-bus-
  F:    Documentation/devicetree/bindings/iio/adc/adi,ad4130.yaml
  F:    drivers/iio/adc/ad4130.c
  
+ ANALOG DEVICES INC AD7091R DRIVER
+ M:    Marcelo Schmitt <[email protected]>
+ L:    [email protected]
+ S:    Supported
+ W:    http://ez.analog.com/community/linux-device-drivers
+ F:    Documentation/devicetree/bindings/iio/adc/adi,ad7091r*
+ F:    drivers/iio/adc/drivers/iio/adc/ad7091r*
  ANALOG DEVICES INC AD7192 DRIVER
  M:    Alexandru Tachici <[email protected]>
  L:    [email protected]
@@@ -1693,6 -1700,11 +1709,6 @@@ S:     Odd Fixe
  F:    drivers/amba/
  F:    include/linux/amba/bus.h
  
 -ARM PRIMECELL CLCD PL110 DRIVER
 -M:    Russell King <[email protected]>
 -S:    Odd Fixes
 -F:    drivers/video/fbdev/amba-clcd.*
 -
  ARM PRIMECELL KMI PL050 DRIVER
  M:    Russell King <[email protected]>
  S:    Odd Fixes
@@@ -1935,6 -1947,7 +1951,6 @@@ F:      drivers/i2c/busses/i2c-pasemi-platfo
  F:    drivers/iommu/apple-dart.c
  F:    drivers/iommu/io-pgtable-dart.c
  F:    drivers/irqchip/irq-apple-aic.c
 -F:    drivers/mailbox/apple-mailbox.c
  F:    drivers/nvme/host/apple.c
  F:    drivers/nvmem/apple-efuses.c
  F:    drivers/pinctrl/pinctrl-apple-gpio.c
@@@ -1943,6 -1956,7 +1959,6 @@@ F:      drivers/soc/apple/
  F:    drivers/watchdog/apple_wdt.c
  F:    include/dt-bindings/interrupt-controller/apple-aic.h
  F:    include/dt-bindings/pinctrl/apple.h
 -F:    include/linux/apple-mailbox.h
  F:    include/linux/soc/apple/*
  
  ARM/ARTPEC MACHINE SUPPORT
  S:    Odd Fixes
  N:    clps711x
  
 -ARM/CIRRUS LOGIC EDB9315A MACHINE SUPPORT
 -M:    Lennert Buytenhek <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/CIRRUS LOGIC EP93XX ARM ARCHITECTURE
  M:    Hartley Sweeten <[email protected]>
  M:    Alexander Sverdlin <[email protected]>
@@@ -2048,7 -2067,6 +2064,6 @@@ ARM/CORESIGHT FRAMEWORK AND DRIVER
  M:    Suzuki K Poulose <[email protected]>
  R:    Mike Leach <[email protected]>
  R:    James Clark <[email protected]>
- R:    Leo Yan <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
@@@ -2304,7 -2322,6 +2319,7 @@@ F:      arch/arm/mach-dove
  F:    arch/arm/mach-mv78xx0/
  F:    arch/arm/mach-orion5x/
  F:    arch/arm/plat-orion/
 +F:    drivers/bus/mvebu-mbus.c
  F:    drivers/soc/dove/
  
  ARM/Marvell Kirkwood and Armada 370, 375, 38x, 39x, XP, 3700, 7K/8K, CN9130 SOC support
@@@ -2319,7 -2336,8 +2334,7 @@@ F:      arch/arm/boot/dts/marvell/armada
  F:    arch/arm/boot/dts/marvell/kirkwood*
  F:    arch/arm/configs/mvebu_*_defconfig
  F:    arch/arm/mach-mvebu/
 -F:    arch/arm64/boot/dts/marvell/armada*
 -F:    arch/arm64/boot/dts/marvell/cn913*
 +F:    arch/arm64/boot/dts/marvell/
  F:    drivers/clk/mvebu/
  F:    drivers/cpufreq/armada-37xx-cpufreq.c
  F:    drivers/cpufreq/armada-8k-cpufreq.c
@@@ -2391,6 -2409,7 +2406,6 @@@ F:      drivers/memory/atmel
  F:    drivers/watchdog/sama5d4_wdt.c
  F:    include/soc/at91/
  X:    drivers/input/touchscreen/atmel_mxt_ts.c
 -X:    drivers/net/wireless/atmel/
  N:    at91
  N:    atmel
  
@@@ -2542,6 -2561,7 +2557,6 @@@ F:      arch/arm64/boot/dts/qcom/sc7280
  F:    arch/arm64/boot/dts/qcom/sdm845-cheza*
  
  ARM/QUALCOMM SUPPORT
 -M:    Andy Gross <[email protected]>
  M:    Bjorn Andersson <[email protected]>
  M:    Konrad Dybcio <[email protected]>
  L:    [email protected]
@@@ -2821,6 -2841,7 +2836,6 @@@ F:      Documentation/devicetree/bindings/in
  F:    Documentation/devicetree/bindings/reset/sunplus,reset.yaml
  F:    arch/arm/boot/dts/sunplus/
  F:    arch/arm/configs/sp7021_*defconfig
 -F:    arch/arm/mach-sunplus/
  F:    drivers/clk/clk-sp7021.c
  F:    drivers/irqchip/irq-sp7021-intc.c
  F:    drivers/reset/reset-sunplus.c
@@@ -2836,6 -2857,11 +2851,6 @@@ F:     arch/arm/boot/dts/synaptics
  F:    arch/arm/mach-berlin/
  F:    arch/arm64/boot/dts/synaptics/
  
 -ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
 -M:    Lennert Buytenhek <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/TEGRA HDMI CEC SUBSYSTEM SUPPORT
  M:    Hans Verkuil <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    arch/arm64/boot/dts/tesla/
  
 -ARM/TETON BGA MACHINE SUPPORT
 -M:    "Mark F. Brown" <[email protected]>
 -L:    [email protected] (moderated for non-subscribers)
 -S:    Maintained
 -
  ARM/TEXAS INSTRUMENT AEMIF/EMIF DRIVERS
  M:    Santosh Shilimkar <[email protected]>
  L:    [email protected]
@@@ -2930,6 -2961,7 +2945,6 @@@ F:      Documentation/devicetree/bindings/pi
  F:    Documentation/devicetree/bindings/soc/socionext/socionext,uniphier*.yaml
  F:    arch/arm/boot/dts/socionext/uniphier*
  F:    arch/arm/include/asm/hardware/cache-uniphier.h
 -F:    arch/arm/mach-uniphier/
  F:    arch/arm/mm/cache-uniphier.c
  F:    arch/arm64/boot/dts/socionext/uniphier*
  F:    drivers/bus/uniphier-system-bus.c
@@@ -2992,7 -3024,6 +3007,7 @@@ F:      Documentation/devicetree/bindings/i2
  F:    Documentation/devicetree/bindings/i2c/xlnx,xps-iic-2.00.a.yaml
  F:    Documentation/devicetree/bindings/memory-controllers/snps,dw-umctl2-ddrc.yaml
  F:    Documentation/devicetree/bindings/memory-controllers/xlnx,zynq-ddrc-a05.yaml
 +F:    Documentation/devicetree/bindings/soc/xilinx/xilinx.yaml
  F:    Documentation/devicetree/bindings/spi/xlnx,zynq-qspi.yaml
  F:    arch/arm/mach-zynq/
  F:    drivers/clocksource/timer-cadence-ttc.c
@@@ -3044,6 -3075,13 +3059,13 @@@ S:    Supporte
  W:    http://www.akm.com/
  F:    drivers/iio/magnetometer/ak8974.c
  
+ AOSONG AGS02MA TVOC SENSOR DRIVER
+ M:    Anshul Dalal <[email protected]>
+ L:    [email protected]
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/iio/chemical/aosong,ags02ma.yaml
+ F:    drivers/iio/chemical/ags02ma.c
  ASC7621 HARDWARE MONITOR DRIVER
  M:    George Joseph <[email protected]>
  L:    [email protected]
@@@ -3057,14 -3095,6 +3079,14 @@@ S:    Maintaine
  F:    Documentation/devicetree/bindings/net/asix,ax88796c.yaml
  F:    drivers/net/ethernet/asix/ax88796c_*
  
 +ASIX PHY DRIVER [RUST]
 +M:    FUJITA Tomonori <[email protected]>
 +R:    Trevor Gross <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/net/phy/ax88796b_rust.rs
 +
  ASPEED CRYPTO DRIVER
  M:    Neal Liu <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
@@@ -3290,6 -3320,13 +3312,6 @@@ T:     git git://github.com/ndyer/linux.gi
  F:    Documentation/devicetree/bindings/input/atmel,maxtouch.yaml
  F:    drivers/input/touchscreen/atmel_mxt_ts.c
  
 -ATMEL WIRELESS DRIVER
 -L:    [email protected]
 -S:    Orphan
 -W:    http://www.thekelleys.org.uk/atmel
 -W:    http://atmelwlandriver.sourceforge.net/
 -F:    drivers/net/wireless/atmel/atmel*
 -
  ATOMIC INFRASTRUCTURE
  M:    Will Deacon <[email protected]>
  M:    Peter Zijlstra <[email protected]>
@@@ -3324,17 -3361,13 +3346,17 @@@ M:   Eric Paris <[email protected]
  L:    [email protected]
  S:    Supported
  W:    https://github.com/linux-audit
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/audit.git
 +Q:    https://patchwork.kernel.org/project/audit/list
 +B:    mailto:[email protected]
 +P:    https://github.com/linux-audit/audit-kernel/blob/main/README.md
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/audit.git
  F:    include/asm-generic/audit_*.h
  F:    include/linux/audit.h
  F:    include/linux/audit_arch.h
  F:    include/uapi/linux/audit.h
  F:    kernel/audit*
  F:    lib/*audit.c
 +K:    \baudit_[a-z_0-9]\+\b
  
  AUXILIARY BUS DRIVER
  M:    Greg Kroah-Hartman <[email protected]>
@@@ -3393,16 -3426,6 +3415,16 @@@ W:    https://ez.analog.com/linux-software
  F:    Documentation/devicetree/bindings/hwmon/adi,axi-fan-control.yaml
  F:    drivers/hwmon/axi-fan-control.c
  
 +AXI SPI ENGINE
 +M:    Michael Hennerich <[email protected]>
 +M:    Nuno SĂ¡ <[email protected]>
 +R:    David Lechner <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +W:    https://ez.analog.com/linux-software-drivers
 +F:    Documentation/devicetree/bindings/spi/adi,axi-spi-engine.yaml
 +F:    drivers/spi/spi-axi-spi-engine.c
 +
  AXXIA I2C CONTROLLER
  M:    Krzysztof Adamski <[email protected]>
  L:    [email protected]
@@@ -3455,14 -3478,6 +3477,14 @@@ F:    drivers/video/backlight
  F:    include/linux/backlight.h
  F:    include/linux/pwm_backlight.h
  
 +BAIKAL-T1 PVT HARDWARE MONITOR DRIVER
 +M:    Serge Semin <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +F:    Documentation/devicetree/bindings/hwmon/baikal,bt1-pvt.yaml
 +F:    Documentation/hwmon/bt1-pvt.rst
 +F:    drivers/hwmon/bt1-pvt.[ch]
 +
  BARCO P50 GPIO DRIVER
  M:    Santosh Kumar Yadav <[email protected]>
  M:    Peter Korsgaard <[email protected]>
@@@ -3495,7 -3510,7 +3517,7 @@@ F:      drivers/net/hamradio/baycom
  
  BCACHE (BLOCK LAYER CACHE)
  M:    Coly Li <[email protected]>
 -M:    Kent Overstreet <kent.overstreet@gmail.com>
 +M:    Kent Overstreet <kent.overstreet@linux.dev>
  L:    [email protected]
  S:    Maintained
  W:    http://bcache.evilpiepirate.org
@@@ -3643,6 -3658,13 +3665,13 @@@ S:    Maintaine
  F:    Documentation/devicetree/bindings/iio/accel/bosch,bma400.yaml
  F:    drivers/iio/accel/bma400*
  
+ BOSCH SENSORTEC BMI323 IMU IIO DRIVER
+ M:    Jagath Jog J <[email protected]>
+ L:    [email protected]
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/iio/imu/bosch,bmi323.yaml
+ F:    drivers/iio/imu/bmi323/
  BPF JIT for ARM
  M:    Russell King <[email protected]>
  M:    Puranjay Mohan <[email protected]>
@@@ -4134,6 -4156,7 +4163,6 @@@ M:      Franky Lin <[email protected]
  M:    Hante Meuleman <[email protected]>
  L:    [email protected]
  L:    [email protected]
 -L:    [email protected]
  S:    Supported
  F:    drivers/net/wireless/broadcom/brcm80211/
  
@@@ -5164,7 -5187,7 +5193,7 @@@ M:      Philipp Zabel <[email protected]
  L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/media/coda.yaml
 -F:    drivers/media/platform/chips-media/
 +F:    drivers/media/platform/chips-media/coda
  
  CODE OF CONDUCT
  M:    Greg Kroah-Hartman <[email protected]>
@@@ -5268,10 -5291,10 +5297,10 @@@ W:   http://accessrunner.sourceforge.net
  F:    drivers/usb/atm/cxacru.c
  
  CONFIDENTIAL COMPUTING THREAT MODEL FOR X86 VIRTUALIZATION (SNP/TDX)
 -M:    Elena Reshetova <[email protected]>
 -M:    Carlos Bilbao <[email protected]>
 -S:    Maintained
 -F:    Documentation/security/snp-tdx-threat-model.rst
 +M:    Elena Reshetova <[email protected]>
 +M:    Carlos Bilbao <[email protected]>
 +S:    Maintained
 +F:    Documentation/security/snp-tdx-threat-model.rst
  
  CONFIGFS
  M:    Joel Becker <[email protected]>
@@@ -5346,7 -5369,6 +5375,7 @@@ L:      [email protected]
  S:    Maintained
  F:    mm/memcontrol.c
  F:    mm/swap_cgroup.c
 +F:    samples/cgroup/*
  F:    tools/testing/selftests/cgroup/memcg_protection.m
  F:    tools/testing/selftests/cgroup/test_hugetlb_memcg.c
  F:    tools/testing/selftests/cgroup/test_kmem.c
@@@ -5384,6 -5406,12 +5413,12 @@@ F:    include/linux/counter.
  F:    include/uapi/linux/counter.h
  F:    tools/counter/
  
+ COUNTER WATCH EVENTS TOOL
+ M:    Fabrice Gasnier <[email protected]>
+ L:    [email protected]
+ S:    Maintained
+ F:    tools/counter/counter_watch_events.c
  CP2615 I2C DRIVER
  M:    Bence CsĂ³kĂ¡s <[email protected]>
  S:    Maintained
@@@ -5531,12 -5559,6 +5566,12 @@@ F:    include/crypto
  F:    include/linux/crypto*
  F:    lib/crypto/
  
 +CRYPTO SPEED TEST COMPARE
 +M:    Wang Jinchao <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    tools/crypto/tcrypt/tcrypt_speed_compare.py
 +
  CRYPTOGRAPHIC RANDOM NUMBER GENERATOR
  M:    Neil Horman <[email protected]>
  L:    [email protected]
@@@ -5896,7 -5918,7 +5931,7 @@@ DELL SYSTEMS MANAGEMENT BASE DRIVER (dc
  M:    Stuart Hayes <[email protected]>
  L:    [email protected]
  S:    Maintained
 -F:    Documentation/driver-api/dcdbas.rst
 +F:    Documentation/userspace-api/dcdbas.rst
  F:    drivers/platform/x86/dell/dcdbas.*
  
  DELL WMI DDV DRIVER
@@@ -6063,8 -6085,10 +6098,8 @@@ M:     Mikulas Patocka <[email protected]
  M:    [email protected]
  L:    [email protected]
  S:    Maintained
 -W:    http://sources.redhat.com/dm
  Q:    http://patchwork.kernel.org/project/dm-devel/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git
 -T:    quilt http://people.redhat.com/agk/patches/linux/editing/
  F:    Documentation/admin-guide/device-mapper/
  F:    drivers/md/Kconfig
  F:    drivers/md/Makefile
@@@ -6110,7 -6134,7 +6145,7 @@@ F:      Documentation/devicetree/bindings/re
  F:    Documentation/devicetree/bindings/regulator/dlg,slg51000.yaml
  F:    Documentation/devicetree/bindings/sound/da[79]*.txt
  F:    Documentation/devicetree/bindings/thermal/da90??-thermal.txt
 -F:    Documentation/devicetree/bindings/watchdog/da90??-wdt.txt
 +F:    Documentation/devicetree/bindings/watchdog/dlg,da90??-watchdog.yaml
  F:    Documentation/hwmon/da90??.rst
  F:    drivers/gpio/gpio-da90??.c
  F:    drivers/hwmon/da90??-hwmon.c
@@@ -6496,7 -6520,8 +6531,7 @@@ T:      git git://anongit.freedesktop.org/dr
  F:    drivers/gpu/drm/sun4i/sun8i*
  
  DRM DRIVER FOR ARM PL111 CLCD
 -M:    Emma Anholt <[email protected]>
 -S:    Supported
 +S:    Orphan
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    drivers/gpu/drm/pl111/
  
@@@ -6611,7 -6636,8 +6646,7 @@@ F:      Documentation/devicetree/bindings/di
  F:    drivers/gpu/drm/panel/panel-himax-hx8394.c
  
  DRM DRIVER FOR HX8357D PANELS
 -M:    Emma Anholt <[email protected]>
 -S:    Maintained
 +S:    Orphan
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    Documentation/devicetree/bindings/display/himax,hx8357d.txt
  F:    drivers/gpu/drm/tiny/hx8357d.c
@@@ -6638,12 -6664,6 +6673,12 @@@ T:    git git://anongit.freedesktop.org/dr
  F:    Documentation/devicetree/bindings/display/ilitek,ili9486.yaml
  F:    drivers/gpu/drm/tiny/ili9486.c
  
 +DRM DRIVER FOR ILITEK ILI9805 PANELS
 +M:    Michael Trimarchi <[email protected]>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/display/panel/ilitek,ili9805.yaml
 +F:    drivers/gpu/drm/panel/panel-ilitek-ili9805.c
 +
  DRM DRIVER FOR JADARD JD9365DA-H3 MIPI-DSI LCD PANELS
  M:    Jagan Teki <[email protected]>
  S:    Maintained
@@@ -6872,12 -6892,6 +6907,12 @@@ T:    git git://anongit.freedesktop.org/dr
  F:    Documentation/devicetree/bindings/display/ste,mcde.yaml
  F:    drivers/gpu/drm/mcde/
  
 +DRM DRIVER FOR SYNAPTICS R63353 PANELS
 +M:    Michael Trimarchi <[email protected]>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/display/panel/synaptics,r63353.yaml
 +F:    drivers/gpu/drm/panel/panel-synaptics-r63353.c
 +
  DRM DRIVER FOR TI DLPC3433 MIPI DSI TO DMD BRIDGE
  M:    Jagan Teki <[email protected]>
  S:    Maintained
@@@ -6925,8 -6939,8 +6960,8 @@@ T:      git git://anongit.freedesktop.org/dr
  F:    drivers/gpu/drm/vboxvideo/
  
  DRM DRIVER FOR VMWARE VIRTUAL GPU
 -M:    Zack Rusin <zackr@vmware.com>
 -R:    VMware Graphics Reviewers <linux-graphics-maintainer@vmware.com>
 +M:    Zack Rusin <zack.rusin@broadcom.com>
 +R:    Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
  L:    [email protected]
  S:    Supported
  T:    git git://anongit.freedesktop.org/drm/drm-misc
@@@ -7162,7 -7176,6 +7197,7 @@@ F:      include/linux/platform_data/shmob_dr
  DRM DRIVERS FOR ROCKCHIP
  M:    Sandy Huang <[email protected]>
  M:    Heiko StĂ¼bner <[email protected]>
 +M:    Andy Yan <[email protected]>
  L:    [email protected]
  S:    Maintained
  T:    git git://anongit.freedesktop.org/drm/drm-misc
@@@ -7217,8 -7230,8 +7252,8 @@@ F:      Documentation/devicetree/bindings/di
  F:    drivers/gpu/drm/omapdrm/
  
  DRM DRIVERS FOR V3D
 -M:    Emma Anholt <[email protected]>
  M:    Melissa Wen <[email protected]>
 +M:    MaĂ­ra Canal <[email protected]>
  S:    Supported
  T:    git git://anongit.freedesktop.org/drm/drm-misc
  F:    Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
@@@ -7226,6 -7239,7 +7261,6 @@@ F:      drivers/gpu/drm/v3d
  F:    include/uapi/drm/v3d_drm.h
  
  DRM DRIVERS FOR VC4
 -M:    Emma Anholt <[email protected]>
  M:    Maxime Ripard <[email protected]>
  S:    Supported
  T:    git git://github.com/anholt/linux
@@@ -7902,14 -7916,6 +7937,14 @@@ F:    include/uapi/linux/mdio.
  F:    include/uapi/linux/mii.h
  F:    net/core/of_net.c
  
 +ETHERNET PHY LIBRARY [RUST]
 +M:    FUJITA Tomonori <[email protected]>
 +R:    Trevor Gross <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Maintained
 +F:    rust/kernel/net/phy.rs
 +
  EXEC & BINFMT API
  R:    Eric Biederman <[email protected]>
  R:    Kees Cook <[email protected]>
@@@ -7957,7 -7963,6 +7992,7 @@@ F:      include/uapi/linux/ext4.
  
  Extended Verification Module (EVM)
  M:    Mimi Zohar <[email protected]>
 +M:    Roberto Sassu <[email protected]>
  L:    [email protected]
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git
@@@ -8136,7 -8141,6 +8171,7 @@@ F:      include/trace/events/fs_dax.
  FILESYSTEMS (VFS and infrastructure)
  M:    Alexander Viro <[email protected]>
  M:    Christian Brauner <[email protected]>
 +R:    Jan Kara <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    fs/*
@@@ -8157,16 -8161,6 +8192,16 @@@ F:    fs/exportfs
  F:    fs/fhandle.c
  F:    include/linux/exportfs.h
  
 +FILESYSTEMS [IDMAPPED MOUNTS]
 +M:    Christian Brauner <[email protected]>
 +M:    Seth Forshee <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/filesystems/idmappings.rst
 +F:    fs/mnt_idmapping.c
 +F:    include/linux/mnt_idmapping.*
 +F:    tools/testing/selftests/mount_setattr/
 +
  FILESYSTEMS [IOMAP]
  M:    Christian Brauner <[email protected]>
  R:    Darrick J. Wong <[email protected]>
@@@ -8176,15 -8170,6 +8211,15 @@@ S:    Supporte
  F:    fs/iomap/
  F:    include/linux/iomap.h
  
 +FILESYSTEMS [STACKABLE]
 +M:    Miklos Szeredi <[email protected]>
 +M:    Amir Goldstein <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Maintained
 +F:    fs/backing-file.c
 +F:    include/linux/backing-file.h
 +
  FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
  M:    Riku Voipio <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    drivers/input/joystick/fsia6b.c
  
 -FOCUSRITE SCARLETT GEN 2/3 MIXER DRIVER
 +FOCUSRITE SCARLETT2 MIXER DRIVER (Scarlett Gen 2+ and Clarett)
  M:    Geoffrey D. Bennett <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
 +W:    https://github.com/geoffreybennett/scarlett-gen2
 +B:    https://github.com/geoffreybennett/scarlett-gen2/issues
 +T:    git https://github.com/geoffreybennett/scarlett-gen2.git
 +F:    include/uapi/sound/scarlett2.h
  F:    sound/usb/mixer_scarlett2.c
  
  FORCEDETH GIGABIT ETHERNET DRIVER
@@@ -8583,6 -8565,7 +8618,6 @@@ L:      [email protected]
  S:    Maintained
  F:    sound/soc/fsl/fsl*
  F:    sound/soc/fsl/imx*
 -F:    sound/soc/fsl/mpc8610_hpcd.c
  
  FREESCALE SOC SOUND QMC DRIVER
  M:    Herve Codina <[email protected]>
@@@ -8761,21 -8744,6 +8796,21 @@@ F:    kernel/futex/
  F:    tools/perf/bench/futex*
  F:    tools/testing/selftests/futex/
  
 +GALAXYCORE GC0308 CAMERA SENSOR DRIVER
 +M:    Sebastian Reichel <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/media/i2c/galaxycore,gc0308.yaml
 +F:    drivers/media/i2c/gc0308.c
 +
 +GALAXYCORE GC2145 SENSOR DRIVER
 +M:    Alain Volmat <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/galaxycore,gc2145.yaml
 +F:    drivers/media/i2c/gc2145.c
 +
  GATEWORKS SYSTEM CONTROLLER (GSC) DRIVER
  M:    Tim Harvey <[email protected]>
  S:    Maintained
@@@ -8894,13 -8862,21 +8929,13 @@@ F:   Documentation/devicetree/bindings/i2
  F:    drivers/i2c/muxes/i2c-demux-pinctrl.c
  
  GENERIC PM DOMAINS
 -M:    "Rafael J. Wysocki" <[email protected]>
 -M:    Kevin Hilman <[email protected]>
  M:    Ulf Hansson <[email protected]>
  L:    [email protected]
  S:    Supported
  F:    Documentation/devicetree/bindings/power/power?domain*
 -F:    drivers/base/power/domain*.c
 -F:    include/linux/pm_domain.h
 -
 -GENERIC PM DOMAIN PROVIDERS
 -M:    Ulf Hansson <[email protected]>
 -L:    [email protected]
 -S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm.git
  F:    drivers/pmdomain/
 +F:    include/linux/pm_domain.h
  
  GENERIC RADIX TREE
  M:    Kent Overstreet <[email protected]>
@@@ -8967,13 -8943,6 +9002,13 @@@ F:    Documentation/filesystems/gfs2
  F:    fs/gfs2/
  F:    include/uapi/linux/gfs2_ondisk.h
  
 +GIGABYTE WATERFORCE SENSOR DRIVER
 +M:    Aleksa Savic <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/hwmon/gigabyte_waterforce.rst
 +F:    drivers/hwmon/gigabyte_waterforce.c
 +
  GIGABYTE WMI DRIVER
  M:    Thomas WeiĂŸschuh <[email protected]>
  L:    [email protected]
@@@ -9020,16 -8989,6 +9055,16 @@@ S:    Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux.git
  F:    drivers/firmware/google/
  
 +GOOGLE TENSOR SoC SUPPORT
 +M:    Peter Griffin <[email protected]>
 +L:    [email protected] (moderated for non-subscribers)
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/clock/google,gs101-clock.yaml
 +F:    arch/arm64/boot/dts/exynos/google/
 +F:    drivers/clk/samsung/clk-gs101.c
 +F:    include/dt-bindings/clock/google,gs101.h
 +
  GPD POCKET FAN DRIVER
  M:    Hans de Goede <[email protected]>
  L:    [email protected]
@@@ -9069,7 -9028,7 +9104,7 @@@ F:      drivers/gpio/gpio-mockup.
  F:    tools/testing/selftests/gpio/
  
  GPIO REGMAP
 -M:    Michael Walle <m[email protected]>
 +M:    Michael Walle <m[email protected]>
  S:    Maintained
  F:    drivers/gpio/gpio-regmap.c
  F:    include/linux/gpio/regmap.h
@@@ -9078,9 -9037,12 +9113,9 @@@ K:     (devm_)?gpio_regmap_(un)?registe
  GPIO SUBSYSTEM
  M:    Linus Walleij <[email protected]>
  M:    Bartosz Golaszewski <[email protected]>
 -R:    Andy Shevchenko <[email protected]>
  L:    [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git
 -F:    Documentation/ABI/obsolete/sysfs-gpio
 -F:    Documentation/ABI/testing/gpio-cdev
  F:    Documentation/admin-guide/gpio/
  F:    Documentation/devicetree/bindings/gpio/
  F:    Documentation/driver-api/gpio/
@@@ -9089,16 -9051,6 +9124,16 @@@ F:    include/dt-bindings/gpio
  F:    include/linux/gpio.h
  F:    include/linux/gpio/
  F:    include/linux/of_gpio.h
 +
 +GPIO UAPI
 +M:    Bartosz Golaszewski <[email protected]>
 +R:    Kent Gibson <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git
 +F:    Documentation/ABI/obsolete/sysfs-gpio
 +F:    Documentation/ABI/testing/gpio-cdev
 +F:    drivers/gpio/gpiolib-cdev.c
  F:    include/uapi/linux/gpio.h
  F:    tools/gpio/
  
@@@ -9341,6 -9293,7 +9376,6 @@@ F:      drivers/char/hw_random
  F:    include/linux/hw_random.h
  
  HARDWARE SPINLOCK CORE
 -M:    Ohad Ben-Cohen <[email protected]>
  M:    Bjorn Andersson <[email protected]>
  R:    Baolin Wang <[email protected]>
  L:    [email protected]
@@@ -9569,7 -9522,6 +9604,7 @@@ F:      Documentation/devicetree/bindings/gp
  F:    drivers/gpio/gpio-hisi.c
  
  HISILICON HIGH PERFORMANCE RSA ENGINE DRIVER (HPRE)
 +M:    Zhiqi Song <[email protected]>
  M:    Longfang Liu <[email protected]>
  L:    [email protected]
  S:    Maintained
@@@ -9609,7 -9561,6 +9644,7 @@@ F:      drivers/bus/hisi_lpc.
  HISILICON NETWORK SUBSYSTEM 3 DRIVER (HNS3)
  M:    Yisen Zhuang <[email protected]>
  M:    Salil Mehta <[email protected]>
 +M:    Jijie Shao <[email protected]>
  L:    [email protected]
  S:    Maintained
  W:    http://www.hisilicon.com
@@@ -9672,6 -9623,7 +9707,6 @@@ F:      Documentation/devicetree/bindings/sc
  F:    drivers/scsi/hisi_sas/
  
  HISILICON SECURITY ENGINE V2 DRIVER (SEC2)
 -M:    Kai Ye <[email protected]>
  M:    Longfang Liu <[email protected]>
  L:    [email protected]
  S:    Maintained
@@@ -9731,6 -9683,13 +9766,13 @@@ F:    lib/test_hmm
  F:    mm/hmm*
  F:    tools/testing/selftests/mm/*hmm*
  
+ HONEYWELL HSC030PA PRESSURE SENSOR SERIES IIO DRIVER
+ M:    Petre Rodan <[email protected]>
+ L:    [email protected]
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/iio/pressure/honeywell,hsc030pa.yaml
+ F:    drivers/iio/pressure/hsc030pa*
  HONEYWELL MPRLS0025PA PRESSURE SENSOR SERIES IIO DRIVER
  M:    Andreas Klinger <[email protected]>
  L:    [email protected]
@@@ -9738,6 -9697,11 +9780,6 @@@ S:     Maintaine
  F:    Documentation/devicetree/bindings/iio/pressure/honeywell,mprls0025pa.yaml
  F:    drivers/iio/pressure/mprls0025pa.c
  
 -HOST AP DRIVER
 -L:    [email protected]
 -S:    Obsolete
 -F:    drivers/net/wireless/intersil/hostap/
 -
  HP BIOSCFG DRIVER
  M:    Jorge Lopez <[email protected]>
  L:    [email protected]
@@@ -9840,6 -9804,7 +9882,6 @@@ F:      Documentation/networking/device_driv
  F:    drivers/net/ethernet/huawei/hinic/
  
  HUGETLB SUBSYSTEM
 -M:    Mike Kravetz <[email protected]>
  M:    Muchun Song <[email protected]>
  L:    [email protected]
  S:    Maintained
@@@ -9863,8 -9828,8 +9905,8 @@@ T:      git git://linuxtv.org/media_tree.gi
  F:    drivers/media/platform/st/sti/hva
  
  HWPOISON MEMORY FAILURE HANDLING
 -M:    Naoya Horiguchi <naoya.horiguchi@nec.com>
 -R:    Miaohe Lin <linmiaohe@huawei.com>
 +M:    Miaohe Lin <linmiaohe@huawei.com>
 +R:    Naoya Horiguchi <naoya.horiguchi@nec.com>
  L:    [email protected]
  S:    Maintained
  F:    mm/hwpoison-inject.c
@@@ -10275,6 -10240,16 +10317,6 @@@ S:  Maintaine
  W:    https://github.com/o2genum/ideapad-slidebar
  F:    drivers/input/misc/ideapad_slidebar.c
  
 -IDMAPPED MOUNTS
 -M:    Christian Brauner <[email protected]>
 -M:    Seth Forshee <[email protected]>
 -L:    [email protected]
 -S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/vfs/idmapping.git
 -F:    Documentation/filesystems/idmappings.rst
 -F:    include/linux/mnt_idmapping.*
 -F:    tools/testing/selftests/mount_setattr/
 -
  IDT VersaClock 5 CLOCK DRIVER
  M:    Luca Ceresoli <[email protected]>
  S:    Maintained
@@@ -10346,8 -10321,8 +10388,8 @@@ IIO LIGHT SENSOR GAIN-TIME-SCALE HELPER
  M:    Matti Vaittinen <[email protected]>
  L:    [email protected]
  S:    Maintained
- F:    drivers/iio/light/gain-time-scale-helper.c
- F:    drivers/iio/light/gain-time-scale-helper.h
+ F:    drivers/iio/industrialio-gts-helper.c
+ F:    include/linux/iio/iio-gts-helper.h
  
  IIO MULTIPLEXER
  M:    Peter Rosin <[email protected]>
@@@ -10408,17 -10383,6 +10450,17 @@@ IMGTEC IR DECODER DRIVE
  S:    Orphan
  F:    drivers/media/rc/img-ir/
  
 +IMGTEC POWERVR DRM DRIVER
 +M:    Frank Binns <[email protected]>
 +M:    Donald Robson <[email protected]>
 +M:    Matt Coster <[email protected]>
 +S:    Supported
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    Documentation/devicetree/bindings/gpu/img,powervr.yaml
 +F:    Documentation/gpu/imagination/
 +F:    drivers/gpu/drm/imagination/
 +F:    include/uapi/drm/pvr_drm.h
 +
  IMON SOUNDGRAPH USB IR RECEIVER
  M:    Sean Young <[email protected]>
  L:    [email protected]
@@@ -10578,9 -10542,7 +10620,9 @@@ F:   drivers/crypto/inside-secure
  
  INTEGRITY MEASUREMENT ARCHITECTURE (IMA)
  M:    Mimi Zohar <[email protected]>
 +M:    Roberto Sassu <[email protected]>
  M:    Dmitry Kasatkin <[email protected]>
 +R:    Eric Snowberg <[email protected]>
  L:    [email protected]
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git
@@@ -10658,26 -10620,16 +10700,26 @@@ L:        [email protected]
  S:    Supported
  F:    arch/x86/include/asm/intel-family.h
  
 -INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets)
 +INTEL DRM DISPLAY FOR XE AND I915 DRIVERS
 +M:    Jani Nikula <[email protected]>
 +M:    Rodrigo Vivi <[email protected]>
 +L:    [email protected]
 +L:    [email protected]
 +S:    Supported
 +F:    drivers/gpu/drm/i915/display/
 +F:    drivers/gpu/drm/xe/display/
 +F:    drivers/gpu/drm/xe/compat-i915-headers
 +
 +INTEL DRM I915 DRIVER (Meteor Lake, DG2 and older excluding Poulsbo, Moorestown and derivative)
  M:    Jani Nikula <[email protected]>
  M:    Joonas Lahtinen <[email protected]>
  M:    Rodrigo Vivi <[email protected]>
  M:    Tvrtko Ursulin <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    https://01.org/linuxgraphics/
 +W:    https://drm.pages.freedesktop.org/intel-docs/
  Q:    http://patchwork.freedesktop.org/project/intel-gfx/
 -B:    https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs
 +B:    https://drm.pages.freedesktop.org/intel-docs/how-to-file-i915-bugs.html
  C:    irc://irc.oftc.net/intel-gfx
  T:    git git://anongit.freedesktop.org/drm-intel
  F:    Documentation/ABI/testing/sysfs-driver-intel-i915-hwmon
@@@ -10687,23 -10639,6 +10729,23 @@@ F: drivers/gpu/drm/i915
  F:    include/drm/i915*
  F:    include/uapi/drm/i915_drm.h
  
 +INTEL DRM XE DRIVER (Lunar Lake and newer)
 +M:    Lucas De Marchi <[email protected]>
 +M:    Oded Gabbay <[email protected]>
 +M:    Thomas Hellström <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +W:    https://drm.pages.freedesktop.org/intel-docs/
 +Q:    http://patchwork.freedesktop.org/project/intel-xe/
 +B:    https://gitlab.freedesktop.org/drm/xe/kernel/-/issues
 +C:    irc://irc.oftc.net/xe
 +T:    git https://gitlab.freedesktop.org/drm/xe/kernel.git
 +F:    Documentation/ABI/testing/sysfs-driver-intel-xe-hwmon
 +F:    Documentation/gpu/xe/
 +F:    drivers/gpu/drm/xe/
 +F:    include/drm/xe*
 +F:    include/uapi/drm/xe_drm.h
 +
  INTEL ETHERNET DRIVERS
  M:    Jesse Brandeburg <[email protected]>
  M:    Tony Nguyen <[email protected]>
@@@ -10727,6 -10662,13 +10769,6 @@@ S:  Supporte
  F:    drivers/infiniband/hw/irdma/
  F:    include/uapi/rdma/irdma-abi.h
  
 -INTEL FRAMEBUFFER DRIVER (excluding 810 and 815)
 -M:    Maik Broemme <[email protected]>
 -L:    [email protected]
 -S:    Maintained
 -F:    Documentation/fb/intelfb.rst
 -F:    drivers/video/fbdev/intelfb/
 -
  INTEL GPIO DRIVERS
  M:    Andy Shevchenko <[email protected]>
  L:    [email protected]
@@@ -10740,7 -10682,6 +10782,7 @@@ F:   drivers/gpio/gpio-pch.
  F:    drivers/gpio/gpio-sch.c
  F:    drivers/gpio/gpio-sodaville.c
  F:    drivers/gpio/gpio-tangier.c
 +F:    drivers/gpio/gpio-tangier.h
  
  INTEL GVT-g DRIVERS (Intel GPU Virtualization)
  M:    Zhenyu Wang <[email protected]>
@@@ -10766,13 -10707,6 +10808,13 @@@ S: Supporte
  Q:    https://patchwork.kernel.org/project/linux-dmaengine/list/
  F:    drivers/dma/ioat*
  
 +INTEL IAA CRYPTO DRIVER
 +M:    Tom Zanussi <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +F:    Documentation/driver-api/crypto/iaa/iaa-crypto.rst
 +F:    drivers/crypto/intel/iaa/*
 +
  INTEL IDLE DRIVER
  M:    Jacob Pan <[email protected]>
  M:    Len Brown <[email protected]>
@@@ -11071,7 -11005,6 +11113,7 @@@ F:   drivers/net/wireless/intel/iwlegacy
  
  INTEL WIRELESS WIFI LINK (iwlwifi)
  M:    Gregory Greenman <[email protected]>
 +M:    Miri Korenblit <[email protected]>
  L:    [email protected]
  S:    Supported
  W:    https://wireless.wiki.kernel.org/en/users/drivers/iwlwifi
  S:    Maintained
  T:    git git://git.kernel.dk/linux-block
  T:    git git://git.kernel.dk/liburing
 +F:    include/linux/io_uring/
  F:    include/linux/io_uring.h
  F:    include/linux/io_uring_types.h
  F:    include/trace/events/io_uring.h
@@@ -11307,7 -11239,7 +11349,7 @@@ F:   drivers/media/radio/radio-isa
  ISAPNP
  M:    Jaroslav Kysela <[email protected]>
  S:    Maintained
 -F:    Documentation/driver-api/isapnp.rst
 +F:    Documentation/userspace-api/isapnp.rst
  F:    drivers/pnp/isapnp/
  F:    include/linux/isapnp.h
  
@@@ -11580,7 -11512,6 +11622,7 @@@ F:   scripts/*vmlinux
  F:    scripts/Kbuild*
  F:    scripts/Makefile*
  F:    scripts/basic/
 +F:    scripts/clang-tools/
  F:    scripts/dummy-tools/
  F:    scripts/mk*
  F:    scripts/mod/
@@@ -12080,14 -12011,6 +12122,14 @@@ S: Maintaine
  F:    arch/mips/lantiq
  F:    drivers/soc/lantiq
  
 +LANTIQ PEF2256 DRIVER
 +M:    Herve Codina <[email protected]>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/net/lantiq,pef2256.yaml
 +F:    drivers/net/wan/framer/pef2256/
 +F:    drivers/pinctrl/pinctrl-pef2256.c
 +F:    include/linux/framer/pef2256.h
 +
  LASI 53c700 driver for PARISC
  M:    "James E.J. Bottomley" <[email protected]>
  L:    [email protected]
@@@ -12215,10 -12138,9 +12257,10 @@@ F: drivers/ata/sata_promise.
  
  LIBATA SUBSYSTEM (Serial and Parallel ATA drivers)
  M:    Damien Le Moal <[email protected]>
 +M:    Niklas Cassel <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/libata.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux.git
  F:    Documentation/ABI/testing/sysfs-ata
  F:    Documentation/devicetree/bindings/ata/
  F:    drivers/ata/
@@@ -12309,8 -12231,6 +12351,8 @@@ LINUX FOR POWERPC (32-BIT AND 64-BIT
  M:    Michael Ellerman <[email protected]>
  R:    Nicholas Piggin <[email protected]>
  R:    Christophe Leroy <[email protected]>
 +R:    Aneesh Kumar K.V <[email protected]>
 +R:    Naveen N. Rao <[email protected]>
  L:    [email protected]
  S:    Supported
  W:    https://github.com/linuxppc/wiki/wiki
@@@ -12356,21 -12276,21 +12398,21 @@@ S:        Orpha
  F:    arch/powerpc/platforms/40x/
  F:    arch/powerpc/platforms/44x/
  
 -LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX
 +LINUX FOR POWERPC EMBEDDED PPC85XX
  M:    Scott Wood <[email protected]>
  L:    [email protected]
  S:    Odd fixes
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/scottwood/linux.git
  F:    Documentation/devicetree/bindings/cache/freescale-l2cache.txt
  F:    Documentation/devicetree/bindings/powerpc/fsl/
 -F:    arch/powerpc/platforms/83xx/
  F:    arch/powerpc/platforms/85xx/
  
 -LINUX FOR POWERPC EMBEDDED PPC8XX
 +LINUX FOR POWERPC EMBEDDED PPC8XX AND PPC83XX
  M:    Christophe Leroy <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    arch/powerpc/platforms/8xx/
 +F:    arch/powerpc/platforms/83xx/
  
  LINUX KERNEL DUMP TEST MODULE (LKDTM)
  M:    Kees Cook <[email protected]>
@@@ -12517,12 -12437,6 +12559,12 @@@ T: git git://git.kernel.org/pub/scm/lin
  F:    Documentation/admin-guide/LSM/LoadPin.rst
  F:    security/loadpin/
  
 +LOCKDOWN SECURITY MODULE
 +L:    [email protected]
 +S:    Odd Fixes
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/lsm.git
 +F:    security/lockdown/
 +
  LOCKING PRIMITIVES
  M:    Peter Zijlstra <[email protected]>
  M:    Ingo Molnar <[email protected]>
@@@ -12534,7 -12448,7 +12576,7 @@@ S:   Maintaine
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking/core
  F:    Documentation/locking/
  F:    arch/*/include/asm/spinlock*.h
 -F:    include/linux/lockdep.h
 +F:    include/linux/lockdep*.h
  F:    include/linux/mutex*.h
  F:    include/linux/rwlock*.h
  F:    include/linux/rwsem*.h
@@@ -12705,16 -12619,6 +12747,16 @@@ S: Maintaine
  F:    Documentation/hwmon/ltc4261.rst
  F:    drivers/hwmon/ltc4261.c
  
 +LTC4286 HARDWARE MONITOR DRIVER
 +M:    Delphine CC Chiu <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
 +F:    Documentation/hwmon/ltc4286.rst
 +F:    drivers/hwmon/pmbus/Kconfig
 +F:    drivers/hwmon/pmbus/Makefile
 +F:    drivers/hwmon/pmbus/ltc4286.c
 +
  LTC4306 I2C MULTIPLEXER DRIVER
  M:    Michael Hennerich <[email protected]>
  L:    [email protected]
@@@ -12724,16 -12628,24 +12766,23 @@@ F:        Documentation/devicetree/bindings/i2
  F:    drivers/i2c/muxes/i2c-mux-ltc4306.c
  
  LTP (Linux Test Project)
 -M:    Mike Frysinger <[email protected]>
  M:    Cyril Hrubis <[email protected]>
 -M:    Wanlong Gao <[email protected]>
  M:    Jan Stancek <[email protected]>
 -M:    Stanislav Kholmanskikh <[email protected]>
 -M:    Alexey Kodanev <[email protected]>
 +M:    Petr Vorel <[email protected]>
 +M:    Li Wang <[email protected]>
 +M:    Yang Xu <[email protected]>
  L:    [email protected] (subscribers-only)
  S:    Maintained
  W:    http://linux-test-project.github.io/
  T:    git https://github.com/linux-test-project/ltp.git
  
+ LTR390 AMBIENT/UV LIGHT SENSOR DRIVER
+ M:    Anshul Dalal <[email protected]>
+ L:    [email protected]
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/iio/light/liteon,ltr390.yaml
+ F:    drivers/iio/light/ltr390.c
  LYNX 28G SERDES PHY DRIVER
  M:    Ioana Ciornei <[email protected]>
  L:    [email protected]
@@@ -12828,7 -12740,7 +12877,7 @@@ F:   drivers/mailbox/arm_mhuv2.
  F:    include/linux/mailbox/arm_mhuv2_message.h
  
  MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
 -M:    Michael Kerrisk <[email protected]>
 +M:    Alejandro Colomar <[email protected]>
  L:    [email protected]
  S:    Maintained
  W:    http://www.kernel.org/doc/man-pages
@@@ -12868,8 -12780,7 +12917,8 @@@ MARVELL 88E6XXX ETHERNET SWITCH FABRIC 
  M:    Andrew Lunn <[email protected]>
  L:    [email protected]
  S:    Maintained
 -F:    Documentation/devicetree/bindings/net/dsa/marvell.txt
 +F:    Documentation/devicetree/bindings/net/dsa/marvell,mv88e6060.yaml
 +F:    Documentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml
  F:    Documentation/networking/devlink/mv88e6xxx.rst
  F:    drivers/net/dsa/mv88e6xxx/
  F:    include/linux/dsa/mv88e6xxx.h
@@@ -12952,7 -12863,7 +13001,7 @@@ S:   Maintaine
  F:    drivers/net/ethernet/marvell/mvneta.*
  
  MARVELL MVPP2 ETHERNET DRIVER
 -M:    Marcin Wojtas <mw@semihalf.com>
 +M:    Marcin Wojtas <marcin.s.wojtas@gmail.com>
  M:    Russell King <[email protected]>
  L:    [email protected]
  S:    Maintained
@@@ -13098,7 -13009,6 +13147,7 @@@ MAX96712 QUAD GMSL2 DESERIALIZER DRIVE
  M:    Niklas Söderlund <[email protected]>
  L:    [email protected]
  S:    Maintained
 +F:    Documentation/devicetree/bindings/media/i2c/maxim,max96712.yaml
  F:    drivers/staging/media/max96712/max96712.c
  
  MAX9860 MONO AUDIO VOICE CODEC DRIVER
@@@ -13278,6 -13188,13 +13327,13 @@@ F: Documentation/ABI/testing/sysfs-bus-
  F:    drivers/iio/potentiometer/mcp4018.c
  F:    drivers/iio/potentiometer/mcp4531.c
  
+ MCP4821 DAC DRIVER
+ M:    Anshul Dalal <[email protected]>
+ L:    [email protected]
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/iio/dac/microchip,mcp4821.yaml
+ F:    drivers/iio/dac/mcp4821.c
  MCR20A IEEE-802.15.4 RADIO DRIVER
  M:    Stefan Schmidt <[email protected]>
  L:    [email protected]
@@@ -13519,16 -13436,13 +13575,16 @@@ W:        https://linuxtv.or
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/dvb-frontends/stv6111*
  
 -MEDIA DRIVERS FOR STM32 - DCMI
 +MEDIA DRIVERS FOR STM32 - DCMI / DCMIPP
  M:    Hugues Fruchet <[email protected]>
 +M:    Alain Volmat <[email protected]>
  L:    [email protected]
  S:    Supported
  T:    git git://linuxtv.org/media_tree.git
  F:    Documentation/devicetree/bindings/media/st,stm32-dcmi.yaml
 +F:    Documentation/devicetree/bindings/media/st,stm32-dcmipp.yaml
  F:    drivers/media/platform/st/stm32/stm32-dcmi.c
 +F:    drivers/media/platform/st/stm32/stm32-dcmipp/*
  
  MEDIA INPUT INFRASTRUCTURE (V4L/DVB)
  M:    Mauro Carvalho Chehab <[email protected]>
@@@ -13805,6 -13719,13 +13861,13 @@@ S: Supporte
  W:    http://www.melexis.com
  F:    drivers/iio/temperature/mlx90632.c
  
+ MELEXIS MLX90635 DRIVER
+ M:    Crt Mori <[email protected]>
+ L:    [email protected]
+ S:    Supported
+ W:    http://www.melexis.com
+ F:    drivers/iio/temperature/mlx90635.c
  MELFAS MIP4 TOUCHSCREEN DRIVER
  M:    Sangwon Jee <[email protected]>
  S:    Supported
@@@ -14275,11 -14196,12 +14338,12 @@@ F:        Documentation/devicetree/bindings/re
  F:    drivers/regulator/mcp16502.c
  
  MICROCHIP MCP3564 ADC DRIVER
- M:      Marius Cristea <[email protected]>
- L:      [email protected]
- S:      Supported
- F:      Documentation/devicetree/bindings/iio/adc/microchip,mcp3564.yaml
- F:      drivers/iio/adc/mcp3564.c
+ M:    Marius Cristea <[email protected]>
+ L:    [email protected]
+ S:    Supported
+ F:    Documentation/ABI/testing/sysfs-bus-iio-adc-mcp3564
+ F:    Documentation/devicetree/bindings/iio/adc/microchip,mcp3564.yaml
+ F:    drivers/iio/adc/mcp3564.c
  
  MICROCHIP MCP3911 ADC DRIVER
  M:    Marcus Folkesson <[email protected]>
@@@ -15075,7 -14997,6 +15139,7 @@@ Q:   https://patchwork.kernel.org/project
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
  F:    Documentation/devicetree/bindings/net/
 +F:    Documentation/networking/net_cachelines/net_device.rst
  F:    drivers/connector/
  F:    drivers/net/
  F:    include/dt-bindings/net/
@@@ -15131,7 -15052,6 +15195,7 @@@ T:   git git://git.kernel.org/pub/scm/lin
  F:    Documentation/core-api/netlink.rst
  F:    Documentation/netlink/
  F:    Documentation/networking/
 +F:    Documentation/networking/net_cachelines/
  F:    Documentation/process/maintainer-netdev.rst
  F:    Documentation/userspace-api/netlink/
  F:    include/linux/in.h
@@@ -15221,7 -15141,6 +15285,7 @@@ K:   \bmdo
  NETWORKING [MPTCP]
  M:    Matthieu Baerts <[email protected]>
  M:    Mat Martineau <[email protected]>
 +R:    Geliang Tang <[email protected]>
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
@@@ -15229,7 -15148,7 +15293,7 @@@ W:   https://github.com/multipath-tcp/mpt
  B:    https://github.com/multipath-tcp/mptcp_net-next/issues
  T:    git https://github.com/multipath-tcp/mptcp_net-next.git export-net
  T:    git https://github.com/multipath-tcp/mptcp_net-next.git export
 -F:    Documentation/netlink/specs/mptcp.yaml
 +F:    Documentation/netlink/specs/mptcp_pm.yaml
  F:    Documentation/networking/mptcp-sysctl.rst
  F:    include/net/mptcp.h
  F:    include/trace/events/mptcp.h
@@@ -15242,7 -15161,6 +15306,7 @@@ NETWORKING [TCP
  M:    Eric Dumazet <[email protected]>
  L:    [email protected]
  S:    Maintained
 +F:    Documentation/networking/net_cachelines/tcp_sock.rst
  F:    include/linux/tcp.h
  F:    include/net/tcp.h
  F:    include/trace/events/tcp.h
@@@ -15374,6 -15292,15 +15438,15 @@@ F: include/linux/nitro_enclaves.
  F:    include/uapi/linux/nitro_enclaves.h
  F:    samples/nitro_enclaves/
  
+ NITRO SECURE MODULE (NSM)
+ M:    Alexander Graf <[email protected]>
+ L:    [email protected]
+ L:    The AWS Nitro Enclaves Team <[email protected]>
+ S:    Supported
+ W:    https://aws.amazon.com/ec2/nitro/nitro-enclaves/
+ F:    drivers/misc/nsm.c
+ F:    include/uapi/linux/nsm.h
  NOHZ, DYNTICKS SUPPORT
  M:    Frederic Weisbecker <[email protected]>
  M:    Thomas Gleixner <[email protected]>
@@@ -15570,10 -15497,10 +15643,10 @@@ F:        Documentation/devicetree/bindings/ne
  F:    drivers/bluetooth/btnxpuart.c
  
  NXP C45 TJA11XX PHY DRIVER
 -M:    Radu Pirea <radu-nicolae.pire[email protected]>
 +M:    Andrei Botila <andrei.botil[email protected]>
  L:    [email protected]
  S:    Maintained
 -F:    drivers/net/phy/nxp-c45-tja11xx.c
 +F:    drivers/net/phy/nxp-c45-tja11xx*
  
  NXP FSPI DRIVER
  M:    Han Xu <[email protected]>
@@@ -15841,8 -15768,9 +15914,8 @@@ F:   Documentation/devicetree/bindings/gp
  F:    drivers/gpio/gpio-omap.c
  
  OMAP HARDWARE SPINLOCK SUPPORT
 -M:    Ohad Ben-Cohen <[email protected]>
  L:    [email protected]
 -S:    Maintained
 +S:    Orphan
  F:    drivers/hwspinlock/omap_hwspinlock.c
  
  OMAP HS MMC SUPPORT
@@@ -15942,7 -15870,6 +16015,7 @@@ T:   git git://git.kernel.org/pub/scm/lin
  F:    Documentation/devicetree/bindings/arm/ti/omap.yaml
  F:    arch/arm/configs/omap2plus_defconfig
  F:    arch/arm/mach-omap2/
 +F:    drivers/bus/omap*.[ch]
  F:    drivers/bus/ti-sysc.c
  F:    drivers/gpio/gpio-tps65219.c
  F:    drivers/i2c/busses/i2c-omap.c
@@@ -16105,14 -16032,6 +16178,14 @@@ S: Maintaine
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/media/i2c/ov5695.c
  
 +OMNIVISION OV64A40 SENSOR DRIVER
 +M:    Jacopo Mondi <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/ovti,ov64a40.yaml
 +F:    drivers/media/i2c/ov64a40.c
 +
  OMNIVISION OV7670 SENSOR DRIVER
  L:    [email protected]
  S:    Orphan
@@@ -16282,7 -16201,7 +16355,7 @@@ F:   include/dt-bindings
  
  OPENCOMPUTE PTP CLOCK DRIVER
  M:    Jonathan Lemon <[email protected]>
 -M:    Vadim Fedorenko <vadfed@fb.com>
 +M:    Vadim Fedorenko <vadfed@linux.dev>
  L:    [email protected]
  S:    Maintained
  F:    drivers/ptp/ptp_ocp.c
@@@ -16360,6 -16279,13 +16433,6 @@@ T:  git git://git.kernel.org/pub/scm/lin
  F:    Documentation/filesystems/orangefs.rst
  F:    fs/orangefs/
  
 -ORINOCO DRIVER
 -L:    [email protected]
 -S:    Orphan
 -W:    https://wireless.wiki.kernel.org/en/users/Drivers/orinoco
 -W:    http://www.nongnu.org/orinoco/
 -F:    drivers/net/wireless/intersil/orinoco/
 -
  OV2659 OMNIVISION SENSOR DRIVER
  M:    "Lad, Prabhakar" <[email protected]>
  L:    [email protected]
@@@ -16595,10 -16521,11 +16668,10 @@@ F:        Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/dwc/pcie-armada8k.c
  
  PCI DRIVER FOR CADENCE PCIE IP
 -M:    Tom Joseph <[email protected]>
  L:    [email protected]
 -S:    Maintained
 +S:    Orphan
  F:    Documentation/devicetree/bindings/pci/cdns,*
 -F:    drivers/pci/controller/cadence/
 +F:    drivers/pci/controller/cadence/*cadence*
  
  PCI DRIVER FOR FREESCALE LAYERSCAPE
  M:    Minghuan Lian <[email protected]>
@@@ -17505,7 -17432,7 +17578,7 @@@ F:   tools/testing/selftests/proc
  PROC SYSCTL
  M:    Luis Chamberlain <[email protected]>
  M:    Kees Cook <[email protected]>
 -M:    Iurii Zaikin <yzaikin@google.com>
 +M:    Joel Granados <j.granados@samsung.com>
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
@@@ -17644,11 -17571,12 +17717,11 @@@ F:        Documentation/devicetree/bindings/le
  F:    drivers/media/rc/pwm-ir-tx.c
  
  PWM SUBSYSTEM
 -M:    Thierry Reding <[email protected]>
 -R:    Uwe Kleine-König <[email protected]>
 +M:    Uwe Kleine-König <[email protected]>
  L:    [email protected]
  S:    Maintained
  Q:    https://patchwork.ozlabs.org/project/linux-pwm/list/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/thierry.reding/linux-pwm.git
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/ukleinek/linux.git
  F:    Documentation/devicetree/bindings/gpio/gpio-mvebu.yaml
  F:    Documentation/devicetree/bindings/pwm/
  F:    Documentation/driver-api/pwm.rst
@@@ -17658,7 -17586,7 +17731,7 @@@ F:   drivers/video/backlight/pwm_bl.
  F:    include/dt-bindings/pwm/
  F:    include/linux/pwm.h
  F:    include/linux/pwm_backlight.h
 -K:    pwm_(config|apply_state|ops)
 +K:    pwm_(config|apply_might_sleep|apply_atomic|ops)
  
  PXA GPIO DRIVER
  M:    Robert Jarzmik <[email protected]>
@@@ -18196,7 -18124,6 +18269,7 @@@ F:   drivers/media/cec/usb/rainshadow
  
  RALINK MIPS ARCHITECTURE
  M:    John Crispin <[email protected]>
 +M:    Sergio Paracuellos <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    arch/mips/ralink
@@@ -18251,6 -18178,11 +18324,6 @@@ F:  drivers/ras
  F:    include/linux/ras.h
  F:    include/ras/ras_event.h
  
 -RAYLINK/WEBGEAR 802.11 WIRELESS LAN DRIVER
 -L:    [email protected]
 -S:    Orphan
 -F:    drivers/net/wireless/legacy/ray*
 -
  RC-CORE / LIRC FRAMEWORK
  M:    Sean Young <[email protected]>
  L:    [email protected]
@@@ -18718,7 -18650,6 +18791,7 @@@ F:   Documentation/devicetree/bindings/us
  F:    arch/riscv/boot/dts/microchip/
  F:    drivers/char/hw_random/mpfs-rng.c
  F:    drivers/clk/microchip/clk-mpfs*.c
 +F:    drivers/firmware/microchip/mpfs-auto-update.c
  F:    drivers/i2c/busses/i2c-microchip-corei2c.c
  F:    drivers/mailbox/mailbox-mpfs.c
  F:    drivers/pci/controller/pcie-microchip-host.c
@@@ -19288,6 -19219,7 +19361,6 @@@ R:   Alim Akhtar <[email protected]
  L:    [email protected]
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux.git
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/snawrocki/clk.git
  F:    Documentation/devicetree/bindings/clock/samsung,*.yaml
  F:    Documentation/devicetree/bindings/clock/samsung,s3c*
  F:    drivers/clk/samsung/
@@@ -19575,29 -19507,22 +19648,29 @@@ SECURITY SUBSYSTE
  M:    Paul Moore <[email protected]>
  M:    James Morris <[email protected]>
  M:    "Serge E. Hallyn" <[email protected]>
 -L:    [email protected] (suggested Cc:)
 +L:    [email protected]
  S:    Supported
 -W:    http://kernsec.org/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/lsm.git
 +Q:    https://patchwork.kernel.org/project/linux-security-module/list
 +B:    mailto:[email protected]
 +P:    https://github.com/LinuxSecurityModule/kernel/blob/main/README.md
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/lsm.git
 +F:    include/uapi/linux/lsm.h
  F:    security/
 +F:    tools/testing/selftests/lsm/
  X:    security/selinux/
 +K:    \bsecurity_[a-z_0-9]\+\b
  
  SELINUX SECURITY MODULE
  M:    Paul Moore <[email protected]>
  M:    Stephen Smalley <[email protected]>
 -M:    Eric Paris <[email protected]>
 +R:    Ondrej Mosnacek <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    https://selinuxproject.org
  W:    https://github.com/SELinuxProject
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux.git
 +Q:    https://patchwork.kernel.org/project/selinux/list
 +B:    mailto:[email protected]
 +P:    https://github.com/SELinuxProject/selinux-kernel/blob/main/README.md
 +T:    git https://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux.git
  F:    Documentation/ABI/removed/sysfs-selinux-checkreqprot
  F:    Documentation/ABI/removed/sysfs-selinux-disable
  F:    Documentation/admin-guide/LSM/SELinux.rst
@@@ -19712,6 -19637,7 +19785,6 @@@ S:   Maintaine
  F:    drivers/misc/sgi-xp/
  
  SHARED MEMORY COMMUNICATIONS (SMC) SOCKETS
 -M:    Karsten Graul <[email protected]>
  M:    Wenjia Zhang <[email protected]>
  M:    Jan Karcher <[email protected]>
  R:    D. Wythe <[email protected]>
@@@ -19737,19 -19663,6 +19810,19 @@@ T: git git://linuxtv.org/media_tree.gi
  F:    drivers/media/i2c/rj54n1cb0c.c
  F:    include/media/i2c/rj54n1cb0c.h
  
 +SHRINKER
 +M:    Andrew Morton <[email protected]>
 +M:    Dave Chinner <[email protected]>
 +R:    Qi Zheng <[email protected]>
 +R:    Roman Gushchin <[email protected]>
 +R:    Muchun Song <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/admin-guide/mm/shrinker_debugfs.rst
 +F:    include/linux/shrinker.h
 +F:    mm/shrinker.c
 +F:    mm/shrinker_debug.c
 +
  SH_VOU V4L2 OUTPUT DRIVER
  L:    [email protected]
  S:    Orphan
@@@ -19866,13 -19779,6 +19939,13 @@@ S: Supporte
  N:    sifive
  K:    [^@]sifive
  
 +SIFIVE CACHE DRIVER
 +M:    Conor Dooley <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/cache/sifive,ccache0.yaml
 +F:    drivers/cache/sifive_ccache.c
 +
  SIFIVE FU540 SYSTEM-ON-CHIP
  M:    Paul Walmsley <[email protected]>
  M:    Palmer Dabbelt <[email protected]>
@@@ -19888,6 -19794,13 +19961,6 @@@ S:  Maintaine
  F:    Documentation/devicetree/bindings/dma/sifive,fu540-c000-pdma.yaml
  F:    drivers/dma/sf-pdma/
  
 -SIFIVE SOC DRIVERS
 -M:    Conor Dooley <[email protected]>
 -L:    [email protected]
 -S:    Maintained
 -T:    git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
 -F:    Documentation/devicetree/bindings/cache/sifive,ccache0.yaml
 -F:    drivers/soc/sifive/
  
  SILEAD TOUCHSCREEN DRIVER
  M:    Hans de Goede <[email protected]>
@@@ -19928,6 -19841,11 +20001,6 @@@ F:  Documentation/devicetree/bindings/di
  F:    drivers/video/fbdev/simplefb.c
  F:    include/linux/platform_data/simplefb.h
  
 -SIMTEC EB110ATX (Chalice CATS)
 -M:    Simtec Linux Team <[email protected]>
 -S:    Supported
 -W:    http://www.simtec.co.uk/products/EB110ATX/
 -
  SIOX
  M:    Thorsten Scherer <[email protected]>
  M:    Uwe Kleine-König <[email protected]>
@@@ -19977,7 -19895,7 +20050,7 @@@ W:   http://www.winischhofer.at/linuxsisu
  F:    drivers/usb/misc/sisusbvga/
  
  SL28 CPLD MFD DRIVER
 -M:    Michael Walle <m[email protected]>
 +M:    Michael Walle <m[email protected]>
  S:    Maintained
  F:    Documentation/devicetree/bindings/gpio/kontron,sl28cpld-gpio.yaml
  F:    Documentation/devicetree/bindings/hwmon/kontron,sl28cpld-hwmon.yaml
@@@ -19992,7 -19910,7 +20065,7 @@@ F:   drivers/pwm/pwm-sl28cpld.
  F:    drivers/watchdog/sl28cpld_wdt.c
  
  SL28 VPD NVMEM LAYOUT DRIVER
 -M:    Michael Walle <m[email protected]>
 +M:    Michael Walle <m[email protected]>
  S:    Maintained
  F:    Documentation/devicetree/bindings/nvmem/layouts/kontron,sl28-vpd.yaml
  F:    drivers/nvmem/layouts/sl28vpd.c
@@@ -20182,7 -20100,6 +20255,7 @@@ F:   include/linux/property.
  
  SOFTWARE RAID (Multiple Disks) SUPPORT
  M:    Song Liu <[email protected]>
 +R:    Yu Kuai <[email protected]>
  L:    [email protected]
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-raid/list/
@@@ -20437,7 -20354,6 +20510,7 @@@ F:   drivers/media/dvb-frontends/sp2
  
  SPANISH DOCUMENTATION
  M:    Carlos Bilbao <[email protected]>
 +R:    Avadhut Naik <[email protected]>
  S:    Maintained
  F:    Documentation/translations/sp_SP/
  
@@@ -20504,7 -20420,7 +20577,7 @@@ F:   drivers/pinctrl/spear
  SPI NOR SUBSYSTEM
  M:    Tudor Ambarus <[email protected]>
  M:    Pratyush Yadav <[email protected]>
 -R:    Michael Walle <[email protected]>
 +M:    Michael Walle <[email protected]>
  L:    [email protected]
  S:    Maintained
  W:    http://www.linux-mtd.infradead.org/
@@@ -20716,15 -20632,6 +20789,15 @@@ M: Ion Badulescu <[email protected]
  S:    Odd Fixes
  F:    drivers/net/ethernet/adaptec/starfire*
  
 +STARFIVE CAMERA SUBSYSTEM DRIVER
 +M:    Jack Zhu <[email protected]>
 +M:    Changhuang Liang <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/admin-guide/media/starfive_camss.rst
 +F:    Documentation/devicetree/bindings/media/starfive,jh7110-camss.yaml
 +F:    drivers/staging/media/starfive/camss
 +
  STARFIVE CRYPTO DRIVER
  M:    Jia Jie Ho <[email protected]>
  M:    William Qiu <[email protected]>
  S:    Maintained
  F:    drivers/mmc/host/dw_mmc*
  
 +SYNOPSYS DESIGNWARE PCIE PMU DRIVER
 +M:    Shuai Xue <[email protected]>
 +M:    Jing Zhang <[email protected]>
 +S:    Supported
 +F:    Documentation/admin-guide/perf/dwc_pcie_pmu.rst
 +F:    drivers/perf/dwc_pcie_pmu.c
 +
  SYNOPSYS HSDK RESET CONTROLLER DRIVER
  M:    Eugeniy Paltsev <[email protected]>
  S:    Supported
  S:    Maintained
  F:    drivers/media/rc/ttusbir.c
  
 +TECHWELL TW9900 VIDEO DECODER
 +M:    Mehdi Djait <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    drivers/media/i2c/tw9900.c
 +
  TECHWELL TW9910 VIDEO DECODER
  L:    [email protected]
  S:    Orphan
@@@ -21442,9 -21336,7 +21515,9 @@@ M:   Jens Wiklander <jens.wiklander@linar
  R:    Sumit Garg <[email protected]>
  L:    [email protected]
  S:    Maintained
 -F:    Documentation/staging/tee.rst
 +F:    Documentation/driver-api/tee.rst
 +F:    Documentation/tee/
 +F:    Documentation/userspace-api/tee.rst
  F:    drivers/tee/
  F:    include/linux/tee_drv.h
  F:    include/uapi/linux/tee.h
@@@ -21739,17 -21631,6 +21812,17 @@@ S: Maintaine
  F:    Documentation/ABI/testing/sysfs-class-firmware-attributes
  F:    drivers/platform/x86/think-lmi.?
  
 +THP7312 ISP DRIVER
 +M:    Laurent Pinchart <[email protected]>
 +M:    Paul Elder <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +T:    git git://linuxtv.org/media_tree.git
 +F:    Documentation/devicetree/bindings/media/i2c/thine,thp7312.yaml
 +F:    Documentation/userspace-api/media/drivers/thp7312.rst
 +F:    drivers/media/i2c/thp7312.c
 +F:    include/uapi/linux/thp7312.h
 +
  THUNDERBOLT DMA TRAFFIC TEST DRIVER
  M:    Isaac Hazan <[email protected]>
  L:    [email protected]
@@@ -22226,7 -22107,7 +22299,7 @@@ F:   kernel/trace/trace_osnoise.
  F:    kernel/trace/trace_sched_wakeup.c
  
  TRADITIONAL CHINESE DOCUMENTATION
 -M:    Hu Haowen <[email protected]>
 +M:    Hu Haowen <[email protected]>
  S:    Maintained
  W:    https://github.com/srcres258/linux-doc
  T:    git git://github.com/srcres258/linux-doc.git doc-zh-tw
@@@ -22409,7 -22290,7 +22482,7 @@@ F:   drivers/usb/common/ulpi.
  F:    include/linux/ulpi/
  
  UNICODE SUBSYSTEM
 -M:    Gabriel Krisman Bertazi <krisman@collabora.com>
 +M:    Gabriel Krisman Bertazi <krisman@kernel.org>
  L:    [email protected]
  S:    Supported
  F:    fs/unicode/
@@@ -22451,8 -22332,7 +22524,8 @@@ S:   Maintaine
  F:    drivers/ufs/host/ufs-exynos*
  
  UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER MEDIATEK HOOKS
 -M:    Stanley Chu <[email protected]>
 +M:    Peter Wang <[email protected]>
 +R:    Stanley Jhu <[email protected]>
  L:    [email protected]
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
@@@ -22783,6 -22663,11 +22856,6 @@@ F:  drivers/usb/gadget/function/*uvc
  F:    drivers/usb/gadget/legacy/webcam.c
  F:    include/uapi/linux/usb/g_uvc.h
  
 -USB WIRELESS RNDIS DRIVER (rndis_wlan)
 -L:    [email protected]
 -S:    Orphan
 -F:    drivers/net/wireless/legacy/rndis_wlan.c
 -
  USB XHCI DRIVER
  M:    Mathias Nyman <[email protected]>
  L:    [email protected]
@@@ -22790,6 -22675,12 +22863,6 @@@ S:  Supporte
  F:    drivers/usb/host/pci-quirks*
  F:    drivers/usb/host/xhci*
  
 -USB ZD1201 DRIVER
 -L:    [email protected]
 -S:    Orphan
 -W:    http://linux-lc100020.sourceforge.net
 -F:    drivers/net/wireless/zydas/zd1201.*
 -
  USER DATAGRAM PROTOCOL (UDP)
  M:    Willem de Bruijn <[email protected]>
  S:    Maintained
@@@ -22895,7 -22786,6 +22968,7 @@@ S:   Maintaine
  F:    Documentation/driver-api/media/camera-sensor.rst
  F:    Documentation/driver-api/media/tx-rx.rst
  F:    drivers/media/i2c/ar*
 +F:    drivers/media/i2c/gc*
  F:    drivers/media/i2c/hi*
  F:    drivers/media/i2c/imx*
  F:    drivers/media/i2c/mt*
@@@ -23288,6 -23178,12 +23361,12 @@@ S: Maintaine
  F:    drivers/input/serio/userio.c
  F:    include/uapi/linux/userio.h
  
+ VISHAY VEML6075 UVA AND UVB LIGHT SENSOR DRIVER
+ M:    Javier Carrasco <[email protected]>
+ S:    Maintained
+ F:    Documentation/devicetree/bindings/iio/light/vishay,veml6075.yaml
+ F:    drivers/iio/light/veml6075.c
  VISL VIRTUAL STATELESS DECODER DRIVER
  M:    Daniel Almeida <[email protected]>
  L:    [email protected]
@@@ -23390,8 -23286,9 +23469,8 @@@ F:   drivers/misc/vmw_vmci
  F:    include/linux/vmw_vmci*
  
  VMWARE VMMOUSE SUBDRIVER
 -M:    Zack Rusin <[email protected]>
 -R:    VMware Graphics Reviewers <[email protected]>
 -R:    VMware PV-Drivers Reviewers <[email protected]>
 +M:    Zack Rusin <[email protected]>
 +R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected]
  S:    Supported
  F:    drivers/input/mouse/vmmouse.c
@@@ -23538,14 -23435,6 +23617,14 @@@ F: include/linux/watchdog.
  F:    include/trace/events/watchdog.h
  F:    include/uapi/linux/watchdog.h
  
 +WAVE5 VPU CODEC DRIVER
 +M:    Nas Chung <[email protected]>
 +M:    Jackson Lee <[email protected]>
 +L:    [email protected]
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/media/cnm,wave521c.yaml
 +F:    drivers/media/platform/chips-media/wave5/
 +
  WHISKEYCOVE PMIC GPIO DRIVER
  M:    Kuppuswamy Sathyanarayanan <[email protected]>
  L:    [email protected]
@@@ -23599,6 -23488,11 +23678,6 @@@ M:  Miloslav Trmac <[email protected]
  S:    Maintained
  F:    drivers/input/misc/wistron_btns.c
  
 -WL3501 WIRELESS PCMCIA CARD DRIVER
 -L:    [email protected]
 -S:    Orphan
 -F:    drivers/net/wireless/legacy/wl3501*
 -
  WMI BINARY MOF DRIVER
  M:    Armin Wolf <[email protected]>
  R:    Thomas WeiĂŸschuh <[email protected]>
@@@ -23768,6 -23662,15 +23847,6 @@@ F:  drivers/platform/olpc
  F:    drivers/platform/x86/
  F:    include/linux/platform_data/x86/
  
 -X86 PLATFORM DRIVERS - ARCH
 -R:    Darren Hart <[email protected]>
 -R:    Andy Shevchenko <[email protected]>
 -L:    [email protected]
 -L:    [email protected]
 -S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core
 -F:    arch/x86/platform
 -
  X86 PLATFORM UV HPE SUPERDOME FLEX
  M:    Steve Wahl <[email protected]>
  R:    Justin Ernst <[email protected]>
@@@ -23979,10 -23882,10 +24058,10 @@@ S:        Supporte
  W:    http://xfs.org/
  C:    irc://irc.oftc.net/xfs
  T:    git git://git.kernel.org/pub/scm/fs/xfs/xfs-linux.git
 -P:    Documentation/filesystems/xfs-maintainer-entry-profile.rst
 +P:    Documentation/filesystems/xfs/xfs-maintainer-entry-profile.rst
  F:    Documentation/ABI/testing/sysfs-fs-xfs
  F:    Documentation/admin-guide/xfs.rst
 -F:    Documentation/filesystems/xfs-*
 +F:    Documentation/filesystems/xfs/*
  F:    fs/xfs/
  F:    include/uapi/linux/dqblk_xfs.h
  F:    include/uapi/linux/fsmap.h
@@@ -24275,13 -24178,11 +24354,13 @@@ N:        zst
  K:    zstd
  
  ZSWAP COMPRESSED SWAP CACHING
 -M:    Seth Jennings <[email protected]>
 -M:    Dan Streetman <[email protected]>
 -M:    Vitaly Wool <vitaly.wool@konsulko.com>
 +M:    Johannes Weiner <[email protected]>
 +M:    Yosry Ahmed <[email protected]>
 +M:    Nhat Pham <nphamcs@gmail.com>
  L:    [email protected]
  S:    Maintained
 +F:    Documentation/admin-guide/mm/zswap.rst
 +F:    include/linux/zswap.h
  F:    mm/zswap.c
  
  THE REST
diff --combined drivers/android/binder.c
index 7658103ba760d688ae45a5f9b6b5a6db36e220fb,c4bb18305e77b62f8f8a750f737c8b9513694321..8dd23b19e99731ce1ce5f5d6062366aece0dd415
@@@ -1921,7 -1921,7 +1921,7 @@@ static void binder_deferred_fd_close(in
        if (!twcb)
                return;
        init_task_work(&twcb->twork, binder_do_fd_close);
 -      twcb->file = close_fd_get_file(fd);
 +      twcb->file = file_close_fd(fd);
        if (twcb->file) {
                // pin it until binder_do_fd_close(); see comments there
                get_file(twcb->file);
@@@ -2077,9 -2077,8 +2077,8 @@@ static void binder_transaction_buffer_r
                         * Convert the address to an offset relative to
                         * the base of the transaction buffer.
                         */
-                       fda_offset =
-                           (parent->buffer - (uintptr_t)buffer->user_data) +
-                           fda->parent_offset;
+                       fda_offset = parent->buffer - buffer->user_data +
+                               fda->parent_offset;
                        for (fd_index = 0; fd_index < fda->num_fds;
                             fd_index++) {
                                u32 fd;
@@@ -2597,7 -2596,7 +2596,7 @@@ static int binder_translate_fd_array(st
         * Convert the address to an offset relative to
         * the base of the transaction buffer.
         */
-       fda_offset = (parent->buffer - (uintptr_t)t->buffer->user_data) +
+       fda_offset = parent->buffer - t->buffer->user_data +
                fda->parent_offset;
        sender_ufda_base = (void __user *)(uintptr_t)sender_uparent->buffer +
                                fda->parent_offset;
@@@ -2672,8 -2671,9 +2671,9 @@@ static int binder_fixup_parent(struct l
                                  proc->pid, thread->pid);
                return -EINVAL;
        }
-       buffer_offset = bp->parent_offset +
-                       (uintptr_t)parent->buffer - (uintptr_t)b->user_data;
+       buffer_offset = bp->parent_offset + parent->buffer - b->user_data;
        return binder_add_fixup(pf_head, buffer_offset, bp->buffer, 0);
  }
  
@@@ -3225,7 -3225,7 +3225,7 @@@ static void binder_transaction(struct b
  
        t->buffer = binder_alloc_new_buf(&target_proc->alloc, tr->data_size,
                tr->offsets_size, extra_buffers_size,
-               !reply && (t->flags & TF_ONE_WAY), current->tgid);
+               !reply && (t->flags & TF_ONE_WAY));
        if (IS_ERR(t->buffer)) {
                char *s;
  
                                    ALIGN(extra_buffers_size, sizeof(void *)) -
                                    ALIGN(secctx_sz, sizeof(u64));
  
-               t->security_ctx = (uintptr_t)t->buffer->user_data + buf_offset;
+               t->security_ctx = t->buffer->user_data + buf_offset;
                err = binder_alloc_copy_to_buffer(&target_proc->alloc,
                                                  t->buffer, buf_offset,
                                                  secctx, secctx_sz);
                                goto err_translate_failed;
                        }
                        /* Fixup buffer pointer to target proc address space */
-                       bp->buffer = (uintptr_t)
-                               t->buffer->user_data + sg_buf_offset;
+                       bp->buffer = t->buffer->user_data + sg_buf_offset;
                        sg_buf_offset += ALIGN(bp->length, sizeof(u64));
  
                        num_valid = (buffer_offset - off_start_offset) /
@@@ -4698,7 -4697,7 +4697,7 @@@ retry
                }
                trd->data_size = t->buffer->data_size;
                trd->offsets_size = t->buffer->offsets_size;
-               trd->data.ptr.buffer = (uintptr_t)t->buffer->user_data;
+               trd->data.ptr.buffer = t->buffer->user_data;
                trd->data.ptr.offsets = trd->data.ptr.buffer +
                                        ALIGN(t->buffer->data_size,
                                            sizeof(void *));
@@@ -5030,7 -5029,7 +5029,7 @@@ static __poll_t binder_poll(struct fil
  
        thread = binder_get_thread(proc);
        if (!thread)
-               return POLLERR;
+               return EPOLLERR;
  
        binder_inner_proc_lock(thread->proc);
        thread->looper |= BINDER_LOOPER_STATE_POLL;
@@@ -5981,9 -5980,9 +5980,9 @@@ static void print_binder_transaction_il
        }
        if (buffer->target_node)
                seq_printf(m, " node %d", buffer->target_node->debug_id);
-       seq_printf(m, " size %zd:%zd data %pK\n",
+       seq_printf(m, " size %zd:%zd offset %lx\n",
                   buffer->data_size, buffer->offsets_size,
-                  buffer->user_data);
+                  proc->alloc.buffer - buffer->user_data);
  }
  
  static void print_binder_work_ilocked(struct seq_file *m,
index f69d30c9f50faebfa97c65e179bb8edb2eca1c2d,a4a4dc87ba53aa39bd3b00643861f3c29eae1c62..e0e4dc38b6920737c2d9ec432664d0b160834de8
@@@ -26,7 -26,7 +26,7 @@@
  #include "binder_alloc.h"
  #include "binder_trace.h"
  
- struct list_lru binder_alloc_lru;
+ struct list_lru binder_freelist;
  
  static DEFINE_MUTEX(binder_alloc_mmap_lock);
  
@@@ -125,23 -125,20 +125,20 @@@ static void binder_insert_allocated_buf
  
  static struct binder_buffer *binder_alloc_prepare_to_free_locked(
                struct binder_alloc *alloc,
-               uintptr_t user_ptr)
+               unsigned long user_ptr)
  {
        struct rb_node *n = alloc->allocated_buffers.rb_node;
        struct binder_buffer *buffer;
-       void __user *uptr;
-       uptr = (void __user *)user_ptr;
  
        while (n) {
                buffer = rb_entry(n, struct binder_buffer, rb_node);
                BUG_ON(buffer->free);
  
-               if (uptr < buffer->user_data)
+               if (user_ptr < buffer->user_data) {
                        n = n->rb_left;
-               else if (uptr > buffer->user_data)
+               } else if (user_ptr > buffer->user_data) {
                        n = n->rb_right;
-               else {
+               else {
                        /*
                         * Guard against user threads attempting to
                         * free the buffer when in use by kernel or
   * Return:    Pointer to buffer or NULL
   */
  struct binder_buffer *binder_alloc_prepare_to_free(struct binder_alloc *alloc,
-                                                  uintptr_t user_ptr)
+                                                  unsigned long user_ptr)
  {
        struct binder_buffer *buffer;
  
-       mutex_lock(&alloc->mutex);
+       spin_lock(&alloc->lock);
        buffer = binder_alloc_prepare_to_free_locked(alloc, user_ptr);
-       mutex_unlock(&alloc->mutex);
+       spin_unlock(&alloc->lock);
        return buffer;
  }
  
- static int binder_update_page_range(struct binder_alloc *alloc, int allocate,
-                                   void __user *start, void __user *end)
+ static inline void
+ binder_set_installed_page(struct binder_lru_page *lru_page,
+                         struct page *page)
+ {
+       /* Pairs with acquire in binder_get_installed_page() */
+       smp_store_release(&lru_page->page_ptr, page);
+ }
+ static inline struct page *
+ binder_get_installed_page(struct binder_lru_page *lru_page)
+ {
+       /* Pairs with release in binder_set_installed_page() */
+       return smp_load_acquire(&lru_page->page_ptr);
+ }
+ static void binder_lru_freelist_add(struct binder_alloc *alloc,
+                                   unsigned long start, unsigned long end)
  {
-       void __user *page_addr;
-       unsigned long user_page_addr;
        struct binder_lru_page *page;
-       struct vm_area_struct *vma = NULL;
-       struct mm_struct *mm = NULL;
-       bool need_mm = false;
+       unsigned long page_addr;
  
-       binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
-                    "%d: %s pages %pK-%pK\n", alloc->pid,
-                    allocate ? "allocate" : "free", start, end);
+       trace_binder_update_page_range(alloc, false, start, end);
  
-       if (end <= start)
-               return 0;
+       for (page_addr = start; page_addr < end; page_addr += PAGE_SIZE) {
+               size_t index;
+               int ret;
  
-       trace_binder_update_page_range(alloc, allocate, start, end);
+               index = (page_addr - alloc->buffer) / PAGE_SIZE;
+               page = &alloc->pages[index];
  
-       if (allocate == 0)
-               goto free_range;
+               if (!binder_get_installed_page(page))
+                       continue;
  
-       for (page_addr = start; page_addr < end; page_addr += PAGE_SIZE) {
-               page = &alloc->pages[(page_addr - alloc->buffer) / PAGE_SIZE];
-               if (!page->page_ptr) {
-                       need_mm = true;
-                       break;
-               }
+               trace_binder_free_lru_start(alloc, index);
 -              ret = list_lru_add(&binder_freelist, &page->lru);
++              ret = list_lru_add_obj(&binder_freelist, &page->lru);
+               WARN_ON(!ret);
+               trace_binder_free_lru_end(alloc, index);
        }
+ }
+ static int binder_install_single_page(struct binder_alloc *alloc,
+                                     struct binder_lru_page *lru_page,
+                                     unsigned long addr)
+ {
+       struct page *page;
+       int ret = 0;
  
-       if (need_mm && mmget_not_zero(alloc->mm))
-               mm = alloc->mm;
+       if (!mmget_not_zero(alloc->mm))
+               return -ESRCH;
  
-       if (mm) {
-               mmap_write_lock(mm);
-               vma = alloc->vma;
+       /*
+        * Protected with mmap_sem in write mode as multiple tasks
+        * might race to install the same page.
+        */
+       mmap_write_lock(alloc->mm);
+       if (binder_get_installed_page(lru_page))
+               goto out;
+       if (!alloc->vma) {
+               pr_err("%d: %s failed, no vma\n", alloc->pid, __func__);
+               ret = -ESRCH;
+               goto out;
        }
  
-       if (!vma && need_mm) {
-               binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
-                                  "%d: binder_alloc_buf failed to map pages in userspace, no vma\n",
-                                  alloc->pid);
-               goto err_no_vma;
+       page = alloc_page(GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO);
+       if (!page) {
+               pr_err("%d: failed to allocate page\n", alloc->pid);
+               ret = -ENOMEM;
+               goto out;
        }
  
-       for (page_addr = start; page_addr < end; page_addr += PAGE_SIZE) {
+       ret = vm_insert_page(alloc->vma, addr, page);
+       if (ret) {
+               pr_err("%d: %s failed to insert page at offset %lx with %d\n",
+                      alloc->pid, __func__, addr - alloc->buffer, ret);
+               __free_page(page);
+               ret = -ENOMEM;
+               goto out;
+       }
+       /* Mark page installation complete and safe to use */
+       binder_set_installed_page(lru_page, page);
+ out:
+       mmap_write_unlock(alloc->mm);
+       mmput_async(alloc->mm);
+       return ret;
+ }
+ static int binder_install_buffer_pages(struct binder_alloc *alloc,
+                                      struct binder_buffer *buffer,
+                                      size_t size)
+ {
+       struct binder_lru_page *page;
+       unsigned long start, final;
+       unsigned long page_addr;
+       start = buffer->user_data & PAGE_MASK;
+       final = PAGE_ALIGN(buffer->user_data + size);
+       for (page_addr = start; page_addr < final; page_addr += PAGE_SIZE) {
+               unsigned long index;
                int ret;
-               bool on_lru;
-               size_t index;
  
                index = (page_addr - alloc->buffer) / PAGE_SIZE;
                page = &alloc->pages[index];
  
-               if (page->page_ptr) {
-                       trace_binder_alloc_lru_start(alloc, index);
-                       on_lru = list_lru_del_obj(&binder_alloc_lru, &page->lru);
-                       WARN_ON(!on_lru);
-                       trace_binder_alloc_lru_end(alloc, index);
+               if (binder_get_installed_page(page))
                        continue;
-               }
-               if (WARN_ON(!vma))
-                       goto err_page_ptr_cleared;
  
                trace_binder_alloc_page_start(alloc, index);
-               page->page_ptr = alloc_page(GFP_KERNEL |
-                                           __GFP_HIGHMEM |
-                                           __GFP_ZERO);
-               if (!page->page_ptr) {
-                       pr_err("%d: binder_alloc_buf failed for page at %pK\n",
-                               alloc->pid, page_addr);
-                       goto err_alloc_page_failed;
-               }
-               page->alloc = alloc;
-               INIT_LIST_HEAD(&page->lru);
-               user_page_addr = (uintptr_t)page_addr;
-               ret = vm_insert_page(vma, user_page_addr, page[0].page_ptr);
-               if (ret) {
-                       pr_err("%d: binder_alloc_buf failed to map page at %lx in userspace\n",
-                              alloc->pid, user_page_addr);
-                       goto err_vm_insert_page_failed;
-               }
  
-               if (index + 1 > alloc->pages_high)
-                       alloc->pages_high = index + 1;
+               ret = binder_install_single_page(alloc, page, page_addr);
+               if (ret)
+                       return ret;
  
                trace_binder_alloc_page_end(alloc, index);
        }
-       if (mm) {
-               mmap_write_unlock(mm);
-               mmput(mm);
-       }
        return 0;
+ }
  
- free_range:
-       for (page_addr = end - PAGE_SIZE; 1; page_addr -= PAGE_SIZE) {
-               bool ret;
-               size_t index;
+ /* The range of pages should exclude those shared with other buffers */
+ static void binder_lru_freelist_del(struct binder_alloc *alloc,
+                                   unsigned long start, unsigned long end)
+ {
+       struct binder_lru_page *page;
+       unsigned long page_addr;
+       trace_binder_update_page_range(alloc, true, start, end);
+       for (page_addr = start; page_addr < end; page_addr += PAGE_SIZE) {
+               unsigned long index;
+               bool on_lru;
  
                index = (page_addr - alloc->buffer) / PAGE_SIZE;
                page = &alloc->pages[index];
  
-               trace_binder_free_lru_start(alloc, index);
+               if (page->page_ptr) {
+                       trace_binder_alloc_lru_start(alloc, index);
  
-               ret = list_lru_add_obj(&binder_alloc_lru, &page->lru);
-               WARN_ON(!ret);
 -                      on_lru = list_lru_del(&binder_freelist, &page->lru);
++                      on_lru = list_lru_del_obj(&binder_freelist, &page->lru);
+                       WARN_ON(!on_lru);
  
-               trace_binder_free_lru_end(alloc, index);
-               if (page_addr == start)
-                       break;
-               continue;
- err_vm_insert_page_failed:
-               __free_page(page->page_ptr);
-               page->page_ptr = NULL;
- err_alloc_page_failed:
- err_page_ptr_cleared:
-               if (page_addr == start)
-                       break;
-       }
- err_no_vma:
-       if (mm) {
-               mmap_write_unlock(mm);
-               mmput(mm);
+                       trace_binder_alloc_lru_end(alloc, index);
+                       continue;
+               }
+               if (index + 1 > alloc->pages_high)
+                       alloc->pages_high = index + 1;
        }
-       return vma ? -ENOMEM : -ESRCH;
  }
  
  static inline void binder_alloc_set_vma(struct binder_alloc *alloc,
@@@ -323,7 -343,44 +343,44 @@@ static inline struct vm_area_struct *bi
        return smp_load_acquire(&alloc->vma);
  }
  
- static bool debug_low_async_space_locked(struct binder_alloc *alloc, int pid)
+ static void debug_no_space_locked(struct binder_alloc *alloc)
+ {
+       size_t largest_alloc_size = 0;
+       struct binder_buffer *buffer;
+       size_t allocated_buffers = 0;
+       size_t largest_free_size = 0;
+       size_t total_alloc_size = 0;
+       size_t total_free_size = 0;
+       size_t free_buffers = 0;
+       size_t buffer_size;
+       struct rb_node *n;
+       for (n = rb_first(&alloc->allocated_buffers); n; n = rb_next(n)) {
+               buffer = rb_entry(n, struct binder_buffer, rb_node);
+               buffer_size = binder_alloc_buffer_size(alloc, buffer);
+               allocated_buffers++;
+               total_alloc_size += buffer_size;
+               if (buffer_size > largest_alloc_size)
+                       largest_alloc_size = buffer_size;
+       }
+       for (n = rb_first(&alloc->free_buffers); n; n = rb_next(n)) {
+               buffer = rb_entry(n, struct binder_buffer, rb_node);
+               buffer_size = binder_alloc_buffer_size(alloc, buffer);
+               free_buffers++;
+               total_free_size += buffer_size;
+               if (buffer_size > largest_free_size)
+                       largest_free_size = buffer_size;
+       }
+       binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
+                          "allocated: %zd (num: %zd largest: %zd), free: %zd (num: %zd largest: %zd)\n",
+                          total_alloc_size, allocated_buffers,
+                          largest_alloc_size, total_free_size,
+                          free_buffers, largest_free_size);
+ }
+ static bool debug_low_async_space_locked(struct binder_alloc *alloc)
  {
        /*
         * Find the amount and size of buffers allocated by the current caller;
         * and at some point we'll catch them in the act. This is more efficient
         * than keeping a map per pid.
         */
-       struct rb_node *n;
        struct binder_buffer *buffer;
        size_t total_alloc_size = 0;
+       int pid = current->tgid;
        size_t num_buffers = 0;
+       struct rb_node *n;
+       /*
+        * Only start detecting spammers once we have less than 20% of async
+        * space left (which is less than 10% of total buffer size).
+        */
+       if (alloc->free_async_space >= alloc->buffer_size / 10) {
+               alloc->oneway_spam_detected = false;
+               return false;
+       }
  
        for (n = rb_first(&alloc->allocated_buffers); n != NULL;
                 n = rb_next(n)) {
                        continue;
                if (!buffer->async_transaction)
                        continue;
-               total_alloc_size += binder_alloc_buffer_size(alloc, buffer)
-                       + sizeof(struct binder_buffer);
+               total_alloc_size += binder_alloc_buffer_size(alloc, buffer);
                num_buffers++;
        }
  
        return false;
  }
  
+ /* Callers preallocate @new_buffer, it is freed by this function if unused */
  static struct binder_buffer *binder_alloc_new_buf_locked(
                                struct binder_alloc *alloc,
-                               size_t data_size,
-                               size_t offsets_size,
-                               size_t extra_buffers_size,
-                               int is_async,
-                               int pid)
+                               struct binder_buffer *new_buffer,
+                               size_t size,
+                               int is_async)
  {
        struct rb_node *n = alloc->free_buffers.rb_node;
+       struct rb_node *best_fit = NULL;
        struct binder_buffer *buffer;
+       unsigned long next_used_page;
+       unsigned long curr_last_page;
        size_t buffer_size;
-       struct rb_node *best_fit = NULL;
-       void __user *has_page_addr;
-       void __user *end_page_addr;
-       size_t size, data_offsets_size;
-       int ret;
  
-       /* Check binder_alloc is fully initialized */
-       if (!binder_alloc_get_vma(alloc)) {
-               binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
-                                  "%d: binder_alloc_buf, no vma\n",
-                                  alloc->pid);
-               return ERR_PTR(-ESRCH);
-       }
-       data_offsets_size = ALIGN(data_size, sizeof(void *)) +
-               ALIGN(offsets_size, sizeof(void *));
-       if (data_offsets_size < data_size || data_offsets_size < offsets_size) {
-               binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
-                               "%d: got transaction with invalid size %zd-%zd\n",
-                               alloc->pid, data_size, offsets_size);
-               return ERR_PTR(-EINVAL);
-       }
-       size = data_offsets_size + ALIGN(extra_buffers_size, sizeof(void *));
-       if (size < data_offsets_size || size < extra_buffers_size) {
-               binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
-                               "%d: got transaction with invalid extra_buffers_size %zd\n",
-                               alloc->pid, extra_buffers_size);
-               return ERR_PTR(-EINVAL);
-       }
-       if (is_async &&
-           alloc->free_async_space < size + sizeof(struct binder_buffer)) {
+       if (is_async && alloc->free_async_space < size) {
                binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
                             "%d: binder_alloc_buf size %zd failed, no async space left\n",
                              alloc->pid, size);
-               return ERR_PTR(-ENOSPC);
+               buffer = ERR_PTR(-ENOSPC);
+               goto out;
        }
  
-       /* Pad 0-size buffers so they get assigned unique addresses */
-       size = max(size, sizeof(void *));
        while (n) {
                buffer = rb_entry(n, struct binder_buffer, rb_node);
                BUG_ON(!buffer->free);
                if (size < buffer_size) {
                        best_fit = n;
                        n = n->rb_left;
-               } else if (size > buffer_size)
+               } else if (size > buffer_size) {
                        n = n->rb_right;
-               else {
+               else {
                        best_fit = n;
                        break;
                }
        }
-       if (best_fit == NULL) {
-               size_t allocated_buffers = 0;
-               size_t largest_alloc_size = 0;
-               size_t total_alloc_size = 0;
-               size_t free_buffers = 0;
-               size_t largest_free_size = 0;
-               size_t total_free_size = 0;
-               for (n = rb_first(&alloc->allocated_buffers); n != NULL;
-                    n = rb_next(n)) {
-                       buffer = rb_entry(n, struct binder_buffer, rb_node);
-                       buffer_size = binder_alloc_buffer_size(alloc, buffer);
-                       allocated_buffers++;
-                       total_alloc_size += buffer_size;
-                       if (buffer_size > largest_alloc_size)
-                               largest_alloc_size = buffer_size;
-               }
-               for (n = rb_first(&alloc->free_buffers); n != NULL;
-                    n = rb_next(n)) {
-                       buffer = rb_entry(n, struct binder_buffer, rb_node);
-                       buffer_size = binder_alloc_buffer_size(alloc, buffer);
-                       free_buffers++;
-                       total_free_size += buffer_size;
-                       if (buffer_size > largest_free_size)
-                               largest_free_size = buffer_size;
-               }
+       if (unlikely(!best_fit)) {
                binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
                                   "%d: binder_alloc_buf size %zd failed, no address space\n",
                                   alloc->pid, size);
-               binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
-                                  "allocated: %zd (num: %zd largest: %zd), free: %zd (num: %zd largest: %zd)\n",
-                                  total_alloc_size, allocated_buffers,
-                                  largest_alloc_size, total_free_size,
-                                  free_buffers, largest_free_size);
-               return ERR_PTR(-ENOSPC);
+               debug_no_space_locked(alloc);
+               buffer = ERR_PTR(-ENOSPC);
+               goto out;
        }
-       if (n == NULL) {
+       if (buffer_size != size) {
+               /* Found an oversized buffer and needs to be split */
                buffer = rb_entry(best_fit, struct binder_buffer, rb_node);
                buffer_size = binder_alloc_buffer_size(alloc, buffer);
+               WARN_ON(n || buffer_size == size);
+               new_buffer->user_data = buffer->user_data + size;
+               list_add(&new_buffer->entry, &buffer->entry);
+               new_buffer->free = 1;
+               binder_insert_free_buffer(alloc, new_buffer);
+               new_buffer = NULL;
        }
  
        binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
                     "%d: binder_alloc_buf size %zd got buffer %pK size %zd\n",
                      alloc->pid, size, buffer, buffer_size);
  
-       has_page_addr = (void __user *)
-               (((uintptr_t)buffer->user_data + buffer_size) & PAGE_MASK);
-       WARN_ON(n && buffer_size != size);
-       end_page_addr =
-               (void __user *)PAGE_ALIGN((uintptr_t)buffer->user_data + size);
-       if (end_page_addr > has_page_addr)
-               end_page_addr = has_page_addr;
-       ret = binder_update_page_range(alloc, 1, (void __user *)
-               PAGE_ALIGN((uintptr_t)buffer->user_data), end_page_addr);
-       if (ret)
-               return ERR_PTR(ret);
-       if (buffer_size != size) {
-               struct binder_buffer *new_buffer;
-               new_buffer = kzalloc(sizeof(*buffer), GFP_KERNEL);
-               if (!new_buffer) {
-                       pr_err("%s: %d failed to alloc new buffer struct\n",
-                              __func__, alloc->pid);
-                       goto err_alloc_buf_struct_failed;
-               }
-               new_buffer->user_data = (u8 __user *)buffer->user_data + size;
-               list_add(&new_buffer->entry, &buffer->entry);
-               new_buffer->free = 1;
-               binder_insert_free_buffer(alloc, new_buffer);
-       }
+       /*
+        * Now we remove the pages from the freelist. A clever calculation
+        * with buffer_size determines if the last page is shared with an
+        * adjacent in-use buffer. In such case, the page has been already
+        * removed from the freelist so we trim our range short.
+        */
+       next_used_page = (buffer->user_data + buffer_size) & PAGE_MASK;
+       curr_last_page = PAGE_ALIGN(buffer->user_data + size);
+       binder_lru_freelist_del(alloc, PAGE_ALIGN(buffer->user_data),
+                               min(next_used_page, curr_last_page));
  
-       rb_erase(best_fit, &alloc->free_buffers);
+       rb_erase(&buffer->rb_node, &alloc->free_buffers);
        buffer->free = 0;
        buffer->allow_user_free = 0;
        binder_insert_allocated_buffer_locked(alloc, buffer);
-       binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
-                    "%d: binder_alloc_buf size %zd got %pK\n",
-                     alloc->pid, size, buffer);
-       buffer->data_size = data_size;
-       buffer->offsets_size = offsets_size;
        buffer->async_transaction = is_async;
-       buffer->extra_buffers_size = extra_buffers_size;
-       buffer->pid = pid;
        buffer->oneway_spam_suspect = false;
        if (is_async) {
-               alloc->free_async_space -= size + sizeof(struct binder_buffer);
+               alloc->free_async_space -= size;
                binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC,
                             "%d: binder_alloc_buf size %zd async free %zd\n",
                              alloc->pid, size, alloc->free_async_space);
-               if (alloc->free_async_space < alloc->buffer_size / 10) {
-                       /*
-                        * Start detecting spammers once we have less than 20%
-                        * of async space left (which is less than 10% of total
-                        * buffer size).
-                        */
-                       buffer->oneway_spam_suspect = debug_low_async_space_locked(alloc, pid);
-               } else {
-                       alloc->oneway_spam_detected = false;
-               }
+               if (debug_low_async_space_locked(alloc))
+                       buffer->oneway_spam_suspect = true;
        }
+ out:
+       /* Discard possibly unused new_buffer */
+       kfree(new_buffer);
        return buffer;
+ }
  
- err_alloc_buf_struct_failed:
-       binder_update_page_range(alloc, 0, (void __user *)
-                                PAGE_ALIGN((uintptr_t)buffer->user_data),
-                                end_page_addr);
-       return ERR_PTR(-ENOMEM);
+ /* Calculate the sanitized total size, returns 0 for invalid request */
+ static inline size_t sanitized_size(size_t data_size,
+                                   size_t offsets_size,
+                                   size_t extra_buffers_size)
+ {
+       size_t total, tmp;
+       /* Align to pointer size and check for overflows */
+       tmp = ALIGN(data_size, sizeof(void *)) +
+               ALIGN(offsets_size, sizeof(void *));
+       if (tmp < data_size || tmp < offsets_size)
+               return 0;
+       total = tmp + ALIGN(extra_buffers_size, sizeof(void *));
+       if (total < tmp || total < extra_buffers_size)
+               return 0;
+       /* Pad 0-sized buffers so they get a unique address */
+       total = max(total, sizeof(void *));
+       return total;
  }
  
  /**
   * @offsets_size:       user specified buffer offset
   * @extra_buffers_size: size of extra space for meta-data (eg, security context)
   * @is_async:           buffer for async transaction
-  * @pid:                              pid to attribute allocation to (used for debugging)
   *
   * Allocate a new buffer given the requested sizes. Returns
   * the kernel version of the buffer pointer. The size allocated
   * is the sum of the three given sizes (each rounded up to
   * pointer-sized boundary)
   *
-  * Return:    The allocated buffer or %NULL if error
+  * Return:    The allocated buffer or %ERR_PTR(-errno) if error
   */
  struct binder_buffer *binder_alloc_new_buf(struct binder_alloc *alloc,
                                           size_t data_size,
                                           size_t offsets_size,
                                           size_t extra_buffers_size,
-                                          int is_async,
-                                          int pid)
+                                          int is_async)
  {
-       struct binder_buffer *buffer;
+       struct binder_buffer *buffer, *next;
+       size_t size;
+       int ret;
+       /* Check binder_alloc is fully initialized */
+       if (!binder_alloc_get_vma(alloc)) {
+               binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
+                                  "%d: binder_alloc_buf, no vma\n",
+                                  alloc->pid);
+               return ERR_PTR(-ESRCH);
+       }
+       size = sanitized_size(data_size, offsets_size, extra_buffers_size);
+       if (unlikely(!size)) {
+               binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
+                                  "%d: got transaction with invalid size %zd-%zd-%zd\n",
+                                  alloc->pid, data_size, offsets_size,
+                                  extra_buffers_size);
+               return ERR_PTR(-EINVAL);
+       }
+       /* Preallocate the next buffer */
+       next = kzalloc(sizeof(*next), GFP_KERNEL);
+       if (!next)
+               return ERR_PTR(-ENOMEM);
  
-       mutex_lock(&alloc->mutex);
-       buffer = binder_alloc_new_buf_locked(alloc, data_size, offsets_size,
-                                            extra_buffers_size, is_async, pid);
-       mutex_unlock(&alloc->mutex);
+       spin_lock(&alloc->lock);
+       buffer = binder_alloc_new_buf_locked(alloc, next, size, is_async);
+       if (IS_ERR(buffer)) {
+               spin_unlock(&alloc->lock);
+               goto out;
+       }
+       buffer->data_size = data_size;
+       buffer->offsets_size = offsets_size;
+       buffer->extra_buffers_size = extra_buffers_size;
+       buffer->pid = current->tgid;
+       spin_unlock(&alloc->lock);
+       ret = binder_install_buffer_pages(alloc, buffer, size);
+       if (ret) {
+               binder_alloc_free_buf(alloc, buffer);
+               buffer = ERR_PTR(ret);
+       }
+ out:
        return buffer;
  }
  
- static void __user *buffer_start_page(struct binder_buffer *buffer)
+ static unsigned long buffer_start_page(struct binder_buffer *buffer)
  {
-       return (void __user *)((uintptr_t)buffer->user_data & PAGE_MASK);
+       return buffer->user_data & PAGE_MASK;
  }
  
- static void __user *prev_buffer_end_page(struct binder_buffer *buffer)
+ static unsigned long prev_buffer_end_page(struct binder_buffer *buffer)
  {
-       return (void __user *)
-               (((uintptr_t)(buffer->user_data) - 1) & PAGE_MASK);
+       return (buffer->user_data - 1) & PAGE_MASK;
  }
  
  static void binder_delete_free_buffer(struct binder_alloc *alloc,
                                      struct binder_buffer *buffer)
  {
-       struct binder_buffer *prev, *next = NULL;
-       bool to_free = true;
+       struct binder_buffer *prev, *next;
+       if (PAGE_ALIGNED(buffer->user_data))
+               goto skip_freelist;
  
        BUG_ON(alloc->buffers.next == &buffer->entry);
        prev = binder_buffer_prev(buffer);
        BUG_ON(!prev->free);
-       if (prev_buffer_end_page(prev) == buffer_start_page(buffer)) {
-               to_free = false;
-               binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
-                                  "%d: merge free, buffer %pK share page with %pK\n",
-                                  alloc->pid, buffer->user_data,
-                                  prev->user_data);
-       }
+       if (prev_buffer_end_page(prev) == buffer_start_page(buffer))
+               goto skip_freelist;
  
        if (!list_is_last(&buffer->entry, &alloc->buffers)) {
                next = binder_buffer_next(buffer);
-               if (buffer_start_page(next) == buffer_start_page(buffer)) {
-                       to_free = false;
-                       binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
-                                          "%d: merge free, buffer %pK share page with %pK\n",
-                                          alloc->pid,
-                                          buffer->user_data,
-                                          next->user_data);
-               }
+               if (buffer_start_page(next) == buffer_start_page(buffer))
+                       goto skip_freelist;
        }
  
-       if (PAGE_ALIGNED(buffer->user_data)) {
-               binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
-                                  "%d: merge free, buffer start %pK is page aligned\n",
-                                  alloc->pid, buffer->user_data);
-               to_free = false;
-       }
-       if (to_free) {
-               binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
-                                  "%d: merge free, buffer %pK do not share page with %pK or %pK\n",
-                                  alloc->pid, buffer->user_data,
-                                  prev->user_data,
-                                  next ? next->user_data : NULL);
-               binder_update_page_range(alloc, 0, buffer_start_page(buffer),
-                                        buffer_start_page(buffer) + PAGE_SIZE);
-       }
+       binder_lru_freelist_add(alloc, buffer_start_page(buffer),
+                               buffer_start_page(buffer) + PAGE_SIZE);
+ skip_freelist:
        list_del(&buffer->entry);
        kfree(buffer);
  }
@@@ -657,17 -678,14 +678,14 @@@ static void binder_free_buf_locked(stru
        BUG_ON(buffer->user_data > alloc->buffer + alloc->buffer_size);
  
        if (buffer->async_transaction) {
-               alloc->free_async_space += buffer_size + sizeof(struct binder_buffer);
+               alloc->free_async_space += buffer_size;
                binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC,
                             "%d: binder_free_buf size %zd async free %zd\n",
                              alloc->pid, size, alloc->free_async_space);
        }
  
-       binder_update_page_range(alloc, 0,
-               (void __user *)PAGE_ALIGN((uintptr_t)buffer->user_data),
-               (void __user *)(((uintptr_t)
-                         buffer->user_data + buffer_size) & PAGE_MASK));
+       binder_lru_freelist_add(alloc, PAGE_ALIGN(buffer->user_data),
+                               (buffer->user_data + buffer_size) & PAGE_MASK);
  
        rb_erase(&buffer->rb_node, &alloc->allocated_buffers);
        buffer->free = 1;
        binder_insert_free_buffer(alloc, buffer);
  }
  
+ /**
+  * binder_alloc_get_page() - get kernel pointer for given buffer offset
+  * @alloc: binder_alloc for this proc
+  * @buffer: binder buffer to be accessed
+  * @buffer_offset: offset into @buffer data
+  * @pgoffp: address to copy final page offset to
+  *
+  * Lookup the struct page corresponding to the address
+  * at @buffer_offset into @buffer->user_data. If @pgoffp is not
+  * NULL, the byte-offset into the page is written there.
+  *
+  * The caller is responsible to ensure that the offset points
+  * to a valid address within the @buffer and that @buffer is
+  * not freeable by the user. Since it can't be freed, we are
+  * guaranteed that the corresponding elements of @alloc->pages[]
+  * cannot change.
+  *
+  * Return: struct page
+  */
+ static struct page *binder_alloc_get_page(struct binder_alloc *alloc,
+                                         struct binder_buffer *buffer,
+                                         binder_size_t buffer_offset,
+                                         pgoff_t *pgoffp)
+ {
+       binder_size_t buffer_space_offset = buffer_offset +
+               (buffer->user_data - alloc->buffer);
+       pgoff_t pgoff = buffer_space_offset & ~PAGE_MASK;
+       size_t index = buffer_space_offset >> PAGE_SHIFT;
+       struct binder_lru_page *lru_page;
+       lru_page = &alloc->pages[index];
+       *pgoffp = pgoff;
+       return lru_page->page_ptr;
+ }
+ /**
+  * binder_alloc_clear_buf() - zero out buffer
+  * @alloc: binder_alloc for this proc
+  * @buffer: binder buffer to be cleared
+  *
+  * memset the given buffer to 0
+  */
  static void binder_alloc_clear_buf(struct binder_alloc *alloc,
-                                  struct binder_buffer *buffer);
+                                  struct binder_buffer *buffer)
+ {
+       size_t bytes = binder_alloc_buffer_size(alloc, buffer);
+       binder_size_t buffer_offset = 0;
+       while (bytes) {
+               unsigned long size;
+               struct page *page;
+               pgoff_t pgoff;
+               page = binder_alloc_get_page(alloc, buffer,
+                                            buffer_offset, &pgoff);
+               size = min_t(size_t, bytes, PAGE_SIZE - pgoff);
+               memset_page(page, pgoff, 0, size);
+               bytes -= size;
+               buffer_offset += size;
+       }
+ }
  /**
   * binder_alloc_free_buf() - free a binder buffer
   * @alloc:    binder_alloc for this proc
@@@ -706,18 -784,18 +784,18 @@@ void binder_alloc_free_buf(struct binde
        /*
         * We could eliminate the call to binder_alloc_clear_buf()
         * from binder_alloc_deferred_release() by moving this to
-        * binder_alloc_free_buf_locked(). However, that could
-        * increase contention for the alloc mutex if clear_on_free
-        * is used frequently for large buffers. The mutex is not
+        * binder_free_buf_locked(). However, that could
+        * increase contention for the alloc->lock if clear_on_free
+        * is used frequently for large buffers. This lock is not
         * needed for correctness here.
         */
        if (buffer->clear_on_free) {
                binder_alloc_clear_buf(alloc, buffer);
                buffer->clear_on_free = false;
        }
-       mutex_lock(&alloc->mutex);
+       spin_lock(&alloc->lock);
        binder_free_buf_locked(alloc, buffer);
-       mutex_unlock(&alloc->mutex);
+       spin_unlock(&alloc->lock);
  }
  
  /**
  int binder_alloc_mmap_handler(struct binder_alloc *alloc,
                              struct vm_area_struct *vma)
  {
-       int ret;
-       const char *failure_string;
        struct binder_buffer *buffer;
+       const char *failure_string;
+       int ret, i;
  
        if (unlikely(vma->vm_mm != alloc->mm)) {
                ret = -EINVAL;
                                   SZ_4M);
        mutex_unlock(&binder_alloc_mmap_lock);
  
-       alloc->buffer = (void __user *)vma->vm_start;
+       alloc->buffer = vma->vm_start;
  
        alloc->pages = kcalloc(alloc->buffer_size / PAGE_SIZE,
                               sizeof(alloc->pages[0]),
                goto err_alloc_pages_failed;
        }
  
+       for (i = 0; i < alloc->buffer_size / PAGE_SIZE; i++) {
+               alloc->pages[i].alloc = alloc;
+               INIT_LIST_HEAD(&alloc->pages[i].lru);
+       }
        buffer = kzalloc(sizeof(*buffer), GFP_KERNEL);
        if (!buffer) {
                ret = -ENOMEM;
@@@ -789,7 -872,7 +872,7 @@@ err_alloc_buf_struct_failed
        kfree(alloc->pages);
        alloc->pages = NULL;
  err_alloc_pages_failed:
-       alloc->buffer = NULL;
+       alloc->buffer = 0;
        mutex_lock(&binder_alloc_mmap_lock);
        alloc->buffer_size = 0;
  err_already_mapped:
@@@ -810,7 -893,7 +893,7 @@@ void binder_alloc_deferred_release(stru
        struct binder_buffer *buffer;
  
        buffers = 0;
-       mutex_lock(&alloc->mutex);
+       spin_lock(&alloc->lock);
        BUG_ON(alloc->vma);
  
        while ((n = rb_first(&alloc->allocated_buffers))) {
                int i;
  
                for (i = 0; i < alloc->buffer_size / PAGE_SIZE; i++) {
-                       void __user *page_addr;
+                       unsigned long page_addr;
                        bool on_lru;
  
                        if (!alloc->pages[i].page_ptr)
                                continue;
  
-                       on_lru = list_lru_del_obj(&binder_alloc_lru,
 -                      on_lru = list_lru_del(&binder_freelist,
--                                            &alloc->pages[i].lru);
++                      on_lru = list_lru_del_obj(&binder_freelist,
++                                                &alloc->pages[i].lru);
                        page_addr = alloc->buffer + i * PAGE_SIZE;
                        binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
-                                    "%s: %d: page %d at %pK %s\n",
-                                    __func__, alloc->pid, i, page_addr,
+                                    "%s: %d: page %d %s\n",
+                                    __func__, alloc->pid, i,
                                     on_lru ? "on lru" : "active");
                        __free_page(alloc->pages[i].page_ptr);
                        page_count++;
                }
                kfree(alloc->pages);
        }
-       mutex_unlock(&alloc->mutex);
+       spin_unlock(&alloc->lock);
        if (alloc->mm)
                mmdrop(alloc->mm);
  
                     __func__, alloc->pid, buffers, page_count);
  }
  
- static void print_binder_buffer(struct seq_file *m, const char *prefix,
-                               struct binder_buffer *buffer)
- {
-       seq_printf(m, "%s %d: %pK size %zd:%zd:%zd %s\n",
-                  prefix, buffer->debug_id, buffer->user_data,
-                  buffer->data_size, buffer->offsets_size,
-                  buffer->extra_buffers_size,
-                  buffer->transaction ? "active" : "delivered");
- }
  /**
   * binder_alloc_print_allocated() - print buffer info
   * @m:     seq_file for output via seq_printf()
  void binder_alloc_print_allocated(struct seq_file *m,
                                  struct binder_alloc *alloc)
  {
+       struct binder_buffer *buffer;
        struct rb_node *n;
  
-       mutex_lock(&alloc->mutex);
-       for (n = rb_first(&alloc->allocated_buffers); n != NULL; n = rb_next(n))
-               print_binder_buffer(m, "  buffer",
-                                   rb_entry(n, struct binder_buffer, rb_node));
-       mutex_unlock(&alloc->mutex);
+       spin_lock(&alloc->lock);
+       for (n = rb_first(&alloc->allocated_buffers); n; n = rb_next(n)) {
+               buffer = rb_entry(n, struct binder_buffer, rb_node);
+               seq_printf(m, "  buffer %d: %lx size %zd:%zd:%zd %s\n",
+                          buffer->debug_id,
+                          buffer->user_data - alloc->buffer,
+                          buffer->data_size, buffer->offsets_size,
+                          buffer->extra_buffers_size,
+                          buffer->transaction ? "active" : "delivered");
+       }
+       spin_unlock(&alloc->lock);
  }
  
  /**
@@@ -913,7 -993,7 +993,7 @@@ void binder_alloc_print_pages(struct se
        int lru = 0;
        int free = 0;
  
-       mutex_lock(&alloc->mutex);
+       spin_lock(&alloc->lock);
        /*
         * Make sure the binder_alloc is fully initialized, otherwise we might
         * read inconsistent state.
                                lru++;
                }
        }
-       mutex_unlock(&alloc->mutex);
+       spin_unlock(&alloc->lock);
        seq_printf(m, "  pages: %d:%d:%d\n", active, lru, free);
        seq_printf(m, "  pages high watermark: %zu\n", alloc->pages_high);
  }
@@@ -945,10 -1025,10 +1025,10 @@@ int binder_alloc_get_allocated_count(st
        struct rb_node *n;
        int count = 0;
  
-       mutex_lock(&alloc->mutex);
+       spin_lock(&alloc->lock);
        for (n = rb_first(&alloc->allocated_buffers); n != NULL; n = rb_next(n))
                count++;
-       mutex_unlock(&alloc->mutex);
+       spin_unlock(&alloc->lock);
        return count;
  }
  
@@@ -981,33 -1061,39 +1061,39 @@@ enum lru_status binder_alloc_free_page(
                                       void *cb_arg)
        __must_hold(lock)
  {
-       struct mm_struct *mm = NULL;
-       struct binder_lru_page *page = container_of(item,
-                                                   struct binder_lru_page,
-                                                   lru);
-       struct binder_alloc *alloc;
-       uintptr_t page_addr;
-       size_t index;
+       struct binder_lru_page *page = container_of(item, typeof(*page), lru);
+       struct binder_alloc *alloc = page->alloc;
+       struct mm_struct *mm = alloc->mm;
        struct vm_area_struct *vma;
+       struct page *page_to_free;
+       unsigned long page_addr;
+       size_t index;
  
-       alloc = page->alloc;
-       if (!mutex_trylock(&alloc->mutex))
-               goto err_get_alloc_mutex_failed;
+       if (!mmget_not_zero(mm))
+               goto err_mmget;
+       if (!mmap_read_trylock(mm))
+               goto err_mmap_read_lock_failed;
+       if (!spin_trylock(&alloc->lock))
+               goto err_get_alloc_lock_failed;
        if (!page->page_ptr)
                goto err_page_already_freed;
  
        index = page - alloc->pages;
-       page_addr = (uintptr_t)alloc->buffer + index * PAGE_SIZE;
+       page_addr = alloc->buffer + index * PAGE_SIZE;
  
-       mm = alloc->mm;
-       if (!mmget_not_zero(mm))
-               goto err_mmget;
-       if (!mmap_read_trylock(mm))
-               goto err_mmap_read_lock_failed;
-       vma = binder_alloc_get_vma(alloc);
+       vma = vma_lookup(mm, page_addr);
+       if (vma && vma != binder_alloc_get_vma(alloc))
+               goto err_invalid_vma;
+       trace_binder_unmap_kernel_start(alloc, index);
+       page_to_free = page->page_ptr;
+       page->page_ptr = NULL;
+       trace_binder_unmap_kernel_end(alloc, index);
  
        list_lru_isolate(lru, item);
+       spin_unlock(&alloc->lock);
        spin_unlock(lock);
  
        if (vma) {
  
                trace_binder_unmap_user_end(alloc, index);
        }
        mmap_read_unlock(mm);
        mmput_async(mm);
-       trace_binder_unmap_kernel_start(alloc, index);
-       __free_page(page->page_ptr);
-       page->page_ptr = NULL;
-       trace_binder_unmap_kernel_end(alloc, index);
+       __free_page(page_to_free);
  
        spin_lock(lock);
-       mutex_unlock(&alloc->mutex);
        return LRU_REMOVED_RETRY;
  
+ err_invalid_vma:
+ err_page_already_freed:
+       spin_unlock(&alloc->lock);
+ err_get_alloc_lock_failed:
+       mmap_read_unlock(mm);
  err_mmap_read_lock_failed:
        mmput_async(mm);
  err_mmget:
- err_page_already_freed:
-       mutex_unlock(&alloc->mutex);
- err_get_alloc_mutex_failed:
        return LRU_SKIP;
  }
  
  static unsigned long
  binder_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
  {
-       return list_lru_count(&binder_alloc_lru);
+       return list_lru_count(&binder_freelist);
  }
  
  static unsigned long
  binder_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
  {
-       return list_lru_walk(&binder_alloc_lru, binder_alloc_free_page,
+       return list_lru_walk(&binder_freelist, binder_alloc_free_page,
                            NULL, sc->nr_to_scan);
  }
  
@@@ -1067,7 -1149,7 +1149,7 @@@ void binder_alloc_init(struct binder_al
        alloc->pid = current->group_leader->pid;
        alloc->mm = current->mm;
        mmgrab(alloc->mm);
-       mutex_init(&alloc->mutex);
+       spin_lock_init(&alloc->lock);
        INIT_LIST_HEAD(&alloc->buffers);
  }
  
@@@ -1075,13 -1157,13 +1157,13 @@@ int binder_alloc_shrinker_init(void
  {
        int ret;
  
-       ret = list_lru_init(&binder_alloc_lru);
+       ret = list_lru_init(&binder_freelist);
        if (ret)
                return ret;
  
        binder_shrinker = shrinker_alloc(0, "android-binder");
        if (!binder_shrinker) {
-               list_lru_destroy(&binder_alloc_lru);
+               list_lru_destroy(&binder_freelist);
                return -ENOMEM;
        }
  
  void binder_alloc_shrinker_exit(void)
  {
        shrinker_free(binder_shrinker);
-       list_lru_destroy(&binder_alloc_lru);
+       list_lru_destroy(&binder_freelist);
  }
  
  /**
@@@ -1131,68 -1213,6 +1213,6 @@@ static inline bool check_buffer(struct 
                (!buffer->allow_user_free || !buffer->transaction);
  }
  
- /**
-  * binder_alloc_get_page() - get kernel pointer for given buffer offset
-  * @alloc: binder_alloc for this proc
-  * @buffer: binder buffer to be accessed
-  * @buffer_offset: offset into @buffer data
-  * @pgoffp: address to copy final page offset to
-  *
-  * Lookup the struct page corresponding to the address
-  * at @buffer_offset into @buffer->user_data. If @pgoffp is not
-  * NULL, the byte-offset into the page is written there.
-  *
-  * The caller is responsible to ensure that the offset points
-  * to a valid address within the @buffer and that @buffer is
-  * not freeable by the user. Since it can't be freed, we are
-  * guaranteed that the corresponding elements of @alloc->pages[]
-  * cannot change.
-  *
-  * Return: struct page
-  */
- static struct page *binder_alloc_get_page(struct binder_alloc *alloc,
-                                         struct binder_buffer *buffer,
-                                         binder_size_t buffer_offset,
-                                         pgoff_t *pgoffp)
- {
-       binder_size_t buffer_space_offset = buffer_offset +
-               (buffer->user_data - alloc->buffer);
-       pgoff_t pgoff = buffer_space_offset & ~PAGE_MASK;
-       size_t index = buffer_space_offset >> PAGE_SHIFT;
-       struct binder_lru_page *lru_page;
-       lru_page = &alloc->pages[index];
-       *pgoffp = pgoff;
-       return lru_page->page_ptr;
- }
- /**
-  * binder_alloc_clear_buf() - zero out buffer
-  * @alloc: binder_alloc for this proc
-  * @buffer: binder buffer to be cleared
-  *
-  * memset the given buffer to 0
-  */
- static void binder_alloc_clear_buf(struct binder_alloc *alloc,
-                                  struct binder_buffer *buffer)
- {
-       size_t bytes = binder_alloc_buffer_size(alloc, buffer);
-       binder_size_t buffer_offset = 0;
-       while (bytes) {
-               unsigned long size;
-               struct page *page;
-               pgoff_t pgoff;
-               page = binder_alloc_get_page(alloc, buffer,
-                                            buffer_offset, &pgoff);
-               size = min_t(size_t, bytes, PAGE_SIZE - pgoff);
-               memset_page(page, pgoff, 0, size);
-               bytes -= size;
-               buffer_offset += size;
-       }
- }
  /**
   * binder_alloc_copy_user_to_buffer() - copy src user to tgt user
   * @alloc: binder_alloc for this proc
@@@ -1287,3 -1307,4 +1307,3 @@@ int binder_alloc_copy_from_buffer(struc
        return binder_alloc_do_buffer_copy(alloc, false, buffer, buffer_offset,
                                           dest, bytes);
  }
 -
diff --combined drivers/base/property.c
index b79608ee0b46be36bb74578de285797ad4da22e0,8f8e2a6816bc00a67d3600d5e46bed9ac3fff33b..6e39db62446d155054abafa1681020a0fb1910ff
@@@ -473,7 -473,7 +473,7 @@@ int fwnode_property_match_string(const 
        const char **values;
        int nval, ret;
  
-       nval = fwnode_property_read_string_array(fwnode, propname, NULL, 0);
+       nval = fwnode_property_string_array_count(fwnode, propname);
        if (nval < 0)
                return nval;
  
@@@ -498,6 -498,41 +498,41 @@@ out_free
  }
  EXPORT_SYMBOL_GPL(fwnode_property_match_string);
  
+ /**
+  * fwnode_property_match_property_string - find a property string value in an array and return index
+  * @fwnode: Firmware node to get the property of
+  * @propname: Name of the property holding the string value
+  * @array: String array to search in
+  * @n: Size of the @array
+  *
+  * Find a property string value in a given @array and if it is found return
+  * the index back.
+  *
+  * Return: index, starting from %0, if the string value was found in the @array (success),
+  *       %-ENOENT when the string value was not found in the @array,
+  *       %-EINVAL if given arguments are not valid,
+  *       %-ENODATA if the property does not have a value,
+  *       %-EPROTO or %-EILSEQ if the property is not a string,
+  *       %-ENXIO if no suitable firmware interface is present.
+  */
+ int fwnode_property_match_property_string(const struct fwnode_handle *fwnode,
+       const char *propname, const char * const *array, size_t n)
+ {
+       const char *string;
+       int ret;
+       ret = fwnode_property_read_string(fwnode, propname, &string);
+       if (ret)
+               return ret;
+       ret = match_string(array, n, string);
+       if (ret < 0)
+               ret = -ENOENT;
+       return ret;
+ }
+ EXPORT_SYMBOL_GPL(fwnode_property_match_property_string);
  /**
   * fwnode_property_get_reference_args() - Find a reference with arguments
   * @fwnode:   Firmware node where to look for the reference
@@@ -594,34 -629,6 +629,34 @@@ const char *fwnode_get_name_prefix(cons
        return fwnode_call_ptr_op(fwnode, get_name_prefix);
  }
  
 +/**
 + * fwnode_name_eq - Return true if node name is equal
 + * @fwnode: The firmware node
 + * @name: The name to which to compare the node name
 + *
 + * Compare the name provided as an argument to the name of the node, stopping
 + * the comparison at either NUL or '@' character, whichever comes first. This
 + * function is generally used for comparing node names while ignoring the
 + * possible unit address of the node.
 + *
 + * Return: true if the node name matches with the name provided in the @name
 + * argument, false otherwise.
 + */
 +bool fwnode_name_eq(const struct fwnode_handle *fwnode, const char *name)
 +{
 +      const char *node_name;
 +      ptrdiff_t len;
 +
 +      node_name = fwnode_get_name(fwnode);
 +      if (!node_name)
 +              return false;
 +
 +      len = strchrnul(node_name, '@') - node_name;
 +
 +      return str_has_prefix(node_name, name) == len;
 +}
 +EXPORT_SYMBOL_GPL(fwnode_name_eq);
 +
  /**
   * fwnode_get_parent - Return parent firwmare node
   * @fwnode: Firmware whose parent is retrieved
diff --combined drivers/bus/moxtet.c
index e384fbc6c1d93152d03329724c0373d54d0059f0,5e71b4c29992dc3864ad5d78763545d245f8529d..641c1a6adc8ae5fed39237a5aab1639a1e8fdc29
@@@ -102,7 -102,7 +102,7 @@@ static int moxtet_match(struct device *
        return 0;
  }
  
- static struct bus_type moxtet_bus_type = {
+ static const struct bus_type moxtet_bus_type = {
        .name           = "moxtet",
        .dev_groups     = moxtet_dev_groups,
        .match          = moxtet_match,
@@@ -755,7 -755,7 +755,7 @@@ static int moxtet_irq_setup(struct moxt
        moxtet->irq.masked = ~0;
  
        ret = request_threaded_irq(moxtet->dev_irq, NULL, moxtet_irq_thread_fn,
 -                                 IRQF_ONESHOT, "moxtet", moxtet);
 +                                 IRQF_SHARED | IRQF_ONESHOT, "moxtet", moxtet);
        if (ret < 0)
                goto err_free;
  
@@@ -830,12 -830,6 +830,12 @@@ static void moxtet_remove(struct spi_de
        mutex_destroy(&moxtet->lock);
  }
  
 +static const struct spi_device_id moxtet_spi_ids[] = {
 +      { "moxtet" },
 +      { },
 +};
 +MODULE_DEVICE_TABLE(spi, moxtet_spi_ids);
 +
  static const struct of_device_id moxtet_dt_ids[] = {
        { .compatible = "cznic,moxtet" },
        {},
@@@ -847,7 -841,6 +847,7 @@@ static struct spi_driver moxtet_spi_dri
                .name           = "moxtet",
                .of_match_table = moxtet_dt_ids,
        },
 +      .id_table       = moxtet_spi_ids,
        .probe          = moxtet_probe,
        .remove         = moxtet_remove,
  };
index 8625de20fc71752018c261445f250d4abc492f1e,116ed9b375de7655ded881eb815e9c550a4d1a79..62caf454b567079e0962e327c5f9eae6ec85f3d5
@@@ -966,10 -966,10 +966,10 @@@ static int mc_probe(struct platform_dev
        edac_mc_id = emif_get_id(pdev->dev.of_node);
  
        regval = readl(ddrmc_baseaddr + XDDR_REG_CONFIG0_OFFSET);
 -      num_chans = FIELD_PREP(XDDR_REG_CONFIG0_NUM_CHANS_MASK, regval);
 +      num_chans = FIELD_GET(XDDR_REG_CONFIG0_NUM_CHANS_MASK, regval);
        num_chans++;
  
 -      num_csrows = FIELD_PREP(XDDR_REG_CONFIG0_NUM_RANKS_MASK, regval);
 +      num_csrows = FIELD_GET(XDDR_REG_CONFIG0_NUM_RANKS_MASK, regval);
        num_csrows *= 2;
        if (!num_csrows)
                num_csrows = 1;
                goto free_edac_mc;
        }
  
-       rc = xlnx_register_event(PM_NOTIFY_CB, EVENT_ERROR_PMC_ERR1,
+       rc = xlnx_register_event(PM_NOTIFY_CB, VERSAL_EVENT_ERROR_PMC_ERR1,
                                 XPM_EVENT_ERROR_MASK_DDRMC_CR | XPM_EVENT_ERROR_MASK_DDRMC_NCR |
                                 XPM_EVENT_ERROR_MASK_NOC_CR | XPM_EVENT_ERROR_MASK_NOC_NCR,
                                 false, err_callback, mci);
@@@ -1042,7 -1042,7 +1042,7 @@@ static int mc_remove(struct platform_de
        debugfs_remove_recursive(priv->debugfs);
  #endif
  
-       xlnx_unregister_event(PM_NOTIFY_CB, EVENT_ERROR_PMC_ERR1,
+       xlnx_unregister_event(PM_NOTIFY_CB, VERSAL_EVENT_ERROR_PMC_ERR1,
                              XPM_EVENT_ERROR_MASK_DDRMC_CR |
                              XPM_EVENT_ERROR_MASK_NOC_CR |
                              XPM_EVENT_ERROR_MASK_NOC_NCR |
index a9f70e6e58ac39912ba2ccc7814b918684741115,5355fe34fff521fd2235717b6acefb955f9634e3..3ea64b22cf0dfd4493c8179de90b81b822759342
@@@ -85,7 -85,6 +85,7 @@@ struct scmi_xfers_info 
   * @gid: A reference for per-protocol devres management.
   * @users: A refcount to track effective users of this protocol.
   * @priv: Reference for optional protocol private data.
 + * @version: Protocol version supported by the platform as detected at runtime.
   * @ph: An embedded protocol handle that will be passed down to protocol
   *    initialization code to identify this instance.
   *
@@@ -98,7 -97,6 +98,7 @@@ struct scmi_protocol_instance 
        void                            *gid;
        refcount_t                      users;
        void                            *priv;
 +      unsigned int                    version;
        struct scmi_protocol_handle     ph;
  };
  
@@@ -1394,17 -1392,15 +1394,17 @@@ static int version_get(const struct scm
   *
   * @ph: A reference to the protocol handle.
   * @priv: The private data to set.
 + * @version: The detected protocol version for the core to register.
   *
   * Return: 0 on Success
   */
  static int scmi_set_protocol_priv(const struct scmi_protocol_handle *ph,
 -                                void *priv)
 +                                void *priv, u32 version)
  {
        struct scmi_protocol_instance *pi = ph_to_pi(ph);
  
        pi->priv = priv;
 +      pi->version = version;
  
        return 0;
  }
@@@ -1442,7 -1438,6 +1442,7 @@@ struct scmi_msg_resp_domain_name_get 
   * @ph: A protocol handle reference.
   * @cmd_id: The specific command ID to use.
   * @res_id: The specific resource ID to use.
 + * @flags: A pointer to specific flags to use, if any.
   * @name: A pointer to the preallocated area where the retrieved name will be
   *      stored as a NULL terminated string.
   * @len: The len in bytes of the @name char array.
   * Return: 0 on Succcess
   */
  static int scmi_common_extended_name_get(const struct scmi_protocol_handle *ph,
 -                                       u8 cmd_id, u32 res_id, char *name,
 -                                       size_t len)
 +                                       u8 cmd_id, u32 res_id, u32 *flags,
 +                                       char *name, size_t len)
  {
        int ret;
 +      size_t txlen;
        struct scmi_xfer *t;
        struct scmi_msg_resp_domain_name_get *resp;
  
 -      ret = ph->xops->xfer_get_init(ph, cmd_id, sizeof(res_id),
 -                                    sizeof(*resp), &t);
 +      txlen = !flags ? sizeof(res_id) : sizeof(res_id) + sizeof(*flags);
 +      ret = ph->xops->xfer_get_init(ph, cmd_id, txlen, sizeof(*resp), &t);
        if (ret)
                goto out;
  
        put_unaligned_le32(res_id, t->tx.buf);
 +      if (flags)
 +              put_unaligned_le32(*flags, t->tx.buf + sizeof(res_id));
        resp = t->rx.buf;
  
        ret = ph->xops->do_xfer(ph, t);
@@@ -1853,12 -1845,6 +1853,12 @@@ scmi_alloc_init_protocol_instance(struc
        devres_close_group(handle->dev, pi->gid);
        dev_dbg(handle->dev, "Initialized protocol: 0x%X\n", pi->proto->id);
  
 +      if (pi->version > proto->supported_version)
 +              dev_warn(handle->dev,
 +                       "Detected UNSUPPORTED higher version 0x%X for protocol 0x%X."
 +                       "Backward compatibility is NOT assured.\n",
 +                       pi->version, pi->proto->id);
 +
        return pi;
  
  clean:
@@@ -2834,7 -2820,7 +2834,7 @@@ clear_ida
        return ret;
  }
  
- static int scmi_remove(struct platform_device *pdev)
+ static void scmi_remove(struct platform_device *pdev)
  {
        int id;
        struct scmi_info *info = platform_get_drvdata(pdev);
        scmi_cleanup_txrx_channels(info);
  
        ida_free(&scmi_id, info->id);
-       return 0;
  }
  
  static ssize_t protocol_version_show(struct device *dev,
@@@ -2947,7 -2931,7 +2945,7 @@@ static struct platform_driver scmi_driv
                   .dev_groups = versions_groups,
                   },
        .probe = scmi_probe,
-       .remove = scmi_remove,
+       .remove_new = scmi_remove,
  };
  
  /**
diff --combined drivers/fpga/dfl.c
index e73f88050f08d9066990ed329cf4b163e7cc238f,e69b9f1f2a50cb00cc7724e10943471f1c0d7d8a..e6d12fbab653fb9a5fb622497e284ddd553223b3
@@@ -1872,7 -1872,7 +1872,7 @@@ static irqreturn_t dfl_irq_handler(int 
  {
        struct eventfd_ctx *trigger = arg;
  
 -      eventfd_signal(trigger, 1);
 +      eventfd_signal(trigger);
        return IRQ_HANDLED;
  }
  
@@@ -2008,8 -2008,8 +2008,8 @@@ long dfl_feature_ioctl_set_irq(struct p
            (hdr.start + hdr.count < hdr.start))
                return -EINVAL;
  
-       fds = memdup_user((void __user *)(arg + sizeof(hdr)),
-                         array_size(hdr.count, sizeof(s32)));
+       fds = memdup_array_user((void __user *)(arg + sizeof(hdr)),
+                               hdr.count, sizeof(s32));
        if (IS_ERR(fds))
                return PTR_ERR(fds);
  
index 6b034dccc3b17ee4e7898ca9bbda08243a8cc544,4713e3bc59e0ccf96d8178fa4995c929bdcae159..0e94e5335e9371969f145f41c2c6f345ca90f0ac
@@@ -567,15 -567,12 +567,12 @@@ static int inv_mpu6050_init_config(stru
  static int inv_mpu6050_sensor_set(struct inv_mpu6050_state  *st, int reg,
                                int axis, int val)
  {
-       int ind, result;
+       int ind;
        __be16 d = cpu_to_be16(val);
  
        ind = (axis - IIO_MOD_X) * 2;
-       result = regmap_bulk_write(st->map, reg + ind, &d, sizeof(d));
-       if (result)
-               return -EINVAL;
  
-       return 0;
+       return regmap_bulk_write(st->map, reg + ind, &d, sizeof(d));
  }
  
  static int inv_mpu6050_sensor_show(struct inv_mpu6050_state  *st, int reg,
        ind = (axis - IIO_MOD_X) * 2;
        result = regmap_bulk_read(st->map, reg + ind, &d, sizeof(d));
        if (result)
-               return -EINVAL;
+               return result;
        *val = (short)be16_to_cpup(&d);
  
        return IIO_VAL_INT;
@@@ -750,13 -747,13 +747,13 @@@ inv_mpu6050_read_raw(struct iio_dev *in
                        ret = inv_mpu6050_sensor_show(st, st->reg->gyro_offset,
                                                chan->channel2, val);
                        mutex_unlock(&st->lock);
 -                      return IIO_VAL_INT;
 +                      return ret;
                case IIO_ACCEL:
                        mutex_lock(&st->lock);
                        ret = inv_mpu6050_sensor_show(st, st->reg->accl_offset,
                                                chan->channel2, val);
                        mutex_unlock(&st->lock);
 -                      return IIO_VAL_INT;
 +                      return ret;
  
                default:
                        return -EINVAL;
index e8c4ca142d21d6638f6fbfe92e98e212e9d6915a,bcd989d650591d9176c64089db08ca569fdf2723..218b1ce076c19ddef897ac473781a15180f0e4d5
@@@ -356,7 -356,7 +356,7 @@@ static int tmag5273_read_raw(struct iio
        case IIO_CHAN_INFO_OFFSET:
                switch (chan->type) {
                case IIO_TEMP:
 -                      *val = -266314;
 +                      *val = -16005;
                        return IIO_VAL_INT;
                default:
                        return -EINVAL;
@@@ -497,17 -497,13 +497,13 @@@ static int tmag5273_set_operating_mode(
  static void tmag5273_read_device_property(struct tmag5273_data *data)
  {
        struct device *dev = data->dev;
-       const char *str;
        int ret;
  
        data->angle_measurement = TMAG5273_ANGLE_EN_X_Y;
  
-       ret = device_property_read_string(dev, "ti,angle-measurement", &str);
-       if (ret)
-               return;
-       ret = match_string(tmag5273_angle_names,
-                          ARRAY_SIZE(tmag5273_angle_names), str);
+       ret = device_property_match_property_string(dev, "ti,angle-measurement",
+                                                   tmag5273_angle_names,
+                                                   ARRAY_SIZE(tmag5273_angle_names));
        if (ret >= 0)
                data->angle_measurement = ret;
  }
index dbacb2a7af508f5b330e8cc00c87b10ac09b55b4,fb54e78f8fd7482b482c65d75bf504f5e90413a1..a8ed435f696c67cd406092d8662b13ea7ce34273
@@@ -307,7 -307,7 +307,7 @@@ static u64 qcom_icc_calc_rate(struct qc
  
        if (qn->ib_coeff) {
                agg_peak_rate = qn->max_peak[ctx] * 100;
 -              agg_peak_rate = div_u64(qn->max_peak[ctx], qn->ib_coeff);
 +              agg_peak_rate = div_u64(agg_peak_rate, qn->ib_coeff);
        } else {
                agg_peak_rate = qn->max_peak[ctx];
        }
@@@ -627,14 -627,12 +627,12 @@@ err_disable_unprepare_clk
  }
  EXPORT_SYMBOL(qnoc_probe);
  
int qnoc_remove(struct platform_device *pdev)
void qnoc_remove(struct platform_device *pdev)
  {
        struct qcom_icc_provider *qp = platform_get_drvdata(pdev);
  
        icc_provider_deregister(&qp->provider);
        icc_nodes_remove(&qp->provider);
        clk_disable_unprepare(qp->bus_clk);
-       return 0;
  }
  EXPORT_SYMBOL(qnoc_remove);
index b0e6b195601403df3afc368548a6f1e352604805,e386c5732727d04da21dcd9860ab99f26ce9adf0..27a38b97e8a850462fb0bfa31737515f5778741b
@@@ -17,17 -17,11 +17,11 @@@ struct vmci_handle_arr 
        u32 max_capacity;
        u32 size;
        u32 pad;
 -      struct vmci_handle entries[];
 +      struct vmci_handle entries[] __counted_by(capacity);
  };
  
- #define VMCI_HANDLE_ARRAY_HEADER_SIZE                         \
-       offsetof(struct vmci_handle_arr, entries)
  /* Select a default capacity that results in a 64 byte sized array */
  #define VMCI_HANDLE_ARRAY_DEFAULT_CAPACITY                    6
- /* Make sure that the max array size can be expressed by a u32 */
- #define VMCI_HANDLE_ARRAY_MAX_CAPACITY                                \
-       ((U32_MAX - VMCI_HANDLE_ARRAY_HEADER_SIZE - 1) /        \
-       sizeof(struct vmci_handle))
  
  struct vmci_handle_arr *vmci_handle_arr_create(u32 capacity, u32 max_capacity);
  void vmci_handle_arr_destroy(struct vmci_handle_arr *array);
diff --combined drivers/of/platform.c
index af0e1fb2ab68832ef19c3b6f4fba816c99984739,c39e49a1eba00afaeee4baa3c3a735023fd4c6a2..b7708a06dc7844d2a4ee5eb67b1d3970c78b30df
@@@ -20,7 -20,6 +20,7 @@@
  #include <linux/of_irq.h>
  #include <linux/of_platform.h>
  #include <linux/platform_device.h>
 +#include <linux/sysfb.h>
  
  #include "of_private.h"
  
@@@ -98,46 -97,6 +98,6 @@@ static const struct of_device_id of_ski
   * mechanism for creating devices from device tree nodes.
   */
  
- /**
-  * of_device_make_bus_id - Use the device node data to assign a unique name
-  * @dev: pointer to device structure that is linked to a device tree node
-  *
-  * This routine will first try using the translated bus address to
-  * derive a unique name. If it cannot, then it will prepend names from
-  * parent nodes until a unique name can be derived.
-  */
- static void of_device_make_bus_id(struct device *dev)
- {
-       struct device_node *node = dev->of_node;
-       const __be32 *reg;
-       u64 addr;
-       u32 mask;
-       /* Construct the name, using parent nodes if necessary to ensure uniqueness */
-       while (node->parent) {
-               /*
-                * If the address can be translated, then that is as much
-                * uniqueness as we need. Make it the first component and return
-                */
-               reg = of_get_property(node, "reg", NULL);
-               if (reg && (addr = of_translate_address(node, reg)) != OF_BAD_ADDR) {
-                       if (!of_property_read_u32(node, "mask", &mask))
-                               dev_set_name(dev, dev_name(dev) ? "%llx.%x.%pOFn:%s" : "%llx.%x.%pOFn",
-                                            addr, ffs(mask) - 1, node, dev_name(dev));
-                       else
-                               dev_set_name(dev, dev_name(dev) ? "%llx.%pOFn:%s" : "%llx.%pOFn",
-                                            addr, node, dev_name(dev));
-                       return;
-               }
-               /* format arguments only used if dev_name() resolves to NULL */
-               dev_set_name(dev, dev_name(dev) ? "%s:%s" : "%s",
-                            kbasename(node->full_name), dev_name(dev));
-               node = node->parent;
-       }
- }
  /**
   * of_device_alloc - Allocate and initialize an of_device
   * @np: device node to assign to device
@@@ -622,21 -581,8 +582,21 @@@ static int __init of_platform_default_p
                }
  
                node = of_get_compatible_child(of_chosen, "simple-framebuffer");
 -              of_platform_device_create(node, NULL, NULL);
 -              of_node_put(node);
 +              if (node) {
 +                      /*
 +                       * Since a "simple-framebuffer" device is already added
 +                       * here, disable the Generic System Framebuffers (sysfb)
 +                       * to prevent it from registering another device for the
 +                       * system framebuffer later (e.g: using the screen_info
 +                       * data that may had been filled as well).
 +                       *
 +                       * This can happen for example on DT systems that do EFI
 +                       * booting and may provide a GOP handle to the EFI stub.
 +                       */
 +                      sysfb_disable();
 +                      of_platform_device_create(node, NULL, NULL);
 +                      of_node_put(node);
 +              }
  
                /* Populate everything else. */
                of_platform_default_populate(NULL, NULL, NULL);
@@@ -682,7 -628,7 +642,7 @@@ EXPORT_SYMBOL_GPL(of_platform_device_de
   * @parent: device which children will be removed
   *
   * Complementary to of_platform_populate(), this function removes children
 - * of the given device (and, recurrently, their children) that have been
 + * of the given device (and, recursively, their children) that have been
   * created from their respective device tree nodes (and only those,
   * leaving others - eg. manually created - unharmed).
   */
@@@ -751,7 -697,7 +711,7 @@@ static int devm_of_platform_match(struc
   * @dev: device that requested to depopulate from device tree data
   *
   * Complementary to devm_of_platform_populate(), this function removes children
 - * of the given device (and, recurrently, their children) that have been
 + * of the given device (and, recursively, their children) that have been
   * created from their respective device tree nodes (and only those,
   * leaving others - eg. manually created - unharmed).
   */
index e0000cef2940106e4236a8fc7d10aa6553e0ef65,d3d6a1054036bb909d584f50b7d11870a821fc90..1c3e4ea76bd2578e47397d0ddbcfa96a8f705574
  /* Platform specific flags */
  #define MHI_EPF_USE_DMA BIT(0)
  
+ struct pci_epf_mhi_dma_transfer {
+       struct pci_epf_mhi *epf_mhi;
+       struct mhi_ep_buf_info buf_info;
+       struct list_head node;
+       dma_addr_t paddr;
+       enum dma_data_direction dir;
+       size_t size;
+ };
  struct pci_epf_mhi_ep_info {
        const struct mhi_ep_cntrl_config *config;
        struct pci_epf_header *epf_header;
@@@ -124,6 -133,10 +133,10 @@@ struct pci_epf_mhi 
        resource_size_t mmio_phys;
        struct dma_chan *dma_chan_tx;
        struct dma_chan *dma_chan_rx;
+       struct workqueue_struct *dma_wq;
+       struct work_struct dma_work;
+       struct list_head dma_list;
+       spinlock_t list_lock;
        u32 mmio_size;
        int irq;
  };
@@@ -205,63 -218,69 +218,69 @@@ static void pci_epf_mhi_raise_irq(struc
         * MHI supplies 0 based MSI vectors but the API expects the vector
         * number to start from 1, so we need to increment the vector by 1.
         */
 -      pci_epc_raise_irq(epc, epf->func_no, epf->vfunc_no, PCI_EPC_IRQ_MSI,
 +      pci_epc_raise_irq(epc, epf->func_no, epf->vfunc_no, PCI_IRQ_MSI,
                          vector + 1);
  }
  
- static int pci_epf_mhi_iatu_read(struct mhi_ep_cntrl *mhi_cntrl, u64 from,
-                                void *to, size_t size)
+ static int pci_epf_mhi_iatu_read(struct mhi_ep_cntrl *mhi_cntrl,
+                                struct mhi_ep_buf_info *buf_info)
  {
        struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
-       size_t offset = get_align_offset(epf_mhi, from);
+       size_t offset = get_align_offset(epf_mhi, buf_info->host_addr);
        void __iomem *tre_buf;
        phys_addr_t tre_phys;
        int ret;
  
        mutex_lock(&epf_mhi->lock);
  
-       ret = __pci_epf_mhi_alloc_map(mhi_cntrl, from, &tre_phys, &tre_buf,
-                                     offset, size);
+       ret = __pci_epf_mhi_alloc_map(mhi_cntrl, buf_info->host_addr, &tre_phys,
+                                     &tre_buf, offset, buf_info->size);
        if (ret) {
                mutex_unlock(&epf_mhi->lock);
                return ret;
        }
  
-       memcpy_fromio(to, tre_buf, size);
+       memcpy_fromio(buf_info->dev_addr, tre_buf, buf_info->size);
  
-       __pci_epf_mhi_unmap_free(mhi_cntrl, from, tre_phys, tre_buf, offset,
-                                size);
+       __pci_epf_mhi_unmap_free(mhi_cntrl, buf_info->host_addr, tre_phys,
+                                tre_buf, offset, buf_info->size);
  
        mutex_unlock(&epf_mhi->lock);
  
+       if (buf_info->cb)
+               buf_info->cb(buf_info);
        return 0;
  }
  
  static int pci_epf_mhi_iatu_write(struct mhi_ep_cntrl *mhi_cntrl,
-                                 void *from, u64 to, size_t size)
+                                 struct mhi_ep_buf_info *buf_info)
  {
        struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
-       size_t offset = get_align_offset(epf_mhi, to);
+       size_t offset = get_align_offset(epf_mhi, buf_info->host_addr);
        void __iomem *tre_buf;
        phys_addr_t tre_phys;
        int ret;
  
        mutex_lock(&epf_mhi->lock);
  
-       ret = __pci_epf_mhi_alloc_map(mhi_cntrl, to, &tre_phys, &tre_buf,
-                                     offset, size);
+       ret = __pci_epf_mhi_alloc_map(mhi_cntrl, buf_info->host_addr, &tre_phys,
+                                     &tre_buf, offset, buf_info->size);
        if (ret) {
                mutex_unlock(&epf_mhi->lock);
                return ret;
        }
  
-       memcpy_toio(tre_buf, from, size);
+       memcpy_toio(tre_buf, buf_info->dev_addr, buf_info->size);
  
-       __pci_epf_mhi_unmap_free(mhi_cntrl, to, tre_phys, tre_buf, offset,
-                                size);
+       __pci_epf_mhi_unmap_free(mhi_cntrl, buf_info->host_addr, tre_phys,
+                                tre_buf, offset, buf_info->size);
  
        mutex_unlock(&epf_mhi->lock);
  
+       if (buf_info->cb)
+               buf_info->cb(buf_info);
        return 0;
  }
  
@@@ -270,8 -289,8 +289,8 @@@ static void pci_epf_mhi_dma_callback(vo
        complete(param);
  }
  
- static int pci_epf_mhi_edma_read(struct mhi_ep_cntrl *mhi_cntrl, u64 from,
-                                void *to, size_t size)
+ static int pci_epf_mhi_edma_read(struct mhi_ep_cntrl *mhi_cntrl,
+                                struct mhi_ep_buf_info *buf_info)
  {
        struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
        struct device *dma_dev = epf_mhi->epf->epc->dev.parent;
        dma_addr_t dst_addr;
        int ret;
  
-       if (size < SZ_4K)
-               return pci_epf_mhi_iatu_read(mhi_cntrl, from, to, size);
+       if (buf_info->size < SZ_4K)
+               return pci_epf_mhi_iatu_read(mhi_cntrl, buf_info);
  
        mutex_lock(&epf_mhi->lock);
  
        config.direction = DMA_DEV_TO_MEM;
-       config.src_addr = from;
+       config.src_addr = buf_info->host_addr;
  
        ret = dmaengine_slave_config(chan, &config);
        if (ret) {
                goto err_unlock;
        }
  
-       dst_addr = dma_map_single(dma_dev, to, size, DMA_FROM_DEVICE);
+       dst_addr = dma_map_single(dma_dev, buf_info->dev_addr, buf_info->size,
+                                 DMA_FROM_DEVICE);
        ret = dma_mapping_error(dma_dev, dst_addr);
        if (ret) {
                dev_err(dev, "Failed to map remote memory\n");
                goto err_unlock;
        }
  
-       desc = dmaengine_prep_slave_single(chan, dst_addr, size, DMA_DEV_TO_MEM,
+       desc = dmaengine_prep_slave_single(chan, dst_addr, buf_info->size,
+                                          DMA_DEV_TO_MEM,
                                           DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
        if (!desc) {
                dev_err(dev, "Failed to prepare DMA\n");
        }
  
  err_unmap:
-       dma_unmap_single(dma_dev, dst_addr, size, DMA_FROM_DEVICE);
+       dma_unmap_single(dma_dev, dst_addr, buf_info->size, DMA_FROM_DEVICE);
  err_unlock:
        mutex_unlock(&epf_mhi->lock);
  
        return ret;
  }
  
- static int pci_epf_mhi_edma_write(struct mhi_ep_cntrl *mhi_cntrl, void *from,
-                                 u64 to, size_t size)
+ static int pci_epf_mhi_edma_write(struct mhi_ep_cntrl *mhi_cntrl,
+                                 struct mhi_ep_buf_info *buf_info)
  {
        struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
        struct device *dma_dev = epf_mhi->epf->epc->dev.parent;
        dma_addr_t src_addr;
        int ret;
  
-       if (size < SZ_4K)
-               return pci_epf_mhi_iatu_write(mhi_cntrl, from, to, size);
+       if (buf_info->size < SZ_4K)
+               return pci_epf_mhi_iatu_write(mhi_cntrl, buf_info);
  
        mutex_lock(&epf_mhi->lock);
  
        config.direction = DMA_MEM_TO_DEV;
-       config.dst_addr = to;
+       config.dst_addr = buf_info->host_addr;
  
        ret = dmaengine_slave_config(chan, &config);
        if (ret) {
                goto err_unlock;
        }
  
-       src_addr = dma_map_single(dma_dev, from, size, DMA_TO_DEVICE);
+       src_addr = dma_map_single(dma_dev, buf_info->dev_addr, buf_info->size,
+                                 DMA_TO_DEVICE);
        ret = dma_mapping_error(dma_dev, src_addr);
        if (ret) {
                dev_err(dev, "Failed to map remote memory\n");
                goto err_unlock;
        }
  
-       desc = dmaengine_prep_slave_single(chan, src_addr, size, DMA_MEM_TO_DEV,
+       desc = dmaengine_prep_slave_single(chan, src_addr, buf_info->size,
+                                          DMA_MEM_TO_DEV,
                                           DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
        if (!desc) {
                dev_err(dev, "Failed to prepare DMA\n");
        }
  
  err_unmap:
-       dma_unmap_single(dma_dev, src_addr, size, DMA_FROM_DEVICE);
+       dma_unmap_single(dma_dev, src_addr, buf_info->size, DMA_TO_DEVICE);
+ err_unlock:
+       mutex_unlock(&epf_mhi->lock);
+       return ret;
+ }
+ static void pci_epf_mhi_dma_worker(struct work_struct *work)
+ {
+       struct pci_epf_mhi *epf_mhi = container_of(work, struct pci_epf_mhi, dma_work);
+       struct device *dma_dev = epf_mhi->epf->epc->dev.parent;
+       struct pci_epf_mhi_dma_transfer *itr, *tmp;
+       struct mhi_ep_buf_info *buf_info;
+       unsigned long flags;
+       LIST_HEAD(head);
+       spin_lock_irqsave(&epf_mhi->list_lock, flags);
+       list_splice_tail_init(&epf_mhi->dma_list, &head);
+       spin_unlock_irqrestore(&epf_mhi->list_lock, flags);
+       list_for_each_entry_safe(itr, tmp, &head, node) {
+               list_del(&itr->node);
+               dma_unmap_single(dma_dev, itr->paddr, itr->size, itr->dir);
+               buf_info = &itr->buf_info;
+               buf_info->cb(buf_info);
+               kfree(itr);
+       }
+ }
+ static void pci_epf_mhi_dma_async_callback(void *param)
+ {
+       struct pci_epf_mhi_dma_transfer *transfer = param;
+       struct pci_epf_mhi *epf_mhi = transfer->epf_mhi;
+       spin_lock(&epf_mhi->list_lock);
+       list_add_tail(&transfer->node, &epf_mhi->dma_list);
+       spin_unlock(&epf_mhi->list_lock);
+       queue_work(epf_mhi->dma_wq, &epf_mhi->dma_work);
+ }
+ static int pci_epf_mhi_edma_read_async(struct mhi_ep_cntrl *mhi_cntrl,
+                                      struct mhi_ep_buf_info *buf_info)
+ {
+       struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
+       struct device *dma_dev = epf_mhi->epf->epc->dev.parent;
+       struct pci_epf_mhi_dma_transfer *transfer = NULL;
+       struct dma_chan *chan = epf_mhi->dma_chan_rx;
+       struct device *dev = &epf_mhi->epf->dev;
+       DECLARE_COMPLETION_ONSTACK(complete);
+       struct dma_async_tx_descriptor *desc;
+       struct dma_slave_config config = {};
+       dma_cookie_t cookie;
+       dma_addr_t dst_addr;
+       int ret;
+       mutex_lock(&epf_mhi->lock);
+       config.direction = DMA_DEV_TO_MEM;
+       config.src_addr = buf_info->host_addr;
+       ret = dmaengine_slave_config(chan, &config);
+       if (ret) {
+               dev_err(dev, "Failed to configure DMA channel\n");
+               goto err_unlock;
+       }
+       dst_addr = dma_map_single(dma_dev, buf_info->dev_addr, buf_info->size,
+                                 DMA_FROM_DEVICE);
+       ret = dma_mapping_error(dma_dev, dst_addr);
+       if (ret) {
+               dev_err(dev, "Failed to map remote memory\n");
+               goto err_unlock;
+       }
+       desc = dmaengine_prep_slave_single(chan, dst_addr, buf_info->size,
+                                          DMA_DEV_TO_MEM,
+                                          DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
+       if (!desc) {
+               dev_err(dev, "Failed to prepare DMA\n");
+               ret = -EIO;
+               goto err_unmap;
+       }
+       transfer = kzalloc(sizeof(*transfer), GFP_KERNEL);
+       if (!transfer) {
+               ret = -ENOMEM;
+               goto err_unmap;
+       }
+       transfer->epf_mhi = epf_mhi;
+       transfer->paddr = dst_addr;
+       transfer->size = buf_info->size;
+       transfer->dir = DMA_FROM_DEVICE;
+       memcpy(&transfer->buf_info, buf_info, sizeof(*buf_info));
+       desc->callback = pci_epf_mhi_dma_async_callback;
+       desc->callback_param = transfer;
+       cookie = dmaengine_submit(desc);
+       ret = dma_submit_error(cookie);
+       if (ret) {
+               dev_err(dev, "Failed to do DMA submit\n");
+               goto err_free_transfer;
+       }
+       dma_async_issue_pending(chan);
+       goto err_unlock;
+ err_free_transfer:
+       kfree(transfer);
+ err_unmap:
+       dma_unmap_single(dma_dev, dst_addr, buf_info->size, DMA_FROM_DEVICE);
+ err_unlock:
+       mutex_unlock(&epf_mhi->lock);
+       return ret;
+ }
+ static int pci_epf_mhi_edma_write_async(struct mhi_ep_cntrl *mhi_cntrl,
+                                       struct mhi_ep_buf_info *buf_info)
+ {
+       struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
+       struct device *dma_dev = epf_mhi->epf->epc->dev.parent;
+       struct pci_epf_mhi_dma_transfer *transfer = NULL;
+       struct dma_chan *chan = epf_mhi->dma_chan_tx;
+       struct device *dev = &epf_mhi->epf->dev;
+       DECLARE_COMPLETION_ONSTACK(complete);
+       struct dma_async_tx_descriptor *desc;
+       struct dma_slave_config config = {};
+       dma_cookie_t cookie;
+       dma_addr_t src_addr;
+       int ret;
+       mutex_lock(&epf_mhi->lock);
+       config.direction = DMA_MEM_TO_DEV;
+       config.dst_addr = buf_info->host_addr;
+       ret = dmaengine_slave_config(chan, &config);
+       if (ret) {
+               dev_err(dev, "Failed to configure DMA channel\n");
+               goto err_unlock;
+       }
+       src_addr = dma_map_single(dma_dev, buf_info->dev_addr, buf_info->size,
+                                 DMA_TO_DEVICE);
+       ret = dma_mapping_error(dma_dev, src_addr);
+       if (ret) {
+               dev_err(dev, "Failed to map remote memory\n");
+               goto err_unlock;
+       }
+       desc = dmaengine_prep_slave_single(chan, src_addr, buf_info->size,
+                                          DMA_MEM_TO_DEV,
+                                          DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
+       if (!desc) {
+               dev_err(dev, "Failed to prepare DMA\n");
+               ret = -EIO;
+               goto err_unmap;
+       }
+       transfer = kzalloc(sizeof(*transfer), GFP_KERNEL);
+       if (!transfer) {
+               ret = -ENOMEM;
+               goto err_unmap;
+       }
+       transfer->epf_mhi = epf_mhi;
+       transfer->paddr = src_addr;
+       transfer->size = buf_info->size;
+       transfer->dir = DMA_TO_DEVICE;
+       memcpy(&transfer->buf_info, buf_info, sizeof(*buf_info));
+       desc->callback = pci_epf_mhi_dma_async_callback;
+       desc->callback_param = transfer;
+       cookie = dmaengine_submit(desc);
+       ret = dma_submit_error(cookie);
+       if (ret) {
+               dev_err(dev, "Failed to do DMA submit\n");
+               goto err_free_transfer;
+       }
+       dma_async_issue_pending(chan);
+       goto err_unlock;
+ err_free_transfer:
+       kfree(transfer);
+ err_unmap:
+       dma_unmap_single(dma_dev, src_addr, buf_info->size, DMA_TO_DEVICE);
  err_unlock:
        mutex_unlock(&epf_mhi->lock);
  
@@@ -431,6 -646,7 +646,7 @@@ static int pci_epf_mhi_dma_init(struct 
        struct device *dev = &epf_mhi->epf->dev;
        struct epf_dma_filter filter;
        dma_cap_mask_t mask;
+       int ret;
  
        dma_cap_zero(mask);
        dma_cap_set(DMA_SLAVE, mask);
                                                   &filter);
        if (IS_ERR_OR_NULL(epf_mhi->dma_chan_rx)) {
                dev_err(dev, "Failed to request rx channel\n");
-               dma_release_channel(epf_mhi->dma_chan_tx);
-               epf_mhi->dma_chan_tx = NULL;
-               return -ENODEV;
+               ret = -ENODEV;
+               goto err_release_tx;
+       }
+       epf_mhi->dma_wq = alloc_workqueue("pci_epf_mhi_dma_wq", 0, 0);
+       if (!epf_mhi->dma_wq) {
+               ret = -ENOMEM;
+               goto err_release_rx;
        }
  
+       INIT_LIST_HEAD(&epf_mhi->dma_list);
+       INIT_WORK(&epf_mhi->dma_work, pci_epf_mhi_dma_worker);
+       spin_lock_init(&epf_mhi->list_lock);
        return 0;
+ err_release_rx:
+       dma_release_channel(epf_mhi->dma_chan_rx);
+       epf_mhi->dma_chan_rx = NULL;
+ err_release_tx:
+       dma_release_channel(epf_mhi->dma_chan_tx);
+       epf_mhi->dma_chan_tx = NULL;
+       return ret;
  }
  
  static void pci_epf_mhi_dma_deinit(struct pci_epf_mhi *epf_mhi)
  {
+       destroy_workqueue(epf_mhi->dma_wq);
        dma_release_channel(epf_mhi->dma_chan_tx);
        dma_release_channel(epf_mhi->dma_chan_rx);
        epf_mhi->dma_chan_tx = NULL;
@@@ -531,12 -766,13 +766,13 @@@ static int pci_epf_mhi_link_up(struct p
        mhi_cntrl->raise_irq = pci_epf_mhi_raise_irq;
        mhi_cntrl->alloc_map = pci_epf_mhi_alloc_map;
        mhi_cntrl->unmap_free = pci_epf_mhi_unmap_free;
+       mhi_cntrl->read_sync = mhi_cntrl->read_async = pci_epf_mhi_iatu_read;
+       mhi_cntrl->write_sync = mhi_cntrl->write_async = pci_epf_mhi_iatu_write;
        if (info->flags & MHI_EPF_USE_DMA) {
-               mhi_cntrl->read_from_host = pci_epf_mhi_edma_read;
-               mhi_cntrl->write_to_host = pci_epf_mhi_edma_write;
-       } else {
-               mhi_cntrl->read_from_host = pci_epf_mhi_iatu_read;
-               mhi_cntrl->write_to_host = pci_epf_mhi_iatu_write;
+               mhi_cntrl->read_sync = pci_epf_mhi_edma_read;
+               mhi_cntrl->write_sync = pci_epf_mhi_edma_write;
+               mhi_cntrl->read_async = pci_epf_mhi_edma_read_async;
+               mhi_cntrl->write_async = pci_epf_mhi_edma_write_async;
        }
  
        /* Register the MHI EP controller */
@@@ -644,7 -880,7 +880,7 @@@ static void pci_epf_mhi_unbind(struct p
        pci_epc_clear_bar(epc, epf->func_no, epf->vfunc_no, epf_bar);
  }
  
 -static struct pci_epc_event_ops pci_epf_mhi_event_ops = {
 +static const struct pci_epc_event_ops pci_epf_mhi_event_ops = {
        .core_init = pci_epf_mhi_core_init,
        .link_up = pci_epf_mhi_link_up,
        .link_down = pci_epf_mhi_link_down,
@@@ -682,7 -918,7 +918,7 @@@ static const struct pci_epf_device_id p
        {},
  };
  
 -static struct pci_epf_ops pci_epf_mhi_ops = {
 +static const struct pci_epf_ops pci_epf_mhi_ops = {
        .unbind = pci_epf_mhi_unbind,
        .bind   = pci_epf_mhi_bind,
  };
index 042553abe1bf84b3af080661c6a0f0cd826b9e5f,2ce4c8e01f57ccba709e9ff13258553897957b8e..253299e4214d09f9177ef1cd0b1f6d06fc75806c
@@@ -77,11 -77,26 +77,26 @@@ struct registered_event_data 
  
  static bool xlnx_is_error_event(const u32 node_id)
  {
-       if (node_id == EVENT_ERROR_PMC_ERR1 ||
-           node_id == EVENT_ERROR_PMC_ERR2 ||
-           node_id == EVENT_ERROR_PSM_ERR1 ||
-           node_id == EVENT_ERROR_PSM_ERR2)
-               return true;
+       u32 pm_family_code, pm_sub_family_code;
+       zynqmp_pm_get_family_info(&pm_family_code, &pm_sub_family_code);
+       if (pm_sub_family_code == VERSAL_SUB_FAMILY_CODE) {
+               if (node_id == VERSAL_EVENT_ERROR_PMC_ERR1 ||
+                   node_id == VERSAL_EVENT_ERROR_PMC_ERR2 ||
+                   node_id == VERSAL_EVENT_ERROR_PSM_ERR1 ||
+                   node_id == VERSAL_EVENT_ERROR_PSM_ERR2)
+                       return true;
+       } else {
+               if (node_id == VERSAL_NET_EVENT_ERROR_PMC_ERR1 ||
+                   node_id == VERSAL_NET_EVENT_ERROR_PMC_ERR2 ||
+                   node_id == VERSAL_NET_EVENT_ERROR_PMC_ERR3 ||
+                   node_id == VERSAL_NET_EVENT_ERROR_PSM_ERR1 ||
+                   node_id == VERSAL_NET_EVENT_ERROR_PSM_ERR2 ||
+                   node_id == VERSAL_NET_EVENT_ERROR_PSM_ERR3 ||
+                   node_id == VERSAL_NET_EVENT_ERROR_PSM_ERR4)
+                       return true;
+       }
  
        return false;
  }
@@@ -477,13 -492,13 +492,13 @@@ static void xlnx_call_notify_cb_handler
                }
        }
        if (!is_callback_found)
 -              pr_warn("Didn't find any registered callback for 0x%x 0x%x\n",
 +              pr_warn("Unhandled SGI node 0x%x event 0x%x. Expected with Xen hypervisor\n",
                        payload[1], payload[2]);
  }
  
  static void xlnx_get_event_callback_data(u32 *buf)
  {
-       zynqmp_pm_invoke_fn(GET_CALLBACK_DATA, 0, 0, 0, 0, buf);
+       zynqmp_pm_invoke_fn(GET_CALLBACK_DATA, buf, 0);
  }
  
  static irqreturn_t xlnx_event_handler(int irq, void *dev_id)
@@@ -555,7 -570,7 +570,7 @@@ static void xlnx_disable_percpu_irq(voi
  static int xlnx_event_init_sgi(struct platform_device *pdev)
  {
        int ret = 0;
 -      int cpu = smp_processor_id();
 +      int cpu;
        /*
         * IRQ related structures are used for the following:
         * for each SGI interrupt ensure its mapped by GIC IRQ domain
        sgi_fwspec.param[0] = sgi_num;
        virq_sgi = irq_create_fwspec_mapping(&sgi_fwspec);
  
 +      cpu = get_cpu();
        per_cpu(cpu_number1, cpu) = cpu;
        ret = request_percpu_irq(virq_sgi, xlnx_event_handler, "xlnx_event_mgmt",
                                 &cpu_number1);
 +      put_cpu();
 +
        WARN_ON(ret);
        if (ret) {
                irq_dispose_mapping(virq_sgi);
@@@ -656,7 -668,11 +671,11 @@@ static int xlnx_event_manager_probe(str
  
        ret = zynqmp_pm_register_sgi(sgi_num, 0);
        if (ret) {
-               dev_err(&pdev->dev, "SGI %d Registration over TF-A failed with %d\n", sgi_num, ret);
+               if (ret == -EOPNOTSUPP)
+                       dev_err(&pdev->dev, "SGI registration not supported by TF-A or Xen\n");
+               else
+                       dev_err(&pdev->dev, "SGI %d registration failed, err %d\n", sgi_num, ret);
                xlnx_event_cleanup_sgi(pdev);
                return ret;
        }
index 07d735b38b499681280fa17832afb53ba5b9e96f,0de0acf80ef8967ef2baf1d59f47d296ce67bdcc..965b1143936abe3d826bbd15207374099643bba5
@@@ -51,7 -51,7 +51,7 @@@ static enum pm_suspend_mode suspend_mod
  
  static void zynqmp_pm_get_callback_data(u32 *buf)
  {
-       zynqmp_pm_invoke_fn(GET_CALLBACK_DATA, 0, 0, 0, 0, buf);
+       zynqmp_pm_invoke_fn(GET_CALLBACK_DATA, buf, 0);
  }
  
  static void suspend_event_callback(const u32 *payload, void *data)
@@@ -83,11 -83,9 +83,11 @@@ static irqreturn_t zynqmp_pm_isr(int ir
                        pm_suspend(PM_SUSPEND_MEM);
                        break;
                default:
 -                      pr_err("%s Unsupported InitSuspendCb reason "
 -                              "code %d\n", __func__, payload[1]);
 +                      pr_err("%s Unsupported InitSuspendCb reason code %d\n",
 +                             __func__, payload[1]);
                }
 +      } else {
 +              pr_err("%s() Unsupported Callback %d\n", __func__, payload[0]);
        }
  
        return IRQ_HANDLED;
@@@ -254,8 -252,8 +254,8 @@@ static int zynqmp_pm_probe(struct platf
                                                dev_name(&pdev->dev),
                                                &pdev->dev);
                if (ret) {
 -                      dev_err(&pdev->dev, "devm_request_threaded_irq '%d' "
 -                                          "failed with %d\n", irq, ret);
 +                      dev_err(&pdev->dev, "devm_request_threaded_irq '%d' failed with %d\n",
 +                              irq, ret);
                        return ret;
                }
        } else {
        return 0;
  }
  
 -static int zynqmp_pm_remove(struct platform_device *pdev)
 +static void zynqmp_pm_remove(struct platform_device *pdev)
  {
        sysfs_remove_file(&pdev->dev.kobj, &dev_attr_suspend_mode.attr);
        if (event_registered)
  
        if (!rx_chan)
                mbox_free_channel(rx_chan);
 -
 -      return 0;
  }
  
  static const struct of_device_id pm_of_match[] = {
@@@ -295,7 -295,7 +295,7 @@@ MODULE_DEVICE_TABLE(of, pm_of_match)
  
  static struct platform_driver zynqmp_pm_platform_driver = {
        .probe = zynqmp_pm_probe,
 -      .remove = zynqmp_pm_remove,
 +      .remove_new = zynqmp_pm_remove,
        .driver = {
                .name = "zynqmp_power",
                .of_match_table = pm_of_match,
diff --combined include/linux/property.h
index 60e35bd97398eb194477372602217de245671d31,2b8f07fc68a97c5f77694dc08f10269c918b114f..e6516d0b7d52ad0570eb345955701be5856455c0
@@@ -80,38 -80,12 +80,38 @@@ int fwnode_property_match_string(const 
  
  bool fwnode_device_is_available(const struct fwnode_handle *fwnode);
  
 +static inline bool fwnode_device_is_big_endian(const struct fwnode_handle *fwnode)
 +{
 +      if (fwnode_property_present(fwnode, "big-endian"))
 +              return true;
 +      if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) &&
 +          fwnode_property_present(fwnode, "native-endian"))
 +              return true;
 +      return false;
 +}
 +
  static inline
  bool fwnode_device_is_compatible(const struct fwnode_handle *fwnode, const char *compat)
  {
        return fwnode_property_match_string(fwnode, "compatible", compat) >= 0;
  }
  
 +/**
 + * device_is_big_endian - check if a device has BE registers
 + * @dev: Pointer to the struct device
 + *
 + * Returns: true if the device has a "big-endian" property, or if the kernel
 + * was compiled for BE *and* the device has a "native-endian" property.
 + * Returns false otherwise.
 + *
 + * Callers would nominally use ioread32be/iowrite32be if
 + * device_is_big_endian() == true, or readl/writel otherwise.
 + */
 +static inline bool device_is_big_endian(const struct device *dev)
 +{
 +      return fwnode_device_is_big_endian(dev_fwnode(dev));
 +}
 +
  /**
   * device_is_compatible - match 'compatible' property of the device with a given string
   * @dev: Pointer to the struct device
@@@ -124,6 -98,18 +124,18 @@@ static inline bool device_is_compatible
        return fwnode_device_is_compatible(dev_fwnode(dev), compat);
  }
  
+ int fwnode_property_match_property_string(const struct fwnode_handle *fwnode,
+                                         const char *propname,
+                                         const char * const *array, size_t n);
+ static inline
+ int device_property_match_property_string(const struct device *dev,
+                                         const char *propname,
+                                         const char * const *array, size_t n)
+ {
+       return fwnode_property_match_property_string(dev_fwnode(dev), propname, array, n);
+ }
  int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode,
                                       const char *prop, const char *nargs_prop,
                                       unsigned int nargs, unsigned int index,
@@@ -135,7 -121,6 +147,7 @@@ struct fwnode_handle *fwnode_find_refer
  
  const char *fwnode_get_name(const struct fwnode_handle *fwnode);
  const char *fwnode_get_name_prefix(const struct fwnode_handle *fwnode);
 +bool fwnode_name_eq(const struct fwnode_handle *fwnode, const char *name);
  
  struct fwnode_handle *fwnode_get_parent(const struct fwnode_handle *fwnode);
  struct fwnode_handle *fwnode_get_next_parent(struct fwnode_handle *fwnode);
@@@ -516,13 -501,6 +528,13 @@@ struct software_node 
        const struct property_entry *properties;
  };
  
 +#define SOFTWARE_NODE(_name_, _properties_, _parent_) \
 +      (struct software_node) {                        \
 +              .name = _name_,                         \
 +              .properties = _properties_,             \
 +              .parent = _parent_,                     \
 +      }
 +
  bool is_software_node(const struct fwnode_handle *fwnode);
  const struct software_node *
  to_software_node(const struct fwnode_handle *fwnode);
diff --combined scripts/checkpatch.pl
index f8343b34a28b911491bfc688b7d3f23b34a7839d,d56c98146da3e5db824d60381aab93d07bc04fa2..9c4c4a61bc8327e05a0f51c300e0675b247b84ec
@@@ -512,6 -512,7 +512,7 @@@ our $Attribute     = qr
                        __ro_after_init|
                        __kprobes|
                        $InitAttribute|
+                       __aligned\s*\(.*\)|
                        ____cacheline_aligned|
                        ____cacheline_aligned_in_smp|
                        ____cacheline_internodealigned_in_smp|
@@@ -4054,7 -4055,7 +4055,7 @@@ sub process 
                if ($prevline =~ /^[\+ ]};?\s*$/ &&
                    $line =~ /^\+/ &&
                    !($line =~ /^\+\s*$/ ||
 -                    $line =~ /^\+\s*(?:EXPORT_SYMBOL|early_param)/ ||
 +                    $line =~ /^\+\s*(?:EXPORT_SYMBOL|early_param|ALLOW_ERROR_INJECTION)/ ||
                      $line =~ /^\+\s*MODULE_/i ||
                      $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||
                      $line =~ /^\+[a-z_]*init/ ||
                             "Prefer strscpy, strscpy_pad, or __nonstring over strncpy - see: https://github.com/KSPP/linux/issues/90\n" . $herecurr);
                }
  
 +# ethtool_sprintf uses that should likely be ethtool_puts
 +              if ($line =~ /\bethtool_sprintf\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
 +                      if (WARN("PREFER_ETHTOOL_PUTS",
 +                               "Prefer ethtool_puts over ethtool_sprintf with only two arguments\n" . $herecurr) &&
 +                          $fix) {
 +                              $fixed[$fixlinenr] =~ s/\bethtool_sprintf\s*\(\s*($FuncArg)\s*,\s*($FuncArg)/ethtool_puts($1, $7)/;
 +                      }
 +              }
 +
 +              # use $rawline because $line loses %s via sanitization and thus we can't match against it.
 +              if ($rawline =~ /\bethtool_sprintf\s*\(\s*$FuncArg\s*,\s*\"\%s\"\s*,\s*$FuncArg\s*\)/) {
 +                      if (WARN("PREFER_ETHTOOL_PUTS",
 +                               "Prefer ethtool_puts over ethtool_sprintf with standalone \"%s\" specifier\n" . $herecurr) &&
 +                          $fix) {
 +                              $fixed[$fixlinenr] =~ s/\bethtool_sprintf\s*\(\s*($FuncArg)\s*,\s*"\%s"\s*,\s*($FuncArg)/ethtool_puts($1, $7)/;
 +                      }
 +              }
 +
 +
  # typecasts on min/max could be min_t/max_t
                if ($perl_version_ok &&
                    defined $stat &&
This page took 0.313551 seconds and 4 git commands to generate.