Merge tag 'v5.14-rockchip-dts64-1' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorOlof Johansson <olof@lixom.net>
Thu, 24 Jun 2021 02:00:04 +0000 (19:00 -0700)
committerOlof Johansson <olof@lixom.net>
Thu, 24 Jun 2021 02:00:06 +0000 (19:00 -0700)
A lot of dt-yaml related fixes; PCIe, USB and pwm-fans for Helios64;
Display rotation and audio codec for the Odroid Go Advance;
IR, spdif and usb-c support for rk3399-firefly;
USB support for rk3308 and some rk3328 boards and setting
the PCIe link speed to actually only supported speed on rk3399.

* tag 'v5.14-rockchip-dts64-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip: (30 commits)
  arm64: dts: rockchip: Re-add regulator-always-on for vcc_sdio for rk3399-roc-pc
  arm64: dts: rockchip: Re-add regulator-boot-on, regulator-always-on for vdd_gpu on rk3399-roc-pc
  arm64: dts: rockchip: add ir-receiver for rk3399-roc-pc
  arm64: dts: rockchip: Add USB-C port details for rk3399 Firefly
  arm64: dts: rockchip: Sort rk3399 firefly pinmux entries
  arm64: dts: rockchip: add infrared receiver node to RK3399 Firefly
  arm64: dts: rockchip: add SPDIF node for rk3399-firefly
  arm64: dts: rockchip: Add Rotation Property for OGA Panel
  arm64: dts: rockchip: Add support for USB on helios64
  arm64: dts: rockchip: add USB support to rk3308.dtsi
  arm64: dts: rockchip: rename nodename for phy-rockchip-inno-usb2
  arm64: dts: rockchip: add rk817 codec to Odroid Go
  arm64: dts: rename grf-gpio nodename in rk3328.dtsi
  arm64: dts: rockchip: Add support for PCIe on helios64
  arm64: dts: rockchip: Add support for two PWM fans on helios64
  arm64: dts: rockchip: fix regulator-gpio states array
  arm64: dts: rockchip: add #power-domain-cells to power domain nodes
  arm64: dts: rockchip: Fix power-controller node names for rk3399
  arm64: dts: rockchip: Fix power-controller node names for rk3328
  arm64: dts: rockchip: Fix power-controller node names for px30
  ...

Link: https://lore.kernel.org/r/2796982.e9J7NaK4W3@phil
Signed-off-by: Olof Johansson <olof@lixom.net>
1092 files changed:
.mailmap
Documentation/ABI/obsolete/sysfs-class-dax
Documentation/ABI/obsolete/sysfs-kernel-fadump_registered
Documentation/ABI/obsolete/sysfs-kernel-fadump_release_mem
Documentation/ABI/removed/sysfs-bus-nfit
Documentation/ABI/testing/sysfs-bus-nfit
Documentation/ABI/testing/sysfs-bus-papr-pmem
Documentation/ABI/testing/sysfs-module
Documentation/admin-guide/sysctl/kernel.rst
Documentation/block/data-integrity.rst
Documentation/cdrom/cdrom-standard.rst
Documentation/devicetree/bindings/arm/amlogic.yaml
Documentation/devicetree/bindings/arm/bcm/bcm2835.yaml
Documentation/devicetree/bindings/arm/fsl.yaml
Documentation/devicetree/bindings/arm/intel-ixp4xx.yaml
Documentation/devicetree/bindings/arm/mediatek.yaml
Documentation/devicetree/bindings/arm/qcom.yaml
Documentation/devicetree/bindings/arm/renesas.yaml
Documentation/devicetree/bindings/arm/sunxi.yaml
Documentation/devicetree/bindings/arm/tegra/nvidia,tegra20-pmc.yaml
Documentation/devicetree/bindings/clock/brcm,iproc-clocks.txt [deleted file]
Documentation/devicetree/bindings/clock/brcm,iproc-clocks.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/idt,versaclock5.yaml
Documentation/devicetree/bindings/clock/nvidia,tegra114-car.txt [deleted file]
Documentation/devicetree/bindings/clock/nvidia,tegra124-car.txt [deleted file]
Documentation/devicetree/bindings/clock/nvidia,tegra124-car.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt [deleted file]
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/clock/nvidia,tegra210-car.txt [deleted file]
Documentation/devicetree/bindings/clock/nvidia,tegra30-car.txt [deleted file]
Documentation/devicetree/bindings/i2c/i2c-at91.txt
Documentation/devicetree/bindings/iio/adc/st,stm32-dfsdm-adc.yaml
Documentation/devicetree/bindings/input/input.yaml
Documentation/devicetree/bindings/interconnect/qcom,rpmh.yaml
Documentation/devicetree/bindings/leds/leds-bcm6328.txt
Documentation/devicetree/bindings/leds/leds-bcm6358.txt
Documentation/devicetree/bindings/media/renesas,drif.yaml
Documentation/devicetree/bindings/net/qcom,ipa.yaml
Documentation/devicetree/bindings/net/stm32-dwmac.yaml
Documentation/devicetree/bindings/nvmem/mtk-efuse.txt
Documentation/devicetree/bindings/phy/phy-cadence-torrent.yaml
Documentation/devicetree/bindings/phy/phy-mvebu-comphy.txt
Documentation/devicetree/bindings/power/fsl,imx-gpcv2.yaml
Documentation/devicetree/bindings/power/renesas,rzg2l-sysc.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/power/supply/sc2731-charger.yaml
Documentation/devicetree/bindings/pwm/allwinner,sun4i-a10-pwm.yaml
Documentation/devicetree/bindings/remoteproc/ti,k3-r5f-rproc.yaml
Documentation/devicetree/bindings/sound/allwinner,sun4i-a10-i2s.yaml
Documentation/devicetree/bindings/sound/allwinner,sun8i-a23-codec-analog.yaml
Documentation/devicetree/bindings/sound/allwinner,sun8i-a33-codec.yaml
Documentation/devicetree/bindings/sound/fsl,rpmsg.yaml
Documentation/devicetree/bindings/timer/allwinner,sun4i-a10-timer.yaml
Documentation/devicetree/bindings/vendor-prefixes.yaml
Documentation/driver-api/nvdimm/nvdimm.rst
Documentation/driver-api/serial/index.rst
Documentation/driver-api/usb/usb.rst
Documentation/filesystems/erofs.rst
Documentation/hwmon/tmp103.rst
Documentation/networking/device_drivers/ethernet/intel/i40e.rst
Documentation/networking/device_drivers/ethernet/intel/iavf.rst
Documentation/powerpc/syscall64-abi.rst
Documentation/process/kernel-enforcement-statement.rst
Documentation/security/tpm/xen-tpmfront.rst
Documentation/timers/no_hz.rst
Documentation/translations/zh_CN/SecurityBugs [deleted file]
Documentation/usb/gadget_configfs.rst
Documentation/usb/mtouchusb.rst
Documentation/usb/usb-serial.rst
Documentation/virt/kvm/amd-memory-encryption.rst
Documentation/virt/kvm/api.rst
Documentation/x86/amd-memory-encryption.rst
MAINTAINERS
Makefile
arch/alpha/kernel/syscalls/syscall.tbl
arch/arc/Makefile
arch/arc/include/asm/cmpxchg.h
arch/arc/include/asm/page.h
arch/arc/include/asm/pgtable.h
arch/arc/include/uapi/asm/page.h
arch/arc/kernel/entry.S
arch/arc/kernel/kgdb.c
arch/arc/kernel/process.c
arch/arc/kernel/signal.c
arch/arc/mm/init.c
arch/arc/mm/ioremap.c
arch/arc/mm/tlb.c
arch/arm/boot/dts/Makefile
arch/arm/boot/dts/am335x-baltos.dtsi
arch/arm/boot/dts/am335x-boneblack-wireless.dts
arch/arm/boot/dts/am335x-boneblue.dts
arch/arm/boot/dts/am335x-bonegreen-wireless.dts
arch/arm/boot/dts/am335x-cm-t335.dts
arch/arm/boot/dts/am335x-evm.dts
arch/arm/boot/dts/am335x-evmsk.dts
arch/arm/boot/dts/am335x-icev2.dts
arch/arm/boot/dts/am335x-moxa-uc-2100-common.dtsi
arch/arm/boot/dts/am335x-moxa-uc-8100-common.dtsi
arch/arm/boot/dts/am335x-osd3358-sm-red.dts
arch/arm/boot/dts/am335x-shc.dts
arch/arm/boot/dts/am33xx-l4.dtsi
arch/arm/boot/dts/am437x-gp-evm.dts
arch/arm/boot/dts/am437x-l4.dtsi
arch/arm/boot/dts/am43x-epos-evm.dts
arch/arm/boot/dts/am57xx-cl-som-am57x.dts
arch/arm/boot/dts/aspeed-ast2500-evb.dts
arch/arm/boot/dts/aspeed-ast2600-evb-a1.dts [new file with mode: 0644]
arch/arm/boot/dts/aspeed-ast2600-evb.dts
arch/arm/boot/dts/aspeed-bmc-amd-ethanolx.dts
arch/arm/boot/dts/aspeed-bmc-ampere-mtjade.dts
arch/arm/boot/dts/aspeed-bmc-arm-centriq2400-rep.dts
arch/arm/boot/dts/aspeed-bmc-arm-stardragon4800-rep2.dts
arch/arm/boot/dts/aspeed-bmc-asrock-e3c246d4i.dts
arch/arm/boot/dts/aspeed-bmc-bytedance-g220a.dts
arch/arm/boot/dts/aspeed-bmc-facebook-cmm.dts
arch/arm/boot/dts/aspeed-bmc-facebook-tiogapass.dts
arch/arm/boot/dts/aspeed-bmc-ibm-everest.dts
arch/arm/boot/dts/aspeed-bmc-ibm-rainier-4u.dts
arch/arm/boot/dts/aspeed-bmc-inspur-fp5280g2.dts
arch/arm/boot/dts/aspeed-bmc-inspur-on5263m5.dts
arch/arm/boot/dts/aspeed-bmc-intel-s2600wf.dts
arch/arm/boot/dts/aspeed-bmc-lenovo-hr630.dts
arch/arm/boot/dts/aspeed-bmc-lenovo-hr855xg2.dts
arch/arm/boot/dts/aspeed-bmc-microsoft-olympus.dts
arch/arm/boot/dts/aspeed-bmc-opp-lanyang.dts
arch/arm/boot/dts/aspeed-bmc-opp-mihawk.dts
arch/arm/boot/dts/aspeed-bmc-opp-mowgli.dts
arch/arm/boot/dts/aspeed-bmc-opp-nicole.dts
arch/arm/boot/dts/aspeed-bmc-opp-palmetto.dts
arch/arm/boot/dts/aspeed-bmc-opp-romulus.dts
arch/arm/boot/dts/aspeed-bmc-opp-swift.dts
arch/arm/boot/dts/aspeed-bmc-opp-tacoma.dts
arch/arm/boot/dts/aspeed-bmc-opp-vesnin.dts
arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
arch/arm/boot/dts/aspeed-bmc-opp-zaius.dts
arch/arm/boot/dts/aspeed-bmc-portwell-neptune.dts
arch/arm/boot/dts/aspeed-bmc-quanta-q71l.dts
arch/arm/boot/dts/aspeed-bmc-supermicro-x11spi.dts
arch/arm/boot/dts/aspeed-g5.dtsi
arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi
arch/arm/boot/dts/bcm-cygnus.dtsi
arch/arm/boot/dts/bcm-hr2.dtsi
arch/arm/boot/dts/bcm-nsp.dtsi
arch/arm/boot/dts/bcm2711-rpi-4-b.dts
arch/arm/boot/dts/bcm2711-rpi-400.dts [new file with mode: 0644]
arch/arm/boot/dts/bcm2711-rpi.dtsi [new file with mode: 0644]
arch/arm/boot/dts/bcm2711.dtsi
arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
arch/arm/boot/dts/bcm2835-rpi-a.dts
arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
arch/arm/boot/dts/bcm2835-rpi-b.dts
arch/arm/boot/dts/bcm2835-rpi-cm1.dtsi
arch/arm/boot/dts/bcm2835-rpi-zero-w.dts
arch/arm/boot/dts/bcm2835-rpi-zero.dts
arch/arm/boot/dts/bcm2835-rpi.dtsi
arch/arm/boot/dts/bcm2836-rpi-2-b.dts
arch/arm/boot/dts/bcm2837-rpi-3-a-plus.dts
arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts
arch/arm/boot/dts/bcm2837-rpi-3-b.dts
arch/arm/boot/dts/bcm2837-rpi-cm3.dtsi
arch/arm/boot/dts/bcm283x-rpi-usb-otg.dtsi
arch/arm/boot/dts/bcm283x-rpi-usb-peripheral.dtsi
arch/arm/boot/dts/bcm283x.dtsi
arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts
arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
arch/arm/boot/dts/bcm47094.dtsi
arch/arm/boot/dts/bcm5301x-nand-cs0.dtsi
arch/arm/boot/dts/bcm5301x.dtsi
arch/arm/boot/dts/bcm63138.dtsi
arch/arm/boot/dts/bcm7445-bcm97445svmb.dts
arch/arm/boot/dts/bcm7445.dtsi
arch/arm/boot/dts/bcm911360_entphn.dts
arch/arm/boot/dts/bcm953012k.dts
arch/arm/boot/dts/bcm958300k.dts
arch/arm/boot/dts/bcm958305k.dts
arch/arm/boot/dts/bcm958522er.dts
arch/arm/boot/dts/bcm958525er.dts
arch/arm/boot/dts/bcm958525xmc.dts
arch/arm/boot/dts/bcm958622hr.dts
arch/arm/boot/dts/bcm958623hr.dts
arch/arm/boot/dts/bcm958625hr.dts
arch/arm/boot/dts/bcm958625k.dts
arch/arm/boot/dts/bcm963138dvt.dts
arch/arm/boot/dts/bcm988312hr.dts
arch/arm/boot/dts/da850.dtsi
arch/arm/boot/dts/dm816x.dtsi
arch/arm/boot/dts/dra7-evm.dts
arch/arm/boot/dts/dra7-ipu-dsp-common.dtsi
arch/arm/boot/dts/dra7-l4.dtsi
arch/arm/boot/dts/dra71-evm.dts
arch/arm/boot/dts/dra72-evm-common.dtsi
arch/arm/boot/dts/dra72x.dtsi
arch/arm/boot/dts/dra74-ipu-dsp-common.dtsi
arch/arm/boot/dts/dra74x.dtsi
arch/arm/boot/dts/dra76-evm.dts
arch/arm/boot/dts/exynos3250-rinato.dts
arch/arm/boot/dts/exynos4210-i9100.dts
arch/arm/boot/dts/exynos4210-trats.dts
arch/arm/boot/dts/exynos4210-universal_c210.dts
arch/arm/boot/dts/exynos4412-itop-scp-core.dtsi
arch/arm/boot/dts/exynos4412-midas.dtsi
arch/arm/boot/dts/exynos4412-n710x.dts
arch/arm/boot/dts/exynos4412-odroid-common.dtsi
arch/arm/boot/dts/exynos4412-origen.dts
arch/arm/boot/dts/exynos4412-p4note.dtsi
arch/arm/boot/dts/exynos5250-arndale.dts
arch/arm/boot/dts/exynos5410-odroidxu.dts
arch/arm/boot/dts/exynos5420-arndale-octa.dts
arch/arm/boot/dts/exynos5420-smdk5420.dts
arch/arm/boot/dts/exynos5422-odroid-core.dtsi
arch/arm/boot/dts/exynos5422-odroidhc1.dts
arch/arm/boot/dts/exynos5422-odroidxu4.dts
arch/arm/boot/dts/exynos54xx-odroidxu-leds.dtsi
arch/arm/boot/dts/gemini-dlink-dir-685.dts
arch/arm/boot/dts/gemini-dlink-dns-313.dts
arch/arm/boot/dts/gemini-nas4220b.dts
arch/arm/boot/dts/gemini-rut1xx.dts
arch/arm/boot/dts/gemini-sl93512r.dts
arch/arm/boot/dts/gemini-sq201.dts
arch/arm/boot/dts/gemini-wbd111.dts
arch/arm/boot/dts/gemini-wbd222.dts
arch/arm/boot/dts/gemini.dtsi
arch/arm/boot/dts/hi3620.dtsi
arch/arm/boot/dts/hip01-ca9x2.dts
arch/arm/boot/dts/hip01.dtsi
arch/arm/boot/dts/hip04.dtsi
arch/arm/boot/dts/hisi-x5hd2-dkb.dts
arch/arm/boot/dts/hisi-x5hd2.dtsi
arch/arm/boot/dts/imx25-pinfunc.h
arch/arm/boot/dts/imx28-lwe.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx28-xea.dts [new file with mode: 0644]
arch/arm/boot/dts/imx51-digi-connectcore-som.dtsi
arch/arm/boot/dts/imx53-ard.dts
arch/arm/boot/dts/imx6dl-b105pv2.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-b105v2.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-b125pv2.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-b125v2.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-b155v2.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-b1x5pv2.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-b1x5v2.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-plym2m.dts
arch/arm/boot/dts/imx6dl-prtvt7.dts
arch/arm/boot/dts/imx6dl-qmx6.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx6dl-riotboard.dts
arch/arm/boot/dts/imx6dl-yapp4-common.dtsi
arch/arm/boot/dts/imx6q-dhcom-som.dtsi
arch/arm/boot/dts/imx6q-dmo-edmqmx6.dts
arch/arm/boot/dts/imx6q-ds.dts [new file with mode: 0644]
arch/arm/boot/dts/imx6qdl-ds.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx6qdl-phytec-pfla02.dtsi
arch/arm/boot/dts/imx6qdl-sabresd.dtsi
arch/arm/boot/dts/imx6qdl-vicut1.dtsi
arch/arm/boot/dts/imx6qdl-wandboard-revd1.dtsi
arch/arm/boot/dts/imx6ul-14x14-evk.dtsi
arch/arm/boot/dts/imx7d-sdb.dts
arch/arm/boot/dts/intel-ixp42x-linksys-nslu2.dts
arch/arm/boot/dts/intel-ixp42x-welltech-epbx100.dts [new file with mode: 0644]
arch/arm/boot/dts/intel-ixp42x.dtsi
arch/arm/boot/dts/intel-ixp43x-gateworks-gw2358.dts
arch/arm/boot/dts/intel-ixp43x.dtsi
arch/arm/boot/dts/intel-ixp45x-ixp46x.dtsi
arch/arm/boot/dts/intel-ixp4xx.dtsi
arch/arm/boot/dts/keystone-k2g-evm.dts
arch/arm/boot/dts/keystone-k2g.dtsi
arch/arm/boot/dts/meson.dtsi
arch/arm/boot/dts/mstar-v7.dtsi
arch/arm/boot/dts/omap2.dtsi
arch/arm/boot/dts/omap2420.dtsi
arch/arm/boot/dts/omap2430.dtsi
arch/arm/boot/dts/omap3-evm-processor-common.dtsi
arch/arm/boot/dts/omap3-gta04a5.dts
arch/arm/boot/dts/omap3.dtsi
arch/arm/boot/dts/omap4-l4.dtsi
arch/arm/boot/dts/omap5-board-common.dtsi
arch/arm/boot/dts/omap5-l4.dtsi
arch/arm/boot/dts/openbmc-flash-layout-64.dtsi
arch/arm/boot/dts/qcom-ipq8064-rb3011.dts
arch/arm/boot/dts/qcom-ipq8064.dtsi
arch/arm/boot/dts/r8a7742.dtsi
arch/arm/boot/dts/r8a7743.dtsi
arch/arm/boot/dts/r8a7744.dtsi
arch/arm/boot/dts/r8a7745.dtsi
arch/arm/boot/dts/r8a77470.dtsi
arch/arm/boot/dts/r8a7778.dtsi
arch/arm/boot/dts/r8a7779-marzen.dts
arch/arm/boot/dts/r8a7779.dtsi
arch/arm/boot/dts/r8a7790-lager.dts
arch/arm/boot/dts/r8a7790.dtsi
arch/arm/boot/dts/r8a7791-koelsch.dts
arch/arm/boot/dts/r8a7791.dtsi
arch/arm/boot/dts/r8a7792-blanche.dts
arch/arm/boot/dts/r8a7792.dtsi
arch/arm/boot/dts/r8a7793-gose.dts
arch/arm/boot/dts/r8a7793.dtsi
arch/arm/boot/dts/r8a7794-alt.dts
arch/arm/boot/dts/r8a7794-silk.dts
arch/arm/boot/dts/r8a7794.dtsi
arch/arm/boot/dts/rk3036-kylin.dts
arch/arm/boot/dts/rk3036.dtsi
arch/arm/boot/dts/rk3066a-bqcurie2.dts
arch/arm/boot/dts/rk3066a-marsboard.dts
arch/arm/boot/dts/rk3066a-mk808.dts
arch/arm/boot/dts/rk3066a-rayeager.dts
arch/arm/boot/dts/rk3066a.dtsi
arch/arm/boot/dts/rk3188-bqedison2qc.dts
arch/arm/boot/dts/rk3188-px3-evb.dts
arch/arm/boot/dts/rk3188-radxarock.dts
arch/arm/boot/dts/rk3188.dtsi
arch/arm/boot/dts/rk322x.dtsi
arch/arm/boot/dts/rk3288-rock2-som.dtsi
arch/arm/boot/dts/rk3288-vyasa.dts
arch/arm/boot/dts/rk3288.dtsi
arch/arm/boot/dts/rk3xxx.dtsi
arch/arm/boot/dts/rv1108.dtsi
arch/arm/boot/dts/s5pv210-goni.dts
arch/arm/boot/dts/sama5d4.dtsi
arch/arm/boot/dts/sd5203.dts
arch/arm/boot/dts/ste-ab8500.dtsi
arch/arm/boot/dts/ste-ab8505.dtsi
arch/arm/boot/dts/ste-href-ab8500.dtsi
arch/arm/boot/dts/ste-href-tvk1281618-r2.dtsi
arch/arm/boot/dts/ste-href-tvk1281618-r3.dtsi
arch/arm/boot/dts/ste-href.dtsi
arch/arm/boot/dts/ste-snowball.dts
arch/arm/boot/dts/ste-ux500-samsung-golden.dts
arch/arm/boot/dts/ste-ux500-samsung-janice.dts
arch/arm/boot/dts/ste-ux500-samsung-skomer.dts
arch/arm/boot/dts/stm32429i-eval.dts
arch/arm/boot/dts/stm32746g-eval.dts
arch/arm/boot/dts/stm32f4-pinctrl.dtsi
arch/arm/boot/dts/stm32f429-disco.dts
arch/arm/boot/dts/stm32f429-pinctrl.dtsi
arch/arm/boot/dts/stm32f429.dtsi
arch/arm/boot/dts/stm32f469-disco.dts
arch/arm/boot/dts/stm32f469-pinctrl.dtsi
arch/arm/boot/dts/stm32f7-pinctrl.dtsi
arch/arm/boot/dts/stm32f746.dtsi
arch/arm/boot/dts/stm32f769-disco.dts
arch/arm/boot/dts/stm32h743.dtsi
arch/arm/boot/dts/stm32mp15-pinctrl.dtsi
arch/arm/boot/dts/stm32mp151.dtsi
arch/arm/boot/dts/stm32mp157a-microgea-stm32mp1-microdev2.0-of7.dts
arch/arm/boot/dts/stm32mp157a-stinger96.dtsi
arch/arm/boot/dts/stm32mp157c-odyssey-som.dtsi
arch/arm/boot/dts/stm32mp157c-odyssey.dts
arch/arm/boot/dts/stm32mp15xx-dhcom-pdk2.dtsi
arch/arm/boot/dts/stm32mp15xx-dhcom-som.dtsi
arch/arm/boot/dts/stm32mp15xx-dhcor-som.dtsi
arch/arm/boot/dts/stm32mp15xx-osd32.dtsi
arch/arm/boot/dts/sun8i-a33.dtsi
arch/arm/boot/dts/sun8i-r40-feta40i.dtsi [new file with mode: 0644]
arch/arm/boot/dts/sun8i-r40-oka40i-c.dts [new file with mode: 0644]
arch/arm/boot/dts/sun8i-r40.dtsi
arch/arm/boot/dts/sun8i-v3.dtsi
arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dts
arch/arm/boot/dts/sun8i-v3s.dtsi
arch/arm/boot/dts/tegra124.dtsi
arch/arm/boot/dts/tegra20-acer-a500-picasso.dts
arch/arm/boot/dts/tegra20-harmony.dts
arch/arm/boot/dts/tegra20-medcom-wide.dts
arch/arm/boot/dts/tegra20-paz00.dts
arch/arm/boot/dts/tegra20-plutux.dts
arch/arm/boot/dts/tegra20-seaboard.dts
arch/arm/boot/dts/tegra20-tec.dts
arch/arm/boot/dts/tegra20-ventana.dts
arch/arm/boot/dts/tegra30-asus-nexus7-grouper-common.dtsi
arch/arm/boot/dts/tegra30-asus-nexus7-grouper-maxim-pmic.dtsi
arch/arm/boot/dts/tegra30-asus-nexus7-grouper-ti-pmic.dtsi
arch/arm/boot/dts/tegra30-cardhu.dtsi
arch/arm/boot/dts/tegra30-ouya.dts
arch/arm/boot/dts/tegra30.dtsi
arch/arm/mach-npcm/Kconfig
arch/arm/mach-pxa/pxa_cplds_irqs.c
arch/arm/tools/syscall.tbl
arch/arm/xen/mm.c
arch/arm64/Makefile
arch/arm64/boot/dts/allwinner/Makefile
arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts [new file with mode: 0644]
arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
arch/arm64/boot/dts/amlogic/Makefile
arch/arm64/boot/dts/amlogic/meson-axg.dtsi
arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
arch/arm64/boot/dts/amlogic/meson-gx.dtsi
arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi
arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts [new file with mode: 0644]
arch/arm64/boot/dts/amlogic/meson-sm1-khadas-vim3l.dts
arch/arm64/boot/dts/amlogic/meson-sm1-odroid-c4.dts
arch/arm64/boot/dts/amlogic/meson-sm1-odroid-hc4.dts
arch/arm64/boot/dts/amlogic/meson-sm1-odroid.dtsi
arch/arm64/boot/dts/amlogic/meson-sm1.dtsi
arch/arm64/boot/dts/arm/juno-base.dtsi
arch/arm64/boot/dts/broadcom/Makefile
arch/arm64/boot/dts/broadcom/bcm2711-rpi-400.dts [new file with mode: 0644]
arch/arm64/boot/dts/broadcom/bcm4908/bcm4908.dtsi
arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi
arch/arm64/boot/dts/exynos/exynos5433-tm2-common.dtsi
arch/arm64/boot/dts/freescale/Makefile
arch/arm64/boot/dts/freescale/fsl-ls1012a-frwy.dts
arch/arm64/boot/dts/freescale/fsl-ls1012a.dtsi
arch/arm64/boot/dts/freescale/fsl-ls1028a-rdb.dts
arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi
arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi
arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
arch/arm64/boot/dts/freescale/fsl-ls2080a.dtsi
arch/arm64/boot/dts/freescale/fsl-ls2088a.dtsi
arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
arch/arm64/boot/dts/freescale/fsl-lx2160a.dtsi
arch/arm64/boot/dts/freescale/imx8-ss-conn.dtsi
arch/arm64/boot/dts/freescale/imx8mm-evk.dtsi
arch/arm64/boot/dts/freescale/imx8mm-venice-gw7901.dts [new file with mode: 0644]
arch/arm64/boot/dts/freescale/imx8mm.dtsi
arch/arm64/boot/dts/freescale/imx8mn-beacon-som.dtsi
arch/arm64/boot/dts/freescale/imx8mn-evk.dtsi
arch/arm64/boot/dts/freescale/imx8mn.dtsi
arch/arm64/boot/dts/freescale/imx8mp-evk.dts
arch/arm64/boot/dts/freescale/imx8mp-phycore-som.dtsi
arch/arm64/boot/dts/freescale/imx8mp.dtsi
arch/arm64/boot/dts/freescale/imx8mq-evk.dts
arch/arm64/boot/dts/freescale/imx8mq-nitrogen.dts
arch/arm64/boot/dts/freescale/imx8mq.dtsi
arch/arm64/boot/dts/hisilicon/hi3660-coresight.dtsi
arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dts
arch/arm64/boot/dts/hisilicon/hi3660.dtsi
arch/arm64/boot/dts/hisilicon/hi3670-hikey970.dts
arch/arm64/boot/dts/hisilicon/hi3670.dtsi
arch/arm64/boot/dts/hisilicon/hi6220-coresight.dtsi
arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts
arch/arm64/boot/dts/hisilicon/hi6220.dtsi
arch/arm64/boot/dts/hisilicon/hip05-d02.dts
arch/arm64/boot/dts/hisilicon/hip05.dtsi
arch/arm64/boot/dts/hisilicon/hip06-d03.dts
arch/arm64/boot/dts/hisilicon/hip06.dtsi
arch/arm64/boot/dts/hisilicon/hip07-d05.dts
arch/arm64/boot/dts/hisilicon/hip07.dtsi
arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts
arch/arm64/boot/dts/marvell/armada-37xx.dtsi
arch/arm64/boot/dts/marvell/armada-ap807.dtsi
arch/arm64/boot/dts/marvell/cn9130-db.dts
arch/arm64/boot/dts/mediatek/Makefile
arch/arm64/boot/dts/mediatek/mt8167.dtsi
arch/arm64/boot/dts/mediatek/mt8173.dtsi
arch/arm64/boot/dts/mediatek/mt8183-evb.dts
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts [new file with mode: 0644]
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel-sku1.dts [new file with mode: 0644]
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel-sku6.dts [new file with mode: 0644]
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel14.dts [new file with mode: 0644]
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-kappa.dts [new file with mode: 0644]
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-kenzo.dts [new file with mode: 0644]
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-willow-sku0.dts [new file with mode: 0644]
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-willow-sku1.dts [new file with mode: 0644]
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-willow.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi
arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi
arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi
arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi
arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts
arch/arm64/boot/dts/mediatek/mt8183.dtsi
arch/arm64/boot/dts/nvidia/tegra186-p2771-0000.dts
arch/arm64/boot/dts/nvidia/tegra186.dtsi
arch/arm64/boot/dts/nvidia/tegra194-p2972-0000.dts
arch/arm64/boot/dts/nvidia/tegra194-p3509-0000.dtsi
arch/arm64/boot/dts/nvidia/tegra194.dtsi
arch/arm64/boot/dts/nvidia/tegra210-p2371-2180.dts
arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi
arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts
arch/arm64/boot/dts/qcom/Makefile
arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi
arch/arm64/boot/dts/qcom/apq8096-ifc6640.dts
arch/arm64/boot/dts/qcom/ipq8074-hk10-c1.dts [new file with mode: 0644]
arch/arm64/boot/dts/qcom/ipq8074-hk10-c2.dts [new file with mode: 0644]
arch/arm64/boot/dts/qcom/ipq8074-hk10.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/qcom/ipq8074.dtsi
arch/arm64/boot/dts/qcom/msm8916-alcatel-idol347.dts
arch/arm64/boot/dts/qcom/msm8916-huawei-g7.dts [new file with mode: 0644]
arch/arm64/boot/dts/qcom/msm8916-samsung-a2015-common.dtsi
arch/arm64/boot/dts/qcom/msm8916-samsung-a3u-eur.dts
arch/arm64/boot/dts/qcom/msm8916-samsung-a5u-eur.dts
arch/arm64/boot/dts/qcom/msm8994-angler-rev-101.dts
arch/arm64/boot/dts/qcom/msm8996-mtp.dtsi
arch/arm64/boot/dts/qcom/msm8996-pins.dtsi [deleted file]
arch/arm64/boot/dts/qcom/msm8996.dtsi
arch/arm64/boot/dts/qcom/msm8998.dtsi
arch/arm64/boot/dts/qcom/pm6150.dtsi
arch/arm64/boot/dts/qcom/pm7325.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/qcom/pm8350c.dtsi
arch/arm64/boot/dts/qcom/pm8994.dtsi
arch/arm64/boot/dts/qcom/pmi8994.dtsi
arch/arm64/boot/dts/qcom/pmk8350.dtsi
arch/arm64/boot/dts/qcom/pmr735a.dtsi
arch/arm64/boot/dts/qcom/qcs404-evb.dtsi
arch/arm64/boot/dts/qcom/qcs404.dtsi
arch/arm64/boot/dts/qcom/sc7180-idp.dts
arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r1-lte.dts
arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r1.dts
arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r3-lte.dts [moved from arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r2-lte.dts with 69% similarity]
arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r3.dts [moved from arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz-r2.dts with 75% similarity]
arch/arm64/boot/dts/qcom/sc7180-trogdor-coachz.dtsi
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r0.dts
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r1.dts
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor-r3.dts
arch/arm64/boot/dts/qcom/sc7180-trogdor-lazor.dtsi
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r1.dts
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r2-lte.dts
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r2.dts
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r3-lte.dts [new file with mode: 0644]
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r3.dts [new file with mode: 0644]
arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom.dtsi
arch/arm64/boot/dts/qcom/sc7180-trogdor.dtsi
arch/arm64/boot/dts/qcom/sc7180.dtsi
arch/arm64/boot/dts/qcom/sc7280-idp.dts
arch/arm64/boot/dts/qcom/sc7280.dtsi
arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi
arch/arm64/boot/dts/qcom/sdm845-mtp.dts
arch/arm64/boot/dts/qcom/sdm845-oneplus-common.dtsi
arch/arm64/boot/dts/qcom/sdm845-xiaomi-beryllium.dts
arch/arm64/boot/dts/qcom/sdm845.dtsi
arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts
arch/arm64/boot/dts/qcom/sm8150-microsoft-surface-duo.dts [new file with mode: 0644]
arch/arm64/boot/dts/qcom/sm8150.dtsi
arch/arm64/boot/dts/qcom/sm8250.dtsi
arch/arm64/boot/dts/qcom/sm8350-mtp.dts
arch/arm64/boot/dts/qcom/sm8350.dtsi
arch/arm64/boot/dts/renesas/Makefile
arch/arm64/boot/dts/renesas/beacon-renesom-baseboard.dtsi
arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi
arch/arm64/boot/dts/renesas/hihope-rzg2-ex-aistarvision-mipi-adapter-2.1.dtsi
arch/arm64/boot/dts/renesas/r8a774a1.dtsi
arch/arm64/boot/dts/renesas/r8a774b1.dtsi
arch/arm64/boot/dts/renesas/r8a774c0-ek874-mipi-2.1.dts
arch/arm64/boot/dts/renesas/r8a774c0.dtsi
arch/arm64/boot/dts/renesas/r8a774e1.dtsi
arch/arm64/boot/dts/renesas/r8a77950.dtsi
arch/arm64/boot/dts/renesas/r8a77951.dtsi
arch/arm64/boot/dts/renesas/r8a77960.dtsi
arch/arm64/boot/dts/renesas/r8a77961.dtsi
arch/arm64/boot/dts/renesas/r8a77965.dtsi
arch/arm64/boot/dts/renesas/r8a77970-eagle.dts
arch/arm64/boot/dts/renesas/r8a77970-v3msk.dts
arch/arm64/boot/dts/renesas/r8a77970.dtsi
arch/arm64/boot/dts/renesas/r8a77980-condor.dts
arch/arm64/boot/dts/renesas/r8a77980.dtsi
arch/arm64/boot/dts/renesas/r8a77990-ebisu.dts
arch/arm64/boot/dts/renesas/r8a77990.dtsi
arch/arm64/boot/dts/renesas/r8a77995.dtsi
arch/arm64/boot/dts/renesas/r8a779a0-falcon-csi-dsi.dtsi
arch/arm64/boot/dts/renesas/r8a779a0.dtsi
arch/arm64/boot/dts/renesas/r9a07g044.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/renesas/r9a07g044l1.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/renesas/r9a07g044l2-smarc.dts [new file with mode: 0644]
arch/arm64/boot/dts/renesas/r9a07g044l2.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/renesas/rzg2l-smarc.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/renesas/salvator-common.dtsi
arch/arm64/boot/dts/ti/k3-am64-main.dtsi
arch/arm64/boot/dts/ti/k3-am64-mcu.dtsi
arch/arm64/boot/dts/ti/k3-am642-evm.dts
arch/arm64/boot/dts/ti/k3-am642-sk.dts
arch/arm64/boot/dts/ti/k3-am65-iot2050-common.dtsi
arch/arm64/boot/dts/ti/k3-am65-main.dtsi
arch/arm64/boot/dts/ti/k3-am65-mcu.dtsi
arch/arm64/boot/dts/ti/k3-am65-wakeup.dtsi
arch/arm64/boot/dts/ti/k3-am6528-iot2050-basic.dts
arch/arm64/boot/dts/ti/k3-am654-base-board.dts
arch/arm64/boot/dts/ti/k3-j7200-common-proc-board.dts
arch/arm64/boot/dts/ti/k3-j7200-main.dtsi
arch/arm64/boot/dts/ti/k3-j7200-mcu-wakeup.dtsi
arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts
arch/arm64/boot/dts/ti/k3-j721e-main.dtsi
arch/arm64/boot/dts/ti/k3-j721e-mcu-wakeup.dtsi
arch/arm64/boot/dts/toshiba/tmpv7708-rm-mbrc.dts
arch/arm64/boot/dts/toshiba/tmpv7708.dtsi
arch/arm64/boot/dts/toshiba/tmpv7708_pins.dtsi
arch/arm64/include/asm/Kbuild
arch/arm64/include/asm/cpucaps.h [deleted file]
arch/arm64/include/asm/unistd32.h
arch/arm64/mm/flush.c
arch/arm64/mm/init.c
arch/arm64/mm/proc.S
arch/arm64/tools/Makefile [new file with mode: 0644]
arch/arm64/tools/cpucaps [new file with mode: 0644]
arch/arm64/tools/gen-cpucaps.awk [new file with mode: 0755]
arch/ia64/kernel/syscalls/syscall.tbl
arch/m68k/kernel/signal.c
arch/m68k/kernel/syscalls/syscall.tbl
arch/microblaze/kernel/syscalls/syscall.tbl
arch/mips/kernel/syscalls/syscall_n32.tbl
arch/mips/kernel/syscalls/syscall_n64.tbl
arch/mips/kernel/syscalls/syscall_o32.tbl
arch/openrisc/include/asm/barrier.h [new file with mode: 0644]
arch/openrisc/kernel/setup.c
arch/openrisc/mm/init.c
arch/parisc/kernel/syscalls/syscall.tbl
arch/powerpc/include/asm/hvcall.h
arch/powerpc/include/asm/interrupt.h
arch/powerpc/include/asm/paravirt.h
arch/powerpc/include/asm/plpar_wrappers.h
arch/powerpc/include/asm/ptrace.h
arch/powerpc/include/asm/syscall.h
arch/powerpc/include/asm/uaccess.h
arch/powerpc/kernel/exceptions-64e.S
arch/powerpc/kernel/interrupt.c
arch/powerpc/kernel/legacy_serial.c
arch/powerpc/kernel/setup_64.c
arch/powerpc/kernel/signal.h
arch/powerpc/kernel/syscalls/syscall.tbl
arch/powerpc/kvm/book3s_64_mmu_hv.c
arch/powerpc/lib/feature-fixups.c
arch/powerpc/platforms/pseries/hvCall.S
arch/powerpc/platforms/pseries/lpar.c
arch/s390/kernel/syscalls/syscall.tbl
arch/sh/kernel/syscalls/syscall.tbl
arch/sh/kernel/traps.c
arch/sparc/kernel/syscalls/syscall.tbl
arch/x86/Makefile
arch/x86/boot/compressed/Makefile
arch/x86/boot/compressed/misc.c
arch/x86/boot/compressed/misc.h
arch/x86/boot/compressed/sev.c [moved from arch/x86/boot/compressed/sev-es.c with 98% similarity]
arch/x86/entry/syscalls/syscall_32.tbl
arch/x86/entry/syscalls/syscall_64.tbl
arch/x86/events/core.c
arch/x86/events/intel/core.c
arch/x86/events/intel/lbr.c
arch/x86/events/perf_event.h
arch/x86/include/asm/kvm_host.h
arch/x86/include/asm/kvm_para.h
arch/x86/include/asm/msr-index.h
arch/x86/include/asm/processor.h
arch/x86/include/asm/sev-common.h [new file with mode: 0644]
arch/x86/include/asm/sev.h [moved from arch/x86/include/asm/sev-es.h with 70% similarity]
arch/x86/include/asm/vdso/clocksource.h
arch/x86/include/uapi/asm/kvm.h
arch/x86/kernel/Makefile
arch/x86/kernel/cpu/amd.c
arch/x86/kernel/cpu/mtrr/cleanup.c
arch/x86/kernel/cpu/mtrr/generic.c
arch/x86/kernel/head64.c
arch/x86/kernel/kvm.c
arch/x86/kernel/kvmclock.c
arch/x86/kernel/mmconf-fam10h_64.c
arch/x86/kernel/nmi.c
arch/x86/kernel/sev-shared.c [moved from arch/x86/kernel/sev-es-shared.c with 96% similarity]
arch/x86/kernel/sev.c [moved from arch/x86/kernel/sev-es.c with 92% similarity]
arch/x86/kernel/signal_compat.c
arch/x86/kernel/smpboot.c
arch/x86/kvm/cpuid.c
arch/x86/kvm/emulate.c
arch/x86/kvm/kvm_emulate.h
arch/x86/kvm/lapic.c
arch/x86/kvm/mmu/mmu.c
arch/x86/kvm/mmu/tdp_mmu.c
arch/x86/kvm/svm/nested.c
arch/x86/kvm/svm/sev.c
arch/x86/kvm/svm/svm.c
arch/x86/kvm/svm/svm.h
arch/x86/kvm/vmx/capabilities.h
arch/x86/kvm/vmx/nested.c
arch/x86/kvm/vmx/vmx.c
arch/x86/kvm/vmx/vmx.h
arch/x86/kvm/x86.c
arch/x86/mm/extable.c
arch/x86/mm/mem_encrypt_identity.c
arch/x86/pci/amd_bus.c
arch/x86/platform/efi/efi_64.c
arch/x86/realmode/init.c
arch/x86/realmode/rm/trampoline_64.S
arch/x86/xen/enlighten_pv.c
arch/xtensa/kernel/syscalls/syscall.tbl
block/bfq-iosched.c
block/blk-iocost.c
block/blk-mq-sched.c
block/blk-mq.c
block/genhd.c
block/kyber-iosched.c
block/mq-deadline.c
block/partitions/efi.c
drivers/acpi/device_pm.c
drivers/acpi/internal.h
drivers/acpi/nfit/core.c
drivers/acpi/power.c
drivers/acpi/scan.c
drivers/acpi/sleep.h
drivers/android/binder.c
drivers/base/core.c
drivers/base/power/runtime.c
drivers/block/nbd.c
drivers/cdrom/gdrom.c
drivers/char/hpet.c
drivers/char/tpm/tpm2-cmd.c
drivers/char/tpm/tpm_tis_core.c
drivers/clk/clk.c
drivers/clocksource/hyperv_timer.c
drivers/cpufreq/acpi-cpufreq.c
drivers/cpufreq/intel_pstate.c
drivers/crypto/cavium/nitrox/nitrox_main.c
drivers/dma-buf/dma-buf.c
drivers/dma/qcom/hidma_mgmt.c
drivers/edac/amd64_edac.c
drivers/firmware/arm_scmi/notify.h
drivers/firmware/arm_scpi.c
drivers/gpio/gpio-cadence.c
drivers/gpio/gpio-tegra186.c
drivers/gpio/gpio-xilinx.c
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h
drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
drivers/gpu/drm/amd/amdgpu/nv.c
drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
drivers/gpu/drm/amd/amdgpu/soc15.c
drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c
drivers/gpu/drm/amd/display/dc/core/dc_link.c
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c
drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c
drivers/gpu/drm/amd/include/amd_shared.h
drivers/gpu/drm/amd/pm/powerplay/si_dpm.c
drivers/gpu/drm/amd/pm/powerplay/sislands_smc.h
drivers/gpu/drm/exynos/exynos5433_drm_decon.c
drivers/gpu/drm/exynos/exynos_drm_dsi.c
drivers/gpu/drm/exynos/exynos_drm_fimd.c
drivers/gpu/drm/i915/Kconfig
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_overlay.c
drivers/gpu/drm/i915/gem/i915_gem_mman.c
drivers/gpu/drm/i915/gem/i915_gem_pages.c
drivers/gpu/drm/i915/gt/gen7_renderclear.c
drivers/gpu/drm/i915/gt/gen8_ppgtt.c
drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c
drivers/gpu/drm/i915/gvt/gvt.c
drivers/gpu/drm/i915/gvt/gvt.h
drivers/gpu/drm/i915/gvt/hypercall.h
drivers/gpu/drm/i915/gvt/kvmgt.c
drivers/gpu/drm/i915/gvt/mpt.h
drivers/gpu/drm/i915/i915_active.c
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_mm.c
drivers/gpu/drm/msm/adreno/a6xx_gpu.c
drivers/gpu/drm/msm/dp/dp_audio.c
drivers/gpu/drm/msm/dp/dp_display.c
drivers/gpu/drm/msm/dp/dp_display.h
drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
drivers/gpu/drm/msm/dsi/phy/dsi_phy_28nm_8960.c
drivers/gpu/drm/msm/msm_drv.c
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem.h
drivers/gpu/drm/radeon/ni_dpm.c
drivers/gpu/drm/radeon/nislands_smc.h
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_gart.c
drivers/gpu/drm/radeon/radeon_pm.c
drivers/gpu/drm/radeon/si_dpm.c
drivers/gpu/drm/radeon/sislands_smc.h
drivers/gpu/drm/vc4/vc4_vec.c
drivers/hwmon/adm9240.c
drivers/hwmon/corsair-psu.c
drivers/hwmon/lm80.c
drivers/hwmon/ltc2992.c
drivers/hwmon/occ/common.c
drivers/hwmon/occ/common.h
drivers/hwmon/pmbus/fsp-3y.c
drivers/iio/accel/Kconfig
drivers/iio/common/hid-sensors/Kconfig
drivers/iio/gyro/Kconfig
drivers/iio/gyro/mpu3050-core.c
drivers/iio/humidity/Kconfig
drivers/iio/industrialio-core.c
drivers/iio/light/Kconfig
drivers/iio/light/gp2ap002.c
drivers/iio/light/tsl2583.c
drivers/iio/magnetometer/Kconfig
drivers/iio/orientation/Kconfig
drivers/iio/pressure/Kconfig
drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
drivers/iio/temperature/Kconfig
drivers/infiniband/core/cma.c
drivers/infiniband/core/uverbs_std_types_device.c
drivers/infiniband/hw/mlx5/devx.c
drivers/infiniband/hw/mlx5/dm.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/sw/rxe/rxe_comp.c
drivers/infiniband/sw/rxe/rxe_qp.c
drivers/infiniband/sw/siw/siw_verbs.c
drivers/irqchip/Kconfig
drivers/irqchip/irq-mvebu-icu.c
drivers/irqchip/irq-mvebu-sei.c
drivers/irqchip/irq-stm32-exti.c
drivers/isdn/hardware/mISDN/hfcsusb.c
drivers/isdn/hardware/mISDN/mISDNinfineon.c
drivers/leds/leds-lp5523.c
drivers/md/dm-integrity.c
drivers/md/dm-snap.c
drivers/media/dvb-frontends/sp8870.c
drivers/media/platform/rcar_drif.c
drivers/media/usb/gspca/cpia1.c
drivers/media/usb/gspca/m5602/m5602_mt9m111.c
drivers/media/usb/gspca/m5602/m5602_po1030.c
drivers/misc/eeprom/at24.c
drivers/misc/habanalabs/common/command_submission.c
drivers/misc/habanalabs/common/firmware_if.c
drivers/misc/habanalabs/common/habanalabs.h
drivers/misc/habanalabs/common/habanalabs_drv.c
drivers/misc/habanalabs/common/sysfs.c
drivers/misc/habanalabs/gaudi/gaudi.c
drivers/misc/habanalabs/gaudi/gaudi_hwmgr.c
drivers/misc/habanalabs/goya/goya.c
drivers/misc/habanalabs/goya/goya_hwmgr.c
drivers/misc/ics932s401.c
drivers/misc/lis3lv02d/lis3lv02d.h
drivers/mmc/host/meson-gx-mmc.c
drivers/mmc/host/sdhci-pci-gli.c
drivers/net/caif/caif_serial.c
drivers/net/ethernet/cavium/liquidio/lio_main.c
drivers/net/ethernet/cavium/liquidio/lio_vf_main.c
drivers/net/ethernet/fujitsu/fmvj18x_cs.c
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
drivers/net/ethernet/sun/niu.c
drivers/net/wireless/ath/ath6kl/debug.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.h
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
drivers/net/wireless/marvell/libertas/mesh.c
drivers/net/wireless/realtek/rtlwifi/base.c
drivers/nvme/host/core.c
drivers/nvme/host/fc.c
drivers/nvme/host/multipath.c
drivers/nvme/host/nvme.h
drivers/nvme/host/tcp.c
drivers/nvme/target/admin-cmd.c
drivers/nvme/target/core.c
drivers/nvme/target/discovery.c
drivers/nvme/target/fabrics-cmd.c
drivers/nvme/target/io-cmd-bdev.c
drivers/nvme/target/io-cmd-file.c
drivers/nvme/target/loop.c
drivers/nvme/target/nvmet.h
drivers/nvme/target/passthru.c
drivers/nvme/target/rdma.c
drivers/platform/mellanox/mlxbf-tmfifo.c
drivers/platform/surface/aggregator/controller.c
drivers/platform/surface/surface_dtx.c
drivers/platform/x86/Kconfig
drivers/platform/x86/dell/dell-smbios-wmi.c
drivers/platform/x86/gigabyte-wmi.c
drivers/platform/x86/hp-wireless.c
drivers/platform/x86/hp_accel.c
drivers/platform/x86/ideapad-laptop.c
drivers/platform/x86/intel_int0002_vgpio.c
drivers/platform/x86/intel_punit_ipc.c
drivers/platform/x86/touchscreen_dmi.c
drivers/rapidio/rio_cm.c
drivers/scsi/BusLogic.c
drivers/scsi/BusLogic.h
drivers/scsi/pm8001/pm8001_hwi.c
drivers/scsi/pm8001/pm8001_init.c
drivers/scsi/pm8001/pm8001_sas.c
drivers/scsi/pm8001/pm80xx_hwi.c
drivers/scsi/qedf/qedf_main.c
drivers/scsi/qla2xxx/qla_nx.c
drivers/scsi/ufs/ufs-hisi.c
drivers/scsi/ufs/ufs-mediatek.c
drivers/scsi/ufs/ufshcd.c
drivers/staging/rtl8723bs/os_dep/ioctl_cfg80211.c
drivers/staging/rtl8723bs/os_dep/ioctl_linux.c
drivers/tee/amdtee/amdtee_private.h
drivers/tee/amdtee/call.c
drivers/tee/amdtee/core.c
drivers/tty/serial/max310x.c
drivers/tty/serial/mvebu-uart.c
drivers/tty/vt/vt.c
drivers/tty/vt/vt_ioctl.c
drivers/uio/uio_hv_generic.c
drivers/uio/uio_pci_generic.c
drivers/usb/class/cdc-wdm.c
drivers/usb/core/hub.c
drivers/usb/dwc2/core.h
drivers/usb/dwc2/gadget.c
drivers/usb/dwc2/platform.c
drivers/usb/dwc3/core.h
drivers/usb/dwc3/debug.h
drivers/usb/dwc3/dwc3-imx8mp.c
drivers/usb/dwc3/dwc3-omap.c
drivers/usb/dwc3/dwc3-pci.c
drivers/usb/dwc3/gadget.c
drivers/usb/host/fotg210-hcd.c
drivers/usb/host/xhci-ext-caps.h
drivers/usb/host/xhci-pci.c
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.c
drivers/usb/musb/mediatek.c
drivers/usb/typec/tcpm/tcpm.c
drivers/usb/typec/ucsi/ucsi.c
drivers/usb/typec/ucsi/ucsi.h
drivers/video/console/vgacon.c
drivers/video/fbdev/core/fbcon.c
drivers/video/fbdev/hgafb.c
drivers/video/fbdev/imsttfb.c
drivers/xen/gntdev.c
drivers/xen/swiotlb-xen.c
drivers/xen/unpopulated-alloc.c
drivers/xen/xen-pciback/vpci.c
drivers/xen/xen-pciback/xenbus.c
fs/block_dev.c
fs/btrfs/compression.c
fs/btrfs/ctree.h
fs/btrfs/extent-tree.c
fs/btrfs/extent_io.c
fs/btrfs/file.c
fs/btrfs/free-space-cache.c
fs/btrfs/inode.c
fs/btrfs/ioctl.c
fs/btrfs/ordered-data.c
fs/btrfs/qgroup.c
fs/btrfs/reflink.c
fs/btrfs/send.c
fs/btrfs/tree-log.c
fs/btrfs/volumes.c
fs/btrfs/zoned.c
fs/btrfs/zoned.h
fs/cifs/cifsfs.c
fs/cifs/cifsglob.h
fs/cifs/file.c
fs/cifs/fs_context.c
fs/cifs/misc.c
fs/cifs/smb2ops.c
fs/cifs/smb2pdu.c
fs/dax.c
fs/ecryptfs/crypto.c
fs/erofs/zmap.c
fs/f2fs/compress.c
fs/f2fs/data.c
fs/f2fs/f2fs.h
fs/f2fs/file.c
fs/f2fs/segment.c
fs/hfsplus/extents.c
fs/hugetlbfs/inode.c
fs/io_uring.c
fs/iomap/buffered-io.c
fs/namespace.c
fs/quota/dquot.c
fs/signalfd.c
fs/squashfs/file.c
fs/xfs/libxfs/xfs_fs.h
fs/xfs/scrub/common.c
fs/xfs/xfs_bmap_util.c
include/dt-bindings/clock/r9a07g044-cpg.h [new file with mode: 0644]
include/dt-bindings/mailbox/qcom-ipcc.h
include/dt-bindings/pinctrl/hisi.h
include/linux/bits.h
include/linux/blkdev.h
include/linux/compat.h
include/linux/console_struct.h
include/linux/const.h
include/linux/dynamic_debug.h
include/linux/elevator.h
include/linux/fwnode.h
include/linux/genhd.h
include/linux/libnvdimm.h
include/linux/minmax.h
include/linux/mm.h
include/linux/mm_types.h
include/linux/pagemap.h
include/linux/pm.h
include/linux/randomize_kstack.h
include/linux/sched/signal.h
include/linux/signal.h
include/linux/surface_aggregator/device.h
include/net/page_pool.h
include/uapi/asm-generic/siginfo.h
include/uapi/linux/fs.h
include/uapi/linux/perf_event.h
include/uapi/linux/signalfd.h
include/uapi/misc/habanalabs.h
include/xen/arm/swiotlb-xen.h
ipc/mqueue.c
ipc/msg.c
ipc/sem.c
kernel/events/core.c
kernel/kcsan/debugfs.c
kernel/locking/lockdep.c
kernel/locking/mutex-debug.c
kernel/locking/mutex-debug.h
kernel/locking/mutex.c
kernel/locking/mutex.h
kernel/module.c
kernel/ptrace.c
kernel/resource.c
kernel/sched/fair.c
kernel/signal.c
kernel/time/alarmtimer.c
kernel/trace/trace.c
kernel/watchdog.c
lib/Makefile
lib/dynamic_debug.c
lib/test_kasan.c
mm/gup.c
mm/hugetlb.c
mm/internal.h
mm/ioremap.c
mm/ksm.c
mm/shmem.c
mm/shuffle.h
mm/slab_common.c
mm/slub.c
mm/userfaultfd.c
net/core/page_pool.c
net/smc/smc_ism.c
scripts/dummy-tools/gcc
scripts/jobserver-exec
security/keys/trusted-keys/trusted_tpm1.c
security/keys/trusted-keys/trusted_tpm2.c
sound/firewire/Kconfig
sound/firewire/amdtp-stream-trace.h
sound/firewire/amdtp-stream.c
sound/firewire/bebob/bebob.c
sound/firewire/dice/dice-alesis.c
sound/firewire/dice/dice-pcm.c
sound/firewire/dice/dice-stream.c
sound/firewire/dice/dice-tcelectronic.c
sound/firewire/dice/dice.c
sound/firewire/dice/dice.h
sound/firewire/oxfw/oxfw.c
sound/isa/gus/gus_main.c
sound/isa/sb/sb16_main.c
sound/isa/sb/sb8.c
sound/pci/hda/patch_realtek.c
sound/pci/intel8x0.c
sound/soc/codecs/cs43130.c
sound/soc/codecs/rt5645.c
sound/usb/line6/driver.c
sound/usb/line6/pod.c
sound/usb/line6/variax.c
sound/usb/midi.c
tools/arch/powerpc/include/uapi/asm/errno.h
tools/arch/x86/include/asm/cpufeatures.h
tools/arch/x86/include/asm/msr-index.h
tools/arch/x86/include/uapi/asm/vmx.h
tools/arch/x86/lib/memcpy_64.S
tools/arch/x86/lib/memset_64.S
tools/build/Makefile.build
tools/include/asm/alternative.h [moved from tools/include/asm/alternative-asm.h with 100% similarity]
tools/include/linux/bits.h
tools/include/linux/const.h
tools/include/uapi/asm-generic/unistd.h
tools/include/uapi/drm/drm.h
tools/include/uapi/drm/i915_drm.h
tools/include/uapi/linux/kvm.h
tools/include/uapi/linux/perf_event.h
tools/include/uapi/linux/prctl.h
tools/kvm/kvm_stat/kvm_stat.txt
tools/objtool/arch/x86/decode.c
tools/objtool/elf.c
tools/perf/Makefile.config
tools/perf/arch/arm64/util/kvm-stat.c
tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl
tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
tools/perf/arch/s390/entry/syscalls/syscall.tbl
tools/perf/arch/x86/entry/syscalls/syscall_64.tbl
tools/perf/pmu-events/jevents.c
tools/perf/tests/attr/base-record
tools/perf/tests/attr/base-stat
tools/perf/tests/attr/system-wide-dummy
tools/perf/util/Build
tools/perf/util/record.c
tools/perf/util/session.c
tools/scripts/Makefile.include
tools/testing/nvdimm/test/iomap.c
tools/testing/nvdimm/test/nfit.c
tools/testing/selftests/arm64/bti/test.c
tools/testing/selftests/exec/Makefile
tools/testing/selftests/kvm/lib/x86_64/handlers.S
tools/testing/selftests/kvm/x86_64/evmcs_test.c
tools/testing/selftests/perf_events/sigtrap_threads.c
tools/testing/selftests/seccomp/seccomp_bpf.c
virt/kvm/kvm_main.c

index 3e2bff9..ce6c497 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -160,6 +160,7 @@ Jeff Layton <jlayton@kernel.org> <jlayton@primarydata.com>
 Jeff Layton <jlayton@kernel.org> <jlayton@redhat.com>
 Jens Axboe <axboe@suse.de>
 Jens Osterkamp <Jens.Osterkamp@de.ibm.com>
+Jernej Skrabec <jernej.skrabec@gmail.com> <jernej.skrabec@siol.net>
 Jiri Slaby <jirislaby@kernel.org> <jirislaby@gmail.com>
 Jiri Slaby <jirislaby@kernel.org> <jslaby@novell.com>
 Jiri Slaby <jirislaby@kernel.org> <jslaby@suse.com>
index 0faf135..5bcce27 100644 (file)
@@ -1,7 +1,7 @@
 What:           /sys/class/dax/
 Date:           May, 2016
 KernelVersion:  v4.7
-Contact:        linux-nvdimm@lists.01.org
+Contact:        nvdimm@lists.linux.dev
 Description:   Device DAX is the device-centric analogue of Filesystem
                DAX (CONFIG_FS_DAX).  It allows memory ranges to be
                allocated and mapped without need of an intervening file
index 0360be3..dae880b 100644 (file)
@@ -1,4 +1,4 @@
-This ABI is renamed and moved to a new location /sys/kernel/fadump/registered.¬
+This ABI is renamed and moved to a new location /sys/kernel/fadump/registered.
 
 What:          /sys/kernel/fadump_registered
 Date:          Feb 2012
index 6ce0b12..ca2396e 100644 (file)
@@ -1,4 +1,4 @@
-This ABI is renamed and moved to a new location /sys/kernel/fadump/release_mem.¬
+This ABI is renamed and moved to a new location /sys/kernel/fadump/release_mem.
 
 What:          /sys/kernel/fadump_release_mem
 Date:          Feb 2012
index ae8c1ca..2774370 100644 (file)
@@ -1,7 +1,7 @@
 What:          /sys/bus/nd/devices/regionX/nfit/ecc_unit_size
 Date:          Aug, 2017
 KernelVersion: v4.14 (Removed v4.18)
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) Size of a write request to a DIMM that will not incur a
                read-modify-write cycle at the memory controller.
index 63ef0b9..e7282d1 100644 (file)
@@ -5,7 +5,7 @@ Interface Table (NFIT)' section in the ACPI specification
 What:          /sys/bus/nd/devices/nmemX/nfit/serial
 Date:          Jun, 2015
 KernelVersion: v4.2
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) Serial number of the NVDIMM (non-volatile dual in-line
                memory module), assigned by the module vendor.
@@ -14,7 +14,7 @@ Description:
 What:          /sys/bus/nd/devices/nmemX/nfit/handle
 Date:          Apr, 2015
 KernelVersion: v4.2
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) The address (given by the _ADR object) of the device on its
                parent bus of the NVDIMM device containing the NVDIMM region.
@@ -23,7 +23,7 @@ Description:
 What:          /sys/bus/nd/devices/nmemX/nfit/device
 Date:          Apr, 2015
 KernelVersion: v4.1
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) Device id for the NVDIMM, assigned by the module vendor.
 
@@ -31,7 +31,7 @@ Description:
 What:          /sys/bus/nd/devices/nmemX/nfit/rev_id
 Date:          Jun, 2015
 KernelVersion: v4.2
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) Revision of the NVDIMM, assigned by the module vendor.
 
@@ -39,7 +39,7 @@ Description:
 What:          /sys/bus/nd/devices/nmemX/nfit/phys_id
 Date:          Apr, 2015
 KernelVersion: v4.2
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) Handle (i.e., instance number) for the SMBIOS (system
                management BIOS) Memory Device structure describing the NVDIMM
@@ -49,7 +49,7 @@ Description:
 What:          /sys/bus/nd/devices/nmemX/nfit/flags
 Date:          Jun, 2015
 KernelVersion: v4.2
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) The flags in the NFIT memory device sub-structure indicate
                the state of the data on the nvdimm relative to its energy
@@ -68,7 +68,7 @@ What:         /sys/bus/nd/devices/nmemX/nfit/format1
 What:          /sys/bus/nd/devices/nmemX/nfit/formats
 Date:          Apr, 2016
 KernelVersion: v4.7
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) The interface codes indicate support for persistent memory
                mapped directly into system physical address space and / or a
@@ -84,7 +84,7 @@ Description:
 What:          /sys/bus/nd/devices/nmemX/nfit/vendor
 Date:          Apr, 2016
 KernelVersion: v4.7
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) Vendor id of the NVDIMM.
 
@@ -92,7 +92,7 @@ Description:
 What:          /sys/bus/nd/devices/nmemX/nfit/dsm_mask
 Date:          May, 2016
 KernelVersion: v4.7
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) The bitmask indicates the supported device specific control
                functions relative to the NVDIMM command family supported by the
@@ -102,7 +102,7 @@ Description:
 What:          /sys/bus/nd/devices/nmemX/nfit/family
 Date:          Apr, 2016
 KernelVersion: v4.7
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) Displays the NVDIMM family command sets. Values
                0, 1, 2 and 3 correspond to NVDIMM_FAMILY_INTEL,
@@ -118,7 +118,7 @@ Description:
 What:          /sys/bus/nd/devices/nmemX/nfit/id
 Date:          Apr, 2016
 KernelVersion: v4.7
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) ACPI specification 6.2 section 5.2.25.9, defines an
                identifier for an NVDIMM, which refelects the id attribute.
@@ -127,7 +127,7 @@ Description:
 What:          /sys/bus/nd/devices/nmemX/nfit/subsystem_vendor
 Date:          Apr, 2016
 KernelVersion: v4.7
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) Sub-system vendor id of the NVDIMM non-volatile memory
                subsystem controller.
@@ -136,7 +136,7 @@ Description:
 What:          /sys/bus/nd/devices/nmemX/nfit/subsystem_rev_id
 Date:          Apr, 2016
 KernelVersion: v4.7
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) Sub-system revision id of the NVDIMM non-volatile memory subsystem
                controller, assigned by the non-volatile memory subsystem
@@ -146,7 +146,7 @@ Description:
 What:          /sys/bus/nd/devices/nmemX/nfit/subsystem_device
 Date:          Apr, 2016
 KernelVersion: v4.7
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) Sub-system device id for the NVDIMM non-volatile memory
                subsystem controller, assigned by the non-volatile memory
@@ -156,7 +156,7 @@ Description:
 What:          /sys/bus/nd/devices/ndbusX/nfit/revision
 Date:          Jun, 2015
 KernelVersion: v4.2
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) ACPI NFIT table revision number.
 
@@ -164,7 +164,7 @@ Description:
 What:          /sys/bus/nd/devices/ndbusX/nfit/scrub
 Date:          Sep, 2016
 KernelVersion: v4.9
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RW) This shows the number of full Address Range Scrubs (ARS)
                that have been completed since driver load time. Userspace can
@@ -177,7 +177,7 @@ Description:
 What:          /sys/bus/nd/devices/ndbusX/nfit/hw_error_scrub
 Date:          Sep, 2016
 KernelVersion: v4.9
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RW) Provides a way to toggle the behavior between just adding
                the address (cache line) where the MCE happened to the poison
@@ -196,7 +196,7 @@ Description:
 What:          /sys/bus/nd/devices/ndbusX/nfit/dsm_mask
 Date:          Jun, 2017
 KernelVersion: v4.13
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) The bitmask indicates the supported bus specific control
                functions. See the section named 'NVDIMM Root Device _DSMs' in
@@ -205,7 +205,7 @@ Description:
 What:          /sys/bus/nd/devices/ndbusX/nfit/firmware_activate_noidle
 Date:          Apr, 2020
 KernelVersion: v5.8
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RW) The Intel platform implementation of firmware activate
                support exposes an option let the platform force idle devices in
@@ -225,7 +225,7 @@ Description:
 What:          /sys/bus/nd/devices/regionX/nfit/range_index
 Date:          Jun, 2015
 KernelVersion: v4.2
-Contact:       linux-nvdimm@lists.01.org
+Contact:       nvdimm@lists.linux.dev
 Description:
                (RO) A unique number provided by the BIOS to identify an address
                range. Used by NVDIMM Region Mapping Structure to uniquely refer
index 8316c33..92e2db0 100644 (file)
@@ -1,7 +1,7 @@
 What:          /sys/bus/nd/devices/nmemX/papr/flags
 Date:          Apr, 2020
 KernelVersion: v5.8
-Contact:       linuxppc-dev <linuxppc-dev@lists.ozlabs.org>, linux-nvdimm@lists.01.org,
+Contact:       linuxppc-dev <linuxppc-dev@lists.ozlabs.org>, nvdimm@lists.linux.dev,
 Description:
                (RO) Report flags indicating various states of a
                papr-pmem NVDIMM device. Each flag maps to a one or
@@ -36,7 +36,7 @@ Description:
 What:          /sys/bus/nd/devices/nmemX/papr/perf_stats
 Date:          May, 2020
 KernelVersion: v5.9
-Contact:       linuxppc-dev <linuxppc-dev@lists.ozlabs.org>, linux-nvdimm@lists.01.org,
+Contact:       linuxppc-dev <linuxppc-dev@lists.ozlabs.org>, nvdimm@lists.linux.dev,
 Description:
                (RO) Report various performance stats related to papr-scm NVDIMM
                device.  Each stat is reported on a new line with each line
index a485434..88bddf1 100644 (file)
@@ -37,13 +37,13 @@ Description:        Maximum time allowed for periodic transfers per microframe (μs)
 
 What:          /sys/module/*/{coresize,initsize}
 Date:          Jan 2012
-KernelVersion:»·3.3
+KernelVersion: 3.3
 Contact:       Kay Sievers <kay.sievers@vrfy.org>
 Description:   Module size in bytes.
 
 What:          /sys/module/*/taint
 Date:          Jan 2012
-KernelVersion:»·3.3
+KernelVersion: 3.3
 Contact:       Kay Sievers <kay.sievers@vrfy.org>
 Description:   Module taint flags:
                        ==  =====================
index 1d56a6b..7ca8df5 100644 (file)
@@ -483,10 +483,11 @@ modprobe
 ========
 
 The full path to the usermode helper for autoloading kernel modules,
-by default "/sbin/modprobe".  This binary is executed when the kernel
-requests a module.  For example, if userspace passes an unknown
-filesystem type to mount(), then the kernel will automatically request
-the corresponding filesystem module by executing this usermode helper.
+by default ``CONFIG_MODPROBE_PATH``, which in turn defaults to
+"/sbin/modprobe".  This binary is executed when the kernel requests a
+module.  For example, if userspace passes an unknown filesystem type
+to mount(), then the kernel will automatically request the
+corresponding filesystem module by executing this usermode helper.
 This usermode helper should insert the needed module into the kernel.
 
 This sysctl only affects module autoloading.  It has no effect on the
index 4f2452a..07a97aa 100644 (file)
@@ -1,4 +1,4 @@
-==============
+==============
 Data Integrity
 ==============
 
index 70500b1..5845960 100644 (file)
@@ -146,18 +146,18 @@ with the kernel as a block device by registering the following general
 *struct file_operations*::
 
        struct file_operations cdrom_fops = {
-               NULL,                   /∗ lseek ∗/
-               block _read ,           /∗ read—general block-dev read ∗/
-               block _write,           /∗ write—general block-dev write ∗/
-               NULL,                   /∗ readdir ∗/
-               NULL,                   /∗ select ∗/
-               cdrom_ioctl,            /∗ ioctl ∗/
-               NULL,                   /∗ mmap ∗/
-               cdrom_open,             /∗ open ∗/
-               cdrom_release,          /∗ release ∗/
-               NULL,                   /∗ fsync ∗/
-               NULL,                   /∗ fasync ∗/
-               NULL                    /∗ revalidate ∗/
+               NULL,                   /* lseek */
+               block _read ,           /* read--general block-dev read */
+               block _write,           /* write--general block-dev write */
+               NULL,                   /* readdir */
+               NULL,                   /* select */
+               cdrom_ioctl,            /* ioctl */
+               NULL,                   /* mmap */
+               cdrom_open,             /* open */
+               cdrom_release,          /* release */
+               NULL,                   /* fsync */
+               NULL,                   /* fasync */
+               NULL                    /* revalidate */
        };
 
 Every active CD-ROM device shares this *struct*. The routines
@@ -250,12 +250,12 @@ The drive-specific, minor-like information that is registered with
 `cdrom.c`, currently contains the following fields::
 
   struct cdrom_device_info {
-       const struct cdrom_device_ops * ops;    /* device operations for this major */
+       const struct cdrom_device_ops * ops;    /* device operations for this major */
        struct list_head list;                  /* linked list of all device_info */
        struct gendisk * disk;                  /* matching block layer disk */
        void *  handle;                         /* driver-dependent data */
 
-       int mask;                               /* mask of capability: disables them */
+       int mask;                               /* mask of capability: disables them */
        int speed;                              /* maximum speed for reading data */
        int capacity;                           /* number of discs in a jukebox */
 
@@ -569,7 +569,7 @@ the *CDC_CLOSE_TRAY* bit in *mask*.
 
 In the file `cdrom.c` you will encounter many constructions of the type::
 
-       if (cdo->capability & ∼cdi->mask & CDC _⟨capability⟩) ...
+       if (cdo->capability & ~cdi->mask & CDC _<capability>) ...
 
 There is no *ioctl* to set the mask... The reason is that
 I think it is better to control the **behavior** rather than the
index 97fb962..6423377 100644 (file)
@@ -167,6 +167,7 @@ properties:
       - description: Boards with the Amlogic Meson SM1 S905X3/D3/Y3 SoC
         items:
           - enum:
+              - bananapi,bpi-m5
               - hardkernel,odroid-c4
               - hardkernel,odroid-hc4
               - khadas,vim3l
index 812ae8c..230b80d 100644 (file)
@@ -18,6 +18,7 @@ properties:
       - description: BCM2711 based Boards
         items:
           - enum:
+              - raspberrypi,400
               - raspberrypi,4-model-b
           - const: brcm,bcm2711
 
index e3c50f2..1c827c1 100644 (file)
@@ -197,6 +197,7 @@ properties:
               - boundary,imx6q-nitrogen6x
               - compulab,cm-fx6           # CompuLab CM-FX6
               - dmo,imx6q-edmqmx6         # Data Modul eDM-QMX6 Board
+              - ds,imx6q-sbc              # Da Sheng COM-9XX Modules
               - embest,imx6q-marsboard    # Embest MarS Board i.MX6Dual
               - emtrion,emcon-mx6         # emCON-MX6D or emCON-MX6Q SoM
               - emtrion,emcon-mx6-avari   # emCON-MX6D or emCON-MX6Q SoM on Avari Base
@@ -400,6 +401,17 @@ properties:
           - const: armadeus,imx6dl-apf6         # APF6 (Solo) SoM
           - const: fsl,imx6dl
 
+      - description: i.MX6DL based congatec QMX6 Boards
+        items:
+          - enum:
+              - ge,imx6dl-b105v2          # General Electric B105v2
+              - ge,imx6dl-b105pv2         # General Electric B105Pv2
+              - ge,imx6dl-b125v2          # General Electric B125v2
+              - ge,imx6dl-b125pv2         # General Electric B125Pv2
+              - ge,imx6dl-b155v2          # General Electric B155v2
+          - const: congatec,qmx6
+          - const: fsl,imx6dl
+
       - description: i.MX6DL based DFI FS700-M60-6DL Board
         items:
           - const: dfi,fs700-m60-6dl
@@ -685,6 +697,7 @@ properties:
               - gw,imx8mm-gw71xx-0x       # i.MX8MM Gateworks Development Kit
               - gw,imx8mm-gw72xx-0x       # i.MX8MM Gateworks Development Kit
               - gw,imx8mm-gw73xx-0x       # i.MX8MM Gateworks Development Kit
+              - gw,imx8mm-gw7901          # i.MX8MM Gateworks Board
               - kontron,imx8mm-n801x-som  # i.MX8MM Kontron SL (N801X) SOM
               - variscite,var-som-mx8mm   # i.MX8MM Variscite VAR-SOM-MX8MM module
           - const: fsl,imx8mm
index d72e92b..230bffe 100644 (file)
@@ -17,6 +17,7 @@ properties:
       - items:
           - enum:
               - linksys,nslu2
+              - welltech,epbx100
           - const: intel,ixp42x
       - items:
           - enum:
index aff57a8..80a05f6 100644 (file)
@@ -122,6 +122,10 @@ properties:
           - enum:
               - mediatek,mt8195-evb
           - const: mediatek,mt8195
+      - description: Google Burnet (HP Chromebook x360 11MK G3 EE)
+        items:
+          - const: google,burnet
+          - const: mediatek,mt8183
       - description: Google Krane (Lenovo IdeaPad Duet, 10e,...)
         items:
           - enum:
@@ -133,9 +137,19 @@ properties:
         items:
           - const: google,damu
           - const: mediatek,mt8183
-      - description: Google Juniper (Acer Chromebook Spin 311)
+      - description: Google Fennel (Lenovo IdeaPad 3 Chromebook)
+        items:
+          - enum:
+              - google,fennel-sku0
+              - google,fennel-sku1
+              - google,fennel-sku6
+          - const: google,fennel
+          - const: mediatek,mt8183
+      - description: Google Juniper (Acer Chromebook Spin 311) / Kenzo (Acer Chromebook 311)
         items:
-          - const: google,juniper-sku16
+          - enum:
+              - google,juniper-sku16
+              - google,juniper-sku17
           - const: google,juniper
           - const: mediatek,mt8183
       - description: Google Kakadu (ASUS Chromebook Detachable CM3)
@@ -144,6 +158,10 @@ properties:
           - const: google,kakadu-rev2
           - const: google,kakadu
           - const: mediatek,mt8183
+      - description: Google Kappa (HP Chromebook 11a)
+        items:
+          - const: google,kappa
+          - const: mediatek,mt8183
       - description: Google Kodama (Lenovo 10e Chromebook Tablet)
         items:
           - enum:
@@ -153,6 +171,13 @@ properties:
               - google,kodama-sku32
           - const: google,kodama
           - const: mediatek,mt8183
+      - description: Google Willow (Acer Chromebook 311 C722/C722T)
+        items:
+          - enum:
+              - google,willow-sku0
+              - google,willow-sku1
+          - const: google,willow
+          - const: mediatek,mt8183
       - items:
           - enum:
               - mediatek,mt8183-pumpkin
index 9b27e99..2babb95 100644 (file)
@@ -178,6 +178,7 @@ properties:
       - items:
           - enum:
               - qcom,sc7280-idp
+              - google,senor
           - const: qcom,sc7280
 
       - items:
index 5fd0696..a0cce4e 100644 (file)
@@ -302,6 +302,24 @@ properties:
               - renesas,rzn1d400-db # RZN1D-DB (RZ/N1D Demo Board for the RZ/N1D 400 pins package)
           - const: renesas,r9a06g032
 
+      - description: RZ/G2UL (R9A07G043)
+        items:
+          - enum:
+              - renesas,r9a07g043u11 # RZ/G2UL Type-1
+              - renesas,r9a07g043u12 # RZ/G2UL Type-2
+          - const: renesas,r9a07g043
+
+      - description: RZ/G2{L,LC} (R9A07G044)
+        items:
+          - enum:
+              - renesas,smarc-evk # SMARC EVK
+          - enum:
+              - renesas,r9a07g044c1 # Single Cortex-A55 RZ/G2LC
+              - renesas,r9a07g044c2 # Dual Cortex-A55 RZ/G2LC
+              - renesas,r9a07g044l1 # Single Cortex-A55 RZ/G2L
+              - renesas,r9a07g044l2 # Dual Cortex-A55 RZ/G2L
+          - const: renesas,r9a07g044
+
 additionalProperties: true
 
 ...
index ac75002..889128a 100644 (file)
@@ -224,6 +224,12 @@ properties:
           - const: empire-electronix,m712
           - const: allwinner,sun5i-a13
 
+      - description: Forlinx OKA40i-C Development board
+        items:
+          - const: forlinx,oka40i-c
+          - const: forlinx,feta40i-c
+          - const: allwinner,sun8i-r40
+
       - description: FriendlyARM NanoPi A64
         items:
           - const: friendlyarm,nanopi-a64
@@ -269,6 +275,11 @@ properties:
           - const: friendlyarm,nanopi-r1
           - const: allwinner,sun8i-h3
 
+      - description: FriendlyARM NanoPi R1S H5
+        items:
+          - const: friendlyarm,nanopi-r1s-h5
+          - const: allwinner,sun50i-h5
+
       - description: FriendlyARM ZeroPi
         items:
           - const: friendlyarm,zeropi
index 43fd2f8..0afec83 100644 (file)
@@ -301,6 +301,33 @@ patternProperties:
 
     additionalProperties: false
 
+  core-domain:
+    type: object
+    description: |
+      The vast majority of hardware blocks of Tegra SoC belong to a
+      Core power domain, which has a dedicated voltage rail that powers
+      the blocks.
+
+    properties:
+      operating-points-v2:
+        description:
+          Should contain level, voltages and opp-supported-hw property.
+          The supported-hw is a bitfield indicating SoC speedo or process
+          ID mask.
+
+      "#power-domain-cells":
+        const: 0
+
+    required:
+      - operating-points-v2
+      - "#power-domain-cells"
+
+    additionalProperties: false
+
+  core-supply:
+    description:
+      Phandle to voltage regulator connected to the SoC Core power rail.
+
 required:
   - compatible
   - reg
@@ -325,6 +352,7 @@ examples:
     tegra_pmc: pmc@7000e400 {
               compatible = "nvidia,tegra210-pmc";
               reg = <0x7000e400 0x400>;
+              core-supply = <&regulator>;
               clocks = <&tegra_car TEGRA210_CLK_PCLK>, <&clk32k_in>;
               clock-names = "pclk", "clk32k_in";
               #clock-cells = <1>;
@@ -338,17 +366,24 @@ examples:
               nvidia,core-power-req-active-high;
               nvidia,sys-clock-req-active-high;
 
+              pd_core: core-domain {
+                      operating-points-v2 = <&core_opp_table>;
+                      #power-domain-cells = <0>;
+              };
+
               powergates {
                     pd_audio: aud {
                             clocks = <&tegra_car TEGRA210_CLK_APE>,
                                      <&tegra_car TEGRA210_CLK_APB2APE>;
                             resets = <&tegra_car 198>;
+                            power-domains = <&pd_core>;
                             #power-domain-cells = <0>;
                     };
 
                     pd_xusbss: xusba {
                             clocks = <&tegra_car TEGRA210_CLK_XUSB_SS>;
                             resets = <&tegra_car TEGRA210_CLK_XUSB_SS>;
+                            power-domains = <&pd_core>;
                             #power-domain-cells = <0>;
                     };
               };
diff --git a/Documentation/devicetree/bindings/clock/brcm,iproc-clocks.txt b/Documentation/devicetree/bindings/clock/brcm,iproc-clocks.txt
deleted file mode 100644 (file)
index ab730ea..0000000
+++ /dev/null
@@ -1,313 +0,0 @@
-Broadcom iProc Family Clocks
-
-This binding uses the common clock binding:
-    Documentation/devicetree/bindings/clock/clock-bindings.txt
-
-The iProc clock controller manages clocks that are common to the iProc family.
-An SoC from the iProc family may have several PPLs, e.g., ARMPLL, GENPLL,
-LCPLL0, MIPIPLL, and etc., all derived from an onboard crystal. Each PLL
-comprises of several leaf clocks
-
-Required properties for a PLL and its leaf clocks:
-
-- compatible:
-    Should have a value of the form "brcm,<soc>-<pll>". For example, GENPLL on
-Cygnus has a compatible string of "brcm,cygnus-genpll"
-
-- #clock-cells:
-    Have a value of <1> since there are more than 1 leaf clock of a given PLL
-
-- reg:
-    Define the base and range of the I/O address space that contain the iProc
-clock control registers required for the PLL
-
-- clocks:
-    The input parent clock phandle for the PLL. For most iProc PLLs, this is an
-onboard crystal with a fixed rate
-
-- clock-output-names:
-    An ordered list of strings defining the names of the clocks
-
-Example:
-
-       osc: oscillator {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <25000000>;
-       };
-
-       genpll: genpll {
-               #clock-cells = <1>;
-               compatible = "brcm,cygnus-genpll";
-               reg = <0x0301d000 0x2c>, <0x0301c020 0x4>;
-               clocks = <&osc>;
-               clock-output-names = "genpll", "axi21", "250mhz", "ihost_sys",
-                                    "enet_sw", "audio_125", "can";
-       };
-
-Required properties for ASIU clocks:
-
-ASIU clocks are a special case. These clocks are derived directly from the
-reference clock of the onboard crystal
-
-- compatible:
-    Should have a value of the form "brcm,<soc>-asiu-clk". For example, ASIU
-clocks for Cygnus have a compatible string of "brcm,cygnus-asiu-clk"
-
-- #clock-cells:
-    Have a value of <1> since there are more than 1 ASIU clocks
-
-- reg:
-    Define the base and range of the I/O address space that contain the iProc
-clock control registers required for ASIU clocks
-
-- clocks:
-    The input parent clock phandle for the ASIU clock, i.e., the onboard
-crystal
-
-- clock-output-names:
-    An ordered list of strings defining the names of the ASIU clocks
-
-Example:
-
-       osc: oscillator {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <25000000>;
-       };
-
-       asiu_clks: asiu_clks {
-               #clock-cells = <1>;
-               compatible = "brcm,cygnus-asiu-clk";
-               reg = <0x0301d048 0xc>, <0x180aa024 0x4>;
-               clocks = <&osc>;
-               clock-output-names = "keypad", "adc/touch", "pwm";
-       };
-
-Cygnus
-------
-PLL and leaf clock compatible strings for Cygnus are:
-    "brcm,cygnus-armpll"
-    "brcm,cygnus-genpll"
-    "brcm,cygnus-lcpll0"
-    "brcm,cygnus-mipipll"
-    "brcm,cygnus-asiu-clk"
-    "brcm,cygnus-audiopll"
-
-The following table defines the set of PLL/clock index and ID for Cygnus.
-These clock IDs are defined in:
-    "include/dt-bindings/clock/bcm-cygnus.h"
-
-    Clock      Source (Parent)  Index   ID
-    ---        -----            -----   ---------
-    crystal    N/A              N/A     N/A
-
-    armpll     crystal          N/A     N/A
-
-    keypad     crystal (ASIU)   0       BCM_CYGNUS_ASIU_KEYPAD_CLK
-    adc/tsc    crystal (ASIU)   1       BCM_CYGNUS_ASIU_ADC_CLK
-    pwm        crystal (ASIU)   2       BCM_CYGNUS_ASIU_PWM_CLK
-
-    genpll     crystal          0       BCM_CYGNUS_GENPLL
-    axi21      genpll           1       BCM_CYGNUS_GENPLL_AXI21_CLK
-    250mhz     genpll           2       BCM_CYGNUS_GENPLL_250MHZ_CLK
-    ihost_sys  genpll           3       BCM_CYGNUS_GENPLL_IHOST_SYS_CLK
-    enet_sw    genpll           4       BCM_CYGNUS_GENPLL_ENET_SW_CLK
-    audio_125  genpll           5       BCM_CYGNUS_GENPLL_AUDIO_125_CLK
-    can        genpll           6       BCM_CYGNUS_GENPLL_CAN_CLK
-
-    lcpll0     crystal          0       BCM_CYGNUS_LCPLL0
-    pcie_phy   lcpll0           1       BCM_CYGNUS_LCPLL0_PCIE_PHY_REF_CLK
-    ddr_phy    lcpll0           2       BCM_CYGNUS_LCPLL0_DDR_PHY_CLK
-    sdio       lcpll0           3       BCM_CYGNUS_LCPLL0_SDIO_CLK
-    usb_phy    lcpll0           4       BCM_CYGNUS_LCPLL0_USB_PHY_REF_CLK
-    smart_card lcpll0           5       BCM_CYGNUS_LCPLL0_SMART_CARD_CLK
-    ch5_unused lcpll0           6       BCM_CYGNUS_LCPLL0_CH5_UNUSED
-
-    mipipll    crystal          0       BCM_CYGNUS_MIPIPLL
-    ch0_unused mipipll          1       BCM_CYGNUS_MIPIPLL_CH0_UNUSED
-    ch1_lcd    mipipll          2       BCM_CYGNUS_MIPIPLL_CH1_LCD
-    ch2_v3d    mipipll          3       BCM_CYGNUS_MIPIPLL_CH2_V3D
-    ch3_unused mipipll          4       BCM_CYGNUS_MIPIPLL_CH3_UNUSED
-    ch4_unused mipipll          5       BCM_CYGNUS_MIPIPLL_CH4_UNUSED
-    ch5_unused mipipll          6       BCM_CYGNUS_MIPIPLL_CH5_UNUSED
-
-    audiopll   crystal          0       BCM_CYGNUS_AUDIOPLL
-    ch0_audio  audiopll         1       BCM_CYGNUS_AUDIOPLL_CH0
-    ch1_audio  audiopll         2       BCM_CYGNUS_AUDIOPLL_CH1
-    ch2_audio  audiopll         3       BCM_CYGNUS_AUDIOPLL_CH2
-
-Hurricane 2
-------
-PLL and leaf clock compatible strings for Hurricane 2 are:
- "brcm,hr2-armpll"
-
-The following table defines the set of PLL/clock for Hurricane 2:
-
-    Clock      Source          Index   ID
-    ---                -----           -----   ---------
-    crystal    N/A             N/A     N/A
-
-    armpll     crystal         N/A     N/A
-
-
-Northstar and Northstar Plus
-------
-PLL and leaf clock compatible strings for Northstar and Northstar Plus are:
- "brcm,nsp-armpll"
- "brcm,nsp-genpll"
- "brcm,nsp-lcpll0"
-
-The following table defines the set of PLL/clock index and ID for Northstar and
-Northstar Plus.  These clock IDs are defined in:
-    "include/dt-bindings/clock/bcm-nsp.h"
-
-    Clock      Source          Index   ID
-    ---                -----           -----   ---------
-    crystal    N/A             N/A     N/A
-
-    armpll     crystal         N/A     N/A
-
-    genpll     crystal         0       BCM_NSP_GENPLL
-    phy                genpll          1       BCM_NSP_GENPLL_PHY_CLK
-    ethernetclk        genpll          2       BCM_NSP_GENPLL_ENET_SW_CLK
-    usbclk     genpll          3       BCM_NSP_GENPLL_USB_PHY_REF_CLK
-    iprocfast  genpll          4       BCM_NSP_GENPLL_IPROCFAST_CLK
-    sata1      genpll          5       BCM_NSP_GENPLL_SATA1_CLK
-    sata2      genpll          6       BCM_NSP_GENPLL_SATA2_CLK
-
-    lcpll0     crystal         0       BCM_NSP_LCPLL0
-    pcie_phy   lcpll0          1       BCM_NSP_LCPLL0_PCIE_PHY_REF_CLK
-    sdio       lcpll0          2       BCM_NSP_LCPLL0_SDIO_CLK
-    ddr_phy    lcpll0          3       BCM_NSP_LCPLL0_DDR_PHY_CLK
-
-Northstar 2
------------
-PLL and leaf clock compatible strings for Northstar 2 are:
-    "brcm,ns2-genpll-scr"
-    "brcm,ns2-genpll-sw"
-    "brcm,ns2-lcpll-ddr"
-    "brcm,ns2-lcpll-ports"
-
-The following table defines the set of PLL/clock index and ID for Northstar 2.
-These clock IDs are defined in:
-    "include/dt-bindings/clock/bcm-ns2.h"
-
-    Clock      Source          Index   ID
-    ---                -----           -----   ---------
-    crystal    N/A             N/A     N/A
-
-    genpll_scr crystal         0       BCM_NS2_GENPLL_SCR
-    scr                genpll_scr      1       BCM_NS2_GENPLL_SCR_SCR_CLK
-    fs         genpll_scr      2       BCM_NS2_GENPLL_SCR_FS_CLK
-    audio_ref  genpll_scr      3       BCM_NS2_GENPLL_SCR_AUDIO_CLK
-    ch3_unused genpll_scr      4       BCM_NS2_GENPLL_SCR_CH3_UNUSED
-    ch4_unused genpll_scr      5       BCM_NS2_GENPLL_SCR_CH4_UNUSED
-    ch5_unused genpll_scr      6       BCM_NS2_GENPLL_SCR_CH5_UNUSED
-
-    genpll_sw  crystal         0       BCM_NS2_GENPLL_SW
-    rpe                genpll_sw       1       BCM_NS2_GENPLL_SW_RPE_CLK
-    250                genpll_sw       2       BCM_NS2_GENPLL_SW_250_CLK
-    nic                genpll_sw       3       BCM_NS2_GENPLL_SW_NIC_CLK
-    chimp      genpll_sw       4       BCM_NS2_GENPLL_SW_CHIMP_CLK
-    port       genpll_sw       5       BCM_NS2_GENPLL_SW_PORT_CLK
-    sdio       genpll_sw       6       BCM_NS2_GENPLL_SW_SDIO_CLK
-
-    lcpll_ddr  crystal         0       BCM_NS2_LCPLL_DDR
-    pcie_sata_usb lcpll_ddr    1       BCM_NS2_LCPLL_DDR_PCIE_SATA_USB_CLK
-    ddr                lcpll_ddr       2       BCM_NS2_LCPLL_DDR_DDR_CLK
-    ch2_unused lcpll_ddr       3       BCM_NS2_LCPLL_DDR_CH2_UNUSED
-    ch3_unused lcpll_ddr       4       BCM_NS2_LCPLL_DDR_CH3_UNUSED
-    ch4_unused lcpll_ddr       5       BCM_NS2_LCPLL_DDR_CH4_UNUSED
-    ch5_unused lcpll_ddr       6       BCM_NS2_LCPLL_DDR_CH5_UNUSED
-
-    lcpll_ports        crystal         0       BCM_NS2_LCPLL_PORTS
-    wan                lcpll_ports     1       BCM_NS2_LCPLL_PORTS_WAN_CLK
-    rgmii      lcpll_ports     2       BCM_NS2_LCPLL_PORTS_RGMII_CLK
-    ch2_unused lcpll_ports     3       BCM_NS2_LCPLL_PORTS_CH2_UNUSED
-    ch3_unused lcpll_ports     4       BCM_NS2_LCPLL_PORTS_CH3_UNUSED
-    ch4_unused lcpll_ports     5       BCM_NS2_LCPLL_PORTS_CH4_UNUSED
-    ch5_unused lcpll_ports     6       BCM_NS2_LCPLL_PORTS_CH5_UNUSED
-
-BCM63138
---------
-PLL and leaf clock compatible strings for BCM63138 are:
-    "brcm,bcm63138-armpll"
-
-Stingray
------------
-PLL and leaf clock compatible strings for Stingray are:
-    "brcm,sr-genpll0"
-    "brcm,sr-genpll1"
-    "brcm,sr-genpll2"
-    "brcm,sr-genpll3"
-    "brcm,sr-genpll4"
-    "brcm,sr-genpll5"
-    "brcm,sr-genpll6"
-
-    "brcm,sr-lcpll0"
-    "brcm,sr-lcpll1"
-    "brcm,sr-lcpll-pcie"
-
-
-The following table defines the set of PLL/clock index and ID for Stingray.
-These clock IDs are defined in:
-    "include/dt-bindings/clock/bcm-sr.h"
-
-    Clock              Source          Index   ID
-    ---                        -----           -----   ---------
-    crystal            N/A             N/A     N/A
-    crmu_ref25m                crystal         N/A     N/A
-
-    genpll0            crystal         0       BCM_SR_GENPLL0
-    clk_125m           genpll0         1       BCM_SR_GENPLL0_125M_CLK
-    clk_scr            genpll0         2       BCM_SR_GENPLL0_SCR_CLK
-    clk_250            genpll0         3       BCM_SR_GENPLL0_250M_CLK
-    clk_pcie_axi       genpll0         4       BCM_SR_GENPLL0_PCIE_AXI_CLK
-    clk_paxc_axi_x2    genpll0         5       BCM_SR_GENPLL0_PAXC_AXI_X2_CLK
-    clk_paxc_axi       genpll0         6       BCM_SR_GENPLL0_PAXC_AXI_CLK
-
-    genpll1            crystal         0       BCM_SR_GENPLL1
-    clk_pcie_tl                genpll1         1       BCM_SR_GENPLL1_PCIE_TL_CLK
-    clk_mhb_apb                genpll1         2       BCM_SR_GENPLL1_MHB_APB_CLK
-
-    genpll2            crystal         0       BCM_SR_GENPLL2
-    clk_nic            genpll2         1       BCM_SR_GENPLL2_NIC_CLK
-    clk_ts_500_ref     genpll2         2       BCM_SR_GENPLL2_TS_500_REF_CLK
-    clk_125_nitro      genpll2         3       BCM_SR_GENPLL2_125_NITRO_CLK
-    clk_chimp          genpll2         4       BCM_SR_GENPLL2_CHIMP_CLK
-    clk_nic_flash      genpll2         5       BCM_SR_GENPLL2_NIC_FLASH_CLK
-    clk_fs             genpll2         6       BCM_SR_GENPLL2_FS_CLK
-
-    genpll3            crystal         0       BCM_SR_GENPLL3
-    clk_hsls           genpll3         1       BCM_SR_GENPLL3_HSLS_CLK
-    clk_sdio           genpll3         2       BCM_SR_GENPLL3_SDIO_CLK
-
-    genpll4            crystal         0       BCM_SR_GENPLL4
-    clk_ccn            genpll4         1       BCM_SR_GENPLL4_CCN_CLK
-    clk_tpiu_pll       genpll4         2       BCM_SR_GENPLL4_TPIU_PLL_CLK
-    clk_noc            genpll4         3       BCM_SR_GENPLL4_NOC_CLK
-    clk_chclk_fs4      genpll4         4       BCM_SR_GENPLL4_CHCLK_FS4_CLK
-    clk_bridge_fscpu   genpll4         5       BCM_SR_GENPLL4_BRIDGE_FSCPU_CLK
-
-    genpll5            crystal         0       BCM_SR_GENPLL5
-    clk_fs4_hf         genpll5         1       BCM_SR_GENPLL5_FS4_HF_CLK
-    clk_crypto_ae      genpll5         2       BCM_SR_GENPLL5_CRYPTO_AE_CLK
-    clk_raid_ae                genpll5         3       BCM_SR_GENPLL5_RAID_AE_CLK
-
-    genpll6            crystal         0       BCM_SR_GENPLL6
-    clk_48_usb         genpll6         1       BCM_SR_GENPLL6_48_USB_CLK
-
-    lcpll0             crystal         0       BCM_SR_LCPLL0
-    clk_sata_refp      lcpll0          1       BCM_SR_LCPLL0_SATA_REFP_CLK
-    clk_sata_refn      lcpll0          2       BCM_SR_LCPLL0_SATA_REFN_CLK
-    clk_sata_350       lcpll0          3       BCM_SR_LCPLL0_SATA_350_CLK
-    clk_sata_500       lcpll0          4       BCM_SR_LCPLL0_SATA_500_CLK
-
-    lcpll1             crystal         0       BCM_SR_LCPLL1
-    clk_wan            lcpll1          1       BCM_SR_LCPLL1_WAN_CLK
-    clk_usb_ref                lcpll1          2       BCM_SR_LCPLL1_USB_REF_CLK
-    clk_crmu_ts                lcpll1          3       BCM_SR_LCPLL1_CRMU_TS_CLK
-
-    lcpll_pcie         crystal         0       BCM_SR_LCPLL_PCIE
-    clk_pcie_phy_ref   lcpll1          1       BCM_SR_LCPLL_PCIE_PHY_REF_CLK
diff --git a/Documentation/devicetree/bindings/clock/brcm,iproc-clocks.yaml b/Documentation/devicetree/bindings/clock/brcm,iproc-clocks.yaml
new file mode 100644 (file)
index 0000000..8dc7b40
--- /dev/null
@@ -0,0 +1,395 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/brcm,iproc-clocks.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Broadcom iProc Family Clocks
+
+maintainers:
+  - Ray Jui <rjui@broadcom.com>
+  - Scott Branden <sbranden@broadcom.com>
+
+description: |
+  The iProc clock controller manages clocks that are common to the iProc family.
+  An SoC from the iProc family may have several PLLs, e.g., ARMPLL, GENPLL,
+  LCPLL0, MIPIPLL, and etc., all derived from an onboard crystal. Each PLL
+  comprises of several leaf clocks
+
+  ASIU clocks are a special case. These clocks are derived directly from the
+  reference clock of the onboard crystal.
+
+properties:
+  compatible:
+    enum:
+      - brcm,bcm63138-armpll
+      - brcm,cygnus-armpll
+      - brcm,cygnus-genpll
+      - brcm,cygnus-lcpll0
+      - brcm,cygnus-mipipll
+      - brcm,cygnus-asiu-clk
+      - brcm,cygnus-audiopll
+      - brcm,hr2-armpll
+      - brcm,nsp-armpll
+      - brcm,nsp-genpll
+      - brcm,nsp-lcpll0
+      - brcm,ns2-genpll-scr
+      - brcm,ns2-genpll-sw
+      - brcm,ns2-lcpll-ddr
+      - brcm,ns2-lcpll-ports
+      - brcm,sr-genpll0
+      - brcm,sr-genpll1
+      - brcm,sr-genpll2
+      - brcm,sr-genpll3
+      - brcm,sr-genpll4
+      - brcm,sr-genpll5
+      - brcm,sr-genpll6
+      - brcm,sr-lcpll0
+      - brcm,sr-lcpll1
+      - brcm,sr-lcpll-pcie
+
+  reg:
+    minItems: 1
+    maxItems: 3
+    items:
+      - description: base register
+      - description: power register
+      - description: ASIU or split status register
+
+  clocks:
+    description: The input parent clock phandle for the PLL / ASIU clock. For
+      most iProc PLLs, this is an onboard crystal with a fixed rate.
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+  clock-output-names:
+    minItems: 1
+    maxItems: 45
+
+allOf:
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - brcm,cygnus-armpll
+              - brcm,cygnus-genpll
+              - brcm,cygnus-lcpll0
+              - brcm,cygnus-mipipll
+              - brcm,cygnus-asiu-clk
+              - brcm,cygnus-audiopll
+    then:
+      properties:
+        clock-output-names:
+          description: |
+            The following table defines the set of PLL/clock index and ID for Cygnus.
+            These clock IDs are defined in:
+                "include/dt-bindings/clock/bcm-cygnus.h"
+
+            Clock              Source (Parent) Index   ID
+            -----      --------------- -----   --
+            crystal    N/A             N/A     N/A
+
+            armpll     crystal         N/A     N/A
+
+            keypad     crystal (ASIU)  0       BCM_CYGNUS_ASIU_KEYPAD_CLK
+            adc/tsc    crystal (ASIU)  1       BCM_CYGNUS_ASIU_ADC_CLK
+            pwm        crystal (ASIU)          2       BCM_CYGNUS_ASIU_PWM_CLK
+
+            genpll     crystal         0       BCM_CYGNUS_GENPLL
+            axi21      genpll          1       BCM_CYGNUS_GENPLL_AXI21_CLK
+            250mhz     genpll          2       BCM_CYGNUS_GENPLL_250MHZ_CLK
+            ihost_sys  genpll          3       BCM_CYGNUS_GENPLL_IHOST_SYS_CLK
+            enet_sw    genpll          4       BCM_CYGNUS_GENPLL_ENET_SW_CLK
+            audio_125  genpll          5       BCM_CYGNUS_GENPLL_AUDIO_125_CLK
+            can                genpll          6       BCM_CYGNUS_GENPLL_CAN_CLK
+
+            lcpll0     crystal         0       BCM_CYGNUS_LCPLL0
+            pcie_phy   lcpll0          1       BCM_CYGNUS_LCPLL0_PCIE_PHY_REF_CLK
+            ddr_phy    lcpll0          2       BCM_CYGNUS_LCPLL0_DDR_PHY_CLK
+            sdio       lcpll0          3       BCM_CYGNUS_LCPLL0_SDIO_CLK
+            usb_phy    lcpll0          4       BCM_CYGNUS_LCPLL0_USB_PHY_REF_CLK
+            smart_card lcpll0          5       BCM_CYGNUS_LCPLL0_SMART_CARD_CLK
+            ch5_unused lcpll0          6       BCM_CYGNUS_LCPLL0_CH5_UNUSED
+
+            mipipll    crystal         0       BCM_CYGNUS_MIPIPLL
+            ch0_unused mipipll         1       BCM_CYGNUS_MIPIPLL_CH0_UNUSED
+            ch1_lcd    mipipll         2       BCM_CYGNUS_MIPIPLL_CH1_LCD
+            ch2_v3d    mipipll         3       BCM_CYGNUS_MIPIPLL_CH2_V3D
+            ch3_unused mipipll         4       BCM_CYGNUS_MIPIPLL_CH3_UNUSED
+            ch4_unused mipipll         5       BCM_CYGNUS_MIPIPLL_CH4_UNUSED
+            ch5_unused mipipll         6       BCM_CYGNUS_MIPIPLL_CH5_UNUSED
+
+            audiopll   crystal         0       BCM_CYGNUS_AUDIOPLL
+            ch0_audio  audiopll        1       BCM_CYGNUS_AUDIOPLL_CH0
+            ch1_audio  audiopll        2       BCM_CYGNUS_AUDIOPLL_CH1
+            ch2_audio  audiopll        3       BCM_CYGNUS_AUDIOPLL_CH2
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - brcm,hr2-armpll
+    then:
+      properties:
+        clock-output-names:
+          description: |
+            The following table defines the set of PLL/clock for Hurricane 2:
+
+            Clock      Source          Index   ID
+            -----      ------          -----   --
+            crystal    N/A             N/A     N/A
+
+            armpll     crystal         N/A     N/A
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - brcm,nsp-armpll
+              - brcm,nsp-genpll
+              - brcm,nsp-lcpll0
+    then:
+      properties:
+        clock-output-names:
+          description: |
+            The following table defines the set of PLL/clock index and ID for Northstar and
+            Northstar Plus.  These clock IDs are defined in:
+                "include/dt-bindings/clock/bcm-nsp.h"
+
+            Clock      Source          Index   ID
+            -----      ------          -----   --
+            crystal    N/A             N/A     N/A
+
+            armpll     crystal         N/A     N/A
+
+            genpll     crystal         0       BCM_NSP_GENPLL
+            phy                genpll          1       BCM_NSP_GENPLL_PHY_CLK
+            ethernetclk        genpll          2       BCM_NSP_GENPLL_ENET_SW_CLK
+            usbclk     genpll          3       BCM_NSP_GENPLL_USB_PHY_REF_CLK
+            iprocfast  genpll          4       BCM_NSP_GENPLL_IPROCFAST_CLK
+            sata1      genpll          5       BCM_NSP_GENPLL_SATA1_CLK
+            sata2      genpll          6       BCM_NSP_GENPLL_SATA2_CLK
+
+            lcpll0     crystal         0       BCM_NSP_LCPLL0
+            pcie_phy   lcpll0          1       BCM_NSP_LCPLL0_PCIE_PHY_REF_CLK
+            sdio       lcpll0          2       BCM_NSP_LCPLL0_SDIO_CLK
+            ddr_phy    lcpll0          3       BCM_NSP_LCPLL0_DDR_PHY_CLK
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - brcm,ns2-genpll-scr
+              - brcm,ns2-genpll-sw
+              - brcm,ns2-lcpll-ddr
+              - brcm,ns2-lcpll-ports
+    then:
+      properties:
+        clock-output-names:
+          description: |
+            The following table defines the set of PLL/clock index and ID for Northstar 2.
+            These clock IDs are defined in:
+                "include/dt-bindings/clock/bcm-ns2.h"
+
+            Clock      Source          Index   ID
+            -----      ------          -----   --
+            crystal    N/A             N/A     N/A
+
+            genpll_scr crystal         0       BCM_NS2_GENPLL_SCR
+            scr                genpll_scr      1       BCM_NS2_GENPLL_SCR_SCR_CLK
+            fs         genpll_scr      2       BCM_NS2_GENPLL_SCR_FS_CLK
+            audio_ref  genpll_scr      3       BCM_NS2_GENPLL_SCR_AUDIO_CLK
+            ch3_unused genpll_scr      4       BCM_NS2_GENPLL_SCR_CH3_UNUSED
+            ch4_unused genpll_scr      5       BCM_NS2_GENPLL_SCR_CH4_UNUSED
+            ch5_unused genpll_scr      6       BCM_NS2_GENPLL_SCR_CH5_UNUSED
+
+            genpll_sw  crystal         0       BCM_NS2_GENPLL_SW
+            rpe                genpll_sw       1       BCM_NS2_GENPLL_SW_RPE_CLK
+            250                genpll_sw       2       BCM_NS2_GENPLL_SW_250_CLK
+            nic                genpll_sw       3       BCM_NS2_GENPLL_SW_NIC_CLK
+            chimp      genpll_sw       4       BCM_NS2_GENPLL_SW_CHIMP_CLK
+            port       genpll_sw       5       BCM_NS2_GENPLL_SW_PORT_CLK
+            sdio       genpll_sw       6       BCM_NS2_GENPLL_SW_SDIO_CLK
+
+            lcpll_ddr  crystal         0       BCM_NS2_LCPLL_DDR
+            pcie_sata_usb lcpll_ddr    1       BCM_NS2_LCPLL_DDR_PCIE_SATA_USB_CLK
+            ddr                lcpll_ddr       2       BCM_NS2_LCPLL_DDR_DDR_CLK
+            ch2_unused lcpll_ddr       3       BCM_NS2_LCPLL_DDR_CH2_UNUSED
+            ch3_unused lcpll_ddr       4       BCM_NS2_LCPLL_DDR_CH3_UNUSED
+            ch4_unused lcpll_ddr       5       BCM_NS2_LCPLL_DDR_CH4_UNUSED
+            ch5_unused lcpll_ddr       6       BCM_NS2_LCPLL_DDR_CH5_UNUSED
+
+            lcpll_ports        crystal         0       BCM_NS2_LCPLL_PORTS
+            wan                lcpll_ports     1       BCM_NS2_LCPLL_PORTS_WAN_CLK
+            rgmii      lcpll_ports     2       BCM_NS2_LCPLL_PORTS_RGMII_CLK
+            ch2_unused lcpll_ports     3       BCM_NS2_LCPLL_PORTS_CH2_UNUSED
+            ch3_unused lcpll_ports     4       BCM_NS2_LCPLL_PORTS_CH3_UNUSED
+            ch4_unused lcpll_ports     5       BCM_NS2_LCPLL_PORTS_CH4_UNUSED
+            ch5_unused lcpll_ports     6       BCM_NS2_LCPLL_PORTS_CH5_UNUSED
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - brcm,sr-genpll0
+              - brcm,sr-genpll1
+              - brcm,sr-genpll2
+              - brcm,sr-genpll3
+              - brcm,sr-genpll4
+              - brcm,sr-genpll5
+              - brcm,sr-genpll6
+              - brcm,sr-lcpll0
+              - brcm,sr-lcpll1
+              - brcm,sr-lcpll-pcie
+    then:
+      properties:
+        clock-output-names:
+          description: |
+            The following table defines the set of PLL/clock index and ID for Stingray.
+            These clock IDs are defined in:
+                "include/dt-bindings/clock/bcm-sr.h"
+
+            Clock              Source          Index   ID
+            -----              ------          -----   --
+            crystal            N/A             N/A     N/A
+            crmu_ref25m                crystal         N/A     N/A
+
+            genpll0            crystal         0       BCM_SR_GENPLL0
+            clk_125m           genpll0         1       BCM_SR_GENPLL0_125M_CLK
+            clk_scr            genpll0         2       BCM_SR_GENPLL0_SCR_CLK
+            clk_250            genpll0         3       BCM_SR_GENPLL0_250M_CLK
+            clk_pcie_axi       genpll0         4       BCM_SR_GENPLL0_PCIE_AXI_CLK
+            clk_paxc_axi_x2    genpll0         5       BCM_SR_GENPLL0_PAXC_AXI_X2_CLK
+            clk_paxc_axi       genpll0         6       BCM_SR_GENPLL0_PAXC_AXI_CLK
+
+            genpll1            crystal         0       BCM_SR_GENPLL1
+            clk_pcie_tl                genpll1         1       BCM_SR_GENPLL1_PCIE_TL_CLK
+            clk_mhb_apb                genpll1         2       BCM_SR_GENPLL1_MHB_APB_CLK
+
+            genpll2            crystal         0       BCM_SR_GENPLL2
+            clk_nic            genpll2         1       BCM_SR_GENPLL2_NIC_CLK
+            clk_ts_500_ref     genpll2         2       BCM_SR_GENPLL2_TS_500_REF_CLK
+            clk_125_nitro      genpll2         3       BCM_SR_GENPLL2_125_NITRO_CLK
+            clk_chimp          genpll2         4       BCM_SR_GENPLL2_CHIMP_CLK
+            clk_nic_flash      genpll2         5       BCM_SR_GENPLL2_NIC_FLASH_CLK
+            clk_fs             genpll2         6       BCM_SR_GENPLL2_FS_CLK
+
+            genpll3            crystal         0       BCM_SR_GENPLL3
+            clk_hsls           genpll3         1       BCM_SR_GENPLL3_HSLS_CLK
+            clk_sdio           genpll3         2       BCM_SR_GENPLL3_SDIO_CLK
+
+            genpll4            crystal         0       BCM_SR_GENPLL4
+            clk_ccn            genpll4         1       BCM_SR_GENPLL4_CCN_CLK
+            clk_tpiu_pll       genpll4         2       BCM_SR_GENPLL4_TPIU_PLL_CLK
+            clk_noc            genpll4         3       BCM_SR_GENPLL4_NOC_CLK
+            clk_chclk_fs4      genpll4         4       BCM_SR_GENPLL4_CHCLK_FS4_CLK
+            clk_bridge_fscpu   genpll4         5       BCM_SR_GENPLL4_BRIDGE_FSCPU_CLK
+
+            genpll5            crystal         0       BCM_SR_GENPLL5
+            clk_fs4_hf         genpll5         1       BCM_SR_GENPLL5_FS4_HF_CLK
+            clk_crypto_ae      genpll5         2       BCM_SR_GENPLL5_CRYPTO_AE_CLK
+            clk_raid_ae                genpll5         3       BCM_SR_GENPLL5_RAID_AE_CLK
+
+            genpll6            crystal         0       BCM_SR_GENPLL6
+            clk_48_usb         genpll6         1       BCM_SR_GENPLL6_48_USB_CLK
+
+            lcpll0             crystal         0       BCM_SR_LCPLL0
+            clk_sata_refp      lcpll0          1       BCM_SR_LCPLL0_SATA_REFP_CLK
+            clk_sata_refn      lcpll0          2       BCM_SR_LCPLL0_SATA_REFN_CLK
+            clk_sata_350       lcpll0          3       BCM_SR_LCPLL0_SATA_350_CLK
+            clk_sata_500       lcpll0          4       BCM_SR_LCPLL0_SATA_500_CLK
+
+            lcpll1             crystal         0       BCM_SR_LCPLL1
+            clk_wan            lcpll1          1       BCM_SR_LCPLL1_WAN_CLK
+            clk_usb_ref                lcpll1          2       BCM_SR_LCPLL1_USB_REF_CLK
+            clk_crmu_ts                lcpll1          3       BCM_SR_LCPLL1_CRMU_TS_CLK
+
+            lcpll_pcie         crystal         0       BCM_SR_LCPLL_PCIE
+            clk_pcie_phy_ref   lcpll1          1       BCM_SR_LCPLL_PCIE_PHY_REF_CLK
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: brcm,cygnus-genpll
+    then:
+      properties:
+        clock-output-names:
+          items:
+            - const: genpll
+            - const: axi21
+            - const: 250mhz
+            - const: ihost_sys
+            - const: enet_sw
+            - const: audio_125
+            - const: can
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: brcm,nsp-lcpll0
+    then:
+      properties:
+        clock-output-names:
+          items:
+            - const: lcpll0
+            - const: pcie_phy
+            - const: sdio
+            - const: ddr_phy
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: brcm,nsp-genpll
+    then:
+      properties:
+        clock-output-names:
+          items:
+            - const: genpll
+            - const: phy
+            - const: ethernetclk
+            - const: usbclk
+            - const: iprocfast
+            - const: sata1
+            - const: sata2
+
+required:
+  - reg
+  - clocks
+  - '#clock-cells'
+  - clock-output-names
+
+additionalProperties: false
+
+examples:
+  - |
+    osc1: oscillator {
+        #clock-cells = <0>;
+        compatible = "fixed-clock";
+        clock-frequency = <25000000>;
+    };
+
+    genpll@301d000 {
+        #clock-cells = <1>;
+        compatible = "brcm,cygnus-genpll";
+        reg = <0x301d000 0x2c>, <0x301c020 0x4>;
+        clocks = <&os1c>;
+        clock-output-names = "genpll", "axi21", "250mhz", "ihost_sys",
+                     "enet_sw", "audio_125", "can";
+    };
+  - |
+    osc2: oscillator {
+        #clock-cells = <0>;
+        compatible = "fixed-clock";
+        clock-frequency = <25000000>;
+    };
+
+    asiu_clks@301d048 {
+        #clock-cells = <1>;
+        compatible = "brcm,cygnus-asiu-clk";
+        reg = <0x301d048 0xc>, <0x180aa024 0x4>;
+        clocks = <&osc2>;
+        clock-output-names = "keypad", "adc/touch", "pwm";
+    };
index c268deb..28675b0 100644 (file)
@@ -60,7 +60,6 @@ properties:
     maxItems: 2
 
   idt,xtal-load-femtofarads:
-    $ref: /schemas/types.yaml#/definitions/uint32
     minimum: 9000
     maximum: 22760
     description: Optional load capacitor for XTAL1 and XTAL2
@@ -84,7 +83,6 @@ patternProperties:
         enum: [ 1800000, 2500000, 3300000 ]
       idt,slew-percent:
         description: The Slew rate control for CMOS single-ended.
-        $ref: /schemas/types.yaml#/definitions/uint32
         enum: [ 80, 85, 90, 100 ]
 
 required:
diff --git a/Documentation/devicetree/bindings/clock/nvidia,tegra114-car.txt b/Documentation/devicetree/bindings/clock/nvidia,tegra114-car.txt
deleted file mode 100644 (file)
index 9acea9d..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-NVIDIA Tegra114 Clock And Reset Controller
-
-This binding uses the common clock binding:
-Documentation/devicetree/bindings/clock/clock-bindings.txt
-
-The CAR (Clock And Reset) Controller on Tegra is the HW module responsible
-for muxing and gating Tegra's clocks, and setting their rates.
-
-Required properties :
-- compatible : Should be "nvidia,tegra114-car"
-- reg : Should contain CAR registers location and length
-- clocks : Should contain phandle and clock specifiers for two clocks:
-  the 32 KHz "32k_in", and the board-specific oscillator "osc".
-- #clock-cells : Should be 1.
-  In clock consumers, this cell represents the clock ID exposed by the
-  CAR. The assignments may be found in header file
-  <dt-bindings/clock/tegra114-car.h>.
-- #reset-cells : Should be 1.
-  In clock consumers, this cell represents the bit number in the CAR's
-  array of CLK_RST_CONTROLLER_RST_DEVICES_* registers.
-
-Example SoC include file:
-
-/ {
-       tegra_car: clock {
-               compatible = "nvidia,tegra114-car";
-               reg = <0x60006000 0x1000>;
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-       usb@c5004000 {
-               clocks = <&tegra_car TEGRA114_CLK_USB2>;
-       };
-};
-
-Example board file:
-
-/ {
-       clocks {
-               compatible = "simple-bus";
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               osc: clock@0 {
-                       compatible = "fixed-clock";
-                       reg = <0>;
-                       #clock-cells = <0>;
-                       clock-frequency = <12000000>;
-               };
-
-               clk_32k: clock@1 {
-                       compatible = "fixed-clock";
-                       reg = <1>;
-                       #clock-cells = <0>;
-                       clock-frequency = <32768>;
-               };
-       };
-
-       &tegra_car {
-               clocks = <&clk_32k> <&osc>;
-       };
-};
diff --git a/Documentation/devicetree/bindings/clock/nvidia,tegra124-car.txt b/Documentation/devicetree/bindings/clock/nvidia,tegra124-car.txt
deleted file mode 100644 (file)
index 7f02fb4..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-NVIDIA Tegra124 and Tegra132 Clock And Reset Controller
-
-This binding uses the common clock binding:
-Documentation/devicetree/bindings/clock/clock-bindings.txt
-
-The CAR (Clock And Reset) Controller on Tegra is the HW module responsible
-for muxing and gating Tegra's clocks, and setting their rates.
-
-Required properties :
-- compatible : Should be "nvidia,tegra124-car" or "nvidia,tegra132-car"
-- reg : Should contain CAR registers location and length
-- clocks : Should contain phandle and clock specifiers for two clocks:
-  the 32 KHz "32k_in", and the board-specific oscillator "osc".
-- #clock-cells : Should be 1.
-  In clock consumers, this cell represents the clock ID exposed by the
-  CAR. The assignments may be found in the header files
-  <dt-bindings/clock/tegra124-car-common.h> (which covers IDs common
-  to Tegra124 and Tegra132) and <dt-bindings/clock/tegra124-car.h>
-  (for Tegra124-specific clocks).
-- #reset-cells : Should be 1.
-  In clock consumers, this cell represents the bit number in the CAR's
-  array of CLK_RST_CONTROLLER_RST_DEVICES_* registers.
-- nvidia,external-memory-controller : phandle of the EMC driver.
-
-The node should contain a "emc-timings" subnode for each supported RAM type (see
-field RAM_CODE in register PMC_STRAPPING_OPT_A).
-
-Required properties for "emc-timings" nodes :
-- nvidia,ram-code : Should contain the value of RAM_CODE this timing set
-  is used for.
-
-Each "emc-timings" node should contain a "timing" subnode for every supported
-EMC clock rate.
-
-Required properties for "timing" nodes :
-- clock-frequency : Should contain the memory clock rate to which this timing
-relates.
-- nvidia,parent-clock-frequency : Should contain the rate at which the current
-parent of the EMC clock should be running at this timing.
-- clocks : Must contain an entry for each entry in clock-names.
-  See ../clocks/clock-bindings.txt for details.
-- clock-names : Must include the following entries:
-  - emc-parent : the clock that should be the parent of the EMC clock at this
-timing.
-
-Example SoC include file:
-
-/ {
-       tegra_car: clock@60006000 {
-               compatible = "nvidia,tegra124-car";
-               reg = <0x60006000 0x1000>;
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-               nvidia,external-memory-controller = <&emc>;
-       };
-
-       usb@c5004000 {
-               clocks = <&tegra_car TEGRA124_CLK_USB2>;
-       };
-};
-
-Example board file:
-
-/ {
-       clocks {
-               compatible = "simple-bus";
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               osc: clock@0 {
-                       compatible = "fixed-clock";
-                       reg = <0>;
-                       #clock-cells = <0>;
-                       clock-frequency = <112400000>;
-               };
-
-               clk_32k: clock@1 {
-                       compatible = "fixed-clock";
-                       reg = <1>;
-                       #clock-cells = <0>;
-                       clock-frequency = <32768>;
-               };
-       };
-
-       &tegra_car {
-               clocks = <&clk_32k> <&osc>;
-       };
-
-       clock@60006000 {
-               emc-timings-3 {
-                       nvidia,ram-code = <3>;
-
-                       timing-12750000 {
-                               clock-frequency = <12750000>;
-                               nvidia,parent-clock-frequency = <408000000>;
-                               clocks = <&tegra_car TEGRA124_CLK_PLL_P>;
-                               clock-names = "emc-parent";
-                       };
-                       timing-20400000 {
-                               clock-frequency = <20400000>;
-                               nvidia,parent-clock-frequency = <408000000>;
-                               clocks = <&tegra_car TEGRA124_CLK_PLL_P>;
-                               clock-names = "emc-parent";
-                       };
-               };
-       };
-};
diff --git a/Documentation/devicetree/bindings/clock/nvidia,tegra124-car.yaml b/Documentation/devicetree/bindings/clock/nvidia,tegra124-car.yaml
new file mode 100644 (file)
index 0000000..ec7ab14
--- /dev/null
@@ -0,0 +1,115 @@
+# SPDX-License-Identifier: (GPL-2.0+ OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/nvidia,tegra124-car.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: NVIDIA Tegra Clock and Reset Controller
+
+maintainers:
+  - Jon Hunter <jonathanh@nvidia.com>
+  - Thierry Reding <thierry.reding@gmail.com>
+
+description: |
+  The Clock and Reset (CAR) is the HW module responsible for muxing and gating
+  Tegra's clocks, and setting their rates. It comprises CLKGEN and RSTGEN units.
+
+  CLKGEN provides the registers to program the PLLs. It controls most of
+  the clock source programming and most of the clock dividers.
+
+  CLKGEN input signals include the external clock for the reference frequency
+  (12 MHz, 26 MHz) and the external clock for the Real Time Clock (32.768 KHz).
+
+  Outputs from CLKGEN are inputs clock of the h/w blocks in the Tegra system.
+
+  RSTGEN provides the registers needed to control resetting of each block in
+  the Tegra system.
+
+properties:
+  compatible:
+    const: nvidia,tegra124-car
+
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+  "#reset-cells":
+    const: 1
+
+  nvidia,external-memory-controller:
+    $ref: /schemas/types.yaml#/definitions/phandle
+    description:
+      phandle of the external memory controller node
+
+patternProperties:
+  "^emc-timings-[0-9]+$":
+    type: object
+    properties:
+      nvidia,ram-code:
+        $ref: /schemas/types.yaml#/definitions/uint32
+        description:
+          value of the RAM_CODE field in the PMC_STRAPPING_OPT_A register that
+          this timing set is used for
+
+    patternProperties:
+      "^timing-[0-9]+$":
+        type: object
+        properties:
+          clock-frequency:
+            description:
+              external memory clock rate in Hz
+            minimum: 1000000
+            maximum: 1000000000
+
+          nvidia,parent-clock-frequency:
+            $ref: /schemas/types.yaml#/definitions/uint32
+            description:
+              rate of parent clock in Hz
+            minimum: 1000000
+            maximum: 1000000000
+
+          clocks:
+            items:
+              - description: parent clock of EMC
+
+          clock-names:
+            items:
+              - const: emc-parent
+
+        required:
+          - clock-frequency
+          - nvidia,parent-clock-frequency
+          - clocks
+          - clock-names
+
+        additionalProperties: false
+
+    additionalProperties: false
+
+required:
+  - compatible
+  - reg
+  - '#clock-cells'
+  - "#reset-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/tegra124-car.h>
+
+    car: clock-controller@60006000 {
+        compatible = "nvidia,tegra124-car";
+        reg = <0x60006000 0x1000>;
+        #clock-cells = <1>;
+        #reset-cells = <1>;
+    };
+
+    usb-controller@c5004000 {
+        compatible = "nvidia,tegra20-ehci";
+        reg = <0xc5004000 0x4000>;
+        clocks = <&car TEGRA124_CLK_USB2>;
+        resets = <&car TEGRA124_CLK_USB2>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt b/Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt
deleted file mode 100644 (file)
index 6c5901b..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-NVIDIA Tegra20 Clock And Reset Controller
-
-This binding uses the common clock binding:
-Documentation/devicetree/bindings/clock/clock-bindings.txt
-
-The CAR (Clock And Reset) Controller on Tegra is the HW module responsible
-for muxing and gating Tegra's clocks, and setting their rates.
-
-Required properties :
-- compatible : Should be "nvidia,tegra20-car"
-- reg : Should contain CAR registers location and length
-- clocks : Should contain phandle and clock specifiers for two clocks:
-  the 32 KHz "32k_in", and the board-specific oscillator "osc".
-- #clock-cells : Should be 1.
-  In clock consumers, this cell represents the clock ID exposed by the
-  CAR. The assignments may be found in header file
-  <dt-bindings/clock/tegra20-car.h>.
-- #reset-cells : Should be 1.
-  In clock consumers, this cell represents the bit number in the CAR's
-  array of CLK_RST_CONTROLLER_RST_DEVICES_* registers.
-
-Example SoC include file:
-
-/ {
-       tegra_car: clock {
-               compatible = "nvidia,tegra20-car";
-               reg = <0x60006000 0x1000>;
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-       usb@c5004000 {
-               clocks = <&tegra_car TEGRA20_CLK_USB2>;
-       };
-};
-
-Example board file:
-
-/ {
-       clocks {
-               compatible = "simple-bus";
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               osc: clock@0 {
-                       compatible = "fixed-clock";
-                       reg = <0>;
-                       #clock-cells = <0>;
-                       clock-frequency = <12000000>;
-               };
-
-               clk_32k: clock@1 {
-                       compatible = "fixed-clock";
-                       reg = <1>;
-                       #clock-cells = <0>;
-                       clock-frequency = <32768>;
-               };
-       };
-
-       &tegra_car {
-               clocks = <&clk_32k> <&osc>;
-       };
-};
diff --git a/Documentation/devicetree/bindings/clock/nvidia,tegra20-car.yaml b/Documentation/devicetree/bindings/clock/nvidia,tegra20-car.yaml
new file mode 100644 (file)
index 0000000..459d2a5
--- /dev/null
@@ -0,0 +1,69 @@
+# SPDX-License-Identifier: (GPL-2.0+ OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/nvidia,tegra20-car.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: NVIDIA Tegra Clock and Reset Controller
+
+maintainers:
+  - Jon Hunter <jonathanh@nvidia.com>
+  - Thierry Reding <thierry.reding@gmail.com>
+
+description: |
+  The Clock and Reset (CAR) is the HW module responsible for muxing and gating
+  Tegra's clocks, and setting their rates. It comprises CLKGEN and RSTGEN units.
+
+  CLKGEN provides the registers to program the PLLs. It controls most of
+  the clock source programming and most of the clock dividers.
+
+  CLKGEN input signals include the external clock for the reference frequency
+  (12 MHz, 26 MHz) and the external clock for the Real Time Clock (32.768 KHz).
+
+  Outputs from CLKGEN are inputs clock of the h/w blocks in the Tegra system.
+
+  RSTGEN provides the registers needed to control resetting of each block in
+  the Tegra system.
+
+properties:
+  compatible:
+    enum:
+      - nvidia,tegra20-car
+      - nvidia,tegra30-car
+      - nvidia,tegra114-car
+      - nvidia,tegra210-car
+
+  reg:
+    maxItems: 1
+
+  '#clock-cells':
+    const: 1
+
+  "#reset-cells":
+    const: 1
+
+required:
+  - compatible
+  - reg
+  - '#clock-cells'
+  - "#reset-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/tegra20-car.h>
+
+    car: clock-controller@60006000 {
+        compatible = "nvidia,tegra20-car";
+        reg = <0x60006000 0x1000>;
+        #clock-cells = <1>;
+        #reset-cells = <1>;
+    };
+
+    usb-controller@c5004000 {
+        compatible = "nvidia,tegra20-ehci";
+        reg = <0xc5004000 0x4000>;
+        clocks = <&car TEGRA20_CLK_USB2>;
+        resets = <&car TEGRA20_CLK_USB2>;
+    };
diff --git a/Documentation/devicetree/bindings/clock/nvidia,tegra210-car.txt b/Documentation/devicetree/bindings/clock/nvidia,tegra210-car.txt
deleted file mode 100644 (file)
index 26f237f..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-NVIDIA Tegra210 Clock And Reset Controller
-
-This binding uses the common clock binding:
-Documentation/devicetree/bindings/clock/clock-bindings.txt
-
-The CAR (Clock And Reset) Controller on Tegra is the HW module responsible
-for muxing and gating Tegra's clocks, and setting their rates.
-
-Required properties :
-- compatible : Should be "nvidia,tegra210-car"
-- reg : Should contain CAR registers location and length
-- clocks : Should contain phandle and clock specifiers for two clocks:
-  the 32 KHz "32k_in".
-- #clock-cells : Should be 1.
-  In clock consumers, this cell represents the clock ID exposed by the
-  CAR. The assignments may be found in header file
-  <dt-bindings/clock/tegra210-car.h>.
-- #reset-cells : Should be 1.
-  In clock consumers, this cell represents the bit number in the CAR's
-  array of CLK_RST_CONTROLLER_RST_DEVICES_* registers.
-
-Example SoC include file:
-
-/ {
-       tegra_car: clock {
-               compatible = "nvidia,tegra210-car";
-               reg = <0x60006000 0x1000>;
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-       usb@c5004000 {
-               clocks = <&tegra_car TEGRA210_CLK_USB2>;
-       };
-};
-
-Example board file:
-
-/ {
-       clocks {
-               compatible = "simple-bus";
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               clk_32k: clock@1 {
-                       compatible = "fixed-clock";
-                       reg = <1>;
-                       #clock-cells = <0>;
-                       clock-frequency = <32768>;
-               };
-       };
-
-       &tegra_car {
-               clocks = <&clk_32k>;
-       };
-};
diff --git a/Documentation/devicetree/bindings/clock/nvidia,tegra30-car.txt b/Documentation/devicetree/bindings/clock/nvidia,tegra30-car.txt
deleted file mode 100644 (file)
index 63618cd..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-NVIDIA Tegra30 Clock And Reset Controller
-
-This binding uses the common clock binding:
-Documentation/devicetree/bindings/clock/clock-bindings.txt
-
-The CAR (Clock And Reset) Controller on Tegra is the HW module responsible
-for muxing and gating Tegra's clocks, and setting their rates.
-
-Required properties :
-- compatible : Should be "nvidia,tegra30-car"
-- reg : Should contain CAR registers location and length
-- clocks : Should contain phandle and clock specifiers for two clocks:
-  the 32 KHz "32k_in", and the board-specific oscillator "osc".
-- #clock-cells : Should be 1.
-  In clock consumers, this cell represents the clock ID exposed by the
-  CAR. The assignments may be found in header file
-  <dt-bindings/clock/tegra30-car.h>.
-- #reset-cells : Should be 1.
-  In clock consumers, this cell represents the bit number in the CAR's
-  array of CLK_RST_CONTROLLER_RST_DEVICES_* registers.
-
-Example SoC include file:
-
-/ {
-       tegra_car: clock {
-               compatible = "nvidia,tegra30-car";
-               reg = <0x60006000 0x1000>;
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-       };
-
-       usb@c5004000 {
-               clocks = <&tegra_car TEGRA30_CLK_USB2>;
-       };
-};
-
-Example board file:
-
-/ {
-       clocks {
-               compatible = "simple-bus";
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               osc: clock@0 {
-                       compatible = "fixed-clock";
-                       reg = <0>;
-                       #clock-cells = <0>;
-                       clock-frequency = <12000000>;
-               };
-
-               clk_32k: clock@1 {
-                       compatible = "fixed-clock";
-                       reg = <1>;
-                       #clock-cells = <0>;
-                       clock-frequency = <32768>;
-               };
-       };
-
-       &tegra_car {
-               clocks = <&clk_32k> <&osc>;
-       };
-};
index 96c914e..2015f50 100644 (file)
@@ -73,7 +73,7 @@ i2c0: i2c@f8034600 {
        pinctrl-0 = <&pinctrl_i2c0>;
        pinctrl-1 = <&pinctrl_i2c0_gpio>;
        sda-gpios = <&pioA 30 GPIO_ACTIVE_HIGH>;
-       scl-gpios = <&pioA 31 GPIO_ACTIVE_HIGH>;
+       scl-gpios = <&pioA 31 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
 
        wm8731: wm8731@1a {
                compatible = "wm8731";
index 6f2398c..1e7894e 100644 (file)
@@ -102,7 +102,6 @@ patternProperties:
 
       st,adc-channel-names:
         description: List of single-ended channel names.
-        $ref: /schemas/types.yaml#/definitions/string-array
 
       st,filter-order:
         description: |
index 74244d2..d41d874 100644 (file)
@@ -38,6 +38,5 @@ properties:
       Duration in seconds which the key should be kept pressed for device to
       reset automatically. Device with key pressed reset feature can specify
       this property.
-    $ref: /schemas/types.yaml#/definitions/uint32
 
 additionalProperties: true
index cb64981..36c9559 100644 (file)
@@ -92,7 +92,6 @@ properties:
       this interconnect to send RPMh commands.
 
   qcom,bcm-voter-names:
-    $ref: /schemas/types.yaml#/definitions/string-array
     description: |
       Names for each of the qcom,bcm-voters specified.
 
index ccebce5..a555d94 100644 (file)
@@ -4,8 +4,8 @@ This controller is present on BCM6318, BCM6328, BCM6362 and BCM63268.
 In these SoCs it's possible to control LEDs both as GPIOs or by hardware.
 However, on some devices there are Serial LEDs (LEDs connected to a 74x164
 controller), which can either be controlled by software (exporting the 74x164
-as spi-gpio. See Documentation/devicetree/bindings/gpio/gpio-74x164.txt), or
-by hardware using this driver.
+as spi-gpio. See Documentation/devicetree/bindings/gpio/fairchild,74hc595.yaml),
+or by hardware using this driver.
 Some of these Serial LEDs are hardware controlled (e.g. ethernet LEDs) and
 exporting the 74x164 as spi-gpio prevents those LEDs to be hardware
 controlled, so the only chance to keep them working is by using this driver.
index da5708e..6e51c6b 100644 (file)
@@ -3,7 +3,7 @@ LEDs connected to Broadcom BCM6358 controller
 This controller is present on BCM6358 and BCM6368.
 In these SoCs there are Serial LEDs (LEDs connected to a 74x164 controller),
 which can either be controlled by software (exporting the 74x164 as spi-gpio.
-See Documentation/devicetree/bindings/gpio/gpio-74x164.txt), or
+See Documentation/devicetree/bindings/gpio/fairchild,74hc595.yaml), or
 by hardware using this driver.
 
 Required properties:
index f1bdaea..ce505a7 100644 (file)
@@ -99,32 +99,26 @@ properties:
       Indicates that the channel acts as primary among the bonded channels.
 
   port:
-    type: object
+    $ref: /schemas/graph.yaml#/properties/port
+    unevaluatedProperties: false
     description:
-      Child port node corresponding to the data input, in accordance with the
-      video interface bindings defined in
-      Documentation/devicetree/bindings/media/video-interfaces.txt.
-      The port node must contain at least one endpoint.
+      Child port node corresponding to the data input. The port node must
+      contain at least one endpoint.
 
     properties:
       endpoint:
-        type: object
+        $ref: /schemas/graph.yaml#/$defs/endpoint-base
+        unevaluatedProperties: false
 
         properties:
-          remote-endpoint:
-            description:
-              A phandle to the remote tuner endpoint subnode in remote node
-              port.
-
           sync-active:
+            $ref: /schemas/types.yaml#/definitions/uint32
             enum: [0, 1]
             description:
               Indicates sync signal polarity, 0/1 for low/high respectively.
               This property maps to SYNCAC bit in the hardware manual. The
               default is 1 (active high).
 
-        additionalProperties: false
-
 required:
   - compatible
   - reg
index 7443490..5fe6d3d 100644 (file)
@@ -105,7 +105,6 @@ properties:
       - description: Whether the IPA clock is enabled (if valid)
 
   qcom,smem-state-names:
-    $ref: /schemas/types.yaml#/definitions/string-array
     description: The names of the state bits used for SMP2P output
     items:
       - const: ipa-clock-enabled-valid
index 27eb606..a1c490f 100644 (file)
@@ -46,17 +46,18 @@ properties:
 
   clocks:
     minItems: 3
-    maxItems: 5
+    maxItems: 6
     items:
       - description: GMAC main clock
       - description: MAC TX clock
       - description: MAC RX clock
       - description: For MPU family, used for power mode
       - description: For MPU family, used for PHY without quartz
+      - description: PTP clock
 
   clock-names:
     minItems: 3
-    maxItems: 5
+    maxItems: 6
     contains:
       enum:
         - stmmaceth
@@ -64,6 +65,7 @@ properties:
         - mac-clk-rx
         - ethstp
         - eth-ck
+        - ptp_ref
 
   st,syscon:
     $ref: "/schemas/types.yaml#/definitions/phandle-array"
index d479ad9..b679170 100644 (file)
@@ -9,7 +9,6 @@ Required properties:
              "mediatek,mt8173-efuse" or "mediatek,efuse": for MT8173
              "mediatek,mt8192-efuse", "mediatek,efuse": for MT8192
              "mediatek,mt8516-efuse", "mediatek,efuse": for MT8516
-             "mediatek,mt8192-efuse", "mediatek,efuse": for MT8192
 - reg: Should contain registers location and length
 
 = Data cells =
index 01dcd14..320a232 100644 (file)
@@ -118,7 +118,7 @@ patternProperties:
         description:
           Specifies the Spread Spectrum Clocking mode used. It can be NO_SSC,
           EXTERNAL_SSC or INTERNAL_SSC.
-          Refer include/dt-bindings/phy/phy-cadence-torrent.h for the constants to be used.
+          Refer include/dt-bindings/phy/phy-cadence.h for the constants to be used.
         $ref: /schemas/types.yaml#/definitions/uint32
         enum: [0, 1, 2]
         default: 0
index 8c60e69..5ffd0f5 100644 (file)
@@ -42,22 +42,22 @@ Required properties (child nodes):
 
 Examples:
 
-       cpm_comphy: phy@120000 {
+       CP11X_LABEL(comphy): phy@120000 {
                compatible = "marvell,comphy-cp110";
                reg = <0x120000 0x6000>;
-               marvell,system-controller = <&cpm_syscon0>;
-               clocks = <&CP110_LABEL(clk) 1 5>, <&CP110_LABEL(clk) 1 6>,
-                        <&CP110_LABEL(clk) 1 18>;
+               marvell,system-controller = <&CP11X_LABEL(syscon0)>;
+               clocks = <&CP11X_LABEL(clk) 1 5>, <&CP11X_LABEL(clk) 1 6>,
+                        <&CP11X_LABEL(clk) 1 18>;
                clock-names = "mg_clk", "mg_core_clk", "axi_clk";
                #address-cells = <1>;
                #size-cells = <0>;
 
-               cpm_comphy0: phy@0 {
+               CP11X_LABEL(comphy0): phy@0 {
                        reg = <0>;
                        #phy-cells = <1>;
                };
 
-               cpm_comphy1: phy@1 {
+               CP11X_LABEL(comphy1): phy@1 {
                        reg = <1>;
                        #phy-cells = <1>;
                };
index a96e6db..eb248f2 100644 (file)
@@ -66,6 +66,16 @@ properties:
 
           power-supply: true
 
+          resets:
+            description: |
+              A number of phandles to resets that need to be asserted during
+              power-up sequencing of the domain. The resets belong to devices
+              located inside the power domain, which need to be held in reset
+              across the power-up sequence. So no means to specify what each
+              reset is in a generic power-domain binding.
+            minItems: 1
+            maxItems: 4
+
         required:
           - '#power-domain-cells'
           - reg
diff --git a/Documentation/devicetree/bindings/power/renesas,rzg2l-sysc.yaml b/Documentation/devicetree/bindings/power/renesas,rzg2l-sysc.yaml
new file mode 100644 (file)
index 0000000..84ddc77
--- /dev/null
@@ -0,0 +1,63 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: "http://devicetree.org/schemas/power/renesas,rzg2l-sysc.yaml#"
+$schema: "http://devicetree.org/meta-schemas/core.yaml#"
+
+title: Renesas RZ/G2L System Controller (SYSC)
+
+maintainers:
+  - Geert Uytterhoeven <geert+renesas@glider.be>
+
+description:
+  The RZ/G2L System Controller (SYSC) performs system control of the LSI and
+  supports following functions,
+  - External terminal state capture function
+  - 34-bit address space access function
+  - Low power consumption control
+  - WDT stop control
+
+properties:
+  compatible:
+    enum:
+      - renesas,r9a07g044-sysc # RZ/G2{L,LC}
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    items:
+      - description: CA55/CM33 Sleep/Software Standby Mode request interrupt
+      - description: CA55 Software Standby Mode release request interrupt
+      - description: CM33 Software Standby Mode release request interrupt
+      - description: CA55 ACE Asynchronous Bridge Master/Slave interface deny request interrupt
+
+  interrupt-names:
+    items:
+      - const: lpm_int
+      - const: ca55stbydone_int
+      - const: cm33stbyr_int
+      - const: ca55_deny
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - interrupt-names
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+    sysc: system-controller@11020000 {
+            compatible = "renesas,r9a07g044-sysc";
+            reg = <0x11020000 0x10000>;
+            interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>,
+                         <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+            interrupt-names = "lpm_int", "ca55stbydone_int", "cm33stbyr_int",
+                              "ca55_deny";
+    };
index db1aa23..b62c243 100644 (file)
@@ -20,7 +20,7 @@ properties:
     maxItems: 1
 
   phys:
-    $ref: /schemas/types.yaml#/definitions/phandle
+    maxItems: 1
     description: phandle to the USB phy
 
   monitored-battery:
index 7dcab2b..04ff708 100644 (file)
@@ -25,6 +25,9 @@ properties:
           - const: allwinner,sun8i-a83t-pwm
           - const: allwinner,sun8i-h3-pwm
       - items:
+          - const: allwinner,sun8i-v3s-pwm
+          - const: allwinner,sun7i-a20-pwm
+      - items:
           - const: allwinner,sun50i-a64-pwm
           - const: allwinner,sun5i-a13-pwm
       - items:
index d905d61..130fbaa 100644 (file)
@@ -14,8 +14,12 @@ description: |
   processor subsystems/clusters (R5FSS). The dual core cluster can be used
   either in a LockStep mode providing safety/fault tolerance features or in a
   Split mode providing two individual compute cores for doubling the compute
-  capacity. These are used together with other processors present on the SoC
-  to achieve various system level goals.
+  capacity on most SoCs. These are used together with other processors present
+  on the SoC to achieve various system level goals.
+
+  AM64x SoCs do not support LockStep mode, but rather a new non-safety mode
+  called "Single-CPU" mode, where only Core0 is used, but with ability to use
+  Core1's TCMs as well.
 
   Each Dual-Core R5F sub-system is represented as a single DTS node
   representing the cluster, with a pair of child DT nodes representing
@@ -33,6 +37,7 @@ properties:
       - ti,am654-r5fss
       - ti,j721e-r5fss
       - ti,j7200-r5fss
+      - ti,am64-r5fss
 
   power-domains:
     description: |
@@ -56,11 +61,12 @@ properties:
 
   ti,cluster-mode:
     $ref: /schemas/types.yaml#/definitions/uint32
-    enum: [0, 1]
     description: |
       Configuration Mode for the Dual R5F cores within the R5F cluster.
-      Should be either a value of 1 (LockStep mode) or 0 (Split mode),
-      default is LockStep mode if omitted.
+      Should be either a value of 1 (LockStep mode) or 0 (Split mode) on
+      most SoCs (AM65x, J721E, J7200), default is LockStep mode if omitted;
+      and should be either a value of 0 (Split mode) or 2 (Single-CPU mode)
+      on AM64x SoCs, default is Split mode if omitted.
 
 # R5F Processor Child Nodes:
 # ==========================
@@ -97,6 +103,7 @@ patternProperties:
           - ti,am654-r5f
           - ti,j721e-r5f
           - ti,j7200-r5f
+          - ti,am64-r5f
 
       reg:
         items:
@@ -198,6 +205,20 @@ patternProperties:
 
     unevaluatedProperties: false
 
+if:
+  properties:
+    compatible:
+      enum:
+        - ti,am64-r5fss
+then:
+  properties:
+    ti,cluster-mode:
+      enum: [0, 2]
+else:
+  properties:
+    ti,cluster-mode:
+      enum: [0, 1]
+
 required:
   - compatible
   - power-domains
index a16e37b..39b66e9 100644 (file)
@@ -20,6 +20,9 @@ properties:
       - const: allwinner,sun6i-a31-i2s
       - const: allwinner,sun8i-a83t-i2s
       - const: allwinner,sun8i-h3-i2s
+      - items:
+          - const: allwinner,sun8i-v3-i2s
+          - const: allwinner,sun8i-h3-i2s
       - const: allwinner,sun50i-a64-codec-i2s
       - items:
           - const: allwinner,sun50i-a64-i2s
index 9718358..26eca21 100644 (file)
@@ -12,12 +12,15 @@ maintainers:
 
 properties:
   compatible:
-    enum:
+    oneOf:
       # FIXME: This is documented in the PRCM binding, but needs to be
       # migrated here at some point
       # - allwinner,sun8i-a23-codec-analog
-      - allwinner,sun8i-h3-codec-analog
-      - allwinner,sun8i-v3s-codec-analog
+      - const: allwinner,sun8i-h3-codec-analog
+      - items:
+          - const: allwinner,sun8i-v3-codec-analog
+          - const: allwinner,sun8i-h3-codec-analog
+      - const: allwinner,sun8i-v3s-codec-analog
 
   reg:
     maxItems: 1
index 67405e6..19f111f 100644 (file)
@@ -12,7 +12,11 @@ maintainers:
 
 properties:
   "#sound-dai-cells":
-    const: 0
+    minimum: 0
+    maximum: 1
+    description:
+      A value of 0 is deprecated. When used, it only allows access to
+      the ADC/DAC and AIF1 (the CPU DAI), not the other two AIFs/DAIs.
 
   compatible:
     oneOf:
@@ -50,7 +54,7 @@ additionalProperties: false
 examples:
   - |
     audio-codec@1c22e00 {
-      #sound-dai-cells = <0>;
+      #sound-dai-cells = <1>;
       compatible = "allwinner,sun8i-a33-codec";
       reg = <0x01c22e00 0x400>;
       interrupts = <0 29 4>;
index b4c190b..61802a1 100644 (file)
@@ -49,7 +49,7 @@ properties:
     maxItems: 1
 
   memory-region:
-    $ref: /schemas/types.yaml#/definitions/phandle
+    maxItems: 1
     description:
       phandle to a node describing reserved memory (System RAM memory)
       The M core can't access all the DDR memory space on some platform,
index 1c7cf32..53fd24b 100644 (file)
@@ -12,11 +12,18 @@ maintainers:
 
 properties:
   compatible:
-    enum:
-      - allwinner,sun4i-a10-timer
-      - allwinner,sun8i-a23-timer
-      - allwinner,sun8i-v3s-timer
-      - allwinner,suniv-f1c100s-timer
+    oneOf:
+      - enum:
+          - allwinner,sun4i-a10-timer
+          - allwinner,sun8i-a23-timer
+          - allwinner,sun8i-v3s-timer
+          - allwinner,suniv-f1c100s-timer
+      - items:
+          - enum:
+              - allwinner,sun50i-a64-timer
+              - allwinner,sun50i-h6-timer
+              - allwinner,sun50i-h616-timer
+          - const: allwinner,sun8i-a23-timer
 
   reg:
     maxItems: 1
@@ -34,8 +41,8 @@ allOf:
   - if:
       properties:
         compatible:
-          items:
-            const: allwinner,sun4i-a10-timer
+          enum:
+            - allwinner,sun4i-a10-timer
 
     then:
       properties:
@@ -46,8 +53,8 @@ allOf:
   - if:
       properties:
         compatible:
-          items:
-            const: allwinner,sun8i-a23-timer
+          enum:
+            - allwinner,sun8i-a23-timer
 
     then:
       properties:
@@ -58,20 +65,9 @@ allOf:
   - if:
       properties:
         compatible:
-          items:
-            const: allwinner,sun8i-v3s-timer
-
-    then:
-      properties:
-        interrupts:
-          minItems: 3
-          maxItems: 3
-
-  - if:
-      properties:
-        compatible:
-          items:
-            const: allwinner,suniv-f1c100s-timer
+          enum:
+            - allwinner,sun8i-v3s-timer
+            - allwinner,suniv-f1c100s-timer
 
     then:
       properties:
index b868cef..a9fef7e 100644 (file)
@@ -249,6 +249,8 @@ patternProperties:
     description: Colorful GRP, Shenzhen Xueyushi Technology Ltd.
   "^compulab,.*":
     description: CompuLab Ltd.
+  "^congatec,.*":
+    description: congatec GmbH
   "^coreriver,.*":
     description: CORERIVER Semiconductor Co.,Ltd.
   "^corpro,.*":
@@ -315,6 +317,8 @@ patternProperties:
     description: DPTechnics
   "^dragino,.*":
     description: Dragino Technology Co., Limited
+  "^ds,.*":
+    description: DaSheng, Inc.
   "^dserve,.*":
     description: dServe Technology B.V.
   "^dynaimage,.*":
@@ -409,6 +413,8 @@ patternProperties:
     description: Firefly
   "^focaltech,.*":
     description: FocalTech Systems Co.,Ltd
+  "^forlinx,.*":
+    description: Baoding Forlinx Embedded Technology Co., Ltd.
   "^frida,.*":
     description: Shenzhen Frida LCD Co., Ltd.
   "^friendlyarm,.*":
@@ -1244,6 +1250,8 @@ patternProperties:
     description: Western Digital Corp.
   "^we,.*":
     description: Würth Elektronik GmbH.
+  "^welltech,.*":
+    description: Welltech Computer Co., Limited.
   "^wetek,.*":
     description: WeTek Electronics, limited.
   "^wexler,.*":
index ef6d59e..1d8302b 100644 (file)
@@ -4,7 +4,7 @@ LIBNVDIMM: Non-Volatile Devices
 
 libnvdimm - kernel / libndctl - userspace helper library
 
-linux-nvdimm@lists.01.org
+nvdimm@lists.linux.dev
 
 Version 13
 
index 21351b8..8f7d7af 100644 (file)
@@ -19,7 +19,6 @@ Serial drivers
 
     moxa-smartio
     n_gsm
-    rocket
     serial-iso7816
     serial-rs485
 
index 543e704..820e867 100644 (file)
@@ -109,16 +109,19 @@ well as to make sure they aren't relying on some HCD-specific behavior.
 USB-Standard Types
 ==================
 
-In ``drivers/usb/common/common.c`` and ``drivers/usb/common/debug.c`` you
-will find the USB data types defined in chapter 9 of the USB specification.
-These data types are used throughout USB, and in APIs including this host
-side API, gadget APIs, usb character devices and debugfs interfaces.
+In ``include/uapi/linux/usb/ch9.h`` you will find the USB data types defined
+in chapter 9 of the USB specification. These data types are used throughout
+USB, and in APIs including this host side API, gadget APIs, usb character
+devices and debugfs interfaces. That file is itself included by
+``include/linux/usb/ch9.h``, which also contains declarations of a few
+utility routines for manipulating these data types; the implementations
+are in ``drivers/usb/common/common.c``.
 
 .. kernel-doc:: drivers/usb/common/common.c
    :export:
 
-.. kernel-doc:: drivers/usb/common/debug.c
-   :export:
+In addition, some functions useful for creating debugging output are
+defined in ``drivers/usb/common/debug.c``.
 
 Host-Side Data Types and Macros
 ===============================
index bf14517..832839f 100644 (file)
@@ -50,8 +50,8 @@ Here is the main features of EROFS:
 
  - Support POSIX.1e ACLs by using xattrs;
 
- - Support transparent file compression as an option:
-   LZ4 algorithm with 4 KB fixed-sized output compression for high performance.
+ - Support transparent data compression as an option:
+   LZ4 algorithm with the fixed-sized output compression for high performance.
 
 The following git tree provides the file system user-space tools under
 development (ex, formatting tool mkfs.erofs):
@@ -113,31 +113,31 @@ may not. All metadatas can be now observed in two different spaces (views):
 
     ::
 
-                                   |-> aligned with 8B
-                                           |-> followed closely
-       + meta_blkaddr blocks                                      |-> another slot
-       _____________________________________________________________________
-       |  ...   | inode |  xattrs  | extents  | data inline | ... | inode ...
-       |________|_______|(optional)|(optional)|__(optional)_|_____|__________
-               |-> aligned with the inode slot size
-                   .                   .
-                   .                         .
-               .                              .
-               .                                    .
-           .                                         .
-           .                                              .
-       .____________________________________________________|-> aligned with 4B
-       | xattr_ibody_header | shared xattrs | inline xattrs |
-       |____________________|_______________|_______________|
-       |->    12 bytes    <-|->x * 4 bytes<-|               .
-                           .                .                 .
-                       .                      .                   .
-               .                           .                     .
-           ._______________________________.______________________.
-           | id | id | id | id |  ... | id | ent | ... | ent| ... |
-           |____|____|____|____|______|____|_____|_____|____|_____|
-                                           |-> aligned with 4B
-                                                       |-> aligned with 4B
+                                 |-> aligned with 8B
+                                            |-> followed closely
+     + meta_blkaddr blocks                                      |-> another slot
+       _____________________________________________________________________
+     |  ...   | inode |  xattrs  | extents  | data inline | ... | inode ...
+     |________|_______|(optional)|(optional)|__(optional)_|_____|__________
+              |-> aligned with the inode slot size
+                   .                   .
+                 .                         .
+               .                              .
+             .                                    .
+           .                                         .
+         .                                              .
+       .____________________________________________________|-> aligned with 4B
+       | xattr_ibody_header | shared xattrs | inline xattrs |
+       |____________________|_______________|_______________|
+       |->    12 bytes    <-|->x * 4 bytes<-|               .
+                           .                .                 .
+                     .                      .                   .
+                .                           .                     .
+            ._______________________________.______________________.
+            | id | id | id | id |  ... | id | ent | ... | ent| ... |
+            |____|____|____|____|______|____|_____|_____|____|_____|
+                                            |-> aligned with 4B
+                                                        |-> aligned with 4B
 
     Inode could be 32 or 64 bytes, which can be distinguished from a common
     field which all inode versions have -- i_format::
@@ -175,13 +175,13 @@ may not. All metadatas can be now observed in two different spaces (views):
     Each share xattr can also be directly found by the following formula:
          xattr offset = xattr_blkaddr * block_size + 4 * xattr_id
 
-    ::
+::
 
-                           |-> aligned by  4 bytes
-       + xattr_blkaddr blocks                     |-> aligned with 4 bytes
-       _________________________________________________________________________
-       |  ...   | xattr_entry |  xattr data | ... |  xattr_entry | xattr data  ...
-       |________|_____________|_____________|_____|______________|_______________
+                           |-> aligned by  4 bytes
+    + xattr_blkaddr blocks                     |-> aligned with 4 bytes
+     _________________________________________________________________________
+    |  ...   | xattr_entry |  xattr data | ... |  xattr_entry | xattr data  ...
+    |________|_____________|_____________|_____|______________|_______________
 
 Directories
 -----------
@@ -193,48 +193,77 @@ algorithm (could refer to the related source code).
 
 ::
 
-                   ___________________________
-                   /                           |
-               /              ______________|________________
-               /              /              | nameoff1       | nameoffN-1
-    ____________.______________._______________v________________v__________
-    | dirent | dirent | ... | dirent | filename | filename | ... | filename |
-    |___.0___|____1___|_____|___N-1__|____0_____|____1_____|_____|___N-1____|
-       \                           ^
-       \                          |                           * could have
-       \                         |                             trailing '\0'
-           \________________________| nameoff0
-
-                               Directory block
+                  ___________________________
+                 /                           |
+                /              ______________|________________
+               /              /              | nameoff1       | nameoffN-1
+  ____________.______________._______________v________________v__________
+ | dirent | dirent | ... | dirent | filename | filename | ... | filename |
+ |___.0___|____1___|_____|___N-1__|____0_____|____1_____|_____|___N-1____|
+      \                           ^
+       \                          |                           * could have
+        \                         |                             trailing '\0'
+         \________________________| nameoff0
+                             Directory block
 
 Note that apart from the offset of the first filename, nameoff0 also indicates
 the total number of directory entries in this block since it is no need to
 introduce another on-disk field at all.
 
-Compression
------------
-Currently, EROFS supports 4KB fixed-sized output transparent file compression,
-as illustrated below::
-
-           |---- Variant-Length Extent ----|-------- VLE --------|----- VLE -----
-           clusterofs                      clusterofs            clusterofs
-           |                               |                     |   logical data
-    _________v_______________________________v_____________________v_______________
-    ... |    .        |             |        .    |             |  .          | ...
-    ____|____.________|_____________|________.____|_____________|__.__________|____
-       |-> cluster <-|-> cluster <-|-> cluster <-|-> cluster <-|-> cluster <-|
-           size          size          size          size          size
-           .                             .                .                   .
-           .                       .               .                  .
-               .                  .              .                .
-       _______._____________._____________._____________._____________________
-           ... |             |             |             | ... physical data
-       _______|_____________|_____________|_____________|_____________________
-               |-> cluster <-|-> cluster <-|-> cluster <-|
-                   size          size          size
-
-Currently each on-disk physical cluster can contain 4KB (un)compressed data
-at most. For each logical cluster, there is a corresponding on-disk index to
-describe its cluster type, physical cluster address, etc.
-
-See "struct z_erofs_vle_decompressed_index" in erofs_fs.h for more details.
+Data compression
+----------------
+EROFS implements LZ4 fixed-sized output compression which generates fixed-sized
+compressed data blocks from variable-sized input in contrast to other existing
+fixed-sized input solutions. Relatively higher compression ratios can be gotten
+by using fixed-sized output compression since nowadays popular data compression
+algorithms are mostly LZ77-based and such fixed-sized output approach can be
+benefited from the historical dictionary (aka. sliding window).
+
+In details, original (uncompressed) data is turned into several variable-sized
+extents and in the meanwhile, compressed into physical clusters (pclusters).
+In order to record each variable-sized extent, logical clusters (lclusters) are
+introduced as the basic unit of compress indexes to indicate whether a new
+extent is generated within the range (HEAD) or not (NONHEAD). Lclusters are now
+fixed in block size, as illustrated below::
+
+          |<-    variable-sized extent    ->|<-       VLE         ->|
+        clusterofs                        clusterofs              clusterofs
+          |                                 |                       |
+ _________v_________________________________v_______________________v________
+ ... |    .         |              |        .     |              |  .   ...
+ ____|____._________|______________|________.___ _|______________|__.________
+     |-> lcluster <-|-> lcluster <-|-> lcluster <-|-> lcluster <-|
+          (HEAD)        (NONHEAD)       (HEAD)        (NONHEAD)    .
+           .             CBLKCNT            .                    .
+            .                               .                  .
+             .                              .                .
+       _______._____________________________.______________._________________
+          ... |              |              |              | ...
+       _______|______________|______________|______________|_________________
+              |->      big pcluster       <-|-> pcluster <-|
+
+A physical cluster can be seen as a container of physical compressed blocks
+which contains compressed data. Previously, only lcluster-sized (4KB) pclusters
+were supported. After big pcluster feature is introduced (available since
+Linux v5.13), pcluster can be a multiple of lcluster size.
+
+For each HEAD lcluster, clusterofs is recorded to indicate where a new extent
+starts and blkaddr is used to seek the compressed data. For each NONHEAD
+lcluster, delta0 and delta1 are available instead of blkaddr to indicate the
+distance to its HEAD lcluster and the next HEAD lcluster. A PLAIN lcluster is
+also a HEAD lcluster except that its data is uncompressed. See the comments
+around "struct z_erofs_vle_decompressed_index" in erofs_fs.h for more details.
+
+If big pcluster is enabled, pcluster size in lclusters needs to be recorded as
+well. Let the delta0 of the first NONHEAD lcluster store the compressed block
+count with a special flag as a new called CBLKCNT NONHEAD lcluster. It's easy
+to understand its delta0 is constantly 1, as illustrated below::
+
+   __________________________________________________________
+  | HEAD |  NONHEAD  | NONHEAD | ... | NONHEAD | HEAD | HEAD |
+  |__:___|_(CBLKCNT)_|_________|_____|_________|__:___|____:_|
+     |<----- a big pcluster (with CBLKCNT) ------>|<--  -->|
+           a lcluster-sized pcluster (without CBLKCNT) ^
+
+If another HEAD follows a HEAD lcluster, there is no room to record CBLKCNT,
+but it's easy to know the size of such pcluster is 1 lcluster as well.
index e195a7d..b3ef814 100644 (file)
@@ -21,10 +21,10 @@ Description
 The TMP103 is a digital output temperature sensor in a four-ball
 wafer chip-scale package (WCSP). The TMP103 is capable of reading
 temperatures to a resolution of 1°C. The TMP103 is specified for
-operation over a temperature range of 40°C to +125°C.
+operation over a temperature range of -40°C to +125°C.
 
 Resolution: 8 Bits
-Accuracy: ±1°C Typ (10°C to +100°C)
+Accuracy: ±1°C Typ (-10°C to +100°C)
 
 The driver provides the common sysfs-interface for temperatures (see
 Documentation/hwmon/sysfs-interface.rst under Temperatures).
index 8a9b185..2d3f6bd 100644 (file)
@@ -173,7 +173,7 @@ Director rule is added from ethtool (Sideband filter), ATR is turned off by the
 driver. To re-enable ATR, the sideband can be disabled with the ethtool -K
 option. For example::
 
-  ethtool K [adapter] ntuple [off|on]
+  ethtool -K [adapter] ntuple [off|on]
 
 If sideband is re-enabled after ATR is re-enabled, ATR remains enabled until a
 TCP-IP flow is added. When all TCP-IP sideband rules are deleted, ATR is
@@ -688,7 +688,7 @@ shaper bw_rlimit: for each tc, sets minimum and maximum bandwidth rates.
 Totals must be equal or less than port speed.
 
 For example: min_rate 1Gbit 3Gbit: Verify bandwidth limit using network
-monitoring tools such as ifstat or sar –n DEV [interval] [number of samples]
+monitoring tools such as `ifstat` or `sar -n DEV [interval] [number of samples]`
 
 2. Enable HW TC offload on interface::
 
index 52e037b..25330b7 100644 (file)
@@ -179,7 +179,7 @@ shaper bw_rlimit: for each tc, sets minimum and maximum bandwidth rates.
 Totals must be equal or less than port speed.
 
 For example: min_rate 1Gbit 3Gbit: Verify bandwidth limit using network
-monitoring tools such as ifstat or sar –n DEV [interval] [number of samples]
+monitoring tools such as ``ifstat`` or ``sar -n DEV [interval] [number of samples]``
 
 NOTE:
   Setting up channels via ethtool (ethtool -L) is not supported when the
index dabee37..56490c4 100644 (file)
@@ -109,6 +109,16 @@ auxiliary vector.
 
 scv 0 syscalls will always behave as PPC_FEATURE2_HTM_NOSC.
 
+ptrace
+------
+When ptracing system calls (PTRACE_SYSCALL), the pt_regs.trap value contains
+the system call type that can be used to distinguish between sc and scv 0
+system calls, and the different register conventions can be accounted for.
+
+If the value of (pt_regs.trap & 0xfff0) is 0xc00 then the system call was
+performed with the sc instruction, if it is 0x3000 then the system call was
+performed with the scv 0 instruction.
+
 vsyscall
 ========
 
index e5a1be4..dc2d813 100644 (file)
@@ -1,4 +1,4 @@
-.. _process_statement_kernel:
+.. _process_statement_kernel:
 
 Linux Kernel Enforcement Statement
 ----------------------------------
index 00d5b1d..31c6752 100644 (file)
@@ -1,4 +1,4 @@
-=============================
+=============================
 Virtual TPM interface for Xen
 =============================
 
index c4c70e1..6cadad7 100644 (file)
@@ -1,4 +1,4 @@
-======================================
+======================================
 NO_HZ: Reducing Scheduling-Clock Ticks
 ======================================
 
diff --git a/Documentation/translations/zh_CN/SecurityBugs b/Documentation/translations/zh_CN/SecurityBugs
deleted file mode 100644 (file)
index 2d0fffd..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-Chinese translated version of Documentation/admin-guide/security-bugs.rst
-
-If you have any comment or update to the content, please contact the
-original document maintainer directly.  However, if you have a problem
-communicating in English you can also ask the Chinese maintainer for
-help.  Contact the Chinese maintainer if this translation is outdated
-or if there is a problem with the translation.
-
-Chinese maintainer: Harry Wei <harryxiyou@gmail.com>
----------------------------------------------------------------------
-Documentation/admin-guide/security-bugs.rst 的中文翻译
-
-如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
-交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
-译存在问题,请联系中文版维护者。
-
-中文版维护者: 贾威威 Harry Wei <harryxiyou@gmail.com>
-中文版翻译者: 贾威威 Harry Wei <harryxiyou@gmail.com>
-中文版校译者: 贾威威 Harry Wei <harryxiyou@gmail.com>
-
-
-以下为正文
----------------------------------------------------------------------
-Linux内核开发者认为安全非常重要。因此,我们想要知道当一个有关于
-安全的漏洞被发现的时候,并且它可能会被尽快的修复或者公开。请把这个安全
-漏洞报告给Linux内核安全团队。
-
-1) 联系
-
-linux内核安全团队可以通过email<security@kernel.org>来联系。这是
-一组独立的安全工作人员,可以帮助改善漏洞报告并且公布和取消一个修复。安
-全团队有可能会从部分的维护者那里引进额外的帮助来了解并且修复安全漏洞。
-当遇到任何漏洞,所能提供的信息越多就越能诊断和修复。如果你不清楚什么
-是有帮助的信息,那就请重温一下admin-guide/reporting-bugs.rst文件中的概述过程。任
-何攻击性的代码都是非常有用的,未经报告者的同意不会被取消,除非它已经
-被公布于众。
-
-2) 公开
-
-Linux内核安全团队的宗旨就是和漏洞提交者一起处理漏洞的解决方案直
-到公开。我们喜欢尽快地完全公开漏洞。当一个漏洞或者修复还没有被完全地理
-解,解决方案没有通过测试或者供应商协调,可以合理地延迟公开。然而,我们
-期望这些延迟尽可能的短些,是可数的几天,而不是几个星期或者几个月。公开
-日期是通过安全团队和漏洞提供者以及供应商洽谈后的结果。公开时间表是从很
-短(特殊的,它已经被公众所知道)到几个星期。作为一个基本的默认政策,我
-们所期望通知公众的日期是7天的安排。
-
-3) 保密协议
-
-Linux内核安全团队不是一个正式的团体,因此不能加入任何的保密协议。
index 158e48d..e4566ff 100644 (file)
@@ -140,7 +140,7 @@ is an arbitrary string allowed in a filesystem, e.g.::
 Each function provides its specific set of attributes, with either read-only
 or read-write access. Where applicable they need to be written to as
 appropriate.
-Please refer to Documentation/ABI/*/configfs-usb-gadget* for more information.
+Please refer to Documentation/ABI/testing/configfs-usb-gadget for more information.
 
 4. Associating the functions with their configurations
 ------------------------------------------------------
index d1111b7..5ae1f74 100644 (file)
@@ -1,4 +1,4 @@
-================
+================
 mtouchusb driver
 ================
 
index 8fa7dbd..69586ae 100644 (file)
@@ -1,4 +1,4 @@
-==========
+==========
 USB serial
 ==========
 
index 5ec8a19..5c081c8 100644 (file)
@@ -22,7 +22,7 @@ to SEV::
                  [ecx]:
                        Bits[31:0]  Number of encrypted guests supported simultaneously
 
-If support for SEV is present, MSR 0xc001_0010 (MSR_K8_SYSCFG) and MSR 0xc001_0015
+If support for SEV is present, MSR 0xc001_0010 (MSR_AMD64_SYSCFG) and MSR 0xc001_0015
 (MSR_K7_HWCR) can be used to determine if it can be enabled::
 
        0xc001_0010:
index 22d0775..7fcb2fd 100644 (file)
@@ -4803,7 +4803,7 @@ KVM_PV_VM_VERIFY
 4.126 KVM_X86_SET_MSR_FILTER
 ----------------------------
 
-:Capability: KVM_X86_SET_MSR_FILTER
+:Capability: KVM_CAP_X86_MSR_FILTER
 :Architectures: x86
 :Type: vm ioctl
 :Parameters: struct kvm_msr_filter
@@ -6715,7 +6715,7 @@ accesses that would usually trigger a #GP by KVM into the guest will
 instead get bounced to user space through the KVM_EXIT_X86_RDMSR and
 KVM_EXIT_X86_WRMSR exit notifications.
 
-8.27 KVM_X86_SET_MSR_FILTER
+8.27 KVM_CAP_X86_MSR_FILTER
 ---------------------------
 
 :Architectures: x86
index c48d452..a1940eb 100644 (file)
@@ -53,7 +53,7 @@ CPUID function 0x8000001f reports information related to SME::
                           system physical addresses, not guest physical
                           addresses)
 
-If support for SME is present, MSR 0xc00100010 (MSR_K8_SYSCFG) can be used to
+If support for SME is present, MSR 0xc00100010 (MSR_AMD64_SYSCFG) can be used to
 determine if SME is enabled and/or to enable memory encryption::
 
        0xc0010010:
@@ -79,7 +79,7 @@ The state of SME in the Linux kernel can be documented as follows:
          The CPU supports SME (determined through CPUID instruction).
 
        - Enabled:
-         Supported and bit 23 of MSR_K8_SYSCFG is set.
+         Supported and bit 23 of MSR_AMD64_SYSCFG is set.
 
        - Active:
          Supported, Enabled and the Linux kernel is actively applying
@@ -89,7 +89,7 @@ The state of SME in the Linux kernel can be documented as follows:
 SME can also be enabled and activated in the BIOS. If SME is enabled and
 activated in the BIOS, then all memory accesses will be encrypted and it will
 not be necessary to activate the Linux memory encryption support.  If the BIOS
-merely enables SME (sets bit 23 of the MSR_K8_SYSCFG), then Linux can activate
+merely enables SME (sets bit 23 of the MSR_AMD64_SYSCFG), then Linux can activate
 memory encryption by default (CONFIG_AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT=y) or
 by supplying mem_encrypt=on on the kernel command line.  However, if BIOS does
 not enable SME, then Linux will not be able to activate memory encryption, even
index bd7aff0..c636497 100644 (file)
@@ -1578,7 +1578,7 @@ F:        drivers/clk/sunxi/
 ARM/Allwinner sunXi SoC support
 M:     Maxime Ripard <mripard@kernel.org>
 M:     Chen-Yu Tsai <wens@csie.org>
-R:     Jernej Skrabec <jernej.skrabec@siol.net>
+R:     Jernej Skrabec <jernej.skrabec@gmail.com>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux.git
@@ -1618,8 +1618,8 @@ F:        Documentation/devicetree/bindings/sound/amlogic*
 F:     sound/soc/meson/
 
 ARM/Amlogic Meson SoC support
+M:     Neil Armstrong <narmstrong@baylibre.com>
 M:     Kevin Hilman <khilman@baylibre.com>
-R:     Neil Armstrong <narmstrong@baylibre.com>
 R:     Jerome Brunet <jbrunet@baylibre.com>
 R:     Martin Blumenstingl <martin.blumenstingl@googlemail.com>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@ -1810,6 +1810,7 @@ F:        Documentation/devicetree/bindings/arm/gemini.txt
 F:     Documentation/devicetree/bindings/net/cortina,gemini-ethernet.txt
 F:     Documentation/devicetree/bindings/pinctrl/cortina,gemini-pinctrl.txt
 F:     Documentation/devicetree/bindings/rtc/faraday,ftrtc010.txt
+F:     arch/arm/boot/dts/gemini*
 F:     arch/arm/mach-gemini/
 F:     drivers/net/ethernet/cortina/
 F:     drivers/pinctrl/pinctrl-gemini.c
@@ -5089,7 +5090,7 @@ S:        Maintained
 F:     drivers/net/fddi/defza.*
 
 DEINTERLACE DRIVERS FOR ALLWINNER H3
-M:     Jernej Skrabec <jernej.skrabec@siol.net>
+M:     Jernej Skrabec <jernej.skrabec@gmail.com>
 L:     linux-media@vger.kernel.org
 S:     Maintained
 T:     git git://linuxtv.org/media_tree.git
@@ -5237,7 +5238,7 @@ DEVICE DIRECT ACCESS (DAX)
 M:     Dan Williams <dan.j.williams@intel.com>
 M:     Vishal Verma <vishal.l.verma@intel.com>
 M:     Dave Jiang <dave.jiang@intel.com>
-L:     linux-nvdimm@lists.01.org
+L:     nvdimm@lists.linux.dev
 S:     Supported
 F:     drivers/dax/
 
@@ -5632,14 +5633,14 @@ F:      include/linux/power/smartreflex.h
 DRM DRIVER FOR ALLWINNER DE2 AND DE3 ENGINE
 M:     Maxime Ripard <mripard@kernel.org>
 M:     Chen-Yu Tsai <wens@csie.org>
-R:     Jernej Skrabec <jernej.skrabec@siol.net>
+R:     Jernej Skrabec <jernej.skrabec@gmail.com>
 L:     dri-devel@lists.freedesktop.org
 S:     Supported
 T:     git git://anongit.freedesktop.org/drm/drm-misc
 F:     drivers/gpu/drm/sun4i/sun8i*
 
 DRM DRIVER FOR ARM PL111 CLCD
-M:     Eric Anholt <eric@anholt.net>
+M:     Emma Anholt <emma@anholt.net>
 S:     Supported
 T:     git git://anongit.freedesktop.org/drm/drm-misc
 F:     drivers/gpu/drm/pl111/
@@ -5719,7 +5720,7 @@ T:        git git://anongit.freedesktop.org/drm/drm-misc
 F:     drivers/gpu/drm/tiny/gm12u320.c
 
 DRM DRIVER FOR HX8357D PANELS
-M:     Eric Anholt <eric@anholt.net>
+M:     Emma Anholt <emma@anholt.net>
 S:     Maintained
 T:     git git://anongit.freedesktop.org/drm/drm-misc
 F:     Documentation/devicetree/bindings/display/himax,hx8357d.txt
@@ -6023,7 +6024,7 @@ M:        Neil Armstrong <narmstrong@baylibre.com>
 M:     Robert Foss <robert.foss@linaro.org>
 R:     Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
 R:     Jonas Karlman <jonas@kwiboo.se>
-R:     Jernej Skrabec <jernej.skrabec@siol.net>
+R:     Jernej Skrabec <jernej.skrabec@gmail.com>
 S:     Maintained
 T:     git git://anongit.freedesktop.org/drm/drm-misc
 F:     drivers/gpu/drm/bridge/
@@ -6177,7 +6178,7 @@ F:        Documentation/devicetree/bindings/display/ti/
 F:     drivers/gpu/drm/omapdrm/
 
 DRM DRIVERS FOR V3D
-M:     Eric Anholt <eric@anholt.net>
+M:     Emma Anholt <emma@anholt.net>
 S:     Supported
 T:     git git://anongit.freedesktop.org/drm/drm-misc
 F:     Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
@@ -6185,7 +6186,7 @@ F:        drivers/gpu/drm/v3d/
 F:     include/uapi/drm/v3d_drm.h
 
 DRM DRIVERS FOR VC4
-M:     Eric Anholt <eric@anholt.net>
+M:     Emma Anholt <emma@anholt.net>
 M:     Maxime Ripard <mripard@kernel.org>
 S:     Supported
 T:     git git://github.com/anholt/linux
@@ -7006,7 +7007,7 @@ M:        Dan Williams <dan.j.williams@intel.com>
 R:     Matthew Wilcox <willy@infradead.org>
 R:     Jan Kara <jack@suse.cz>
 L:     linux-fsdevel@vger.kernel.org
-L:     linux-nvdimm@lists.01.org
+L:     nvdimm@lists.linux.dev
 S:     Supported
 F:     fs/dax.c
 F:     include/linux/dax.h
@@ -10378,7 +10379,7 @@ LIBNVDIMM BLK: MMIO-APERTURE DRIVER
 M:     Dan Williams <dan.j.williams@intel.com>
 M:     Vishal Verma <vishal.l.verma@intel.com>
 M:     Dave Jiang <dave.jiang@intel.com>
-L:     linux-nvdimm@lists.01.org
+L:     nvdimm@lists.linux.dev
 S:     Supported
 Q:     https://patchwork.kernel.org/project/linux-nvdimm/list/
 P:     Documentation/nvdimm/maintainer-entry-profile.rst
@@ -10389,7 +10390,7 @@ LIBNVDIMM BTT: BLOCK TRANSLATION TABLE
 M:     Vishal Verma <vishal.l.verma@intel.com>
 M:     Dan Williams <dan.j.williams@intel.com>
 M:     Dave Jiang <dave.jiang@intel.com>
-L:     linux-nvdimm@lists.01.org
+L:     nvdimm@lists.linux.dev
 S:     Supported
 Q:     https://patchwork.kernel.org/project/linux-nvdimm/list/
 P:     Documentation/nvdimm/maintainer-entry-profile.rst
@@ -10399,7 +10400,7 @@ LIBNVDIMM PMEM: PERSISTENT MEMORY DRIVER
 M:     Dan Williams <dan.j.williams@intel.com>
 M:     Vishal Verma <vishal.l.verma@intel.com>
 M:     Dave Jiang <dave.jiang@intel.com>
-L:     linux-nvdimm@lists.01.org
+L:     nvdimm@lists.linux.dev
 S:     Supported
 Q:     https://patchwork.kernel.org/project/linux-nvdimm/list/
 P:     Documentation/nvdimm/maintainer-entry-profile.rst
@@ -10407,7 +10408,7 @@ F:      drivers/nvdimm/pmem*
 
 LIBNVDIMM: DEVICETREE BINDINGS
 M:     Oliver O'Halloran <oohall@gmail.com>
-L:     linux-nvdimm@lists.01.org
+L:     nvdimm@lists.linux.dev
 S:     Supported
 Q:     https://patchwork.kernel.org/project/linux-nvdimm/list/
 F:     Documentation/devicetree/bindings/pmem/pmem-region.txt
@@ -10418,7 +10419,7 @@ M:      Dan Williams <dan.j.williams@intel.com>
 M:     Vishal Verma <vishal.l.verma@intel.com>
 M:     Dave Jiang <dave.jiang@intel.com>
 M:     Ira Weiny <ira.weiny@intel.com>
-L:     linux-nvdimm@lists.01.org
+L:     nvdimm@lists.linux.dev
 S:     Supported
 Q:     https://patchwork.kernel.org/project/linux-nvdimm/list/
 P:     Documentation/nvdimm/maintainer-entry-profile.rst
@@ -12180,6 +12181,7 @@ F:      drivers/platform/surface/surfacepro3_button.c
 
 MICROSOFT SURFACE SYSTEM AGGREGATOR SUBSYSTEM
 M:     Maximilian Luz <luzmaximilian@gmail.com>
+L:     platform-driver-x86@vger.kernel.org
 S:     Maintained
 W:     https://github.com/linux-surface/surface-aggregator-module
 C:     irc://chat.freenode.net/##linux-surface
@@ -14734,7 +14736,6 @@ W:      https://wireless.wiki.kernel.org/en/users/Drivers/p54
 F:     drivers/net/wireless/intersil/prism54/
 
 PROC FILESYSTEM
-R:     Alexey Dobriyan <adobriyan@gmail.com>
 L:     linux-kernel@vger.kernel.org
 L:     linux-fsdevel@vger.kernel.org
 S:     Maintained
@@ -15815,7 +15816,7 @@ F:      include/uapi/linux/rose.h
 F:     net/rose/
 
 ROTATION DRIVER FOR ALLWINNER A83T
-M:     Jernej Skrabec <jernej.skrabec@siol.net>
+M:     Jernej Skrabec <jernej.skrabec@gmail.com>
 L:     linux-media@vger.kernel.org
 S:     Maintained
 T:     git git://linuxtv.org/media_tree.git
index 53d09c4..e446835 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
 VERSION = 5
 PATCHLEVEL = 13
 SUBLEVEL = 0
-EXTRAVERSION = -rc1
+EXTRAVERSION = -rc3
 NAME = Frozen Wasteland
 
 # *DOCUMENTATION*
index 5622578..3000a2e 100644 (file)
 550    common  process_madvise                 sys_process_madvise
 551    common  epoll_pwait2                    sys_epoll_pwait2
 552    common  mount_setattr                   sys_mount_setattr
-553    common  quotactl_path                   sys_quotactl_path
+# 553 reserved for quotactl_path
 554    common  landlock_create_ruleset         sys_landlock_create_ruleset
 555    common  landlock_add_rule               sys_landlock_add_rule
 556    common  landlock_restrict_self          sys_landlock_restrict_self
index 4392c9c..e47adc9 100644 (file)
@@ -31,7 +31,7 @@ endif
 
 
 ifdef CONFIG_ARC_CURR_IN_REG
-# For a global register defintion, make sure it gets passed to every file
+# For a global register definition, make sure it gets passed to every file
 # We had a customer reported bug where some code built in kernel was NOT using
 # any kernel headers, and missing the r25 global register
 # Can't do unconditionally because of recursive include issues
index 9b87e16..dfeffa2 100644 (file)
@@ -116,7 +116,7 @@ static inline unsigned long __xchg(unsigned long val, volatile void *ptr,
  *
  * Technically the lock is also needed for UP (boils down to irq save/restore)
  * but we can cheat a bit since cmpxchg() atomic_ops_lock() would cause irqs to
- * be disabled thus can't possibly be interrpted/preempted/clobbered by xchg()
+ * be disabled thus can't possibly be interrupted/preempted/clobbered by xchg()
  * Other way around, xchg is one instruction anyways, so can't be interrupted
  * as such
  */
@@ -143,7 +143,7 @@ static inline unsigned long __xchg(unsigned long val, volatile void *ptr,
 /*
  * "atomic" variant of xchg()
  * REQ: It needs to follow the same serialization rules as other atomic_xxx()
- * Since xchg() doesn't always do that, it would seem that following defintion
+ * Since xchg() doesn't always do that, it would seem that following definition
  * is incorrect. But here's the rationale:
  *   SMP : Even xchg() takes the atomic_ops_lock, so OK.
  *   LLSC: atomic_ops_lock are not relevant at all (even if SMP, since LLSC
index ad9b7fe..4a9d333 100644 (file)
@@ -7,6 +7,18 @@
 
 #include <uapi/asm/page.h>
 
+#ifdef CONFIG_ARC_HAS_PAE40
+
+#define MAX_POSSIBLE_PHYSMEM_BITS      40
+#define PAGE_MASK_PHYS                 (0xff00000000ull | PAGE_MASK)
+
+#else /* CONFIG_ARC_HAS_PAE40 */
+
+#define MAX_POSSIBLE_PHYSMEM_BITS      32
+#define PAGE_MASK_PHYS                 PAGE_MASK
+
+#endif /* CONFIG_ARC_HAS_PAE40 */
+
 #ifndef __ASSEMBLY__
 
 #define clear_page(paddr)              memset((paddr), 0, PAGE_SIZE)
index 1636417..5878846 100644 (file)
 #define ___DEF (_PAGE_PRESENT | _PAGE_CACHEABLE)
 
 /* Set of bits not changed in pte_modify */
-#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_SPECIAL)
-
+#define _PAGE_CHG_MASK (PAGE_MASK_PHYS | _PAGE_ACCESSED | _PAGE_DIRTY | \
+                                                          _PAGE_SPECIAL)
 /* More Abbrevaited helpers */
 #define PAGE_U_NONE     __pgprot(___DEF)
 #define PAGE_U_R        __pgprot(___DEF | _PAGE_READ)
 #define PTE_BITS_IN_PD0                (_PAGE_GLOBAL | _PAGE_PRESENT | _PAGE_HW_SZ)
 #define PTE_BITS_RWX           (_PAGE_EXECUTE | _PAGE_WRITE | _PAGE_READ)
 
-#ifdef CONFIG_ARC_HAS_PAE40
-#define PTE_BITS_NON_RWX_IN_PD1        (0xff00000000 | PAGE_MASK | _PAGE_CACHEABLE)
-#define MAX_POSSIBLE_PHYSMEM_BITS 40
-#else
-#define PTE_BITS_NON_RWX_IN_PD1        (PAGE_MASK | _PAGE_CACHEABLE)
-#define MAX_POSSIBLE_PHYSMEM_BITS 32
-#endif
+#define PTE_BITS_NON_RWX_IN_PD1        (PAGE_MASK_PHYS | _PAGE_CACHEABLE)
 
 /**************************************************************************
  * Mapping of vm_flags (Generic VM) to PTE flags (arch specific)
index 2a97e27..2a4ad61 100644 (file)
@@ -33,5 +33,4 @@
 
 #define PAGE_MASK      (~(PAGE_SIZE-1))
 
-
 #endif /* _UAPI__ASM_ARC_PAGE_H */
index 1743506..2cb8dfe 100644 (file)
@@ -177,7 +177,7 @@ tracesys:
 
        ; Do the Sys Call as we normally would.
        ; Validate the Sys Call number
-       cmp     r8,  NR_syscalls
+       cmp     r8,  NR_syscalls - 1
        mov.hi  r0, -ENOSYS
        bhi     tracesys_exit
 
@@ -255,7 +255,7 @@ ENTRY(EV_Trap)
        ;============ Normal syscall case
 
        ; syscall num shd not exceed the total system calls avail
-       cmp     r8,  NR_syscalls
+       cmp     r8,  NR_syscalls - 1
        mov.hi  r0, -ENOSYS
        bhi     .Lret_from_system_call
 
index ecfbc42..345a000 100644 (file)
@@ -140,6 +140,7 @@ int kgdb_arch_handle_exception(int e_vector, int signo, int err_code,
                ptr = &remcomInBuffer[1];
                if (kgdb_hex2long(&ptr, &addr))
                        regs->ret = addr;
+               fallthrough;
 
        case 'D':
        case 'k':
index d838d0d..3793876 100644 (file)
@@ -50,14 +50,14 @@ SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new)
        int ret;
 
        /*
-        * This is only for old cores lacking LLOCK/SCOND, which by defintion
+        * This is only for old cores lacking LLOCK/SCOND, which by definition
         * can't possibly be SMP. Thus doesn't need to be SMP safe.
         * And this also helps reduce the overhead for serializing in
         * the UP case
         */
        WARN_ON_ONCE(IS_ENABLED(CONFIG_SMP));
 
-       /* Z indicates to userspace if operation succeded */
+       /* Z indicates to userspace if operation succeeded */
        regs->status32 &= ~STATUS_Z_MASK;
 
        ret = access_ok(uaddr, sizeof(*uaddr));
@@ -107,7 +107,7 @@ fail:
 
 void arch_cpu_idle(void)
 {
-       /* Re-enable interrupts <= default irq priority before commiting SLEEP */
+       /* Re-enable interrupts <= default irq priority before committing SLEEP */
        const unsigned int arg = 0x10 | ARCV2_IRQ_DEF_PRIO;
 
        __asm__ __volatile__(
@@ -120,7 +120,7 @@ void arch_cpu_idle(void)
 
 void arch_cpu_idle(void)
 {
-       /* sleep, but enable both set E1/E2 (levels of interrutps) before committing */
+       /* sleep, but enable both set E1/E2 (levels of interrupts) before committing */
        __asm__ __volatile__("sleep 0x3 \n");
 }
 
index fdbe06c..b3ccb9e 100644 (file)
@@ -259,7 +259,7 @@ setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
                regs->r2 = (unsigned long)&sf->uc;
 
                /*
-                * small optim to avoid unconditonally calling do_sigaltstack
+                * small optim to avoid unconditionally calling do_sigaltstack
                 * in sigreturn path, now that we only have rt_sigreturn
                 */
                magic = MAGIC_SIGALTSTK;
@@ -391,7 +391,7 @@ void do_signal(struct pt_regs *regs)
 void do_notify_resume(struct pt_regs *regs)
 {
        /*
-        * ASM glue gaurantees that this is only called when returning to
+        * ASM glue guarantees that this is only called when returning to
         * user mode
         */
        if (test_thread_flag(TIF_NOTIFY_RESUME))
index 33832e3..e2ed355 100644 (file)
@@ -157,7 +157,16 @@ void __init setup_arch_memory(void)
        min_high_pfn = PFN_DOWN(high_mem_start);
        max_high_pfn = PFN_DOWN(high_mem_start + high_mem_sz);
 
-       max_zone_pfn[ZONE_HIGHMEM] = min_low_pfn;
+       /*
+        * max_high_pfn should be ok here for both HIGHMEM and HIGHMEM+PAE.
+        * For HIGHMEM without PAE max_high_pfn should be less than
+        * min_low_pfn to guarantee that these two regions don't overlap.
+        * For PAE case highmem is greater than lowmem, so it is natural
+        * to use max_high_pfn.
+        *
+        * In both cases, holes should be handled by pfn_valid().
+        */
+       max_zone_pfn[ZONE_HIGHMEM] = max_high_pfn;
 
        high_memory = (void *)(min_high_pfn << PAGE_SHIFT);
 
index fac4adc..95c649f 100644 (file)
@@ -53,9 +53,10 @@ EXPORT_SYMBOL(ioremap);
 void __iomem *ioremap_prot(phys_addr_t paddr, unsigned long size,
                           unsigned long flags)
 {
+       unsigned int off;
        unsigned long vaddr;
        struct vm_struct *area;
-       phys_addr_t off, end;
+       phys_addr_t end;
        pgprot_t prot = __pgprot(flags);
 
        /* Don't allow wraparound, zero size */
@@ -72,7 +73,7 @@ void __iomem *ioremap_prot(phys_addr_t paddr, unsigned long size,
 
        /* Mappings have to be page-aligned */
        off = paddr & ~PAGE_MASK;
-       paddr &= PAGE_MASK;
+       paddr &= PAGE_MASK_PHYS;
        size = PAGE_ALIGN(end + 1) - paddr;
 
        /*
index 9bb3c24..9c7c682 100644 (file)
@@ -576,7 +576,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long vaddr_unaligned,
                      pte_t *ptep)
 {
        unsigned long vaddr = vaddr_unaligned & PAGE_MASK;
-       phys_addr_t paddr = pte_val(*ptep) & PAGE_MASK;
+       phys_addr_t paddr = pte_val(*ptep) & PAGE_MASK_PHYS;
        struct page *page = pfn_to_page(pte_pfn(*ptep));
 
        create_tlb(vma, vaddr, ptep);
index f8f09c5..863347b 100644 (file)
@@ -88,6 +88,7 @@ dtb-$(CONFIG_ARCH_BCM2835) += \
        bcm2837-rpi-3-b.dtb \
        bcm2837-rpi-3-b-plus.dtb \
        bcm2837-rpi-cm3-io3.dtb \
+       bcm2711-rpi-400.dtb \
        bcm2711-rpi-4-b.dtb \
        bcm2835-rpi-zero.dtb \
        bcm2835-rpi-zero-w.dtb
@@ -240,6 +241,7 @@ dtb-$(CONFIG_ARCH_INTEGRATOR) += \
        integratorcp.dtb
 dtb-$(CONFIG_ARCH_IXP4XX) += \
        intel-ixp42x-linksys-nslu2.dtb \
+       intel-ixp42x-welltech-epbx100.dtb \
        intel-ixp43x-gateworks-gw2358.dtb
 dtb-$(CONFIG_ARCH_KEYSTONE) += \
        keystone-k2hk-evm.dtb \
@@ -513,8 +515,14 @@ dtb-$(CONFIG_SOC_IMX6Q) += \
        imx6q-display5-tianma-tm070-1280x768.dtb \
        imx6q-dmo-edmqmx6.dtb \
        imx6q-dms-ba16.dtb \
+       imx6q-ds.dtb \
        imx6q-emcon-avari.dtb \
        imx6q-evi.dtb \
+       imx6dl-b105pv2.dtb \
+       imx6dl-b105v2.dtb \
+       imx6dl-b125v2.dtb \
+       imx6dl-b125pv2.dtb \
+       imx6dl-b155v2.dtb \
        imx6q-gk802.dtb \
        imx6q-gw51xx.dtb \
        imx6q-gw52xx.dtb \
@@ -725,7 +733,8 @@ dtb-$(CONFIG_ARCH_MXS) += \
        imx28-m28evk.dtb \
        imx28-sps1.dtb \
        imx28-ts4600.dtb \
-       imx28-tx28.dtb
+       imx28-tx28.dtb \
+       imx28-xea.dtb
 dtb-$(CONFIG_ARCH_NOMADIK) += \
        ste-nomadik-s8815.dtb \
        ste-nomadik-nhk15.dtb
@@ -1234,6 +1243,7 @@ dtb-$(CONFIG_MACH_SUN8I) += \
        sun8i-r16-nintendo-super-nes-classic.dtb \
        sun8i-r16-parrot.dtb \
        sun8i-r40-bananapi-m2-ultra.dtb \
+       sun8i-r40-oka40i-c.dtb \
        sun8i-s3-elimo-initium.dtb \
        sun8i-s3-lichee-zero-plus.dtb \
        sun8i-s3-pinecube.dtb \
@@ -1415,6 +1425,7 @@ dtb-$(CONFIG_ARCH_MSTARV7) += \
        mstar-mercury5-ssc8336n-midrived08.dtb
 dtb-$(CONFIG_ARCH_ASPEED) += \
        aspeed-ast2500-evb.dtb \
+       aspeed-ast2600-evb-a1.dtb \
        aspeed-ast2600-evb.dtb \
        aspeed-bmc-amd-ethanolx.dtb \
        aspeed-bmc-ampere-mtjade.dtb \
index 3ea2861..1103a2c 100644 (file)
        status = "okay";
 };
 
-&gpio0 {
+&gpio0_target {
        ti,no-reset-on-init;
 };
 
-&gpio3 {
+&gpio3_target {
        ti,no-reset-on-init;
 };
index 86cad99..8011664 100644 (file)
 };
 
 &gpio3 {
-       ls_buf_en {
+       ls-buf-en-hog {
                gpio-hog;
                gpios = <10 GPIO_ACTIVE_HIGH>;
                output-high;
index 69acaf4..0afcc2e 100644 (file)
 };
 
 &gpio3 {
-       ls_buf_en {
+       ls-buf-en-hog {
                gpio-hog;
                gpios = <10 GPIO_ACTIVE_HIGH>;
                output-high;
index 7615327..74db0fc 100644 (file)
 };
 
 &gpio1 {
-       ls_buf_en {
+       ls-buf-en-hog {
                gpio-hog;
                gpios = <29 GPIO_ACTIVE_HIGH>;
                output-high;
 /* an external pulldown on U21 pin 4.                                  */
 
 &gpio3 {
-       bt_aud_in {
+       bt-aud-in-hog {
                gpio-hog;
                gpios = <16 GPIO_ACTIVE_HIGH>;
                output-low;
index 36d963d..688e14e 100644 (file)
@@ -333,7 +333,7 @@ status = "okay";
 &epwmss0 {
        status = "okay";
 
-       ecap0: ecap@100 {
+       ecap0: pwm@100 {
                status = "okay";
                pinctrl-names = "default";
                pinctrl-0 = <&ecap0_pins>;
@@ -496,7 +496,7 @@ status = "okay";
        status = "okay";
        pinctrl-names = "default";
        pinctrl-0 = <&spi0_pins>;
-       ti,pindir-d0-out-d1-in = <1>;
+       ti,pindir-d0-out-d1-in;
        /* WLS1271 WiFi */
        wlcore: wlcore@1 {
                compatible = "ti,wl1271";
index 902e295..9cf39c9 100644 (file)
 &epwmss0 {
        status = "okay";
 
-       ecap0: ecap@100 {
+       ecap0: pwm@100 {
                status = "okay";
                pinctrl-names = "default";
                pinctrl-0 = <&ecap0_pins>;
index d5f8d5e..001657b 100644 (file)
 &epwmss2 {
        status = "okay";
 
-       ecap2: ecap@100 {
+       ecap2: pwm@100 {
                status = "okay";
                pinctrl-names = "default";
                pinctrl-0 = <&ecap2_pins>;
        status = "okay";
 };
 
-&gpio0 {
+&gpio0_target {
        ti,no-reset-on-init;
 };
 
index e923d06..5e598ac 100644 (file)
 };
 
 &gpio3 {
-       p4 {
+       pr1-mii-ctl-hog {
                gpio-hog;
                gpios = <4 GPIO_ACTIVE_HIGH>;
                output-high;
                line-name = "PR1_MII_CTRL";
        };
 
-       p10 {
+       mux-mii-hog {
                gpio-hog;
                gpios = <10 GPIO_ACTIVE_HIGH>;
                /* ETH1 mux: Low for MII-PRU, high for RMII-CPSW */
index 4e90f9c..8121a19 100644 (file)
        status = "okay";
 };
 
-&gpio0 {
+&gpio0_target {
        ti,no-reset-on-init;
 };
 
index 98d8ed4..39e5d2c 100644 (file)
        status = "okay";
 };
 
-&gpio0 {
+&gpio0_target {
        ti,no-reset-on-init;
 };
 
index f841afb..5403e47 100644 (file)
        regulator-always-on;
 };
 
-&mmc1 {
-       vmmc-supply = <&vmmcsd_fixed>;
-};
-
 &mmc2 {
        vmmc-supply = <&vmmcsd_fixed>;
        pinctrl-names = "default";
        status = "okay";
 };
 
-&am33xx_pinmux {
-       nxp_hdmi_bonelt_pins: nxp-hdmi-bonelt-pins {
-               pinctrl-single,pins = <
-                       AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_OUTPUT_PULLDOWN, MUX_MODE3)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA0, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA1, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA2, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA3, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA4, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA5, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA6, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA7, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA8, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA9, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA10, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA11, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA12, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA13, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA14, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA15, PIN_OUTPUT, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_VSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_HSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_PCLK, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_LCD_AC_BIAS_EN, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
-               >;
-       };
-
-       nxp_hdmi_bonelt_off_pins: nxp-hdmi-bonelt-off-pins {
-               pinctrl-single,pins = <
-                       AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_OUTPUT_PULLDOWN, MUX_MODE3)
-               >;
-       };
-
-       mcasp0_pins: mcasp0-pins {
-               pinctrl-single,pins = <
-                       AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKX, PIN_INPUT_PULLUP, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKR, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mcasp0_ahclkr.mcasp0_axr2*/
-                       AM33XX_PADCONF(AM335X_PIN_MCASP0_FSX, PIN_OUTPUT_PULLUP, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_MCASP0_ACLKX, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
-                       AM33XX_PADCONF(AM335X_PIN_GPMC_A11, PIN_OUTPUT_PULLDOWN, MUX_MODE7) /* gpmc_a11.GPIO1_27 */
-               >;
-       };
-
-       flash_enable: flash-enable {
-               pinctrl-single,pins = <
-                       AM33XX_PADCONF(AM335X_PIN_RMII1_REF_CLK, PIN_OUTPUT_PULLDOWN, MUX_MODE7)        /* rmii1_ref_clk.gpio0_29 */
-               >;
-       };
-
-       imu_interrupt: imu-interrupt {
-               pinctrl-single,pins = <
-                       AM33XX_PADCONF(AM335X_PIN_MII1_RX_ER, PIN_INPUT_PULLDOWN, MUX_MODE7)            /* mii1_rx_er.gpio3_2 */
-               >;
-       };
-
-       ethernet_interrupt: ethernet-interrupt{
-               pinctrl-single,pins = <
-                       AM33XX_PADCONF(AM335X_PIN_MII1_COL, PIN_INPUT_PULLDOWN, MUX_MODE7)              /* mii1_col.gpio3_0 */
-               >;
-       };
-};
-
 &lcdc {
        status = "okay";
 
        };
 };
 
-&rtc {
-       system-power-controller;
-};
-
 &mcasp0 {
        #sound-dai-cells = <0>;
        pinctrl-names = "default";
        pinctrl-names = "default";
        pinctrl-0 = <&clkout2_pin>;
 
+       nxp_hdmi_bonelt_pins: nxp-hdmi-bonelt-pins {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_OUTPUT_PULLDOWN, MUX_MODE3)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA0, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA1, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA2, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA3, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA4, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA5, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA6, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA7, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA8, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA9, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA10, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA11, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA12, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA13, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA14, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_DATA15, PIN_OUTPUT, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_VSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_HSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_PCLK, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_LCD_AC_BIAS_EN, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+               >;
+       };
+
+       nxp_hdmi_bonelt_off_pins: nxp-hdmi-bonelt-off-pins {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_OUTPUT_PULLDOWN, MUX_MODE3)
+               >;
+       };
+
+       mcasp0_pins: mcasp0-pins {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKX, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKR, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mcasp0_ahclkr.mcasp0_axr2*/
+                       AM33XX_PADCONF(AM335X_PIN_MCASP0_FSX, PIN_OUTPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MCASP0_ACLKX, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A11, PIN_OUTPUT_PULLDOWN, MUX_MODE7) /* gpmc_a11.GPIO1_27 */
+               >;
+       };
+
+       flash_enable: flash-enable {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_RMII1_REF_CLK, PIN_OUTPUT_PULLDOWN, MUX_MODE7)        /* rmii1_ref_clk.gpio0_29 */
+               >;
+       };
+
+       imu_interrupt: imu-interrupt {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RX_ER, PIN_INPUT_PULLDOWN, MUX_MODE7)    /* mii1_rx_er.gpio3_2 */
+               >;
+       };
+
+       ethernet_interrupt: ethernet-interrupt{
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_MII1_COL, PIN_INPUT_PULLDOWN, MUX_MODE7)      /* mii1_col.gpio3_0 */
+               >;
+       };
+
        user_leds_s0: user-leds-s0 {
                pinctrl-single,pins = <
                        AM33XX_PADCONF(AM335X_PIN_GPMC_A5, PIN_OUTPUT_PULLDOWN, MUX_MODE7)      /* gpmc_a5.gpio1_21 */
 
 &mmc1 {
        status = "okay";
+       vmmc-supply = <&vmmcsd_fixed>;
        bus-width = <0x4>;
        pinctrl-names = "default";
        pinctrl-0 = <&mmc1_pins>;
 };
 
 &rtc {
+       system-power-controller;
        clocks = <&clk_32768_ck>, <&clk_24mhz_clkctrl AM3_CLK_24MHZ_CLKDIV32K_CLKCTRL 0>;
        clock-names = "ext-clk", "int-clk";
 };
index 1eaa265..2bfe60d 100644 (file)
 };
 
 &gpio1 {
-       hmtc_rst {
+       hmtc-rst-hog {
                gpio-hog;
                gpios = <24 GPIO_ACTIVE_LOW>;
                output-high;
                line-name = "homematic_reset";
        };
 
-       hmtc_prog {
+       hmtc-prog-hog {
                gpio-hog;
                gpios = <27 GPIO_ACTIVE_LOW>;
                output-high;
 };
 
 &gpio3 {
-       zgb_rst {
+       zgb-rst-hog {
                gpio-hog;
                gpios = <18 GPIO_ACTIVE_LOW>;
                output-low;
                line-name = "zigbee_reset";
        };
 
-       zgb_boot {
+       zgb-boot-hog {
                gpio-hog;
                gpios = <19 GPIO_ACTIVE_HIGH>;
                output-high;
index 039a9ab..859e760 100644 (file)
                                #mbox-cells = <1>;
                                ti,mbox-num-users = <4>;
                                ti,mbox-num-fifos = <8>;
-                               mbox_wkupm3: wkup_m3 {
+                               mbox_wkupm3: mbox-wkup-m3 {
                                        ti,mbox-send-noirq;
                                        ti,mbox-tx = <0 0 0>;
                                        ti,mbox-rx = <0 0 3>;
                        };
                };
 
-               target-module@ae000 {                   /* 0x481ae000, ap 56 3a.0 */
+               gpio3_target: target-module@ae000 {             /* 0x481ae000, ap 56 3a.0 */
                        compatible = "ti,sysc-omap2", "ti,sysc";
                        reg = <0xae000 0x4>,
                              <0xae010 0x4>,
                                status = "disabled";
                                ranges = <0 0 0x1000>;
 
-                               ecap0: ecap@100 {
-                                       compatible = "ti,am3352-ecap",
-                                                    "ti,am33xx-ecap";
+                               ecap0: pwm@100 {
+                                       compatible = "ti,am3352-ecap";
                                        #pwm-cells = <3>;
                                        reg = <0x100 0x80>;
                                        clocks = <&l4ls_gclk>;
                                        clock-names = "fck";
-                                       interrupts = <31>;
-                                       interrupt-names = "ecap0";
                                        status = "disabled";
                                };
 
                                };
 
                                ehrpwm0: pwm@200 {
-                                       compatible = "ti,am3352-ehrpwm",
-                                                    "ti,am33xx-ehrpwm";
+                                       compatible = "ti,am3352-ehrpwm";
                                        #pwm-cells = <3>;
                                        reg = <0x200 0x80>;
                                        clocks = <&ehrpwm0_tbclk>, <&l4ls_gclk>;
                                status = "disabled";
                                ranges = <0 0 0x1000>;
 
-                               ecap1: ecap@100 {
-                                       compatible = "ti,am3352-ecap",
-                                                    "ti,am33xx-ecap";
+                               ecap1: pwm@100 {
+                                       compatible = "ti,am3352-ecap";
                                        #pwm-cells = <3>;
                                        reg = <0x100 0x80>;
                                        clocks = <&l4ls_gclk>;
                                        clock-names = "fck";
-                                       interrupts = <47>;
-                                       interrupt-names = "ecap1";
                                        status = "disabled";
                                };
 
                                };
 
                                ehrpwm1: pwm@200 {
-                                       compatible = "ti,am3352-ehrpwm",
-                                                    "ti,am33xx-ehrpwm";
+                                       compatible = "ti,am3352-ehrpwm";
                                        #pwm-cells = <3>;
                                        reg = <0x200 0x80>;
                                        clocks = <&ehrpwm1_tbclk>, <&l4ls_gclk>;
                                status = "disabled";
                                ranges = <0 0 0x1000>;
 
-                               ecap2: ecap@100 {
-                                       compatible = "ti,am3352-ecap",
-                                                    "ti,am33xx-ecap";
+                               ecap2: pwm@100 {
+                                       compatible = "ti,am3352-ecap";
                                        #pwm-cells = <3>;
                                        reg = <0x100 0x80>;
                                        clocks = <&l4ls_gclk>;
                                        clock-names = "fck";
-                                       interrupts = <61>;
-                                       interrupt-names = "ecap2";
                                        status = "disabled";
                                };
 
                                };
 
                                ehrpwm2: pwm@200 {
-                                       compatible = "ti,am3352-ehrpwm",
-                                                    "ti,am33xx-ehrpwm";
+                                       compatible = "ti,am3352-ehrpwm";
                                        #pwm-cells = <3>;
                                        reg = <0x200 0x80>;
                                        clocks = <&ehrpwm2_tbclk>, <&l4ls_gclk>;
index 6e4d05d..e267768 100644 (file)
        pinctrl-0 = <&gpio0_pins>;
        status = "okay";
 
-       p23 {
+       sel-emmc-nand-hog {
                gpio-hog;
                gpios = <23 GPIO_ACTIVE_HIGH>;
                /* SelEMMCorNAND selects between eMMC and NAND:
        status = "okay";
 };
 
+&gpio5_target {
+       ti,no-reset-on-init;
+};
+
 &gpio5 {
        pinctrl-names = "default";
        pinctrl-0 = <&display_mux_pins>;
        status = "okay";
-       ti,no-reset-on-init;
 
-       p8 {
+       sel-lcd-hdmi-hog {
                /*
                 * SelLCDorHDMI selects between display and audio paths:
                 * Low: HDMI display with audio via HDMI
index e217ffc..40ef397 100644 (file)
                        ranges = <0x0 0x9000 0x1000>;
 
                        uart0: serial@0 {
-                               compatible = "ti,am4372-uart","ti,omap2-uart";
+                               compatible = "ti,am4372-uart";
                                reg = <0x0 0x2000>;
                                interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
                        };
                        ranges = <0x0 0x22000 0x1000>;
 
                        uart1: serial@0 {
-                               compatible = "ti,am4372-uart","ti,omap2-uart";
+                               compatible = "ti,am4372-uart";
                                reg = <0x0 0x2000>;
                                interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
                                status = "disabled";
                        ranges = <0x0 0x24000 0x1000>;
 
                        uart2: serial@0 {
-                               compatible = "ti,am4372-uart","ti,omap2-uart";
+                               compatible = "ti,am4372-uart";
                                reg = <0x0 0x2000>;
                                interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
                                status = "disabled";
                                #mbox-cells = <1>;
                                ti,mbox-num-users = <4>;
                                ti,mbox-num-fifos = <8>;
-                               mbox_wkupm3: wkup_m3 {
+                               mbox_wkupm3: mbox-wkup-m3 {
                                        ti,mbox-send-noirq;
                                        ti,mbox-tx = <0 0 0>;
                                        ti,mbox-rx = <0 0 3>;
                        ranges = <0x0 0xa6000 0x1000>;
 
                        uart3: serial@0 {
-                               compatible = "ti,am4372-uart","ti,omap2-uart";
+                               compatible = "ti,am4372-uart";
                                reg = <0x0 0x2000>;
                                interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
                                status = "disabled";
                        ranges = <0x0 0xa8000 0x1000>;
 
                        uart4: serial@0 {
-                               compatible = "ti,am4372-uart","ti,omap2-uart";
+                               compatible = "ti,am4372-uart";
                                reg = <0x0 0x2000>;
                                interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
                                status = "disabled";
                        ranges = <0x0 0xaa000 0x1000>;
 
                        uart5: serial@0 {
-                               compatible = "ti,am4372-uart","ti,omap2-uart";
+                               compatible = "ti,am4372-uart";
                                reg = <0x0 0x2000>;
                                interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
                                status = "disabled";
                                ranges = <0 0 0x1000>;
                                status = "disabled";
 
-                               ecap0: ecap@100 {
+                               ecap0: pwm@100 {
                                        compatible = "ti,am4372-ecap",
-                                                    "ti,am3352-ecap",
-                                                    "ti,am33xx-ecap";
+                                                    "ti,am3352-ecap";
                                        #pwm-cells = <3>;
                                        reg = <0x100 0x80>;
                                        clocks = <&l4ls_gclk>;
 
                                ehrpwm0: pwm@200 {
                                        compatible = "ti,am4372-ehrpwm",
-                                                    "ti,am3352-ehrpwm",
-                                                    "ti,am33xx-ehrpwm";
+                                                    "ti,am3352-ehrpwm";
                                        #pwm-cells = <3>;
                                        reg = <0x200 0x80>;
                                        clocks = <&ehrpwm0_tbclk>, <&l4ls_gclk>;
                                ranges = <0 0 0x1000>;
                                status = "disabled";
 
-                               ecap1: ecap@100 {
+                               ecap1: pwm@100 {
                                        compatible = "ti,am4372-ecap",
-                                                    "ti,am3352-ecap",
-                                                    "ti,am33xx-ecap";
+                                                    "ti,am3352-ecap";
                                        #pwm-cells = <3>;
                                        reg = <0x100 0x80>;
                                        clocks = <&l4ls_gclk>;
 
                                ehrpwm1: pwm@200 {
                                        compatible = "ti,am4372-ehrpwm",
-                                                    "ti,am3352-ehrpwm",
-                                                    "ti,am33xx-ehrpwm";
+                                                    "ti,am3352-ehrpwm";
                                        #pwm-cells = <3>;
                                        reg = <0x200 0x80>;
                                        clocks = <&ehrpwm1_tbclk>, <&l4ls_gclk>;
                                ranges = <0 0 0x1000>;
                                status = "disabled";
 
-                               ecap2: ecap@100 {
+                               ecap2: pwm@100 {
                                        compatible = "ti,am4372-ecap",
-                                                    "ti,am3352-ecap",
-                                                    "ti,am33xx-ecap";
+                                                    "ti,am3352-ecap";
                                        #pwm-cells = <3>;
                                        reg = <0x100 0x80>;
                                        clocks = <&l4ls_gclk>;
 
                                ehrpwm2: pwm@200 {
                                        compatible = "ti,am4372-ehrpwm",
-                                                    "ti,am3352-ehrpwm",
-                                                    "ti,am33xx-ehrpwm";
+                                                    "ti,am3352-ehrpwm";
                                        #pwm-cells = <3>;
                                        reg = <0x200 0x80>;
                                        clocks = <&ehrpwm2_tbclk>, <&l4ls_gclk>;
 
                                ehrpwm3: pwm@200 {
                                        compatible = "ti,am4372-ehrpwm",
-                                                    "ti,am3352-ehrpwm",
-                                                    "ti,am33xx-ehrpwm";
+                                                    "ti,am3352-ehrpwm";
                                        #pwm-cells = <3>;
                                        reg = <0x200 0x80>;
                                        clocks = <&ehrpwm3_tbclk>, <&l4ls_gclk>;
 
                                ehrpwm4: pwm@48308200 {
                                        compatible = "ti,am4372-ehrpwm",
-                                                    "ti,am3352-ehrpwm",
-                                                    "ti,am33xx-ehrpwm";
+                                                    "ti,am3352-ehrpwm";
                                        #pwm-cells = <3>;
                                        reg = <0x200 0x80>;
                                        clocks = <&ehrpwm4_tbclk>, <&l4ls_gclk>;
 
                                ehrpwm5: pwm@200 {
                                        compatible = "ti,am4372-ehrpwm",
-                                                    "ti,am3352-ehrpwm",
-                                                    "ti,am33xx-ehrpwm";
+                                                    "ti,am3352-ehrpwm";
                                        #pwm-cells = <3>;
                                        reg = <0x200 0x80>;
                                        clocks = <&ehrpwm5_tbclk>, <&l4ls_gclk>;
                        };
                };
 
-               target-module@22000 {                   /* 0x48322000, ap 116 64.0 */
+               gpio5_target: target-module@22000 {             /* 0x48322000, ap 116 64.0 */
                        compatible = "ti,sysc-omap2", "ti,sysc";
                        reg = <0x22000 0x4>,
                              <0x22010 0x4>,
index f517d1e..aae0af1 100644 (file)
        pinctrl-0 = <&display_mux_pins>;
        status = "okay";
 
-       p1 {
+       sel-lcd-hdmi-hog {
                /*
                 * SelLCDorHDMI selects between display and audio paths:
                 * Low: HDMI display with audio via HDMI
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&spi0_pins_default>;
        pinctrl-1 = <&spi0_pins_sleep>;
-       ti,pindir-d0-out-d1-in = <1>;
+       ti,pindir-d0-out-d1-in;
 };
 
 &spi1 {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&spi1_pins_default>;
        pinctrl-1 = <&spi1_pins_sleep>;
-       ti,pindir-d0-out-d1-in = <1>;
+       ti,pindir-d0-out-d1-in;
 };
 
 &usb2_phy1 {
index 0d5fe2b..aed8156 100644 (file)
 
 &mailbox5 {
        status = "okay";
-       mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
+       mbox_ipu1_ipc3x: mbox-ipu1-ipc3x {
                status = "okay";
        };
-       mbox_dsp1_ipc3x: mbox_dsp1_ipc3x {
+       mbox_dsp1_ipc3x: mbox-dsp1-ipc3x {
                status = "okay";
        };
 };
 
 &mailbox6 {
        status = "okay";
-       mbox_ipu2_ipc3x: mbox_ipu2_ipc3x {
+       mbox_ipu2_ipc3x: mbox-ipu2-ipc3x {
                status = "okay";
        };
-       mbox_dsp2_ipc3x: mbox_dsp2_ipc3x {
+       mbox_dsp2_ipc3x: mbox-dsp2-ipc3x {
                status = "okay";
        };
 };
        >;
 };
 
-&gpio3 {
-       status = "okay";
+&gpio3_target {
        ti,no-reset-on-init;
 };
 
-&gpio2 {
+&gpio2_target {
        status = "okay";
        ti,no-reset-on-init;
 };
index 8bec21e..583a241 100644 (file)
@@ -13,7 +13,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=tty0 console=ttyS4,115200 earlyprintk";
+               bootargs = "console=tty0 console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
diff --git a/arch/arm/boot/dts/aspeed-ast2600-evb-a1.dts b/arch/arm/boot/dts/aspeed-ast2600-evb-a1.dts
new file mode 100644 (file)
index 0000000..dd71480
--- /dev/null
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+// Copyright 2021 IBM Corp.
+
+#include "aspeed-ast2600-evb.dts"
+
+/ {
+       model = "AST2600 A1 EVB";
+
+       /delete-node/regulator-vcc-sdhci0;
+       /delete-node/regulator-vcc-sdhci1;
+       /delete-node/regulator-vccq-sdhci0;
+       /delete-node/regulator-vccq-sdhci1;
+};
+
+/delete-node/ &sdc;
index 2772796..b7eb552 100644 (file)
@@ -4,6 +4,7 @@
 /dts-v1/;
 
 #include "aspeed-g6.dtsi"
+#include <dt-bindings/gpio/aspeed-gpio.h>
 
 / {
        model = "AST2600 EVB";
                device_type = "memory";
                reg = <0x80000000 0x80000000>;
        };
+
+       vcc_sdhci0: regulator-vcc-sdhci0 {
+               compatible = "regulator-fixed";
+               regulator-name = "SDHCI0 Vcc";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               gpios = <&gpio0 ASPEED_GPIO(V, 0) GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       vccq_sdhci0: regulator-vccq-sdhci0 {
+               compatible = "regulator-gpio";
+               regulator-name = "SDHCI0 VccQ";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <3300000>;
+               gpios = <&gpio0 ASPEED_GPIO(V, 1) GPIO_ACTIVE_HIGH>;
+               gpios-states = <1>;
+               states = <3300000 1>,
+                        <1800000 0>;
+       };
+
+       vcc_sdhci1: regulator-vcc-sdhci1 {
+               compatible = "regulator-fixed";
+               regulator-name = "SDHCI1 Vcc";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               gpios = <&gpio0 ASPEED_GPIO(V, 2) GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       vccq_sdhci1: regulator-vccq-sdhci1 {
+               compatible = "regulator-gpio";
+               regulator-name = "SDHCI1 VccQ";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <3300000>;
+               gpios = <&gpio0 ASPEED_GPIO(V, 3) GPIO_ACTIVE_HIGH>;
+               gpios-states = <1>;
+               states = <3300000 1>,
+                        <1800000 0>;
+       };
 };
 
 &mdio0 {
 &emmc {
        non-removable;
        bus-width = <4>;
-       max-frequency = <52000000>;
+       max-frequency = <100000000>;
+       clk-phase-mmc-hs200 = <9>, <225>;
 };
 
 &rtc {
                m25p,fast-read;
                label = "bmc";
                spi-max-frequency = <50000000>;
-
-               partitions {
-                       compatible = "fixed-partitions";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-
-                       u-boot@0 {
-                               reg = <0x0 0xe0000>; // 896KB
-                               label = "u-boot";
-                       };
-
-                       u-boot-env@e0000 {
-                               reg = <0xe0000 0x20000>; // 128KB
-                               label = "u-boot-env";
-                       };
-
-                       kernel@100000 {
-                               reg = <0x100000 0x900000>; // 9MB
-                               label = "kernel";
-                       };
-
-                       rofs@a00000 {
-                               reg = <0xa00000 0x2000000>; // 32MB
-                               label = "rofs";
-                       };
-
-                       rwfs@6000000 {
-                               reg = <0x2a00000 0x1600000>; // 22MB
-                               label = "rwfs";
-                       };
-               };
+#include "openbmc-flash-layout-64.dtsi"
        };
 };
 
 &uhci {
        status = "okay";
 };
+
+&sdc {
+       status = "okay";
+};
+
+/*
+ * The signal voltage of sdhci0 and sdhci1 on AST2600-A2 EVB is able to be
+ * toggled by GPIO pins.
+ * In the reference design, GPIOV0 of AST2600-A2 EVB is connected to the
+ * power load switch that provides 3.3v to sdhci0 vdd, GPIOV1 is connected to
+ * a 1.8v and a 3.3v power load switch that provides signal voltage to
+ * sdhci0 bus.
+ * If GPIOV0 is active high, sdhci0 is enabled, otherwise, sdhci0 is disabled.
+ * If GPIOV1 is active high, 3.3v power load switch is enabled, sdhci0 signal
+ * voltage is 3.3v, otherwise, 1.8v power load switch will be enabled,
+ * sdhci0 signal voltage becomes 1.8v.
+ * AST2600-A2 EVB also supports toggling signal voltage for sdhci1.
+ * The design is the same as sdhci0, it uses GPIOV2 as power-gpio and GPIOV3
+ * as power-switch-gpio.
+ */
+&sdhci0 {
+       status = "okay";
+       bus-width = <4>;
+       max-frequency = <100000000>;
+       sdhci-drive-type = /bits/ 8 <3>;
+       sdhci-caps-mask = <0x7 0x0>;
+       sdhci,wp-inverted;
+       vmmc-supply = <&vcc_sdhci0>;
+       vqmmc-supply = <&vccq_sdhci0>;
+       clk-phase-sd-hs = <7>, <200>;
+};
+
+&sdhci1 {
+       status = "okay";
+       bus-width = <4>;
+       max-frequency = <100000000>;
+       sdhci-drive-type = /bits/ 8 <3>;
+       sdhci-caps-mask = <0x7 0x0>;
+       sdhci,wp-inverted;
+       vmmc-supply = <&vcc_sdhci1>;
+       vqmmc-supply = <&vccq_sdhci1>;
+       clk-phase-sd-hs = <7>, <200>;
+};
index 6aeb47c..79d1784 100644 (file)
@@ -34,7 +34,7 @@
        };
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
        leds {
                compatible = "gpio-leds";
index 8f5ec22..57b0c45 100644 (file)
@@ -9,7 +9,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
                        linux,code = <ASPEED_GPIO(Q, 5)>;
                };
 
+               psu1_vin_good {
+                       label = "PSU1_VIN_GOOD";
+                       gpios = <&gpio ASPEED_GPIO(H, 4) GPIO_ACTIVE_LOW>;
+                       linux,code = <ASPEED_GPIO(H, 4)>;
+               };
+
+               psu2_vin_good {
+                       label = "PSU2_VIN_GOOD";
+                       gpios = <&gpio ASPEED_GPIO(H, 5) GPIO_ACTIVE_LOW>;
+                       linux,code = <ASPEED_GPIO(H, 5)>;
+               };
+
+               psu1_present {
+                       label = "PSU1_PRESENT";
+                       gpios = <&gpio ASPEED_GPIO(I, 0) GPIO_ACTIVE_LOW>;
+                       linux,code = <ASPEED_GPIO(I, 0)>;
+               };
+
+               psu2_present {
+                       label = "PSU2_PRESENT";
+                       gpios = <&gpio ASPEED_GPIO(I, 1) GPIO_ACTIVE_LOW>;
+                       linux,code = <ASPEED_GPIO(I, 1)>;
+               };
+
        };
 
        gpioA0mux: mux-controller {
                m25p,fast-read;
                label = "bmc";
                /* spi-max-frequency = <50000000>; */
-#include "openbmc-flash-layout.dtsi"
+#include "openbmc-flash-layout-64.dtsi"
        };
 };
 
        status = "okay";
 };
 
+&mac0 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_rmii1_default>;
+       clocks = <&syscon ASPEED_CLK_GATE_MAC1CLK>,
+                <&syscon ASPEED_CLK_MAC1RCLK>;
+       clock-names = "MACCLK", "RCLK";
+       use-ncsi;
+};
+
 &mac1 {
        status = "okay";
        pinctrl-names = "default";
        status = "okay";
 };
 
+&i2c10 {
+       status = "okay";
+       adm1278@10 {
+               compatible = "adi,adm1278";
+               reg = <0x10>;
+       };
+
+       adm1278@11 {
+               compatible = "adi,adm1278";
+               reg = <0x11>;
+       };
+};
+
 &gfx {
        status = "okay";
        memory-region = <&gfx_memory>;
                        "S1_DDR_SAVE","","",
        /*G0-G7*/       "S0_FW_BOOT_OK","SHD_REQ_L","","S0_OVERTEMP_L","","",
                        "","",
-       /*H0-H7*/       "","","","","","","","",
-       /*I0-I7*/       "","","S1_BMC_SPECIAL_BOOT","","","","","",
+       /*H0-H7*/       "","","","","PSU1_VIN_GOOD","PSU2_VIN_GOOD","","",
+       /*I0-I7*/       "PSU1_PRESENT","PSU2_PRESENT","S1_BMC_SPECIAL_BOOT",
+                       "","","","","",
        /*J0-J7*/       "S0_HIGHTEMP_L","S0_FAULT_L","S0_SCP_AUTH_FAIL_L","",
                        "","","","",
        /*K0-K7*/       "","","","","","","","",
        /*O0-O7*/       "","","","","","","","",
        /*P0-P7*/       "","","","","","","","",
        /*Q0-Q7*/       "","","","","","UID_BUTTON","","",
-       /*R0-R7*/       "","","BMC_EXT_HIGHTEMP_L","","","RESET_BUTTON","","",
+       /*R0-R7*/       "","","BMC_EXT_HIGHTEMP_L","OCP_AUX_PWREN",
+                       "OCP_MAIN_PWREN","RESET_BUTTON","","",
        /*S0-S7*/       "","","","","","","","",
        /*T0-T7*/       "","","","","","","","",
        /*U0-U7*/       "","","","","","","","",
index c2ece0b..3395de9 100644 (file)
@@ -10,7 +10,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index 2c29ac0..7c6af7f 100644 (file)
@@ -10,7 +10,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index dcab6e7..33e413c 100644 (file)
@@ -15,7 +15,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=tty0 console=ttyS4,115200 earlyprintk";
+               bootargs = "console=tty0 console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index 5ef88c3..01dace8 100644 (file)
@@ -55,7 +55,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index 2fb8b14..90a3f48 100644 (file)
 
        chosen {
                stdout-path = &uart1;
-               bootargs = "console=ttyS1,9600n8 root=/dev/ram rw earlyprintk";
+               bootargs = "console=ttyS1,9600n8 root=/dev/ram rw earlycon";
        };
 
        ast-adc-hwmon {
index 7b4b2b1..b6b1635 100644 (file)
@@ -37,7 +37,7 @@
        };
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index 3295c8c..d26a9e1 100644 (file)
                        linux,code = <12>;
                };
        };
+
+       leds {
+               compatible = "gpio-leds";
+
+               /* RTC battery fault LED at the back */
+               led-rtc-battery {
+                       gpios = <&gpio0 ASPEED_GPIO(H, 0) GPIO_ACTIVE_LOW>;
+               };
+
+               /* BMC Card fault LED at the back */
+               led-bmc {
+                       gpios = <&gpio0 ASPEED_GPIO(H, 1) GPIO_ACTIVE_LOW>;
+               };
+
+               /* Enclosure Identify LED at the back */
+               led-rear-enc-id0 {
+                       gpios = <&gpio0 ASPEED_GPIO(H, 2) GPIO_ACTIVE_LOW>;
+               };
+
+               /* Enclosure fault LED at the back */
+               led-rear-enc-fault0 {
+                       gpios = <&gpio0 ASPEED_GPIO(H, 3) GPIO_ACTIVE_LOW>;
+               };
+
+               /* PCIE slot power LED */
+               led-pcieslot-power {
+                       gpios = <&gpio0 ASPEED_GPIO(P, 4) GPIO_ACTIVE_LOW>;
+               };
+       };
 };
 
 &gpio0 {
        /*F0-F7*/       "PIN_HOLE_RESET_IN_N","","",
                                "PIN_HOLE_RESET_OUT_N","","","","",
        /*G0-G7*/       "","","","","","","","",
-       /*H0-H7*/       "","","","","","","","",
+       /*H0-H7*/       "led-rtc-battery","led-bmc","led-rear-enc-id0","led-rear-enc-fault0","","","","",
        /*I0-I7*/       "","","","","","","","",
        /*J0-J7*/       "","","","","","","","",
        /*K0-K7*/       "","","","","","","","",
        /*M0-M7*/       "","","","","","","","",
        /*N0-N7*/       "","","","","","","","",
        /*O0-O7*/       "","","","","","","","",
-       /*P0-P7*/       "","","","","","","","",
+       /*P0-P7*/       "","","","","led-pcieslot-power","","","",
        /*Q0-Q7*/       "","","","","","","","",
        /*R0-R7*/       "","","","","","I2C_FLASH_MICRO_N","","",
        /*S0-S7*/       "","","","","","","","",
 
 &i2c1 {
        status = "okay";
+};
+
+&i2c2 {
+       status = "okay";
+};
+
+&i2c3 {
+       status = "okay";
+
+       eeprom@54 {
+               compatible = "atmel,24c128";
+               reg = <0x54>;
+       };
+
+       power-supply@68 {
+               compatible = "ibm,cffps";
+               reg = <0x68>;
+       };
+
+       power-supply@69 {
+               compatible = "ibm,cffps";
+               reg = <0x69>;
+       };
+
+       power-supply@6a {
+               compatible = "ibm,cffps";
+               reg = <0x6a>;
+       };
+
+       power-supply@6b {
+               compatible = "ibm,cffps";
+               reg = <0x6b>;
+       };
+};
+
+&i2c4 {
+       status = "okay";
 
-       pca2: pca9552@61 {
+       pca2: pca9552@65 {
                compatible = "nxp,pca9552";
-               reg = <0x61>;
+               reg = <0x65>;
                #address-cells = <1>;
                #size-cells = <0>;
 
                        reg = <9>;
                        type = <PCA955X_TYPE_GPIO>;
                };
+       };
+
+       i2c-switch@70 {
+               compatible = "nxp,pca9546";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               status = "okay";
+               i2c-mux-idle-disconnect;
+
+               i2c4mux0chn0: i2c@0 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0>;
+                       eeprom@52 {
+                               compatible = "atmel,24c64";
+                               reg = <0x52>;
+                       };
+
+                       pca_cable_card_c01: pca9551@62 {
+                               compatible = "nxp,pca9551";
+                               reg = <0x62>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               gpio-controller;
+                               #gpio-cells = <2>;
+
+                               led@0 {
+                                       label = "cablecard-c01-cxp-top";
+                                       reg = <0>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@1 {
+                                       label = "cablecard-c01-cxp-bot";
+                                       reg = <1>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               gpio@2 {
+                                       reg = <2>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@3 {
+                                       reg = <3>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@4 {
+                                       reg = <4>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@5 {
+                                       reg = <5>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@6 {
+                                       reg = <6>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@7 {
+                                       reg = <7>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+                       };
+               };
+
+               i2c4mux0chn1: i2c@1 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <1>;
+                       eeprom@50 {
+                               compatible = "atmel,24c64";
+                               reg = <0x50>;
+                       };
+
+                       pca_cable_card_c02: pca9551@60 {
+                               compatible = "nxp,pca9551";
+                               reg = <0x60>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               gpio-controller;
+                               #gpio-cells = <2>;
+
+                               led@0 {
+                                       label = "cablecard-c02-cxp-top";
+                                       reg = <0>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@1 {
+                                       label = "cablecard-c02-cxp-bot";
+                                       reg = <1>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               gpio@2 {
+                                       reg = <2>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@3 {
+                                       reg = <3>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@4 {
+                                       reg = <4>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@5 {
+                                       reg = <5>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@6 {
+                                       reg = <6>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@7 {
+                                       reg = <7>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+                       };
+               };
+
+               i2c4mux0chn2: i2c@2 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <2>;
+                       eeprom@51 {
+                               compatible = "atmel,24c64";
+                               reg = <0x51>;
+                       };
+
+                       pca_cable_card_c03: pca9551@61 {
+                               compatible = "nxp,pca9551";
+                               reg = <0x61>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               gpio-controller;
+                               #gpio-cells = <2>;
+
+                               led@0 {
+                                       label = "cablecard-c03-cxp-top";
+                                       reg = <0>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@1 {
+                                       label = "cablecard-c03-cxp-bot";
+                                       reg = <1>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               gpio@2 {
+                                       reg = <2>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
 
+                               gpio@3 {
+                                       reg = <3>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@4 {
+                                       reg = <4>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@5 {
+                                       reg = <5>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@6 {
+                                       reg = <6>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@7 {
+                                       reg = <7>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+                       };
+               };
        };
+};
+
+&i2c5 {
+       status = "okay";
 
-       pca3: pca9552@62 {
+       pca3: pca9552@66 {
                compatible = "nxp,pca9552";
-               reg = <0x62>;
+               reg = <0x66>;
                #address-cells = <1>;
                #size-cells = <0>;
 
 
        };
 
-};
+       i2c-switch@70 {
+               compatible = "nxp,pca9546";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               status = "okay";
+               i2c-mux-idle-disconnect;
 
-&i2c2 {
-       status = "okay";
-};
+               i2c5mux0chn0: i2c@0 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0>;
+                       eeprom@50 {
+                               compatible = "atmel,24c64";
+                               reg = <0x50>;
+                       };
 
-&i2c3 {
-       status = "okay";
+                       pca_cable_card_c04: pca9551@60 {
+                               compatible = "nxp,pca9551";
+                               reg = <0x60>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
 
-       eeprom@54 {
-               compatible = "atmel,24c128";
-               reg = <0x54>;
-       };
+                               gpio-controller;
+                               #gpio-cells = <2>;
 
-       power-supply@68 {
-               compatible = "ibm,cffps";
-               reg = <0x68>;
+                               led@0 {
+                                       label = "cablecard-c04-cxp-top";
+                                       reg = <0>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@1 {
+                                       label = "cablecard-c04-cxp-bot";
+                                       reg = <1>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               gpio@2 {
+                                       reg = <2>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@3 {
+                                       reg = <3>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@4 {
+                                       reg = <4>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@5 {
+                                       reg = <5>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@6 {
+                                       reg = <6>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@7 {
+                                       reg = <7>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+                       };
+               };
+
+               i2c5mux0chn1: i2c@1 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <1>;
+                       eeprom@51 {
+                               compatible = "atmel,24c64";
+                               reg = <0x51>;
+                       };
+
+                       pca_cable_card_c05: pca9551@61 {
+                               compatible = "nxp,pca9551";
+                               reg = <0x61>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               gpio-controller;
+                               #gpio-cells = <2>;
+
+                               led@0 {
+                                       label = "cablecard-c05-cxp-top";
+                                       reg = <0>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@1 {
+                                       label = "cablecard-c05-cxp-bot";
+                                       reg = <1>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               gpio@2 {
+                                       reg = <2>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@3 {
+                                       reg = <3>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@4 {
+                                       reg = <4>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@5 {
+                                       reg = <5>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@6 {
+                                       reg = <6>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@7 {
+                                       reg = <7>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+                       };
+               };
+
+               i2c5mux0chn2: i2c@2 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <2>;
+                       eeprom@52 {
+                               compatible = "atmel,24c64";
+                               reg = <0x52>;
+                       };
+
+                       pca_cable_card_c06: pca9551@62 {
+                               compatible = "nxp,pca9551";
+                               reg = <0x62>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               gpio-controller;
+                               #gpio-cells = <2>;
+
+                               led@0 {
+                                       label = "cablecard-c06-cxp-top";
+                                       reg = <0>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@1 {
+                                       label = "cablecard-c06-cxp-bot";
+                                       reg = <1>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               gpio@2 {
+                                       reg = <2>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@3 {
+                                       reg = <3>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@4 {
+                                       reg = <4>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@5 {
+                                       reg = <5>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@6 {
+                                       reg = <6>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@7 {
+                                       reg = <7>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+                       };
+               };
+
+               i2c5mux0chn3: i2c@3 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <3>;
+                       eeprom@53 {
+                               compatible = "atmel,24c64";
+                               reg = <0x53>;
+                       };
+
+                       pca_cable_card_c07: pca9551@63 {
+                               compatible = "nxp,pca9551";
+                               reg = <0x63>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               gpio-controller;
+                               #gpio-cells = <2>;
+
+                               led@0 {
+                                       label = "cablecard-c07-cxp-top";
+                                       reg = <0>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@1 {
+                                       label = "cablecard-c07-cxp-bot";
+                                       reg = <1>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               gpio@2 {
+                                       reg = <2>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@3 {
+                                       reg = <3>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@4 {
+                                       reg = <4>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@5 {
+                                       reg = <5>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@6 {
+                                       reg = <6>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@7 {
+                                       reg = <7>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+                       };
+               };
+       };
+};
+
+&i2c6 {
+       status = "okay";
+
+       i2c-switch@70 {
+               compatible = "nxp,pca9546";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               status = "okay";
+               i2c-mux-idle-disconnect;
+
+               i2c6mux0chn0: i2c@0 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0>;
+                       eeprom@50 {
+                       compatible = "atmel,24c64";
+                       reg = <0x50>;
+                       };
+
+                       pca_cable_card_c08: pca9551@60 {
+                               compatible = "nxp,pca9551";
+                               reg = <0x60>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               gpio-controller;
+                               #gpio-cells = <2>;
+
+                               led@0 {
+                                       label = "cablecard-c08-cxp-top";
+                                       reg = <0>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@1 {
+                                       label = "cablecard-c08-cxp-bot";
+                                       reg = <1>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               gpio@2 {
+                                       reg = <2>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@3 {
+                                       reg = <3>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@4 {
+                                       reg = <4>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@5 {
+                                       reg = <5>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@6 {
+                                       reg = <6>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@7 {
+                                       reg = <7>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+                       };
+               };
+
+               i2c6mux0chn1: i2c@1 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <1>;
+                       eeprom@52 {
+                               compatible = "atmel,24c64";
+                               reg = <0x52>;
+                       };
+
+                       pca_cable_card_c09: pca9551@62 {
+                               compatible = "nxp,pca9551";
+                               reg = <0x62>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               gpio-controller;
+                               #gpio-cells = <2>;
+
+                               led@0 {
+                                       label = "cablecard-c09-cxp-top";
+                                       reg = <0>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@1 {
+                                       label = "cablecard-c09-cxp-bot";
+                                       reg = <1>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               gpio@2 {
+                                       reg = <2>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@3 {
+                                       reg = <3>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@4 {
+                                       reg = <4>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@5 {
+                                       reg = <5>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@6 {
+                                       reg = <6>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@7 {
+                                       reg = <7>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+                       };
+               };
+
+               i2c6mux0chn2: i2c@2 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <2>;
+                       eeprom@53 {
+                               compatible = "atmel,24c64";
+                               reg = <0x53>;
+                       };
+
+                       pca_cable_card_c10: pca9551@63 {
+                               compatible = "nxp,pca9551";
+                               reg = <0x63>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               gpio-controller;
+                               #gpio-cells = <2>;
+
+                               led@0 {
+                                       label = "cablecard-c10-cxp-top";
+                                       reg = <0>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@1 {
+                                       label = "cablecard-c10-cxp-bot";
+                                       reg = <1>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               gpio@2 {
+                                       reg = <2>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@3 {
+                                       reg = <3>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@4 {
+                                       reg = <4>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@5 {
+                                       reg = <5>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@6 {
+                                       reg = <6>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@7 {
+                                       reg = <7>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+                       };
+               };
+
+               i2c6mux0chn3: i2c@3 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <3>;
+                       eeprom@51 {
+                               compatible = "atmel,24c64";
+                               reg = <0x51>;
+                       };
+
+                       pca_cable_card_c11: pca9551@61 {
+                               compatible = "nxp,pca9551";
+                               reg = <0x61>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               gpio-controller;
+                               #gpio-cells = <2>;
+
+                               led@0 {
+                                       label = "cablecard-c11-cxp-top";
+                                       reg = <0>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@1 {
+                                       label = "cablecard-c11-cxp-bot";
+                                       reg = <1>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               gpio@2 {
+                                       reg = <2>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@3 {
+                                       reg = <3>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@4 {
+                                       reg = <4>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@5 {
+                                       reg = <5>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@6 {
+                                       reg = <6>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@7 {
+                                       reg = <7>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+                       };
+               };
+       };
+
+       pca_pcie_slot: pca9552@65 {
+               compatible = "nxp,pca9552";
+               reg = <0x65>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               gpio@0 {
+                       reg = <0>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               led@1 {
+                       label = "pcieslot-c01";
+                       reg = <1>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@2 {
+                       label = "pcieslot-c02";
+                       reg = <2>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@3 {
+                       label = "pcieslot-c03";
+                       reg = <3>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@4 {
+                       label = "pcieslot-c04";
+                       reg = <4>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@5 {
+                       label = "pcieslot-c05";
+                       reg = <5>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@6 {
+                       label = "pcieslot-c06";
+                       reg = <6>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@7 {
+                       label = "pcieslot-c07";
+                       reg = <7>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@8 {
+                       label = "pcieslot-c08";
+                       reg = <8>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@9 {
+                       label = "pcieslot-c09";
+                       reg = <9>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@10 {
+                       label = "pcieslot-c10";
+                       reg = <10>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@11 {
+                       label = "pcieslot-c11";
+                       reg = <11>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               gpio@12 {
+                       reg = <12>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@13 {
+                       reg = <13>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@14 {
+                       reg = <14>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@15 {
+                       reg = <15>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
        };
+};
+
+&i2c7 {
+       status = "okay";
+
+       pic0_dimm: pca9552@31 {
+               compatible = "ibm,pca9552";
+               reg = <0x31>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               led@0 {
+                       label = "ddimm0";
+                       reg = <0>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@1 {
+                       label = "ddimm1";
+                       reg = <1>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@2 {
+                       label = "ddimm2";
+                       reg = <2>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@3 {
+                       label = "ddimm3";
+                       reg = <3>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@4 {
+                       label = "ddimm4";
+                       reg = <4>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@5 {
+                       label = "ddimm5";
+                       reg = <5>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@6 {
+                       label = "ddimm6";
+                       reg = <6>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@7 {
+                       label = "ddimm7";
+                       reg = <7>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@8 {
+                       label = "ddimm8";
+                       reg = <8>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@9 {
+                       label = "ddimm9";
+                       reg = <9>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@10 {
+                       label = "ddimm10";
+                       reg = <10>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@11 {
+                       label = "ddimm11";
+                       reg = <11>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@12 {
+                       label = "ddimm12";
+                       reg = <12>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@13 {
+                       label = "ddimm13";
+                       reg = <13>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@14 {
+                       label = "ddimm14";
+                       reg = <14>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@15 {
+                       label = "ddimm15";
+                       reg = <15>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+       };
+
+       pic1_dimm: pca9552@32 {
+               compatible = "ibm,pca9552";
+               reg = <0x32>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               led@0 {
+                       label = "ddimm16";
+                       reg = <0>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@1 {
+                       label = "ddimm17";
+                       reg = <1>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@2 {
+                       label = "ddimm18";
+                       reg = <2>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@3 {
+                       label = "ddimm19";
+                       reg = <3>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@4 {
+                       label = "ddimm20";
+                       reg = <4>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@5 {
+                       label = "ddimm21";
+                       reg = <5>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@6 {
+                       label = "ddimm22";
+                       reg = <6>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@7 {
+                       label = "ddimm23";
+                       reg = <7>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@8 {
+                       label = "ddimm24";
+                       reg = <8>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@9 {
+                       label = "ddimm25";
+                       reg = <9>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@10 {
+                       label = "ddimm26";
+                       reg = <10>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@11 {
+                       label = "ddimm27";
+                       reg = <11>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@12 {
+                       label = "ddimm28";
+                       reg = <12>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@13 {
+                       label = "ddimm29";
+                       reg = <13>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@14 {
+                       label = "ddimm30";
+                       reg = <14>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@15 {
+                       label = "ddimm31";
+                       reg = <15>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+       };
+
+       pic2_dimm: pca9552@33 {
+               compatible = "ibm,pca9552";
+               reg = <0x33>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               led@0 {
+                       label = "ddimm32";
+                       reg = <0>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@1 {
+                       label = "ddimm33";
+                       reg = <1>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@2 {
+                       label = "ddimm34";
+                       reg = <2>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@3 {
+                       label = "ddimm35";
+                       reg = <3>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@4 {
+                       label = "ddimm36";
+                       reg = <4>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@5 {
+                       label = "ddimm37";
+                       reg = <5>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@6 {
+                       label = "ddimm38";
+                       reg = <6>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@7 {
+                       label = "ddimm39";
+                       reg = <7>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@8 {
+                       label = "ddimm40";
+                       reg = <8>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@9 {
+                       label = "ddimm41";
+                       reg = <9>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@10 {
+                       label = "ddimm42";
+                       reg = <10>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@11 {
+                       label = "ddimm43";
+                       reg = <11>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@12 {
+                       label = "ddimm44";
+                       reg = <12>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@13 {
+                       label = "ddimm45";
+                       reg = <13>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@14 {
+                       label = "ddimm46";
+                       reg = <14>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@15 {
+                       label = "ddimm47";
+                       reg = <15>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+       };
+
+       pic3_dimm: pca9552@30 {
+               compatible = "ibm,pca9552";
+               reg = <0x30>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               led@0 {
+                       label = "ddimm48";
+                       reg = <0>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@1 {
+                       label = "ddimm49";
+                       reg = <1>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@2 {
+                       label = "ddimm50";
+                       reg = <2>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@3 {
+                       label = "ddimm51";
+                       reg = <3>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@4 {
+                       label = "ddimm52";
+                       reg = <4>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@5 {
+                       label = "ddimm53";
+                       reg = <5>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@6 {
+                       label = "ddimm54";
+                       reg = <6>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@7 {
+                       label = "ddimm55";
+                       reg = <7>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@8 {
+                       label = "ddimm56";
+                       reg = <8>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@9 {
+                       label = "ddimm57";
+                       reg = <9>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@10 {
+                       label = "ddimm58";
+                       reg = <10>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@11 {
+                       label = "ddimm59";
+                       reg = <11>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@12 {
+                       label = "ddimm60";
+                       reg = <12>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@13 {
+                       label = "ddimm61";
+                       reg = <13>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@14 {
+                       label = "ddimm62";
+                       reg = <14>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@15 {
+                       label = "ddimm63";
+                       reg = <15>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+       };
+
+       pic0_vrm_misc: pca9552@34 {
+               compatible = "ibm,pca9552";
+               reg = <0x34>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               led@0 {
+                       label = "planar";
+                       reg = <0>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@1 {
+                       label = "tpm";
+                       reg = <1>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@2 {
+                       label = "cpu3-c61";
+                       reg = <2>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@3 {
+                       label = "cpu0-c14";
+                       reg = <3>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@4 {
+                       label = "opencapi-connector3";
+                       reg = <4>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@5 {
+                       label = "opencapi-connector4";
+                       reg = <5>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@6 {
+                       label = "opencapi-connector5";
+                       reg = <6>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               gpio@7 {
+                       reg = <7>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
 
-       power-supply@69 {
-               compatible = "ibm,cffps";
-               reg = <0x69>;
-       };
+               led@8 {
+                       label = "vrm4";
+                       reg = <8>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
 
-       power-supply@6a {
-               compatible = "ibm,cffps";
-               reg = <0x6a>;
-       };
+               led@9 {
+                       label = "vrm5";
+                       reg = <9>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
 
-       power-supply@6b {
-               compatible = "ibm,cffps";
-               reg = <0x6b>;
-       };
-};
+               led@10 {
+                       label = "vrm6";
+                       reg = <10>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
 
-&i2c4 {
-       status = "okay";
+               led@11 {
+                       label = "vrm7";
+                       reg = <11>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
 
-       i2c-switch@70 {
-               compatible = "nxp,pca9546";
-               reg = <0x70>;
-               #address-cells = <1>;
-               #size-cells = <0>;
-               status = "okay";
-               i2c-mux-idle-disconnect;
+               led@12 {
+                       label = "vrm12";
+                       reg = <12>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
 
-               i2c4mux0chn0: i2c@0 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       reg = <0>;
-                       eeprom@52 {
-                               compatible = "atmel,24c64";
-                               reg = <0x52>;
-                       };
+               led@13 {
+                       label = "vrm13";
+                       reg = <13>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
                };
 
-               i2c4mux0chn1: i2c@1 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       reg = <1>;
-                       eeprom@50 {
-                               compatible = "atmel,24c64";
-                               reg = <0x50>;
-                       };
+               led@14 {
+                       label = "vrm14";
+                       reg = <14>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
                };
 
-               i2c4mux0chn2: i2c@2 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       reg = <2>;
-                       eeprom@51 {
-                               compatible = "atmel,24c64";
-                               reg = <0x51>;
-                       };
+               led@15 {
+                       label = "vrm15";
+                       reg = <15>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
                };
        };
-};
-
-&i2c5 {
-       status = "okay";
 
-       i2c-switch@70 {
-               compatible = "nxp,pca9546";
-               reg = <0x70>;
+       pic1_vrm_misc: pca9552@35 {
+               compatible = "ibm,pca9552";
+               reg = <0x35>;
                #address-cells = <1>;
                #size-cells = <0>;
-               status = "okay";
-               i2c-mux-idle-disconnect;
 
-               i2c5mux0chn0: i2c@0 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               led@0 {
+                       label = "dasd-backplane";
                        reg = <0>;
-                       eeprom@50 {
-                               compatible = "atmel,24c64";
-                               reg = <0x50>;
-                       };
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
                };
 
-               i2c5mux0chn1: i2c@1 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
+               led@1 {
+                       label = "power-distribution";
                        reg = <1>;
-                       eeprom@51 {
-                               compatible = "atmel,24c64";
-                               reg = <0x51>;
-                       };
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
                };
 
-               i2c5mux0chn2: i2c@2 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
+               led@2 {
+                       label = "cpu1-c19";
                        reg = <2>;
-                       eeprom@52 {
-                               compatible = "atmel,24c64";
-                               reg = <0x52>;
-                       };
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
                };
 
-               i2c5mux0chn3: i2c@3 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
+               led@3 {
+                       label = "cpu2-c56";
                        reg = <3>;
-                       eeprom@53 {
-                               compatible = "atmel,24c64";
-                               reg = <0x53>;
-                       };
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
                };
-       };
-};
 
-&i2c6 {
-       status = "okay";
+               led@4 {
+                       label = "opencapi-connector0";
+                       reg = <4>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
 
-       i2c-switch@70 {
-               compatible = "nxp,pca9546";
-               reg = <0x70>;
-               #address-cells = <1>;
-               #size-cells = <0>;
-               status = "okay";
-               i2c-mux-idle-disconnect;
+               led@5 {
+                       label = "opencapi-connector1";
+                       reg = <5>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
 
-               i2c6mux0chn0: i2c@0 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       reg = <0>;
-                       eeprom@50 {
-                               compatible = "atmel,24c64";
-                               reg = <0x50>;
-                       };
+               led@6 {
+                       label = "opencapi-connector2";
+                       reg = <6>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
                };
 
-               i2c6mux0chn1: i2c@1 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       reg = <1>;
-                       eeprom@52 {
-                               compatible = "atmel,24c64";
-                               reg = <0x52>;
-                       };
+               gpio@7 {
+                       reg = <7>;
+                       type = <PCA955X_TYPE_GPIO>;
                };
 
-               i2c6mux0chn2: i2c@2 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       reg = <2>;
-                       eeprom@53 {
-                               compatible = "atmel,24c64";
-                               reg = <0x53>;
-                       };
+               led@8 {
+                       label = "vrm0";
+                       reg = <8>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
                };
 
-               i2c6mux0chn3: i2c@3 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       reg = <3>;
-                       eeprom@51 {
-                               compatible = "atmel,24c64";
-                               reg = <0x51>;
-                       };
+               led@9 {
+                       label = "vrm1";
+                       reg = <9>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
                };
-       };
-};
 
-&i2c7 {
-       status = "okay";
+               led@10 {
+                       label = "vrm2";
+                       reg = <10>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@11 {
+                       label = "vrm3";
+                       reg = <11>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@12 {
+                       label = "vrm8";
+                       reg = <12>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@13 {
+                       label = "vrm9";
+                       reg = <13>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@14 {
+                       label = "vrm10";
+                       reg = <14>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+
+               led@15 {
+                       label = "vrm11";
+                       reg = <15>;
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       type = <PCA955X_TYPE_LED>;
+               };
+       };
 };
 
 &i2c8 {
                                compatible = "atmel,24c32";
                                reg = <0x50>;
                        };
+
+                       pca_oppanel: pca9551@60 {
+                               compatible = "nxp,pca9551";
+                               reg = <0x60>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               gpio-controller;
+                               #gpio-cells = <2>;
+
+                               led@0 {
+                                       label = "front-sys-id0";
+                                       reg = <0>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@1 {
+                                       label = "front-check-log0";
+                                       reg = <1>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@2 {
+                                       label = "front-enc-fault1";
+                                       reg = <2>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@3 {
+                                       label = "front-sys-pwron0";
+                                       reg = <3>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+                       };
                };
 
                i2c14mux0chn3: i2c@3 {
                                };
                        };
 
+                       pca_fan_nvme: pca9552@60 {
+                               compatible = "nxp,pca9552";
+                               reg = <0x60>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               gpio-controller;
+                               #gpio-cells = <2>;
+
+                               led@0 {
+                                       label = "nvme0";
+                                       reg = <0>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@1 {
+                                       label = "nvme1";
+                                       reg = <1>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@2 {
+                                       label = "nvme2";
+                                       reg = <2>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@3 {
+                                       label = "nvme3";
+                                       reg = <3>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@4 {
+                                       label = "nvme4";
+                                       reg = <4>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@5 {
+                                       label = "nvme5";
+                                       reg = <5>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@6 {
+                                       label = "nvme6";
+                                       reg = <6>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@7 {
+                                       label = "nvme7";
+                                       reg = <7>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@8 {
+                                       label = "nvme8";
+                                       reg = <8>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@9 {
+                                       label = "nvme9";
+                                       reg = <9>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@10 {
+                                       label = "fan0";
+                                       reg = <10>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@11 {
+                                       label = "fan1";
+                                       reg = <11>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@12 {
+                                       label = "fan2";
+                                       reg = <12>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               led@13 {
+                                       label = "fan3";
+                                       reg = <13>;
+                                       retain-state-shutdown;
+                                       default-state = "keep";
+                                       type = <PCA955X_TYPE_LED>;
+                               };
+
+                               gpio@14 {
+                                       reg = <14>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+
+                               gpio@15 {
+                                       reg = <15>;
+                                       type = <PCA955X_TYPE_GPIO>;
+                               };
+                       };
+
                        pca0: pca9552@61 {
                                compatible = "nxp,pca9552";
                                #address-cells = <1>;
index f7fd3b3..342546a 100644 (file)
                reg = <0x6b>;
        };
 };
-
-&fan0 {
-       tach-pulses = <4>;
-       /delete-property/ maxim,fan-dual-tach;
-};
-
-&fan1 {
-       tach-pulses = <4>;
-       /delete-property/ maxim,fan-dual-tach;
-};
-
-&fan2 {
-       tach-pulses = <4>;
-       /delete-property/ maxim,fan-dual-tach;
-};
-
-&fan3 {
-       tach-pulses = <4>;
-       /delete-property/ maxim,fan-dual-tach;
-};
-
-&fan4 {
-       tach-pulses = <4>;
-       /delete-property/ maxim,fan-dual-tach;
-};
-
-&fan5 {
-       tach-pulses = <4>;
-       /delete-property/ maxim,fan-dual-tach;
-};
index 0759389..1752f32 100644 (file)
@@ -10,7 +10,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index 80c92e0..5a98a19 100644 (file)
@@ -11,7 +11,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "earlyprintk";
+               bootargs = "earlycon";
        };
 
        memory {
index 6e9baf3..d5b7d28 100644 (file)
@@ -10,7 +10,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "earlyprintk";
+               bootargs = "earlycon";
        };
 
        memory@80000000 {
index c29e5f4..8f543cc 100644 (file)
@@ -27,7 +27,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=tty0 console=ttyS4,115200 earlyprintk";
+               bootargs = "console=tty0 console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index 084c455..bcc1820 100644 (file)
@@ -27,7 +27,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=tty0 console=ttyS4,115200 earlyprintk";
+               bootargs = "console=tty0 console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index 7331991..3ef8358 100644 (file)
@@ -11,7 +11,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@40000000 {
index 42b37a2..c084763 100644 (file)
@@ -11,7 +11,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index 15c1f0a..a52a289 100644 (file)
@@ -57,7 +57,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index 8503152..7d38d12 100644 (file)
@@ -11,7 +11,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index 91dced7..3d4bdad 100644 (file)
@@ -10,7 +10,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index eb4e93a..cd660c1 100644 (file)
@@ -10,7 +10,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@40000000 {
index fd2e014..084f548 100644 (file)
@@ -9,7 +9,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index d56b5ed..4816486 100644 (file)
@@ -10,7 +10,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index c1478d2..e863ec0 100644 (file)
@@ -13,7 +13,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200n8";
+               bootargs = "console=ttyS4,115200n8 earlycon";
        };
 
        memory@80000000 {
index 01074b6..328ef47 100644 (file)
@@ -11,7 +11,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@40000000 {
index 85d58a6..230f358 100644 (file)
@@ -10,7 +10,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index 4bcc820..7ae4ea0 100644 (file)
@@ -17,7 +17,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index 03c1614..61bc74b 100644 (file)
@@ -14,7 +14,7 @@
        };
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@80000000 {
index a68ff06..9605e53 100644 (file)
@@ -28,7 +28,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "console=ttyS4,115200 earlyprintk";
+               bootargs = "console=ttyS4,115200 earlycon";
        };
 
        memory@40000000 {
index bc16ad2..50f3c6a 100644 (file)
@@ -11,7 +11,7 @@
 
        chosen {
                stdout-path = &uart5;
-               bootargs = "earlyprintk";
+               bootargs = "earlycon";
        };
 
        memory@80000000 {
index d733c1f..329eaee 100644 (file)
                                reg-io-width = <4>;
                                clocks = <&syscon ASPEED_CLK_GATE_D1CLK>;
                                resets = <&syscon ASPEED_RESET_CRT1>;
+                               syscon = <&syscon>;
                                status = "disabled";
                                interrupts = <0x19>;
                        };
index 7028e21..7e90d71 100644 (file)
                groups = "SGPM1";
        };
 
+       pinctrl_sgpm2_default: sgpm2_default {
+               function = "SGPM2";
+               groups = "SGPM2";
+       };
+
        pinctrl_sgps1_default: sgps1_default {
                function = "SGPS1";
                groups = "SGPS1";
        };
 
+       pinctrl_sgps2_default: sgps2_default {
+               function = "SGPS2";
+               groups = "SGPS2";
+       };
+
        pinctrl_sioonctrl_default: sioonctrl_default {
                function = "SIOONCTRL";
                groups = "SIOONCTRL";
index 0025c88..8ecb786 100644 (file)
                        status = "disabled";
                };
 
-               nand: nand@18046000 {
+               nand_controller: nand-controller@18046000 {
                        compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1";
                        reg = <0x18046000 0x600>, <0xf8105408 0x600>,
                              <0x18046f00 0x20>;
index e8df458..84cda16 100644 (file)
                        status = "disabled";
                };
 
-               nand: nand@26000 {
+               nand_controller: nand-controller@26000 {
                        compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1";
                        reg = <0x26000 0x600>,
                              <0x11b408 0x600>,
index b4d2cc7..748df79 100644 (file)
                        dma-coherent;
                };
 
-               nand: nand@26000 {
+               nand_controller: nand-controller@26000 {
                        compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1";
                        reg = <0x026000 0x600>,
                              <0x11b408 0x600>,
index 3b4ab94..f24bdd0 100644 (file)
@@ -1,11 +1,9 @@
 // SPDX-License-Identifier: GPL-2.0
 /dts-v1/;
 #include "bcm2711.dtsi"
-#include "bcm2835-rpi.dtsi"
+#include "bcm2711-rpi.dtsi"
 #include "bcm283x-rpi-usb-peripheral.dtsi"
 
-#include <dt-bindings/reset/raspberrypi,firmware-reset.h>
-
 / {
        compatible = "raspberrypi,4-model-b", "brcm,bcm2711";
        model = "Raspberry Pi 4 Model B";
                stdout-path = "serial1:115200n8";
        };
 
-       /* Will be filled by the bootloader */
-       memory@0 {
-               device_type = "memory";
-               reg = <0 0 0>;
-       };
-
-       aliases {
-               emmc2bus = &emmc2bus;
-               ethernet0 = &genet;
-               pcie0 = &pcie0;
-               blconfig = &blconfig;
-       };
-
        leds {
-               act {
+               led-act {
                        gpios = <&gpio 42 GPIO_ACTIVE_HIGH>;
                };
 
-               pwr {
+               led-pwr {
                        label = "PWR";
                        gpios = <&expgpio 2 GPIO_ACTIVE_LOW>;
                        default-state = "keep";
        status = "okay";
 };
 
-&firmware {
-       firmware_clocks: clocks {
-               compatible = "raspberrypi,firmware-clocks";
-               #clock-cells = <1>;
-       };
-
-       expgpio: gpio {
-               compatible = "raspberrypi,firmware-gpio";
-               gpio-controller;
-               #gpio-cells = <2>;
-               gpio-line-names = "BT_ON",
-                                 "WL_ON",
-                                 "PWR_LED_OFF",
-                                 "GLOBAL_RESET",
-                                 "VDD_SD_IO_SEL",
-                                 "CAM_GPIO",
-                                 "SD_PWR_ON",
-                                 "";
-               status = "okay";
-       };
-
-       reset: reset {
-               compatible = "raspberrypi,firmware-reset";
-               #reset-cells = <1>;
-       };
+&expgpio {
+       gpio-line-names = "BT_ON",
+                         "WL_ON",
+                         "PWR_LED_OFF",
+                         "GLOBAL_RESET",
+                         "VDD_SD_IO_SEL",
+                         "CAM_GPIO",
+                         "SD_PWR_ON",
+                         "";
 };
 
 &gpio {
 };
 
 &hdmi0 {
-       clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 0>, <&clk_27MHz>;
-       clock-names = "hdmi", "bvb", "audio", "cec";
-       wifi-2.4ghz-coexistence;
        status = "okay";
 };
 
 &hdmi1 {
-       clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 1>, <&clk_27MHz>;
-       clock-names = "hdmi", "bvb", "audio", "cec";
-       wifi-2.4ghz-coexistence;
        status = "okay";
 };
 
-&hvs {
-       clocks = <&firmware_clocks 4>;
-};
-
 &pixelvalve0 {
        status = "okay";
 };
        status = "okay";
 };
 
-&rmem {
-       /*
-        * RPi4's co-processor will copy the board's bootloader configuration
-        * into memory for the OS to consume. It'll also update this node with
-        * its placement information.
-        */
-       blconfig: nvram@0 {
-               compatible = "raspberrypi,bootloader-config", "nvmem-rmem";
-               #address-cells = <1>;
-               #size-cells = <1>;
-               reg = <0x0 0x0 0x0>;
-               no-map;
-               status = "disabled";
-       };
-};
-
 /* SDHCI is used to control the SDIO for wireless */
 &sdhci {
        #address-cells = <1>;
        status = "okay";
 };
 
-&vchiq {
-       interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
-};
-
 &vc4 {
        status = "okay";
 };
diff --git a/arch/arm/boot/dts/bcm2711-rpi-400.dts b/arch/arm/boot/dts/bcm2711-rpi-400.dts
new file mode 100644 (file)
index 0000000..f4d2fc2
--- /dev/null
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: GPL-2.0
+/dts-v1/;
+#include "bcm2711-rpi-4-b.dts"
+
+/ {
+       compatible = "raspberrypi,400", "brcm,bcm2711";
+       model = "Raspberry Pi 400";
+
+       chosen {
+               /* 8250 auxiliary UART instead of pl011 */
+               stdout-path = "serial1:115200n8";
+       };
+
+       leds {
+               /delete-node/ led-act;
+
+               led-pwr {
+                       gpios = <&gpio 42 GPIO_ACTIVE_HIGH>;
+               };
+       };
+
+       gpio-poweroff {
+               compatible = "gpio-poweroff";
+               gpios = <&expgpio 5 GPIO_ACTIVE_HIGH>;
+       };
+};
+
+&expgpio {
+       gpio-line-names = "BT_ON",
+                         "WL_ON",
+                         "",
+                         "GLOBAL_RESET",
+                         "VDD_SD_IO_SEL",
+                         "CAM_GPIO",
+                         "SD_PWR_ON",
+                         "SD_OC_N";
+};
+
+&genet_mdio {
+       clock-frequency = <1950000>;
+};
+
+&pm {
+       /delete-property/ system-power-controller;
+};
diff --git a/arch/arm/boot/dts/bcm2711-rpi.dtsi b/arch/arm/boot/dts/bcm2711-rpi.dtsi
new file mode 100644 (file)
index 0000000..ca266c5
--- /dev/null
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: GPL-2.0
+#include "bcm2835-rpi.dtsi"
+
+#include <dt-bindings/reset/raspberrypi,firmware-reset.h>
+
+/ {
+       /* Will be filled by the bootloader */
+       memory@0 {
+               device_type = "memory";
+               reg = <0 0 0>;
+       };
+
+       aliases {
+               emmc2bus = &emmc2bus;
+               ethernet0 = &genet;
+               pcie0 = &pcie0;
+               blconfig = &blconfig;
+       };
+};
+
+&firmware {
+       firmware_clocks: clocks {
+               compatible = "raspberrypi,firmware-clocks";
+               #clock-cells = <1>;
+       };
+
+       expgpio: gpio {
+               compatible = "raspberrypi,firmware-gpio";
+               gpio-controller;
+               #gpio-cells = <2>;
+               status = "okay";
+       };
+
+       reset: reset {
+               compatible = "raspberrypi,firmware-reset";
+               #reset-cells = <1>;
+       };
+};
+
+&hdmi0 {
+       clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 0>, <&clk_27MHz>;
+       clock-names = "hdmi", "bvb", "audio", "cec";
+       wifi-2.4ghz-coexistence;
+};
+
+&hdmi1 {
+       clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 1>, <&clk_27MHz>;
+       clock-names = "hdmi", "bvb", "audio", "cec";
+       wifi-2.4ghz-coexistence;
+};
+
+&hvs {
+       clocks = <&firmware_clocks 4>;
+};
+
+&rmem {
+       /*
+        * RPi4's co-processor will copy the board's bootloader configuration
+        * into memory for the OS to consume. It'll also update this node with
+        * its placement information.
+        */
+       blconfig: nvram@0 {
+               compatible = "raspberrypi,bootloader-config", "nvmem-rmem";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0x0 0x0 0x0>;
+               no-map;
+               status = "disabled";
+       };
+};
+
+&vchiq {
+       interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
+};
index 720beec..b8a4096 100644 (file)
                ranges = <0x0 0x7e000000  0x0 0xfe000000  0x01800000>;
                dma-ranges = <0x0 0xc0000000  0x0 0x00000000  0x40000000>;
 
-               emmc2: emmc2@7e340000 {
+               emmc2: mmc@7e340000 {
                        compatible = "brcm,bcm2711-emmc2";
                        reg = <0x0 0x7e340000 0x100>;
                        interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>;
 };
 
 &vec {
+       compatible = "brcm,bcm2711-vec";
        interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
 };
index 6c8ce39..40b9405 100644 (file)
        };
 
        leds {
-               act {
+               led-act {
                        gpios = <&gpio 47 GPIO_ACTIVE_HIGH>;
                };
 
-               pwr {
+               led-pwr {
                        label = "PWR";
                        gpios = <&gpio 35 GPIO_ACTIVE_HIGH>;
                        default-state = "keep";
index 17fdd48..11edb58 100644 (file)
@@ -14,7 +14,7 @@
        };
 
        leds {
-               act {
+               led-act {
                        gpios = <&gpio 16 GPIO_ACTIVE_LOW>;
                };
        };
index b0355c2..1b435c6 100644 (file)
        };
 
        leds {
-               act {
+               led-act {
                        gpios = <&gpio 47 GPIO_ACTIVE_HIGH>;
                };
 
-               pwr {
+               led-pwr {
                        label = "PWR";
                        gpios = <&gpio 35 GPIO_ACTIVE_HIGH>;
                        default-state = "keep";
index 33b3b5c..a23c25c 100644 (file)
@@ -15,7 +15,7 @@
        };
 
        leds {
-               act {
+               led-act {
                        gpios = <&gpio 16 GPIO_ACTIVE_LOW>;
                };
        };
index 2b69957..1b63d6b 100644 (file)
@@ -15,7 +15,7 @@
        };
 
        leds {
-               act {
+               led-act {
                        gpios = <&gpio 16 GPIO_ACTIVE_LOW>;
                };
        };
index 58059c2..e4e6b6a 100644 (file)
@@ -5,7 +5,7 @@
 
 / {
        leds {
-               act {
+               led-act {
                        gpios = <&gpio 47 GPIO_ACTIVE_LOW>;
                };
        };
index f65448c..33b2b77 100644 (file)
@@ -23,7 +23,7 @@
        };
 
        leds {
-               act {
+               led-act {
                        gpios = <&gpio 47 GPIO_ACTIVE_LOW>;
                };
        };
index 6dd93c6..6f9b3a9 100644 (file)
@@ -18,7 +18,7 @@
        };
 
        leds {
-               act {
+               led-act {
                        gpios = <&gpio 47 GPIO_ACTIVE_HIGH>;
                };
        };
index d94357b..87ddcad 100644 (file)
@@ -4,7 +4,7 @@
        leds {
                compatible = "gpio-leds";
 
-               act {
+               led-act {
                        label = "ACT";
                        default-state = "keep";
                        linux,default-trigger = "heartbeat";
index 0455a68..d8af8ee 100644 (file)
        };
 
        leds {
-               act {
+               led-act {
                        gpios = <&gpio 47 GPIO_ACTIVE_HIGH>;
                };
 
-               pwr {
+               led-pwr {
                        label = "PWR";
                        gpios = <&gpio 35 GPIO_ACTIVE_HIGH>;
                        default-state = "keep";
index 28be033..77099a7 100644 (file)
        };
 
        leds {
-               act {
+               led-act {
                        gpios = <&gpio 29 GPIO_ACTIVE_HIGH>;
                };
 
-               pwr {
+               led-pwr {
                        label = "PWR";
                        gpios = <&expgpio 2 GPIO_ACTIVE_LOW>;
                        default-state = "keep";
index 3734314..6101026 100644 (file)
        };
 
        leds {
-               act {
+               led-act {
                        gpios = <&gpio 29 GPIO_ACTIVE_HIGH>;
                };
 
-               pwr {
+               led-pwr {
                        label = "PWR";
                        gpios = <&expgpio 2 GPIO_ACTIVE_LOW>;
                        default-state = "keep";
index 054ecaa..dd4a486 100644 (file)
@@ -20,7 +20,7 @@
        };
 
        leds {
-               act {
+               led-act {
                        gpios = <&expgpio 2 GPIO_ACTIVE_HIGH>;
                };
        };
index 925cb37..828a205 100644 (file)
@@ -14,7 +14,7 @@
                 * Since there is no upstream GPIO driver yet,
                 * remove the incomplete node.
                 */
-               /delete-node/ act;
+               /delete-node/ led-act;
        };
 
        reg_3v3: fixed-regulator {
index 20322de..e2fd961 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 &usb {
        dr_mode = "otg";
-       g-rx-fifo-size = <558>;
+       g-rx-fifo-size = <256>;
        g-np-tx-fifo-size = <32>;
        /*
         * According to dwc2 the sum of all device EP
index 1409d1b..0ff0e9e 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 &usb {
        dr_mode = "peripheral";
-       g-rx-fifo-size = <558>;
+       g-rx-fifo-size = <256>;
        g-np-tx-fifo-size = <32>;
        g-tx-fifo-size = <256 256 512 512 512 768 768>;
 };
index b83a864..0f3be55 100644 (file)
                        status = "disabled";
                };
 
-               sdhci: sdhci@7e300000 {
+               sdhci: mmc@7e300000 {
                        compatible = "brcm,bcm2835-sdhci";
                        reg = <0x7e300000 0x100>;
                        interrupts = <2 30>;
index 8636600..c81944c 100644 (file)
@@ -24,8 +24,8 @@
                reg = <0x00000000 0x08000000>;
        };
 
-       nand: nand@18028000 {
-               nandcs@0 {
+       nand_controller: nand-controller@18028000 {
+               nand@0 {
                        partitions {
                                compatible = "fixed-partitions";
                                #address-cells = <1>;
index e635a15..a6e2aeb 100644 (file)
@@ -25,8 +25,8 @@
                      <0x88000000 0x08000000>;
        };
 
-       nand: nand@18028000 {
-               nandcs@0 {
+       nand_controller: nand-controller@18028000 {
+               nand@0 {
                        partitions {
                                compatible = "fixed-partitions";
                                #address-cells = <1>;
index 2a8f731..6282363 100644 (file)
@@ -11,7 +11,7 @@
 &pinctrl {
        compatible = "brcm,bcm4709-pinmux";
 
-       pinmux_mdio: mdio {
+       pinmux_mdio: mdio-pins {
                groups = "mdio_grp";
                function = "mdio";
        };
index 925a7c9..be9a00f 100644 (file)
@@ -6,8 +6,8 @@
  */
 
 / {
-       nand@18028000 {
-               nandcs: nandcs@0 {
+       nand-controller@18028000 {
+               nandcs: nand@0 {
                        compatible = "brcm,nandcs";
                        reg = <0>;
                        #address-cells = <1>;
index 7db72a2..f920892 100644 (file)
                                        function = "spi";
                                };
 
-                               pinmux_i2c: i2c {
+                               pinmux_i2c: i2c-pins {
                                        groups = "i2c_grp";
                                        function = "i2c";
                                };
 
-                               pinmux_pwm: pwm {
+                               pinmux_pwm: pwm-pins {
                                        groups = "pwm0_grp", "pwm1_grp",
                                                 "pwm2_grp", "pwm3_grp";
                                        function = "pwm";
                                };
 
-                               pinmux_uart1: uart1 {
+                               pinmux_uart1: uart1-pins {
                                        groups = "uart1_grp";
                                        function = "uart1";
                                };
                reg = <0x18004000 0x14>;
        };
 
-       nand: nand@18028000 {
+       nand_controller: nand-controller@18028000 {
                compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1", "brcm,brcmnand";
                reg = <0x18028000 0x600>, <0x1811a408 0x600>, <0x18028f00 0x20>;
                reg-names = "nand", "iproc-idm", "iproc-ext";
                      <0x1811b408 0x004>,
                      <0x180293a0 0x01c>;
                reg-names = "mspi", "bspi", "intr_regs", "intr_status_reg";
-               interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>,
+               interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>,
                             <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>,
                             <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>,
                             <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>,
-                            <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>,
-                            <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>,
-                            <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
-               interrupt-names = "spi_lr_fullness_reached",
+                            <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
+               interrupt-names = "mspi_done",
+                                 "mspi_halted",
+                                 "spi_lr_fullness_reached",
                                  "spi_lr_session_aborted",
                                  "spi_lr_impatient",
                                  "spi_lr_session_done",
-                                 "spi_lr_overhead",
-                                 "mspi_done",
-                                 "mspi_halted";
+                                 "spi_lr_overread";
                clocks = <&iprocmed>;
                clock-names = "iprocmed";
                num-cs = <2>;
                #address-cells = <1>;
                #size-cells = <0>;
 
-               spi_nor: spi-nor@0 {
+               spi_nor: flash@0 {
                        compatible = "jedec,spi-nor";
                        reg = <0>;
                        spi-max-frequency = <20000000>;
index 9c0325c..cca49a2 100644 (file)
                        status = "disabled";
                };
 
-               nand: nand@2000 {
+               nand_controller: nand-controller@2000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        compatible = "brcm,nand-bcm63138", "brcm,brcmnand-v7.0", "brcm,brcmnand";
index 8313b7c..f92d2cf 100644 (file)
        };
 };
 
-&nand {
+&nand_controller {
        status = "okay";
 
-       nandcs@1 {
+       nand@1 {
                compatible = "brcm,nandcs";
                reg = <1>;
                nand-ecc-step-size = <512>;
index 58f67c9..5ac2042 100644 (file)
                        reg-names = "aon-ctrl", "aon-sram";
                };
 
-               nand: nand@3e2800 {
+               nand_controller: nand-controller@3e2800 {
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
index b2d323f..a76c74b 100644 (file)
@@ -82,8 +82,8 @@
        status = "okay";
 };
 
-&nand {
-       nandcs@1 {
+&nand_controller {
+       nand@1 {
                compatible = "brcm,nandcs";
                reg = <0>;
                nand-on-flash-bbt;
index 046c59f..de40bd5 100644 (file)
@@ -49,8 +49,8 @@
        };
 };
 
-&nand {
-       nandcs@0 {
+&nand_controller {
+       nand@0 {
                compatible = "brcm,nandcs";
                reg = <0>;
                nand-on-flash-bbt;
index b4a1392..dda3e11 100644 (file)
@@ -60,8 +60,8 @@
        status = "okay";
 };
 
-&nand {
-       nandcs@1 {
+&nand_controller {
+       nand@1 {
                compatible = "brcm,nandcs";
                reg = <0>;
                nand-on-flash-bbt;
index 3378683..ea3c6b8 100644 (file)
@@ -68,8 +68,8 @@
        status = "okay";
 };
 
-&nand {
-       nandcs@1 {
+&nand_controller {
+       nand@1 {
                compatible = "brcm,nandcs";
                reg = <0>;
                nand-on-flash-bbt;
index 5443fc0..1f73885 100644 (file)
@@ -74,8 +74,8 @@
        status = "okay";
 };
 
-&nand {
-       nandcs@0 {
+&nand_controller {
+       nand@0 {
                compatible = "brcm,nandcs";
                reg = <0>;
                nand-on-flash-bbt;
index e1e3c26..b6b9ca8 100644 (file)
@@ -74,8 +74,8 @@
        status = "okay";
 };
 
-&nand {
-       nandcs@0 {
+&nand_controller {
+       nand@0 {
                compatible = "brcm,nandcs";
                reg = <0>;
                nand-on-flash-bbt;
index f161ba2..ecf426f 100644 (file)
@@ -90,8 +90,8 @@
        };
 };
 
-&nand {
-       nandcs@0 {
+&nand_controller {
+       nand@0 {
                compatible = "brcm,nandcs";
                reg = <0>;
                nand-on-flash-bbt;
index 83cb877..8ca18da 100644 (file)
@@ -78,8 +78,8 @@
        status = "okay";
 };
 
-&nand {
-       nandcs@0 {
+&nand_controller {
+       nand@0 {
                compatible = "brcm,nandcs";
                reg = <0>;
                nand-on-flash-bbt;
index 4e106ce..9747378 100644 (file)
@@ -78,8 +78,8 @@
        status = "okay";
 };
 
-&nand {
-       nandcs@0 {
+&nand_controller {
+       nand@0 {
                compatible = "brcm,nandcs";
                reg = <0>;
                nand-on-flash-bbt;
index cda6cc2..0f92b77 100644 (file)
@@ -89,8 +89,8 @@
        status = "okay";
 };
 
-&nand {
-       nandcs@0 {
+&nand_controller {
+       nand@0 {
                compatible = "brcm,nandcs";
                reg = <0>;
                nand-on-flash-bbt;
index ffbff00..9e984ca 100644 (file)
@@ -68,8 +68,8 @@
        status = "okay";
 };
 
-&nand {
-       nandcs@0 {
+&nand_controller {
+       nand@0 {
                compatible = "brcm,nandcs";
                reg = <0>;
                nand-on-flash-bbt;
index 5b17727..df5c8ab 100644 (file)
        status = "okay";
 };
 
-&nand {
+&nand_controller {
        status = "okay";
 
-       nandcs@0 {
+       nand@0 {
                compatible = "brcm,nandcs";
                reg = <0>;
                nand-ecc-strength = <4>;
index 3fd39c4..5475dab 100644 (file)
@@ -74,8 +74,8 @@
        status = "okay";
 };
 
-&nand {
-       nandcs@0 {
+&nand_controller {
+       nand@0 {
                compatible = "brcm,nandcs";
                reg = <0>;
                nand-on-flash-bbt;
index 7cf31b6..c3942b4 100644 (file)
                        status = "disabled";
                };
                ehrpwm0: pwm@300000 {
-                       compatible = "ti,da850-ehrpwm", "ti,am3352-ehrpwm",
-                                    "ti,am33xx-ehrpwm";
+                       compatible = "ti,da850-ehrpwm", "ti,am3352-ehrpwm";
                        #pwm-cells = <3>;
                        reg = <0x300000 0x2000>;
                        clocks = <&psc1 17>, <&ehrpwm_tbclk>;
                        status = "disabled";
                };
                ehrpwm1: pwm@302000 {
-                       compatible = "ti,da850-ehrpwm", "ti,am3352-ehrpwm",
-                                    "ti,am33xx-ehrpwm";
+                       compatible = "ti,da850-ehrpwm", "ti,am3352-ehrpwm";
                        #pwm-cells = <3>;
                        reg = <0x302000 0x2000>;
                        clocks = <&psc1 17>, <&ehrpwm_tbclk>;
                        power-domains = <&psc1 17>;
                        status = "disabled";
                };
-               ecap0: ecap@306000 {
-                       compatible = "ti,da850-ecap", "ti,am3352-ecap",
-                                    "ti,am33xx-ecap";
+               ecap0: pwm@306000 {
+                       compatible = "ti,da850-ecap", "ti,am3352-ecap";
                        #pwm-cells = <3>;
                        reg = <0x306000 0x80>;
                        clocks = <&psc1 20>;
                        power-domains = <&psc1 20>;
                        status = "disabled";
                };
-               ecap1: ecap@307000 {
-                       compatible = "ti,da850-ecap", "ti,am3352-ecap",
-                                    "ti,am33xx-ecap";
+               ecap1: pwm@307000 {
+                       compatible = "ti,da850-ecap", "ti,am3352-ecap";
                        #pwm-cells = <3>;
                        reg = <0x307000 0x80>;
                        clocks = <&psc1 20>;
                        power-domains = <&psc1 20>;
                        status = "disabled";
                };
-               ecap2: ecap@308000 {
-                       compatible = "ti,da850-ecap", "ti,am3352-ecap",
-                                    "ti,am33xx-ecap";
+               ecap2: pwm@308000 {
+                       compatible = "ti,da850-ecap", "ti,am3352-ecap";
                        #pwm-cells = <3>;
                        reg = <0x308000 0x80>;
                        clocks = <&psc1 20>;
index 3551a64..a9e7274 100644 (file)
                        #address-cells = <1>;
                        #size-cells = <0>;
                        interrupts = <70>;
-                       dmas = <&edma 58 0 &edma 59 0>;
-                       dma-names = "tx", "rx";
                };
 
                i2c2: i2c@4802a000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        interrupts = <71>;
-                       dmas = <&edma 60 0 &edma 61 0>;
-                       dma-names = "tx", "rx";
                };
 
                intc: interrupt-controller@48200000 {
                        #mbox-cells = <1>;
                        ti,mbox-num-users = <4>;
                        ti,mbox-num-fifos = <12>;
-                       mbox_dsp: mbox_dsp {
+                       mbox_dsp: mbox-dsp {
                                ti,mbox-tx = <3 0 0>;
                                ti,mbox-rx = <0 0 0>;
                        };
index 38530db..87deb6a 100644 (file)
        };
 
        pcf_lcd: gpio@20 {
-               compatible = "ti,pcf8575", "nxp,pcf8575";
+               compatible = "nxp,pcf8575";
                reg = <0x20>;
                gpio-controller;
                #gpio-cells = <2>;
        };
 
        pcf_gpio_21: gpio@21 {
-               compatible = "ti,pcf8575", "nxp,pcf8575";
+               compatible = "nxp,pcf8575";
                reg = <0x21>;
                lines-initial-states = <0x1408>;
                gpio-controller;
        clock-frequency = <400000>;
 
        pcf_hdmi: gpio@26 {
-               compatible = "ti,pcf8575", "nxp,pcf8575";
+               compatible = "nxp,pcf8575";
                reg = <0x26>;
                gpio-controller;
                #gpio-cells = <2>;
-               p1 {
+               hdmi-audio-hog {
                        /* vin6_sel_s0: high: VIN6, low: audio */
                        gpio-hog;
                        gpios = <1 GPIO_ACTIVE_HIGH>;
index a25749a..a5bdc64 100644 (file)
@@ -5,17 +5,17 @@
 
 &mailbox5 {
        status = "okay";
-       mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
+       mbox_ipu1_ipc3x: mbox-ipu1-ipc3x {
                status = "okay";
        };
-       mbox_dsp1_ipc3x: mbox_dsp1_ipc3x {
+       mbox_dsp1_ipc3x: mbox-dsp1-ipc3x {
                status = "okay";
        };
 };
 
 &mailbox6 {
        status = "okay";
-       mbox_ipu2_ipc3x: mbox_ipu2_ipc3x {
+       mbox_ipu2_ipc3x: mbox-ipu2-ipc3x {
                status = "okay";
        };
 };
index 149144c..be63dfe 100644 (file)
                        ranges = <0x0 0x20000 0x1000>;
 
                        uart3: serial@0 {
-                               compatible = "ti,dra742-uart", "ti,omap4-uart";
+                               compatible = "ti,dra742-uart";
                                reg = <0x0 0x100>;
                                interrupts = <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>;
                                clock-frequency = <48000000>;
                        };
                };
 
-               target-module@55000 {                   /* 0x48055000, ap 13 0e.0 */
+               gpio2_target: target-module@55000 {             /* 0x48055000, ap 13 0e.0 */
                        compatible = "ti,sysc-omap2", "ti,sysc";
                        reg = <0x55000 0x4>,
                              <0x55010 0x4>,
                        };
                };
 
-               target-module@57000 {                   /* 0x48057000, ap 15 06.0 */
+               gpio3_target: target-module@57000 {             /* 0x48057000, ap 15 06.0 */
                        compatible = "ti,sysc-omap2", "ti,sysc";
                        reg = <0x57000 0x4>,
                              <0x57010 0x4>,
                        ranges = <0x0 0x66000 0x1000>;
 
                        uart5: serial@0 {
-                               compatible = "ti,dra742-uart", "ti,omap4-uart";
+                               compatible = "ti,dra742-uart";
                                reg = <0x0 0x100>;
                                interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;
                                clock-frequency = <48000000>;
                        ranges = <0x0 0x68000 0x1000>;
 
                        uart6: serial@0 {
-                               compatible = "ti,dra742-uart", "ti,omap4-uart";
+                               compatible = "ti,dra742-uart";
                                reg = <0x0 0x100>;
                                interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>;
                                clock-frequency = <48000000>;
                        ranges = <0x0 0x6a000 0x1000>;
 
                        uart1: serial@0 {
-                               compatible = "ti,dra742-uart", "ti,omap4-uart";
+                               compatible = "ti,dra742-uart";
                                reg = <0x0 0x100>;
                                interrupts-extended = <&crossbar_mpu GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
                                clock-frequency = <48000000>;
                        ranges = <0x0 0x6c000 0x1000>;
 
                        uart2: serial@0 {
-                               compatible = "ti,dra742-uart", "ti,omap4-uart";
+                               compatible = "ti,dra742-uart";
                                reg = <0x0 0x100>;
                                interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
                                clock-frequency = <48000000>;
                        ranges = <0x0 0x6e000 0x1000>;
 
                        uart4: serial@0 {
-                               compatible = "ti,dra742-uart", "ti,omap4-uart";
+                               compatible = "ti,dra742-uart";
                                reg = <0x0 0x100>;
                                interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
                                clock-frequency = <48000000>;
                        ranges = <0x0 0x20000 0x1000>;
 
                        uart7: serial@0 {
-                               compatible = "ti,dra742-uart", "ti,omap4-uart";
+                               compatible = "ti,dra742-uart";
                                reg = <0x0 0x100>;
                                interrupts = <GIC_SPI 218 IRQ_TYPE_LEVEL_HIGH>;
                                clock-frequency = <48000000>;
                        ranges = <0x0 0x22000 0x1000>;
 
                        uart8: serial@0 {
-                               compatible = "ti,dra742-uart", "ti,omap4-uart";
+                               compatible = "ti,dra742-uart";
                                reg = <0x0 0x100>;
                                interrupts = <GIC_SPI 219 IRQ_TYPE_LEVEL_HIGH>;
                                clock-frequency = <48000000>;
                        ranges = <0x0 0x24000 0x1000>;
 
                        uart9: serial@0 {
-                               compatible = "ti,dra742-uart", "ti,omap4-uart";
+                               compatible = "ti,dra742-uart";
                                reg = <0x0 0x100>;
                                interrupts = <GIC_SPI 220 IRQ_TYPE_LEVEL_HIGH>;
                                clock-frequency = <48000000>;
                                status = "disabled";
                                ranges = <0 0 0x1000>;
 
-                               ecap0: ecap@100 {
+                               ecap0: pwm@100 {
                                        compatible = "ti,dra746-ecap",
                                                     "ti,am3352-ecap";
                                        #pwm-cells = <3>;
                                status = "disabled";
                                ranges = <0 0 0x1000>;
 
-                               ecap1: ecap@100 {
+                               ecap1: pwm@100 {
                                        compatible = "ti,dra746-ecap",
                                                     "ti,am3352-ecap";
                                        #pwm-cells = <3>;
                                status = "disabled";
                                ranges = <0 0 0x1000>;
 
-                               ecap2: ecap@100 {
+                               ecap2: pwm@100 {
                                        compatible = "ti,dra746-ecap",
                                                     "ti,am3352-ecap";
                                        #pwm-cells = <3>;
                        ranges = <0x0 0xb000 0x1000>;
 
                        uart10: serial@0 {
-                               compatible = "ti,dra742-uart", "ti,omap4-uart";
+                               compatible = "ti,dra742-uart";
                                reg = <0x0 0x100>;
                                interrupts = <GIC_SPI 221 IRQ_TYPE_LEVEL_HIGH>;
                                clock-frequency = <48000000>;
index 6d2cca6..a643644 100644 (file)
 };
 
 &pcf_hdmi {
-       p0 {
+       hdmi-i2c-disable-hog {
                /*
                 * PM_OEn to High: Disable routing I2C3 to PM_I2C
                 * With this PM_SEL(p3) should not matter
index b65b2dd..f128252 100644 (file)
        };
 
        pcf_gpio_21: gpio@21 {
-               compatible = "ti,pcf8575", "nxp,pcf8575";
+               compatible = "nxp,pcf8575";
                reg = <0x21>;
                lines-initial-states = <0x1408>;
                gpio-controller;
        clock-frequency = <400000>;
 
        pcf_hdmi: pcf8575@26 {
-               compatible = "ti,pcf8575", "nxp,pcf8575";
+               compatible = "nxp,pcf8575";
                reg = <0x26>;
                gpio-controller;
                #gpio-cells = <2>;
                 */
                lines-initial-states = <0x0f2b>;
 
-               p1 {
+               hdmi-audio-hog {
                        /* vin6_sel_s0: high: VIN6, low: audio */
                        gpio-hog;
                        gpios = <1 GPIO_ACTIVE_HIGH>;
index d403acc..85ab1f4 100644 (file)
 };
 
 &mailbox5 {
-       mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
+       mbox_ipu1_ipc3x: mbox-ipu1-ipc3x {
                ti,mbox-tx = <6 2 2>;
                ti,mbox-rx = <4 2 2>;
                status = "disabled";
        };
-       mbox_dsp1_ipc3x: mbox_dsp1_ipc3x {
+       mbox_dsp1_ipc3x: mbox-dsp1-ipc3x {
                ti,mbox-tx = <5 2 2>;
                ti,mbox-rx = <1 2 2>;
                status = "disabled";
@@ -90,7 +90,7 @@
 };
 
 &mailbox6 {
-       mbox_ipu2_ipc3x: mbox_ipu2_ipc3x {
+       mbox_ipu2_ipc3x: mbox-ipu2-ipc3x {
                ti,mbox-tx = <6 2 2>;
                ti,mbox-rx = <4 2 2>;
                status = "disabled";
index b1147a4..3256631 100644 (file)
@@ -6,7 +6,7 @@
 #include "dra7-ipu-dsp-common.dtsi"
 
 &mailbox6 {
-       mbox_dsp2_ipc3x: mbox_dsp2_ipc3x {
+       mbox_dsp2_ipc3x: mbox-dsp2-ipc3x {
                status = "okay";
        };
 };
index e1850d6..411ad29 100644 (file)
 };
 
 &mailbox5 {
-       mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
+       mbox_ipu1_ipc3x: mbox-ipu1-ipc3x {
                ti,mbox-tx = <6 2 2>;
                ti,mbox-rx = <4 2 2>;
                status = "disabled";
        };
-       mbox_dsp1_ipc3x: mbox_dsp1_ipc3x {
+       mbox_dsp1_ipc3x: mbox-dsp1-ipc3x {
                ti,mbox-tx = <5 2 2>;
                ti,mbox-rx = <1 2 2>;
                status = "disabled";
 };
 
 &mailbox6 {
-       mbox_ipu2_ipc3x: mbox_ipu2_ipc3x {
+       mbox_ipu2_ipc3x: mbox-ipu2-ipc3x {
                ti,mbox-tx = <6 2 2>;
                ti,mbox-rx = <4 2 2>;
                status = "disabled";
        };
-       mbox_dsp2_ipc3x: mbox_dsp2_ipc3x {
+       mbox_dsp2_ipc3x: mbox-dsp2-ipc3x {
                ti,mbox-tx = <5 2 2>;
                ti,mbox-rx = <1 2 2>;
                status = "disabled";
index 9bd01ae..e2b7fcb 100644 (file)
                regulator-max-microvolt = <1800000>;
        };
 
-       clk_ov5640_fixed: clock {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <24000000>;
-       };
-
        hdmi0: connector {
                compatible = "hdmi-connector";
                label = "hdmi";
        };
 
        pcf_lcd: pcf8757@20 {
-               compatible = "ti,pcf8575", "nxp,pcf8575";
+               compatible = "nxp,pcf8575";
                reg = <0x20>;
                gpio-controller;
                #gpio-cells = <2>;
        };
 
        pcf_gpio_21: pcf8757@21 {
-               compatible = "ti,pcf8575", "nxp,pcf8575";
+               compatible = "nxp,pcf8575";
                reg = <0x21>;
                gpio-controller;
                #gpio-cells = <2>;
        };
 
        pcf_hdmi: pcf8575@26 {
-               compatible = "ti,pcf8575", "nxp,pcf8575";
+               compatible = "nxp,pcf8575";
                reg = <0x26>;
                gpio-controller;
                #gpio-cells = <2>;
-               p1 {
+               hdmi-audio-hog {
                        /* vin6_sel_s0: high: VIN6, low: audio */
                        gpio-hog;
                        gpios = <1 GPIO_ACTIVE_HIGH>;
        };
 };
 
-&i2c5 {
-       status = "okay";
-       clock-frequency = <400000>;
-
-       ov5640@3c {
-               compatible = "ovti,ov5640";
-               reg = <0x3c>;
-
-               clocks = <&clk_ov5640_fixed>;
-               clock-names = "xclk";
-
-               port {
-                       csi2_cam0: endpoint {
-                               remote-endpoint = <&csi2_phy0>;
-                               clock-lanes = <0>;
-                               data-lanes = <1 2>;
-                       };
-               };
-       };
-};
-
 &cpu0 {
        vdd-supply = <&buck10_reg>;
 };
        };
 };
 
-&csi2_0 {
-       csi2_phy0: endpoint {
-               remote-endpoint = <&csi2_cam0>;
-               clock-lanes = <0>;
-               data-lanes = <1 2>;
-       };
-};
-
 &ipu2 {
        status = "okay";
        memory-region = <&ipu2_cma_pool>;
index c52b9cf..f6ba5e4 100644 (file)
        mmc-pwrseq = <&wlan_pwrseq>;
 
        brcmf: wifi@1 {
-               compatible = "brcm,bcm4334-fmac";
+               compatible = "brcm,bcm4334-fmac", "brcm,bcm4329-fmac";
                reg = <1>;
 
                interrupt-parent = <&gpx1>;
index 525ff3d..5592217 100644 (file)
 };
 
 &fimc_1 {
-       status = "okay";
+       /* Back camera not implemented */
+       status = "disabled";
 
        assigned-clocks = <&clock CLK_MOUT_FIMC1>, <&clock CLK_SCLK_FIMC1>;
        assigned-clock-parents = <&clock CLK_SCLK_MPLL>;
 };
 
 &fimc_3 {
-       status = "okay";
+       /* Back camera not implemented */
+       status = "disabled";
 
        assigned-clocks = <&clock CLK_MOUT_FIMC3>, <&clock CLK_SCLK_FIMC3>;
        assigned-clock-parents = <&clock CLK_SCLK_MPLL>;
        pinctrl-0 = <&sd3_clk>, <&sd3_cmd>, <&sd3_bus4>;
 
        brcmf: wifi@1 {
-               compatible = "brcm,bcm4330-fmac";
+               compatible = "brcm,bcm4330-fmac", "brcm,bcm4329-fmac";
                reg = <1>;
 
                interrupt-parent = <&gpx2>;
index d2406c9..3eb8df3 100644 (file)
        pinctrl-0 = <&sd3_clk>, <&sd3_cmd>, <&sd3_bus4>;
 
        brcmf: wifi@1 {
-               compatible = "brcm,bcm4330-fmac";
+               compatible = "brcm,bcm4330-fmac", "brcm,bcm4329-fmac";
                reg = <1>;
 
                interrupt-parent = <&gpx2>;
index dd44ad2..f052853 100644 (file)
        pinctrl-0 = <&sd3_clk>, <&sd3_cmd>, <&sd3_bus4>;
 
        brcmf: wifi@1 {
-               compatible = "brcm,bcm4330-fmac";
+               compatible = "brcm,bcm4330-fmac", "brcm,bcm4329-fmac";
                reg = <1>;
                interrupt-parent = <&gpx2>;
                interrupts = <5 IRQ_TYPE_LEVEL_HIGH>;
index 4583d34..b3726d4 100644 (file)
                                                 <1025000>, <950000>,
                                                 <918750>, <900000>,
                                                 <875000>, <831250>;
+               wakeup-source;
 
                regulators {
                        ldo1_reg: LDO1 {
index fc77c1b..968c794 100644 (file)
                interrupts = <7 IRQ_TYPE_LEVEL_LOW>;
                pinctrl-0 = <&max77686_irq>;
                pinctrl-names = "default";
+               wakeup-source;
                reg = <0x09>;
                #clock-cells = <1>;
 
index c49dbb7..2c79214 100644 (file)
@@ -50,8 +50,8 @@
                reg = <0x48>;
                interrupt-parent = <&gpm2>;
                interrupts = <3 IRQ_TYPE_EDGE_FALLING>;
-               x-size = <720>;
-               y-size = <1280>;
+               touchscreen-size-x = <720>;
+               touchscreen-size-y = <1280>;
                avdd-supply = <&ldo23_reg>;
                vdd-supply = <&ldo24_reg>;
        };
index 5bd0586..5b1d459 100644 (file)
                interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
                pinctrl-names = "default";
                pinctrl-0 = <&max77686_irq>;
+               wakeup-source;
                reg = <0x09>;
                #clock-cells = <1>;
 
index e1f6de5..5479ef0 100644 (file)
                                                 <1200000>, <1200000>,
                                                 <1200000>, <1200000>,
                                                 <1200000>, <1200000>;
+               wakeup-source;
 
                s5m8767_osc: clocks {
                        compatible = "samsung,s5m8767-clk";
index 9e75089..22c3086 100644 (file)
                interrupts = <7 IRQ_TYPE_LEVEL_LOW>;
                pinctrl-0 = <&max77686_irq>;
                pinctrl-names = "default";
+               wakeup-source;
                reg = <0x09>;
                #clock-cells = <1>;
 
index a161f62..a771542 100644 (file)
                interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
                pinctrl-names = "default";
                pinctrl-0 = <&s5m8767_irq>;
+               wakeup-source;
 
                vinb1-supply = <&main_dc_reg>;
                vinb2-supply = <&main_dc_reg>;
index 949c072..884fef5 100644 (file)
                pinctrl-names = "default";
                pinctrl-0 = <&max77802_irq>, <&pmic_dvs_1>, <&pmic_dvs_2>,
                            <&pmic_dvs_3>;
+               wakeup-source;
                #clock-cells = <1>;
 
                inl1-supply = <&buck5_reg>;
index 1aad485..dfc7f14 100644 (file)
                interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
                pinctrl-names = "default";
                pinctrl-0 = <&s2mps11_irq>;
+               wakeup-source;
 
                s2mps11_osc: clocks {
                        compatible = "samsung,s2mps11-clk";
index d506da9..a4f0e3f 100644 (file)
        pmic@66 {
                compatible = "samsung,s2mps11-pmic";
                reg = <0x66>;
+               wakeup-source;
 
                s2mps11_osc: clocks {
                        compatible = "samsung,s2mps11-clk";
index 6d690b1..e7958db 100644 (file)
                interrupts = <4 IRQ_TYPE_LEVEL_LOW>;
                pinctrl-names = "default";
                pinctrl-0 = <&s2mps11_irq>;
+               wakeup-source;
 
                s2mps11_osc: clocks {
                        compatible = "samsung,s2mps11-clk";
index 20c222b..d91f7fa 100644 (file)
@@ -22,7 +22,7 @@
                        label = "blue:heartbeat";
                        pwms = <&pwm 2 2000000 0>;
                        pwm-names = "pwm2";
-                       max_brightness = <255>;
+                       max-brightness = <255>;
                        linux,default-trigger = "heartbeat";
                };
        };
index ede7822..1c24f9b 100644 (file)
@@ -24,7 +24,7 @@
                        label = "blue:heartbeat";
                        pwms = <&pwm 2 2000000 0>;
                        pwm-names = "pwm2";
-                       max_brightness = <255>;
+                       max-brightness = <255>;
                        linux,default-trigger = "heartbeat";
                };
        };
index 2fc3e86..982752e 100644 (file)
@@ -22,7 +22,7 @@
                         * Green LED is much brighter than the others
                         * so limit its max brightness
                         */
-                       max_brightness = <127>;
+                       max-brightness = <127>;
                        linux,default-trigger = "mmc0";
                };
 
@@ -30,7 +30,7 @@
                        label = "blue:heartbeat";
                        pwms = <&pwm 2 2000000 0>;
                        pwm-names = "pwm2";
-                       max_brightness = <255>;
+                       max-brightness = <255>;
                        linux,default-trigger = "heartbeat";
                };
        };
index cc39289..c79a2a0 100644 (file)
@@ -61,9 +61,9 @@
                #size-cells = <0>;
 
                /* Collides with IDE pins, that's cool (we do not use them) */
-               gpio-sck = <&gpio1 5 GPIO_ACTIVE_HIGH>;
-               gpio-miso = <&gpio1 8 GPIO_ACTIVE_HIGH>;
-               gpio-mosi = <&gpio1 7 GPIO_ACTIVE_HIGH>;
+               sck-gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;
+               miso-gpios = <&gpio1 8 GPIO_ACTIVE_HIGH>;
+               mosi-gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
                cs-gpios = <&gpio0 20 GPIO_ACTIVE_LOW>;
                num-chipselects = <1>;
 
         * The touchpad input is connected to a GPIO bit-banged
         * I2C bus.
         */
-       gpio-i2c {
+       i2c {
                compatible = "i2c-gpio";
                /* Collides with ICE */
                sda-gpios = <&gpio0 5 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
                display-controller@6a000000 {
                        status = "okay";
 
-                       port@0 {
-                               reg = <0>;
+                       port {
                                display_out: endpoint {
                                        remote-endpoint = <&panel_in>;
                                };
index c6f3d90..eba1c94 100644 (file)
@@ -82,7 +82,7 @@
 
 
        /* Global Mixed-Mode Technology G751 mounted on GPIO I2C */
-       gpio-i2c {
+       i2c {
                compatible = "i2c-gpio";
                sda-gpios = <&gpio0 15 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
                scl-gpios = <&gpio0 16 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
                };
        };
 
-       mdio0: ethernet-phy {
+       mdio0: mdio {
                compatible = "virtual,mdio-gpio";
                /* Uses MDC and MDIO */
                gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
index 43c45f7..13112a8 100644 (file)
@@ -62,7 +62,7 @@
                };
        };
 
-       mdio0: ethernet-phy {
+       mdio0: mdio {
                compatible = "virtual,mdio-gpio";
                gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
                        <&gpio0 21 GPIO_ACTIVE_HIGH>; /* MDIO */
index 9611ddf..0ebda4e 100644 (file)
@@ -56,7 +56,7 @@
                };
        };
 
-       mdio0: ethernet-phy {
+       mdio0: mdio {
                compatible = "virtual,mdio-gpio";
                gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
                        <&gpio0 21 GPIO_ACTIVE_HIGH>; /* MDIO */
                        };
                };
 
-               ethernet@60000000 {
-                       status = "okay";
-
-                       ethernet-port@0 {
-                               phy-mode = "rgmii";
-                               phy-handle = <&phy0>;
-                       };
-                       ethernet-port@1 {
-                               /* Not used in this platform */
-                       };
-               };
-
                usb@68000000 {
                        status = "okay";
                };
index a0916d3..c78e55f 100644 (file)
@@ -87,9 +87,9 @@
                #address-cells = <1>;
                #size-cells = <0>;
                /* Check pin collisions */
-               gpio-sck = <&gpio1 28 GPIO_ACTIVE_HIGH>;
-               gpio-miso = <&gpio1 30 GPIO_ACTIVE_HIGH>;
-               gpio-mosi = <&gpio1 29 GPIO_ACTIVE_HIGH>;
+               sck-gpios = <&gpio1 28 GPIO_ACTIVE_HIGH>;
+               miso-gpios = <&gpio1 30 GPIO_ACTIVE_HIGH>;
+               mosi-gpios = <&gpio1 29 GPIO_ACTIVE_HIGH>;
                cs-gpios = <&gpio1 31 GPIO_ACTIVE_HIGH>;
                num-chipselects = <1>;
 
index 0c6e6d3..1b64cc8 100644 (file)
@@ -72,9 +72,9 @@
                #address-cells = <1>;
                #size-cells = <0>;
                /* Check pin collisions */
-               gpio-sck = <&gpio1 28 GPIO_ACTIVE_HIGH>;
-               gpio-miso = <&gpio1 30 GPIO_ACTIVE_HIGH>;
-               gpio-mosi = <&gpio1 29 GPIO_ACTIVE_HIGH>;
+               sck-gpios = <&gpio1 28 GPIO_ACTIVE_HIGH>;
+               miso-gpios = <&gpio1 30 GPIO_ACTIVE_HIGH>;
+               mosi-gpios = <&gpio1 29 GPIO_ACTIVE_HIGH>;
                cs-gpios = <&gpio1 31 GPIO_ACTIVE_HIGH>;
                num-chipselects = <1>;
 
index 3a2761d..5602ba8 100644 (file)
@@ -68,7 +68,7 @@
                };
        };
 
-       mdio0: ethernet-phy {
+       mdio0: mdio {
                compatible = "virtual,mdio-gpio";
                gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
                        <&gpio0 21 GPIO_ACTIVE_HIGH>; /* MDIO */
index 52b4dbc..a4a260c 100644 (file)
@@ -67,7 +67,7 @@
                };
        };
 
-       mdio0: ethernet-phy {
+       mdio0: mdio {
                compatible = "virtual,mdio-gpio";
                gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
                        <&gpio0 21 GPIO_ACTIVE_HIGH>; /* MDIO */
index 065ed10..cc053af 100644 (file)
                };
 
                rtc@45000000 {
-                       compatible = "cortina,gemini-rtc";
+                       compatible = "cortina,gemini-rtc", "faraday,ftrtc010";
                        reg = <0x45000000 0x100>;
                        interrupts = <17 IRQ_TYPE_LEVEL_HIGH>;
                        resets = <&syscon GEMINI_RESET_RTC>;
                        clock-names = "PCLK", "PCICLK";
                        pinctrl-names = "default";
                        pinctrl-0 = <&pci_default_pins>;
+                       device_type = "pci";
                        #address-cells = <3>;
                        #size-cells = <2>;
                        #interrupt-cells = <1>;
                        };
                };
 
+               crypto: crypto@62000000 {
+                       compatible = "cortina,sl3516-crypto";
+                       reg = <0x62000000 0x10000>;
+                       interrupts = <7 IRQ_TYPE_EDGE_RISING>;
+                       resets = <&syscon GEMINI_RESET_SECURITY>;
+                       clocks = <&syscon GEMINI_CLK_GATE_SECURITY>;
+               };
+
                ide@63000000 {
                        compatible = "cortina,gemini-pata", "faraday,ftide010";
                        reg = <0x63000000 0x1000>;
                        clock-names = "PCLK", "TVE";
                        pinctrl-names = "default";
                        pinctrl-0 = <&tvc_default_pins>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
                        status = "disabled";
                };
 
index 905900b..cf48ec1 100644 (file)
@@ -1,8 +1,8 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Hisilicon Ltd. Hi3620 SoC
+ * HiSilicon Ltd. Hi3620 SoC
  *
- * Copyright (C) 2012-2013 Hisilicon Ltd.
+ * Copyright (C) 2012-2013 HiSilicon Ltd.
  * Copyright (C) 2012-2013 Linaro Ltd.
  *
  * Author: Haojian Zhuang <haojian.zhuang@linaro.org>
index 0314763..f3faf24 100644 (file)
@@ -1,8 +1,8 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Hisilicon Ltd. HiP01 SoC
+ * HiSilicon Ltd. HiP01 SoC
  *
- * Copyright (C) 2014 Hisilicon Ltd.
+ * Copyright (C) 2014 HiSilicon Ltd.
  * Copyright (C) 2014 Huawei Ltd.
  *
  * Author: Wang Long <long.wanglong@huawei.com>
index 2a79636..e17f36b 100644 (file)
@@ -1,8 +1,8 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Hisilicon Ltd. HiP01 SoC
+ * HiSilicon Ltd. HiP01 SoC
  *
- * Copyright (c) 2014 Hisilicon Ltd.
+ * Copyright (c) 2014 HiSilicon Ltd.
  * Copyright (c) 2014 Huawei Ltd.
  *
  * Author: Wang Long <long.wanglong@huawei.com>
index bccf5ba..2424cc5 100644 (file)
@@ -1,8 +1,8 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Hisilicon Ltd. HiP04 SoC
+ * HiSilicon Ltd. HiP04 SoC
  *
- * Copyright (C) 2013-2014 Hisilicon Ltd.
+ * Copyright (C) 2013-2014 HiSilicon Ltd.
  * Copyright (C) 2013-2014 Linaro Ltd.
  *
  * Author: Haojian Zhuang <haojian.zhuang@linaro.org>
index 22b122d..7758c19 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
  * Copyright (c) 2013-2014 Linaro Ltd.
- * Copyright (c) 2013-2014 Hisilicon Limited.
+ * Copyright (c) 2013-2014 HiSilicon Limited.
  */
 
 /dts-v1/;
index 9721138..dc991ba 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
  * Copyright (c) 2013-2014 Linaro Ltd.
- * Copyright (c) 2013-2014 Hisilicon Limited.
+ * Copyright (c) 2013-2014 HiSilicon Limited.
  */
 
 #include <dt-bindings/clock/hix5hd2-clock.h>
index f984b70..908caf8 100644 (file)
 #define MX25_PAD_DE_B__DE_B                    0x1f0 0x3ec 0x000 0x00 0x000
 #define MX25_PAD_DE_B__GPIO_2_20               0x1f0 0x3ec 0x000 0x05 0x000
 
-#define MX25_PAD_GPIO_A__GPIO_A                        0x1f4 0x3f0 0x000 0x00 0x000
+#define MX25_PAD_GPIO_A__GPIO_1_0              0x1f4 0x3f0 0x000 0x00 0x000
 #define MX25_PAD_GPIO_A__CAN1_TX               0x1f4 0x3f0 0x000 0x06 0x000
 #define MX25_PAD_GPIO_A__USBOTG_PWR            0x1f4 0x3f0 0x000 0x02 0x000
 
-#define MX25_PAD_GPIO_B__GPIO_B                        0x1f8 0x3f4 0x000 0x00 0x000
+#define MX25_PAD_GPIO_B__GPIO_1_1              0x1f8 0x3f4 0x000 0x00 0x000
 #define MX25_PAD_GPIO_B__USBOTG_OC             0x1f8 0x3f4 0x57c 0x02 0x001
 #define MX25_PAD_GPIO_B__CAN1_RX               0x1f8 0x3f4 0x480 0x06 0x001
 
-#define MX25_PAD_GPIO_C__GPIO_C                        0x1fc 0x3f8 0x000 0x00 0x000
+#define MX25_PAD_GPIO_C__GPIO_1_2              0x1fc 0x3f8 0x000 0x00 0x000
 #define MX25_PAD_GPIO_C__PWM4_PWMO             0x1fc 0x3f8 0x000 0x01 0x000
 #define MX25_PAD_GPIO_C__I2C2_SCL              0x1fc 0x3f8 0x51c 0x02 0x001
 #define MX25_PAD_GPIO_C__KPP_COL4              0x1fc 0x3f8 0x52c 0x03 0x001
 #define MX25_PAD_GPIO_C__CAN2_TX               0x1fc 0x3f8 0x000 0x06 0x000
 #define MX25_PAD_GPIO_C__CSPI2_SS2             0x1fc 0x3f8 0x000 0x07 0x000
 
-#define MX25_PAD_GPIO_D__GPIO_D                        0x200 0x3fc 0x000 0x00 0x000
+#define MX25_PAD_GPIO_D__GPIO_1_3              0x200 0x3fc 0x000 0x00 0x000
 #define MX25_PAD_GPIO_D__I2C2_SDA              0x200 0x3fc 0x520 0x02 0x001
 #define MX25_PAD_GPIO_D__CAN2_RX               0x200 0x3fc 0x484 0x06 0x001
 #define MX25_PAD_GPIO_D__CSPI3_SS2             0x200 0x3fc 0x4c4 0x07 0x001
 
-#define MX25_PAD_GPIO_E__GPIO_E                        0x204 0x400 0x000 0x00 0x000
+#define MX25_PAD_GPIO_E__GPIO_1_4              0x204 0x400 0x000 0x00 0x000
 #define MX25_PAD_GPIO_E__I2C3_CLK              0x204 0x400 0x524 0x01 0x002
 #define MX25_PAD_GPIO_E__LD16                  0x204 0x400 0x000 0x02 0x000
 #define MX25_PAD_GPIO_E__AUD7_TXD              0x204 0x400 0x000 0x04 0x000
 #define MX25_PAD_GPIO_E__UART4_RXD             0x204 0x400 0x570 0x06 0x002
 
-#define MX25_PAD_GPIO_F__GPIO_F                        0x208 0x404 0x000 0x00 0x000
+#define MX25_PAD_GPIO_F__GPIO_1_5              0x208 0x404 0x000 0x00 0x000
 #define MX25_PAD_GPIO_F__LD17                  0x208 0x404 0x000 0x02 0x000
 #define MX25_PAD_GPIO_F__AUD7_TXC              0x208 0x404 0x000 0x04 0x000
 #define MX25_PAD_GPIO_F__UART4_TXD             0x208 0x404 0x000 0x06 0x000
diff --git a/arch/arm/boot/dts/imx28-lwe.dtsi b/arch/arm/boot/dts/imx28-lwe.dtsi
new file mode 100644 (file)
index 0000000..bb971e6
--- /dev/null
@@ -0,0 +1,170 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/*
+ * Copyright 2021
+ * Lukasz Majewski, DENX Software Engineering, lukma@denx.de
+ */
+
+/dts-v1/;
+#include "imx28.dtsi"
+
+/ {
+       aliases {
+               spi2 = &ssp3;
+       };
+
+       chosen {
+               bootargs = "root=/dev/mmcblk0p2 rootfstype=ext4 ro rootwait console=ttyAMA0,115200 panic=1";
+       };
+
+       memory@40000000 {
+               reg = <0x40000000 0x08000000>;
+       };
+
+       reg_3v3: regulator-reg-3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "3V3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
+       reg_usb_5v: regulator-reg-usb-5v {
+               compatible = "regulator-fixed";
+               regulator-name = "usb_vbus";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+       };
+
+       reg_fec_3v3: regulator-reg-fec-3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "fec-phy";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+};
+
+&duart {
+       pinctrl-names = "default";
+       pinctrl-0 = <&duart_pins_a>;
+       status = "okay";
+};
+
+&i2c0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c0_pins_a>;
+       status = "okay";
+};
+
+&saif0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&saif0_pins_a>;
+       #sound-dai-cells = <0>;
+       assigned-clocks = <&clks 53>;
+       assigned-clock-rates = <12000000>;
+       status = "okay";
+};
+
+&saif1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&saif1_pins_a>;
+       fsl,saif-master = <&saif0>;
+       #sound-dai-cells = <0>;
+       status = "okay";
+};
+
+&spi3_pins_a {
+       fsl,pinmux-ids = <
+               MX28_PAD_AUART2_RX__SSP3_D4
+               MX28_PAD_AUART2_TX__SSP3_D5
+               MX28_PAD_SSP3_SCK__SSP3_SCK
+               MX28_PAD_SSP3_MOSI__SSP3_CMD
+               MX28_PAD_SSP3_MISO__SSP3_D0
+               MX28_PAD_SSP3_SS0__SSP3_D3
+               MX28_PAD_AUART2_TX__GPIO_3_9
+       >;
+};
+
+&ssp0 {
+       compatible = "fsl,imx28-mmc";
+       pinctrl-names = "default";
+       pinctrl-0 = <&mmc0_8bit_pins_a>;
+       bus-width = <8>;
+       vmmc-supply = <&reg_3v3>;
+       non-removable;
+       status = "okay";
+};
+
+&ssp2 {
+       compatible = "fsl,imx28-spi";
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi2_pins_a>;
+       status = "okay";
+};
+
+&ssp3 {
+       compatible = "fsl,imx28-spi";
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi3_pins_a>;
+       status = "okay";
+
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               spi-max-frequency = <40000000>;
+               reg = <0>;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               label = "u-boot";
+                               reg = <0 0x80000>;
+                               read-only;
+                       };
+
+                       partition@80000 {
+                               label = "env0";
+                               reg = <0x80000 0x10000>;
+                       };
+
+                       partition@90000 {
+                               label = "env1";
+                               reg = <0x90000 0x10000>;
+                       };
+
+                       partition@100000 {
+                               label = "kernel";
+                               reg = <0x100000 0x400000>;
+                       };
+
+                       partition@500000 {
+                               label = "swupdate";
+                               reg = <0x500000 0x800000>;
+                       };
+               };
+       };
+};
+
+&usb0 {
+       vbus-supply = <&reg_usb_5v>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&usb0_pins_b>, <&usb0_id_pins_a>;
+       dr_mode = "host";
+       status = "okay";
+};
+
+&usbphy0 {
+       status = "okay";
+};
+
+&usb1 {
+       vbus-supply = <&reg_usb_5v>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&usb1_pins_b>;
+       dr_mode = "host";
+       status = "okay";
+};
+
+&usbphy1 {
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/imx28-xea.dts b/arch/arm/boot/dts/imx28-xea.dts
new file mode 100644 (file)
index 0000000..a400c10
--- /dev/null
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/*
+ * Copyright 2021
+ * Lukasz Majewski, DENX Software Engineering, lukma@denx.de
+ */
+
+/dts-v1/;
+#include "imx28-lwe.dtsi"
+
+/ {
+       compatible = "lwn,imx28-xea", "fsl,imx28";
+};
+
+&can0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&can1_pins_a>;
+       status = "okay";
+};
+
+&i2c1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c1_pins_b>;
+       status = "okay";
+};
+
+&pinctrl {
+       pinctrl-names = "default";
+       pinctrl-0 = <&hog_pins_a &hog_pins_tiva>;
+
+       hog_pins_a: hog@0 {
+               reg = <0>;
+               fsl,pinmux-ids = <
+                       MX28_PAD_GPMI_D00__GPIO_0_0
+                       MX28_PAD_GPMI_D02__GPIO_0_2
+                       MX28_PAD_GPMI_D05__GPIO_0_5
+                       MX28_PAD_GPMI_CE1N__GPIO_0_17
+                       MX28_PAD_GPMI_RDY0__GPIO_0_20
+                       MX28_PAD_GPMI_RDY1__GPIO_0_21
+                       MX28_PAD_GPMI_RDY2__GPIO_0_22
+                       MX28_PAD_GPMI_RDN__GPIO_0_24
+                       MX28_PAD_GPMI_CLE__GPIO_0_27
+                       MX28_PAD_LCD_VSYNC__GPIO_1_28
+                       MX28_PAD_SSP1_SCK__GPIO_2_12
+                       MX28_PAD_SSP1_CMD__GPIO_2_13
+                       MX28_PAD_SSP2_SS1__GPIO_2_20
+                       MX28_PAD_SSP2_SS2__GPIO_2_21
+                       MX28_PAD_LCD_D00__GPIO_1_0
+                       MX28_PAD_LCD_D01__GPIO_1_1
+                       MX28_PAD_LCD_D02__GPIO_1_2
+                       MX28_PAD_LCD_D03__GPIO_1_3
+                       MX28_PAD_LCD_D04__GPIO_1_4
+                       MX28_PAD_LCD_D05__GPIO_1_5
+                       MX28_PAD_LCD_D06__GPIO_1_6
+               >;
+               fsl,drive-strength = <MXS_DRIVE_4mA>;
+               fsl,voltage = <MXS_VOLTAGE_HIGH>;
+               fsl,pull-up = <MXS_PULL_DISABLE>;
+       };
+
+       hog_pins_tiva: hog@1 {
+               reg = <1>;
+               fsl,pinmux-ids = <
+                       MX28_PAD_GPMI_RDY3__GPIO_0_23
+                       MX28_PAD_GPMI_WRN__GPIO_0_25
+               >;
+               fsl,voltage = <MXS_VOLTAGE_HIGH>;
+               fsl,pull-up = <MXS_PULL_DISABLE>;
+       };
+
+       hog_pins_coding: hog@2 {
+               reg = <2>;
+               fsl,pinmux-ids = <
+                       MX28_PAD_GPMI_D01__GPIO_0_1
+                       MX28_PAD_GPMI_D03__GPIO_0_3
+                       MX28_PAD_GPMI_D04__GPIO_0_4
+                       MX28_PAD_GPMI_D06__GPIO_0_6
+                       MX28_PAD_GPMI_D07__GPIO_0_7
+               >;
+               fsl,voltage = <MXS_VOLTAGE_HIGH>;
+               fsl,pull-up = <MXS_PULL_DISABLE>;
+       };
+};
+
+&reg_fec_3v3 {
+       gpio = <&gpio0 0 0>;
+};
+
+&reg_usb_5v {
+       gpio = <&gpio0 2 0>;
+};
+
+&spi2_pins_a {
+       fsl,pinmux-ids = <
+               MX28_PAD_SSP2_SCK__SSP2_SCK
+               MX28_PAD_SSP2_MOSI__SSP2_CMD
+               MX28_PAD_SSP2_MISO__SSP2_D0
+               MX28_PAD_SSP2_SS0__GPIO_2_19
+       >;
+};
index 16addb3..7d49704 100644 (file)
        pinctrl-0 = <&pinctrl_weim>;
        status = "okay";
 
-       lan9221: lan9221@5,0 {
+       lan9221: ethernet@5,0 {
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_lan9221>;
                compatible = "smsc,lan9221", "smsc,lan9115";
index 9a2e1fd..6208fbb 100644 (file)
@@ -24,7 +24,7 @@
                reg = <0xf4000000 0x3ff0000>;
                ranges;
 
-               lan9220@f4000000 {
+               ethernet@f4000000 {
                        compatible = "smsc,lan9220", "smsc,lan9115";
                        reg = <0xf4000000 0x2000000>;
                        phy-mode = "mii";
diff --git a/arch/arm/boot/dts/imx6dl-b105pv2.dts b/arch/arm/boot/dts/imx6dl-b105pv2.dts
new file mode 100644 (file)
index 0000000..411aa72
--- /dev/null
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0 or MIT
+//
+// Device Tree Source for General Electric B105Pv2
+//
+// Copyright 2018-2021 General Electric Company
+// Copyright 2018-2021 Collabora
+
+/dts-v1/;
+#include "imx6dl-b1x5pv2.dtsi"
+
+/ {
+       model = "General Electric B105Pv2";
+       compatible = "ge,imx6dl-b105pv2", "congatec,qmx6", "fsl,imx6dl";
+
+       panel {
+               compatible = "auo,g101evn010";
+       };
+};
+
+&i2c3 {
+       touchscreen@41 {
+               compatible = "ilitek,ili251x";
+               reg = <0x41>;
+               pinctrl-names = "default";
+               pinctrl-0 =<&pinctrl_q7_gpio0>;
+               interrupt-parent = <&gpio5>;
+               interrupts = <2 IRQ_TYPE_EDGE_FALLING>;
+               reset-gpios = <&tca6424a 21 GPIO_ACTIVE_LOW>;
+               touchscreen-size-x = <1280>;
+               touchscreen-size-y = <800>;
+       };
+};
diff --git a/arch/arm/boot/dts/imx6dl-b105v2.dts b/arch/arm/boot/dts/imx6dl-b105v2.dts
new file mode 100644 (file)
index 0000000..d011127
--- /dev/null
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0 or MIT
+//
+// Device Tree Source for General Electric B105v2
+//
+// Copyright 2018-2021 General Electric Company
+// Copyright 2018-2021 Collabora
+
+/dts-v1/;
+#include "imx6dl-b1x5v2.dtsi"
+
+/ {
+       model = "General Electric B105v2";
+       compatible = "ge,imx6dl-b105v2", "congatec,qmx6", "fsl,imx6dl";
+
+       panel {
+               compatible = "auo,g101evn010";
+       };
+};
+
+&i2c3 {
+       touchscreen@41 {
+               compatible = "ilitek,ili251x";
+               reg = <0x41>;
+               pinctrl-names = "default";
+               pinctrl-0 =<&pinctrl_q7_gpio0>;
+               interrupt-parent = <&gpio5>;
+               interrupts = <2 IRQ_TYPE_EDGE_FALLING>;
+               reset-gpios = <&tca6424a 21 GPIO_ACTIVE_LOW>;
+               touchscreen-size-x = <1280>;
+               touchscreen-size-y = <800>;
+       };
+};
diff --git a/arch/arm/boot/dts/imx6dl-b125pv2.dts b/arch/arm/boot/dts/imx6dl-b125pv2.dts
new file mode 100644 (file)
index 0000000..ca840fa
--- /dev/null
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0 or MIT
+//
+// Device Tree Source for General Electric B125Pv2
+//
+// Copyright 2018-2021 General Electric Company
+// Copyright 2018-2021 Collabora
+
+/dts-v1/;
+#include "imx6dl-b1x5pv2.dtsi"
+
+/ {
+       model = "General Electric B125Pv2";
+       compatible = "ge,imx6dl-b125pv2", "congatec,qmx6", "fsl,imx6dl";
+
+       panel {
+               compatible = "auo,g121ean01";
+       };
+};
+
+&i2c3 {
+       touchscreen@2a {
+               compatible = "eeti,exc80h60";
+               reg = <0x2a>;
+               pinctrl-names = "default";
+               pinctrl-0 =<&pinctrl_q7_gpio0>;
+               interrupt-parent = <&gpio5>;
+               interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
+               reset-gpios = <&tca6424a 21 GPIO_ACTIVE_HIGH>;
+       };
+};
diff --git a/arch/arm/boot/dts/imx6dl-b125v2.dts b/arch/arm/boot/dts/imx6dl-b125v2.dts
new file mode 100644 (file)
index 0000000..81e5a9c
--- /dev/null
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0 or MIT
+//
+// Device Tree Source for General Electric B125v2
+//
+// Copyright 2018-2021 General Electric Company
+// Copyright 2018-2021 Collabora
+
+/dts-v1/;
+#include "imx6dl-b1x5v2.dtsi"
+
+/ {
+       model = "General Electric B125v2";
+       compatible = "ge,imx6dl-b125v2", "congatec,qmx6", "fsl,imx6dl";
+
+       panel {
+               compatible = "auo,g121ean01";
+       };
+};
+
+&i2c3 {
+       touchscreen@2a {
+               compatible = "eeti,exc80h60";
+               reg = <0x2a>;
+               pinctrl-names = "default";
+               pinctrl-0 =<&pinctrl_q7_gpio0>;
+               interrupt-parent = <&gpio5>;
+               interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
+               reset-gpios = <&tca6424a 21 GPIO_ACTIVE_HIGH>;
+       };
+};
diff --git a/arch/arm/boot/dts/imx6dl-b155v2.dts b/arch/arm/boot/dts/imx6dl-b155v2.dts
new file mode 100644 (file)
index 0000000..c861937
--- /dev/null
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0 or MIT
+//
+// Device Tree Source for General Electric B155v2
+//
+// Copyright 2018-2021 General Electric Company
+// Copyright 2018-2021 Collabora
+
+/dts-v1/;
+#include "imx6dl-b1x5v2.dtsi"
+
+/ {
+       model = "General Electric B155v2";
+       compatible = "ge,imx6dl-b155v2", "congatec,qmx6", "fsl,imx6dl";
+
+       panel {
+               compatible = "auo,g156xtn01";
+       };
+};
+
+&i2c3 {
+       touchscreen@2a {
+               compatible = "eeti,exc80h84";
+               reg = <0x2a>;
+               pinctrl-names = "default";
+               pinctrl-0 =<&pinctrl_q7_gpio0>;
+               interrupt-parent = <&gpio5>;
+               interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
+               touchscreen-inverted-x;
+               touchscreen-inverted-y;
+               reset-gpios = <&tca6424a 21 GPIO_ACTIVE_HIGH>;
+       };
+};
diff --git a/arch/arm/boot/dts/imx6dl-b1x5pv2.dtsi b/arch/arm/boot/dts/imx6dl-b1x5pv2.dtsi
new file mode 100644 (file)
index 0000000..ec5b664
--- /dev/null
@@ -0,0 +1,413 @@
+// SPDX-License-Identifier: GPL-2.0 or MIT
+//
+// Device Tree Source for General Electric B1x5Pv2
+// patient monitor series
+//
+// Copyright 2018-2021 General Electric Company
+// Copyright 2018-2021 Collabora
+
+#include <dt-bindings/input/input.h>
+#include "imx6dl-qmx6.dtsi"
+
+/ {
+       chosen {
+               stdout-path = &uart3;
+       };
+
+       /* Do not allow frequencies above 800MHz */
+       cpus {
+               cpu@0 {
+                       operating-points = <
+                               /* kHz    uV */
+                               792000  1175000
+                               396000  1150000
+                       >;
+                       fsl,soc-operating-points = <
+                               /* ARM kHz      SOC-PU uV */
+                               792000  1175000
+                               396000  1175000
+                       >;
+               };
+
+               cpu@1 {
+                       operating-points = <
+                               /* kHz    uV */
+                               792000  1175000
+                               396000  1150000
+                       >;
+                       fsl,soc-operating-points = <
+                               /* ARM kHz      SOC-PU uV */
+                               792000  1175000
+                               396000  1175000
+                       >;
+               };
+       };
+
+       reg_syspwr: regulator-12v {
+               compatible = "regulator-fixed";
+               regulator-name = "SYS_PWR";
+               regulator-min-microvolt = <12000000>;
+               regulator-max-microvolt = <12000000>;
+       };
+
+       reg_5v_pmc: regulator-5v-pmc {
+               compatible = "regulator-fixed";
+               regulator-name = "5V PMC";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&reg_syspwr>;
+       };
+
+       reg_5v: regulator-5v {
+               compatible = "regulator-fixed";
+               regulator-name = "5V";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&reg_syspwr>;
+       };
+
+       reg_3v3: regulator-3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "3V3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&reg_syspwr>;
+       };
+
+       reg_5v0_audio: regulator-5v0-audio {
+               compatible = "regulator-fixed";
+               regulator-name = "5V0_AUDIO";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&reg_5v>;
+               gpio = <&tca6424a 16 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               /*
+                * This must be always-on for da7212, which has some not
+                * properly documented dependencies for it's speaker supply
+                * pin. The issue manifests as speaker volume being very low.
+                */
+               regulator-always-on;
+       };
+
+
+       reg_3v3_audio: regulator-3v3-audio {
+               compatible = "regulator-fixed";
+               regulator-name = "3V3_AUDIO";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&reg_3v3>;
+               pinctrl-0 = <&pinctrl_q7_hda_reset>;
+               pinctrl-names = "default";
+               gpio = <&gpio6 8 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       reg_2v5_audio: regulator-2v5-audio {
+               compatible = "regulator-fixed";
+               regulator-name = "2V5_AUDIO";
+               regulator-min-microvolt = <2500000>;
+               regulator-max-microvolt = <2500000>;
+               regulator-always-on;
+               vin-supply = <&reg_3v3_audio>;
+
+       };
+
+       reg_wlan: regulator-wlan {
+               compatible = "regulator-fixed";
+               regulator-name = "WLAN";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&reg_3v3>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_q7_sdio_power>;
+               gpio = <&gpio4 30 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               startup-delay-us = <70000>;
+       };
+
+       reg_bl: regulator-backlight {
+               compatible = "regulator-fixed";
+               regulator-name = "LED_VCC";
+               regulator-min-microvolt = <12000000>;
+               regulator-max-microvolt = <12000000>;
+               vin-supply = <&reg_syspwr>;
+               pinctrl-0 = <&pinctrl_q7_lcd_power>;
+               pinctrl-names = "default";
+               gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       reg_lcd: regulator-lcd {
+               compatible = "regulator-fixed";
+               regulator-name = "LCD_5V";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&reg_5v>;
+       };
+
+       usb_power: regulator-usb-power {
+               compatible = "regulator-fixed";
+               regulator-name = "USB POWER";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&reg_5v>;
+       };
+
+       charger: battery-charger {
+               compatible = "gpio-charger"; /* ti,bq24172 */
+               charger-type = "mains";
+               gpios = <&tca6424a 3 GPIO_ACTIVE_LOW>;
+               charge-current-limit-gpios = <&tca6424a 11 GPIO_ACTIVE_HIGH>,
+                                            <&tca6424a 12 GPIO_ACTIVE_HIGH>;
+               charge-current-limit-mapping = <1300000 0x0>,
+                                              <700000 0x1>,
+                                              <0 0x2>;
+               charge-status-gpios = <&tca6424a 6 GPIO_ACTIVE_HIGH>;
+       };
+
+       poweroff {
+               compatible = "gpio-poweroff";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_q7_spi_cs1>;
+               gpios = <&gpio4 25 GPIO_ACTIVE_LOW>;
+       };
+
+       power-button-key {
+               compatible = "gpio-keys";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_q7_sleep_button>;
+
+               power-button {
+                       label = "power button";
+                       gpios = <&gpio4 7 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_POWER>;
+               };
+       };
+
+       rotary-encoder-key {
+               compatible = "gpio-keys";
+
+               rotary-encoder-press {
+                       label = "rotary-encoder press";
+                       gpios = <&tca6424a 0 GPIO_ACTIVE_HIGH>;
+                       linux,code = <KEY_ENTER>;
+                       linux,can-disable;
+               };
+       };
+
+       rotary-encoder {
+               compatible = "rotary-encoder";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_q7_gpio2 &pinctrl_q7_gpio4>;
+               gpios = <&gpio4 26 GPIO_ACTIVE_LOW>, <&gpio1 0 GPIO_ACTIVE_LOW>;
+               rotary-encoder,relative-axis;
+               rotary-encoder,steps-per-period = <2>;
+               wakeup-source;
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_q7_gpio1 &pinctrl_q7_gpio3 &pinctrl_q7_gpio5>;
+
+               alarm1 {
+                       label = "alarm:red";
+                       gpios = <&gpio1 8 GPIO_ACTIVE_HIGH>;
+               };
+
+               alarm2 {
+                       label = "alarm:yellow";
+                       gpios = <&gpio4 27 GPIO_ACTIVE_HIGH>;
+               };
+
+               alarm3 {
+                       label = "alarm:blue";
+                       gpios = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+               };
+       };
+
+       backlight: backlight {
+               compatible = "pwm-backlight";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_q7_backlight_enable>;
+               power-supply = <&reg_bl>;
+               pwms = <&pwm4 0 5000000 0>;
+               brightness-levels = <0 255>;
+               num-interpolated-steps = <255>;
+               default-brightness-level = <179>;
+               enable-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
+       };
+
+       panel {
+               backlight = <&backlight>;
+               power-supply = <&reg_lcd>;
+
+               port {
+                       panel_in: endpoint {
+                               remote-endpoint = <&lvds0_out>;
+                       };
+               };
+       };
+
+       sound {
+               compatible = "simple-audio-card";
+               simple-audio-card,name = "audio-card";
+               simple-audio-card,format = "i2s";
+               simple-audio-card,bitclock-master = <&dailink_master>;
+               simple-audio-card,frame-master = <&dailink_master>;
+               simple-audio-card,widgets = "Speaker", "Ext Spk";
+               simple-audio-card,audio-routing = "Ext Spk", "LINE";
+
+               simple-audio-card,cpu {
+                       sound-dai = <&ssi1>;
+               };
+
+               dailink_master: simple-audio-card,codec {
+                       sound-dai = <&codec>;
+               };
+       };
+
+       clk_ext_audio_codec: clock-codec {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <12288000>;
+       };
+};
+
+&audmux {
+       status = "okay";
+};
+
+&fec {
+       status = "okay";
+};
+
+&hdmi {
+       status = "okay";
+};
+
+&i2c1 {
+       battery: battery@b {
+               compatible = "ti,bq20z65", "sbs,sbs-battery";
+               reg = <0x0b>;
+               sbs,battery-detect-gpios = <&tca6424a 5 GPIO_ACTIVE_LOW>;
+               sbs,i2c-retry-count = <5>;
+               power-supplies = <&charger>;
+       };
+
+       codec: audio-codec@1a {
+               compatible = "dlg,da7212";
+               reg = <0x1a>;
+               #sound-dai-cells = <0>;
+               VDDA-supply = <&reg_2v5_audio>;
+               VDDSP-supply = <&reg_5v0_audio>;
+               VDDMIC-supply = <&reg_3v3_audio>;
+               VDDIO-supply = <&reg_3v3_audio>;
+               clocks = <&clk_ext_audio_codec>;
+               clock-names = "mclk";
+       };
+};
+
+&i2c5 {
+       tca6424a: gpio-controller@22 {
+               compatible = "ti,tca6424";
+               reg = <0x22>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               vcc-supply = <&reg_3v3>;
+               interrupt-parent = <&gpio7>;
+               interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_q7_gpio6>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+               gpio-line-names = "GPIO_ROTOR#", "ACM_IO_INT", "TMP_SENSOR_IRQ", "AC_IN",
+                                 "TF_S", "BATT_T", "LED_INC_CHAR", "ACM1_OCF",
+                                 "ACM2_OCF", "ACM_IO_RST", "USB1_POWER_EN", "EGPIO_CC_CTL0",
+                                 "EGPIO_CC_CTL1", "12V_OEMNBP_EN", "CP2105_RST", "",
+                                 "SPEAKER_PA_EN", "ARM7_UPI_RESET", "ARM7_PWR_RST", "NURSE_CALL",
+                                 "MARKER_EN", "EGPIO_TOUCH_RST", "PRESSURE_INT1", "PRESSURE_INT2";
+
+       };
+
+       tmp75: temperature-sensor@48 {
+               compatible = "ti,tmp75";
+               reg = <0x48>;
+               vs-supply = <&reg_3v3>;
+               interrupt-parent = <&tca6424a>;
+               interrupts = <2 IRQ_TYPE_EDGE_FALLING>;
+       };
+};
+
+&ldb {
+       status = "okay";
+
+       lvds0: lvds-channel@0 {
+               status = "okay";
+               fsl,data-mapping = "spwg";
+               fsl,data-width = <24>;
+
+               port@4 {
+                       reg = <4>;
+
+                       lvds0_out: endpoint {
+                               remote-endpoint = <&panel_in>;
+                       };
+               };
+       };
+};
+
+&pwm4 {
+       status = "okay";
+};
+
+&ssi1 {
+       fsl,mode = "i2s-slave";
+       status = "okay";
+};
+
+&usbotg {
+       vbus-supply = <&usb_power>;
+       disable-over-current;
+       dr_mode = "host";
+       status = "okay";
+
+       /*
+        * TPS2051BDGN fault-gpio is connected to Q7[86] USB_0_1_OC_N.
+        * On QMX6 this is not connceted to the i.MX6, but to the USB Hub
+        * from &usbh1. This means, that we cannot easily detect and handle
+        * over-current events. Fortunately the regulator limits the current
+        * automatically, so the hardware is still protected.
+        */
+};
+
+&usdhc4 {
+       /* WiFi module */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc4>;
+       bus-width = <4>;
+       no-1-8-v;
+       non-removable;
+       wakeup-source;
+       keep-power-in-suspend;
+       cap-power-off-card;
+       max-frequency = <25000000>;
+       vmmc-supply = <&reg_wlan>;
+       #address-cells = <1>;
+       #size-cells = <0>;
+       status = "okay";
+
+       wlcore: wlcore@2 {
+               compatible = "ti,wl1837";
+               reg = <2>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_q7_gpio7>;
+
+               interrupt-parent = <&gpio4>;
+               interrupts = <14 IRQ_TYPE_LEVEL_HIGH>;
+
+               tcxo-clock-frequency = <26000000>;
+       };
+};
diff --git a/arch/arm/boot/dts/imx6dl-b1x5v2.dtsi b/arch/arm/boot/dts/imx6dl-b1x5v2.dtsi
new file mode 100644 (file)
index 0000000..a326a33
--- /dev/null
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: GPL-2.0 or MIT
+//
+// Device Tree Source for General Electric B1x5v2
+// patient monitor series
+//
+// Copyright 2018-2021 General Electric Company
+// Copyright 2018-2021 Collabora
+
+#include <dt-bindings/input/input.h>
+#include "imx6dl-b1x5pv2.dtsi"
+
+/ {
+       reg_3v3_acm: regulator-3v3-acm {
+               compatible = "regulator-fixed";
+               regulator-name = "3V3 ACM";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+               vin-supply = <&reg_3v3>;
+       };
+};
+
+&i2c1 {
+       tca6416: gpio-controller@21 {
+               compatible = "ti,tca6416";
+               reg = <0x21>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               reset-gpios = <&tca6424a 9 GPIO_ACTIVE_LOW>;
+               vcc-supply = <&reg_3v3_acm>;
+               gpio-line-names = "ACM1_EN", "ACM1_CL0", "ACM1_CL1", "ACM1_CL2",
+                                 "", "ACM2_EN", "ACM2_CL0", "ACM2_CL1",
+                                 "ACM2_CL2", "", "", "",
+                                 "", "", "", "";
+
+               /*
+                * The interrupt pin is connected to &tca6424a pin 1, but the Linux
+                * TCA6424 driver cannot handle low type interrupts at the moment
+                * (and support cannot be added without some ugly hacks). Since this
+                * controller does not have any input type GPIOs, just pretend
+                * that the interrupt pin is unconnected.
+                */
+       };
+};
+
+&i2c5 {
+       mpl3115a2: pressure-sensor@60 {
+               compatible = "fsl,mpl3115";
+               reg = <0x60>;
+               vcc-supply = <&reg_3v3_acm>;
+
+               /*
+                * The MPL3115 interrupts are connected to pin 22 and 23
+                * of &tca6424a, but the binding does not yet support
+                * interrupts.
+                */
+       };
+};
index 4d0d3d3..60fe5f1 100644 (file)
                interrupts-extended = <&gpio3 20 IRQ_TYPE_EDGE_FALLING>;
                pendown-gpio = <&gpio3 20 GPIO_ACTIVE_LOW>;
 
-               touchscreen-size-x = <800>;
-               touchscreen-size-y = <480>;
                touchscreen-inverted-x;
                touchscreen-inverted-y;
                touchscreen-max-pressure = <4095>;
                ti,vref-delay-usecs = /bits/ 16 <100>;
                ti,x-plate-ohms = /bits/ 16 <800>;
                ti,y-plate-ohms = /bits/ 16 <300>;
-
+               ti,debounce-max = /bits/ 16 <3>;
+               ti,debounce-tol = /bits/ 16 <70>;
+               ti,debounce-rep = /bits/ 16 <3>;
                wakeup-source;
        };
 };
index ae6da24..190d266 100644 (file)
 
        backlight_lcd: backlight-lcd {
                compatible = "pwm-backlight";
-               pinctrl-names = "default";
-               pinctrl-0 = <&pinctrl_backlight>;
-               pwms = <&pwm1 0 500000>;
+               pwms = <&pwm1 0 500000 0>;
                brightness-levels = <0 20 81 248 1000>;
                default-brightness-level = <20>;
                num-interpolated-steps = <21>;
                power-supply = <&reg_bl_12v0>;
-               enable-gpios = <&gpio4 28 GPIO_ACTIVE_HIGH>;
        };
 
        keys {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ecspi2>;
        status = "okay";
+
+       touchscreen@0 {
+               compatible = "ti,tsc2046";
+               reg = <0>;
+               pinctrl-0 = <&pinctrl_tsc>;
+               pinctrl-names ="default";
+               spi-max-frequency = <100000>;
+               interrupts-extended = <&gpio3 20 IRQ_TYPE_EDGE_FALLING>;
+               pendown-gpio = <&gpio3 20 GPIO_ACTIVE_LOW>;
+               touchscreen-max-pressure = <4095>;
+               ti,vref-delay-usecs = /bits/ 16 <100>;
+               ti,x-plate-ohms = /bits/ 16 <800>;
+               ti,y-plate-ohms = /bits/ 16 <300>;
+               ti,debounce-max = /bits/ 16 <3>;
+               ti,debounce-tol = /bits/ 16 <70>;
+               ti,debounce-rep = /bits/ 16 <3>;
+               wakeup-source;
+       };
 };
 
 &i2c1 {
 };
 
 &pwm1 {
-       #pwm-cells = <2>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_pwm1>;
        status = "okay";
 };
 
 &ssi1 {
-       #sound-dai-cells = <0>;
-       fsl,mode = "ac97-slave";
        status = "okay";
 };
 
        status = "disabled";
 };
 
-&vpu {
-       status = "disabled";
-};
-
 &iomuxc {
        pinctrl_audmux: audmuxgrp {
                fsl,pins = <
                >;
        };
 
-       pinctrl_backlight: backlightgrp {
-               fsl,pins = <
-                       MX6QDL_PAD_DISP0_DAT7__GPIO4_IO28       0x1b0b0
-               >;
-       };
-
        pinctrl_can1phy: can1phy {
                fsl,pins = <
                        /* CAN1_SR */
diff --git a/arch/arm/boot/dts/imx6dl-qmx6.dtsi b/arch/arm/boot/dts/imx6dl-qmx6.dtsi
new file mode 100644 (file)
index 0000000..150d698
--- /dev/null
@@ -0,0 +1,612 @@
+// SPDX-License-Identifier: GPL-2.0 or MIT
+//
+// Device Tree Source for i.MX6DL based congatec QMX6
+// System on Module
+//
+// Copyright 2018-2021 General Electric Company
+// Copyright 2018-2021 Collabora
+// Copyright 2016 congatec AG
+
+#include "imx6dl.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/sound/fsl-imx-audmux.h>
+
+/ {
+       memory@10000000 {
+               reg = <0x10000000 0x40000000>;
+       };
+
+       reg_3p3v: 3p3v {
+               compatible = "regulator-fixed";
+               regulator-name = "3P3V";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
+       i2cmux {
+               compatible = "i2c-mux-gpio";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               mux-gpios = <&gpio6 9 GPIO_ACTIVE_HIGH>;
+               i2c-parent = <&i2c2>;
+
+               i2c5: i2c@0 {
+                       reg = <0>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               i2c6: i2c@1 {
+                       reg = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+       };
+};
+
+&audmux {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_audmux>;
+
+       audmux_ssi1 {
+               fsl,audmux-port = <MX51_AUDMUX_PORT1_SSI0>;
+               fsl,port-config = <
+                       (IMX_AUDMUX_V2_PTCR_TFSDIR |
+                       IMX_AUDMUX_V2_PTCR_TFSEL(MX51_AUDMUX_PORT6) |
+                       IMX_AUDMUX_V2_PTCR_TCLKDIR |
+                       IMX_AUDMUX_V2_PTCR_TCSEL(MX51_AUDMUX_PORT6) |
+                       IMX_AUDMUX_V2_PTCR_SYN)
+                       IMX_AUDMUX_V2_PDCR_RXDSEL(MX51_AUDMUX_PORT6)
+               >;
+       };
+
+       audmux_aud6 {
+               fsl,audmux-port = <MX51_AUDMUX_PORT6>;
+               fsl,port-config = <
+                       IMX_AUDMUX_V2_PTCR_SYN
+                       IMX_AUDMUX_V2_PDCR_RXDSEL(MX51_AUDMUX_PORT1_SSI0)
+               >;
+       };
+};
+
+&clks {
+       clocks = <&rtc_sqw>;
+       clock-names = "ckil";
+       assigned-clocks = <&clks IMX6QDL_CLK_LDB_DI0_SEL>,
+                         <&clks IMX6QDL_CLK_LDB_DI1_SEL>;
+       assigned-clock-parents = <&clks IMX6QDL_CLK_PLL2_PFD0_352M>,
+                                <&clks IMX6QDL_CLK_PLL2_PFD0_352M>;
+};
+
+&ecspi1 {
+       cs-gpios = <&gpio3 19 GPIO_ACTIVE_LOW>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_spi1>;
+       status = "okay";
+
+       flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "sst,sst25vf032b", "jedec,spi-nor";
+               spi-max-frequency = <20000000>;
+               reg = <0>;
+
+               partition@0 {
+                       label = "bootloader";
+                       reg = <0x0000000 0x100000>;
+               };
+
+               partition@100000 {
+                       label = "user";
+                       reg = <0x0100000 0x2fc000>;
+               };
+
+               partition@3fc000 {
+                       label = "reserved";
+                       reg = <0x03fc000 0x4000>;
+                       read-only;
+               };
+       };
+};
+
+&fec {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_enet &pinctrl_phy_reset>;
+       phy-mode = "rgmii-id";
+       phy-reset-gpios = <&gpio3 23 GPIO_ACTIVE_LOW>;
+       fsl,magic-packet;
+       phy-handle = <&phy0>;
+
+       mdio {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               phy0: ethernet-phy@6 {
+                       reg = <6>;
+                       qca,clk-out-frequency = <125000000>;
+               };
+       };
+};
+
+&i2c1 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default", "gpio";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       pinctrl-1 = <&pinctrl_i2c1_gpio>;
+       scl-gpios = <&gpio3 21 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       sda-gpios = <&gpio3 28 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       status = "okay";
+};
+
+&i2c2 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default", "gpio";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       pinctrl-1 = <&pinctrl_i2c2_gpio>;
+       scl-gpios = <&gpio4 12 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       sda-gpios = <&gpio4 13 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       status = "okay";
+};
+
+&i2c3 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default", "gpio";
+       pinctrl-0 = <&pinctrl_i2c3>;
+       pinctrl-1 = <&pinctrl_i2c3_gpio>;
+       scl-gpios = <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       sda-gpios = <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       status = "okay";
+
+       rtc: m41t62@68 {
+               compatible = "st,m41t62";
+               reg = <0x68>;
+
+               rtc_sqw: clock {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <32768>;
+               };
+       };
+};
+
+&i2c6 {
+       pmic@8 {
+               compatible = "fsl,pfuze100";
+               reg = <0x08>;
+
+               regulators {
+                       sw1a_reg: sw1ab {
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <6250>;
+                       };
+
+                       sw1c_reg: sw1c {
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <6250>;
+                       };
+
+                       sw2_reg: sw2 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       sw3a_reg: sw3a {
+                               regulator-min-microvolt = <400000>;
+                               regulator-max-microvolt = <1975000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       sw3b_reg: sw3b {
+                               regulator-min-microvolt = <400000>;
+                               regulator-max-microvolt = <1975000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       sw4_reg: sw4 {
+                               regulator-min-microvolt = <675000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       swbst_reg: swbst {
+                               regulator-min-microvolt = <5000000>;
+                               regulator-max-microvolt = <5150000>;
+                       };
+
+                       snvs_reg: vsnvs {
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <3000000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vref_reg: vrefddr {
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       /*
+                        * keep VGEN3, VGEN4 and VGEN5 enabled in order to
+                        * maintain backward compatibility with hw-rev. A.0
+                        */
+                       vgen3_reg: vgen3 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vgen4_reg: vgen4 {
+                               regulator-min-microvolt = <2500000>;
+                               regulator-max-microvolt = <2500000>;
+                               regulator-always-on;
+                       };
+
+                       vgen5_reg: vgen5 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       /* supply voltage for eMMC */
+                       vgen6_reg: vgen6 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+               };
+       };
+};
+
+&pcie {
+       reset-gpio = <&gpio1 20 0>;
+};
+
+&pwm4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_pwm4>;
+};
+
+&reg_arm {
+       vin-supply = <&sw1a_reg>;
+};
+
+&reg_pu {
+       vin-supply = <&sw1c_reg>;
+};
+
+&reg_soc {
+       vin-supply = <&sw1c_reg>;
+};
+
+&snvs_poweroff {
+       status = "okay";
+};
+
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart2>;
+       status = "okay";
+};
+
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart3>;
+       status = "okay";
+};
+
+&usbh1 {
+       /* Connected to USB-Hub SMSC USB2514, provides P0, P2, P3, P4 on Qseven connector */
+       vbus-supply = <&reg_5v>;
+       status = "okay";
+};
+
+&usbotg {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usbotg>;
+};
+
+&usdhc2 {
+       /* MicroSD card slot */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
+       no-1-8-v;
+       keep-power-in-suspend;
+       wakeup-source;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+};
+
+&usdhc3 {
+       /* eMMC module */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       non-removable;
+       bus-width = <8>;
+       no-1-8-v;
+       keep-power-in-suspend;
+       wakeup-source;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+};
+
+&wdog1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_wdog>;
+       fsl,ext-reset-output;
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_hog>;
+
+       qmx6mux: imx6qdl-qmx6 {
+               pinctrl_audmux: audmuxgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_DI0_PIN2__AUD6_TXD           0x110b0 /* Q7[67] HDA_SDO */
+                               MX6QDL_PAD_DI0_PIN3__AUD6_TXFS          0x30b0 /* Q7[59] HDA_SYNC */
+                               MX6QDL_PAD_DI0_PIN4__AUD6_RXD           0x30b0 /* Q7[65] HDA_SDI */
+                               MX6QDL_PAD_DI0_PIN15__AUD6_TXC          0x30b0 /* Q7[63] HDA_BITCLK */
+                       >;
+               };
+
+               /* PHY is on System on Module, Q7[3-15] have Ethernet lines */
+               pinctrl_enet: enet {
+                       fsl,pins = <
+                               MX6QDL_PAD_ENET_MDIO__ENET_MDIO         0x1b0b0
+                               MX6QDL_PAD_ENET_MDC__ENET_MDC           0x1b0b0
+                               MX6QDL_PAD_RGMII_TXC__RGMII_TXC         0x1b030
+                               MX6QDL_PAD_RGMII_TD0__RGMII_TD0         0x1b030
+                               MX6QDL_PAD_RGMII_TD1__RGMII_TD1         0x1b030
+                               MX6QDL_PAD_RGMII_TD2__RGMII_TD2         0x1b030
+                               MX6QDL_PAD_RGMII_TD3__RGMII_TD3         0x1b030
+                               MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL   0x1b030
+                               MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK    0x1b0b0
+                               MX6QDL_PAD_RGMII_RXC__RGMII_RXC         0x1b030
+                               MX6QDL_PAD_RGMII_RD0__RGMII_RD0         0x1b030
+                               MX6QDL_PAD_RGMII_RD1__RGMII_RD1         0x1b030
+                               MX6QDL_PAD_RGMII_RD2__RGMII_RD2         0x1b030
+                               MX6QDL_PAD_RGMII_RD3__RGMII_RD3         0x1b030
+                               MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL   0x1b030
+                               MX6QDL_PAD_ENET_TX_EN__ENET_TX_EN       0x1b0b0
+                       >;
+               };
+
+               pinctrl_hog: hoggrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_2__GPIO1_IO02           0x80000000 /* PCIE_WAKE_B */
+                               MX6QDL_PAD_NANDF_WP_B__GPIO6_IO09       0x80000000 /* I2C multiplexer */
+                               MX6QDL_PAD_NANDF_D6__GPIO2_IO06         0x80000000 /* SD4_CD# */
+                               MX6QDL_PAD_NANDF_D7__GPIO2_IO07         0x80000000 /* SD4_WP */
+                               MX6QDL_PAD_CSI0_MCLK__CCM_CLKO1         0x80000000 /* Camera MCLK */
+                       >;
+               };
+
+               pinctrl_i2c1: i2c1 {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D21__I2C1_SCL            0x4001b8b1 /* Q7[66] I2C_CLK */
+                               MX6QDL_PAD_EIM_D28__I2C1_SDA            0x4001b8b1 /* Q7[68] I2C_DAT */
+                       >;
+               };
+
+               pinctrl_i2c1_gpio: i2c1-gpio {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D21__GPIO3_IO21          0x1b0b0 /* Q7[66] I2C_CLK */
+                               MX6QDL_PAD_EIM_D28__GPIO3_IO28          0x1b0b0 /* Q7[68] I2C_DAT */
+                       >;
+               };
+
+               pinctrl_i2c2: i2c2 {
+                       fsl,pins = <
+                               MX6QDL_PAD_KEY_COL3__I2C2_SCL           0x4001b8b1 /* Q7[152] SDVO_CTRL_CLK */
+                               MX6QDL_PAD_KEY_ROW3__I2C2_SDA           0x4001b8b1 /* Q7[150] SDVO_CTRL_DAT */
+                       >;
+               };
+
+               pinctrl_i2c2_gpio: i2c2-gpio {
+                       fsl,pins = <
+                               MX6QDL_PAD_KEY_COL3__GPIO4_IO12         0x1b0b0 /* Q7[152] SDVO_CTRL_CLK */
+                               MX6QDL_PAD_KEY_ROW3__GPIO4_IO13         0x1b0b0 /* Q7[150] SDVO_CTRL_DAT */
+                       >;
+               };
+
+               pinctrl_i2c3: i2c3 {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_3__I2C3_SCL             0x4001b8b1 /* Q7[60] SMB_CLK */
+                               MX6QDL_PAD_GPIO_6__I2C3_SDA             0x4001b8b1 /* Q7[62] SMB_DAT */
+                       >;
+               };
+
+               pinctrl_i2c3_gpio: i2c3-gpio {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_3__GPIO1_IO03           0x1b0b0 /* Q7[60] SMB_CLK */
+                               MX6QDL_PAD_GPIO_6__GPIO1_IO06           0x1b0b0 /* Q7[62] SMB_DAT */
+                       >;
+               };
+
+               pinctrl_phy_reset: phy-reset {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D23__GPIO3_IO23          0x1b0b0 /* RGMII Phy Reset */
+                       >;
+               };
+
+               pinctrl_pwm4: pwm4 {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD1_CMD__PWM4_OUT            0x1b0b1 /* Q7[123] LVDS_BLT_CTRL */
+                       >;
+               };
+
+               pinctrl_q7_backlight_enable: q7-backlight-enable {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_9__GPIO1_IO09           0x1b0b0 /* Q7[112] LVDS_BLEN */
+                       >;
+               };
+
+               pinctrl_q7_gpio0: q7-gpio0 {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_A25__GPIO5_IO02          0x1b0b0 /* Q7[185] GPIO0 */
+                       >;
+               };
+
+               pinctrl_q7_gpio1: q7-gpio1 {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_8__GPIO1_IO08           0x1b0b0 /* Q7[186] GPIO1 */
+                       >;
+               };
+
+               pinctrl_q7_gpio2: q7-gpio2 {
+                       fsl,pins = <
+                               MX6QDL_PAD_DISP0_DAT5__GPIO4_IO26       0x1b0b0 /* Q7[187] GPIO2 */
+                       >;
+               };
+
+               pinctrl_q7_gpio3: q7-gpio3 {
+                       fsl,pins = <
+                               MX6QDL_PAD_DISP0_DAT6__GPIO4_IO27       0x1b0b0 /* Q7[188] GPIO3 */
+                       >;
+               };
+
+               pinctrl_q7_gpio4: q7-gpio4 {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_0__GPIO1_IO00           0x1b0b0 /* Q7[189] GPIO4 */
+                       >;
+               };
+
+               pinctrl_q7_gpio5: q7-gpio5 {
+                       fsl,pins = <
+                               MX6QDL_PAD_KEY_ROW4__GPIO4_IO15         0x1b0b0 /* Q7[190] GPIO5 */
+                       >;
+               };
+
+               pinctrl_q7_gpio6: q7-gpio6 {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_16__GPIO7_IO11          0x1b0b0 /* Q7[191] GPIO6 */
+                       >;
+               };
+
+               pinctrl_q7_gpio7: q7-gpio7 {
+                       fsl,pins = <
+                               MX6QDL_PAD_KEY_COL4__GPIO4_IO14         0x1b0b0 /* Q7[192] GPIO7 */
+                       >;
+               };
+
+               pinctrl_q7_hda_reset: q7-hda-reset {
+                       fsl,pins = <
+                               MX6QDL_PAD_NANDF_ALE__GPIO6_IO08        0x1b0b0 /* Q7[61] HDA_RST_N */
+                       >;
+               };
+
+               pinctrl_q7_lcd_power: lcd-power {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_7__GPIO1_IO07           0x1b0b0 /* Q7[111] LVDS_PPEN */
+                       >;
+               };
+
+               pinctrl_q7_sdio_power: q7-sdio-power {
+                       fsl,pins = <
+                               MX6QDL_PAD_DISP0_DAT9__GPIO4_IO30       0x1b0b0 /* Q7[47] SDIO_PWR# */
+                       >;
+               };
+
+               pinctrl_q7_sleep_button: q7-sleep-button {
+                       fsl,pins = <
+                               MX6QDL_PAD_KEY_ROW0__GPIO4_IO07         0x1b0b0 /* Q7[21] SLP_BTN# */
+                       >;
+               };
+
+               pinctrl_q7_spi_cs1: spi-cs1 {
+                       fsl,pins = <
+                               MX6QDL_PAD_DISP0_DAT4__GPIO4_IO25       0x1b0b0 /* Q7[202] SPI_CS1# */
+                       >;
+               };
+
+               /* SPI1 bus does not leave System on Module */
+               pinctrl_spi1: spi1 {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D16__ECSPI1_SCLK         0x100b1
+                               MX6QDL_PAD_EIM_D17__ECSPI1_MISO         0x100b1
+                               MX6QDL_PAD_EIM_D18__ECSPI1_MOSI         0x100b1
+                               MX6QDL_PAD_EIM_D19__GPIO3_IO19          0x1b0b0
+                       >;
+               };
+
+               /* Debug connector on Q7 module */
+               pinctrl_uart2: uart2 {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D26__UART2_TX_DATA       0x1b0b1
+                               MX6QDL_PAD_EIM_D27__UART2_RX_DATA       0x1b0b1
+                       >;
+               };
+
+               pinctrl_uart3: uart3 {
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D25__UART3_RX_DATA       0x1b0b1 /* Q7[177] UART0_RX */
+                               MX6QDL_PAD_EIM_D24__UART3_TX_DATA       0x1b0b1 /* Q7[171] UART0_TX */
+                       >;
+               };
+
+               pinctrl_usbotg: usbotg {
+                       fsl,pins = <
+                               MX6QDL_PAD_GPIO_1__USB_OTG_ID           0x17059 /* Q7[92] USB_ID */
+                       >;
+               };
+
+               /* µSD card slot on Q7 module */
+               pinctrl_usdhc2: usdhc2 {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD2_CMD__SD2_CMD             0x17059
+                               MX6QDL_PAD_SD2_CLK__SD2_CLK             0x10059
+                               MX6QDL_PAD_SD2_DAT0__SD2_DATA0          0x17059
+                               MX6QDL_PAD_SD2_DAT1__SD2_DATA1          0x17059
+                               MX6QDL_PAD_SD2_DAT2__SD2_DATA2          0x17059
+                               MX6QDL_PAD_SD2_DAT3__SD2_DATA3          0x17059
+                               MX6QDL_PAD_GPIO_4__GPIO1_IO04           0x1b0b0 /* SD2_CD */
+                       >;
+               };
+
+               /* eMMC module on Q7 module */
+               pinctrl_usdhc3: usdhc3 {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD3_CMD__SD3_CMD             0x17059
+                               MX6QDL_PAD_SD3_CLK__SD3_CLK             0x10059
+                               MX6QDL_PAD_SD3_DAT0__SD3_DATA0          0x17059
+                               MX6QDL_PAD_SD3_DAT1__SD3_DATA1          0x17059
+                               MX6QDL_PAD_SD3_DAT2__SD3_DATA2          0x17059
+                               MX6QDL_PAD_SD3_DAT3__SD3_DATA3          0x17059
+                               MX6QDL_PAD_SD3_DAT4__SD3_DATA4          0x17059
+                               MX6QDL_PAD_SD3_DAT5__SD3_DATA5          0x17059
+                               MX6QDL_PAD_SD3_DAT6__SD3_DATA6          0x17059
+                               MX6QDL_PAD_SD3_DAT7__SD3_DATA7          0x17059
+                       >;
+               };
+
+               pinctrl_usdhc4: usdhc4 {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD4_CMD__SD4_CMD             0x17059 /* Q7[45] SDIO_CMD */
+                               MX6QDL_PAD_SD4_CLK__SD4_CLK             0x17059 /* Q7[42] SDIO_CLK */
+                               MX6QDL_PAD_SD4_DAT1__SD4_DATA1          0x17059 /* Q7[48] SDIO_DAT1 */
+                               MX6QDL_PAD_SD4_DAT0__SD4_DATA0          0x17059 /* Q7[49] SDIO_DAT0 */
+                               MX6QDL_PAD_SD4_DAT3__SD4_DATA3          0x17059 /* Q7[50] SDIO_DAT3 */
+                               MX6QDL_PAD_SD4_DAT2__SD4_DATA2          0x17059 /* Q7[51] SDIO_DAT2 */
+                       >;
+               };
+
+               pinctrl_wdog: wdog {
+                       fsl,pins = <
+                               MX6QDL_PAD_DISP0_DAT8__WDOG1_B          0x1b0b0 /* Watchdog output signal */
+                       >;
+               };
+       };
+};
index 065d3ab..e7d9bfb 100644 (file)
                        reset-gpios = <&gpio3 31 GPIO_ACTIVE_LOW>;
                        reset-assert-us = <10000>;
                        reset-deassert-us = <1000>;
+                       qca,smarteee-tw-us-1g = <24>;
+                       qca,clk-out-frequency = <125000000>;
                };
        };
 };
index 7d2c725..d3921f2 100644 (file)
@@ -11,6 +11,8 @@
        aliases: aliases {
                ethernet1 = &eth1;
                ethernet2 = &eth2;
+               mmc0 = &usdhc3;
+               mmc1 = &usdhc4;
        };
 
        backlight: backlight {
                solomon,height = <64>;
                solomon,width = <128>;
                solomon,page-offset = <0>;
+               solomon,col-offset = <4>;
                solomon,prechargep2 = <15>;
                reset-gpios = <&gpio_oled 1 GPIO_ACTIVE_LOW>;
                vbat-supply = <&sw2_reg>;
index 236fc20..6b6842b 100644 (file)
 
 / {
        aliases {
+               i2c0 = &i2c2;
+               i2c1 = &i2c1;
+               i2c2 = &i2c3;
                mmc0 = &usdhc2;
                mmc1 = &usdhc3;
                mmc2 = &usdhc4;
                mmc3 = &usdhc1;
+               rtc0 = &rtc_i2c;
+               rtc1 = &snvs_rtc;
+               serial0 = &uart1;
+               serial1 = &uart5;
+               serial2 = &uart4;
+               serial3 = &uart2;
+               serial4 = &uart3;
        };
 
        memory@10000000 {
                reg = <0x10000000 0x40000000>;
        };
 
+       reg_eth_vio: regulator-eth-vio {
+               compatible = "regulator-fixed";
+               gpio = <&gpio1 7 GPIO_ACTIVE_LOW>;
+               pinctrl-0 = <&pinctrl_enet_vio>;
+               pinctrl-names = "default";
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-name = "eth_vio";
+               vin-supply = <&sw2_reg>;
+       };
+
        reg_usb_otg_vbus: regulator-usb-otg-vbus {
                compatible = "regulator-fixed";
                regulator-name = "usb_otg_vbus";
                        reg = <0>;
                        max-speed = <100>;
                        reset-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
-                       reset-delay-us = <1000>;
-                       reset-post-delay-us = <1000>;
+                       reset-assert-us = <1000>;
+                       reset-deassert-us = <1000>;
+                       smsc,disable-energy-detect; /* Make plugin detection reliable */
                };
        };
 };
 
 &i2c1 {
        clock-frequency = <100000>;
-       pinctrl-names = "default";
+       pinctrl-names = "default", "gpio";
        pinctrl-0 = <&pinctrl_i2c1>;
+       pinctrl-1 = <&pinctrl_i2c1_gpio>;
+       scl-gpios = <&gpio3 21 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       sda-gpios = <&gpio3 28 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
        status = "okay";
 };
 
 &i2c2 {
        clock-frequency = <100000>;
-       pinctrl-names = "default";
+       pinctrl-names = "default", "gpio";
        pinctrl-0 = <&pinctrl_i2c2>;
+       pinctrl-1 = <&pinctrl_i2c2_gpio>;
+       scl-gpios = <&gpio4 12 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       sda-gpios = <&gpio4 13 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
        status = "okay";
 };
 
 &i2c3 {
        clock-frequency = <100000>;
-       pinctrl-names = "default";
+       pinctrl-names = "default", "gpio";
        pinctrl-0 = <&pinctrl_i2c3>;
+       pinctrl-1 = <&pinctrl_i2c3_gpio>;
+       scl-gpios = <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       sda-gpios = <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
        status = "okay";
 
        ltc3676: pmic@3c {
                pagesize = <16>;
        };
 
-       rtc@56 {
+       rtc_i2c: rtc@56 {
                compatible = "microcrystal,rv3029";
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_rtc_hw300>;
                        MX6QDL_PAD_GPIO_16__ENET_REF_CLK        0x4001b0a8
                        MX6QDL_PAD_EIM_WAIT__GPIO5_IO00         0x000b0
                        MX6QDL_PAD_KEY_ROW4__GPIO4_IO15         0x000b1
+               >;
+       };
+
+       pinctrl_enet_vio: enet-vio-grp {
+               fsl,pins = <
                        MX6QDL_PAD_GPIO_7__GPIO1_IO07           0x120b0
                >;
        };
                >;
        };
 
+       pinctrl_i2c1_gpio: i2c1-gpio-grp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D21__GPIO3_IO21          0x4001b8b1
+                       MX6QDL_PAD_EIM_D28__GPIO3_IO28          0x4001b8b1
+               >;
+       };
+
        pinctrl_i2c2: i2c2-grp {
                fsl,pins = <
                        MX6QDL_PAD_KEY_COL3__I2C2_SCL           0x4001b8b1
                >;
        };
 
+       pinctrl_i2c2_gpio: i2c2-gpio-grp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_COL3__GPIO4_IO12         0x4001b8b1
+                       MX6QDL_PAD_KEY_ROW3__GPIO4_IO13         0x4001b8b1
+               >;
+       };
+
        pinctrl_i2c3: i2c3-grp {
                fsl,pins = <
                        MX6QDL_PAD_GPIO_3__I2C3_SCL             0x4001b8b1
                >;
        };
 
+       pinctrl_i2c3_gpio: i2c3-gpio-grp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_3__GPIO1_IO03           0x4001b8b1
+                       MX6QDL_PAD_GPIO_6__GPIO1_IO06           0x4001b8b1
+               >;
+       };
+
        pinctrl_pmic_hw300: pmic-hw300-grp {
                fsl,pins = <
                        MX6QDL_PAD_EIM_A25__GPIO5_IO02          0x1B0B0
index fa2307d..c713ac0 100644 (file)
 &fec {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_enet>;
-       phy-mode = "rgmii";
+       phy-mode = "rgmii-id";
        phy-reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>;
        phy-supply = <&vgen2_1v2_eth>;
        status = "okay";
diff --git a/arch/arm/boot/dts/imx6q-ds.dts b/arch/arm/boot/dts/imx6q-ds.dts
new file mode 100644 (file)
index 0000000..b0a63a1
--- /dev/null
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: GPL-2.0+
+//
+// Copyright 2021 Dillon Min <dillon.minfei@gmail.com>
+//
+// Based on imx6qdl-sabresd.dtsi which is:
+// Copyright 2012 Freescale Semiconductor, Inc.
+// Copyright 2011 Linaro Ltd.
+
+/dts-v1/;
+
+#include "imx6q.dtsi"
+#include "imx6qdl-ds.dtsi"
+
+/ {
+       model = "DaSheng i.MX6 Quad Com-9xx Board";
+       compatible = "ds,imx6q-sbc", "fsl,imx6q";
+};
diff --git a/arch/arm/boot/dts/imx6qdl-ds.dtsi b/arch/arm/boot/dts/imx6qdl-ds.dtsi
new file mode 100644 (file)
index 0000000..f7e5175
--- /dev/null
@@ -0,0 +1,458 @@
+// SPDX-License-Identifier: GPL-2.0+
+//
+// Copyright 2021 Dillon Min <dillon.minfei@gmail.com>
+//
+// Based on imx6qdl-sabresd.dtsi which is:
+// Copyright 2012 Freescale Semiconductor, Inc.
+// Copyright 2011 Linaro Ltd.
+
+#include <dt-bindings/clock/imx6qdl-clock.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+       chosen {
+               stdout-path = &uart4;
+       };
+
+       memory@10000000 {
+               device_type = "memory";
+               reg = <0x10000000 0x80000000>;
+       };
+
+       reg_usb_otg_vbus: regulator-usb-otg-vbus {
+               compatible = "regulator-fixed";
+               regulator-name = "usb_otg_vbus";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+       };
+
+       reg_usb_h1_vbus: regulator-usb-h1-vbus {
+               compatible = "regulator-fixed";
+               regulator-name = "usb_h1_vbus";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_gpio_leds>;
+
+               led-0 {
+                       gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>;
+                       default-state = "on";
+                       linux,default-trigger = "heartbeat";
+               };
+       };
+};
+
+&ipu1_csi0_from_ipu1_csi0_mux {
+       bus-width = <8>;
+       data-shift = <12>; /* Lines 19:12 used */
+       hsync-active = <1>;
+       vsync-active = <1>;
+};
+
+&ipu1_csi0_mux_from_parallel_sensor {
+       remote-endpoint = <&ov2659_to_ipu1_csi0_mux>;
+};
+
+&ipu1_csi0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ipu1_csi0>;
+       status = "okay";
+};
+
+&ecspi1 {
+       cs-gpios = <&gpio4 9 GPIO_ACTIVE_LOW>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ecspi1>, <&pinctrl_ecspi1_gpio>;
+       status = "okay";
+
+       m25p80: flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "st,m25p80", "jedec,spi-nor";
+               spi-max-frequency = <20000000>;
+               reg = <0>;
+       };
+};
+
+&fec {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_enet>;
+       phy-mode = "rgmii-id";
+       phy-handle = <&phy>;
+       fsl,magic-packet;
+       status = "okay";
+
+       mdio {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               phy: ethernet-phy@1 {
+                       reg = <1>;
+                       qca,clk-out-frequency = <125000000>;
+                       reset-gpios = <&gpio4 10 GPIO_ACTIVE_LOW>;
+                       reset-assert-us = <10000>;
+               };
+       };
+};
+
+&hdmi {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_hdmi_cec>;
+       ddc-i2c-bus = <&i2c3>;
+       status = "okay";
+};
+
+&i2c2 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       status = "okay";
+
+       pfuze100: pmic@8 {
+               compatible = "fsl,pfuze100";
+               reg = <0x08>;
+
+               regulators {
+                       sw1a_reg: sw1ab {
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <6250>;
+                       };
+
+                       sw1c_reg: sw1c {
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <6250>;
+                       };
+
+                       sw2_reg: sw2 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <6250>;
+                       };
+
+                       sw3a_reg: sw3a {
+                               regulator-min-microvolt = <400000>;
+                               regulator-max-microvolt = <1975000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       sw3b_reg: sw3b {
+                               regulator-min-microvolt = <400000>;
+                               regulator-max-microvolt = <1975000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       sw4_reg: sw4 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       swbst_reg: swbst {
+                               regulator-min-microvolt = <5000000>;
+                               regulator-max-microvolt = <5150000>;
+                       };
+
+                       snvs_reg: vsnvs {
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <3000000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vref_reg: vrefddr {
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       vgen1_reg: vgen1 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1550000>;
+                       };
+
+                       vgen2_reg: vgen2 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1550000>;
+                       };
+
+                       vgen3_reg: vgen3 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                       };
+
+                       vgen4_reg: vgen4 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vgen5_reg: vgen5 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       vgen6_reg: vgen6 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+               };
+       };
+};
+
+&i2c3 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c3>;
+       status = "okay";
+
+       ov2659: camera@30 {
+               compatible = "ovti,ov2659";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_ov2659>;
+               clocks = <&clks IMX6QDL_CLK_CKO>;
+               clock-names = "xvclk";
+               reg = <0x30>;
+               powerdown-gpios = <&gpio7 11 GPIO_ACTIVE_HIGH>;
+               reset-gpios = <&gpio1 7 GPIO_ACTIVE_LOW>;
+               status = "okay";
+
+               port {
+                       ov2659_to_ipu1_csi0_mux: endpoint {
+                               remote-endpoint = <&ipu1_csi0_mux_from_parallel_sensor>;
+                               link-frequencies = /bits/ 64 <70000000>;
+                               bus-width = <8>;
+                               hsync-active = <1>;
+                               vsync-active = <1>;
+                       };
+               };
+       };
+};
+
+&iomuxc {
+       pinctrl_ecspi1: ecspi1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D16__ECSPI1_SCLK         0x100b1
+                       MX6QDL_PAD_EIM_D18__ECSPI1_MOSI         0x100b1
+                       MX6QDL_PAD_EIM_D17__ECSPI1_MISO         0x100b1
+               >;
+       };
+
+       pinctrl_ecspi1_gpio: ecspi1grpgpiogrp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_ROW1__GPIO4_IO09         0x1b0b0
+                       MX6QDL_PAD_ENET_RXD0__GPIO1_IO27        0x1b0b0
+               >;
+       };
+
+       pinctrl_enet: enetgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_ENET_MDIO__ENET_MDIO         0x1b0b0
+                       MX6QDL_PAD_ENET_MDC__ENET_MDC           0x1b0b0
+                       MX6QDL_PAD_RGMII_TXC__RGMII_TXC         0x1b030
+                       MX6QDL_PAD_RGMII_TD0__RGMII_TD0         0x1b030
+                       MX6QDL_PAD_RGMII_TD1__RGMII_TD1         0x1b030
+                       MX6QDL_PAD_RGMII_TD2__RGMII_TD2         0x1b030
+                       MX6QDL_PAD_RGMII_TD3__RGMII_TD3         0x1b030
+                       MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL   0x1b030
+                       MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK    0x1b0b0
+                       MX6QDL_PAD_RGMII_RXC__RGMII_RXC         0x1b030
+                       MX6QDL_PAD_RGMII_RD0__RGMII_RD0         0x1b030
+                       MX6QDL_PAD_RGMII_RD1__RGMII_RD1         0x1b030
+                       MX6QDL_PAD_RGMII_RD2__RGMII_RD2         0x1b030
+                       MX6QDL_PAD_RGMII_RD3__RGMII_RD3         0x1b030
+                       MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL   0x1b030
+                       MX6QDL_PAD_KEY_COL2__GPIO4_IO10         0x1b0b0
+               >;
+       };
+
+       pinctrl_hdmi_cec: hdmicecgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_A25__HDMI_TX_CEC_LINE    0x1f8b0
+               >;
+       };
+
+       pinctrl_i2c2: i2c2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_EB2__I2C2_SCL            0x4001b8b1
+                       MX6QDL_PAD_KEY_ROW3__I2C2_SDA           0x4001b8b1
+               >;
+       };
+
+       pinctrl_i2c3: i2c3grp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_5__I2C3_SCL             0x4001b8b1
+                       MX6QDL_PAD_GPIO_6__I2C3_SDA             0x4001b8b1
+               >;
+       };
+
+       pinctrl_ipu1_csi0: ipu1csi0grp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT12__IPU1_CSI0_DATA12    0x1b0b0
+                       MX6QDL_PAD_CSI0_DAT13__IPU1_CSI0_DATA13    0x1b0b0
+                       MX6QDL_PAD_CSI0_DAT14__IPU1_CSI0_DATA14    0x1b0b0
+                       MX6QDL_PAD_CSI0_DAT15__IPU1_CSI0_DATA15    0x1b0b0
+                       MX6QDL_PAD_CSI0_DAT16__IPU1_CSI0_DATA16    0x1b0b0
+                       MX6QDL_PAD_CSI0_DAT17__IPU1_CSI0_DATA17    0x1b0b0
+                       MX6QDL_PAD_CSI0_DAT18__IPU1_CSI0_DATA18    0x1b0b0
+                       MX6QDL_PAD_CSI0_DAT19__IPU1_CSI0_DATA19    0x1b0b0
+                       MX6QDL_PAD_CSI0_PIXCLK__IPU1_CSI0_PIXCLK   0x1b0b0
+                       MX6QDL_PAD_CSI0_MCLK__IPU1_CSI0_HSYNC      0x1b0b0
+                       MX6QDL_PAD_CSI0_VSYNC__IPU1_CSI0_VSYNC     0x1b0b0
+               >;
+       };
+
+       pinctrl_ov2659: ov2659grp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_16__GPIO7_IO11          0x1b0b0
+                       MX6QDL_PAD_GPIO_7__GPIO1_IO07           0x1b0b0
+                       MX6QDL_PAD_GPIO_0__CCM_CLKO1            0x130b0
+               >;
+       };
+
+       pinctrl_uart4: uart4grp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_COL0__UART4_TX_DATA      0x1b0b1
+                       MX6QDL_PAD_KEY_ROW0__UART4_RX_DATA      0x1b0b1
+               >;
+       };
+
+       pinctrl_usbotg: usbotggrp {
+               fsl,pins = <
+                       MX6QDL_PAD_ENET_RX_ER__USB_OTG_ID       0x17059
+               >;
+       };
+
+       pinctrl_usdhc1: usdhc1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD1_CMD__SD1_CMD             0x17059
+                       MX6QDL_PAD_SD1_CLK__SD1_CLK             0x10059
+                       MX6QDL_PAD_SD1_DAT0__SD1_DATA0          0x17059
+                       MX6QDL_PAD_SD1_DAT1__SD1_DATA1          0x17059
+                       MX6QDL_PAD_SD1_DAT2__SD1_DATA2          0x17059
+                       MX6QDL_PAD_SD1_DAT3__SD1_DATA3          0x17059
+               >;
+       };
+
+       pinctrl_usdhc1_gpio: usdhc1grpgpiogrp {
+               fsl,pins = <
+                       MX6QDL_PAD_ENET_TX_EN__GPIO1_IO28       0x1b0b0
+               >;
+       };
+
+       pinctrl_usdhc2: usdhc2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD2_CMD__SD2_CMD             0x17059
+                       MX6QDL_PAD_SD2_CLK__SD2_CLK             0x10059
+                       MX6QDL_PAD_SD2_DAT0__SD2_DATA0          0x17059
+                       MX6QDL_PAD_SD2_DAT1__SD2_DATA1          0x17059
+                       MX6QDL_PAD_SD2_DAT2__SD2_DATA2          0x17059
+                       MX6QDL_PAD_SD2_DAT3__SD2_DATA3          0x17059
+               >;
+       };
+
+       pinctrl_usdhc2_gpio: usdhc2grpgpiogrp {
+               fsl,pins = <
+                       MX6QDL_PAD_NANDF_D0__GPIO2_IO00         0x1b0b0
+                       MX6QDL_PAD_NANDF_D1__GPIO2_IO01         0x1b0b0
+               >;
+       };
+
+       pinctrl_usdhc3: usdhc3grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD3_CMD__SD3_CMD             0x17059
+                       MX6QDL_PAD_SD3_CLK__SD3_CLK             0x10059
+                       MX6QDL_PAD_SD3_DAT0__SD3_DATA0          0x17059
+                       MX6QDL_PAD_SD3_DAT1__SD3_DATA1          0x17059
+                       MX6QDL_PAD_SD3_DAT2__SD3_DATA2          0x17059
+                       MX6QDL_PAD_SD3_DAT3__SD3_DATA3          0x17059
+                       MX6QDL_PAD_SD3_DAT4__SD3_DATA4          0x17059
+                       MX6QDL_PAD_SD3_DAT5__SD3_DATA5          0x17059
+                       MX6QDL_PAD_SD3_DAT6__SD3_DATA6          0x17059
+                       MX6QDL_PAD_SD3_DAT7__SD3_DATA7          0x17059
+               >;
+       };
+
+       pinctrl_wdog: wdoggrp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_1__WDOG2_B              0x1b0b0
+               >;
+       };
+
+       pinctrl_gpio_leds: gpioledsgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_COL1__GPIO4_IO08 0x1b0b0
+               >;
+       };
+};
+
+&uart4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart4>;
+       status = "okay";
+};
+
+&usbh1 {
+       vbus-supply = <&reg_usb_h1_vbus>;
+       status = "okay";
+};
+
+&usbotg {
+       vbus-supply = <&reg_usb_otg_vbus>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usbotg>;
+       disable-over-current;
+       status = "okay";
+};
+
+&usdhc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc1>, <&pinctrl_usdhc1_gpio>;
+       bus-width = <4>;
+       cd-gpios = <&gpio1 28 GPIO_ACTIVE_LOW>;
+       status = "okay";
+};
+
+&usdhc2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>, <&pinctrl_usdhc2_gpio>;
+       bus-width = <4>;
+       cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
+       wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
+       status = "disabled";
+};
+
+&usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       bus-width = <8>;
+       non-removable;
+       no-1-8-v;
+       status = "okay";
+};
+
+&wdog1 {
+       status = "disabled";
+};
+
+&wdog2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_wdog>;
+       fsl,ext-reset-output;
+       status = "okay";
+};
index 7bd658b..f323620 100644 (file)
                        fsl,pins = <
                                MX6QDL_PAD_EIM_D24__UART3_TX_DATA       0x1b0b1
                                MX6QDL_PAD_EIM_D25__UART3_RX_DATA       0x1b0b1
-                               MX6QDL_PAD_EIM_D30__UART3_RTS_B         0x1b0b1
-                               MX6QDL_PAD_EIM_D31__UART3_CTS_B         0x1b0b1
+                               MX6QDL_PAD_EIM_D31__UART3_RTS_B         0x1b0b1
+                               MX6QDL_PAD_EIM_D30__UART3_CTS_B         0x1b0b1
                        >;
                };
 
 &uart3 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_uart3>;
+       uart-has-rtscts;
        status = "disabled";
 };
 
index f824c9a..0c01054 100644 (file)
                compatible = "fsl,imx6q-sabresd-wm8962",
                           "fsl,imx-audio-wm8962";
                model = "wm8962-audio";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_hp>;
                ssi-controller = <&ssi2>;
                audio-codec = <&codec>;
+               audio-asrc = <&asrc>;
                audio-routing =
                        "Headphone Jack", "HPOUTL",
                        "Headphone Jack", "HPOUTR",
                        >;
                };
 
+               pinctrl_hp: hpgrp {
+                       fsl,pins = <
+                               MX6QDL_PAD_SD3_RST__GPIO7_IO08          0x1b0b0
+                               MX6QDL_PAD_GPIO_9__GPIO1_IO09           0x1b0b0
+                       >;
+               };
+
                pinctrl_i2c1: i2c1grp {
                        fsl,pins = <
                                MX6QDL_PAD_CSI0_DAT8__I2C1_SDA          0x4001b8b1
index eb25d21..b9e3057 100644 (file)
                };
        };
 
+       counter-0 {
+               compatible = "interrupt-counter";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_counter0>;
+               gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
+       };
+
+       counter-1 {
+               compatible = "interrupt-counter";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_counter1>;
+               gpios = <&gpio2 1 GPIO_ACTIVE_LOW>;
+       };
+
+       counter-2 {
+               compatible = "interrupt-counter";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_counter2>;
+               gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
+       };
+
        gpio-keys {
                compatible = "gpio-keys";
                autorepeat;
 
 &gpio2 {
        gpio-line-names =
-               "", "", "", "", "", "", "", "",
+               "count0", "count1", "count2", "", "", "", "", "",
                "REV_ID0", "REV_ID1", "REV_ID2", "REV_ID3", "REV_ID4",
                        "BOARD_ID0", "BOARD_ID1", "BOARD_ID2",
                "", "", "", "", "", "", "", "ON_SWITCH",
                >;
        };
 
+       pinctrl_counter0: counter0grp {
+               fsl,pins = <
+                       MX6QDL_PAD_NANDF_D0__GPIO2_IO00                 0x1b000
+               >;
+       };
+
+       pinctrl_counter1: counter1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_NANDF_D1__GPIO2_IO01                 0x1b000
+               >;
+       };
+
+       pinctrl_counter2: counter2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_NANDF_D2__GPIO2_IO02                 0x1b000
+               >;
+       };
+
        pinctrl_ecspi1: ecspi1grp {
                fsl,pins = <
                        MX6QDL_PAD_EIM_D17__ECSPI1_MISO                 0x100b1
index b9b698f..bf86b63 100644 (file)
        imx6qdl-wandboard {
                pinctrl_hog: hoggrp {
                        fsl,pins = <
-                               MX6QDL_PAD_EIM_D22__USB_OTG_PWR         0x80000000      /* USB Power Enable */
                                MX6QDL_PAD_GPIO_2__GPIO1_IO02           0x80000000      /* USDHC1 CD */
                                MX6QDL_PAD_EIM_DA9__GPIO3_IO09          0x80000000      /* uSDHC3 CD */
                                MX6QDL_PAD_EIM_D29__GPIO3_IO29          0x1f0b1         /* RGMII PHY reset */
index 5a1e10d..779cc53 100644 (file)
                gpios = <&gpio_spi 3 GPIO_ACTIVE_LOW>;
        };
 
-       sound {
-               compatible = "simple-audio-card";
-               simple-audio-card,name = "mx6ul-wm8960";
-               simple-audio-card,format = "i2s";
-               simple-audio-card,bitclock-master = <&dailink_master>;
-               simple-audio-card,frame-master = <&dailink_master>;
-               simple-audio-card,widgets =
-                       "Microphone", "Mic Jack",
-                       "Line", "Line In",
-                       "Line", "Line Out",
-                       "Speaker", "Speaker",
-                       "Headphone", "Headphone Jack";
-               simple-audio-card,routing =
+       sound-wm8960 {
+               compatible = "fsl,imx-audio-wm8960";
+               model = "wm8960-audio";
+               audio-cpu = <&sai2>;
+               audio-codec = <&codec>;
+               audio-asrc = <&asrc>;
+               hp-det-gpio = <&gpio5 4 0>;
+               audio-routing =
                        "Headphone Jack", "HP_L",
                        "Headphone Jack", "HP_R",
-                       "Speaker", "SPK_LP",
-                       "Speaker", "SPK_LN",
-                       "Speaker", "SPK_RP",
-                       "Speaker", "SPK_RN",
-                       "LINPUT1", "Mic Jack",
+                       "Ext Spk", "SPK_LP",
+                       "Ext Spk", "SPK_LN",
+                       "Ext Spk", "SPK_RP",
+                       "Ext Spk", "SPK_RN",
+                       "LINPUT2", "Mic Jack",
                        "LINPUT3", "Mic Jack",
-                       "RINPUT1", "Mic Jack",
-                       "RINPUT2", "Mic Jack";
-
-               simple-audio-card,cpu {
-                       sound-dai = <&sai2>;
-               };
-
-               dailink_master: simple-audio-card,codec {
-                       sound-dai = <&codec>;
-                       clocks = <&clks IMX6UL_CLK_SAI2>;
-               };
+                       "RINPUT1", "AMIC",
+                       "RINPUT2", "AMIC",
+                       "Mic Jack", "MICB",
+                       "AMIC", "MICB";
        };
 
        spi4 {
                compatible = "wlf,wm8960";
                reg = <0x1a>;
                wlf,shared-lrclk;
+               wlf,hp-cfg = <3 2 3>;
+               wlf,gpio-cfg = <1 3>;
+               clocks = <&clks IMX6UL_CLK_SAI2>;
+               clock-names = "mclk";
        };
 
        camera@3c {
index ac0751b..4a0d837 100644 (file)
                        "LINPUT1", "AMIC",
                        "AMIC", "MICB";
        };
+
+       sound-hdmi {
+               compatible = "fsl,imx-audio-sii902x";
+               model = "sii902x-audio";
+               audio-cpu = <&sai3>;
+               hdmi-out;
+       };
 };
 
 &adc1 {
index 8fcd958..5b8dcc1 100644 (file)
                timeout-ms = <5000>;
        };
 
-       /* The first 16MB region on the expansion bus */
-       flash@50000000 {
-               compatible = "intel,ixp4xx-flash", "cfi-flash";
-               bank-width = <2>;
-               /*
-                * 8 MB of Flash in 0x20000 byte blocks
-                * mapped in at 0x50000000
-                */
-               reg = <0x50000000 0x800000>;
-
-               partitions {
-                       compatible = "redboot-fis";
-                       /* Eraseblock at 0x7e0000 */
-                       fis-index-block = <0x3f>;
+       gpio-beeper {
+               compatible = "gpio-beeper";
+               gpios = <&gpio0 4 GPIO_ACTIVE_HIGH>;
+       };
+
+       soc {
+               bus@50000000 {
+                       /* The first 16MB region at CS0 on the expansion bus */
+                       flash@0 {
+                               compatible = "intel,ixp4xx-flash", "cfi-flash";
+                               bank-width = <2>;
+                               /*
+                                * 8 MB of Flash in 0x20000 byte blocks
+                                * mapped in at CS0.
+                                */
+                               reg = <0x00000000 0x800000>;
+
+                               partitions {
+                                       compatible = "redboot-fis";
+                                       /* Eraseblock at 0x7e0000 */
+                                       fis-index-block = <0x3f>;
+                               };
+                       };
+               };
+
+               pci@c0000000 {
+                       status = "ok";
+
+                       /*
+                        * Taken from NSLU2 PCI boardfile, INT A, B, C swizzled D constant
+                        * We have slots (IDSEL) 1, 2 and 3.
+                        */
+                       interrupt-map =
+                       /* IDSEL 1 */
+                       <0x0800 0 0 1 &gpio0 11 3>, /* INT A on slot 1 is irq 11 */
+                       <0x0800 0 0 2 &gpio0 10 3>, /* INT B on slot 1 is irq 10 */
+                       <0x0800 0 0 3 &gpio0 9  3>, /* INT C on slot 1 is irq 9 */
+                       <0x0800 0 0 4 &gpio0 8  3>, /* INT D on slot 1 is irq 8 */
+                       /* IDSEL 2 */
+                       <0x1000 0 0 1 &gpio0 10 3>, /* INT A on slot 2 is irq 10 */
+                       <0x1000 0 0 2 &gpio0 9  3>, /* INT B on slot 2 is irq 9 */
+                       <0x1000 0 0 3 &gpio0 11 3>, /* INT C on slot 2 is irq 11 */
+                       <0x1000 0 0 4 &gpio0 8  3>, /* INT D on slot 2 is irq 8 */
+                       /* IDSEL 3 */
+                       <0x1800 0 0 1 &gpio0 9  3>, /* INT A on slot 3 is irq 9 */
+                       <0x1800 0 0 2 &gpio0 11 3>, /* INT B on slot 3 is irq 11 */
+                       <0x1800 0 0 3 &gpio0 10 3>, /* INT C on slot 3 is irq 10 */
+                       <0x1800 0 0 4 &gpio0 8  3>; /* INT D on slot 3 is irq 8 */
+               };
+
+               ethernet@c8009000 {
+                       status = "ok";
+                       queue-rx = <&qmgr 3>;
+                       queue-txready = <&qmgr 20>;
+                       phy-mode = "rgmii";
+                       phy-handle = <&phy1>;
+
+                       mdio {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               phy1: ethernet-phy@1 {
+                                       reg = <1>;
+                               };
+                       };
                };
        };
 };
diff --git a/arch/arm/boot/dts/intel-ixp42x-welltech-epbx100.dts b/arch/arm/boot/dts/intel-ixp42x-welltech-epbx100.dts
new file mode 100644 (file)
index 0000000..8415850
--- /dev/null
@@ -0,0 +1,76 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2021 Corentin Labbe <clabbe@baylibre.com>
+ */
+
+/dts-v1/;
+
+#include "intel-ixp42x.dtsi"
+
+/ {
+       model = "Welltech EPBX100";
+       compatible = "welltech,epbx100", "intel,ixp42x";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       memory@0 {
+               /* 64 MB SDRAM */
+               device_type = "memory";
+               reg = <0x00000000 0x4000000>;
+       };
+
+       chosen {
+               bootargs = "console=ttyS0,115200n8 root=/dev/ram0 initrd=0x00800000,9M";
+               stdout-path = "uart0:115200n8";
+       };
+
+       aliases {
+               serial0 = &uart0;
+       };
+
+       flash@50000000 {
+               compatible = "intel,ixp4xx-flash", "cfi-flash";
+               bank-width = <2>;
+               /*
+                * 16 MB of Flash
+                */
+               reg = <0x50000000 0x1000000>;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               label = "RedBoot";
+                               reg = <0x00000000 0x00080000>;
+                               read-only;
+                       };
+                       partition@80000 {
+                               label = "zImage";
+                               reg = <0x00080000 0x00100000>;
+                               read-only;
+                       };
+                       partition@180000 {
+                               label = "ramdisk";
+                               reg = <0x00180000 0x00300000>;
+                               read-only;
+                       };
+                       partition@480000 {
+                               label = "User";
+                               reg = <0x00480000 0x00b60000>;
+                               read-only;
+                       };
+                       partition@fe0000 {
+                               label = "FIS directory";
+                               reg = <0x00fe0000 0x001f000>;
+                               read-only;
+                       };
+                       partition@fff000 {
+                               label = "RedBoot config";
+                               reg = <0x00fff000 0x0001000>;
+                               read-only;
+                       };
+               };
+       };
+};
index a9622ca..5fa063e 100644 (file)
@@ -7,6 +7,10 @@
 
 / {
        soc {
+               pci@c0000000 {
+                       compatible = "intel,ixp42x-pci";
+               };
+
                interrupt-controller@c8003000 {
                        compatible = "intel,ixp42x-interrupt";
                };
index ba1163a..60a1228 100644 (file)
                };
        };
 
-       flash@50000000 {
-               compatible = "intel,ixp4xx-flash", "cfi-flash";
-               bank-width = <2>;
-               /*
-                * 32 MB of Flash in 0x20000 byte blocks
-                * mapped in at 0x50000000
-                */
-               reg = <0x50000000 0x2000000>;
-
-               partitions {
-                       compatible = "redboot-fis";
-                       /* Eraseblock at 0x1fe0000 */
-                       fis-index-block = <0xff>;
+       soc {
+               bus@50000000 {
+                       flash@0 {
+                               compatible = "intel,ixp4xx-flash", "cfi-flash";
+                               bank-width = <2>;
+                               /*
+                                * 32 MB of Flash in 0x20000 byte blocks
+                                * mapped in at CS0.
+                                */
+                               reg = <0x00000000 0x2000000>;
+
+                               partitions {
+                                       compatible = "redboot-fis";
+                                       /* Eraseblock at 0x1fe0000 */
+                                       fis-index-block = <0xff>;
+                               };
+                       };
+               };
+
+               pci@c0000000 {
+                       status = "ok";
+
+                       /*
+                        * In the boardfile for the Cambria from OpenWRT the interrupts
+                        * are assigned one per IDSEL, so all 4 interrupts from IDSEL
+                        * 1 are connected to IRQ 11, all 4 interrupts from IDSEL 2
+                        * connected to IRQ 10 etc. I find this highly unlikely so I
+                        * have instead assumed that they are rotated (swizzled) like
+                        * this with 11, 10, 9, 8 for the 4 pins on IDSEL 1 etc.
+                        */
+                       interrupt-map =
+                       /* IDSEL 1 */
+                       <0x0800 0 0 1 &gpio0 11 3>, /* INT A on slot 1 is irq 11 */
+                       <0x0800 0 0 2 &gpio0 10 3>, /* INT B on slot 1 is irq 10 */
+                       <0x0800 0 0 3 &gpio0 9  3>, /* INT C on slot 1 is irq 9 */
+                       <0x0800 0 0 4 &gpio0 8  3>, /* INT D on slot 1 is irq 8 */
+                       /* IDSEL 2 */
+                       <0x1000 0 0 1 &gpio0 10 3>, /* INT A on slot 2 is irq 10 */
+                       <0x1000 0 0 2 &gpio0 9  3>, /* INT B on slot 2 is irq 9 */
+                       <0x1000 0 0 3 &gpio0 8  3>, /* INT C on slot 2 is irq 8 */
+                       <0x1000 0 0 4 &gpio0 11 3>, /* INT D on slot 2 is irq 11 */
+                       /* IDSEL 3 */
+                       <0x1800 0 0 1 &gpio0 9  3>, /* INT A on slot 3 is irq 9 */
+                       <0x1800 0 0 2 &gpio0 8  3>, /* INT B on slot 3 is irq 8 */
+                       <0x1800 0 0 3 &gpio0 11 3>, /* INT C on slot 3 is irq 11 */
+                       <0x1800 0 0 4 &gpio0 10 3>, /* INT D on slot 3 is irq 10 */
+                       /* IDSEL 4 */
+                       <0x2000 0 0 1 &gpio0 8  3>, /* INT A on slot 3 is irq 8 */
+                       <0x2000 0 0 2 &gpio0 11 3>, /* INT B on slot 3 is irq 11 */
+                       <0x2000 0 0 3 &gpio0 10 3>, /* INT C on slot 3 is irq 10 */
+                       <0x2000 0 0 4 &gpio0 9  3>, /* INT D on slot 3 is irq 9 */
+                       /* IDSEL 6 */
+                       <0x3000 0 0 1 &gpio0 10 3>, /* INT A on slot 3 is irq 10 */
+                       <0x3000 0 0 2 &gpio0 9  3>, /* INT B on slot 3 is irq 9 */
+                       <0x3000 0 0 3 &gpio0 8  3>, /* INT C on slot 3 is irq 8 */
+                       <0x3000 0 0 4 &gpio0 11 3>, /* INT D on slot 3 is irq 11 */
+                       /* IDSEL 15 */
+                       <0x7800 0 0 1 &gpio0 8  3>, /* INT A on slot 3 is irq 8 */
+                       <0x7800 0 0 2 &gpio0 11 3>, /* INT B on slot 3 is irq 11 */
+                       <0x7800 0 0 3 &gpio0 10 3>, /* INT C on slot 3 is irq 10 */
+                       <0x7800 0 0 4 &gpio0 9  3>; /* INT D on slot 3 is irq 9 */
+               };
+
+               ethernet@c800a000 {
+                       status = "ok";
+                       queue-rx = <&qmgr 4>;
+                       queue-txready = <&qmgr 21>;
+                       phy-mode = "rgmii";
+                       phy-handle = <&phy1>;
+
+                       mdio {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               phy1: ethernet-phy@1 {
+                                       reg = <1>;
+                               };
+
+                               phy2: ethernet-phy@2 {
+                                       reg = <2>;
+                               };
+                       };
+               };
+
+               ethernet@c800c000 {
+                       status = "ok";
+                       queue-rx = <&qmgr 2>;
+                       queue-txready = <&qmgr 19>;
+                       phy-mode = "rgmii";
+                       phy-handle = <&phy2>;
+                       intel,npe-handle = <&npe 0>;
                };
        };
 };
index 494fb2f..1d0817c 100644 (file)
@@ -8,6 +8,10 @@
 
 / {
        soc {
+               pci@c0000000 {
+                       compatible = "intel,ixp43x-pci";
+               };
+
                interrupt-controller@c8003000 {
                        compatible = "intel,ixp43x-interrupt";
                };
index f8cd506..cce49e8 100644 (file)
                        interrupts = <33 IRQ_TYPE_LEVEL_HIGH>;
                        status = "disabled";
                };
+
+               /* This is known as EthB1 */
+               ethernet@c800d000 {
+                       compatible = "intel,ixp4xx-ethernet";
+                       reg = <0xc800d000 0x1000>;
+                       status = "disabled";
+                       intel,npe = <1>;
+                       /* Dummy values that depend on firmware */
+                       queue-rx = <&qmgr 0>;
+                       queue-txready = <&qmgr 0>;
+               };
+
+               /* This is known as EthB2 */
+               ethernet@c800e000 {
+                       compatible = "intel,ixp4xx-ethernet";
+                       reg = <0xc800e000 0x1000>;
+                       status = "disabled";
+                       intel,npe = <2>;
+                       /* Dummy values that depend on firmware */
+                       queue-rx = <&qmgr 0>;
+                       queue-txready = <&qmgr 0>;
+               };
+
+               /* This is known as EthB3 */
+               ethernet@c800f000 {
+                       compatible = "intel,ixp4xx-ethernet";
+                       reg = <0xc800f000 0x1000>;
+                       status = "disabled";
+                       intel,npe = <3>;
+                       /* Dummy values that depend on firmware */
+                       queue-rx = <&qmgr 0>;
+                       queue-txready = <&qmgr 0>;
+               };
        };
 };
index d4a0958..a50427a 100644 (file)
                compatible = "simple-bus";
                interrupt-parent = <&intcon>;
 
+               /*
+                * The IXP4xx expansion bus is a set of 16 or 32MB
+                * windows in the 256MB space from 0x50000000 to
+                * 0x5fffffff.
+                */
+               bus@50000000 {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0x00000000 0x50000000 0x10000000>;
+                       dma-ranges = <0x00000000 0x50000000 0x10000000>;
+               };
+
                qmgr: queue-manager@60000000 {
                        compatible = "intel,ixp4xx-ahb-queue-manager";
                        reg = <0x60000000 0x4000>;
                        interrupts = <3 IRQ_TYPE_LEVEL_HIGH>, <4 IRQ_TYPE_LEVEL_HIGH>;
                };
 
+               pci@c0000000 {
+                       /* compatible filled in by per-soc device tree */
+                       reg = <0xc0000000 0x1000>;
+                       interrupts = <8 IRQ_TYPE_LEVEL_HIGH>,
+                                    <9 IRQ_TYPE_LEVEL_HIGH>,
+                                    <10 IRQ_TYPE_LEVEL_HIGH>;
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       device_type = "pci";
+                       bus-range = <0x00 0xff>;
+                       status = "disabled";
+
+                       ranges =
+                       /*
+                        * 64MB 32bit non-prefetchable memory 0x48000000-0x4bffffff
+                        * done in 4 chunks of 16MB each.
+                        */
+                       <0x02000000 0 0x48000000 0x48000000 0 0x04000000>,
+                       /* 64KB I/O space at 0x4c000000 */
+                       <0x01000000 0 0x00000000 0x4c000000 0 0x00010000>;
+
+                       /*
+                        * This needs to map to the start of physical memory so
+                        * PCI devices can see all (hopefully) memory. This is done
+                        * using 4 1:1 16MB windows, so the RAM should not be more than
+                        * 64 MB for this to work. If your memory is anywhere else
+                        * than at 0x0 you need to alter this.
+                        */
+                       dma-ranges =
+                       <0x02000000 0 0x00000000 0x00000000 0 0x04000000>;
+
+                       #interrupt-cells = <1>;
+                       interrupt-map-mask = <0xf800 0 0 7>;
+                       /* Each unique DTS using PCI must specify the swizzling */
+               };
+
                uart0: serial@c8000000 {
                        compatible = "intel,xscale-uart";
                        reg = <0xc8000000 0x1000>;
                        interrupts = <5 IRQ_TYPE_LEVEL_HIGH>;
                };
 
-               npe@c8006000 {
+               npe: npe@c8006000 {
                        compatible = "intel,ixp4xx-network-processing-engine";
                        reg = <0xc8006000 0x1000>, <0xc8007000 0x1000>, <0xc8008000 0x1000>;
+
+                       /* NPE-C contains a crypto accelerator */
+                       crypto {
+                               compatible = "intel,ixp4xx-crypto";
+                               intel,npe-handle = <&npe 2>;
+                               queue-rx = <&qmgr 30>;
+                               queue-txready = <&qmgr 29>;
+                       };
+               };
+
+               /* This is known as EthB */
+               ethernet@c8009000 {
+                       compatible = "intel,ixp4xx-ethernet";
+                       reg = <0xc8009000 0x1000>;
+                       status = "disabled";
+                       /* Dummy values that depend on firmware */
+                       queue-rx = <&qmgr 3>;
+                       queue-txready = <&qmgr 20>;
+                       intel,npe-handle = <&npe 1>;
+               };
+
+               /* This is known as EthC */
+               ethernet@c800a000 {
+                       compatible = "intel,ixp4xx-ethernet";
+                       reg = <0xc800a000 0x1000>;
+                       status = "disabled";
+                       /* Dummy values that depend on firmware */
+                       queue-rx = <&qmgr 0>;
+                       queue-txready = <&qmgr 0>;
+                       intel,npe-handle = <&npe 2>;
+               };
+
+               /* This is known as EthA */
+               ethernet@c800c000 {
+                       compatible = "intel,ixp4xx-ethernet";
+                       reg = <0xc800c000 0x1000>;
+                       status = "disabled";
+                       intel,npe = <0>;
+                       /* Dummy values that depend on firmware */
+                       queue-rx = <&qmgr 0>;
+                       queue-txready = <&qmgr 0>;
                };
        };
 };
index 14e26a4..d800f26 100644 (file)
        };
 };
 
-&k2g_clks {
-       /* on the board 22.5792MHz is connected to AUDOSC_IN */
-       assigned-clocks = <&k2g_clks 0x4c 2>;
-       assigned-clock-rates = <22579200>;
-};
-
 &mcasp2 {
        #sound-dai-cells = <0>;
 
        pinctrl-names = "default";
        pinctrl-0 = <&mcasp2_pins>;
 
-       assigned-clocks = <&k2g_clks 0x6 1>;
-       assigned-clock-parents = <&k2g_clks 0x6 2>;
+       assigned-clocks = <&k2g_clks 0x4c 2>, <&k2g_clks 0x6 1>;
+       assigned-clock-parents = <0>, <&k2g_clks 0x6 2>;
+       assigned-clock-rates = <22579200>, <0>;
 
        status = "okay";
 
index 05a7501..3719829 100644 (file)
                        status = "disabled";
                };
 
-               msgmgr: msgmgr@2a00000 {
+               msgmgr: mailbox@2a00000 {
                        compatible = "ti,k2g-message-manager";
                        #mbox-cells = <2>;
                        reg-names = "queue_proxy_region",
                                     <GIC_SPI 327 IRQ_TYPE_LEVEL_HIGH>;
                };
 
-               pmmc: pmmc@2921c00 {
+               pmmc: system-controller@2921c00 {
                        compatible = "ti,k2g-sci";
                        /*
                         * In case of rare platforms that does not use k2g as
                                #power-domain-cells = <1>;
                        };
 
-                       k2g_clks: clocks {
+                       k2g_clks: clock-controller {
                                compatible = "ti,k2g-sci-clk";
                                #clock-cells = <2>;
                        };
index 8bae6ed..bd0e864 100644 (file)
@@ -50,6 +50,7 @@
                                compatible = "amlogic,meson6-uart", "amlogic,meson-uart";
                                reg = <0x84c0 0x18>;
                                interrupts = <GIC_SPI 26 IRQ_TYPE_EDGE_RISING>;
+                               fifo-size = <128>;
                                status = "disabled";
                        };
 
index 075d583..2273295 100644 (file)
                        clock-frequency = <32768>;
                        status = "disabled";
                };
+
+               xtal_div2: xtal_div2 {
+                       #clock-cells = <0>;
+                       compatible = "fixed-factor-clock";
+                       clocks = <&xtal>;
+                       clock-div = <2>;
+                       clock-mult = <1>;
+               };
        };
 
        soc: soc {
                                mask = <0x79>;
                        };
 
+                       watchdog@6000 {
+                               compatible = "mstar,msc313e-wdt";
+                               reg = <0x6000 0x1f>;
+                               clocks = <&xtal_div2>;
+                       };
+
                        intc_fiq: interrupt-controller@201310 {
                                compatible = "mstar,mst-intc";
                                reg = <0x201310 0x40>;
index f9c2a99..5750ca1 100644 (file)
                        #address-cells = <1>;
                        #size-cells = <0>;
                        interrupts = <56>;
-                       dmas = <&sdma 27 &sdma 28>;
-                       dma-names = "tx", "rx";
                };
 
                i2c2: i2c@48072000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        interrupts = <57>;
-                       dmas = <&sdma 29 &sdma 30>;
-                       dma-names = "tx", "rx";
                };
 
                mcspi1: spi@48098000 {
index 494bf69..bb529a2 100644 (file)
                        compatible = "ti,omap2-mailbox";
                        reg = <0x48094000 0x200>;
                        interrupts = <26>, <34>;
-                       interrupt-names = "dsp", "iva";
                        ti,hwmods = "mailbox";
                        #mbox-cells = <1>;
                        ti,mbox-num-users = <4>;
                        ti,mbox-num-fifos = <6>;
-                       mbox_dsp: dsp {
+                       mbox_dsp: mbox-dsp {
                                ti,mbox-tx = <0 0 0>;
                                ti,mbox-rx = <1 0 0>;
                        };
-                       mbox_iva: iva {
+                       mbox_iva: mbox-iva {
                                ti,mbox-tx = <2 1 3>;
                                ti,mbox-rx = <3 1 3>;
                        };
index d19d8ba..23115ba 100644 (file)
                        #mbox-cells = <1>;
                        ti,mbox-num-users = <4>;
                        ti,mbox-num-fifos = <6>;
-                       mbox_dsp: dsp {
+                       mbox_dsp: mbox-dsp {
                                ti,mbox-tx = <0 0 0>;
                                ti,mbox-rx = <1 0 0>;
                        };
index b4109f4..e6ba30a 100644 (file)
  * for bus switch SN74CB3Q3384A, level-shifter SN74AVC16T245DGGR, and 1.8V.
  */
 &gpio2 {
-       en_usb2_port {
+       en-usb2-port-hog {
                gpio-hog;
                gpios = <29 GPIO_ACTIVE_HIGH>;  /* gpio_61 */
                output-low;
index fd84bbf..9ce8d81 100644 (file)
@@ -37,7 +37,7 @@
 };
 
 &gpio5 {
-       irda_en {
+       irda-en-hog {
                gpio-hog;
                gpios = <(175-160) GPIO_ACTIVE_HIGH>;
                output-high;    /* activate gpio_175 to disable IrDA receiver */
index c5b9da0..64b7e6f 100644 (file)
                        compatible = "ti,omap3-i2c";
                        reg = <0x48070000 0x80>;
                        interrupts = <56>;
-                       dmas = <&sdma 27 &sdma 28>;
-                       dma-names = "tx", "rx";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c1";
                        compatible = "ti,omap3-i2c";
                        reg = <0x48072000 0x80>;
                        interrupts = <57>;
-                       dmas = <&sdma 29 &sdma 30>;
-                       dma-names = "tx", "rx";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c2";
                        compatible = "ti,omap3-i2c";
                        reg = <0x48060000 0x80>;
                        interrupts = <61>;
-                       dmas = <&sdma 25 &sdma 26>;
-                       dma-names = "tx", "rx";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c3";
                        #mbox-cells = <1>;
                        ti,mbox-num-users = <2>;
                        ti,mbox-num-fifos = <2>;
-                       mbox_dsp: dsp {
+                       mbox_dsp: mbox-dsp {
                                ti,mbox-tx = <0 0 0>;
                                ti,mbox-rx = <1 0 0>;
                        };
index 9972167..46b8f9e 100644 (file)
                                #mbox-cells = <1>;
                                ti,mbox-num-users = <3>;
                                ti,mbox-num-fifos = <8>;
-                               mbox_ipu: mbox_ipu {
+                               mbox_ipu: mbox-ipu {
                                        ti,mbox-tx = <0 0 0>;
                                        ti,mbox-rx = <1 0 0>;
                                };
-                               mbox_dsp: mbox_dsp {
+                               mbox_dsp: mbox-dsp {
                                        ti,mbox-tx = <3 0 0>;
                                        ti,mbox-rx = <2 0 0>;
                                };
index d8f1362..45435bb 100644 (file)
 
 &gpio8 {
        /* TI trees use GPIO instead of msecure, see also muxing */
-       p234 {
+       msecure-hog {
                gpio-hog;
                gpios = <10 GPIO_ACTIVE_HIGH>;
                output-high;
index b148b28..06cc3a1 100644 (file)
                                #mbox-cells = <1>;
                                ti,mbox-num-users = <3>;
                                ti,mbox-num-fifos = <8>;
-                               mbox_ipu: mbox_ipu {
+                               mbox_ipu: mbox-ipu {
                                        ti,mbox-tx = <0 0 0>;
                                        ti,mbox-rx = <1 0 0>;
                                };
-                               mbox_dsp: mbox_dsp {
+                               mbox_dsp: mbox-dsp {
                                        ti,mbox-tx = <3 0 0>;
                                        ti,mbox-rx = <2 0 0>;
                                };
index 9116386..31f59de 100644 (file)
@@ -9,27 +9,27 @@ partitions {
        #size-cells = <1>;
 
        u-boot@0 {
-               reg = <0x0 0x60000>; // 384KB
+               reg = <0x0 0xe0000>; // 896KB
                label = "u-boot";
        };
 
-       u-boot-env@60000 {
-               reg = <0x60000 0x20000>; // 128KB
+       u-boot-env@e0000 {
+               reg = <0xe0000 0x20000>; // 128KB
                label = "u-boot-env";
        };
 
-       kernel@80000 {
-               reg = <0x80000 0x500000>; // 5MB
+       kernel@100000 {
+               reg = <0x100000 0x900000>; // 9MB
                label = "kernel";
        };
 
-       rofs@580000 {
-               reg = <0x580000 0x2a80000>; // 42.5MB
+       rofs@a00000 {
+               reg = <0xa00000 0x2000000>; // 32MB
                label = "rofs";
        };
 
-       rwfs@3000000 {
-               reg = <0x3000000 0x1000000>; // 16MB
+       rwfs@6000000 {
+               reg = <0x2a00000 0x1600000>; // 22MB
                label = "rwfs";
        };
 };
index 282b89c..f7ea2e5 100644 (file)
        };
 };
 
+&adm_dma {
+       status = "okay";
+};
+
 &gmac0 {
        status = "okay";
 
        status = "okay";
 };
 
+&hs_phy_1 {
+       status = "okay";
+};
+
+&nand {
+       status = "okay";
+
+       nandcs@0 {
+               compatible = "qcom,nandcs";
+               reg = <0>;
+
+               nand-ecc-strength = <4>;
+               nand-bus-width = <8>;
+               nand-ecc-step-size = <512>;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       boot@0 {
+                               label = "RouterBoard NAND 1 Boot";
+                               reg = <0x0000000 0x0800000>;
+                       };
+
+                       main@800000 {
+                               label = "RouterBoard NAND 1 Main";
+                               reg = <0x0800000 0x7800000>;
+                       };
+               };
+       };
+};
+
 &qcom_pinmux {
        buttons_pins: buttons_pins {
                mux {
                        input-disable;
                };
        };
+
+       usb1_pwr_en_pins: usb1_pwr_en_pins {
+               mux {
+                       pins = "gpio4";
+                       function = "gpio";
+                       drive-strength = <16>;
+                       bias-disable;
+                       output-high;
+               };
+       };
+};
+
+&ss_phy_1 {
+       status = "okay";
+};
+
+&usb3_1 {
+       pinctrl-0 = <&usb1_pwr_en_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
 };
index 98995ea..7bcf5ef 100644 (file)
@@ -2,6 +2,8 @@
 /dts-v1/;
 
 #include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/mfd/qcom-rpm.h>
+#include <dt-bindings/clock/qcom,rpmcc.h>
 #include <dt-bindings/clock/qcom,gcc-ipq806x.h>
 #include <dt-bindings/clock/qcom,lcc-ipq806x.h>
 #include <dt-bindings/gpio/gpio.h>
                };
        };
 
+       thermal-zones {
+               tsens_tz_sensor0 {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&tsens 0>;
+
+                       trips {
+                               cpu-critical {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+
+                               cpu-hot {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+
+               tsens_tz_sensor1 {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&tsens 1>;
+
+                       trips {
+                               cpu-critical {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+
+                               cpu-hot {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+
+               tsens_tz_sensor2 {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&tsens 2>;
+
+                       trips {
+                               cpu-critical {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+
+                               cpu-hot {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+
+               tsens_tz_sensor3 {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&tsens 3>;
+
+                       trips {
+                               cpu-critical {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+
+                               cpu-hot {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+
+               tsens_tz_sensor4 {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&tsens 4>;
+
+                       trips {
+                               cpu-critical {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+
+                               cpu-hot {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+
+               tsens_tz_sensor5 {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&tsens 5>;
+
+                       trips {
+                               cpu-critical {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+
+                               cpu-hot {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+
+               tsens_tz_sensor6 {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&tsens 6>;
+
+                       trips {
+                               cpu-critical {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+
+                               cpu-hot {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+
+               tsens_tz_sensor7 {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&tsens 7>;
+
+                       trips {
+                               cpu-critical {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+
+                               cpu-hot {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+
+               tsens_tz_sensor8 {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&tsens 8>;
+
+                       trips {
+                               cpu-critical {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+
+                               cpu-hot {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+
+               tsens_tz_sensor9 {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&tsens 9>;
+
+                       trips {
+                               cpu-critical {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+
+                               cpu-hot {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+
+               tsens_tz_sensor10 {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&tsens 10>;
+
+                       trips {
+                               cpu-critical {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+
+                               cpu-hot {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+       };
+
        memory {
                device_type = "memory";
                reg = <0x0 0x0>;
                                        bias-pull-up;
                                };
                        };
+
+                       nand_pins: nand_pins {
+                               mux {
+                                       pins = "gpio34", "gpio35", "gpio36",
+                                              "gpio37", "gpio38", "gpio39",
+                                              "gpio40", "gpio41", "gpio42",
+                                              "gpio43", "gpio44", "gpio45",
+                                              "gpio46", "gpio47";
+                                       function = "nand";
+                                       drive-strength = <10>;
+                                       bias-disable;
+                               };
+
+                               pullups {
+                                       pins = "gpio39";
+                                       bias-pull-up;
+                               };
+
+                               hold {
+                                       pins = "gpio40", "gpio41", "gpio42",
+                                              "gpio43", "gpio44", "gpio45",
+                                              "gpio46", "gpio47";
+                                       bias-bus-hold;
+                               };
+                       };
                };
 
                intc: interrupt-controller@2000000 {
                        reg = <0x02098000 0x1000>, <0x02008000 0x1000>;
                };
 
+               adm_dma: dma-controller@18300000 {
+                       compatible = "qcom,adm";
+                       reg = <0x18300000 0x100000>;
+                       interrupts = <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>;
+                       #dma-cells = <1>;
+
+                       clocks = <&gcc ADM0_CLK>, <&gcc ADM0_PBUS_CLK>;
+                       clock-names = "core", "iface";
+
+                       resets = <&gcc ADM0_RESET>,
+                                <&gcc ADM0_PBUS_RESET>,
+                                <&gcc ADM0_C0_RESET>,
+                                <&gcc ADM0_C1_RESET>,
+                                <&gcc ADM0_C2_RESET>;
+                       reset-names = "clk", "pbus", "c0", "c1", "c2";
+                       qcom,ee = <0>;
+
+                       status = "disabled";
+               };
+
                saw0: regulator@2089000 {
                        compatible = "qcom,saw2";
                        reg = <0x02089000 0x1000>, <0x02009000 0x1000>;
                        status = "disabled";
                };
 
+               nand: nand-controller@1ac00000 {
+                       compatible = "qcom,ipq806x-nand";
+                       reg = <0x1ac00000 0x800>;
+
+                       pinctrl-0 = <&nand_pins>;
+                       pinctrl-names = "default";
+
+                       clocks = <&gcc EBI2_CLK>,
+                                <&gcc EBI2_AON_CLK>;
+                       clock-names = "core", "aon";
+
+                       dmas = <&adm_dma 3>;
+                       dma-names = "rxtx";
+                       qcom,cmd-crci = <15>;
+                       qcom,data-crci = <3>;
+
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       status = "disabled";
+               };
+
                sata: sata@29000000 {
                        compatible = "qcom,ipq806x-ahci", "generic-ahci";
                        reg = <0x29000000 0x180>;
                        reg = <0x00700000 0x1000>;
                        #address-cells = <1>;
                        #size-cells = <1>;
+                       tsens_calib: calib@400 {
+                               reg = <0x400 0xb>;
+                       };
+                       tsens_calib_backup: calib_backup@410 {
+                               reg = <0x410 0xb>;
+                       };
                };
 
                gcc: clock-controller@900000 {
                        reg = <0x00900000 0x4000>;
                        #clock-cells = <1>;
                        #reset-cells = <1>;
+                       #power-domain-cells = <1>;
+
+                       tsens: thermal-sensor@900000 {
+                               compatible = "qcom,ipq8064-tsens";
+
+                               nvmem-cells = <&tsens_calib>, <&tsens_calib_backup>;
+                               nvmem-cell-names = "calib", "calib_backup";
+                               interrupts = <GIC_SPI 178 IRQ_TYPE_LEVEL_HIGH>;
+                               interrupt-names = "uplow";
+
+                               #qcom,sensors = <11>;
+                               #thermal-sensor-cells = <1>;
+                       };
+               };
+
+               rpm: rpm@108000 {
+                       compatible = "qcom,rpm-ipq8064";
+                       reg = <0x108000 0x1000>;
+                       qcom,ipc = <&l2cc 0x8 2>;
+
+                       interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
+                                       <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>,
+                                       <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "ack", "err", "wakeup";
+
+                       clocks = <&gcc RPM_MSG_RAM_H_CLK>;
+                       clock-names = "ram";
+
+                       rpmcc: clock-controller {
+                               compatible = "qcom,rpmcc-ipq806x", "qcom,rpmcc";
+                               #clock-cells = <1>;
+                       };
                };
 
                tcsr: syscon@1a400000 {
                        reg = <0x1a400000 0x100>;
                };
 
+               l2cc: clock-controller@2011000 {
+                       compatible = "qcom,kpss-gcc", "syscon";
+                       reg = <0x2011000 0x1000>;
+                       clocks = <&gcc PLL8_VOTE>, <&gcc PXO_SRC>;
+                       clock-names = "pll8_vote", "pxo";
+                       clock-output-names = "acpu_l2_aux";
+               };
+
                lcc: clock-controller@28000000 {
                        compatible = "qcom,lcc-ipq8064";
                        reg = <0x28000000 0x1000>;
                        status = "disabled";
                };
 
+               hs_phy_0: phy@100f8800 {
+                       compatible = "qcom,ipq806x-usb-phy-hs";
+                       reg = <0x100f8800 0x30>;
+                       clocks = <&gcc USB30_0_UTMI_CLK>;
+                       clock-names = "ref";
+                       #phy-cells = <0>;
+
+                       status = "disabled";
+               };
+
+               ss_phy_0: phy@100f8830 {
+                       compatible = "qcom,ipq806x-usb-phy-ss";
+                       reg = <0x100f8830 0x30>;
+                       clocks = <&gcc USB30_0_MASTER_CLK>;
+                       clock-names = "ref";
+                       #phy-cells = <0>;
+
+                       status = "disabled";
+               };
+
+               usb3_0: usb3@100f8800 {
+                       compatible = "qcom,dwc3", "syscon";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0x100f8800 0x8000>;
+                       clocks = <&gcc USB30_0_MASTER_CLK>;
+                       clock-names = "core";
+
+                       ranges;
+
+                       resets = <&gcc USB30_0_MASTER_RESET>;
+                       reset-names = "master";
+
+                       status = "disabled";
+
+                       dwc3_0: dwc3@10000000 {
+                               compatible = "snps,dwc3";
+                               reg = <0x10000000 0xcd00>;
+                               interrupts = <GIC_SPI 205 IRQ_TYPE_LEVEL_HIGH>;
+                               phys = <&hs_phy_0>, <&ss_phy_0>;
+                               phy-names = "usb2-phy", "usb3-phy";
+                               dr_mode = "host";
+                               snps,dis_u3_susphy_quirk;
+                       };
+               };
+
+               hs_phy_1: phy@110f8800 {
+                       compatible = "qcom,ipq806x-usb-phy-hs";
+                       reg = <0x110f8800 0x30>;
+                       clocks = <&gcc USB30_1_UTMI_CLK>;
+                       clock-names = "ref";
+                       #phy-cells = <0>;
+               };
+
+               ss_phy_1: phy@110f8830 {
+                       compatible = "qcom,ipq806x-usb-phy-ss";
+                       reg = <0x110f8830 0x30>;
+                       clocks = <&gcc USB30_1_MASTER_CLK>;
+                       clock-names = "ref";
+                       #phy-cells = <0>;
+               };
+
+               usb3_1: usb3@110f8800 {
+                       compatible = "qcom,dwc3", "syscon";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0x110f8800 0x8000>;
+                       clocks = <&gcc USB30_1_MASTER_CLK>;
+                       clock-names = "core";
+
+                       ranges;
+
+                       resets = <&gcc USB30_1_MASTER_RESET>;
+                       reset-names = "master";
+
+                       status = "disabled";
+
+                       dwc3_1: dwc3@11000000 {
+                               compatible = "snps,dwc3";
+                               reg = <0x11000000 0xcd00>;
+                               interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
+                               phys = <&hs_phy_1>, <&ss_phy_1>;
+                               phy-names = "usb2-phy", "usb3-phy";
+                               dr_mode = "host";
+                               snps,dis_u3_susphy_quirk;
+                       };
+               };
+
                vsdcc_fixed: vsdcc-regulator {
                        compatible = "regulator-fixed";
                        regulator-name = "SDCC Power";
index dd1b976..a227968 100644 (file)
@@ -47,7 +47,6 @@
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
-               enable-method = "renesas,apmu";
 
                cpu0: cpu@0 {
                        device_type = "cpu";
@@ -56,6 +55,7 @@
                        clock-frequency = <1400000000>;
                        clocks = <&cpg CPG_CORE R8A7742_CLK_Z>;
                        power-domains = <&sysc R8A7742_PD_CA15_CPU0>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
                        capacity-dmips-mhz = <1024>;
                        voltage-tolerance = <1>; /* 1% */
@@ -77,6 +77,7 @@
                        clock-frequency = <1400000000>;
                        clocks = <&cpg CPG_CORE R8A7742_CLK_Z>;
                        power-domains = <&sysc R8A7742_PD_CA15_CPU1>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
                        capacity-dmips-mhz = <1024>;
                        voltage-tolerance = <1>; /* 1% */
@@ -98,6 +99,7 @@
                        clock-frequency = <1400000000>;
                        clocks = <&cpg CPG_CORE R8A7742_CLK_Z>;
                        power-domains = <&sysc R8A7742_PD_CA15_CPU2>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
                        capacity-dmips-mhz = <1024>;
                        voltage-tolerance = <1>; /* 1% */
                        clock-frequency = <1400000000>;
                        clocks = <&cpg CPG_CORE R8A7742_CLK_Z>;
                        power-domains = <&sysc R8A7742_PD_CA15_CPU3>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
                        capacity-dmips-mhz = <1024>;
                        voltage-tolerance = <1>; /* 1% */
                        reg = <0 0xe6800000 0 0x800>, <0 0xee0e8000 0 0x4000>;
                        interrupts = <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A7742_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        #address-cells = <1>;
index 6e37b8d..7e5e09d 100644 (file)
@@ -49,7 +49,6 @@
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
-               enable-method = "renesas,apmu";
 
                cpu0: cpu@0 {
                        device_type = "cpu";
@@ -59,6 +58,7 @@
                        clocks = <&cpg CPG_CORE R8A7743_CLK_Z>;
                        clock-latency = <300000>; /* 300 us */
                        power-domains = <&sysc R8A7743_PD_CA15_CPU0>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
 
                        /* kHz - uV - OPPs unknown yet */
@@ -78,6 +78,7 @@
                        clocks = <&cpg CPG_CORE R8A7743_CLK_Z>;
                        clock-latency = <300000>; /* 300 us */
                        power-domains = <&sysc R8A7743_PD_CA15_CPU1>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
 
                        /* kHz - uV - OPPs unknown yet */
                        reg = <0 0xe6800000 0 0x800>, <0 0xee0e8000 0 0x4000>;
                        interrupts = <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        #address-cells = <1>;
index ace2086..8419683 100644 (file)
@@ -49,7 +49,6 @@
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
-               enable-method = "renesas,apmu";
 
                cpu0: cpu@0 {
                        device_type = "cpu";
@@ -59,6 +58,7 @@
                        clocks = <&cpg CPG_CORE R8A7744_CLK_Z>;
                        clock-latency = <300000>; /* 300 us */
                        power-domains = <&sysc R8A7744_PD_CA15_CPU0>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
 
                        /* kHz - uV - OPPs unknown yet */
@@ -78,6 +78,7 @@
                        clocks = <&cpg CPG_CORE R8A7744_CLK_Z>;
                        clock-latency = <300000>; /* 300 us */
                        power-domains = <&sysc R8A7744_PD_CA15_CPU1>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
 
                        /* kHz - uV - OPPs unknown yet */
                        reg = <0 0xe6800000 0 0x800>, <0 0xee0e8000 0 0x4000>;
                        interrupts = <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A7744_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        #address-cells = <1>;
index be33bda..f877c51 100644 (file)
@@ -64,7 +64,6 @@
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
-               enable-method = "renesas,apmu";
 
                cpu0: cpu@0 {
                        device_type = "cpu";
@@ -73,6 +72,7 @@
                        clock-frequency = <1000000000>;
                        clocks = <&cpg CPG_CORE R8A7745_CLK_Z2>;
                        power-domains = <&sysc R8A7745_PD_CA7_CPU0>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA7>;
                };
 
@@ -83,6 +83,7 @@
                        clock-frequency = <1000000000>;
                        clocks = <&cpg CPG_CORE R8A7745_CLK_Z2>;
                        power-domains = <&sysc R8A7745_PD_CA7_CPU1>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA7>;
                };
 
                        reg = <0 0xe6800000 0 0x800>, <0 0xee0e8000 0 0x4000>;
                        interrupts = <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A7745_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        #address-cells = <1>;
index a1d7f6e..13ef1e9 100644 (file)
@@ -25,7 +25,6 @@
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
-               enable-method = "renesas,apmu";
 
                cpu0: cpu@0 {
                        device_type = "cpu";
@@ -34,6 +33,7 @@
                        clock-frequency = <1000000000>;
                        clocks = <&cpg CPG_CORE R8A77470_CLK_Z2>;
                        power-domains = <&sysc R8A77470_PD_CA7_CPU0>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA7>;
                };
 
@@ -44,6 +44,7 @@
                        clock-frequency = <1000000000>;
                        clocks = <&cpg CPG_CORE R8A77470_CLK_Z2>;
                        power-domains = <&sysc R8A77470_PD_CA7_CPU1>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA7>;
                };
 
                        reg = <0 0xe6800000 0 0x800>, <0 0xee0e8000 0 0x4000>;
                        interrupts = <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A77470_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        #address-cells = <1>;
index c9f8735..95efbaf 100644 (file)
                interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&mstp0_clks R8A7778_CLK_I2C1>;
                power-domains = <&cpg_clocks>;
+               i2c-scl-internal-delay-ns = <5>;
                status = "disabled";
        };
 
                interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&mstp0_clks R8A7778_CLK_I2C2>;
                power-domains = <&cpg_clocks>;
+               i2c-scl-internal-delay-ns = <5>;
                status = "disabled";
        };
 
                interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&mstp0_clks R8A7778_CLK_I2C3>;
                power-domains = <&cpg_clocks>;
+               i2c-scl-internal-delay-ns = <5>;
                status = "disabled";
        };
 
index d2240b8..4658453 100644 (file)
        status = "okay";
 
        clocks = <&mstp1_clks R8A7779_CLK_DU>, <&x3_clk>;
-       clock-names = "du", "dclkin.0";
+       clock-names = "du.0", "dclkin.0";
 
        ports {
                port@0 {
index 74d7e90..39fc58f 100644 (file)
                interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&mstp0_clks R8A7779_CLK_I2C1>;
                power-domains = <&sysc R8A7779_PD_ALWAYS_ON>;
+               i2c-scl-internal-delay-ns = <5>;
                status = "disabled";
        };
 
                interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&mstp0_clks R8A7779_CLK_I2C2>;
                power-domains = <&sysc R8A7779_PD_ALWAYS_ON>;
+               i2c-scl-internal-delay-ns = <5>;
                status = "disabled";
        };
 
                interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&mstp0_clks R8A7779_CLK_I2C3>;
                power-domains = <&sysc R8A7779_PD_ALWAYS_ON>;
+               i2c-scl-internal-delay-ns = <5>;
                status = "disabled";
        };
 
                reg = <0xfff80000 0x40000>;
                interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&mstp1_clks R8A7779_CLK_DU>;
+               clock-names = "du.0";
                power-domains = <&sysc R8A7779_PD_ALWAYS_ON>;
                status = "disabled";
 
index 2dad074..fa6d986 100644 (file)
@@ -81,6 +81,9 @@
        keyboard {
                compatible = "gpio-keys";
 
+               pinctrl-0 = <&keyboard_pins>;
+               pinctrl-names = "default";
+
                one {
                        linux,code = <KEY_1>;
                        label = "SW2-1";
                groups = "audio_clk_a";
                function = "audio_clk";
        };
+
+       keyboard_pins: keyboard {
+               pins = "GP_1_14", "GP_1_24", "GP_1_26", "GP_1_28";
+               bias-pull-up;
+       };
 };
 
 &ether {
index de29394..ed6dd4f 100644 (file)
@@ -69,7 +69,6 @@
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
-               enable-method = "renesas,apmu";
 
                cpu0: cpu@0 {
                        device_type = "cpu";
@@ -78,6 +77,7 @@
                        clock-frequency = <1300000000>;
                        clocks = <&cpg CPG_CORE R8A7790_CLK_Z>;
                        power-domains = <&sysc R8A7790_PD_CA15_CPU0>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
                        capacity-dmips-mhz = <1024>;
                        voltage-tolerance = <1>; /* 1% */
@@ -99,6 +99,7 @@
                        clock-frequency = <1300000000>;
                        clocks = <&cpg CPG_CORE R8A7790_CLK_Z>;
                        power-domains = <&sysc R8A7790_PD_CA15_CPU1>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
                        capacity-dmips-mhz = <1024>;
                        voltage-tolerance = <1>; /* 1% */
                        clock-frequency = <1300000000>;
                        clocks = <&cpg CPG_CORE R8A7790_CLK_Z>;
                        power-domains = <&sysc R8A7790_PD_CA15_CPU2>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
                        capacity-dmips-mhz = <1024>;
                        voltage-tolerance = <1>; /* 1% */
                        clock-frequency = <1300000000>;
                        clocks = <&cpg CPG_CORE R8A7790_CLK_Z>;
                        power-domains = <&sysc R8A7790_PD_CA15_CPU3>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
                        capacity-dmips-mhz = <1024>;
                        voltage-tolerance = <1>; /* 1% */
                        clock-frequency = <780000000>;
                        clocks = <&cpg CPG_CORE R8A7790_CLK_Z2>;
                        power-domains = <&sysc R8A7790_PD_CA7_CPU0>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA7>;
                        capacity-dmips-mhz = <539>;
                };
                        clock-frequency = <780000000>;
                        clocks = <&cpg CPG_CORE R8A7790_CLK_Z2>;
                        power-domains = <&sysc R8A7790_PD_CA7_CPU1>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA7>;
                        capacity-dmips-mhz = <539>;
                };
                        clock-frequency = <780000000>;
                        clocks = <&cpg CPG_CORE R8A7790_CLK_Z2>;
                        power-domains = <&sysc R8A7790_PD_CA7_CPU2>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA7>;
                        capacity-dmips-mhz = <539>;
                };
                        clock-frequency = <780000000>;
                        clocks = <&cpg CPG_CORE R8A7790_CLK_Z2>;
                        power-domains = <&sysc R8A7790_PD_CA7_CPU3>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA7>;
                        capacity-dmips-mhz = <539>;
                };
                        reg = <0 0xe6800000 0 0x800>, <0 0xee0e8000 0 0x4000>;
                        interrupts = <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A7790_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        #address-cells = <1>;
index 61e881b..2a8b6fd 100644 (file)
@@ -81,7 +81,7 @@
        keyboard {
                compatible = "gpio-keys";
 
-               pinctrl-0 = <&sw2_pins>;
+               pinctrl-0 = <&keyboard_pins>;
                pinctrl-names = "default";
 
                key-1 {
                function = "audio_clk";
        };
 
-       sw2_pins: sw2 {
+       keyboard_pins: keyboard {
                pins = "GP_5_0", "GP_5_1", "GP_5_2", "GP_5_3";
                bias-pull-up;
        };
index 9d8320f..0ccc162 100644 (file)
@@ -68,7 +68,6 @@
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
-               enable-method = "renesas,apmu";
 
                cpu0: cpu@0 {
                        device_type = "cpu";
@@ -77,6 +76,7 @@
                        clock-frequency = <1500000000>;
                        clocks = <&cpg CPG_CORE R8A7791_CLK_Z>;
                        power-domains = <&sysc R8A7791_PD_CA15_CPU0>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
                        voltage-tolerance = <1>; /* 1% */
                        clock-latency = <300000>; /* 300 us */
@@ -97,6 +97,7 @@
                        clock-frequency = <1500000000>;
                        clocks = <&cpg CPG_CORE R8A7791_CLK_Z>;
                        power-domains = <&sysc R8A7791_PD_CA15_CPU1>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
                        voltage-tolerance = <1>; /* 1% */
                        clock-latency = <300000>; /* 300 us */
                        reg = <0 0xe6800000 0 0x800>, <0 0xee0e8000 0 0x4000>;
                        interrupts = <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A7791_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        #address-cells = <1>;
index c100ae9..62aa9f6 100644 (file)
        keyboard {
                compatible = "gpio-keys";
 
+               pinctrl-0 = <&keyboard_pins>;
+               pinctrl-names = "default";
+
                key-1 {
                        linux,code = <KEY_1>;
                        label = "SW2-1";
                function = "du1";
        };
 
+       keyboard_pins: keyboard {
+               pins = "GP_3_10", "GP_3_11", "GP_3_12", "GP_3_15", "GP_11_02";
+               bias-pull-up;
+       };
+
        pmic_irq_pins: pmicirq {
                groups = "intc_irq2";
                function = "intc";
index 253e8bf..9cdb738 100644 (file)
@@ -45,7 +45,6 @@
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
-               enable-method = "renesas,apmu";
 
                cpu0: cpu@0 {
                        device_type = "cpu";
@@ -54,6 +53,7 @@
                        clock-frequency = <1000000000>;
                        clocks = <&cpg CPG_CORE R8A7792_CLK_Z>;
                        power-domains = <&sysc R8A7792_PD_CA15_CPU0>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
                };
 
@@ -64,6 +64,7 @@
                        clock-frequency = <1000000000>;
                        clocks = <&cpg CPG_CORE R8A7792_CLK_Z>;
                        power-domains = <&sysc R8A7792_PD_CA15_CPU1>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA15>;
                };
 
                        reg = <0 0xe6800000 0 0x800>, <0 0xee0e8000 0 0x4000>;
                        interrupts = <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A7792_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        #address-cells = <1>;
index 87fa57a..479e0fd 100644 (file)
                reg = <0 0x40000000 0 0x40000000>;
        };
 
-       gpio-keys {
+       keyboard {
                compatible = "gpio-keys";
 
+               pinctrl-0 = <&keyboard_pins>;
+               pinctrl-names = "default";
+
                key-1 {
                        gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
                        linux,code = <KEY_1>;
                function = "audio_clk";
        };
 
+       keyboard_pins: keyboard {
+               pins = "GP_5_0", "GP_5_1", "GP_5_2", "GP_5_3";
+               bias-pull-up;
+       };
+
        vin0_pins: vin0 {
                groups = "vin0_data24", "vin0_sync", "vin0_clkenb", "vin0_clk";
                function = "vin0";
index 6d74475..dea4b1e 100644 (file)
@@ -60,7 +60,6 @@
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
-               enable-method = "renesas,apmu";
 
                cpu0: cpu@0 {
                        device_type = "cpu";
@@ -69,6 +68,7 @@
                        clock-frequency = <1500000000>;
                        clocks = <&cpg CPG_CORE R8A7793_CLK_Z>;
                        power-domains = <&sysc R8A7793_PD_CA15_CPU0>;
+                       enable-method = "renesas,apmu";
                        voltage-tolerance = <1>; /* 1% */
                        clock-latency = <300000>; /* 300 us */
 
@@ -89,6 +89,7 @@
                        clock-frequency = <1500000000>;
                        clocks = <&cpg CPG_CORE R8A7793_CLK_Z>;
                        power-domains = <&sysc R8A7793_PD_CA15_CPU1>;
+                       enable-method = "renesas,apmu";
                        voltage-tolerance = <1>; /* 1% */
                        clock-latency = <300000>; /* 300 us */
 
index f9dba56..f330d79 100644 (file)
@@ -8,6 +8,7 @@
 /dts-v1/;
 #include "r8a7794.dtsi"
 #include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
 
 / {
        model = "Alt";
                #size-cells = <1>;
        };
 
+       keyboard {
+               compatible = "gpio-keys";
+
+               pinctrl-0 = <&keyboard_pins>;
+               pinctrl-names = "default";
+
+               one {
+                       linux,code = <KEY_1>;
+                       label = "SW2-1";
+                       wakeup-source;
+                       debounce-interval = <20>;
+                       gpios = <&gpio3 9 GPIO_ACTIVE_LOW>;
+               };
+               two {
+                       linux,code = <KEY_2>;
+                       label = "SW2-2";
+                       wakeup-source;
+                       debounce-interval = <20>;
+                       gpios = <&gpio3 10 GPIO_ACTIVE_LOW>;
+               };
+               three {
+                       linux,code = <KEY_3>;
+                       label = "SW2-3";
+                       wakeup-source;
+                       debounce-interval = <20>;
+                       gpios = <&gpio3 11 GPIO_ACTIVE_LOW>;
+               };
+               four {
+                       linux,code = <KEY_4>;
+                       label = "SW2-4";
+                       wakeup-source;
+                       debounce-interval = <20>;
+                       gpios = <&gpio3 12 GPIO_ACTIVE_LOW>;
+               };
+       };
+
        vga-encoder {
                compatible = "adi,adv7123";
 
                groups = "usb1";
                function = "usb1";
        };
+
+       keyboard_pins: keyboard {
+               pins = "GP_3_9", "GP_3_10", "GP_3_11", "GP_3_12";
+               bias-pull-up;
+       };
 };
 
 &cmt0 {
index eb89a27..cafa304 100644 (file)
                reg = <0 0x40000000 0 0x40000000>;
        };
 
-       gpio-keys {
+       keyboard {
                compatible = "gpio-keys";
 
+               pinctrl-0 = <&keyboard_pins>;
+               pinctrl-names = "default";
+
                key-3 {
                        gpios = <&gpio5 10 GPIO_ACTIVE_LOW>;
                        linux,code = <KEY_3>;
                function = "du1";
        };
 
+       keyboard_pins: keyboard {
+               pins = "GP_3_9", "GP_3_10", "GP_3_11", "GP_3_12";
+               bias-pull-up;
+       };
+
        ssi_pins: sound {
                groups = "ssi0129_ctrl", "ssi0_data", "ssi1_data";
                function = "ssi";
index 330dc51..eac9ed8 100644 (file)
@@ -62,7 +62,6 @@
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
-               enable-method = "renesas,apmu";
 
                cpu0: cpu@0 {
                        device_type = "cpu";
@@ -71,6 +70,7 @@
                        clock-frequency = <1000000000>;
                        clocks = <&cpg CPG_CORE R8A7794_CLK_Z2>;
                        power-domains = <&sysc R8A7794_PD_CA7_CPU0>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA7>;
                };
 
@@ -81,6 +81,7 @@
                        clock-frequency = <1000000000>;
                        clocks = <&cpg CPG_CORE R8A7794_CLK_Z2>;
                        power-domains = <&sysc R8A7794_PD_CA7_CPU1>;
+                       enable-method = "renesas,apmu";
                        next-level-cache = <&L2_CA7>;
                };
 
                        reg = <0 0xe6800000 0 0x800>, <0 0xee0e8000 0 0x4000>;
                        interrupts = <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A7794_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        #address-cells = <1>;
index 7154b82..e817eba 100644 (file)
                };
        };
 
-       sleep {
+       suspend {
                global_pwroff: global-pwroff {
                        rockchip,pins = <2 RK_PA7 1 &pcfg_pull_none>;
                };
index e24230d..33019d2 100644 (file)
@@ -6,6 +6,7 @@
 #include <dt-bindings/pinctrl/rockchip.h>
 #include <dt-bindings/clock/rk3036-cru.h>
 #include <dt-bindings/soc/rockchip,boot-mode.h>
+#include <dt-bindings/power/rk3036-power.h>
 
 / {
        #address-cells = <1>;
                assigned-clock-rates = <100000000>;
                clocks = <&cru SCLK_GPU>, <&cru SCLK_GPU>;
                clock-names = "bus", "core";
+               power-domains = <&power RK3036_PD_GPU>;
                resets = <&cru SRST_GPU>;
                status = "disabled";
        };
                resets = <&cru SRST_LCDC1_A>, <&cru SRST_LCDC1_H>, <&cru SRST_LCDC1_D>;
                reset-names = "axi", "ahb", "dclk";
                iommus = <&vop_mmu>;
+               power-domains = <&power RK3036_PD_VIO>;
                status = "disabled";
 
                vop_out: port {
                compatible = "rockchip,iommu";
                reg = <0x10118300 0x100>;
                interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
-               interrupt-names = "vop_mmu";
                clocks = <&cru ACLK_LCDC>, <&cru HCLK_LCDC>;
                clock-names = "aclk", "iface";
+               power-domains = <&power RK3036_PD_VIO>;
                #iommu-cells = <0>;
                status = "disabled";
        };
 
+       qos_gpu: qos@1012d000 {
+               compatible = "rockchip,rk3036-qos", "syscon";
+               reg = <0x1012d000 0x20>;
+       };
+
+       qos_vpu: qos@1012e000 {
+               compatible = "rockchip,rk3036-qos", "syscon";
+               reg = <0x1012e000 0x20>;
+       };
+
+       qos_vio: qos@1012f000 {
+               compatible = "rockchip,rk3036-qos", "syscon";
+               reg = <0x1012f000 0x20>;
+       };
+
        gic: interrupt-controller@10139000 {
                compatible = "arm,gic-400";
                interrupt-controller;
                compatible = "rockchip,rk3036-grf", "syscon", "simple-mfd";
                reg = <0x20008000 0x1000>;
 
+               power: power-controller {
+                       compatible = "rockchip,rk3036-power-controller";
+                       #power-domain-cells = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       power-domain@RK3036_PD_VIO {
+                               reg = <RK3036_PD_VIO>;
+                               clocks = <&cru ACLK_LCDC>,
+                                        <&cru HCLK_LCDC>,
+                                        <&cru SCLK_LCDC>;
+                               pm_qos = <&qos_vio>;
+                               #power-domain-cells = <0>;
+                       };
+
+                       power-domain@RK3036_PD_VPU {
+                               reg = <RK3036_PD_VPU>;
+                               clocks = <&cru ACLK_VCODEC>,
+                                        <&cru HCLK_VCODEC>;
+                               pm_qos = <&qos_vpu>;
+                               #power-domain-cells = <0>;
+                       };
+
+                       power-domain@RK3036_PD_GPU {
+                               reg = <RK3036_PD_GPU>;
+                               clocks = <&cru SCLK_GPU>;
+                               pm_qos = <&qos_gpu>;
+                               #power-domain-cells = <0>;
+                       };
+               };
+
                reboot-mode {
                        compatible = "syscon-reboot-mode";
                        offset = <0x1d8>;
index eba7a13..390aa33 100644 (file)
        model = "bq Curie 2";
        compatible = "mundoreader,bq-curie2", "rockchip,rk3066a";
 
+       aliases {
+               mmc0 = &mmc0;
+               mmc1 = &mmc1;
+       };
+
        memory@60000000 {
                device_type = "memory";
                reg = <0x60000000 0x40000000>;
index 6b12165..a66d915 100644 (file)
        model = "MarsBoard RK3066";
        compatible = "haoyu,marsboard-rk3066", "rockchip,rk3066a";
 
+       aliases {
+               mmc0 = &mmc0;
+       };
+
        memory@60000000 {
                device_type = "memory";
                reg = <0x60000000 0x40000000>;
index eed9e60..9790bc6 100644 (file)
        model = "Rikomagic MK808";
        compatible = "rikomagic,mk808", "rockchip,rk3066a";
 
+       aliases {
+               mmc0 = &mmc0;
+               mmc1 = &mmc1;
+       };
+
        chosen {
                stdout-path = "serial2:115200n8";
        };
index 3095184..12b2e59 100644 (file)
        model = "Rayeager PX2";
        compatible = "chipspark,rayeager-px2", "rockchip,rk3066a";
 
+       aliases {
+               mmc0 = &mmc0;
+               mmc1 = &mmc1;
+               mmc2 = &emmc;
+       };
+
        memory@60000000 {
                device_type = "memory";
                reg = <0x60000000 0x40000000>;
@@ -58,7 +64,7 @@
        };
 
        /* input for 5V_STDBY is VSYS or DC5V, selectable by jumper J4 */
-       vcc_stdby: 5v-stdby-regulator {
+       vcc_stdby: stdby-regulator {
                compatible = "regulator-fixed";
                regulator-name = "5v_stdby";
                regulator-min-microvolt = <5000000>;
index 252750c..b15cbbe 100644 (file)
                                       <150000000>, <75000000>;
        };
 
-       timer@2000e000 {
+       timer2: timer@2000e000 {
                compatible = "snps,dw-apb-timer-osc";
                reg = <0x2000e000 0x100>;
                interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
                };
        };
 
-       timer@20038000 {
+       timer0: timer@20038000 {
                compatible = "snps,dw-apb-timer-osc";
                reg = <0x20038000 0x100>;
                interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
                clock-names = "timer", "pclk";
        };
 
-       timer@2003a000 {
+       timer1: timer@2003a000 {
                compatible = "snps,dw-apb-timer-osc";
                reg = <0x2003a000 0x100>;
                interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
                status = "disabled";
        };
 
-       usbphy: phy {
-               compatible = "rockchip,rk3066a-usb-phy", "rockchip,rk3288-usb-phy";
-               rockchip,grf = <&grf>;
-               #address-cells = <1>;
-               #size-cells = <0>;
-               status = "disabled";
-
-               usbphy0: usb-phy@17c {
-                       #phy-cells = <0>;
-                       reg = <0x17c>;
-                       clocks = <&cru SCLK_OTGPHY0>;
-                       clock-names = "phyclk";
-                       #clock-cells = <0>;
-               };
-
-               usbphy1: usb-phy@188 {
-                       #phy-cells = <0>;
-                       reg = <0x188>;
-                       clocks = <&cru SCLK_OTGPHY1>;
-                       clock-names = "phyclk";
-                       #clock-cells = <0>;
-               };
-       };
-
        pinctrl: pinctrl {
                compatible = "rockchip,rk3066a-pinctrl";
                rockchip,grf = <&grf>;
        power-domains = <&power RK3066_PD_GPU>;
 };
 
+&grf {
+       compatible = "rockchip,rk3066-grf", "syscon", "simple-mfd";
+
+       usbphy: usbphy {
+               compatible = "rockchip,rk3066a-usb-phy",
+                            "rockchip,rk3288-usb-phy";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               status = "disabled";
+
+               usbphy0: usb-phy@17c {
+                       reg = <0x17c>;
+                       clocks = <&cru SCLK_OTGPHY0>;
+                       clock-names = "phyclk";
+                       #clock-cells = <0>;
+                       #phy-cells = <0>;
+               };
+
+               usbphy1: usb-phy@188 {
+                       reg = <0x188>;
+                       clocks = <&cru SCLK_OTGPHY1>;
+                       clock-names = "phyclk";
+                       #clock-cells = <0>;
+                       #phy-cells = <0>;
+               };
+       };
+};
+
 &i2c0 {
        pinctrl-names = "default";
        pinctrl-0 = <&i2c0_xfer>;
                #address-cells = <1>;
                #size-cells = <0>;
 
-               pd_vio@RK3066_PD_VIO {
+               power-domain@RK3066_PD_VIO {
                        reg = <RK3066_PD_VIO>;
                        clocks = <&cru ACLK_LCDC0>,
                                 <&cru ACLK_LCDC1>,
                                 <&qos_cif1>,
                                 <&qos_ipp>,
                                 <&qos_rga>;
+                       #power-domain-cells = <0>;
                };
 
-               pd_video@RK3066_PD_VIDEO {
+               power-domain@RK3066_PD_VIDEO {
                        reg = <RK3066_PD_VIDEO>;
                        clocks = <&cru ACLK_VDPU>,
                                 <&cru ACLK_VEPU>,
                                 <&cru HCLK_VDPU>,
                                 <&cru HCLK_VEPU>;
                        pm_qos = <&qos_vpu>;
+                       #power-domain-cells = <0>;
                };
 
-               pd_gpu@RK3066_PD_GPU {
+               power-domain@RK3066_PD_GPU {
                        reg = <RK3066_PD_GPU>;
                        clocks = <&cru ACLK_GPU>;
                        pm_qos = <&qos_gpu>;
+                       #power-domain-cells = <0>;
                };
        };
 };
index 66a0ff1..85d3fce 100644 (file)
        model = "BQ Edison2 Quad-Core";
        compatible = "mundoreader,bq-edison2qc", "rockchip,rk3188";
 
+       aliases {
+               mmc0 = &mmc0;
+               mmc1 = &mmc1;
+               mmc2 = &emmc;
+       };
+
        memory@60000000 {
                device_type = "memory";
                reg = <0x60000000 0x80000000>;
index c32e1d4..39c6042 100644 (file)
        model = "Rockchip PX3-EVB";
        compatible = "rockchip,px3-evb", "rockchip,px3", "rockchip,rk3188";
 
+       aliases {
+               mmc0 = &mmc0;
+               mmc1 = &emmc;
+       };
+
        chosen {
                stdout-path = "serial2:115200n8";
        };
index b0fef82..36c0945 100644 (file)
        model = "Radxa Rock";
        compatible = "radxa,rock", "rockchip,rk3188";
 
+       aliases {
+               mmc0 = &mmc0;
+       };
+
        memory@60000000 {
                device_type = "memory";
                reg = <0x60000000 0x80000000>;
index 2298a8d..b36fcdd 100644 (file)
                compatible = "rockchip,rk3188-timer", "rockchip,rk3288-timer";
                reg = <0x2000e000 0x20>;
                interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
-               clocks = <&cru SCLK_TIMER3>, <&cru PCLK_TIMER3>;
-               clock-names = "timer", "pclk";
+               clocks = <&cru PCLK_TIMER3>, <&cru SCLK_TIMER3>;
+               clock-names = "pclk", "timer";
        };
 
        timer6: timer@200380a0 {
                compatible = "rockchip,rk3188-timer", "rockchip,rk3288-timer";
                reg = <0x200380a0 0x20>;
                interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
-               clocks = <&cru SCLK_TIMER6>, <&cru PCLK_TIMER0>;
-               clock-names = "timer", "pclk";
+               clocks = <&cru PCLK_TIMER0>, <&cru SCLK_TIMER6>;
+               clock-names = "pclk", "timer";
        };
 
        i2s0: i2s@1011a000 {
                };
        };
 
-       usbphy: phy {
-               compatible = "rockchip,rk3188-usb-phy", "rockchip,rk3288-usb-phy";
-               rockchip,grf = <&grf>;
-               #address-cells = <1>;
-               #size-cells = <0>;
-               status = "disabled";
-
-               usbphy0: usb-phy@10c {
-                       #phy-cells = <0>;
-                       reg = <0x10c>;
-                       clocks = <&cru SCLK_OTGPHY0>;
-                       clock-names = "phyclk";
-                       #clock-cells = <0>;
-               };
-
-               usbphy1: usb-phy@11c {
-                       #phy-cells = <0>;
-                       reg = <0x11c>;
-                       clocks = <&cru SCLK_OTGPHY1>;
-                       clock-names = "phyclk";
-                       #clock-cells = <0>;
-               };
-       };
-
        pinctrl: pinctrl {
                compatible = "rockchip,rk3188-pinctrl";
                rockchip,grf = <&grf>;
        power-domains = <&power RK3188_PD_GPU>;
 };
 
+&grf{
+       compatible = "rockchip,rk3188-grf", "syscon", "simple-mfd";
+
+       usbphy: usbphy {
+               compatible = "rockchip,rk3188-usb-phy",
+                            "rockchip,rk3288-usb-phy";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               status = "disabled";
+
+               usbphy0: usb-phy@10c {
+                       reg = <0x10c>;
+                       clocks = <&cru SCLK_OTGPHY0>;
+                       clock-names = "phyclk";
+                       #clock-cells = <0>;
+                       #phy-cells = <0>;
+               };
+
+               usbphy1: usb-phy@11c {
+                       reg = <0x11c>;
+                       clocks = <&cru SCLK_OTGPHY1>;
+                       clock-names = "phyclk";
+                       #clock-cells = <0>;
+                       #phy-cells = <0>;
+               };
+       };
+};
+
 &i2c0 {
        compatible = "rockchip,rk3188-i2c";
        pinctrl-names = "default";
                #address-cells = <1>;
                #size-cells = <0>;
 
-               pd_vio@RK3188_PD_VIO {
+               power-domain@RK3188_PD_VIO {
                        reg = <RK3188_PD_VIO>;
                        clocks = <&cru ACLK_LCDC0>,
                                 <&cru ACLK_LCDC1>,
                                 <&qos_cif0>,
                                 <&qos_ipp>,
                                 <&qos_rga>;
+                       #power-domain-cells = <0>;
                };
 
-               pd_video@RK3188_PD_VIDEO {
+               power-domain@RK3188_PD_VIDEO {
                        reg = <RK3188_PD_VIDEO>;
                        clocks = <&cru ACLK_VDPU>,
                                 <&cru ACLK_VEPU>,
                                 <&cru HCLK_VDPU>,
                                 <&cru HCLK_VEPU>;
                        pm_qos = <&qos_vpu>;
+                       #power-domain-cells = <0>;
                };
 
-               pd_gpu@RK3188_PD_GPU {
+               power-domain@RK3188_PD_GPU {
                        reg = <RK3188_PD_GPU>;
                        clocks = <&cru ACLK_GPU>;
                        pm_qos = <&qos_gpu>;
+                       #power-domain-cells = <0>;
                };
        };
 };
index 208f212..ea8ceeb 100644 (file)
@@ -6,6 +6,7 @@
 #include <dt-bindings/pinctrl/rockchip.h>
 #include <dt-bindings/clock/rk3228-cru.h>
 #include <dt-bindings/thermal/thermal.h>
+#include <dt-bindings/power/rk3228-power.h>
 
 / {
        #address-cells = <1>;
                        status = "disabled";
                };
 
-               u2phy0: usb2-phy@760 {
+               power: power-controller {
+                       compatible = "rockchip,rk3228-power-controller";
+                       #power-domain-cells = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       power-domain@RK3228_PD_VIO {
+                               reg = <RK3228_PD_VIO>;
+                               clocks = <&cru ACLK_HDCP>,
+                                        <&cru SCLK_HDCP>,
+                                        <&cru ACLK_IEP>,
+                                        <&cru HCLK_IEP>,
+                                        <&cru ACLK_RGA>,
+                                        <&cru HCLK_RGA>,
+                                        <&cru SCLK_RGA>;
+                               pm_qos = <&qos_hdcp>,
+                                        <&qos_iep>,
+                                        <&qos_rga_r>,
+                                        <&qos_rga_w>;
+                               #power-domain-cells = <0>;
+                       };
+
+                       power-domain@RK3228_PD_VOP {
+                               reg = <RK3228_PD_VOP>;
+                               clocks =<&cru ACLK_VOP>,
+                                       <&cru DCLK_VOP>,
+                                       <&cru HCLK_VOP>;
+                               pm_qos = <&qos_vop>;
+                               #power-domain-cells = <0>;
+                       };
+
+                       power-domain@RK3228_PD_VPU {
+                               reg = <RK3228_PD_VPU>;
+                               clocks = <&cru ACLK_VPU>,
+                                        <&cru HCLK_VPU>;
+                               pm_qos = <&qos_vpu>;
+                               #power-domain-cells = <0>;
+                       };
+
+                       power-domain@RK3228_PD_RKVDEC {
+                               reg = <RK3228_PD_RKVDEC>;
+                               clocks = <&cru ACLK_RKVDEC>,
+                                        <&cru HCLK_RKVDEC>,
+                                        <&cru SCLK_VDEC_CABAC>,
+                                        <&cru SCLK_VDEC_CORE>;
+                               pm_qos = <&qos_rkvdec_r>,
+                                        <&qos_rkvdec_w>;
+                               #power-domain-cells = <0>;
+                       };
+
+                       power-domain@RK3228_PD_GPU {
+                               reg = <RK3228_PD_GPU>;
+                               clocks = <&cru ACLK_GPU>;
+                               pm_qos = <&qos_gpu>;
+                               #power-domain-cells = <0>;
+                       };
+               };
+
+               u2phy0: usb2phy@760 {
                        compatible = "rockchip,rk3228-usb2phy";
                        reg = <0x0760 0x0c>;
                        clocks = <&cru SCLK_OTGPHY0>;
                        };
                };
 
-               u2phy1: usb2-phy@800 {
+               u2phy1: usb2phy@800 {
                        compatible = "rockchip,rk3228-usb2phy";
                        reg = <0x0800 0x0c>;
                        clocks = <&cru SCLK_OTGPHY1>;
                reg = <0x110b0000 0x10>;
                #pwm-cells = <3>;
                clocks = <&cru PCLK_PWM>;
-               clock-names = "pwm";
                pinctrl-names = "default";
                pinctrl-0 = <&pwm0_pin>;
                status = "disabled";
                reg = <0x110b0010 0x10>;
                #pwm-cells = <3>;
                clocks = <&cru PCLK_PWM>;
-               clock-names = "pwm";
                pinctrl-names = "default";
                pinctrl-0 = <&pwm1_pin>;
                status = "disabled";
                reg = <0x110b0020 0x10>;
                #pwm-cells = <3>;
                clocks = <&cru PCLK_PWM>;
-               clock-names = "pwm";
                pinctrl-names = "default";
                pinctrl-0 = <&pwm2_pin>;
                status = "disabled";
                reg = <0x110b0030 0x10>;
                #pwm-cells = <2>;
                clocks = <&cru PCLK_PWM>;
-               clock-names = "pwm";
                pinctrl-names = "default";
                pinctrl-0 = <&pwm3_pin>;
                status = "disabled";
                pinctrl-0 = <&otp_pin>;
                pinctrl-1 = <&otp_out>;
                pinctrl-2 = <&otp_pin>;
-               #thermal-sensor-cells = <0>;
+               #thermal-sensor-cells = <1>;
                rockchip,hw-tshut-temp = <95000>;
                status = "disabled";
        };
                                  "ppmmu1";
                clocks = <&cru ACLK_GPU>, <&cru ACLK_GPU>;
                clock-names = "bus", "core";
+               power-domains = <&power RK3228_PD_GPU>;
                resets = <&cru SRST_GPU_A>;
                status = "disabled";
        };
                compatible = "rockchip,iommu";
                reg = <0x20020800 0x100>;
                interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
-               interrupt-names = "vpu_mmu";
                clocks = <&cru ACLK_VPU>, <&cru HCLK_VPU>;
                clock-names = "aclk", "iface";
-               iommu-cells = <0>;
+               power-domains = <&power RK3228_PD_VPU>;
+               #iommu-cells = <0>;
                status = "disabled";
        };
 
                compatible = "rockchip,iommu";
                reg = <0x20030480 0x40>, <0x200304c0 0x40>;
                interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
-               interrupt-names = "vdec_mmu";
                clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>;
                clock-names = "aclk", "iface";
-               iommu-cells = <0>;
+               power-domains = <&power RK3228_PD_RKVDEC>;
+               #iommu-cells = <0>;
                status = "disabled";
        };
 
                resets = <&cru SRST_VOP_A>, <&cru SRST_VOP_H>, <&cru SRST_VOP_D>;
                reset-names = "axi", "ahb", "dclk";
                iommus = <&vop_mmu>;
+               power-domains = <&power RK3228_PD_VOP>;
                status = "disabled";
 
                vop_out: port {
                compatible = "rockchip,iommu";
                reg = <0x20053f00 0x100>;
                interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
-               interrupt-names = "vop_mmu";
                clocks = <&cru ACLK_VOP>, <&cru HCLK_VOP>;
                clock-names = "aclk", "iface";
+               power-domains = <&power RK3228_PD_VOP>;
                #iommu-cells = <0>;
                status = "disabled";
        };
                interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&cru ACLK_RGA>, <&cru HCLK_RGA>, <&cru SCLK_RGA>;
                clock-names = "aclk", "hclk", "sclk";
+               power-domains = <&power RK3228_PD_VIO>;
                resets = <&cru SRST_RGA>, <&cru SRST_RGA_A>, <&cru SRST_RGA_H>;
                reset-names = "core", "axi", "ahb";
        };
                compatible = "rockchip,iommu";
                reg = <0x20070800 0x100>;
                interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
-               interrupt-names = "iep_mmu";
                clocks = <&cru ACLK_IEP>, <&cru HCLK_IEP>;
                clock-names = "aclk", "iface";
-               iommu-cells = <0>;
+               power-domains = <&power RK3228_PD_VIO>;
+               #iommu-cells = <0>;
                status = "disabled";
        };
 
                status = "disabled";
        };
 
+       qos_iep: qos@31030080 {
+               compatible = "rockchip,rk3228-qos", "syscon";
+               reg = <0x31030080 0x20>;
+       };
+
+       qos_rga_w: qos@31030100 {
+               compatible = "rockchip,rk3228-qos", "syscon";
+               reg = <0x31030100 0x20>;
+       };
+
+       qos_hdcp: qos@31030180 {
+               compatible = "rockchip,rk3228-qos", "syscon";
+               reg = <0x31030180 0x20>;
+       };
+
+       qos_rga_r: qos@31030200 {
+               compatible = "rockchip,rk3228-qos", "syscon";
+               reg = <0x31030200 0x20>;
+       };
+
+       qos_vpu: qos@31040000 {
+               compatible = "rockchip,rk3228-qos", "syscon";
+               reg = <0x31040000 0x20>;
+       };
+
+       qos_gpu: qos@31050000 {
+               compatible = "rockchip,rk3228-qos", "syscon";
+               reg = <0x31050000 0x20>;
+       };
+
+       qos_vop: qos@31060000 {
+               compatible = "rockchip,rk3228-qos", "syscon";
+               reg = <0x31060000 0x20>;
+       };
+
+       qos_rkvdec_r: qos@31070000 {
+               compatible = "rockchip,rk3228-qos", "syscon";
+               reg = <0x31070000 0x20>;
+       };
+
+       qos_rkvdec_w: qos@31070080 {
+               compatible = "rockchip,rk3228-qos", "syscon";
+               reg = <0x31070080 0x20>;
+       };
+
        gic: interrupt-controller@32010000 {
                compatible = "arm,gic-400";
                interrupt-controller;
index 44bb5e6..76363b8 100644 (file)
        flash0-supply = <&vcc_flash>;
        flash1-supply = <&vccio_pmu>;
        gpio30-supply = <&vccio_pmu>;
-       gpio1830 = <&vcc_io>;
+       gpio1830-supply = <&vcc_io>;
        lcdc-supply = <&vcc_io>;
        sdcard-supply = <&vccio_sd>;
        wifi-supply = <&vcc_18>;
index aa50f8e..b156a83 100644 (file)
        audio-supply = <&vcc_18>;
        bb-supply = <&vcc_io>;
        dvp-supply = <&vcc_io>;
-       flash0-suuply = <&vcc_18>;
+       flash0-supply = <&vcc_18>;
        flash1-supply = <&vcc_lan>;
        gpio30-supply = <&vcc_io>;
-       gpio1830 = <&vcc_io>;
+       gpio1830-supply = <&vcc_io>;
        lcdc-supply = <&vcc_io>;
        sdcard-supply = <&vccio_sd>;
        wifi-supply = <&vcc_18>;
index 05557ad..9c5a779 100644 (file)
                compatible = "rockchip,rk3288-timer";
                reg = <0x0 0xff810000 0x0 0x20>;
                interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
-               clocks = <&xin24m>, <&cru PCLK_TIMER>;
-               clock-names = "timer", "pclk";
+               clocks = <&cru PCLK_TIMER>, <&xin24m>;
+               clock-names = "pclk", "timer";
        };
 
        display-subsystem {
                         *      *_HDMI          HDMI
                         *      *_MIPI_*        MIPI
                         */
-                       pd_vio@RK3288_PD_VIO {
+                       power-domain@RK3288_PD_VIO {
                                reg = <RK3288_PD_VIO>;
                                clocks = <&cru ACLK_IEP>,
                                         <&cru ACLK_ISP>,
                                         <&qos_vio2_rga_r>,
                                         <&qos_vio2_rga_w>,
                                         <&qos_vio1_isp_r>;
+                               #power-domain-cells = <0>;
                        };
 
                        /*
                         * Note: The following 3 are HEVC(H.265) clocks,
                         * and on the ACLK_HEVC_NIU (NOC).
                         */
-                       pd_hevc@RK3288_PD_HEVC {
+                       power-domain@RK3288_PD_HEVC {
                                reg = <RK3288_PD_HEVC>;
                                clocks = <&cru ACLK_HEVC>,
                                         <&cru SCLK_HEVC_CABAC>,
                                         <&cru SCLK_HEVC_CORE>;
                                pm_qos = <&qos_hevc_r>,
                                         <&qos_hevc_w>;
+                               #power-domain-cells = <0>;
                        };
 
                        /*
                         * (video endecoder & decoder) clocks that on the
                         * ACLK_VCODEC_NIU and HCLK_VCODEC_NIU (NOC).
                         */
-                       pd_video@RK3288_PD_VIDEO {
+                       power-domain@RK3288_PD_VIDEO {
                                reg = <RK3288_PD_VIDEO>;
                                clocks = <&cru ACLK_VCODEC>,
                                         <&cru HCLK_VCODEC>;
                                pm_qos = <&qos_video>;
+                               #power-domain-cells = <0>;
                        };
 
                        /*
                         * Note: ACLK_GPU is the GPU clock,
                         * and on the ACLK_GPU_NIU (NOC).
                         */
-                       pd_gpu@RK3288_PD_GPU {
+                       power-domain@RK3288_PD_GPU {
                                reg = <RK3288_PD_GPU>;
                                clocks = <&cru ACLK_GPU>;
                                pm_qos = <&qos_gpu_r>,
                                         <&qos_gpu_w>;
+                               #power-domain-cells = <0>;
                        };
                };
 
                        drive-strength = <12>;
                };
 
-               sleep {
+               suspend {
                        global_pwroff: global-pwroff {
                                rockchip,pins = <0 RK_PA0 1 &pcfg_pull_none>;
                        };
index 755c946..f9bbc24 100644 (file)
@@ -21,9 +21,6 @@
                i2c2 = &i2c2;
                i2c3 = &i2c3;
                i2c4 = &i2c4;
-               mshc0 = &emmc;
-               mshc1 = &mmc0;
-               mshc2 = &mmc1;
                serial0 = &uart0;
                serial1 = &uart1;
                serial2 = &uart2;
        };
 
        grf: grf@20008000 {
-               compatible = "syscon";
+               compatible = "syscon", "simple-mfd";
                reg = <0x20008000 0x200>;
        };
 
index 884872c..9bd0acf 100644 (file)
                #address-cells = <1>;
                #size-cells = <1>;
 
-               u2phy: usb2-phy@100 {
+               u2phy: usb2phy@100 {
                        compatible = "rockchip,rv1108-usb2phy";
                        reg = <0x100 0x0c>;
                        clocks = <&cru SCLK_USBPHY>;
index 5c1e12d..c6f3914 100644 (file)
                reg = <0x4a>;
                interrupt-parent = <&gpj0>;
                interrupts = <5 IRQ_TYPE_EDGE_FALLING>;
-
-               atmel,x-line = <17>;
-               atmel,y-line = <11>;
-               atmel,x-size = <800>;
-               atmel,y-size = <480>;
-               atmel,burst-length = <0x21>;
-               atmel,threshold = <0x28>;
-               atmel,orientation = <1>;
-
                vdd-supply = <&tsp_reg>;
        };
 };
index 05c5587..f70a852 100644 (file)
                                        0xffffffff 0x3ffcfe7c 0x1c010101        /* pioA */
                                        0x7fffffff 0xfffccc3a 0x3f00cc3a        /* pioB */
                                        0xffffffff 0x3ff83fff 0xff00ffff        /* pioC */
-                                       0x0003ff00 0x8002a800 0x00000000        /* pioD */
+                                       0xb003ff00 0x8002a800 0x00000000        /* pioD */
                                        0xffffffff 0x7fffffff 0x76fff1bf        /* pioE */
                                        >;
 
index 3cc9a23..a61a078 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2020 Hisilicon Limited.
+ * Copyright (c) 2020 HiSilicon Limited.
  *
  * DTS file for Hisilicon SD5203 Board
  */
index a16a00f..d0fe3f9 100644 (file)
@@ -34,7 +34,7 @@
                                        #clock-cells = <1>;
                                };
 
-                               ab8500_gpio: ab8500-gpio {
+                               ab8500_gpio: ab8500-gpiocontroller {
                                        compatible = "stericsson,ab8500-gpio";
                                        gpio-controller;
                                        #gpio-cells = <2>;
 
                                ab8500-rtc {
                                        compatible = "stericsson,ab8500-rtc";
-                                       interrupts = <17 IRQ_TYPE_LEVEL_HIGH
-                                                     18 IRQ_TYPE_LEVEL_HIGH>;
+                                       interrupts = <17 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <18 IRQ_TYPE_LEVEL_HIGH>;
                                        interrupt-names = "60S", "ALARM";
                                };
 
                                gpadc: ab8500-gpadc {
                                        compatible = "stericsson,ab8500-gpadc";
-                                       interrupts = <32 IRQ_TYPE_LEVEL_HIGH
-                                                     39 IRQ_TYPE_LEVEL_HIGH>;
+                                       interrupts = <32 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <39 IRQ_TYPE_LEVEL_HIGH>;
                                        interrupt-names = "HW_CONV_END", "SW_CONV_END";
                                        vddadc-supply = <&ab8500_ldo_tvout_reg>;
                                        #address-cells = <1>;
 
                                ab8500_usb {
                                        compatible = "stericsson,ab8500-usb";
-                                       interrupts = < 90 IRQ_TYPE_LEVEL_HIGH
-                                                      96 IRQ_TYPE_LEVEL_HIGH
-                                                      14 IRQ_TYPE_LEVEL_HIGH
-                                                      15 IRQ_TYPE_LEVEL_HIGH
-                                                      79 IRQ_TYPE_LEVEL_HIGH
-                                                      74 IRQ_TYPE_LEVEL_HIGH
-                                                      75 IRQ_TYPE_LEVEL_HIGH>;
+                                       interrupts = <90 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <96 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <14 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <15 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <79 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <74 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <75 IRQ_TYPE_LEVEL_HIGH>;
                                        interrupt-names = "ID_WAKEUP_R",
                                                          "ID_WAKEUP_F",
                                                          "VBUS_DET_F",
 
                                ab8500-ponkey {
                                        compatible = "stericsson,ab8500-poweron-key";
-                                       interrupts = <6 IRQ_TYPE_LEVEL_HIGH
-                                                     7 IRQ_TYPE_LEVEL_HIGH>;
+                                       interrupts = <6 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <7 IRQ_TYPE_LEVEL_HIGH>;
                                        interrupt-names = "ONKEY_DBF", "ONKEY_DBR";
                                };
 
index cc045b2..0defc15 100644 (file)
@@ -31,7 +31,7 @@
                                        #clock-cells = <1>;
                                };
 
-                               ab8505_gpio: ab8505-gpio {
+                               ab8505_gpio: ab8505-gpiocontroller {
                                        compatible = "stericsson,ab8505-gpio";
                                        gpio-controller;
                                        #gpio-cells = <2>;
@@ -39,8 +39,8 @@
 
                                ab8500-rtc {
                                        compatible = "stericsson,ab8500-rtc";
-                                       interrupts = <17 IRQ_TYPE_LEVEL_HIGH
-                                                     18 IRQ_TYPE_LEVEL_HIGH>;
+                                       interrupts = <17 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <18 IRQ_TYPE_LEVEL_HIGH>;
                                        interrupt-names = "60S", "ALARM";
                                };
 
 
                                ab8500_usb: ab8500_usb {
                                        compatible = "stericsson,ab8500-usb";
-                                       interrupts = < 90 IRQ_TYPE_LEVEL_HIGH
-                                                      96 IRQ_TYPE_LEVEL_HIGH
-                                                      14 IRQ_TYPE_LEVEL_HIGH
-                                                      15 IRQ_TYPE_LEVEL_HIGH
-                                                      79 IRQ_TYPE_LEVEL_HIGH
-                                                      74 IRQ_TYPE_LEVEL_HIGH
-                                                      75 IRQ_TYPE_LEVEL_HIGH>;
+                                       interrupts = <90 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <96 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <14 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <15 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <79 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <74 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <75 IRQ_TYPE_LEVEL_HIGH>;
                                        interrupt-names = "ID_WAKEUP_R",
                                                          "ID_WAKEUP_F",
                                                          "VBUS_DET_F",
 
                                ab8500-ponkey {
                                        compatible = "stericsson,ab8500-poweron-key";
-                                       interrupts = <6 IRQ_TYPE_LEVEL_HIGH
-                                                     7 IRQ_TYPE_LEVEL_HIGH>;
+                                       interrupts = <6 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <7 IRQ_TYPE_LEVEL_HIGH>;
                                        interrupt-names = "ONKEY_DBF", "ONKEY_DBR";
                                };
 
index 4946743..3ccb7b5 100644 (file)
@@ -9,7 +9,7 @@
        soc {
                prcmu@80157000 {
                        ab8500 {
-                               ab8500-gpio {
+                               ab8500-gpiocontroller {
                                        /* Hog a few default settings */
                                        pinctrl-names = "default";
                                        pinctrl-0 = <&gpio2_default_mode>,
index 8d59202..37e5940 100644 (file)
                                 * <&gpio1 0 IRQ_TYPE_EDGE_FALLING>,
                                 * <&gpio2 19 IRQ_TYPE_EDGE_FALLING>;
                                 */
+                               mount-matrix = "0", "1", "0",
+                                              "1", "0", "0",
+                                              "0", "0", "-1";
                        };
                        magnetometer@1e {
                                /* Magnetometer */
                                /* INT2 would need to be open drain */
                                interrupts = <18 IRQ_TYPE_EDGE_RISING>,
                                             <19 IRQ_TYPE_EDGE_RISING>;
+                               mount-matrix = "0", "-1", "0",
+                                              "-1", "0", "0",
+                                              "0", "0", "-1";
                        };
                        magnetometer@f {
                                /* Magnetometer */
index 70f0583..00ce9d7 100644 (file)
                                             <19 IRQ_TYPE_EDGE_RISING>;
                                pinctrl-names = "default";
                                pinctrl-0 = <&accel_tvk_mode>;
+                               mount-matrix = "0", "-1", "0",
+                                              "-1", "0", "0",
+                                              "0", "0", "-1";
                        };
                        magnetometer@1e {
                                compatible = "st,lsm303dlm-magn";
-                               st,drdy-int-pin = <1>;
                                reg = <0x1e>;
                                vdd-supply = <&ab8500_ldo_aux1_reg>;
                                vddio-supply = <&db8500_vsmps2_reg>;
index 83b1796..7566b49 100644 (file)
 
                prcmu@80157000 {
                        ab8500 {
-                               ab8500-gpio {
+                               ab8500-gpiocontroller {
                                };
 
                                ab8500_usb {
index b344b37..40f1d7c 100644 (file)
 
                prcmu@80157000 {
                        ab8500 {
-                               ab8500-gpio {
+                               ab8500-gpiocontroller {
                                        /*
                                         * AB8500 GPIOs are numbered starting from 1, so the first
                                         * index 0 is what in the datasheet is called "GPIO1", and
index 0d43ee6..40df7c6 100644 (file)
                        #size-cells = <0>;
 
                        wifi@1 {
-                               compatible = "brcm,bcm4329-fmac";
+                               compatible = "brcm,bcm4334-fmac", "brcm,bcm4329-fmac";
                                reg = <1>;
 
                                /* GPIO216 (WLAN_HOST_WAKE) */
                        pinctrl-1 = <&u0_a_1_sleep>;
 
                        bluetooth {
+                               /* BCM4334B0 actually */
                                compatible = "brcm,bcm4330-bt";
                                /* GPIO222 (BT_VREG_ON) */
                                shutdown-gpios = <&gpio6 30 GPIO_ACTIVE_HIGH>;
index f243698..25af066 100644 (file)
                        status = "okay";
 
                        wifi@1 {
-                               /* Actually BRCM4330 */
-                               compatible = "brcm,bcm4329-fmac";
+                               compatible = "brcm,bcm4330-fmac", "brcm,bcm4329-fmac";
                                reg = <1>;
                                /* GPIO216 WL_HOST_WAKE */
                                interrupt-parent = <&gpio6>;
                        status = "okay";
 
                        bluetooth {
+                               /* BCM4330B1 actually */
                                compatible = "brcm,bcm4330-bt";
                                /* GPIO222 rail BT_VREG_EN to BT_REG_ON */
                                shutdown-gpios = <&gpio6 30 GPIO_ACTIVE_HIGH>;
                                        accelerometer@08 {
                                                compatible = "bosch,bma222";
                                                reg = <0x08>;
-                                               /* FIXME: no idea about this */
-                                               mount-matrix = "1", "0", "0",
-                                                              "0", "1", "0",
-                                                              "0", "0", "1";
+                                               mount-matrix = "0", "1", "0",
+                                                              "-1", "0", "0",
+                                                              "0", "0", "-1";
                                                vddio-supply = <&ab8500_ldo_aux2_reg>; // 1.8V
                                                vdd-supply = <&ab8500_ldo_aux1_reg>; // 3V
                                        };
index d28a007..94afd7a 100644 (file)
                        #size-cells = <0>;
 
                        wifi@1 {
-                               compatible = "brcm,bcm4329-fmac";
+                               compatible = "brcm,bcm4334-fmac", "brcm,bcm4329-fmac";
                                reg = <1>;
                                /* GPIO216 WL_HOST_WAKE */
                                interrupt-parent = <&gpio6>;
 
                        /* FIXME: not quite working yet, probably needs regulators */
                        bluetooth {
+                               /* BCM4334B0 actually */
                                compatible = "brcm,bcm4330-bt";
                                shutdown-gpios = <&gpio6 30 GPIO_ACTIVE_HIGH>;
                                device-wakeup-gpios = <&gpio6 7 GPIO_ACTIVE_HIGH>;
index 7e10ae7..9ac1ffe 100644 (file)
                };
        };
 
-       gpio_keys {
+       gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
                autorepeat;
-               button@0 {
+               button-0 {
                        label = "Wake up";
                        linux,code = <KEY_WAKEUP>;
                        gpios = <&gpioa 0 0>;
                };
-               button@1 {
+               button-1 {
                        label = "Tamper";
                        linux,code = <KEY_RESTART>;
                        gpios = <&gpioc 13 0>;
index ca8c192..327613f 100644 (file)
                };
        };
 
-       gpio_keys {
+       gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
                autorepeat;
-               button@0 {
+               button-0 {
                        label = "Wake up";
                        linux,code = <KEY_WAKEUP>;
                        gpios = <&gpioc 13 0>;
index 4774163..155d9ff 100644 (file)
@@ -45,7 +45,7 @@
 
 / {
        soc {
-               pinctrl: pin-controller {
+               pinctrl: pin-controller@40020000 {
                        #address-cells = <1>;
                        #size-cells = <1>;
                        ranges = <0 0x40020000 0x3000>;
index 3dc068b..075ac57 100644 (file)
                };
        };
 
-       gpio_keys {
+       gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
                autorepeat;
-               button@0 {
+               button-0 {
                        label = "User";
                        linux,code = <KEY_HOME>;
                        gpios = <&gpioa 0 0>;
index 3e7a17d..e10d7a1 100644 (file)
 
 #include "stm32f4-pinctrl.dtsi"
 
-/ {
-       soc {
-               pinctrl: pin-controller {
-                       compatible = "st,stm32f429-pinctrl";
+&pinctrl {
+       compatible = "st,stm32f429-pinctrl";
 
-                       gpioa: gpio@40020000 {
-                               gpio-ranges = <&pinctrl 0 0 16>;
-                       };
+       gpioa: gpio@40020000 {
+               gpio-ranges = <&pinctrl 0 0 16>;
+       };
 
-                       gpiob: gpio@40020400 {
-                               gpio-ranges = <&pinctrl 0 16 16>;
-                       };
+       gpiob: gpio@40020400 {
+               gpio-ranges = <&pinctrl 0 16 16>;
+       };
 
-                       gpioc: gpio@40020800 {
-                               gpio-ranges = <&pinctrl 0 32 16>;
-                       };
+       gpioc: gpio@40020800 {
+               gpio-ranges = <&pinctrl 0 32 16>;
+       };
 
-                       gpiod: gpio@40020c00 {
-                               gpio-ranges = <&pinctrl 0 48 16>;
-                       };
+       gpiod: gpio@40020c00 {
+               gpio-ranges = <&pinctrl 0 48 16>;
+       };
 
-                       gpioe: gpio@40021000 {
-                               gpio-ranges = <&pinctrl 0 64 16>;
-                       };
+       gpioe: gpio@40021000 {
+               gpio-ranges = <&pinctrl 0 64 16>;
+       };
 
-                       gpiof: gpio@40021400 {
-                               gpio-ranges = <&pinctrl 0 80 16>;
-                       };
+       gpiof: gpio@40021400 {
+               gpio-ranges = <&pinctrl 0 80 16>;
+       };
 
-                       gpiog: gpio@40021800 {
-                               gpio-ranges = <&pinctrl 0 96 16>;
-                       };
+       gpiog: gpio@40021800 {
+               gpio-ranges = <&pinctrl 0 96 16>;
+       };
 
-                       gpioh: gpio@40021c00 {
-                               gpio-ranges = <&pinctrl 0 112 16>;
-                       };
+       gpioh: gpio@40021c00 {
+               gpio-ranges = <&pinctrl 0 112 16>;
+       };
 
-                       gpioi: gpio@40022000 {
-                               gpio-ranges = <&pinctrl 0 128 16>;
-                       };
+       gpioi: gpio@40022000 {
+               gpio-ranges = <&pinctrl 0 128 16>;
+       };
 
-                       gpioj: gpio@40022400 {
-                               gpio-ranges = <&pinctrl 0 144 16>;
-                       };
+       gpioj: gpio@40022400 {
+               gpio-ranges = <&pinctrl 0 144 16>;
+       };
 
-                       gpiok: gpio@40022800 {
-                               gpio-ranges = <&pinctrl 0 160 8>;
-                       };
-               };
+       gpiok: gpio@40022800 {
+               gpio-ranges = <&pinctrl 0 160 8>;
        };
 };
index f6530d7..8748d58 100644 (file)
                };
 
                timers13: timers@40001c00 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
                        compatible = "st,stm32-timers";
                        reg = <0x40001C00 0x400>;
                        clocks = <&rcc 0 STM32F4_APB1_CLOCK(TIM13)>;
                };
 
                timers14: timers@40002000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
                        compatible = "st,stm32-timers";
                        reg = <0x40002000 0x400>;
                        clocks = <&rcc 0 STM32F4_APB1_CLOCK(TIM14)>;
                };
 
                timers10: timers@40014400 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
                        compatible = "st,stm32-timers";
                        reg = <0x40014400 0x400>;
                        clocks = <&rcc 0 STM32F4_APB2_CLOCK(TIM10)>;
                };
 
                timers11: timers@40014800 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
                        compatible = "st,stm32-timers";
                        reg = <0x40014800 0x400>;
                        clocks = <&rcc 0 STM32F4_APB2_CLOCK(TIM11)>;
                        status = "disabled";
                };
 
-               rcc: rcc@40023810 {
+               rcc: rcc@40023800 {
                        #reset-cells = <1>;
                        #clock-cells = <2>;
                        compatible = "st,stm32f42xx-rcc", "st,stm32-rcc";
index 2e1b3bb..8c982ae 100644 (file)
                };
        };
 
-       gpio_keys {
+       gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
                autorepeat;
-               button@0 {
+               button-0 {
                        label = "User";
                        linux,code = <KEY_WAKEUP>;
                        gpios = <&gpioa 0 GPIO_ACTIVE_HIGH>;
index fff5426..6bf6026 100644 (file)
 
 #include "stm32f4-pinctrl.dtsi"
 
-/ {
-       soc {
-               pinctrl: pin-controller {
-                       compatible = "st,stm32f469-pinctrl";
+&pinctrl {
+       compatible = "st,stm32f469-pinctrl";
 
-                       gpioa: gpio@40020000 {
-                               gpio-ranges = <&pinctrl 0 0 16>;
-                       };
+       gpioa: gpio@40020000 {
+               gpio-ranges = <&pinctrl 0 0 16>;
+       };
 
-                       gpiob: gpio@40020400 {
-                               gpio-ranges = <&pinctrl 0 16 16>;
-                       };
+       gpiob: gpio@40020400 {
+               gpio-ranges = <&pinctrl 0 16 16>;
+       };
 
-                       gpioc: gpio@40020800 {
-                               gpio-ranges = <&pinctrl 0 32 16>;
-                       };
+       gpioc: gpio@40020800 {
+               gpio-ranges = <&pinctrl 0 32 16>;
+       };
 
-                       gpiod: gpio@40020c00 {
-                               gpio-ranges = <&pinctrl 0 48 16>;
-                       };
+       gpiod: gpio@40020c00 {
+               gpio-ranges = <&pinctrl 0 48 16>;
+       };
 
-                       gpioe: gpio@40021000 {
-                               gpio-ranges = <&pinctrl 0 64 16>;
-                       };
+       gpioe: gpio@40021000 {
+               gpio-ranges = <&pinctrl 0 64 16>;
+       };
 
-                       gpiof: gpio@40021400 {
-                               gpio-ranges = <&pinctrl 0 80 16>;
-                       };
+       gpiof: gpio@40021400 {
+               gpio-ranges = <&pinctrl 0 80 16>;
+       };
 
-                       gpiog: gpio@40021800 {
-                               gpio-ranges = <&pinctrl 0 96 16>;
-                       };
+       gpiog: gpio@40021800 {
+               gpio-ranges = <&pinctrl 0 96 16>;
+       };
 
-                       gpioh: gpio@40021c00 {
-                               gpio-ranges = <&pinctrl 0 112 16>;
-                       };
+       gpioh: gpio@40021c00 {
+               gpio-ranges = <&pinctrl 0 112 16>;
+       };
 
-                       gpioi: gpio@40022000 {
-                               gpio-ranges = <&pinctrl 0 128 16>;
-                       };
+       gpioi: gpio@40022000 {
+               gpio-ranges = <&pinctrl 0 128 16>;
+       };
 
-                       gpioj: gpio@40022400 {
-                               gpio-ranges = <&pinctrl 0 144 6>,
-                                             <&pinctrl 12 156 4>;
-                       };
+       gpioj: gpio@40022400 {
+               gpio-ranges = <&pinctrl 0 144 6>,
+                             <&pinctrl 12 156 4>;
+       };
 
-                       gpiok: gpio@40022800 {
-                               gpio-ranges = <&pinctrl 3 163 5>;
-                       };
-               };
+       gpiok: gpio@40022800 {
+               gpio-ranges = <&pinctrl 3 163 5>;
        };
 };
index fe4cfda..1cf8a23 100644 (file)
@@ -9,7 +9,7 @@
 
 / {
        soc {
-               pinctrl: pin-controller {
+               pinctrl: pin-controller@40020000 {
                        #address-cells = <1>;
                        #size-cells = <1>;
                        ranges = <0 0x40020000 0x3000>;
index e1df603..014b416 100644 (file)
                };
 
                timers13: timers@40001c00 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
                        compatible = "st,stm32-timers";
                        reg = <0x40001C00 0x400>;
                        clocks = <&rcc 0 STM32F7_APB1_CLOCK(TIM13)>;
                };
 
                timers14: timers@40002000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
                        compatible = "st,stm32-timers";
                        reg = <0x40002000 0x400>;
                        clocks = <&rcc 0 STM32F7_APB1_CLOCK(TIM14)>;
                        status = "disabled";
                };
 
-               i2c3: i2c@40005C00 {
+               i2c3: i2c@40005c00 {
                        compatible = "st,stm32f7-i2c";
-                       reg = <0x40005C00 0x400>;
+                       reg = <0x40005c00 0x400>;
                        interrupts = <72>,
                                     <73>;
                        resets = <&rcc STM32F7_APB1_RESET(I2C3)>;
                };
 
                timers10: timers@40014400 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
                        compatible = "st,stm32-timers";
                        reg = <0x40014400 0x400>;
                        clocks = <&rcc 0 STM32F7_APB2_CLOCK(TIM10)>;
                };
 
                timers11: timers@40014800 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
                        compatible = "st,stm32-timers";
                        reg = <0x40014800 0x400>;
                        clocks = <&rcc 0 STM32F7_APB2_CLOCK(TIM11)>;
index 0ce7fbc..be943b7 100644 (file)
                };
        };
 
-       gpio_keys {
+       gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
                autorepeat;
-               button@0 {
+               button-0 {
                        label = "User";
                        linux,code = <KEY_HOME>;
                        gpios = <&gpioa 0 GPIO_ACTIVE_HIGH>;
index 05ecdf9..6e42ca2 100644 (file)
                };
 
                lptimer4: timer@58002c00 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
                        compatible = "st,stm32-lptimer";
                        reg = <0x58002c00 0x400>;
                        clocks = <&rcc LPTIM4_CK>;
                };
 
                lptimer5: timer@58003000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
                        compatible = "st,stm32-lptimer";
                        reg = <0x58003000 0x400>;
                        clocks = <&rcc LPTIM5_CK>;
index 060baa8..5b60ecb 100644 (file)
                };
        };
 
+       dcmi_pins_b: dcmi-1 {
+               pins {
+                       pinmux = <STM32_PINMUX('A', 4,  AF13)>,/* DCMI_HSYNC */
+                                <STM32_PINMUX('B', 7,  AF13)>,/* DCMI_VSYNC */
+                                <STM32_PINMUX('A', 6,  AF13)>,/* DCMI_PIXCLK */
+                                <STM32_PINMUX('C', 6,  AF13)>,/* DCMI_D0 */
+                                <STM32_PINMUX('H', 10, AF13)>,/* DCMI_D1 */
+                                <STM32_PINMUX('H', 11, AF13)>,/* DCMI_D2 */
+                                <STM32_PINMUX('E', 1,  AF13)>,/* DCMI_D3 */
+                                <STM32_PINMUX('E', 11, AF13)>,/* DCMI_D4 */
+                                <STM32_PINMUX('D', 3,  AF13)>,/* DCMI_D5 */
+                                <STM32_PINMUX('E', 13, AF13)>,/* DCMI_D6 */
+                                <STM32_PINMUX('B', 9,  AF13)>;/* DCMI_D7 */
+                       bias-disable;
+               };
+       };
+
+       dcmi_sleep_pins_b: dcmi-sleep-1 {
+               pins {
+                       pinmux = <STM32_PINMUX('A', 4,  ANALOG)>,/* DCMI_HSYNC */
+                                <STM32_PINMUX('B', 7,  ANALOG)>,/* DCMI_VSYNC */
+                                <STM32_PINMUX('A', 6,  ANALOG)>,/* DCMI_PIXCLK */
+                                <STM32_PINMUX('C', 6,  ANALOG)>,/* DCMI_D0 */
+                                <STM32_PINMUX('H', 10, ANALOG)>,/* DCMI_D1 */
+                                <STM32_PINMUX('H', 11, ANALOG)>,/* DCMI_D2 */
+                                <STM32_PINMUX('E', 1,  ANALOG)>,/* DCMI_D3 */
+                                <STM32_PINMUX('E', 11, ANALOG)>,/* DCMI_D4 */
+                                <STM32_PINMUX('D', 3,  ANALOG)>,/* DCMI_D5 */
+                                <STM32_PINMUX('E', 13, ANALOG)>,/* DCMI_D6 */
+                                <STM32_PINMUX('B', 9,  ANALOG)>;/* DCMI_D7 */
+               };
+       };
+
        ethernet0_rgmii_pins_a: rgmii-0 {
                pins1 {
                        pinmux = <STM32_PINMUX('G', 5, AF11)>, /* ETH_RGMII_CLK125 */
index fcd3230..bd289bf 100644 (file)
                        reg = <0x58003000 0x1000>, <0x70000000 0x10000000>;
                        reg-names = "qspi", "qspi_mm";
                        interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>;
-                       dmas = <&mdma1 22 0x2 0x100002 0x0 0x0>,
-                              <&mdma1 22 0x2 0x100008 0x0 0x0>;
+                       dmas = <&mdma1 22 0x2 0x10100002 0x0 0x0>,
+                              <&mdma1 22 0x2 0x10100008 0x0 0x0>;
                        dma-names = "tx", "rx";
                        clocks = <&rcc QSPI_K>;
                        resets = <&rcc QSPI_R>;
                        status = "disabled";
                };
 
-               stmmac_axi_config_0: stmmac-axi-config {
-                       snps,wr_osr_lmt = <0x7>;
-                       snps,rd_osr_lmt = <0x7>;
-                       snps,blen = <0 0 0 0 16 8 4>;
-               };
-
                ethernet0: ethernet@5800a000 {
                        compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a";
                        reg = <0x5800a000 0x2000>;
                        snps,axi-config = <&stmmac_axi_config_0>;
                        snps,tso;
                        status = "disabled";
+
+                       stmmac_axi_config_0: stmmac-axi-config {
+                               snps,wr_osr_lmt = <0x7>;
+                               snps,rd_osr_lmt = <0x7>;
+                               snps,blen = <0 0 0 0 16 8 4>;
+                       };
                };
 
                usbh_ohci: usb@5800c000 {
index 674b2d3..5670b23 100644 (file)
@@ -89,7 +89,7 @@
 };
 
 &pinctrl {
-       ltdc_pins: ltdc {
+       ltdc_pins: ltdc-0 {
                pins {
                        pinmux = <STM32_PINMUX('G', 10, AF14)>, /* LTDC_B2 */
                                 <STM32_PINMUX('H', 12, AF14)>, /* LTDC_R6 */
index 113c48b..a4b14ef 100644 (file)
 
                        vdd_usb: ldo4 {
                                regulator-name = "vdd_usb";
-                               regulator-min-microvolt = <3300000>;
-                               regulator-max-microvolt = <3300000>;
                                interrupts = <IT_CURLIM_LDO4 0>;
                        };
 
                        vref_ddr: vref_ddr {
                                regulator-name = "vref_ddr";
                                regulator-always-on;
-                               regulator-over-current-protection;
                        };
 
                        bst_out: boost {
                        vbus_otg: pwr_sw1 {
                                regulator-name = "vbus_otg";
                                interrupts = <IT_OCP_OTG 0>;
-                               regulator-active-discharge;
+                               regulator-active-discharge = <1>;
                        };
 
                        vbus_sw: pwr_sw2 {
                                regulator-name = "vbus_sw";
                                interrupts = <IT_OCP_SWOUT 0>;
-                               regulator-active-discharge;
+                               regulator-active-discharge = <1>;
                        };
                };
 
index 6cf49a0..2d94610 100644 (file)
 
                        vdd_usb: ldo4 {
                                regulator-name = "vdd_usb";
-                               regulator-min-microvolt = <3300000>;
-                               regulator-max-microvolt = <3300000>;
                                interrupts = <IT_CURLIM_LDO4 0>;
                        };
 
                        vref_ddr: vref_ddr {
                                regulator-name = "vref_ddr";
                                regulator-always-on;
-                               regulator-over-current-protection;
                        };
 
                         bst_out: boost {
                         vbus_sw: pwr_sw2 {
                                regulator-name = "vbus_sw";
                                interrupts = <IT_OCP_SWOUT 0>;
-                               regulator-active-discharge;
+                               regulator-active-discharge = <1>;
                         };
                };
 
        st,neg-edge;
        bus-width = <8>;
        vmmc-supply = <&v3v3>;
-       vqmmc-supply = <&v3v3>;
+       vqmmc-supply = <&vdd>;
        mmc-ddr-3_3v;
        status = "okay";
 };
index a7ffec8..be1dd5e 100644 (file)
@@ -64,7 +64,7 @@
        pinctrl-0 = <&sdmmc1_b4_pins_a>;
        pinctrl-1 = <&sdmmc1_b4_od_pins_a>;
        pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;
-       cd-gpios = <&gpiob 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
+       cd-gpios = <&gpioi 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
        disable-wp;
        st,neg-edge;
        bus-width = <4>;
index 5523f41..c5ea08f 100644 (file)
@@ -34,7 +34,6 @@
 
        gpio-keys-polled {
                compatible = "gpio-keys-polled";
-               #size-cells = <0>;
                poll-interval = <20>;
 
                /*
@@ -60,7 +59,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #size-cells = <0>;
 
                button-1 {
                        label = "TA2-GPIO-B";
 
        };
 
-       polytouch@38 {
-               compatible = "edt,edt-ft5x06";
+       touchscreen@38 {
+               compatible = "edt,edt-ft5406";
                reg = <0x38>;
                interrupt-parent = <&gpiog>;
                interrupts = <2 IRQ_TYPE_EDGE_FALLING>; /* GPIO E */
-               linux,wakeup;
        };
 };
 
index 272a1a6..2af0a67 100644 (file)
        max-speed = <100>;
        phy-handle = <&phy0>;
        st,eth-ref-clk-sel;
-       phy-reset-gpios = <&gpioh 3 GPIO_ACTIVE_LOW>;
 
        mdio0 {
                #address-cells = <1>;
 
                phy0: ethernet-phy@1 {
                        reg = <1>;
+                       /* LAN8710Ai */
+                       compatible = "ethernet-phy-id0007.c0f0",
+                                    "ethernet-phy-ieee802.3-c22";
+                       clocks = <&rcc ETHCK_K>;
+                       reset-gpios = <&gpioh 3 GPIO_ACTIVE_LOW>;
+                       reset-assert-us = <500>;
+                       reset-deassert-us = <500>;
                        interrupt-parent = <&gpioi>;
                        interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
                };
        pinctrl-1 = <&fmc_sleep_pins_b>;
        status = "okay";
 
-       ksz8851: ks8851mll@1,0 {
+       ksz8851: ethernet@1,0 {
                compatible = "micrel,ks8851-mll";
                reg = <1 0x0 0x2>, <1 0x2 0x20000>;
                interrupt-parent = <&gpioc>;
 
                        vdd_usb: ldo4 {
                                regulator-name = "vdd_usb";
-                               regulator-min-microvolt = <3300000>;
-                               regulator-max-microvolt = <3300000>;
                                interrupts = <IT_CURLIM_LDO4 0>;
                        };
 
                        vref_ddr: vref_ddr {
                                regulator-name = "vref_ddr";
                                regulator-always-on;
-                               regulator-over-current-protection;
                        };
 
                        bst_out: boost {
                        vbus_sw: pwr_sw2 {
                                regulator-name = "vbus_sw";
                                interrupts = <IT_OCP_SWOUT 0>;
-                               regulator-active-discharge;
+                               regulator-active-discharge = <1>;
                        };
                };
 
        #size-cells = <0>;
        status = "okay";
 
-       flash0: mx66l51235l@0 {
+       flash0: flash@0 {
                compatible = "jedec,spi-nor";
                reg = <0>;
                spi-rx-bus-width = <4>;
index 013ae36..2b0ac60 100644 (file)
        #size-cells = <0>;
        status = "okay";
 
-       flash0: spi-flash@0 {
+       flash0: flash@0 {
                compatible = "jedec,spi-nor";
                reg = <0>;
                spi-rx-bus-width = <4>;
index 713485a..6706d83 100644 (file)
 
                        vdd_usb: ldo4 {
                                regulator-name = "vdd_usb";
-                               regulator-min-microvolt = <3300000>;
-                               regulator-max-microvolt = <3300000>;
                                interrupts = <IT_CURLIM_LDO4 0>;
                        };
 
                        vref_ddr: vref_ddr {
                                regulator-name = "vref_ddr";
                                regulator-always-on;
-                               regulator-over-current-protection;
                        };
 
                        bst_out: boost {
                        vbus_otg: pwr_sw1 {
                                regulator-name = "vbus_otg";
                                interrupts = <IT_OCP_OTG 0>;
-                               regulator-active-discharge;
+                               regulator-active-discharge = <1>;
                        };
 
                        vbus_sw: pwr_sw2 {
                                regulator-name = "vbus_sw";
                                interrupts = <IT_OCP_SWOUT 0>;
-                               regulator-active-discharge;
+                               regulator-active-discharge = <1>;
                        };
                };
 
index 7344c37..2beddbb 100644 (file)
                };
 
                link_codec: simple-audio-card,codec {
-                       sound-dai = <&codec>;
+                       sound-dai = <&codec 0>;
                };
        };
 
                };
 
                codec: codec@1c22e00 {
-                       #sound-dai-cells = <0>;
+                       #sound-dai-cells = <1>;
                        compatible = "allwinner,sun8i-a33-codec";
                        reg = <0x01c22e00 0x400>;
                        interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
diff --git a/arch/arm/boot/dts/sun8i-r40-feta40i.dtsi b/arch/arm/boot/dts/sun8i-r40-feta40i.dtsi
new file mode 100644 (file)
index 0000000..265e0fa
--- /dev/null
@@ -0,0 +1,106 @@
+// SPDX-License-Identifier: GPL-2.0+ OR MIT
+// Copyright (C) 2021 Ivan Uvarov <i.uvarov@cognitivepilot.com>
+// Based on the sun8i-r40-bananapi-m2-ultra.dts, which is:
+//  Copyright (C) 2017 Chen-Yu Tsai <wens@csie.org>
+//  Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io>
+
+#include "sun8i-r40.dtsi"
+
+&i2c0 {
+       status = "okay";
+
+       axp22x: pmic@34 {
+               compatible = "x-powers,axp221";
+               reg = <0x34>;
+               interrupt-parent = <&nmi_intc>;
+               interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+       };
+};
+
+#include "axp22x.dtsi"
+
+&mmc2 {
+       vmmc-supply = <&reg_dcdc1>;
+       vqmmc-supply = <&reg_aldo2>;
+       bus-width = <8>;
+       non-removable;
+       status = "okay";
+};
+
+&pio {
+       pinctrl-names = "default";
+       pinctrl-0 = <&clk_out_a_pin>;
+       vcc-pa-supply = <&reg_dcdc1>;
+       vcc-pc-supply = <&reg_aldo2>;
+       vcc-pd-supply = <&reg_dcdc1>;
+       vcc-pf-supply = <&reg_dldo4>;
+       vcc-pg-supply = <&reg_dldo1>;
+};
+
+&reg_aldo2 {
+       regulator-always-on;
+       regulator-min-microvolt = <1800000>;
+       regulator-max-microvolt = <1800000>;
+       regulator-name = "vcc-pa";
+};
+
+&reg_aldo3 {
+       regulator-always-on;
+       regulator-min-microvolt = <3000000>;
+       regulator-max-microvolt = <3000000>;
+       regulator-name = "avcc";
+};
+
+&reg_dcdc1 {
+       regulator-always-on;
+       regulator-min-microvolt = <3300000>;
+       regulator-max-microvolt = <3300000>;
+       regulator-name = "vcc-3v3";
+};
+
+&reg_dcdc2 {
+       regulator-always-on;
+       regulator-min-microvolt = <1100000>;
+       regulator-max-microvolt = <1100000>;
+       regulator-name = "vdd-cpu";
+};
+
+&reg_dcdc3 {
+       regulator-always-on;
+       regulator-min-microvolt = <1100000>;
+       regulator-max-microvolt = <1100000>;
+       regulator-name = "vdd-sys";
+};
+
+&reg_dcdc5 {
+       regulator-always-on;
+       regulator-min-microvolt = <1500000>;
+       regulator-max-microvolt = <1500000>;
+       regulator-name = "vcc-dram";
+};
+
+&reg_dldo1 {
+       regulator-always-on;
+       regulator-min-microvolt = <3300000>;
+       regulator-max-microvolt = <3300000>;
+       regulator-name = "vcc-wifi-io";
+};
+
+&reg_dldo4 {
+       regulator-always-on;
+       regulator-min-microvolt = <2500000>;
+       regulator-max-microvolt = <2500000>;
+       regulator-name = "vdd2v5-sata";
+};
+
+&reg_eldo2 {
+       regulator-min-microvolt = <1200000>;
+       regulator-max-microvolt = <1200000>;
+       regulator-name = "vdd1v2-sata";
+};
+
+&reg_eldo3 {
+       regulator-min-microvolt = <2800000>;
+       regulator-max-microvolt = <2800000>;
+       regulator-name = "vcc-pe";
+};
diff --git a/arch/arm/boot/dts/sun8i-r40-oka40i-c.dts b/arch/arm/boot/dts/sun8i-r40-oka40i-c.dts
new file mode 100644 (file)
index 0000000..0bd1336
--- /dev/null
@@ -0,0 +1,203 @@
+// SPDX-License-Identifier: GPL-2.0+ OR MIT
+// Copyright (C) 2021 Ivan Uvarov <i.uvarov@cognitivepilot.com>
+// Based on the sun8i-r40-bananapi-m2-ultra.dts, which is:
+//     Copyright (C) 2017 Chen-Yu Tsai <wens@csie.org>
+//     Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io>
+
+/dts-v1/;
+#include "sun8i-r40-feta40i.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/leds/common.h>
+
+/ {
+       model = "Forlinx OKA40i-C";
+       compatible = "forlinx,oka40i-c", "forlinx,feta40i-c", "allwinner,sun8i-r40";
+
+       aliases {
+               ethernet0 = &gmac;
+               serial0 = &uart0;
+               serial2 = &uart2;
+               serial3 = &uart3;
+               serial4 = &uart4;
+               serial5 = &uart5; /* RS485 */
+               serial7 = &uart7;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       connector {
+               compatible = "hdmi-connector";
+               type = "a";
+
+               port {
+                       hdmi_con_in: endpoint {
+                               remote-endpoint = <&hdmi_out_con>;
+                       };
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               led-5 { /* this is how the leds are labeled on the board */
+                       gpios = <&pio 7 26 GPIO_ACTIVE_LOW>; /* PH26 */
+                       color = <LED_COLOR_ID_GREEN>;
+                       function = LED_FUNCTION_STATUS;
+               };
+
+               led-6 {
+                       gpios = <&pio 8 15 GPIO_ACTIVE_LOW>; /* PI15 */
+                       color = <LED_COLOR_ID_BLUE>;
+                       function = LED_FUNCTION_STATUS;
+               };
+       };
+
+       reg_vcc5v0: vcc5v0 {
+               compatible = "regulator-fixed";
+               regulator-name = "vcc5v0";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+       };
+
+       wifi_pwrseq: wifi_pwrseq {
+               compatible = "mmc-pwrseq-simple";
+               reset-gpios = <&pio 1 10 GPIO_ACTIVE_LOW>; // PB10 WIFI_EN
+               clocks = <&ccu CLK_OUTA>;
+               clock-names = "ext_clock";
+       };
+};
+
+&ahci {
+       ahci-supply = <&reg_dldo4>;
+       phy-supply = <&reg_eldo2>;
+       status = "okay";
+};
+
+&de {
+       status = "okay";
+};
+
+&ehci1 {
+       status = "okay";
+};
+
+&ehci2 {
+       status = "okay";
+};
+
+&gmac {
+       pinctrl-names = "default";
+       pinctrl-0 = <&gmac_rgmii_pins>;
+       phy-handle = <&phy1>;
+       phy-mode = "rgmii-id";
+       phy-supply = <&reg_dcdc1>;
+       status = "okay";
+};
+
+&gmac_mdio {
+       phy1: ethernet-phy@1 {
+               compatible = "ethernet-phy-ieee802.3-c22";
+               reg = <1>;
+       };
+};
+
+&hdmi {
+       status = "okay";
+};
+
+&hdmi_out {
+       hdmi_out_con: endpoint {
+               remote-endpoint = <&hdmi_con_in>;
+       };
+};
+
+&i2c2 {
+       status = "okay";
+};
+
+&mmc0 {
+       vmmc-supply = <&reg_dcdc1>;
+       vqmmc-supply = <&reg_dcdc1>;
+       bus-width = <4>;
+       cd-gpios = <&pio 8 11 GPIO_ACTIVE_LOW>; // PI11
+       status = "okay";
+};
+
+&mmc3 {
+       vmmc-supply = <&reg_dcdc1>;
+       vqmmc-supply = <&reg_dcdc1>;
+       bus-width = <4>;
+       cd-gpios = <&pio 8 10 GPIO_ACTIVE_LOW>; // PI10
+       status = "okay";
+};
+
+&ohci1 {
+       status = "okay";
+};
+
+&ohci2 {
+       status = "okay";
+};
+
+&reg_dc1sw {
+       regulator-min-microvolt = <3300000>;
+       regulator-max-microvolt = <3300000>;
+       regulator-name = "vcc-lcd";
+};
+
+&reg_dldo2 {
+       regulator-min-microvolt = <3300000>;
+       regulator-max-microvolt = <3300000>;
+       regulator-name = "vcc-wifi";
+};
+
+&tcon_tv0 {
+       status = "okay";
+};
+
+&uart0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_pb_pins>;
+       status = "okay";
+};
+
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart2_pi_pins>, <&uart2_rts_cts_pi_pins>;
+       uart-has-rtscts;
+       status = "okay";
+};
+
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart3_pg_pins>, <&uart3_rts_cts_pg_pins>;
+       uart-has-rtscts;
+       status = "okay";
+};
+
+&uart4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart4_pg_pins>;
+       status = "okay";
+};
+
+&uart5 { /* RS485 */
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart5_ph_pins>;
+       status = "okay";
+};
+
+&uart7 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart7_pi_pins>;
+       status = "okay";
+};
+
+&usbphy {
+       usb1_vbus-supply = <&reg_vcc5v0>;
+       usb2_vbus-supply = <&reg_vcc5v0>;
+       status = "okay";
+};
index d5ad3b9..291f478 100644 (file)
                        clock-names = "ahb", "mmc";
                        resets = <&ccu RST_BUS_MMC3>;
                        reset-names = "ahb";
+                       pinctrl-0 = <&mmc3_pins>;
+                       pinctrl-names = "default";
                        interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
                        status = "disabled";
                        #address-cells = <1>;
                        };
 
                        /omit-if-no-ref/
+                       mmc3_pins: mmc3-pins {
+                               pins = "PI4", "PI5", "PI6",
+                                      "PI7", "PI8", "PI9";
+                               function = "mmc3";
+                               drive-strength = <30>;
+                               bias-pull-up;
+                       };
+
+                       /omit-if-no-ref/
                        spi0_pc_pins: spi0-pc-pins {
                                pins = "PC0", "PC1", "PC2";
                                function = "spi0";
                                function = "spi1";
                        };
 
+                       /omit-if-no-ref/
                        uart0_pb_pins: uart0-pb-pins {
                                pins = "PB22", "PB23";
                                function = "uart0";
                        };
 
+                       /omit-if-no-ref/
+                       uart2_pi_pins: uart2-pi-pins {
+                               pins = "PI18", "PI19";
+                               function = "uart2";
+                       };
+
+                       /omit-if-no-ref/
+                       uart2_rts_cts_pi_pins: uart2-rts-cts-pi-pins{
+                               pins = "PI16", "PI17";
+                               function = "uart2";
+                       };
+
+                       /omit-if-no-ref/
                        uart3_pg_pins: uart3-pg-pins {
                                pins = "PG6", "PG7";
                                function = "uart3";
                        };
 
+                       /omit-if-no-ref/
                        uart3_rts_cts_pg_pins: uart3-rts-cts-pg-pins {
                                pins = "PG8", "PG9";
                                function = "uart3";
                        };
+
+                       /omit-if-no-ref/
+                       uart4_pg_pins: uart4-pg-pins {
+                               pins = "PG10", "PG11";
+                               function = "uart4";
+                       };
+
+                       /omit-if-no-ref/
+                       uart5_ph_pins: uart5-ph-pins {
+                               pins = "PH6", "PH7";
+                               function = "uart5";
+                       };
+
+                       /omit-if-no-ref/
+                       uart7_pi_pins: uart7-pi-pins {
+                               pins = "PI20", "PI21";
+                               function = "uart7";
+                       };
+               };
+
+               timer@1c20c00 {
+                       compatible = "allwinner,sun4i-a10-timer";
+                       reg = <0x01c20c00 0x90>;
+                       interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&osc24M>;
                };
 
                wdt: watchdog@1c20c90 {
index c279e13..186c30c 100644 (file)
@@ -1,14 +1,40 @@
 // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
  * Copyright (C) 2019 Icenowy Zheng <icenowy@aosc.io>
+ * Copyright (C) 2021 Tobias Schramm <t.schramm@manjaro.org>
  */
 
 #include "sun8i-v3s.dtsi"
 
+/ {
+       soc {
+               i2s0: i2s@1c22000 {
+                       #sound-dai-cells = <0>;
+                       compatible = "allwinner,sun8i-v3-i2s",
+                                    "allwinner,sun8i-h3-i2s";
+                       reg = <0x01c22000 0x400>;
+                       interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_I2S0>, <&ccu CLK_I2S0>;
+                       clock-names = "apb", "mod";
+                       dmas = <&dma 3>, <&dma 3>;
+                       dma-names = "rx", "tx";
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2s0_pins>;
+                       resets = <&ccu RST_BUS_I2S0>;
+                       status = "disabled";
+               };
+       };
+};
+
 &ccu {
        compatible = "allwinner,sun8i-v3-ccu";
 };
 
+&codec_analog {
+       compatible = "allwinner,sun8i-v3-codec-analog",
+                    "allwinner,sun8i-h3-codec-analog";
+};
+
 &emac {
        /delete-property/ phy-handle;
        /delete-property/ phy-mode;
 &pio {
        compatible = "allwinner,sun8i-v3-pinctrl";
 
+       i2s0_pins: i2s0-pins {
+               pins = "PG10", "PG11", "PG12", "PG13";
+               function = "i2s";
+       };
+
        uart1_pg_pins: uart1-pg-pins {
                pins = "PG6", "PG7";
                function = "uart1";
index db5cd0b..752ad05 100644 (file)
        compatible = "licheepi,licheepi-zero-dock", "licheepi,licheepi-zero",
                     "allwinner,sun8i-v3s";
 
+       aliases {
+               ethernet0 = &emac;
+       };
+
        leds {
                /* The LEDs use PG0~2 pins, which conflict with MMC1 */
                status = "disabled";
        };
 };
 
-&mmc1 {
-       broken-cd;
-       bus-width = <4>;
-       vmmc-supply = <&reg_vcc3v3>;
+&emac {
+       allwinner,leds-active-low;
        status = "okay";
 };
 
                voltage = <800000>;
        };
 };
+
+&mmc1 {
+       broken-cd;
+       bus-width = <4>;
+       vmmc-supply = <&reg_vcc3v3>;
+       status = "okay";
+};
index eb4cb63..b30bc1a 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2016 Icenowy Zheng <icenowy@aosc.xyz>
+ * Copyright (C) 2021 Tobias Schramm <t.schramm@manjaro.org>
  *
  * This file is dual-licensed: you can use it either under the terms
  * of the GPL or the X11 license, at your option. Note that this dual
                        interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
                };
 
+               dma: dma-controller@1c02000 {
+                       compatible = "allwinner,sun8i-v3s-dma";
+                       reg = <0x01c02000 0x1000>;
+                       interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_DMA>;
+                       resets = <&ccu RST_BUS_DMA>;
+                       #dma-cells = <1>;
+               };
+
                tcon0: lcd-controller@1c0c000 {
                        compatible = "allwinner,sun8i-v3s-tcon";
                        reg = <0x01c0c000 0x1000>;
                        interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&ccu CLK_BUS_CE>, <&ccu CLK_CE>;
                        clock-names = "ahb", "mod";
+                       dmas = <&dma 16>, <&dma 16>;
+                       dma-names = "rx", "tx";
                        resets = <&ccu RST_BUS_CE>;
                        reset-names = "ahb";
                };
                        clocks = <&osc24M>;
                };
 
+               pwm: pwm@1c21400 {
+                       compatible = "allwinner,sun8i-v3s-pwm",
+                                    "allwinner,sun7i-a20-pwm";
+                       reg = <0x01c21400 0xc>;
+                       clocks = <&osc24M>;
+                       #pwm-cells = <3>;
+                       status = "disabled";
+               };
+
                lradc: lradc@1c22800 {
                        compatible = "allwinner,sun4i-a10-lradc-keys";
                        reg = <0x01c22800 0x400>;
                        status = "disabled";
                };
 
+               codec: codec@1c22c00 {
+                       #sound-dai-cells = <0>;
+                       compatible = "allwinner,sun8i-v3s-codec";
+                       reg = <0x01c22c00 0x400>;
+                       interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_CODEC>, <&ccu CLK_AC_DIG>;
+                       clock-names = "apb", "codec";
+                       resets = <&ccu RST_BUS_CODEC>;
+                       dmas = <&dma 15>, <&dma 15>;
+                       dma-names = "rx", "tx";
+                       allwinner,codec-analog-controls = <&codec_analog>;
+                       status = "disabled";
+               };
+
+               codec_analog: codec-analog@1c23000 {
+                       compatible = "allwinner,sun8i-v3s-codec-analog";
+                       reg = <0x01c23000 0x4>;
+               };
+
                uart0: serial@1c28000 {
                        compatible = "snps,dw-apb-uart";
                        reg = <0x01c28000 0x400>;
                        reg-shift = <2>;
                        reg-io-width = <4>;
                        clocks = <&ccu CLK_BUS_UART0>;
+                       dmas = <&dma 6>, <&dma 6>;
+                       dma-names = "rx", "tx";
                        resets = <&ccu RST_BUS_UART0>;
                        status = "disabled";
                };
                        reg-shift = <2>;
                        reg-io-width = <4>;
                        clocks = <&ccu CLK_BUS_UART1>;
+                       dmas = <&dma 7>, <&dma 7>;
+                       dma-names = "rx", "tx";
                        resets = <&ccu RST_BUS_UART1>;
                        status = "disabled";
                };
                        reg-shift = <2>;
                        reg-io-width = <4>;
                        clocks = <&ccu CLK_BUS_UART2>;
+                       dmas = <&dma 8>, <&dma 8>;
+                       dma-names = "rx", "tx";
                        resets = <&ccu RST_BUS_UART2>;
                        pinctrl-0 = <&uart2_pins>;
                        pinctrl-names = "default";
                        interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&ccu CLK_BUS_SPI0>, <&ccu CLK_SPI0>;
                        clock-names = "ahb", "mod";
+                       dmas = <&dma 23>, <&dma 23>;
+                       dma-names = "rx", "tx";
                        pinctrl-names = "default";
                        pinctrl-0 = <&spi0_pins>;
                        resets = <&ccu RST_BUS_SPI0>;
index 0b678af..8b38f12 100644 (file)
                reg = <0x0 0x60007000 0x0 0x1000>;
        };
 
-       actmon@6000c800 {
+       actmon: actmon@6000c800 {
                compatible = "nvidia,tegra124-actmon";
                reg = <0x0 0x6000c800 0x0 0x400>;
                interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
                operating-points-v2 = <&emc_bw_dfs_opp_table>;
                interconnects = <&mc TEGRA124_MC_MPCORER &emc>;
                interconnect-names = "cpu-read";
+               #cooling-cells = <2>;
        };
 
        gpio: gpio@6000d000 {
index 2298fc0..1976c38 100644 (file)
                        reg = <0x1a>;
 
                        interrupt-parent = <&gpio>;
-                       interrupts = <TEGRA_GPIO(X, 3) IRQ_TYPE_LEVEL_HIGH>;
+                       interrupts = <TEGRA_GPIO(X, 3) IRQ_TYPE_EDGE_BOTH>;
 
                        gpio-controller;
                        #gpio-cells = <2>;
 
+                       micdet-cfg = <0>;
+                       micdet-delay = <100>;
+
                        gpio-cfg = <
                                0x0000 /* MIC_LR_OUT#    GPIO, output, low */
                                0x0000 /* FM2018-enable  GPIO, output, low */
 
                mmc-pwrseq = <&brcm_wifi_pwrseq>;
                vmmc-supply = <&vdd_3v3_sys>;
-               vqmmc-supply = <&vdd_3v3_sys>;
+               vqmmc-supply = <&vdd_1v8_sys>;
 
                /* Azurewave AW-NH611 BCM4329 */
                wifi@1 {
                nvidia,audio-codec = <&wm8903>;
 
                nvidia,spkr-en-gpios = <&wm8903 2 GPIO_ACTIVE_HIGH>;
-               nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_HIGH>;
+               nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>;
                nvidia,int-mic-en-gpios = <&wm8903 1 GPIO_ACTIVE_HIGH>;
                nvidia,headset;
 
 
                        trips {
                                trip0: cpu-alert0 {
-                                       /* start throttling at 50C */
-                                       temperature = <50000>;
+                                       /* start throttling at 60C */
+                                       temperature = <60000>;
                                        hysteresis = <200>;
                                        type = "passive";
                                };
 
                                trip1: cpu-crit {
-                                       /* shut down at 60C */
-                                       temperature = <60000>;
+                                       /* shut down at 70C */
+                                       temperature = <70000>;
                                        hysteresis = <2000>;
                                        type = "critical";
                                };
 
                emc-tables@0 {
                        nvidia,ram-code = <0>; /* elpida-8gb */
+                       reg = <0>;
 
                        #address-cells = <1>;
                        #size-cells = <0>;
 
                emc-tables@1 {
                        nvidia,ram-code = <1>; /* elpida-4gb */
+                       reg = <1>;
 
                        #address-cells = <1>;
                        #size-cells = <0>;
 
                emc-tables@2 {
                        nvidia,ram-code = <2>; /* hynix-8gb */
+                       reg = <2>;
 
                        #address-cells = <1>;
                        #size-cells = <0>;
 
                emc-tables@3 {
                        nvidia,ram-code = <3>; /* hynix-4gb */
+                       reg = <3>;
 
                        #address-cells = <1>;
                        #size-cells = <0>;
index 86494cb..ae4312e 100644 (file)
 
                nvidia,spkr-en-gpios = <&wm8903 2 GPIO_ACTIVE_HIGH>;
                nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2)
-                       GPIO_ACTIVE_HIGH>;
+                       GPIO_ACTIVE_LOW>;
                nvidia,int-mic-en-gpios = <&gpio TEGRA_GPIO(X, 0)
                        GPIO_ACTIVE_HIGH>;
                nvidia,ext-mic-en-gpios = <&gpio TEGRA_GPIO(X, 1)
index a348ca3..b31c9bc 100644 (file)
@@ -84,7 +84,7 @@
                nvidia,audio-codec = <&wm8903>;
 
                nvidia,spkr-en-gpios = <&wm8903 2 GPIO_ACTIVE_HIGH>;
-               nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_HIGH>;
+               nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>;
 
                clocks = <&tegra_car TEGRA20_CLK_PLL_A>,
                         <&tegra_car TEGRA20_CLK_PLL_A_OUT0>,
index 940a9f3..3180bff 100644 (file)
@@ -2,6 +2,8 @@
 /dts-v1/;
 
 #include <dt-bindings/input/input.h>
+#include <dt-bindings/thermal/thermal.h>
+
 #include "tegra20.dtsi"
 #include "tegra20-cpu-opp.dtsi"
 #include "tegra20-cpu-opp-microvolt.dtsi"
                        nvidia,ram-code = <0x0>;
                        #address-cells = <1>;
                        #size-cells = <0>;
+                       reg = <0>;
 
                        emc-table@166500 {
                                reg = <166500>;
                        };
                };
 
-               adt7461@4c {
+               adt7461: temperature-sensor@4c {
                        compatible = "adi,adt7461";
                        reg = <0x4c>;
+                       #thermal-sensor-cells = <1>;
                };
        };
 
                cpu0: cpu@0 {
                        cpu-supply = <&cpu_vdd_reg>;
                        operating-points-v2 = <&cpu0_opp_table>;
+                       #cooling-cells = <2>;
                };
 
-               cpu@1 {
+               cpu1: cpu@1 {
                        cpu-supply = <&cpu_vdd_reg>;
                        operating-points-v2 = <&cpu0_opp_table>;
+                       #cooling-cells = <2>;
+               };
+       };
+
+       thermal-zones {
+               cpu-thermal {
+                       polling-delay-passive = <500>; /* milliseconds */
+                       polling-delay = <1500>; /* milliseconds */
+
+                       thermal-sensors = <&adt7461 1>;
+
+                       trips {
+                               trip0: cpu-alert0 {
+                                       /* start throttling at 80C */
+                                       temperature = <80000>;
+                                       hysteresis = <200>;
+                                       type = "passive";
+                               };
+
+                               trip1: cpu-crit {
+                                       /* shut down at 85C */
+                                       temperature = <85000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&trip0>;
+                                       cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                       };
                };
        };
 };
index 378f23b..5811b70 100644 (file)
@@ -52,7 +52,7 @@
                nvidia,audio-codec = <&wm8903>;
 
                nvidia,spkr-en-gpios = <&wm8903 2 GPIO_ACTIVE_HIGH>;
-               nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_HIGH>;
+               nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>;
 
                clocks = <&tegra_car TEGRA20_CLK_PLL_A>,
                         <&tegra_car TEGRA20_CLK_PLL_A_OUT0>,
index c24d4a3..92d494b 100644 (file)
                nvidia,audio-codec = <&wm8903>;
 
                nvidia,spkr-en-gpios = <&wm8903 2 GPIO_ACTIVE_HIGH>;
-               nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(X, 1) GPIO_ACTIVE_HIGH>;
+               nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(X, 1) GPIO_ACTIVE_LOW>;
 
                clocks = <&tegra_car TEGRA20_CLK_PLL_A>,
                         <&tegra_car TEGRA20_CLK_PLL_A_OUT0>,
index 44ced60..10ff09d 100644 (file)
@@ -61,7 +61,7 @@
 
                nvidia,spkr-en-gpios = <&wm8903 2 GPIO_ACTIVE_HIGH>;
                nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2)
-                       GPIO_ACTIVE_HIGH>;
+                       GPIO_ACTIVE_LOW>;
 
                clocks = <&tegra_car TEGRA20_CLK_PLL_A>,
                         <&tegra_car TEGRA20_CLK_PLL_A_OUT0>,
index 99a356c..5a2578b 100644 (file)
                nvidia,audio-codec = <&wm8903>;
 
                nvidia,spkr-en-gpios = <&wm8903 2 GPIO_ACTIVE_HIGH>;
-               nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_HIGH>;
+               nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>;
                nvidia,int-mic-en-gpios = <&gpio TEGRA_GPIO(X, 0)
                        GPIO_ACTIVE_HIGH>;
                nvidia,ext-mic-en-gpios = <&gpio TEGRA_GPIO(X, 1)
index dc773b1..ae8300b 100644 (file)
                        compatible = "ti,bq27541";
                        reg = <0x55>;
                        power-supplies = <&power_supply>;
-                       monitored-battery = <&battery_cell>;
                };
 
                power_supply: charger@6a {
        };
 
        thermal-zones {
-               skin-thermal {
-                       polling-delay-passive = <1000>; /* milliseconds */
-                       polling-delay = <0>; /* milliseconds */
-
-                       thermal-sensors = <&nct72 0>;
-               };
-
                cpu-thermal {
                        polling-delay-passive = <1000>; /* milliseconds */
                        polling-delay = <5000>; /* milliseconds */
                                };
 
                                trip1: cpu-crit {
-                                       /* shut down at 60C */
-                                       temperature = <60000>;
+                                       /* shut down at 65C */
+                                       temperature = <65000>;
                                        hysteresis = <2000>;
                                        type = "critical";
                                };
                                        cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
                                                         <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
                                                         <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
-                                                        <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                                                        <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&actmon THERMAL_NO_LIMIT
+                                                                 THERMAL_NO_LIMIT>;
                                };
                        };
                };
index 17b6682..53966fa 100644 (file)
                enable-active-high;
                vin-supply = <&vdd_3v3_sys>;
        };
+
+       pmc@7000e400 {
+               i2c-thermtrip {
+                       nvidia,i2c-controller-id = <4>;
+                       nvidia,bus-addr = <0x3c>;
+                       nvidia,reg-addr = <0x41>;
+                       nvidia,reg-data = <0xe0>;
+               };
+       };
 };
index b97da45..9365ae6 100644 (file)
        };
 
        vdd_3v3_sys: regulator@1 {
-               gpio = <&pmic 7 GPIO_ACTIVE_HIGH>;
+               gpio = <&pmic 6 GPIO_ACTIVE_HIGH>;
                enable-active-high;
        };
+
+       pmc@7000e400 {
+               i2c-thermtrip {
+                       nvidia,i2c-controller-id = <4>;
+                       nvidia,bus-addr = <0x2d>;
+                       nvidia,reg-addr = <0x3f>;
+                       nvidia,reg-data = <0x80>;
+               };
+       };
 };
index 2dff14b..d9dd115 100644 (file)
 
                nvidia,spkr-en-gpios = <&wm8903 2 GPIO_ACTIVE_HIGH>;
                nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2)
-                       GPIO_ACTIVE_HIGH>;
+                       GPIO_ACTIVE_LOW>;
 
                clocks = <&tegra_car TEGRA30_CLK_PLL_A>,
                         <&tegra_car TEGRA30_CLK_PLL_A_OUT0>,
index 9a10e0d..ab8744f 100644 (file)
                                        cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
                                                         <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
                                                         <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
-                                                        <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                                                        <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&actmon THERMAL_NO_LIMIT
+                                                                 THERMAL_NO_LIMIT>;
                                };
                        };
                };
index 44a6dbb..c577c19 100644 (file)
                reg = <0x6000c000 0x150>; /* AHB Arbitration + Gizmo Controller */
        };
 
-       actmon@6000c800 {
+       actmon: actmon@6000c800 {
                compatible = "nvidia,tegra30-actmon";
                reg = <0x6000c800 0x400>;
                interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
                operating-points-v2 = <&emc_bw_dfs_opp_table>;
                interconnects = <&mc TEGRA30_MC_MPCORER &emc>;
                interconnect-names = "cpu-read";
+               #cooling-cells = <2>;
        };
 
        gpio: gpio@6000d000 {
index 658c8ef..a71cf1d 100644 (file)
@@ -10,6 +10,7 @@ config ARCH_WPCM450
        bool "Support for WPCM450 BMC (Hermon)"
        depends on ARCH_MULTI_V5
        select CPU_ARM926T
+       select WPCM450_AIC
        select NPCM7XX_TIMER
        help
          General support for WPCM450 BMC (Hermon).
index ec0d9b0..bddfc7c 100644 (file)
@@ -121,8 +121,13 @@ static int cplds_probe(struct platform_device *pdev)
                return fpga->irq;
 
        base_irq = platform_get_irq(pdev, 1);
-       if (base_irq < 0)
+       if (base_irq < 0) {
                base_irq = 0;
+       } else {
+               ret = devm_irq_alloc_descs(&pdev->dev, base_irq, base_irq, CPLDS_NB_IRQ, 0);
+               if (ret < 0)
+                       return ret;
+       }
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        fpga->base = devm_ioremap_resource(&pdev->dev, res);
index c7679d7..28e03b5 100644 (file)
 440    common  process_madvise                 sys_process_madvise
 441    common  epoll_pwait2                    sys_epoll_pwait2
 442    common  mount_setattr                   sys_mount_setattr
-443    common  quotactl_path                   sys_quotactl_path
+# 443 reserved for quotactl_path
 444    common  landlock_create_ruleset         sys_landlock_create_ruleset
 445    common  landlock_add_rule               sys_landlock_add_rule
 446    common  landlock_restrict_self          sys_landlock_restrict_self
index f8f0746..a7e54a0 100644 (file)
@@ -135,24 +135,18 @@ void xen_destroy_contiguous_region(phys_addr_t pstart, unsigned int order)
        return;
 }
 
-int xen_swiotlb_detect(void)
-{
-       if (!xen_domain())
-               return 0;
-       if (xen_feature(XENFEAT_direct_mapped))
-               return 1;
-       /* legacy case */
-       if (!xen_feature(XENFEAT_not_direct_mapped) && xen_initial_domain())
-               return 1;
-       return 0;
-}
-
 static int __init xen_mm_init(void)
 {
        struct gnttab_cache_flush cflush;
+       int rc;
+
        if (!xen_swiotlb_detect())
                return 0;
-       xen_swiotlb_init();
+
+       rc = xen_swiotlb_init();
+       /* we can work with the default swiotlb */
+       if (rc < 0 && rc != -EEXIST)
+               return rc;
 
        cflush.op = 0;
        cflush.a.dev_bus_addr = 0;
index 7ef4447..b52481f 100644 (file)
@@ -175,6 +175,9 @@ vdso_install:
        $(if $(CONFIG_COMPAT_VDSO), \
                $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso32 $@)
 
+archprepare:
+       $(Q)$(MAKE) $(build)=arch/arm64/tools kapi
+
 # We use MRPROPER_FILES and CLEAN_FILES now
 archclean:
        $(Q)$(MAKE) $(clean)=$(boot)
index 41ce680..a96d9d2 100644 (file)
@@ -25,6 +25,7 @@ dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-libretech-all-h3-it.dtb
 dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-libretech-all-h5-cc.dtb
 dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-nanopi-neo2.dtb
 dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-nanopi-neo-plus2.dtb
+dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-nanopi-r1s-h5.dtb
 dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-pc2.dtb
 dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-prime.dtb
 dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-zero-plus.dtb
index 79adea3..5b44a97 100644 (file)
                /* Backlight configuration differs per PinePhone revision. */
        };
 
+       bt_sco_codec: bt-sco-codec {
+               #sound-dai-cells = <1>;
+               compatible = "linux,bt-sco";
+       };
+
        chosen {
                stdout-path = "serial0:115200n8";
        };
@@ -91,6 +96,8 @@
 };
 
 &codec {
+       pinctrl-names = "default";
+       pinctrl-0 = <&aif3_pins>;
        status = "okay";
 };
 
 
 &sound {
        status = "okay";
+       simple-audio-card,name = "PinePhone";
        simple-audio-card,aux-devs = <&codec_analog>, <&speaker_amp>;
        simple-audio-card,widgets = "Microphone", "Headset Microphone",
                                    "Microphone", "Internal Microphone",
                        "MIC1", "Internal Microphone",
                        "Headset Microphone", "HBIAS",
                        "MIC2", "Headset Microphone";
+
+       simple-audio-card,dai-link@2 {
+               format = "dsp_a";
+               frame-master = <&link2_codec>;
+               bitclock-master = <&link2_codec>;
+               bitclock-inversion;
+
+               link2_cpu: cpu {
+                       sound-dai = <&bt_sco_codec 0>;
+               };
+
+               link2_codec: codec {
+                       sound-dai = <&codec 2>;
+                       dai-tdm-slot-num = <1>;
+                       dai-tdm-slot-width = <32>;
+               };
+       };
 };
 
 &uart0 {
index 5b30e6c..6ddb717 100644 (file)
        };
 
        sound: sound {
+               #address-cells = <1>;
+               #size-cells = <0>;
                compatible = "simple-audio-card";
                simple-audio-card,name = "sun50i-a64-audio";
-               simple-audio-card,format = "i2s";
-               simple-audio-card,frame-master = <&cpudai>;
-               simple-audio-card,bitclock-master = <&cpudai>;
-               simple-audio-card,mclk-fs = <128>;
                simple-audio-card,aux-devs = <&codec_analog>;
                simple-audio-card,routing =
                                "Left DAC", "DACL",
                                "ADCR", "Right ADC";
                status = "disabled";
 
-               cpudai: simple-audio-card,cpu {
-                       sound-dai = <&dai>;
-               };
+               simple-audio-card,dai-link@0 {
+                       format = "i2s";
+                       frame-master = <&link0_cpu>;
+                       bitclock-master = <&link0_cpu>;
+                       mclk-fs = <128>;
+
+                       link0_cpu: cpu {
+                               sound-dai = <&dai>;
+                       };
 
-               link_codec: simple-audio-card,codec {
-                       sound-dai = <&codec>;
+                       link0_codec: codec {
+                               sound-dai = <&codec 0>;
+                       };
                };
        };
 
                        interrupt-controller;
                        #interrupt-cells = <3>;
 
+                       /omit-if-no-ref/
+                       aif2_pins: aif2-pins {
+                               pins = "PB4", "PB5", "PB6", "PB7";
+                               function = "aif2";
+                       };
+
+                       /omit-if-no-ref/
+                       aif3_pins: aif3-pins {
+                               pins = "PG10", "PG11", "PG12", "PG13";
+                               function = "aif3";
+                       };
+
                        csi_pins: csi-pins {
                                pins = "PE0", "PE2", "PE3", "PE4", "PE5", "PE6",
                                       "PE7", "PE8", "PE9", "PE10", "PE11";
                        };
                };
 
+               timer@1c20c00 {
+                       compatible = "allwinner,sun50i-a64-timer",
+                                    "allwinner,sun8i-a23-timer";
+                       reg = <0x01c20c00 0xa0>;
+                       interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&osc24M>;
+               };
+
+               wdt0: watchdog@1c20ca0 {
+                       compatible = "allwinner,sun50i-a64-wdt",
+                                    "allwinner,sun6i-a31-wdt";
+                       reg = <0x01c20ca0 0x20>;
+                       interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&osc24M>;
+               };
+
                spdif: spdif@1c21000 {
                        #sound-dai-cells = <0>;
                        compatible = "allwinner,sun50i-a64-spdif",
                };
 
                codec: codec@1c22e00 {
-                       #sound-dai-cells = <0>;
+                       #sound-dai-cells = <1>;
                        compatible = "allwinner,sun50i-a64-codec",
                                     "allwinner,sun8i-a33-codec";
                        reg = <0x01c22e00 0x600>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                };
-
-               wdt0: watchdog@1c20ca0 {
-                       compatible = "allwinner,sun50i-a64-wdt",
-                                    "allwinner,sun6i-a31-wdt";
-                       reg = <0x01c20ca0 0x20>;
-                       interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&osc24M>;
-               };
        };
 };
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts b/arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-r1s-h5.dts
new file mode 100644 (file)
index 0000000..55bcdf8
--- /dev/null
@@ -0,0 +1,195 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (C) 2021 Chukun Pan <amadeus@jmu.edu.cn>
+ *
+ * Based on sun50i-h5-nanopi-neo-plus2.dts, which is:
+ *   Copyright (C) 2017 Antony Antony <antony@phenome.org>
+ *   Copyright (C) 2016 ARM Ltd.
+ */
+
+/dts-v1/;
+#include "sun50i-h5.dtsi"
+#include "sun50i-h5-cpu-opp.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+
+/ {
+       model = "FriendlyARM NanoPi R1S H5";
+       compatible = "friendlyarm,nanopi-r1s-h5", "allwinner,sun50i-h5";
+
+       aliases {
+               ethernet0 = &emac;
+               ethernet1 = &rtl8189etv;
+               serial0 = &uart0;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               led-0 {
+                       function = LED_FUNCTION_LAN;
+                       color = <LED_COLOR_ID_GREEN>;
+                       gpios = <&pio 0 9 GPIO_ACTIVE_HIGH>;
+               };
+
+               led-1 {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_RED>;
+                       gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "heartbeat";
+               };
+
+               led-2 {
+                       function = LED_FUNCTION_WAN;
+                       color = <LED_COLOR_ID_GREEN>;
+                       gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>;
+               };
+       };
+
+       r-gpio-keys {
+               compatible = "gpio-keys";
+
+               reset {
+                       label = "reset";
+                       linux,code = <KEY_RESTART>;
+                       gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
+               };
+       };
+
+       reg_gmac_3v3: gmac-3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "gmac-3v3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               startup-delay-us = <100000>;
+               enable-active-high;
+               gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>;
+       };
+
+       reg_vcc3v3: vcc3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "vcc3v3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
+       reg_usb0_vbus: usb0-vbus {
+               compatible = "regulator-fixed";
+               regulator-name = "usb0-vbus";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               enable-active-high;
+               gpio = <&r_pio 0 2 GPIO_ACTIVE_HIGH>; /* PL2 */
+               status = "okay";
+       };
+
+       vdd_cpux: gpio-regulator {
+               compatible = "regulator-gpio";
+               regulator-name = "vdd-cpux";
+               regulator-type = "voltage";
+               regulator-boot-on;
+               regulator-always-on;
+               regulator-min-microvolt = <1100000>;
+               regulator-max-microvolt = <1300000>;
+               regulator-ramp-delay = <50>; /* 4ms */
+               gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>;
+               gpios-states = <0x1>;
+               states = <1100000 0x0>, <1300000 0x1>;
+       };
+
+       wifi_pwrseq: wifi_pwrseq {
+               compatible = "mmc-pwrseq-simple";
+               reset-gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>; /* PL7 */
+               post-power-on-delay-ms = <200>;
+       };
+};
+
+&cpu0 {
+       cpu-supply = <&vdd_cpux>;
+};
+
+&ehci1 {
+       status = "okay";
+};
+
+&ehci2 {
+       status = "okay";
+};
+
+&emac {
+       pinctrl-names = "default";
+       pinctrl-0 = <&emac_rgmii_pins>;
+       phy-supply = <&reg_gmac_3v3>;
+       phy-handle = <&ext_rgmii_phy>;
+       phy-mode = "rgmii-id";
+       status = "okay";
+};
+
+&external_mdio {
+       ext_rgmii_phy: ethernet-phy@7 {
+               compatible = "ethernet-phy-ieee802.3-c22";
+               reg = <7>;
+       };
+};
+
+&i2c0 {
+       status = "okay";
+
+       eeprom@51 {
+               compatible = "microchip,24c02";
+               reg = <0x51>;
+               pagesize = <16>;
+       };
+};
+
+&mmc0 {
+       vmmc-supply = <&reg_vcc3v3>;
+       bus-width = <4>;
+       cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */
+       status = "okay";
+};
+
+&mmc1 {
+       vmmc-supply = <&reg_vcc3v3>;
+       vqmmc-supply = <&reg_vcc3v3>;
+       mmc-pwrseq = <&wifi_pwrseq>;
+       bus-width = <4>;
+       non-removable;
+       status = "okay";
+
+       rtl8189etv: sdio_wifi@1 {
+               reg = <1>;
+       };
+};
+
+&ohci1 {
+       status = "okay";
+};
+
+&ohci2 {
+       status = "okay";
+};
+
+&uart0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_pa_pins>;
+       status = "okay";
+};
+
+&usb_otg {
+       dr_mode = "peripheral";
+       status = "okay";
+};
+
+&usbphy {
+       /* USB Type-A port's VBUS is always on */
+       usb0_id_det-gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */
+       usb0_vbus-supply = <&reg_usb0_vbus>;
+       status = "okay";
+};
index 5081586..30d396e 100644 (file)
                        };
                };
 
+               timer@3009000 {
+                       compatible = "allwinner,sun50i-h6-timer",
+                                    "allwinner,sun8i-a23-timer";
+                       reg = <0x03009000 0xa0>;
+                       interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&osc24M>;
+               };
+
                watchdog: watchdog@30090a0 {
                        compatible = "allwinner,sun50i-h6-wdt",
                                     "allwinner,sun6i-a31-wdt";
index a58ccec..faa0a79 100644 (file)
@@ -48,6 +48,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-gxm-rbox-pro.dtb
 dtb-$(CONFIG_ARCH_MESON) += meson-gxm-s912-libretech-pc.dtb
 dtb-$(CONFIG_ARCH_MESON) += meson-gxm-vega-s96.dtb
 dtb-$(CONFIG_ARCH_MESON) += meson-gxm-wetek-core2.dtb
+dtb-$(CONFIG_ARCH_MESON) += meson-sm1-bananapi-m5.dtb
 dtb-$(CONFIG_ARCH_MESON) += meson-sm1-khadas-vim3l.dtb
 dtb-$(CONFIG_ARCH_MESON) += meson-sm1-odroid-c4.dtb
 dtb-$(CONFIG_ARCH_MESON) += meson-sm1-odroid-hc4.dtb
index 895c43c..3f5254e 100644 (file)
                                status = "disabled";
                                clocks = <&xtal>, <&clkc CLKID_UART0>, <&xtal>;
                                clock-names = "xtal", "pclk", "baud";
+                               fifo-size = <128>;
                        };
                };
 
index 793d48f..00c6f53 100644 (file)
                                clocks = <&xtal>, <&clkc CLKID_UART0>, <&xtal>;
                                clock-names = "xtal", "pclk", "baud";
                                status = "disabled";
+                               fifo-size = <128>;
                        };
                };
 
index 3d00404..6b457b2 100644 (file)
                                reg = <0x0 0x84c0 0x0 0x18>;
                                interrupts = <GIC_SPI 26 IRQ_TYPE_EDGE_RISING>;
                                status = "disabled";
+                               fifo-size = <128>;
                        };
 
                        uart_B: serial@84dc {
index 66d6752..3cf4ecb 100644 (file)
        sound {
                compatible = "amlogic,axg-sound-card";
                model = "KHADAS-VIM3";
-               audio-aux-devs = <&tdmout_a>;
+               audio-aux-devs = <&tdmin_a>, <&tdmout_a>;
                audio-routing = "TDMOUT_A IN 0", "FRDDR_A OUT 0",
                                "TDMOUT_A IN 1", "FRDDR_B OUT 0",
                                "TDMOUT_A IN 2", "FRDDR_C OUT 0",
-                               "TDM_A Playback", "TDMOUT_A OUT";
+                               "TDM_A Playback", "TDMOUT_A OUT",
+                               "TDMIN_A IN 0", "TDM_A Capture",
+                               "TDMIN_A IN 3", "TDM_A Loopback",
+                               "TODDR_A IN 0", "TDMIN_A OUT",
+                               "TODDR_B IN 0", "TDMIN_A OUT",
+                               "TODDR_C IN 0", "TDMIN_A OUT";
 
                assigned-clocks = <&clkc CLKID_MPLL2>,
                                  <&clkc CLKID_MPLL0>,
                        sound-dai = <&frddr_c>;
                };
 
-               /* 8ch hdmi interface */
                dai-link-3 {
+                       sound-dai = <&toddr_a>;
+               };
+
+               dai-link-4 {
+                       sound-dai = <&toddr_b>;
+               };
+
+               dai-link-5 {
+                       sound-dai = <&toddr_c>;
+               };
+
+               /* 8ch hdmi interface */
+               dai-link-6 {
                        sound-dai = <&tdmif_a>;
                        dai-format = "i2s";
                        dai-tdm-slot-tx-mask-0 = <1 1>;
                };
 
                /* hdmi glue */
-               dai-link-4 {
+               dai-link-7 {
                        sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>;
 
                        codec {
        status = "okay";
 };
 
+&tdmin_a {
+       status = "okay";
+};
+
 &tdmout_a {
        status = "okay";
 };
 
+&toddr_a {
+       status = "okay";
+};
+
+&toddr_b {
+       status = "okay";
+};
+
+&toddr_c {
+       status = "okay";
+};
+
 &tohdmitx {
        status = "okay";
 };
diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts
new file mode 100644 (file)
index 0000000..effaa13
--- /dev/null
@@ -0,0 +1,646 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 BayLibre SAS
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ */
+
+/dts-v1/;
+
+#include "meson-sm1.dtsi"
+#include <dt-bindings/leds/common.h>
+#include <dt-bindings/input/linux-event-codes.h>
+#include <dt-bindings/gpio/meson-g12a-gpio.h>
+#include <dt-bindings/sound/meson-g12a-toacodec.h>
+#include <dt-bindings/sound/meson-g12a-tohdmitx.h>
+
+/ {
+       compatible = "bananapi,bpi-m5", "amlogic,sm1";
+       model = "Banana Pi BPI-M5";
+
+       adc_keys {
+               compatible = "adc-keys";
+               io-channels = <&saradc 2>;
+               io-channel-names = "buttons";
+               keyup-threshold-microvolt = <1800000>;
+
+               key {
+                       label = "SW3";
+                       linux,code = <BTN_3>;
+                       press-threshold-microvolt = <1700000>;
+               };
+       };
+
+       aliases {
+               serial0 = &uart_AO;
+               ethernet0 = &ethmac;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       /* TOFIX: handle CVBS_DET on SARADC channel 0 */
+       cvbs-connector {
+               compatible = "composite-video-connector";
+
+               port {
+                       cvbs_connector_in: endpoint {
+                               remote-endpoint = <&cvbs_vdac_out>;
+                       };
+               };
+       };
+
+       emmc_pwrseq: emmc-pwrseq {
+               compatible = "mmc-pwrseq-emmc";
+               reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>;
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               key {
+                       label = "SW1";
+                       linux,code = <BTN_1>;
+                       gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_LOW>;
+                       interrupt-parent = <&gpio_intc>;
+                       interrupts = <3 IRQ_TYPE_EDGE_BOTH>;
+               };
+       };
+
+       hdmi-connector {
+               compatible = "hdmi-connector";
+               type = "a";
+
+               port {
+                       hdmi_connector_in: endpoint {
+                               remote-endpoint = <&hdmi_tx_tmds_out>;
+                       };
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               green {
+                       color = <LED_COLOR_ID_GREEN>;
+                       function = LED_FUNCTION_STATUS;
+                       gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>;
+               };
+
+               blue {
+                       color = <LED_COLOR_ID_BLUE>;
+                       function = LED_FUNCTION_STATUS;
+                       gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "heartbeat";
+               };
+       };
+
+       memory@0 {
+               device_type = "memory";
+               reg = <0x0 0x0 0x0 0x40000000>;
+       };
+
+       emmc_1v8: regulator-emmc_1v8 {
+               compatible = "regulator-fixed";
+               regulator-name = "EMMC_1V8";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&vddao_3v3>;
+               regulator-always-on;
+       };
+
+       dc_in: regulator-dc_in {
+               compatible = "regulator-fixed";
+               regulator-name = "DC_IN";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               regulator-always-on;
+       };
+
+       vddio_c: regulator-vddio_c {
+               compatible = "regulator-gpio";
+               regulator-name = "VDDIO_C";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <3300000>;
+
+               enable-gpio = <&gpio GPIOE_2 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               regulator-always-on;
+
+               gpios = <&gpio_ao GPIOAO_6 GPIO_OPEN_DRAIN>;
+               gpios-states = <1>;
+
+               states = <1800000 0>,
+                        <3300000 1>;
+       };
+
+       tflash_vdd: regulator-tflash_vdd {
+               compatible = "regulator-fixed";
+               regulator-name = "TFLASH_VDD";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&dc_in>;
+               gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>;
+               enable-active-high;
+               regulator-always-on;
+       };
+
+       vddao_1v8: regulator-vddao_1v8 {
+               compatible = "regulator-fixed";
+               regulator-name = "VDDAO_1V8";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&vddao_3v3>;
+               regulator-always-on;
+       };
+
+       vddao_3v3: regulator-vddao_3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "VDDAO_3V3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&dc_in>;
+               regulator-always-on;
+       };
+
+       vddcpu: regulator-vddcpu {
+               /*
+                * SY8120B1ABC DC/DC Regulator.
+                */
+               compatible = "pwm-regulator";
+
+               regulator-name = "VDDCPU";
+               regulator-min-microvolt = <690000>;
+               regulator-max-microvolt = <1050000>;
+
+               vin-supply = <&dc_in>;
+
+               pwms = <&pwm_AO_cd 1 1250 0>;
+               pwm-dutycycle-range = <100 0>;
+
+               regulator-boot-on;
+               regulator-always-on;
+       };
+
+       /* USB Hub Power Enable */
+       vl_pwr_en: regulator-vl_pwr_en {
+               compatible = "regulator-fixed";
+               regulator-name = "VL_PWR_EN";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&dc_in>;
+
+               gpio = <&gpio GPIOH_6 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       sound {
+               compatible = "amlogic,axg-sound-card";
+               model = "BPI-M5";
+               audio-widgets = "Line", "Lineout";
+               audio-aux-devs = <&tdmout_b>, <&tdmout_c>,
+                                <&tdmin_a>, <&tdmin_b>, <&tdmin_c>;
+               audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1",
+                               "TDMOUT_B IN 1", "FRDDR_B OUT 1",
+                               "TDMOUT_B IN 2", "FRDDR_C OUT 1",
+                               "TDM_B Playback", "TDMOUT_B OUT",
+                               "TDMOUT_C IN 0", "FRDDR_A OUT 2",
+                               "TDMOUT_C IN 1", "FRDDR_B OUT 2",
+                               "TDMOUT_C IN 2", "FRDDR_C OUT 2",
+                               "TDM_C Playback", "TDMOUT_C OUT",
+                               "TDMIN_A IN 4", "TDM_B Loopback",
+                               "TDMIN_B IN 4", "TDM_B Loopback",
+                               "TDMIN_C IN 4", "TDM_B Loopback",
+                               "TDMIN_A IN 5", "TDM_C Loopback",
+                               "TDMIN_B IN 5", "TDM_C Loopback",
+                               "TDMIN_C IN 5", "TDM_C Loopback",
+                               "TODDR_A IN 0", "TDMIN_A OUT",
+                               "TODDR_B IN 0", "TDMIN_A OUT",
+                               "TODDR_C IN 0", "TDMIN_A OUT",
+                               "TODDR_A IN 1", "TDMIN_B OUT",
+                               "TODDR_B IN 1", "TDMIN_B OUT",
+                               "TODDR_C IN 1", "TDMIN_B OUT",
+                               "TODDR_A IN 2", "TDMIN_C OUT",
+                               "TODDR_B IN 2", "TDMIN_C OUT",
+                               "TODDR_C IN 2", "TDMIN_C OUT",
+                               "Lineout", "ACODEC LOLP",
+                               "Lineout", "ACODEC LORP";
+
+               assigned-clocks = <&clkc CLKID_MPLL2>,
+                                 <&clkc CLKID_MPLL0>,
+                                 <&clkc CLKID_MPLL1>;
+               assigned-clock-parents = <0>, <0>, <0>;
+               assigned-clock-rates = <294912000>,
+                                      <270950400>,
+                                      <393216000>;
+               status = "okay";
+
+               dai-link-0 {
+                       sound-dai = <&frddr_a>;
+               };
+
+               dai-link-1 {
+                       sound-dai = <&frddr_b>;
+               };
+
+               dai-link-2 {
+                       sound-dai = <&frddr_c>;
+               };
+
+               dai-link-3 {
+                       sound-dai = <&toddr_a>;
+               };
+
+               dai-link-4 {
+                       sound-dai = <&toddr_b>;
+               };
+
+               dai-link-5 {
+                       sound-dai = <&toddr_c>;
+               };
+
+               /* 8ch hdmi interface */
+               dai-link-6 {
+                       sound-dai = <&tdmif_b>;
+                       dai-format = "i2s";
+                       dai-tdm-slot-tx-mask-0 = <1 1>;
+                       dai-tdm-slot-tx-mask-1 = <1 1>;
+                       dai-tdm-slot-tx-mask-2 = <1 1>;
+                       dai-tdm-slot-tx-mask-3 = <1 1>;
+                       mclk-fs = <256>;
+
+                       codec-0 {
+                               sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>;
+                       };
+
+                       codec-1 {
+                               sound-dai = <&toacodec TOACODEC_IN_B>;
+                       };
+               };
+
+               /* i2s jack output interface */
+               dai-link-7 {
+                       sound-dai = <&tdmif_c>;
+                       dai-format = "i2s";
+                       dai-tdm-slot-tx-mask-0 = <1 1>;
+                       mclk-fs = <256>;
+
+                       codec-0 {
+                               sound-dai = <&tohdmitx TOHDMITX_I2S_IN_C>;
+                       };
+
+                       codec-1 {
+                               sound-dai = <&toacodec TOACODEC_IN_C>;
+                       };
+               };
+
+               /* hdmi glue */
+               dai-link-8 {
+                       sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>;
+
+                       codec {
+                               sound-dai = <&hdmi_tx>;
+                       };
+               };
+
+               /* acodec glue */
+               dai-link-9 {
+                       sound-dai = <&toacodec TOACODEC_OUT>;
+
+                       codec {
+                               sound-dai = <&acodec>;
+                       };
+               };
+       };
+};
+
+&acodec {
+       AVDD-supply = <&vddao_1v8>;
+       status = "okay";
+};
+
+&arb {
+       status = "okay";
+};
+
+&clkc_audio {
+       status = "okay";
+};
+
+&cpu0 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU_CLK>;
+       clock-latency = <50000>;
+};
+
+&cpu1 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU1_CLK>;
+       clock-latency = <50000>;
+};
+
+&cpu2 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU2_CLK>;
+       clock-latency = <50000>;
+};
+
+&cpu3 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU3_CLK>;
+       clock-latency = <50000>;
+};
+
+&cvbs_vdac_port {
+       cvbs_vdac_out: endpoint {
+               remote-endpoint = <&cvbs_connector_in>;
+       };
+};
+
+&ext_mdio {
+       external_phy: ethernet-phy@0 {
+               /* Realtek RTL8211F (0x001cc916) */
+               reg = <0>;
+               max-speed = <1000>;
+
+               interrupt-parent = <&gpio_intc>;
+               /* MAC_INTR on GPIOZ_14 */
+               interrupts = <26 IRQ_TYPE_LEVEL_LOW>;
+       };
+};
+
+&ethmac {
+       pinctrl-0 = <&eth_pins>, <&eth_rgmii_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+       phy-mode = "rgmii-txid";
+       phy-handle = <&external_phy>;
+};
+
+&frddr_a {
+       status = "okay";
+};
+
+&frddr_b {
+       status = "okay";
+};
+
+&frddr_c {
+       status = "okay";
+};
+
+&gpio {
+       gpio-line-names =
+               /* GPIOZ */
+               "ETH_MDIO", /* GPIOZ_0 */
+               "ETH_MDC", /* GPIOZ_1 */
+               "ETH_RXCLK", /* GPIOZ_2 */
+               "ETH_RX_DV", /* GPIOZ_3 */
+               "ETH_RXD0", /* GPIOZ_4 */
+               "ETH_RXD1", /* GPIOZ_5 */
+               "ETH_RXD2", /* GPIOZ_6 */
+               "ETH_RXD3", /* GPIOZ_7 */
+               "ETH_TXCLK", /* GPIOZ_8 */
+               "ETH_TXEN", /* GPIOZ_9 */
+               "ETH_TXD0", /* GPIOZ_10 */
+               "ETH_TXD1", /* GPIOZ_11 */
+               "ETH_TXD2", /* GPIOZ_12 */
+               "ETH_TXD3", /* GPIOZ_13 */
+               "ETH_INTR", /* GPIOZ_14 */
+               "ETH_NRST", /* GPIOZ_15 */
+               /* GPIOH */
+               "HDMI_SDA", /* GPIOH_0 */
+               "HDMI_SCL", /* GPIOH_1 */
+               "HDMI_HPD", /* GPIOH_2 */
+               "HDMI_CEC", /* GPIOH_3 */
+               "VL-RST_N", /* GPIOH_4 */
+               "CON1-P36", /* GPIOH_5 */
+               "VL-PWREN", /* GPIOH_6 */
+               "WiFi_3V3_1V8", /* GPIOH_7 */
+               "TFLASH_VDD_EN", /* GPIOH_8 */
+               /* BOOT */
+               "eMMC_D0", /* BOOT_0 */
+               "eMMC_D1", /* BOOT_1 */
+               "eMMC_D2", /* BOOT_2 */
+               "eMMC_D3", /* BOOT_3 */
+               "eMMC_D4", /* BOOT_4 */
+               "eMMC_D5", /* BOOT_5 */
+               "eMMC_D6", /* BOOT_6 */
+               "eMMC_D7", /* BOOT_7 */
+               "eMMC_CLK", /* BOOT_8 */
+               "",
+               "eMMC_CMD", /* BOOT_10 */
+               "",
+               "eMMC_RST#", /* BOOT_12 */
+               "eMMC_DS", /* BOOT_13 */
+               /* GPIOC */
+               "SD_D0_B", /* GPIOC_0 */
+               "SD_D1_B", /* GPIOC_1 */
+               "SD_D2_B", /* GPIOC_2 */
+               "SD_D3_B", /* GPIOC_3 */
+               "SD_CLK_B", /* GPIOC_4 */
+               "SD_CMD_B", /* GPIOC_5 */
+               "CARD_EN_DET", /* GPIOC_6 */
+               "",
+               /* GPIOA */
+               "", "", "", "", "", "", "", "",
+               "", "", "", "", "", "",
+               "CON1-P27", /* GPIOA_14 */
+               "CON1-P28", /* GPIOA_15 */
+               /* GPIOX */
+               "CON1-P16", /* GPIOX_0 */
+               "CON1-P18", /* GPIOX_1 */
+               "CON1-P22", /* GPIOX_2 */
+               "CON1-P11", /* GPIOX_3 */
+               "CON1-P13", /* GPIOX_4 */
+               "CON1-P07", /* GPIOX_5 */
+               "CON1-P33", /* GPIOX_6 */
+               "CON1-P15", /* GPIOX_7 */
+               "CON1-P19", /* GPIOX_8 */
+               "CON1-P21", /* GPIOX_9 */
+               "CON1-P24", /* GPIOX_10 */
+               "CON1-P23", /* GPIOX_11 */
+               "CON1-P08", /* GPIOX_12 */
+               "CON1-P10", /* GPIOX_13 */
+               "CON1-P29", /* GPIOX_14 */
+               "CON1-P31", /* GPIOX_15 */
+               "CON1-P26", /* GPIOX_16 */
+               "CON1-P03", /* GPIOX_17 */
+               "CON1-P05", /* GPIOX_18 */
+               "CON1-P32"; /* GPIOX_19 */
+
+       /*
+        * WARNING: The USB Hub on the BPI-M5 needs a reset signal
+        * to be turned high in order to be detected by the USB Controller
+        * This signal should be handled by a USB specific power sequence
+        * in order to reset the Hub when USB bus is powered down.
+        */
+       usb-hub {
+               gpio-hog;
+               gpios = <GPIOH_4 GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "usb-hub-reset";
+       };
+};
+
+&gpio_ao {
+       gpio-line-names =
+               /* GPIOAO */
+               "DEBUG TX", /* GPIOAO_0 */
+               "DEBUG RX", /* GPIOAO_1 */
+               "SYS_LED2", /* GPIOAO_2 */
+               "UPDATE_KEY", /* GPIOAO_3 */
+               "CON1-P40", /* GPIOAO_4 */
+               "IR_IN", /* GPIOAO_5 */
+               "TF_3V3N_1V8_EN", /* GPIOAO_6 */
+               "CON1-P35", /* GPIOAO_7 */
+               "CON1-P12", /* GPIOAO_8 */
+               "CON1-P37", /* GPIOAO_9 */
+               "CON1-P38", /* GPIOAO_10 */
+               "SYS_LED", /* GPIOAO_11 */
+               /* GPIOE */
+               "VDDEE_PWM", /* GPIOE_0 */
+               "VDDCPU_PWM", /* GPIOE_1 */
+               "TF_PWR_EN"; /* GPIOE_2 */
+};
+
+&hdmi_tx {
+       status = "okay";
+       pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>;
+       pinctrl-names = "default";
+       hdmi-supply = <&dc_in>;
+};
+
+&hdmi_tx_tmds_port {
+       hdmi_tx_tmds_out: endpoint {
+               remote-endpoint = <&hdmi_connector_in>;
+       };
+};
+
+&ir {
+       status = "okay";
+       pinctrl-0 = <&remote_input_ao_pins>;
+       pinctrl-names = "default";
+};
+
+&pwm_AO_cd {
+       pinctrl-0 = <&pwm_ao_d_e_pins>;
+       pinctrl-names = "default";
+       clocks = <&xtal>;
+       clock-names = "clkin1";
+       status = "okay";
+};
+
+&saradc {
+       status = "okay";
+       vref-supply = <&vddao_1v8>;
+};
+
+/* SD card */
+&sd_emmc_b {
+       status = "okay";
+       pinctrl-0 = <&sdcard_c_pins>;
+       pinctrl-1 = <&sdcard_clk_gate_c_pins>;
+       pinctrl-names = "default", "clk-gate";
+
+       bus-width = <4>;
+       cap-sd-highspeed;
+       max-frequency = <50000000>;
+       disable-wp;
+
+       /* TOFIX: SD card is barely usable in SDR modes */
+
+       cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&tflash_vdd>;
+       vqmmc-supply = <&vddio_c>;
+};
+
+/* eMMC */
+&sd_emmc_c {
+       status = "okay";
+       pinctrl-0 = <&emmc_ctrl_pins>, <&emmc_data_8b_pins>, <&emmc_ds_pins>;
+       pinctrl-1 = <&emmc_clk_gate_pins>;
+       pinctrl-names = "default", "clk-gate";
+
+       bus-width = <8>;
+       cap-mmc-highspeed;
+       mmc-ddr-1_8v;
+       mmc-hs200-1_8v;
+       max-frequency = <200000000>;
+       disable-wp;
+
+       mmc-pwrseq = <&emmc_pwrseq>;
+       vmmc-supply = <&vddao_3v3>;
+       vqmmc-supply = <&emmc_1v8>;
+};
+
+&tdmif_b {
+       status = "okay";
+};
+
+&tdmif_c {
+       status = "okay";
+};
+
+&tdmin_a {
+       status = "okay";
+};
+
+&tdmin_b {
+       status = "okay";
+};
+
+&tdmin_c {
+       status = "okay";
+};
+
+&tdmout_b {
+       status = "okay";
+};
+
+&tdmout_c {
+       status = "okay";
+};
+
+&toacodec {
+       status = "okay";
+};
+
+&tohdmitx {
+       status = "okay";
+};
+
+&toddr_a {
+       status = "okay";
+};
+
+&toddr_b {
+       status = "okay";
+};
+
+&toddr_c {
+       status = "okay";
+};
+
+&uart_AO {
+       status = "okay";
+       pinctrl-0 = <&uart_ao_a_pins>;
+       pinctrl-names = "default";
+};
+
+&usb {
+       status = "okay";
+};
+
+&usb2_phy0 {
+       phy-supply = <&dc_in>;
+};
+
+&usb2_phy1 {
+       /* Enable the hub which is connected to this port */
+       phy-supply = <&vl_pwr_en>;
+};
index 06de0b1..f2c0981 100644 (file)
                regulator-boot-on;
                regulator-always-on;
        };
+
+       sound {
+               model = "G12B-KHADAS-VIM3L";
+               audio-routing = "TDMOUT_A IN 0", "FRDDR_A OUT 0",
+                               "TDMOUT_A IN 1", "FRDDR_B OUT 0",
+                               "TDMOUT_A IN 2", "FRDDR_C OUT 0",
+                               "TDM_A Playback", "TDMOUT_A OUT",
+                               "TDMIN_A IN 0", "TDM_A Capture",
+                               "TDMIN_A IN 13", "TDM_A Loopback",
+                               "TODDR_A IN 0", "TDMIN_A OUT",
+                               "TODDR_B IN 0", "TDMIN_A OUT",
+                               "TODDR_C IN 0", "TDMIN_A OUT";
+       };
 };
 
 &cpu0 {
index 8c327c0..8c30ce6 100644 (file)
                };
        };
 
-       hub_5v: regulator-hub_5v {
-               compatible = "regulator-fixed";
-               regulator-name = "HUB_5V";
-               regulator-min-microvolt = <5000000>;
-               regulator-max-microvolt = <5000000>;
-               vin-supply = <&vcc_5v>;
-
-               /* Connected to the Hub CHIPENABLE, LOW sets low power state */
-               gpio = <&gpio GPIOH_4 GPIO_ACTIVE_HIGH>;
-               enable-active-high;
-       };
-
        sound {
                model = "ODROID-C4";
        };
@@ -58,8 +46,3 @@
 &ir {
        linux,rc-map-name = "rc-odroid";
 };
-
-&usb2_phy1 {
-       /* Enable the hub which is connected to this port */
-       phy-supply = <&hub_5v>;
-};
index bf15700..f3f9532 100644 (file)
                };
        };
 
+       /* Powers the SATA Disk 0 regulator, which is enabled when a disk load is detected */
+       p12v_0: regulator-p12v_0 {
+               compatible = "regulator-fixed";
+               regulator-name = "P12V_0";
+               regulator-min-microvolt = <12000000>;
+               regulator-max-microvolt = <12000000>;
+               vin-supply = <&main_12v>;
+
+               gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>;
+               enable-active-high;
+               regulator-always-on;
+       };
+
+       /* Powers the SATA Disk 1 regulator, which is enabled when a disk load is detected */
+       p12v_1: regulator-p12v_1 {
+               compatible = "regulator-fixed";
+               regulator-name = "P12V_1";
+               regulator-min-microvolt = <12000000>;
+               regulator-max-microvolt = <12000000>;
+               vin-supply = <&main_12v>;
+
+               gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>;
+               enable-active-high;
+               regulator-always-on;
+       };
+
        sound {
                model = "ODROID-HC4";
        };
        status = "disabled";
 };
 
+&spifc {
+       status = "okay";
+       pinctrl-0 = <&nor_pins>;
+       pinctrl-names = "default";
+
+       spi-flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "jedec,spi-nor";
+               reg = <0>;
+               spi-max-frequency = <104000000>;
+       };
+};
+
 &usb {
-       phys = <&usb2_phy0>, <&usb2_phy1>;
-       phy-names = "usb2-phy0", "usb2-phy1";
+       phys = <&usb2_phy1>;
+       phy-names = "usb2-phy1";
+};
+
+&usb2_phy0 {
+       status = "disabled";
 };
index d14716b..fd0ad85 100644 (file)
                regulator-name = "TF_IO";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <3300000>;
+               vin-supply = <&vcc_5v>;
 
-               gpios = <&gpio_ao GPIOAO_6 GPIO_ACTIVE_HIGH>;
+               enable-gpio = <&gpio GPIOE_2 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               regulator-always-on;
+
+               gpios = <&gpio_ao GPIOAO_6 GPIO_OPEN_SOURCE>;
                gpios-states = <0>;
 
                states = <3300000 0>,
@@ -78,6 +83,8 @@
                regulator-max-microvolt = <5000000>;
                regulator-always-on;
                vin-supply = <&main_12v>;
+               gpio = <&gpio GPIOH_8 GPIO_OPEN_DRAIN>;
+               enable-active-high;
        };
 
        vcc_1v8: regulator-vcc_1v8 {
index c309517..3d8b1f4 100644 (file)
                        status = "disabled";
                };
 
+               toacodec: audio-controller@740 {
+                       compatible = "amlogic,sm1-toacodec",
+                                    "amlogic,g12a-toacodec";
+                       reg = <0x0 0x740 0x0 0x4>;
+                       #sound-dai-cells = <1>;
+                       sound-name-prefix = "TOACODEC";
+                       resets = <&clkc_audio AUD_RESET_TOACODEC>;
+                       status = "disabled";
+               };
+
                tohdmitx: audio-controller@744 {
                        compatible = "amlogic,sm1-tohdmitx",
                                     "amlogic,g12a-tohdmitx";
index 1cc7fdc..8e7a669 100644 (file)
                clocks {
                        compatible = "arm,scpi-clocks";
 
-                       scpi_dvfs: scpi-dvfs {
+                       scpi_dvfs: clocks-0 {
                                compatible = "arm,scpi-dvfs-clocks";
                                #clock-cells = <1>;
                                clock-indices = <0>, <1>, <2>;
                                clock-output-names = "atlclk", "aplclk","gpuclk";
                        };
-                       scpi_clk: scpi-clk {
+                       scpi_clk: clocks-1 {
                                compatible = "arm,scpi-variable-clocks";
                                #clock-cells = <1>;
                                clock-indices = <3>;
                        };
                };
 
-               scpi_devpd: scpi-power-domains {
+               scpi_devpd: power-controller {
                        compatible = "arm,scpi-power-domains";
                        num-domains = <2>;
                        #power-domain-cells = <1>;
index 998e240..11eae3e 100644 (file)
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
-dtb-$(CONFIG_ARCH_BCM2835) += bcm2711-rpi-4-b.dtb \
+dtb-$(CONFIG_ARCH_BCM2835) += bcm2711-rpi-400.dtb \
+                             bcm2711-rpi-4-b.dtb \
                              bcm2837-rpi-3-a-plus.dtb \
                              bcm2837-rpi-3-b.dtb \
                              bcm2837-rpi-3-b-plus.dtb \
diff --git a/arch/arm64/boot/dts/broadcom/bcm2711-rpi-400.dts b/arch/arm64/boot/dts/broadcom/bcm2711-rpi-400.dts
new file mode 100644 (file)
index 0000000..b9000f5
--- /dev/null
@@ -0,0 +1,2 @@
+// SPDX-License-Identifier: GPL-2.0
+#include "arm/bcm2711-rpi-400.dts"
index 8060178..a5a64d1 100644 (file)
                        interrupt-names = "nand";
                        status = "okay";
 
-                       nandcs: nandcs@0 {
+                       nandcs: nand@0 {
                                compatible = "brcm,nandcs";
                                reg = <0>;
                        };
index 2ffb2c9..7b04dfe 100644 (file)
                        status = "disabled";
                };
 
-               uart0: uart@100000 {
+               uart0: serial@100000 {
                        device_type = "serial";
                        compatible = "snps,dw-apb-uart";
                        reg = <0x00100000 0x1000>;
                        status = "disabled";
                };
 
-               uart1: uart@110000 {
+               uart1: serial@110000 {
                        device_type = "serial";
                        compatible = "snps,dw-apb-uart";
                        reg = <0x00110000 0x1000>;
                        status = "disabled";
                };
 
-               uart2: uart@120000 {
+               uart2: serial@120000 {
                        device_type = "serial";
                        compatible = "snps,dw-apb-uart";
                        reg = <0x00120000 0x1000>;
                        status = "disabled";
                };
 
-               uart3: uart@130000 {
+               uart3: serial@130000 {
                        device_type = "serial";
                        compatible = "snps,dw-apb-uart";
                        reg = <0x00130000 0x1000>;
index 773d9ab..cbcc01a 100644 (file)
                interrupts = <7 IRQ_TYPE_LEVEL_LOW>;
                reg = <0x66>;
                samsung,s2mps11-wrstbi-ground;
+               wakeup-source;
 
                s2mps13_osc: clocks {
                        compatible = "samsung,s2mps13-clk";
index 44890d5..25806c4 100644 (file)
@@ -41,6 +41,7 @@ dtb-$(CONFIG_ARCH_MXC) += imx8mm-var-som-symphony.dtb
 dtb-$(CONFIG_ARCH_MXC) += imx8mm-venice-gw71xx-0x.dtb
 dtb-$(CONFIG_ARCH_MXC) += imx8mm-venice-gw72xx-0x.dtb
 dtb-$(CONFIG_ARCH_MXC) += imx8mm-venice-gw73xx-0x.dtb
+dtb-$(CONFIG_ARCH_MXC) += imx8mm-venice-gw7901.dtb
 dtb-$(CONFIG_ARCH_MXC) += imx8mn-beacon-kit.dtb
 dtb-$(CONFIG_ARCH_MXC) += imx8mn-evk.dtb
 dtb-$(CONFIG_ARCH_MXC) += imx8mn-ddr4-evk.dtb
index 6290e2f..e856258 100644 (file)
        status = "okay";
 };
 
+&pcie1 {
+       status = "okay";
+};
+
 &qspi {
        status = "okay";
 
index 9058cfa..50a72cd 100644 (file)
                                             "fsl,sec-v4.0-rtic";
                                #address-cells = <1>;
                                #size-cells = <1>;
-                               reg = <0x60000 0x100 0x60e00 0x18>;
+                               reg = <0x60000 0x100>, <0x60e00 0x18>;
                                ranges = <0x0 0x60100 0x500>;
 
                                rtic_a: rtic-a@0 {
                                        compatible = "fsl,sec-v5.4-rtic-memory",
                                                     "fsl,sec-v5.0-rtic-memory",
                                                     "fsl,sec-v4.0-rtic-memory";
-                                       reg = <0x00 0x20 0x100 0x100>;
+                                       reg = <0x00 0x20>, <0x100 0x100>;
                                };
 
                                rtic_b: rtic-b@20 {
                                        compatible = "fsl,sec-v5.4-rtic-memory",
                                                     "fsl,sec-v5.0-rtic-memory",
                                                     "fsl,sec-v4.0-rtic-memory";
-                                       reg = <0x20 0x20 0x200 0x100>;
+                                       reg = <0x20 0x20>, <0x200 0x100>;
                                };
 
                                rtic_c: rtic-c@40 {
                                        compatible = "fsl,sec-v5.4-rtic-memory",
                                                     "fsl,sec-v5.0-rtic-memory",
                                                     "fsl,sec-v4.0-rtic-memory";
-                                       reg = <0x40 0x20 0x300 0x100>;
+                                       reg = <0x40 0x20>, <0x300 0x100>;
                                };
 
                                rtic_d: rtic-d@60 {
                                        compatible = "fsl,sec-v5.4-rtic-memory",
                                                     "fsl,sec-v5.0-rtic-memory",
                                                     "fsl,sec-v4.0-rtic-memory";
-                                       reg = <0x60 0x20 0x400 0x100>;
+                                       reg = <0x60 0x20>, <0x400 0x100>;
                                };
                        };
                };
 
                pcie1: pcie@3400000 {
                        compatible = "fsl,ls1012a-pcie";
-                       reg = <0x00 0x03400000 0x0 0x00100000   /* controller registers */
-                              0x40 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03400000 0x0 0x00100000>, /* controller registers */
+                             <0x40 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "regs", "config";
                        interrupts = <0 118 0x4>, /* controller interrupt */
                                     <0 117 0x4>; /* PME interrupt */
index 9322c6a..d7b5272 100644 (file)
        status = "okay";
 };
 
+&optee {
+       status = "okay";
+};
+
 &sai4 {
        status = "okay";
 };
index eca06a0..2fe1245 100644 (file)
@@ -88,7 +88,7 @@
        };
 
        firmware {
-               optee {
+               optee: optee  {
                        compatible = "linaro,optee-tz";
                        method = "smc";
                        status = "disabled";
 
                pcie1: pcie@3400000 {
                        compatible = "fsl,ls1028a-pcie";
-                       reg = <0x00 0x03400000 0x0 0x00100000   /* controller registers */
-                              0x80 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03400000 0x0 0x00100000>, /* controller registers */
+                             <0x80 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "regs", "config";
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */
                                     <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>; /* aer interrupt */
 
                pcie2: pcie@3500000 {
                        compatible = "fsl,ls1028a-pcie";
-                       reg = <0x00 0x03500000 0x0 0x00100000   /* controller registers */
-                              0x88 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03500000 0x0 0x00100000>, /* controller registers */
+                             <0x88 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "regs", "config";
                        interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>;
                        msi-map = <0 &its 0x17 0xe>;
                        iommu-map = <0 &smmu 0x17 0xe>;
                                  /* PF0-6 BAR0 - non-prefetchable memory */
-                       ranges = <0x82000000 0x0 0x00000000  0x1 0xf8000000  0x0 0x160000
+                       ranges = <0x82000000 0x1 0xf8000000  0x1 0xf8000000  0x0 0x160000
                                  /* PF0-6 BAR2 - prefetchable memory */
-                                 0xc2000000 0x0 0x00000000  0x1 0xf8160000  0x0 0x070000
+                                 0xc2000000 0x1 0xf8160000  0x1 0xf8160000  0x0 0x070000
                                  /* PF0: VF0-1 BAR0 - non-prefetchable memory */
-                                 0x82000000 0x0 0x00000000  0x1 0xf81d0000  0x0 0x020000
+                                 0x82000000 0x1 0xf81d0000  0x1 0xf81d0000  0x0 0x020000
                                  /* PF0: VF0-1 BAR2 - prefetchable memory */
-                                 0xc2000000 0x0 0x00000000  0x1 0xf81f0000  0x0 0x020000
+                                 0xc2000000 0x1 0xf81f0000  0x1 0xf81f0000  0x0 0x020000
                                  /* PF1: VF0-1 BAR0 - non-prefetchable memory */
-                                 0x82000000 0x0 0x00000000  0x1 0xf8210000  0x0 0x020000
+                                 0x82000000 0x1 0xf8210000  0x1 0xf8210000  0x0 0x020000
                                  /* PF1: VF0-1 BAR2 - prefetchable memory */
-                                 0xc2000000 0x0 0x00000000  0x1 0xf8230000  0x0 0x020000
+                                 0xc2000000 0x1 0xf8230000  0x1 0xf8230000  0x0 0x020000
                                  /* BAR4 (PF5) - non-prefetchable memory */
-                                 0x82000000 0x0 0x00000000  0x1 0xfc000000  0x0 0x400000>;
+                                 0x82000000 0x1 0xfc000000  0x1 0xfc000000  0x0 0x400000>;
 
                        enetc_port0: ethernet@0,0 {
                                compatible = "fsl,enetc";
index 28c51e5..01b01e3 100644 (file)
 
                pcie1: pcie@3400000 {
                        compatible = "fsl,ls1043a-pcie";
-                       reg = <0x00 0x03400000 0x0 0x00100000   /* controller registers */
-                              0x40 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03400000 0x0 0x00100000>, /* controller registers */
+                             <0x40 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "regs", "config";
                        interrupts = <0 118 0x4>, /* controller interrupt */
                                     <0 117 0x4>; /* PME interrupt */
 
                pcie2: pcie@3500000 {
                        compatible = "fsl,ls1043a-pcie";
-                       reg = <0x00 0x03500000 0x0 0x00100000   /* controller registers */
-                              0x48 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03500000 0x0 0x00100000>, /* controller registers */
+                             <0x48 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "regs", "config";
                        interrupts = <0 128 0x4>,
                                     <0 127 0x4>;
 
                pcie3: pcie@3600000 {
                        compatible = "fsl,ls1043a-pcie";
-                       reg = <0x00 0x03600000 0x0 0x00100000   /* controller registers */
-                              0x50 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03600000 0x0 0x00100000>, /* controller registers */
+                             <0x50 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "regs", "config";
                        interrupts = <0 162 0x4>,
                                     <0 161 0x4>;
index 3945830..687fea6 100644 (file)
 
                pcie1: pcie@3400000 {
                        compatible = "fsl,ls1046a-pcie";
-                       reg = <0x00 0x03400000 0x0 0x00100000   /* controller registers */
-                              0x40 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03400000 0x0 0x00100000>, /* controller registers */
+                             <0x40 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "regs", "config";
                        interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>, /* controller interrupt */
                                     <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>; /* PME interrupt */
 
                pcie_ep1: pcie_ep@3400000 {
                        compatible = "fsl,ls1046a-pcie-ep","fsl,ls-pcie-ep";
-                       reg = <0x00 0x03400000 0x0 0x00100000
-                               0x40 0x00000000 0x8 0x00000000>;
+                       reg = <0x00 0x03400000 0x0 0x00100000>,
+                             <0x40 0x00000000 0x8 0x00000000>;
                        reg-names = "regs", "addr_space";
                        num-ib-windows = <6>;
                        num-ob-windows = <8>;
 
                pcie2: pcie@3500000 {
                        compatible = "fsl,ls1046a-pcie";
-                       reg = <0x00 0x03500000 0x0 0x00100000   /* controller registers */
-                              0x48 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03500000 0x0 0x00100000>, /* controller registers */
+                             <0x48 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "regs", "config";
                        interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>, /* controller interrupt */
                                     <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>; /* PME interrupt */
 
                pcie_ep2: pcie_ep@3500000 {
                        compatible = "fsl,ls1046a-pcie-ep","fsl,ls-pcie-ep";
-                       reg = <0x00 0x03500000 0x0 0x00100000
-                               0x48 0x00000000 0x8 0x00000000>;
+                       reg = <0x00 0x03500000 0x0 0x00100000>,
+                             <0x48 0x00000000 0x8 0x00000000>;
                        reg-names = "regs", "addr_space";
                        num-ib-windows = <6>;
                        num-ob-windows = <8>;
 
                pcie3: pcie@3600000 {
                        compatible = "fsl,ls1046a-pcie";
-                       reg = <0x00 0x03600000 0x0 0x00100000   /* controller registers */
-                              0x50 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03600000 0x0 0x00100000>, /* controller registers */
+                             <0x50 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "regs", "config";
                        interrupts = <GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>, /* controller interrupt */
                                     <GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>; /* PME interrupt */
 
                pcie_ep3: pcie_ep@3600000 {
                        compatible = "fsl,ls1046a-pcie-ep", "fsl,ls-pcie-ep";
-                       reg = <0x00 0x03600000 0x0 0x00100000
-                               0x50 0x00000000 0x8 0x00000000>;
+                       reg = <0x00 0x03600000 0x0 0x00100000>,
+                             <0x50 0x00000000 0x8 0x00000000>;
                        reg-names = "regs", "addr_space";
                        num-ib-windows = <6>;
                        num-ob-windows = <8>;
index 8ffbc9f..2fa6cfb 100644 (file)
 
                pcie1: pcie@3400000 {
                        compatible = "fsl,ls1088a-pcie";
-                       reg = <0x00 0x03400000 0x0 0x00100000   /* controller registers */
-                              0x20 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03400000 0x0 0x00100000>, /* controller registers */
+                             <0x20 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "regs", "config";
                        interrupts = <0 108 IRQ_TYPE_LEVEL_HIGH>; /* aer interrupt */
                        interrupt-names = "aer";
 
                pcie_ep1: pcie-ep@3400000 {
                        compatible = "fsl,ls1088a-pcie-ep", "fsl,ls-pcie-ep";
-                       reg = <0x00 0x03400000 0x0 0x00100000
-                              0x20 0x00000000 0x8 0x00000000>;
+                       reg = <0x00 0x03400000 0x0 0x00100000>,
+                             <0x20 0x00000000 0x8 0x00000000>;
                        reg-names = "regs", "addr_space";
                        num-ib-windows = <24>;
                        num-ob-windows = <256>;
 
                pcie2: pcie@3500000 {
                        compatible = "fsl,ls1088a-pcie";
-                       reg = <0x00 0x03500000 0x0 0x00100000   /* controller registers */
-                              0x28 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03500000 0x0 0x00100000>, /* controller registers */
+                             <0x28 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "regs", "config";
                        interrupts = <0 113 IRQ_TYPE_LEVEL_HIGH>; /* aer interrupt */
                        interrupt-names = "aer";
 
                pcie_ep2: pcie-ep@3500000 {
                        compatible = "fsl,ls1088a-pcie-ep", "fsl,ls-pcie-ep";
-                       reg = <0x00 0x03500000 0x0 0x00100000
-                              0x28 0x00000000 0x8 0x00000000>;
+                       reg = <0x00 0x03500000 0x0 0x00100000>,
+                             <0x28 0x00000000 0x8 0x00000000>;
                        reg-names = "regs", "addr_space";
                        num-ib-windows = <6>;
                        num-ob-windows = <6>;
 
                pcie3: pcie@3600000 {
                        compatible = "fsl,ls1088a-pcie";
-                       reg = <0x00 0x03600000 0x0 0x00100000   /* controller registers */
-                              0x30 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03600000 0x0 0x00100000>, /* controller registers */
+                             <0x30 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "regs", "config";
                        interrupts = <0 118 IRQ_TYPE_LEVEL_HIGH>; /* aer interrupt */
                        interrupt-names = "aer";
 
                pcie_ep3: pcie-ep@3600000 {
                        compatible = "fsl,ls1088a-pcie-ep", "fsl,ls-pcie-ep";
-                       reg = <0x00 0x03600000 0x0 0x00100000
-                              0x30 0x00000000 0x8 0x00000000>;
+                       reg = <0x00 0x03600000 0x0 0x00100000>,
+                             <0x30 0x00000000 0x8 0x00000000>;
                        reg-names = "regs", "addr_space";
                        num-ib-windows = <6>;
                        num-ob-windows = <6>;
index 76ab68d..6f6667b 100644 (file)
 };
 
 &pcie1 {
-       reg = <0x00 0x03400000 0x0 0x00100000   /* controller registers */
-              0x10 0x00000000 0x0 0x00002000>; /* configuration space */
+       reg = <0x00 0x03400000 0x0 0x00100000>, /* controller registers */
+             <0x10 0x00000000 0x0 0x00002000>; /* configuration space */
 
        ranges = <0x81000000 0x0 0x00000000 0x10 0x00010000 0x0 0x00010000   /* downstream I/O */
                  0x82000000 0x0 0x40000000 0x10 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
 };
 
 &pcie2 {
-       reg = <0x00 0x03500000 0x0 0x00100000   /* controller registers */
-              0x12 0x00000000 0x0 0x00002000>; /* configuration space */
+       reg = <0x00 0x03500000 0x0 0x00100000>, /* controller registers */
+             <0x12 0x00000000 0x0 0x00002000>; /* configuration space */
 
        ranges = <0x81000000 0x0 0x00000000 0x12 0x00010000 0x0 0x00010000   /* downstream I/O */
                  0x82000000 0x0 0x40000000 0x12 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
 };
 
 &pcie3 {
-       reg = <0x00 0x03600000 0x0 0x00100000   /* controller registers */
-              0x14 0x00000000 0x0 0x00002000>; /* configuration space */
+       reg = <0x00 0x03600000 0x0 0x00100000>, /* controller registers */
+             <0x14 0x00000000 0x0 0x00002000>; /* configuration space */
 
        ranges = <0x81000000 0x0 0x00000000 0x14 0x00010000 0x0 0x00010000   /* downstream I/O */
                  0x82000000 0x0 0x40000000 0x14 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
 };
 
 &pcie4 {
-       reg = <0x00 0x03700000 0x0 0x00100000   /* controller registers */
-              0x16 0x00000000 0x0 0x00002000>; /* configuration space */
+       reg = <0x00 0x03700000 0x0 0x00100000>, /* controller registers */
+             <0x16 0x00000000 0x0 0x00002000>; /* configuration space */
 
        ranges = <0x81000000 0x0 0x00000000 0x16 0x00010000 0x0 0x00010000   /* downstream I/O */
                  0x82000000 0x0 0x40000000 0x16 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
index da24dc1..c3dc381 100644 (file)
 
 &pcie1 {
        compatible = "fsl,ls2088a-pcie";
-       reg = <0x00 0x03400000 0x0 0x00100000   /* controller registers */
-              0x20 0x00000000 0x0 0x00002000>; /* configuration space */
+       reg = <0x00 0x03400000 0x0 0x00100000>, /* controller registers */
+             <0x20 0x00000000 0x0 0x00002000>; /* configuration space */
 
        ranges = <0x81000000 0x0 0x00000000 0x20 0x00010000 0x0 0x00010000
                  0x82000000 0x0 0x40000000 0x20 0x40000000 0x0 0x40000000>;
 
 &pcie2 {
        compatible = "fsl,ls2088a-pcie";
-       reg = <0x00 0x03500000 0x0 0x00100000   /* controller registers */
-              0x28 0x00000000 0x0 0x00002000>; /* configuration space */
+       reg = <0x00 0x03500000 0x0 0x00100000>, /* controller registers */
+             <0x28 0x00000000 0x0 0x00002000>; /* configuration space */
 
        ranges = <0x81000000 0x0 0x00000000 0x28 0x00010000 0x0 0x00010000
                  0x82000000 0x0 0x40000000 0x28 0x40000000 0x0 0x40000000>;
 
 &pcie3 {
        compatible = "fsl,ls2088a-pcie";
-       reg = <0x00 0x03600000 0x0 0x00100000   /* controller registers */
-              0x30 0x00000000 0x0 0x00002000>; /* configuration space */
+       reg = <0x00 0x03600000 0x0 0x00100000>, /* controller registers */
+             <0x30 0x00000000 0x0 0x00002000>; /* configuration space */
 
        ranges = <0x81000000 0x0 0x00000000 0x30 0x00010000 0x0 0x00010000
                  0x82000000 0x0 0x40000000 0x30 0x40000000 0x0 0x40000000>;
 
 &pcie4 {
        compatible = "fsl,ls2088a-pcie";
-       reg = <0x00 0x03700000 0x0 0x00100000   /* controller registers */
-              0x38 0x00000000 0x0 0x00002000>; /* configuration space */
+       reg = <0x00 0x03700000 0x0 0x00100000>, /* controller registers */
+             <0x38 0x00000000 0x0 0x00002000>; /* configuration space */
 
        ranges = <0x81000000 0x0 0x00000000 0x38 0x00010000 0x0 0x00010000
                  0x82000000 0x0 0x40000000 0x38 0x40000000 0x0 0x40000000>;
index 135ac82..801ba96 100644 (file)
                                            QORIQ_CLK_PLL_DIV(4)>;
                        clock-names = "dspi";
                        spi-num-chipselects = <5>;
-                       bus-num = <0>;
                };
 
                esdhc: esdhc@2140000 {
index 0551f6f..c4b1a59 100644 (file)
 
                pcie1: pcie@3400000 {
                        compatible = "fsl,lx2160a-pcie";
-                       reg = <0x00 0x03400000 0x0 0x00100000   /* controller registers */
-                              0x80 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03400000 0x0 0x00100000>, /* controller registers */
+                             <0x80 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "csr_axi_slave", "config_axi_slave";
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>, /* AER interrupt */
                                     <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */
 
                pcie2: pcie@3500000 {
                        compatible = "fsl,lx2160a-pcie";
-                       reg = <0x00 0x03500000 0x0 0x00100000   /* controller registers */
-                              0x88 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03500000 0x0 0x00100000>, /* controller registers */
+                             <0x88 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "csr_axi_slave", "config_axi_slave";
                        interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>, /* AER interrupt */
                                     <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */
 
                pcie3: pcie@3600000 {
                        compatible = "fsl,lx2160a-pcie";
-                       reg = <0x00 0x03600000 0x0 0x00100000   /* controller registers */
-                              0x90 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03600000 0x0 0x00100000>, /* controller registers */
+                             <0x90 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "csr_axi_slave", "config_axi_slave";
                        interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>, /* AER interrupt */
                                     <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */
 
                pcie4: pcie@3700000 {
                        compatible = "fsl,lx2160a-pcie";
-                       reg = <0x00 0x03700000 0x0 0x00100000   /* controller registers */
-                              0x98 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03700000 0x0 0x00100000>, /* controller registers */
+                             <0x98 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "csr_axi_slave", "config_axi_slave";
                        interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>, /* AER interrupt */
                                     <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */
 
                pcie5: pcie@3800000 {
                        compatible = "fsl,lx2160a-pcie";
-                       reg = <0x00 0x03800000 0x0 0x00100000   /* controller registers */
-                              0xa0 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03800000 0x0 0x00100000>, /* controller registers */
+                             <0xa0 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "csr_axi_slave", "config_axi_slave";
                        interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>, /* AER interrupt */
                                     <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */
 
                pcie6: pcie@3900000 {
                        compatible = "fsl,lx2160a-pcie";
-                       reg = <0x00 0x03900000 0x0 0x00100000   /* controller registers */
-                              0xa8 0x00000000 0x0 0x00002000>; /* configuration space */
+                       reg = <0x00 0x03900000 0x0 0x00100000>, /* controller registers */
+                             <0xa8 0x00000000 0x0 0x00002000>; /* configuration space */
                        reg-names = "csr_axi_slave", "config_axi_slave";
                        interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>, /* AER interrupt */
                                     <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */
index e1e81ca..a79f42a 100644 (file)
@@ -77,9 +77,12 @@ conn_subsys: bus@5b000000 {
                             <GIC_SPI 259 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&enet0_lpcg IMX_LPCG_CLK_4>,
                         <&enet0_lpcg IMX_LPCG_CLK_2>,
-                        <&enet0_lpcg IMX_LPCG_CLK_1>,
+                        <&enet0_lpcg IMX_LPCG_CLK_3>,
                         <&enet0_lpcg IMX_LPCG_CLK_0>;
                clock-names = "ipg", "ahb", "enet_clk_ref", "ptp";
+               assigned-clocks = <&clk IMX_SC_R_ENET_0 IMX_SC_PM_CLK_PER>,
+                                 <&clk IMX_SC_R_ENET_0 IMX_SC_C_CLKDIV>;
+               assigned-clock-rates = <250000000>, <125000000>;
                fsl,num-tx-queues=<3>;
                fsl,num-rx-queues=<3>;
                power-domains = <&pd IMX_SC_R_ENET_0>;
@@ -94,9 +97,12 @@ conn_subsys: bus@5b000000 {
                                <GIC_SPI 263 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&enet1_lpcg IMX_LPCG_CLK_4>,
                         <&enet1_lpcg IMX_LPCG_CLK_2>,
-                        <&enet1_lpcg IMX_LPCG_CLK_1>,
+                        <&enet1_lpcg IMX_LPCG_CLK_3>,
                         <&enet1_lpcg IMX_LPCG_CLK_0>;
                clock-names = "ipg", "ahb", "enet_clk_ref", "ptp";
+               assigned-clocks = <&clk IMX_SC_R_ENET_1 IMX_SC_PM_CLK_PER>,
+                                 <&clk IMX_SC_R_ENET_1 IMX_SC_C_CLKDIV>;
+               assigned-clock-rates = <250000000>, <125000000>;
                fsl,num-tx-queues=<3>;
                fsl,num-rx-queues=<3>;
                power-domains = <&pd IMX_SC_R_ENET_1>;
@@ -152,15 +158,19 @@ conn_subsys: bus@5b000000 {
                #clock-cells = <1>;
                clocks = <&clk IMX_SC_R_ENET_0 IMX_SC_PM_CLK_PER>,
                         <&clk IMX_SC_R_ENET_0 IMX_SC_PM_CLK_PER>,
-                        <&conn_axi_clk>, <&conn_ipg_clk>, <&conn_ipg_clk>;
+                        <&conn_axi_clk>,
+                        <&clk IMX_SC_R_ENET_0 IMX_SC_C_TXCLK>,
+                        <&conn_ipg_clk>,
+                        <&conn_ipg_clk>;
                clock-indices = <IMX_LPCG_CLK_0>, <IMX_LPCG_CLK_1>,
-                               <IMX_LPCG_CLK_2>, <IMX_LPCG_CLK_4>,
-                               <IMX_LPCG_CLK_5>;
-               clock-output-names = "enet0_ipg_root_clk",
-                                    "enet0_tx_clk",
-                                    "enet0_ahb_clk",
-                                    "enet0_ipg_clk",
-                                    "enet0_ipg_s_clk";
+                               <IMX_LPCG_CLK_2>, <IMX_LPCG_CLK_3>,
+                               <IMX_LPCG_CLK_4>, <IMX_LPCG_CLK_5>;
+               clock-output-names = "enet0_lpcg_timer_clk",
+                                    "enet0_lpcg_txc_sampling_clk",
+                                    "enet0_lpcg_ahb_clk",
+                                    "enet0_lpcg_rgmii_txc_clk",
+                                    "enet0_lpcg_ipg_clk",
+                                    "enet0_lpcg_ipg_s_clk";
                power-domains = <&pd IMX_SC_R_ENET_0>;
        };
 
@@ -170,15 +180,19 @@ conn_subsys: bus@5b000000 {
                #clock-cells = <1>;
                clocks = <&clk IMX_SC_R_ENET_1 IMX_SC_PM_CLK_PER>,
                         <&clk IMX_SC_R_ENET_1 IMX_SC_PM_CLK_PER>,
-                        <&conn_axi_clk>, <&conn_ipg_clk>, <&conn_ipg_clk>;
+                        <&conn_axi_clk>,
+                        <&clk IMX_SC_R_ENET_1 IMX_SC_C_TXCLK>,
+                        <&conn_ipg_clk>,
+                        <&conn_ipg_clk>;
                clock-indices = <IMX_LPCG_CLK_0>, <IMX_LPCG_CLK_1>,
-                               <IMX_LPCG_CLK_2>, <IMX_LPCG_CLK_4>,
-                               <IMX_LPCG_CLK_5>;
-               clock-output-names = "enet1_ipg_root_clk",
-                                    "enet1_tx_clk",
-                                    "enet1_ahb_clk",
-                                    "enet1_ipg_clk",
-                                    "enet1_ipg_s_clk";
+                               <IMX_LPCG_CLK_2>, <IMX_LPCG_CLK_3>,
+                               <IMX_LPCG_CLK_4>, <IMX_LPCG_CLK_5>;
+               clock-output-names = "enet1_lpcg_timer_clk",
+                                    "enet1_lpcg_txc_sampling_clk",
+                                    "enet1_lpcg_ahb_clk",
+                                    "enet1_lpcg_rgmii_txc_clk",
+                                    "enet1_lpcg_ipg_clk",
+                                    "enet1_lpcg_ipg_s_clk";
                power-domains = <&pd IMX_SC_R_ENET_1>;
        };
 };
index 6518f08..e033d02 100644 (file)
        srp-disable;
        adp-disable;
        usb-role-switch;
+       disable-over-current;
        samsung,picophy-pre-emp-curr-control = <3>;
        samsung,picophy-dc-vol-level-adjust = <7>;
        status = "okay";
diff --git a/arch/arm64/boot/dts/freescale/imx8mm-venice-gw7901.dts b/arch/arm64/boot/dts/freescale/imx8mm-venice-gw7901.dts
new file mode 100644 (file)
index 0000000..5a1e9df
--- /dev/null
@@ -0,0 +1,1019 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright 2020 Gateworks Corporation
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/linux-event-codes.h>
+#include <dt-bindings/leds/common.h>
+
+#include "imx8mm.dtsi"
+
+/ {
+       model = "Gateworks Venice GW7901 i.MX8MM board";
+       compatible = "gw,imx8mm-gw7901", "fsl,imx8mm";
+
+       aliases {
+               ethernet0 = &fec1;
+               ethernet1 = &lan1;
+               ethernet2 = &lan2;
+               ethernet3 = &lan3;
+               ethernet4 = &lan4;
+               usb0 = &usbotg1;
+               usb1 = &usbotg2;
+       };
+
+       chosen {
+               stdout-path = &uart2;
+       };
+
+       memory@40000000 {
+               device_type = "memory";
+               reg = <0x0 0x40000000 0 0x80000000>;
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               user-pb {
+                       label = "user_pb";
+                       gpios = <&gpio 2 GPIO_ACTIVE_LOW>;
+                       linux,code = <BTN_0>;
+               };
+
+               user-pb1x {
+                       label = "user_pb1x";
+                       linux,code = <BTN_1>;
+                       interrupt-parent = <&gsc>;
+                       interrupts = <0>;
+               };
+
+               key-erased {
+                       label = "key_erased";
+                       linux,code = <BTN_2>;
+                       interrupt-parent = <&gsc>;
+                       interrupts = <1>;
+               };
+
+               eeprom-wp {
+                       label = "eeprom_wp";
+                       linux,code = <BTN_3>;
+                       interrupt-parent = <&gsc>;
+                       interrupts = <2>;
+               };
+
+               tamper {
+                       label = "tamper";
+                       linux,code = <BTN_4>;
+                       interrupt-parent = <&gsc>;
+                       interrupts = <5>;
+               };
+
+               switch-hold {
+                       label = "switch_hold";
+                       linux,code = <BTN_5>;
+                       interrupt-parent = <&gsc>;
+                       interrupts = <7>;
+               };
+       };
+
+       led-controller {
+               compatible = "gpio-leds";
+
+               led-0 {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_RED>;
+                       label = "led01_red";
+                       gpios = <&leds_gpio 0 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-1 {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_GREEN>;
+                       label = "led01_grn";
+                       gpios = <&leds_gpio 1 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-2 {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_RED>;
+                       label = "led02_red";
+                       gpios = <&leds_gpio 2 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-3 {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_GREEN>;
+                       label = "led02_grn";
+                       gpios = <&leds_gpio 3 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-4 {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_RED>;
+                       label = "led03_red";
+                       gpios = <&leds_gpio 4 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-5 {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_GREEN>;
+                       label = "led03_grn";
+                       gpios = <&leds_gpio 5 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-6 {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_RED>;
+                       label = "led04_red";
+                       gpios = <&leds_gpio 8 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-7 {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_GREEN>;
+                       label = "led04_grn";
+                       gpios = <&leds_gpio 9 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-8 {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_RED>;
+                       label = "led05_red";
+                       gpios = <&leds_gpio 10 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-9 {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_GREEN>;
+                       label = "led05_grn";
+                       gpios = <&leds_gpio 11 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-a {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_RED>;
+                       label = "led06_red";
+                       gpios = <&leds_gpio 12 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-b {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_GREEN>;
+                       label = "led06_grn";
+                       gpios = <&leds_gpio 13 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+       };
+
+       reg_3p3v: regulator-3p3v {
+               compatible = "regulator-fixed";
+               regulator-name = "3P3V";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
+       regulator-ioexp {
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_reg_ioexp>;
+               compatible = "regulator-fixed";
+               regulator-name = "ioexp";
+               gpio = <&gpio4 21 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               startup-delay-us = <100>;
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+       };
+
+       regulator-isouart {
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_reg_isouart>;
+               compatible = "regulator-fixed";
+               regulator-name = "iso_uart";
+               gpio = <&gpio1 13 GPIO_ACTIVE_LOW>;
+               startup-delay-us = <100>;
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+       };
+
+       reg_usb2_vbus: regulator-usb2 {
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_reg_usb2>;
+               compatible = "regulator-fixed";
+               regulator-name = "usb_usb2_vbus";
+               gpio = <&gpio4 17 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+       };
+
+       reg_wifi: regulator-wifi {
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_reg_wl>;
+               compatible = "regulator-fixed";
+               regulator-name = "wifi";
+               gpio = <&gpio3 25 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               startup-delay-us = <100>;
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+};
+
+&ddrc {
+       operating-points-v2 = <&ddrc_opp_table>;
+
+       ddrc_opp_table: opp-table {
+               compatible = "operating-points-v2";
+
+               opp-25M {
+                       opp-hz = /bits/ 64 <25000000>;
+               };
+
+               opp-100M {
+                       opp-hz = /bits/ 64 <100000000>;
+               };
+
+               opp-750M {
+                       opp-hz = /bits/ 64 <750000000>;
+               };
+       };
+};
+
+&ecspi1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_spi1>;
+       cs-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;
+       status = "okay";
+
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               reg = <0>;
+               spi-max-frequency = <40000000>;
+               status = "okay";
+       };
+};
+
+&fec1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_fec1>;
+       phy-mode = "rgmii-id";
+       local-mac-address = [00 00 00 00 00 00];
+       status = "okay";
+
+       fixed-link {
+               speed = <1000>;
+               full-duplex;
+       };
+};
+
+&i2c1 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       status = "okay";
+
+       gsc: gsc@20 {
+               compatible = "gw,gsc";
+               reg = <0x20>;
+               pinctrl-0 = <&pinctrl_gsc>;
+               interrupt-parent = <&gpio4>;
+               interrupts = <16 IRQ_TYPE_EDGE_FALLING>;
+               interrupt-controller;
+               #interrupt-cells = <1>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               adc {
+                       compatible = "gw,gsc-adc";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       channel@6 {
+                               gw,mode = <0>;
+                               reg = <0x06>;
+                               label = "temp";
+                       };
+
+                       channel@8 {
+                               gw,mode = <1>;
+                               reg = <0x08>;
+                               label = "vdd_bat";
+                       };
+
+                       channel@82 {
+                               gw,mode = <2>;
+                               reg = <0x82>;
+                               label = "vin_aux1";
+                               gw,voltage-divider-ohms = <22100 1000>;
+                       };
+
+                       channel@84 {
+                               gw,mode = <2>;
+                               reg = <0x84>;
+                               label = "vin_aux2";
+                               gw,voltage-divider-ohms = <22100 1000>;
+                       };
+
+                       channel@86 {
+                               gw,mode = <2>;
+                               reg = <0x86>;
+                               label = "vdd_vin";
+                               gw,voltage-divider-ohms = <22100 1000>;
+                       };
+
+                       channel@88 {
+                               gw,mode = <2>;
+                               reg = <0x88>;
+                               label = "vdd_3p3";
+                               gw,voltage-divider-ohms = <10000 10000>;
+                       };
+
+                       channel@8c {
+                               gw,mode = <2>;
+                               reg = <0x8c>;
+                               label = "vdd_2p5";
+                               gw,voltage-divider-ohms = <10000 10000>;
+                       };
+
+                       channel@8e {
+                               gw,mode = <2>;
+                               reg = <0x8e>;
+                               label = "vdd_0p95";
+                       };
+
+                       channel@90 {
+                               gw,mode = <2>;
+                               reg = <0x90>;
+                               label = "vdd_soc";
+                       };
+
+                       channel@92 {
+                               gw,mode = <2>;
+                               reg = <0x92>;
+                               label = "vdd_arm";
+                       };
+
+                       channel@98 {
+                               gw,mode = <2>;
+                               reg = <0x98>;
+                               label = "vdd_1p8";
+                       };
+
+                       channel@9a {
+                               gw,mode = <2>;
+                               reg = <0x9a>;
+                               label = "vdd_1p2";
+                       };
+
+                       channel@9c {
+                               gw,mode = <2>;
+                               reg = <0x9c>;
+                               label = "vdd_dram";
+                       };
+
+                       channel@a2 {
+                               gw,mode = <2>;
+                               reg = <0xa2>;
+                               label = "vdd_gsc";
+                               gw,voltage-divider-ohms = <10000 10000>;
+                       };
+               };
+       };
+
+       gpio: gpio@23 {
+               compatible = "nxp,pca9555";
+               reg = <0x23>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               interrupt-parent = <&gsc>;
+               interrupts = <4>;
+       };
+
+       eeprom@50 {
+               compatible = "atmel,24c02";
+               reg = <0x50>;
+               pagesize = <16>;
+       };
+
+       eeprom@51 {
+               compatible = "atmel,24c02";
+               reg = <0x51>;
+               pagesize = <16>;
+       };
+
+       eeprom@52 {
+               compatible = "atmel,24c02";
+               reg = <0x52>;
+               pagesize = <16>;
+       };
+
+       eeprom@53 {
+               compatible = "atmel,24c02";
+               reg = <0x53>;
+               pagesize = <16>;
+       };
+
+       rtc@68 {
+               compatible = "dallas,ds1672";
+               reg = <0x68>;
+       };
+};
+
+&i2c2 {
+       clock-frequency = <400000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       status = "okay";
+
+       pmic@4b {
+               compatible = "rohm,bd71847";
+               reg = <0x4b>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_pmic>;
+               interrupt-parent = <&gpio3>;
+               interrupts = <20 IRQ_TYPE_LEVEL_LOW>;
+               rohm,reset-snvs-powered;
+               #clock-cells = <0>;
+               clocks = <&osc_32k 0>;
+               clock-output-names = "clk-32k-out";
+
+               regulators {
+                       /* vdd_soc: 0.805-0.900V (typ=0.8V) */
+                       BUCK1 {
+                               regulator-name = "buck1";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <1250>;
+                       };
+
+                       /* vdd_arm: 0.805-1.0V (typ=0.9V) */
+                       BUCK2 {
+                               regulator-name = "buck2";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <1250>;
+                               rohm,dvs-run-voltage = <1000000>;
+                               rohm,dvs-idle-voltage = <900000>;
+                       };
+
+                       /* vdd_0p9: 0.805-1.0V (typ=0.9V) */
+                       BUCK3 {
+                               regulator-name = "buck3";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1350000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       /* vdd_3p3 */
+                       BUCK4 {
+                               regulator-name = "buck4";
+                               regulator-min-microvolt = <3000000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       /* vdd_1p8 */
+                       BUCK5 {
+                               regulator-name = "buck5";
+                               regulator-min-microvolt = <1605000>;
+                               regulator-max-microvolt = <1995000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       /* vdd_dram */
+                       BUCK6 {
+                               regulator-name = "buck6";
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1400000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       /* nvcc_snvs_1p8 */
+                       LDO1 {
+                               regulator-name = "ldo1";
+                               regulator-min-microvolt = <1600000>;
+                               regulator-max-microvolt = <1900000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       /* vdd_snvs_0p8 */
+                       LDO2 {
+                               regulator-name = "ldo2";
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <900000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       /* vdda_1p8 */
+                       LDO3 {
+                               regulator-name = "ldo3";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       LDO4 {
+                               regulator-name = "ldo4";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       LDO6 {
+                               regulator-name = "ldo6";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+               };
+       };
+};
+
+&i2c3 {
+       clock-frequency = <400000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c3>;
+       status = "okay";
+
+       leds_gpio: gpio@20 {
+               compatible = "nxp,pca9555";
+               reg = <0x20>;
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+
+       switch: switch@5f {
+               compatible = "microchip,ksz9897";
+               reg = <0x5f>;
+               pinctrl-0 = <&pinctrl_ksz>;
+               interrupt-parent = <&gpio4>;
+               interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
+               phy-mode = "rgmii-id";
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       lan1: port@0 {
+                               reg = <0>;
+                               label = "lan1";
+                               local-mac-address = [00 00 00 00 00 00];
+                       };
+
+                       lan2: port@1 {
+                               reg = <1>;
+                               label = "lan2";
+                               local-mac-address = [00 00 00 00 00 00];
+                       };
+
+                       lan3: port@2 {
+                               reg = <2>;
+                               label = "lan3";
+                               local-mac-address = [00 00 00 00 00 00];
+                       };
+
+                       lan4: port@3 {
+                               reg = <3>;
+                               label = "lan4";
+                               local-mac-address = [00 00 00 00 00 00];
+                       };
+
+                       port@5 {
+                               reg = <5>;
+                               label = "cpu";
+                               ethernet = <&fec1>;
+                               phy-mode = "rgmii-id";
+
+                               fixed-link {
+                                       speed = <1000>;
+                                       full-duplex;
+                               };
+                       };
+               };
+       };
+
+       crypto@60 {
+               compatible = "atmel,atecc508a";
+               reg = <0x60>;
+       };
+};
+
+&i2c4 {
+       clock-frequency = <400000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c4>;
+       status = "okay";
+};
+
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart1>, <&pinctrl_uart1_gpio>;
+       rts-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>;
+       cts-gpios = <&gpio1 12 GPIO_ACTIVE_LOW>;
+       dtr-gpios = <&gpio1 14 GPIO_ACTIVE_LOW>;
+       dsr-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
+       dcd-gpios = <&gpio1 11 GPIO_ACTIVE_LOW>;
+       status = "okay";
+};
+
+/* console */
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart2>;
+       status = "okay";
+};
+
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart3>, <&pinctrl_uart3_gpio>;
+       cts-gpios = <&gpio4 10 GPIO_ACTIVE_LOW>;
+       rts-gpios = <&gpio4 9 GPIO_ACTIVE_LOW>;
+       status = "okay";
+};
+
+&uart4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart4>, <&pinctrl_uart4_gpio>;
+       cts-gpios = <&gpio5 11 GPIO_ACTIVE_LOW>;
+       rts-gpios = <&gpio5 12 GPIO_ACTIVE_LOW>;
+       status = "okay";
+};
+
+&usbotg1 {
+       dr_mode = "host";
+       disable-over-current;
+       status = "okay";
+};
+
+&usbotg2 {
+       dr_mode = "host";
+       vbus-supply = <&reg_usb2_vbus>;
+       status = "okay";
+};
+
+/* SDIO WiFi */
+&usdhc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc1>;
+       bus-width = <4>;
+       non-removable;
+       vmmc-supply = <&reg_wifi>;
+       status = "okay";
+};
+
+/* microSD */
+&usdhc2 {
+       pinctrl-names = "default", "state_100mhz", "state_200mhz";
+       pinctrl-0 = <&pinctrl_usdhc2>, <&pinctrl_usdhc2_gpio>;
+       pinctrl-1 = <&pinctrl_usdhc2_100mhz>, <&pinctrl_usdhc2_gpio>;
+       pinctrl-2 = <&pinctrl_usdhc2_200mhz>, <&pinctrl_usdhc2_gpio>;
+       cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>;
+       bus-width = <4>;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+};
+
+/* eMMC */
+&usdhc3 {
+       pinctrl-names = "default", "state_100mhz", "state_200mhz";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
+       pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
+       bus-width = <8>;
+       non-removable;
+       status = "okay";
+};
+
+&wdog1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_wdog>;
+       fsl,ext-reset-output;
+       status = "okay";
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_hog>;
+
+       pinctrl_hog: hoggrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_SPDIF_TX_GPIO5_IO3         0x40000041 /* DIG2_OUT */
+                       MX8MM_IOMUXC_SPDIF_RX_GPIO5_IO4         0x40000041 /* DIG2_IN */
+                       MX8MM_IOMUXC_GPIO1_IO06_GPIO1_IO6       0x40000041 /* DIG1_IN */
+                       MX8MM_IOMUXC_GPIO1_IO07_GPIO1_IO7       0x40000041 /* DIG1_OUT */
+                       MX8MM_IOMUXC_SAI3_RXD_GPIO4_IO30        0x40000041 /* SIM2DET# */
+                       MX8MM_IOMUXC_SAI3_RXC_GPIO4_IO29        0x40000041 /* SIM1DET# */
+                       MX8MM_IOMUXC_SPDIF_EXT_CLK_GPIO5_IO5    0x40000041 /* SIM2SEL */
+               >;
+       };
+
+       pinctrl_fec1: fec1grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_ENET_MDC_ENET1_MDC                 0x3
+                       MX8MM_IOMUXC_ENET_MDIO_ENET1_MDIO               0x3
+                       MX8MM_IOMUXC_ENET_TD3_ENET1_RGMII_TD3           0x1f
+                       MX8MM_IOMUXC_ENET_TD2_ENET1_RGMII_TD2           0x1f
+                       MX8MM_IOMUXC_ENET_TD1_ENET1_RGMII_TD1           0x1f
+                       MX8MM_IOMUXC_ENET_TD0_ENET1_RGMII_TD0           0x1f
+                       MX8MM_IOMUXC_ENET_RD3_ENET1_RGMII_RD3           0x91
+                       MX8MM_IOMUXC_ENET_RD2_ENET1_RGMII_RD2           0x91
+                       MX8MM_IOMUXC_ENET_RD1_ENET1_RGMII_RD1           0x91
+                       MX8MM_IOMUXC_ENET_RD0_ENET1_RGMII_RD0           0x91
+                       MX8MM_IOMUXC_ENET_TXC_ENET1_RGMII_TXC           0x1f
+                       MX8MM_IOMUXC_ENET_RXC_ENET1_RGMII_RXC           0x91
+                       MX8MM_IOMUXC_ENET_RX_CTL_ENET1_RGMII_RX_CTL     0x91
+                       MX8MM_IOMUXC_ENET_TX_CTL_ENET1_RGMII_TX_CTL     0x1f
+                       MX8MM_IOMUXC_SAI1_TXD6_GPIO4_IO18               0x19 /* IRQ# */
+                       MX8MM_IOMUXC_SAI1_TXD7_GPIO4_IO19               0x19 /* RST# */
+               >;
+       };
+
+       pinctrl_gsc: gscgrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_SAI1_TXD4_GPIO4_IO16       0x159
+               >;
+       };
+
+       pinctrl_i2c1: i2c1grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_I2C1_SCL_I2C1_SCL          0x400001c3
+                       MX8MM_IOMUXC_I2C1_SDA_I2C1_SDA          0x400001c3
+               >;
+       };
+
+       pinctrl_i2c2: i2c2grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_I2C2_SCL_I2C2_SCL          0x400001c3
+                       MX8MM_IOMUXC_I2C2_SDA_I2C2_SDA          0x400001c3
+               >;
+       };
+
+       pinctrl_i2c3: i2c3grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_I2C3_SCL_I2C3_SCL          0x400001c3
+                       MX8MM_IOMUXC_I2C3_SDA_I2C3_SDA          0x400001c3
+               >;
+       };
+
+       pinctrl_i2c4: i2c4grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_I2C4_SCL_I2C4_SCL          0x400001c3
+                       MX8MM_IOMUXC_I2C4_SDA_I2C4_SDA          0x400001c3
+               >;
+       };
+
+       pinctrl_ksz: kszgrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_SAI1_TXD6_GPIO4_IO18       0x41
+                       MX8MM_IOMUXC_SAI1_TXD7_GPIO4_IO19       0x41 /* RST# */
+               >;
+       };
+
+       pinctrl_pmic: pmicgrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_SAI5_RXC_GPIO3_IO20        0x41
+               >;
+       };
+
+       pinctrl_reg_isouart: regisouartgrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_GPIO1_IO13_GPIO1_IO13      0x40000041
+               >;
+       };
+
+       pinctrl_reg_ioexp: regioexpgrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_SAI2_RXFS_GPIO4_IO21       0x40000041
+               >;
+       };
+
+       pinctrl_reg_wl: regwlgrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_SAI5_MCLK_GPIO3_IO25       0x40000041
+               >;
+       };
+
+       pinctrl_reg_usb2: regusb1grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_SAI1_TXD5_GPIO4_IO17       0x41
+                       MX8MM_IOMUXC_GPIO1_IO15_USB2_OTG_OC     0x41
+               >;
+       };
+
+       pinctrl_spi1: spi1grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_ECSPI1_SCLK_ECSPI1_SCLK    0x82
+                       MX8MM_IOMUXC_ECSPI1_MOSI_ECSPI1_MOSI    0x82
+                       MX8MM_IOMUXC_ECSPI1_MISO_ECSPI1_MISO    0x82
+                       MX8MM_IOMUXC_ECSPI1_SS0_GPIO5_IO9       0x140
+               >;
+       };
+
+       pinctrl_uart1: uart1grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_UART1_RXD_UART1_DCE_RX     0x140
+                       MX8MM_IOMUXC_UART1_TXD_UART1_DCE_TX     0x140
+                       MX8MM_IOMUXC_GPIO1_IO01_GPIO1_IO1       0x140
+                       MX8MM_IOMUXC_GPIO1_IO10_GPIO1_IO10      0x140
+                       MX8MM_IOMUXC_GPIO1_IO11_GPIO1_IO11      0x140
+                       MX8MM_IOMUXC_GPIO1_IO12_GPIO1_IO12      0x140
+                       MX8MM_IOMUXC_GPIO1_IO14_GPIO1_IO14      0x140
+               >;
+       };
+
+       pinctrl_uart1_gpio: uart1gpiogrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_GPIO1_IO00_GPIO1_IO0       0x40000041 /* RS422# */
+                       MX8MM_IOMUXC_GPIO1_IO03_GPIO1_IO3       0x40000041 /* RS485# */
+                       MX8MM_IOMUXC_GPIO1_IO05_GPIO1_IO5       0x40000041 /* RS232# */
+               >;
+       };
+
+       pinctrl_uart2: uart2grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_UART2_RXD_UART2_DCE_RX     0x140
+                       MX8MM_IOMUXC_UART2_TXD_UART2_DCE_TX     0x140
+               >;
+       };
+
+       pinctrl_uart3: uart3grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_UART3_RXD_UART3_DCE_RX     0x140
+                       MX8MM_IOMUXC_UART3_TXD_UART3_DCE_TX     0x140
+                       MX8MM_IOMUXC_SAI1_RXD7_GPIO4_IO9        0x140
+                       MX8MM_IOMUXC_SAI1_TXFS_GPIO4_IO10       0x140
+               >;
+       };
+
+       pinctrl_uart3_gpio: uart3gpiogrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_SAI1_RXD4_GPIO4_IO6        0x40000041 /* RS232# */
+                       MX8MM_IOMUXC_SAI1_RXD5_GPIO4_IO7        0x40000041 /* RS422# */
+                       MX8MM_IOMUXC_SAI1_RXD6_GPIO4_IO8        0x40000041 /* RS485# */
+               >;
+       };
+
+       pinctrl_uart4: uart4grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_UART4_RXD_UART4_DCE_RX     0x140
+                       MX8MM_IOMUXC_UART4_TXD_UART4_DCE_TX     0x140
+                       MX8MM_IOMUXC_ECSPI2_MOSI_GPIO5_IO11     0x140
+                       MX8MM_IOMUXC_ECSPI2_MISO_GPIO5_IO12     0x140
+               >;
+       };
+
+       pinctrl_uart4_gpio: uart4gpiogrp {
+               fsl,pins = <
+
+                       MX8MM_IOMUXC_ECSPI2_SCLK_GPIO5_IO10     0x40000041 /* RS232# */
+                       MX8MM_IOMUXC_ECSPI2_SS0_GPIO5_IO13      0x40000041 /* RS422# */
+                       MX8MM_IOMUXC_SAI2_MCLK_GPIO4_IO27       0x40000041 /* RS485# */
+               >;
+       };
+
+       pinctrl_usdhc1: usdhc1grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_SD1_CLK_USDHC1_CLK         0x190
+                       MX8MM_IOMUXC_SD1_CMD_USDHC1_CMD         0x1d0
+                       MX8MM_IOMUXC_SD1_DATA0_USDHC1_DATA0     0x1d0
+                       MX8MM_IOMUXC_SD1_DATA1_USDHC1_DATA1     0x1d0
+                       MX8MM_IOMUXC_SD1_DATA2_USDHC1_DATA2     0x1d0
+                       MX8MM_IOMUXC_SD1_DATA3_USDHC1_DATA3     0x1d0
+               >;
+       };
+
+       pinctrl_usdhc2: usdhc2grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_SD2_CLK_USDHC2_CLK         0x190
+                       MX8MM_IOMUXC_SD2_CMD_USDHC2_CMD         0x1d0
+                       MX8MM_IOMUXC_SD2_DATA0_USDHC2_DATA0     0x1d0
+                       MX8MM_IOMUXC_SD2_DATA1_USDHC2_DATA1     0x1d0
+                       MX8MM_IOMUXC_SD2_DATA2_USDHC2_DATA2     0x1d0
+                       MX8MM_IOMUXC_SD2_DATA3_USDHC2_DATA3     0x1d0
+               >;
+       };
+
+       pinctrl_usdhc2_100mhz: usdhc2-100mhzgrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_SD2_CLK_USDHC2_CLK         0x194
+                       MX8MM_IOMUXC_SD2_CMD_USDHC2_CMD         0x1d4
+                       MX8MM_IOMUXC_SD2_DATA0_USDHC2_DATA0     0x1d4
+                       MX8MM_IOMUXC_SD2_DATA1_USDHC2_DATA1     0x1d4
+                       MX8MM_IOMUXC_SD2_DATA2_USDHC2_DATA2     0x1d4
+                       MX8MM_IOMUXC_SD2_DATA3_USDHC2_DATA3     0x1d4
+               >;
+       };
+
+       pinctrl_usdhc2_200mhz: usdhc2-200mhzgrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_SD2_CLK_USDHC2_CLK         0x196
+                       MX8MM_IOMUXC_SD2_CMD_USDHC2_CMD         0x1d6
+                       MX8MM_IOMUXC_SD2_DATA0_USDHC2_DATA0     0x1d6
+                       MX8MM_IOMUXC_SD2_DATA1_USDHC2_DATA1     0x1d6
+                       MX8MM_IOMUXC_SD2_DATA2_USDHC2_DATA2     0x1d6
+                       MX8MM_IOMUXC_SD2_DATA3_USDHC2_DATA3     0x1d6
+               >;
+       };
+
+       pinctrl_usdhc2_gpio: usdhc2-gpiogrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_SD2_CD_B_GPIO2_IO12        0x1c4
+                       MX8MM_IOMUXC_GPIO1_IO04_USDHC2_VSELECT  0x1d0
+               >;
+       };
+
+       pinctrl_usdhc3: usdhc3grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_NAND_WE_B_USDHC3_CLK       0x190
+                       MX8MM_IOMUXC_NAND_WP_B_USDHC3_CMD       0x1d0
+                       MX8MM_IOMUXC_NAND_DATA04_USDHC3_DATA0   0x1d0
+                       MX8MM_IOMUXC_NAND_DATA05_USDHC3_DATA1   0x1d0
+                       MX8MM_IOMUXC_NAND_DATA06_USDHC3_DATA2   0x1d0
+                       MX8MM_IOMUXC_NAND_DATA07_USDHC3_DATA3   0x1d0
+                       MX8MM_IOMUXC_NAND_RE_B_USDHC3_DATA4     0x1d0
+                       MX8MM_IOMUXC_NAND_CE2_B_USDHC3_DATA5    0x1d0
+                       MX8MM_IOMUXC_NAND_CE3_B_USDHC3_DATA6    0x1d0
+                       MX8MM_IOMUXC_NAND_CLE_USDHC3_DATA7      0x1d0
+                       MX8MM_IOMUXC_NAND_CE1_B_USDHC3_STROBE   0x190
+               >;
+       };
+
+       pinctrl_usdhc3_100mhz: usdhc3-100mhzgrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_NAND_WE_B_USDHC3_CLK       0x194
+                       MX8MM_IOMUXC_NAND_WP_B_USDHC3_CMD       0x1d4
+                       MX8MM_IOMUXC_NAND_DATA04_USDHC3_DATA0   0x1d4
+                       MX8MM_IOMUXC_NAND_DATA05_USDHC3_DATA1   0x1d4
+                       MX8MM_IOMUXC_NAND_DATA06_USDHC3_DATA2   0x1d4
+                       MX8MM_IOMUXC_NAND_DATA07_USDHC3_DATA3   0x1d4
+                       MX8MM_IOMUXC_NAND_RE_B_USDHC3_DATA4     0x1d4
+                       MX8MM_IOMUXC_NAND_CE2_B_USDHC3_DATA5    0x1d4
+                       MX8MM_IOMUXC_NAND_CE3_B_USDHC3_DATA6    0x1d4
+                       MX8MM_IOMUXC_NAND_CLE_USDHC3_DATA7      0x1d4
+                       MX8MM_IOMUXC_NAND_CE1_B_USDHC3_STROBE   0x194
+               >;
+       };
+
+       pinctrl_usdhc3_200mhz: usdhc3-200mhzgrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_NAND_WE_B_USDHC3_CLK       0x196
+                       MX8MM_IOMUXC_NAND_WP_B_USDHC3_CMD       0x1d6
+                       MX8MM_IOMUXC_NAND_DATA04_USDHC3_DATA0   0x1d6
+                       MX8MM_IOMUXC_NAND_DATA05_USDHC3_DATA1   0x1d6
+                       MX8MM_IOMUXC_NAND_DATA06_USDHC3_DATA2   0x1d6
+                       MX8MM_IOMUXC_NAND_DATA07_USDHC3_DATA3   0x1d6
+                       MX8MM_IOMUXC_NAND_RE_B_USDHC3_DATA4     0x1d6
+                       MX8MM_IOMUXC_NAND_CE2_B_USDHC3_DATA5    0x1d6
+                       MX8MM_IOMUXC_NAND_CE3_B_USDHC3_DATA6    0x1d6
+                       MX8MM_IOMUXC_NAND_CLE_USDHC3_DATA7      0x1d6
+                       MX8MM_IOMUXC_NAND_CE1_B_USDHC3_STROBE   0x196
+               >;
+       };
+
+       pinctrl_wdog: wdoggrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_GPIO1_IO02_WDOG1_WDOG_B    0xc6
+               >;
+       };
+};
+
+&cpu_alert0 {
+       temperature = <95000>;
+       hysteresis = <2000>;
+       type = "passive";
+};
+
+&cpu_crit0 {
+       temperature = <105000>;
+       hysteresis = <2000>;
+       type = "critical";
+};
index a27e02b..e7648c3 100644 (file)
                #address-cells = <1>;
                #size-cells = <1>;
                ranges = <0x0 0x0 0x0 0x3e000000>;
+               dma-ranges = <0x40000000 0x0 0x40000000 0xc0000000>;
                nvmem-cells = <&imx8mm_uid>;
                nvmem-cell-names = "soc_unique_id";
 
                        #size-cells = <1>;
                        ranges = <0x30000000 0x30000000 0x400000>;
 
-                       sai1: sai@30010000 {
-                               #sound-dai-cells = <0>;
-                               compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai";
-                               reg = <0x30010000 0x10000>;
-                               interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MM_CLK_SAI1_IPG>,
-                                        <&clk IMX8MM_CLK_SAI1_ROOT>,
-                                        <&clk IMX8MM_CLK_DUMMY>, <&clk IMX8MM_CLK_DUMMY>;
-                               clock-names = "bus", "mclk1", "mclk2", "mclk3";
-                               dmas = <&sdma2 0 2 0>, <&sdma2 1 2 0>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                       spba2: spba-bus@30000000 {
+                               compatible = "fsl,spba-bus", "simple-bus";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               reg = <0x30000000 0x100000>;
+                               ranges;
+
+                               sai1: sai@30010000 {
+                                       #sound-dai-cells = <0>;
+                                       compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai";
+                                       reg = <0x30010000 0x10000>;
+                                       interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MM_CLK_SAI1_IPG>,
+                                                <&clk IMX8MM_CLK_SAI1_ROOT>,
+                                                <&clk IMX8MM_CLK_DUMMY>, <&clk IMX8MM_CLK_DUMMY>;
+                                       clock-names = "bus", "mclk1", "mclk2", "mclk3";
+                                       dmas = <&sdma2 0 2 0>, <&sdma2 1 2 0>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
 
-                       sai2: sai@30020000 {
-                               #sound-dai-cells = <0>;
-                               compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai";
-                               reg = <0x30020000 0x10000>;
-                               interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MM_CLK_SAI2_IPG>,
-                                       <&clk IMX8MM_CLK_SAI2_ROOT>,
-                                       <&clk IMX8MM_CLK_DUMMY>, <&clk IMX8MM_CLK_DUMMY>;
-                               clock-names = "bus", "mclk1", "mclk2", "mclk3";
-                               dmas = <&sdma2 2 2 0>, <&sdma2 3 2 0>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                               sai2: sai@30020000 {
+                                       #sound-dai-cells = <0>;
+                                       compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai";
+                                       reg = <0x30020000 0x10000>;
+                                       interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MM_CLK_SAI2_IPG>,
+                                               <&clk IMX8MM_CLK_SAI2_ROOT>,
+                                               <&clk IMX8MM_CLK_DUMMY>, <&clk IMX8MM_CLK_DUMMY>;
+                                       clock-names = "bus", "mclk1", "mclk2", "mclk3";
+                                       dmas = <&sdma2 2 2 0>, <&sdma2 3 2 0>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
 
-                       sai3: sai@30030000 {
-                               #sound-dai-cells = <0>;
-                               compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai";
-                               reg = <0x30030000 0x10000>;
-                               interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MM_CLK_SAI3_IPG>,
-                                        <&clk IMX8MM_CLK_SAI3_ROOT>,
-                                        <&clk IMX8MM_CLK_DUMMY>, <&clk IMX8MM_CLK_DUMMY>;
-                               clock-names = "bus", "mclk1", "mclk2", "mclk3";
-                               dmas = <&sdma2 4 2 0>, <&sdma2 5 2 0>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                               sai3: sai@30030000 {
+                                       #sound-dai-cells = <0>;
+                                       compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai";
+                                       reg = <0x30030000 0x10000>;
+                                       interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MM_CLK_SAI3_IPG>,
+                                                <&clk IMX8MM_CLK_SAI3_ROOT>,
+                                                <&clk IMX8MM_CLK_DUMMY>, <&clk IMX8MM_CLK_DUMMY>;
+                                       clock-names = "bus", "mclk1", "mclk2", "mclk3";
+                                       dmas = <&sdma2 4 2 0>, <&sdma2 5 2 0>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
 
-                       sai5: sai@30050000 {
-                               #sound-dai-cells = <0>;
-                               compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai";
-                               reg = <0x30050000 0x10000>;
-                               interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MM_CLK_SAI5_IPG>,
-                                        <&clk IMX8MM_CLK_SAI5_ROOT>,
-                                        <&clk IMX8MM_CLK_DUMMY>, <&clk IMX8MM_CLK_DUMMY>;
-                               clock-names = "bus", "mclk1", "mclk2", "mclk3";
-                               dmas = <&sdma2 8 2 0>, <&sdma2 9 2 0>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                               sai5: sai@30050000 {
+                                       #sound-dai-cells = <0>;
+                                       compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai";
+                                       reg = <0x30050000 0x10000>;
+                                       interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MM_CLK_SAI5_IPG>,
+                                                <&clk IMX8MM_CLK_SAI5_ROOT>,
+                                                <&clk IMX8MM_CLK_DUMMY>, <&clk IMX8MM_CLK_DUMMY>;
+                                       clock-names = "bus", "mclk1", "mclk2", "mclk3";
+                                       dmas = <&sdma2 8 2 0>, <&sdma2 9 2 0>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
 
-                       sai6: sai@30060000 {
-                               #sound-dai-cells = <0>;
-                               compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai";
-                               reg = <0x30060000 0x10000>;
-                               interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MM_CLK_SAI6_IPG>,
-                                        <&clk IMX8MM_CLK_SAI6_ROOT>,
-                                        <&clk IMX8MM_CLK_DUMMY>, <&clk IMX8MM_CLK_DUMMY>;
-                               clock-names = "bus", "mclk1", "mclk2", "mclk3";
-                               dmas = <&sdma2 10 2 0>, <&sdma2 11 2 0>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                               sai6: sai@30060000 {
+                                       #sound-dai-cells = <0>;
+                                       compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai";
+                                       reg = <0x30060000 0x10000>;
+                                       interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MM_CLK_SAI6_IPG>,
+                                                <&clk IMX8MM_CLK_SAI6_ROOT>,
+                                                <&clk IMX8MM_CLK_DUMMY>, <&clk IMX8MM_CLK_DUMMY>;
+                                       clock-names = "bus", "mclk1", "mclk2", "mclk3";
+                                       dmas = <&sdma2 10 2 0>, <&sdma2 11 2 0>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
 
-                       micfil: audio-controller@30080000 {
-                               compatible = "fsl,imx8mm-micfil";
-                               reg = <0x30080000 0x10000>;
-                               interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>,
-                                            <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>,
-                                            <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>,
-                                            <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MM_CLK_PDM_IPG>,
-                                        <&clk IMX8MM_CLK_PDM_ROOT>,
-                                        <&clk IMX8MM_AUDIO_PLL1_OUT>,
-                                        <&clk IMX8MM_AUDIO_PLL2_OUT>,
-                                        <&clk IMX8MM_CLK_EXT3>;
-                               clock-names = "ipg_clk", "ipg_clk_app",
-                                             "pll8k", "pll11k", "clkext3";
-                               dmas = <&sdma2 24 25 0x80000000>;
-                               dma-names = "rx";
-                               status = "disabled";
-                       };
+                               micfil: audio-controller@30080000 {
+                                       compatible = "fsl,imx8mm-micfil";
+                                       reg = <0x30080000 0x10000>;
+                                       interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MM_CLK_PDM_IPG>,
+                                                <&clk IMX8MM_CLK_PDM_ROOT>,
+                                                <&clk IMX8MM_AUDIO_PLL1_OUT>,
+                                                <&clk IMX8MM_AUDIO_PLL2_OUT>,
+                                                <&clk IMX8MM_CLK_EXT3>;
+                                       clock-names = "ipg_clk", "ipg_clk_app",
+                                                     "pll8k", "pll11k", "clkext3";
+                                       dmas = <&sdma2 24 25 0x80000000>;
+                                       dma-names = "rx";
+                                       status = "disabled";
+                               };
 
-                       spdif1: spdif@30090000 {
-                               compatible = "fsl,imx35-spdif";
-                               reg = <0x30090000 0x10000>;
-                               interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MM_CLK_AUDIO_AHB>, /* core */
-                                        <&clk IMX8MM_CLK_24M>, /* rxtx0 */
-                                        <&clk IMX8MM_CLK_SPDIF1>, /* rxtx1 */
-                                        <&clk IMX8MM_CLK_DUMMY>, /* rxtx2 */
-                                        <&clk IMX8MM_CLK_DUMMY>, /* rxtx3 */
-                                        <&clk IMX8MM_CLK_DUMMY>, /* rxtx4 */
-                                        <&clk IMX8MM_CLK_AUDIO_AHB>, /* rxtx5 */
-                                        <&clk IMX8MM_CLK_DUMMY>, /* rxtx6 */
-                                        <&clk IMX8MM_CLK_DUMMY>, /* rxtx7 */
-                                        <&clk IMX8MM_CLK_DUMMY>; /* spba */
-                               clock-names = "core", "rxtx0",
-                                             "rxtx1", "rxtx2",
-                                             "rxtx3", "rxtx4",
-                                             "rxtx5", "rxtx6",
-                                             "rxtx7", "spba";
-                               dmas = <&sdma2 28 18 0>, <&sdma2 29 18 0>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
+                               spdif1: spdif@30090000 {
+                                       compatible = "fsl,imx35-spdif";
+                                       reg = <0x30090000 0x10000>;
+                                       interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MM_CLK_AUDIO_AHB>, /* core */
+                                                <&clk IMX8MM_CLK_24M>, /* rxtx0 */
+                                                <&clk IMX8MM_CLK_SPDIF1>, /* rxtx1 */
+                                                <&clk IMX8MM_CLK_DUMMY>, /* rxtx2 */
+                                                <&clk IMX8MM_CLK_DUMMY>, /* rxtx3 */
+                                                <&clk IMX8MM_CLK_DUMMY>, /* rxtx4 */
+                                                <&clk IMX8MM_CLK_AUDIO_AHB>, /* rxtx5 */
+                                                <&clk IMX8MM_CLK_DUMMY>, /* rxtx6 */
+                                                <&clk IMX8MM_CLK_DUMMY>, /* rxtx7 */
+                                                <&clk IMX8MM_CLK_DUMMY>; /* spba */
+                                       clock-names = "core", "rxtx0",
+                                                     "rxtx1", "rxtx2",
+                                                     "rxtx3", "rxtx4",
+                                                     "rxtx5", "rxtx6",
+                                                     "rxtx7", "spba";
+                                       dmas = <&sdma2 28 18 0>, <&sdma2 29 18 0>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
                        };
 
                        gpio1: gpio@30200000 {
                        ranges = <0x30800000 0x30800000 0x400000>,
                                 <0x8000000 0x8000000 0x10000000>;
 
-                       ecspi1: spi@30820000 {
-                               compatible = "fsl,imx8mm-ecspi", "fsl,imx51-ecspi";
+                       spba1: spba-bus@30800000 {
+                               compatible = "fsl,spba-bus", "simple-bus";
                                #address-cells = <1>;
-                               #size-cells = <0>;
-                               reg = <0x30820000 0x10000>;
-                               interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MM_CLK_ECSPI1_ROOT>,
-                                        <&clk IMX8MM_CLK_ECSPI1_ROOT>;
-                               clock-names = "ipg", "per";
-                               dmas = <&sdma1 0 7 1>, <&sdma1 1 7 2>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                               #size-cells = <1>;
+                               reg = <0x30800000 0x100000>;
+                               ranges;
+
+                               ecspi1: spi@30820000 {
+                                       compatible = "fsl,imx8mm-ecspi", "fsl,imx51-ecspi";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <0x30820000 0x10000>;
+                                       interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MM_CLK_ECSPI1_ROOT>,
+                                                <&clk IMX8MM_CLK_ECSPI1_ROOT>;
+                                       clock-names = "ipg", "per";
+                                       dmas = <&sdma1 0 7 1>, <&sdma1 1 7 2>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
 
-                       ecspi2: spi@30830000 {
-                               compatible = "fsl,imx8mm-ecspi", "fsl,imx51-ecspi";
-                               #address-cells = <1>;
-                               #size-cells = <0>;
-                               reg = <0x30830000 0x10000>;
-                               interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MM_CLK_ECSPI2_ROOT>,
-                                        <&clk IMX8MM_CLK_ECSPI2_ROOT>;
-                               clock-names = "ipg", "per";
-                               dmas = <&sdma1 2 7 1>, <&sdma1 3 7 2>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                               ecspi2: spi@30830000 {
+                                       compatible = "fsl,imx8mm-ecspi", "fsl,imx51-ecspi";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <0x30830000 0x10000>;
+                                       interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MM_CLK_ECSPI2_ROOT>,
+                                                <&clk IMX8MM_CLK_ECSPI2_ROOT>;
+                                       clock-names = "ipg", "per";
+                                       dmas = <&sdma1 2 7 1>, <&sdma1 3 7 2>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
 
-                       ecspi3: spi@30840000 {
-                               compatible = "fsl,imx8mm-ecspi", "fsl,imx51-ecspi";
-                               #address-cells = <1>;
-                               #size-cells = <0>;
-                               reg = <0x30840000 0x10000>;
-                               interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MM_CLK_ECSPI3_ROOT>,
-                                        <&clk IMX8MM_CLK_ECSPI3_ROOT>;
-                               clock-names = "ipg", "per";
-                               dmas = <&sdma1 4 7 1>, <&sdma1 5 7 2>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                               ecspi3: spi@30840000 {
+                                       compatible = "fsl,imx8mm-ecspi", "fsl,imx51-ecspi";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <0x30840000 0x10000>;
+                                       interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MM_CLK_ECSPI3_ROOT>,
+                                                <&clk IMX8MM_CLK_ECSPI3_ROOT>;
+                                       clock-names = "ipg", "per";
+                                       dmas = <&sdma1 4 7 1>, <&sdma1 5 7 2>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
 
-                       uart1: serial@30860000 {
-                               compatible = "fsl,imx8mm-uart", "fsl,imx6q-uart";
-                               reg = <0x30860000 0x10000>;
-                               interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MM_CLK_UART1_ROOT>,
-                                        <&clk IMX8MM_CLK_UART1_ROOT>;
-                               clock-names = "ipg", "per";
-                               dmas = <&sdma1 22 4 0>, <&sdma1 23 4 0>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                               uart1: serial@30860000 {
+                                       compatible = "fsl,imx8mm-uart", "fsl,imx6q-uart";
+                                       reg = <0x30860000 0x10000>;
+                                       interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MM_CLK_UART1_ROOT>,
+                                                <&clk IMX8MM_CLK_UART1_ROOT>;
+                                       clock-names = "ipg", "per";
+                                       dmas = <&sdma1 22 4 0>, <&sdma1 23 4 0>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
 
-                       uart3: serial@30880000 {
-                               compatible = "fsl,imx8mm-uart", "fsl,imx6q-uart";
-                               reg = <0x30880000 0x10000>;
-                               interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MM_CLK_UART3_ROOT>,
-                                        <&clk IMX8MM_CLK_UART3_ROOT>;
-                               clock-names = "ipg", "per";
-                               dmas = <&sdma1 26 4 0>, <&sdma1 27 4 0>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                               uart3: serial@30880000 {
+                                       compatible = "fsl,imx8mm-uart", "fsl,imx6q-uart";
+                                       reg = <0x30880000 0x10000>;
+                                       interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MM_CLK_UART3_ROOT>,
+                                                <&clk IMX8MM_CLK_UART3_ROOT>;
+                                       clock-names = "ipg", "per";
+                                       dmas = <&sdma1 26 4 0>, <&sdma1 27 4 0>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
 
-                       uart2: serial@30890000 {
-                               compatible = "fsl,imx8mm-uart", "fsl,imx6q-uart";
-                               reg = <0x30890000 0x10000>;
-                               interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MM_CLK_UART2_ROOT>,
-                                        <&clk IMX8MM_CLK_UART2_ROOT>;
-                               clock-names = "ipg", "per";
-                               status = "disabled";
+                               uart2: serial@30890000 {
+                                       compatible = "fsl,imx8mm-uart", "fsl,imx6q-uart";
+                                       reg = <0x30890000 0x10000>;
+                                       interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MM_CLK_UART2_ROOT>,
+                                                <&clk IMX8MM_CLK_UART2_ROOT>;
+                                       clock-names = "ipg", "per";
+                                       status = "disabled";
+                               };
                        };
 
                        crypto: crypto@30900000 {
index c35eeaf..54eaf3d 100644 (file)
                interrupt-parent = <&gpio1>;
                interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
                rohm,reset-snvs-powered;
+               #clock-cells = <0>;
+               clocks = <&osc_32k 0>;
+               clock-output-names = "clk-32k-out";
 
                regulators {
                        buck1_reg: BUCK1 {
index a0dddba..85e65f8 100644 (file)
        srp-disable;
        adp-disable;
        usb-role-switch;
+       disable-over-current;
        samsung,picophy-pre-emp-curr-control = <3>;
        samsung,picophy-dc-vol-level-adjust = <7>;
        status = "okay";
index 4dac4da..d4231e0 100644 (file)
                #address-cells = <1>;
                #size-cells = <1>;
                ranges = <0x0 0x0 0x0 0x3e000000>;
+               dma-ranges = <0x40000000 0x0 0x40000000 0xc0000000>;
                nvmem-cells = <&imx8mn_uid>;
                nvmem-cell-names = "soc_unique_id";
 
                        #size-cells = <1>;
                        ranges;
 
-                       spba: spba-bus@30000000 {
+                       spba2: spba-bus@30000000 {
                                compatible = "fsl,spba-bus", "simple-bus";
                                #address-cells = <1>;
                                #size-cells = <1>;
                        #size-cells = <1>;
                        ranges;
 
-                       ecspi1: spi@30820000 {
-                               compatible = "fsl,imx8mn-ecspi", "fsl,imx51-ecspi";
+                       spba1: spba-bus@30800000 {
+                               compatible = "fsl,spba-bus", "simple-bus";
                                #address-cells = <1>;
-                               #size-cells = <0>;
-                               reg = <0x30820000 0x10000>;
-                               interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MN_CLK_ECSPI1_ROOT>,
-                                        <&clk IMX8MN_CLK_ECSPI1_ROOT>;
-                               clock-names = "ipg", "per";
-                               dmas = <&sdma1 0 7 1>, <&sdma1 1 7 2>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                               #size-cells = <1>;
+                               reg = <0x30800000 0x100000>;
+                               ranges;
 
-                       ecspi2: spi@30830000 {
-                               compatible = "fsl,imx8mn-ecspi", "fsl,imx51-ecspi";
-                               #address-cells = <1>;
-                               #size-cells = <0>;
-                               reg = <0x30830000 0x10000>;
-                               interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MN_CLK_ECSPI2_ROOT>,
-                                        <&clk IMX8MN_CLK_ECSPI2_ROOT>;
-                               clock-names = "ipg", "per";
-                               dmas = <&sdma1 2 7 1>, <&sdma1 3 7 2>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                               ecspi1: spi@30820000 {
+                                       compatible = "fsl,imx8mn-ecspi", "fsl,imx51-ecspi";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <0x30820000 0x10000>;
+                                       interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MN_CLK_ECSPI1_ROOT>,
+                                                <&clk IMX8MN_CLK_ECSPI1_ROOT>;
+                                       clock-names = "ipg", "per";
+                                       dmas = <&sdma1 0 7 1>, <&sdma1 1 7 2>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
 
-                       ecspi3: spi@30840000 {
-                               compatible = "fsl,imx8mn-ecspi", "fsl,imx51-ecspi";
-                               #address-cells = <1>;
-                               #size-cells = <0>;
-                               reg = <0x30840000 0x10000>;
-                               interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MN_CLK_ECSPI3_ROOT>,
-                                        <&clk IMX8MN_CLK_ECSPI3_ROOT>;
-                               clock-names = "ipg", "per";
-                               dmas = <&sdma1 4 7 1>, <&sdma1 5 7 2>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                               ecspi2: spi@30830000 {
+                                       compatible = "fsl,imx8mn-ecspi", "fsl,imx51-ecspi";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <0x30830000 0x10000>;
+                                       interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MN_CLK_ECSPI2_ROOT>,
+                                                <&clk IMX8MN_CLK_ECSPI2_ROOT>;
+                                       clock-names = "ipg", "per";
+                                       dmas = <&sdma1 2 7 1>, <&sdma1 3 7 2>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
 
-                       uart1: serial@30860000 {
-                               compatible = "fsl,imx8mn-uart", "fsl,imx6q-uart";
-                               reg = <0x30860000 0x10000>;
-                               interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MN_CLK_UART1_ROOT>,
-                                        <&clk IMX8MN_CLK_UART1_ROOT>;
-                               clock-names = "ipg", "per";
-                               dmas = <&sdma1 22 4 0>, <&sdma1 23 4 0>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                               ecspi3: spi@30840000 {
+                                       compatible = "fsl,imx8mn-ecspi", "fsl,imx51-ecspi";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       reg = <0x30840000 0x10000>;
+                                       interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MN_CLK_ECSPI3_ROOT>,
+                                                <&clk IMX8MN_CLK_ECSPI3_ROOT>;
+                                       clock-names = "ipg", "per";
+                                       dmas = <&sdma1 4 7 1>, <&sdma1 5 7 2>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
 
-                       uart3: serial@30880000 {
-                               compatible = "fsl,imx8mn-uart", "fsl,imx6q-uart";
-                               reg = <0x30880000 0x10000>;
-                               interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MN_CLK_UART3_ROOT>,
-                                        <&clk IMX8MN_CLK_UART3_ROOT>;
-                               clock-names = "ipg", "per";
-                               dmas = <&sdma1 26 4 0>, <&sdma1 27 4 0>;
-                               dma-names = "rx", "tx";
-                               status = "disabled";
-                       };
+                               uart1: serial@30860000 {
+                                       compatible = "fsl,imx8mn-uart", "fsl,imx6q-uart";
+                                       reg = <0x30860000 0x10000>;
+                                       interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MN_CLK_UART1_ROOT>,
+                                                <&clk IMX8MN_CLK_UART1_ROOT>;
+                                       clock-names = "ipg", "per";
+                                       dmas = <&sdma1 22 4 0>, <&sdma1 23 4 0>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
 
-                       uart2: serial@30890000 {
-                               compatible = "fsl,imx8mn-uart", "fsl,imx6q-uart";
-                               reg = <0x30890000 0x10000>;
-                               interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clk IMX8MN_CLK_UART2_ROOT>,
-                                        <&clk IMX8MN_CLK_UART2_ROOT>;
-                               clock-names = "ipg", "per";
-                               status = "disabled";
+                               uart3: serial@30880000 {
+                                       compatible = "fsl,imx8mn-uart", "fsl,imx6q-uart";
+                                       reg = <0x30880000 0x10000>;
+                                       interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MN_CLK_UART3_ROOT>,
+                                                <&clk IMX8MN_CLK_UART3_ROOT>;
+                                       clock-names = "ipg", "per";
+                                       dmas = <&sdma1 26 4 0>, <&sdma1 27 4 0>;
+                                       dma-names = "rx", "tx";
+                                       status = "disabled";
+                               };
+
+                               uart2: serial@30890000 {
+                                       compatible = "fsl,imx8mn-uart", "fsl,imx6q-uart";
+                                       reg = <0x30890000 0x10000>;
+                                       interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MN_CLK_UART2_ROOT>,
+                                                <&clk IMX8MN_CLK_UART2_ROOT>;
+                                       clock-names = "ipg", "per";
+                                       status = "disabled";
+                               };
                        };
 
                        crypto: crypto@30900000 {
index 2c28e58..7b99fad 100644 (file)
        status = "disabled";/* can2 pin conflict with pdm */
 };
 
+&eqos {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_eqos>;
+       phy-mode = "rgmii-id";
+       phy-handle = <&ethphy0>;
+       status = "okay";
+
+       mdio {
+               compatible = "snps,dwmac-mdio";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               ethphy0: ethernet-phy@1 {
+                       compatible = "ethernet-phy-ieee802.3-c22";
+                       reg = <1>;
+                       eee-broken-1000t;
+               };
+       };
+};
+
 &fec {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_fec>;
        };
 };
 
+&i2c1 {
+       clock-frequency = <400000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       status = "okay";
+
+       pmic@25 {
+               compatible = "nxp,pca9450c";
+               reg = <0x25>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_pmic>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
+
+               regulators {
+                       BUCK1 {
+                               regulator-name = "BUCK1";
+                               regulator-min-microvolt = <720000>;
+                               regulator-max-microvolt = <1000000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <3125>;
+                       };
+
+                       BUCK2 {
+                               regulator-name = "BUCK2";
+                               regulator-min-microvolt = <720000>;
+                               regulator-max-microvolt = <1025000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <3125>;
+                               nxp,dvs-run-voltage = <950000>;
+                               nxp,dvs-standby-voltage = <850000>;
+                       };
+
+                       BUCK4 {
+                               regulator-name = "BUCK4";
+                               regulator-min-microvolt = <3000000>;
+                               regulator-max-microvolt = <3600000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       BUCK5 {
+                               regulator-name = "BUCK5";
+                               regulator-min-microvolt = <1650000>;
+                               regulator-max-microvolt = <1950000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       BUCK6 {
+                               regulator-name = "BUCK6";
+                               regulator-min-microvolt = <1045000>;
+                               regulator-max-microvolt = <1155000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       LDO1 {
+                               regulator-name = "LDO1";
+                               regulator-min-microvolt = <1650000>;
+                               regulator-max-microvolt = <1950000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       LDO3 {
+                               regulator-name = "LDO3";
+                               regulator-min-microvolt = <1710000>;
+                               regulator-max-microvolt = <1890000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       LDO5 {
+                               regulator-name = "LDO5";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+               };
+       };
+};
+
 &i2c3 {
        clock-frequency = <400000>;
        pinctrl-names = "default";
 };
 
 &iomuxc {
+       pinctrl_eqos: eqosgrp {
+               fsl,pins = <
+                       MX8MP_IOMUXC_ENET_MDC__ENET_QOS_MDC                             0x3
+                       MX8MP_IOMUXC_ENET_MDIO__ENET_QOS_MDIO                           0x3
+                       MX8MP_IOMUXC_ENET_RD0__ENET_QOS_RGMII_RD0                       0x91
+                       MX8MP_IOMUXC_ENET_RD1__ENET_QOS_RGMII_RD1                       0x91
+                       MX8MP_IOMUXC_ENET_RD2__ENET_QOS_RGMII_RD2                       0x91
+                       MX8MP_IOMUXC_ENET_RD3__ENET_QOS_RGMII_RD3                       0x91
+                       MX8MP_IOMUXC_ENET_RXC__CCM_ENET_QOS_CLOCK_GENERATE_RX_CLK       0x91
+                       MX8MP_IOMUXC_ENET_RX_CTL__ENET_QOS_RGMII_RX_CTL                 0x91
+                       MX8MP_IOMUXC_ENET_TD0__ENET_QOS_RGMII_TD0                       0x1f
+                       MX8MP_IOMUXC_ENET_TD1__ENET_QOS_RGMII_TD1                       0x1f
+                       MX8MP_IOMUXC_ENET_TD2__ENET_QOS_RGMII_TD2                       0x1f
+                       MX8MP_IOMUXC_ENET_TD3__ENET_QOS_RGMII_TD3                       0x1f
+                       MX8MP_IOMUXC_ENET_TX_CTL__ENET_QOS_RGMII_TX_CTL                 0x1f
+                       MX8MP_IOMUXC_ENET_TXC__CCM_ENET_QOS_CLOCK_GENERATE_TX_CLK       0x1f
+                       MX8MP_IOMUXC_SAI2_RXC__GPIO4_IO22                               0x19
+               >;
+       };
+
        pinctrl_fec: fecgrp {
                fsl,pins = <
                        MX8MP_IOMUXC_SAI1_RXD2__ENET1_MDC               0x3
                >;
        };
 
+       pinctrl_i2c1: i2c1grp {
+               fsl,pins = <
+                       MX8MP_IOMUXC_I2C1_SCL__I2C1_SCL         0x400001c3
+                       MX8MP_IOMUXC_I2C1_SDA__I2C1_SDA         0x400001c3
+               >;
+       };
+
        pinctrl_i2c3: i2c3grp {
                fsl,pins = <
                        MX8MP_IOMUXC_I2C3_SCL__I2C3_SCL         0x400001c3
                >;
        };
 
+       pinctrl_pmic: pmicgrp {
+               fsl,pins = <
+                       MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03     0x000001c0
+               >;
+       };
+
        pinctrl_reg_usdhc2_vmmc: regusdhc2vmmcgrp {
                fsl,pins = <
                        MX8MP_IOMUXC_SD2_RESET_B__GPIO2_IO19    0x41
index f3965ec..aa78e0d 100644 (file)
        };
 };
 
+&flexspi {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_flexspi0>;
+       status = "okay";
+
+       som_flash: flash@0 {
+               compatible = "jedec,spi-nor";
+               reg = <0>;
+               spi-max-frequency = <80000000>;
+               spi-tx-bus-width = <4>;
+               spi-rx-bus-width = <4>;
+       };
+};
+
 &i2c1 {
        clock-frequency = <400000>;
        pinctrl-names = "default", "gpio";
                >;
        };
 
+       pinctrl_flexspi0: flexspi0grp {
+               fsl,pins = <
+                       MX8MP_IOMUXC_NAND_ALE__FLEXSPI_A_SCLK           0x1c2
+                       MX8MP_IOMUXC_NAND_CE0_B__FLEXSPI_A_SS0_B        0x82
+                       MX8MP_IOMUXC_NAND_DATA00__FLEXSPI_A_DATA00      0x82
+                       MX8MP_IOMUXC_NAND_DATA01__FLEXSPI_A_DATA01      0x82
+                       MX8MP_IOMUXC_NAND_DATA02__FLEXSPI_A_DATA02      0x82
+                       MX8MP_IOMUXC_NAND_DATA03__FLEXSPI_A_DATA03      0x82
+               >;
+       };
+
        pinctrl_i2c1: i2c1grp {
                fsl,pins = <
                        MX8MP_IOMUXC_I2C1_SCL__I2C1_SCL         0x400001c3
index c2d51a4..9f7c7f5 100644 (file)
@@ -37,6 +37,7 @@
                serial1 = &uart2;
                serial2 = &uart3;
                serial3 = &uart4;
+               spi0 = &flexspi;
        };
 
        cpus {
                                                  <&clk IMX8MP_CLK_GIC>,
                                                  <&clk IMX8MP_CLK_AUDIO_AHB>,
                                                  <&clk IMX8MP_CLK_AUDIO_AXI_SRC>,
-                                                 <&clk IMX8MP_CLK_IPG_AUDIO_ROOT>,
                                                  <&clk IMX8MP_AUDIO_PLL1>,
                                                  <&clk IMX8MP_AUDIO_PLL2>;
                                assigned-clock-parents = <&clk IMX8MP_SYS_PLL1_800M>,
                                                       <500000000>,
                                                       <400000000>,
                                                       <800000000>,
-                                                      <400000000>,
                                                       <393216000>,
                                                       <361267200>;
                        };
                                status = "disabled";
                        };
 
+                       flexspi: spi@30bb0000 {
+                               compatible = "nxp,imx8mp-fspi";
+                               reg = <0x30bb0000 0x10000>, <0x8000000 0x10000000>;
+                               reg-names = "fspi_base", "fspi_mmap";
+                               interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_QSPI_ROOT>,
+                                        <&clk IMX8MP_CLK_QSPI_ROOT>;
+                               clock-names = "fspi", "fspi_en";
+                               assigned-clock-rates = <80000000>;
+                               assigned-clocks = <&clk IMX8MP_CLK_QSPI>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               status = "disabled";
+                       };
+
                        sdma1: dma-controller@30bd0000 {
                                compatible = "fsl,imx8mp-sdma", "fsl,imx8mq-sdma";
                                reg = <0x30bd0000 0x10000>;
index 85b0452..4d2035e 100644 (file)
                 <&clk IMX8MQ_CLK_PCIE1_PHY>,
                 <&pcie0_refclk>;
        clock-names = "pcie", "pcie_aux", "pcie_phy", "pcie_bus";
+       vph-supply = <&vgen5_reg>;
        status = "okay";
 };
 
index 81d2692..f70fb32 100644 (file)
                };
        };
 
+       hdmi-connector {
+               compatible = "hdmi-connector";
+               ddc-i2c-bus = <&ddc_i2c_bus>;
+               label = "hdmi";
+               type = "a";
+
+               port {
+                       hdmi_connector_in: endpoint {
+                               remote-endpoint = <&lt8912_out>;
+                       };
+               };
+       };
+
+       reg_usb_otg_vbus: regulator-usb-otg-vbus {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_reg_usbotg_vbus>;
+               regulator-name = "usb_otg_vbus";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               gpio = <&gpio1 12 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
        reg_vref_0v9: regulator-vref-0v9 {
                compatible = "regulator-fixed";
                regulator-name = "vref-0v9";
@@ -70,6 +94,9 @@
        };
 };
 
+&dphy {
+       status = "okay";
+};
 
 &fec1 {
        pinctrl-names = "default";
        };
 };
 
+/* Release reset of the USB Host HUB */
+&gpio1 {
+       usb-host-reset-hog {
+               gpio-hog;
+               gpios = <14 GPIO_ACTIVE_HIGH>;
+               output-high;
+       };
+};
+
 &i2c1 {
        clock-frequency = <400000>;
        pinctrl-names = "default";
        };
 };
 
+&i2c4 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c4>;
+       status = "okay";
+
+       pca9546: i2cmux@70 {
+               compatible = "nxp,pca9546";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               i2c4@0 {
+                       reg = <0>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       clock-frequency = <100000>;
+
+                       hdmi-bridge@48 {
+                               compatible = "lontium,lt8912b";
+                               reg = <0x48> ;
+                               reset-gpios = <&max7323 0 GPIO_ACTIVE_LOW>;
+
+                               ports {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       port@0 {
+                                               reg = <0>;
+
+                                               hdmi_out_in: endpoint {
+                                                       data-lanes = <1 2 3 4>;
+                                                       remote-endpoint = <&mipi_dsi_out>;
+                                               };
+                                       };
+
+                                       port@1 {
+                                               reg = <1>;
+
+                                               lt8912_out: endpoint {
+                                                       remote-endpoint = <&hdmi_connector_in>;
+                                               };
+                                       };
+                               };
+                       };
+               };
+
+               ddc_i2c_bus: i2c4@1 {
+                       reg = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       clock-frequency = <100000>;
+               };
+
+               i2c4@3 {
+                       reg = <3>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       clock-frequency = <100000>;
+
+                       max7323: gpio-expander@68 {
+                               compatible = "maxim,max7323";
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_max7323>;
+                               gpio-controller;
+                               reg = <0x68>;
+                               #gpio-cells = <2>;
+                       };
+               };
+       };
+};
+
+&lcdif {
+       status = "okay";
+};
+
+&mipi_dsi {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       status = "okay";
+
+       ports {
+               port@1 {
+                       reg = <1>;
+
+                       mipi_dsi_out: endpoint {
+                               remote-endpoint = <&hdmi_out_in>;
+                       };
+               };
+       };
+};
+
 &uart1 { /* console */
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_uart1>;
        status = "okay";
 };
 
+&usb_dwc3_0 {
+       dr_mode = "otg";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usb3_0>;
+       status = "okay";
+};
+
+&usb3_phy0 {
+       vbus-supply = <&reg_usb_otg_vbus>;
+       status = "okay";
+};
+
+&usb_dwc3_1 {
+       dr_mode = "host";
+       status = "okay";
+};
+
+&usb3_phy1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usb3_1>;
+       status = "okay";
+};
+
 &usdhc1 {
        assigned-clocks = <&clk IMX8MQ_CLK_USDHC1>;
        assigned-clock-rates = <400000000>;
                >;
        };
 
+       pinctrl_i2c4: i2c4grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_I2C4_SCL_I2C4_SCL                  0x4000007f
+                       MX8MQ_IOMUXC_I2C4_SDA_I2C4_SDA                  0x4000007f
+               >;
+       };
+
+       pinctrl_max7323: max7323grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_NAND_RE_B_GPIO3_IO15 0x19
+               >;
+       };
+
        pinctrl_reg_arm_dram: reg-arm-dramgrp {
                fsl,pins = <
                        MX8MQ_IOMUXC_SAI5_RXD3_GPIO3_IO24       0x16
                >;
        };
 
+       pinctrl_reg_usbotg_vbus: reg-usbotg-vbusgrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_GPIO1_IO12_GPIO1_IO12      0x16
+               >;
+       };
+
        pinctrl_uart1: uart1grp {
                fsl,pins = <
                        MX8MQ_IOMUXC_UART1_RXD_UART1_DCE_RX             0x45
                >;
        };
 
+       pinctrl_usb3_0: usb3-0grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_GPIO1_IO13_USB1_OTG_OC             0x16
+               >;
+       };
+
+       pinctrl_usb3_1: usb3-1grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_GPIO1_IO14_GPIO1_IO14              0x16
+               >;
+       };
+
        pinctrl_usdhc1: usdhc1grp {
                fsl,pins = <
                        MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK                 0x83
index 17c449e..91df9c5 100644 (file)
                                 <&src IMX8MQ_RESET_PCIE_CTRL_APPS_EN>,
                                 <&src IMX8MQ_RESET_PCIE_CTRL_APPS_TURNOFF>;
                        reset-names = "pciephy", "apps", "turnoff";
+                       assigned-clocks = <&clk IMX8MQ_CLK_PCIE1_CTRL>,
+                                         <&clk IMX8MQ_CLK_PCIE1_PHY>,
+                                         <&clk IMX8MQ_CLK_PCIE1_AUX>;
+                       assigned-clock-parents = <&clk IMX8MQ_SYS2_PLL_250M>,
+                                                <&clk IMX8MQ_SYS2_PLL_100M>,
+                                                <&clk IMX8MQ_SYS1_PLL_80M>;
+                       assigned-clock-rates = <250000000>, <100000000>,
+                                              <10000000>;
                        status = "disabled";
                };
 
                                 <&src IMX8MQ_RESET_PCIE2_CTRL_APPS_EN>,
                                 <&src IMX8MQ_RESET_PCIE2_CTRL_APPS_TURNOFF>;
                        reset-names = "pciephy", "apps", "turnoff";
+                       assigned-clocks = <&clk IMX8MQ_CLK_PCIE2_CTRL>,
+                                         <&clk IMX8MQ_CLK_PCIE2_PHY>,
+                                         <&clk IMX8MQ_CLK_PCIE2_AUX>;
+                       assigned-clock-parents = <&clk IMX8MQ_SYS2_PLL_250M>,
+                                                <&clk IMX8MQ_SYS2_PLL_100M>,
+                                                <&clk IMX8MQ_SYS1_PLL_80M>;
+                       assigned-clock-rates = <250000000>, <100000000>,
+                                              <10000000>;
                        status = "disabled";
                };
 
index d607f2f..79a55a0 100644 (file)
@@ -3,7 +3,7 @@
 /*
  * dtsi for Hisilicon Hi3660 Coresight
  *
- * Copyright (C) 2016-2018 Hisilicon Ltd.
+ * Copyright (C) 2016-2018 HiSilicon Ltd.
  *
  * Author: Wanglai Shi <shiwanglai@hisilicon.com>
  *
index 963300e..f68580d 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Hisilicon HiKey960 Development Board
  *
- * Copyright (C) 2016, Hisilicon Ltd.
+ * Copyright (C) 2016, HiSilicon Ltd.
  *
  */
 
index cab89dc..f1ec87c 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Hisilicon Hi3660 SoC
  *
- * Copyright (C) 2016, Hisilicon Ltd.
+ * Copyright (C) 2016, HiSilicon Ltd.
  */
 
 #include <dt-bindings/interrupt-controller/arm-gic.h>
index 7f9f988..d8abf44 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Hisilicon HiKey970 Development Board
  *
- * Copyright (C) 2016, Hisilicon Ltd.
+ * Copyright (C) 2016, HiSilicon Ltd.
  * Copyright (C) 2018, Linaro Ltd.
  *
  */
index 8830795..20698cf 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Hisilicon Hi3670 SoC
  *
- * Copyright (C) 2016, Hisilicon Ltd.
+ * Copyright (C) 2016, HiSilicon Ltd.
  * Copyright (C) 2018, Linaro Ltd.
  */
 
index 7b3010f..3f387f4 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dtsi file for Hisilicon Hi6220 coresight
  *
- * Copyright (C) 2017 Hisilicon Ltd.
+ * Copyright (C) 2017 HiSilicon Ltd.
  *
  * Author: Pengcheng Li <lipengcheng8@huawei.com>
  *         Leo Yan <leo.yan@linaro.org>
index 91d0867..3df2afb 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Hisilicon HiKey Development Board
  *
- * Copyright (C) 2015, Hisilicon Ltd.
+ * Copyright (C) 2015, HiSilicon Ltd.
  *
  */
 
index d426c6c..dde9371 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Hisilicon Hi6220 SoC
  *
- * Copyright (C) 2015, Hisilicon Ltd.
+ * Copyright (C) 2015, HiSilicon Ltd.
  */
 
 #include <dt-bindings/interrupt-controller/arm-gic.h>
index 369b69b..40f3e00 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * dts file for Hisilicon D02 Development Board
  *
- * Copyright (C) 2014,2015 Hisilicon Ltd.
+ * Copyright (C) 2014,2015 HiSilicon Ltd.
  */
 
 /dts-v1/;
index 4aed8d4..7b2abd1 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * dts file for Hisilicon D02 Development Board
  *
- * Copyright (C) 2014,2015 Hisilicon Ltd.
+ * Copyright (C) 2014,2015 HiSilicon Ltd.
  */
 
 #include <dt-bindings/interrupt-controller/arm-gic.h>
index 9f4a930..35af5d3 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * dts file for Hisilicon D03 Development Board
  *
- * Copyright (C) 2016 Hisilicon Ltd.
+ * Copyright (C) 2016 HiSilicon Ltd.
  */
 
 /dts-v1/;
index 7deca5f..70d7732 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * dts file for Hisilicon D03 Development Board
  *
- * Copyright (C) 2016 Hisilicon Ltd.
+ * Copyright (C) 2016 HiSilicon Ltd.
  */
 
 #include <dt-bindings/interrupt-controller/arm-gic.h>
index 81a2312..c3df678 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * dts file for Hisilicon D05 Development Board
  *
- * Copyright (C) 2016 Hisilicon Ltd.
+ * Copyright (C) 2016 HiSilicon Ltd.
  */
 
 /dts-v1/;
index 2172d80..6baf6a6 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * dts file for Hisilicon D05 Development Board
  *
- * Copyright (C) 2016 Hisilicon Ltd.
+ * Copyright (C) 2016 HiSilicon Ltd.
  */
 
 #include <dt-bindings/interrupt-controller/arm-gic.h>
index 53e817c..ce2bcdd 100644 (file)
        };
 
        firmware {
-               turris-mox-rwtm {
-                       compatible = "cznic,turris-mox-rwtm";
-                       mboxes = <&rwtm 0>;
-                       status = "okay";
+               armada-3700-rwtm {
+                       compatible = "marvell,armada-3700-rwtm-firmware", "cznic,turris-mox-rwtm";
                };
        };
 };
index 456dcd4..950eac5 100644 (file)
                        };
                };
        };
+
+       firmware {
+               armada-3700-rwtm {
+                       compatible = "marvell,armada-3700-rwtm-firmware";
+                       mboxes = <&rwtm 0>;
+                       status = "okay";
+               };
+       };
 };
index d9bbbfa..4a23f65 100644 (file)
@@ -29,6 +29,7 @@
 };
 
 &ap_sdhci0 {
-       compatible = "marvell,armada-ap807-sdhci";
+       compatible = "marvell,armada-ap807-sdhci",
+                    "marvell,armada-ap806-sdhci"; /* Backward compatibility */
 };
 
index 2c2af00..9758609 100644 (file)
                        };
                        partition@200000 {
                                label = "Linux";
-                               reg = <0x200000 0xd00000>;
+                               reg = <0x200000 0xe00000>;
                        };
                        partition@1000000 {
                                label = "Filesystem";
index a1c50ad..4f68ebe 100644 (file)
@@ -13,8 +13,16 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt8173-elm-hana.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8173-elm-hana-rev7.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8173-evb.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-evb.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-jacuzzi-burnet.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-jacuzzi-damu.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-jacuzzi-fennel-sku1.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-jacuzzi-fennel-sku6.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-jacuzzi-fennel14.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-jacuzzi-juniper-sku16.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-jacuzzi-kappa.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-jacuzzi-kenzo.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-jacuzzi-willow-sku0.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-jacuzzi-willow-sku1.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-kakadu.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-kodama-sku16.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-kodama-sku272.dtb
index 1c5639e..9029051 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <dt-bindings/clock/mt8167-clk.h>
 #include <dt-bindings/memory/mt8167-larb-port.h>
+#include <dt-bindings/power/mt8167-power.h>
 
 #include "mt8167-pinfunc.h"
 
                        #clock-cells = <1>;
                };
 
+               scpsys: syscon@10006000 {
+                       compatible = "syscon", "simple-mfd";
+                       reg = <0 0x10006000 0 0x1000>;
+                       #power-domain-cells = <1>;
+
+                       spm: power-controller {
+                               compatible = "mediatek,mt8167-power-controller";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               #power-domain-cells = <1>;
+
+                               /* power domains of the SoC */
+                               power-domain@MT8167_POWER_DOMAIN_MM {
+                                       reg = <MT8167_POWER_DOMAIN_MM>;
+                                       clocks = <&topckgen CLK_TOP_SMI_MM>;
+                                       clock-names = "mm";
+                                       #power-domain-cells = <0>;
+                                       mediatek,infracfg = <&infracfg>;
+                               };
+
+                               power-domain@MT8167_POWER_DOMAIN_VDEC {
+                                       reg = <MT8167_POWER_DOMAIN_VDEC>;
+                                       clocks = <&topckgen CLK_TOP_SMI_MM>,
+                                                <&topckgen CLK_TOP_RG_VDEC>;
+                                       clock-names = "mm", "vdec";
+                                       #power-domain-cells = <0>;
+                               };
+
+                               power-domain@MT8167_POWER_DOMAIN_ISP {
+                                       reg = <MT8167_POWER_DOMAIN_ISP>;
+                                       clocks = <&topckgen CLK_TOP_SMI_MM>;
+                                       clock-names = "mm";
+                                       #power-domain-cells = <0>;
+                               };
+
+                               power-domain@MT8167_POWER_DOMAIN_MFG_ASYNC {
+                                       reg = <MT8167_POWER_DOMAIN_MFG_ASYNC>;
+                                       clocks = <&topckgen CLK_TOP_RG_AXI_MFG>,
+                                                <&topckgen CLK_TOP_RG_SLOW_MFG>;
+                                       clock-names = "axi_mfg", "mfg";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       #power-domain-cells = <1>;
+                                       mediatek,infracfg = <&infracfg>;
+
+                                       power-domain@MT8167_POWER_DOMAIN_MFG_2D {
+                                               reg = <MT8167_POWER_DOMAIN_MFG_2D>;
+                                               #address-cells = <1>;
+                                               #size-cells = <0>;
+                                               #power-domain-cells = <1>;
+
+                                               power-domain@MT8167_POWER_DOMAIN_MFG {
+                                                       reg = <MT8167_POWER_DOMAIN_MFG>;
+                                                       #power-domain-cells = <0>;
+                                                       mediatek,infracfg = <&infracfg>;
+                                               };
+                                       };
+                               };
+
+                               power-domain@MT8167_POWER_DOMAIN_CONN {
+                                       reg = <MT8167_POWER_DOMAIN_CONN>;
+                                       #power-domain-cells = <0>;
+                                       mediatek,infracfg = <&infracfg>;
+                               };
+                       };
+               };
+
                imgsys: syscon@15000000 {
                        compatible = "mediatek,mt8167-imgsys", "syscon";
                        reg = <0 0x15000000 0 0x1000>;
                        #interrupt-cells = <2>;
                        interrupts = <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>;
                };
+
+               mmsys: mmsys@14000000 {
+                       compatible = "mediatek,mt8167-mmsys", "syscon";
+                       reg = <0 0x14000000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               smi_common: smi@14017000 {
+                       compatible = "mediatek,mt8167-smi-common";
+                       reg = <0 0x14017000 0 0x1000>;
+                       clocks = <&mmsys CLK_MM_SMI_COMMON>,
+                                <&mmsys CLK_MM_SMI_COMMON>;
+                       clock-names = "apb", "smi";
+                       power-domains = <&spm MT8167_POWER_DOMAIN_MM>;
+               };
+
+               larb0: larb@14016000 {
+                       compatible = "mediatek,mt8167-smi-larb";
+                       reg = <0 0x14016000 0 0x1000>;
+                       mediatek,smi = <&smi_common>;
+                       clocks = <&mmsys CLK_MM_SMI_LARB0>,
+                                <&mmsys CLK_MM_SMI_LARB0>;
+                       clock-names = "apb", "smi";
+                       power-domains = <&spm MT8167_POWER_DOMAIN_MM>;
+               };
+
+               larb1: larb@15001000 {
+                       compatible = "mediatek,mt8167-smi-larb";
+                       reg = <0 0x15001000 0 0x1000>;
+                       mediatek,smi = <&smi_common>;
+                       clocks = <&imgsys CLK_IMG_LARB1_SMI>,
+                                <&imgsys CLK_IMG_LARB1_SMI>;
+                       clock-names = "apb", "smi";
+                       power-domains = <&spm MT8167_POWER_DOMAIN_ISP>;
+               };
+
+               larb2: larb@16010000 {
+                       compatible = "mediatek,mt8167-smi-larb";
+                       reg = <0 0x16010000 0 0x1000>;
+                       mediatek,smi = <&smi_common>;
+                       clocks = <&vdecsys CLK_VDEC_CKEN>,
+                                <&vdecsys CLK_VDEC_LARB1_CKEN>;
+                       clock-names = "apb", "smi";
+                       power-domains = <&spm MT8167_POWER_DOMAIN_VDEC>;
+               };
+
+               iommu: m4u@10203000 {
+                       compatible = "mediatek,mt8167-m4u";
+                       reg = <0 0x10203000 0 0x1000>;
+                       mediatek,larbs = <&larb0 &larb1 &larb2>;
+                       interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_LOW>;
+                       #iommu-cells = <1>;
+               };
        };
 };
index 003a565..22f271b 100644 (file)
                        clock-names = "apb", "smi";
                };
 
-               vcodec_enc: vcodec@18002000 {
+               vcodec_enc_avc: vcodec@18002000 {
                        compatible = "mediatek,mt8173-vcodec-enc";
-                       reg = <0 0x18002000 0 0x1000>,  /* VENC_SYS */
-                             <0 0x19002000 0 0x1000>;  /* VENC_LT_SYS */
-                       interrupts = <GIC_SPI 198 IRQ_TYPE_LEVEL_LOW>,
-                                    <GIC_SPI 202 IRQ_TYPE_LEVEL_LOW>;
-                       mediatek,larb = <&larb3>,
-                                       <&larb5>;
+                       reg = <0 0x18002000 0 0x1000>;  /* VENC_SYS */
+                       interrupts = <GIC_SPI 198 IRQ_TYPE_LEVEL_LOW>;
+                       mediatek,larb = <&larb3>;
                        iommus = <&iommu M4U_PORT_VENC_RCPU>,
                                 <&iommu M4U_PORT_VENC_REC>,
                                 <&iommu M4U_PORT_VENC_BSDMA>,
                                 <&iommu M4U_PORT_VENC_REF_LUMA>,
                                 <&iommu M4U_PORT_VENC_REF_CHROMA>,
                                 <&iommu M4U_PORT_VENC_NBM_RDMA>,
-                                <&iommu M4U_PORT_VENC_NBM_WDMA>,
-                                <&iommu M4U_PORT_VENC_RCPU_SET2>,
-                                <&iommu M4U_PORT_VENC_REC_FRM_SET2>,
-                                <&iommu M4U_PORT_VENC_BSDMA_SET2>,
-                                <&iommu M4U_PORT_VENC_SV_COMA_SET2>,
-                                <&iommu M4U_PORT_VENC_RD_COMA_SET2>,
-                                <&iommu M4U_PORT_VENC_CUR_LUMA_SET2>,
-                                <&iommu M4U_PORT_VENC_CUR_CHROMA_SET2>,
-                                <&iommu M4U_PORT_VENC_REF_LUMA_SET2>,
-                                <&iommu M4U_PORT_VENC_REC_CHROMA_SET2>;
+                                <&iommu M4U_PORT_VENC_NBM_WDMA>;
                        mediatek,vpu = <&vpu>;
-                       clocks = <&topckgen CLK_TOP_VENCPLL_D2>,
-                                <&topckgen CLK_TOP_VENC_SEL>,
-                                <&topckgen CLK_TOP_UNIVPLL1_D2>,
-                                <&topckgen CLK_TOP_VENC_LT_SEL>;
-                       clock-names = "venc_sel_src",
-                                     "venc_sel",
-                                     "venc_lt_sel_src",
-                                     "venc_lt_sel";
-                       assigned-clocks = <&topckgen CLK_TOP_VENC_SEL>,
-                                         <&topckgen CLK_TOP_VENC_LT_SEL>;
-                       assigned-clock-parents = <&topckgen CLK_TOP_VCODECPLL>,
-                                                <&topckgen CLK_TOP_VCODECPLL_370P5>;
+                       clocks = <&topckgen CLK_TOP_VENC_SEL>;
+                       clock-names = "venc_sel";
+                       assigned-clocks = <&topckgen CLK_TOP_VENC_SEL>;
+                       assigned-clock-parents = <&topckgen CLK_TOP_VCODECPLL>;
                };
 
                jpegdec: jpegdec@18004000 {
                                 <&vencltsys CLK_VENCLT_CKE0>;
                        clock-names = "apb", "smi";
                };
+
+               vcodec_enc_vp8: vcodec@19002000 {
+                       compatible = "mediatek,mt8173-vcodec-enc-vp8";
+                       reg =  <0 0x19002000 0 0x1000>; /* VENC_LT_SYS */
+                       interrupts = <GIC_SPI 202 IRQ_TYPE_LEVEL_LOW>;
+                       iommus = <&iommu M4U_PORT_VENC_RCPU_SET2>,
+                                <&iommu M4U_PORT_VENC_REC_FRM_SET2>,
+                                <&iommu M4U_PORT_VENC_BSDMA_SET2>,
+                                <&iommu M4U_PORT_VENC_SV_COMA_SET2>,
+                                <&iommu M4U_PORT_VENC_RD_COMA_SET2>,
+                                <&iommu M4U_PORT_VENC_CUR_LUMA_SET2>,
+                                <&iommu M4U_PORT_VENC_CUR_CHROMA_SET2>,
+                                <&iommu M4U_PORT_VENC_REF_LUMA_SET2>,
+                                <&iommu M4U_PORT_VENC_REC_CHROMA_SET2>;
+                       mediatek,larb = <&larb5>;
+                       mediatek,vpu = <&vpu>;
+                       clocks = <&topckgen CLK_TOP_VENC_LT_SEL>;
+                       clock-names = "venc_lt_sel";
+                       assigned-clocks = <&topckgen CLK_TOP_VENC_LT_SEL>;
+                       assigned-clock-parents =
+                                <&topckgen CLK_TOP_VCODECPLL_370P5>;
+               };
        };
 };
index edff1e0..7bc0a6a 100644 (file)
        status = "okay";
 };
 
+&gpu {
+       mali-supply = <&mt6358_vgpu_reg>;
+       sram-supply = <&mt6358_vsram_gpu_reg>;
+};
+
 &i2c0 {
        pinctrl-names = "default";
        pinctrl-0 = <&i2c_pins_0>;
diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts
new file mode 100644 (file)
index 0000000..a8d6f32
--- /dev/null
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2021 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8183-kukui-jacuzzi.dtsi"
+
+/ {
+       model = "Google burnet board";
+       compatible = "google,burnet", "mediatek,mt8183";
+};
+
+&mt6358codec {
+       mediatek,dmic-mode = <1>; /* one-wire */
+};
+
+&i2c0 {
+       touchscreen@2c {
+               compatible = "hid-over-i2c";
+               reg = <0x2c>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&touchscreen_pins>;
+               interrupts-extended = <&pio 155 IRQ_TYPE_LEVEL_LOW>;
+
+               post-power-on-delay-ms = <200>;
+               hid-descr-addr = <0x0020>;
+       };
+};
+
diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel-sku1.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel-sku1.dts
new file mode 100644 (file)
index 0000000..ef6257c
--- /dev/null
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2021 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8183-kukui-jacuzzi-fennel.dtsi"
+
+/ {
+       model = "Google fennel sku1 board";
+       compatible = "google,fennel-sku1", "google,fennel", "mediatek,mt8183";
+
+       pwmleds {
+               compatible = "pwm-leds";
+               keyboard_backlight: keyboard-backlight {
+                       label = "cros_ec::kbd_backlight";
+                       pwms = <&cros_ec_pwm 0>;
+                       max-brightness = <1023>;
+               };
+       };
+};
+
+&cros_ec_pwm {
+       status = "okay";
+};
+
+&touchscreen {
+       status = "okay";
+
+       compatible = "hid-over-i2c";
+       reg = <0x10>;
+       interrupt-parent = <&pio>;
+       interrupts = <155 IRQ_TYPE_LEVEL_LOW>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&touchscreen_pins>;
+
+       post-power-on-delay-ms = <10>;
+       hid-descr-addr = <0x0001>;
+};
+
+&qca_wifi {
+       qcom,ath10k-calibration-variant = "GO_FENNEL";
+};
+
diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel-sku6.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel-sku6.dts
new file mode 100644 (file)
index 0000000..899c2e4
--- /dev/null
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2021 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8183-kukui-jacuzzi-fennel.dtsi"
+
+/ {
+       model = "Google fennel sku6 board";
+       compatible = "google,fennel-sku6", "google,fennel", "mediatek,mt8183";
+};
+
+&touchscreen {
+       status = "okay";
+
+       compatible = "hid-over-i2c";
+       reg = <0x10>;
+       interrupt-parent = <&pio>;
+       interrupts = <155 IRQ_TYPE_LEVEL_LOW>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&touchscreen_pins>;
+
+       post-power-on-delay-ms = <10>;
+       hid-descr-addr = <0x0001>;
+};
+
+
+&qca_wifi {
+       qcom,ath10k-calibration-variant = "GO_FENNEL";
+};
+
diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi
new file mode 100644 (file)
index 0000000..bbe6c33
--- /dev/null
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2021 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8183-kukui-jacuzzi.dtsi"
+
+&mt6358codec {
+       mediatek,dmic-mode = <1>; /* one-wire */
+};
+
+&i2c2 {
+       trackpad@2c {
+               compatible = "hid-over-i2c";
+               reg = <0x2c>;
+               hid-descr-addr = <0x20>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&trackpad_pins>;
+
+               interrupts-extended = <&pio 7 IRQ_TYPE_LEVEL_LOW>;
+
+               wakeup-source;
+       };
+};
+
diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel14.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel14.dts
new file mode 100644 (file)
index 0000000..e8c41f6
--- /dev/null
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2021 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8183-kukui-jacuzzi-fennel.dtsi"
+
+/ {
+       model = "Google fennel14 sku0 board";
+       compatible = "google,fennel-sku0", "google,fennel", "mediatek,mt8183";
+};
+
+&qca_wifi {
+       qcom,ath10k-calibration-variant = "GO_FENNEL14";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-kappa.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-kappa.dts
new file mode 100644 (file)
index 0000000..b3f46c1
--- /dev/null
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2021 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8183-kukui-jacuzzi.dtsi"
+
+/ {
+       model = "Google kappa board";
+       compatible = "google,kappa", "mediatek,mt8183";
+};
+
+&mt6358codec {
+       mediatek,dmic-mode = <1>; /* one-wire */
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-kenzo.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-kenzo.dts
new file mode 100644 (file)
index 0000000..6f1aa69
--- /dev/null
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2021 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8183-kukui-jacuzzi-juniper.dtsi"
+
+/ {
+       model = "Google kenzo sku17 board";
+       compatible = "google,juniper-sku17", "google,juniper", "mediatek,mt8183";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-willow-sku0.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-willow-sku0.dts
new file mode 100644 (file)
index 0000000..281265f
--- /dev/null
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2021 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8183-kukui-jacuzzi-willow.dtsi"
+
+/ {
+       model = "Google willow board sku0";
+       compatible = "google,willow-sku0", "google,willow", "mediatek,mt8183";
+};
+
diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-willow-sku1.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-willow-sku1.dts
new file mode 100644 (file)
index 0000000..22e56bd
--- /dev/null
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2021 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8183-kukui-jacuzzi-willow.dtsi"
+
+/ {
+       model = "Google willow board sku1";
+       compatible = "google,willow-sku1", "google,willow", "mediatek,mt8183";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-willow.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-willow.dtsi
new file mode 100644 (file)
index 0000000..76d3354
--- /dev/null
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2021 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8183-kukui-jacuzzi.dtsi"
+
+&i2c2 {
+       trackpad@2c {
+               compatible = "hid-over-i2c";
+               reg = <0x2c>;
+               hid-descr-addr = <0x20>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&trackpad_pins>;
+
+               interrupts-extended = <&pio 7 IRQ_TYPE_LEVEL_LOW>;
+
+               wakeup-source;
+       };
+};
+
+&qca_wifi {
+       qcom,ath10k-calibration-variant = "GO_JUNIPER";
+};
index 4049dff..d8826c8 100644 (file)
        };
 };
 
+&cros_ec {
+       cros_ec_pwm: ec-pwm {
+               compatible = "google,cros-ec-pwm";
+               #pwm-cells = <1>;
+               status = "disabled";
+       };
+};
+
 &dsi0 {
        status = "okay";
        /delete-node/panel@0;
index b442e38..28966a6 100644 (file)
        pinctrl-0 = <&i2c2_pins>;
        status = "okay";
        clock-frequency = <400000>;
+       vbus-supply = <&mt6358_vcamio_reg>;
 
        eeprom@58 {
                compatible = "atmel,24c32";
                reg = <0x58>;
                pagesize = <32>;
+               vcc-supply = <&mt6358_vcama2_reg>;
        };
 };
 
        pinctrl-0 = <&i2c4_pins>;
        status = "okay";
        clock-frequency = <400000>;
+       vbus-supply = <&mt6358_vcn18_reg>;
 
        eeprom@54 {
                compatible = "atmel,24c32";
                reg = <0x54>;
                pagesize = <32>;
+               vcc-supply = <&mt6358_vcn18_reg>;
        };
 };
 
index 2f5234a..3aa7940 100644 (file)
        pinctrl-0 = <&i2c2_pins>;
        status = "okay";
        clock-frequency = <400000>;
+       vbus-supply = <&mt6358_vcamio_reg>;
 
        eeprom@58 {
                compatible = "atmel,24c64";
                reg = <0x58>;
                pagesize = <32>;
+               vcc-supply = <&mt6358_vcamio_reg>;
        };
 };
 
        pinctrl-0 = <&i2c4_pins>;
        status = "okay";
        clock-frequency = <400000>;
+       vbus-supply = <&mt6358_vcn18_reg>;
 
        eeprom@54 {
                compatible = "atmel,24c64";
                reg = <0x54>;
                pagesize = <32>;
+               vcc-supply = <&mt6358_vcn18_reg>;
        };
 };
 
index fbc471c..30c183c 100644 (file)
        pinctrl-0 = <&i2c2_pins>;
        status = "okay";
        clock-frequency = <400000>;
+       vbus-supply = <&mt6358_vcamio_reg>;
 
        eeprom@58 {
                compatible = "atmel,24c32";
                reg = <0x58>;
                pagesize = <32>;
+               vcc-supply = <&mt6358_vcama2_reg>;
        };
 };
 
        pinctrl-0 = <&i2c4_pins>;
        status = "okay";
        clock-frequency = <400000>;
+       vbus-supply = <&mt6358_vcn18_reg>;
 
        eeprom@54 {
                compatible = "atmel,24c32";
                reg = <0x54>;
                pagesize = <32>;
+               vcc-supply = <&mt6358_vcn18_reg>;
        };
 };
 
index ff56bcf..ae549d5 100644 (file)
        };
 };
 
+&gpu {
+       mali-supply = <&mt6358_vgpu_reg>;
+       sram-supply = <&mt6358_vsram_gpu_reg>;
+};
+
 &i2c0 {
        pinctrl-names = "default";
        pinctrl-0 = <&i2c0_pins>;
                        compatible = "google,extcon-usbc-cros-ec";
                        google,usb-port-id = <0>;
                };
+
+               cbas {
+                       compatible = "google,cros-cbas";
+               };
        };
 };
 
        status = "okay";
 };
 
+&thermal_zones {
+       tboard1 {
+               polling-delay = <1000>; /* milliseconds */
+               polling-delay-passive = <0>; /* milliseconds */
+               thermal-sensors = <&tboard_thermistor1>;
+       };
+
+       tboard2 {
+               polling-delay = <1000>; /* milliseconds */
+               polling-delay-passive = <0>; /* milliseconds */
+               thermal-sensors = <&tboard_thermistor2>;
+       };
+};
+
 &u3phy {
        status = "okay";
 };
index 0aff5eb..ee91282 100644 (file)
        status = "okay";
 };
 
+&gpu {
+       mali-supply = <&mt6358_vgpu_reg>;
+       sram-supply = <&mt6358_vsram_gpu_reg>;
+};
+
 &i2c0 {
        pinctrl-names = "default";
        pinctrl-0 = <&i2c_pins_0>;
index c5e822b..f90df64 100644 (file)
                };
        };
 
+       gpu_opp_table: opp_table0 {
+               compatible = "operating-points-v2";
+               opp-shared;
+
+               opp-300000000 {
+                       opp-hz = /bits/ 64 <300000000>;
+                       opp-microvolt = <625000>, <850000>;
+               };
+
+               opp-320000000 {
+                       opp-hz = /bits/ 64 <320000000>;
+                       opp-microvolt = <631250>, <850000>;
+               };
+
+               opp-340000000 {
+                       opp-hz = /bits/ 64 <340000000>;
+                       opp-microvolt = <637500>, <850000>;
+               };
+
+               opp-360000000 {
+                       opp-hz = /bits/ 64 <360000000>;
+                       opp-microvolt = <643750>, <850000>;
+               };
+
+               opp-380000000 {
+                       opp-hz = /bits/ 64 <380000000>;
+                       opp-microvolt = <650000>, <850000>;
+               };
+
+               opp-400000000 {
+                       opp-hz = /bits/ 64 <400000000>;
+                       opp-microvolt = <656250>, <850000>;
+               };
+
+               opp-420000000 {
+                       opp-hz = /bits/ 64 <420000000>;
+                       opp-microvolt = <662500>, <850000>;
+               };
+
+               opp-460000000 {
+                       opp-hz = /bits/ 64 <460000000>;
+                       opp-microvolt = <675000>, <850000>;
+               };
+
+               opp-500000000 {
+                       opp-hz = /bits/ 64 <500000000>;
+                       opp-microvolt = <687500>, <850000>;
+               };
+
+               opp-540000000 {
+                       opp-hz = /bits/ 64 <540000000>;
+                       opp-microvolt = <700000>, <850000>;
+               };
+
+               opp-580000000 {
+                       opp-hz = /bits/ 64 <580000000>;
+                       opp-microvolt = <712500>, <850000>;
+               };
+
+               opp-620000000 {
+                       opp-hz = /bits/ 64 <620000000>;
+                       opp-microvolt = <725000>, <850000>;
+               };
+
+               opp-653000000 {
+                       opp-hz = /bits/ 64 <653000000>;
+                       opp-microvolt = <743750>, <850000>;
+               };
+
+               opp-698000000 {
+                       opp-hz = /bits/ 64 <698000000>;
+                       opp-microvolt = <768750>, <868750>;
+               };
+
+               opp-743000000 {
+                       opp-hz = /bits/ 64 <743000000>;
+                       opp-microvolt = <793750>, <893750>;
+               };
+
+               opp-800000000 {
+                       opp-hz = /bits/ 64 <800000000>;
+                       opp-microvolt = <825000>, <925000>;
+               };
+       };
+
        pmu-a53 {
                compatible = "arm,cortex-a53-pmu";
                interrupt-parent = <&gic>;
                        nvmem-cell-names = "calibration-data";
                };
 
-               thermal-zones {
+               thermal_zones: thermal-zones {
                        cpu_thermal: cpu_thermal {
                                polling-delay-passive = <100>;
                                polling-delay = <500>;
                        #clock-cells = <1>;
                };
 
+               gpu: gpu@13040000 {
+                       compatible = "mediatek,mt8183-mali", "arm,mali-bifrost";
+                       reg = <0 0x13040000 0 0x4000>;
+                       interrupts =
+                               <GIC_SPI 280 IRQ_TYPE_LEVEL_LOW>,
+                               <GIC_SPI 279 IRQ_TYPE_LEVEL_LOW>,
+                               <GIC_SPI 278 IRQ_TYPE_LEVEL_LOW>;
+                       interrupt-names = "job", "mmu", "gpu";
+
+                       clocks = <&topckgen CLK_TOP_MFGPLL_CK>;
+
+                       power-domains =
+                               <&spm MT8183_POWER_DOMAIN_MFG_CORE0>,
+                               <&spm MT8183_POWER_DOMAIN_MFG_CORE1>,
+                               <&spm MT8183_POWER_DOMAIN_MFG_2D>;
+                       power-domain-names = "core0", "core1", "core2";
+
+                       operating-points-v2 = <&gpu_opp_table>;
+               };
+
                mmsys: syscon@14000000 {
                        compatible = "mediatek,mt8183-mmsys", "syscon";
                        reg = <0 0x14000000 0 0x1000>;
                };
 
                smi_common: smi@14019000 {
-                       compatible = "mediatek,mt8183-smi-common", "syscon";
+                       compatible = "mediatek,mt8183-smi-common";
                        reg = <0 0x14019000 0 0x1000>;
                        clocks = <&mmsys CLK_MM_SMI_COMMON>,
                                 <&mmsys CLK_MM_SMI_COMMON>,
                                 <&mmsys CLK_MM_GALS_COMM0>,
                                 <&mmsys CLK_MM_GALS_COMM1>;
                        clock-names = "apb", "smi", "gals0", "gals1";
+                       power-domains = <&spm MT8183_POWER_DOMAIN_DISP>;
                };
 
                imgsys: syscon@15020000 {
index 683743f..74c1a5d 100644 (file)
        };
 
        hda@3510000 {
-               nvidia,model = "jetson-tx2-hda";
+               nvidia,model = "NVIDIA Jetson TX2 HDA";
                status = "okay";
        };
 
                       <&i2s5_port>, <&i2s6_port>, <&dmic1_port>, <&dmic2_port>,
                       <&dmic3_port>, <&dspk1_port>, <&dspk2_port>;
 
-               label = "jetson-tx2-ape";
+               label = "NVIDIA Jetson TX2 APE";
        };
 };
index 9f75bbf..d02f6bf 100644 (file)
        };
 
        smmu: iommu@12000000 {
-               compatible = "arm,mmu-500";
+               compatible = "nvidia,tegra186-smmu", "nvidia,smmu-500";
                reg = <0 0x12000000 0 0x800000>;
                interrupts = <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
                             <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
                stream-match-mask = <0x7f80>;
                #global-interrupts = <1>;
                #iommu-cells = <1>;
+
+               nvidia,memory-controller = <&mc>;
        };
 
        host1x@13e00000 {
index d618f19..96bd01c 100644 (file)
                };
 
                hda@3510000 {
-                       nvidia,model = "jetson-xavier-hda";
+                       nvidia,model = "NVIDIA Jetson AGX Xavier HDA";
                        status = "okay";
                };
 
                       <&i2s1_port>, <&i2s2_port>, <&i2s4_port>, <&i2s6_port>,
                       <&dmic3_port>;
 
-               label = "jetson-xavier-ape";
+               label = "NVIDIA Jetson AGX Xavier APE";
 
                widgets =
                        "Microphone",   "CVB-RT MIC Jack",
index d1d7722..836a7e0 100644 (file)
                        interrupt-controller@2a40000 {
                                status = "okay";
                        };
+
+                       ahub@2900800 {
+                               status = "okay";
+
+                               ports {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       port@0 {
+                                               reg = <0x0>;
+
+                                               xbar_admaif0_ep: endpoint {
+                                                       remote-endpoint = <&admaif0_ep>;
+                                               };
+                                       };
+
+                                       port@1 {
+                                               reg = <0x1>;
+
+                                               xbar_admaif1_ep: endpoint {
+                                                       remote-endpoint = <&admaif1_ep>;
+                                               };
+                                       };
+
+                                       port@2 {
+                                               reg = <0x2>;
+
+                                               xbar_admaif2_ep: endpoint {
+                                                       remote-endpoint = <&admaif2_ep>;
+                                               };
+                                       };
+
+                                       port@3 {
+                                               reg = <0x3>;
+
+                                               xbar_admaif3_ep: endpoint {
+                                                       remote-endpoint = <&admaif3_ep>;
+                                               };
+                                       };
+
+                                       port@4 {
+                                               reg = <0x4>;
+
+                                               xbar_admaif4_ep: endpoint {
+                                                       remote-endpoint = <&admaif4_ep>;
+                                               };
+                                       };
+
+                                       port@5 {
+                                               reg = <0x5>;
+
+                                               xbar_admaif5_ep: endpoint {
+                                                       remote-endpoint = <&admaif5_ep>;
+                                               };
+                                       };
+
+                                       port@6 {
+                                               reg = <0x6>;
+
+                                               xbar_admaif6_ep: endpoint {
+                                                       remote-endpoint = <&admaif6_ep>;
+                                               };
+                                       };
+
+                                       port@7 {
+                                               reg = <0x7>;
+
+                                               xbar_admaif7_ep: endpoint {
+                                                       remote-endpoint = <&admaif7_ep>;
+                                               };
+                                       };
+
+                                       port@8 {
+                                               reg = <0x8>;
+
+                                               xbar_admaif8_ep: endpoint {
+                                                       remote-endpoint = <&admaif8_ep>;
+                                               };
+                                       };
+
+                                       port@9 {
+                                               reg = <0x9>;
+
+                                               xbar_admaif9_ep: endpoint {
+                                                       remote-endpoint = <&admaif9_ep>;
+                                               };
+                                       };
+
+                                       port@a {
+                                               reg = <0xa>;
+
+                                               xbar_admaif10_ep: endpoint {
+                                                       remote-endpoint = <&admaif10_ep>;
+                                               };
+                                       };
+
+                                       port@b {
+                                               reg = <0xb>;
+
+                                               xbar_admaif11_ep: endpoint {
+                                                       remote-endpoint = <&admaif11_ep>;
+                                               };
+                                       };
+
+                                       port@c {
+                                               reg = <0xc>;
+
+                                               xbar_admaif12_ep: endpoint {
+                                                       remote-endpoint = <&admaif12_ep>;
+                                               };
+                                       };
+
+                                       port@d {
+                                               reg = <0xd>;
+
+                                               xbar_admaif13_ep: endpoint {
+                                                       remote-endpoint = <&admaif13_ep>;
+                                               };
+                                       };
+
+                                       port@e {
+                                               reg = <0xe>;
+
+                                               xbar_admaif14_ep: endpoint {
+                                                       remote-endpoint = <&admaif14_ep>;
+                                               };
+                                       };
+
+                                       port@f {
+                                               reg = <0xf>;
+
+                                               xbar_admaif15_ep: endpoint {
+                                                       remote-endpoint = <&admaif15_ep>;
+                                               };
+                                       };
+
+                                       port@10 {
+                                               reg = <0x10>;
+
+                                               xbar_admaif16_ep: endpoint {
+                                                       remote-endpoint = <&admaif16_ep>;
+                                               };
+                                       };
+
+                                       port@11 {
+                                               reg = <0x11>;
+
+                                               xbar_admaif17_ep: endpoint {
+                                                       remote-endpoint = <&admaif17_ep>;
+                                               };
+                                       };
+
+                                       port@12 {
+                                               reg = <0x12>;
+
+                                               xbar_admaif18_ep: endpoint {
+                                                       remote-endpoint = <&admaif18_ep>;
+                                               };
+                                       };
+
+                                       port@13 {
+                                               reg = <0x13>;
+
+                                               xbar_admaif19_ep: endpoint {
+                                                       remote-endpoint = <&admaif19_ep>;
+                                               };
+                                       };
+
+                                       xbar_i2s3_port: port@16 {
+                                               reg = <0x16>;
+
+                                               xbar_i2s3_ep: endpoint {
+                                                       remote-endpoint = <&i2s3_cif_ep>;
+                                               };
+                                       };
+
+                                       xbar_i2s5_port: port@18 {
+                                               reg = <0x18>;
+
+                                               xbar_i2s5_ep: endpoint {
+                                                       remote-endpoint = <&i2s5_cif_ep>;
+                                               };
+                                       };
+
+                                       xbar_dmic1_port: port@1a {
+                                               reg = <0x1a>;
+
+                                               xbar_dmic1_ep: endpoint {
+                                                       remote-endpoint = <&dmic1_cif_ep>;
+                                               };
+                                       };
+
+                                       xbar_dmic2_port: port@1b {
+                                               reg = <0x1b>;
+
+                                               xbar_dmic2_ep: endpoint {
+                                                       remote-endpoint = <&dmic2_cif_ep>;
+                                               };
+                                       };
+
+                                       xbar_dmic4_port: port@1d {
+                                               reg = <0x1d>;
+
+                                               xbar_dmic4_ep: endpoint {
+                                                       remote-endpoint = <&dmic4_cif_ep>;
+                                               };
+                                       };
+
+                                       xbar_dspk1_port: port@1e {
+                                               reg = <0x1e>;
+
+                                               xbar_dspk1_ep: endpoint {
+                                                       remote-endpoint = <&dspk1_cif_ep>;
+                                               };
+                                       };
+
+                                       xbar_dspk2_port: port@1f {
+                                               reg = <0x1f>;
+
+                                               xbar_dspk2_ep: endpoint {
+                                                       remote-endpoint = <&dspk2_cif_ep>;
+                                               };
+                                       };
+                               };
+
+                               admaif@290f000 {
+                                       status = "okay";
+
+                                       ports {
+                                               #address-cells = <1>;
+                                               #size-cells = <0>;
+
+                                               admaif0_port: port@0 {
+                                                       reg = <0x0>;
+
+                                                       admaif0_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif0_ep>;
+                                                       };
+                                               };
+
+                                               admaif1_port: port@1 {
+                                                       reg = <0x1>;
+
+                                                       admaif1_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif1_ep>;
+                                                       };
+                                               };
+
+                                               admaif2_port: port@2 {
+                                                       reg = <0x2>;
+
+                                                       admaif2_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif2_ep>;
+                                                       };
+                                               };
+
+                                               admaif3_port: port@3 {
+                                                       reg = <0x3>;
+
+                                                       admaif3_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif3_ep>;
+                                                       };
+                                               };
+
+                                               admaif4_port: port@4 {
+                                                       reg = <0x4>;
+
+                                                       admaif4_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif4_ep>;
+                                                       };
+                                               };
+
+                                               admaif5_port: port@5 {
+                                                       reg = <0x5>;
+
+                                                       admaif5_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif5_ep>;
+                                                       };
+                                               };
+
+                                               admaif6_port: port@6 {
+                                                       reg = <0x6>;
+
+                                                       admaif6_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif6_ep>;
+                                                       };
+                                               };
+
+                                               admaif7_port: port@7 {
+                                                       reg = <0x7>;
+
+                                                       admaif7_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif7_ep>;
+                                                       };
+                                               };
+
+                                               admaif8_port: port@8 {
+                                                       reg = <0x8>;
+
+                                                       admaif8_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif8_ep>;
+                                                       };
+                                               };
+
+                                               admaif9_port: port@9 {
+                                                       reg = <0x9>;
+
+                                                       admaif9_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif9_ep>;
+                                                       };
+                                               };
+
+                                               admaif10_port: port@a {
+                                                       reg = <0xa>;
+
+                                                       admaif10_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif10_ep>;
+                                                       };
+                                               };
+
+                                               admaif11_port: port@b {
+                                                       reg = <0xb>;
+
+                                                       admaif11_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif11_ep>;
+                                                       };
+                                               };
+
+                                               admaif12_port: port@c {
+                                                       reg = <0xc>;
+
+                                                       admaif12_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif12_ep>;
+                                                       };
+                                               };
+
+                                               admaif13_port: port@d {
+                                                       reg = <0xd>;
+
+                                                       admaif13_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif13_ep>;
+                                                       };
+                                               };
+
+                                               admaif14_port: port@e {
+                                                       reg = <0xe>;
+
+                                                       admaif14_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif14_ep>;
+                                                       };
+                                               };
+
+                                               admaif15_port: port@f {
+                                                       reg = <0xf>;
+
+                                                       admaif15_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif15_ep>;
+                                                       };
+                                               };
+
+                                               admaif16_port: port@10 {
+                                                       reg = <0x10>;
+
+                                                       admaif16_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif16_ep>;
+                                                       };
+                                               };
+
+                                               admaif17_port: port@11 {
+                                                       reg = <0x11>;
+
+                                                       admaif17_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif17_ep>;
+                                                       };
+                                               };
+
+                                               admaif18_port: port@12 {
+                                                       reg = <0x12>;
+
+                                                       admaif18_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif18_ep>;
+                                                       };
+                                               };
+
+                                               admaif19_port: port@13 {
+                                                       reg = <0x13>;
+
+                                                       admaif19_ep: endpoint {
+                                                               remote-endpoint = <&xbar_admaif19_ep>;
+                                                       };
+                                               };
+                                       };
+                               };
+
+                               i2s@2901200 {
+                                       status = "okay";
+
+                                       ports {
+                                               #address-cells = <1>;
+                                               #size-cells = <0>;
+
+                                               port@0 {
+                                                       reg = <0>;
+
+                                                       i2s3_cif_ep: endpoint {
+                                                               remote-endpoint = <&xbar_i2s3_ep>;
+                                                       };
+                                               };
+
+                                               i2s3_port: port@1 {
+                                                       reg = <1>;
+
+                                                       i2s3_dap_ep: endpoint {
+                                                               dai-format = "i2s";
+                                                               /* Place holder for external Codec */
+                                                       };
+                                               };
+                                       };
+                               };
+
+                               i2s@2901400 {
+                                       status = "okay";
+
+                                       ports {
+                                               #address-cells = <1>;
+                                               #size-cells = <0>;
+
+                                               port@0 {
+                                                       reg = <0>;
+
+                                                       i2s5_cif_ep: endpoint {
+                                                               remote-endpoint = <&xbar_i2s5_ep>;
+                                                       };
+                                               };
+
+                                               i2s5_port: port@1 {
+                                                       reg = <1>;
+
+                                                       i2s5_dap_ep: endpoint@0 {
+                                                               dai-format = "i2s";
+                                                               /* Place holder for external Codec */
+                                                       };
+                                               };
+                                       };
+                               };
+
+                               dmic@2904000 {
+                                       status = "okay";
+
+                                       ports {
+                                               #address-cells = <1>;
+                                               #size-cells = <0>;
+
+                                               port@0 {
+                                                       reg = <0>;
+
+                                                       dmic1_cif_ep: endpoint {
+                                                               remote-endpoint = <&xbar_dmic1_ep>;
+                                                       };
+                                               };
+
+                                               dmic1_port: port@1 {
+                                                       reg = <1>;
+
+                                                       dmic1_dap_ep: endpoint {
+                                                               /* Place holder for external Codec */
+                                                       };
+                                               };
+                                       };
+                               };
+
+                               dmic@2904100 {
+                                       status = "okay";
+
+                                       ports {
+                                               #address-cells = <1>;
+                                               #size-cells = <0>;
+
+                                               port@0 {
+                                                       reg = <0>;
+
+                                                       dmic2_cif_ep: endpoint {
+                                                               remote-endpoint = <&xbar_dmic2_ep>;
+                                                       };
+                                               };
+
+                                               dmic2_port: port@1 {
+                                                       reg = <1>;
+
+                                                       dmic2_dap_ep: endpoint {
+                                                               /* Place holder for external Codec */
+                                                       };
+                                               };
+                                       };
+                               };
+
+                               dmic@2904300 {
+                                       status = "okay";
+
+                                       ports {
+                                               #address-cells = <1>;
+                                               #size-cells = <0>;
+
+                                               port@0 {
+                                                       reg = <0>;
+
+                                                       dmic4_cif_ep: endpoint {
+                                                               remote-endpoint = <&xbar_dmic4_ep>;
+                                                       };
+                                               };
+
+                                               dmic4_port: port@1 {
+                                                       reg = <1>;
+
+                                                       dmic4_dap_ep: endpoint {
+                                                               /* Place holder for external Codec */
+                                                       };
+                                               };
+                                       };
+                               };
+
+                               dspk@2905000 {
+                                       status = "okay";
+
+                                       ports {
+                                               #address-cells = <1>;
+                                               #size-cells = <0>;
+
+                                               port@0 {
+                                                       reg = <0>;
+
+                                                       dspk1_cif_ep: endpoint {
+                                                               remote-endpoint = <&xbar_dspk1_ep>;
+                                                       };
+                                               };
+
+                                               dspk1_port: port@1 {
+                                                       reg = <1>;
+
+                                                       dspk1_dap_ep: endpoint {
+                                                               /* Place holder for external Codec */
+                                                       };
+                                               };
+                                       };
+                               };
+
+                               dspk@2905100 {
+                                       status = "okay";
+
+                                       ports {
+                                               #address-cells = <1>;
+                                               #size-cells = <0>;
+
+                                               port@0 {
+                                                       reg = <0>;
+
+                                                       dspk2_cif_ep: endpoint {
+                                                               remote-endpoint = <&xbar_dspk2_ep>;
+                                                       };
+                                               };
+
+                                               dspk2_port: port@1 {
+                                                       reg = <1>;
+
+                                                       dspk2_dap_ep: endpoint {
+                                                               /* Place holder for external Codec */
+                                                       };
+                                               };
+                                       };
+                               };
+                       };
                };
 
                ddc: i2c@3190000 {
                };
 
                hda@3510000 {
-                       nvidia,model = "jetson-xavier-nx-hda";
+                       nvidia,model = "NVIDIA Jetson Xavier NX HDA";
                        status = "okay";
                };
 
                regulator-boot-on;
        };
 
+       sound {
+               compatible = "nvidia,tegra186-audio-graph-card";
+               status = "okay";
+
+               dais = /* ADMAIF (FE) Ports */
+                      <&admaif0_port>, <&admaif1_port>, <&admaif2_port>, <&admaif3_port>,
+                      <&admaif4_port>, <&admaif5_port>, <&admaif6_port>, <&admaif7_port>,
+                      <&admaif8_port>, <&admaif9_port>, <&admaif10_port>, <&admaif11_port>,
+                      <&admaif12_port>, <&admaif13_port>, <&admaif14_port>, <&admaif15_port>,
+                      <&admaif16_port>, <&admaif17_port>, <&admaif18_port>, <&admaif19_port>,
+                      /* XBAR Ports */
+                      <&xbar_i2s3_port>, <&xbar_i2s5_port>,
+                      <&xbar_dmic1_port>, <&xbar_dmic2_port>, <&xbar_dmic4_port>,
+                      <&xbar_dspk1_port>, <&xbar_dspk2_port>,
+                      /* BE I/O Ports */
+                      <&i2s3_port>, <&i2s5_port>,
+                      <&dmic1_port>, <&dmic2_port>, <&dmic4_port>,
+                      <&dspk1_port>, <&dspk2_port>;
+
+               label = "NVIDIA Jetson Xavier NX APE";
+       };
+
        thermal-zones {
                cpu {
                        polling-delay = <0>;
index 9449156..b7d5328 100644 (file)
@@ -62,6 +62,7 @@
                        interconnects = <&mc TEGRA194_MEMORY_CLIENT_EQOSR &emc>,
                                        <&mc TEGRA194_MEMORY_CLIENT_EQOSW &emc>;
                        interconnect-names = "dma-mem", "write";
+                       iommus = <&smmu TEGRA194_SID_EQOS>;
                        status = "disabled";
 
                        snps,write-requests = <1>;
                        interconnects = <&mc TEGRA194_MEMORY_CLIENT_SDMMCRA &emc>,
                                        <&mc TEGRA194_MEMORY_CLIENT_SDMMCWA &emc>;
                        interconnect-names = "dma-mem", "write";
+                       iommus = <&smmu TEGRA194_SID_SDMMC1>;
                        nvidia,pad-autocal-pull-up-offset-3v3-timeout =
                                                                        <0x07>;
                        nvidia,pad-autocal-pull-down-offset-3v3-timeout =
                        interconnects = <&mc TEGRA194_MEMORY_CLIENT_SDMMCR &emc>,
                                        <&mc TEGRA194_MEMORY_CLIENT_SDMMCW &emc>;
                        interconnect-names = "dma-mem", "write";
+                       iommus = <&smmu TEGRA194_SID_SDMMC3>;
                        nvidia,pad-autocal-pull-up-offset-1v8 = <0x00>;
                        nvidia,pad-autocal-pull-down-offset-1v8 = <0x7a>;
                        nvidia,pad-autocal-pull-up-offset-3v3-timeout = <0x07>;
                        interconnects = <&mc TEGRA194_MEMORY_CLIENT_SDMMCRAB &emc>,
                                        <&mc TEGRA194_MEMORY_CLIENT_SDMMCWAB &emc>;
                        interconnect-names = "dma-mem", "write";
+                       iommus = <&smmu TEGRA194_SID_SDMMC4>;
                        nvidia,pad-autocal-pull-up-offset-hs400 = <0x00>;
                        nvidia,pad-autocal-pull-down-offset-hs400 = <0x00>;
                        nvidia,pad-autocal-pull-up-offset-1v8-timeout = <0x0a>;
                        interconnects = <&mc TEGRA194_MEMORY_CLIENT_HDAR &emc>,
                                        <&mc TEGRA194_MEMORY_CLIENT_HDAW &emc>;
                        interconnect-names = "dma-mem", "write";
+                       iommus = <&smmu TEGRA194_SID_HDA>;
                        status = "disabled";
                };
 
                        interrupt-controller;
                };
 
+               smmu: iommu@12000000 {
+                       compatible = "nvidia,tegra194-smmu", "nvidia,smmu-500";
+                       reg = <0x12000000 0x800000>,
+                             <0x11000000 0x800000>;
+                       interrupts = <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 232 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>;
+                       stream-match-mask = <0x7f80>;
+                       #global-interrupts = <2>;
+                       #iommu-cells = <1>;
+
+                       nvidia,memory-controller = <&mc>;
+                       status = "okay";
+               };
+
                host1x@13e00000 {
                        compatible = "nvidia,tegra194-host1x";
                        reg = <0x13e00000 0x10000>,
                        ranges = <0x15000000 0x15000000 0x01000000>;
                        interconnects = <&mc TEGRA194_MEMORY_CLIENT_HOST1XDMAR &emc>;
                        interconnect-names = "dma-mem";
+                       iommus = <&smmu TEGRA194_SID_HOST1X>;
 
                        display-hub@15200000 {
                                compatible = "nvidia,tegra194-display";
                                interconnects = <&mc TEGRA194_MEMORY_CLIENT_VICSRD &emc>,
                                                <&mc TEGRA194_MEMORY_CLIENT_VICSWR &emc>;
                                interconnect-names = "dma-mem", "write";
+                               iommus = <&smmu TEGRA194_SID_VIC>;
                        };
 
                        dpaux0: dpaux@155c0000 {
                                <&mc TEGRA194_MEMORY_CLIENT_BPMPDMAR &emc>,
                                <&mc TEGRA194_MEMORY_CLIENT_BPMPDMAW &emc>;
                interconnect-names = "read", "write", "dma-mem", "dma-write";
+               iommus = <&smmu TEGRA194_SID_BPMP>;
 
                bpmp_i2c: i2c {
                        compatible = "nvidia,tegra186-bpmp-i2c";
                };
        };
 
+       pmu {
+               compatible = "arm,armv8-pmuv3";
+               interrupts = <GIC_SPI 384 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 385 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 386 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 387 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 388 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 389 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 390 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 391 IRQ_TYPE_LEVEL_HIGH>;
+               interrupt-affinity = <&cpu0_0 &cpu0_1 &cpu1_0 &cpu1_1
+                                     &cpu2_0 &cpu2_1 &cpu3_0 &cpu3_1>;
+       };
+
        psci {
                compatible = "arm,psci-1.0";
                status = "okay";
index 497635a..7d3e363 100644 (file)
                       <&i2s1_port>, <&i2s2_port>, <&i2s3_port>, <&i2s4_port>,
                       <&i2s5_port>, <&dmic1_port>, <&dmic2_port>, <&dmic3_port>;
 
-               label = "jetson-tx1-ape";
+               label = "NVIDIA Jetson TX1 APE";
        };
 };
index a9caaf7..d8409c1 100644 (file)
        };
 
        hda@70030000 {
-               nvidia,model = "jetson-tx1-hda";
+               nvidia,model = "NVIDIA Jetson TX1 HDA";
                status = "okay";
        };
 
index 14c128a..7dbb13f 100644 (file)
        };
 
        hda@70030000 {
-               nvidia,model = "jetson-nano-hda";
+               nvidia,model = "NVIDIA Jetson Nano HDA";
 
                status = "okay";
        };
                       <&i2s3_port>, <&i2s4_port>,
                       <&dmic1_port>, <&dmic2_port>;
 
-               label = "jetson-nano-ape";
+               label = "NVIDIA Jetson Nano APE";
        };
 };
index 456502a..ec3b2a3 100644 (file)
@@ -5,8 +5,11 @@ dtb-$(CONFIG_ARCH_QCOM)        += apq8096-db820c.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += apq8096-ifc6640.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += ipq6018-cp01-c1.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += ipq8074-hk01.dtb
+dtb-$(CONFIG_ARCH_QCOM)        += ipq8074-hk10-c1.dtb
+dtb-$(CONFIG_ARCH_QCOM)        += ipq8074-hk10-c2.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += msm8916-alcatel-idol347.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += msm8916-asus-z00l.dtb
+dtb-$(CONFIG_ARCH_QCOM)        += msm8916-huawei-g7.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += msm8916-longcheer-l8150.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += msm8916-longcheer-l8910.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += msm8916-mtp.dtb
@@ -35,8 +38,8 @@ dtb-$(CONFIG_ARCH_QCOM)       += qrb5165-rb5.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sc7180-idp.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-coachz-r1.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-coachz-r1-lte.dtb
-dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-coachz-r2.dtb
-dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-coachz-r2-lte.dtb
+dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-coachz-r3.dtb
+dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-coachz-r3-lte.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-lazor-r0.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-lazor-r1.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-lazor-r1-kb.dtb
@@ -51,6 +54,8 @@ dtb-$(CONFIG_ARCH_QCOM)       += sc7180-trogdor-pompom-r1.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-pompom-r1-lte.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-pompom-r2.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-pompom-r2-lte.dtb
+dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-pompom-r3.dtb
+dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-pompom-r3-lte.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-r1.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sc7180-trogdor-r1-lte.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sc7280-idp.dtb
@@ -70,6 +75,7 @@ dtb-$(CONFIG_ARCH_QCOM)       += sdm845-oneplus-fajita.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sdm845-xiaomi-beryllium.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sdm850-lenovo-yoga-c630.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sm8150-hdk.dtb
+dtb-$(CONFIG_ARCH_QCOM)        += sm8150-microsoft-surface-duo.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sm8150-mtp.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sm8250-hdk.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sm8250-mtp.dtb
index defcbd1..0686923 100644 (file)
 
 / {
        aliases {
-               serial0 = &blsp2_uart1;
-               serial1 = &blsp2_uart2;
-               serial2 = &blsp1_uart1;
-               i2c0    = &blsp1_i2c2;
+               serial0 = &blsp2_uart2;
+               serial1 = &blsp2_uart3;
+               serial2 = &blsp1_uart2;
+               i2c0    = &blsp1_i2c3;
                i2c1    = &blsp2_i2c1;
-               i2c2    = &blsp2_i2c0;
-               spi0    = &blsp1_spi0;
-               spi1    = &blsp2_spi5;
+               i2c2    = &blsp2_i2c1;
+               spi0    = &blsp1_spi1;
+               spi1    = &blsp2_spi6;
        };
 
        chosen {
        };
 };
 
-&blsp1_i2c2 {
+&blsp1_i2c3 {
        /* On Low speed expansion */
        label = "LS-I2C0";
        status = "okay";
 };
 
-&blsp1_spi0 {
+&blsp1_spi1 {
        /* On Low speed expansion */
        label = "LS-SPI0";
        status = "okay";
 };
 
-&blsp1_uart1 {
+&blsp1_uart2 {
        label = "BT-UART";
        status = "okay";
        pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&blsp1_uart1_default>;
-       pinctrl-1 = <&blsp1_uart1_sleep>;
+       pinctrl-0 = <&blsp1_uart2_default>;
+       pinctrl-1 = <&blsp1_uart2_sleep>;
 
        bluetooth {
                compatible = "qcom,qca6174-bt";
        };
 };
 
-&blsp2_i2c0 {
+&adsp_pil {
+       status = "okay";
+};
+
+&blsp2_i2c1 {
        /* On High speed expansion */
        label = "HS-I2C2";
        status = "okay";
        status = "okay";
 };
 
-&blsp2_spi5 {
+&blsp2_spi6 {
        /* On High speed expansion */
        label = "HS-SPI1";
        status = "okay";
 };
 
-&blsp2_uart1 {
+&blsp2_uart2 {
        label = "LS-UART1";
        status = "okay";
        pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&blsp2_uart1_2pins_default>;
-       pinctrl-1 = <&blsp2_uart1_2pins_sleep>;
+       pinctrl-0 = <&blsp2_uart2_2pins_default>;
+       pinctrl-1 = <&blsp2_uart2_2pins_sleep>;
 };
 
-&blsp2_uart2 {
+&blsp2_uart3 {
        label = "LS-UART0";
        status = "disabled";
        pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&blsp2_uart2_4pins_default>;
-       pinctrl-1 = <&blsp2_uart2_4pins_sleep>;
+       pinctrl-0 = <&blsp2_uart3_4pins_default>;
+       pinctrl-1 = <&blsp2_uart3_4pins_sleep>;
 };
 
 &camss {
        vdda-supply = <&vreg_l2a_1p25>;
 };
 
+&gpu {
+       status = "okay";
+};
+
 &hdmi {
        status = "okay";
 
        vdd-gfx-supply = <&vdd_gfx>;
 };
 
-&msmgpio {
+&pm8994_resin {
+       status = "okay";
+       linux,code = <KEY_VOLUMEDOWN>;
+};
+
+&tlmm {
        gpio-line-names =
                "[SPI0_DOUT]", /* GPIO_0, BLSP1_SPI_MOSI, LSEC pin 14 */
                "[SPI0_DIN]", /* GPIO_1, BLSP1_SPI_MISO, LSEC pin 10 */
                };
        };
 
-       blsp1_uart1_default: blsp1_uart1_default {
+       blsp1_uart2_default: blsp1_uart2_default {
                mux {
                        pins = "gpio41", "gpio42", "gpio43", "gpio44";
                        function = "blsp_uart2";
                };
        };
 
-       blsp1_uart1_sleep: blsp1_uart1_sleep {
+       blsp1_uart2_sleep: blsp1_uart2_sleep {
                mux {
                        pins = "gpio41", "gpio42", "gpio43", "gpio44";
                        function = "gpio";
 
 &pcie0 {
        status = "okay";
-       perst-gpio = <&msmgpio 35 GPIO_ACTIVE_LOW>;
+       perst-gpio = <&tlmm 35 GPIO_ACTIVE_LOW>;
        vddpe-3v3-supply = <&wlan_en>;
        vdda-supply = <&vreg_l28a_0p925>;
 };
 
 &pcie1 {
        status = "okay";
-       perst-gpio = <&msmgpio 130 GPIO_ACTIVE_LOW>;
+       perst-gpio = <&tlmm 130 GPIO_ACTIVE_LOW>;
        vdda-supply = <&vreg_l28a_0p925>;
 };
 
 &pcie2 {
        status = "okay";
-       perst-gpio = <&msmgpio 114 GPIO_ACTIVE_LOW>;
+       perst-gpio = <&tlmm 114 GPIO_ACTIVE_LOW>;
        vdda-supply = <&vreg_l28a_0p925>;
 };
 
 &sdhc2 {
        /* External SD card */
        pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>;
-       pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off &sdc2_cd_off>;
-       cd-gpios = <&msmgpio 38 0x1>;
+       pinctrl-0 = <&sdc2_state_on &sdc2_cd_on>;
+       pinctrl-1 = <&sdc2_state_off &sdc2_cd_off>;
+       cd-gpios = <&tlmm 38 GPIO_ACTIVE_LOW>;
        vmmc-supply = <&vreg_l21a_2p95>;
        vqmmc-supply = <&vreg_l13a_2p95>;
        status = "okay";
        };
 };
 
-&spmi_bus {
-       pmic@0 {
-               pon@800 {
-                       resin {
-                               compatible = "qcom,pm8941-resin";
-                               interrupts = <0x0 0x8 1 IRQ_TYPE_EDGE_BOTH>;
-                               debounce = <15625>;
-                               bias-pull-up;
-                               linux,code = <KEY_VOLUMEDOWN>;
-                       };
-               };
-       };
-};
-
 &ufsphy {
        status = "okay";
 
        status = "okay";
        extcon = <&usb2_id>;
 
-       dwc3@7600000 {
+       usb@7600000 {
                extcon = <&usb2_id>;
                dr_mode = "otg";
                maximum-speed = "high-speed";
        status = "okay";
        extcon = <&usb3_id>;
 
-       dwc3@6a00000 {
+       usb@6a00000 {
                extcon = <&usb3_id>;
                dr_mode = "otg";
        };
 
 };
 
+&venus {
+       status = "okay";
+};
+
 &wcd9335 {
        clock-names = "mclk", "slimbus";
        clocks = <&div1_mclk>,
index f6ddf17..8c7a27e 100644 (file)
@@ -17,7 +17,7 @@
        qcom,board-id = <0x00010018 0>;
 
        aliases {
-               serial0 = &blsp2_uart1;
+               serial0 = &blsp2_uart2;
        };
 
        chosen {
        };
 };
 
-&blsp2_uart1 {
+&blsp2_uart2 {
        status = "okay";
        pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&blsp2_uart1_2pins_default>;
-       pinctrl-1 = <&blsp2_uart1_2pins_sleep>;
+       pinctrl-0 = <&blsp2_uart2_2pins_default>;
+       pinctrl-1 = <&blsp2_uart2_2pins_sleep>;
 };
 
-&msmgpio {
+&gpu {
+       status = "okay";
+};
+
+&mdss {
+       status = "okay";
+};
+
+&tlmm {
        sdc2_pins_default: sdc2-pins-default {
                clk {
                        pins = "sdc2_clk";
 
        bus-width = <4>;
 
-       cd-gpios = <&msmgpio 38 0x1>;
+       cd-gpios = <&tlmm 38 0x1>;
 
        vmmc-supply = <&vreg_l21a_2p95>;
        vqmmc-supply = <&vreg_l13a_2p95>;
        vdda-phy-max-microamp = <18380>;
        vdda-pll-max-microamp = <9440>;
 };
+
+&venus {
+       status = "okay";
+};
diff --git a/arch/arm64/boot/dts/qcom/ipq8074-hk10-c1.dts b/arch/arm64/boot/dts/qcom/ipq8074-hk10-c1.dts
new file mode 100644 (file)
index 0000000..2bfcf42
--- /dev/null
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/* Copyright (c) 2020 The Linux Foundation. All rights reserved.
+ */
+/dts-v1/;
+
+#include "ipq8074-hk10.dtsi"
+
+/ {
+       model = "Qualcomm Technologies, Inc. IPQ8074/AP-HK10-C1";
+       compatible = "qcom,ipq8074-hk10-c1", "qcom,ipq8074";
+};
diff --git a/arch/arm64/boot/dts/qcom/ipq8074-hk10-c2.dts b/arch/arm64/boot/dts/qcom/ipq8074-hk10-c2.dts
new file mode 100644 (file)
index 0000000..7da39f1
--- /dev/null
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/dts-v1/;
+/* Copyright (c) 2020 The Linux Foundation. All rights reserved.
+ */
+#include "ipq8074-hk10.dtsi"
+
+/ {
+       model = "Qualcomm Technologies, Inc. IPQ8074/AP-HK10-C2";
+       compatible = "qcom,ipq8074-hk10-c2", "qcom,ipq8074";
+};
diff --git a/arch/arm64/boot/dts/qcom/ipq8074-hk10.dtsi b/arch/arm64/boot/dts/qcom/ipq8074-hk10.dtsi
new file mode 100644 (file)
index 0000000..07e6708
--- /dev/null
@@ -0,0 +1,76 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ */
+/dts-v1/;
+
+#include "ipq8074.dtsi"
+
+/ {
+       #address-cells = <0x2>;
+       #size-cells = <0x2>;
+
+       interrupt-parent = <&intc>;
+
+       aliases {
+               serial0 = &blsp1_uart5;
+       };
+
+       chosen {
+               stdout-path = "serial0";
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x0 0x40000000 0x0 0x20000000>;
+       };
+};
+
+&blsp1_spi1 {
+       status = "ok";
+
+       m25p80@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "jedec,spi-nor";
+               reg = <0>;
+               spi-max-frequency = <50000000>;
+       };
+};
+
+&blsp1_uart5 {
+       status = "ok";
+};
+
+&pcie0 {
+       status = "ok";
+       perst-gpio = <&tlmm 58 0x1>;
+};
+
+&pcie1 {
+       status = "ok";
+       perst-gpio = <&tlmm 61 0x1>;
+};
+
+&pcie_phy0 {
+       status = "ok";
+};
+
+&pcie_phy1 {
+       status = "ok";
+};
+
+&qpic_bam {
+       status = "ok";
+};
+
+&qpic_nand {
+       status = "ok";
+
+       nand@0 {
+               reg = <0>;
+               nand-ecc-strength = <4>;
+               nand-ecc-step-size = <512>;
+               nand-bus-width = <8>;
+       };
+};
index a32e5e7..7542d1e 100644 (file)
                        clock-names = "cfg_ahb", "ref";
 
                        resets = <&gcc GCC_QUSB2_0_PHY_BCR>;
+                       status = "disabled";
                };
 
                pcie_phy0: phy@86000 {
                        resets = <&gcc GCC_USB0_BCR>;
                        status = "disabled";
 
-                       dwc_0: dwc3@8a00000 {
+                       dwc_0: usb@8a00000 {
                                compatible = "snps,dwc3";
                                reg = <0x8a00000 0xcd00>;
                                interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
                        resets = <&gcc GCC_USB1_BCR>;
                        status = "disabled";
 
-                       dwc_1: dwc3@8c00000 {
+                       dwc_1: usb@8c00000 {
                                compatible = "snps,dwc3";
                                reg = <0x8c00000 0xcd00>;
                                interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
index 540b1fa..670bd1b 100644 (file)
        status = "okay";
 };
 
+&blsp_i2c4 {
+       status = "okay";
+
+       touchscreen@26 {
+               compatible = "mstar,msg2638";
+               reg = <0x26>;
+               interrupt-parent = <&msmgpio>;
+               interrupts = <13 IRQ_TYPE_EDGE_FALLING>;
+               reset-gpios = <&msmgpio 100 GPIO_ACTIVE_LOW>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&ts_int_reset_default>;
+               vdd-supply = <&pm8916_l17>;
+               vddio-supply = <&pm8916_l5>;
+               touchscreen-size-x = <2048>;
+               touchscreen-size-y = <2048>;
+       };
+};
+
 &blsp_i2c5 {
        status = "okay";
 
                bias-pull-up;
        };
 
+       ts_int_reset_default: ts-int-reset-default {
+               pins = "gpio13", "gpio100";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
        usb_id_default: usb-id-default {
                pins = "gpio69";
                function = "gpio";
diff --git a/arch/arm64/boot/dts/qcom/msm8916-huawei-g7.dts b/arch/arm64/boot/dts/qcom/msm8916-huawei-g7.dts
new file mode 100644 (file)
index 0000000..e0075b5
--- /dev/null
@@ -0,0 +1,454 @@
+// SPDX-License-Identifier: GPL-2.0-only
+// Copyright (C) 2021 Stephan Gerhold
+
+/dts-v1/;
+
+#include "msm8916-pm8916.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/leds/common.h>
+
+/*
+ * Note: The original firmware from Huawei can only boot 32-bit kernels.
+ * To boot arm64 kernels it is necessary to flash 64-bit TZ/HYP firmware
+ * with EDL, e.g. taken from the DragonBoard 410c. This works because Huawei
+ * forgot to set up (firmware) secure boot for some reason.
+ *
+ * Also note that Huawei no longer provides bootloader unlock codes.
+ * This can be bypassed by patching the bootloader from a custom HYP firmware,
+ * making it think the bootloader is unlocked.
+ *
+ * See: https://wiki.postmarketos.org/wiki/Huawei_Ascend_G7_(huawei-g7)
+ */
+
+/ {
+       model = "Huawei Ascend G7";
+       compatible = "huawei,g7", "qcom,msm8916";
+
+       aliases {
+               serial0 = &blsp1_uart2;
+       };
+
+       chosen {
+               stdout-path = "serial0";
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&gpio_keys_default>;
+
+               label = "GPIO Buttons";
+
+               volume-up {
+                       label = "Volume Up";
+                       gpios = <&msmgpio 107 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_VOLUMEUP>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&gpio_leds_default>;
+
+               led-0 {
+                       gpios = <&msmgpio 8 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_RED>;
+                       default-state = "off";
+                       function = LED_FUNCTION_INDICATOR;
+               };
+
+               led-1 {
+                       gpios = <&msmgpio 9 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_GREEN>;
+                       default-state = "off";
+                       function = LED_FUNCTION_INDICATOR;
+               };
+
+               led-2 {
+                       gpios = <&msmgpio 10 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_BLUE>;
+                       default-state = "off";
+                       function = LED_FUNCTION_INDICATOR;
+               };
+       };
+
+       usb_id: usb-id {
+               compatible = "linux,extcon-usb-gpio";
+               id-gpio = <&msmgpio 117 GPIO_ACTIVE_HIGH>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&usb_id_default>;
+       };
+};
+
+&blsp_i2c2 {
+       status = "okay";
+
+       magnetometer@c {
+               compatible = "asahi-kasei,ak09911";
+               reg = <0x0c>;
+
+               vdd-supply = <&pm8916_l17>;
+               vid-supply = <&pm8916_l6>;
+
+               reset-gpios = <&msmgpio 36 GPIO_ACTIVE_LOW>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&mag_reset_default>;
+       };
+
+       accelerometer@1e {
+               compatible = "kionix,kx023-1025";
+               reg = <0x1e>;
+
+               interrupt-parent = <&msmgpio>;
+               interrupts = <115 IRQ_TYPE_EDGE_RISING>;
+
+               vdd-supply = <&pm8916_l17>;
+               vddio-supply = <&pm8916_l6>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&accel_irq_default>;
+
+               mount-matrix = "-1", "0", "0",
+                               "0", "1", "0",
+                               "0", "0", "1";
+       };
+
+       proximity@39 {
+               compatible = "avago,apds9930";
+               reg = <0x39>;
+
+               interrupt-parent = <&msmgpio>;
+               interrupts = <113 IRQ_TYPE_EDGE_FALLING>;
+
+               vdd-supply = <&pm8916_l17>;
+               vddio-supply = <&pm8916_l6>;
+
+               led-max-microamp = <100000>;
+               amstaos,proximity-diodes = <1>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&prox_irq_default>;
+       };
+
+       regulator@3e {
+               compatible = "ti,tps65132";
+               reg = <0x3e>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&reg_lcd_en_default>;
+
+               reg_lcd_pos: outp {
+                       regulator-name = "outp";
+                       regulator-min-microvolt = <5400000>;
+                       regulator-max-microvolt = <5400000>;
+                       enable-gpios = <&msmgpio 97 GPIO_ACTIVE_HIGH>;
+                       regulator-active-discharge = <1>;
+               };
+
+               reg_lcd_neg: outn {
+                       regulator-name = "outn";
+                       regulator-min-microvolt = <5400000>;
+                       regulator-max-microvolt = <5400000>;
+                       enable-gpios = <&msmgpio 32 GPIO_ACTIVE_HIGH>;
+                       regulator-active-discharge = <1>;
+               };
+       };
+};
+
+&blsp_i2c5 {
+       status = "okay";
+
+       rmi4@70 {
+               compatible = "syna,rmi4-i2c";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               interrupt-parent = <&msmgpio>;
+               interrupts = <13 IRQ_TYPE_EDGE_FALLING>;
+
+               vdd-supply = <&pm8916_l17>;
+               vio-supply = <&pm8916_l16>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&ts_irq_default>;
+
+               syna,startup-delay-ms = <100>;
+
+               rmi4-f01@1 {
+                       reg = <0x1>;
+                       syna,nosleep-mode = <1>; /* Allow sleeping */
+               };
+
+               rmi4-f11@11 {
+                       reg = <0x11>;
+                       syna,sensor-type = <1>; /* Touchscreen */
+               };
+       };
+};
+
+&blsp_i2c6 {
+       status = "okay";
+
+       nfc@28 {
+               compatible = "nxp,pn547", "nxp,nxp-nci-i2c";
+               reg = <0x28>;
+
+               interrupt-parent = <&msmgpio>;
+               interrupts = <21 IRQ_TYPE_EDGE_RISING>;
+
+               enable-gpios = <&msmgpio 20 GPIO_ACTIVE_HIGH>;
+               firmware-gpios = <&msmgpio 2 GPIO_ACTIVE_HIGH>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&nfc_default>;
+       };
+};
+
+&blsp1_uart2 {
+       status = "okay";
+};
+
+&pm8916_resin {
+       status = "okay";
+       linux,code = <KEY_VOLUMEDOWN>;
+};
+
+&pm8916_vib {
+       status = "okay";
+};
+
+&pronto {
+       status = "okay";
+};
+
+&sdhc_1 {
+       status = "okay";
+
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&sdc1_clk_on &sdc1_cmd_on &sdc1_data_on>;
+       pinctrl-1 = <&sdc1_clk_off &sdc1_cmd_off &sdc1_data_off>;
+};
+
+&sdhc_2 {
+       status = "okay";
+
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdhc2_cd_default>;
+       pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off &sdhc2_cd_default>;
+
+       /*
+        * The Huawei device tree sets cd-gpios = <&msmgpio 38 GPIO_ACTIVE_HIGH>.
+        * However, gpio38 does not change its state when inserting/removing the
+        * SD card, it's just low all the time. The Huawei kernel seems to use
+        * polling for SD card detection instead.
+        *
+        * However, looking closer at the GPIO debug output it turns out that
+        * gpio56 switches its state when inserting/removing the SD card.
+        * It behaves just like gpio38 normally does. Usually GPIO56 is used as
+        * "UIM2_PRESENT", i.e. to check if a second SIM card is inserted.
+        * Maybe Huawei decided to replace the second SIM card slot with the
+        * SD card slot and forgot to re-route to gpio38.
+        */
+       cd-gpios = <&msmgpio 56 GPIO_ACTIVE_LOW>;
+};
+
+&usb {
+       status = "okay";
+       extcon = <&usb_id>, <&usb_id>;
+};
+
+&usb_hs_phy {
+       extcon = <&usb_id>;
+};
+
+&smd_rpm_regulators {
+       vdd_l1_l2_l3-supply = <&pm8916_s3>;
+       vdd_l4_l5_l6-supply = <&pm8916_s4>;
+       vdd_l7-supply = <&pm8916_s4>;
+
+       s3 {
+               regulator-min-microvolt = <1200000>;
+               regulator-max-microvolt = <1300000>;
+       };
+
+       s4 {
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <2100000>;
+       };
+
+       l1 {
+               regulator-min-microvolt = <1225000>;
+               regulator-max-microvolt = <1225000>;
+       };
+
+       l2 {
+               regulator-min-microvolt = <1200000>;
+               regulator-max-microvolt = <1200000>;
+       };
+
+       l4 {
+               regulator-min-microvolt = <2050000>;
+               regulator-max-microvolt = <2050000>;
+       };
+
+       l5 {
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+       };
+
+       l6 {
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+       };
+
+       l7 {
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+       };
+
+       l8 {
+               regulator-min-microvolt = <2950000>;
+               regulator-max-microvolt = <2950000>;
+       };
+
+       l9 {
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
+       l10 {
+               regulator-min-microvolt = <2700000>;
+               regulator-max-microvolt = <2800000>;
+       };
+
+       l11 {
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <2950000>;
+               regulator-allow-set-load;
+               regulator-system-load = <200000>;
+       };
+
+       l12 {
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <2950000>;
+       };
+
+       l13 {
+               regulator-min-microvolt = <3075000>;
+               regulator-max-microvolt = <3075000>;
+       };
+
+       l14 {
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
+       l15 {
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
+       l16 {
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+       };
+
+       l17 {
+               regulator-min-microvolt = <2850000>;
+               regulator-max-microvolt = <2850000>;
+       };
+
+       l18 {
+               regulator-min-microvolt = <2700000>;
+               regulator-max-microvolt = <2700000>;
+       };
+};
+
+&msmgpio {
+       accel_irq_default: accel-irq-default {
+               pins = "gpio115";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       gpio_keys_default: gpio-keys-default {
+               pins = "gpio107";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-pull-up;
+       };
+
+       gpio_leds_default: gpio-leds-default {
+               pins = "gpio8", "gpio9", "gpio10";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       nfc_default: nfc-default {
+               pins = "gpio2", "gpio20", "gpio21";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       mag_reset_default: mag-reset-default {
+               pins = "gpio36";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       prox_irq_default: prox-irq-default {
+               pins = "gpio113";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       reg_lcd_en_default: reg-lcd-en-default {
+               pins = "gpio32", "gpio97";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       sdhc2_cd_default: sdhc2-cd-default {
+               pins = "gpio56";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       ts_irq_default: ts-irq-default {
+               pins = "gpio13";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       usb_id_default: usb-id-default {
+               pins = "gpio117";
+               function = "gpio";
+
+               drive-strength = <8>;
+               bias-pull-up;
+       };
+};
index 230ba3c..9b4b7de 100644 (file)
@@ -4,6 +4,7 @@
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/input/input.h>
 #include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
 
 / {
        aliases {
                        pinctrl-0 = <&muic_int_default>;
                };
        };
+
+       i2c-tkey {
+               compatible = "i2c-gpio";
+               sda-gpios = <&msmgpio 16 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
+               scl-gpios = <&msmgpio 17 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&tkey_i2c_default>;
+
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               touchkey: touchkey@20 {
+                       /* Note: Actually an ABOV MCU that implements same interface */
+                       compatible = "coreriver,tc360-touchkey";
+                       reg = <0x20>;
+
+                       interrupt-parent = <&msmgpio>;
+                       interrupts = <98 IRQ_TYPE_EDGE_FALLING>;
+
+                       /* vcc/vdd-supply are board-specific */
+                       vddio-supply = <&pm8916_l6>;
+
+                       linux,keycodes = <KEY_APPSELECT KEY_BACK>;
+
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&tkey_default>;
+               };
+       };
+
+       i2c-nfc {
+               compatible = "i2c-gpio";
+               sda-gpios = <&msmgpio 0 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
+               scl-gpios = <&msmgpio 1 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&nfc_i2c_default>;
+
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               nfc@27 {
+                       compatible = "samsung,s3fwrn5-i2c";
+                       reg = <0x27>;
+
+                       interrupt-parent = <&msmgpio>;
+                       interrupts = <21 IRQ_TYPE_EDGE_RISING>;
+
+                       en-gpios = <&msmgpio 20 GPIO_ACTIVE_HIGH>;
+                       wake-gpios = <&msmgpio 49 GPIO_ACTIVE_HIGH>;
+
+                       clocks = <&rpmcc RPM_SMD_BB_CLK2_PIN>;
+
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&nfc_default &nfc_clk_req>;
+               };
+       };
 };
 
 &blsp_i2c2 {
        };
 };
 
+&blsp_i2c4 {
+       status = "okay";
+
+       battery@35 {
+               compatible = "richtek,rt5033-battery";
+               reg = <0x35>;
+               interrupt-parent = <&msmgpio>;
+               interrupts = <121 IRQ_TYPE_EDGE_BOTH>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&fg_alert_default>;
+       };
+};
+
 &blsp1_uart2 {
        status = "okay";
 };
                bias-disable;
        };
 
+       fg_alert_default: fg-alert-default {
+               pins = "gpio121";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
        gpio_keys_default: gpio-keys-default {
                pins = "gpio107", "gpio109";
                function = "gpio";
                bias-disable;
        };
 
+       nfc_default: nfc-default {
+               pins = "gpio20", "gpio49";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+
+               irq {
+                       pins = "gpio21";
+                       function = "gpio";
+
+                       drive-strength = <2>;
+                       bias-pull-down;
+               };
+       };
+
+       nfc_i2c_default: nfc-i2c-default {
+               pins = "gpio0", "gpio1";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       tkey_default: tkey-default {
+               pins = "gpio98";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       tkey_i2c_default: tkey-i2c-default {
+               pins = "gpio16", "gpio17";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
        tsp_en_default: tsp-en-default {
                pins = "gpio73";
                function = "gpio";
                bias-disable;
        };
 };
+
+&pm8916_gpios {
+       nfc_clk_req: nfc-clk-req {
+               pins = "gpio2";
+               function = "func1";
+
+               input-enable;
+               bias-disable;
+               power-source = <PM8916_GPIO_L2>;
+       };
+};
index 661f41a..6cc2eae 100644 (file)
                pinctrl-names = "default";
                pinctrl-0 = <&panel_vdd3_default>;
        };
+
+       reg_touch_key: regulator-touch-key {
+               compatible = "regulator-fixed";
+               regulator-name = "touch_key";
+               regulator-min-microvolt = <2800000>;
+               regulator-max-microvolt = <2800000>;
+
+               gpio = <&msmgpio 86 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&tkey_en_default>;
+       };
+
+       reg_key_led: regulator-key-led {
+               compatible = "regulator-fixed";
+               regulator-name = "key_led";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpio = <&msmgpio 60 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&tkey_led_en_default>;
+       };
+};
+
+&touchkey {
+       vcc-supply = <&reg_touch_key>;
+       vdd-supply = <&reg_key_led>;
 };
 
 &accelerometer {
                bias-disable;
        };
 
+       tkey_en_default: tkey-en-default {
+               pins = "gpio86";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       tkey_led_en_default: tkey-led-en-default {
+               pins = "gpio60";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
        ts_int_default: ts-int-default {
                pins = "gpio13";
                function = "gpio";
index dd35c33..c2eff5a 100644 (file)
@@ -7,6 +7,19 @@
 / {
        model = "Samsung Galaxy A5U (EUR)";
        compatible = "samsung,a5u-eur", "qcom,msm8916";
+
+       reg_touch_key: regulator-touch-key {
+               compatible = "regulator-fixed";
+               regulator-name = "touch_key";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpio = <&msmgpio 97 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&tkey_en_default>;
+       };
 };
 
 &accelerometer {
        };
 };
 
+&touchkey {
+       vcc-supply = <&reg_touch_key>;
+       vdd-supply = <&reg_touch_key>;
+};
+
 &msmgpio {
+       tkey_en_default: tkey-en-default {
+               pins = "gpio97";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
        ts_int_default: ts-int-default {
                pins = "gpio13";
                function = "gpio";
index baa5564..ffe1a9b 100644 (file)
@@ -32,3 +32,7 @@
                };
        };
 };
+
+&tlmm {
+       gpio-reserved-ranges = <85 4>;
+};
index 5f46a14..1e1514e 100644 (file)
@@ -7,7 +7,7 @@
 
 / {
        aliases {
-               serial0 = &blsp2_uart1;
+               serial0 = &blsp2_uart2;
        };
 
        chosen {
diff --git a/arch/arm64/boot/dts/qcom/msm8996-pins.dtsi b/arch/arm64/boot/dts/qcom/msm8996-pins.dtsi
deleted file mode 100644 (file)
index ac1ede5..0000000
+++ /dev/null
@@ -1,653 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
- */
-
-&msmgpio {
-
-       wcd9xxx_intr {
-               wcd_intr_default: wcd_intr_default{
-                       mux {
-                               pins = "gpio54";
-                               function = "gpio";
-                       };
-
-                       config {
-                               pins = "gpio54";
-                               drive-strength = <2>; /* 2 mA */
-                               bias-pull-down; /* pull down */
-                               input-enable;
-                       };
-               };
-       };
-
-       cdc_reset_ctrl {
-               cdc_reset_sleep: cdc_reset_sleep {
-                       mux {
-                               pins = "gpio64";
-                               function = "gpio";
-                       };
-                       config {
-                               pins = "gpio64";
-                               drive-strength = <16>;
-                               bias-disable;
-                               output-low;
-                       };
-               };
-               cdc_reset_active:cdc_reset_active {
-                       mux {
-                               pins = "gpio64";
-                               function = "gpio";
-                       };
-                       config {
-                               pins = "gpio64";
-                               drive-strength = <16>;
-                               bias-pull-down;
-                               output-high;
-                       };
-               };
-       };
-
-       blsp1_spi0_default: blsp1_spi0_default {
-               pinmux {
-                       function = "blsp_spi1";
-                       pins = "gpio0", "gpio1", "gpio3";
-               };
-               pinmux_cs {
-                       function = "gpio";
-                       pins = "gpio2";
-               };
-               pinconf {
-                       pins = "gpio0", "gpio1", "gpio3";
-                       drive-strength = <12>;
-                       bias-disable;
-               };
-               pinconf_cs {
-                       pins = "gpio2";
-                       drive-strength = <16>;
-                       bias-disable;
-                       output-high;
-               };
-       };
-
-       blsp1_spi0_sleep: blsp1_spi0_sleep {
-               pinmux {
-                       function = "gpio";
-                       pins = "gpio0", "gpio1", "gpio2", "gpio3";
-               };
-               pinconf {
-                       pins = "gpio0", "gpio1", "gpio2", "gpio3";
-                       drive-strength = <2>;
-                       bias-pull-down;
-               };
-       };
-
-       blsp1_i2c2_default: blsp1_i2c2_default {
-               pinmux {
-                       function = "blsp_i2c3";
-                       pins = "gpio47", "gpio48";
-               };
-               pinconf {
-                       pins = "gpio47", "gpio48";
-                       drive-strength = <16>;
-                       bias-disable = <0>;
-               };
-       };
-
-       blsp1_i2c2_sleep: blsp1_i2c2_sleep {
-               pinmux {
-                       function = "gpio";
-                       pins = "gpio47", "gpio48";
-               };
-               pinconf {
-                       pins = "gpio47", "gpio48";
-                       drive-strength = <2>;
-                       bias-disable = <0>;
-               };
-       };
-
-       blsp2_i2c0_default: blsp2_i2c0 {
-               pinmux {
-                       function = "blsp_i2c7";
-                       pins = "gpio55", "gpio56";
-               };
-               pinconf {
-                       pins = "gpio55", "gpio56";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-       };
-
-       blsp2_i2c0_sleep: blsp2_i2c0_sleep {
-               pinmux {
-                       function = "gpio";
-                       pins = "gpio55", "gpio56";
-               };
-               pinconf {
-                       pins = "gpio55", "gpio56";
-                       drive-strength = <2>;
-                       bias-disable;
-               };
-       };
-
-       blsp2_uart1_2pins_default: blsp2_uart1_2pins {
-               pinmux {
-                       function = "blsp_uart8";
-                       pins = "gpio4", "gpio5";
-               };
-               pinconf {
-                       pins = "gpio4", "gpio5";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-       };
-
-       blsp2_uart1_2pins_sleep: blsp2_uart1_2pins_sleep {
-               pinmux {
-                       function = "gpio";
-                       pins = "gpio4", "gpio5";
-               };
-               pinconf {
-                       pins = "gpio4", "gpio5";
-                       drive-strength = <2>;
-                       bias-disable;
-               };
-       };
-
-       blsp2_uart1_4pins_default: blsp2_uart1_4pins {
-               pinmux {
-                       function = "blsp_uart8";
-                       pins = "gpio4", "gpio5", "gpio6", "gpio7";
-               };
-
-               pinconf {
-                       pins = "gpio4", "gpio5", "gpio6", "gpio7";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-       };
-
-       blsp2_uart1_4pins_sleep: blsp2_uart1_4pins_sleep {
-               pinmux {
-                       function = "gpio";
-                       pins = "gpio4", "gpio5", "gpio6", "gpio7";
-               };
-
-               pinconf {
-                       pins = "gpio4", "gpio5", "gpio6", "gpio7";
-                       drive-strength = <2>;
-                       bias-disable;
-               };
-       };
-
-       blsp2_i2c1_default: blsp2_i2c1 {
-               pinmux {
-                       function = "blsp_i2c8";
-                       pins = "gpio6", "gpio7";
-               };
-               pinconf {
-                       pins = "gpio6", "gpio7";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-       };
-
-       blsp2_i2c1_sleep: blsp2_i2c1_sleep {
-               pinmux {
-                       function = "gpio";
-                       pins = "gpio6", "gpio7";
-               };
-               pinconf {
-                       pins = "gpio6", "gpio7";
-                       drive-strength = <2>;
-                       bias-disable;
-               };
-       };
-
-       blsp2_uart2_2pins_default: blsp2_uart2_2pins {
-               pinmux {
-                       function = "blsp_uart9";
-                       pins = "gpio49", "gpio50";
-               };
-               pinconf {
-                       pins = "gpio49", "gpio50";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-       };
-
-       blsp2_uart2_2pins_sleep: blsp2_uart2_2pins_sleep {
-               pinmux {
-                       function = "gpio";
-                       pins = "gpio49", "gpio50";
-               };
-               pinconf {
-                       pins = "gpio49", "gpio50";
-                       drive-strength = <2>;
-                       bias-disable;
-               };
-       };
-
-       blsp2_uart2_4pins_default: blsp2_uart2_4pins {
-               pinmux {
-                       function = "blsp_uart9";
-                       pins = "gpio49", "gpio50", "gpio51", "gpio52";
-               };
-
-               pinconf {
-                       pins = "gpio49", "gpio50", "gpio51", "gpio52";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-       };
-
-       blsp2_uart2_4pins_sleep: blsp2_uart2_4pins_sleep {
-               pinmux {
-                       function = "gpio";
-                       pins = "gpio49", "gpio50", "gpio51", "gpio52";
-               };
-
-               pinconf {
-                       pins = "gpio49", "gpio50", "gpio51", "gpio52";
-                       drive-strength = <2>;
-                       bias-disable;
-               };
-       };
-
-       blsp2_spi5_default: blsp2_spi5_default {
-               pinmux {
-                       function = "blsp_spi12";
-                       pins = "gpio85", "gpio86", "gpio88";
-               };
-               pinmux_cs {
-                       function = "gpio";
-                       pins = "gpio87";
-               };
-               pinconf {
-                       pins = "gpio85", "gpio86", "gpio88";
-                       drive-strength = <12>;
-                       bias-disable;
-               };
-               pinconf_cs {
-                       pins = "gpio87";
-                       drive-strength = <16>;
-                       bias-disable;
-                       output-high;
-               };
-       };
-
-       blsp2_spi5_sleep: blsp2_spi5_sleep {
-               pinmux {
-                       function = "gpio";
-                       pins = "gpio85", "gpio86", "gpio87", "gpio88";
-               };
-               pinconf {
-                       pins = "gpio85", "gpio86", "gpio87", "gpio88";
-                       drive-strength = <2>;
-                       bias-pull-down;
-               };
-       };
-
-       sdc2_clk_on: sdc2_clk_on {
-               config {
-                       pins = "sdc2_clk";
-                       bias-disable;           /* NO pull */
-                       drive-strength = <16>;  /* 16 MA */
-               };
-       };
-
-       sdc2_clk_off: sdc2_clk_off {
-               config {
-                       pins = "sdc2_clk";
-                       bias-disable;           /* NO pull */
-                       drive-strength = <2>;   /* 2 MA */
-               };
-       };
-
-       sdc2_cmd_on: sdc2_cmd_on {
-               config {
-                       pins = "sdc2_cmd";
-                       bias-pull-up;           /* pull up */
-                       drive-strength = <10>;  /* 10 MA */
-               };
-       };
-
-       sdc2_cmd_off: sdc2_cmd_off {
-               config {
-                       pins = "sdc2_cmd";
-                       bias-pull-up;           /* pull up */
-                       drive-strength = <2>;   /* 2 MA */
-               };
-       };
-
-       sdc2_data_on: sdc2_data_on {
-               config {
-                       pins = "sdc2_data";
-                       bias-pull-up;           /* pull up */
-                       drive-strength = <10>;  /* 10 MA */
-               };
-       };
-
-       sdc2_data_off: sdc2_data_off {
-               config {
-                       pins = "sdc2_data";
-                       bias-pull-up;           /* pull up */
-                       drive-strength = <2>;   /* 2 MA */
-               };
-       };
-
-       pcie0_clkreq_default: pcie0_clkreq_default {
-               mux {
-                       pins = "gpio36";
-                       function = "pci_e0";
-               };
-
-               config {
-                       pins = "gpio36";
-                       drive-strength = <2>;
-                       bias-pull-up;
-               };
-       };
-
-       pcie0_perst_default: pcie0_perst_default {
-               mux {
-                       pins = "gpio35";
-                       function = "gpio";
-               };
-
-               config {
-                       pins = "gpio35";
-                       drive-strength = <2>;
-                       bias-pull-down;
-               };
-       };
-
-       pcie0_wake_default: pcie0_wake_default {
-               mux {
-                       pins = "gpio37";
-                       function = "gpio";
-               };
-
-               config {
-                       pins = "gpio37";
-                       drive-strength = <2>;
-                       bias-pull-up;
-               };
-       };
-
-       pcie0_clkreq_sleep: pcie0_clkreq_sleep {
-               mux {
-                       pins = "gpio36";
-                       function = "gpio";
-               };
-
-               config {
-                       pins = "gpio36";
-                       drive-strength = <2>;
-                       bias-disable;
-               };
-       };
-
-       pcie0_wake_sleep: pcie0_wake_sleep {
-               mux {
-                       pins = "gpio37";
-                       function = "gpio";
-               };
-
-               config {
-                       pins = "gpio37";
-                       drive-strength = <2>;
-                       bias-disable;
-               };
-       };
-
-       pcie1_clkreq_default: pcie1_clkreq_default {
-               mux {
-                       pins = "gpio131";
-                       function = "pci_e1";
-               };
-
-               config {
-                       pins = "gpio131";
-                       drive-strength = <2>;
-                       bias-pull-up;
-               };
-       };
-
-       pcie1_perst_default: pcie1_perst_default {
-               mux {
-                       pins = "gpio130";
-                       function = "gpio";
-               };
-
-               config {
-                       pins = "gpio130";
-                       drive-strength = <2>;
-                       bias-pull-down;
-               };
-       };
-
-       pcie1_wake_default: pcie1_wake_default {
-               mux {
-                       pins = "gpio132";
-                       function = "gpio";
-               };
-
-               config {
-                       pins = "gpio132";
-                       drive-strength = <2>;
-                       bias-pull-down;
-               };
-       };
-
-       pcie1_clkreq_sleep: pcie1_clkreq_sleep {
-               mux {
-                       pins = "gpio131";
-                       function = "gpio";
-               };
-
-               config {
-                       pins = "gpio131";
-                       drive-strength = <2>;
-                       bias-disable;
-               };
-       };
-
-       pcie1_wake_sleep: pcie1_wake_sleep {
-               mux {
-                       pins = "gpio132";
-                       function = "gpio";
-               };
-
-               config {
-                       pins = "gpio132";
-                       drive-strength = <2>;
-                       bias-disable;
-               };
-       };
-
-       pcie2_clkreq_default: pcie2_clkreq_default {
-               mux {
-                       pins = "gpio115";
-                       function = "pci_e2";
-               };
-
-               config {
-                       pins = "gpio115";
-                       drive-strength = <2>;
-                       bias-pull-up;
-               };
-       };
-
-       pcie2_perst_default: pcie2_perst_default {
-               mux {
-                       pins = "gpio114";
-                       function = "gpio";
-               };
-
-               config {
-                       pins = "gpio114";
-                       drive-strength = <2>;
-                       bias-pull-down;
-               };
-       };
-
-       pcie2_wake_default: pcie2_wake_default {
-               mux {
-                       pins = "gpio116";
-                       function = "gpio";
-               };
-
-               config {
-                       pins = "gpio116";
-                       drive-strength = <2>;
-                       bias-pull-down;
-               };
-       };
-
-       pcie2_clkreq_sleep: pcie2_clkreq_sleep {
-               mux {
-                       pins = "gpio115";
-                       function = "gpio";
-               };
-
-               config {
-                       pins = "gpio115";
-                       drive-strength = <2>;
-                       bias-disable;
-               };
-       };
-
-       pcie2_wake_sleep: pcie2_wake_sleep {
-               mux {
-                       pins = "gpio116";
-                       function = "gpio";
-               };
-
-               config {
-                       pins = "gpio116";
-                       drive-strength = <2>;
-                       bias-disable;
-               };
-       };
-
-       cci0_default: cci0_default {
-               pinmux {
-                       function = "cci_i2c";
-                       pins = "gpio17", "gpio18";
-               };
-               pinconf {
-                       pins = "gpio17", "gpio18";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-       };
-
-       cci1_default: cci1_default {
-               pinmux {
-                       function = "cci_i2c";
-                       pins = "gpio19", "gpio20";
-               };
-               pinconf {
-                       pins = "gpio19", "gpio20";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-       };
-
-       camera_board_default: camera_board_default {
-               mux_pwdn {
-                       function = "gpio";
-                       pins = "gpio98";
-               };
-               config_pwdn {
-                       pins = "gpio98";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-
-               mux_rst {
-                       function = "gpio";
-                       pins = "gpio104";
-               };
-               config_rst {
-                       pins = "gpio104";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-
-               mux_mclk1 {
-                       function = "cam_mclk";
-                       pins = "gpio14";
-               };
-               config_mclk1 {
-                       pins = "gpio14";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-       };
-
-       camera_front_default: camera_front_default {
-               mux_pwdn {
-                       function = "gpio";
-                       pins = "gpio133";
-               };
-               config_pwdn {
-                       pins = "gpio133";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-
-               mux_rst {
-                       function = "gpio";
-                       pins = "gpio23";
-               };
-               config_rst {
-                       pins = "gpio23";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-
-               mux_mclk2 {
-                       function = "cam_mclk";
-                       pins = "gpio15";
-               };
-               config_mclk2 {
-                       pins = "gpio15";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-       };
-
-       camera_rear_default: camera_rear_default {
-               mux_pwdn {
-                       function = "gpio";
-                       pins = "gpio26";
-               };
-               config_pwdn {
-                       pins = "gpio26";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-
-               mux_rst {
-                       function = "gpio";
-                       pins = "gpio25";
-               };
-               config_rst {
-                       pins = "gpio25";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-
-               mux_mclk0 {
-                       function = "cam_mclk";
-                       pins = "gpio13";
-               };
-               config_mclk0 {
-                       pins = "gpio13";
-                       drive-strength = <16>;
-                       bias-disable;
-               };
-       };
-};
index ce430ba..9d4f22e 100644 (file)
@@ -6,7 +6,9 @@
 #include <dt-bindings/clock/qcom,gcc-msm8996.h>
 #include <dt-bindings/clock/qcom,mmcc-msm8996.h>
 #include <dt-bindings/clock/qcom,rpmcc.h>
+#include <dt-bindings/power/qcom-rpmpd.h>
 #include <dt-bindings/soc/qcom,apr.h>
+#include <dt-bindings/thermal/thermal.h>
 
 / {
        interrupt-parent = <&intc>;
@@ -43,6 +45,9 @@
                        enable-method = "psci";
                        cpu-idle-states = <&CPU_SLEEP_0>;
                        capacity-dmips-mhz = <1024>;
+                       clocks = <&kryocc 0>;
+                       operating-points-v2 = <&cluster0_opp>;
+                       #cooling-cells = <2>;
                        next-level-cache = <&L2_0>;
                        L2_0: l2-cache {
                              compatible = "cache";
@@ -57,6 +62,9 @@
                        enable-method = "psci";
                        cpu-idle-states = <&CPU_SLEEP_0>;
                        capacity-dmips-mhz = <1024>;
+                       clocks = <&kryocc 0>;
+                       operating-points-v2 = <&cluster0_opp>;
+                       #cooling-cells = <2>;
                        next-level-cache = <&L2_0>;
                };
 
@@ -67,6 +75,9 @@
                        enable-method = "psci";
                        cpu-idle-states = <&CPU_SLEEP_0>;
                        capacity-dmips-mhz = <1024>;
+                       clocks = <&kryocc 1>;
+                       operating-points-v2 = <&cluster1_opp>;
+                       #cooling-cells = <2>;
                        next-level-cache = <&L2_1>;
                        L2_1: l2-cache {
                              compatible = "cache";
@@ -81,6 +92,9 @@
                        enable-method = "psci";
                        cpu-idle-states = <&CPU_SLEEP_0>;
                        capacity-dmips-mhz = <1024>;
+                       clocks = <&kryocc 1>;
+                       operating-points-v2 = <&cluster1_opp>;
+                       #cooling-cells = <2>;
                        next-level-cache = <&L2_1>;
                };
 
                };
        };
 
+       cluster0_opp: opp_table0 {
+               compatible = "operating-points-v2-kryo-cpu";
+               nvmem-cells = <&speedbin_efuse>;
+               opp-shared;
+
+               /* Nominal fmax for now */
+               opp-307200000 {
+                       opp-hz = /bits/ 64 <307200000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-422400000 {
+                       opp-hz = /bits/ 64 <422400000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-480000000 {
+                       opp-hz = /bits/ 64 <480000000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-556800000 {
+                       opp-hz = /bits/ 64 <556800000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-652800000 {
+                       opp-hz = /bits/ 64 <652800000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-729600000 {
+                       opp-hz = /bits/ 64 <729600000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-844800000 {
+                       opp-hz = /bits/ 64 <844800000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-960000000 {
+                       opp-hz = /bits/ 64 <960000000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1036800000 {
+                       opp-hz = /bits/ 64 <1036800000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1113600000 {
+                       opp-hz = /bits/ 64 <1113600000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1190400000 {
+                       opp-hz = /bits/ 64 <1190400000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1228800000 {
+                       opp-hz = /bits/ 64 <1228800000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1324800000 {
+                       opp-hz = /bits/ 64 <1324800000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1401600000 {
+                       opp-hz = /bits/ 64 <1401600000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1478400000 {
+                       opp-hz = /bits/ 64 <1478400000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1593600000 {
+                       opp-hz = /bits/ 64 <1593600000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+       };
+
+       cluster1_opp: opp_table1 {
+               compatible = "operating-points-v2-kryo-cpu";
+               nvmem-cells = <&speedbin_efuse>;
+               opp-shared;
+
+               /* Nominal fmax for now */
+               opp-307200000 {
+                       opp-hz = /bits/ 64 <307200000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-403200000 {
+                       opp-hz = /bits/ 64 <403200000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-480000000 {
+                       opp-hz = /bits/ 64 <480000000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-556800000 {
+                       opp-hz = /bits/ 64 <556800000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-652800000 {
+                       opp-hz = /bits/ 64 <652800000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-729600000 {
+                       opp-hz = /bits/ 64 <729600000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-806400000 {
+                       opp-hz = /bits/ 64 <806400000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-883200000 {
+                       opp-hz = /bits/ 64 <883200000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-940800000 {
+                       opp-hz = /bits/ 64 <940800000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1036800000 {
+                       opp-hz = /bits/ 64 <1036800000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1113600000 {
+                       opp-hz = /bits/ 64 <1113600000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1190400000 {
+                       opp-hz = /bits/ 64 <1190400000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1248000000 {
+                       opp-hz = /bits/ 64 <1248000000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1324800000 {
+                       opp-hz = /bits/ 64 <1324800000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1401600000 {
+                       opp-hz = /bits/ 64 <1401600000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1478400000 {
+                       opp-hz = /bits/ 64 <1478400000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1555200000 {
+                       opp-hz = /bits/ 64 <1555200000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1632000000 {
+                       opp-hz = /bits/ 64 <1632000000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1708800000 {
+                       opp-hz = /bits/ 64 <1708800000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1785600000 {
+                       opp-hz = /bits/ 64 <1785600000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1824000000 {
+                       opp-hz = /bits/ 64 <1824000000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1920000000 {
+                       opp-hz = /bits/ 64 <1920000000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-1996800000 {
+                       opp-hz = /bits/ 64 <1996800000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-2073600000 {
+                       opp-hz = /bits/ 64 <2073600000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+               opp-2150400000 {
+                       opp-hz = /bits/ 64 <2150400000>;
+                       opp-supported-hw = <0x77>;
+                       clock-latency-ns = <200000>;
+               };
+       };
+
        firmware {
                scm {
                        compatible = "qcom,scm-msm8996";
                                bits = <1 4>;
                        };
 
-                       gpu_speed_bin: gpu_speed_bin@133 {
+                       speedbin_efuse: speedbin@133 {
                                reg = <0x133 0x1>;
                                bits = <5 3>;
                        };
 
                tcsr_mutex_regs: syscon@740000 {
                        compatible = "syscon";
-                       reg = <0x00740000 0x20000>;
+                       reg = <0x00740000 0x40000>;
                };
 
                tcsr: syscon@7a0000 {
                        #size-cells = <1>;
                        ranges;
 
+                       status = "disabled";
+
                        mdp: mdp@901000 {
                                compatible = "qcom,mdp5";
                                reg = <0x00901000 0x90000>;
 
                                iommus = <&mdp_smmu 0>;
 
+                               assigned-clocks = <&mmcc MDSS_MDP_CLK>,
+                                        <&mmcc MDSS_VSYNC_CLK>;
+                               assigned-clock-rates = <300000000>,
+                                        <19200000>;
+
                                ports {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
                                                        remote-endpoint = <&hdmi_in>;
                                                };
                                        };
+
+                                       port@1 {
+                                               reg = <1>;
+                                               mdp5_intf1_out: endpoint {
+                                                       remote-endpoint = <&dsi0_in>;
+                                               };
+                                       };
                                };
                        };
 
+                       dsi0: dsi@994000 {
+                               compatible = "qcom,mdss-dsi-ctrl";
+                               reg = <0x00994000 0x400>;
+                               reg-names = "dsi_ctrl";
+
+                               interrupt-parent = <&mdss>;
+                               interrupts = <4 IRQ_TYPE_LEVEL_HIGH>;
+
+                               clocks = <&mmcc MDSS_MDP_CLK>,
+                                        <&mmcc MDSS_BYTE0_CLK>,
+                                        <&mmcc MDSS_AHB_CLK>,
+                                        <&mmcc MDSS_AXI_CLK>,
+                                        <&mmcc MMSS_MISC_AHB_CLK>,
+                                        <&mmcc MDSS_PCLK0_CLK>,
+                                        <&mmcc MDSS_ESC0_CLK>;
+                               clock-names = "mdp_core",
+                                             "byte",
+                                             "iface",
+                                             "bus",
+                                             "core_mmss",
+                                             "pixel",
+                                             "core";
+
+                               phys = <&dsi0_phy>;
+                               phy-names = "dsi";
+                               status = "disabled";
+
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               ports {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       port@0 {
+                                               reg = <0>;
+                                               dsi0_in: endpoint {
+                                                       remote-endpoint = <&mdp5_intf1_out>;
+                                               };
+                                       };
+
+                                       port@1 {
+                                               reg = <1>;
+                                               dsi0_out: endpoint {
+                                               };
+                                       };
+                               };
+                       };
+
+                       dsi0_phy: dsi-phy@994400 {
+                               compatible = "qcom,dsi-phy-14nm";
+                               reg = <0x00994400 0x100>,
+                                     <0x00994500 0x300>,
+                                     <0x00994800 0x188>;
+                               reg-names = "dsi_phy",
+                                           "dsi_phy_lane",
+                                           "dsi_pll";
+
+                               #clock-cells = <1>;
+                               #phy-cells = <0>;
+
+                               clocks = <&mmcc MDSS_AHB_CLK>, <&xo_board>;
+                               clock-names = "iface", "ref";
+                               status = "disabled";
+                       };
+
                        hdmi: hdmi-tx@9a0000 {
                                compatible = "qcom,hdmi-tx-8996";
                                reg =   <0x009a0000 0x50c>,
                                              "ref";
                        };
                };
-               gpu@b00000 {
+
+               gpu: gpu@b00000 {
                        compatible = "qcom,adreno-530.2", "qcom,adreno";
                        #stream-id-cells = <16>;
 
                        power-domains = <&mmcc GPU_GX_GDSC>;
                        iommus = <&adreno_smmu 0>;
 
-                       nvmem-cells = <&gpu_speed_bin>;
+                       nvmem-cells = <&speedbin_efuse>;
                        nvmem-cell-names = "speed_bin";
 
                        qcom,gpu-quirk-two-pass-use-wfi;
 
                        operating-points-v2 = <&gpu_opp_table>;
 
+                       status = "disabled";
+
                        gpu_opp_table: opp-table {
                                compatible  ="operating-points-v2";
 
                        };
                };
 
-               msmgpio: pinctrl@1010000 {
+               tlmm: pinctrl@1010000 {
                        compatible = "qcom,msm8996-pinctrl";
                        reg = <0x01010000 0x300000>;
                        interrupts = <GIC_SPI 208 IRQ_TYPE_LEVEL_HIGH>;
                        gpio-controller;
-                       gpio-ranges = <&msmgpio 0 0 150>;
+                       gpio-ranges = <&tlmm 0 0 150>;
                        #gpio-cells = <2>;
                        interrupt-controller;
                        #interrupt-cells = <2>;
+
+                       blsp1_spi1_default: blsp1-spi1-default {
+                               spi {
+                                       pins = "gpio0", "gpio1", "gpio3";
+                                       function = "blsp_spi1";
+                                       drive-strength = <12>;
+                                       bias-disable;
+                               };
+
+                               cs {
+                                       pins = "gpio2";
+                                       function = "gpio";
+                                       drive-strength = <16>;
+                                       bias-disable;
+                                       output-high;
+                               };
+                       };
+
+                       blsp1_spi1_sleep: blsp1-spi1-sleep {
+                               pins = "gpio0", "gpio1", "gpio2", "gpio3";
+                               function = "gpio";
+                               drive-strength = <2>;
+                               bias-pull-down;
+                       };
+
+                       blsp2_uart2_2pins_default: blsp2-uart1-2pins {
+                               pins = "gpio4", "gpio5";
+                               function = "blsp_uart8";
+                               drive-strength = <16>;
+                               bias-disable;
+                       };
+
+                       blsp2_uart2_2pins_sleep: blsp2-uart1-2pins-sleep {
+                               pins = "gpio4", "gpio5";
+                               function = "gpio";
+                               drive-strength = <2>;
+                               bias-disable;
+                       };
+
+                       blsp2_i2c2_default: blsp2-i2c2 {
+                               pins = "gpio6", "gpio7";
+                               function = "blsp_i2c8";
+                               drive-strength = <16>;
+                               bias-disable;
+                       };
+
+                       blsp2_i2c2_sleep: blsp2-i2c2-sleep {
+                               pins = "gpio6", "gpio7";
+                               function = "gpio";
+                               drive-strength = <2>;
+                               bias-disable;
+                       };
+
+                       cci0_default: cci0-default {
+                               pins = "gpio17", "gpio18";
+                               function = "cci_i2c";
+                               drive-strength = <16>;
+                               bias-disable;
+                       };
+
+                       camera0_state_on:
+                       camera_rear_default: camera-rear-default {
+                               mclk0 {
+                                       pins = "gpio13";
+                                       function = "cam_mclk";
+                                       drive-strength = <16>;
+                                       bias-disable;
+                               };
+
+                               rst {
+                                       pins = "gpio25";
+                                       function = "gpio";
+                                       drive-strength = <16>;
+                                       bias-disable;
+                               };
+
+                               pwdn {
+                                       pins = "gpio26";
+                                       function = "gpio";
+                                       drive-strength = <16>;
+                                       bias-disable;
+                               };
+                       };
+
+                       cci1_default: cci1-default {
+                               pins = "gpio19", "gpio20";
+                               function = "cci_i2c";
+                               drive-strength = <16>;
+                               bias-disable;
+                       };
+
+                       camera1_state_on:
+                       camera_board_default: camera-board-default {
+                               mclk1 {
+                                       pins = "gpio14";
+                                       function = "cam_mclk";
+                                       drive-strength = <16>;
+                                       bias-disable;
+                               };
+
+                               pwdn {
+                                       pins = "gpio98";
+                                       function = "gpio";
+                                       drive-strength = <16>;
+                                       bias-disable;
+                               };
+
+                               rst {
+                                       pins = "gpio104";
+                                       function = "gpio";
+                                       drive-strength = <16>;
+                                       bias-disable;
+                               };
+                       };
+
+                       camera2_state_on:
+                       camera_front_default: camera-front-default {
+                               mclk2 {
+                                       pins = "gpio15";
+                                       function = "cam_mclk";
+                                       drive-strength = <16>;
+                                       bias-disable;
+                               };
+
+                               rst {
+                                       pins = "gpio23";
+                                       function = "gpio";
+                                       drive-strength = <16>;
+                                       bias-disable;
+                               };
+
+                               pwdn {
+                                       pins = "gpio133";
+                                       function = "gpio";
+                                       drive-strength = <16>;
+                                       bias-disable;
+                               };
+                       };
+
+                       pcie0_state_on: pcie0-state-on {
+                               perst {
+                                       pins = "gpio35";
+                                       function = "gpio";
+                                       drive-strength = <2>;
+                                       bias-pull-down;
+                               };
+
+                               clkreq {
+                                       pins = "gpio36";
+                                       function = "pci_e0";
+                                       drive-strength = <2>;
+                                       bias-pull-up;
+                               };
+
+                               wake {
+                                       pins = "gpio37";
+                                       function = "gpio";
+                                       drive-strength = <2>;
+                                       bias-pull-up;
+                               };
+                       };
+
+                       pcie0_state_off: pcie0-state-off {
+                               perst {
+                                       pins = "gpio35";
+                                       function = "gpio";
+                                       drive-strength = <2>;
+                                       bias-pull-down;
+                               };
+
+                               clkreq {
+                                       pins = "gpio36";
+                                       function = "gpio";
+                                       drive-strength = <2>;
+                                       bias-disable;
+                               };
+
+                               wake {
+                                       pins = "gpio37";
+                                       function = "gpio";
+                                       drive-strength = <2>;
+                                       bias-disable;
+                               };
+                       };
+
+                       blsp1_i2c3_default: blsp1-i2c2-default {
+                               pins = "gpio47", "gpio48";
+                               function = "blsp_i2c3";
+                               drive-strength = <16>;
+                               bias-disable = <0>;
+                       };
+
+                       blsp1_i2c3_sleep: blsp1-i2c2-sleep {
+                               pins = "gpio47", "gpio48";
+                               function = "gpio";
+                               drive-strength = <2>;
+                               bias-disable = <0>;
+                       };
+
+                       blsp2_uart3_4pins_default: blsp2-uart2-4pins {
+                               pins = "gpio49", "gpio50", "gpio51", "gpio52";
+                               function = "blsp_uart9";
+                               drive-strength = <16>;
+                               bias-disable;
+                       };
+
+                       blsp2_uart3_4pins_sleep: blsp2-uart2-4pins-sleep {
+                               pins = "gpio49", "gpio50", "gpio51", "gpio52";
+                               function = "blsp_uart9";
+                               drive-strength = <2>;
+                               bias-disable;
+                       };
+
+                       wcd_intr_default: wcd-intr-default{
+                               pins = "gpio54";
+                               function = "gpio";
+                               drive-strength = <2>;
+                               bias-pull-down;
+                               input-enable;
+                       };
+
+                       blsp2_i2c1_default: blsp2-i2c1 {
+                               pins = "gpio55", "gpio56";
+                               function = "blsp_i2c7";
+                               drive-strength = <16>;
+                               bias-disable;
+                       };
+
+                       blsp2_i2c1_sleep: blsp2-i2c0-sleep {
+                               pins = "gpio55", "gpio56";
+                               function = "gpio";
+                               drive-strength = <2>;
+                               bias-disable;
+                       };
+
+                       blsp2_i2c5_default: blsp2-i2c5 {
+                               pins = "gpio60", "gpio61";
+                               function = "blsp_i2c11";
+                               drive-strength = <2>;
+                               bias-disable;
+                       };
+
+                       /* Sleep state for BLSP2_I2C5 is missing.. */
+
+                       cdc_reset_active: cdc-reset-active {
+                               pins = "gpio64";
+                               function = "gpio";
+                               drive-strength = <16>;
+                               bias-pull-down;
+                               output-high;
+                       };
+
+                       cdc_reset_sleep: cdc-reset-sleep {
+                               pins = "gpio64";
+                               function = "gpio";
+                               drive-strength = <16>;
+                               bias-disable;
+                               output-low;
+                       };
+
+                       blsp2_spi6_default: blsp2-spi5-default {
+                               spi {
+                                       pins = "gpio85", "gpio86", "gpio88";
+                                       function = "blsp_spi12";
+                                       drive-strength = <12>;
+                                       bias-disable;
+                               };
+
+                               cs {
+                                       pins = "gpio87";
+                                       function = "gpio";
+                                       drive-strength = <16>;
+                                       bias-disable;
+                                       output-high;
+                               };
+                       };
+
+                       blsp2_spi6_sleep: blsp2-spi5-sleep {
+                               pins = "gpio85", "gpio86", "gpio87", "gpio88";
+                               function = "gpio";
+                               drive-strength = <2>;
+                               bias-pull-down;
+                       };
+
+                       blsp2_i2c6_default: blsp2-i2c6 {
+                               pins = "gpio87", "gpio88";
+                               function = "blsp_i2c12";
+                               drive-strength = <16>;
+                               bias-disable;
+                       };
+
+                       blsp2_i2c6_sleep: blsp2-i2c6-sleep {
+                               pins = "gpio87", "gpio88";
+                               function = "gpio";
+                               drive-strength = <2>;
+                               bias-disable;
+                       };
+
+                       pcie1_state_on: pcie1-state-on {
+                               perst {
+                                       pins = "gpio130";
+                                       function = "gpio";
+                                       drive-strength = <2>;
+                                       bias-pull-down;
+                               };
+
+                               clkreq {
+                                       pins = "gpio131";
+                                       function = "pci_e1";
+                                       drive-strength = <2>;
+                                       bias-pull-up;
+                               };
+
+                               wake {
+                                       pins = "gpio132";
+                                       function = "gpio";
+                                       drive-strength = <2>;
+                                       bias-pull-down;
+                               };
+                       };
+
+                       pcie1_state_off: pcie1-state-off {
+                               /* Perst is missing? */
+                               clkreq {
+                                       pins = "gpio131";
+                                       function = "gpio";
+                                       drive-strength = <2>;
+                                       bias-disable;
+                               };
+
+                               wake {
+                                       pins = "gpio132";
+                                       function = "gpio";
+                                       drive-strength = <2>;
+                                       bias-disable;
+                               };
+                       };
+
+                       pcie2_state_on: pcie2-state-on {
+                               perst {
+                                       pins = "gpio114";
+                                       function = "gpio";
+                                       drive-strength = <2>;
+                                       bias-pull-down;
+                               };
+
+                               clkreq {
+                                       pins = "gpio115";
+                                       function = "pci_e2";
+                                       drive-strength = <2>;
+                                       bias-pull-up;
+                               };
+
+                               wake {
+                                       pins = "gpio116";
+                                       function = "gpio";
+                                       drive-strength = <2>;
+                                       bias-pull-down;
+                               };
+                       };
+
+                       pcie2_state_off: pcie2-state-off {
+                               /* Perst is missing? */
+                               clkreq {
+                                       pins = "gpio115";
+                                       function = "gpio";
+                                       drive-strength = <2>;
+                                       bias-disable;
+                               };
+
+                               wake {
+                                       pins = "gpio116";
+                                       function = "gpio";
+                                       drive-strength = <2>;
+                                       bias-disable;
+                               };
+                       };
+
+                       sdc1_state_on: sdc1-state-on {
+                               clk {
+                                       pins = "sdc1_clk";
+                                       bias-disable;
+                                       drive-strength = <16>;
+                               };
+
+                               cmd {
+                                       pins = "sdc1_cmd";
+                                       bias-pull-up;
+                                       drive-strength = <10>;
+                               };
+
+                               data {
+                                       pins = "sdc1_data";
+                                       bias-pull-up;
+                                       drive-strength = <10>;
+                               };
+
+                               rclk {
+                                       pins = "sdc1_rclk";
+                                       bias-pull-down;
+                               };
+                       };
+
+                       sdc1_state_off: sdc1-state-off {
+                               clk {
+                                       pins = "sdc1_clk";
+                                       bias-disable;
+                                       drive-strength = <2>;
+                               };
+
+                               cmd {
+                                       pins = "sdc1_cmd";
+                                       bias-pull-up;
+                                       drive-strength = <2>;
+                               };
+
+                               data {
+                                       pins = "sdc1_data";
+                                       bias-pull-up;
+                                       drive-strength = <2>;
+                               };
+
+                               rclk {
+                                       pins = "sdc1_rclk";
+                                       bias-pull-down;
+                               };
+                       };
+
+                       sdc2_state_on: sdc2-clk-on {
+                               clk {
+                                       pins = "sdc2_clk";
+                                       bias-disable;
+                                       drive-strength = <16>;
+                               };
+
+                               cmd {
+                                       pins = "sdc2_cmd";
+                                       bias-pull-up;
+                                       drive-strength = <10>;
+                               };
+
+                               data {
+                                       pins = "sdc2_data";
+                                       bias-pull-up;
+                                       drive-strength = <10>;
+                               };
+                       };
+
+                       sdc2_state_off: sdc2-clk-off {
+                               clk {
+                                       pins = "sdc2_clk";
+                                       bias-disable;
+                                       drive-strength = <2>;
+                               };
+
+                               cmd {
+                                       pins = "sdc2_cmd";
+                                       bias-pull-up;
+                                       drive-strength = <2>;
+                               };
+
+                               data {
+                                       pins = "sdc2_data";
+                                       bias-pull-up;
+                                       drive-strength = <2>;
+                               };
+                       };
                };
 
                spmi_bus: qcom,spmi@400f000 {
                                                <0 0 0 4 &intc 0 248 IRQ_TYPE_LEVEL_HIGH>; /* int_d */
 
                                pinctrl-names = "default", "sleep";
-                               pinctrl-0 = <&pcie0_clkreq_default &pcie0_perst_default &pcie0_wake_default>;
-                               pinctrl-1 = <&pcie0_clkreq_sleep &pcie0_perst_default &pcie0_wake_sleep>;
+                               pinctrl-0 = <&pcie0_state_on>;
+                               pinctrl-1 = <&pcie0_state_off>;
 
                                linux,pci-domain = <0>;
 
                                                <0 0 0 4 &intc 0 275 IRQ_TYPE_LEVEL_HIGH>; /* int_d */
 
                                pinctrl-names = "default", "sleep";
-                               pinctrl-0 = <&pcie1_clkreq_default &pcie1_perst_default &pcie1_wake_default>;
-                               pinctrl-1 = <&pcie1_clkreq_sleep &pcie1_perst_default &pcie1_wake_sleep>;
+                               pinctrl-0 = <&pcie1_state_on>;
+                               pinctrl-1 = <&pcie1_state_off>;
 
                                linux,pci-domain = <1>;
 
                                                <0 0 0 4 &intc 0 145 IRQ_TYPE_LEVEL_HIGH>; /* int_d */
 
                                pinctrl-names = "default", "sleep";
-                               pinctrl-0 = <&pcie2_clkreq_default &pcie2_perst_default &pcie2_wake_default>;
-                               pinctrl-1 = <&pcie2_clkreq_sleep &pcie2_perst_default &pcie2_wake_sleep >;
+                               pinctrl-0 = <&pcie2_state_on>;
+                               pinctrl-1 = <&pcie2_state_off>;
 
                                linux,pci-domain = <2>;
                                clocks = <&gcc GCC_PCIE_2_PIPE_CLK>,
                        power-domains = <&mmcc GPU_GDSC>;
                };
 
-               video-codec@c00000 {
+               venus: video-codec@c00000 {
                        compatible = "qcom,msm8996-venus";
                        reg = <0x00c00000 0xff000>;
                        interrupts = <GIC_SPI 287 IRQ_TYPE_LEVEL_HIGH>;
                                 <&venus_smmu 0x2d>,
                                 <&venus_smmu 0x31>;
                        memory-region = <&venus_region>;
-                       status = "okay";
+                       status = "disabled";
 
                        video-decoder {
                                compatible = "venus-decoder";
                                };
                        };
                };
+
                kryocc: clock-controller@6400000 {
-                       compatible = "qcom,apcc-msm8996";
+                       compatible = "qcom,msm8996-apcc";
                        reg = <0x06400000 0x90000>;
+
+                       clock-names = "xo";
+                       clocks = <&xo_board>;
+
                        #clock-cells = <1>;
                };
 
                        #size-cells = <1>;
                        ranges;
 
+                       interrupts = <GIC_SPI 347 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 243 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "hs_phy_irq", "ss_phy_irq";
+
                        clocks = <&gcc GCC_SYS_NOC_USB3_AXI_CLK>,
                                <&gcc GCC_USB30_MASTER_CLK>,
                                <&gcc GCC_AGGRE2_USB3_AXI_CLK>,
                        power-domains = <&gcc USB30_GDSC>;
                        status = "disabled";
 
-                       dwc3@6a00000 {
+                       usb@6a00000 {
                                compatible = "snps,dwc3";
                                reg = <0x06a00000 0xcc00>;
                                interrupts = <0 131 IRQ_TYPE_LEVEL_HIGH>;
                        status = "disabled";
                };
 
+               sdhc1: sdhci@7464900 {
+                       compatible = "qcom,sdhci-msm-v4";
+                       reg = <0x07464900 0x11c>, <0x07464000 0x800>;
+                       reg-names = "hc_mem", "core_mem";
+
+                       interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>,
+                                       <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "hc_irq", "pwr_irq";
+
+                       clock-names = "iface", "core", "xo";
+                       clocks = <&gcc GCC_SDCC1_AHB_CLK>,
+                               <&gcc GCC_SDCC1_APPS_CLK>,
+                               <&xo_board>;
+
+                       pinctrl-names = "default", "sleep";
+                       pinctrl-0 = <&sdc1_state_on>;
+                       pinctrl-1 = <&sdc1_state_off>;
+
+                       bus-width = <8>;
+                       non-removable;
+                       status = "disabled";
+               };
+
                sdhc2: sdhci@74a4900 {
-                        status = "disabled";
-                        compatible = "qcom,sdhci-msm-v4";
-                        reg = <0x074a4900 0x314>, <0x074a4000 0x800>;
-                        reg-names = "hc_mem", "core_mem";
-
-                        interrupts = <0 125 IRQ_TYPE_LEVEL_HIGH>,
-                                     <0 221 IRQ_TYPE_LEVEL_HIGH>;
-                        interrupt-names = "hc_irq", "pwr_irq";
-
-                        clock-names = "iface", "core", "xo";
-                        clocks = <&gcc GCC_SDCC2_AHB_CLK>,
-                        <&gcc GCC_SDCC2_APPS_CLK>,
-                        <&xo_board>;
-                        bus-width = <4>;
+                       compatible = "qcom,sdhci-msm-v4";
+                       reg = <0x074a4900 0x314>, <0x074a4000 0x800>;
+                       reg-names = "hc_mem", "core_mem";
+
+                       interrupts = <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 221 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "hc_irq", "pwr_irq";
+
+                       clock-names = "iface", "core", "xo";
+                       clocks = <&gcc GCC_SDCC2_AHB_CLK>,
+                               <&gcc GCC_SDCC2_APPS_CLK>,
+                               <&xo_board>;
+
+                       pinctrl-names = "default", "sleep";
+                       pinctrl-0 = <&sdc2_state_on>;
+                       pinctrl-1 = <&sdc2_state_off>;
+
+                       bus-width = <4>;
+                       status = "disabled";
                 };
 
-               blsp1_uart1: serial@7570000 {
+               blsp1_dma: dma@7544000 {
+                       compatible = "qcom,bam-v1.7.0";
+                       reg = <0x07544000 0x2b000>;
+                       interrupts = <GIC_SPI 238 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&gcc GCC_BLSP1_AHB_CLK>;
+                       clock-names = "bam_clk";
+                       qcom,controlled-remotely;
+                       #dma-cells = <1>;
+                       qcom,ee = <0>;
+               };
+
+               blsp1_uart2: serial@7570000 {
                        compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
                        reg = <0x07570000 0x1000>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&gcc GCC_BLSP1_UART2_APPS_CLK>,
                                 <&gcc GCC_BLSP1_AHB_CLK>;
                        clock-names = "core", "iface";
+                       dmas = <&blsp1_dma 2>, <&blsp1_dma 3>;
+                       dma-names = "tx", "rx";
                        status = "disabled";
                };
 
-               blsp1_spi0: spi@7575000 {
+               blsp1_spi1: spi@7575000 {
                        compatible = "qcom,spi-qup-v2.2.1";
                        reg = <0x07575000 0x600>;
                        interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>;
                                 <&gcc GCC_BLSP1_AHB_CLK>;
                        clock-names = "core", "iface";
                        pinctrl-names = "default", "sleep";
-                       pinctrl-0 = <&blsp1_spi0_default>;
-                       pinctrl-1 = <&blsp1_spi0_sleep>;
+                       pinctrl-0 = <&blsp1_spi1_default>;
+                       pinctrl-1 = <&blsp1_spi1_sleep>;
+                       dmas = <&blsp1_dma 12>, <&blsp1_dma 13>;
+                       dma-names = "tx", "rx";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                };
 
-               blsp1_i2c2: i2c@7577000 {
+               blsp1_i2c3: i2c@7577000 {
                        compatible = "qcom,i2c-qup-v2.2.1";
                        reg = <0x07577000 0x1000>;
                        interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
                                <&gcc GCC_BLSP1_QUP3_I2C_APPS_CLK>;
                        clock-names = "iface", "core";
                        pinctrl-names = "default", "sleep";
-                       pinctrl-0 = <&blsp1_i2c2_default>;
-                       pinctrl-1 = <&blsp1_i2c2_sleep>;
+                       pinctrl-0 = <&blsp1_i2c3_default>;
+                       pinctrl-1 = <&blsp1_i2c3_sleep>;
+                       dmas = <&blsp1_dma 16>, <&blsp1_dma 17>;
+                       dma-names = "tx", "rx";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                };
 
-               blsp2_uart1: serial@75b0000 {
+               blsp2_dma: dma@7584000 {
+                       compatible = "qcom,bam-v1.7.0";
+                       reg = <0x07584000 0x2b000>;
+                       interrupts = <GIC_SPI 239 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&gcc GCC_BLSP2_AHB_CLK>;
+                       clock-names = "bam_clk";
+                       qcom,controlled-remotely;
+                       #dma-cells = <1>;
+                       qcom,ee = <0>;
+               };
+
+               blsp2_uart2: serial@75b0000 {
                        compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
                        reg = <0x075b0000 0x1000>;
                        interrupts = <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>;
                        status = "disabled";
                };
 
-               blsp2_uart2: serial@75b1000 {
+               blsp2_uart3: serial@75b1000 {
                        compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
                        reg = <0x075b1000 0x1000>;
                        interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>;
                        status = "disabled";
                };
 
-               blsp2_i2c0: i2c@75b5000 {
+               blsp2_i2c1: i2c@75b5000 {
                        compatible = "qcom,i2c-qup-v2.2.1";
                        reg = <0x075b5000 0x1000>;
                        interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>;
                                <&gcc GCC_BLSP2_QUP1_I2C_APPS_CLK>;
                        clock-names = "iface", "core";
                        pinctrl-names = "default", "sleep";
-                       pinctrl-0 = <&blsp2_i2c0_default>;
-                       pinctrl-1 = <&blsp2_i2c0_sleep>;
+                       pinctrl-0 = <&blsp2_i2c1_default>;
+                       pinctrl-1 = <&blsp2_i2c1_sleep>;
+                       dmas = <&blsp2_dma 12>, <&blsp2_dma 13>;
+                       dma-names = "tx", "rx";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                };
 
-               blsp2_i2c1: i2c@75b6000 {
+               blsp2_i2c2: i2c@75b6000 {
                        compatible = "qcom,i2c-qup-v2.2.1";
                        reg = <0x075b6000 0x1000>;
                        interrupts = <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>;
                                <&gcc GCC_BLSP2_QUP2_I2C_APPS_CLK>;
                        clock-names = "iface", "core";
                        pinctrl-names = "default", "sleep";
-                       pinctrl-0 = <&blsp2_i2c1_default>;
-                       pinctrl-1 = <&blsp2_i2c1_sleep>;
+                       pinctrl-0 = <&blsp2_i2c2_default>;
+                       pinctrl-1 = <&blsp2_i2c2_sleep>;
+                       dmas = <&blsp2_dma 14>, <&blsp2_dma 15>;
+                       dma-names = "tx", "rx";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                };
 
-               blsp2_spi5: spi@75ba000{
+               blsp2_i2c5: i2c@75b9000 {
+                       compatible = "qcom,i2c-qup-v2.2.1";
+                       reg = <0x75b9000 0x1000>;
+                       interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&gcc GCC_BLSP2_AHB_CLK>,
+                               <&gcc GCC_BLSP2_QUP5_I2C_APPS_CLK>;
+                       clock-names = "iface", "core";
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&blsp2_i2c5_default>;
+                       dmas = <&blsp2_dma 20>, <&blsp2_dma 21>;
+                       dma-names = "tx", "rx";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               blsp2_i2c6: i2c@75ba000 {
+                       compatible = "qcom,i2c-qup-v2.2.1";
+                       reg = <0x75ba000 0x1000>;
+                       interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&gcc GCC_BLSP2_AHB_CLK>,
+                               <&gcc GCC_BLSP2_QUP6_I2C_APPS_CLK>;
+                       clock-names = "iface", "core";
+                       pinctrl-names = "default", "sleep";
+                       pinctrl-0 = <&blsp2_i2c6_default>;
+                       pinctrl-1 = <&blsp2_i2c6_sleep>;
+                       dmas = <&blsp2_dma 22>, <&blsp2_dma 23>;
+                       dma-names = "tx", "rx";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               blsp2_spi6: spi@75ba000{
                        compatible = "qcom,spi-qup-v2.2.1";
                        reg = <0x075ba000 0x600>;
                        interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
                                 <&gcc GCC_BLSP2_AHB_CLK>;
                        clock-names = "core", "iface";
                        pinctrl-names = "default", "sleep";
-                       pinctrl-0 = <&blsp2_spi5_default>;
-                       pinctrl-1 = <&blsp2_spi5_sleep>;
+                       pinctrl-0 = <&blsp2_spi6_default>;
+                       pinctrl-1 = <&blsp2_spi6_sleep>;
+                       dmas = <&blsp2_dma 22>, <&blsp2_dma 23>;
+                       dma-names = "tx", "rx";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                        assigned-clock-rates = <19200000>, <60000000>;
 
                        power-domains = <&gcc USB30_GDSC>;
+                       qcom,select-utmi-as-pipe-clk;
                        status = "disabled";
 
-                       dwc3@7600000 {
+                       usb@7600000 {
                                compatible = "snps,dwc3";
                                reg = <0x07600000 0xcc00>;
                                interrupts = <0 138 IRQ_TYPE_LEVEL_HIGH>;
                                phys = <&hsusb_phy2>;
                                phy-names = "usb2-phy";
+                               maximum-speed = "high-speed";
                                snps,dis_u2_susphy_quirk;
                                snps,dis_enblslpm_quirk;
                        };
                                        compatible = "slim217,1a0";
                                        reg  = <1 0>;
 
-                                       interrupt-parent = <&msmgpio>;
+                                       interrupt-parent = <&tlmm>;
                                        interrupts = <54 IRQ_TYPE_LEVEL_HIGH>,
                                                     <53 IRQ_TYPE_LEVEL_HIGH>;
                                        interrupt-names  = "intr1", "intr2";
                                        interrupt-controller;
                                        #interrupt-cells = <1>;
-                                       reset-gpios = <&msmgpio 64 0>;
+                                       reset-gpios = <&tlmm 64 0>;
 
                                        slim-ifc-dev  = <&tasha_ifd>;
 
                        qcom,smem-states = <&smp2p_adsp_out 0>;
                        qcom,smem-state-names = "stop";
 
+                       power-domains = <&rpmpd MSM8996_VDDCX>;
+                       power-domain-names = "cx";
+
+                       status = "disabled";
+
                        smd-edge {
                                interrupts = <GIC_SPI 156 IRQ_TYPE_EDGE_RISING>;
 
                             <GIC_PPI 10 IRQ_TYPE_LEVEL_LOW>;
        };
 };
-#include "msm8996-pins.dtsi"
index e9d3ce2..6f294f9 100644 (file)
 
                        resets = <&gcc GCC_USB_30_BCR>;
 
-                       usb3_dwc3: dwc3@a800000 {
+                       usb3_dwc3: usb@a800000 {
                                compatible = "snps,dwc3";
                                reg = <0x0a800000 0xcd00>;
                                interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
index 8ab4f1f..8a4972e 100644 (file)
@@ -7,6 +7,30 @@
 #include <dt-bindings/spmi/spmi.h>
 #include <dt-bindings/thermal/thermal.h>
 
+/ {
+       thermal-zones {
+               pm6150_thermal: pm6150-thermal {
+                       polling-delay-passive = <100>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&pm6150_temp>;
+
+                       trips {
+                               pm6150_trip0: trip0 {
+                                       temperature = <95000>;
+                                       hysteresis = <0>;
+                                       type = "passive";
+                               };
+
+                               pm6150_crit: crit {
+                                       temperature = <115000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+       };
+};
+
 &spmi_bus {
        pm6150_lsid0: pmic@0 {
                compatible = "qcom,pm6150", "qcom,spmi-pmic";
diff --git a/arch/arm64/boot/dts/qcom/pm7325.dtsi b/arch/arm64/boot/dts/qcom/pm7325.dtsi
new file mode 100644 (file)
index 0000000..e7f64a9
--- /dev/null
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: BSD-3-Clause
+// Copyright (c) 2021, The Linux Foundation. All rights reserved.
+
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/spmi/spmi.h>
+
+&spmi_bus {
+       pm7325: pmic@1 {
+               compatible = "qcom,pm7325", "qcom,spmi-pmic";
+               reg = <0x1 SPMI_USID>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               pm7325_temp_alarm: temp-alarm@a00 {
+                       compatible = "qcom,spmi-temp-alarm";
+                       reg = <0xa00>;
+                       interrupts = <0x1 0xa 0x0 IRQ_TYPE_EDGE_BOTH>;
+                       #thermal-sensor-cells = <0>;
+               };
+
+               pm7325_gpios: gpios@8800 {
+                       compatible = "qcom,pm7325-gpio", "qcom,spmi-gpio";
+                       reg = <0x8800>;
+                       gpio-controller;
+                       gpio-ranges = <&pm7325_gpios 0 0 10>;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+       };
+};
+
+&thermal_zones {
+       pm7325_thermal: pm7325-thermal {
+               polling-delay-passive = <100>;
+               polling-delay = <0>;
+               thermal-sensors = <&pm7325_temp_alarm>;
+
+               trips {
+                       pm7325_trip0: trip0 {
+                               temperature = <95000>;
+                               hysteresis = <0>;
+                               type = "passive";
+                       };
+
+                       pm7325_crit: pm7325-crit {
+                               temperature = <115000>;
+                               hysteresis = <0>;
+                               type = "critical";
+                       };
+               };
+       };
+};
index 2b9b75e..e1b75ae 100644 (file)
                #address-cells = <1>;
                #size-cells = <0>;
 
+               pm8350c_temp_alarm: temp-alarm@a00 {
+                       compatible = "qcom,spmi-temp-alarm";
+                       reg = <0xa00>;
+                       interrupts = <0x2 0xa 0x0 IRQ_TYPE_EDGE_BOTH>;
+                       #thermal-sensor-cells = <0>;
+               };
+
                pm8350c_gpios: gpio@8800 {
-                       compatible = "qcom,pm8350c-gpio";
+                       compatible = "qcom,pm8350c-gpio", "qcom,spmi-gpio";
                        reg = <0x8800>;
                        gpio-controller;
+                       gpio-ranges = <&pm8350c_gpios 0 0 9>;
                        #gpio-cells = <2>;
                        interrupt-controller;
                        #interrupt-cells = <2>;
                };
        };
 };
+
+&thermal_zones {
+       pm8350c_thermal: pm8350c-thermal {
+               polling-delay-passive = <100>;
+               polling-delay = <0>;
+               thermal-sensors = <&pm8350c_temp_alarm>;
+
+               trips {
+                       pm8350c_trip0: trip0 {
+                               temperature = <95000>;
+                               hysteresis = <0>;
+                               type = "passive";
+                       };
+
+                       pm8350c_crit: pm8350c-crit {
+                               temperature = <115000>;
+                               hysteresis = <0>;
+                               type = "critical";
+                       };
+               };
+       };
+};
index c3876c8..ad19016 100644 (file)
@@ -45,7 +45,6 @@
 
                pm8994_pon: pon@800 {
                        compatible = "qcom,pm8916-pon";
-
                        reg = <0x800>;
                        mode-bootloader = <0x2>;
                        mode-recovery = <0x1>;
                                linux,code = <KEY_POWER>;
                        };
 
+                       pm8994_resin: resin {
+                               compatible = "qcom,pm8941-resin";
+                               interrupts = <0x0 0x8 1 IRQ_TYPE_EDGE_BOTH>;
+                               debounce = <15625>;
+                               bias-pull-up;
+                               status = "disabled";
+                       };
                };
 
                pm8994_temp: temp-alarm@2400 {
index e5ed28a..b4ac900 100644 (file)
                        #address-cells = <1>;
                        #size-cells = <1>;
                };
+
+               pmi8994_wled: wled@d800 {
+                       compatible = "qcom,pmi8994-wled";
+                       reg = <0xd800 0xd900>;
+                       interrupts = <3 0xd8 0x02 IRQ_TYPE_EDGE_RISING>;
+                       interrupt-names = "short";
+                       qcom,num-strings = <3>;
+                       /* Yes, all four strings *have to* be defined or things won't work. */
+                       qcom,enabled-strings = <0 1 2 3>;
+                       qcom,cabc;
+                       qcom,eternal-pfet;
+                       status = "disabled";
+               };
        };
 };
index 1530b8f..04fc263 100644 (file)
@@ -3,6 +3,8 @@
  * Copyright (c) 2021, Linaro Limited
  */
 
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/input/linux-event-codes.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 #include <dt-bindings/spmi/spmi.h>
 
                #address-cells = <1>;
                #size-cells = <0>;
 
+               pmk8350_pon: pon@1300 {
+                       compatible = "qcom,pm8998-pon";
+                       reg = <0x1300>;
+
+                       pwrkey {
+                               compatible = "qcom,pmk8350-pwrkey";
+                               interrupts = <0x0 0x13 0x7 IRQ_TYPE_EDGE_BOTH>;
+                               linux,code = <KEY_POWER>;
+                       };
+
+                       resin {
+                               compatible = "qcom,pmk8350-resin";
+                               interrupts = <0x0 0x13 0x6 IRQ_TYPE_EDGE_BOTH>;
+                               linux,code = <KEY_VOLUMEDOWN>;
+                       };
+               };
+
+               pmk8350_vadc: adc@3100 {
+                       compatible = "qcom,spmi-adc7";
+                       reg = <0x3100>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupts = <0x0 0x31 0x0 IRQ_TYPE_EDGE_RISING>;
+                       interrupt-names = "eoc-int-en-set";
+                       #io-channel-cells = <1>;
+                       io-channel-ranges;
+               };
+
+               pmk8350_adc_tm: adc-tm@3400 {
+                       compatible = "qcom,adc-tm7";
+                       reg = <0x3400>;
+                       interrupts = <0x0 0x34 0x0 IRQ_TYPE_EDGE_RISING>;
+                       interrupt-names = "threshold";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       #thermal-sensor-cells = <1>;
+                       status = "disabled";
+               };
+
+               pmk8350_rtc: rtc@6100 {
+                       compatible = "qcom,pmk8350-rtc";
+                       reg = <0x6100>, <0x6200>;
+                       reg-names = "rtc", "alarm";
+                       interrupts = <0x0 0x62 0x1 IRQ_TYPE_EDGE_RISING>;
+               };
+
                pmk8350_gpios: gpio@b000 {
-                       compatible = "qcom,pmk8350-gpio";
+                       compatible = "qcom,pmk8350-gpio", "qcom,spmi-gpio";
                        reg = <0xb000>;
                        gpio-controller;
+                       gpio-ranges = <&pmk8350_gpios 0 0 4>;
                        #gpio-cells = <2>;
                        interrupt-controller;
                        #interrupt-cells = <2>;
index 1c675af..b4b6ba2 100644 (file)
                #address-cells = <1>;
                #size-cells = <0>;
 
+               pmr735a_temp_alarm: temp-alarm@a00 {
+                       compatible = "qcom,spmi-temp-alarm";
+                       reg = <0xa00>;
+                       interrupts = <0x4 0xa 0x0 IRQ_TYPE_EDGE_BOTH>;
+                       #thermal-sensor-cells = <0>;
+               };
+
                pmr735a_gpios: gpio@8800 {
-                       compatible = "qcom,pmr735a-gpio";
+                       compatible = "qcom,pmr735a-gpio", "qcom,spmi-gpio";
                        reg = <0x8800>;
                        gpio-controller;
+                       gpio-ranges = <&pmr735a_gpios 0 0 4>;
                        #gpio-cells = <2>;
                        interrupt-controller;
                        #interrupt-cells = <2>;
                };
        };
 };
+
+&thermal_zones {
+       pmr735a_thermal: pmr735a-thermal {
+               polling-delay-passive = <100>;
+               polling-delay = <0>;
+               thermal-sensors = <&pmr735a_temp_alarm>;
+
+               trips {
+                       pmr735a_trip0: trip0 {
+                               temperature = <95000>;
+                               hysteresis = <0>;
+                               type = "passive";
+                       };
+
+                       pmr735a_crit: pmr735a-crit {
+                               temperature = <115000>;
+                               hysteresis = <0>;
+                               type = "critical";
+                       };
+               };
+       };
+};
index a80c578..f8a5530 100644 (file)
 &usb3 {
        status = "okay";
 
-       dwc3@7580000 {
+       usb@7580000 {
                dr_mode = "host";
        };
 };
index 339790b..9c4be02 100644 (file)
                        assigned-clock-rates = <19200000>, <200000000>;
                        status = "disabled";
 
-                       dwc3@7580000 {
+                       usb@7580000 {
                                compatible = "snps,dwc3";
                                reg = <0x07580000 0xcd00>;
                                interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
                        assigned-clock-rates = <19200000>, <133333333>;
                        status = "disabled";
 
-                       dwc3@78c0000 {
+                       usb@78c0000 {
                                compatible = "snps,dwc3";
                                reg = <0x078c0000 0xcc00>;
                                interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
index e77a792..acdb36f 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/regulator/qcom,rpmh-regulator.h>
+#include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
 #include "sc7180.dtsi"
 #include "pm6150.dtsi"
 #include "pm6150l.dtsi"
@@ -45,7 +46,7 @@
 
 /* Increase the size from 2MB to 8MB */
 &rmtfs_mem {
-       reg = <0x0 0x84400000 0x0 0x800000>;
+       reg = <0x0 0x94600000 0x0 0x800000>;
 };
 
 / {
        };
 };
 
+&dsi0 {
+       status = "okay";
+
+       vdda-supply = <&vreg_l3c_1p2>;
+
+       panel@0 {
+               compatible = "visionox,rm69299-1080p-display";
+               reg = <0>;
+
+               vdda-supply = <&vreg_l8c_1p8>;
+               vdd3p3-supply = <&vreg_l18a_2p8>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&disp_pins>;
+
+               reset-gpios = <&pm6150l_gpio 3 GPIO_ACTIVE_HIGH>;
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       port@0 {
+                               reg = <0>;
+                               panel0_in: endpoint {
+                                       remote-endpoint = <&dsi0_out>;
+                               };
+                       };
+               };
+       };
+
+       ports {
+               port@1 {
+                       endpoint {
+                               remote-endpoint = <&panel0_in>;
+                               data-lanes = <0 1 2 3>;
+                       };
+               };
+       };
+};
+
+&dsi_phy {
+       status = "okay";
+};
+
+&mdp {
+       status = "okay";
+};
+
+&mdss {
+       status = "okay";
+};
+
 &qfprom {
        vcc-supply = <&vreg_l11a_1p8>;
 };
 
 /* PINCTRL - additions to nodes defined in sc7180.dtsi */
 
+&pm6150l_gpio {
+       disp_pins: disp-pins {
+               pinconf {
+                       pins = "gpio3";
+                       function = PMIC_GPIO_FUNC_FUNC1;
+                       qcom,drive-strength = <PMIC_GPIO_STRENGTH_MED>;
+                       power-source = <0>;
+                       bias-disable;
+                       output-low;
+               };
+       };
+};
+
 &qspi_clk {
        pinconf {
                pins = "gpio63";
                        bias-pull-up;
                };
        };
+
+       sdc1_on: sdc1-on {
+               pinconf-clk {
+                       pins = "sdc1_clk";
+                       bias-disable;
+                       drive-strength = <16>;
+               };
+
+               pinconf-cmd {
+                       pins = "sdc1_cmd";
+                       bias-pull-up;
+                       drive-strength = <10>;
+               };
+
+               pinconf-data {
+                       pins = "sdc1_data";
+                       bias-pull-up;
+                       drive-strength = <10>;
+               };
+
+               pinconf-rclk {
+                       pins = "sdc1_rclk";
+                       bias-pull-down;
+               };
+       };
+
+       sdc1_off: sdc1-off {
+               pinconf-clk {
+                       pins = "sdc1_clk";
+                       bias-disable;
+                       drive-strength = <2>;
+               };
+
+               pinconf-cmd {
+                       pins = "sdc1_cmd";
+                       bias-pull-up;
+                       drive-strength = <2>;
+               };
+
+               pinconf-data {
+                       pins = "sdc1_data";
+                       bias-pull-up;
+                       drive-strength = <2>;
+               };
+
+               pinconf-rclk {
+                       pins = "sdc1_rclk";
+                       bias-pull-down;
+               };
+       };
+
+       sdc2_on: sdc2-on {
+               pinconf-clk {
+                       pins = "sdc2_clk";
+                       bias-disable;
+                       drive-strength = <16>;
+               };
+
+               pinconf-cmd {
+                       pins = "sdc2_cmd";
+                       bias-pull-up;
+                       drive-strength = <10>;
+               };
+
+               pinconf-data {
+                       pins = "sdc2_data";
+                       bias-pull-up;
+                       drive-strength = <10>;
+               };
+
+               pinconf-sd-cd {
+                       pins = "gpio69";
+                       bias-pull-up;
+                       drive-strength = <2>;
+               };
+       };
+
+       sdc2_off: sdc2-off {
+               pinconf-clk {
+                       pins = "sdc2_clk";
+                       bias-disable;
+                       drive-strength = <2>;
+               };
+
+               pinconf-cmd {
+                       pins = "sdc2_cmd";
+                       bias-pull-up;
+                       drive-strength = <2>;
+               };
+
+               pinconf-data {
+                       pins = "sdc2_data";
+                       bias-pull-up;
+                       drive-strength = <2>;
+               };
+
+               pinconf-sd-cd {
+                       pins = "gpio69";
+                       bias-pull-up;
+                       drive-strength = <2>;
+               };
+       };
 };
index 533c048..82dc00c 100644 (file)
@@ -9,8 +9,8 @@
 #include "sc7180-trogdor-lte-sku.dtsi"
 
 / {
-       model = "Google CoachZ (rev1) with LTE";
-       compatible = "google,coachz-rev1-sku0", "qcom,sc7180";
+       model = "Google CoachZ (rev1 - 2) with LTE";
+       compatible = "google,coachz-rev1-sku0", "google,coachz-rev2-sku0", "qcom,sc7180";
 };
 
 &cros_ec_proximity {
index 1b1dbdb..21b516e 100644 (file)
 #include "sc7180-trogdor-coachz.dtsi"
 
 / {
-       model = "Google CoachZ (rev1)";
-       compatible = "google,coachz-rev1", "qcom,sc7180";
+       model = "Google CoachZ (rev1 - 2)";
+       compatible = "google,coachz-rev1", "google,coachz-rev2", "qcom,sc7180";
+};
+
+/*
+ * CoachZ rev1 is stuffed with a 47k NTC as charger thermistor which currently
+ * is not supported by the PM6150 ADC driver. Disable the charger thermal zone
+ * to avoid using bogus temperature values.
+ */
+&charger_thermal {
+       status = "disabled";
+};
+
+/*
+ * CoachZ rev1 is stuffed with a 47k NTC as thermistor for skin temperature,
+ * which currently is not supported by the PM6150 ADC driver. Disable the
+ * skin temperature thermal zone to avoid using bogus temperature values.
+ */
+&skin_temp_thermal {
+       status = "disabled";
 };
 
 &tlmm {
@@ -2,14 +2,14 @@
 /*
  * Google CoachZ board device tree source
  *
- * Copyright 2020 Google LLC.
+ * Copyright 2021 Google LLC.
  */
 
-#include "sc7180-trogdor-coachz-r2.dts"
+#include "sc7180-trogdor-coachz-r3.dts"
 #include "sc7180-trogdor-lte-sku.dtsi"
 
 / {
-       model = "Google CoachZ (rev2+) with LTE";
+       model = "Google CoachZ (rev3+) with LTE";
        compatible = "google,coachz-sku0", "qcom,sc7180";
 };
 
@@ -2,7 +2,7 @@
 /*
  * Google CoachZ board device tree source
  *
- * Copyright 2020 Google LLC.
+ * Copyright 2021 Google LLC.
  */
 
 /dts-v1/;
@@ -10,6 +10,6 @@
 #include "sc7180-trogdor-coachz.dtsi"
 
 / {
-       model = "Google CoachZ (rev2+)";
+       model = "Google CoachZ (rev3+)";
        compatible = "google,coachz", "qcom,sc7180";
 };
index 4c6e433..6f9c071 100644 (file)
@@ -23,8 +23,53 @@ ap_h1_spi: &spi0 {};
        adau7002: audio-codec-1 {
                compatible = "adi,adau7002";
                IOVDD-supply = <&pp1800_l15a>;
+               wakeup-delay-ms = <15>;
                #sound-dai-cells = <0>;
        };
+
+       thermal-zones {
+               skin_temp_thermal: skin-temp-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&pm6150_adc_tm 1>;
+                       sustainable-power = <814>;
+
+                       trips {
+                               skin_temp_alert0: trip-point0 {
+                                       temperature = <42000>;
+                                       hysteresis = <1000>;
+                                       type = "passive";
+                               };
+
+                               skin_temp_alert1: trip-point1 {
+                                       temperature = <45000>;
+                                       hysteresis = <1000>;
+                                       type = "passive";
+                               };
+
+                               skin-temp-crit {
+                                       temperature = <60000>;
+                                       hysteresis = <1000>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&skin_temp_alert0>;
+                                       cooling-device = <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+
+                               map1 {
+                                       trip = <&skin_temp_alert1>;
+                                       cooling-device = <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                       };
+               };
+       };
 };
 
 &ap_spi_fp {
@@ -77,6 +122,25 @@ ap_ts_pen_1v8: &i2c4 {
        compatible = "boe,nv110wtm-n61";
 };
 
+&pm6150_adc {
+       skin-temp-thermistor@4e {
+               reg = <ADC5_AMUX_THM2_100K_PU>;
+               qcom,ratiometric;
+               qcom,hw-settle-time = <200>;
+       };
+};
+
+&pm6150_adc_tm {
+       status = "okay";
+
+       skin-temp-thermistor@1 {
+               reg = <1>;
+               io-channels = <&pm6150_adc ADC5_AMUX_THM2_100K_PU>;
+               qcom,ratiometric;
+               qcom,hw-settle-time-us = <200>;
+       };
+};
+
 &pp3300_dx_edp {
        gpio = <&tlmm 67 GPIO_ACTIVE_HIGH>;
 };
index 5c997cd..30e3e76 100644 (file)
        compatible = "google,lazor-rev0", "qcom,sc7180";
 };
 
-/*
- * Lazor is stuffed with a 47k NTC as charger thermistor which currently is
- * not supported by the PM6150 ADC driver. Disable the charger thermal zone
- * to avoid using bogus temperature values.
- */
-&charger_thermal {
-       status = "disabled";
-};
-
 &pp3300_hub {
        /* pp3300_l7c is used to power the USB hub */
        /delete-property/regulator-always-on;
index d9fbcc7..c2ef063 100644 (file)
        compatible = "google,lazor-rev1", "google,lazor-rev2", "qcom,sc7180";
 };
 
-/*
- * Lazor is stuffed with a 47k NTC as charger thermistor which currently is
- * not supported by the PM6150 ADC driver. Disable the charger thermal zone
- * to avoid using bogus temperature values.
- */
-&charger_thermal {
-       status = "disabled";
-};
-
 &pp3300_hub {
        /* pp3300_l7c is used to power the USB hub */
        /delete-property/regulator-always-on;
index ea8c2ee..b474df4 100644 (file)
        model = "Google Lazor (rev3+)";
        compatible = "google,lazor", "qcom,sc7180";
 };
-
-/*
- * Lazor is stuffed with a 47k NTC as charger thermistor which currently is
- * not supported by the PM6150 ADC driver. Disable the charger thermal zone
- * to avoid using bogus temperature values.
- */
-&charger_thermal {
-       status = "disabled";
-};
index 6b10b96..00535aa 100644 (file)
@@ -21,6 +21,15 @@ ap_h1_spi: &spi0 {};
        semtech,avg-pos-strength = <64>;
 };
 
+/*
+ * Lazor is stuffed with a 47k NTC as charger thermistor which currently is
+ * not supported by the PM6150 ADC driver. Disable the charger thermal zone
+ * to avoid using bogus temperature values.
+ */
+&charger_thermal {
+       status = "disabled";
+};
+
 ap_ts_pen_1v8: &i2c4 {
        status = "okay";
        clock-frequency = <400000>;
index e720e7b..e122a6b 100644 (file)
@@ -9,11 +9,23 @@
 
 #include "sc7180-trogdor-pompom.dtsi"
 
+/delete-node/ &keyboard_controller;
+#include <arm/cros-ec-keyboard.dtsi>
+
 / {
        model = "Google Pompom (rev1)";
        compatible = "google,pompom-rev1", "qcom,sc7180";
 };
 
+/*
+ * Pompom rev1 is stuffed with a 47k NTC as charger thermistor which currently
+ * is not supported by the PM6150 ADC driver. Disable the charger thermal zone
+ * to avoid using bogus temperature values.
+ */
+&charger_thermal {
+       status = "disabled";
+};
+
 &pp3300_hub {
        /* pp3300_l7c is used to power the USB hub */
        /delete-property/regulator-always-on;
index 791d496..00e187c 100644 (file)
@@ -9,6 +9,6 @@
 #include "sc7180-trogdor-lte-sku.dtsi"
 
 / {
-       model = "Google Pompom (rev2+) with LTE";
-       compatible = "google,pompom-sku0", "qcom,sc7180";
+       model = "Google Pompom (rev2) with LTE";
+       compatible = "google,pompom-rev2-sku0", "qcom,sc7180";
 };
index 984d733..4f32e67 100644 (file)
 #include "sc7180-trogdor-pompom.dtsi"
 
 / {
-       model = "Google Pompom (rev2+)";
-       compatible = "google,pompom", "qcom,sc7180";
+       model = "Google Pompom (rev2)";
+       compatible = "google,pompom-rev2", "qcom,sc7180";
 };
 
-&keyboard_controller {
-       function-row-physmap = <
-               MATRIX_KEY(0x00, 0x02, 0)       /* T1 */
-               MATRIX_KEY(0x03, 0x02, 0)       /* T2 */
-               MATRIX_KEY(0x02, 0x02, 0)       /* T3 */
-               MATRIX_KEY(0x01, 0x02, 0)       /* T4 */
-               MATRIX_KEY(0x03, 0x04, 0)       /* T5 */
-               MATRIX_KEY(0x02, 0x04, 0)       /* T6 */
-               MATRIX_KEY(0x01, 0x04, 0)       /* T7 */
-               MATRIX_KEY(0x02, 0x09, 0)       /* T8 */
-               MATRIX_KEY(0x01, 0x09, 0)       /* T9 */
-               MATRIX_KEY(0x00, 0x04, 0)       /* T10 */
-       >;
-       linux,keymap = <
-               MATRIX_KEY(0x00, 0x02, KEY_BACK)
-               MATRIX_KEY(0x03, 0x02, KEY_REFRESH)
-               MATRIX_KEY(0x02, 0x02, KEY_ZOOM)
-               MATRIX_KEY(0x01, 0x02, KEY_SCALE)
-               MATRIX_KEY(0x03, 0x04, KEY_SYSRQ)
-               MATRIX_KEY(0x02, 0x04, KEY_BRIGHTNESSDOWN)
-               MATRIX_KEY(0x01, 0x04, KEY_BRIGHTNESSUP)
-               MATRIX_KEY(0x02, 0x09, KEY_MUTE)
-               MATRIX_KEY(0x01, 0x09, KEY_VOLUMEDOWN)
-               MATRIX_KEY(0x00, 0x04, KEY_VOLUMEUP)
-
-               CROS_STD_MAIN_KEYMAP
-       >;
+/*
+ * Pompom rev2 is stuffed with a 47k NTC as charger thermistor which currently
+ * is not supported by the PM6150 ADC driver. Disable the charger thermal zone
+ * to avoid using bogus temperature values.
+ */
+&charger_thermal {
+       status = "disabled";
 };
diff --git a/arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r3-lte.dts b/arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r3-lte.dts
new file mode 100644 (file)
index 0000000..e90b73c
--- /dev/null
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Google Pompom board device tree source
+ *
+ * Copyright 2021 Google LLC.
+ */
+
+#include "sc7180-trogdor-pompom-r3.dts"
+#include "sc7180-trogdor-lte-sku.dtsi"
+
+/ {
+       model = "Google Pompom (rev3+) with LTE";
+       compatible = "google,pompom-sku0", "qcom,sc7180";
+};
diff --git a/arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r3.dts b/arch/arm64/boot/dts/qcom/sc7180-trogdor-pompom-r3.dts
new file mode 100644 (file)
index 0000000..f8aac63
--- /dev/null
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Google Pompom board device tree source
+ *
+ * Copyright 2021 Google LLC.
+ */
+
+/dts-v1/;
+
+#include "sc7180-trogdor-pompom.dtsi"
+
+/ {
+       model = "Google Pompom (rev3+)";
+       compatible = "google,pompom", "qcom,sc7180";
+};
index 622b5f1..a246dbd 100644 (file)
@@ -107,6 +107,35 @@ ap_ts_pen_1v8: &i2c4 {
        };
 };
 
+&keyboard_controller {
+       function-row-physmap = <
+               MATRIX_KEY(0x00, 0x02, 0)       /* T1 */
+               MATRIX_KEY(0x03, 0x02, 0)       /* T2 */
+               MATRIX_KEY(0x02, 0x02, 0)       /* T3 */
+               MATRIX_KEY(0x01, 0x02, 0)       /* T4 */
+               MATRIX_KEY(0x03, 0x04, 0)       /* T5 */
+               MATRIX_KEY(0x02, 0x04, 0)       /* T6 */
+               MATRIX_KEY(0x01, 0x04, 0)       /* T7 */
+               MATRIX_KEY(0x02, 0x09, 0)       /* T8 */
+               MATRIX_KEY(0x01, 0x09, 0)       /* T9 */
+               MATRIX_KEY(0x00, 0x04, 0)       /* T10 */
+       >;
+       linux,keymap = <
+               MATRIX_KEY(0x00, 0x02, KEY_BACK)
+               MATRIX_KEY(0x03, 0x02, KEY_REFRESH)
+               MATRIX_KEY(0x02, 0x02, KEY_ZOOM)
+               MATRIX_KEY(0x01, 0x02, KEY_SCALE)
+               MATRIX_KEY(0x03, 0x04, KEY_SYSRQ)
+               MATRIX_KEY(0x02, 0x04, KEY_BRIGHTNESSDOWN)
+               MATRIX_KEY(0x01, 0x04, KEY_BRIGHTNESSUP)
+               MATRIX_KEY(0x02, 0x09, KEY_MUTE)
+               MATRIX_KEY(0x01, 0x09, KEY_VOLUMEDOWN)
+               MATRIX_KEY(0x00, 0x04, KEY_VOLUMEUP)
+
+               CROS_STD_MAIN_KEYMAP
+       >;
+};
+
 &panel {
        compatible = "kingdisplay,kd116n21-30nv-a010";
 };
index 24d293e..77ae756 100644 (file)
                        no-map;
                };
 
-               camera_mem: memory@8ec00000 {
-                       reg = <0x0 0x8ec00000 0x0 0x500000>;
-                       no-map;
-               };
-
                venus_mem: memory@8f600000 {
                        reg = <0 0x8f600000 0 0x500000>;
                        no-map;
                compatible = "jedec,spi-nor";
                reg = <0>;
 
-               /* TODO: Increase frequency after testing */
-               spi-max-frequency = <25000000>;
+               spi-max-frequency = <37500000>;
                spi-tx-bus-width = <2>;
                spi-rx-bus-width = <2>;
        };
                        #size-cells = <0>;
                };
 
-               pdupdate {
-                       compatible = "google,cros-ec-pd-update";
-               };
-
                typec {
                        compatible = "google,cros-ec-typec";
                        #address-cells = <1>;
@@ -655,6 +645,8 @@ edp_brij_i2c: &i2c2 {
                clocks = <&rpmhcc RPMH_LN_BB_CLK3>;
                clock-names = "refclk";
 
+               no-hpd;
+
                ports {
                        #address-cells = <1>;
                        #size-cells = <0>;
@@ -772,7 +764,7 @@ hp_i2c: &i2c9 {
                qcom,capture-sd-lines = <0>;
        };
 
-       mi2s@1 {
+       secondary_mi2s: mi2s@1 {
                reg = <MI2S_SECONDARY>;
                qcom,playback-sd-lines = <0>;
        };
@@ -805,7 +797,7 @@ hp_i2c: &i2c9 {
        };
 };
 
-&pm6150_pwrkey {
+&pm6150_pon {
        status = "disabled";
 };
 
@@ -981,6 +973,7 @@ ap_spi_fp: &spi10 {
 &qspi_clk {
        pinconf {
                pins = "gpio63";
+               drive-strength = <8>;
                bias-disable;
        };
 };
@@ -1494,4 +1487,106 @@ ap_spi_fp: &spi10 {
                        drive-strength = <2>;
                };
        };
+
+       sdc1_on: sdc1-on {
+               pinconf-clk {
+                       pins = "sdc1_clk";
+                       bias-disable;
+                       drive-strength = <16>;
+               };
+
+               pinconf-cmd {
+                       pins = "sdc1_cmd";
+                       bias-pull-up;
+                       drive-strength = <10>;
+               };
+
+               pinconf-data {
+                       pins = "sdc1_data";
+                       bias-pull-up;
+                       drive-strength = <10>;
+               };
+
+               pinconf-rclk {
+                       pins = "sdc1_rclk";
+                       bias-pull-down;
+               };
+       };
+
+       sdc1_off: sdc1-off {
+               pinconf-clk {
+                       pins = "sdc1_clk";
+                       bias-disable;
+                       drive-strength = <2>;
+               };
+
+               pinconf-cmd {
+                       pins = "sdc1_cmd";
+                       bias-pull-up;
+                       drive-strength = <2>;
+               };
+
+               pinconf-data {
+                       pins = "sdc1_data";
+                       bias-pull-up;
+                       drive-strength = <2>;
+               };
+
+               pinconf-rclk {
+                       pins = "sdc1_rclk";
+                       bias-pull-down;
+               };
+       };
+
+       sdc2_on: sdc2-on {
+               pinconf-clk {
+                       pins = "sdc2_clk";
+                       bias-disable;
+                       drive-strength = <16>;
+               };
+
+               pinconf-cmd {
+                       pins = "sdc2_cmd";
+                       bias-pull-up;
+                       drive-strength = <10>;
+               };
+
+               pinconf-data {
+                       pins = "sdc2_data";
+                       bias-pull-up;
+                       drive-strength = <10>;
+               };
+
+               pinconf-sd-cd {
+                       pins = "gpio69";
+                       bias-pull-up;
+                       drive-strength = <2>;
+               };
+       };
+
+       sdc2_off: sdc2-off {
+               pinconf-clk {
+                       pins = "sdc2_clk";
+                       bias-disable;
+                       drive-strength = <2>;
+               };
+
+               pinconf-cmd {
+                       pins = "sdc2_cmd";
+                       bias-pull-up;
+                       drive-strength = <2>;
+               };
+
+               pinconf-data {
+                       pins = "sdc2_data";
+                       bias-pull-up;
+                       drive-strength = <2>;
+               };
+
+               pinconf-sd-cd {
+                       pins = "gpio69";
+                       bias-pull-up;
+                       drive-strength = <2>;
+               };
+       };
 };
index 6228ba2..fb1d9ad 100644 (file)
                        interrupt-names = "hc_irq", "pwr_irq";
 
                        clocks = <&gcc GCC_SDCC1_APPS_CLK>,
-                                       <&gcc GCC_SDCC1_AHB_CLK>;
-                       clock-names = "core", "iface";
+                                <&gcc GCC_SDCC1_AHB_CLK>,
+                                <&rpmhcc RPMH_CXO_CLK>;
+                       clock-names = "core", "iface", "xo";
                        interconnects = <&aggre1_noc MASTER_EMMC 0 &mc_virt SLAVE_EBI1 0>,
                                        <&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_EMMC_CFG 0>;
                        interconnect-names = "sdhc-ddr","cpu-sdhc";
                        #size-cells = <2>;
                        ranges;
                        iommus = <&apps_smmu 0x43 0x0>;
-                       interconnects = <&qup_virt MASTER_QUP_CORE_0 0 &qup_virt SLAVE_QUP_CORE_0 0>;
-                       interconnect-names = "qup-core";
                        status = "disabled";
 
                        i2c0: i2c@880000 {
                        #size-cells = <2>;
                        ranges;
                        iommus = <&apps_smmu 0x4c3 0x0>;
-                       interconnects = <&qup_virt MASTER_QUP_CORE_1 0 &qup_virt SLAVE_QUP_CORE_1 0>;
-                       interconnect-names = "qup-core";
                        status = "disabled";
 
                        i2c6: i2c@a80000 {
                                        function = "lpass_ext";
                                };
                        };
-
-                       sdc1_on: sdc1-on {
-                               pinconf-clk {
-                                       pins = "sdc1_clk";
-                                       bias-disable;
-                                       drive-strength = <16>;
-                               };
-
-                               pinconf-cmd {
-                                       pins = "sdc1_cmd";
-                                       bias-pull-up;
-                                       drive-strength = <10>;
-                               };
-
-                               pinconf-data {
-                                       pins = "sdc1_data";
-                                       bias-pull-up;
-                                       drive-strength = <10>;
-                               };
-
-                               pinconf-rclk {
-                                       pins = "sdc1_rclk";
-                                       bias-pull-down;
-                               };
-                       };
-
-                       sdc1_off: sdc1-off {
-                               pinconf-clk {
-                                       pins = "sdc1_clk";
-                                       bias-disable;
-                                       drive-strength = <2>;
-                               };
-
-                               pinconf-cmd {
-                                       pins = "sdc1_cmd";
-                                       bias-pull-up;
-                                       drive-strength = <2>;
-                               };
-
-                               pinconf-data {
-                                       pins = "sdc1_data";
-                                       bias-pull-up;
-                                       drive-strength = <2>;
-                               };
-
-                               pinconf-rclk {
-                                       pins = "sdc1_rclk";
-                                       bias-pull-down;
-                               };
-                       };
-
-                       sdc2_on: sdc2-on {
-                               pinconf-clk {
-                                       pins = "sdc2_clk";
-                                       bias-disable;
-                                       drive-strength = <16>;
-                               };
-
-                               pinconf-cmd {
-                                       pins = "sdc2_cmd";
-                                       bias-pull-up;
-                                       drive-strength = <10>;
-                               };
-
-                               pinconf-data {
-                                       pins = "sdc2_data";
-                                       bias-pull-up;
-                                       drive-strength = <10>;
-                               };
-
-                               pinconf-sd-cd {
-                                       pins = "gpio69";
-                                       bias-pull-up;
-                                       drive-strength = <2>;
-                               };
-                       };
-
-                       sdc2_off: sdc2-off {
-                               pinconf-clk {
-                                       pins = "sdc2_clk";
-                                       bias-disable;
-                                       drive-strength = <2>;
-                               };
-
-                               pinconf-cmd {
-                                       pins = "sdc2_cmd";
-                                       bias-pull-up;
-                                       drive-strength = <2>;
-                               };
-
-                               pinconf-data {
-                                       pins = "sdc2_data";
-                                       bias-pull-up;
-                                       drive-strength = <2>;
-                               };
-
-                               pinconf-sd-cd {
-                                       pins = "gpio69";
-                                       bias-disable;
-                                       drive-strength = <2>;
-                               };
-                       };
                };
 
                remoteproc_mpss: remoteproc@4080000 {
                        interrupt-names = "hc_irq", "pwr_irq";
 
                        clocks = <&gcc GCC_SDCC2_APPS_CLK>,
-                                       <&gcc GCC_SDCC2_AHB_CLK>;
-                       clock-names = "core", "iface";
+                                <&gcc GCC_SDCC2_AHB_CLK>,
+                                <&rpmhcc RPMH_CXO_CLK>;
+                       clock-names = "core", "iface", "xo";
 
                        interconnects = <&aggre1_noc MASTER_SDCC_2 0 &mc_virt SLAVE_EBI1 0>,
                                        <&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_SDCC_2 0>;
                usb_1_qmpphy: phy-wrapper@88e9000 {
                        compatible = "qcom,sc7180-qmp-usb3-dp-phy";
                        reg = <0 0x088e9000 0 0x18c>,
-                             <0 0x088e8000 0 0x38>,
-                             <0 0x088ea000 0 0x40>;
+                             <0 0x088e8000 0 0x3c>,
+                             <0 0x088ea000 0 0x18c>;
                        status = "disabled";
                        #address-cells = <2>;
                        #size-cells = <2>;
                                        <&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_USB3 0>;
                        interconnect-names = "usb-ddr", "apps-usb";
 
-                       usb_1_dwc3: dwc3@a600000 {
+                       usb_1_dwc3: usb@a600000 {
                                compatible = "snps,dwc3";
                                reg = <0 0x0a600000 0 0xe000>;
                                interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
index 54d2cb3..3900cfc 100644 (file)
@@ -7,11 +7,19 @@
 
 /dts-v1/;
 
+#include <dt-bindings/iio/qcom,spmi-adc7-pmr735a.h>
+#include <dt-bindings/iio/qcom,spmi-adc7-pmr735b.h>
+#include <dt-bindings/iio/qcom,spmi-adc7-pm8350.h>
+#include <dt-bindings/iio/qcom,spmi-adc7-pmk8350.h>
 #include "sc7280.dtsi"
+#include "pm7325.dtsi"
+#include "pmr735a.dtsi"
+#include "pm8350c.dtsi"
+#include "pmk8350.dtsi"
 
 / {
        model = "Qualcomm Technologies, Inc. sc7280 IDP platform";
-       compatible = "qcom,sc7280-idp", "qcom,sc7280";
+       compatible = "qcom,sc7280-idp", "google,senor", "qcom,sc7280";
 
        aliases {
                serial0 = &uart5;
        };
 };
 
+&pmk8350_vadc {
+               pm8350_die_temp {
+                       reg = <PM8350_ADC7_DIE_TEMP>;
+                       label = "pm8350_die_temp";
+                       qcom,pre-scaling = <1 1>;
+               };
+
+               pmk8350_die_temp {
+                       reg = <PMK8350_ADC7_DIE_TEMP>;
+                       label = "pmk8350_die_temp";
+                       qcom,pre-scaling = <1 1>;
+               };
+
+               pmr735a_die_temp {
+                       reg = <PMR735A_ADC7_DIE_TEMP>;
+                       label = "pmr735a_die_temp";
+                       qcom,pre-scaling = <1 1>;
+               };
+
+               pmr735b_die_temp {
+                       reg = <PMR735B_ADC7_DIE_TEMP>;
+                       label = "pmr735b_die_temp";
+                       qcom,pre-scaling = <1 1>;
+               };
+};
+
 &qupv3_id_0 {
        status = "okay";
 };
index 2cc4785..a8c274a 100644 (file)
 #include <dt-bindings/mailbox/qcom-ipcc.h>
 #include <dt-bindings/power/qcom-aoss-qmp.h>
 #include <dt-bindings/power/qcom-rpmpd.h>
+#include <dt-bindings/reset/qcom,sdm845-aoss.h>
+#include <dt-bindings/reset/qcom,sdm845-pdc.h>
 #include <dt-bindings/soc/qcom,rpmh-rsc.h>
+#include <dt-bindings/thermal/thermal.h>
 
 / {
        interrupt-parent = <&intc>;
                        no-map;
                };
 
+               smem_mem: memory@80900000 {
+                       reg = <0x0 0x80900000 0x0 0x200000>;
+                       no-map;
+               };
+
                cpucp_mem: memory@80b00000 {
                        no-map;
                        reg = <0x0 0x80b00000 0x0 0x100000>;
@@ -70,6 +78,8 @@
                                           &LITTLE_CPU_SLEEP_1
                                           &CLUSTER_SLEEP_0>;
                        next-level-cache = <&L2_0>;
+                       qcom,freq-domain = <&cpufreq_hw 0>;
+                       #cooling-cells = <2>;
                        L2_0: l2-cache {
                                compatible = "cache";
                                next-level-cache = <&L3_0>;
@@ -88,6 +98,8 @@
                                           &LITTLE_CPU_SLEEP_1
                                           &CLUSTER_SLEEP_0>;
                        next-level-cache = <&L2_100>;
+                       qcom,freq-domain = <&cpufreq_hw 0>;
+                       #cooling-cells = <2>;
                        L2_100: l2-cache {
                                compatible = "cache";
                                next-level-cache = <&L3_0>;
                                           &LITTLE_CPU_SLEEP_1
                                           &CLUSTER_SLEEP_0>;
                        next-level-cache = <&L2_200>;
+                       qcom,freq-domain = <&cpufreq_hw 0>;
+                       #cooling-cells = <2>;
                        L2_200: l2-cache {
                                compatible = "cache";
                                next-level-cache = <&L3_0>;
                                           &LITTLE_CPU_SLEEP_1
                                           &CLUSTER_SLEEP_0>;
                        next-level-cache = <&L2_300>;
+                       qcom,freq-domain = <&cpufreq_hw 0>;
+                       #cooling-cells = <2>;
                        L2_300: l2-cache {
                                compatible = "cache";
                                next-level-cache = <&L3_0>;
                                           &BIG_CPU_SLEEP_1
                                           &CLUSTER_SLEEP_0>;
                        next-level-cache = <&L2_400>;
+                       qcom,freq-domain = <&cpufreq_hw 1>;
+                       #cooling-cells = <2>;
                        L2_400: l2-cache {
                                compatible = "cache";
                                next-level-cache = <&L3_0>;
                                           &BIG_CPU_SLEEP_1
                                           &CLUSTER_SLEEP_0>;
                        next-level-cache = <&L2_500>;
+                       qcom,freq-domain = <&cpufreq_hw 1>;
+                       #cooling-cells = <2>;
                        L2_500: l2-cache {
                                compatible = "cache";
                                next-level-cache = <&L3_0>;
                                           &BIG_CPU_SLEEP_1
                                           &CLUSTER_SLEEP_0>;
                        next-level-cache = <&L2_600>;
+                       qcom,freq-domain = <&cpufreq_hw 1>;
+                       #cooling-cells = <2>;
                        L2_600: l2-cache {
                                compatible = "cache";
                                next-level-cache = <&L3_0>;
                                           &BIG_CPU_SLEEP_1
                                           &CLUSTER_SLEEP_0>;
                        next-level-cache = <&L2_700>;
+                       qcom,freq-domain = <&cpufreq_hw 1>;
+                       #cooling-cells = <2>;
                        L2_700: l2-cache {
                                compatible = "cache";
                                next-level-cache = <&L3_0>;
                };
        };
 
+       clk_virt: interconnect {
+               compatible = "qcom,sc7280-clk-virt";
+               #interconnect-cells = <2>;
+               qcom,bcm-voters = <&apps_bcm_voter>;
+       };
+
+       smem {
+               compatible = "qcom,smem";
+               memory-region = <&smem_mem>;
+               hwlocks = <&tcsr_mutex 3>;
+       };
+
+       smp2p-adsp {
+               compatible = "qcom,smp2p";
+               qcom,smem = <443>, <429>;
+               interrupts-extended = <&ipcc IPCC_CLIENT_LPASS
+                                            IPCC_MPROC_SIGNAL_SMP2P
+                                            IRQ_TYPE_EDGE_RISING>;
+               mboxes = <&ipcc IPCC_CLIENT_LPASS
+                               IPCC_MPROC_SIGNAL_SMP2P>;
+
+               qcom,local-pid = <0>;
+               qcom,remote-pid = <2>;
+
+               adsp_smp2p_out: master-kernel {
+                       qcom,entry-name = "master-kernel";
+                       #qcom,smem-state-cells = <1>;
+               };
+
+               adsp_smp2p_in: slave-kernel {
+                       qcom,entry-name = "slave-kernel";
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+       };
+
+       smp2p-cdsp {
+               compatible = "qcom,smp2p";
+               qcom,smem = <94>, <432>;
+               interrupts-extended = <&ipcc IPCC_CLIENT_CDSP
+                                            IPCC_MPROC_SIGNAL_SMP2P
+                                            IRQ_TYPE_EDGE_RISING>;
+               mboxes = <&ipcc IPCC_CLIENT_CDSP
+                               IPCC_MPROC_SIGNAL_SMP2P>;
+
+               qcom,local-pid = <0>;
+               qcom,remote-pid = <5>;
+
+               cdsp_smp2p_out: master-kernel {
+                       qcom,entry-name = "master-kernel";
+                       #qcom,smem-state-cells = <1>;
+               };
+
+               cdsp_smp2p_in: slave-kernel {
+                       qcom,entry-name = "slave-kernel";
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+       };
+
+       smp2p-mpss {
+               compatible = "qcom,smp2p";
+               qcom,smem = <435>, <428>;
+               interrupts-extended = <&ipcc IPCC_CLIENT_MPSS
+                                            IPCC_MPROC_SIGNAL_SMP2P
+                                            IRQ_TYPE_EDGE_RISING>;
+               mboxes = <&ipcc IPCC_CLIENT_MPSS
+                               IPCC_MPROC_SIGNAL_SMP2P>;
+
+               qcom,local-pid = <0>;
+               qcom,remote-pid = <1>;
+
+               modem_smp2p_out: master-kernel {
+                       qcom,entry-name = "master-kernel";
+                       #qcom,smem-state-cells = <1>;
+               };
+
+               modem_smp2p_in: slave-kernel {
+                       qcom,entry-name = "slave-kernel";
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               ipa_smp2p_out: ipa-ap-to-modem {
+                       qcom,entry-name = "ipa";
+                       #qcom,smem-state-cells = <1>;
+               };
+
+               ipa_smp2p_in: ipa-modem-to-ap {
+                       qcom,entry-name = "ipa";
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+       };
+
+       smp2p-wpss {
+               compatible = "qcom,smp2p";
+               qcom,smem = <617>, <616>;
+               interrupts-extended = <&ipcc IPCC_CLIENT_WPSS
+                                            IPCC_MPROC_SIGNAL_SMP2P
+                                            IRQ_TYPE_EDGE_RISING>;
+               mboxes = <&ipcc IPCC_CLIENT_WPSS
+                               IPCC_MPROC_SIGNAL_SMP2P>;
+
+               qcom,local-pid = <0>;
+               qcom,remote-pid = <13>;
+
+               wpss_smp2p_out: master-kernel {
+                       qcom,entry-name = "master-kernel";
+                       #qcom,smem-state-cells = <1>;
+               };
+
+               wpss_smp2p_in: slave-kernel {
+                       qcom,entry-name = "slave-kernel";
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+       };
+
        pmu {
                compatible = "arm,armv8-pmuv3";
                interrupts = <GIC_PPI 7 IRQ_TYPE_LEVEL_LOW>;
                        };
                };
 
+               cnoc2: interconnect@1500000 {
+                       reg = <0 0x01500000 0 0x1000>;
+                       compatible = "qcom,sc7280-cnoc2";
+                       #interconnect-cells = <2>;
+                       qcom,bcm-voters = <&apps_bcm_voter>;
+               };
+
+               cnoc3: interconnect@1502000 {
+                       reg = <0 0x01502000 0 0x1000>;
+                       compatible = "qcom,sc7280-cnoc3";
+                       #interconnect-cells = <2>;
+                       qcom,bcm-voters = <&apps_bcm_voter>;
+               };
+
+               mc_virt: interconnect@1580000 {
+                       reg = <0 0x01580000 0 0x4>;
+                       compatible = "qcom,sc7280-mc-virt";
+                       #interconnect-cells = <2>;
+                       qcom,bcm-voters = <&apps_bcm_voter>;
+               };
+
+               system_noc: interconnect@1680000 {
+                       reg = <0 0x01680000 0 0x15480>;
+                       compatible = "qcom,sc7280-system-noc";
+                       #interconnect-cells = <2>;
+                       qcom,bcm-voters = <&apps_bcm_voter>;
+               };
+
+               aggre1_noc: interconnect@16e0000 {
+                       compatible = "qcom,sc7280-aggre1-noc";
+                       reg = <0 0x016e0000 0 0x1c080>;
+                       #interconnect-cells = <2>;
+                       qcom,bcm-voters = <&apps_bcm_voter>;
+               };
+
+               aggre2_noc: interconnect@1700000 {
+                       reg = <0 0x01700000 0 0x2b080>;
+                       compatible = "qcom,sc7280-aggre2-noc";
+                       #interconnect-cells = <2>;
+                       qcom,bcm-voters = <&apps_bcm_voter>;
+               };
+
+               mmss_noc: interconnect@1740000 {
+                       reg = <0 0x01740000 0 0x1e080>;
+                       compatible = "qcom,sc7280-mmss-noc";
+                       #interconnect-cells = <2>;
+                       qcom,bcm-voters = <&apps_bcm_voter>;
+               };
+
+               tcsr_mutex: hwlock@1f40000 {
+                       compatible = "qcom,tcsr-mutex", "syscon";
+                       reg = <0 0x01f40000 0 0x40000>;
+                       #hwlock-cells = <1>;
+               };
+
+               lpasscc: lpasscc@3000000 {
+                       compatible = "qcom,sc7280-lpasscc";
+                       reg = <0 0x03000000 0 0x40>,
+                             <0 0x03c04000 0 0x4>,
+                             <0 0x03389000 0 0x24>;
+                       reg-names = "qdsp6ss", "top_cc", "cc";
+                       clocks = <&gcc GCC_CFG_NOC_LPASS_CLK>;
+                       clock-names = "iface";
+                       #clock-cells = <1>;
+               };
+
+               lpass_ag_noc: interconnect@3c40000 {
+                       reg = <0 0x03c40000 0 0xf080>;
+                       compatible = "qcom,sc7280-lpass-ag-noc";
+                       #interconnect-cells = <2>;
+                       qcom,bcm-voters = <&apps_bcm_voter>;
+               };
+
+               gpucc: clock-controller@3d90000 {
+                       compatible = "qcom,sc7280-gpucc";
+                       reg = <0 0x03d90000 0 0x9000>;
+                       clocks = <&rpmhcc RPMH_CXO_CLK>,
+                                <&gcc GCC_GPU_GPLL0_CLK_SRC>,
+                                <&gcc GCC_GPU_GPLL0_DIV_CLK_SRC>;
+                       clock-names = "bi_tcxo",
+                                     "gcc_gpu_gpll0_clk_src",
+                                     "gcc_gpu_gpll0_div_clk_src";
+                       #clock-cells = <1>;
+                       #reset-cells = <1>;
+                       #power-domain-cells = <1>;
+               };
+
                stm@6002000 {
                        compatible = "arm,coresight-stm", "arm,primecell";
                        reg = <0 0x06002000 0 0x1000>,
                        };
                };
 
+               dc_noc: interconnect@90e0000 {
+                       reg = <0 0x090e0000 0 0x5080>;
+                       compatible = "qcom,sc7280-dc-noc";
+                       #interconnect-cells = <2>;
+                       qcom,bcm-voters = <&apps_bcm_voter>;
+               };
+
+               gem_noc: interconnect@9100000 {
+                       reg = <0 0x9100000 0 0xe2200>;
+                       compatible = "qcom,sc7280-gem-noc";
+                       #interconnect-cells = <2>;
+                       qcom,bcm-voters = <&apps_bcm_voter>;
+               };
+
                system-cache-controller@9200000 {
                        compatible = "qcom,sc7280-llcc";
                        reg = <0 0x09200000 0 0xd0000>, <0 0x09600000 0 0x50000>;
                        interrupts = <GIC_SPI 582 IRQ_TYPE_LEVEL_HIGH>;
                };
 
+               nsp_noc: interconnect@a0c0000 {
+                       reg = <0 0x0a0c0000 0 0x10000>;
+                       compatible = "qcom,sc7280-nsp-noc";
+                       #interconnect-cells = <2>;
+                       qcom,bcm-voters = <&apps_bcm_voter>;
+               };
+
+               videocc: clock-controller@aaf0000 {
+                       compatible = "qcom,sc7280-videocc";
+                       reg = <0 0xaaf0000 0 0x10000>;
+                       clocks = <&rpmhcc RPMH_CXO_CLK>,
+                               <&rpmhcc RPMH_CXO_CLK_A>;
+                       clock-names = "bi_tcxo", "bi_tcxo_ao";
+                       #clock-cells = <1>;
+                       #reset-cells = <1>;
+                       #power-domain-cells = <1>;
+               };
+
+               dispcc: clock-controller@af00000 {
+                       compatible = "qcom,sc7280-dispcc";
+                       reg = <0 0xaf00000 0 0x20000>;
+                       clocks = <&rpmhcc RPMH_CXO_CLK>,
+                                <&gcc GCC_DISP_GPLL0_CLK_SRC>,
+                                <0>, <0>, <0>, <0>, <0>, <0>;
+                       clock-names = "bi_tcxo", "gcc_disp_gpll0_clk",
+                                     "dsi0_phy_pll_out_byteclk",
+                                     "dsi0_phy_pll_out_dsiclk",
+                                     "dp_phy_pll_link_clk",
+                                     "dp_phy_pll_vco_div_clk",
+                                     "edp_phy_pll_link_clk",
+                                     "edp_phy_pll_vco_div_clk";
+                       #clock-cells = <1>;
+                       #reset-cells = <1>;
+                       #power-domain-cells = <1>;
+               };
+
                pdc: interrupt-controller@b220000 {
                        compatible = "qcom,sc7280-pdc", "qcom,pdc";
                        reg = <0 0x0b220000 0 0x30000>;
                        interrupt-controller;
                };
 
+               pdc_reset: reset-controller@b5e0000 {
+                       compatible = "qcom,sc7280-pdc-global";
+                       reg = <0 0x0b5e0000 0 0x20000>;
+                       #reset-cells = <1>;
+               };
+
+               tsens0: thermal-sensor@c263000 {
+                       compatible = "qcom,sc7280-tsens","qcom,tsens-v2";
+                       reg = <0 0x0c263000 0 0x1ff>, /* TM */
+                               <0 0x0c222000 0 0x1ff>; /* SROT */
+                       #qcom,sensors = <15>;
+                       interrupts = <GIC_SPI 506 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 508 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "uplow","critical";
+                       #thermal-sensor-cells = <1>;
+               };
+
+               tsens1: thermal-sensor@c265000 {
+                       compatible = "qcom,sc7280-tsens","qcom,tsens-v2";
+                       reg = <0 0x0c265000 0 0x1ff>, /* TM */
+                               <0 0x0c223000 0 0x1ff>; /* SROT */
+                       #qcom,sensors = <12>;
+                       interrupts = <GIC_SPI 507 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 509 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "uplow","critical";
+                       #thermal-sensor-cells = <1>;
+               };
+
+               aoss_reset: reset-controller@c2a0000 {
+                       compatible = "qcom,sc7280-aoss-cc", "qcom,sdm845-aoss-cc";
+                       reg = <0 0x0c2a0000 0 0x31000>;
+                       #reset-cells = <1>;
+               };
+
                aoss_qmp: power-controller@c300000 {
                        compatible = "qcom,sc7280-aoss-qmp";
                        reg = <0 0x0c300000 0 0x100000>;
                                          <WAKE_TCS    3>,
                                          <CONTROL_TCS 1>;
 
+                       apps_bcm_voter: bcm-voter {
+                               compatible = "qcom,bcm-voter";
+                       };
+
                        rpmhpd: power-controller {
                                compatible = "qcom,sc7280-rpmhpd";
                                #power-domain-cells = <1>;
                                #clock-cells = <1>;
                        };
                };
+
+               cpufreq_hw: cpufreq@18591000 {
+                       compatible = "qcom,cpufreq-epss";
+                       reg = <0 0x18591000 0 0x1000>,
+                             <0 0x18592000 0 0x1000>,
+                             <0 0x18593000 0 0x1000>;
+                       clocks = <&rpmhcc RPMH_CXO_CLK>, <&gcc GCC_GPLL0>;
+                       clock-names = "xo", "alternate";
+                       #freq-domain-cells = <1>;
+               };
+       };
+
+       thermal_zones: thermal-zones {
+               cpu0-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 1>;
+
+                       trips {
+                               cpu0_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu0_alert1: trip-point1 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu0_crit: cpu-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&cpu0_alert0>;
+                                       cooling-device = <&CPU0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                               map1 {
+                                       trip = <&cpu0_alert1>;
+                                       cooling-device = <&CPU0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                       };
+               };
+
+               cpu1-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 2>;
+
+                       trips {
+                               cpu1_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu1_alert1: trip-point1 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu1_crit: cpu-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&cpu1_alert0>;
+                                       cooling-device = <&CPU0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                               map1 {
+                                       trip = <&cpu1_alert1>;
+                                       cooling-device = <&CPU0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                       };
+               };
+
+               cpu2-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 3>;
+
+                       trips {
+                               cpu2_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu2_alert1: trip-point1 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu2_crit: cpu-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&cpu2_alert0>;
+                                       cooling-device = <&CPU0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                               map1 {
+                                       trip = <&cpu2_alert1>;
+                                       cooling-device = <&CPU0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                       };
+               };
+
+               cpu3-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 4>;
+
+                       trips {
+                               cpu3_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu3_alert1: trip-point1 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu3_crit: cpu-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&cpu3_alert0>;
+                                       cooling-device = <&CPU0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                               map1 {
+                                       trip = <&cpu3_alert1>;
+                                       cooling-device = <&CPU0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                       };
+               };
+
+               cpu4-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 7>;
+
+                       trips {
+                               cpu4_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu4_alert1: trip-point1 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu4_crit: cpu-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&cpu4_alert0>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                               map1 {
+                                       trip = <&cpu4_alert1>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                       };
+               };
+
+               cpu5-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 8>;
+
+                       trips {
+                               cpu5_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu5_alert1: trip-point1 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu5_crit: cpu-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&cpu5_alert0>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                               map1 {
+                                       trip = <&cpu5_alert1>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                       };
+               };
+
+               cpu6-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 9>;
+
+                       trips {
+                               cpu6_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu6_alert1: trip-point1 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu6_crit: cpu-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&cpu6_alert0>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                               map1 {
+                                       trip = <&cpu6_alert1>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                       };
+               };
+
+               cpu7-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 10>;
+
+                       trips {
+                               cpu7_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu7_alert1: trip-point1 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu7_crit: cpu-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&cpu7_alert0>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                               map1 {
+                                       trip = <&cpu7_alert1>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                       };
+               };
+
+               cpu8-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 11>;
+
+                       trips {
+                               cpu8_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu8_alert1: trip-point1 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu8_crit: cpu-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&cpu8_alert0>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                               map1 {
+                                       trip = <&cpu8_alert1>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                       };
+               };
+
+               cpu9-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 12>;
+
+                       trips {
+                               cpu9_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu9_alert1: trip-point1 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu9_crit: cpu-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&cpu9_alert0>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                               map1 {
+                                       trip = <&cpu9_alert1>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                       };
+               };
+
+               cpu10-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 13>;
+
+                       trips {
+                               cpu10_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu10_alert1: trip-point1 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu10_crit: cpu-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&cpu10_alert0>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                               map1 {
+                                       trip = <&cpu10_alert1>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                       };
+               };
+
+               cpu11-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 14>;
+
+                       trips {
+                               cpu11_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu11_alert1: trip-point1 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               cpu11_crit: cpu-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&cpu11_alert0>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                               map1 {
+                                       trip = <&cpu11_alert1>;
+                                       cooling-device = <&CPU4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&CPU7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                               };
+                       };
+               };
+
+               aoss0-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 0>;
+
+                       trips {
+                               aoss0_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+
+                               aoss0_crit: aoss0-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+
+               aoss1-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens1 0>;
+
+                       trips {
+                               aoss1_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+
+                               aoss1_crit: aoss1-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+
+               cpuss0-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 5>;
+
+                       trips {
+                               cpuss0_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                               cpuss0_crit: cluster0-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+
+               cpuss1-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens0 6>;
+
+                       trips {
+                               cpuss1_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                               cpuss1_crit: cluster0-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+
+               gpuss0-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens1 1>;
+
+                       trips {
+                               gpuss0_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+
+                               gpuss0_crit: gpuss0-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+
+               gpuss1-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens1 2>;
+
+                       trips {
+                               gpuss1_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+
+                               gpuss1_crit: gpuss1-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+
+               nspss0-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens1 3>;
+
+                       trips {
+                               nspss0_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+
+                               nspss0_crit: nspss0-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+
+               nspss1-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens1 4>;
+
+                       trips {
+                               nspss1_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+
+                               nspss1_crit: nspss1-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+
+               video-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens1 5>;
+
+                       trips {
+                               video_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+
+                               video_crit: video-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+
+               ddr-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens1 6>;
+
+                       trips {
+                               ddr_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+
+                               ddr_crit: ddr-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+
+               mdmss0-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens1 7>;
+
+                       trips {
+                               mdmss0_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+
+                               mdmss0_crit: mdmss0-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+
+               mdmss1-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens1 8>;
+
+                       trips {
+                               mdmss1_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+
+                               mdmss1_crit: mdmss1-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+
+               mdmss2-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens1 9>;
+
+                       trips {
+                               mdmss2_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+
+                               mdmss2_crit: mdmss2-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+
+               mdmss3-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens1 10>;
+
+                       trips {
+                               mdmss3_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+
+                               mdmss3_crit: mdmss3-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+
+               camera0-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+
+                       thermal-sensors = <&tsens1 11>;
+
+                       trips {
+                               camera0_alert0: trip-point0 {
+                                       temperature = <90000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+
+                               camera0_crit: camera0-crit {
+                                       temperature = <110000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
        };
 
        timer {
index 216a74f..dfd1b42 100644 (file)
@@ -714,10 +714,6 @@ ap_ts_i2c: &i2c14 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                };
-
-               pdupdate {
-                       compatible = "google,cros-ec-pd-update";
-               };
        };
 };
 
index 1372fe8..91ede92 100644 (file)
        clock-frequency = <400000>;
 };
 
+&ipa {
+       status = "okay";
+       memory-region = <&ipa_fw_mem>;
+};
+
 &mdss {
        status = "okay";
 };
index 8f617f7..4d052e3 100644 (file)
        };
 
        reserved-memory {
+               /* The rmtfs_mem needs to be guarded due to "XPU limitations"
+                * it is otherwise possible for an allocation adjacent to the
+                * rmtfs_mem region to trigger an XPU violation, causing a crash.
+                */
+               rmtfs_lower_guard: memory@f5b00000 {
+                       no-map;
+                       reg = <0 0xf5b00000 0 0x1000>;
+               };
                /*
                 * The rmtfs memory region in downstream is 'dynamically allocated'
                 * but given the same address every time. Hard code it as this address is
                        qcom,client-id = <1>;
                        qcom,vmid = <15>;
                };
+               rmtfs_upper_guard: memory@f5d01000 {
+                       no-map;
+                       reg = <0 0xf5d01000 0 0x2000>;
+               };
 
                /*
                 * It seems like reserving the old rmtfs_mem region is also needed to prevent
        };
 };
 
+&ipa {
+       status = "okay";
+
+       memory-region = <&ipa_fw_mem>;
+};
+
 &mdss {
        status = "okay";
 };
index 7d02942..c60c8c6 100644 (file)
@@ -5,6 +5,8 @@
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
 #include <dt-bindings/regulator/qcom,rpmh-regulator.h>
+#include <dt-bindings/sound/qcom,q6afe.h>
+#include <dt-bindings/sound/qcom,q6asm.h>
 #include "sdm845.dtsi"
 #include "pm8998.dtsi"
 #include "pmi8998.dtsi"
        };
 };
 
+/* QUAT I2S Uses 1 I2S SD Line for audio on TAS2559/60 amplifiers */
+&q6afedai {
+       qi2s@22 {
+               reg = <22>;
+               qcom,sd-lines = <0>;
+       };
+};
+
+&q6asmdai {
+       dai@0 {
+               reg = <0>;
+       };
+
+       dai@1 {
+               reg = <1>;
+       };
+
+       dai@2 {
+               reg = <2>;
+       };
+};
+
 &qupv3_id_0 {
        status = "okay";
 };
        cd-gpios = <&tlmm 126 GPIO_ACTIVE_HIGH>;
 };
 
+&sound {
+       compatible = "qcom,db845c-sndcard";
+       pinctrl-0 = <&quat_mi2s_active
+                       &quat_mi2s_sd0_active>;
+       pinctrl-names = "default";
+       model = "Xiaomi Poco F1";
+       audio-routing =
+               "RX_BIAS", "MCLK",
+               "AMIC1", "MIC BIAS1",
+               "AMIC2", "MIC BIAS2",
+               "AMIC3", "MIC BIAS3";
+
+       mm1-dai-link {
+               link-name = "MultiMedia1";
+               cpu {
+                       sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA1>;
+               };
+       };
+
+       mm2-dai-link {
+               link-name = "MultiMedia2";
+               cpu {
+                       sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA2>;
+               };
+       };
+
+       mm3-dai-link {
+               link-name = "MultiMedia3";
+               cpu {
+                       sound-dai = <&q6asmdai  MSM_FRONTEND_DAI_MULTIMEDIA3>;
+               };
+       };
+
+       slim-dai-link {
+               link-name = "SLIM Playback";
+               cpu {
+                       sound-dai = <&q6afedai SLIMBUS_0_RX>;
+               };
+
+               platform {
+                       sound-dai = <&q6routing>;
+               };
+
+               codec {
+                       sound-dai =  <&wcd9340 0>;
+               };
+       };
+
+       slimcap-dai-link {
+               link-name = "SLIM Capture";
+               cpu {
+                       sound-dai = <&q6afedai SLIMBUS_0_TX>;
+               };
+
+               platform {
+                       sound-dai = <&q6routing>;
+               };
+
+               codec {
+                       sound-dai = <&wcd9340 1>;
+               };
+       };
+};
+
 &tlmm {
        gpio-reserved-ranges = <0 4>, <81 4>;
 
                function = "gpio";
                bias-pull-up;
        };
+
+       wcd_intr_default: wcd_intr_default {
+               pins = <54>;
+               function = "gpio";
+
+               input-enable;
+               bias-pull-down;
+               drive-strength = <2>;
+       };
 };
 
 &uart6 {
        vdda-pll-supply = <&vreg_l1a_0p875>;
 };
 
+&wcd9340{
+       pinctrl-0 = <&wcd_intr_default>;
+       pinctrl-names = "default";
+       clock-names = "extclk";
+       clocks = <&rpmhcc RPMH_LN_BB_CLK2>;
+       reset-gpios = <&tlmm 64 0>;
+       vdd-buck-supply = <&vreg_s4a_1p8>;
+       vdd-buck-sido-supply = <&vreg_s4a_1p8>;
+       vdd-tx-supply = <&vreg_s4a_1p8>;
+       vdd-rx-supply = <&vreg_s4a_1p8>;
+       vdd-io-supply = <&vreg_s4a_1p8>;
+       qcom,micbias1-microvolt = <2700000>;
+       qcom,micbias2-microvolt = <1800000>;
+       qcom,micbias3-microvolt = <2700000>;
+       qcom,micbias4-microvolt = <2700000>;
+};
+
 &wifi {
        status = "okay";
 
index 0a86fe7..1796ae8 100644 (file)
                                        <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_USB3_0 0>;
                        interconnect-names = "usb-ddr", "apps-usb";
 
-                       usb_1_dwc3: dwc3@a600000 {
+                       usb_1_dwc3: usb@a600000 {
                                compatible = "snps,dwc3";
                                reg = <0 0x0a600000 0 0xcd00>;
                                interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
                                        <&gladiator_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_USB3_1 0>;
                        interconnect-names = "usb-ddr", "apps-usb";
 
-                       usb_2_dwc3: dwc3@a800000 {
+                       usb_2_dwc3: usb@a800000 {
                                compatible = "snps,dwc3";
                                reg = <0 0x0a800000 0 0xcd00>;
                                interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>;
index 140db2d..c2a709a 100644 (file)
                clocks = <&sn65dsi86_refclk>;
                clock-names = "refclk";
 
+               no-hpd;
+
                ports {
                        #address-cells = <1>;
                        #size-cells = <0>;
diff --git a/arch/arm64/boot/dts/qcom/sm8150-microsoft-surface-duo.dts b/arch/arm64/boot/dts/qcom/sm8150-microsoft-surface-duo.dts
new file mode 100644 (file)
index 0000000..736da9a
--- /dev/null
@@ -0,0 +1,543 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (C) 2021, Microsoft Corporation
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/regulator/qcom,rpmh-regulator.h>
+#include <dt-bindings/gpio/gpio.h>
+#include "sm8150.dtsi"
+#include "pm8150.dtsi"
+#include "pm8150b.dtsi"
+#include "pm8150l.dtsi"
+
+/ {
+       model = "Microsoft Surface Duo";
+       compatible = "microsoft,surface-duo", "qcom,sm8150";
+
+       aliases {
+               serial0 = &uart2;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       vph_pwr: vph-pwr-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "vph_pwr";
+               regulator-min-microvolt = <3700000>;
+               regulator-max-microvolt = <3700000>;
+       };
+
+       /*
+        * Apparently RPMh does not provide support for PM8150 S4 because it
+        * is always-on; model it as a fixed regulator.
+        */
+       vreg_s4a_1p8: pm8150-s4 {
+               compatible = "regulator-fixed";
+               regulator-name = "vreg_s4a_1p8";
+
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+
+               regulator-always-on;
+               regulator-boot-on;
+
+               vin-supply = <&vph_pwr>;
+       };
+
+       gpio_keys {
+               compatible = "gpio-keys";
+
+               vol_up {
+                       label = "Volume Up";
+                       gpios = <&pm8150_gpios 6 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_VOLUMEUP>;
+               };
+       };
+};
+
+&apps_rsc {
+       pm8150-rpmh-regulators {
+               compatible = "qcom,pm8150-rpmh-regulators";
+               qcom,pmic-id = "a";
+
+               vdd-s1-supply = <&vph_pwr>;
+               vdd-s2-supply = <&vph_pwr>;
+               vdd-s3-supply = <&vph_pwr>;
+               vdd-s4-supply = <&vph_pwr>;
+               vdd-s5-supply = <&vph_pwr>;
+               vdd-s6-supply = <&vph_pwr>;
+               vdd-s7-supply = <&vph_pwr>;
+               vdd-s8-supply = <&vph_pwr>;
+               vdd-s9-supply = <&vph_pwr>;
+               vdd-s10-supply = <&vph_pwr>;
+
+               vdd-l1-l8-l11-supply = <&vreg_s6a_0p9>;
+               vdd-l2-l10-supply = <&vreg_bob>;
+               vdd-l3-l4-l5-l18-supply = <&vreg_s6a_0p9>;
+               vdd-l6-l9-supply = <&vreg_s8c_1p3>;
+               vdd-l7-l12-l14-l15-supply = <&vreg_s5a_2p0>;
+               vdd-l13-l16-l17-supply = <&vreg_bob>;
+
+               vreg_s5a_2p0: smps5 {
+                       regulator-min-microvolt = <1904000>;
+                       regulator-max-microvolt = <2000000>;
+               };
+
+               vreg_s6a_0p9: smps6 {
+                       regulator-min-microvolt = <920000>;
+                       regulator-max-microvolt = <1128000>;
+               };
+
+               vdda_wcss_pll:
+               vreg_l1a_0p75: ldo1 {
+                       regulator-min-microvolt = <752000>;
+                       regulator-max-microvolt = <752000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vdd_pdphy:
+               vdda_usb_hs_3p1:
+               vreg_l2a_3p1: ldo2 {
+                       regulator-min-microvolt = <3072000>;
+                       regulator-max-microvolt = <3072000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l3a_0p8: ldo3 {
+                       regulator-min-microvolt = <480000>;
+                       regulator-max-microvolt = <932000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vdd_usb_hs_core:
+               vdda_csi_0_0p9:
+               vdda_csi_1_0p9:
+               vdda_csi_2_0p9:
+               vdda_csi_3_0p9:
+               vdda_dsi_0_0p9:
+               vdda_dsi_1_0p9:
+               vdda_dsi_0_pll_0p9:
+               vdda_dsi_1_pll_0p9:
+               vdda_pcie_1ln_core:
+               vdda_pcie_2ln_core:
+               vdda_pll_hv_cc_ebi01:
+               vdda_pll_hv_cc_ebi23:
+               vdda_qrefs_0p875_5:
+               vdda_sp_sensor:
+               vdda_ufs_2ln_core_1:
+               vdda_ufs_2ln_core_2:
+               vdda_usb_ss_dp_core_1:
+               vdda_usb_ss_dp_core_2:
+               vdda_qlink_lv:
+               vdda_qlink_lv_ck:
+               vreg_l5a_0p875: ldo5 {
+                       regulator-min-microvolt = <880000>;
+                       regulator-max-microvolt = <880000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l6a_1p2: ldo6 {
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l7a_1p8: ldo7 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vddpx_10:
+               vreg_l9a_1p2: ldo9 {
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l10a_2p5: ldo10 {
+                       regulator-min-microvolt = <2504000>;
+                       regulator-max-microvolt = <2960000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l11a_0p8: ldo11 {
+                       regulator-min-microvolt = <800000>;
+                       regulator-max-microvolt = <800000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vdd_qfprom:
+               vdd_qfprom_sp:
+               vdda_apc_cs_1p8:
+               vdda_gfx_cs_1p8:
+               vdda_usb_hs_1p8:
+               vdda_qrefs_vref_1p8:
+               vddpx_10_a:
+               vreg_l12a_1p8: ldo12 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l13a_2p7: ldo13 {
+                       regulator-min-microvolt = <2704000>;
+                       regulator-max-microvolt = <2704000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l14a_1p8: ldo14 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1880000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l15a_1p7: ldo15 {
+                       regulator-min-microvolt = <1704000>;
+                       regulator-max-microvolt = <1704000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l16a_2p7: ldo16 {
+                       regulator-min-microvolt = <2704000>;
+                       regulator-max-microvolt = <2960000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l17a_3p0: ldo17 {
+                       regulator-min-microvolt = <2856000>;
+                       regulator-max-microvolt = <3008000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+       };
+
+       pm8150l-rpmh-regulators {
+               compatible = "qcom,pm8150l-rpmh-regulators";
+               qcom,pmic-id = "c";
+
+               vdd-s1-supply = <&vph_pwr>;
+               vdd-s2-supply = <&vph_pwr>;
+               vdd-s3-supply = <&vph_pwr>;
+               vdd-s4-supply = <&vph_pwr>;
+               vdd-s5-supply = <&vph_pwr>;
+               vdd-s6-supply = <&vph_pwr>;
+               vdd-s7-supply = <&vph_pwr>;
+               vdd-s8-supply = <&vph_pwr>;
+
+               vdd-l1-l8-supply = <&vreg_s4a_1p8>;
+               vdd-l2-l3-supply = <&vreg_s8c_1p3>;
+               vdd-l4-l5-l6-supply = <&vreg_bob>;
+               vdd-l7-l11-supply = <&vreg_bob>;
+               vdd-l9-l10-supply = <&vreg_bob>;
+
+               vdd-bob-supply = <&vph_pwr>;
+               vdd-flash-supply = <&vreg_bob>;
+               vdd-rgb-supply = <&vreg_bob>;
+
+               vreg_bob: bob {
+                       regulator-min-microvolt = <3008000>;
+                       regulator-max-microvolt = <4000000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_AUTO>;
+                       regulator-allow-bypass;
+               };
+
+               vreg_s8c_1p3: smps8 {
+                       regulator-min-microvolt = <1352000>;
+                       regulator-max-microvolt = <1352000>;
+               };
+
+               vreg_l1c_1p8: ldo1 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vdda_wcss_adcdac_1:
+               vdda_wcss_adcdac_22:
+               vreg_l2c_1p3: ldo2 {
+                       regulator-min-microvolt = <1304000>;
+                       regulator-max-microvolt = <1304000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vdda_hv_ebi0:
+               vdda_hv_ebi1:
+               vdda_hv_ebi2:
+               vdda_hv_ebi3:
+               vdda_hv_refgen0:
+               vdda_qlink_hv_ck:
+               vreg_l3c_1p2: ldo3 {
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vddpx_5:
+               vreg_l4c_1p8: ldo4 {
+                       regulator-min-microvolt = <1704000>;
+                       regulator-max-microvolt = <2928000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vddpx_6:
+               vreg_l5c_1p8: ldo5 {
+                       regulator-min-microvolt = <1704000>;
+                       regulator-max-microvolt = <2928000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vddpx_2:
+               vreg_l6c_2p9: ldo6 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <2960000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l7c_3p0: ldo7 {
+                       regulator-min-microvolt = <2856000>;
+                       regulator-max-microvolt = <3104000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l8c_1p8: ldo8 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l9c_2p9: ldo9 {
+                       regulator-min-microvolt = <2704000>;
+                       regulator-max-microvolt = <2960000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l10c_3p3: ldo10 {
+                       regulator-min-microvolt = <3000000>;
+                       regulator-max-microvolt = <3312000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l11c_3p3: ldo11 {
+                       regulator-min-microvolt = <3000000>;
+                       regulator-max-microvolt = <3312000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+       };
+
+       pm8009-rpmh-regulators {
+               compatible = "qcom,pm8009-rpmh-regulators";
+               qcom,pmic-id = "f";
+
+               vdd-s1-supply = <&vph_pwr>;
+               vdd-s2-supply = <&vreg_bob>;
+
+               vdd-l2-supply = <&vreg_s8c_1p3>;
+               vdd-l5-l6-supply = <&vreg_bob>;
+
+               vreg_l2f_1p2: ldo2 {
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l5f_2p85: ldo5 {
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l6f_2p85: ldo6 {
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+                       regulator-min-microvolt = <2856000>;
+                       regulator-max-microvolt = <2856000>;
+               };
+       };
+};
+
+&i2c1 {
+       status = "okay";
+       clock-frequency = <400000>;
+
+       bq27742@55 {
+               compatible = "ti,bq27742";
+               reg = <0x55>;
+       };
+
+       da7280@4a {
+               compatible = "dlg,da7280";
+               reg = <0x4a>;
+               interrupts-extended = <&tlmm 42 IRQ_TYPE_LEVEL_LOW>;
+               pinctrl-names = "da7280_default";
+               pinctrl-0 = <&da7280_intr_default>;
+
+               dlg,actuator-type = "LRA";
+               dlg,dlg,const-op-mode = <1>;
+               dlg,dlg,periodic-op-mode = <1>;
+               dlg,nom-microvolt = <2000000>;
+               dlg,abs-max-microvolt = <2000000>;
+               dlg,imax-microamp = <129000>;
+               dlg,resonant-freq-hz = <180>;
+               dlg,impd-micro-ohms = <14300000>;
+               dlg,freq-track-enable;
+               dlg,bemf-sens-enable;
+               dlg,mem-array = <
+                 0x06 0x08 0x10 0x11 0x12 0x13 0x14 0x15 0x1c 0x2a
+                 0x33 0x3c 0x42 0x4b 0x4c 0x4e 0x17 0x19 0x27 0x29
+                 0x17 0x19 0x03 0x84 0x5e 0x04 0x08 0x84 0x5d 0x01
+                 0x84 0x5e 0x02 0x00 0xa4 0x5d 0x03 0x84 0x5e 0x06
+                 0x08 0x84 0x5d 0x05 0x84 0x5d 0x06 0x84 0x5e 0x08
+                 0x84 0x5e 0x05 0x8c 0x5e 0x24 0x84 0x5f 0x10 0x84
+                 0x5e 0x05 0x84 0x5e 0x08 0x84 0x5f 0x01 0x8c 0x5e
+                 0x04 0x84 0x5e 0x08 0x84 0x5f 0x11 0x19 0x88 0x00
+                 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
+                 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
+               >;
+       };
+
+       /* SMB1381 @ 0x44 */
+       /* MAX34417 @ 0x1c */
+};
+
+&i2c4 {
+       status = "okay";
+       clock-frequency = <400000>;
+
+       /* SMB1355 @ 0x0c */
+       /* SMB1390 @ 0x10 */
+};
+
+&i2c17 {
+       status = "okay";
+       clock-frequency = <400000>;
+
+       bq27742@55 {
+               compatible = "ti,bq27742";
+               reg = <0x55>;
+       };
+};
+
+&i2c19 {
+       status = "okay";
+       clock-frequency = <400000>;
+
+       /* MAX34417 @ 0x12 */
+       /* MAX34417 @ 0x1a */
+       /* MAX34417 @ 0x1e */
+};
+
+&pon {
+       pwrkey {
+               status = "okay";
+       };
+
+       resin {
+               compatible = "qcom,pm8941-resin";
+               interrupts = <0x0 0x8 0x1 IRQ_TYPE_EDGE_BOTH>;
+               debounce = <15625>;
+               bias-pull-up;
+               linux,code = <KEY_VOLUMEDOWN>;
+       };
+};
+
+&qupv3_id_0 {
+       status = "okay";
+};
+
+&qupv3_id_1 {
+       status = "okay";
+};
+
+&qupv3_id_2 {
+       status = "okay";
+};
+
+&remoteproc_adsp {
+       status = "okay";
+       firmware-name = "qcom/sm8150/microsoft/adsp.mdt";
+};
+
+&remoteproc_cdsp {
+       status = "okay";
+       firmware-name = "qcom/sm8150/microsoft/cdsp.mdt";
+};
+
+&remoteproc_mpss {
+       status = "okay";
+       firmware-name = "qcom/sm8150/microsoft/modem.mdt";
+};
+
+&remoteproc_slpi {
+       status = "okay";
+       firmware-name = "qcom/sm8150/microsoft/slpi.mdt";
+};
+
+&tlmm {
+       gpio-reserved-ranges = <126 4>;
+
+       da7280_intr_default: da7280-intr-default {
+               pins = "gpio42";
+               function = "gpio";
+               bias-pull-up;
+               input-enable;
+       };
+};
+
+&uart2 {
+       status = "okay";
+};
+
+&ufs_mem_hc {
+       status = "okay";
+
+       reset-gpios = <&tlmm 175 GPIO_ACTIVE_LOW>;
+
+       vcc-supply = <&vreg_l10a_2p5>;
+       vcc-max-microamp = <750000>;
+       vccq-supply = <&vreg_l9a_1p2>;
+       vccq-max-microamp = <700000>;
+       vccq2-supply = <&vreg_s4a_1p8>;
+       vccq2-max-microamp = <750000>;
+};
+
+&ufs_mem_phy {
+       status = "okay";
+
+       vdda-phy-supply = <&vdda_ufs_2ln_core_1>;
+       vdda-max-microamp = <90200>;
+       vdda-pll-supply = <&vreg_l3c_1p2>;
+       vdda-pll-max-microamp = <19000>;
+};
+
+&usb_1_hsphy {
+       status = "okay";
+       vdda-pll-supply = <&vdd_usb_hs_core>;
+       vdda33-supply = <&vdda_usb_hs_3p1>;
+       vdda18-supply = <&vdda_usb_hs_1p8>;
+};
+
+&usb_1_qmpphy {
+       status = "okay";
+       vdda-phy-supply = <&vreg_l3c_1p2>;
+       vdda-pll-supply = <&vdda_usb_ss_dp_core_1>;
+};
+
+&usb_1 {
+       status = "okay";
+};
+
+&usb_1_dwc3 {
+       dr_mode = "peripheral";
+};
+
+&wifi {
+       status = "okay";
+
+       vdd-0.8-cx-mx-supply = <&vdda_wcss_pll>;
+       vdd-1.8-xo-supply = <&vreg_l7a_1p8>;
+       vdd-1.3-rfa-supply = <&vdda_wcss_adcdac_1>;
+       vdd-3.3-ch0-supply = <&vreg_l11c_3p3>;
+};
index 51235a9..142cf78 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (c) 2019, Linaro Limited
  */
 
+#include <dt-bindings/dma/qcom-gpi.h>
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/power/qcom-aoss-qmp.h>
 #include <dt-bindings/power/qcom-rpmpd.h>
                                 <&sleep_clk>;
                };
 
+               gpi_dma0: dma-controller@800000 {
+                       compatible = "qcom,sm8150-gpi-dma";
+                       reg = <0 0x800000 0 0x60000>;
+                       interrupts = <GIC_SPI 244 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 245 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 246 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 247 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 248 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 249 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 250 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 251 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 252 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 253 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 254 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 255 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>;
+                       dma-channels = <13>;
+                       dma-channel-mask = <0xfa>;
+                       iommus = <&apps_smmu 0x00d6 0x0>;
+                       #dma-cells = <3>;
+                       status = "disabled";
+               };
+
                qupv3_id_0: geniqup@8c0000 {
                        compatible = "qcom,geni-se-qup";
                        reg = <0x0 0x008c0000 0x0 0x6000>;
 
                };
 
+               gpi_dma1: dma-controller@a00000 {
+                       compatible = "qcom,sm8150-gpi-dma";
+                       reg = <0 0xa00000 0 0x60000>;
+                       interrupts = <GIC_SPI 279 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 280 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 281 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 282 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 283 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 284 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 293 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 294 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 295 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 296 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 297 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 298 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 299 IRQ_TYPE_LEVEL_HIGH>;
+                       dma-channels = <13>;
+                       dma-channel-mask = <0xfa>;
+                       iommus = <&apps_smmu 0x0616 0x0>;
+                       #dma-cells = <3>;
+                       status = "disabled";
+               };
+
                qupv3_id_1: geniqup@ac0000 {
                        compatible = "qcom,geni-se-qup";
                        reg = <0x0 0x00ac0000 0x0 0x6000>;
                        };
                };
 
+               gpi_dma2: dma-controller@c00000 {
+                       compatible = "qcom,sm8150-gpi-dma";
+                       reg = <0 0xc00000 0 0x60000>;
+                       interrupts = <GIC_SPI 588 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 589 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 590 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 591 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 592 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 593 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 594 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 595 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 596 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 597 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 598 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 599 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 600 IRQ_TYPE_LEVEL_HIGH>;
+                       dma-channels = <13>;
+                       dma-channel-mask = <0xfa>;
+                       iommus = <&apps_smmu 0x07b6 0x0>;
+                       #dma-cells = <3>;
+                       status = "disabled";
+               };
+
                qupv3_id_2: geniqup@cc0000 {
                        compatible = "qcom,geni-se-qup";
                        reg = <0x0 0x00cc0000 0x0 0x6000>;
 
                        resets = <&gcc GCC_USB30_PRIM_BCR>;
 
-                       usb_1_dwc3: dwc3@a600000 {
+                       usb_1_dwc3: usb@a600000 {
                                compatible = "snps,dwc3";
                                reg = <0 0x0a600000 0 0xcd00>;
                                interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
index 4c0de12..75f9476 100644 (file)
                };
 
                mdss: mdss@ae00000 {
-                       compatible = "qcom,sdm845-mdss";
+                       compatible = "qcom,sm8250-mdss";
                        reg = <0 0x0ae00000 0 0x1000>;
                        reg-names = "mdss";
 
                        ranges;
 
                        mdss_mdp: mdp@ae01000 {
-                               compatible = "qcom,sdm845-dpu";
+                               compatible = "qcom,sm8250-dpu";
                                reg = <0 0x0ae01000 0 0x8f000>,
                                      <0 0x0aeb0000 0 0x2008>;
                                reg-names = "mdp", "vbif";
index 6ca638b..9374044 100644 (file)
        vdda-phy-supply = <&vreg_l6b_1p2>;
        vdda-pll-supply = <&vreg_l5b_0p88>;
 };
+
+&ipa {
+       status = "okay";
+
+       memory-region = <&pil_ipa_fw_mem>;
+};
index ed0b51b..0d16392 100644 (file)
@@ -6,11 +6,13 @@
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/clock/qcom,gcc-sm8350.h>
 #include <dt-bindings/clock/qcom,rpmh.h>
+#include <dt-bindings/interconnect/qcom,sm8350.h>
 #include <dt-bindings/mailbox/qcom-ipcc.h>
 #include <dt-bindings/power/qcom-aoss-qmp.h>
 #include <dt-bindings/power/qcom-rpmpd.h>
 #include <dt-bindings/soc/qcom,rpmh-rsc.h>
 #include <dt-bindings/thermal/thermal.h>
+#include <dt-bindings/interconnect/qcom,sm8350.h>
 
 / {
        interrupt-parent = <&intc>;
                        interrupt-controller;
                        #interrupt-cells = <2>;
                };
+
+               ipa_smp2p_out: ipa-ap-to-modem {
+                       qcom,entry-name = "ipa";
+                       #qcom,smem-state-cells = <1>;
+               };
+
+               ipa_smp2p_in: ipa-modem-to-ap {
+                       qcom,entry-name = "ipa";
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
        };
 
        smp2p-slpi {
                        qcom,bcm-voters = <&apps_bcm_voter>;
                };
 
+               ipa: ipa@1e40000 {
+                       compatible = "qcom,sm8350-ipa";
+
+                       iommus = <&apps_smmu 0x5c0 0x0>,
+                                <&apps_smmu 0x5c2 0x0>;
+                       reg = <0 0x1e40000 0 0x8000>,
+                             <0 0x1e50000 0 0x4b20>,
+                             <0 0x1e04000 0 0x23000>;
+                       reg-names = "ipa-reg",
+                                   "ipa-shared",
+                                   "gsi";
+
+                       interrupts-extended = <&intc GIC_SPI 655 IRQ_TYPE_EDGE_RISING>,
+                                             <&intc GIC_SPI 432 IRQ_TYPE_LEVEL_HIGH>,
+                                             <&ipa_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
+                                             <&ipa_smp2p_in 1 IRQ_TYPE_EDGE_RISING>;
+                       interrupt-names = "ipa",
+                                         "gsi",
+                                         "ipa-clock-query",
+                                         "ipa-setup-ready";
+
+                       clocks = <&rpmhcc RPMH_IPA_CLK>;
+                       clock-names = "core";
+
+                       interconnects = <&aggre2_noc MASTER_IPA &gem_noc SLAVE_LLCC>,
+                                       <&mc_virt MASTER_LLCC &mc_virt SLAVE_EBI1>,
+                                       <&gem_noc MASTER_APPSS_PROC &config_noc SLAVE_IPA_CFG>;
+                       interconnect-names = "ipa_to_llcc",
+                                            "llcc_to_ebi1",
+                                            "appss_to_ipa";
+
+                       qcom,smem-states = <&ipa_smp2p_out 0>,
+                                          <&ipa_smp2p_out 1>;
+                       qcom,smem-state-names = "ipa-clock-enabled-valid",
+                                               "ipa-clock-enabled";
+
+                       status = "disabled";
+               };
+
                tcsr_mutex: hwlock@1f40000 {
                        compatible = "qcom,tcsr-mutex";
                        reg = <0x0 0x01f40000 0x0 0x40000>;
                                        <&rpmhpd 12>;
                        power-domain-names = "load_state", "cx", "mss";
 
-                       interconnects = <&mc_virt 0 &mc_virt 1>;
+                       interconnects = <&mc_virt MASTER_LLCC &mc_virt SLAVE_EBI1>;
 
                        memory-region = <&pil_modem_mem>;
 
                        interrupt-controller;
                };
 
-               tsens0: thermal-sensor@c222000 {
+               tsens0: thermal-sensor@c263000 {
                        compatible = "qcom,sm8350-tsens", "qcom,tsens-v2";
                        reg = <0 0x0c263000 0 0x1ff>, /* TM */
                              <0 0x0c222000 0 0x8>; /* SROT */
                        #thermal-sensor-cells = <1>;
                };
 
-               tsens1: thermal-sensor@c223000 {
+               tsens1: thermal-sensor@c265000 {
                        compatible = "qcom,sm8350-tsens", "qcom,tsens-v2";
                        reg = <0 0x0c265000 0 0x1ff>, /* TM */
                              <0 0x0c223000 0 0x8>; /* SROT */
                                        <&rpmhpd 10>;
                        power-domain-names = "load_state", "cx", "mxc";
 
-                       interconnects = <&compute_noc 1 &mc_virt 1>;
+                       interconnects = <&compute_noc MASTER_CDSP_PROC &mc_virt SLAVE_EBI1>;
 
                        memory-region = <&pil_cdsp_mem>;
 
                        };
                };
 
-               dc_noc: interconnect@90e0000 {
+               dc_noc: interconnect@90c0000 {
                        compatible = "qcom,sm8350-dc-noc";
                        reg = <0 0x090c0000 0 0x4200>;
                        #interconnect-cells = <1>;
                };
        };
 
-       thermal-zones {
+       thermal_zones: thermal-zones {
                cpu0-thermal {
                        polling-delay-passive = <250>;
                        polling-delay = <1000>;
index f2de2fa..68e30e2 100644 (file)
@@ -62,3 +62,5 @@ dtb-$(CONFIG_ARCH_R8A77990) += r8a77990-ebisu.dtb
 dtb-$(CONFIG_ARCH_R8A77995) += r8a77995-draak.dtb
 
 dtb-$(CONFIG_ARCH_R8A779A0) += r8a779a0-falcon.dtb
+
+dtb-$(CONFIG_ARCH_R9A07G044) += r9a07g044l2-smarc.dtb
index d8046fe..e3c8b2f 100644 (file)
 &ehci0 {
        dr_mode = "otg";
        status = "okay";
-       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
+       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>, <&usb2_clksel>, <&versaclock5 3>;
 };
 
 &ehci1 {
        status = "okay";
-       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
+       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>, <&usb2_clksel>, <&versaclock5 3>;
 };
 
 &hdmi0 {
index 8d3a4d6..090dc9c 100644 (file)
@@ -53,6 +53,8 @@
        phy-handle = <&phy0>;
        rx-internal-delay-ps = <1800>;
        tx-internal-delay-ps = <2000>;
+       clocks = <&cpg CPG_MOD 812>, <&versaclock5 4>;
+       clock-names = "fck", "refclk";
        status = "okay";
 
        phy0: ethernet-phy@0 {
        status = "okay";
 };
 
-&usb_extal_clk {
-       clock-frequency = <50000000>;
+&usb2_clksel {
+       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>,
+                 <&versaclock5 3>, <&usb3s0_clk>;
+       status = "okay";
 };
 
 &usb3s0_clk {
index c62ddb9..3771144 100644 (file)
@@ -14,7 +14,6 @@
 
        ports {
                port@0 {
-                       reg = <0>;
                        csi20_in: endpoint {
                                clock-lanes = <0>;
                                data-lanes = <1 2>;
@@ -29,7 +28,6 @@
 
        ports {
                port@0 {
-                       reg = <0>;
                        csi40_in: endpoint {
                                clock-lanes = <0>;
                                data-lanes = <1 2>;
index d64fb8b..78c121a 100644 (file)
@@ -76,6 +76,7 @@
                        opp-hz = /bits/ 64 <1500000000>;
                        opp-microvolt = <820000>;
                        clock-latency-ns = <300000>;
+                       opp-suspend;
                };
        };
 
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
index 5b05474..28c612c 100644 (file)
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A774B1_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
index e7b4a92..2e3d198 100644 (file)
@@ -33,7 +33,7 @@
        status = "okay";
 
        ports {
-               port {
+               port@0 {
                        csi40_in: endpoint {
                                clock-lanes = <0>;
                                data-lanes = <1 2>;
index 20fa3ca..a5d4dce 100644 (file)
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
index 8eb006c..379a130 100644 (file)
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A774E1_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
index 25b87da..b643d30 100644 (file)
                        #address-cells = <1>;
                        #size-cells = <0>;
 
+                       port@0 {
+                               reg = <0>;
+                       };
+
                        port@1 {
                                #address-cells = <1>;
                                #size-cells = <0>;
index 5c39152..2e4c18b 100644 (file)
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
index 25d947a..2bd8169 100644 (file)
 
                opp-500000000 {
                        opp-hz = /bits/ 64 <500000000>;
-                       opp-microvolt = <820000>;
+                       opp-microvolt = <830000>;
                        clock-latency-ns = <300000>;
                };
                opp-1000000000 {
                        opp-hz = /bits/ 64 <1000000000>;
-                       opp-microvolt = <820000>;
+                       opp-microvolt = <830000>;
                        clock-latency-ns = <300000>;
                };
                opp-1500000000 {
                        opp-hz = /bits/ 64 <1500000000>;
-                       opp-microvolt = <820000>;
+                       opp-microvolt = <830000>;
                        clock-latency-ns = <300000>;
+                       opp-suspend;
                };
                opp-1600000000 {
                        opp-hz = /bits/ 64 <1600000000>;
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
index ab081f1..91b501e 100644 (file)
 
                opp-500000000 {
                        opp-hz = /bits/ 64 <500000000>;
-                       opp-microvolt = <820000>;
+                       opp-microvolt = <830000>;
                        clock-latency-ns = <300000>;
                };
                opp-1000000000 {
                        opp-hz = /bits/ 64 <1000000000>;
-                       opp-microvolt = <820000>;
+                       opp-microvolt = <830000>;
                        clock-latency-ns = <300000>;
                };
                opp-1500000000 {
                        opp-hz = /bits/ 64 <1500000000>;
-                       opp-microvolt = <820000>;
+                       opp-microvolt = <830000>;
                        clock-latency-ns = <300000>;
+                       opp-suspend;
                };
                opp-1600000000 {
                        opp-hz = /bits/ 64 <1600000000>;
                };
 
                intc_ex: interrupt-controller@e61c0000 {
+                       compatible = "renesas,intc-ex-r8a77961", "renesas,irqc";
                        #interrupt-cells = <2>;
                        interrupt-controller;
                        reg = <0 0xe61c0000 0 0x200>;
-                       /* placeholder */
+                       interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 407>;
+                       power-domains = <&sysc R8A77961_PD_ALWAYS_ON>;
+                       resets = <&cpg 407>;
                };
 
                tmu0: timer@e61e0000 {
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A77961_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
index 657b20d..ad69da3 100644 (file)
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
index 874a7fc..5c84681 100644 (file)
                /* first 128MB is reserved for secure area. */
                reg = <0x0 0x48000000 0x0 0x38000000>;
        };
+
+       x1_clk: x1-clock {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <148500000>;
+       };
 };
 
 &avb {
 };
 
 &du {
+       clocks = <&cpg CPG_MOD 724>, <&x1_clk>;
+       clock-names = "du.0", "dclkin.0";
        status = "okay";
 };
 
index 7417cf5..2426e53 100644 (file)
@@ -59,7 +59,7 @@
        memory@48000000 {
                device_type = "memory";
                /* first 128MB is reserved for secure area. */
-               reg = <0x0 0x48000000 0x0 0x38000000>;
+               reg = <0x0 0x48000000 0x0 0x78000000>;
        };
 
        osc5_clk: osc5-clock {
index 5a5d564..517892c 100644 (file)
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A77970_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
index 04d47c0..7bde0a5 100644 (file)
 
 &mmc0 {
        pinctrl-0 = <&mmc_pins>;
-       pinctrl-1 = <&mmc_pins_uhs>;
+       pinctrl-1 = <&mmc_pins>;
        pinctrl-names = "default", "state_uhs";
 
        vmmc-supply = <&d3_3v>;
        mmc_pins: mmc {
                groups = "mmc_data8", "mmc_ctrl", "mmc_ds";
                function = "mmc";
-               power-source = <3300>;
-       };
-
-       mmc_pins_uhs: mmc_uhs {
-               groups = "mmc_data8", "mmc_ctrl", "mmc_ds";
-               function = "mmc";
                power-source = <1800>;
        };
 
index 1ffa4a9..6347d15 100644 (file)
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A77980_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
index 295d34f..4715e4a 100644 (file)
 
        ports {
                port@0 {
-                       reg = <0>;
-
                        csi40_in: endpoint {
                                clock-lanes = <0>;
                                data-lanes = <1 2>;
index 5010f23..4d0304b 100644 (file)
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
                                #address-cells = <1>;
                                #size-cells = <0>;
 
+                               port@0 {
+                                       reg = <0>;
+                               };
+
                                port@1 {
                                        #address-cells = <1>;
                                        #size-cells = <0>;
index 2319271..84dba37 100644 (file)
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 812>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A77995_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
index 14d3db5..f791c76 100644 (file)
@@ -6,6 +6,27 @@
  */
 
 &i2c0 {
+       pca9654_a: gpio@21 {
+               compatible = "onnn,pca9654";
+               reg = <0x21>;
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+
+       pca9654_b: gpio@22 {
+               compatible = "onnn,pca9654";
+               reg = <0x22>;
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+
+       pca9654_c: gpio@23 {
+               compatible = "onnn,pca9654";
+               reg = <0x23>;
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+
        eeprom@52 {
                compatible = "rohm,br24g01", "atmel,24c01";
                label = "csi-dsi-sub-board-id";
index 70b3604..78ca75f 100644 (file)
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 211>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A779A0_PD_ALWAYS_ON>;
                        resets = <&cpg 211>;
                        phy-mode = "rgmii";
                                          "ch20", "ch21", "ch22", "ch23",
                                          "ch24";
                        clocks = <&cpg CPG_MOD 212>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A779A0_PD_ALWAYS_ON>;
                        resets = <&cpg 212>;
                        phy-mode = "rgmii";
                                        "ch20", "ch21", "ch22", "ch23",
                                        "ch24";
                        clocks = <&cpg CPG_MOD 213>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A779A0_PD_ALWAYS_ON>;
                        resets = <&cpg 213>;
                        phy-mode = "rgmii";
                                        "ch20", "ch21", "ch22", "ch23",
                                        "ch24";
                        clocks = <&cpg CPG_MOD 214>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A779A0_PD_ALWAYS_ON>;
                        resets = <&cpg 214>;
                        phy-mode = "rgmii";
                                        "ch20", "ch21", "ch22", "ch23",
                                        "ch24";
                        clocks = <&cpg CPG_MOD 215>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A779A0_PD_ALWAYS_ON>;
                        resets = <&cpg 215>;
                        phy-mode = "rgmii";
                                        "ch20", "ch21", "ch22", "ch23",
                                        "ch24";
                        clocks = <&cpg CPG_MOD 216>;
+                       clock-names = "fck";
                        power-domains = <&sysc R8A779A0_PD_ALWAYS_ON>;
                        resets = <&cpg 216>;
                        phy-mode = "rgmii";
                              <0x0 0xf1060000 0 0x110000>;
                        interrupts = <GIC_PPI 9
                                      (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_HIGH)>;
-                       power-domains = <&sysc R8A779A0_PD_ALWAYS_ON>;
                };
 
                fcpvd0: fcp@fea10000 {
diff --git a/arch/arm64/boot/dts/renesas/r9a07g044.dtsi b/arch/arm64/boot/dts/renesas/r9a07g044.dtsi
new file mode 100644 (file)
index 0000000..734c8ad
--- /dev/null
@@ -0,0 +1,132 @@
+// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+/*
+ * Device Tree Source for the RZ/G2L and RZ/G2LC common SoC parts
+ *
+ * Copyright (C) 2021 Renesas Electronics Corp.
+ */
+
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/clock/r9a07g044-cpg.h>
+
+/ {
+       compatible = "renesas,r9a07g044";
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       /* clock can be either from exclk or crystal oscillator (XIN/XOUT) */
+       extal_clk: extal {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               /* This value must be overridden by the board */
+               clock-frequency = <0>;
+       };
+
+       psci {
+               compatible = "arm,psci-1.0", "arm,psci-0.2";
+               method = "smc";
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu-map {
+                       cluster0 {
+                               core0 {
+                                       cpu = <&cpu0>;
+                               };
+                               core1 {
+                                       cpu = <&cpu1>;
+                               };
+                       };
+               };
+
+               cpu0: cpu@0 {
+                       compatible = "arm,cortex-a55";
+                       reg = <0>;
+                       device_type = "cpu";
+                       next-level-cache = <&L3_CA55>;
+                       enable-method = "psci";
+               };
+
+               cpu1: cpu@100 {
+                       compatible = "arm,cortex-a55";
+                       reg = <0x100>;
+                       device_type = "cpu";
+                       next-level-cache = <&L3_CA55>;
+                       enable-method = "psci";
+               };
+
+               L3_CA55: cache-controller-0 {
+                       compatible = "cache";
+                       cache-unified;
+                       cache-size = <0x40000>;
+               };
+       };
+
+       soc: soc {
+               compatible = "simple-bus";
+               interrupt-parent = <&gic>;
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+
+               scif0: serial@1004b800 {
+                       compatible = "renesas,scif-r9a07g044";
+                       reg = <0 0x1004b800 0 0x400>;
+                       interrupts = <GIC_SPI 380 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 382 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 383 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 381 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 384 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 384 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "eri", "rxi", "txi",
+                                         "bri", "dri", "tei";
+                       clocks = <&cpg CPG_MOD R9A07G044_CLK_SCIF0>;
+                       clock-names = "fck";
+                       power-domains = <&cpg>;
+                       resets = <&cpg R9A07G044_CLK_SCIF0>;
+                       status = "disabled";
+               };
+
+               cpg: clock-controller@11010000 {
+                       compatible = "renesas,r9a07g044-cpg";
+                       reg = <0 0x11010000 0 0x10000>;
+                       clocks = <&extal_clk>;
+                       clock-names = "extal";
+                       #clock-cells = <2>;
+                       #reset-cells = <1>;
+                       #power-domain-cells = <0>;
+               };
+
+               sysc: system-controller@11020000 {
+                       compatible = "renesas,r9a07g044-sysc";
+                       reg = <0 0x11020000 0 0x10000>;
+                       interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "lpm_int", "ca55stbydone_int",
+                                         "cm33stbyr_int", "ca55_deny";
+                       status = "disabled";
+               };
+
+               gic: interrupt-controller@11900000 {
+                       compatible = "arm,gic-v3";
+                       #interrupt-cells = <3>;
+                       #address-cells = <0>;
+                       interrupt-controller;
+                       reg = <0x0 0x11900000 0 0x40000>,
+                             <0x0 0x11940000 0 0x60000>;
+                       interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_LOW>;
+               };
+       };
+
+       timer {
+               compatible = "arm,armv8-timer";
+               interrupts-extended = <&gic GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
+                                     <&gic GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
+                                     <&gic GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
+                                     <&gic GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>;
+       };
+};
diff --git a/arch/arm64/boot/dts/renesas/r9a07g044l1.dtsi b/arch/arm64/boot/dts/renesas/r9a07g044l1.dtsi
new file mode 100644 (file)
index 0000000..9d89d45
--- /dev/null
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+/*
+ * Device Tree Source for the RZ/G2L R9A07G044L1 SoC specific parts
+ *
+ * Copyright (C) 2021 Renesas Electronics Corp.
+ */
+
+/dts-v1/;
+#include "r9a07g044.dtsi"
+
+/ {
+       compatible = "renesas,r9a07g044l1", "renesas,r9a07g044";
+
+       cpus {
+               /delete-node/ cpu-map;
+               /delete-node/ cpu@100;
+       };
+
+       timer {
+               interrupts-extended = <&gic GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_LOW)>,
+                                     <&gic GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_LOW)>,
+                                     <&gic GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_LOW)>,
+                                     <&gic GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_LOW)>;
+       };
+};
diff --git a/arch/arm64/boot/dts/renesas/r9a07g044l2-smarc.dts b/arch/arm64/boot/dts/renesas/r9a07g044l2-smarc.dts
new file mode 100644 (file)
index 0000000..d3f72ec
--- /dev/null
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+/*
+ * Device Tree Source for the RZ/G2L SMARC EVK board
+ *
+ * Copyright (C) 2021 Renesas Electronics Corp.
+ */
+
+/dts-v1/;
+#include "r9a07g044l2.dtsi"
+#include "rzg2l-smarc.dtsi"
+
+/ {
+       model = "Renesas SMARC EVK based on r9a07g044l2";
+       compatible = "renesas,smarc-evk", "renesas,r9a07g044l2", "renesas,r9a07g044";
+
+       memory@48000000 {
+               device_type = "memory";
+               /* first 128MB is reserved for secure area. */
+               reg = <0x0 0x48000000 0x0 0x78000000>;
+       };
+};
diff --git a/arch/arm64/boot/dts/renesas/r9a07g044l2.dtsi b/arch/arm64/boot/dts/renesas/r9a07g044l2.dtsi
new file mode 100644 (file)
index 0000000..91dc10b
--- /dev/null
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+/*
+ * Device Tree Source for the RZ/G2L R9A07G044L2 SoC specific parts
+ *
+ * Copyright (C) 2021 Renesas Electronics Corp.
+ */
+
+/dts-v1/;
+#include "r9a07g044.dtsi"
+
+/ {
+       compatible = "renesas,r9a07g044l2", "renesas,r9a07g044";
+};
diff --git a/arch/arm64/boot/dts/renesas/rzg2l-smarc.dtsi b/arch/arm64/boot/dts/renesas/rzg2l-smarc.dtsi
new file mode 100644 (file)
index 0000000..adcd4f5
--- /dev/null
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+/*
+ * Device Tree Source for the RZ/G2L SMARC EVK common parts
+ *
+ * Copyright (C) 2021 Renesas Electronics Corp.
+ */
+
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+       aliases {
+               serial0 = &scif0;
+       };
+
+       chosen {
+               bootargs = "ignore_loglevel";
+               stdout-path = "serial0:115200n8";
+       };
+};
+
+&extal_clk {
+       clock-frequency = <24000000>;
+};
+
+&scif0 {
+       status = "okay";
+};
index e18747d..453ffce 100644 (file)
 
        ports {
                port@0 {
-                       reg = <0>;
                        csi20_in: endpoint {
                                clock-lanes = <0>;
                                data-lanes = <1>;
 
        ports {
                port@0 {
-                       reg = <0>;
-
                        csi40_in: endpoint {
                                clock-lanes = <0>;
                                data-lanes = <1 2 3 4>;
index b2bcbf2..02c3fdf 100644 (file)
@@ -5,6 +5,17 @@
  * Copyright (C) 2020-2021 Texas Instruments Incorporated - https://www.ti.com/
  */
 
+#include <dt-bindings/phy/phy-cadence.h>
+#include <dt-bindings/phy/phy-ti.h>
+
+/ {
+       serdes_refclk: clock-cmnrefclk {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <0>;
+       };
+};
+
 &cbass_main {
        oc_sram: sram@70000000 {
                compatible = "mmio-sram";
                #size-cells = <1>;
                ranges = <0x0 0x00 0x70000000 0x200000>;
 
-               atf-sram@0 {
-                       reg = <0x0 0x1a000>;
+               tfa-sram@1c0000 {
+                       reg = <0x1c0000 0x20000>;
+               };
+
+               dmsc-sram@1e0000 {
+                       reg = <0x1e0000 0x1c000>;
+               };
+
+               sproxy-sram@1fc000 {
+                       reg = <0x1fc000 0x4000>;
+               };
+       };
+
+       main_conf: syscon@43000000 {
+               compatible = "ti,j721e-system-controller", "syscon", "simple-mfd";
+               reg = <0x0 0x43000000 0x0 0x20000>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x0 0x0 0x43000000 0x20000>;
+
+               serdes_ln_ctrl: mux-controller {
+                       compatible = "mmio-mux";
+                       #mux-control-cells = <1>;
+                       mux-reg-masks = <0x4080 0x3>; /* SERDES0 lane0 select */
                };
        };
 
                };
        };
 
-       dmss: dmss {
+       dmss: bus@48000000 {
                compatible = "simple-mfd";
                #address-cells = <2>;
                #size-cells = <2>;
                dma-ranges;
-               ranges;
+               ranges = <0x00 0x48000000 0x00 0x48000000 0x00 0x06400000>;
 
                ti,sci-dev-id = <25>;
 
                };
        };
 
-       dmsc: dmsc@44043000 {
+       dmsc: system-controller@44043000 {
                compatible = "ti,k2g-sci";
                ti,host-id = <12>;
                mbox-names = "rx", "tx";
                        #power-domain-cells = <2>;
                };
 
-               k3_clks: clocks {
+               k3_clks: clock-controller {
                        compatible = "ti,k2g-sci-clk";
                        #clock-cells = <2>;
                };
        main_uart0: serial@2800000 {
                compatible = "ti,am64-uart", "ti,am654-uart";
                reg = <0x00 0x02800000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 178 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart1: serial@2810000 {
                compatible = "ti,am64-uart", "ti,am654-uart";
                reg = <0x00 0x02810000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 179 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart2: serial@2820000 {
                compatible = "ti,am64-uart", "ti,am654-uart";
                reg = <0x00 0x02820000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 180 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart3: serial@2830000 {
                compatible = "ti,am64-uart", "ti,am654-uart";
                reg = <0x00 0x02830000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 181 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart4: serial@2840000 {
                compatible = "ti,am64-uart", "ti,am654-uart";
                reg = <0x00 0x02840000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 182 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart5: serial@2850000 {
                compatible = "ti,am64-uart", "ti,am654-uart";
                reg = <0x00 0x02850000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 183 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart6: serial@2860000 {
                compatible = "ti,am64-uart", "ti,am654-uart";
                reg = <0x00 0x02860000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
                clocks = <&k3_clks 145 0>;
        };
 
-       main_gpio_intr: interrupt-controller0 {
+       main_gpio_intr: interrupt-controller@a00000 {
                compatible = "ti,sci-intr";
+               reg = <0x00 0x00a00000 0x00 0x800>;
                ti,intr-trigger-type = <1>;
                interrupt-controller;
                interrupt-parent = <&gic500>;
                                ti,mac-only;
                                label = "port1";
                                phys = <&phy_gmii_sel 1>;
-                               mac-address = [00 00 de ad be ef];
+                               mac-address = [00 00 00 00 00 00];
+                               ti,syscon-efuse = <&main_conf 0x200>;
                        };
 
                        cpsw_port2: port@2 {
                                ti,mac-only;
                                label = "port2";
                                phys = <&phy_gmii_sel 2>;
-                               mac-address = [00 01 de ad be ef];
+                               mac-address = [00 00 00 00 00 00];
                        };
                };
 
                ti,mbox-num-users = <4>;
                ti,mbox-num-fifos = <16>;
        };
+
+       main_r5fss0: r5fss@78000000 {
+               compatible = "ti,am64-r5fss";
+               ti,cluster-mode = <0>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x78000000 0x00 0x78000000 0x10000>,
+                        <0x78100000 0x00 0x78100000 0x10000>,
+                        <0x78200000 0x00 0x78200000 0x08000>,
+                        <0x78300000 0x00 0x78300000 0x08000>;
+               power-domains = <&k3_pds 119 TI_SCI_PD_EXCLUSIVE>;
+
+               main_r5fss0_core0: r5f@78000000 {
+                       compatible = "ti,am64-r5f";
+                       reg = <0x78000000 0x00010000>,
+                             <0x78100000 0x00010000>;
+                       reg-names = "atcm", "btcm";
+                       ti,sci = <&dmsc>;
+                       ti,sci-dev-id = <121>;
+                       ti,sci-proc-ids = <0x01 0xff>;
+                       resets = <&k3_reset 121 1>;
+                       firmware-name = "am64-main-r5f0_0-fw";
+                       ti,atcm-enable = <1>;
+                       ti,btcm-enable = <1>;
+                       ti,loczrama = <1>;
+               };
+
+               main_r5fss0_core1: r5f@78200000 {
+                       compatible = "ti,am64-r5f";
+                       reg = <0x78200000 0x00008000>,
+                             <0x78300000 0x00008000>;
+                       reg-names = "atcm", "btcm";
+                       ti,sci = <&dmsc>;
+                       ti,sci-dev-id = <122>;
+                       ti,sci-proc-ids = <0x02 0xff>;
+                       resets = <&k3_reset 122 1>;
+                       firmware-name = "am64-main-r5f0_1-fw";
+                       ti,atcm-enable = <1>;
+                       ti,btcm-enable = <1>;
+                       ti,loczrama = <1>;
+               };
+       };
+
+       main_r5fss1: r5fss@78400000 {
+               compatible = "ti,am64-r5fss";
+               ti,cluster-mode = <0>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x78400000 0x00 0x78400000 0x10000>,
+                        <0x78500000 0x00 0x78500000 0x10000>,
+                        <0x78600000 0x00 0x78600000 0x08000>,
+                        <0x78700000 0x00 0x78700000 0x08000>;
+               power-domains = <&k3_pds 120 TI_SCI_PD_EXCLUSIVE>;
+
+               main_r5fss1_core0: r5f@78400000 {
+                       compatible = "ti,am64-r5f";
+                       reg = <0x78400000 0x00010000>,
+                             <0x78500000 0x00010000>;
+                       reg-names = "atcm", "btcm";
+                       ti,sci = <&dmsc>;
+                       ti,sci-dev-id = <123>;
+                       ti,sci-proc-ids = <0x06 0xff>;
+                       resets = <&k3_reset 123 1>;
+                       firmware-name = "am64-main-r5f1_0-fw";
+                       ti,atcm-enable = <1>;
+                       ti,btcm-enable = <1>;
+                       ti,loczrama = <1>;
+               };
+
+               main_r5fss1_core1: r5f@78600000 {
+                       compatible = "ti,am64-r5f";
+                       reg = <0x78600000 0x00008000>,
+                             <0x78700000 0x00008000>;
+                       reg-names = "atcm", "btcm";
+                       ti,sci = <&dmsc>;
+                       ti,sci-dev-id = <124>;
+                       ti,sci-proc-ids = <0x07 0xff>;
+                       resets = <&k3_reset 124 1>;
+                       firmware-name = "am64-main-r5f1_1-fw";
+                       ti,atcm-enable = <1>;
+                       ti,btcm-enable = <1>;
+                       ti,loczrama = <1>;
+               };
+       };
+
+       serdes_wiz0: wiz@f000000 {
+               compatible = "ti,am64-wiz-10g";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               power-domains = <&k3_pds 162 TI_SCI_PD_EXCLUSIVE>;
+               clocks = <&k3_clks 162 0>, <&k3_clks 162 1>, <&serdes_refclk>;
+               clock-names = "fck", "core_ref_clk", "ext_ref_clk";
+               num-lanes = <1>;
+               #reset-cells = <1>;
+               #clock-cells = <1>;
+               ranges = <0x0f000000 0x0 0x0f000000 0x00010000>;
+
+               assigned-clocks = <&k3_clks 162 1>;
+               assigned-clock-parents = <&k3_clks 162 5>;
+
+               serdes0: serdes@f000000 {
+                       compatible = "ti,j721e-serdes-10g";
+                       reg = <0x0f000000 0x00010000>;
+                       reg-names = "torrent_phy";
+                       resets = <&serdes_wiz0 0>;
+                       reset-names = "torrent_reset";
+                       clocks = <&serdes_wiz0 TI_WIZ_PLL0_REFCLK>,
+                                <&serdes_wiz0 TI_WIZ_PHY_EN_REFCLK>;
+                       clock-names = "refclk", "phy_en_refclk";
+                       assigned-clocks = <&serdes_wiz0 TI_WIZ_PLL0_REFCLK>,
+                                         <&serdes_wiz0 TI_WIZ_PLL1_REFCLK>,
+                                         <&serdes_wiz0 TI_WIZ_REFCLK_DIG>;
+                       assigned-clock-parents = <&k3_clks 162 1>,
+                                                <&k3_clks 162 1>,
+                                                <&k3_clks 162 1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       #clock-cells = <1>;
+               };
+       };
+
+       pcie0_rc: pcie@f102000 {
+               compatible = "ti,am64-pcie-host", "ti,j721e-pcie-host";
+               reg = <0x00 0x0f102000 0x00 0x1000>,
+                     <0x00 0x0f100000 0x00 0x400>,
+                     <0x00 0x0d000000 0x00 0x00800000>,
+                     <0x00 0x68000000 0x00 0x00001000>;
+               reg-names = "intd_cfg", "user_cfg", "reg", "cfg";
+               interrupt-names = "link_state";
+               interrupts = <GIC_SPI 203 IRQ_TYPE_EDGE_RISING>;
+               device_type = "pci";
+               ti,syscon-pcie-ctrl = <&main_conf 0x4070>;
+               max-link-speed = <2>;
+               num-lanes = <1>;
+               power-domains = <&k3_pds 114 TI_SCI_PD_EXCLUSIVE>;
+               clocks = <&k3_clks 114 0>, <&serdes0 CDNS_TORRENT_REFCLK_DRIVER>;
+               clock-names = "fck", "pcie_refclk";
+               #address-cells = <3>;
+               #size-cells = <2>;
+               bus-range = <0x0 0xff>;
+               cdns,no-bar-match-nbits = <64>;
+               vendor-id = <0x104c>;
+               device-id = <0xb010>;
+               msi-map = <0x0 &gic_its 0x0 0x10000>;
+               ranges = <0x01000000 0x00 0x68001000  0x00 0x68001000  0x00 0x0010000>,
+                        <0x02000000 0x00 0x68011000  0x00 0x68011000  0x00 0x7fef000>;
+               dma-ranges = <0x02000000 0x0 0x0 0x0 0x0 0x00000010 0x0>;
+       };
+
+       pcie0_ep: pcie-ep@f102000 {
+               compatible = "ti,am64-pcie-ep", "ti,j721e-pcie-ep";
+               reg = <0x00 0x0f102000 0x00 0x1000>,
+                     <0x00 0x0f100000 0x00 0x400>,
+                     <0x00 0x0d000000 0x00 0x00800000>,
+                     <0x00 0x68000000 0x00 0x08000000>;
+               reg-names = "intd_cfg", "user_cfg", "reg", "mem";
+               interrupt-names = "link_state";
+               interrupts = <GIC_SPI 203 IRQ_TYPE_EDGE_RISING>;
+               ti,syscon-pcie-ctrl = <&main_conf 0x4070>;
+               max-link-speed = <2>;
+               num-lanes = <1>;
+               power-domains = <&k3_pds 114 TI_SCI_PD_EXCLUSIVE>;
+               clocks = <&k3_clks 114 0>;
+               clock-names = "fck";
+               max-functions = /bits/ 8 <1>;
+       };
 };
index 99e94de..59cc58f 100644 (file)
@@ -9,8 +9,6 @@
        mcu_uart0: serial@4a00000 {
                compatible = "ti,am64-uart", "ti,am654-uart";
                reg = <0x00 0x04a00000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 185 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
@@ -22,8 +20,6 @@
        mcu_uart1: serial@4a10000 {
                compatible = "ti,am64-uart", "ti,am654-uart";
                reg = <0x00 0x04a10000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 186 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
@@ -74,8 +70,9 @@
                clocks = <&k3_clks 148 0>;
        };
 
-       mcu_gpio_intr: interrupt-controller1 {
+       mcu_gpio_intr: interrupt-controller@4210000 {
                compatible = "ti,sci-intr";
+               reg = <0x00 0x04210000 0x00 0x200>;
                ti,intr-trigger-type = <1>;
                interrupt-controller;
                interrupt-parent = <&gic500>;
@@ -86,7 +83,7 @@
        };
 
        mcu_gpio0: gpio@4201000 {
-               compatible = "ti,am64-gpio", "keystone-gpio";
+               compatible = "ti,am64-gpio", "ti,keystone-gpio";
                reg = <0x0 0x4201000 0x0 0x100>;
                gpio-controller;
                #gpio-cells = <2>;
index dad0efa..0307122 100644 (file)
@@ -5,6 +5,8 @@
 
 /dts-v1/;
 
+#include <dt-bindings/phy/phy.h>
+#include <dt-bindings/mux/ti-serdes.h>
 #include <dt-bindings/leds/common.h>
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/net/ti-dp83867.h>
                        alignment = <0x1000>;
                        no-map;
                };
+
+               main_r5fss0_core0_dma_memory_region: r5f-dma-memory@a0000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa0000000 0x00 0x100000>;
+                       no-map;
+               };
+
+               main_r5fss0_core0_memory_region: r5f-memory@a0100000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa0100000 0x00 0xf00000>;
+                       no-map;
+               };
+
+               main_r5fss0_core1_dma_memory_region: r5f-dma-memory@a1000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa1000000 0x00 0x100000>;
+                       no-map;
+               };
+
+               main_r5fss0_core1_memory_region: r5f-memory@a1100000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa1100000 0x00 0xf00000>;
+                       no-map;
+               };
+
+               main_r5fss1_core0_dma_memory_region: r5f-dma-memory@a2000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa2000000 0x00 0x100000>;
+                       no-map;
+               };
+
+               main_r5fss1_core0_memory_region: r5f-memory@a2100000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa2100000 0x00 0xf00000>;
+                       no-map;
+               };
+
+               main_r5fss1_core1_dma_memory_region: r5f-dma-memory@a3000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa3000000 0x00 0x100000>;
+                       no-map;
+               };
+
+               main_r5fss1_core1_memory_region: r5f-memory@a3100000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa3100000 0x00 0xf00000>;
+                       no-map;
+               };
+
+               rtos_ipc_memory_region: ipc-memories@a5000000 {
+                       reg = <0x00 0xa5000000 0x00 0x00800000>;
+                       alignment = <0x1000>;
+                       no-map;
+               };
        };
 
        evm_12v0: fixedregulator-evm12v0 {
 &main_spi0 {
        pinctrl-names = "default";
        pinctrl-0 = <&main_spi0_pins_default>;
-       ti,pindir-d0-out-d1-in = <1>;
+       ti,pindir-d0-out-d1-in;
        eeprom@0 {
                compatible = "microchip,93lc46b";
                reg = <0>;
 &mailbox0_cluster7 {
        status = "disabled";
 };
+
+&main_r5fss0_core0 {
+       mboxes = <&mailbox0_cluster2 &mbox_main_r5fss0_core0>;
+       memory-region = <&main_r5fss0_core0_dma_memory_region>,
+                       <&main_r5fss0_core0_memory_region>;
+};
+
+&main_r5fss0_core1 {
+       mboxes = <&mailbox0_cluster2 &mbox_main_r5fss0_core1>;
+       memory-region = <&main_r5fss0_core1_dma_memory_region>,
+                       <&main_r5fss0_core1_memory_region>;
+};
+
+&main_r5fss1_core0 {
+       mboxes = <&mailbox0_cluster4 &mbox_main_r5fss1_core0>;
+       memory-region = <&main_r5fss1_core0_dma_memory_region>,
+                       <&main_r5fss1_core0_memory_region>;
+};
+
+&main_r5fss1_core1 {
+       mboxes = <&mailbox0_cluster4 &mbox_main_r5fss1_core1>;
+       memory-region = <&main_r5fss1_core1_dma_memory_region>,
+                       <&main_r5fss1_core1_memory_region>;
+};
+
+&serdes_ln_ctrl {
+       idle-states = <AM64_SERDES0_LANE0_PCIE0>;
+};
+
+&serdes0 {
+       serdes0_pcie_link: phy@0 {
+               reg = <0>;
+               cdns,num-lanes = <1>;
+               #phy-cells = <0>;
+               cdns,phy-type = <PHY_TYPE_PCIE>;
+               resets = <&serdes_wiz0 1>;
+       };
+};
+
+&pcie0_rc {
+       reset-gpios = <&exp1 5 GPIO_ACTIVE_HIGH>;
+       phys = <&serdes0_pcie_link>;
+       phy-names = "pcie-phy";
+       num-lanes = <1>;
+};
+
+&pcie0_ep {
+       phys = <&serdes0_pcie_link>;
+       phy-names = "pcie-phy";
+       num-lanes = <1>;
+       status = "disabled";
+};
index 8424cd0..d3aa290 100644 (file)
@@ -5,6 +5,8 @@
 
 /dts-v1/;
 
+#include <dt-bindings/mux/ti-serdes.h>
+#include <dt-bindings/phy/phy.h>
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/net/ti-dp83867.h>
 #include "k3-am642.dtsi"
                        alignment = <0x1000>;
                        no-map;
                };
+
+               main_r5fss0_core0_dma_memory_region: r5f-dma-memory@a0000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa0000000 0x00 0x100000>;
+                       no-map;
+               };
+
+               main_r5fss0_core0_memory_region: r5f-memory@a0100000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa0100000 0x00 0xf00000>;
+                       no-map;
+               };
+
+               main_r5fss0_core1_dma_memory_region: r5f-dma-memory@a1000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa1000000 0x00 0x100000>;
+                       no-map;
+               };
+
+               main_r5fss0_core1_memory_region: r5f-memory@a1100000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa1100000 0x00 0xf00000>;
+                       no-map;
+               };
+
+               main_r5fss1_core0_dma_memory_region: r5f-dma-memory@a2000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa2000000 0x00 0x100000>;
+                       no-map;
+               };
+
+               main_r5fss1_core0_memory_region: r5f-memory@a2100000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa2100000 0x00 0xf00000>;
+                       no-map;
+               };
+
+               main_r5fss1_core1_dma_memory_region: r5f-dma-memory@a3000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa3000000 0x00 0x100000>;
+                       no-map;
+               };
+
+               main_r5fss1_core1_memory_region: r5f-memory@a3100000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x00 0xa3100000 0x00 0xf00000>;
+                       no-map;
+               };
+
+               rtos_ipc_memory_region: ipc-memories@a5000000 {
+                       reg = <0x00 0xa5000000 0x00 0x00800000>;
+                       alignment = <0x1000>;
+                       no-map;
+               };
        };
 
        vusb_main: fixed-regulator-vusb-main5v0 {
                >;
        };
 
+       main_usb0_pins_default: main-usb0-pins-default {
+               pinctrl-single,pins = <
+                       AM64X_IOPAD(0x02a8, PIN_OUTPUT, 0) /* (E19) USB0_DRVVBUS */
+               >;
+       };
+
        main_i2c1_pins_default: main-i2c1-pins-default {
                pinctrl-single,pins = <
                        AM64X_IOPAD(0x0268, PIN_INPUT_PULLUP, 0) /* (C18) I2C1_SCL */
        disable-wp;
 };
 
+&serdes_ln_ctrl {
+       idle-states = <AM64_SERDES0_LANE0_USB>;
+};
+
+&serdes0 {
+       serdes0_usb_link: phy@0 {
+               reg = <0>;
+               cdns,num-lanes = <1>;
+               #phy-cells = <0>;
+               cdns,phy-type = <PHY_TYPE_USB3>;
+               resets = <&serdes_wiz0 1>;
+       };
+};
+
+&usbss0 {
+       ti,vbus-divider;
+};
+
+&usb0 {
+       dr_mode = "host";
+       maximum-speed = "super-speed";
+       pinctrl-names = "default";
+       pinctrl-0 = <&main_usb0_pins_default>;
+       phys = <&serdes0_usb_link>;
+       phy-names = "cdns3,usb3-phy";
+};
+
 &cpsw3g {
        pinctrl-names = "default";
        pinctrl-0 = <&mdio1_pins_default
 &mailbox0_cluster7 {
        status = "disabled";
 };
+
+&main_r5fss0_core0 {
+       mboxes = <&mailbox0_cluster2 &mbox_main_r5fss0_core0>;
+       memory-region = <&main_r5fss0_core0_dma_memory_region>,
+                       <&main_r5fss0_core0_memory_region>;
+};
+
+&main_r5fss0_core1 {
+       mboxes = <&mailbox0_cluster2 &mbox_main_r5fss0_core1>;
+       memory-region = <&main_r5fss0_core1_dma_memory_region>,
+                       <&main_r5fss0_core1_memory_region>;
+};
+
+&main_r5fss1_core0 {
+       mboxes = <&mailbox0_cluster4 &mbox_main_r5fss1_core0>;
+       memory-region = <&main_r5fss1_core0_dma_memory_region>,
+                       <&main_r5fss1_core0_memory_region>;
+};
+
+&main_r5fss1_core1 {
+       mboxes = <&mailbox0_cluster4 &mbox_main_r5fss1_core1>;
+       memory-region = <&main_r5fss1_core1_dma_memory_region>,
+                       <&main_r5fss1_core1_memory_region>;
+};
+
+&pcie0_rc {
+       status = "disabled";
+};
+
+&pcie0_ep {
+       status = "disabled";
+};
index de763ca..1008e91 100644 (file)
        pinctrl-0 = <&main_mmc1_pins_default>;
        ti,driver-strength-ohm = <50>;
        disable-wp;
+       no-1-8-v;
 };
 
 &usb0 {
 
        #address-cells = <1>;
        #size-cells= <0>;
-       ti,pindir-d0-out-d1-in = <1>;
+       ti,pindir-d0-out-d1-in;
 };
 
 &tscadc0 {
 &pcie1_ep {
        status = "disabled";
 };
+
+&mailbox0_cluster0 {
+       status = "disabled";
+};
+
+&mailbox0_cluster1 {
+       status = "disabled";
+};
+
+&mailbox0_cluster2 {
+       status = "disabled";
+};
+
+&mailbox0_cluster3 {
+       status = "disabled";
+};
+
+&mailbox0_cluster4 {
+       status = "disabled";
+};
+
+&mailbox0_cluster5 {
+       status = "disabled";
+};
+
+&mailbox0_cluster6 {
+       status = "disabled";
+};
+
+&mailbox0_cluster7 {
+       status = "disabled";
+};
+
+&mailbox0_cluster8 {
+       status = "disabled";
+};
+
+&mailbox0_cluster9 {
+       status = "disabled";
+};
+
+&mailbox0_cluster10 {
+       status = "disabled";
+};
+
+&mailbox0_cluster11 {
+       status = "disabled";
+};
+
+&icssg0_mdio {
+       status = "disabled";
+};
+
+&icssg1_mdio {
+       status = "disabled";
+};
+
+&icssg2_mdio {
+       status = "disabled";
+};
index cb340d1..ba4e5d3 100644 (file)
@@ -84,8 +84,6 @@
        main_uart0: serial@2800000 {
                compatible = "ti,am654-uart";
                reg = <0x00 0x02800000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 192 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
@@ -95,8 +93,6 @@
        main_uart1: serial@2810000 {
                compatible = "ti,am654-uart";
                reg = <0x00 0x02810000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 193 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                power-domains = <&k3_pds 147 TI_SCI_PD_EXCLUSIVE>;
        main_uart2: serial@2820000 {
                compatible = "ti,am654-uart";
                reg = <0x00 0x02820000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 194 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                power-domains = <&k3_pds 148 TI_SCI_PD_EXCLUSIVE>;
                ti,otap-del-sel = <0x2>;
                ti,trm-icp = <0x8>;
                dma-coherent;
-               no-1-8-v;
        };
 
        scm_conf: scm-conf@100000 {
                #phy-cells = <0>;
        };
 
-       intr_main_gpio: interrupt-controller0 {
+       intr_main_gpio: interrupt-controller@a00000 {
                compatible = "ti,sci-intr";
+               reg = <0x0 0x00a00000 0x0 0x400>;
                ti,intr-trigger-type = <1>;
                interrupt-controller;
                interrupt-parent = <&gic500>;
                ti,interrupt-ranges = <0 392 32>;
        };
 
-       main-navss {
+       main_navss: bus@30800000 {
                compatible = "simple-mfd";
                #address-cells = <2>;
                #size-cells = <2>;
-               ranges;
+               ranges = <0x0 0x30800000 0x0 0x30800000 0x0 0xbc00000>;
                dma-coherent;
                dma-ranges;
 
                ti,sci-dev-id = <118>;
 
-               intr_main_navss: interrupt-controller1 {
+               intr_main_navss: interrupt-controller@310e0000 {
                        compatible = "ti,sci-intr";
+                       reg = <0x0 0x310e0000 0x0 0x2000>;
                        ti,intr-trigger-type = <4>;
                        interrupt-controller;
                        interrupt-parent = <&gic500>;
                        reg-names = "iram", "control", "debug";
                        firmware-name = "am65x-txpru0_1-fw";
                };
+
+               icssg0_mdio: mdio@32400 {
+                       compatible = "ti,davinci_mdio";
+                       reg = <0x32400 0x100>;
+                       clocks = <&k3_clks 62 3>;
+                       clock-names = "fck";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       bus_freq = <1000000>;
+               };
        };
 
        icssg1: icssg@b100000 {
                        reg-names = "iram", "control", "debug";
                        firmware-name = "am65x-txpru1_1-fw";
                };
+
+               icssg1_mdio: mdio@32400 {
+                       compatible = "ti,davinci_mdio";
+                       reg = <0x32400 0x100>;
+                       clocks = <&k3_clks 63 3>;
+                       clock-names = "fck";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       bus_freq = <1000000>;
+               };
        };
 
        icssg2: icssg@b200000 {
                        reg-names = "iram", "control", "debug";
                        firmware-name = "am65x-txpru2_1-fw";
                };
+
+               icssg2_mdio: mdio@32400 {
+                       compatible = "ti,davinci_mdio";
+                       reg = <0x32400 0x100>;
+                       clocks = <&k3_clks 64 3>;
+                       clock-names = "fck";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       bus_freq = <1000000>;
+               };
        };
 };
index 0388c02..c93ff15 100644 (file)
@@ -23,8 +23,6 @@
        mcu_uart0: serial@40a00000 {
                compatible = "ti,am654-uart";
                        reg = <0x00 0x40a00000 0x00 0x100>;
-                       reg-shift = <2>;
-                       reg-io-width = <4>;
                        interrupts = <GIC_SPI 565 IRQ_TYPE_LEVEL_HIGH>;
                        clock-frequency = <96000000>;
                        current-speed = <115200>;
                };
        };
 
-       mcu-navss {
+       mcu_navss: bus@28380000 {
                compatible = "simple-mfd";
                #address-cells = <2>;
                #size-cells = <2>;
-               ranges;
+               ranges = <0x00 0x28380000 0x00 0x28380000 0x00 0x03880000>;
                dma-coherent;
                dma-ranges;
 
index ed42f13..9d21cdf 100644 (file)
@@ -6,24 +6,24 @@
  */
 
 &cbass_wakeup {
-       dmsc: dmsc {
+       dmsc: system-controller@44083000 {
                compatible = "ti,am654-sci";
                ti,host-id = <12>;
-               #address-cells = <1>;
-               #size-cells = <1>;
-               ranges;
 
                mbox-names = "rx", "tx";
 
                mboxes= <&secure_proxy_main 11>,
                        <&secure_proxy_main 13>;
 
+               reg-names = "debug_messages";
+               reg = <0x44083000 0x1000>;
+
                k3_pds: power-controller {
                        compatible = "ti,sci-pm-domain";
                        #power-domain-cells = <2>;
                };
 
-               k3_clks: clocks {
+               k3_clks: clock-controller {
                        compatible = "ti,k2g-sci-clk";
                        #clock-cells = <2>;
                };
@@ -50,8 +50,6 @@
        wkup_uart0: serial@42300000 {
                compatible = "ti,am654-uart";
                reg = <0x42300000 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 697 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
@@ -69,8 +67,9 @@
                power-domains = <&k3_pds 115 TI_SCI_PD_EXCLUSIVE>;
        };
 
-       intr_wkup_gpio: interrupt-controller2 {
+       intr_wkup_gpio: interrupt-controller@42200000 {
                compatible = "ti,sci-intr";
+               reg = <0x42200000 0x200>;
                ti,intr-trigger-type = <1>;
                interrupt-controller;
                interrupt-parent = <&gic500>;
index 4f7e3f2..94bb5dd 100644 (file)
@@ -59,3 +59,8 @@
        pinctrl-names = "default";
        pinctrl-0 = <&main_uart0_pins_default>;
 };
+
+&mcu_r5fss0 {
+       /* lock-step mode not supported on this board */
+       ti,cluster-mode = <0>;
+};
index 9e87fb3..cfbcebf 100644 (file)
                };
        };
 
-       clk_ov5640_fixed: clock {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <24000000>;
+       evm_12v0: fixedregulator-evm12v0 {
+               /* main supply */
+               compatible = "regulator-fixed";
+               regulator-name = "evm_12v0";
+               regulator-min-microvolt = <12000000>;
+               regulator-max-microvolt = <12000000>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
+       vcc3v3_io: fixedregulator-vcc3v3io {
+               /* Output of TPS54334 */
+               compatible = "regulator-fixed";
+               regulator-name = "vcc3v3_io";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+               regulator-boot-on;
+               vin-supply = <&evm_12v0>;
+       };
+
+       vdd_mmc1_sd: fixedregulator-sd {
+               compatible = "regulator-fixed";
+               regulator-name = "vdd_mmc1_sd";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-boot-on;
+               enable-active-high;
+               vin-supply = <&vcc3v3_io>;
+               gpio = <&pca9554 4 GPIO_ACTIVE_HIGH>;
        };
 };
 
                        AM65X_WKUP_IOPAD(0x007c, PIN_INPUT, 0) /* (L5) MCU_RGMII1_RD2 */
                        AM65X_WKUP_IOPAD(0x0080, PIN_INPUT, 0) /* (M6) MCU_RGMII1_RD1 */
                        AM65X_WKUP_IOPAD(0x0084, PIN_INPUT, 0) /* (L6) MCU_RGMII1_RD0 */
-                       AM65X_WKUP_IOPAD(0x0070, PIN_INPUT, 0) /* (N1) MCU_RGMII1_TXC */
+                       AM65X_WKUP_IOPAD(0x0070, PIN_OUTPUT, 0) /* (N1) MCU_RGMII1_TXC */
                        AM65X_WKUP_IOPAD(0x0074, PIN_INPUT, 0) /* (M1) MCU_RGMII1_RXC */
                >;
        };
        pinctrl-names = "default";
        pinctrl-0 = <&main_i2c1_pins_default>;
        clock-frequency = <400000>;
-
-       ov5640: camera@3c {
-               compatible = "ovti,ov5640";
-               reg = <0x3c>;
-
-               clocks = <&clk_ov5640_fixed>;
-               clock-names = "xclk";
-
-               port {
-                       csi2_cam0: endpoint {
-                               remote-endpoint = <&csi2_phy0>;
-                               clock-lanes = <0>;
-                               data-lanes = <1 2>;
-                       };
-               };
-       };
-
 };
 
 &main_i2c2 {
        pinctrl-0 = <&main_spi0_pins_default>;
        #address-cells = <1>;
        #size-cells= <0>;
-       ti,pindir-d0-out-d1-in = <1>;
+       ti,pindir-d0-out-d1-in;
 
        flash@0{
                compatible = "jedec,spi-nor";
  * disable sdhci1
  */
 &sdhci1 {
+       vmmc-supply = <&vdd_mmc1_sd>;
        pinctrl-names = "default";
        pinctrl-0 = <&main_mmc1_pins_default>;
        ti,driver-strength-ohm = <50>;
        };
 };
 
-&csi2_0 {
-       csi2_phy0: endpoint {
-               remote-endpoint = <&csi2_cam0>;
-               clock-lanes = <0>;
-               data-lanes = <1 2>;
-       };
-};
-
 &mcu_cpsw {
        pinctrl-names = "default";
        pinctrl-0 = <&mcu_cpsw_pins_default &mcu_mdio_pins_default>;
 &dss {
        status = "disabled";
 };
+
+&icssg0_mdio {
+       status = "disabled";
+};
+
+&icssg1_mdio {
+       status = "disabled";
+};
+
+&icssg2_mdio {
+       status = "disabled";
+};
index bedd01b..d14f3c1 100644 (file)
@@ -90,7 +90,7 @@
                        J721E_WKUP_IOPAD(0x008c, PIN_INPUT, 0) /* MCU_RGMII1_RD2 */
                        J721E_WKUP_IOPAD(0x0090, PIN_INPUT, 0) /* MCU_RGMII1_RD1 */
                        J721E_WKUP_IOPAD(0x0094, PIN_INPUT, 0) /* MCU_RGMII1_RD0 */
-                       J721E_WKUP_IOPAD(0x0080, PIN_INPUT, 0) /* MCU_RGMII1_TXC */
+                       J721E_WKUP_IOPAD(0x0080, PIN_OUTPUT, 0) /* MCU_RGMII1_TXC */
                        J721E_WKUP_IOPAD(0x0084, PIN_INPUT, 0) /* MCU_RGMII1_RXC */
                >;
        };
index f86c493..e8a41d0 100644 (file)
@@ -68,8 +68,9 @@
                };
        };
 
-       main_gpio_intr: interrupt-controller0 {
+       main_gpio_intr: interrupt-controller@a00000 {
                compatible = "ti,sci-intr";
+               reg = <0x00 0x00a00000 0x00 0x800>;
                ti,intr-trigger-type = <1>;
                interrupt-controller;
                interrupt-parent = <&gic500>;
                #size-cells = <2>;
                ranges = <0x00 0x30000000 0x00 0x30000000 0x00 0x0c400000>;
                ti,sci-dev-id = <199>;
+               dma-coherent;
+               dma-ranges;
 
-               main_navss_intr: interrupt-controller1 {
+               main_navss_intr: interrupt-controller@310e0000 {
                        compatible = "ti,sci-intr";
+                       reg = <0x00 0x310e0000 0x00 0x4000>;
                        ti,intr-trigger-type = <4>;
                        interrupt-controller;
                        interrupt-parent = <&gic500>;
        main_uart0: serial@2800000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02800000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 192 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart1: serial@2810000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02810000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 193 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart2: serial@2820000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02820000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 194 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart3: serial@2830000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02830000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 195 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart4: serial@2840000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02840000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart5: serial@2850000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02850000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart6: serial@2860000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02860000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart7: serial@2870000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02870000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 199 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart8: serial@2880000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02880000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 248 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart9: serial@2890000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02890000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 249 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
                                          "otg";
                        maximum-speed = "super-speed";
                        dr_mode = "otg";
+                       cdns,phyrst-a-enable;
                };
        };
 
                             <149>;
                interrupt-controller;
                #interrupt-cells = <2>;
-               #address-cells = <0>;
                ti,ngpio = <69>;
                ti,davinci-gpio-unbanked = <0>;
                power-domains = <&k3_pds 105 TI_SCI_PD_EXCLUSIVE>;
                             <158>;
                interrupt-controller;
                #interrupt-cells = <2>;
-               #address-cells = <0>;
                ti,ngpio = <69>;
                ti,davinci-gpio-unbanked = <0>;
                power-domains = <&k3_pds 107 TI_SCI_PD_EXCLUSIVE>;
                             <167>;
                interrupt-controller;
                #interrupt-cells = <2>;
-               #address-cells = <0>;
                ti,ngpio = <69>;
                ti,davinci-gpio-unbanked = <0>;
                power-domains = <&k3_pds 109 TI_SCI_PD_EXCLUSIVE>;
                             <176>;
                interrupt-controller;
                #interrupt-cells = <2>;
-               #address-cells = <0>;
                ti,ngpio = <69>;
                ti,davinci-gpio-unbanked = <0>;
                power-domains = <&k3_pds 111 TI_SCI_PD_EXCLUSIVE>;
index 5e74e43..1044ec6 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 &cbass_mcu_wakeup {
-       dmsc: dmsc@44083000 {
+       dmsc: system-controller@44083000 {
                compatible = "ti,k2g-sci";
                ti,host-id = <12>;
 
@@ -23,7 +23,7 @@
                        #power-domain-cells = <2>;
                };
 
-               k3_clks: clocks {
+               k3_clks: clock-controller {
                        compatible = "ti,k2g-sci-clk";
                        #clock-cells = <2>;
                };
@@ -73,8 +73,6 @@
        wkup_uart0: serial@42300000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x42300000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 897 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
@@ -86,8 +84,6 @@
        mcu_uart0: serial@40a00000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x40a00000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 846 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <96000000>;
                current-speed = <115200>;
@@ -96,8 +92,9 @@
                clock-names = "fclk";
        };
 
-       wkup_gpio_intr: interrupt-controller2 {
+       wkup_gpio_intr: interrupt-controller@42200000 {
                compatible = "ti,sci-intr";
+               reg = <0x00 0x42200000 0x00 0x400>;
                ti,intr-trigger-type = <1>;
                interrupt-controller;
                interrupt-parent = <&gic500>;
                interrupts = <103>, <104>, <105>, <106>, <107>, <108>;
                interrupt-controller;
                #interrupt-cells = <2>;
-               #address-cells = <0>;
                ti,ngpio = <85>;
                ti,davinci-gpio-unbanked = <0>;
                power-domains = <&k3_pds 113 TI_SCI_PD_EXCLUSIVE>;
                interrupts = <112>, <113>, <114>, <115>, <116>, <117>;
                interrupt-controller;
                #interrupt-cells = <2>;
-               #address-cells = <0>;
                ti,ngpio = <85>;
                ti,davinci-gpio-unbanked = <0>;
                power-domains = <&k3_pds 114 TI_SCI_PD_EXCLUSIVE>;
index 6076436..8bd02d9 100644 (file)
@@ -9,6 +9,7 @@
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/input/input.h>
 #include <dt-bindings/net/ti-dp83867.h>
+#include <dt-bindings/phy/phy-cadence.h>
 
 / {
        chosen {
                        J721E_WKUP_IOPAD(0x007c, PIN_INPUT, 0) /* MCU_RGMII1_RD2 */
                        J721E_WKUP_IOPAD(0x0080, PIN_INPUT, 0) /* MCU_RGMII1_RD1 */
                        J721E_WKUP_IOPAD(0x0084, PIN_INPUT, 0) /* MCU_RGMII1_RD0 */
-                       J721E_WKUP_IOPAD(0x0070, PIN_INPUT, 0) /* MCU_RGMII1_TXC */
+                       J721E_WKUP_IOPAD(0x0070, PIN_OUTPUT, 0) /* MCU_RGMII1_TXC */
                        J721E_WKUP_IOPAD(0x0074, PIN_INPUT, 0) /* MCU_RGMII1_RXC */
                >;
        };
 };
 
 &serdes3 {
-       serdes3_usb_link: link@0 {
+       serdes3_usb_link: phy@0 {
                reg = <0>;
                cdns,num-lanes = <2>;
                #phy-cells = <0>;
        status = "disabled";
 };
 
+&cmn_refclk1 {
+       clock-frequency = <100000000>;
+};
+
+&wiz0_pll1_refclk {
+       assigned-clocks = <&wiz0_pll1_refclk>;
+       assigned-clock-parents = <&cmn_refclk1>;
+};
+
+&wiz0_refclk_dig {
+       assigned-clocks = <&wiz0_refclk_dig>;
+       assigned-clock-parents = <&cmn_refclk1>;
+};
+
+&wiz1_pll1_refclk {
+       assigned-clocks = <&wiz1_pll1_refclk>;
+       assigned-clock-parents = <&cmn_refclk1>;
+};
+
+&wiz1_refclk_dig {
+       assigned-clocks = <&wiz1_refclk_dig>;
+       assigned-clock-parents = <&cmn_refclk1>;
+};
+
+&wiz2_pll1_refclk {
+       assigned-clocks = <&wiz2_pll1_refclk>;
+       assigned-clock-parents = <&cmn_refclk1>;
+};
+
+&wiz2_refclk_dig {
+       assigned-clocks = <&wiz2_refclk_dig>;
+       assigned-clock-parents = <&cmn_refclk1>;
+};
+
 &serdes0 {
-       serdes0_pcie_link: link@0 {
+       assigned-clocks = <&serdes0 CDNS_SIERRA_PLL_CMNLC>;
+       assigned-clock-parents = <&wiz0_pll1_refclk>;
+
+       serdes0_pcie_link: phy@0 {
                reg = <0>;
                cdns,num-lanes = <1>;
                #phy-cells = <0>;
 };
 
 &serdes1 {
-       serdes1_pcie_link: link@0 {
+       assigned-clocks = <&serdes1 CDNS_SIERRA_PLL_CMNLC>;
+       assigned-clock-parents = <&wiz1_pll1_refclk>;
+
+       serdes1_pcie_link: phy@0 {
                reg = <0>;
                cdns,num-lanes = <2>;
                #phy-cells = <0>;
 };
 
 &serdes2 {
-       serdes2_pcie_link: link@0 {
+       assigned-clocks = <&serdes2 CDNS_SIERRA_PLL_CMNLC>;
+       assigned-clock-parents = <&wiz2_pll1_refclk>;
+
+       serdes2_pcie_link: phy@0 {
                reg = <0>;
                cdns,num-lanes = <2>;
                #phy-cells = <0>;
 &dss {
        status = "disabled";
 };
+
+&icssg0_mdio {
+       status = "disabled";
+};
+
+&icssg1_mdio {
+       status = "disabled";
+};
index c2aa45a..cf34823 100644 (file)
@@ -8,6 +8,20 @@
 #include <dt-bindings/mux/mux.h>
 #include <dt-bindings/mux/ti-serdes.h>
 
+/ {
+       cmn_refclk: clock-cmnrefclk {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <0>;
+       };
+
+       cmn_refclk1: clock-cmnrefclk1 {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <0>;
+       };
+};
+
 &cbass_main {
        msmc_ram: sram@70000000 {
                compatible = "mmio-sram";
@@ -76,8 +90,9 @@
                };
        };
 
-       main_gpio_intr: interrupt-controller0 {
+       main_gpio_intr: interrupt-controller@a00000 {
                compatible = "ti,sci-intr";
+               reg = <0x00 0x00a00000 0x00 0x800>;
                ti,intr-trigger-type = <1>;
                interrupt-controller;
                interrupt-parent = <&gic500>;
                ti,interrupt-ranges = <8 392 56>;
        };
 
-       main-navss {
+       main_navss: bus@30000000 {
                compatible = "simple-mfd";
                #address-cells = <2>;
                #size-cells = <2>;
-               ranges;
+               ranges = <0x00 0x30000000 0x00 0x30000000 0x00 0x0c400000>;
                dma-coherent;
                dma-ranges;
 
                ti,sci-dev-id = <199>;
 
-               main_navss_intr: interrupt-controller1 {
+               main_navss_intr: interrupt-controller@310e0000 {
                        compatible = "ti,sci-intr";
+                       reg = <0x0 0x310e0000 0x0 0x4000>;
                        ti,intr-trigger-type = <4>;
                        interrupt-controller;
                        interrupt-parent = <&gic500>;
                pinctrl-single,function-mask = <0xffffffff>;
        };
 
-       dummy_cmn_refclk: dummy-cmn-refclk {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <100000000>;
-       };
-
-       dummy_cmn_refclk1: dummy-cmn-refclk1 {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <100000000>;
-       };
-
        serdes_wiz0: wiz@5000000 {
                compatible = "ti,j721e-wiz-16g";
                #address-cells = <1>;
                #size-cells = <1>;
                power-domains = <&k3_pds 292 TI_SCI_PD_EXCLUSIVE>;
-               clocks = <&k3_clks 292 5>, <&k3_clks 292 11>, <&dummy_cmn_refclk>;
+               clocks = <&k3_clks 292 5>, <&k3_clks 292 11>, <&cmn_refclk>;
                clock-names = "fck", "core_ref_clk", "ext_ref_clk";
                assigned-clocks = <&k3_clks 292 11>, <&k3_clks 292 0>;
                assigned-clock-parents = <&k3_clks 292 15>, <&k3_clks 292 4>;
                ranges = <0x5000000 0x0 0x5000000 0x10000>;
 
                wiz0_pll0_refclk: pll0-refclk {
-                       clocks = <&k3_clks 292 11>, <&dummy_cmn_refclk>;
+                       clocks = <&k3_clks 292 11>, <&cmn_refclk>;
                        #clock-cells = <0>;
                        assigned-clocks = <&wiz0_pll0_refclk>;
                        assigned-clock-parents = <&k3_clks 292 11>;
                };
 
                wiz0_pll1_refclk: pll1-refclk {
-                       clocks = <&k3_clks 292 0>, <&dummy_cmn_refclk1>;
+                       clocks = <&k3_clks 292 0>, <&cmn_refclk1>;
                        #clock-cells = <0>;
                        assigned-clocks = <&wiz0_pll1_refclk>;
                        assigned-clock-parents = <&k3_clks 292 0>;
                };
 
                wiz0_refclk_dig: refclk-dig {
-                       clocks = <&k3_clks 292 11>, <&k3_clks 292 0>, <&dummy_cmn_refclk>, <&dummy_cmn_refclk1>;
+                       clocks = <&k3_clks 292 11>, <&k3_clks 292 0>, <&cmn_refclk>, <&cmn_refclk1>;
                        #clock-cells = <0>;
                        assigned-clocks = <&wiz0_refclk_dig>;
                        assigned-clock-parents = <&k3_clks 292 11>;
                        reg = <0x5000000 0x10000>;
                        #address-cells = <1>;
                        #size-cells = <0>;
+                       #clock-cells = <1>;
                        resets = <&serdes_wiz0 0>;
                        reset-names = "sierra_reset";
-                       clocks = <&wiz0_cmn_refclk_dig_div>, <&wiz0_cmn_refclk1_dig_div>;
-                       clock-names = "cmn_refclk_dig_div", "cmn_refclk1_dig_div";
+                       clocks = <&wiz0_cmn_refclk_dig_div>, <&wiz0_cmn_refclk1_dig_div>,
+                                <&wiz0_pll0_refclk>, <&wiz0_pll1_refclk>;
+                       clock-names = "cmn_refclk_dig_div", "cmn_refclk1_dig_div",
+                                     "pll0_refclk", "pll1_refclk";
                };
        };
 
                #address-cells = <1>;
                #size-cells = <1>;
                power-domains = <&k3_pds 293 TI_SCI_PD_EXCLUSIVE>;
-               clocks = <&k3_clks 293 5>, <&k3_clks 293 13>, <&dummy_cmn_refclk>;
+               clocks = <&k3_clks 293 5>, <&k3_clks 293 13>, <&cmn_refclk>;
                clock-names = "fck", "core_ref_clk", "ext_ref_clk";
                assigned-clocks = <&k3_clks 293 13>, <&k3_clks 293 0>;
                assigned-clock-parents = <&k3_clks 293 17>, <&k3_clks 293 4>;
                ranges = <0x5010000 0x0 0x5010000 0x10000>;
 
                wiz1_pll0_refclk: pll0-refclk {
-                       clocks = <&k3_clks 293 13>, <&dummy_cmn_refclk>;
+                       clocks = <&k3_clks 293 13>, <&cmn_refclk>;
                        #clock-cells = <0>;
                        assigned-clocks = <&wiz1_pll0_refclk>;
                        assigned-clock-parents = <&k3_clks 293 13>;
                };
 
                wiz1_pll1_refclk: pll1-refclk {
-                       clocks = <&k3_clks 293 0>, <&dummy_cmn_refclk1>;
+                       clocks = <&k3_clks 293 0>, <&cmn_refclk1>;
                        #clock-cells = <0>;
                        assigned-clocks = <&wiz1_pll1_refclk>;
                        assigned-clock-parents = <&k3_clks 293 0>;
                };
 
                wiz1_refclk_dig: refclk-dig {
-                       clocks = <&k3_clks 293 13>, <&k3_clks 293 0>, <&dummy_cmn_refclk>, <&dummy_cmn_refclk1>;
+                       clocks = <&k3_clks 293 13>, <&k3_clks 293 0>, <&cmn_refclk>, <&cmn_refclk1>;
                        #clock-cells = <0>;
                        assigned-clocks = <&wiz1_refclk_dig>;
                        assigned-clock-parents = <&k3_clks 293 13>;
                        reg = <0x5010000 0x10000>;
                        #address-cells = <1>;
                        #size-cells = <0>;
+                       #clock-cells = <1>;
                        resets = <&serdes_wiz1 0>;
                        reset-names = "sierra_reset";
-                       clocks = <&wiz1_cmn_refclk_dig_div>, <&wiz1_cmn_refclk1_dig_div>;
-                       clock-names = "cmn_refclk_dig_div", "cmn_refclk1_dig_div";
+                       clocks = <&wiz1_cmn_refclk_dig_div>, <&wiz1_cmn_refclk1_dig_div>,
+                                <&wiz1_pll0_refclk>, <&wiz1_pll1_refclk>;
+                       clock-names = "cmn_refclk_dig_div", "cmn_refclk1_dig_div",
+                                     "pll0_refclk", "pll1_refclk";
                };
        };
 
                #address-cells = <1>;
                #size-cells = <1>;
                power-domains = <&k3_pds 294 TI_SCI_PD_EXCLUSIVE>;
-               clocks = <&k3_clks 294 5>, <&k3_clks 294 11>, <&dummy_cmn_refclk>;
+               clocks = <&k3_clks 294 5>, <&k3_clks 294 11>, <&cmn_refclk>;
                clock-names = "fck", "core_ref_clk", "ext_ref_clk";
                assigned-clocks = <&k3_clks 294 11>, <&k3_clks 294 0>;
                assigned-clock-parents = <&k3_clks 294 15>, <&k3_clks 294 4>;
                ranges = <0x5020000 0x0 0x5020000 0x10000>;
 
                wiz2_pll0_refclk: pll0-refclk {
-                       clocks = <&k3_clks 294 11>, <&dummy_cmn_refclk>;
+                       clocks = <&k3_clks 294 11>, <&cmn_refclk>;
                        #clock-cells = <0>;
                        assigned-clocks = <&wiz2_pll0_refclk>;
                        assigned-clock-parents = <&k3_clks 294 11>;
                };
 
                wiz2_pll1_refclk: pll1-refclk {
-                       clocks = <&k3_clks 294 0>, <&dummy_cmn_refclk1>;
+                       clocks = <&k3_clks 294 0>, <&cmn_refclk1>;
                        #clock-cells = <0>;
                        assigned-clocks = <&wiz2_pll1_refclk>;
                        assigned-clock-parents = <&k3_clks 294 0>;
                };
 
                wiz2_refclk_dig: refclk-dig {
-                       clocks = <&k3_clks 294 11>, <&k3_clks 294 0>, <&dummy_cmn_refclk>, <&dummy_cmn_refclk1>;
+                       clocks = <&k3_clks 294 11>, <&k3_clks 294 0>, <&cmn_refclk>, <&cmn_refclk1>;
                        #clock-cells = <0>;
                        assigned-clocks = <&wiz2_refclk_dig>;
                        assigned-clock-parents = <&k3_clks 294 11>;
                        reg = <0x5020000 0x10000>;
                        #address-cells = <1>;
                        #size-cells = <0>;
+                       #clock-cells = <1>;
                        resets = <&serdes_wiz2 0>;
                        reset-names = "sierra_reset";
-                       clocks = <&wiz2_cmn_refclk_dig_div>, <&wiz2_cmn_refclk1_dig_div>;
-                       clock-names = "cmn_refclk_dig_div", "cmn_refclk1_dig_div";
+                       clocks = <&wiz2_cmn_refclk_dig_div>, <&wiz2_cmn_refclk1_dig_div>,
+                                <&wiz2_pll0_refclk>, <&wiz2_pll1_refclk>;
+                       clock-names = "cmn_refclk_dig_div", "cmn_refclk1_dig_div",
+                                     "pll0_refclk", "pll1_refclk";
                };
        };
 
                #address-cells = <1>;
                #size-cells = <1>;
                power-domains = <&k3_pds 295 TI_SCI_PD_EXCLUSIVE>;
-               clocks = <&k3_clks 295 5>, <&k3_clks 295 9>, <&dummy_cmn_refclk>;
+               clocks = <&k3_clks 295 5>, <&k3_clks 295 9>, <&cmn_refclk>;
                clock-names = "fck", "core_ref_clk", "ext_ref_clk";
                assigned-clocks = <&k3_clks 295 9>, <&k3_clks 295 0>;
                assigned-clock-parents = <&k3_clks 295 13>, <&k3_clks 295 4>;
                ranges = <0x5030000 0x0 0x5030000 0x10000>;
 
                wiz3_pll0_refclk: pll0-refclk {
-                       clocks = <&k3_clks 295 9>, <&dummy_cmn_refclk>;
+                       clocks = <&k3_clks 295 9>, <&cmn_refclk>;
                        #clock-cells = <0>;
                        assigned-clocks = <&wiz3_pll0_refclk>;
                        assigned-clock-parents = <&k3_clks 295 9>;
                };
 
                wiz3_pll1_refclk: pll1-refclk {
-                       clocks = <&k3_clks 295 0>, <&dummy_cmn_refclk1>;
+                       clocks = <&k3_clks 295 0>, <&cmn_refclk1>;
                        #clock-cells = <0>;
                        assigned-clocks = <&wiz3_pll1_refclk>;
                        assigned-clock-parents = <&k3_clks 295 0>;
                };
 
                wiz3_refclk_dig: refclk-dig {
-                       clocks = <&k3_clks 295 9>, <&k3_clks 295 0>, <&dummy_cmn_refclk>, <&dummy_cmn_refclk1>;
+                       clocks = <&k3_clks 295 9>, <&k3_clks 295 0>, <&cmn_refclk>, <&cmn_refclk1>;
                        #clock-cells = <0>;
                        assigned-clocks = <&wiz3_refclk_dig>;
                        assigned-clock-parents = <&k3_clks 295 9>;
                        reg = <0x5030000 0x10000>;
                        #address-cells = <1>;
                        #size-cells = <0>;
+                       #clock-cells = <1>;
                        resets = <&serdes_wiz3 0>;
                        reset-names = "sierra_reset";
-                       clocks = <&wiz3_cmn_refclk_dig_div>, <&wiz3_cmn_refclk1_dig_div>;
-                       clock-names = "cmn_refclk_dig_div", "cmn_refclk1_dig_div";
+                       clocks = <&wiz3_cmn_refclk_dig_div>, <&wiz3_cmn_refclk1_dig_div>,
+                                <&wiz3_pll0_refclk>, <&wiz3_pll1_refclk>;
+                       clock-names = "cmn_refclk_dig_div", "cmn_refclk1_dig_div",
+                                     "pll0_refclk", "pll1_refclk";
                };
        };
 
        main_uart0: serial@2800000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02800000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 192 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart1: serial@2810000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02810000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 193 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart2: serial@2820000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02820000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 194 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart3: serial@2830000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02830000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 195 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart4: serial@2840000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02840000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart5: serial@2850000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02850000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart6: serial@2860000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02860000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart7: serial@2870000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02870000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 199 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart8: serial@2880000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02880000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 248 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
        main_uart9: serial@2890000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x02890000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 249 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
                        reg-names = "iram", "control", "debug";
                        firmware-name = "j7-txpru0_1-fw";
                };
+
+               icssg0_mdio: mdio@32400 {
+                       compatible = "ti,davinci_mdio";
+                       reg = <0x32400 0x100>;
+                       clocks = <&k3_clks 119 1>;
+                       clock-names = "fck";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       bus_freq = <1000000>;
+               };
        };
 
        icssg1: icssg@b100000 {
                        reg-names = "iram", "control", "debug";
                        firmware-name = "j7-txpru1_1-fw";
                };
+
+               icssg1_mdio: mdio@32400 {
+                       compatible = "ti,davinci_mdio";
+                       reg = <0x32400 0x100>;
+                       clocks = <&k3_clks 120 4>;
+                       clock-names = "fck";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       bus_freq = <1000000>;
+               };
        };
 };
index d56e347..d2dceda 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 &cbass_mcu_wakeup {
-       dmsc: dmsc@44083000 {
+       dmsc: system-controller@44083000 {
                compatible = "ti,k2g-sci";
                ti,host-id = <12>;
 
@@ -23,7 +23,7 @@
                        #power-domain-cells = <2>;
                };
 
-               k3_clks: clocks {
+               k3_clks: clock-controller {
                        compatible = "ti,k2g-sci-clk";
                        #clock-cells = <2>;
                };
@@ -73,8 +73,6 @@
        wkup_uart0: serial@42300000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x42300000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 897 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <48000000>;
                current-speed = <115200>;
@@ -86,8 +84,6 @@
        mcu_uart0: serial@40a00000 {
                compatible = "ti,j721e-uart", "ti,am654-uart";
                reg = <0x00 0x40a00000 0x00 0x100>;
-               reg-shift = <2>;
-               reg-io-width = <4>;
                interrupts = <GIC_SPI 846 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <96000000>;
                current-speed = <115200>;
@@ -96,8 +92,9 @@
                clock-names = "fclk";
        };
 
-       wkup_gpio_intr: interrupt-controller2 {
+       wkup_gpio_intr: interrupt-controller@42200000 {
                compatible = "ti,sci-intr";
+               reg = <0x00 0x42200000 0x00 0x400>;
                ti,intr-trigger-type = <1>;
                interrupt-controller;
                interrupt-parent = <&gic500>;
                };
        };
 
-       mcu-navss {
+       mcu_navss: bus@28380000 {
                compatible = "simple-mfd";
                #address-cells = <2>;
                #size-cells = <2>;
-               ranges;
+               ranges = <0x00 0x28380000 0x00 0x28380000 0x00 0x03880000>;
                dma-coherent;
                dma-ranges;
 
index bf0620a..29a4d9f 100644 (file)
 &gpio {
        status = "okay";
 };
+
+&pwm_mux {
+       groups = "pwm0_gpio16_grp", "pwm1_gpio17_grp", "pwm2_gpio18_grp", "pwm3_gpio19_grp";
+};
+
+&pwm {
+       status = "okay";
+};
index 17934fd..4b4231f 100644 (file)
                        reg = <0 0x28330000 0 0x1000>;
                        status = "disabled";
                };
+
+               pwm: pwm@241c0000 {
+                       compatible = "toshiba,visconti-pwm";
+                       reg = <0 0x241c0000 0 0x1000>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pwm_mux>;
+                       #pwm-cells = <2>;
+                       status = "disabled";
+               };
        };
 };
 
index 34de000..a480c6b 100644 (file)
@@ -90,4 +90,9 @@
                groups = "i2c8_grp";
                bias-pull-up;
        };
+
+       pwm_mux: pwm_mux {
+               function = "pwm";
+       };
+
 };
index 07ac208..26889db 100644 (file)
@@ -5,3 +5,5 @@ generic-y += qrwlock.h
 generic-y += qspinlock.h
 generic-y += set_memory.h
 generic-y += user.h
+
+generated-y += cpucaps.h
diff --git a/arch/arm64/include/asm/cpucaps.h b/arch/arm64/include/asm/cpucaps.h
deleted file mode 100644 (file)
index b0c5eda..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * arch/arm64/include/asm/cpucaps.h
- *
- * Copyright (C) 2016 ARM Ltd.
- */
-#ifndef __ASM_CPUCAPS_H
-#define __ASM_CPUCAPS_H
-
-#define ARM64_WORKAROUND_CLEAN_CACHE           0
-#define ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE   1
-#define ARM64_WORKAROUND_845719                        2
-#define ARM64_HAS_SYSREG_GIC_CPUIF             3
-#define ARM64_HAS_PAN                          4
-#define ARM64_HAS_LSE_ATOMICS                  5
-#define ARM64_WORKAROUND_CAVIUM_23154          6
-#define ARM64_WORKAROUND_834220                        7
-#define ARM64_HAS_NO_HW_PREFETCH               8
-#define ARM64_HAS_VIRT_HOST_EXTN               11
-#define ARM64_WORKAROUND_CAVIUM_27456          12
-#define ARM64_HAS_32BIT_EL0                    13
-#define ARM64_SPECTRE_V3A                      14
-#define ARM64_HAS_CNP                          15
-#define ARM64_HAS_NO_FPSIMD                    16
-#define ARM64_WORKAROUND_REPEAT_TLBI           17
-#define ARM64_WORKAROUND_QCOM_FALKOR_E1003     18
-#define ARM64_WORKAROUND_858921                        19
-#define ARM64_WORKAROUND_CAVIUM_30115          20
-#define ARM64_HAS_DCPOP                                21
-#define ARM64_SVE                              22
-#define ARM64_UNMAP_KERNEL_AT_EL0              23
-#define ARM64_SPECTRE_V2                       24
-#define ARM64_HAS_RAS_EXTN                     25
-#define ARM64_WORKAROUND_843419                        26
-#define ARM64_HAS_CACHE_IDC                    27
-#define ARM64_HAS_CACHE_DIC                    28
-#define ARM64_HW_DBM                           29
-#define ARM64_SPECTRE_V4                       30
-#define ARM64_MISMATCHED_CACHE_TYPE            31
-#define ARM64_HAS_STAGE2_FWB                   32
-#define ARM64_HAS_CRC32                                33
-#define ARM64_SSBS                             34
-#define ARM64_WORKAROUND_1418040               35
-#define ARM64_HAS_SB                           36
-#define ARM64_WORKAROUND_SPECULATIVE_AT                37
-#define ARM64_HAS_ADDRESS_AUTH_ARCH            38
-#define ARM64_HAS_ADDRESS_AUTH_IMP_DEF         39
-#define ARM64_HAS_GENERIC_AUTH_ARCH            40
-#define ARM64_HAS_GENERIC_AUTH_IMP_DEF         41
-#define ARM64_HAS_IRQ_PRIO_MASKING             42
-#define ARM64_HAS_DCPODP                       43
-#define ARM64_WORKAROUND_1463225               44
-#define ARM64_WORKAROUND_CAVIUM_TX2_219_TVM    45
-#define ARM64_WORKAROUND_CAVIUM_TX2_219_PRFM   46
-#define ARM64_WORKAROUND_1542419               47
-#define ARM64_HAS_E0PD                         48
-#define ARM64_HAS_RNG                          49
-#define ARM64_HAS_AMU_EXTN                     50
-#define ARM64_HAS_ADDRESS_AUTH                 51
-#define ARM64_HAS_GENERIC_AUTH                 52
-#define ARM64_HAS_32BIT_EL1                    53
-#define ARM64_BTI                              54
-#define ARM64_HAS_ARMv8_4_TTL                  55
-#define ARM64_HAS_TLB_RANGE                    56
-#define ARM64_MTE                              57
-#define ARM64_WORKAROUND_1508412               58
-#define ARM64_HAS_LDAPR                                59
-#define ARM64_KVM_PROTECTED_MODE               60
-#define ARM64_WORKAROUND_NVIDIA_CARMEL_CNP     61
-#define ARM64_HAS_EPAN                         62
-
-#define ARM64_NCAPS                            63
-
-#endif /* __ASM_CPUCAPS_H */
index 7859749..5dab69d 100644 (file)
@@ -893,8 +893,7 @@ __SYSCALL(__NR_process_madvise, sys_process_madvise)
 __SYSCALL(__NR_epoll_pwait2, compat_sys_epoll_pwait2)
 #define __NR_mount_setattr 442
 __SYSCALL(__NR_mount_setattr, sys_mount_setattr)
-#define __NR_quotactl_path 443
-__SYSCALL(__NR_quotactl_path, sys_quotactl_path)
+/* 443 is reserved for quotactl_path */
 #define __NR_landlock_create_ruleset 444
 __SYSCALL(__NR_landlock_create_ruleset, sys_landlock_create_ruleset)
 #define __NR_landlock_add_rule 445
index ac48516..6d44c02 100644 (file)
@@ -55,8 +55,10 @@ void __sync_icache_dcache(pte_t pte)
 {
        struct page *page = pte_page(pte);
 
-       if (!test_and_set_bit(PG_dcache_clean, &page->flags))
+       if (!test_bit(PG_dcache_clean, &page->flags)) {
                sync_icache_aliases(page_address(page), page_size(page));
+               set_bit(PG_dcache_clean, &page->flags);
+       }
 }
 EXPORT_SYMBOL_GPL(__sync_icache_dcache);
 
index 16a2b2b..e55409c 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/sizes.h>
 #include <asm/tlb.h>
 #include <asm/alternative.h>
+#include <asm/xen/swiotlb-xen.h>
 
 /*
  * We need to be able to catch inadvertent references to memstart_addr
@@ -482,7 +483,7 @@ void __init mem_init(void)
        if (swiotlb_force == SWIOTLB_FORCE ||
            max_pfn > PFN_DOWN(arm64_dma_phys_limit))
                swiotlb_init(1);
-       else
+       else if (!xen_swiotlb_detect())
                swiotlb_force = SWIOTLB_NO_FORCE;
 
        set_max_mapnr(max_pfn - PHYS_PFN_OFFSET);
index 0a48191..97d7bcd 100644 (file)
@@ -447,6 +447,18 @@ SYM_FUNC_START(__cpu_setup)
        mov     x10, #(SYS_GCR_EL1_RRND | SYS_GCR_EL1_EXCL_MASK)
        msr_s   SYS_GCR_EL1, x10
 
+       /*
+        * If GCR_EL1.RRND=1 is implemented the same way as RRND=0, then
+        * RGSR_EL1.SEED must be non-zero for IRG to produce
+        * pseudorandom numbers. As RGSR_EL1 is UNKNOWN out of reset, we
+        * must initialize it.
+        */
+       mrs     x10, CNTVCT_EL0
+       ands    x10, x10, #SYS_RGSR_EL1_SEED_MASK
+       csinc   x10, x10, xzr, ne
+       lsl     x10, x10, #SYS_RGSR_EL1_SEED_SHIFT
+       msr_s   SYS_RGSR_EL1, x10
+
        /* clear any pending tag check faults in TFSR*_EL1 */
        msr_s   SYS_TFSR_EL1, xzr
        msr_s   SYS_TFSRE0_EL1, xzr
diff --git a/arch/arm64/tools/Makefile b/arch/arm64/tools/Makefile
new file mode 100644 (file)
index 0000000..932b4fe
--- /dev/null
@@ -0,0 +1,22 @@
+# SPDX-License-Identifier: GPL-2.0
+
+gen := arch/$(ARCH)/include/generated
+kapi := $(gen)/asm
+
+kapi-hdrs-y := $(kapi)/cpucaps.h
+
+targets += $(addprefix ../../../,$(gen-y) $(kapi-hdrs-y))
+
+PHONY += kapi
+
+kapi:   $(kapi-hdrs-y) $(gen-y)
+
+# Create output directory if not already present
+_dummy := $(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
+
+quiet_cmd_gen_cpucaps = GEN     $@
+      cmd_gen_cpucaps = mkdir -p $(dir $@) && \
+                     $(AWK) -f $(filter-out $(PHONY),$^) > $@
+
+$(kapi)/cpucaps.h: $(src)/gen-cpucaps.awk $(src)/cpucaps FORCE
+       $(call if_changed,gen_cpucaps)
diff --git a/arch/arm64/tools/cpucaps b/arch/arm64/tools/cpucaps
new file mode 100644 (file)
index 0000000..21fbdda
--- /dev/null
@@ -0,0 +1,65 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# Internal CPU capabilities constants, keep this list sorted
+
+BTI
+HAS_32BIT_EL0
+HAS_32BIT_EL1
+HAS_ADDRESS_AUTH
+HAS_ADDRESS_AUTH_ARCH
+HAS_ADDRESS_AUTH_IMP_DEF
+HAS_AMU_EXTN
+HAS_ARMv8_4_TTL
+HAS_CACHE_DIC
+HAS_CACHE_IDC
+HAS_CNP
+HAS_CRC32
+HAS_DCPODP
+HAS_DCPOP
+HAS_E0PD
+HAS_EPAN
+HAS_GENERIC_AUTH
+HAS_GENERIC_AUTH_ARCH
+HAS_GENERIC_AUTH_IMP_DEF
+HAS_IRQ_PRIO_MASKING
+HAS_LDAPR
+HAS_LSE_ATOMICS
+HAS_NO_FPSIMD
+HAS_NO_HW_PREFETCH
+HAS_PAN
+HAS_RAS_EXTN
+HAS_RNG
+HAS_SB
+HAS_STAGE2_FWB
+HAS_SYSREG_GIC_CPUIF
+HAS_TLB_RANGE
+HAS_VIRT_HOST_EXTN
+HW_DBM
+KVM_PROTECTED_MODE
+MISMATCHED_CACHE_TYPE
+MTE
+SPECTRE_V2
+SPECTRE_V3A
+SPECTRE_V4
+SSBS
+SVE
+UNMAP_KERNEL_AT_EL0
+WORKAROUND_834220
+WORKAROUND_843419
+WORKAROUND_845719
+WORKAROUND_858921
+WORKAROUND_1418040
+WORKAROUND_1463225
+WORKAROUND_1508412
+WORKAROUND_1542419
+WORKAROUND_CAVIUM_23154
+WORKAROUND_CAVIUM_27456
+WORKAROUND_CAVIUM_30115
+WORKAROUND_CAVIUM_TX2_219_PRFM
+WORKAROUND_CAVIUM_TX2_219_TVM
+WORKAROUND_CLEAN_CACHE
+WORKAROUND_DEVICE_LOAD_ACQUIRE
+WORKAROUND_NVIDIA_CARMEL_CNP
+WORKAROUND_QCOM_FALKOR_E1003
+WORKAROUND_REPEAT_TLBI
+WORKAROUND_SPECULATIVE_AT
diff --git a/arch/arm64/tools/gen-cpucaps.awk b/arch/arm64/tools/gen-cpucaps.awk
new file mode 100755 (executable)
index 0000000..00c9e72
--- /dev/null
@@ -0,0 +1,40 @@
+#!/bin/awk -f
+# SPDX-License-Identifier: GPL-2.0
+# gen-cpucaps.awk: arm64 cpucaps header generator
+#
+# Usage: awk -f gen-cpucaps.awk cpucaps.txt
+
+# Log an error and terminate
+function fatal(msg) {
+       print "Error at line " NR ": " msg > "/dev/stderr"
+       exit 1
+}
+
+# skip blank lines and comment lines
+/^$/ { next }
+/^#/ { next }
+
+BEGIN {
+       print "#ifndef __ASM_CPUCAPS_H"
+       print "#define __ASM_CPUCAPS_H"
+       print ""
+       print "/* Generated file - do not edit */"
+       cap_num = 0
+       print ""
+}
+
+/^[vA-Z0-9_]+$/ {
+       printf("#define ARM64_%-30s\t%d\n", $0, cap_num++)
+       next
+}
+
+END {
+       printf("#define ARM64_NCAPS\t\t\t\t%d\n", cap_num)
+       print ""
+       print "#endif /* __ASM_CPUCAPS_H */"
+}
+
+# Any lines not handled by previous rules are unexpected
+{
+       fatal("unhandled statement")
+}
index 1ee8e73..bb11fe4 100644 (file)
 440    common  process_madvise                 sys_process_madvise
 441    common  epoll_pwait2                    sys_epoll_pwait2
 442    common  mount_setattr                   sys_mount_setattr
-443    common  quotactl_path                   sys_quotactl_path
+# 443 reserved for quotactl_path
 444    common  landlock_create_ruleset         sys_landlock_create_ruleset
 445    common  landlock_add_rule               sys_landlock_add_rule
 446    common  landlock_restrict_self          sys_landlock_restrict_self
index a4b7ee1..8f215e7 100644 (file)
@@ -623,7 +623,8 @@ static inline void siginfo_build_tests(void)
        BUILD_BUG_ON(offsetof(siginfo_t, si_pkey) != 0x12);
 
        /* _sigfault._perf */
-       BUILD_BUG_ON(offsetof(siginfo_t, si_perf) != 0x10);
+       BUILD_BUG_ON(offsetof(siginfo_t, si_perf_data) != 0x10);
+       BUILD_BUG_ON(offsetof(siginfo_t, si_perf_type) != 0x14);
 
        /* _sigpoll */
        BUILD_BUG_ON(offsetof(siginfo_t, si_band)   != 0x0c);
index 0dd019d..79c2d24 100644 (file)
 440    common  process_madvise                 sys_process_madvise
 441    common  epoll_pwait2                    sys_epoll_pwait2
 442    common  mount_setattr                   sys_mount_setattr
-443    common  quotactl_path                   sys_quotactl_path
+# 443 reserved for quotactl_path
 444    common  landlock_create_ruleset         sys_landlock_create_ruleset
 445    common  landlock_add_rule               sys_landlock_add_rule
 446    common  landlock_restrict_self          sys_landlock_restrict_self
index 2ac7169..b11395a 100644 (file)
 440    common  process_madvise                 sys_process_madvise
 441    common  epoll_pwait2                    sys_epoll_pwait2
 442    common  mount_setattr                   sys_mount_setattr
-443    common  quotactl_path                   sys_quotactl_path
+# 443 reserved for quotactl_path
 444    common  landlock_create_ruleset         sys_landlock_create_ruleset
 445    common  landlock_add_rule               sys_landlock_add_rule
 446    common  landlock_restrict_self          sys_landlock_restrict_self
index 5e00966..9220909 100644 (file)
 440    n32     process_madvise                 sys_process_madvise
 441    n32     epoll_pwait2                    compat_sys_epoll_pwait2
 442    n32     mount_setattr                   sys_mount_setattr
-443    n32     quotactl_path                   sys_quotactl_path
+# 443 reserved for quotactl_path
 444    n32     landlock_create_ruleset         sys_landlock_create_ruleset
 445    n32     landlock_add_rule               sys_landlock_add_rule
 446    n32     landlock_restrict_self          sys_landlock_restrict_self
index 9974f5f..9cd1c34 100644 (file)
 440    n64     process_madvise                 sys_process_madvise
 441    n64     epoll_pwait2                    sys_epoll_pwait2
 442    n64     mount_setattr                   sys_mount_setattr
-443    n64     quotactl_path                   sys_quotactl_path
+# 443 reserved for quotactl_path
 444    n64     landlock_create_ruleset         sys_landlock_create_ruleset
 445    n64     landlock_add_rule               sys_landlock_add_rule
 446    n64     landlock_restrict_self          sys_landlock_restrict_self
index 39d6e71..d560c46 100644 (file)
 440    o32     process_madvise                 sys_process_madvise
 441    o32     epoll_pwait2                    sys_epoll_pwait2                compat_sys_epoll_pwait2
 442    o32     mount_setattr                   sys_mount_setattr
-443    o32     quotactl_path                   sys_quotactl_path
+# 443 reserved for quotactl_path
 444    o32     landlock_create_ruleset         sys_landlock_create_ruleset
 445    o32     landlock_add_rule               sys_landlock_add_rule
 446    o32     landlock_restrict_self          sys_landlock_restrict_self
diff --git a/arch/openrisc/include/asm/barrier.h b/arch/openrisc/include/asm/barrier.h
new file mode 100644 (file)
index 0000000..7538294
--- /dev/null
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __ASM_BARRIER_H
+#define __ASM_BARRIER_H
+
+#define mb() asm volatile ("l.msync" ::: "memory")
+
+#include <asm-generic/barrier.h>
+
+#endif /* __ASM_BARRIER_H */
index 2416a9f..c6f9e7b 100644 (file)
@@ -278,6 +278,8 @@ void calibrate_delay(void)
        pr_cont("%lu.%02lu BogoMIPS (lpj=%lu)\n",
                loops_per_jiffy / (500000 / HZ),
                (loops_per_jiffy / (5000 / HZ)) % 100, loops_per_jiffy);
+
+       of_node_put(cpu);
 }
 
 void __init setup_arch(char **cmdline_p)
index d564119..cfef61a 100644 (file)
@@ -75,7 +75,6 @@ static void __init map_ram(void)
        /* These mark extents of read-only kernel pages...
         * ...from vmlinux.lds.S
         */
-       struct memblock_region *region;
 
        v = PAGE_OFFSET;
 
@@ -121,7 +120,7 @@ static void __init map_ram(void)
                }
 
                printk(KERN_INFO "%s: Memory: 0x%x-0x%x\n", __func__,
-                      region->base, region->base + region->size);
+                      start, end);
        }
 }
 
@@ -129,7 +128,6 @@ void __init paging_init(void)
 {
        extern void tlb_init(void);
 
-       unsigned long end;
        int i;
 
        printk(KERN_INFO "Setting up paging and PTEs.\n");
@@ -145,8 +143,6 @@ void __init paging_init(void)
         */
        current_pgd[smp_processor_id()] = init_mm.pgd;
 
-       end = (unsigned long)__va(max_low_pfn * PAGE_SIZE);
-
        map_ram();
 
        zone_sizes_init();
index 5ac80b8..aabc37f 100644 (file)
 440    common  process_madvise                 sys_process_madvise
 441    common  epoll_pwait2                    sys_epoll_pwait2                compat_sys_epoll_pwait2
 442    common  mount_setattr                   sys_mount_setattr
-443    common  quotactl_path                   sys_quotactl_path
+# 443 reserved for quotactl_path
 444    common  landlock_create_ruleset         sys_landlock_create_ruleset
 445    common  landlock_add_rule               sys_landlock_add_rule
 446    common  landlock_restrict_self          sys_landlock_restrict_self
index 4430509..e3b29ed 100644 (file)
  */
 long plpar_hcall_norets(unsigned long opcode, ...);
 
+/* Variant which does not do hcall tracing */
+long plpar_hcall_norets_notrace(unsigned long opcode, ...);
+
 /**
  * plpar_hcall: - Make a pseries hypervisor call
  * @opcode: The hypervisor call to make.
index 44cde2e..59f7044 100644 (file)
@@ -153,8 +153,6 @@ static inline void interrupt_enter_prepare(struct pt_regs *regs, struct interrup
  */
 static inline void interrupt_exit_prepare(struct pt_regs *regs, struct interrupt_state *state)
 {
-       if (user_mode(regs))
-               kuep_unlock();
 }
 
 static inline void interrupt_async_enter_prepare(struct pt_regs *regs, struct interrupt_state *state)
@@ -222,6 +220,13 @@ static inline void interrupt_nmi_enter_prepare(struct pt_regs *regs, struct inte
        local_paca->irq_soft_mask = IRQS_ALL_DISABLED;
        local_paca->irq_happened |= PACA_IRQ_HARD_DIS;
 
+       if (IS_ENABLED(CONFIG_PPC_BOOK3S_64) && !(regs->msr & MSR_PR) &&
+                               regs->nip < (unsigned long)__end_interrupts) {
+               // Kernel code running below __end_interrupts is
+               // implicitly soft-masked.
+               regs->softe = IRQS_ALL_DISABLED;
+       }
+
        /* Don't do any per-CPU operations until interrupt state is fixed */
 
        if (nmi_disables_ftrace(regs)) {
index 5d1726b..bcb7b5f 100644 (file)
@@ -28,19 +28,35 @@ static inline u32 yield_count_of(int cpu)
        return be32_to_cpu(yield_count);
 }
 
+/*
+ * Spinlock code confers and prods, so don't trace the hcalls because the
+ * tracing code takes spinlocks which can cause recursion deadlocks.
+ *
+ * These calls are made while the lock is not held: the lock slowpath yields if
+ * it can not acquire the lock, and unlock slow path might prod if a waiter has
+ * yielded). So this may not be a problem for simple spin locks because the
+ * tracing does not technically recurse on the lock, but we avoid it anyway.
+ *
+ * However the queued spin lock contended path is more strictly ordered: the
+ * H_CONFER hcall is made after the task has queued itself on the lock, so then
+ * recursing on that lock will cause the task to then queue up again behind the
+ * first instance (or worse: queued spinlocks use tricks that assume a context
+ * never waits on more than one spinlock, so such recursion may cause random
+ * corruption in the lock code).
+ */
 static inline void yield_to_preempted(int cpu, u32 yield_count)
 {
-       plpar_hcall_norets(H_CONFER, get_hard_smp_processor_id(cpu), yield_count);
+       plpar_hcall_norets_notrace(H_CONFER, get_hard_smp_processor_id(cpu), yield_count);
 }
 
 static inline void prod_cpu(int cpu)
 {
-       plpar_hcall_norets(H_PROD, get_hard_smp_processor_id(cpu));
+       plpar_hcall_norets_notrace(H_PROD, get_hard_smp_processor_id(cpu));
 }
 
 static inline void yield_to_any(void)
 {
-       plpar_hcall_norets(H_CONFER, -1, 0);
+       plpar_hcall_norets_notrace(H_CONFER, -1, 0);
 }
 #else
 static inline bool is_shared_processor(void)
index ece84a4..83e0f70 100644 (file)
@@ -28,7 +28,11 @@ static inline void set_cede_latency_hint(u8 latency_hint)
 
 static inline long cede_processor(void)
 {
-       return plpar_hcall_norets(H_CEDE);
+       /*
+        * We cannot call tracepoints inside RCU idle regions which
+        * means we must not trace H_CEDE.
+        */
+       return plpar_hcall_norets_notrace(H_CEDE);
 }
 
 static inline long extended_cede_processor(unsigned long latency_hint)
index 9c9ab27..b476a68 100644 (file)
@@ -19,6 +19,7 @@
 #ifndef _ASM_POWERPC_PTRACE_H
 #define _ASM_POWERPC_PTRACE_H
 
+#include <linux/err.h>
 #include <uapi/asm/ptrace.h>
 #include <asm/asm-const.h>
 
@@ -152,25 +153,6 @@ extern unsigned long profile_pc(struct pt_regs *regs);
 long do_syscall_trace_enter(struct pt_regs *regs);
 void do_syscall_trace_leave(struct pt_regs *regs);
 
-#define kernel_stack_pointer(regs) ((regs)->gpr[1])
-static inline int is_syscall_success(struct pt_regs *regs)
-{
-       return !(regs->ccr & 0x10000000);
-}
-
-static inline long regs_return_value(struct pt_regs *regs)
-{
-       if (is_syscall_success(regs))
-               return regs->gpr[3];
-       else
-               return -regs->gpr[3];
-}
-
-static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)
-{
-       regs->gpr[3] = rc;
-}
-
 #ifdef __powerpc64__
 #define user_mode(regs) ((((regs)->msr) >> MSR_PR_LG) & 0x1)
 #else
@@ -235,6 +217,31 @@ static __always_inline void set_trap_norestart(struct pt_regs *regs)
        regs->trap |= 0x1;
 }
 
+#define kernel_stack_pointer(regs) ((regs)->gpr[1])
+static inline int is_syscall_success(struct pt_regs *regs)
+{
+       if (trap_is_scv(regs))
+               return !IS_ERR_VALUE((unsigned long)regs->gpr[3]);
+       else
+               return !(regs->ccr & 0x10000000);
+}
+
+static inline long regs_return_value(struct pt_regs *regs)
+{
+       if (trap_is_scv(regs))
+               return regs->gpr[3];
+
+       if (is_syscall_success(regs))
+               return regs->gpr[3];
+       else
+               return -regs->gpr[3];
+}
+
+static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)
+{
+       regs->gpr[3] = rc;
+}
+
 #define arch_has_single_step() (1)
 #define arch_has_block_step()  (true)
 #define ARCH_HAS_USER_SINGLE_STEP_REPORT
index fd1b518..ba0f88f 100644 (file)
@@ -41,11 +41,17 @@ static inline void syscall_rollback(struct task_struct *task,
 static inline long syscall_get_error(struct task_struct *task,
                                     struct pt_regs *regs)
 {
-       /*
-        * If the system call failed,
-        * regs->gpr[3] contains a positive ERRORCODE.
-        */
-       return (regs->ccr & 0x10000000UL) ? -regs->gpr[3] : 0;
+       if (trap_is_scv(regs)) {
+               unsigned long error = regs->gpr[3];
+
+               return IS_ERR_VALUE(error) ? error : 0;
+       } else {
+               /*
+                * If the system call failed,
+                * regs->gpr[3] contains a positive ERRORCODE.
+                */
+               return (regs->ccr & 0x10000000UL) ? -regs->gpr[3] : 0;
+       }
 }
 
 static inline long syscall_get_return_value(struct task_struct *task,
@@ -58,18 +64,22 @@ static inline void syscall_set_return_value(struct task_struct *task,
                                            struct pt_regs *regs,
                                            int error, long val)
 {
-       /*
-        * In the general case it's not obvious that we must deal with CCR
-        * here, as the syscall exit path will also do that for us. However
-        * there are some places, eg. the signal code, which check ccr to
-        * decide if the value in r3 is actually an error.
-        */
-       if (error) {
-               regs->ccr |= 0x10000000L;
-               regs->gpr[3] = error;
+       if (trap_is_scv(regs)) {
+               regs->gpr[3] = (long) error ?: val;
        } else {
-               regs->ccr &= ~0x10000000L;
-               regs->gpr[3] = val;
+               /*
+                * In the general case it's not obvious that we must deal with
+                * CCR here, as the syscall exit path will also do that for us.
+                * However there are some places, eg. the signal code, which
+                * check ccr to decide if the value in r3 is actually an error.
+                */
+               if (error) {
+                       regs->ccr |= 0x10000000L;
+                       regs->gpr[3] = error;
+               } else {
+                       regs->ccr &= ~0x10000000L;
+                       regs->gpr[3] = val;
+               }
        }
 }
 
index a09e424..22c79ab 100644 (file)
@@ -157,7 +157,7 @@ do {                                                                \
                "2:     lwz%X1 %L0, %L1\n"                      \
                EX_TABLE(1b, %l2)                               \
                EX_TABLE(2b, %l2)                               \
-               : "=r" (x)                                      \
+               : "=&r" (x)                                     \
                : "m" (*addr)                                   \
                :                                               \
                : label)
index 7c3654b..f1ae710 100644 (file)
@@ -340,6 +340,12 @@ ret_from_mc_except:
        andi.   r10,r10,IRQS_DISABLED;  /* yes -> go out of line */ \
        bne     masked_interrupt_book3e_##n
 
+/*
+ * Additional regs must be re-loaded from paca before EXCEPTION_COMMON* is
+ * called, because that does SAVE_NVGPRS which must see the original register
+ * values, otherwise the scratch values might be restored when exiting the
+ * interrupt.
+ */
 #define PROLOG_ADDITION_2REGS_GEN(n)                                       \
        std     r14,PACA_EXGEN+EX_R14(r13);                                 \
        std     r15,PACA_EXGEN+EX_R15(r13)
@@ -535,6 +541,10 @@ __end_interrupts:
                                PROLOG_ADDITION_2REGS)
        mfspr   r14,SPRN_DEAR
        mfspr   r15,SPRN_ESR
+       std     r14,_DAR(r1)
+       std     r15,_DSISR(r1)
+       ld      r14,PACA_EXGEN+EX_R14(r13)
+       ld      r15,PACA_EXGEN+EX_R15(r13)
        EXCEPTION_COMMON(0x300)
        b       storage_fault_common
 
@@ -544,6 +554,10 @@ __end_interrupts:
                                PROLOG_ADDITION_2REGS)
        li      r15,0
        mr      r14,r10
+       std     r14,_DAR(r1)
+       std     r15,_DSISR(r1)
+       ld      r14,PACA_EXGEN+EX_R14(r13)
+       ld      r15,PACA_EXGEN+EX_R15(r13)
        EXCEPTION_COMMON(0x400)
        b       storage_fault_common
 
@@ -557,6 +571,10 @@ __end_interrupts:
                                PROLOG_ADDITION_2REGS)
        mfspr   r14,SPRN_DEAR
        mfspr   r15,SPRN_ESR
+       std     r14,_DAR(r1)
+       std     r15,_DSISR(r1)
+       ld      r14,PACA_EXGEN+EX_R14(r13)
+       ld      r15,PACA_EXGEN+EX_R15(r13)
        EXCEPTION_COMMON(0x600)
        b       alignment_more  /* no room, go out of line */
 
@@ -565,10 +583,10 @@ __end_interrupts:
        NORMAL_EXCEPTION_PROLOG(0x700, BOOKE_INTERRUPT_PROGRAM,
                                PROLOG_ADDITION_1REG)
        mfspr   r14,SPRN_ESR
-       EXCEPTION_COMMON(0x700)
        std     r14,_DSISR(r1)
-       addi    r3,r1,STACK_FRAME_OVERHEAD
        ld      r14,PACA_EXGEN+EX_R14(r13)
+       EXCEPTION_COMMON(0x700)
+       addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      program_check_exception
        REST_NVGPRS(r1)
        b       interrupt_return
@@ -725,11 +743,11 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
         * normal exception
         */
        mfspr   r14,SPRN_DBSR
-       EXCEPTION_COMMON_CRIT(0xd00)
        std     r14,_DSISR(r1)
-       addi    r3,r1,STACK_FRAME_OVERHEAD
        ld      r14,PACA_EXCRIT+EX_R14(r13)
        ld      r15,PACA_EXCRIT+EX_R15(r13)
+       EXCEPTION_COMMON_CRIT(0xd00)
+       addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      DebugException
        REST_NVGPRS(r1)
        b       interrupt_return
@@ -796,11 +814,11 @@ kernel_dbg_exc:
         * normal exception
         */
        mfspr   r14,SPRN_DBSR
-       EXCEPTION_COMMON_DBG(0xd08)
        std     r14,_DSISR(r1)
-       addi    r3,r1,STACK_FRAME_OVERHEAD
        ld      r14,PACA_EXDBG+EX_R14(r13)
        ld      r15,PACA_EXDBG+EX_R15(r13)
+       EXCEPTION_COMMON_DBG(0xd08)
+       addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      DebugException
        REST_NVGPRS(r1)
        b       interrupt_return
@@ -931,11 +949,7 @@ masked_interrupt_book3e_0x2c0:
  * original values stashed away in the PACA
  */
 storage_fault_common:
-       std     r14,_DAR(r1)
-       std     r15,_DSISR(r1)
        addi    r3,r1,STACK_FRAME_OVERHEAD
-       ld      r14,PACA_EXGEN+EX_R14(r13)
-       ld      r15,PACA_EXGEN+EX_R15(r13)
        bl      do_page_fault
        b       interrupt_return
 
@@ -944,11 +958,7 @@ storage_fault_common:
  * continues here.
  */
 alignment_more:
-       std     r14,_DAR(r1)
-       std     r15,_DSISR(r1)
        addi    r3,r1,STACK_FRAME_OVERHEAD
-       ld      r14,PACA_EXGEN+EX_R14(r13)
-       ld      r15,PACA_EXGEN+EX_R15(r13)
        bl      alignment_exception
        REST_NVGPRS(r1)
        b       interrupt_return
index e4559f8..e0938ba 100644 (file)
@@ -34,9 +34,6 @@ notrace long system_call_exception(long r3, long r4, long r5,
        syscall_fn f;
 
        kuep_lock();
-#ifdef CONFIG_PPC32
-       kuap_save_and_lock(regs);
-#endif
 
        regs->orig_gpr3 = r3;
 
@@ -427,6 +424,7 @@ again:
 
        /* Restore user access locks last */
        kuap_user_restore(regs);
+       kuep_unlock();
 
        return ret;
 }
index 8b2c1a8..cfc03e0 100644 (file)
@@ -356,13 +356,16 @@ static void __init setup_legacy_serial_console(int console)
 
 static int __init ioremap_legacy_serial_console(void)
 {
-       struct legacy_serial_info *info = &legacy_serial_infos[legacy_serial_console];
-       struct plat_serial8250_port *port = &legacy_serial_ports[legacy_serial_console];
+       struct plat_serial8250_port *port;
+       struct legacy_serial_info *info;
        void __iomem *vaddr;
 
        if (legacy_serial_console < 0)
                return 0;
 
+       info = &legacy_serial_infos[legacy_serial_console];
+       port = &legacy_serial_ports[legacy_serial_console];
+
        if (!info->early_addr)
                return 0;
 
index b779d25..e42b85e 100644 (file)
@@ -369,11 +369,11 @@ void __init early_setup(unsigned long dt_ptr)
        apply_feature_fixups();
        setup_feature_keys();
 
-       early_ioremap_setup();
-
        /* Initialize the hash table or TLB handling */
        early_init_mmu();
 
+       early_ioremap_setup();
+
        /*
         * After firmware and early platform setup code has set things up,
         * we note the SPR values for configurable control/performance
index f4aafa3..1f07317 100644 (file)
@@ -166,9 +166,9 @@ copy_ckfpr_from_user(struct task_struct *task, void __user *from)
 }
 #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
 #else
-#define unsafe_copy_fpr_to_user(to, task, label) do { } while (0)
+#define unsafe_copy_fpr_to_user(to, task, label) do { if (0) goto label;} while (0)
 
-#define unsafe_copy_fpr_from_user(task, from, label) do { } while (0)
+#define unsafe_copy_fpr_from_user(task, from, label) do { if (0) goto label;} while (0)
 
 static inline unsigned long
 copy_fpr_to_user(void __user *to, struct task_struct *task)
index 2e68fbb..8f052ff 100644 (file)
 440    common  process_madvise                 sys_process_madvise
 441    common  epoll_pwait2                    sys_epoll_pwait2                compat_sys_epoll_pwait2
 442    common  mount_setattr                   sys_mount_setattr
-443    common  quotactl_path                   sys_quotactl_path
+# 443 reserved for quotactl_path
 444    common  landlock_create_ruleset         sys_landlock_create_ruleset
 445    common  landlock_add_rule               sys_landlock_add_rule
 446    common  landlock_restrict_self          sys_landlock_restrict_self
index 2d9193c..c63e263 100644 (file)
@@ -840,7 +840,7 @@ bool kvm_unmap_gfn_range_hv(struct kvm *kvm, struct kvm_gfn_range *range)
                        kvm_unmap_radix(kvm, range->slot, gfn);
        } else {
                for (gfn = range->start; gfn < range->end; gfn++)
-                       kvm_unmap_rmapp(kvm, range->slot, range->start);
+                       kvm_unmap_rmapp(kvm, range->slot, gfn);
        }
 
        return false;
index 1fd31b4..fe26f2f 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/string.h>
 #include <linux/init.h>
 #include <linux/sched/mm.h>
+#include <linux/stop_machine.h>
 #include <asm/cputable.h>
 #include <asm/code-patching.h>
 #include <asm/page.h>
@@ -149,17 +150,17 @@ static void do_stf_entry_barrier_fixups(enum stf_barrier_type types)
 
                pr_devel("patching dest %lx\n", (unsigned long)dest);
 
-               patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0]));
-
-               if (types & STF_BARRIER_FALLBACK)
+               // See comment in do_entry_flush_fixups() RE order of patching
+               if (types & STF_BARRIER_FALLBACK) {
+                       patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0]));
+                       patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
                        patch_branch((struct ppc_inst *)(dest + 1),
-                                    (unsigned long)&stf_barrier_fallback,
-                                    BRANCH_SET_LINK);
-               else
-                       patch_instruction((struct ppc_inst *)(dest + 1),
-                                         ppc_inst(instrs[1]));
-
-               patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
+                                    (unsigned long)&stf_barrier_fallback, BRANCH_SET_LINK);
+               } else {
+                       patch_instruction((struct ppc_inst *)(dest + 1), ppc_inst(instrs[1]));
+                       patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
+                       patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0]));
+               }
        }
 
        printk(KERN_DEBUG "stf-barrier: patched %d entry locations (%s barrier)\n", i,
@@ -227,11 +228,25 @@ static void do_stf_exit_barrier_fixups(enum stf_barrier_type types)
                                                           : "unknown");
 }
 
+static int __do_stf_barrier_fixups(void *data)
+{
+       enum stf_barrier_type *types = data;
+
+       do_stf_entry_barrier_fixups(*types);
+       do_stf_exit_barrier_fixups(*types);
+
+       return 0;
+}
 
 void do_stf_barrier_fixups(enum stf_barrier_type types)
 {
-       do_stf_entry_barrier_fixups(types);
-       do_stf_exit_barrier_fixups(types);
+       /*
+        * The call to the fallback entry flush, and the fallback/sync-ori exit
+        * flush can not be safely patched in/out while other CPUs are executing
+        * them. So call __do_stf_barrier_fixups() on one CPU while all other CPUs
+        * spin in the stop machine core with interrupts hard disabled.
+        */
+       stop_machine(__do_stf_barrier_fixups, &types, NULL);
 }
 
 void do_uaccess_flush_fixups(enum l1d_flush_type types)
@@ -284,8 +299,9 @@ void do_uaccess_flush_fixups(enum l1d_flush_type types)
                                                : "unknown");
 }
 
-void do_entry_flush_fixups(enum l1d_flush_type types)
+static int __do_entry_flush_fixups(void *data)
 {
+       enum l1d_flush_type types = *(enum l1d_flush_type *)data;
        unsigned int instrs[3], *dest;
        long *start, *end;
        int i;
@@ -309,6 +325,31 @@ void do_entry_flush_fixups(enum l1d_flush_type types)
        if (types & L1D_FLUSH_MTTRIG)
                instrs[i++] = 0x7c12dba6; /* mtspr TRIG2,r0 (SPR #882) */
 
+       /*
+        * If we're patching in or out the fallback flush we need to be careful about the
+        * order in which we patch instructions. That's because it's possible we could
+        * take a page fault after patching one instruction, so the sequence of
+        * instructions must be safe even in a half patched state.
+        *
+        * To make that work, when patching in the fallback flush we patch in this order:
+        *  - the mflr          (dest)
+        *  - the mtlr          (dest + 2)
+        *  - the branch        (dest + 1)
+        *
+        * That ensures the sequence is safe to execute at any point. In contrast if we
+        * patch the mtlr last, it's possible we could return from the branch and not
+        * restore LR, leading to a crash later.
+        *
+        * When patching out the fallback flush (either with nops or another flush type),
+        * we patch in this order:
+        *  - the branch        (dest + 1)
+        *  - the mtlr          (dest + 2)
+        *  - the mflr          (dest)
+        *
+        * Note we are protected by stop_machine() from other CPUs executing the code in a
+        * semi-patched state.
+        */
+
        start = PTRRELOC(&__start___entry_flush_fixup);
        end = PTRRELOC(&__stop___entry_flush_fixup);
        for (i = 0; start < end; start++, i++) {
@@ -316,15 +357,16 @@ void do_entry_flush_fixups(enum l1d_flush_type types)
 
                pr_devel("patching dest %lx\n", (unsigned long)dest);
 
-               patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0]));
-
-               if (types == L1D_FLUSH_FALLBACK)
-                       patch_branch((struct ppc_inst *)(dest + 1), (unsigned long)&entry_flush_fallback,
-                                    BRANCH_SET_LINK);
-               else
+               if (types == L1D_FLUSH_FALLBACK) {
+                       patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0]));
+                       patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
+                       patch_branch((struct ppc_inst *)(dest + 1),
+                                    (unsigned long)&entry_flush_fallback, BRANCH_SET_LINK);
+               } else {
                        patch_instruction((struct ppc_inst *)(dest + 1), ppc_inst(instrs[1]));
-
-               patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
+                       patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
+                       patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0]));
+               }
        }
 
        start = PTRRELOC(&__start___scv_entry_flush_fixup);
@@ -334,15 +376,16 @@ void do_entry_flush_fixups(enum l1d_flush_type types)
 
                pr_devel("patching dest %lx\n", (unsigned long)dest);
 
-               patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0]));
-
-               if (types == L1D_FLUSH_FALLBACK)
-                       patch_branch((struct ppc_inst *)(dest + 1), (unsigned long)&scv_entry_flush_fallback,
-                                    BRANCH_SET_LINK);
-               else
+               if (types == L1D_FLUSH_FALLBACK) {
+                       patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0]));
+                       patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
+                       patch_branch((struct ppc_inst *)(dest + 1),
+                                    (unsigned long)&scv_entry_flush_fallback, BRANCH_SET_LINK);
+               } else {
                        patch_instruction((struct ppc_inst *)(dest + 1), ppc_inst(instrs[1]));
-
-               patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
+                       patch_instruction((struct ppc_inst *)(dest + 2), ppc_inst(instrs[2]));
+                       patch_instruction((struct ppc_inst *)dest, ppc_inst(instrs[0]));
+               }
        }
 
 
@@ -354,6 +397,19 @@ void do_entry_flush_fixups(enum l1d_flush_type types)
                                                        : "ori type" :
                (types &  L1D_FLUSH_MTTRIG)     ? "mttrig type"
                                                : "unknown");
+
+       return 0;
+}
+
+void do_entry_flush_fixups(enum l1d_flush_type types)
+{
+       /*
+        * The call to the fallback flush can not be safely patched in/out while
+        * other CPUs are executing it. So call __do_entry_flush_fixups() on one
+        * CPU while all other CPUs spin in the stop machine core with interrupts
+        * hard disabled.
+        */
+       stop_machine(__do_entry_flush_fixups, &types, NULL);
 }
 
 void do_rfi_flush_fixups(enum l1d_flush_type types)
index 2136e42..8a2b8d6 100644 (file)
@@ -102,6 +102,16 @@ END_FTR_SECTION(0, 1);                                             \
 #define HCALL_BRANCH(LABEL)
 #endif
 
+_GLOBAL_TOC(plpar_hcall_norets_notrace)
+       HMT_MEDIUM
+
+       mfcr    r0
+       stw     r0,8(r1)
+       HVSC                            /* invoke the hypervisor */
+       lwz     r0,8(r1)
+       mtcrf   0xff,r0
+       blr                             /* return r3 = status */
+
 _GLOBAL_TOC(plpar_hcall_norets)
        HMT_MEDIUM
 
index 1f3152a..dab356e 100644 (file)
@@ -1829,30 +1829,28 @@ void hcall_tracepoint_unregfunc(void)
 #endif
 
 /*
- * Since the tracing code might execute hcalls we need to guard against
- * recursion. One example of this are spinlocks calling H_YIELD on
- * shared processor partitions.
+ * Keep track of hcall tracing depth and prevent recursion. Warn if any is
+ * detected because it may indicate a problem. This will not catch all
+ * problems with tracing code making hcalls, because the tracing might have
+ * been invoked from a non-hcall, so the first hcall could recurse into it
+ * without warning here, but this better than nothing.
+ *
+ * Hcalls with specific problems being traced should use the _notrace
+ * plpar_hcall variants.
  */
 static DEFINE_PER_CPU(unsigned int, hcall_trace_depth);
 
 
-void __trace_hcall_entry(unsigned long opcode, unsigned long *args)
+notrace void __trace_hcall_entry(unsigned long opcode, unsigned long *args)
 {
        unsigned long flags;
        unsigned int *depth;
 
-       /*
-        * We cannot call tracepoints inside RCU idle regions which
-        * means we must not trace H_CEDE.
-        */
-       if (opcode == H_CEDE)
-               return;
-
        local_irq_save(flags);
 
        depth = this_cpu_ptr(&hcall_trace_depth);
 
-       if (*depth)
+       if (WARN_ON_ONCE(*depth))
                goto out;
 
        (*depth)++;
@@ -1864,19 +1862,16 @@ out:
        local_irq_restore(flags);
 }
 
-void __trace_hcall_exit(long opcode, long retval, unsigned long *retbuf)
+notrace void __trace_hcall_exit(long opcode, long retval, unsigned long *retbuf)
 {
        unsigned long flags;
        unsigned int *depth;
 
-       if (opcode == H_CEDE)
-               return;
-
        local_irq_save(flags);
 
        depth = this_cpu_ptr(&hcall_trace_depth);
 
-       if (*depth)
+       if (*depth) /* Don't warn again on the way out */
                goto out;
 
        (*depth)++;
index 7e4a2ab..0690263 100644 (file)
 440  common    process_madvise         sys_process_madvise             sys_process_madvise
 441  common    epoll_pwait2            sys_epoll_pwait2                compat_sys_epoll_pwait2
 442  common    mount_setattr           sys_mount_setattr               sys_mount_setattr
-443  common    quotactl_path           sys_quotactl_path               sys_quotactl_path
+# 443 reserved for quotactl_path
 444  common    landlock_create_ruleset sys_landlock_create_ruleset     sys_landlock_create_ruleset
 445  common    landlock_add_rule       sys_landlock_add_rule           sys_landlock_add_rule
 446  common    landlock_restrict_self  sys_landlock_restrict_self      sys_landlock_restrict_self
index f47a0dc..0b91499 100644 (file)
 440    common  process_madvise                 sys_process_madvise
 441    common  epoll_pwait2                    sys_epoll_pwait2
 442    common  mount_setattr                   sys_mount_setattr
-443    common  quotactl_path                   sys_quotactl_path
+# 443 reserved for quotactl_path
 444    common  landlock_create_ruleset         sys_landlock_create_ruleset
 445    common  landlock_add_rule               sys_landlock_add_rule
 446    common  landlock_restrict_self          sys_landlock_restrict_self
index f5beecd..e76b221 100644 (file)
@@ -180,7 +180,6 @@ static inline void arch_ftrace_nmi_exit(void) { }
 
 BUILD_TRAP_HANDLER(nmi)
 {
-       unsigned int cpu = smp_processor_id();
        TRAP_HANDLER_DECL;
 
        arch_ftrace_nmi_enter();
index b9e1c0e..e34cc30 100644 (file)
 440    common  process_madvise                 sys_process_madvise
 441    common  epoll_pwait2                    sys_epoll_pwait2                compat_sys_epoll_pwait2
 442    common  mount_setattr                   sys_mount_setattr
-443    common  quotactl_path                   sys_quotactl_path
+# 443 reserved for quotactl_path
 444    common  landlock_create_ruleset         sys_landlock_create_ruleset
 445    common  landlock_add_rule               sys_landlock_add_rule
 446    common  landlock_restrict_self          sys_landlock_restrict_self
index c77c5d8..3075294 100644 (file)
@@ -178,11 +178,6 @@ ifeq ($(ACCUMULATE_OUTGOING_ARGS), 1)
        KBUILD_CFLAGS += $(call cc-option,-maccumulate-outgoing-args,)
 endif
 
-ifdef CONFIG_LTO_CLANG
-KBUILD_LDFLAGS += -plugin-opt=-code-model=kernel \
-                  -plugin-opt=-stack-alignment=$(if $(CONFIG_X86_32),4,8)
-endif
-
 # Workaround for a gcc prelease that unfortunately was shipped in a suse release
 KBUILD_CFLAGS += -Wno-sign-compare
 #
@@ -202,7 +197,12 @@ ifdef CONFIG_RETPOLINE
   endif
 endif
 
-KBUILD_LDFLAGS := -m elf_$(UTS_MACHINE)
+KBUILD_LDFLAGS += -m elf_$(UTS_MACHINE)
+
+ifdef CONFIG_LTO_CLANG
+KBUILD_LDFLAGS += -plugin-opt=-code-model=kernel \
+                  -plugin-opt=-stack-alignment=$(if $(CONFIG_X86_32),4,8)
+endif
 
 ifdef CONFIG_X86_NEED_RELOCS
 LDFLAGS_vmlinux := --emit-relocs --discard-none
index 6e5522a..431bf7f 100644 (file)
@@ -30,6 +30,7 @@ targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma \
 
 KBUILD_CFLAGS := -m$(BITS) -O2
 KBUILD_CFLAGS += -fno-strict-aliasing -fPIE
+KBUILD_CFLAGS += -Wundef
 KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
 cflags-$(CONFIG_X86_32) := -march=i386
 cflags-$(CONFIG_X86_64) := -mcmodel=small -mno-red-zone
@@ -48,10 +49,10 @@ KBUILD_CFLAGS += $(call as-option,-Wa$(comma)-mrelax-relocations=no)
 KBUILD_CFLAGS += -include $(srctree)/include/linux/hidden.h
 KBUILD_CFLAGS += $(CLANG_FLAGS)
 
-# sev-es.c indirectly inludes inat-table.h which is generated during
+# sev.c indirectly inludes inat-table.h which is generated during
 # compilation and stored in $(objtree). Add the directory to the includes so
 # that the compiler finds it even with out-of-tree builds (make O=/some/path).
-CFLAGS_sev-es.o += -I$(objtree)/arch/x86/lib/
+CFLAGS_sev.o += -I$(objtree)/arch/x86/lib/
 
 KBUILD_AFLAGS  := $(KBUILD_CFLAGS) -D__ASSEMBLY__
 GCOV_PROFILE := n
@@ -93,7 +94,7 @@ ifdef CONFIG_X86_64
        vmlinux-objs-y += $(obj)/idt_64.o $(obj)/idt_handlers_64.o
        vmlinux-objs-y += $(obj)/mem_encrypt.o
        vmlinux-objs-y += $(obj)/pgtable_64.o
-       vmlinux-objs-$(CONFIG_AMD_MEM_ENCRYPT) += $(obj)/sev-es.o
+       vmlinux-objs-$(CONFIG_AMD_MEM_ENCRYPT) += $(obj)/sev.o
 endif
 
 vmlinux-objs-$(CONFIG_ACPI) += $(obj)/acpi.o
index dde042f..743f13e 100644 (file)
@@ -172,7 +172,7 @@ void __puthex(unsigned long value)
        }
 }
 
-#if CONFIG_X86_NEED_RELOCS
+#ifdef CONFIG_X86_NEED_RELOCS
 static void handle_relocations(void *output, unsigned long output_len,
                               unsigned long virt_addr)
 {
index e5612f0..3113925 100644 (file)
@@ -79,7 +79,7 @@ struct mem_vector {
        u64 size;
 };
 
-#if CONFIG_RANDOMIZE_BASE
+#ifdef CONFIG_RANDOMIZE_BASE
 /* kaslr.c */
 void choose_random_location(unsigned long input,
                            unsigned long input_size,
similarity index 98%
rename from arch/x86/boot/compressed/sev-es.c
rename to arch/x86/boot/compressed/sev.c
index 82041bd..670e998 100644 (file)
@@ -13,7 +13,7 @@
 #include "misc.h"
 
 #include <asm/pgtable_types.h>
-#include <asm/sev-es.h>
+#include <asm/sev.h>
 #include <asm/trapnr.h>
 #include <asm/trap_pf.h>
 #include <asm/msr-index.h>
@@ -117,7 +117,7 @@ static enum es_result vc_read_mem(struct es_em_ctxt *ctxt,
 #include "../../lib/insn.c"
 
 /* Include code for early handlers */
-#include "../../kernel/sev-es-shared.c"
+#include "../../kernel/sev-shared.c"
 
 static bool early_setup_sev_es(void)
 {
index 28a1423..4bbc267 100644 (file)
 440    i386    process_madvise         sys_process_madvise
 441    i386    epoll_pwait2            sys_epoll_pwait2                compat_sys_epoll_pwait2
 442    i386    mount_setattr           sys_mount_setattr
-443    i386    quotactl_path           sys_quotactl_path
+# 443 reserved for quotactl_path
 444    i386    landlock_create_ruleset sys_landlock_create_ruleset
 445    i386    landlock_add_rule       sys_landlock_add_rule
 446    i386    landlock_restrict_self  sys_landlock_restrict_self
index ecd551b..ce18119 100644 (file)
 440    common  process_madvise         sys_process_madvise
 441    common  epoll_pwait2            sys_epoll_pwait2
 442    common  mount_setattr           sys_mount_setattr
-443    common  quotactl_path           sys_quotactl_path
+# 443 reserved for quotactl_path
 444    common  landlock_create_ruleset sys_landlock_create_ruleset
 445    common  landlock_add_rule       sys_landlock_add_rule
 446    common  landlock_restrict_self  sys_landlock_restrict_self
index 8e50932..8f71dd7 100644 (file)
@@ -396,10 +396,12 @@ int x86_reserve_hardware(void)
        if (!atomic_inc_not_zero(&pmc_refcount)) {
                mutex_lock(&pmc_reserve_mutex);
                if (atomic_read(&pmc_refcount) == 0) {
-                       if (!reserve_pmc_hardware())
+                       if (!reserve_pmc_hardware()) {
                                err = -EBUSY;
-                       else
+                       } else {
                                reserve_ds_buffers();
+                               reserve_lbr_buffers();
+                       }
                }
                if (!err)
                        atomic_inc(&pmc_refcount);
index 2521d03..e288922 100644 (file)
@@ -6253,7 +6253,7 @@ __init int intel_pmu_init(void)
         * Check all LBT MSR here.
         * Disable LBR access if any LBR MSRs can not be accessed.
         */
-       if (x86_pmu.lbr_nr && !check_msr(x86_pmu.lbr_tos, 0x3UL))
+       if (x86_pmu.lbr_tos && !check_msr(x86_pmu.lbr_tos, 0x3UL))
                x86_pmu.lbr_nr = 0;
        for (i = 0; i < x86_pmu.lbr_nr; i++) {
                if (!(check_msr(x86_pmu.lbr_from + i, 0xffffUL) &&
index 76dbab6..4409d2c 100644 (file)
@@ -658,7 +658,6 @@ static inline bool branch_user_callstack(unsigned br_sel)
 
 void intel_pmu_lbr_add(struct perf_event *event)
 {
-       struct kmem_cache *kmem_cache = event->pmu->task_ctx_cache;
        struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
 
        if (!x86_pmu.lbr_nr)
@@ -696,11 +695,6 @@ void intel_pmu_lbr_add(struct perf_event *event)
        perf_sched_cb_inc(event->ctx->pmu);
        if (!cpuc->lbr_users++ && !event->total_time_running)
                intel_pmu_lbr_reset();
-
-       if (static_cpu_has(X86_FEATURE_ARCH_LBR) &&
-           kmem_cache && !cpuc->lbr_xsave &&
-           (cpuc->lbr_users != cpuc->lbr_pebs_users))
-               cpuc->lbr_xsave = kmem_cache_alloc(kmem_cache, GFP_KERNEL);
 }
 
 void release_lbr_buffers(void)
@@ -722,6 +716,26 @@ void release_lbr_buffers(void)
        }
 }
 
+void reserve_lbr_buffers(void)
+{
+       struct kmem_cache *kmem_cache;
+       struct cpu_hw_events *cpuc;
+       int cpu;
+
+       if (!static_cpu_has(X86_FEATURE_ARCH_LBR))
+               return;
+
+       for_each_possible_cpu(cpu) {
+               cpuc = per_cpu_ptr(&cpu_hw_events, cpu);
+               kmem_cache = x86_get_pmu(cpu)->task_ctx_cache;
+               if (!kmem_cache || cpuc->lbr_xsave)
+                       continue;
+
+               cpuc->lbr_xsave = kmem_cache_alloc_node(kmem_cache, GFP_KERNEL,
+                                                       cpu_to_node(cpu));
+       }
+}
+
 void intel_pmu_lbr_del(struct perf_event *event)
 {
        struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
index 27fa85e..ad87cb3 100644 (file)
@@ -1244,6 +1244,8 @@ void reserve_ds_buffers(void);
 
 void release_lbr_buffers(void);
 
+void reserve_lbr_buffers(void);
+
 extern struct event_constraint bts_constraint;
 extern struct event_constraint vlbr_constraint;
 
@@ -1393,6 +1395,10 @@ static inline void release_lbr_buffers(void)
 {
 }
 
+static inline void reserve_lbr_buffers(void)
+{
+}
+
 static inline int intel_pmu_init(void)
 {
        return 0;
index cbbcee0..55efbac 100644 (file)
 #define VALID_PAGE(x) ((x) != INVALID_PAGE)
 
 #define UNMAPPED_GVA (~(gpa_t)0)
+#define INVALID_GPA (~(gpa_t)0)
 
 /* KVM Hugepage definitions for x86 */
 #define KVM_MAX_HUGEPAGE_LEVEL PG_LEVEL_1G
@@ -199,6 +200,7 @@ enum x86_intercept_stage;
 
 #define KVM_NR_DB_REGS 4
 
+#define DR6_BUS_LOCK   (1 << 11)
 #define DR6_BD         (1 << 13)
 #define DR6_BS         (1 << 14)
 #define DR6_BT         (1 << 15)
@@ -212,7 +214,7 @@ enum x86_intercept_stage;
  * DR6_ACTIVE_LOW is also used as the init/reset value for DR6.
  */
 #define DR6_ACTIVE_LOW 0xffff0ff0
-#define DR6_VOLATILE   0x0001e00f
+#define DR6_VOLATILE   0x0001e80f
 #define DR6_FIXED_1    (DR6_ACTIVE_LOW & ~DR6_VOLATILE)
 
 #define DR7_BP_EN_MASK 0x000000ff
@@ -407,7 +409,7 @@ struct kvm_mmu {
        u32 pkru_mask;
 
        u64 *pae_root;
-       u64 *lm_root;
+       u64 *pml4_root;
 
        /*
         * check zero bits on shadow page table entries, these
@@ -1417,6 +1419,7 @@ struct kvm_arch_async_pf {
        bool direct_map;
 };
 
+extern u32 __read_mostly kvm_nr_uret_msrs;
 extern u64 __read_mostly host_efer;
 extern bool __read_mostly allow_smaller_maxphyaddr;
 extern struct kvm_x86_ops kvm_x86_ops;
@@ -1775,9 +1778,15 @@ int kvm_pv_send_ipi(struct kvm *kvm, unsigned long ipi_bitmap_low,
                    unsigned long ipi_bitmap_high, u32 min,
                    unsigned long icr, int op_64_bit);
 
-void kvm_define_user_return_msr(unsigned index, u32 msr);
+int kvm_add_user_return_msr(u32 msr);
+int kvm_find_user_return_msr(u32 msr);
 int kvm_set_user_return_msr(unsigned index, u64 val, u64 mask);
 
+static inline bool kvm_is_supported_user_return_msr(u32 msr)
+{
+       return kvm_find_user_return_msr(msr) >= 0;
+}
+
 u64 kvm_scale_tsc(struct kvm_vcpu *vcpu, u64 tsc);
 u64 kvm_read_l1_tsc(struct kvm_vcpu *vcpu, u64 host_tsc);
 
index 3381198..6929987 100644 (file)
@@ -7,8 +7,6 @@
 #include <linux/interrupt.h>
 #include <uapi/asm/kvm_para.h>
 
-extern void kvmclock_init(void);
-
 #ifdef CONFIG_KVM_GUEST
 bool kvm_check_and_clear_guest_paused(void);
 #else
@@ -86,13 +84,14 @@ static inline long kvm_hypercall4(unsigned int nr, unsigned long p1,
 }
 
 #ifdef CONFIG_KVM_GUEST
+void kvmclock_init(void);
+void kvmclock_disable(void);
 bool kvm_para_available(void);
 unsigned int kvm_arch_para_features(void);
 unsigned int kvm_arch_para_hints(void);
 void kvm_async_pf_task_wait_schedule(u32 token);
 void kvm_async_pf_task_wake(u32 token);
 u32 kvm_read_and_reset_apf_flags(void);
-void kvm_disable_steal_time(void);
 bool __kvm_handle_async_pf(struct pt_regs *regs, u32 token);
 
 DECLARE_STATIC_KEY_FALSE(kvm_async_pf_enabled);
@@ -137,11 +136,6 @@ static inline u32 kvm_read_and_reset_apf_flags(void)
        return 0;
 }
 
-static inline void kvm_disable_steal_time(void)
-{
-       return;
-}
-
 static __always_inline bool kvm_handle_async_pf(struct pt_regs *regs, u32 token)
 {
        return false;
index 742d89a..211ba33 100644 (file)
 /* K8 MSRs */
 #define MSR_K8_TOP_MEM1                        0xc001001a
 #define MSR_K8_TOP_MEM2                        0xc001001d
-#define MSR_K8_SYSCFG                  0xc0010010
-#define MSR_K8_SYSCFG_MEM_ENCRYPT_BIT  23
-#define MSR_K8_SYSCFG_MEM_ENCRYPT      BIT_ULL(MSR_K8_SYSCFG_MEM_ENCRYPT_BIT)
+#define MSR_AMD64_SYSCFG               0xc0010010
+#define MSR_AMD64_SYSCFG_MEM_ENCRYPT_BIT       23
+#define MSR_AMD64_SYSCFG_MEM_ENCRYPT   BIT_ULL(MSR_AMD64_SYSCFG_MEM_ENCRYPT_BIT)
 #define MSR_K8_INT_PENDING_MSG         0xc0010055
 /* C1E active bits in int pending message */
 #define K8_INTP_C1E_ACTIVE_MASK                0x18000000
index 154321d..556b2b1 100644 (file)
@@ -787,8 +787,10 @@ DECLARE_PER_CPU(u64, msr_misc_features_shadow);
 
 #ifdef CONFIG_CPU_SUP_AMD
 extern u32 amd_get_nodes_per_socket(void);
+extern u32 amd_get_highest_perf(void);
 #else
 static inline u32 amd_get_nodes_per_socket(void)       { return 0; }
+static inline u32 amd_get_highest_perf(void)           { return 0; }
 #endif
 
 static inline uint32_t hypervisor_cpuid_base(const char *sig, uint32_t leaves)
diff --git a/arch/x86/include/asm/sev-common.h b/arch/x86/include/asm/sev-common.h
new file mode 100644 (file)
index 0000000..629c3df
--- /dev/null
@@ -0,0 +1,62 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * AMD SEV header common between the guest and the hypervisor.
+ *
+ * Author: Brijesh Singh <brijesh.singh@amd.com>
+ */
+
+#ifndef __ASM_X86_SEV_COMMON_H
+#define __ASM_X86_SEV_COMMON_H
+
+#define GHCB_MSR_INFO_POS              0
+#define GHCB_MSR_INFO_MASK             (BIT_ULL(12) - 1)
+
+#define GHCB_MSR_SEV_INFO_RESP         0x001
+#define GHCB_MSR_SEV_INFO_REQ          0x002
+#define GHCB_MSR_VER_MAX_POS           48
+#define GHCB_MSR_VER_MAX_MASK          0xffff
+#define GHCB_MSR_VER_MIN_POS           32
+#define GHCB_MSR_VER_MIN_MASK          0xffff
+#define GHCB_MSR_CBIT_POS              24
+#define GHCB_MSR_CBIT_MASK             0xff
+#define GHCB_MSR_SEV_INFO(_max, _min, _cbit)                           \
+       ((((_max) & GHCB_MSR_VER_MAX_MASK) << GHCB_MSR_VER_MAX_POS) |   \
+        (((_min) & GHCB_MSR_VER_MIN_MASK) << GHCB_MSR_VER_MIN_POS) |   \
+        (((_cbit) & GHCB_MSR_CBIT_MASK) << GHCB_MSR_CBIT_POS) |        \
+        GHCB_MSR_SEV_INFO_RESP)
+#define GHCB_MSR_INFO(v)               ((v) & 0xfffUL)
+#define GHCB_MSR_PROTO_MAX(v)          (((v) >> GHCB_MSR_VER_MAX_POS) & GHCB_MSR_VER_MAX_MASK)
+#define GHCB_MSR_PROTO_MIN(v)          (((v) >> GHCB_MSR_VER_MIN_POS) & GHCB_MSR_VER_MIN_MASK)
+
+#define GHCB_MSR_CPUID_REQ             0x004
+#define GHCB_MSR_CPUID_RESP            0x005
+#define GHCB_MSR_CPUID_FUNC_POS                32
+#define GHCB_MSR_CPUID_FUNC_MASK       0xffffffff
+#define GHCB_MSR_CPUID_VALUE_POS       32
+#define GHCB_MSR_CPUID_VALUE_MASK      0xffffffff
+#define GHCB_MSR_CPUID_REG_POS         30
+#define GHCB_MSR_CPUID_REG_MASK                0x3
+#define GHCB_CPUID_REQ_EAX             0
+#define GHCB_CPUID_REQ_EBX             1
+#define GHCB_CPUID_REQ_ECX             2
+#define GHCB_CPUID_REQ_EDX             3
+#define GHCB_CPUID_REQ(fn, reg)                \
+               (GHCB_MSR_CPUID_REQ | \
+               (((unsigned long)reg & GHCB_MSR_CPUID_REG_MASK) << GHCB_MSR_CPUID_REG_POS) | \
+               (((unsigned long)fn) << GHCB_MSR_CPUID_FUNC_POS))
+
+#define GHCB_MSR_TERM_REQ              0x100
+#define GHCB_MSR_TERM_REASON_SET_POS   12
+#define GHCB_MSR_TERM_REASON_SET_MASK  0xf
+#define GHCB_MSR_TERM_REASON_POS       16
+#define GHCB_MSR_TERM_REASON_MASK      0xff
+#define GHCB_SEV_TERM_REASON(reason_set, reason_val)                                             \
+       (((((u64)reason_set) &  GHCB_MSR_TERM_REASON_SET_MASK) << GHCB_MSR_TERM_REASON_SET_POS) | \
+       ((((u64)reason_val) & GHCB_MSR_TERM_REASON_MASK) << GHCB_MSR_TERM_REASON_POS))
+
+#define GHCB_SEV_ES_REASON_GENERAL_REQUEST     0
+#define GHCB_SEV_ES_REASON_PROTOCOL_UNSUPPORTED        1
+
+#define GHCB_RESP_CODE(v)              ((v) & GHCB_MSR_INFO_MASK)
+
+#endif
similarity index 70%
rename from arch/x86/include/asm/sev-es.h
rename to arch/x86/include/asm/sev.h
index cf1d957..fa5cd05 100644 (file)
 
 #include <linux/types.h>
 #include <asm/insn.h>
+#include <asm/sev-common.h>
 
-#define GHCB_SEV_INFO          0x001UL
-#define GHCB_SEV_INFO_REQ      0x002UL
-#define                GHCB_INFO(v)            ((v) & 0xfffUL)
-#define                GHCB_PROTO_MAX(v)       (((v) >> 48) & 0xffffUL)
-#define                GHCB_PROTO_MIN(v)       (((v) >> 32) & 0xffffUL)
-#define                GHCB_PROTO_OUR          0x0001UL
-#define GHCB_SEV_CPUID_REQ     0x004UL
-#define                GHCB_CPUID_REQ_EAX      0
-#define                GHCB_CPUID_REQ_EBX      1
-#define                GHCB_CPUID_REQ_ECX      2
-#define                GHCB_CPUID_REQ_EDX      3
-#define                GHCB_CPUID_REQ(fn, reg) (GHCB_SEV_CPUID_REQ | \
-                                       (((unsigned long)reg & 3) << 30) | \
-                                       (((unsigned long)fn) << 32))
+#define GHCB_PROTO_OUR         0x0001UL
+#define GHCB_PROTOCOL_MAX      1ULL
+#define GHCB_DEFAULT_USAGE     0ULL
 
-#define        GHCB_PROTOCOL_MAX       0x0001UL
-#define GHCB_DEFAULT_USAGE     0x0000UL
-
-#define GHCB_SEV_CPUID_RESP    0x005UL
-#define GHCB_SEV_TERMINATE     0x100UL
-#define                GHCB_SEV_TERMINATE_REASON(reason_set, reason_val)       \
-                       (((((u64)reason_set) &  0x7) << 12) |           \
-                        ((((u64)reason_val) & 0xff) << 16))
-#define                GHCB_SEV_ES_REASON_GENERAL_REQUEST      0
-#define                GHCB_SEV_ES_REASON_PROTOCOL_UNSUPPORTED 1
-
-#define        GHCB_SEV_GHCB_RESP_CODE(v)      ((v) & 0xfff)
 #define        VMGEXIT()                       { asm volatile("rep; vmmcall\n\r"); }
 
 enum es_result {
index 119ac86..136e5e5 100644 (file)
@@ -7,4 +7,6 @@
        VDSO_CLOCKMODE_PVCLOCK, \
        VDSO_CLOCKMODE_HVCLOCK
 
+#define HAVE_VDSO_CLOCKMODE_HVCLOCK
+
 #endif /* __ASM_VDSO_CLOCKSOURCE_H */
index 5a3022c..0662f64 100644 (file)
@@ -437,6 +437,8 @@ struct kvm_vmx_nested_state_hdr {
                __u16 flags;
        } smm;
 
+       __u16 pad;
+
        __u32 flags;
        __u64 preemption_timer_deadline;
 };
index 0704c2a..0f66682 100644 (file)
@@ -20,7 +20,7 @@ CFLAGS_REMOVE_kvmclock.o = -pg
 CFLAGS_REMOVE_ftrace.o = -pg
 CFLAGS_REMOVE_early_printk.o = -pg
 CFLAGS_REMOVE_head64.o = -pg
-CFLAGS_REMOVE_sev-es.o = -pg
+CFLAGS_REMOVE_sev.o = -pg
 endif
 
 KASAN_SANITIZE_head$(BITS).o                           := n
@@ -28,7 +28,7 @@ KASAN_SANITIZE_dumpstack.o                            := n
 KASAN_SANITIZE_dumpstack_$(BITS).o                     := n
 KASAN_SANITIZE_stacktrace.o                            := n
 KASAN_SANITIZE_paravirt.o                              := n
-KASAN_SANITIZE_sev-es.o                                        := n
+KASAN_SANITIZE_sev.o                                   := n
 
 # With some compiler versions the generated code results in boot hangs, caused
 # by several compilation units. To be safe, disable all instrumentation.
@@ -148,7 +148,7 @@ obj-$(CONFIG_UNWINDER_ORC)          += unwind_orc.o
 obj-$(CONFIG_UNWINDER_FRAME_POINTER)   += unwind_frame.o
 obj-$(CONFIG_UNWINDER_GUESS)           += unwind_guess.o
 
-obj-$(CONFIG_AMD_MEM_ENCRYPT)          += sev-es.o
+obj-$(CONFIG_AMD_MEM_ENCRYPT)          += sev.o
 ###
 # 64 bit specific files
 ifeq ($(CONFIG_X86_64),y)
index 2d11384..c06ac56 100644 (file)
@@ -593,8 +593,8 @@ static void early_detect_mem_encrypt(struct cpuinfo_x86 *c)
         */
        if (cpu_has(c, X86_FEATURE_SME) || cpu_has(c, X86_FEATURE_SEV)) {
                /* Check if memory encryption is enabled */
-               rdmsrl(MSR_K8_SYSCFG, msr);
-               if (!(msr & MSR_K8_SYSCFG_MEM_ENCRYPT))
+               rdmsrl(MSR_AMD64_SYSCFG, msr);
+               if (!(msr & MSR_AMD64_SYSCFG_MEM_ENCRYPT))
                        goto clear_all;
 
                /*
@@ -1165,3 +1165,19 @@ void set_dr_addr_mask(unsigned long mask, int dr)
                break;
        }
 }
+
+u32 amd_get_highest_perf(void)
+{
+       struct cpuinfo_x86 *c = &boot_cpu_data;
+
+       if (c->x86 == 0x17 && ((c->x86_model >= 0x30 && c->x86_model < 0x40) ||
+                              (c->x86_model >= 0x70 && c->x86_model < 0x80)))
+               return 166;
+
+       if (c->x86 == 0x19 && ((c->x86_model >= 0x20 && c->x86_model < 0x30) ||
+                              (c->x86_model >= 0x40 && c->x86_model < 0x70)))
+               return 166;
+
+       return 255;
+}
+EXPORT_SYMBOL_GPL(amd_get_highest_perf);
index 0c3b372..b5f4304 100644 (file)
@@ -836,7 +836,7 @@ int __init amd_special_default_mtrr(void)
        if (boot_cpu_data.x86 < 0xf)
                return 0;
        /* In case some hypervisor doesn't pass SYSCFG through: */
-       if (rdmsr_safe(MSR_K8_SYSCFG, &l, &h) < 0)
+       if (rdmsr_safe(MSR_AMD64_SYSCFG, &l, &h) < 0)
                return 0;
        /*
         * Memory between 4GB and top of mem is forced WB by this magic bit.
index b90f3f4..5581082 100644 (file)
@@ -53,13 +53,13 @@ static inline void k8_check_syscfg_dram_mod_en(void)
              (boot_cpu_data.x86 >= 0x0f)))
                return;
 
-       rdmsr(MSR_K8_SYSCFG, lo, hi);
+       rdmsr(MSR_AMD64_SYSCFG, lo, hi);
        if (lo & K8_MTRRFIXRANGE_DRAM_MODIFY) {
                pr_err(FW_WARN "MTRR: CPU %u: SYSCFG[MtrrFixDramModEn]"
                       " not cleared by BIOS, clearing this bit\n",
                       smp_processor_id());
                lo &= ~K8_MTRRFIXRANGE_DRAM_MODIFY;
-               mtrr_wrmsr(MSR_K8_SYSCFG, lo, hi);
+               mtrr_wrmsr(MSR_AMD64_SYSCFG, lo, hi);
        }
 }
 
index 18be441..de01903 100644 (file)
@@ -39,7 +39,7 @@
 #include <asm/realmode.h>
 #include <asm/extable.h>
 #include <asm/trapnr.h>
-#include <asm/sev-es.h>
+#include <asm/sev.h>
 
 /*
  * Manage page tables very early on.
index d307c22..a26643d 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/kprobes.h>
 #include <linux/nmi.h>
 #include <linux/swait.h>
+#include <linux/syscore_ops.h>
 #include <asm/timer.h>
 #include <asm/cpu.h>
 #include <asm/traps.h>
@@ -37,6 +38,7 @@
 #include <asm/tlb.h>
 #include <asm/cpuidle_haltpoll.h>
 #include <asm/ptrace.h>
+#include <asm/reboot.h>
 #include <asm/svm.h>
 
 DEFINE_STATIC_KEY_FALSE(kvm_async_pf_enabled);
@@ -345,7 +347,7 @@ static void kvm_guest_cpu_init(void)
 
                wrmsrl(MSR_KVM_ASYNC_PF_EN, pa);
                __this_cpu_write(apf_reason.enabled, 1);
-               pr_info("KVM setup async PF for cpu %d\n", smp_processor_id());
+               pr_info("setup async PF for cpu %d\n", smp_processor_id());
        }
 
        if (kvm_para_has_feature(KVM_FEATURE_PV_EOI)) {
@@ -371,34 +373,17 @@ static void kvm_pv_disable_apf(void)
        wrmsrl(MSR_KVM_ASYNC_PF_EN, 0);
        __this_cpu_write(apf_reason.enabled, 0);
 
-       pr_info("Unregister pv shared memory for cpu %d\n", smp_processor_id());
+       pr_info("disable async PF for cpu %d\n", smp_processor_id());
 }
 
-static void kvm_pv_guest_cpu_reboot(void *unused)
+static void kvm_disable_steal_time(void)
 {
-       /*
-        * We disable PV EOI before we load a new kernel by kexec,
-        * since MSR_KVM_PV_EOI_EN stores a pointer into old kernel's memory.
-        * New kernel can re-enable when it boots.
-        */
-       if (kvm_para_has_feature(KVM_FEATURE_PV_EOI))
-               wrmsrl(MSR_KVM_PV_EOI_EN, 0);
-       kvm_pv_disable_apf();
-       kvm_disable_steal_time();
-}
+       if (!has_steal_clock)
+               return;
 
-static int kvm_pv_reboot_notify(struct notifier_block *nb,
-                               unsigned long code, void *unused)
-{
-       if (code == SYS_RESTART)
-               on_each_cpu(kvm_pv_guest_cpu_reboot, NULL, 1);
-       return NOTIFY_DONE;
+       wrmsr(MSR_KVM_STEAL_TIME, 0, 0);
 }
 
-static struct notifier_block kvm_pv_reboot_nb = {
-       .notifier_call = kvm_pv_reboot_notify,
-};
-
 static u64 kvm_steal_clock(int cpu)
 {
        u64 steal;
@@ -416,14 +401,6 @@ static u64 kvm_steal_clock(int cpu)
        return steal;
 }
 
-void kvm_disable_steal_time(void)
-{
-       if (!has_steal_clock)
-               return;
-
-       wrmsr(MSR_KVM_STEAL_TIME, 0, 0);
-}
-
 static inline void __set_percpu_decrypted(void *ptr, unsigned long size)
 {
        early_set_memory_decrypted((unsigned long) ptr, size);
@@ -451,6 +428,27 @@ static void __init sev_map_percpu_data(void)
        }
 }
 
+static void kvm_guest_cpu_offline(bool shutdown)
+{
+       kvm_disable_steal_time();
+       if (kvm_para_has_feature(KVM_FEATURE_PV_EOI))
+               wrmsrl(MSR_KVM_PV_EOI_EN, 0);
+       kvm_pv_disable_apf();
+       if (!shutdown)
+               apf_task_wake_all();
+       kvmclock_disable();
+}
+
+static int kvm_cpu_online(unsigned int cpu)
+{
+       unsigned long flags;
+
+       local_irq_save(flags);
+       kvm_guest_cpu_init();
+       local_irq_restore(flags);
+       return 0;
+}
+
 #ifdef CONFIG_SMP
 
 static DEFINE_PER_CPU(cpumask_var_t, __pv_cpu_mask);
@@ -635,31 +633,64 @@ static void __init kvm_smp_prepare_boot_cpu(void)
        kvm_spinlock_init();
 }
 
-static void kvm_guest_cpu_offline(void)
+static int kvm_cpu_down_prepare(unsigned int cpu)
 {
-       kvm_disable_steal_time();
-       if (kvm_para_has_feature(KVM_FEATURE_PV_EOI))
-               wrmsrl(MSR_KVM_PV_EOI_EN, 0);
-       kvm_pv_disable_apf();
-       apf_task_wake_all();
+       unsigned long flags;
+
+       local_irq_save(flags);
+       kvm_guest_cpu_offline(false);
+       local_irq_restore(flags);
+       return 0;
 }
 
-static int kvm_cpu_online(unsigned int cpu)
+#endif
+
+static int kvm_suspend(void)
 {
-       local_irq_disable();
-       kvm_guest_cpu_init();
-       local_irq_enable();
+       kvm_guest_cpu_offline(false);
+
        return 0;
 }
 
-static int kvm_cpu_down_prepare(unsigned int cpu)
+static void kvm_resume(void)
 {
-       local_irq_disable();
-       kvm_guest_cpu_offline();
-       local_irq_enable();
-       return 0;
+       kvm_cpu_online(raw_smp_processor_id());
+}
+
+static struct syscore_ops kvm_syscore_ops = {
+       .suspend        = kvm_suspend,
+       .resume         = kvm_resume,
+};
+
+static void kvm_pv_guest_cpu_reboot(void *unused)
+{
+       kvm_guest_cpu_offline(true);
+}
+
+static int kvm_pv_reboot_notify(struct notifier_block *nb,
+                               unsigned long code, void *unused)
+{
+       if (code == SYS_RESTART)
+               on_each_cpu(kvm_pv_guest_cpu_reboot, NULL, 1);
+       return NOTIFY_DONE;
 }
 
+static struct notifier_block kvm_pv_reboot_nb = {
+       .notifier_call = kvm_pv_reboot_notify,
+};
+
+/*
+ * After a PV feature is registered, the host will keep writing to the
+ * registered memory location. If the guest happens to shutdown, this memory
+ * won't be valid. In cases like kexec, in which you install a new kernel, this
+ * means a random memory location will be kept being written.
+ */
+#ifdef CONFIG_KEXEC_CORE
+static void kvm_crash_shutdown(struct pt_regs *regs)
+{
+       kvm_guest_cpu_offline(true);
+       native_machine_crash_shutdown(regs);
+}
 #endif
 
 static void __init kvm_guest_init(void)
@@ -704,6 +735,12 @@ static void __init kvm_guest_init(void)
        kvm_guest_cpu_init();
 #endif
 
+#ifdef CONFIG_KEXEC_CORE
+       machine_ops.crash_shutdown = kvm_crash_shutdown;
+#endif
+
+       register_syscore_ops(&kvm_syscore_ops);
+
        /*
         * Hard lockup detection is enabled by default. Disable it, as guests
         * can get false positives too easily, for example if the host is
index d37ed4e..ad273e5 100644 (file)
@@ -20,7 +20,6 @@
 #include <asm/hypervisor.h>
 #include <asm/mem_encrypt.h>
 #include <asm/x86_init.h>
-#include <asm/reboot.h>
 #include <asm/kvmclock.h>
 
 static int kvmclock __initdata = 1;
@@ -203,28 +202,9 @@ static void kvm_setup_secondary_clock(void)
 }
 #endif
 
-/*
- * After the clock is registered, the host will keep writing to the
- * registered memory location. If the guest happens to shutdown, this memory
- * won't be valid. In cases like kexec, in which you install a new kernel, this
- * means a random memory location will be kept being written. So before any
- * kind of shutdown from our side, we unregister the clock by writing anything
- * that does not have the 'enable' bit set in the msr
- */
-#ifdef CONFIG_KEXEC_CORE
-static void kvm_crash_shutdown(struct pt_regs *regs)
-{
-       native_write_msr(msr_kvm_system_time, 0, 0);
-       kvm_disable_steal_time();
-       native_machine_crash_shutdown(regs);
-}
-#endif
-
-static void kvm_shutdown(void)
+void kvmclock_disable(void)
 {
        native_write_msr(msr_kvm_system_time, 0, 0);
-       kvm_disable_steal_time();
-       native_machine_shutdown();
 }
 
 static void __init kvmclock_init_mem(void)
@@ -351,10 +331,6 @@ void __init kvmclock_init(void)
 #endif
        x86_platform.save_sched_clock_state = kvm_save_sched_clock_state;
        x86_platform.restore_sched_clock_state = kvm_restore_sched_clock_state;
-       machine_ops.shutdown  = kvm_shutdown;
-#ifdef CONFIG_KEXEC_CORE
-       machine_ops.crash_shutdown  = kvm_crash_shutdown;
-#endif
        kvm_get_preset_lpj();
 
        /*
index b5cb49e..c94dec6 100644 (file)
@@ -95,7 +95,7 @@ static void get_fam10h_pci_mmconf_base(void)
                return;
 
        /* SYS_CFG */
-       address = MSR_K8_SYSCFG;
+       address = MSR_AMD64_SYSCFG;
        rdmsrl(address, val);
 
        /* TOP_MEM2 is not enabled? */
index 2ef961c..4bce802 100644 (file)
@@ -33,7 +33,7 @@
 #include <asm/reboot.h>
 #include <asm/cache.h>
 #include <asm/nospec-branch.h>
-#include <asm/sev-es.h>
+#include <asm/sev.h>
 
 #define CREATE_TRACE_POINTS
 #include <trace/events/nmi.h>
similarity index 96%
rename from arch/x86/kernel/sev-es-shared.c
rename to arch/x86/kernel/sev-shared.c
index 0aa9f13..9f90f46 100644 (file)
@@ -26,13 +26,13 @@ static bool __init sev_es_check_cpu_features(void)
 
 static void __noreturn sev_es_terminate(unsigned int reason)
 {
-       u64 val = GHCB_SEV_TERMINATE;
+       u64 val = GHCB_MSR_TERM_REQ;
 
        /*
         * Tell the hypervisor what went wrong - only reason-set 0 is
         * currently supported.
         */
-       val |= GHCB_SEV_TERMINATE_REASON(0, reason);
+       val |= GHCB_SEV_TERM_REASON(0, reason);
 
        /* Request Guest Termination from Hypvervisor */
        sev_es_wr_ghcb_msr(val);
@@ -47,15 +47,15 @@ static bool sev_es_negotiate_protocol(void)
        u64 val;
 
        /* Do the GHCB protocol version negotiation */
-       sev_es_wr_ghcb_msr(GHCB_SEV_INFO_REQ);
+       sev_es_wr_ghcb_msr(GHCB_MSR_SEV_INFO_REQ);
        VMGEXIT();
        val = sev_es_rd_ghcb_msr();
 
-       if (GHCB_INFO(val) != GHCB_SEV_INFO)
+       if (GHCB_MSR_INFO(val) != GHCB_MSR_SEV_INFO_RESP)
                return false;
 
-       if (GHCB_PROTO_MAX(val) < GHCB_PROTO_OUR ||
-           GHCB_PROTO_MIN(val) > GHCB_PROTO_OUR)
+       if (GHCB_MSR_PROTO_MAX(val) < GHCB_PROTO_OUR ||
+           GHCB_MSR_PROTO_MIN(val) > GHCB_PROTO_OUR)
                return false;
 
        return true;
@@ -63,6 +63,7 @@ static bool sev_es_negotiate_protocol(void)
 
 static __always_inline void vc_ghcb_invalidate(struct ghcb *ghcb)
 {
+       ghcb->save.sw_exit_code = 0;
        memset(ghcb->save.valid_bitmap, 0, sizeof(ghcb->save.valid_bitmap));
 }
 
@@ -153,28 +154,28 @@ void __init do_vc_no_ghcb(struct pt_regs *regs, unsigned long exit_code)
        sev_es_wr_ghcb_msr(GHCB_CPUID_REQ(fn, GHCB_CPUID_REQ_EAX));
        VMGEXIT();
        val = sev_es_rd_ghcb_msr();
-       if (GHCB_SEV_GHCB_RESP_CODE(val) != GHCB_SEV_CPUID_RESP)
+       if (GHCB_RESP_CODE(val) != GHCB_MSR_CPUID_RESP)
                goto fail;
        regs->ax = val >> 32;
 
        sev_es_wr_ghcb_msr(GHCB_CPUID_REQ(fn, GHCB_CPUID_REQ_EBX));
        VMGEXIT();
        val = sev_es_rd_ghcb_msr();
-       if (GHCB_SEV_GHCB_RESP_CODE(val) != GHCB_SEV_CPUID_RESP)
+       if (GHCB_RESP_CODE(val) != GHCB_MSR_CPUID_RESP)
                goto fail;
        regs->bx = val >> 32;
 
        sev_es_wr_ghcb_msr(GHCB_CPUID_REQ(fn, GHCB_CPUID_REQ_ECX));
        VMGEXIT();
        val = sev_es_rd_ghcb_msr();
-       if (GHCB_SEV_GHCB_RESP_CODE(val) != GHCB_SEV_CPUID_RESP)
+       if (GHCB_RESP_CODE(val) != GHCB_MSR_CPUID_RESP)
                goto fail;
        regs->cx = val >> 32;
 
        sev_es_wr_ghcb_msr(GHCB_CPUID_REQ(fn, GHCB_CPUID_REQ_EDX));
        VMGEXIT();
        val = sev_es_rd_ghcb_msr();
-       if (GHCB_SEV_GHCB_RESP_CODE(val) != GHCB_SEV_CPUID_RESP)
+       if (GHCB_RESP_CODE(val) != GHCB_MSR_CPUID_RESP)
                goto fail;
        regs->dx = val >> 32;
 
similarity index 92%
rename from arch/x86/kernel/sev-es.c
rename to arch/x86/kernel/sev.c
index 73873b0..651b81c 100644 (file)
@@ -22,7 +22,7 @@
 
 #include <asm/cpu_entry_area.h>
 #include <asm/stacktrace.h>
-#include <asm/sev-es.h>
+#include <asm/sev.h>
 #include <asm/insn-eval.h>
 #include <asm/fpu/internal.h>
 #include <asm/processor.h>
@@ -203,8 +203,18 @@ static __always_inline struct ghcb *sev_es_get_ghcb(struct ghcb_state *state)
        if (unlikely(data->ghcb_active)) {
                /* GHCB is already in use - save its contents */
 
-               if (unlikely(data->backup_ghcb_active))
-                       return NULL;
+               if (unlikely(data->backup_ghcb_active)) {
+                       /*
+                        * Backup-GHCB is also already in use. There is no way
+                        * to continue here so just kill the machine. To make
+                        * panic() work, mark GHCBs inactive so that messages
+                        * can be printed out.
+                        */
+                       data->ghcb_active        = false;
+                       data->backup_ghcb_active = false;
+
+                       panic("Unable to handle #VC exception! GHCB and Backup GHCB are already in use");
+               }
 
                /* Mark backup_ghcb active before writing to it */
                data->backup_ghcb_active = true;
@@ -221,24 +231,6 @@ static __always_inline struct ghcb *sev_es_get_ghcb(struct ghcb_state *state)
        return ghcb;
 }
 
-static __always_inline void sev_es_put_ghcb(struct ghcb_state *state)
-{
-       struct sev_es_runtime_data *data;
-       struct ghcb *ghcb;
-
-       data = this_cpu_read(runtime_data);
-       ghcb = &data->ghcb_page;
-
-       if (state->ghcb) {
-               /* Restore GHCB from Backup */
-               *ghcb = *state->ghcb;
-               data->backup_ghcb_active = false;
-               state->ghcb = NULL;
-       } else {
-               data->ghcb_active = false;
-       }
-}
-
 /* Needed in vc_early_forward_exception */
 void do_early_exception(struct pt_regs *regs, int trapnr);
 
@@ -323,31 +315,44 @@ static enum es_result vc_write_mem(struct es_em_ctxt *ctxt,
        u16 d2;
        u8  d1;
 
-       /* If instruction ran in kernel mode and the I/O buffer is in kernel space */
-       if (!user_mode(ctxt->regs) && !access_ok(target, size)) {
-               memcpy(dst, buf, size);
-               return ES_OK;
-       }
-
+       /*
+        * This function uses __put_user() independent of whether kernel or user
+        * memory is accessed. This works fine because __put_user() does no
+        * sanity checks of the pointer being accessed. All that it does is
+        * to report when the access failed.
+        *
+        * Also, this function runs in atomic context, so __put_user() is not
+        * allowed to sleep. The page-fault handler detects that it is running
+        * in atomic context and will not try to take mmap_sem and handle the
+        * fault, so additional pagefault_enable()/disable() calls are not
+        * needed.
+        *
+        * The access can't be done via copy_to_user() here because
+        * vc_write_mem() must not use string instructions to access unsafe
+        * memory. The reason is that MOVS is emulated by the #VC handler by
+        * splitting the move up into a read and a write and taking a nested #VC
+        * exception on whatever of them is the MMIO access. Using string
+        * instructions here would cause infinite nesting.
+        */
        switch (size) {
        case 1:
                memcpy(&d1, buf, 1);
-               if (put_user(d1, target))
+               if (__put_user(d1, target))
                        goto fault;
                break;
        case 2:
                memcpy(&d2, buf, 2);
-               if (put_user(d2, target))
+               if (__put_user(d2, target))
                        goto fault;
                break;
        case 4:
                memcpy(&d4, buf, 4);
-               if (put_user(d4, target))
+               if (__put_user(d4, target))
                        goto fault;
                break;
        case 8:
                memcpy(&d8, buf, 8);
-               if (put_user(d8, target))
+               if (__put_user(d8, target))
                        goto fault;
                break;
        default:
@@ -378,30 +383,43 @@ static enum es_result vc_read_mem(struct es_em_ctxt *ctxt,
        u16 d2;
        u8  d1;
 
-       /* If instruction ran in kernel mode and the I/O buffer is in kernel space */
-       if (!user_mode(ctxt->regs) && !access_ok(s, size)) {
-               memcpy(buf, src, size);
-               return ES_OK;
-       }
-
+       /*
+        * This function uses __get_user() independent of whether kernel or user
+        * memory is accessed. This works fine because __get_user() does no
+        * sanity checks of the pointer being accessed. All that it does is
+        * to report when the access failed.
+        *
+        * Also, this function runs in atomic context, so __get_user() is not
+        * allowed to sleep. The page-fault handler detects that it is running
+        * in atomic context and will not try to take mmap_sem and handle the
+        * fault, so additional pagefault_enable()/disable() calls are not
+        * needed.
+        *
+        * The access can't be done via copy_from_user() here because
+        * vc_read_mem() must not use string instructions to access unsafe
+        * memory. The reason is that MOVS is emulated by the #VC handler by
+        * splitting the move up into a read and a write and taking a nested #VC
+        * exception on whatever of them is the MMIO access. Using string
+        * instructions here would cause infinite nesting.
+        */
        switch (size) {
        case 1:
-               if (get_user(d1, s))
+               if (__get_user(d1, s))
                        goto fault;
                memcpy(buf, &d1, 1);
                break;
        case 2:
-               if (get_user(d2, s))
+               if (__get_user(d2, s))
                        goto fault;
                memcpy(buf, &d2, 2);
                break;
        case 4:
-               if (get_user(d4, s))
+               if (__get_user(d4, s))
                        goto fault;
                memcpy(buf, &d4, 4);
                break;
        case 8:
-               if (get_user(d8, s))
+               if (__get_user(d8, s))
                        goto fault;
                memcpy(buf, &d8, 8);
                break;
@@ -459,7 +477,30 @@ static enum es_result vc_slow_virt_to_phys(struct ghcb *ghcb, struct es_em_ctxt
 }
 
 /* Include code shared with pre-decompression boot stage */
-#include "sev-es-shared.c"
+#include "sev-shared.c"
+
+static __always_inline void sev_es_put_ghcb(struct ghcb_state *state)
+{
+       struct sev_es_runtime_data *data;
+       struct ghcb *ghcb;
+
+       data = this_cpu_read(runtime_data);
+       ghcb = &data->ghcb_page;
+
+       if (state->ghcb) {
+               /* Restore GHCB from Backup */
+               *ghcb = *state->ghcb;
+               data->backup_ghcb_active = false;
+               state->ghcb = NULL;
+       } else {
+               /*
+                * Invalidate the GHCB so a VMGEXIT instruction issued
+                * from userspace won't appear to be valid.
+                */
+               vc_ghcb_invalidate(ghcb);
+               data->ghcb_active = false;
+       }
+}
 
 void noinstr __sev_es_nmi_complete(void)
 {
@@ -1255,6 +1296,10 @@ static __always_inline void vc_forward_exception(struct es_em_ctxt *ctxt)
        case X86_TRAP_UD:
                exc_invalid_op(ctxt->regs);
                break;
+       case X86_TRAP_PF:
+               write_cr2(ctxt->fi.cr2);
+               exc_page_fault(ctxt->regs, error_code);
+               break;
        case X86_TRAP_AC:
                exc_alignment_check(ctxt->regs, error_code);
                break;
@@ -1284,7 +1329,6 @@ static __always_inline bool on_vc_fallback_stack(struct pt_regs *regs)
  */
 DEFINE_IDTENTRY_VC_SAFE_STACK(exc_vmm_communication)
 {
-       struct sev_es_runtime_data *data = this_cpu_read(runtime_data);
        irqentry_state_t irq_state;
        struct ghcb_state state;
        struct es_em_ctxt ctxt;
@@ -1310,16 +1354,6 @@ DEFINE_IDTENTRY_VC_SAFE_STACK(exc_vmm_communication)
         */
 
        ghcb = sev_es_get_ghcb(&state);
-       if (!ghcb) {
-               /*
-                * Mark GHCBs inactive so that panic() is able to print the
-                * message.
-                */
-               data->ghcb_active        = false;
-               data->backup_ghcb_active = false;
-
-               panic("Unable to handle #VC exception! GHCB and Backup GHCB are already in use");
-       }
 
        vc_ghcb_invalidate(ghcb);
        result = vc_init_em_ctxt(&ctxt, regs, error_code);
index 0e5d0a7..06743ec 100644 (file)
@@ -127,6 +127,9 @@ static inline void signal_compat_build_tests(void)
        BUILD_BUG_ON(offsetof(siginfo_t, si_addr) != 0x10);
        BUILD_BUG_ON(offsetof(compat_siginfo_t, si_addr) != 0x0C);
 
+       BUILD_BUG_ON(offsetof(siginfo_t, si_trapno) != 0x18);
+       BUILD_BUG_ON(offsetof(compat_siginfo_t, si_trapno) != 0x10);
+
        BUILD_BUG_ON(offsetof(siginfo_t, si_addr_lsb) != 0x18);
        BUILD_BUG_ON(offsetof(compat_siginfo_t, si_addr_lsb) != 0x10);
 
@@ -138,8 +141,10 @@ static inline void signal_compat_build_tests(void)
        BUILD_BUG_ON(offsetof(siginfo_t, si_pkey) != 0x20);
        BUILD_BUG_ON(offsetof(compat_siginfo_t, si_pkey) != 0x14);
 
-       BUILD_BUG_ON(offsetof(siginfo_t, si_perf) != 0x18);
-       BUILD_BUG_ON(offsetof(compat_siginfo_t, si_perf) != 0x10);
+       BUILD_BUG_ON(offsetof(siginfo_t, si_perf_data) != 0x18);
+       BUILD_BUG_ON(offsetof(siginfo_t, si_perf_type) != 0x20);
+       BUILD_BUG_ON(offsetof(compat_siginfo_t, si_perf_data) != 0x10);
+       BUILD_BUG_ON(offsetof(compat_siginfo_t, si_perf_type) != 0x14);
 
        CHECK_CSI_OFFSET(_sigpoll);
        CHECK_CSI_SIZE  (_sigpoll, 2*sizeof(int));
index 0ad5214..7770245 100644 (file)
@@ -2043,7 +2043,7 @@ static bool amd_set_max_freq_ratio(void)
                return false;
        }
 
-       highest_perf = perf_caps.highest_perf;
+       highest_perf = amd_get_highest_perf();
        nominal_perf = perf_caps.nominal_perf;
 
        if (!highest_perf || !nominal_perf) {
index 19606a3..9a48f13 100644 (file)
@@ -458,7 +458,7 @@ void kvm_set_cpu_caps(void)
                F(AVX512_VPOPCNTDQ) | F(UMIP) | F(AVX512_VBMI2) | F(GFNI) |
                F(VAES) | F(VPCLMULQDQ) | F(AVX512_VNNI) | F(AVX512_BITALG) |
                F(CLDEMOTE) | F(MOVDIRI) | F(MOVDIR64B) | 0 /*WAITPKG*/ |
-               F(SGX_LC)
+               F(SGX_LC) | F(BUS_LOCK_DETECT)
        );
        /* Set LA57 based on hardware capability. */
        if (cpuid_ecx(7) & F(LA57))
@@ -567,6 +567,21 @@ void kvm_set_cpu_caps(void)
                F(ACE2) | F(ACE2_EN) | F(PHE) | F(PHE_EN) |
                F(PMM) | F(PMM_EN)
        );
+
+       /*
+        * Hide RDTSCP and RDPID if either feature is reported as supported but
+        * probing MSR_TSC_AUX failed.  This is purely a sanity check and
+        * should never happen, but the guest will likely crash if RDTSCP or
+        * RDPID is misreported, and KVM has botched MSR_TSC_AUX emulation in
+        * the past.  For example, the sanity check may fire if this instance of
+        * KVM is running as L1 on top of an older, broken KVM.
+        */
+       if (WARN_ON((kvm_cpu_cap_has(X86_FEATURE_RDTSCP) ||
+                    kvm_cpu_cap_has(X86_FEATURE_RDPID)) &&
+                    !kvm_is_supported_user_return_msr(MSR_TSC_AUX))) {
+               kvm_cpu_cap_clear(X86_FEATURE_RDTSCP);
+               kvm_cpu_cap_clear(X86_FEATURE_RDPID);
+       }
 }
 EXPORT_SYMBOL_GPL(kvm_set_cpu_caps);
 
@@ -637,7 +652,8 @@ static int __do_cpuid_func_emulated(struct kvm_cpuid_array *array, u32 func)
        case 7:
                entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
                entry->eax = 0;
-               entry->ecx = F(RDPID);
+               if (kvm_cpu_cap_has(X86_FEATURE_RDTSCP))
+                       entry->ecx = F(RDPID);
                ++array->nent;
        default:
                break;
index 77e1c89..8a0ccdb 100644 (file)
@@ -4502,7 +4502,7 @@ static const struct opcode group8[] = {
  * from the register case of group9.
  */
 static const struct gprefix pfx_0f_c7_7 = {
-       N, N, N, II(DstMem | ModRM | Op3264 | EmulateOnUD, em_rdpid, rdtscp),
+       N, N, N, II(DstMem | ModRM | Op3264 | EmulateOnUD, em_rdpid, rdpid),
 };
 
 
index 0d35911..f016838 100644 (file)
@@ -468,6 +468,7 @@ enum x86_intercept {
        x86_intercept_clgi,
        x86_intercept_skinit,
        x86_intercept_rdtscp,
+       x86_intercept_rdpid,
        x86_intercept_icebp,
        x86_intercept_wbinvd,
        x86_intercept_monitor,
index 152591f..c0ebef5 100644 (file)
@@ -1913,8 +1913,8 @@ void kvm_lapic_expired_hv_timer(struct kvm_vcpu *vcpu)
        if (!apic->lapic_timer.hv_timer_in_use)
                goto out;
        WARN_ON(rcuwait_active(&vcpu->wait));
-       cancel_hv_timer(apic);
        apic_timer_expired(apic, false);
+       cancel_hv_timer(apic);
 
        if (apic_lvtt_period(apic) && apic->lapic_timer.period) {
                advance_periodic_target_expiration(apic);
index 4b3ee24..0144c40 100644 (file)
@@ -3310,12 +3310,12 @@ static int mmu_alloc_shadow_roots(struct kvm_vcpu *vcpu)
        if (mmu->shadow_root_level == PT64_ROOT_4LEVEL) {
                pm_mask |= PT_ACCESSED_MASK | PT_WRITABLE_MASK | PT_USER_MASK;
 
-               if (WARN_ON_ONCE(!mmu->lm_root)) {
+               if (WARN_ON_ONCE(!mmu->pml4_root)) {
                        r = -EIO;
                        goto out_unlock;
                }
 
-               mmu->lm_root[0] = __pa(mmu->pae_root) | pm_mask;
+               mmu->pml4_root[0] = __pa(mmu->pae_root) | pm_mask;
        }
 
        for (i = 0; i < 4; ++i) {
@@ -3335,7 +3335,7 @@ static int mmu_alloc_shadow_roots(struct kvm_vcpu *vcpu)
        }
 
        if (mmu->shadow_root_level == PT64_ROOT_4LEVEL)
-               mmu->root_hpa = __pa(mmu->lm_root);
+               mmu->root_hpa = __pa(mmu->pml4_root);
        else
                mmu->root_hpa = __pa(mmu->pae_root);
 
@@ -3350,7 +3350,7 @@ out_unlock:
 static int mmu_alloc_special_roots(struct kvm_vcpu *vcpu)
 {
        struct kvm_mmu *mmu = vcpu->arch.mmu;
-       u64 *lm_root, *pae_root;
+       u64 *pml4_root, *pae_root;
 
        /*
         * When shadowing 32-bit or PAE NPT with 64-bit NPT, the PML4 and PDP
@@ -3369,14 +3369,14 @@ static int mmu_alloc_special_roots(struct kvm_vcpu *vcpu)
        if (WARN_ON_ONCE(mmu->shadow_root_level != PT64_ROOT_4LEVEL))
                return -EIO;
 
-       if (mmu->pae_root && mmu->lm_root)
+       if (mmu->pae_root && mmu->pml4_root)
                return 0;
 
        /*
         * The special roots should always be allocated in concert.  Yell and
         * bail if KVM ends up in a state where only one of the roots is valid.
         */
-       if (WARN_ON_ONCE(!tdp_enabled || mmu->pae_root || mmu->lm_root))
+       if (WARN_ON_ONCE(!tdp_enabled || mmu->pae_root || mmu->pml4_root))
                return -EIO;
 
        /*
@@ -3387,14 +3387,14 @@ static int mmu_alloc_special_roots(struct kvm_vcpu *vcpu)
        if (!pae_root)
                return -ENOMEM;
 
-       lm_root = (void *)get_zeroed_page(GFP_KERNEL_ACCOUNT);
-       if (!lm_root) {
+       pml4_root = (void *)get_zeroed_page(GFP_KERNEL_ACCOUNT);
+       if (!pml4_root) {
                free_page((unsigned long)pae_root);
                return -ENOMEM;
        }
 
        mmu->pae_root = pae_root;
-       mmu->lm_root = lm_root;
+       mmu->pml4_root = pml4_root;
 
        return 0;
 }
@@ -5261,7 +5261,7 @@ static void free_mmu_pages(struct kvm_mmu *mmu)
        if (!tdp_enabled && mmu->pae_root)
                set_memory_encrypted((unsigned long)mmu->pae_root, 1);
        free_page((unsigned long)mmu->pae_root);
-       free_page((unsigned long)mmu->lm_root);
+       free_page((unsigned long)mmu->pml4_root);
 }
 
 static int __kvm_mmu_create(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu)
index 88f69a6..95eeb5a 100644 (file)
@@ -388,7 +388,7 @@ static void handle_removed_tdp_mmu_page(struct kvm *kvm, tdp_ptep_t pt,
 }
 
 /**
- * handle_changed_spte - handle bookkeeping associated with an SPTE change
+ * __handle_changed_spte - handle bookkeeping associated with an SPTE change
  * @kvm: kvm instance
  * @as_id: the address space of the paging structure the SPTE was a part of
  * @gfn: the base GFN that was mapped by the SPTE
@@ -444,6 +444,13 @@ static void __handle_changed_spte(struct kvm *kvm, int as_id, gfn_t gfn,
 
        trace_kvm_tdp_mmu_spte_changed(as_id, gfn, level, old_spte, new_spte);
 
+       if (is_large_pte(old_spte) != is_large_pte(new_spte)) {
+               if (is_large_pte(old_spte))
+                       atomic64_sub(1, (atomic64_t*)&kvm->stat.lpages);
+               else
+                       atomic64_add(1, (atomic64_t*)&kvm->stat.lpages);
+       }
+
        /*
         * The only times a SPTE should be changed from a non-present to
         * non-present state is when an MMIO entry is installed/modified/
@@ -1009,6 +1016,14 @@ int kvm_tdp_mmu_map(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code,
                }
 
                if (!is_shadow_present_pte(iter.old_spte)) {
+                       /*
+                        * If SPTE has been forzen by another thread, just
+                        * give up and retry, avoiding unnecessary page table
+                        * allocation and free.
+                        */
+                       if (is_removed_spte(iter.old_spte))
+                               break;
+
                        sp = alloc_tdp_mmu_page(vcpu, iter.gfn, iter.level);
                        child_pt = sp->spt;
 
index 540d43b..5e8d844 100644 (file)
@@ -764,7 +764,6 @@ int nested_svm_vmexit(struct vcpu_svm *svm)
        nested_svm_copy_common_state(svm->nested.vmcb02.ptr, svm->vmcb01.ptr);
 
        svm_switch_vmcb(svm, &svm->vmcb01);
-       WARN_ON_ONCE(svm->vmcb->control.exit_code != SVM_EXIT_VMRUN);
 
        /*
         * On vmexit the  GIF is set to false and
@@ -872,6 +871,15 @@ void svm_free_nested(struct vcpu_svm *svm)
        __free_page(virt_to_page(svm->nested.vmcb02.ptr));
        svm->nested.vmcb02.ptr = NULL;
 
+       /*
+        * When last_vmcb12_gpa matches the current vmcb12 gpa,
+        * some vmcb12 fields are not loaded if they are marked clean
+        * in the vmcb12, since in this case they are up to date already.
+        *
+        * When the vmcb02 is freed, this optimization becomes invalid.
+        */
+       svm->nested.last_vmcb12_gpa = INVALID_GPA;
+
        svm->nested.initialized = false;
 }
 
@@ -884,9 +892,11 @@ void svm_leave_nested(struct vcpu_svm *svm)
 
        if (is_guest_mode(vcpu)) {
                svm->nested.nested_run_pending = 0;
+               svm->nested.vmcb12_gpa = INVALID_GPA;
+
                leave_guest_mode(vcpu);
 
-               svm_switch_vmcb(svm, &svm->nested.vmcb02);
+               svm_switch_vmcb(svm, &svm->vmcb01);
 
                nested_svm_uninit_mmu_context(vcpu);
                vmcb_mark_all_dirty(svm->vmcb);
@@ -1298,12 +1308,17 @@ static int svm_set_nested_state(struct kvm_vcpu *vcpu,
         * L2 registers if needed are moved from the current VMCB to VMCB02.
         */
 
+       if (is_guest_mode(vcpu))
+               svm_leave_nested(svm);
+       else
+               svm->nested.vmcb02.ptr->save = svm->vmcb01.ptr->save;
+
+       svm_set_gif(svm, !!(kvm_state->flags & KVM_STATE_NESTED_GIF_SET));
+
        svm->nested.nested_run_pending =
                !!(kvm_state->flags & KVM_STATE_NESTED_RUN_PENDING);
 
        svm->nested.vmcb12_gpa = kvm_state->hdr.svm.vmcb_pa;
-       if (svm->current_vmcb == &svm->vmcb01)
-               svm->nested.vmcb02.ptr->save = svm->vmcb01.ptr->save;
 
        svm->vmcb01.ptr->save.es = save->es;
        svm->vmcb01.ptr->save.cs = save->cs;
index 1356ee0..5bc887e 100644 (file)
@@ -763,7 +763,7 @@ static int __sev_dbg_decrypt(struct kvm *kvm, unsigned long src_paddr,
 }
 
 static int __sev_dbg_decrypt_user(struct kvm *kvm, unsigned long paddr,
-                                 unsigned long __user dst_uaddr,
+                                 void __user *dst_uaddr,
                                  unsigned long dst_paddr,
                                  int size, int *err)
 {
@@ -787,8 +787,7 @@ static int __sev_dbg_decrypt_user(struct kvm *kvm, unsigned long paddr,
 
        if (tpage) {
                offset = paddr & 15;
-               if (copy_to_user((void __user *)(uintptr_t)dst_uaddr,
-                                page_address(tpage) + offset, size))
+               if (copy_to_user(dst_uaddr, page_address(tpage) + offset, size))
                        ret = -EFAULT;
        }
 
@@ -800,9 +799,9 @@ e_free:
 }
 
 static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr,
-                                 unsigned long __user vaddr,
+                                 void __user *vaddr,
                                  unsigned long dst_paddr,
-                                 unsigned long __user dst_vaddr,
+                                 void __user *dst_vaddr,
                                  int size, int *error)
 {
        struct page *src_tpage = NULL;
@@ -810,13 +809,12 @@ static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr,
        int ret, len = size;
 
        /* If source buffer is not aligned then use an intermediate buffer */
-       if (!IS_ALIGNED(vaddr, 16)) {
+       if (!IS_ALIGNED((unsigned long)vaddr, 16)) {
                src_tpage = alloc_page(GFP_KERNEL);
                if (!src_tpage)
                        return -ENOMEM;
 
-               if (copy_from_user(page_address(src_tpage),
-                               (void __user *)(uintptr_t)vaddr, size)) {
+               if (copy_from_user(page_address(src_tpage), vaddr, size)) {
                        __free_page(src_tpage);
                        return -EFAULT;
                }
@@ -830,7 +828,7 @@ static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr,
         *   - copy the source buffer in an intermediate buffer
         *   - use the intermediate buffer as source buffer
         */
-       if (!IS_ALIGNED(dst_vaddr, 16) || !IS_ALIGNED(size, 16)) {
+       if (!IS_ALIGNED((unsigned long)dst_vaddr, 16) || !IS_ALIGNED(size, 16)) {
                int dst_offset;
 
                dst_tpage = alloc_page(GFP_KERNEL);
@@ -855,7 +853,7 @@ static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr,
                               page_address(src_tpage), size);
                else {
                        if (copy_from_user(page_address(dst_tpage) + dst_offset,
-                                          (void __user *)(uintptr_t)vaddr, size)) {
+                                          vaddr, size)) {
                                ret = -EFAULT;
                                goto e_free;
                        }
@@ -935,15 +933,15 @@ static int sev_dbg_crypt(struct kvm *kvm, struct kvm_sev_cmd *argp, bool dec)
                if (dec)
                        ret = __sev_dbg_decrypt_user(kvm,
                                                     __sme_page_pa(src_p[0]) + s_off,
-                                                    dst_vaddr,
+                                                    (void __user *)dst_vaddr,
                                                     __sme_page_pa(dst_p[0]) + d_off,
                                                     len, &argp->error);
                else
                        ret = __sev_dbg_encrypt_user(kvm,
                                                     __sme_page_pa(src_p[0]) + s_off,
-                                                    vaddr,
+                                                    (void __user *)vaddr,
                                                     __sme_page_pa(dst_p[0]) + d_off,
-                                                    dst_vaddr,
+                                                    (void __user *)dst_vaddr,
                                                     len, &argp->error);
 
                sev_unpin_memory(kvm, src_p, n);
@@ -1764,7 +1762,8 @@ e_mirror_unlock:
 e_source_unlock:
        mutex_unlock(&source_kvm->lock);
 e_source_put:
-       fput(source_kvm_file);
+       if (source_kvm_file)
+               fput(source_kvm_file);
        return ret;
 }
 
@@ -2198,7 +2197,7 @@ vmgexit_err:
        return -EINVAL;
 }
 
-static void pre_sev_es_run(struct vcpu_svm *svm)
+void sev_es_unmap_ghcb(struct vcpu_svm *svm)
 {
        if (!svm->ghcb)
                return;
@@ -2234,9 +2233,6 @@ void pre_sev_run(struct vcpu_svm *svm, int cpu)
        struct svm_cpu_data *sd = per_cpu(svm_data, cpu);
        int asid = sev_get_asid(svm->vcpu.kvm);
 
-       /* Perform any SEV-ES pre-run actions */
-       pre_sev_es_run(svm);
-
        /* Assign the asid allocated with this SEV guest */
        svm->asid = asid;
 
index b649f92..05eca13 100644 (file)
@@ -212,7 +212,7 @@ DEFINE_PER_CPU(struct svm_cpu_data *, svm_data);
  * RDTSCP and RDPID are not used in the kernel, specifically to allow KVM to
  * defer the restoration of TSC_AUX until the CPU returns to userspace.
  */
-#define TSC_AUX_URET_SLOT      0
+static int tsc_aux_uret_slot __read_mostly = -1;
 
 static const u32 msrpm_ranges[] = {0, 0xc0000000, 0xc0010000};
 
@@ -447,6 +447,11 @@ static int has_svm(void)
                return 0;
        }
 
+       if (pgtable_l5_enabled()) {
+               pr_info("KVM doesn't yet support 5-level paging on AMD SVM\n");
+               return 0;
+       }
+
        return 1;
 }
 
@@ -858,8 +863,8 @@ static __init void svm_adjust_mmio_mask(void)
                return;
 
        /* If memory encryption is not enabled, use existing mask */
-       rdmsrl(MSR_K8_SYSCFG, msr);
-       if (!(msr & MSR_K8_SYSCFG_MEM_ENCRYPT))
+       rdmsrl(MSR_AMD64_SYSCFG, msr);
+       if (!(msr & MSR_AMD64_SYSCFG_MEM_ENCRYPT))
                return;
 
        enc_bit = cpuid_ebx(0x8000001f) & 0x3f;
@@ -959,8 +964,7 @@ static __init int svm_hardware_setup(void)
                kvm_tsc_scaling_ratio_frac_bits = 32;
        }
 
-       if (boot_cpu_has(X86_FEATURE_RDTSCP))
-               kvm_define_user_return_msr(TSC_AUX_URET_SLOT, MSR_TSC_AUX);
+       tsc_aux_uret_slot = kvm_add_user_return_msr(MSR_TSC_AUX);
 
        /* Check for pause filtering support */
        if (!boot_cpu_has(X86_FEATURE_PAUSEFILTER)) {
@@ -1100,7 +1104,9 @@ static u64 svm_write_l1_tsc_offset(struct kvm_vcpu *vcpu, u64 offset)
        return svm->vmcb->control.tsc_offset;
 }
 
-static void svm_check_invpcid(struct vcpu_svm *svm)
+/* Evaluate instruction intercepts that depend on guest CPUID features. */
+static void svm_recalc_instruction_intercepts(struct kvm_vcpu *vcpu,
+                                             struct vcpu_svm *svm)
 {
        /*
         * Intercept INVPCID if shadow paging is enabled to sync/free shadow
@@ -1113,6 +1119,13 @@ static void svm_check_invpcid(struct vcpu_svm *svm)
                else
                        svm_clr_intercept(svm, INTERCEPT_INVPCID);
        }
+
+       if (kvm_cpu_cap_has(X86_FEATURE_RDTSCP)) {
+               if (guest_cpuid_has(vcpu, X86_FEATURE_RDTSCP))
+                       svm_clr_intercept(svm, INTERCEPT_RDTSCP);
+               else
+                       svm_set_intercept(svm, INTERCEPT_RDTSCP);
+       }
 }
 
 static void init_vmcb(struct kvm_vcpu *vcpu)
@@ -1235,8 +1248,8 @@ static void init_vmcb(struct kvm_vcpu *vcpu)
        svm->current_vmcb->asid_generation = 0;
        svm->asid = 0;
 
-       svm->nested.vmcb12_gpa = 0;
-       svm->nested.last_vmcb12_gpa = 0;
+       svm->nested.vmcb12_gpa = INVALID_GPA;
+       svm->nested.last_vmcb12_gpa = INVALID_GPA;
        vcpu->arch.hflags = 0;
 
        if (!kvm_pause_in_guest(vcpu->kvm)) {
@@ -1248,7 +1261,7 @@ static void init_vmcb(struct kvm_vcpu *vcpu)
                svm_clr_intercept(svm, INTERCEPT_PAUSE);
        }
 
-       svm_check_invpcid(svm);
+       svm_recalc_instruction_intercepts(vcpu, svm);
 
        /*
         * If the host supports V_SPEC_CTRL then disable the interception
@@ -1424,6 +1437,9 @@ static void svm_prepare_guest_switch(struct kvm_vcpu *vcpu)
        struct vcpu_svm *svm = to_svm(vcpu);
        struct svm_cpu_data *sd = per_cpu(svm_data, vcpu->cpu);
 
+       if (sev_es_guest(vcpu->kvm))
+               sev_es_unmap_ghcb(svm);
+
        if (svm->guest_state_loaded)
                return;
 
@@ -1445,8 +1461,8 @@ static void svm_prepare_guest_switch(struct kvm_vcpu *vcpu)
                }
        }
 
-       if (static_cpu_has(X86_FEATURE_RDTSCP))
-               kvm_set_user_return_msr(TSC_AUX_URET_SLOT, svm->tsc_aux, -1ull);
+       if (likely(tsc_aux_uret_slot >= 0))
+               kvm_set_user_return_msr(tsc_aux_uret_slot, svm->tsc_aux, -1ull);
 
        svm->guest_state_loaded = true;
 }
@@ -2655,11 +2671,6 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                        msr_info->data |= (u64)svm->sysenter_esp_hi << 32;
                break;
        case MSR_TSC_AUX:
-               if (!boot_cpu_has(X86_FEATURE_RDTSCP))
-                       return 1;
-               if (!msr_info->host_initiated &&
-                   !guest_cpuid_has(vcpu, X86_FEATURE_RDTSCP))
-                       return 1;
                msr_info->data = svm->tsc_aux;
                break;
        /*
@@ -2876,30 +2887,13 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
                svm->sysenter_esp_hi = guest_cpuid_is_intel(vcpu) ? (data >> 32) : 0;
                break;
        case MSR_TSC_AUX:
-               if (!boot_cpu_has(X86_FEATURE_RDTSCP))
-                       return 1;
-
-               if (!msr->host_initiated &&
-                   !guest_cpuid_has(vcpu, X86_FEATURE_RDTSCP))
-                       return 1;
-
-               /*
-                * Per Intel's SDM, bits 63:32 are reserved, but AMD's APM has
-                * incomplete and conflicting architectural behavior.  Current
-                * AMD CPUs completely ignore bits 63:32, i.e. they aren't
-                * reserved and always read as zeros.  Emulate AMD CPU behavior
-                * to avoid explosions if the vCPU is migrated from an AMD host
-                * to an Intel host.
-                */
-               data = (u32)data;
-
                /*
                 * TSC_AUX is usually changed only during boot and never read
                 * directly.  Intercept TSC_AUX instead of exposing it to the
                 * guest via direct_access_msrs, and switch it via user return.
                 */
                preempt_disable();
-               r = kvm_set_user_return_msr(TSC_AUX_URET_SLOT, data, -1ull);
+               r = kvm_set_user_return_msr(tsc_aux_uret_slot, data, -1ull);
                preempt_enable();
                if (r)
                        return 1;
@@ -3084,6 +3078,7 @@ static int (*const svm_exit_handlers[])(struct kvm_vcpu *vcpu) = {
        [SVM_EXIT_STGI]                         = stgi_interception,
        [SVM_EXIT_CLGI]                         = clgi_interception,
        [SVM_EXIT_SKINIT]                       = skinit_interception,
+       [SVM_EXIT_RDTSCP]                       = kvm_handle_invalid_op,
        [SVM_EXIT_WBINVD]                       = kvm_emulate_wbinvd,
        [SVM_EXIT_MONITOR]                      = kvm_emulate_monitor,
        [SVM_EXIT_MWAIT]                        = kvm_emulate_mwait,
@@ -3972,8 +3967,7 @@ static void svm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
        svm->nrips_enabled = kvm_cpu_cap_has(X86_FEATURE_NRIPS) &&
                             guest_cpuid_has(vcpu, X86_FEATURE_NRIPS);
 
-       /* Check again if INVPCID interception if required */
-       svm_check_invpcid(svm);
+       svm_recalc_instruction_intercepts(vcpu, svm);
 
        /* For sev guests, the memory encryption bit is not reserved in CR3.  */
        if (sev_guest(vcpu->kvm)) {
index 84b3133..2c9ece6 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/bits.h>
 
 #include <asm/svm.h>
+#include <asm/sev-common.h>
 
 #define __sme_page_pa(x) __sme_set(page_to_pfn(x) << PAGE_SHIFT)
 
@@ -525,40 +526,9 @@ void svm_vcpu_unblocking(struct kvm_vcpu *vcpu);
 
 /* sev.c */
 
-#define GHCB_VERSION_MAX               1ULL
-#define GHCB_VERSION_MIN               1ULL
-
-#define GHCB_MSR_INFO_POS              0
-#define GHCB_MSR_INFO_MASK             (BIT_ULL(12) - 1)
-
-#define GHCB_MSR_SEV_INFO_RESP         0x001
-#define GHCB_MSR_SEV_INFO_REQ          0x002
-#define GHCB_MSR_VER_MAX_POS           48
-#define GHCB_MSR_VER_MAX_MASK          0xffff
-#define GHCB_MSR_VER_MIN_POS           32
-#define GHCB_MSR_VER_MIN_MASK          0xffff
-#define GHCB_MSR_CBIT_POS              24
-#define GHCB_MSR_CBIT_MASK             0xff
-#define GHCB_MSR_SEV_INFO(_max, _min, _cbit)                           \
-       ((((_max) & GHCB_MSR_VER_MAX_MASK) << GHCB_MSR_VER_MAX_POS) |   \
-        (((_min) & GHCB_MSR_VER_MIN_MASK) << GHCB_MSR_VER_MIN_POS) |   \
-        (((_cbit) & GHCB_MSR_CBIT_MASK) << GHCB_MSR_CBIT_POS) |        \
-        GHCB_MSR_SEV_INFO_RESP)
-
-#define GHCB_MSR_CPUID_REQ             0x004
-#define GHCB_MSR_CPUID_RESP            0x005
-#define GHCB_MSR_CPUID_FUNC_POS                32
-#define GHCB_MSR_CPUID_FUNC_MASK       0xffffffff
-#define GHCB_MSR_CPUID_VALUE_POS       32
-#define GHCB_MSR_CPUID_VALUE_MASK      0xffffffff
-#define GHCB_MSR_CPUID_REG_POS         30
-#define GHCB_MSR_CPUID_REG_MASK                0x3
-
-#define GHCB_MSR_TERM_REQ              0x100
-#define GHCB_MSR_TERM_REASON_SET_POS   12
-#define GHCB_MSR_TERM_REASON_SET_MASK  0xf
-#define GHCB_MSR_TERM_REASON_POS       16
-#define GHCB_MSR_TERM_REASON_MASK      0xff
+#define GHCB_VERSION_MAX       1ULL
+#define GHCB_VERSION_MIN       1ULL
+
 
 extern unsigned int max_sev_asid;
 
@@ -581,6 +551,7 @@ void sev_es_init_vmcb(struct vcpu_svm *svm);
 void sev_es_create_vcpu(struct vcpu_svm *svm);
 void sev_vcpu_deliver_sipi_vector(struct kvm_vcpu *vcpu, u8 vector);
 void sev_es_prepare_guest_switch(struct vcpu_svm *svm, unsigned int cpu);
+void sev_es_unmap_ghcb(struct vcpu_svm *svm);
 
 /* vmenter.S */
 
index d1d7798..8dee8a5 100644 (file)
@@ -398,6 +398,9 @@ static inline u64 vmx_supported_debugctl(void)
 {
        u64 debugctl = 0;
 
+       if (boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT))
+               debugctl |= DEBUGCTLMSR_BUS_LOCK_DETECT;
+
        if (vmx_get_perf_capabilities() & PMU_CAP_LBR_FMT)
                debugctl |= DEBUGCTLMSR_LBR_MASK;
 
index bced766..6058a65 100644 (file)
@@ -3098,15 +3098,8 @@ static bool nested_get_evmcs_page(struct kvm_vcpu *vcpu)
                        nested_vmx_handle_enlightened_vmptrld(vcpu, false);
 
                if (evmptrld_status == EVMPTRLD_VMFAIL ||
-                   evmptrld_status == EVMPTRLD_ERROR) {
-                       pr_debug_ratelimited("%s: enlightened vmptrld failed\n",
-                                            __func__);
-                       vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
-                       vcpu->run->internal.suberror =
-                               KVM_INTERNAL_ERROR_EMULATION;
-                       vcpu->run->internal.ndata = 0;
+                   evmptrld_status == EVMPTRLD_ERROR)
                        return false;
-               }
        }
 
        return true;
@@ -3194,8 +3187,16 @@ static bool nested_get_vmcs12_pages(struct kvm_vcpu *vcpu)
 
 static bool vmx_get_nested_state_pages(struct kvm_vcpu *vcpu)
 {
-       if (!nested_get_evmcs_page(vcpu))
+       if (!nested_get_evmcs_page(vcpu)) {
+               pr_debug_ratelimited("%s: enlightened vmptrld failed\n",
+                                    __func__);
+               vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
+               vcpu->run->internal.suberror =
+                       KVM_INTERNAL_ERROR_EMULATION;
+               vcpu->run->internal.ndata = 0;
+
                return false;
+       }
 
        if (is_guest_mode(vcpu) && !nested_get_vmcs12_pages(vcpu))
                return false;
@@ -4435,7 +4436,15 @@ void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 vm_exit_reason,
        /* Similarly, triple faults in L2 should never escape. */
        WARN_ON_ONCE(kvm_check_request(KVM_REQ_TRIPLE_FAULT, vcpu));
 
-       kvm_clear_request(KVM_REQ_GET_NESTED_STATE_PAGES, vcpu);
+       if (kvm_check_request(KVM_REQ_GET_NESTED_STATE_PAGES, vcpu)) {
+               /*
+                * KVM_REQ_GET_NESTED_STATE_PAGES is also used to map
+                * Enlightened VMCS after migration and we still need to
+                * do that when something is forcing L2->L1 exit prior to
+                * the first L2 run.
+                */
+               (void)nested_get_evmcs_page(vcpu);
+       }
 
        /* Service the TLB flush request for L2 before switching to L1. */
        if (kvm_check_request(KVM_REQ_TLB_FLUSH_CURRENT, vcpu))
index d000cdd..4bceb5c 100644 (file)
@@ -455,21 +455,6 @@ static inline void vmx_segment_cache_clear(struct vcpu_vmx *vmx)
 
 static unsigned long host_idt_base;
 
-/*
- * Though SYSCALL is only supported in 64-bit mode on Intel CPUs, kvm
- * will emulate SYSCALL in legacy mode if the vendor string in guest
- * CPUID.0:{EBX,ECX,EDX} is "AuthenticAMD" or "AMDisbetter!" To
- * support this emulation, IA32_STAR must always be included in
- * vmx_uret_msrs_list[], even in i386 builds.
- */
-static const u32 vmx_uret_msrs_list[] = {
-#ifdef CONFIG_X86_64
-       MSR_SYSCALL_MASK, MSR_LSTAR, MSR_CSTAR,
-#endif
-       MSR_EFER, MSR_TSC_AUX, MSR_STAR,
-       MSR_IA32_TSX_CTRL,
-};
-
 #if IS_ENABLED(CONFIG_HYPERV)
 static bool __read_mostly enlightened_vmcs = true;
 module_param(enlightened_vmcs, bool, 0444);
@@ -697,21 +682,11 @@ static bool is_valid_passthrough_msr(u32 msr)
        return r;
 }
 
-static inline int __vmx_find_uret_msr(struct vcpu_vmx *vmx, u32 msr)
-{
-       int i;
-
-       for (i = 0; i < vmx->nr_uret_msrs; ++i)
-               if (vmx_uret_msrs_list[vmx->guest_uret_msrs[i].slot] == msr)
-                       return i;
-       return -1;
-}
-
 struct vmx_uret_msr *vmx_find_uret_msr(struct vcpu_vmx *vmx, u32 msr)
 {
        int i;
 
-       i = __vmx_find_uret_msr(vmx, msr);
+       i = kvm_find_user_return_msr(msr);
        if (i >= 0)
                return &vmx->guest_uret_msrs[i];
        return NULL;
@@ -720,13 +695,14 @@ struct vmx_uret_msr *vmx_find_uret_msr(struct vcpu_vmx *vmx, u32 msr)
 static int vmx_set_guest_uret_msr(struct vcpu_vmx *vmx,
                                  struct vmx_uret_msr *msr, u64 data)
 {
+       unsigned int slot = msr - vmx->guest_uret_msrs;
        int ret = 0;
 
        u64 old_msr_data = msr->data;
        msr->data = data;
-       if (msr - vmx->guest_uret_msrs < vmx->nr_active_uret_msrs) {
+       if (msr->load_into_hardware) {
                preempt_disable();
-               ret = kvm_set_user_return_msr(msr->slot, msr->data, msr->mask);
+               ret = kvm_set_user_return_msr(slot, msr->data, msr->mask);
                preempt_enable();
                if (ret)
                        msr->data = old_msr_data;
@@ -1078,7 +1054,7 @@ static bool update_transition_efer(struct vcpu_vmx *vmx)
                return false;
        }
 
-       i = __vmx_find_uret_msr(vmx, MSR_EFER);
+       i = kvm_find_user_return_msr(MSR_EFER);
        if (i < 0)
                return false;
 
@@ -1240,11 +1216,14 @@ void vmx_prepare_switch_to_guest(struct kvm_vcpu *vcpu)
         */
        if (!vmx->guest_uret_msrs_loaded) {
                vmx->guest_uret_msrs_loaded = true;
-               for (i = 0; i < vmx->nr_active_uret_msrs; ++i)
-                       kvm_set_user_return_msr(vmx->guest_uret_msrs[i].slot,
+               for (i = 0; i < kvm_nr_uret_msrs; ++i) {
+                       if (!vmx->guest_uret_msrs[i].load_into_hardware)
+                               continue;
+
+                       kvm_set_user_return_msr(i,
                                                vmx->guest_uret_msrs[i].data,
                                                vmx->guest_uret_msrs[i].mask);
-
+               }
        }
 
        if (vmx->nested.need_vmcs12_to_shadow_sync)
@@ -1751,19 +1730,16 @@ static void vmx_queue_exception(struct kvm_vcpu *vcpu)
        vmx_clear_hlt(vcpu);
 }
 
-static void vmx_setup_uret_msr(struct vcpu_vmx *vmx, unsigned int msr)
+static void vmx_setup_uret_msr(struct vcpu_vmx *vmx, unsigned int msr,
+                              bool load_into_hardware)
 {
-       struct vmx_uret_msr tmp;
-       int from, to;
+       struct vmx_uret_msr *uret_msr;
 
-       from = __vmx_find_uret_msr(vmx, msr);
-       if (from < 0)
+       uret_msr = vmx_find_uret_msr(vmx, msr);
+       if (!uret_msr)
                return;
-       to = vmx->nr_active_uret_msrs++;
 
-       tmp = vmx->guest_uret_msrs[to];
-       vmx->guest_uret_msrs[to] = vmx->guest_uret_msrs[from];
-       vmx->guest_uret_msrs[from] = tmp;
+       uret_msr->load_into_hardware = load_into_hardware;
 }
 
 /*
@@ -1773,29 +1749,42 @@ static void vmx_setup_uret_msr(struct vcpu_vmx *vmx, unsigned int msr)
  */
 static void setup_msrs(struct vcpu_vmx *vmx)
 {
-       vmx->guest_uret_msrs_loaded = false;
-       vmx->nr_active_uret_msrs = 0;
 #ifdef CONFIG_X86_64
+       bool load_syscall_msrs;
+
        /*
         * The SYSCALL MSRs are only needed on long mode guests, and only
         * when EFER.SCE is set.
         */
-       if (is_long_mode(&vmx->vcpu) && (vmx->vcpu.arch.efer & EFER_SCE)) {
-               vmx_setup_uret_msr(vmx, MSR_STAR);
-               vmx_setup_uret_msr(vmx, MSR_LSTAR);
-               vmx_setup_uret_msr(vmx, MSR_SYSCALL_MASK);
-       }
+       load_syscall_msrs = is_long_mode(&vmx->vcpu) &&
+                           (vmx->vcpu.arch.efer & EFER_SCE);
+
+       vmx_setup_uret_msr(vmx, MSR_STAR, load_syscall_msrs);
+       vmx_setup_uret_msr(vmx, MSR_LSTAR, load_syscall_msrs);
+       vmx_setup_uret_msr(vmx, MSR_SYSCALL_MASK, load_syscall_msrs);
 #endif
-       if (update_transition_efer(vmx))
-               vmx_setup_uret_msr(vmx, MSR_EFER);
+       vmx_setup_uret_msr(vmx, MSR_EFER, update_transition_efer(vmx));
 
-       if (guest_cpuid_has(&vmx->vcpu, X86_FEATURE_RDTSCP))
-               vmx_setup_uret_msr(vmx, MSR_TSC_AUX);
+       vmx_setup_uret_msr(vmx, MSR_TSC_AUX,
+                          guest_cpuid_has(&vmx->vcpu, X86_FEATURE_RDTSCP) ||
+                          guest_cpuid_has(&vmx->vcpu, X86_FEATURE_RDPID));
 
-       vmx_setup_uret_msr(vmx, MSR_IA32_TSX_CTRL);
+       /*
+        * hle=0, rtm=0, tsx_ctrl=1 can be found with some combinations of new
+        * kernel and old userspace.  If those guests run on a tsx=off host, do
+        * allow guests to use TSX_CTRL, but don't change the value in hardware
+        * so that TSX remains always disabled.
+        */
+       vmx_setup_uret_msr(vmx, MSR_IA32_TSX_CTRL, boot_cpu_has(X86_FEATURE_RTM));
 
        if (cpu_has_vmx_msr_bitmap())
                vmx_update_msr_bitmap(&vmx->vcpu);
+
+       /*
+        * The set of MSRs to load may have changed, reload MSRs before the
+        * next VM-Enter.
+        */
+       vmx->guest_uret_msrs_loaded = false;
 }
 
 static u64 vmx_write_l1_tsc_offset(struct kvm_vcpu *vcpu, u64 offset)
@@ -1993,11 +1982,6 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                else
                        msr_info->data = vmx->pt_desc.guest.addr_a[index / 2];
                break;
-       case MSR_TSC_AUX:
-               if (!msr_info->host_initiated &&
-                   !guest_cpuid_has(vcpu, X86_FEATURE_RDTSCP))
-                       return 1;
-               goto find_uret_msr;
        case MSR_IA32_DEBUGCTLMSR:
                msr_info->data = vmcs_read64(GUEST_IA32_DEBUGCTL);
                break;
@@ -2031,6 +2015,9 @@ static u64 vcpu_supported_debugctl(struct kvm_vcpu *vcpu)
        if (!intel_pmu_lbr_is_enabled(vcpu))
                debugctl &= ~DEBUGCTLMSR_LBR_MASK;
 
+       if (!guest_cpuid_has(vcpu, X86_FEATURE_BUS_LOCK_DETECT))
+               debugctl &= ~DEBUGCTLMSR_BUS_LOCK_DETECT;
+
        return debugctl;
 }
 
@@ -2313,14 +2300,6 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                else
                        vmx->pt_desc.guest.addr_a[index / 2] = data;
                break;
-       case MSR_TSC_AUX:
-               if (!msr_info->host_initiated &&
-                   !guest_cpuid_has(vcpu, X86_FEATURE_RDTSCP))
-                       return 1;
-               /* Check reserved bit, higher 32 bits should be zero */
-               if ((data >> 32) != 0)
-                       return 1;
-               goto find_uret_msr;
        case MSR_IA32_PERF_CAPABILITIES:
                if (data && !vcpu_to_pmu(vcpu)->version)
                        return 1;
@@ -4369,7 +4348,23 @@ static void vmx_compute_secondary_exec_control(struct vcpu_vmx *vmx)
                                                  xsaves_enabled, false);
        }
 
-       vmx_adjust_sec_exec_feature(vmx, &exec_control, rdtscp, RDTSCP);
+       /*
+        * RDPID is also gated by ENABLE_RDTSCP, turn on the control if either
+        * feature is exposed to the guest.  This creates a virtualization hole
+        * if both are supported in hardware but only one is exposed to the
+        * guest, but letting the guest execute RDTSCP or RDPID when either one
+        * is advertised is preferable to emulating the advertised instruction
+        * in KVM on #UD, and obviously better than incorrectly injecting #UD.
+        */
+       if (cpu_has_vmx_rdtscp()) {
+               bool rdpid_or_rdtscp_enabled =
+                       guest_cpuid_has(vcpu, X86_FEATURE_RDTSCP) ||
+                       guest_cpuid_has(vcpu, X86_FEATURE_RDPID);
+
+               vmx_adjust_secondary_exec_control(vmx, &exec_control,
+                                                 SECONDARY_EXEC_ENABLE_RDTSCP,
+                                                 rdpid_or_rdtscp_enabled, false);
+       }
        vmx_adjust_sec_exec_feature(vmx, &exec_control, invpcid, INVPCID);
 
        vmx_adjust_sec_exec_exiting(vmx, &exec_control, rdrand, RDRAND);
@@ -6855,6 +6850,7 @@ static void vmx_free_vcpu(struct kvm_vcpu *vcpu)
 
 static int vmx_create_vcpu(struct kvm_vcpu *vcpu)
 {
+       struct vmx_uret_msr *tsx_ctrl;
        struct vcpu_vmx *vmx;
        int i, cpu, err;
 
@@ -6877,43 +6873,19 @@ static int vmx_create_vcpu(struct kvm_vcpu *vcpu)
                        goto free_vpid;
        }
 
-       BUILD_BUG_ON(ARRAY_SIZE(vmx_uret_msrs_list) != MAX_NR_USER_RETURN_MSRS);
-
-       for (i = 0; i < ARRAY_SIZE(vmx_uret_msrs_list); ++i) {
-               u32 index = vmx_uret_msrs_list[i];
-               u32 data_low, data_high;
-               int j = vmx->nr_uret_msrs;
-
-               if (rdmsr_safe(index, &data_low, &data_high) < 0)
-                       continue;
-               if (wrmsr_safe(index, data_low, data_high) < 0)
-                       continue;
-
-               vmx->guest_uret_msrs[j].slot = i;
-               vmx->guest_uret_msrs[j].data = 0;
-               switch (index) {
-               case MSR_IA32_TSX_CTRL:
-                       /*
-                        * TSX_CTRL_CPUID_CLEAR is handled in the CPUID
-                        * interception.  Keep the host value unchanged to avoid
-                        * changing CPUID bits under the host kernel's feet.
-                        *
-                        * hle=0, rtm=0, tsx_ctrl=1 can be found with some
-                        * combinations of new kernel and old userspace.  If
-                        * those guests run on a tsx=off host, do allow guests
-                        * to use TSX_CTRL, but do not change the value on the
-                        * host so that TSX remains always disabled.
-                        */
-                       if (boot_cpu_has(X86_FEATURE_RTM))
-                               vmx->guest_uret_msrs[j].mask = ~(u64)TSX_CTRL_CPUID_CLEAR;
-                       else
-                               vmx->guest_uret_msrs[j].mask = 0;
-                       break;
-               default:
-                       vmx->guest_uret_msrs[j].mask = -1ull;
-                       break;
-               }
-               ++vmx->nr_uret_msrs;
+       for (i = 0; i < kvm_nr_uret_msrs; ++i) {
+               vmx->guest_uret_msrs[i].data = 0;
+               vmx->guest_uret_msrs[i].mask = -1ull;
+       }
+       if (boot_cpu_has(X86_FEATURE_RTM)) {
+               /*
+                * TSX_CTRL_CPUID_CLEAR is handled in the CPUID interception.
+                * Keep the host value unchanged to avoid changing CPUID bits
+                * under the host kernel's feet.
+                */
+               tsx_ctrl = vmx_find_uret_msr(vmx, MSR_IA32_TSX_CTRL);
+               if (tsx_ctrl)
+                       vmx->guest_uret_msrs[i].mask = ~(u64)TSX_CTRL_CPUID_CLEAR;
        }
 
        err = alloc_loaded_vmcs(&vmx->vmcs01);
@@ -7344,9 +7316,11 @@ static __init void vmx_set_cpu_caps(void)
        if (!cpu_has_vmx_xsaves())
                kvm_cpu_cap_clear(X86_FEATURE_XSAVES);
 
-       /* CPUID 0x80000001 */
-       if (!cpu_has_vmx_rdtscp())
+       /* CPUID 0x80000001 and 0x7 (RDPID) */
+       if (!cpu_has_vmx_rdtscp()) {
                kvm_cpu_cap_clear(X86_FEATURE_RDTSCP);
+               kvm_cpu_cap_clear(X86_FEATURE_RDPID);
+       }
 
        if (cpu_has_vmx_waitpkg())
                kvm_cpu_cap_check_and_set(X86_FEATURE_WAITPKG);
@@ -7402,8 +7376,9 @@ static int vmx_check_intercept(struct kvm_vcpu *vcpu,
        /*
         * RDPID causes #UD if disabled through secondary execution controls.
         * Because it is marked as EmulateOnUD, we need to intercept it here.
+        * Note, RDPID is hidden behind ENABLE_RDTSCP.
         */
-       case x86_intercept_rdtscp:
+       case x86_intercept_rdpid:
                if (!nested_cpu_has2(vmcs12, SECONDARY_EXEC_ENABLE_RDTSCP)) {
                        exception->vector = UD_VECTOR;
                        exception->error_code_valid = false;
@@ -7769,17 +7744,42 @@ static struct kvm_x86_ops vmx_x86_ops __initdata = {
        .vcpu_deliver_sipi_vector = kvm_vcpu_deliver_sipi_vector,
 };
 
+static __init void vmx_setup_user_return_msrs(void)
+{
+
+       /*
+        * Though SYSCALL is only supported in 64-bit mode on Intel CPUs, kvm
+        * will emulate SYSCALL in legacy mode if the vendor string in guest
+        * CPUID.0:{EBX,ECX,EDX} is "AuthenticAMD" or "AMDisbetter!" To
+        * support this emulation, MSR_STAR is included in the list for i386,
+        * but is never loaded into hardware.  MSR_CSTAR is also never loaded
+        * into hardware and is here purely for emulation purposes.
+        */
+       const u32 vmx_uret_msrs_list[] = {
+       #ifdef CONFIG_X86_64
+               MSR_SYSCALL_MASK, MSR_LSTAR, MSR_CSTAR,
+       #endif
+               MSR_EFER, MSR_TSC_AUX, MSR_STAR,
+               MSR_IA32_TSX_CTRL,
+       };
+       int i;
+
+       BUILD_BUG_ON(ARRAY_SIZE(vmx_uret_msrs_list) != MAX_NR_USER_RETURN_MSRS);
+
+       for (i = 0; i < ARRAY_SIZE(vmx_uret_msrs_list); ++i)
+               kvm_add_user_return_msr(vmx_uret_msrs_list[i]);
+}
+
 static __init int hardware_setup(void)
 {
        unsigned long host_bndcfgs;
        struct desc_ptr dt;
-       int r, i, ept_lpage_level;
+       int r, ept_lpage_level;
 
        store_idt(&dt);
        host_idt_base = dt.address;
 
-       for (i = 0; i < ARRAY_SIZE(vmx_uret_msrs_list); ++i)
-               kvm_define_user_return_msr(i, vmx_uret_msrs_list[i]);
+       vmx_setup_user_return_msrs();
 
        if (setup_vmcs_config(&vmcs_config, &vmx_capability) < 0)
                return -EIO;
index 008cb87..16e4e45 100644 (file)
@@ -36,7 +36,7 @@ struct vmx_msrs {
 };
 
 struct vmx_uret_msr {
-       unsigned int slot; /* The MSR's slot in kvm_user_return_msrs. */
+       bool load_into_hardware;
        u64 data;
        u64 mask;
 };
@@ -245,8 +245,16 @@ struct vcpu_vmx {
        u32                   idt_vectoring_info;
        ulong                 rflags;
 
+       /*
+        * User return MSRs are always emulated when enabled in the guest, but
+        * only loaded into hardware when necessary, e.g. SYSCALL #UDs outside
+        * of 64-bit mode or if EFER.SCE=1, thus the SYSCALL MSRs don't need to
+        * be loaded into hardware if those conditions aren't met.
+        * nr_active_uret_msrs tracks the number of MSRs that need to be loaded
+        * into hardware when running the guest.  guest_uret_msrs[] is resorted
+        * whenever the number of "active" uret MSRs is modified.
+        */
        struct vmx_uret_msr   guest_uret_msrs[MAX_NR_USER_RETURN_MSRS];
-       int                   nr_uret_msrs;
        int                   nr_active_uret_msrs;
        bool                  guest_uret_msrs_loaded;
 #ifdef CONFIG_X86_64
index 6eda283..bbc4e04 100644 (file)
@@ -184,11 +184,6 @@ module_param(pi_inject_timer, bint, S_IRUGO | S_IWUSR);
  */
 #define KVM_MAX_NR_USER_RETURN_MSRS 16
 
-struct kvm_user_return_msrs_global {
-       int nr;
-       u32 msrs[KVM_MAX_NR_USER_RETURN_MSRS];
-};
-
 struct kvm_user_return_msrs {
        struct user_return_notifier urn;
        bool registered;
@@ -198,7 +193,9 @@ struct kvm_user_return_msrs {
        } values[KVM_MAX_NR_USER_RETURN_MSRS];
 };
 
-static struct kvm_user_return_msrs_global __read_mostly user_return_msrs_global;
+u32 __read_mostly kvm_nr_uret_msrs;
+EXPORT_SYMBOL_GPL(kvm_nr_uret_msrs);
+static u32 __read_mostly kvm_uret_msrs_list[KVM_MAX_NR_USER_RETURN_MSRS];
 static struct kvm_user_return_msrs __percpu *user_return_msrs;
 
 #define KVM_SUPPORTED_XCR0     (XFEATURE_MASK_FP | XFEATURE_MASK_SSE \
@@ -330,23 +327,53 @@ static void kvm_on_user_return(struct user_return_notifier *urn)
                user_return_notifier_unregister(urn);
        }
        local_irq_restore(flags);
-       for (slot = 0; slot < user_return_msrs_global.nr; ++slot) {
+       for (slot = 0; slot < kvm_nr_uret_msrs; ++slot) {
                values = &msrs->values[slot];
                if (values->host != values->curr) {
-                       wrmsrl(user_return_msrs_global.msrs[slot], values->host);
+                       wrmsrl(kvm_uret_msrs_list[slot], values->host);
                        values->curr = values->host;
                }
        }
 }
 
-void kvm_define_user_return_msr(unsigned slot, u32 msr)
+static int kvm_probe_user_return_msr(u32 msr)
+{
+       u64 val;
+       int ret;
+
+       preempt_disable();
+       ret = rdmsrl_safe(msr, &val);
+       if (ret)
+               goto out;
+       ret = wrmsrl_safe(msr, val);
+out:
+       preempt_enable();
+       return ret;
+}
+
+int kvm_add_user_return_msr(u32 msr)
 {
-       BUG_ON(slot >= KVM_MAX_NR_USER_RETURN_MSRS);
-       user_return_msrs_global.msrs[slot] = msr;
-       if (slot >= user_return_msrs_global.nr)
-               user_return_msrs_global.nr = slot + 1;
+       BUG_ON(kvm_nr_uret_msrs >= KVM_MAX_NR_USER_RETURN_MSRS);
+
+       if (kvm_probe_user_return_msr(msr))
+               return -1;
+
+       kvm_uret_msrs_list[kvm_nr_uret_msrs] = msr;
+       return kvm_nr_uret_msrs++;
 }
-EXPORT_SYMBOL_GPL(kvm_define_user_return_msr);
+EXPORT_SYMBOL_GPL(kvm_add_user_return_msr);
+
+int kvm_find_user_return_msr(u32 msr)
+{
+       int i;
+
+       for (i = 0; i < kvm_nr_uret_msrs; ++i) {
+               if (kvm_uret_msrs_list[i] == msr)
+                       return i;
+       }
+       return -1;
+}
+EXPORT_SYMBOL_GPL(kvm_find_user_return_msr);
 
 static void kvm_user_return_msr_cpu_online(void)
 {
@@ -355,8 +382,8 @@ static void kvm_user_return_msr_cpu_online(void)
        u64 value;
        int i;
 
-       for (i = 0; i < user_return_msrs_global.nr; ++i) {
-               rdmsrl_safe(user_return_msrs_global.msrs[i], &value);
+       for (i = 0; i < kvm_nr_uret_msrs; ++i) {
+               rdmsrl_safe(kvm_uret_msrs_list[i], &value);
                msrs->values[i].host = value;
                msrs->values[i].curr = value;
        }
@@ -371,7 +398,7 @@ int kvm_set_user_return_msr(unsigned slot, u64 value, u64 mask)
        value = (value & mask) | (msrs->values[slot].host & ~mask);
        if (value == msrs->values[slot].curr)
                return 0;
-       err = wrmsrl_safe(user_return_msrs_global.msrs[slot], value);
+       err = wrmsrl_safe(kvm_uret_msrs_list[slot], value);
        if (err)
                return 1;
 
@@ -1149,6 +1176,9 @@ static u64 kvm_dr6_fixed(struct kvm_vcpu *vcpu)
 
        if (!guest_cpuid_has(vcpu, X86_FEATURE_RTM))
                fixed |= DR6_RTM;
+
+       if (!guest_cpuid_has(vcpu, X86_FEATURE_BUS_LOCK_DETECT))
+               fixed |= DR6_BUS_LOCK;
        return fixed;
 }
 
@@ -1615,6 +1645,30 @@ static int __kvm_set_msr(struct kvm_vcpu *vcpu, u32 index, u64 data,
                 * invokes 64-bit SYSENTER.
                 */
                data = get_canonical(data, vcpu_virt_addr_bits(vcpu));
+               break;
+       case MSR_TSC_AUX:
+               if (!kvm_is_supported_user_return_msr(MSR_TSC_AUX))
+                       return 1;
+
+               if (!host_initiated &&
+                   !guest_cpuid_has(vcpu, X86_FEATURE_RDTSCP) &&
+                   !guest_cpuid_has(vcpu, X86_FEATURE_RDPID))
+                       return 1;
+
+               /*
+                * Per Intel's SDM, bits 63:32 are reserved, but AMD's APM has
+                * incomplete and conflicting architectural behavior.  Current
+                * AMD CPUs completely ignore bits 63:32, i.e. they aren't
+                * reserved and always read as zeros.  Enforce Intel's reserved
+                * bits check if and only if the guest CPU is Intel, and clear
+                * the bits in all other cases.  This ensures cross-vendor
+                * migration will provide consistent behavior for the guest.
+                */
+               if (guest_cpuid_is_intel(vcpu) && (data >> 32) != 0)
+                       return 1;
+
+               data = (u32)data;
+               break;
        }
 
        msr.data = data;
@@ -1651,6 +1705,18 @@ int __kvm_get_msr(struct kvm_vcpu *vcpu, u32 index, u64 *data,
        if (!host_initiated && !kvm_msr_allowed(vcpu, index, KVM_MSR_FILTER_READ))
                return KVM_MSR_RET_FILTERED;
 
+       switch (index) {
+       case MSR_TSC_AUX:
+               if (!kvm_is_supported_user_return_msr(MSR_TSC_AUX))
+                       return 1;
+
+               if (!host_initiated &&
+                   !guest_cpuid_has(vcpu, X86_FEATURE_RDTSCP) &&
+                   !guest_cpuid_has(vcpu, X86_FEATURE_RDPID))
+                       return 1;
+               break;
+       }
+
        msr.index = index;
        msr.host_initiated = host_initiated;
 
@@ -3402,7 +3468,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
        case MSR_IA32_LASTBRANCHTOIP:
        case MSR_IA32_LASTINTFROMIP:
        case MSR_IA32_LASTINTTOIP:
-       case MSR_K8_SYSCFG:
+       case MSR_AMD64_SYSCFG:
        case MSR_K8_TSEG_ADDR:
        case MSR_K8_TSEG_MASK:
        case MSR_VM_HSAVE_PA:
@@ -5468,14 +5534,18 @@ static void kvm_free_msr_filter(struct kvm_x86_msr_filter *msr_filter)
 static int kvm_add_msr_filter(struct kvm_x86_msr_filter *msr_filter,
                              struct kvm_msr_filter_range *user_range)
 {
-       struct msr_bitmap_range range;
        unsigned long *bitmap = NULL;
        size_t bitmap_size;
-       int r;
 
        if (!user_range->nmsrs)
                return 0;
 
+       if (user_range->flags & ~(KVM_MSR_FILTER_READ | KVM_MSR_FILTER_WRITE))
+               return -EINVAL;
+
+       if (!user_range->flags)
+               return -EINVAL;
+
        bitmap_size = BITS_TO_LONGS(user_range->nmsrs) * sizeof(long);
        if (!bitmap_size || bitmap_size > KVM_MSR_FILTER_MAX_BITMAP_SIZE)
                return -EINVAL;
@@ -5484,31 +5554,15 @@ static int kvm_add_msr_filter(struct kvm_x86_msr_filter *msr_filter,
        if (IS_ERR(bitmap))
                return PTR_ERR(bitmap);
 
-       range = (struct msr_bitmap_range) {
+       msr_filter->ranges[msr_filter->count] = (struct msr_bitmap_range) {
                .flags = user_range->flags,
                .base = user_range->base,
                .nmsrs = user_range->nmsrs,
                .bitmap = bitmap,
        };
 
-       if (range.flags & ~(KVM_MSR_FILTER_READ | KVM_MSR_FILTER_WRITE)) {
-               r = -EINVAL;
-               goto err;
-       }
-
-       if (!range.flags) {
-               r = -EINVAL;
-               goto err;
-       }
-
-       /* Everything ok, add this range identifier. */
-       msr_filter->ranges[msr_filter->count] = range;
        msr_filter->count++;
-
        return 0;
-err:
-       kfree(bitmap);
-       return r;
 }
 
 static int kvm_vm_ioctl_set_msr_filter(struct kvm *kvm, void __user *argp)
@@ -5937,7 +5991,8 @@ static void kvm_init_msr_list(void)
                                continue;
                        break;
                case MSR_TSC_AUX:
-                       if (!kvm_cpu_cap_has(X86_FEATURE_RDTSCP))
+                       if (!kvm_cpu_cap_has(X86_FEATURE_RDTSCP) &&
+                           !kvm_cpu_cap_has(X86_FEATURE_RDPID))
                                continue;
                        break;
                case MSR_IA32_UMWAIT_CONTROL:
@@ -8040,6 +8095,18 @@ static void pvclock_gtod_update_fn(struct work_struct *work)
 static DECLARE_WORK(pvclock_gtod_work, pvclock_gtod_update_fn);
 
 /*
+ * Indirection to move queue_work() out of the tk_core.seq write held
+ * region to prevent possible deadlocks against time accessors which
+ * are invoked with work related locks held.
+ */
+static void pvclock_irq_work_fn(struct irq_work *w)
+{
+       queue_work(system_long_wq, &pvclock_gtod_work);
+}
+
+static DEFINE_IRQ_WORK(pvclock_irq_work, pvclock_irq_work_fn);
+
+/*
  * Notification about pvclock gtod data update.
  */
 static int pvclock_gtod_notify(struct notifier_block *nb, unsigned long unused,
@@ -8050,13 +8117,14 @@ static int pvclock_gtod_notify(struct notifier_block *nb, unsigned long unused,
 
        update_pvclock_gtod(tk);
 
-       /* disable master clock if host does not trust, or does not
-        * use, TSC based clocksource.
+       /*
+        * Disable master clock if host does not trust, or does not use,
+        * TSC based clocksource. Delegate queue_work() to irq_work as
+        * this is invoked with tk_core.seq write held.
         */
        if (!gtod_is_based_on_tsc(gtod->clock.vclock_mode) &&
            atomic_read(&kvm_guest_has_master_clock) != 0)
-               queue_work(system_long_wq, &pvclock_gtod_work);
-
+               irq_work_queue(&pvclock_irq_work);
        return 0;
 }
 
@@ -8118,6 +8186,7 @@ int kvm_arch_init(void *opaque)
                printk(KERN_ERR "kvm: failed to allocate percpu kvm_user_return_msrs\n");
                goto out_free_x86_emulator_cache;
        }
+       kvm_nr_uret_msrs = 0;
 
        r = kvm_mmu_module_init();
        if (r)
@@ -8168,6 +8237,8 @@ void kvm_arch_exit(void)
        cpuhp_remove_state_nocalls(CPUHP_AP_X86_KVM_CLK_ONLINE);
 #ifdef CONFIG_X86_64
        pvclock_gtod_unregister_notifier(&pvclock_gtod_notifier);
+       irq_work_sync(&pvclock_irq_work);
+       cancel_work_sync(&pvclock_gtod_work);
 #endif
        kvm_x86_ops.hardware_enable = NULL;
        kvm_mmu_module_exit();
index b93d6cd..121921b 100644 (file)
@@ -5,7 +5,7 @@
 #include <xen/xen.h>
 
 #include <asm/fpu/internal.h>
-#include <asm/sev-es.h>
+#include <asm/sev.h>
 #include <asm/traps.h>
 #include <asm/kdebug.h>
 
index 04aba7e..a9639f6 100644 (file)
@@ -529,7 +529,7 @@ void __init sme_enable(struct boot_params *bp)
                /*
                 * No SME if Hypervisor bit is set. This check is here to
                 * prevent a guest from trying to enable SME. For running as a
-                * KVM guest the MSR_K8_SYSCFG will be sufficient, but there
+                * KVM guest the MSR_AMD64_SYSCFG will be sufficient, but there
                 * might be other hypervisors which emulate that MSR as non-zero
                 * or even pass it through to the guest.
                 * A malicious hypervisor can still trick a guest into this
@@ -542,8 +542,8 @@ void __init sme_enable(struct boot_params *bp)
                        return;
 
                /* For SME, check the SYSCFG MSR */
-               msr = __rdmsr(MSR_K8_SYSCFG);
-               if (!(msr & MSR_K8_SYSCFG_MEM_ENCRYPT))
+               msr = __rdmsr(MSR_AMD64_SYSCFG);
+               if (!(msr & MSR_AMD64_SYSCFG_MEM_ENCRYPT))
                        return;
        } else {
                /* SEV state cannot be controlled by a command line option */
index ae744b6..dd40d3f 100644 (file)
@@ -284,7 +284,7 @@ static int __init early_root_info_init(void)
 
        /* need to take out [4G, TOM2) for RAM*/
        /* SYS_CFG */
-       address = MSR_K8_SYSCFG;
+       address = MSR_AMD64_SYSCFG;
        rdmsrl(address, val);
        /* TOP_MEM2 is enabled? */
        if (val & (1<<21)) {
index df7b547..7515e78 100644 (file)
@@ -47,7 +47,7 @@
 #include <asm/realmode.h>
 #include <asm/time.h>
 #include <asm/pgalloc.h>
-#include <asm/sev-es.h>
+#include <asm/sev.h>
 
 /*
  * We allocate runtime services regions top-down, starting from -4G, i.e.
index 1be71ef..2e1c1be 100644 (file)
@@ -9,7 +9,7 @@
 #include <asm/realmode.h>
 #include <asm/tlbflush.h>
 #include <asm/crash.h>
-#include <asm/sev-es.h>
+#include <asm/sev.h>
 
 struct real_mode_header *real_mode_header;
 u32 *trampoline_cr4_features;
index 84c5d1b..cc8391f 100644 (file)
@@ -123,9 +123,9 @@ SYM_CODE_START(startup_32)
         */
        btl     $TH_FLAGS_SME_ACTIVE_BIT, pa_tr_flags
        jnc     .Ldone
-       movl    $MSR_K8_SYSCFG, %ecx
+       movl    $MSR_AMD64_SYSCFG, %ecx
        rdmsr
-       bts     $MSR_K8_SYSCFG_MEM_ENCRYPT_BIT, %eax
+       bts     $MSR_AMD64_SYSCFG_MEM_ENCRYPT_BIT, %eax
        jc      .Ldone
 
        /*
index 17503fe..e87699a 100644 (file)
@@ -1273,16 +1273,16 @@ asmlinkage __visible void __init xen_start_kernel(void)
        /* Get mfn list */
        xen_build_dynamic_phys_to_machine();
 
+       /* Work out if we support NX */
+       get_cpu_cap(&boot_cpu_data);
+       x86_configure_nx();
+
        /*
         * Set up kernel GDT and segment registers, mainly so that
         * -fstack-protector code can be executed.
         */
        xen_setup_gdt(0);
 
-       /* Work out if we support NX */
-       get_cpu_cap(&boot_cpu_data);
-       x86_configure_nx();
-
        /* Determine virtual and physical address sizes */
        get_cpu_address_sizes(&boot_cpu_data);
 
index 9d76d43..fd2f302 100644 (file)
 440    common  process_madvise                 sys_process_madvise
 441    common  epoll_pwait2                    sys_epoll_pwait2
 442    common  mount_setattr                   sys_mount_setattr
-443    common  quotactl_path                   sys_quotactl_path
+# 443 reserved for quotactl_path
 444    common  landlock_create_ruleset         sys_landlock_create_ruleset
 445    common  landlock_add_rule               sys_landlock_add_rule
 446    common  landlock_restrict_self          sys_landlock_restrict_self
index 0270cd7..acd1f88 100644 (file)
@@ -372,9 +372,38 @@ struct bfq_queue *bic_to_bfqq(struct bfq_io_cq *bic, bool is_sync)
        return bic->bfqq[is_sync];
 }
 
+static void bfq_put_stable_ref(struct bfq_queue *bfqq);
+
 void bic_set_bfqq(struct bfq_io_cq *bic, struct bfq_queue *bfqq, bool is_sync)
 {
+       /*
+        * If bfqq != NULL, then a non-stable queue merge between
+        * bic->bfqq and bfqq is happening here. This causes troubles
+        * in the following case: bic->bfqq has also been scheduled
+        * for a possible stable merge with bic->stable_merge_bfqq,
+        * and bic->stable_merge_bfqq == bfqq happens to
+        * hold. Troubles occur because bfqq may then undergo a split,
+        * thereby becoming eligible for a stable merge. Yet, if
+        * bic->stable_merge_bfqq points exactly to bfqq, then bfqq
+        * would be stably merged with itself. To avoid this anomaly,
+        * we cancel the stable merge if
+        * bic->stable_merge_bfqq == bfqq.
+        */
        bic->bfqq[is_sync] = bfqq;
+
+       if (bfqq && bic->stable_merge_bfqq == bfqq) {
+               /*
+                * Actually, these same instructions are executed also
+                * in bfq_setup_cooperator, in case of abort or actual
+                * execution of a stable merge. We could avoid
+                * repeating these instructions there too, but if we
+                * did so, we would nest even more complexity in this
+                * function.
+                */
+               bfq_put_stable_ref(bic->stable_merge_bfqq);
+
+               bic->stable_merge_bfqq = NULL;
+       }
 }
 
 struct bfq_data *bic_to_bfqd(struct bfq_io_cq *bic)
@@ -2263,10 +2292,9 @@ static void bfq_remove_request(struct request_queue *q,
 
 }
 
-static bool bfq_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio,
+static bool bfq_bio_merge(struct request_queue *q, struct bio *bio,
                unsigned int nr_segs)
 {
-       struct request_queue *q = hctx->queue;
        struct bfq_data *bfqd = q->elevator->elevator_data;
        struct request *free = NULL;
        /*
@@ -2631,8 +2659,6 @@ static bool bfq_may_be_close_cooperator(struct bfq_queue *bfqq,
 static bool idling_boosts_thr_without_issues(struct bfq_data *bfqd,
                                             struct bfq_queue *bfqq);
 
-static void bfq_put_stable_ref(struct bfq_queue *bfqq);
-
 /*
  * Attempt to schedule a merge of bfqq with the currently in-service
  * queue or with a close queue among the scheduled queues.  Return
index e0c4baa..c2d6bc8 100644 (file)
@@ -1069,7 +1069,17 @@ static void __propagate_weights(struct ioc_gq *iocg, u32 active, u32 inuse,
 
        lockdep_assert_held(&ioc->lock);
 
-       inuse = clamp_t(u32, inuse, 1, active);
+       /*
+        * For an active leaf node, its inuse shouldn't be zero or exceed
+        * @active. An active internal node's inuse is solely determined by the
+        * inuse to active ratio of its children regardless of @inuse.
+        */
+       if (list_empty(&iocg->active_list) && iocg->child_active_sum) {
+               inuse = DIV64_U64_ROUND_UP(active * iocg->child_inuse_sum,
+                                          iocg->child_active_sum);
+       } else {
+               inuse = clamp_t(u32, inuse, 1, active);
+       }
 
        iocg->last_inuse = iocg->inuse;
        if (save)
@@ -1086,7 +1096,7 @@ static void __propagate_weights(struct ioc_gq *iocg, u32 active, u32 inuse,
                /* update the level sums */
                parent->child_active_sum += (s32)(active - child->active);
                parent->child_inuse_sum += (s32)(inuse - child->inuse);
-               /* apply the udpates */
+               /* apply the updates */
                child->active = active;
                child->inuse = inuse;
 
index 42a365b..996a4b2 100644 (file)
@@ -358,14 +358,16 @@ bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio,
                unsigned int nr_segs)
 {
        struct elevator_queue *e = q->elevator;
-       struct blk_mq_ctx *ctx = blk_mq_get_ctx(q);
-       struct blk_mq_hw_ctx *hctx = blk_mq_map_queue(q, bio->bi_opf, ctx);
+       struct blk_mq_ctx *ctx;
+       struct blk_mq_hw_ctx *hctx;
        bool ret = false;
        enum hctx_type type;
 
        if (e && e->type->ops.bio_merge)
-               return e->type->ops.bio_merge(hctx, bio, nr_segs);
+               return e->type->ops.bio_merge(q, bio, nr_segs);
 
+       ctx = blk_mq_get_ctx(q);
+       hctx = blk_mq_map_queue(q, bio->bi_opf, ctx);
        type = hctx->type;
        if (!(hctx->flags & BLK_MQ_F_SHOULD_MERGE) ||
            list_empty_careful(&ctx->rq_lists[type]))
index 466676b..c86c01b 100644 (file)
@@ -2232,8 +2232,9 @@ blk_qc_t blk_mq_submit_bio(struct bio *bio)
                /* Bypass scheduler for flush requests */
                blk_insert_flush(rq);
                blk_mq_run_hw_queue(data.hctx, true);
-       } else if (plug && (q->nr_hw_queues == 1 || q->mq_ops->commit_rqs ||
-                               !blk_queue_nonrot(q))) {
+       } else if (plug && (q->nr_hw_queues == 1 ||
+                  blk_mq_is_sbitmap_shared(rq->mq_hctx->flags) ||
+                  q->mq_ops->commit_rqs || !blk_queue_nonrot(q))) {
                /*
                 * Use plugging if we have a ->commit_rqs() hook as well, as
                 * we know the driver uses bd->last in a smart fashion.
@@ -3285,10 +3286,12 @@ EXPORT_SYMBOL(blk_mq_init_allocated_queue);
 /* tags can _not_ be used after returning from blk_mq_exit_queue */
 void blk_mq_exit_queue(struct request_queue *q)
 {
-       struct blk_mq_tag_set   *set = q->tag_set;
+       struct blk_mq_tag_set *set = q->tag_set;
 
-       blk_mq_del_queue_tag_set(q);
+       /* Checks hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED. */
        blk_mq_exit_hw_queues(q, set, set->nr_hw_queues);
+       /* May clear BLK_MQ_F_TAG_QUEUE_SHARED in hctx->flags. */
+       blk_mq_del_queue_tag_set(q);
 }
 
 static int __blk_mq_alloc_rq_maps(struct blk_mq_tag_set *set)
index 39ca97b..9f8cb7b 100644 (file)
@@ -29,8 +29,6 @@
 
 static struct kobject *block_depr;
 
-DECLARE_RWSEM(bdev_lookup_sem);
-
 /* for extended dynamic devt allocation, currently only one major is used */
 #define NR_EXT_DEVT            (1 << MINORBITS)
 static DEFINE_IDA(ext_devt_ida);
@@ -609,13 +607,8 @@ void del_gendisk(struct gendisk *disk)
        blk_integrity_del(disk);
        disk_del_events(disk);
 
-       /*
-        * Block lookups of the disk until all bdevs are unhashed and the
-        * disk is marked as dead (GENHD_FL_UP cleared).
-        */
-       down_write(&bdev_lookup_sem);
-
        mutex_lock(&disk->part0->bd_mutex);
+       disk->flags &= ~GENHD_FL_UP;
        blk_drop_partitions(disk);
        mutex_unlock(&disk->part0->bd_mutex);
 
@@ -629,8 +622,6 @@ void del_gendisk(struct gendisk *disk)
        remove_inode_hash(disk->part0->bd_inode);
 
        set_capacity(disk, 0);
-       disk->flags &= ~GENHD_FL_UP;
-       up_write(&bdev_lookup_sem);
 
        if (!(disk->flags & GENHD_FL_HIDDEN)) {
                sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
index 8969e12..81e3279 100644 (file)
@@ -561,11 +561,12 @@ static void kyber_limit_depth(unsigned int op, struct blk_mq_alloc_data *data)
        }
 }
 
-static bool kyber_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio,
+static bool kyber_bio_merge(struct request_queue *q, struct bio *bio,
                unsigned int nr_segs)
 {
+       struct blk_mq_ctx *ctx = blk_mq_get_ctx(q);
+       struct blk_mq_hw_ctx *hctx = blk_mq_map_queue(q, bio->bi_opf, ctx);
        struct kyber_hctx_data *khd = hctx->sched_data;
-       struct blk_mq_ctx *ctx = blk_mq_get_ctx(hctx->queue);
        struct kyber_ctx_queue *kcq = &khd->kcqs[ctx->index_hw[hctx->type]];
        unsigned int sched_domain = kyber_sched_domain(bio->bi_opf);
        struct list_head *rq_list = &kcq->rq_list[sched_domain];
index 04aded7..8eea2cb 100644 (file)
@@ -461,10 +461,9 @@ static int dd_request_merge(struct request_queue *q, struct request **rq,
        return ELEVATOR_NO_MERGE;
 }
 
-static bool dd_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio,
+static bool dd_bio_merge(struct request_queue *q, struct bio *bio,
                unsigned int nr_segs)
 {
-       struct request_queue *q = hctx->queue;
        struct deadline_data *dd = q->elevator->elevator_data;
        struct request *free = NULL;
        bool ret;
index b64bfdd..e271679 100644 (file)
@@ -682,7 +682,7 @@ static void utf16_le_to_7bit(const __le16 *in, unsigned int size, u8 *out)
 }
 
 /**
- * efi_partition(struct parsed_partitions *state)
+ * efi_partition - scan for GPT partitions
  * @state: disk parsed partitions
  *
  * Description: called from check.c, if the disk contains GPT
index 16c0fe8..d260bc1 100644 (file)
@@ -1313,6 +1313,7 @@ int acpi_dev_pm_attach(struct device *dev, bool power_on)
                {"PNP0C0B", }, /* Generic ACPI fan */
                {"INT3404", }, /* Fan */
                {"INTC1044", }, /* Fan for Tiger Lake generation */
+               {"INTC1048", }, /* Fan for Alder Lake generation */
                {}
        };
        struct acpi_device *adev = ACPI_COMPANION(dev);
index b852cff..f973bbe 100644 (file)
@@ -142,6 +142,7 @@ int acpi_device_sleep_wake(struct acpi_device *dev,
 int acpi_power_get_inferred_state(struct acpi_device *device, int *state);
 int acpi_power_on_resources(struct acpi_device *device, int state);
 int acpi_power_transition(struct acpi_device *device, int state);
+void acpi_turn_off_unused_power_resources(void);
 
 /* --------------------------------------------------------------------------
                               Device Power Management
index 958aaac..23d9a09 100644 (file)
@@ -686,6 +686,13 @@ int nfit_spa_type(struct acpi_nfit_system_address *spa)
        return -1;
 }
 
+static size_t sizeof_spa(struct acpi_nfit_system_address *spa)
+{
+       if (spa->flags & ACPI_NFIT_LOCATION_COOKIE_VALID)
+               return sizeof(*spa);
+       return sizeof(*spa) - 8;
+}
+
 static bool add_spa(struct acpi_nfit_desc *acpi_desc,
                struct nfit_table_prev *prev,
                struct acpi_nfit_system_address *spa)
@@ -693,22 +700,22 @@ static bool add_spa(struct acpi_nfit_desc *acpi_desc,
        struct device *dev = acpi_desc->dev;
        struct nfit_spa *nfit_spa;
 
-       if (spa->header.length != sizeof(*spa))
+       if (spa->header.length != sizeof_spa(spa))
                return false;
 
        list_for_each_entry(nfit_spa, &prev->spas, list) {
-               if (memcmp(nfit_spa->spa, spa, sizeof(*spa)) == 0) {
+               if (memcmp(nfit_spa->spa, spa, sizeof_spa(spa)) == 0) {
                        list_move_tail(&nfit_spa->list, &acpi_desc->spas);
                        return true;
                }
        }
 
-       nfit_spa = devm_kzalloc(dev, sizeof(*nfit_spa) + sizeof(*spa),
+       nfit_spa = devm_kzalloc(dev, sizeof(*nfit_spa) + sizeof_spa(spa),
                        GFP_KERNEL);
        if (!nfit_spa)
                return false;
        INIT_LIST_HEAD(&nfit_spa->list);
-       memcpy(nfit_spa->spa, spa, sizeof(*spa));
+       memcpy(nfit_spa->spa, spa, sizeof_spa(spa));
        list_add_tail(&nfit_spa->list, &acpi_desc->spas);
        dev_dbg(dev, "spa index: %d type: %s\n",
                        spa->range_index,
index 32974b5..56102ea 100644 (file)
@@ -995,6 +995,7 @@ void acpi_resume_power_resources(void)
 
        mutex_unlock(&power_resource_list_lock);
 }
+#endif
 
 void acpi_turn_off_unused_power_resources(void)
 {
@@ -1015,4 +1016,3 @@ void acpi_turn_off_unused_power_resources(void)
 
        mutex_unlock(&power_resource_list_lock);
 }
-#endif
index a22778e..453eff8 100644 (file)
@@ -700,6 +700,7 @@ int acpi_device_add(struct acpi_device *device,
 
                result = acpi_device_set_name(device, acpi_device_bus_id);
                if (result) {
+                       kfree_const(acpi_device_bus_id->bus_id);
                        kfree(acpi_device_bus_id);
                        goto err_unlock;
                }
@@ -2359,6 +2360,8 @@ int __init acpi_scan_init(void)
                }
        }
 
+       acpi_turn_off_unused_power_resources();
+
        acpi_scan_initialized = true;
 
  out:
index 1856f76..7fe41ee 100644 (file)
@@ -8,7 +8,6 @@ extern struct list_head acpi_wakeup_device_list;
 extern struct mutex acpi_device_lock;
 
 extern void acpi_resume_power_resources(void);
-extern void acpi_turn_off_unused_power_resources(void);
 
 static inline acpi_status acpi_set_waking_vector(u32 wakeup_address)
 {
index 61d34e1..bcec598 100644 (file)
@@ -4918,7 +4918,7 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
                uint32_t enable;
 
                if (copy_from_user(&enable, ubuf, sizeof(enable))) {
-                       ret = -EINVAL;
+                       ret = -EFAULT;
                        goto err;
                }
                binder_inner_proc_lock(proc);
index 4a8bf8c..628e339 100644 (file)
@@ -150,7 +150,7 @@ void fwnode_links_purge(struct fwnode_handle *fwnode)
        fwnode_links_purge_consumers(fwnode);
 }
 
-static void fw_devlink_purge_absent_suppliers(struct fwnode_handle *fwnode)
+void fw_devlink_purge_absent_suppliers(struct fwnode_handle *fwnode)
 {
        struct fwnode_handle *child;
 
@@ -164,6 +164,7 @@ static void fw_devlink_purge_absent_suppliers(struct fwnode_handle *fwnode)
        fwnode_for_each_available_child_node(fwnode, child)
                fw_devlink_purge_absent_suppliers(child);
 }
+EXPORT_SYMBOL_GPL(fw_devlink_purge_absent_suppliers);
 
 #ifdef CONFIG_SRCU
 static DEFINE_MUTEX(device_links_lock);
index 1fc1a99..b570848 100644 (file)
@@ -1637,6 +1637,7 @@ void pm_runtime_init(struct device *dev)
        dev->power.request_pending = false;
        dev->power.request = RPM_REQ_NONE;
        dev->power.deferred_resume = false;
+       dev->power.needs_force_resume = 0;
        INIT_WORK(&dev->power.work, pm_runtime_work);
 
        dev->power.timer_expires = 0;
@@ -1804,10 +1805,12 @@ int pm_runtime_force_suspend(struct device *dev)
         * its parent, but set its status to RPM_SUSPENDED anyway in case this
         * function will be called again for it in the meantime.
         */
-       if (pm_runtime_need_not_resume(dev))
+       if (pm_runtime_need_not_resume(dev)) {
                pm_runtime_set_suspended(dev);
-       else
+       } else {
                __update_runtime_status(dev, RPM_SUSPENDED);
+               dev->power.needs_force_resume = 1;
+       }
 
        return 0;
 
@@ -1834,7 +1837,7 @@ int pm_runtime_force_resume(struct device *dev)
        int (*callback)(struct device *);
        int ret = 0;
 
-       if (!pm_runtime_status_suspended(dev) || pm_runtime_need_not_resume(dev))
+       if (!pm_runtime_status_suspended(dev) || !dev->power.needs_force_resume)
                goto out;
 
        /*
@@ -1853,6 +1856,7 @@ int pm_runtime_force_resume(struct device *dev)
 
        pm_runtime_mark_last_busy(dev);
 out:
+       dev->power.needs_force_resume = 0;
        pm_runtime_enable(dev);
        return ret;
 }
index 4ff71b5..45d2c28 100644 (file)
@@ -1980,7 +1980,8 @@ static void nbd_disconnect_and_put(struct nbd_device *nbd)
         * config ref and try to destroy the workqueue from inside the work
         * queue.
         */
-       flush_workqueue(nbd->recv_workq);
+       if (nbd->recv_workq)
+               flush_workqueue(nbd->recv_workq);
        if (test_and_clear_bit(NBD_RT_HAS_CONFIG_REF,
                               &nbd->config->runtime_flags))
                nbd_config_put(nbd);
@@ -2014,12 +2015,11 @@ static int nbd_genl_disconnect(struct sk_buff *skb, struct genl_info *info)
                return -EINVAL;
        }
        mutex_unlock(&nbd_index_mutex);
-       if (!refcount_inc_not_zero(&nbd->config_refs)) {
-               nbd_put(nbd);
-               return 0;
-       }
+       if (!refcount_inc_not_zero(&nbd->config_refs))
+               goto put_nbd;
        nbd_disconnect_and_put(nbd);
        nbd_config_put(nbd);
+put_nbd:
        nbd_put(nbd);
        return 0;
 }
index 742b4a0..c6d8c0f 100644 (file)
@@ -744,6 +744,13 @@ static const struct blk_mq_ops gdrom_mq_ops = {
 static int probe_gdrom(struct platform_device *devptr)
 {
        int err;
+
+       /*
+        * Ensure our "one" device is initialized properly in case of previous
+        * usages of it
+        */
+       memset(&gd, 0, sizeof(gd));
+
        /* Start the device */
        if (gdrom_execute_diagnostic() != 1) {
                pr_warn("ATA Probe for GDROM failed\n");
@@ -830,6 +837,8 @@ static int remove_gdrom(struct platform_device *devptr)
        if (gdrom_major)
                unregister_blkdev(gdrom_major, GDROM_DEV_NAME);
        unregister_cdrom(gd.cd_info);
+       kfree(gd.cd_info);
+       kfree(gd.toc);
 
        return 0;
 }
@@ -845,7 +854,7 @@ static struct platform_driver gdrom_driver = {
 static int __init init_gdrom(void)
 {
        int rc;
-       gd.toc = NULL;
+
        rc = platform_driver_register(&gdrom_driver);
        if (rc)
                return rc;
@@ -861,8 +870,6 @@ static void __exit exit_gdrom(void)
 {
        platform_device_unregister(pd);
        platform_driver_unregister(&gdrom_driver);
-       kfree(gd.toc);
-       kfree(gd.cd_info);
 }
 
 module_init(init_gdrom);
index ed3b7da..8b55085 100644 (file)
@@ -984,6 +984,8 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data)
                hdp->hd_phys_address = fixmem32->address;
                hdp->hd_address = ioremap(fixmem32->address,
                                                HPET_RANGE_SIZE);
+               if (!hdp->hd_address)
+                       return AE_ERROR;
 
                if (hpet_is_known(hdp)) {
                        iounmap(hdp->hd_address);
index eff1f12..c84d239 100644 (file)
@@ -656,6 +656,7 @@ int tpm2_get_cc_attrs_tbl(struct tpm_chip *chip)
 
        if (nr_commands !=
            be32_to_cpup((__be32 *)&buf.data[TPM_HEADER_SIZE + 5])) {
+               rc = -EFAULT;
                tpm_buf_destroy(&buf);
                goto out;
        }
index a2e0395..55b9d39 100644 (file)
@@ -709,16 +709,14 @@ static int tpm_tis_gen_interrupt(struct tpm_chip *chip)
        cap_t cap;
        int ret;
 
-       /* TPM 2.0 */
-       if (chip->flags & TPM_CHIP_FLAG_TPM2)
-               return tpm2_get_tpm_pt(chip, 0x100, &cap2, desc);
-
-       /* TPM 1.2 */
        ret = request_locality(chip, 0);
        if (ret < 0)
                return ret;
 
-       ret = tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc, 0);
+       if (chip->flags & TPM_CHIP_FLAG_TPM2)
+               ret = tpm2_get_tpm_pt(chip, 0x100, &cap2, desc);
+       else
+               ret = tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc, 0);
 
        release_locality(chip, 0);
 
@@ -1127,12 +1125,20 @@ int tpm_tis_resume(struct device *dev)
        if (ret)
                return ret;
 
-       /* TPM 1.2 requires self-test on resume. This function actually returns
+       /*
+        * TPM 1.2 requires self-test on resume. This function actually returns
         * an error code but for unknown reason it isn't handled.
         */
-       if (!(chip->flags & TPM_CHIP_FLAG_TPM2))
+       if (!(chip->flags & TPM_CHIP_FLAG_TPM2)) {
+               ret = request_locality(chip, 0);
+               if (ret < 0)
+                       return ret;
+
                tpm1_do_selftest(chip);
 
+               release_locality(chip, 0);
+       }
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(tpm_tis_resume);
index e2ec1b7..65508eb 100644 (file)
@@ -4540,6 +4540,9 @@ int of_clk_add_provider(struct device_node *np,
        struct of_clk_provider *cp;
        int ret;
 
+       if (!np)
+               return 0;
+
        cp = kzalloc(sizeof(*cp), GFP_KERNEL);
        if (!cp)
                return -ENOMEM;
@@ -4579,6 +4582,9 @@ int of_clk_add_hw_provider(struct device_node *np,
        struct of_clk_provider *cp;
        int ret;
 
+       if (!np)
+               return 0;
+
        cp = kzalloc(sizeof(*cp), GFP_KERNEL);
        if (!cp)
                return -ENOMEM;
@@ -4676,6 +4682,9 @@ void of_clk_del_provider(struct device_node *np)
 {
        struct of_clk_provider *cp;
 
+       if (!np)
+               return;
+
        mutex_lock(&of_clk_mutex);
        list_for_each_entry(cp, &of_clk_providers, link) {
                if (cp->node == np) {
index 977fd05..d6ece7b 100644 (file)
@@ -419,7 +419,7 @@ static void resume_hv_clock_tsc(struct clocksource *arg)
        hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr);
 }
 
-#ifdef VDSO_CLOCKMODE_HVCLOCK
+#ifdef HAVE_VDSO_CLOCKMODE_HVCLOCK
 static int hv_cs_enable(struct clocksource *cs)
 {
        vclocks_set_used(VDSO_CLOCKMODE_HVCLOCK);
@@ -435,7 +435,7 @@ static struct clocksource hyperv_cs_tsc = {
        .flags  = CLOCK_SOURCE_IS_CONTINUOUS,
        .suspend= suspend_hv_clock_tsc,
        .resume = resume_hv_clock_tsc,
-#ifdef VDSO_CLOCKMODE_HVCLOCK
+#ifdef HAVE_VDSO_CLOCKMODE_HVCLOCK
        .enable = hv_cs_enable,
        .vdso_clock_mode = VDSO_CLOCKMODE_HVCLOCK,
 #else
index d1bbc16..7e74504 100644 (file)
@@ -646,7 +646,11 @@ static u64 get_max_boost_ratio(unsigned int cpu)
                return 0;
        }
 
-       highest_perf = perf_caps.highest_perf;
+       if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
+               highest_perf = amd_get_highest_perf();
+       else
+               highest_perf = perf_caps.highest_perf;
+
        nominal_perf = perf_caps.nominal_perf;
 
        if (!highest_perf || !nominal_perf) {
index f040106..0e69dff 100644 (file)
@@ -3033,6 +3033,14 @@ static const struct x86_cpu_id hwp_support_ids[] __initconst = {
        {}
 };
 
+static bool intel_pstate_hwp_is_enabled(void)
+{
+       u64 value;
+
+       rdmsrl(MSR_PM_ENABLE, value);
+       return !!(value & 0x1);
+}
+
 static int __init intel_pstate_init(void)
 {
        const struct x86_cpu_id *id;
@@ -3051,8 +3059,12 @@ static int __init intel_pstate_init(void)
                 * Avoid enabling HWP for processors without EPP support,
                 * because that means incomplete HWP implementation which is a
                 * corner case and supporting it is generally problematic.
+                *
+                * If HWP is enabled already, though, there is no choice but to
+                * deal with it.
                 */
-               if (!no_hwp && boot_cpu_has(X86_FEATURE_HWP_EPP)) {
+               if ((!no_hwp && boot_cpu_has(X86_FEATURE_HWP_EPP)) ||
+                   intel_pstate_hwp_is_enabled()) {
                        hwp_active++;
                        hwp_mode_bdw = id->driver_data;
                        intel_pstate.attr = hwp_cpufreq_attrs;
index facc8e6..d385daf 100644 (file)
@@ -442,7 +442,6 @@ static int nitrox_probe(struct pci_dev *pdev,
        err = pci_request_mem_regions(pdev, nitrox_driver_name);
        if (err) {
                pci_disable_device(pdev);
-               dev_err(&pdev->dev, "Failed to request mem regions!\n");
                return err;
        }
        pci_set_master(pdev);
index f264b70..eadd1ea 100644 (file)
@@ -760,7 +760,7 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev,
 
                if (dma_buf_is_dynamic(attach->dmabuf)) {
                        dma_resv_lock(attach->dmabuf->resv, NULL);
-                       ret = dma_buf_pin(attach);
+                       ret = dmabuf->ops->pin(attach);
                        if (ret)
                                goto err_unlock;
                }
@@ -786,7 +786,7 @@ err_attach:
 
 err_unpin:
        if (dma_buf_is_dynamic(attach->dmabuf))
-               dma_buf_unpin(attach);
+               dmabuf->ops->unpin(attach);
 
 err_unlock:
        if (dma_buf_is_dynamic(attach->dmabuf))
@@ -843,7 +843,7 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach)
                __unmap_dma_buf(attach, attach->sgt, attach->dir);
 
                if (dma_buf_is_dynamic(attach->dmabuf)) {
-                       dma_buf_unpin(attach);
+                       dmabuf->ops->unpin(attach);
                        dma_resv_unlock(attach->dmabuf->resv);
                }
        }
@@ -956,7 +956,7 @@ struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach,
        if (dma_buf_is_dynamic(attach->dmabuf)) {
                dma_resv_assert_held(attach->dmabuf->resv);
                if (!IS_ENABLED(CONFIG_DMABUF_MOVE_NOTIFY)) {
-                       r = dma_buf_pin(attach);
+                       r = attach->dmabuf->ops->pin(attach);
                        if (r)
                                return ERR_PTR(r);
                }
@@ -968,7 +968,7 @@ struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach,
 
        if (IS_ERR(sg_table) && dma_buf_is_dynamic(attach->dmabuf) &&
             !IS_ENABLED(CONFIG_DMABUF_MOVE_NOTIFY))
-               dma_buf_unpin(attach);
+               attach->dmabuf->ops->unpin(attach);
 
        if (!IS_ERR(sg_table) && attach->dmabuf->ops->cache_sgt_mapping) {
                attach->sgt = sg_table;
index 806ca02..6202660 100644 (file)
@@ -418,8 +418,23 @@ static int __init hidma_mgmt_init(void)
                hidma_mgmt_of_populate_channels(child);
        }
 #endif
-       return platform_driver_register(&hidma_mgmt_driver);
+       /*
+        * We do not check for return value here, as it is assumed that
+        * platform_driver_register must not fail. The reason for this is that
+        * the (potential) hidma_mgmt_of_populate_channels calls above are not
+        * cleaned up if it does fail, and to do this work is quite
+        * complicated. In particular, various calls of of_address_to_resource,
+        * of_irq_to_resource, platform_device_register_full, of_dma_configure,
+        * and of_msi_configure which then call other functions and so on, must
+        * be cleaned up - this is not a trivial exercise.
+        *
+        * Currently, this module is not intended to be unloaded, and there is
+        * no module_exit function defined which does the needed cleanup. For
+        * this reason, we have to assume success here.
+        */
+       platform_driver_register(&hidma_mgmt_driver);
 
+       return 0;
 }
 module_init(hidma_mgmt_init);
 MODULE_LICENSE("GPL v2");
index 9fa4dfc..f0d8f60 100644 (file)
@@ -3083,7 +3083,7 @@ static void read_mc_regs(struct amd64_pvt *pvt)
        edac_dbg(0, "  TOP_MEM:  0x%016llx\n", pvt->top_mem);
 
        /* Check first whether TOP_MEM2 is enabled: */
-       rdmsrl(MSR_K8_SYSCFG, msr_val);
+       rdmsrl(MSR_AMD64_SYSCFG, msr_val);
        if (msr_val & BIT(21)) {
                rdmsrl(MSR_K8_TOP_MEM2, pvt->top_mem2);
                edac_dbg(0, "  TOP_MEM2: 0x%016llx\n", pvt->top_mem2);
index ce0324b..4e9b627 100644 (file)
@@ -79,8 +79,6 @@ struct scmi_protocol_events {
 
 int scmi_notification_init(struct scmi_handle *handle);
 void scmi_notification_exit(struct scmi_handle *handle);
-
-struct scmi_protocol_handle;
 int scmi_register_protocol_events(const struct scmi_handle *handle, u8 proto_id,
                                  const struct scmi_protocol_handle *ph,
                                  const struct scmi_protocol_events *ee);
index d0dee37..4ceba5e 100644 (file)
@@ -552,8 +552,10 @@ static unsigned long scpi_clk_get_val(u16 clk_id)
 
        ret = scpi_send_message(CMD_GET_CLOCK_VALUE, &le_clk_id,
                                sizeof(le_clk_id), &rate, sizeof(rate));
+       if (ret)
+               return 0;
 
-       return ret ? ret : le32_to_cpu(rate);
+       return le32_to_cpu(rate);
 }
 
 static int scpi_clk_set_val(u16 clk_id, unsigned long rate)
index a4d3239..4ab3fcd 100644 (file)
@@ -278,6 +278,7 @@ static const struct of_device_id cdns_of_ids[] = {
        { .compatible = "cdns,gpio-r1p02" },
        { /* sentinel */ },
 };
+MODULE_DEVICE_TABLE(of, cdns_of_ids);
 
 static struct platform_driver cdns_gpio_driver = {
        .driver = {
index 1bd9e44..05974b7 100644 (file)
@@ -444,16 +444,6 @@ static int tegra186_irq_set_wake(struct irq_data *data, unsigned int on)
        return 0;
 }
 
-static int tegra186_irq_set_affinity(struct irq_data *data,
-                                    const struct cpumask *dest,
-                                    bool force)
-{
-       if (data->parent_data)
-               return irq_chip_set_affinity_parent(data, dest, force);
-
-       return -EINVAL;
-}
-
 static void tegra186_gpio_irq(struct irq_desc *desc)
 {
        struct tegra_gpio *gpio = irq_desc_get_handler_data(desc);
@@ -700,7 +690,6 @@ static int tegra186_gpio_probe(struct platform_device *pdev)
        gpio->intc.irq_unmask = tegra186_irq_unmask;
        gpio->intc.irq_set_type = tegra186_irq_set_type;
        gpio->intc.irq_set_wake = tegra186_irq_set_wake;
-       gpio->intc.irq_set_affinity = tegra186_irq_set_affinity;
 
        irq = &gpio->gpio.irq;
        irq->chip = &gpio->intc;
index b411d31..136557e 100644 (file)
@@ -542,7 +542,7 @@ static void xgpio_irqhandler(struct irq_desc *desc)
 }
 
 /**
- * xgpio_of_probe - Probe method for the GPIO device.
+ * xgpio_probe - Probe method for the GPIO device.
  * @pdev: pointer to the platform device
  *
  * Return:
index dc3a692..264176a 100644 (file)
@@ -1006,6 +1006,7 @@ struct amdgpu_device {
        struct amdgpu_df                df;
 
        struct amdgpu_ip_block          ip_blocks[AMDGPU_MAX_IP_NUM];
+       uint32_t                        harvest_ip_mask;
        int                             num_ip_blocks;
        struct mutex    mn_lock;
        DECLARE_HASHTABLE(mn_hash, 7);
index 7d3b546..66ddfe4 100644 (file)
@@ -1683,6 +1683,19 @@ int amdgpu_device_ip_block_add(struct amdgpu_device *adev,
        if (!ip_block_version)
                return -EINVAL;
 
+       switch (ip_block_version->type) {
+       case AMD_IP_BLOCK_TYPE_VCN:
+               if (adev->harvest_ip_mask & AMD_HARVEST_IP_VCN_MASK)
+                       return 0;
+               break;
+       case AMD_IP_BLOCK_TYPE_JPEG:
+               if (adev->harvest_ip_mask & AMD_HARVEST_IP_JPEG_MASK)
+                       return 0;
+               break;
+       default:
+               break;
+       }
+
        DRM_INFO("add ip block number %d <%s>\n", adev->num_ip_blocks,
                  ip_block_version->funcs->name);
 
@@ -3111,7 +3124,6 @@ bool amdgpu_device_has_dc_support(struct amdgpu_device *adev)
        return amdgpu_device_asic_has_dc_support(adev->asic_type);
 }
 
-
 static void amdgpu_device_xgmi_reset_func(struct work_struct *__work)
 {
        struct amdgpu_device *adev =
@@ -3276,6 +3288,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
        adev->vm_manager.vm_pte_funcs = NULL;
        adev->vm_manager.vm_pte_num_scheds = 0;
        adev->gmc.gmc_funcs = NULL;
+       adev->harvest_ip_mask = 0x0;
        adev->fence_context = dma_fence_context_alloc(AMDGPU_MAX_RINGS);
        bitmap_zero(adev->gfx.pipe_reserve_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);
 
@@ -4466,7 +4479,6 @@ out:
                        r = amdgpu_ib_ring_tests(tmp_adev);
                        if (r) {
                                dev_err(tmp_adev->dev, "ib ring test failed (%d).\n", r);
-                               r = amdgpu_device_ip_suspend(tmp_adev);
                                need_full_reset = true;
                                r = -EAGAIN;
                                goto end;
index b2dbcb4..e1b6f58 100644 (file)
@@ -373,6 +373,34 @@ int amdgpu_discovery_get_ip_version(struct amdgpu_device *adev, int hw_id,
        return -EINVAL;
 }
 
+void amdgpu_discovery_harvest_ip(struct amdgpu_device *adev)
+{
+       struct binary_header *bhdr;
+       struct harvest_table *harvest_info;
+       int i;
+
+       bhdr = (struct binary_header *)adev->mman.discovery_bin;
+       harvest_info = (struct harvest_table *)(adev->mman.discovery_bin +
+                       le16_to_cpu(bhdr->table_list[HARVEST_INFO].offset));
+
+       for (i = 0; i < 32; i++) {
+               if (le32_to_cpu(harvest_info->list[i].hw_id) == 0)
+                       break;
+
+               switch (le32_to_cpu(harvest_info->list[i].hw_id)) {
+               case VCN_HWID:
+                       adev->harvest_ip_mask |= AMD_HARVEST_IP_VCN_MASK;
+                       adev->harvest_ip_mask |= AMD_HARVEST_IP_JPEG_MASK;
+                       break;
+               case DMU_HWID:
+                       adev->harvest_ip_mask |= AMD_HARVEST_IP_DMU_MASK;
+                       break;
+               default:
+                       break;
+               }
+       }
+}
+
 int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev)
 {
        struct binary_header *bhdr;
index 8f61838..1b1ae21 100644 (file)
@@ -29,6 +29,7 @@
 
 void amdgpu_discovery_fini(struct amdgpu_device *adev);
 int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev);
+void amdgpu_discovery_harvest_ip(struct amdgpu_device *adev);
 int amdgpu_discovery_get_ip_version(struct amdgpu_device *adev, int hw_id,
                                     int *major, int *minor, int *revision);
 int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev);
index 4f10c45..09b0486 100644 (file)
@@ -288,10 +288,13 @@ out:
 static int amdgpu_fbdev_destroy(struct drm_device *dev, struct amdgpu_fbdev *rfbdev)
 {
        struct amdgpu_framebuffer *rfb = &rfbdev->rfb;
+       int i;
 
        drm_fb_helper_unregister_fbi(&rfbdev->helper);
 
        if (rfb->base.obj[0]) {
+               for (i = 0; i < rfb->base.format->num_planes; i++)
+                       drm_gem_object_put(rfb->base.obj[0]);
                amdgpufb_destroy_pinned_object(rfb->base.obj[0]);
                rfb->base.obj[0] = NULL;
                drm_framebuffer_unregister_private(&rfb->base);
index 3bef043..d5cbc51 100644 (file)
@@ -225,7 +225,7 @@ static int amdgpu_ttm_map_buffer(struct ttm_buffer_object *bo,
        *addr += mm_cur->start & ~PAGE_MASK;
 
        num_dw = ALIGN(adev->mman.buffer_funcs->copy_num_dw, 8);
-       num_bytes = num_pages * 8;
+       num_bytes = num_pages * 8 * AMDGPU_GPU_PAGES_IN_CPU_PAGE;
 
        r = amdgpu_job_alloc_with_ib(adev, num_dw * 4 + num_bytes,
                                     AMDGPU_IB_POOL_DELAYED, &job);
@@ -1210,6 +1210,7 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_device *bdev,
        if (gtt && gtt->userptr) {
                amdgpu_ttm_tt_set_user_pages(ttm, NULL);
                kfree(ttm->sg);
+               ttm->sg = NULL;
                ttm->page_flags &= ~TTM_PAGE_FLAG_SG;
                return;
        }
index 2408ed4..7ce76a6 100644 (file)
@@ -1395,9 +1395,10 @@ static const struct soc15_reg_golden golden_settings_gc_10_1_2[] =
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG, 0xffffffff, 0x20000000),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xffffffff, 0x00000420),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG3, 0xffffffff, 0x00000200),
-       SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG4, 0xffffffff, 0x04800000),
+       SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG4, 0xffffffff, 0x04900000),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DFSM_TILES_IN_FLIGHT, 0x0000ffff, 0x0000003f),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_LAST_OF_BURST_CONFIG, 0xffffffff, 0x03860204),
+       SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0x0c1800ff, 0x00000044),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmGCR_GENERAL_CNTL, 0x1ff0ffff, 0x00000500),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmGE_PRIV_CONTROL, 0x00007fff, 0x000001fe),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL1_PIPE_STEER, 0xffffffff, 0xe4e4e4e4),
@@ -1415,12 +1416,13 @@ static const struct soc15_reg_golden golden_settings_gc_10_1_2[] =
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_2, 0x00000820, 0x00000820),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmRMI_SPARE, 0xffffffff, 0xffff3101),
+       SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_CONFIG_CNTL_1, 0x001f0000, 0x00070104),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_ALU_CLK_CTRL, 0xffffffff, 0xffffffff),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_ARB_CONFIG, 0x00000133, 0x00000130),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQ_LDS_CLK_CTRL, 0xffffffff, 0xffffffff),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfff7ffff, 0x01030000),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CNTL, 0xffdf80ff, 0x479c0010),
-       SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0xffffffff, 0x00800000)
+       SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0xffffffff, 0x00c00000)
 };
 
 static bool gfx_v10_is_rlcg_rw(struct amdgpu_device *adev, u32 offset, uint32_t *flag, bool write)
index a078a38..516467e 100644 (file)
@@ -4943,7 +4943,7 @@ static void gfx_v9_0_update_3d_clock_gating(struct amdgpu_device *adev,
        amdgpu_gfx_rlc_enter_safe_mode(adev);
 
        /* Enable 3D CGCG/CGLS */
-       if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGCG)) {
+       if (enable) {
                /* write cmd to clear cgcg/cgls ov */
                def = data = RREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE);
                /* unset CGCG override */
@@ -4955,8 +4955,12 @@ static void gfx_v9_0_update_3d_clock_gating(struct amdgpu_device *adev,
                /* enable 3Dcgcg FSM(0x0000363f) */
                def = RREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D);
 
-               data = (0x36 << RLC_CGCG_CGLS_CTRL_3D__CGCG_GFX_IDLE_THRESHOLD__SHIFT) |
-                       RLC_CGCG_CGLS_CTRL_3D__CGCG_EN_MASK;
+               if (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGCG)
+                       data = (0x36 << RLC_CGCG_CGLS_CTRL_3D__CGCG_GFX_IDLE_THRESHOLD__SHIFT) |
+                               RLC_CGCG_CGLS_CTRL_3D__CGCG_EN_MASK;
+               else
+                       data = 0x0 << RLC_CGCG_CGLS_CTRL_3D__CGCG_GFX_IDLE_THRESHOLD__SHIFT;
+
                if (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGLS)
                        data |= (0x000F << RLC_CGCG_CGLS_CTRL_3D__CGLS_REP_COMPANSAT_DELAY__SHIFT) |
                                RLC_CGCG_CGLS_CTRL_3D__CGLS_EN_MASK;
index 8353199..938ef4c 100644 (file)
@@ -198,8 +198,6 @@ static int jpeg_v2_5_hw_fini(void *handle)
                if (adev->jpeg.cur_state != AMD_PG_STATE_GATE &&
                      RREG32_SOC15(JPEG, i, mmUVD_JRBC_STATUS))
                        jpeg_v2_5_set_powergating_state(adev, AMD_PG_STATE_GATE);
-
-               ring->sched.ready = false;
        }
 
        return 0;
index de5dfcf..94be353 100644 (file)
@@ -166,8 +166,6 @@ static int jpeg_v3_0_hw_fini(void *handle)
              RREG32_SOC15(JPEG, 0, mmUVD_JRBC_STATUS))
                jpeg_v3_0_set_powergating_state(adev, AMD_PG_STATE_GATE);
 
-       ring->sched.ready = false;
-
        return 0;
 }
 
index d54af7f..d290ca0 100644 (file)
@@ -623,6 +623,16 @@ static const struct amdgpu_ip_block_version nv_common_ip_block =
        .funcs = &nv_common_ip_funcs,
 };
 
+static bool nv_is_headless_sku(struct pci_dev *pdev)
+{
+       if ((pdev->device == 0x731E &&
+           (pdev->revision == 0xC6 || pdev->revision == 0xC7)) ||
+           (pdev->device == 0x7340 && pdev->revision == 0xC9)  ||
+           (pdev->device == 0x7360 && pdev->revision == 0xC7))
+               return true;
+       return false;
+}
+
 static int nv_reg_base_init(struct amdgpu_device *adev)
 {
        int r;
@@ -635,6 +645,12 @@ static int nv_reg_base_init(struct amdgpu_device *adev)
                        goto legacy_init;
                }
 
+               amdgpu_discovery_harvest_ip(adev);
+               if (nv_is_headless_sku(adev->pdev)) {
+                       adev->harvest_ip_mask |= AMD_HARVEST_IP_VCN_MASK;
+                       adev->harvest_ip_mask |= AMD_HARVEST_IP_JPEG_MASK;
+               }
+
                return 0;
        }
 
@@ -671,16 +687,6 @@ void nv_set_virt_ops(struct amdgpu_device *adev)
        adev->virt.ops = &xgpu_nv_virt_ops;
 }
 
-static bool nv_is_headless_sku(struct pci_dev *pdev)
-{
-       if ((pdev->device == 0x731E &&
-           (pdev->revision == 0xC6 || pdev->revision == 0xC7)) ||
-           (pdev->device == 0x7340 && pdev->revision == 0xC9)  ||
-           (pdev->device == 0x7360 && pdev->revision == 0xC7))
-               return true;
-       return false;
-}
-
 int nv_set_ip_blocks(struct amdgpu_device *adev)
 {
        int r;
@@ -728,8 +734,7 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)
                if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT &&
                    !amdgpu_sriov_vf(adev))
                        amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
-               if (!nv_is_headless_sku(adev->pdev))
-                       amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);
+               amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);
                amdgpu_device_ip_block_add(adev, &jpeg_v2_0_ip_block);
                if (adev->enable_mes)
                        amdgpu_device_ip_block_add(adev, &mes_v10_1_ip_block);
@@ -752,8 +757,7 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)
                if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT &&
                    !amdgpu_sriov_vf(adev))
                        amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
-               if (!nv_is_headless_sku(adev->pdev))
-                       amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);
+               amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);
                if (!amdgpu_sriov_vf(adev))
                        amdgpu_device_ip_block_add(adev, &jpeg_v2_0_ip_block);
                break;
@@ -777,7 +781,6 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)
                amdgpu_device_ip_block_add(adev, &vcn_v3_0_ip_block);
                if (!amdgpu_sriov_vf(adev))
                        amdgpu_device_ip_block_add(adev, &jpeg_v3_0_ip_block);
-
                if (adev->enable_mes)
                        amdgpu_device_ip_block_add(adev, &mes_v10_1_ip_block);
                break;
@@ -1149,6 +1152,11 @@ static int nv_common_early_init(void *handle)
                return -EINVAL;
        }
 
+       if (adev->harvest_ip_mask & AMD_HARVEST_IP_VCN_MASK)
+               adev->pg_flags &= ~(AMD_PG_SUPPORT_VCN |
+                                   AMD_PG_SUPPORT_VCN_DPG |
+                                   AMD_PG_SUPPORT_JPEG);
+
        if (amdgpu_sriov_vf(adev)) {
                amdgpu_virt_init_setting(adev);
                xgpu_nv_mailbox_set_irq_funcs(adev);
index 920fc6d..8859133 100644 (file)
@@ -123,6 +123,10 @@ static const struct soc15_reg_golden golden_settings_sdma_nv14[] = {
 
 static const struct soc15_reg_golden golden_settings_sdma_nv12[] = {
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_RLC3_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),
+       SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_GB_ADDR_CONFIG, 0x001877ff, 0x00000044),
+       SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_GB_ADDR_CONFIG_READ, 0x001877ff, 0x00000044),
+       SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_GB_ADDR_CONFIG, 0x001877ff, 0x00000044),
+       SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_GB_ADDR_CONFIG_READ, 0x001877ff, 0x00000044),
        SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_RLC3_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),
 };
 
index b1ad9e5..240596b 100644 (file)
@@ -497,11 +497,6 @@ static void sdma_v5_2_gfx_stop(struct amdgpu_device *adev)
                ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0);
                WREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL), ib_cntl);
        }
-
-       sdma0->sched.ready = false;
-       sdma1->sched.ready = false;
-       sdma2->sched.ready = false;
-       sdma3->sched.ready = false;
 }
 
 /**
index d80e12b..e65c286 100644 (file)
@@ -302,6 +302,7 @@ static int soc15_query_video_codecs(struct amdgpu_device *adev, bool encode,
                        *codecs = &rv_video_codecs_decode;
                return 0;
        case CHIP_ARCTURUS:
+       case CHIP_ALDEBARAN:
        case CHIP_RENOIR:
                if (encode)
                        *codecs = &vega_video_codecs_encode;
@@ -1392,7 +1393,6 @@ static int soc15_common_early_init(void *handle)
                        adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
                                AMD_CG_SUPPORT_GFX_MGLS |
                                AMD_CG_SUPPORT_GFX_CP_LS |
-                               AMD_CG_SUPPORT_GFX_3D_CGCG |
                                AMD_CG_SUPPORT_GFX_3D_CGLS |
                                AMD_CG_SUPPORT_GFX_CGCG |
                                AMD_CG_SUPPORT_GFX_CGLS |
@@ -1401,7 +1401,8 @@ static int soc15_common_early_init(void *handle)
                                AMD_CG_SUPPORT_MC_MGCG |
                                AMD_CG_SUPPORT_MC_LS |
                                AMD_CG_SUPPORT_SDMA_MGCG |
-                               AMD_CG_SUPPORT_SDMA_LS;
+                               AMD_CG_SUPPORT_SDMA_LS |
+                               AMD_CG_SUPPORT_VCN_MGCG;
 
                        adev->pg_flags = AMD_PG_SUPPORT_SDMA |
                                AMD_PG_SUPPORT_MMHUB |
@@ -1411,7 +1412,6 @@ static int soc15_common_early_init(void *handle)
                                AMD_CG_SUPPORT_GFX_MGLS |
                                AMD_CG_SUPPORT_GFX_RLC_LS |
                                AMD_CG_SUPPORT_GFX_CP_LS |
-                               AMD_CG_SUPPORT_GFX_3D_CGCG |
                                AMD_CG_SUPPORT_GFX_3D_CGLS |
                                AMD_CG_SUPPORT_GFX_CGCG |
                                AMD_CG_SUPPORT_GFX_CGLS |
index 51a773a..0c1beef 100644 (file)
@@ -1119,10 +1119,10 @@ static int vcn_v1_0_stop_spg_mode(struct amdgpu_device *adev)
                UVD_LMI_STATUS__WRITE_CLEAN_RAW_MASK;
        SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_LMI_STATUS, tmp, tmp);
 
-       /* put VCPU into reset */
-       WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET),
-               UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK,
-               ~UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
+       /* stall UMC channel */
+       WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2),
+               UVD_LMI_CTRL2__STALL_ARB_UMC_MASK,
+               ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK);
 
        tmp = UVD_LMI_STATUS__UMC_READ_CLEAN_RAW_MASK |
                UVD_LMI_STATUS__UMC_WRITE_CLEAN_RAW_MASK;
@@ -1141,6 +1141,11 @@ static int vcn_v1_0_stop_spg_mode(struct amdgpu_device *adev)
                UVD_SOFT_RESET__LMI_SOFT_RESET_MASK,
                ~UVD_SOFT_RESET__LMI_SOFT_RESET_MASK);
 
+       /* put VCPU into reset */
+       WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET),
+               UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK,
+               ~UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
+
        WREG32_SOC15(UVD, 0, mmUVD_STATUS, 0);
 
        vcn_v1_0_enable_clock_gating(adev);
index cf165ab..14470da 100644 (file)
@@ -373,7 +373,7 @@ static int vcn_v3_0_hw_fini(void *handle)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        struct amdgpu_ring *ring;
-       int i, j;
+       int i;
 
        for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
                if (adev->vcn.harvest_config & (1 << i))
@@ -388,12 +388,6 @@ static int vcn_v3_0_hw_fini(void *handle)
                                vcn_v3_0_set_powergating_state(adev, AMD_PG_STATE_GATE);
                        }
                }
-               ring->sched.ready = false;
-
-               for (j = 0; j < adev->vcn.num_enc_rings; ++j) {
-                       ring = &adev->vcn.inst[i].ring_enc[j];
-                       ring->sched.ready = false;
-               }
        }
 
        return 0;
index 616f5b1..666796a 100644 (file)
@@ -650,6 +650,7 @@ struct hdcp_workqueue *hdcp_create_workqueue(struct amdgpu_device *adev, struct
 
        /* File created at /sys/class/drm/card0/device/hdcp_srm*/
        hdcp_work[0].attr = data_attr;
+       sysfs_bin_attr_init(&hdcp_work[0].attr);
 
        if (sysfs_create_bin_file(&adev->dev->kobj, &hdcp_work[0].attr))
                DRM_WARN("Failed to create device file hdcp_srm");
index f4374d8..c1f5474 100644 (file)
@@ -1076,6 +1076,24 @@ static bool dc_link_detect_helper(struct dc_link *link,
                            dc_is_dvi_signal(link->connector_signal)) {
                                if (prev_sink)
                                        dc_sink_release(prev_sink);
+                               link_disconnect_sink(link);
+
+                               return false;
+                       }
+                       /*
+                        * Abort detection for DP connectors if we have
+                        * no EDID and connector is active converter
+                        * as there are no display downstream
+                        *
+                        */
+                       if (dc_is_dp_sst_signal(link->connector_signal) &&
+                               (link->dpcd_caps.dongle_type ==
+                                               DISPLAY_DONGLE_DP_VGA_CONVERTER ||
+                               link->dpcd_caps.dongle_type ==
+                                               DISPLAY_DONGLE_DP_DVI_CONVERTER)) {
+                               if (prev_sink)
+                                       dc_sink_release(prev_sink);
+                               link_disconnect_sink(link);
 
                                return false;
                        }
index 4a5fa23..5fcc2e6 100644 (file)
@@ -826,10 +826,11 @@ static const struct dc_plane_cap plane_cap = {
                        .fp16 = 16000
        },
 
+       /* 6:1 downscaling ratio: 1000/6 = 166.666 */
        .max_downscale_factor = {
-                       .argb8888 = 600,
-                       .nv12 = 600,
-                       .fp16 = 600
+                       .argb8888 = 167,
+                       .nv12 = 167,
+                       .fp16 = 167
        }
 };
 
index 5b54b7f..472696f 100644 (file)
@@ -843,10 +843,11 @@ static const struct dc_plane_cap plane_cap = {
                        .fp16 = 16000
        },
 
+       /* 6:1 downscaling ratio: 1000/6 = 166.666 */
        .max_downscale_factor = {
-                       .argb8888 = 600,
-                       .nv12 = 600,
-                       .fp16 = 600
+                       .argb8888 = 167,
+                       .nv12 = 167,
+                       .fp16 = 167 
        },
        64,
        64
index fc2dea2..a33f036 100644 (file)
@@ -284,10 +284,11 @@ static const struct dc_plane_cap plane_cap = {
                                .nv12 = 16000,
                                .fp16 = 16000
                },
+               /* 6:1 downscaling ratio: 1000/6 = 166.666 */
                .max_downscale_factor = {
-                               .argb8888 = 600,
-                               .nv12 = 600,
-                               .fp16 = 600
+                               .argb8888 = 167,
+                               .nv12 = 167,
+                               .fp16 = 167
                },
                16,
                16
index 43ed629..9ab706c 100644 (file)
@@ -216,6 +216,12 @@ enum PP_FEATURE_MASK {
        PP_GFX_DCS_MASK = 0x80000,
 };
 
+enum amd_harvest_ip_mask {
+    AMD_HARVEST_IP_VCN_MASK = 0x1,
+    AMD_HARVEST_IP_JPEG_MASK = 0x2,
+    AMD_HARVEST_IP_DMU_MASK = 0x4,
+};
+
 enum DC_FEATURE_MASK {
        DC_FBC_MASK = 0x1,
        DC_MULTI_MON_PP_MCLK_SWITCH_MASK = 0x2,
index 26a5321..15c0b8a 100644 (file)
@@ -4817,70 +4817,70 @@ static int si_populate_smc_initial_state(struct amdgpu_device *adev,
        u32 reg;
        int ret;
 
-       table->initialState.levels[0].mclk.vDLL_CNTL =
+       table->initialState.level.mclk.vDLL_CNTL =
                cpu_to_be32(si_pi->clock_registers.dll_cntl);
-       table->initialState.levels[0].mclk.vMCLK_PWRMGT_CNTL =
+       table->initialState.level.mclk.vMCLK_PWRMGT_CNTL =
                cpu_to_be32(si_pi->clock_registers.mclk_pwrmgt_cntl);
-       table->initialState.levels[0].mclk.vMPLL_AD_FUNC_CNTL =
+       table->initialState.level.mclk.vMPLL_AD_FUNC_CNTL =
                cpu_to_be32(si_pi->clock_registers.mpll_ad_func_cntl);
-       table->initialState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL =
+       table->initialState.level.mclk.vMPLL_DQ_FUNC_CNTL =
                cpu_to_be32(si_pi->clock_registers.mpll_dq_func_cntl);
-       table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL =
+       table->initialState.level.mclk.vMPLL_FUNC_CNTL =
                cpu_to_be32(si_pi->clock_registers.mpll_func_cntl);
-       table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL_1 =
+       table->initialState.level.mclk.vMPLL_FUNC_CNTL_1 =
                cpu_to_be32(si_pi->clock_registers.mpll_func_cntl_1);
-       table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL_2 =
+       table->initialState.level.mclk.vMPLL_FUNC_CNTL_2 =
                cpu_to_be32(si_pi->clock_registers.mpll_func_cntl_2);
-       table->initialState.levels[0].mclk.vMPLL_SS =
+       table->initialState.level.mclk.vMPLL_SS =
                cpu_to_be32(si_pi->clock_registers.mpll_ss1);
-       table->initialState.levels[0].mclk.vMPLL_SS2 =
+       table->initialState.level.mclk.vMPLL_SS2 =
                cpu_to_be32(si_pi->clock_registers.mpll_ss2);
 
-       table->initialState.levels[0].mclk.mclk_value =
+       table->initialState.level.mclk.mclk_value =
                cpu_to_be32(initial_state->performance_levels[0].mclk);
 
-       table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL =
+       table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL =
                cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl);
-       table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 =
+       table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_2 =
                cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_2);
-       table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 =
+       table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_3 =
                cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_3);
-       table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 =
+       table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_4 =
                cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_4);
-       table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM =
+       table->initialState.level.sclk.vCG_SPLL_SPREAD_SPECTRUM =
                cpu_to_be32(si_pi->clock_registers.cg_spll_spread_spectrum);
-       table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM_2  =
+       table->initialState.level.sclk.vCG_SPLL_SPREAD_SPECTRUM_2  =
                cpu_to_be32(si_pi->clock_registers.cg_spll_spread_spectrum_2);
 
-       table->initialState.levels[0].sclk.sclk_value =
+       table->initialState.level.sclk.sclk_value =
                cpu_to_be32(initial_state->performance_levels[0].sclk);
 
-       table->initialState.levels[0].arbRefreshState =
+       table->initialState.level.arbRefreshState =
                SISLANDS_INITIAL_STATE_ARB_INDEX;
 
-       table->initialState.levels[0].ACIndex = 0;
+       table->initialState.level.ACIndex = 0;
 
        ret = si_populate_voltage_value(adev, &eg_pi->vddc_voltage_table,
                                        initial_state->performance_levels[0].vddc,
-                                       &table->initialState.levels[0].vddc);
+                                       &table->initialState.level.vddc);
 
        if (!ret) {
                u16 std_vddc;
 
                ret = si_get_std_voltage_value(adev,
-                                              &table->initialState.levels[0].vddc,
+                                              &table->initialState.level.vddc,
                                               &std_vddc);
                if (!ret)
                        si_populate_std_voltage_value(adev, std_vddc,
-                                                     table->initialState.levels[0].vddc.index,
-                                                     &table->initialState.levels[0].std_vddc);
+                                                     table->initialState.level.vddc.index,
+                                                     &table->initialState.level.std_vddc);
        }
 
        if (eg_pi->vddci_control)
                si_populate_voltage_value(adev,
                                          &eg_pi->vddci_voltage_table,
                                          initial_state->performance_levels[0].vddci,
-                                         &table->initialState.levels[0].vddci);
+                                         &table->initialState.level.vddci);
 
        if (si_pi->vddc_phase_shed_control)
                si_populate_phase_shedding_value(adev,
@@ -4888,41 +4888,41 @@ static int si_populate_smc_initial_state(struct amdgpu_device *adev,
                                                 initial_state->performance_levels[0].vddc,
                                                 initial_state->performance_levels[0].sclk,
                                                 initial_state->performance_levels[0].mclk,
-                                                &table->initialState.levels[0].vddc);
+                                                &table->initialState.level.vddc);
 
-       si_populate_initial_mvdd_value(adev, &table->initialState.levels[0].mvdd);
+       si_populate_initial_mvdd_value(adev, &table->initialState.level.mvdd);
 
        reg = CG_R(0xffff) | CG_L(0);
-       table->initialState.levels[0].aT = cpu_to_be32(reg);
-       table->initialState.levels[0].bSP = cpu_to_be32(pi->dsp);
-       table->initialState.levels[0].gen2PCIE = (u8)si_pi->boot_pcie_gen;
+       table->initialState.level.aT = cpu_to_be32(reg);
+       table->initialState.level.bSP = cpu_to_be32(pi->dsp);
+       table->initialState.level.gen2PCIE = (u8)si_pi->boot_pcie_gen;
 
        if (adev->gmc.vram_type == AMDGPU_VRAM_TYPE_GDDR5) {
-               table->initialState.levels[0].strobeMode =
+               table->initialState.level.strobeMode =
                        si_get_strobe_mode_settings(adev,
                                                    initial_state->performance_levels[0].mclk);
 
                if (initial_state->performance_levels[0].mclk > pi->mclk_edc_enable_threshold)
-                       table->initialState.levels[0].mcFlags = SISLANDS_SMC_MC_EDC_RD_FLAG | SISLANDS_SMC_MC_EDC_WR_FLAG;
+                       table->initialState.level.mcFlags = SISLANDS_SMC_MC_EDC_RD_FLAG | SISLANDS_SMC_MC_EDC_WR_FLAG;
                else
-                       table->initialState.levels[0].mcFlags =  0;
+                       table->initialState.level.mcFlags =  0;
        }
 
        table->initialState.levelCount = 1;
 
        table->initialState.flags |= PPSMC_SWSTATE_FLAG_DC;
 
-       table->initialState.levels[0].dpm2.MaxPS = 0;
-       table->initialState.levels[0].dpm2.NearTDPDec = 0;
-       table->initialState.levels[0].dpm2.AboveSafeInc = 0;
-       table->initialState.levels[0].dpm2.BelowSafeInc = 0;
-       table->initialState.levels[0].dpm2.PwrEfficiencyRatio = 0;
+       table->initialState.level.dpm2.MaxPS = 0;
+       table->initialState.level.dpm2.NearTDPDec = 0;
+       table->initialState.level.dpm2.AboveSafeInc = 0;
+       table->initialState.level.dpm2.BelowSafeInc = 0;
+       table->initialState.level.dpm2.PwrEfficiencyRatio = 0;
 
        reg = MIN_POWER_MASK | MAX_POWER_MASK;
-       table->initialState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
+       table->initialState.level.SQPowerThrottle = cpu_to_be32(reg);
 
        reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
-       table->initialState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
+       table->initialState.level.SQPowerThrottle_2 = cpu_to_be32(reg);
 
        return 0;
 }
@@ -4953,18 +4953,18 @@ static int si_populate_smc_acpi_state(struct amdgpu_device *adev,
 
        if (pi->acpi_vddc) {
                ret = si_populate_voltage_value(adev, &eg_pi->vddc_voltage_table,
-                                               pi->acpi_vddc, &table->ACPIState.levels[0].vddc);
+                                               pi->acpi_vddc, &table->ACPIState.level.vddc);
                if (!ret) {
                        u16 std_vddc;
 
                        ret = si_get_std_voltage_value(adev,
-                                                      &table->ACPIState.levels[0].vddc, &std_vddc);
+                                                      &table->ACPIState.level.vddc, &std_vddc);
                        if (!ret)
                                si_populate_std_voltage_value(adev, std_vddc,
-                                                             table->ACPIState.levels[0].vddc.index,
-                                                             &table->ACPIState.levels[0].std_vddc);
+                                                             table->ACPIState.level.vddc.index,
+                                                             &table->ACPIState.level.std_vddc);
                }
-               table->ACPIState.levels[0].gen2PCIE = si_pi->acpi_pcie_gen;
+               table->ACPIState.level.gen2PCIE = si_pi->acpi_pcie_gen;
 
                if (si_pi->vddc_phase_shed_control) {
                        si_populate_phase_shedding_value(adev,
@@ -4972,23 +4972,23 @@ static int si_populate_smc_acpi_state(struct amdgpu_device *adev,
                                                         pi->acpi_vddc,
                                                         0,
                                                         0,
-                                                        &table->ACPIState.levels[0].vddc);
+                                                        &table->ACPIState.level.vddc);
                }
        } else {
                ret = si_populate_voltage_value(adev, &eg_pi->vddc_voltage_table,
-                                               pi->min_vddc_in_table, &table->ACPIState.levels[0].vddc);
+                                               pi->min_vddc_in_table, &table->ACPIState.level.vddc);
                if (!ret) {
                        u16 std_vddc;
 
                        ret = si_get_std_voltage_value(adev,
-                                                      &table->ACPIState.levels[0].vddc, &std_vddc);
+                                                      &table->ACPIState.level.vddc, &std_vddc);
 
                        if (!ret)
                                si_populate_std_voltage_value(adev, std_vddc,
-                                                             table->ACPIState.levels[0].vddc.index,
-                                                             &table->ACPIState.levels[0].std_vddc);
+                                                             table->ACPIState.level.vddc.index,
+                                                             &table->ACPIState.level.std_vddc);
                }
-               table->ACPIState.levels[0].gen2PCIE =
+               table->ACPIState.level.gen2PCIE =
                        (u8)amdgpu_get_pcie_gen_support(adev,
                                                        si_pi->sys_pcie_mask,
                                                        si_pi->boot_pcie_gen,
@@ -5000,14 +5000,14 @@ static int si_populate_smc_acpi_state(struct amdgpu_device *adev,
                                                         pi->min_vddc_in_table,
                                                         0,
                                                         0,
-                                                        &table->ACPIState.levels[0].vddc);
+                                                        &table->ACPIState.level.vddc);
        }
 
        if (pi->acpi_vddc) {
                if (eg_pi->acpi_vddci)
                        si_populate_voltage_value(adev, &eg_pi->vddci_voltage_table,
                                                  eg_pi->acpi_vddci,
-                                                 &table->ACPIState.levels[0].vddci);
+                                                 &table->ACPIState.level.vddci);
        }
 
        mclk_pwrmgt_cntl |= MRDCK0_RESET | MRDCK1_RESET;
@@ -5018,59 +5018,59 @@ static int si_populate_smc_acpi_state(struct amdgpu_device *adev,
        spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK;
        spll_func_cntl_2 |= SCLK_MUX_SEL(4);
 
-       table->ACPIState.levels[0].mclk.vDLL_CNTL =
+       table->ACPIState.level.mclk.vDLL_CNTL =
                cpu_to_be32(dll_cntl);
-       table->ACPIState.levels[0].mclk.vMCLK_PWRMGT_CNTL =
+       table->ACPIState.level.mclk.vMCLK_PWRMGT_CNTL =
                cpu_to_be32(mclk_pwrmgt_cntl);
-       table->ACPIState.levels[0].mclk.vMPLL_AD_FUNC_CNTL =
+       table->ACPIState.level.mclk.vMPLL_AD_FUNC_CNTL =
                cpu_to_be32(mpll_ad_func_cntl);
-       table->ACPIState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL =
+       table->ACPIState.level.mclk.vMPLL_DQ_FUNC_CNTL =
                cpu_to_be32(mpll_dq_func_cntl);
-       table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL =
+       table->ACPIState.level.mclk.vMPLL_FUNC_CNTL =
                cpu_to_be32(mpll_func_cntl);
-       table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL_1 =
+       table->ACPIState.level.mclk.vMPLL_FUNC_CNTL_1 =
                cpu_to_be32(mpll_func_cntl_1);
-       table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL_2 =
+       table->ACPIState.level.mclk.vMPLL_FUNC_CNTL_2 =
                cpu_to_be32(mpll_func_cntl_2);
-       table->ACPIState.levels[0].mclk.vMPLL_SS =
+       table->ACPIState.level.mclk.vMPLL_SS =
                cpu_to_be32(si_pi->clock_registers.mpll_ss1);
-       table->ACPIState.levels[0].mclk.vMPLL_SS2 =
+       table->ACPIState.level.mclk.vMPLL_SS2 =
                cpu_to_be32(si_pi->clock_registers.mpll_ss2);
 
-       table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL =
+       table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL =
                cpu_to_be32(spll_func_cntl);
-       table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 =
+       table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_2 =
                cpu_to_be32(spll_func_cntl_2);
-       table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 =
+       table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_3 =
                cpu_to_be32(spll_func_cntl_3);
-       table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 =
+       table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_4 =
                cpu_to_be32(spll_func_cntl_4);
 
-       table->ACPIState.levels[0].mclk.mclk_value = 0;
-       table->ACPIState.levels[0].sclk.sclk_value = 0;
+       table->ACPIState.level.mclk.mclk_value = 0;
+       table->ACPIState.level.sclk.sclk_value = 0;
 
-       si_populate_mvdd_value(adev, 0, &table->ACPIState.levels[0].mvdd);
+       si_populate_mvdd_value(adev, 0, &table->ACPIState.level.mvdd);
 
        if (eg_pi->dynamic_ac_timing)
-               table->ACPIState.levels[0].ACIndex = 0;
+               table->ACPIState.level.ACIndex = 0;
 
-       table->ACPIState.levels[0].dpm2.MaxPS = 0;
-       table->ACPIState.levels[0].dpm2.NearTDPDec = 0;
-       table->ACPIState.levels[0].dpm2.AboveSafeInc = 0;
-       table->ACPIState.levels[0].dpm2.BelowSafeInc = 0;
-       table->ACPIState.levels[0].dpm2.PwrEfficiencyRatio = 0;
+       table->ACPIState.level.dpm2.MaxPS = 0;
+       table->ACPIState.level.dpm2.NearTDPDec = 0;
+       table->ACPIState.level.dpm2.AboveSafeInc = 0;
+       table->ACPIState.level.dpm2.BelowSafeInc = 0;
+       table->ACPIState.level.dpm2.PwrEfficiencyRatio = 0;
 
        reg = MIN_POWER_MASK | MAX_POWER_MASK;
-       table->ACPIState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
+       table->ACPIState.level.SQPowerThrottle = cpu_to_be32(reg);
 
        reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
-       table->ACPIState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
+       table->ACPIState.level.SQPowerThrottle_2 = cpu_to_be32(reg);
 
        return 0;
 }
 
 static int si_populate_ulv_state(struct amdgpu_device *adev,
-                                SISLANDS_SMC_SWSTATE *state)
+                                struct SISLANDS_SMC_SWSTATE_SINGLE *state)
 {
        struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
        struct si_power_info *si_pi = si_get_pi(adev);
@@ -5079,19 +5079,19 @@ static int si_populate_ulv_state(struct amdgpu_device *adev,
        int ret;
 
        ret = si_convert_power_level_to_smc(adev, &ulv->pl,
-                                           &state->levels[0]);
+                                           &state->level);
        if (!ret) {
                if (eg_pi->sclk_deep_sleep) {
                        if (sclk_in_sr <= SCLK_MIN_DEEPSLEEP_FREQ)
-                               state->levels[0].stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_BYPASS;
+                               state->level.stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_BYPASS;
                        else
-                               state->levels[0].stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_THROTTLE;
+                               state->level.stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_THROTTLE;
                }
                if (ulv->one_pcie_lane_in_ulv)
                        state->flags |= PPSMC_SWSTATE_FLAG_PCIE_X1;
-               state->levels[0].arbRefreshState = (u8)(SISLANDS_ULV_STATE_ARB_INDEX);
-               state->levels[0].ACIndex = 1;
-               state->levels[0].std_vddc = state->levels[0].vddc;
+               state->level.arbRefreshState = (u8)(SISLANDS_ULV_STATE_ARB_INDEX);
+               state->level.ACIndex = 1;
+               state->level.std_vddc = state->level.vddc;
                state->levelCount = 1;
 
                state->flags |= PPSMC_SWSTATE_FLAG_DC;
@@ -5190,7 +5190,9 @@ static int si_init_smc_table(struct amdgpu_device *adev)
        if (ret)
                return ret;
 
-       table->driverState = table->initialState;
+       table->driverState.flags = table->initialState.flags;
+       table->driverState.levelCount = table->initialState.levelCount;
+       table->driverState.levels[0] = table->initialState.level;
 
        ret = si_do_program_memory_timing_parameters(adev, amdgpu_boot_state,
                                                     SISLANDS_INITIAL_STATE_ARB_INDEX);
@@ -5737,8 +5739,8 @@ static int si_upload_ulv_state(struct amdgpu_device *adev)
        if (ulv->supported && ulv->pl.vddc) {
                u32 address = si_pi->state_table_start +
                        offsetof(SISLANDS_SMC_STATETABLE, ULVState);
-               SISLANDS_SMC_SWSTATE *smc_state = &si_pi->smc_statetable.ULVState;
-               u32 state_size = sizeof(SISLANDS_SMC_SWSTATE);
+               struct SISLANDS_SMC_SWSTATE_SINGLE *smc_state = &si_pi->smc_statetable.ULVState;
+               u32 state_size = sizeof(struct SISLANDS_SMC_SWSTATE_SINGLE);
 
                memset(smc_state, 0, state_size);
 
index 0f75540..c7dc117 100644 (file)
@@ -191,6 +191,14 @@ struct SISLANDS_SMC_SWSTATE
 
 typedef struct SISLANDS_SMC_SWSTATE SISLANDS_SMC_SWSTATE;
 
+struct SISLANDS_SMC_SWSTATE_SINGLE {
+       uint8_t                             flags;
+       uint8_t                             levelCount;
+       uint8_t                             padding2;
+       uint8_t                             padding3;
+       SISLANDS_SMC_HW_PERFORMANCE_LEVEL   level;
+};
+
 #define SISLANDS_SMC_VOLTAGEMASK_VDDC  0
 #define SISLANDS_SMC_VOLTAGEMASK_MVDD  1
 #define SISLANDS_SMC_VOLTAGEMASK_VDDCI 2
@@ -208,19 +216,19 @@ typedef struct SISLANDS_SMC_VOLTAGEMASKTABLE SISLANDS_SMC_VOLTAGEMASKTABLE;
 
 struct SISLANDS_SMC_STATETABLE
 {
-    uint8_t                             thermalProtectType;
-    uint8_t                             systemFlags;
-    uint8_t                             maxVDDCIndexInPPTable;
-    uint8_t                             extraFlags;
-    uint32_t                            lowSMIO[SISLANDS_MAX_NO_VREG_STEPS];
-    SISLANDS_SMC_VOLTAGEMASKTABLE       voltageMaskTable;
-    SISLANDS_SMC_VOLTAGEMASKTABLE       phaseMaskTable;
-    PP_SIslands_DPM2Parameters          dpm2Params;
-    SISLANDS_SMC_SWSTATE                initialState;
-    SISLANDS_SMC_SWSTATE                ACPIState;
-    SISLANDS_SMC_SWSTATE                ULVState;
-    SISLANDS_SMC_SWSTATE                driverState;
-    SISLANDS_SMC_HW_PERFORMANCE_LEVEL   dpmLevels[SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE - 1];
+       uint8_t                                 thermalProtectType;
+       uint8_t                                 systemFlags;
+       uint8_t                                 maxVDDCIndexInPPTable;
+       uint8_t                                 extraFlags;
+       uint32_t                                lowSMIO[SISLANDS_MAX_NO_VREG_STEPS];
+       SISLANDS_SMC_VOLTAGEMASKTABLE           voltageMaskTable;
+       SISLANDS_SMC_VOLTAGEMASKTABLE           phaseMaskTable;
+       PP_SIslands_DPM2Parameters              dpm2Params;
+       struct SISLANDS_SMC_SWSTATE_SINGLE      initialState;
+       struct SISLANDS_SMC_SWSTATE_SINGLE      ACPIState;
+       struct SISLANDS_SMC_SWSTATE_SINGLE      ULVState;
+       SISLANDS_SMC_SWSTATE                    driverState;
+       SISLANDS_SMC_HW_PERFORMANCE_LEVEL       dpmLevels[SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
 };
 
 typedef struct SISLANDS_SMC_STATETABLE SISLANDS_SMC_STATETABLE;
index b9a4b76..197b973 100644 (file)
@@ -815,10 +815,8 @@ static int exynos5433_decon_probe(struct platform_device *pdev)
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        ctx->addr = devm_ioremap_resource(dev, res);
-       if (IS_ERR(ctx->addr)) {
-               dev_err(dev, "ioremap failed\n");
+       if (IS_ERR(ctx->addr))
                return PTR_ERR(ctx->addr);
-       }
 
        ret = decon_conf_irq(ctx, "vsync", decon_irq_handler, 0);
        if (ret < 0)
index 44e402b..2d2fe5a 100644 (file)
@@ -1786,10 +1786,8 @@ static int exynos_dsi_probe(struct platform_device *pdev)
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        dsi->reg_base = devm_ioremap_resource(dev, res);
-       if (IS_ERR(dsi->reg_base)) {
-               dev_err(dev, "failed to remap io region\n");
+       if (IS_ERR(dsi->reg_base))
                return PTR_ERR(dsi->reg_base);
-       }
 
        dsi->phy = devm_phy_get(dev, "dsim");
        if (IS_ERR(dsi->phy)) {
index 49a2e0c..ae57612 100644 (file)
@@ -723,7 +723,7 @@ static void fimd_win_set_colkey(struct fimd_context *ctx, unsigned int win)
 }
 
 /**
- * shadow_protect_win() - disable updating values from shadow registers at vsync
+ * fimd_shadow_protect_win() - disable updating values from shadow registers at vsync
  *
  * @ctx: local driver data
  * @win: window to protect registers for
index 69f57ca..93f4d05 100644 (file)
@@ -102,7 +102,6 @@ config DRM_I915_GVT
        bool "Enable Intel GVT-g graphics virtualization host support"
        depends on DRM_I915
        depends on 64BIT
-       depends on VFIO_MDEV=y || VFIO_MDEV=DRM_I915
        default n
        help
          Choose this option if you want to enable Intel GVT-g graphics
index 6a2dee8..642c60f 100644 (file)
@@ -1095,44 +1095,6 @@ intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
        return -EINVAL;
 }
 
-/* Optimize link config in order: max bpp, min lanes, min clock */
-static int
-intel_dp_compute_link_config_fast(struct intel_dp *intel_dp,
-                                 struct intel_crtc_state *pipe_config,
-                                 const struct link_config_limits *limits)
-{
-       const struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
-       int bpp, clock, lane_count;
-       int mode_rate, link_clock, link_avail;
-
-       for (bpp = limits->max_bpp; bpp >= limits->min_bpp; bpp -= 2 * 3) {
-               int output_bpp = intel_dp_output_bpp(pipe_config->output_format, bpp);
-
-               mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock,
-                                                  output_bpp);
-
-               for (lane_count = limits->min_lane_count;
-                    lane_count <= limits->max_lane_count;
-                    lane_count <<= 1) {
-                       for (clock = limits->min_clock; clock <= limits->max_clock; clock++) {
-                               link_clock = intel_dp->common_rates[clock];
-                               link_avail = intel_dp_max_data_rate(link_clock,
-                                                                   lane_count);
-
-                               if (mode_rate <= link_avail) {
-                                       pipe_config->lane_count = lane_count;
-                                       pipe_config->pipe_bpp = bpp;
-                                       pipe_config->port_clock = link_clock;
-
-                                       return 0;
-                               }
-                       }
-               }
-       }
-
-       return -EINVAL;
-}
-
 static int intel_dp_dsc_compute_bpp(struct intel_dp *intel_dp, u8 dsc_max_bpc)
 {
        int i, num_bpc;
@@ -1382,22 +1344,11 @@ intel_dp_compute_link_config(struct intel_encoder *encoder,
            intel_dp_can_bigjoiner(intel_dp))
                pipe_config->bigjoiner = true;
 
-       if (intel_dp_is_edp(intel_dp))
-               /*
-                * Optimize for fast and narrow. eDP 1.3 section 3.3 and eDP 1.4
-                * section A.1: "It is recommended that the minimum number of
-                * lanes be used, using the minimum link rate allowed for that
-                * lane configuration."
-                *
-                * Note that we fall back to the max clock and lane count for eDP
-                * panels that fail with the fast optimal settings (see
-                * intel_dp->use_max_params), in which case the fast vs. wide
-                * choice doesn't matter.
-                */
-               ret = intel_dp_compute_link_config_fast(intel_dp, pipe_config, &limits);
-       else
-               /* Optimize for slow and wide. */
-               ret = intel_dp_compute_link_config_wide(intel_dp, pipe_config, &limits);
+       /*
+        * Optimize for slow and wide for everything, because there are some
+        * eDP 1.3 and 1.4 panels don't work well with fast and narrow.
+        */
+       ret = intel_dp_compute_link_config_wide(intel_dp, pipe_config, &limits);
 
        /* enable compression if the mode doesn't fit available BW */
        drm_dbg_kms(&i915->drm, "Force DSC en = %d\n", intel_dp->force_dsc_en);
@@ -2160,7 +2111,7 @@ void intel_dp_check_frl_training(struct intel_dp *intel_dp)
         * -PCON supports SRC_CTL_MODE (VESA DP2.0-HDMI2.1 PCON Spec Draft-1 Sec-7)
         * -sink is HDMI2.1
         */
-       if (!(intel_dp->dpcd[2] & DP_PCON_SOURCE_CTL_MODE) ||
+       if (!(intel_dp->downstream_ports[2] & DP_PCON_SOURCE_CTL_MODE) ||
            !intel_dp_is_hdmi_2_1_sink(intel_dp) ||
            intel_dp->frl.is_trained)
                return;
index e5dadde..bbaf055 100644 (file)
@@ -383,7 +383,7 @@ static void intel_overlay_off_tail(struct intel_overlay *overlay)
                i830_overlay_clock_gating(dev_priv, true);
 }
 
-static void
+__i915_active_call static void
 intel_overlay_last_flip_retire(struct i915_active *active)
 {
        struct intel_overlay *overlay =
index 23f6b00..f6fe5cb 100644 (file)
@@ -189,7 +189,7 @@ compute_partial_view(const struct drm_i915_gem_object *obj,
        struct i915_ggtt_view view;
 
        if (i915_gem_object_is_tiled(obj))
-               chunk = roundup(chunk, tile_row_pages(obj));
+               chunk = roundup(chunk, tile_row_pages(obj) ?: 1);
 
        view.type = I915_GGTT_VIEW_PARTIAL;
        view.partial.offset = rounddown(page_offset, chunk);
index aed8a37..7361971 100644 (file)
@@ -63,6 +63,8 @@ void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
            i915->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
                GEM_BUG_ON(i915_gem_object_has_tiling_quirk(obj));
                i915_gem_object_set_tiling_quirk(obj);
+               GEM_BUG_ON(!list_empty(&obj->mm.link));
+               atomic_inc(&obj->mm.shrink_pin);
                shrinkable = false;
        }
 
index de575fd..21f08e5 100644 (file)
@@ -397,7 +397,10 @@ static void emit_batch(struct i915_vma * const vma,
        gen7_emit_pipeline_invalidate(&cmds);
        batch_add(&cmds, MI_LOAD_REGISTER_IMM(2));
        batch_add(&cmds, i915_mmio_reg_offset(CACHE_MODE_0_GEN7));
-       batch_add(&cmds, 0xffff0000);
+       batch_add(&cmds, 0xffff0000 |
+                       ((IS_IVB_GT1(i915) || IS_VALLEYVIEW(i915)) ?
+                        HIZ_RAW_STALL_OPT_DISABLE :
+                        0));
        batch_add(&cmds, i915_mmio_reg_offset(CACHE_MODE_1));
        batch_add(&cmds, 0xffff0000 | PIXEL_SUBSPAN_COLLECT_OPT_DISABLE);
        gen7_emit_pipeline_invalidate(&cmds);
index 176c196..74bf6fc 100644 (file)
@@ -641,7 +641,6 @@ static int gen8_preallocate_top_level_pdp(struct i915_ppgtt *ppgtt)
 
                err = pin_pt_dma(vm, pde->pt.base);
                if (err) {
-                       i915_gem_object_put(pde->pt.base);
                        free_pd(vm, pde);
                        return err;
                }
index e72b7a0..8a32259 100644 (file)
@@ -653,8 +653,8 @@ static void detect_bit_6_swizzle(struct i915_ggtt *ggtt)
                 * banks of memory are paired and unswizzled on the
                 * uneven portion, so leave that as unknown.
                 */
-               if (intel_uncore_read(uncore, C0DRB3) ==
-                   intel_uncore_read(uncore, C1DRB3)) {
+               if (intel_uncore_read16(uncore, C0DRB3) ==
+                   intel_uncore_read16(uncore, C1DRB3)) {
                        swizzle_x = I915_BIT_6_SWIZZLE_9_10;
                        swizzle_y = I915_BIT_6_SWIZZLE_9;
                }
index e7c2bab..cbac409 100644 (file)
@@ -46,118 +46,6 @@ static const char * const supported_hypervisors[] = {
        [INTEL_GVT_HYPERVISOR_KVM] = "KVM",
 };
 
-static struct intel_vgpu_type *
-intel_gvt_find_vgpu_type(struct intel_gvt *gvt, unsigned int type_group_id)
-{
-       if (WARN_ON(type_group_id >= gvt->num_types))
-               return NULL;
-       return &gvt->types[type_group_id];
-}
-
-static ssize_t available_instances_show(struct mdev_type *mtype,
-                                       struct mdev_type_attribute *attr,
-                                       char *buf)
-{
-       struct intel_vgpu_type *type;
-       unsigned int num = 0;
-       void *gvt = kdev_to_i915(mtype_get_parent_dev(mtype))->gvt;
-
-       type = intel_gvt_find_vgpu_type(gvt, mtype_get_type_group_id(mtype));
-       if (!type)
-               num = 0;
-       else
-               num = type->avail_instance;
-
-       return sprintf(buf, "%u\n", num);
-}
-
-static ssize_t device_api_show(struct mdev_type *mtype,
-                              struct mdev_type_attribute *attr, char *buf)
-{
-       return sprintf(buf, "%s\n", VFIO_DEVICE_API_PCI_STRING);
-}
-
-static ssize_t description_show(struct mdev_type *mtype,
-                               struct mdev_type_attribute *attr, char *buf)
-{
-       struct intel_vgpu_type *type;
-       void *gvt = kdev_to_i915(mtype_get_parent_dev(mtype))->gvt;
-
-       type = intel_gvt_find_vgpu_type(gvt, mtype_get_type_group_id(mtype));
-       if (!type)
-               return 0;
-
-       return sprintf(buf, "low_gm_size: %dMB\nhigh_gm_size: %dMB\n"
-                      "fence: %d\nresolution: %s\n"
-                      "weight: %d\n",
-                      BYTES_TO_MB(type->low_gm_size),
-                      BYTES_TO_MB(type->high_gm_size),
-                      type->fence, vgpu_edid_str(type->resolution),
-                      type->weight);
-}
-
-static MDEV_TYPE_ATTR_RO(available_instances);
-static MDEV_TYPE_ATTR_RO(device_api);
-static MDEV_TYPE_ATTR_RO(description);
-
-static struct attribute *gvt_type_attrs[] = {
-       &mdev_type_attr_available_instances.attr,
-       &mdev_type_attr_device_api.attr,
-       &mdev_type_attr_description.attr,
-       NULL,
-};
-
-static struct attribute_group *gvt_vgpu_type_groups[] = {
-       [0 ... NR_MAX_INTEL_VGPU_TYPES - 1] = NULL,
-};
-
-static bool intel_get_gvt_attrs(struct attribute_group ***intel_vgpu_type_groups)
-{
-       *intel_vgpu_type_groups = gvt_vgpu_type_groups;
-       return true;
-}
-
-static int intel_gvt_init_vgpu_type_groups(struct intel_gvt *gvt)
-{
-       int i, j;
-       struct intel_vgpu_type *type;
-       struct attribute_group *group;
-
-       for (i = 0; i < gvt->num_types; i++) {
-               type = &gvt->types[i];
-
-               group = kzalloc(sizeof(struct attribute_group), GFP_KERNEL);
-               if (WARN_ON(!group))
-                       goto unwind;
-
-               group->name = type->name;
-               group->attrs = gvt_type_attrs;
-               gvt_vgpu_type_groups[i] = group;
-       }
-
-       return 0;
-
-unwind:
-       for (j = 0; j < i; j++) {
-               group = gvt_vgpu_type_groups[j];
-               kfree(group);
-       }
-
-       return -ENOMEM;
-}
-
-static void intel_gvt_cleanup_vgpu_type_groups(struct intel_gvt *gvt)
-{
-       int i;
-       struct attribute_group *group;
-
-       for (i = 0; i < gvt->num_types; i++) {
-               group = gvt_vgpu_type_groups[i];
-               gvt_vgpu_type_groups[i] = NULL;
-               kfree(group);
-       }
-}
-
 static const struct intel_gvt_ops intel_gvt_ops = {
        .emulate_cfg_read = intel_vgpu_emulate_cfg_read,
        .emulate_cfg_write = intel_vgpu_emulate_cfg_write,
@@ -169,8 +57,6 @@ static const struct intel_gvt_ops intel_gvt_ops = {
        .vgpu_reset = intel_gvt_reset_vgpu,
        .vgpu_activate = intel_gvt_activate_vgpu,
        .vgpu_deactivate = intel_gvt_deactivate_vgpu,
-       .gvt_find_vgpu_type = intel_gvt_find_vgpu_type,
-       .get_gvt_attrs = intel_get_gvt_attrs,
        .vgpu_query_plane = intel_vgpu_query_plane,
        .vgpu_get_dmabuf = intel_vgpu_get_dmabuf,
        .write_protect_handler = intel_vgpu_page_track_handler,
@@ -274,7 +160,6 @@ void intel_gvt_clean_device(struct drm_i915_private *i915)
                return;
 
        intel_gvt_destroy_idle_vgpu(gvt->idle_vgpu);
-       intel_gvt_cleanup_vgpu_type_groups(gvt);
        intel_gvt_clean_vgpu_types(gvt);
 
        intel_gvt_debugfs_clean(gvt);
@@ -363,12 +248,6 @@ int intel_gvt_init_device(struct drm_i915_private *i915)
        if (ret)
                goto out_clean_thread;
 
-       ret = intel_gvt_init_vgpu_type_groups(gvt);
-       if (ret) {
-               gvt_err("failed to init vgpu type groups: %d\n", ret);
-               goto out_clean_types;
-       }
-
        vgpu = intel_gvt_create_idle_vgpu(gvt);
        if (IS_ERR(vgpu)) {
                ret = PTR_ERR(vgpu);
@@ -454,7 +333,8 @@ EXPORT_SYMBOL_GPL(intel_gvt_register_hypervisor);
 void
 intel_gvt_unregister_hypervisor(void)
 {
-       intel_gvt_hypervisor_host_exit(intel_gvt_host.dev);
+       void *gvt = (void *)kdev_to_i915(intel_gvt_host.dev)->gvt;
+       intel_gvt_hypervisor_host_exit(intel_gvt_host.dev, gvt);
        module_put(THIS_MODULE);
 }
 EXPORT_SYMBOL_GPL(intel_gvt_unregister_hypervisor);
index 88ab360..0c06156 100644 (file)
@@ -574,9 +574,6 @@ struct intel_gvt_ops {
        void (*vgpu_reset)(struct intel_vgpu *);
        void (*vgpu_activate)(struct intel_vgpu *);
        void (*vgpu_deactivate)(struct intel_vgpu *);
-       struct intel_vgpu_type *(*gvt_find_vgpu_type)(
-               struct intel_gvt *gvt, unsigned int type_group_id);
-       bool (*get_gvt_attrs)(struct attribute_group ***intel_vgpu_type_groups);
        int (*vgpu_query_plane)(struct intel_vgpu *vgpu, void *);
        int (*vgpu_get_dmabuf)(struct intel_vgpu *vgpu, unsigned int);
        int (*write_protect_handler)(struct intel_vgpu *, u64, void *,
index b79da51..f33e3cb 100644 (file)
@@ -49,7 +49,7 @@ enum hypervisor_type {
 struct intel_gvt_mpt {
        enum hypervisor_type type;
        int (*host_init)(struct device *dev, void *gvt, const void *ops);
-       void (*host_exit)(struct device *dev);
+       void (*host_exit)(struct device *dev, void *gvt);
        int (*attach_vgpu)(void *vgpu, unsigned long *handle);
        void (*detach_vgpu)(void *vgpu);
        int (*inject_msi)(unsigned long handle, u32 addr, u16 data);
index 65ff43c..48b4d4c 100644 (file)
@@ -144,6 +144,104 @@ static inline bool handle_valid(unsigned long handle)
        return !!(handle & ~0xff);
 }
 
+static ssize_t available_instances_show(struct mdev_type *mtype,
+                                       struct mdev_type_attribute *attr,
+                                       char *buf)
+{
+       struct intel_vgpu_type *type;
+       unsigned int num = 0;
+       struct intel_gvt *gvt = kdev_to_i915(mtype_get_parent_dev(mtype))->gvt;
+
+       type = &gvt->types[mtype_get_type_group_id(mtype)];
+       if (!type)
+               num = 0;
+       else
+               num = type->avail_instance;
+
+       return sprintf(buf, "%u\n", num);
+}
+
+static ssize_t device_api_show(struct mdev_type *mtype,
+                              struct mdev_type_attribute *attr, char *buf)
+{
+       return sprintf(buf, "%s\n", VFIO_DEVICE_API_PCI_STRING);
+}
+
+static ssize_t description_show(struct mdev_type *mtype,
+                               struct mdev_type_attribute *attr, char *buf)
+{
+       struct intel_vgpu_type *type;
+       struct intel_gvt *gvt = kdev_to_i915(mtype_get_parent_dev(mtype))->gvt;
+
+       type = &gvt->types[mtype_get_type_group_id(mtype)];
+       if (!type)
+               return 0;
+
+       return sprintf(buf, "low_gm_size: %dMB\nhigh_gm_size: %dMB\n"
+                      "fence: %d\nresolution: %s\n"
+                      "weight: %d\n",
+                      BYTES_TO_MB(type->low_gm_size),
+                      BYTES_TO_MB(type->high_gm_size),
+                      type->fence, vgpu_edid_str(type->resolution),
+                      type->weight);
+}
+
+static MDEV_TYPE_ATTR_RO(available_instances);
+static MDEV_TYPE_ATTR_RO(device_api);
+static MDEV_TYPE_ATTR_RO(description);
+
+static struct attribute *gvt_type_attrs[] = {
+       &mdev_type_attr_available_instances.attr,
+       &mdev_type_attr_device_api.attr,
+       &mdev_type_attr_description.attr,
+       NULL,
+};
+
+static struct attribute_group *gvt_vgpu_type_groups[] = {
+       [0 ... NR_MAX_INTEL_VGPU_TYPES - 1] = NULL,
+};
+
+static int intel_gvt_init_vgpu_type_groups(struct intel_gvt *gvt)
+{
+       int i, j;
+       struct intel_vgpu_type *type;
+       struct attribute_group *group;
+
+       for (i = 0; i < gvt->num_types; i++) {
+               type = &gvt->types[i];
+
+               group = kzalloc(sizeof(struct attribute_group), GFP_KERNEL);
+               if (!group)
+                       goto unwind;
+
+               group->name = type->name;
+               group->attrs = gvt_type_attrs;
+               gvt_vgpu_type_groups[i] = group;
+       }
+
+       return 0;
+
+unwind:
+       for (j = 0; j < i; j++) {
+               group = gvt_vgpu_type_groups[j];
+               kfree(group);
+       }
+
+       return -ENOMEM;
+}
+
+static void intel_gvt_cleanup_vgpu_type_groups(struct intel_gvt *gvt)
+{
+       int i;
+       struct attribute_group *group;
+
+       for (i = 0; i < gvt->num_types; i++) {
+               group = gvt_vgpu_type_groups[i];
+               gvt_vgpu_type_groups[i] = NULL;
+               kfree(group);
+       }
+}
+
 static int kvmgt_guest_init(struct mdev_device *mdev);
 static void intel_vgpu_release_work(struct work_struct *work);
 static bool kvmgt_guest_exit(struct kvmgt_guest_info *info);
@@ -694,14 +792,13 @@ static int intel_vgpu_create(struct mdev_device *mdev)
        struct intel_vgpu *vgpu = NULL;
        struct intel_vgpu_type *type;
        struct device *pdev;
-       void *gvt;
+       struct intel_gvt *gvt;
        int ret;
 
        pdev = mdev_parent_dev(mdev);
        gvt = kdev_to_i915(pdev)->gvt;
 
-       type = intel_gvt_ops->gvt_find_vgpu_type(gvt,
-                                                mdev_get_type_group_id(mdev));
+       type = &gvt->types[mdev_get_type_group_id(mdev)];
        if (!type) {
                ret = -EINVAL;
                goto out;
@@ -1667,19 +1764,26 @@ static struct mdev_parent_ops intel_vgpu_ops = {
 
 static int kvmgt_host_init(struct device *dev, void *gvt, const void *ops)
 {
-       struct attribute_group **kvm_vgpu_type_groups;
+       int ret;
+
+       ret = intel_gvt_init_vgpu_type_groups((struct intel_gvt *)gvt);
+       if (ret)
+               return ret;
 
        intel_gvt_ops = ops;
-       if (!intel_gvt_ops->get_gvt_attrs(&kvm_vgpu_type_groups))
-               return -EFAULT;
-       intel_vgpu_ops.supported_type_groups = kvm_vgpu_type_groups;
+       intel_vgpu_ops.supported_type_groups = gvt_vgpu_type_groups;
 
-       return mdev_register_device(dev, &intel_vgpu_ops);
+       ret = mdev_register_device(dev, &intel_vgpu_ops);
+       if (ret)
+               intel_gvt_cleanup_vgpu_type_groups((struct intel_gvt *)gvt);
+
+       return ret;
 }
 
-static void kvmgt_host_exit(struct device *dev)
+static void kvmgt_host_exit(struct device *dev, void *gvt)
 {
        mdev_unregister_device(dev);
+       intel_gvt_cleanup_vgpu_type_groups((struct intel_gvt *)gvt);
 }
 
 static int kvmgt_page_track_add(unsigned long handle, u64 gfn)
index 550a456..e6c5a79 100644 (file)
@@ -63,13 +63,13 @@ static inline int intel_gvt_hypervisor_host_init(struct device *dev,
 /**
  * intel_gvt_hypervisor_host_exit - exit GVT-g host side
  */
-static inline void intel_gvt_hypervisor_host_exit(struct device *dev)
+static inline void intel_gvt_hypervisor_host_exit(struct device *dev, void *gvt)
 {
        /* optional to provide */
        if (!intel_gvt_host.mpt->host_exit)
                return;
 
-       intel_gvt_host.mpt->host_exit(dev);
+       intel_gvt_host.mpt->host_exit(dev, gvt);
 }
 
 /**
index cf9a3d3..aa573b0 100644 (file)
@@ -1156,7 +1156,8 @@ static int auto_active(struct i915_active *ref)
        return 0;
 }
 
-static void auto_retire(struct i915_active *ref)
+__i915_active_call static void
+auto_retire(struct i915_active *ref)
 {
        i915_active_put(ref);
 }
index b23f58e..b3cedd2 100644 (file)
@@ -999,12 +999,11 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
                obj->mm.madv = args->madv;
 
        if (i915_gem_object_has_pages(obj)) {
-               struct list_head *list;
+               unsigned long flags;
 
-               if (i915_gem_object_is_shrinkable(obj)) {
-                       unsigned long flags;
-
-                       spin_lock_irqsave(&i915->mm.obj_lock, flags);
+               spin_lock_irqsave(&i915->mm.obj_lock, flags);
+               if (!list_empty(&obj->mm.link)) {
+                       struct list_head *list;
 
                        if (obj->mm.madv != I915_MADV_WILLNEED)
                                list = &i915->mm.purge_list;
@@ -1012,8 +1011,8 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
                                list = &i915->mm.shrink_list;
                        list_move_tail(&obj->mm.link, list);
 
-                       spin_unlock_irqrestore(&i915->mm.obj_lock, flags);
                }
+               spin_unlock_irqrestore(&i915->mm.obj_lock, flags);
        }
 
        /* if the object is no longer attached, discard its backing storage */
index 4c8cd08..9a777b0 100644 (file)
 
 #include "i915_drv.h"
 
-#define EXPECTED_FLAGS (VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP)
+struct remap_pfn {
+       struct mm_struct *mm;
+       unsigned long pfn;
+       pgprot_t prot;
+
+       struct sgt_iter sgt;
+       resource_size_t iobase;
+};
 
 #define use_dma(io) ((io) != -1)
 
+static inline unsigned long sgt_pfn(const struct remap_pfn *r)
+{
+       if (use_dma(r->iobase))
+               return (r->sgt.dma + r->sgt.curr + r->iobase) >> PAGE_SHIFT;
+       else
+               return r->sgt.pfn + (r->sgt.curr >> PAGE_SHIFT);
+}
+
+static int remap_sg(pte_t *pte, unsigned long addr, void *data)
+{
+       struct remap_pfn *r = data;
+
+       if (GEM_WARN_ON(!r->sgt.sgp))
+               return -EINVAL;
+
+       /* Special PTE are not associated with any struct page */
+       set_pte_at(r->mm, addr, pte,
+                  pte_mkspecial(pfn_pte(sgt_pfn(r), r->prot)));
+       r->pfn++; /* track insertions in case we need to unwind later */
+
+       r->sgt.curr += PAGE_SIZE;
+       if (r->sgt.curr >= r->sgt.max)
+               r->sgt = __sgt_iter(__sg_next(r->sgt.sgp), use_dma(r->iobase));
+
+       return 0;
+}
+
+#define EXPECTED_FLAGS (VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP)
+
 /**
  * remap_io_sg - remap an IO mapping to userspace
  * @vma: user vma to map to
@@ -46,7 +82,12 @@ int remap_io_sg(struct vm_area_struct *vma,
                unsigned long addr, unsigned long size,
                struct scatterlist *sgl, resource_size_t iobase)
 {
-       unsigned long pfn, len, remapped = 0;
+       struct remap_pfn r = {
+               .mm = vma->vm_mm,
+               .prot = vma->vm_page_prot,
+               .sgt = __sgt_iter(sgl, use_dma(iobase)),
+               .iobase = iobase,
+       };
        int err;
 
        /* We rely on prevalidation of the io-mapping to skip track_pfn(). */
@@ -55,25 +96,11 @@ int remap_io_sg(struct vm_area_struct *vma,
        if (!use_dma(iobase))
                flush_cache_range(vma, addr, size);
 
-       do {
-               if (use_dma(iobase)) {
-                       if (!sg_dma_len(sgl))
-                               break;
-                       pfn = (sg_dma_address(sgl) + iobase) >> PAGE_SHIFT;
-                       len = sg_dma_len(sgl);
-               } else {
-                       pfn = page_to_pfn(sg_page(sgl));
-                       len = sgl->length;
-               }
-
-               err = remap_pfn_range(vma, addr + remapped, pfn, len,
-                                     vma->vm_page_prot);
-               if (err)
-                       break;
-               remapped += len;
-       } while ((sgl = __sg_next(sgl)));
-
-       if (err)
-               zap_vma_ptes(vma, addr, remapped);
-       return err;
+       err = apply_to_page_range(r.mm, addr, size, remap_sg, &r);
+       if (unlikely(err)) {
+               zap_vma_ptes(vma, addr, r.pfn << PAGE_SHIFT);
+               return err;
+       }
+
+       return 0;
 }
index d553f62..b4d8e1b 100644 (file)
@@ -1153,10 +1153,6 @@ static void a6xx_llc_slices_init(struct platform_device *pdev,
 {
        struct device_node *phandle;
 
-       a6xx_gpu->llc_mmio = msm_ioremap(pdev, "cx_mem", "gpu_cx");
-       if (IS_ERR(a6xx_gpu->llc_mmio))
-               return;
-
        /*
         * There is a different programming path for targets with an mmu500
         * attached, so detect if that is the case
@@ -1166,6 +1162,11 @@ static void a6xx_llc_slices_init(struct platform_device *pdev,
                of_device_is_compatible(phandle, "arm,mmu-500"));
        of_node_put(phandle);
 
+       if (a6xx_gpu->have_mmu500)
+               a6xx_gpu->llc_mmio = NULL;
+       else
+               a6xx_gpu->llc_mmio = msm_ioremap(pdev, "cx_mem", "gpu_cx");
+
        a6xx_gpu->llc_slice = llcc_slice_getd(LLCC_GPU);
        a6xx_gpu->htw_llc_slice = llcc_slice_getd(LLCC_GPUHTW);
 
index 82a8673..d7e4a39 100644 (file)
@@ -527,6 +527,7 @@ int dp_audio_hw_params(struct device *dev,
        dp_audio_setup_acr(audio);
        dp_audio_safe_to_exit_level(audio);
        dp_audio_enable(audio, true);
+       dp_display_signal_audio_start(dp_display);
        dp_display->audio_enabled = true;
 
 end:
index 5a39da6..1784e11 100644 (file)
@@ -178,6 +178,15 @@ static int dp_del_event(struct dp_display_private *dp_priv, u32 event)
        return 0;
 }
 
+void dp_display_signal_audio_start(struct msm_dp *dp_display)
+{
+       struct dp_display_private *dp;
+
+       dp = container_of(dp_display, struct dp_display_private, dp_display);
+
+       reinit_completion(&dp->audio_comp);
+}
+
 void dp_display_signal_audio_complete(struct msm_dp *dp_display)
 {
        struct dp_display_private *dp;
@@ -586,10 +595,8 @@ static int dp_connect_pending_timeout(struct dp_display_private *dp, u32 data)
        mutex_lock(&dp->event_mutex);
 
        state = dp->hpd_state;
-       if (state == ST_CONNECT_PENDING) {
-               dp_display_enable(dp, 0);
+       if (state == ST_CONNECT_PENDING)
                dp->hpd_state = ST_CONNECTED;
-       }
 
        mutex_unlock(&dp->event_mutex);
 
@@ -651,7 +658,6 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
        dp_add_event(dp, EV_DISCONNECT_PENDING_TIMEOUT, 0, DP_TIMEOUT_5_SECOND);
 
        /* signal the disconnect event early to ensure proper teardown */
-       reinit_completion(&dp->audio_comp);
        dp_display_handle_plugged_change(g_dp_display, false);
 
        dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK |
@@ -669,10 +675,8 @@ static int dp_disconnect_pending_timeout(struct dp_display_private *dp, u32 data
        mutex_lock(&dp->event_mutex);
 
        state =  dp->hpd_state;
-       if (state == ST_DISCONNECT_PENDING) {
-               dp_display_disable(dp, 0);
+       if (state == ST_DISCONNECT_PENDING)
                dp->hpd_state = ST_DISCONNECTED;
-       }
 
        mutex_unlock(&dp->event_mutex);
 
@@ -898,7 +902,6 @@ static int dp_display_disable(struct dp_display_private *dp, u32 data)
        /* wait only if audio was enabled */
        if (dp_display->audio_enabled) {
                /* signal the disconnect event */
-               reinit_completion(&dp->audio_comp);
                dp_display_handle_plugged_change(dp_display, false);
                if (!wait_for_completion_timeout(&dp->audio_comp,
                                HZ * 5))
@@ -1272,7 +1275,12 @@ static int dp_pm_resume(struct device *dev)
 
        status = dp_catalog_link_is_connected(dp->catalog);
 
-       if (status)
+       /*
+        * can not declared display is connected unless
+        * HDMI cable is plugged in and sink_count of
+        * dongle become 1
+        */
+       if (status && dp->link->sink_count)
                dp->dp_display.is_connected = true;
        else
                dp->dp_display.is_connected = false;
index 6092ba1..5173c89 100644 (file)
@@ -34,6 +34,7 @@ int dp_display_get_modes(struct msm_dp *dp_display,
 int dp_display_request_irq(struct msm_dp *dp_display);
 bool dp_display_check_video_test(struct msm_dp *dp_display);
 int dp_display_get_test_bpp(struct msm_dp *dp_display);
+void dp_display_signal_audio_start(struct msm_dp *dp_display);
 void dp_display_signal_audio_complete(struct msm_dp *dp_display);
 
 #endif /* _DP_DISPLAY_H_ */
index f0a2ddf..ff7f2ec 100644 (file)
@@ -843,7 +843,7 @@ int msm_dsi_phy_get_clk_provider(struct msm_dsi_phy *phy,
        if (pixel_clk_provider)
                *pixel_clk_provider = phy->provided_clocks->hws[DSI_PIXEL_PLL_CLK]->clk;
 
-       return -EINVAL;
+       return 0;
 }
 
 void msm_dsi_phy_pll_save_state(struct msm_dsi_phy *phy)
index 582b142..86e40a0 100644 (file)
@@ -405,6 +405,10 @@ static int pll_28nm_register(struct dsi_pll_28nm *pll_28nm, struct clk_hw **prov
        if (!vco_name)
                return -ENOMEM;
 
+       parent_name = devm_kzalloc(dev, 32, GFP_KERNEL);
+       if (!parent_name)
+               return -ENOMEM;
+
        clk_name = devm_kzalloc(dev, 32, GFP_KERNEL);
        if (!clk_name)
                return -ENOMEM;
index e1104d2..fe7d17c 100644 (file)
@@ -42,7 +42,7 @@
  * - 1.7.0 - Add MSM_PARAM_SUSPENDS to access suspend count
  */
 #define MSM_VERSION_MAJOR      1
-#define MSM_VERSION_MINOR      6
+#define MSM_VERSION_MINOR      7
 #define MSM_VERSION_PATCHLEVEL 0
 
 static const struct drm_mode_config_funcs mode_config_funcs = {
index b199942..56df86e 100644 (file)
@@ -190,13 +190,25 @@ struct page **msm_gem_get_pages(struct drm_gem_object *obj)
        }
 
        p = get_pages(obj);
+
+       if (!IS_ERR(p)) {
+               msm_obj->pin_count++;
+               update_inactive(msm_obj);
+       }
+
        msm_gem_unlock(obj);
        return p;
 }
 
 void msm_gem_put_pages(struct drm_gem_object *obj)
 {
-       /* when we start tracking the pin count, then do something here */
+       struct msm_gem_object *msm_obj = to_msm_bo(obj);
+
+       msm_gem_lock(obj);
+       msm_obj->pin_count--;
+       GEM_WARN_ON(msm_obj->pin_count < 0);
+       update_inactive(msm_obj);
+       msm_gem_unlock(obj);
 }
 
 int msm_gem_mmap_obj(struct drm_gem_object *obj,
@@ -646,6 +658,8 @@ static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
                        ret = -ENOMEM;
                        goto fail;
                }
+
+               update_inactive(msm_obj);
        }
 
        return msm_obj->vaddr;
index a6480d2..03e2cc2 100644 (file)
@@ -221,7 +221,7 @@ static inline bool is_active(struct msm_gem_object *msm_obj)
 /* imported/exported objects are not purgeable: */
 static inline bool is_unpurgeable(struct msm_gem_object *msm_obj)
 {
-       return msm_obj->base.dma_buf && msm_obj->base.import_attach;
+       return msm_obj->base.import_attach || msm_obj->pin_count;
 }
 
 static inline bool is_purgeable(struct msm_gem_object *msm_obj)
@@ -271,7 +271,7 @@ static inline void mark_unpurgeable(struct msm_gem_object *msm_obj)
 
 static inline bool is_unevictable(struct msm_gem_object *msm_obj)
 {
-       return is_unpurgeable(msm_obj) || msm_obj->pin_count || msm_obj->vaddr;
+       return is_unpurgeable(msm_obj) || msm_obj->vaddr;
 }
 
 static inline void mark_evictable(struct msm_gem_object *msm_obj)
index dd5ef64..769f666 100644 (file)
@@ -1687,102 +1687,102 @@ static int ni_populate_smc_initial_state(struct radeon_device *rdev,
        u32 reg;
        int ret;
 
-       table->initialState.levels[0].mclk.vMPLL_AD_FUNC_CNTL =
+       table->initialState.level.mclk.vMPLL_AD_FUNC_CNTL =
                cpu_to_be32(ni_pi->clock_registers.mpll_ad_func_cntl);
-       table->initialState.levels[0].mclk.vMPLL_AD_FUNC_CNTL_2 =
+       table->initialState.level.mclk.vMPLL_AD_FUNC_CNTL_2 =
                cpu_to_be32(ni_pi->clock_registers.mpll_ad_func_cntl_2);
-       table->initialState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL =
+       table->initialState.level.mclk.vMPLL_DQ_FUNC_CNTL =
                cpu_to_be32(ni_pi->clock_registers.mpll_dq_func_cntl);
-       table->initialState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL_2 =
+       table->initialState.level.mclk.vMPLL_DQ_FUNC_CNTL_2 =
                cpu_to_be32(ni_pi->clock_registers.mpll_dq_func_cntl_2);
-       table->initialState.levels[0].mclk.vMCLK_PWRMGT_CNTL =
+       table->initialState.level.mclk.vMCLK_PWRMGT_CNTL =
                cpu_to_be32(ni_pi->clock_registers.mclk_pwrmgt_cntl);
-       table->initialState.levels[0].mclk.vDLL_CNTL =
+       table->initialState.level.mclk.vDLL_CNTL =
                cpu_to_be32(ni_pi->clock_registers.dll_cntl);
-       table->initialState.levels[0].mclk.vMPLL_SS =
+       table->initialState.level.mclk.vMPLL_SS =
                cpu_to_be32(ni_pi->clock_registers.mpll_ss1);
-       table->initialState.levels[0].mclk.vMPLL_SS2 =
+       table->initialState.level.mclk.vMPLL_SS2 =
                cpu_to_be32(ni_pi->clock_registers.mpll_ss2);
-       table->initialState.levels[0].mclk.mclk_value =
+       table->initialState.level.mclk.mclk_value =
                cpu_to_be32(initial_state->performance_levels[0].mclk);
 
-       table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL =
+       table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL =
                cpu_to_be32(ni_pi->clock_registers.cg_spll_func_cntl);
-       table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 =
+       table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_2 =
                cpu_to_be32(ni_pi->clock_registers.cg_spll_func_cntl_2);
-       table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 =
+       table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_3 =
                cpu_to_be32(ni_pi->clock_registers.cg_spll_func_cntl_3);
-       table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 =
+       table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_4 =
                cpu_to_be32(ni_pi->clock_registers.cg_spll_func_cntl_4);
-       table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM =
+       table->initialState.level.sclk.vCG_SPLL_SPREAD_SPECTRUM =
                cpu_to_be32(ni_pi->clock_registers.cg_spll_spread_spectrum);
-       table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM_2 =
+       table->initialState.level.sclk.vCG_SPLL_SPREAD_SPECTRUM_2 =
                cpu_to_be32(ni_pi->clock_registers.cg_spll_spread_spectrum_2);
-       table->initialState.levels[0].sclk.sclk_value =
+       table->initialState.level.sclk.sclk_value =
                cpu_to_be32(initial_state->performance_levels[0].sclk);
-       table->initialState.levels[0].arbRefreshState =
+       table->initialState.level.arbRefreshState =
                NISLANDS_INITIAL_STATE_ARB_INDEX;
 
-       table->initialState.levels[0].ACIndex = 0;
+       table->initialState.level.ACIndex = 0;
 
        ret = ni_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table,
                                        initial_state->performance_levels[0].vddc,
-                                       &table->initialState.levels[0].vddc);
+                                       &table->initialState.level.vddc);
        if (!ret) {
                u16 std_vddc;
 
                ret = ni_get_std_voltage_value(rdev,
-                                              &table->initialState.levels[0].vddc,
+                                              &table->initialState.level.vddc,
                                               &std_vddc);
                if (!ret)
                        ni_populate_std_voltage_value(rdev, std_vddc,
-                                                     table->initialState.levels[0].vddc.index,
-                                                     &table->initialState.levels[0].std_vddc);
+                                                     table->initialState.level.vddc.index,
+                                                     &table->initialState.level.std_vddc);
        }
 
        if (eg_pi->vddci_control)
                ni_populate_voltage_value(rdev,
                                          &eg_pi->vddci_voltage_table,
                                          initial_state->performance_levels[0].vddci,
-                                         &table->initialState.levels[0].vddci);
+                                         &table->initialState.level.vddci);
 
-       ni_populate_initial_mvdd_value(rdev, &table->initialState.levels[0].mvdd);
+       ni_populate_initial_mvdd_value(rdev, &table->initialState.level.mvdd);
 
        reg = CG_R(0xffff) | CG_L(0);
-       table->initialState.levels[0].aT = cpu_to_be32(reg);
+       table->initialState.level.aT = cpu_to_be32(reg);
 
-       table->initialState.levels[0].bSP = cpu_to_be32(pi->dsp);
+       table->initialState.level.bSP = cpu_to_be32(pi->dsp);
 
        if (pi->boot_in_gen2)
-               table->initialState.levels[0].gen2PCIE = 1;
+               table->initialState.level.gen2PCIE = 1;
        else
-               table->initialState.levels[0].gen2PCIE = 0;
+               table->initialState.level.gen2PCIE = 0;
 
        if (pi->mem_gddr5) {
-               table->initialState.levels[0].strobeMode =
+               table->initialState.level.strobeMode =
                        cypress_get_strobe_mode_settings(rdev,
                                                         initial_state->performance_levels[0].mclk);
 
                if (initial_state->performance_levels[0].mclk > pi->mclk_edc_enable_threshold)
-                       table->initialState.levels[0].mcFlags = NISLANDS_SMC_MC_EDC_RD_FLAG | NISLANDS_SMC_MC_EDC_WR_FLAG;
+                       table->initialState.level.mcFlags = NISLANDS_SMC_MC_EDC_RD_FLAG | NISLANDS_SMC_MC_EDC_WR_FLAG;
                else
-                       table->initialState.levels[0].mcFlags =  0;
+                       table->initialState.level.mcFlags =  0;
        }
 
        table->initialState.levelCount = 1;
 
        table->initialState.flags |= PPSMC_SWSTATE_FLAG_DC;
 
-       table->initialState.levels[0].dpm2.MaxPS = 0;
-       table->initialState.levels[0].dpm2.NearTDPDec = 0;
-       table->initialState.levels[0].dpm2.AboveSafeInc = 0;
-       table->initialState.levels[0].dpm2.BelowSafeInc = 0;
+       table->initialState.level.dpm2.MaxPS = 0;
+       table->initialState.level.dpm2.NearTDPDec = 0;
+       table->initialState.level.dpm2.AboveSafeInc = 0;
+       table->initialState.level.dpm2.BelowSafeInc = 0;
 
        reg = MIN_POWER_MASK | MAX_POWER_MASK;
-       table->initialState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
+       table->initialState.level.SQPowerThrottle = cpu_to_be32(reg);
 
        reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
-       table->initialState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
+       table->initialState.level.SQPowerThrottle_2 = cpu_to_be32(reg);
 
        return 0;
 }
@@ -1813,43 +1813,43 @@ static int ni_populate_smc_acpi_state(struct radeon_device *rdev,
        if (pi->acpi_vddc) {
                ret = ni_populate_voltage_value(rdev,
                                                &eg_pi->vddc_voltage_table,
-                                               pi->acpi_vddc, &table->ACPIState.levels[0].vddc);
+                                               pi->acpi_vddc, &table->ACPIState.level.vddc);
                if (!ret) {
                        u16 std_vddc;
 
                        ret = ni_get_std_voltage_value(rdev,
-                                                      &table->ACPIState.levels[0].vddc, &std_vddc);
+                                                      &table->ACPIState.level.vddc, &std_vddc);
                        if (!ret)
                                ni_populate_std_voltage_value(rdev, std_vddc,
-                                                             table->ACPIState.levels[0].vddc.index,
-                                                             &table->ACPIState.levels[0].std_vddc);
+                                                             table->ACPIState.level.vddc.index,
+                                                             &table->ACPIState.level.std_vddc);
                }
 
                if (pi->pcie_gen2) {
                        if (pi->acpi_pcie_gen2)
-                               table->ACPIState.levels[0].gen2PCIE = 1;
+                               table->ACPIState.level.gen2PCIE = 1;
                        else
-                               table->ACPIState.levels[0].gen2PCIE = 0;
+                               table->ACPIState.level.gen2PCIE = 0;
                } else {
-                       table->ACPIState.levels[0].gen2PCIE = 0;
+                       table->ACPIState.level.gen2PCIE = 0;
                }
        } else {
                ret = ni_populate_voltage_value(rdev,
                                                &eg_pi->vddc_voltage_table,
                                                pi->min_vddc_in_table,
-                                               &table->ACPIState.levels[0].vddc);
+                                               &table->ACPIState.level.vddc);
                if (!ret) {
                        u16 std_vddc;
 
                        ret = ni_get_std_voltage_value(rdev,
-                                                      &table->ACPIState.levels[0].vddc,
+                                                      &table->ACPIState.level.vddc,
                                                       &std_vddc);
                        if (!ret)
                                ni_populate_std_voltage_value(rdev, std_vddc,
-                                                             table->ACPIState.levels[0].vddc.index,
-                                                             &table->ACPIState.levels[0].std_vddc);
+                                                             table->ACPIState.level.vddc.index,
+                                                             &table->ACPIState.level.std_vddc);
                }
-               table->ACPIState.levels[0].gen2PCIE = 0;
+               table->ACPIState.level.gen2PCIE = 0;
        }
 
        if (eg_pi->acpi_vddci) {
@@ -1857,7 +1857,7 @@ static int ni_populate_smc_acpi_state(struct radeon_device *rdev,
                        ni_populate_voltage_value(rdev,
                                                  &eg_pi->vddci_voltage_table,
                                                  eg_pi->acpi_vddci,
-                                                 &table->ACPIState.levels[0].vddci);
+                                                 &table->ACPIState.level.vddci);
        }
 
 
@@ -1900,37 +1900,37 @@ static int ni_populate_smc_acpi_state(struct radeon_device *rdev,
        spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK;
        spll_func_cntl_2 |= SCLK_MUX_SEL(4);
 
-       table->ACPIState.levels[0].mclk.vMPLL_AD_FUNC_CNTL = cpu_to_be32(mpll_ad_func_cntl);
-       table->ACPIState.levels[0].mclk.vMPLL_AD_FUNC_CNTL_2 = cpu_to_be32(mpll_ad_func_cntl_2);
-       table->ACPIState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL = cpu_to_be32(mpll_dq_func_cntl);
-       table->ACPIState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL_2 = cpu_to_be32(mpll_dq_func_cntl_2);
-       table->ACPIState.levels[0].mclk.vMCLK_PWRMGT_CNTL = cpu_to_be32(mclk_pwrmgt_cntl);
-       table->ACPIState.levels[0].mclk.vDLL_CNTL = cpu_to_be32(dll_cntl);
+       table->ACPIState.level.mclk.vMPLL_AD_FUNC_CNTL = cpu_to_be32(mpll_ad_func_cntl);
+       table->ACPIState.level.mclk.vMPLL_AD_FUNC_CNTL_2 = cpu_to_be32(mpll_ad_func_cntl_2);
+       table->ACPIState.level.mclk.vMPLL_DQ_FUNC_CNTL = cpu_to_be32(mpll_dq_func_cntl);
+       table->ACPIState.level.mclk.vMPLL_DQ_FUNC_CNTL_2 = cpu_to_be32(mpll_dq_func_cntl_2);
+       table->ACPIState.level.mclk.vMCLK_PWRMGT_CNTL = cpu_to_be32(mclk_pwrmgt_cntl);
+       table->ACPIState.level.mclk.vDLL_CNTL = cpu_to_be32(dll_cntl);
 
-       table->ACPIState.levels[0].mclk.mclk_value = 0;
+       table->ACPIState.level.mclk.mclk_value = 0;
 
-       table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL = cpu_to_be32(spll_func_cntl);
-       table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 = cpu_to_be32(spll_func_cntl_2);
-       table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 = cpu_to_be32(spll_func_cntl_3);
-       table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 = cpu_to_be32(spll_func_cntl_4);
+       table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL = cpu_to_be32(spll_func_cntl);
+       table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_2 = cpu_to_be32(spll_func_cntl_2);
+       table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_3 = cpu_to_be32(spll_func_cntl_3);
+       table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_4 = cpu_to_be32(spll_func_cntl_4);
 
-       table->ACPIState.levels[0].sclk.sclk_value = 0;
+       table->ACPIState.level.sclk.sclk_value = 0;
 
-       ni_populate_mvdd_value(rdev, 0, &table->ACPIState.levels[0].mvdd);
+       ni_populate_mvdd_value(rdev, 0, &table->ACPIState.level.mvdd);
 
        if (eg_pi->dynamic_ac_timing)
-               table->ACPIState.levels[0].ACIndex = 1;
+               table->ACPIState.level.ACIndex = 1;
 
-       table->ACPIState.levels[0].dpm2.MaxPS = 0;
-       table->ACPIState.levels[0].dpm2.NearTDPDec = 0;
-       table->ACPIState.levels[0].dpm2.AboveSafeInc = 0;
-       table->ACPIState.levels[0].dpm2.BelowSafeInc = 0;
+       table->ACPIState.level.dpm2.MaxPS = 0;
+       table->ACPIState.level.dpm2.NearTDPDec = 0;
+       table->ACPIState.level.dpm2.AboveSafeInc = 0;
+       table->ACPIState.level.dpm2.BelowSafeInc = 0;
 
        reg = MIN_POWER_MASK | MAX_POWER_MASK;
-       table->ACPIState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
+       table->ACPIState.level.SQPowerThrottle = cpu_to_be32(reg);
 
        reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
-       table->ACPIState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
+       table->ACPIState.level.SQPowerThrottle_2 = cpu_to_be32(reg);
 
        return 0;
 }
@@ -1980,7 +1980,9 @@ static int ni_init_smc_table(struct radeon_device *rdev)
        if (ret)
                return ret;
 
-       table->driverState = table->initialState;
+       table->driverState.flags = table->initialState.flags;
+       table->driverState.levelCount = table->initialState.levelCount;
+       table->driverState.levels[0] = table->initialState.level;
 
        table->ULVState = table->initialState;
 
index 7395cb6..42f3bab 100644 (file)
@@ -143,6 +143,14 @@ struct NISLANDS_SMC_SWSTATE
 
 typedef struct NISLANDS_SMC_SWSTATE NISLANDS_SMC_SWSTATE;
 
+struct NISLANDS_SMC_SWSTATE_SINGLE {
+       uint8_t                             flags;
+       uint8_t                             levelCount;
+       uint8_t                             padding2;
+       uint8_t                             padding3;
+       NISLANDS_SMC_HW_PERFORMANCE_LEVEL   level;
+};
+
 #define NISLANDS_SMC_VOLTAGEMASK_VDDC  0
 #define NISLANDS_SMC_VOLTAGEMASK_MVDD  1
 #define NISLANDS_SMC_VOLTAGEMASK_VDDCI 2
@@ -160,19 +168,19 @@ typedef struct NISLANDS_SMC_VOLTAGEMASKTABLE NISLANDS_SMC_VOLTAGEMASKTABLE;
 
 struct NISLANDS_SMC_STATETABLE
 {
-    uint8_t                             thermalProtectType;
-    uint8_t                             systemFlags;
-    uint8_t                             maxVDDCIndexInPPTable;
-    uint8_t                             extraFlags;
-    uint8_t                             highSMIO[NISLANDS_MAX_NO_VREG_STEPS];
-    uint32_t                            lowSMIO[NISLANDS_MAX_NO_VREG_STEPS];
-    NISLANDS_SMC_VOLTAGEMASKTABLE       voltageMaskTable;
-    PP_NIslands_DPM2Parameters          dpm2Params;
-    NISLANDS_SMC_SWSTATE                initialState;
-    NISLANDS_SMC_SWSTATE                ACPIState;
-    NISLANDS_SMC_SWSTATE                ULVState;
-    NISLANDS_SMC_SWSTATE                driverState;
-    NISLANDS_SMC_HW_PERFORMANCE_LEVEL   dpmLevels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE - 1];
+       uint8_t                             thermalProtectType;
+       uint8_t                             systemFlags;
+       uint8_t                             maxVDDCIndexInPPTable;
+       uint8_t                             extraFlags;
+       uint8_t                             highSMIO[NISLANDS_MAX_NO_VREG_STEPS];
+       uint32_t                            lowSMIO[NISLANDS_MAX_NO_VREG_STEPS];
+       NISLANDS_SMC_VOLTAGEMASKTABLE       voltageMaskTable;
+       PP_NIslands_DPM2Parameters          dpm2Params;
+       struct NISLANDS_SMC_SWSTATE_SINGLE  initialState;
+       struct NISLANDS_SMC_SWSTATE_SINGLE  ACPIState;
+       struct NISLANDS_SMC_SWSTATE_SINGLE  ULVState;
+       NISLANDS_SMC_SWSTATE                driverState;
+       NISLANDS_SMC_HW_PERFORMANCE_LEVEL   dpmLevels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
 };
 
 typedef struct NISLANDS_SMC_STATETABLE NISLANDS_SMC_STATETABLE;
index 42281fc..56ed563 100644 (file)
@@ -1549,6 +1549,7 @@ struct radeon_dpm {
        void                    *priv;
        u32                     new_active_crtcs;
        int                     new_active_crtc_count;
+       int                     high_pixelclock_count;
        u32                     current_active_crtcs;
        int                     current_active_crtc_count;
        bool single_display;
index 3808a75..04109a2 100644 (file)
@@ -301,7 +301,8 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
        p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);
 
        for (i = 0; i < pages; i++, p++) {
-               rdev->gart.pages[p] = pagelist[i];
+               rdev->gart.pages[p] = pagelist ? pagelist[i] :
+                       rdev->dummy_page.page;
                page_base = dma_addr[i];
                for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) {
                        page_entry = radeon_gart_get_page_entry(page_base, flags);
index 0c1950f..3861c0b 100644 (file)
@@ -1767,6 +1767,7 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev)
        struct drm_device *ddev = rdev->ddev;
        struct drm_crtc *crtc;
        struct radeon_crtc *radeon_crtc;
+       struct radeon_connector *radeon_connector;
 
        if (!rdev->pm.dpm_enabled)
                return;
@@ -1776,6 +1777,7 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev)
        /* update active crtc counts */
        rdev->pm.dpm.new_active_crtcs = 0;
        rdev->pm.dpm.new_active_crtc_count = 0;
+       rdev->pm.dpm.high_pixelclock_count = 0;
        if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) {
                list_for_each_entry(crtc,
                                    &ddev->mode_config.crtc_list, head) {
@@ -1783,6 +1785,12 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev)
                        if (crtc->enabled) {
                                rdev->pm.dpm.new_active_crtcs |= (1 << radeon_crtc->crtc_id);
                                rdev->pm.dpm.new_active_crtc_count++;
+                               if (!radeon_crtc->connector)
+                                       continue;
+
+                               radeon_connector = to_radeon_connector(radeon_crtc->connector);
+                               if (radeon_connector->pixelclock_for_modeset > 297000)
+                                       rdev->pm.dpm.high_pixelclock_count++;
                        }
                }
        }
index 9186095..3add39c 100644 (file)
@@ -2979,6 +2979,9 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev,
                    (rdev->pdev->device == 0x6605)) {
                        max_sclk = 75000;
                }
+
+               if (rdev->pm.dpm.high_pixelclock_count > 1)
+                       disable_sclk_switching = true;
        }
 
        if (rps->vce_active) {
@@ -4350,70 +4353,70 @@ static int si_populate_smc_initial_state(struct radeon_device *rdev,
        u32 reg;
        int ret;
 
-       table->initialState.levels[0].mclk.vDLL_CNTL =
+       table->initialState.level.mclk.vDLL_CNTL =
                cpu_to_be32(si_pi->clock_registers.dll_cntl);
-       table->initialState.levels[0].mclk.vMCLK_PWRMGT_CNTL =
+       table->initialState.level.mclk.vMCLK_PWRMGT_CNTL =
                cpu_to_be32(si_pi->clock_registers.mclk_pwrmgt_cntl);
-       table->initialState.levels[0].mclk.vMPLL_AD_FUNC_CNTL =
+       table->initialState.level.mclk.vMPLL_AD_FUNC_CNTL =
                cpu_to_be32(si_pi->clock_registers.mpll_ad_func_cntl);
-       table->initialState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL =
+       table->initialState.level.mclk.vMPLL_DQ_FUNC_CNTL =
                cpu_to_be32(si_pi->clock_registers.mpll_dq_func_cntl);
-       table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL =
+       table->initialState.level.mclk.vMPLL_FUNC_CNTL =
                cpu_to_be32(si_pi->clock_registers.mpll_func_cntl);
-       table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL_1 =
+       table->initialState.level.mclk.vMPLL_FUNC_CNTL_1 =
                cpu_to_be32(si_pi->clock_registers.mpll_func_cntl_1);
-       table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL_2 =
+       table->initialState.level.mclk.vMPLL_FUNC_CNTL_2 =
                cpu_to_be32(si_pi->clock_registers.mpll_func_cntl_2);
-       table->initialState.levels[0].mclk.vMPLL_SS =
+       table->initialState.level.mclk.vMPLL_SS =
                cpu_to_be32(si_pi->clock_registers.mpll_ss1);
-       table->initialState.levels[0].mclk.vMPLL_SS2 =
+       table->initialState.level.mclk.vMPLL_SS2 =
                cpu_to_be32(si_pi->clock_registers.mpll_ss2);
 
-       table->initialState.levels[0].mclk.mclk_value =
+       table->initialState.level.mclk.mclk_value =
                cpu_to_be32(initial_state->performance_levels[0].mclk);
 
-       table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL =
+       table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL =
                cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl);
-       table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 =
+       table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_2 =
                cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_2);
-       table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 =
+       table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_3 =
                cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_3);
-       table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 =
+       table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_4 =
                cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_4);
-       table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM =
+       table->initialState.level.sclk.vCG_SPLL_SPREAD_SPECTRUM =
                cpu_to_be32(si_pi->clock_registers.cg_spll_spread_spectrum);
-       table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM_2  =
+       table->initialState.level.sclk.vCG_SPLL_SPREAD_SPECTRUM_2  =
                cpu_to_be32(si_pi->clock_registers.cg_spll_spread_spectrum_2);
 
-       table->initialState.levels[0].sclk.sclk_value =
+       table->initialState.level.sclk.sclk_value =
                cpu_to_be32(initial_state->performance_levels[0].sclk);
 
-       table->initialState.levels[0].arbRefreshState =
+       table->initialState.level.arbRefreshState =
                SISLANDS_INITIAL_STATE_ARB_INDEX;
 
-       table->initialState.levels[0].ACIndex = 0;
+       table->initialState.level.ACIndex = 0;
 
        ret = si_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table,
                                        initial_state->performance_levels[0].vddc,
-                                       &table->initialState.levels[0].vddc);
+                                       &table->initialState.level.vddc);
 
        if (!ret) {
                u16 std_vddc;
 
                ret = si_get_std_voltage_value(rdev,
-                                              &table->initialState.levels[0].vddc,
+                                              &table->initialState.level.vddc,
                                               &std_vddc);
                if (!ret)
                        si_populate_std_voltage_value(rdev, std_vddc,
-                                                     table->initialState.levels[0].vddc.index,
-                                                     &table->initialState.levels[0].std_vddc);
+                                                     table->initialState.level.vddc.index,
+                                                     &table->initialState.level.std_vddc);
        }
 
        if (eg_pi->vddci_control)
                si_populate_voltage_value(rdev,
                                          &eg_pi->vddci_voltage_table,
                                          initial_state->performance_levels[0].vddci,
-                                         &table->initialState.levels[0].vddci);
+                                         &table->initialState.level.vddci);
 
        if (si_pi->vddc_phase_shed_control)
                si_populate_phase_shedding_value(rdev,
@@ -4421,43 +4424,43 @@ static int si_populate_smc_initial_state(struct radeon_device *rdev,
                                                 initial_state->performance_levels[0].vddc,
                                                 initial_state->performance_levels[0].sclk,
                                                 initial_state->performance_levels[0].mclk,
-                                                &table->initialState.levels[0].vddc);
+                                                &table->initialState.level.vddc);
 
-       si_populate_initial_mvdd_value(rdev, &table->initialState.levels[0].mvdd);
+       si_populate_initial_mvdd_value(rdev, &table->initialState.level.mvdd);
 
        reg = CG_R(0xffff) | CG_L(0);
-       table->initialState.levels[0].aT = cpu_to_be32(reg);
+       table->initialState.level.aT = cpu_to_be32(reg);
 
-       table->initialState.levels[0].bSP = cpu_to_be32(pi->dsp);
+       table->initialState.level.bSP = cpu_to_be32(pi->dsp);
 
-       table->initialState.levels[0].gen2PCIE = (u8)si_pi->boot_pcie_gen;
+       table->initialState.level.gen2PCIE = (u8)si_pi->boot_pcie_gen;
 
        if (pi->mem_gddr5) {
-               table->initialState.levels[0].strobeMode =
+               table->initialState.level.strobeMode =
                        si_get_strobe_mode_settings(rdev,
                                                    initial_state->performance_levels[0].mclk);
 
                if (initial_state->performance_levels[0].mclk > pi->mclk_edc_enable_threshold)
-                       table->initialState.levels[0].mcFlags = SISLANDS_SMC_MC_EDC_RD_FLAG | SISLANDS_SMC_MC_EDC_WR_FLAG;
+                       table->initialState.level.mcFlags = SISLANDS_SMC_MC_EDC_RD_FLAG | SISLANDS_SMC_MC_EDC_WR_FLAG;
                else
-                       table->initialState.levels[0].mcFlags =  0;
+                       table->initialState.level.mcFlags =  0;
        }
 
        table->initialState.levelCount = 1;
 
        table->initialState.flags |= PPSMC_SWSTATE_FLAG_DC;
 
-       table->initialState.levels[0].dpm2.MaxPS = 0;
-       table->initialState.levels[0].dpm2.NearTDPDec = 0;
-       table->initialState.levels[0].dpm2.AboveSafeInc = 0;
-       table->initialState.levels[0].dpm2.BelowSafeInc = 0;
-       table->initialState.levels[0].dpm2.PwrEfficiencyRatio = 0;
+       table->initialState.level.dpm2.MaxPS = 0;
+       table->initialState.level.dpm2.NearTDPDec = 0;
+       table->initialState.level.dpm2.AboveSafeInc = 0;
+       table->initialState.level.dpm2.BelowSafeInc = 0;
+       table->initialState.level.dpm2.PwrEfficiencyRatio = 0;
 
        reg = MIN_POWER_MASK | MAX_POWER_MASK;
-       table->initialState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
+       table->initialState.level.SQPowerThrottle = cpu_to_be32(reg);
 
        reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
-       table->initialState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
+       table->initialState.level.SQPowerThrottle_2 = cpu_to_be32(reg);
 
        return 0;
 }
@@ -4488,18 +4491,18 @@ static int si_populate_smc_acpi_state(struct radeon_device *rdev,
 
        if (pi->acpi_vddc) {
                ret = si_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table,
-                                               pi->acpi_vddc, &table->ACPIState.levels[0].vddc);
+                                               pi->acpi_vddc, &table->ACPIState.level.vddc);
                if (!ret) {
                        u16 std_vddc;
 
                        ret = si_get_std_voltage_value(rdev,
-                                                      &table->ACPIState.levels[0].vddc, &std_vddc);
+                                                      &table->ACPIState.level.vddc, &std_vddc);
                        if (!ret)
                                si_populate_std_voltage_value(rdev, std_vddc,
-                                                             table->ACPIState.levels[0].vddc.index,
-                                                             &table->ACPIState.levels[0].std_vddc);
+                                                             table->ACPIState.level.vddc.index,
+                                                             &table->ACPIState.level.std_vddc);
                }
-               table->ACPIState.levels[0].gen2PCIE = si_pi->acpi_pcie_gen;
+               table->ACPIState.level.gen2PCIE = si_pi->acpi_pcie_gen;
 
                if (si_pi->vddc_phase_shed_control) {
                        si_populate_phase_shedding_value(rdev,
@@ -4507,23 +4510,23 @@ static int si_populate_smc_acpi_state(struct radeon_device *rdev,
                                                         pi->acpi_vddc,
                                                         0,
                                                         0,
-                                                        &table->ACPIState.levels[0].vddc);
+                                                        &table->ACPIState.level.vddc);
                }
        } else {
                ret = si_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table,
-                                               pi->min_vddc_in_table, &table->ACPIState.levels[0].vddc);
+                                               pi->min_vddc_in_table, &table->ACPIState.level.vddc);
                if (!ret) {
                        u16 std_vddc;
 
                        ret = si_get_std_voltage_value(rdev,
-                                                      &table->ACPIState.levels[0].vddc, &std_vddc);
+                                                      &table->ACPIState.level.vddc, &std_vddc);
 
                        if (!ret)
                                si_populate_std_voltage_value(rdev, std_vddc,
-                                                             table->ACPIState.levels[0].vddc.index,
-                                                             &table->ACPIState.levels[0].std_vddc);
+                                                             table->ACPIState.level.vddc.index,
+                                                             &table->ACPIState.level.std_vddc);
                }
-               table->ACPIState.levels[0].gen2PCIE = (u8)r600_get_pcie_gen_support(rdev,
+               table->ACPIState.level.gen2PCIE = (u8)r600_get_pcie_gen_support(rdev,
                                                                                    si_pi->sys_pcie_mask,
                                                                                    si_pi->boot_pcie_gen,
                                                                                    RADEON_PCIE_GEN1);
@@ -4534,14 +4537,14 @@ static int si_populate_smc_acpi_state(struct radeon_device *rdev,
                                                         pi->min_vddc_in_table,
                                                         0,
                                                         0,
-                                                        &table->ACPIState.levels[0].vddc);
+                                                        &table->ACPIState.level.vddc);
        }
 
        if (pi->acpi_vddc) {
                if (eg_pi->acpi_vddci)
                        si_populate_voltage_value(rdev, &eg_pi->vddci_voltage_table,
                                                  eg_pi->acpi_vddci,
-                                                 &table->ACPIState.levels[0].vddci);
+                                                 &table->ACPIState.level.vddci);
        }
 
        mclk_pwrmgt_cntl |= MRDCK0_RESET | MRDCK1_RESET;
@@ -4552,59 +4555,59 @@ static int si_populate_smc_acpi_state(struct radeon_device *rdev,
        spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK;
        spll_func_cntl_2 |= SCLK_MUX_SEL(4);
 
-       table->ACPIState.levels[0].mclk.vDLL_CNTL =
+       table->ACPIState.level.mclk.vDLL_CNTL =
                cpu_to_be32(dll_cntl);
-       table->ACPIState.levels[0].mclk.vMCLK_PWRMGT_CNTL =
+       table->ACPIState.level.mclk.vMCLK_PWRMGT_CNTL =
                cpu_to_be32(mclk_pwrmgt_cntl);
-       table->ACPIState.levels[0].mclk.vMPLL_AD_FUNC_CNTL =
+       table->ACPIState.level.mclk.vMPLL_AD_FUNC_CNTL =
                cpu_to_be32(mpll_ad_func_cntl);
-       table->ACPIState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL =
+       table->ACPIState.level.mclk.vMPLL_DQ_FUNC_CNTL =
                cpu_to_be32(mpll_dq_func_cntl);
-       table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL =
+       table->ACPIState.level.mclk.vMPLL_FUNC_CNTL =
                cpu_to_be32(mpll_func_cntl);
-       table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL_1 =
+       table->ACPIState.level.mclk.vMPLL_FUNC_CNTL_1 =
                cpu_to_be32(mpll_func_cntl_1);
-       table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL_2 =
+       table->ACPIState.level.mclk.vMPLL_FUNC_CNTL_2 =
                cpu_to_be32(mpll_func_cntl_2);
-       table->ACPIState.levels[0].mclk.vMPLL_SS =
+       table->ACPIState.level.mclk.vMPLL_SS =
                cpu_to_be32(si_pi->clock_registers.mpll_ss1);
-       table->ACPIState.levels[0].mclk.vMPLL_SS2 =
+       table->ACPIState.level.mclk.vMPLL_SS2 =
                cpu_to_be32(si_pi->clock_registers.mpll_ss2);
 
-       table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL =
+       table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL =
                cpu_to_be32(spll_func_cntl);
-       table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 =
+       table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_2 =
                cpu_to_be32(spll_func_cntl_2);
-       table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 =
+       table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_3 =
                cpu_to_be32(spll_func_cntl_3);
-       table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 =
+       table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_4 =
                cpu_to_be32(spll_func_cntl_4);
 
-       table->ACPIState.levels[0].mclk.mclk_value = 0;
-       table->ACPIState.levels[0].sclk.sclk_value = 0;
+       table->ACPIState.level.mclk.mclk_value = 0;
+       table->ACPIState.level.sclk.sclk_value = 0;
 
-       si_populate_mvdd_value(rdev, 0, &table->ACPIState.levels[0].mvdd);
+       si_populate_mvdd_value(rdev, 0, &table->ACPIState.level.mvdd);
 
        if (eg_pi->dynamic_ac_timing)
-               table->ACPIState.levels[0].ACIndex = 0;
+               table->ACPIState.level.ACIndex = 0;
 
-       table->ACPIState.levels[0].dpm2.MaxPS = 0;
-       table->ACPIState.levels[0].dpm2.NearTDPDec = 0;
-       table->ACPIState.levels[0].dpm2.AboveSafeInc = 0;
-       table->ACPIState.levels[0].dpm2.BelowSafeInc = 0;
-       table->ACPIState.levels[0].dpm2.PwrEfficiencyRatio = 0;
+       table->ACPIState.level.dpm2.MaxPS = 0;
+       table->ACPIState.level.dpm2.NearTDPDec = 0;
+       table->ACPIState.level.dpm2.AboveSafeInc = 0;
+       table->ACPIState.level.dpm2.BelowSafeInc = 0;
+       table->ACPIState.level.dpm2.PwrEfficiencyRatio = 0;
 
        reg = MIN_POWER_MASK | MAX_POWER_MASK;
-       table->ACPIState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
+       table->ACPIState.level.SQPowerThrottle = cpu_to_be32(reg);
 
        reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
-       table->ACPIState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
+       table->ACPIState.level.SQPowerThrottle_2 = cpu_to_be32(reg);
 
        return 0;
 }
 
 static int si_populate_ulv_state(struct radeon_device *rdev,
-                                SISLANDS_SMC_SWSTATE *state)
+                                struct SISLANDS_SMC_SWSTATE_SINGLE *state)
 {
        struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
        struct si_power_info *si_pi = si_get_pi(rdev);
@@ -4613,19 +4616,19 @@ static int si_populate_ulv_state(struct radeon_device *rdev,
        int ret;
 
        ret = si_convert_power_level_to_smc(rdev, &ulv->pl,
-                                           &state->levels[0]);
+                                           &state->level);
        if (!ret) {
                if (eg_pi->sclk_deep_sleep) {
                        if (sclk_in_sr <= SCLK_MIN_DEEPSLEEP_FREQ)
-                               state->levels[0].stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_BYPASS;
+                               state->level.stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_BYPASS;
                        else
-                               state->levels[0].stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_THROTTLE;
+                               state->level.stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_THROTTLE;
                }
                if (ulv->one_pcie_lane_in_ulv)
                        state->flags |= PPSMC_SWSTATE_FLAG_PCIE_X1;
-               state->levels[0].arbRefreshState = (u8)(SISLANDS_ULV_STATE_ARB_INDEX);
-               state->levels[0].ACIndex = 1;
-               state->levels[0].std_vddc = state->levels[0].vddc;
+               state->level.arbRefreshState = (u8)(SISLANDS_ULV_STATE_ARB_INDEX);
+               state->level.ACIndex = 1;
+               state->level.std_vddc = state->level.vddc;
                state->levelCount = 1;
 
                state->flags |= PPSMC_SWSTATE_FLAG_DC;
@@ -4725,7 +4728,9 @@ static int si_init_smc_table(struct radeon_device *rdev)
        if (ret)
                return ret;
 
-       table->driverState = table->initialState;
+       table->driverState.flags = table->initialState.flags;
+       table->driverState.levelCount = table->initialState.levelCount;
+       table->driverState.levels[0] = table->initialState.level;
 
        ret = si_do_program_memory_timing_parameters(rdev, radeon_boot_state,
                                                     SISLANDS_INITIAL_STATE_ARB_INDEX);
@@ -5275,8 +5280,8 @@ static int si_upload_ulv_state(struct radeon_device *rdev)
        if (ulv->supported && ulv->pl.vddc) {
                u32 address = si_pi->state_table_start +
                        offsetof(SISLANDS_SMC_STATETABLE, ULVState);
-               SISLANDS_SMC_SWSTATE *smc_state = &si_pi->smc_statetable.ULVState;
-               u32 state_size = sizeof(SISLANDS_SMC_SWSTATE);
+               struct SISLANDS_SMC_SWSTATE_SINGLE *smc_state = &si_pi->smc_statetable.ULVState;
+               u32 state_size = sizeof(struct SISLANDS_SMC_SWSTATE_SINGLE);
 
                memset(smc_state, 0, state_size);
 
index fbd6589..4ea1cb2 100644 (file)
@@ -191,6 +191,14 @@ struct SISLANDS_SMC_SWSTATE
 
 typedef struct SISLANDS_SMC_SWSTATE SISLANDS_SMC_SWSTATE;
 
+struct SISLANDS_SMC_SWSTATE_SINGLE {
+       uint8_t                             flags;
+       uint8_t                             levelCount;
+       uint8_t                             padding2;
+       uint8_t                             padding3;
+       SISLANDS_SMC_HW_PERFORMANCE_LEVEL   level;
+};
+
 #define SISLANDS_SMC_VOLTAGEMASK_VDDC  0
 #define SISLANDS_SMC_VOLTAGEMASK_MVDD  1
 #define SISLANDS_SMC_VOLTAGEMASK_VDDCI 2
@@ -208,19 +216,19 @@ typedef struct SISLANDS_SMC_VOLTAGEMASKTABLE SISLANDS_SMC_VOLTAGEMASKTABLE;
 
 struct SISLANDS_SMC_STATETABLE
 {
-    uint8_t                             thermalProtectType;
-    uint8_t                             systemFlags;
-    uint8_t                             maxVDDCIndexInPPTable;
-    uint8_t                             extraFlags;
-    uint32_t                            lowSMIO[SISLANDS_MAX_NO_VREG_STEPS];
-    SISLANDS_SMC_VOLTAGEMASKTABLE       voltageMaskTable;
-    SISLANDS_SMC_VOLTAGEMASKTABLE       phaseMaskTable;
-    PP_SIslands_DPM2Parameters          dpm2Params;
-    SISLANDS_SMC_SWSTATE                initialState;
-    SISLANDS_SMC_SWSTATE                ACPIState;
-    SISLANDS_SMC_SWSTATE                ULVState;
-    SISLANDS_SMC_SWSTATE                driverState;
-    SISLANDS_SMC_HW_PERFORMANCE_LEVEL   dpmLevels[SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE - 1];
+       uint8_t                                 thermalProtectType;
+       uint8_t                                 systemFlags;
+       uint8_t                                 maxVDDCIndexInPPTable;
+       uint8_t                                 extraFlags;
+       uint32_t                                lowSMIO[SISLANDS_MAX_NO_VREG_STEPS];
+       SISLANDS_SMC_VOLTAGEMASKTABLE           voltageMaskTable;
+       SISLANDS_SMC_VOLTAGEMASKTABLE           phaseMaskTable;
+       PP_SIslands_DPM2Parameters              dpm2Params;
+       struct SISLANDS_SMC_SWSTATE_SINGLE      initialState;
+       struct SISLANDS_SMC_SWSTATE_SINGLE      ACPIState;
+       struct SISLANDS_SMC_SWSTATE_SINGLE      ULVState;
+       SISLANDS_SMC_SWSTATE                    driverState;
+       SISLANDS_SMC_HW_PERFORMANCE_LEVEL       dpmLevels[SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
 };
 
 typedef struct SISLANDS_SMC_STATETABLE SISLANDS_SMC_STATETABLE;
index bd5b8eb..090529d 100644 (file)
@@ -197,12 +197,6 @@ struct vc4_vec_connector {
        struct drm_encoder *encoder;
 };
 
-static inline struct vc4_vec_connector *
-to_vc4_vec_connector(struct drm_connector *connector)
-{
-       return container_of(connector, struct vc4_vec_connector, base);
-}
-
 enum vc4_vec_tv_mode_id {
        VC4_VEC_TV_MODE_NTSC,
        VC4_VEC_TV_MODE_NTSC_J,
index 5677263..483cd75 100644 (file)
@@ -485,7 +485,7 @@ static int adm9240_in_write(struct device *dev, u32 attr, int channel, long val)
                reg = ADM9240_REG_IN_MIN(channel);
                break;
        case hwmon_in_max:
-               reg = ADM9240_REG_IN(channel);
+               reg = ADM9240_REG_IN_MAX(channel);
                break;
        default:
                return -EOPNOTSUPP;
index 3a5807e..02298b8 100644 (file)
@@ -355,7 +355,7 @@ static umode_t corsairpsu_hwmon_power_is_visible(const struct corsairpsu_data *p
                return 0444;
        default:
                return 0;
-       };
+       }
 }
 
 static umode_t corsairpsu_hwmon_in_is_visible(const struct corsairpsu_data *priv, u32 attr,
@@ -376,7 +376,7 @@ static umode_t corsairpsu_hwmon_in_is_visible(const struct corsairpsu_data *priv
                break;
        default:
                break;
-       };
+       }
 
        return res;
 }
index ac4adb4..97ab491 100644 (file)
@@ -596,7 +596,6 @@ static int lm80_probe(struct i2c_client *client)
        struct device *dev = &client->dev;
        struct device *hwmon_dev;
        struct lm80_data *data;
-       int rv;
 
        data = devm_kzalloc(dev, sizeof(struct lm80_data), GFP_KERNEL);
        if (!data)
@@ -609,14 +608,8 @@ static int lm80_probe(struct i2c_client *client)
        lm80_init_client(client);
 
        /* A few vars need to be filled upon startup */
-       rv = lm80_read_value(client, LM80_REG_FAN_MIN(1));
-       if (rv < 0)
-               return rv;
-       data->fan[f_min][0] = rv;
-       rv = lm80_read_value(client, LM80_REG_FAN_MIN(2));
-       if (rv < 0)
-               return rv;
-       data->fan[f_min][1] = rv;
+       data->fan[f_min][0] = lm80_read_value(client, LM80_REG_FAN_MIN(1));
+       data->fan[f_min][1] = lm80_read_value(client, LM80_REG_FAN_MIN(2));
 
        hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
                                                           data, lm80_groups);
index 4382105..2a4bed0 100644 (file)
@@ -900,11 +900,15 @@ static int ltc2992_parse_dt(struct ltc2992_state *st)
 
        fwnode_for_each_available_child_node(fwnode, child) {
                ret = fwnode_property_read_u32(child, "reg", &addr);
-               if (ret < 0)
+               if (ret < 0) {
+                       fwnode_handle_put(child);
                        return ret;
+               }
 
-               if (addr > 1)
+               if (addr > 1) {
+                       fwnode_handle_put(child);
                        return -EINVAL;
+               }
 
                ret = fwnode_property_read_u32(child, "shunt-resistor-micro-ohms", &val);
                if (!ret)
index f1ac153..967532a 100644 (file)
@@ -217,9 +217,9 @@ int occ_update_response(struct occ *occ)
                return rc;
 
        /* limit the maximum rate of polling the OCC */
-       if (time_after(jiffies, occ->last_update + OCC_UPDATE_FREQUENCY)) {
+       if (time_after(jiffies, occ->next_update)) {
                rc = occ_poll(occ);
-               occ->last_update = jiffies;
+               occ->next_update = jiffies + OCC_UPDATE_FREQUENCY;
        } else {
                rc = occ->last_error;
        }
@@ -1165,6 +1165,7 @@ int occ_setup(struct occ *occ, const char *name)
                return rc;
        }
 
+       occ->next_update = jiffies + OCC_UPDATE_FREQUENCY;
        occ_parse_poll_response(occ);
 
        rc = occ_setup_sensor_attrs(occ);
index 67e6968..e6df719 100644 (file)
@@ -99,7 +99,7 @@ struct occ {
        u8 poll_cmd_data;               /* to perform OCC poll command */
        int (*send_cmd)(struct occ *occ, u8 *cmd);
 
-       unsigned long last_update;
+       unsigned long next_update;
        struct mutex lock;              /* lock OCC access */
 
        struct device *hwmon;
index b177987..e248424 100644 (file)
@@ -57,7 +57,7 @@ static int page_log_to_page_real(int page_log, enum chips chip)
                case YH5151E_PAGE_12V_LOG:
                        return YH5151E_PAGE_12V_REAL;
                case YH5151E_PAGE_5V_LOG:
-                       return YH5151E_PAGE_5V_LOG;
+                       return YH5151E_PAGE_5V_REAL;
                case YH5151E_PAGE_3V3_LOG:
                        return YH5151E_PAGE_3V3_REAL;
                }
@@ -103,8 +103,18 @@ static int set_page(struct i2c_client *client, int page_log)
 
 static int fsp3y_read_byte_data(struct i2c_client *client, int page, int reg)
 {
+       const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
+       struct fsp3y_data *data = to_fsp3y_data(info);
        int rv;
 
+       /*
+        * YH5151-E outputs vout in linear11. The conversion is done when
+        * reading. Here, we have to inject pmbus_core with the correct
+        * exponent (it is -6).
+        */
+       if (data->chip == yh5151e && reg == PMBUS_VOUT_MODE)
+               return 0x1A;
+
        rv = set_page(client, page);
        if (rv < 0)
                return rv;
@@ -114,6 +124,8 @@ static int fsp3y_read_byte_data(struct i2c_client *client, int page, int reg)
 
 static int fsp3y_read_word_data(struct i2c_client *client, int page, int phase, int reg)
 {
+       const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
+       struct fsp3y_data *data = to_fsp3y_data(info);
        int rv;
 
        /*
@@ -144,7 +156,18 @@ static int fsp3y_read_word_data(struct i2c_client *client, int page, int phase,
        if (rv < 0)
                return rv;
 
-       return i2c_smbus_read_word_data(client, reg);
+       rv = i2c_smbus_read_word_data(client, reg);
+       if (rv < 0)
+               return rv;
+
+       /*
+        * YH-5151E is non-compliant and outputs output voltages in linear11
+        * instead of linear16.
+        */
+       if (data->chip == yh5151e && reg == PMBUS_READ_VOUT)
+               rv = sign_extend32(rv, 10) & 0xffff;
+
+       return rv;
 }
 
 static struct pmbus_driver_info fsp3y_info[] = {
index cceda3c..8b17236 100644 (file)
@@ -229,7 +229,6 @@ config DMARD10
 config HID_SENSOR_ACCEL_3D
        depends on HID_SENSOR_HUB
        select IIO_BUFFER
-       select IIO_TRIGGERED_BUFFER
        select HID_SENSOR_IIO_COMMON
        select HID_SENSOR_IIO_TRIGGER
        tristate "HID Accelerometers 3D"
index 24d4925..2a3dd3b 100644 (file)
@@ -19,6 +19,7 @@ config HID_SENSOR_IIO_TRIGGER
        tristate "Common module (trigger) for all HID Sensor IIO drivers"
        depends on HID_SENSOR_HUB && HID_SENSOR_IIO_COMMON && IIO_BUFFER
        select IIO_TRIGGER
+       select IIO_TRIGGERED_BUFFER
        help
          Say yes here to build trigger support for HID sensors.
          Triggers will be send if all requested attributes were read.
index 5824f2e..20b5ac7 100644 (file)
@@ -111,7 +111,6 @@ config FXAS21002C_SPI
 config HID_SENSOR_GYRO_3D
        depends on HID_SENSOR_HUB
        select IIO_BUFFER
-       select IIO_TRIGGERED_BUFFER
        select HID_SENSOR_IIO_COMMON
        select HID_SENSOR_IIO_TRIGGER
        tristate "HID Gyroscope 3D"
index ac90be0..f17a935 100644 (file)
@@ -272,7 +272,16 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev,
        case IIO_CHAN_INFO_OFFSET:
                switch (chan->type) {
                case IIO_TEMP:
-                       /* The temperature scaling is (x+23000)/280 Celsius */
+                       /*
+                        * The temperature scaling is (x+23000)/280 Celsius
+                        * for the "best fit straight line" temperature range
+                        * of -30C..85C.  The 23000 includes room temperature
+                        * offset of +35C, 280 is the precision scale and x is
+                        * the 16-bit signed integer reported by hardware.
+                        *
+                        * Temperature value itself represents temperature of
+                        * the sensor die.
+                        */
                        *val = 23000;
                        return IIO_VAL_INT;
                default:
@@ -329,7 +338,7 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev,
                                goto out_read_raw_unlock;
                        }
 
-                       *val = be16_to_cpu(raw_val);
+                       *val = (s16)be16_to_cpu(raw_val);
                        ret = IIO_VAL_INT;
 
                        goto out_read_raw_unlock;
index 6549fcf..2de5494 100644 (file)
@@ -52,7 +52,6 @@ config HID_SENSOR_HUMIDITY
        tristate "HID Environmental humidity sensor"
        depends on HID_SENSOR_HUB
        select IIO_BUFFER
-       select IIO_TRIGGERED_BUFFER
        select HID_SENSOR_IIO_COMMON
        select HID_SENSOR_IIO_TRIGGER
        help
index d92c58a..59efb36 100644 (file)
@@ -1778,7 +1778,6 @@ static long iio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
        if (!indio_dev->info)
                goto out_unlock;
 
-       ret = -EINVAL;
        list_for_each_entry(h, &iio_dev_opaque->ioctl_handlers, entry) {
                ret = h->ioctl(indio_dev, filp, cmd, arg);
                if (ret != IIO_IOCTL_UNHANDLED)
@@ -1786,7 +1785,7 @@ static long iio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
        }
 
        if (ret == IIO_IOCTL_UNHANDLED)
-               ret = -EINVAL;
+               ret = -ENODEV;
 
 out_unlock:
        mutex_unlock(&indio_dev->info_exist_lock);
@@ -1926,9 +1925,6 @@ EXPORT_SYMBOL(__iio_device_register);
  **/
 void iio_device_unregister(struct iio_dev *indio_dev)
 {
-       struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);
-       struct iio_ioctl_handler *h, *t;
-
        cdev_device_del(&indio_dev->chrdev, &indio_dev->dev);
 
        mutex_lock(&indio_dev->info_exist_lock);
@@ -1939,9 +1935,6 @@ void iio_device_unregister(struct iio_dev *indio_dev)
 
        indio_dev->info = NULL;
 
-       list_for_each_entry_safe(h, t, &iio_dev_opaque->ioctl_handlers, entry)
-               list_del(&h->entry);
-
        iio_device_wakeup_eventset(indio_dev);
        iio_buffer_wakeup_poll(indio_dev);
 
index 33ad4dd..917f9be 100644 (file)
@@ -256,7 +256,6 @@ config ISL29125
 config HID_SENSOR_ALS
        depends on HID_SENSOR_HUB
        select IIO_BUFFER
-       select IIO_TRIGGERED_BUFFER
        select HID_SENSOR_IIO_COMMON
        select HID_SENSOR_IIO_TRIGGER
        tristate "HID ALS"
@@ -270,7 +269,6 @@ config HID_SENSOR_ALS
 config HID_SENSOR_PROX
        depends on HID_SENSOR_HUB
        select IIO_BUFFER
-       select IIO_TRIGGERED_BUFFER
        select HID_SENSOR_IIO_COMMON
        select HID_SENSOR_IIO_TRIGGER
        tristate "HID PROX"
index d048ae2..f960be7 100644 (file)
@@ -582,7 +582,7 @@ static int gp2ap002_probe(struct i2c_client *client,
                                        "gp2ap002", indio_dev);
        if (ret) {
                dev_err(dev, "unable to request IRQ\n");
-               goto out_disable_vio;
+               goto out_put_pm;
        }
        gp2ap002->irq = client->irq;
 
@@ -612,8 +612,9 @@ static int gp2ap002_probe(struct i2c_client *client,
 
        return 0;
 
-out_disable_pm:
+out_put_pm:
        pm_runtime_put_noidle(dev);
+out_disable_pm:
        pm_runtime_disable(dev);
 out_disable_vio:
        regulator_disable(gp2ap002->vio);
index 0f787bf..c9d8f07 100644 (file)
@@ -341,6 +341,14 @@ static int tsl2583_als_calibrate(struct iio_dev *indio_dev)
                return lux_val;
        }
 
+       /* Avoid division by zero of lux_value later on */
+       if (lux_val == 0) {
+               dev_err(&chip->client->dev,
+                       "%s: lux_val of 0 will produce out of range trim_value\n",
+                       __func__);
+               return -ENODATA;
+       }
+
        gain_trim_val = (unsigned int)(((chip->als_settings.als_cal_target)
                        * chip->als_settings.als_gain_trim) / lux_val);
        if ((gain_trim_val < 250) || (gain_trim_val > 4000)) {
index 5d4ffd6..74ad570 100644 (file)
@@ -95,7 +95,6 @@ config MAG3110
 config HID_SENSOR_MAGNETOMETER_3D
        depends on HID_SENSOR_HUB
        select IIO_BUFFER
-       select IIO_TRIGGERED_BUFFER
        select HID_SENSOR_IIO_COMMON
        select HID_SENSOR_IIO_TRIGGER
        tristate "HID Magenetometer 3D"
index a505583..396cbbb 100644 (file)
@@ -9,7 +9,6 @@ menu "Inclinometer sensors"
 config HID_SENSOR_INCLINOMETER_3D
        depends on HID_SENSOR_HUB
        select IIO_BUFFER
-       select IIO_TRIGGERED_BUFFER
        select HID_SENSOR_IIO_COMMON
        select HID_SENSOR_IIO_TRIGGER
        tristate "HID Inclinometer 3D"
@@ -20,7 +19,6 @@ config HID_SENSOR_INCLINOMETER_3D
 config HID_SENSOR_DEVICE_ROTATION
        depends on HID_SENSOR_HUB
        select IIO_BUFFER
-       select IIO_TRIGGERED_BUFFER
        select HID_SENSOR_IIO_COMMON
        select HID_SENSOR_IIO_TRIGGER
        tristate "HID Device Rotation"
index 689b978..fc0d3cf 100644 (file)
@@ -79,7 +79,6 @@ config DPS310
 config HID_SENSOR_PRESS
        depends on HID_SENSOR_HUB
        select IIO_BUFFER
-       select IIO_TRIGGERED_BUFFER
        select HID_SENSOR_IIO_COMMON
        select HID_SENSOR_IIO_TRIGGER
        tristate "HID PRESS"
index c685f10..cc206bf 100644 (file)
@@ -160,6 +160,7 @@ static int lidar_get_measurement(struct lidar_data *data, u16 *reg)
        ret = lidar_write_control(data, LIDAR_REG_CONTROL_ACQUIRE);
        if (ret < 0) {
                dev_err(&client->dev, "cannot send start measurement command");
+               pm_runtime_put_noidle(&client->dev);
                return ret;
        }
 
index f1f2a14..4df6008 100644 (file)
@@ -45,7 +45,6 @@ config HID_SENSOR_TEMP
        tristate "HID Environmental temperature sensor"
        depends on HID_SENSOR_HUB
        select IIO_BUFFER
-       select IIO_TRIGGERED_BUFFER
        select HID_SENSOR_IIO_COMMON
        select HID_SENSOR_IIO_TRIGGER
        help
index 2b9ffc2..ab148a6 100644 (file)
@@ -473,6 +473,7 @@ static void cma_release_dev(struct rdma_id_private *id_priv)
        list_del(&id_priv->list);
        cma_dev_put(id_priv->cma_dev);
        id_priv->cma_dev = NULL;
+       id_priv->id.device = NULL;
        if (id_priv->id.route.addr.dev_addr.sgid_attr) {
                rdma_put_gid_attr(id_priv->id.route.addr.dev_addr.sgid_attr);
                id_priv->id.route.addr.dev_addr.sgid_attr = NULL;
@@ -1860,6 +1861,7 @@ static void _destroy_id(struct rdma_id_private *id_priv,
                                iw_destroy_cm_id(id_priv->cm_id.iw);
                }
                cma_leave_mc_groups(id_priv);
+               rdma_restrack_del(&id_priv->res);
                cma_release_dev(id_priv);
        }
 
@@ -1873,7 +1875,6 @@ static void _destroy_id(struct rdma_id_private *id_priv,
        kfree(id_priv->id.route.path_rec);
 
        put_net(id_priv->id.route.addr.dev_addr.net);
-       rdma_restrack_del(&id_priv->res);
        kfree(id_priv);
 }
 
@@ -3774,7 +3775,7 @@ int rdma_listen(struct rdma_cm_id *id, int backlog)
        }
 
        id_priv->backlog = backlog;
-       if (id->device) {
+       if (id_priv->cma_dev) {
                if (rdma_cap_ib_cm(id->device, 1)) {
                        ret = cma_ib_listen(id_priv);
                        if (ret)
index 9ec6971..0496848 100644 (file)
@@ -117,8 +117,8 @@ static int UVERBS_HANDLER(UVERBS_METHOD_INFO_HANDLES)(
                return ret;
 
        uapi_object = uapi_get_object(attrs->ufile->device->uapi, object_id);
-       if (!uapi_object)
-               return -EINVAL;
+       if (IS_ERR(uapi_object))
+               return PTR_ERR(uapi_object);
 
        handles = gather_objects_handle(attrs->ufile, uapi_object, attrs,
                                        out_len, &total);
@@ -331,6 +331,9 @@ static int UVERBS_HANDLER(UVERBS_METHOD_QUERY_GID_TABLE)(
        if (ret)
                return ret;
 
+       if (!user_entry_size)
+               return -EINVAL;
+
        max_entries = uverbs_attr_ptr_get_array_size(
                attrs, UVERBS_ATTR_QUERY_GID_TABLE_RESP_ENTRIES,
                user_entry_size);
index a0b677a..eb9b0a2 100644 (file)
@@ -630,9 +630,8 @@ static bool devx_is_valid_obj_id(struct uverbs_attr_bundle *attrs,
        case UVERBS_OBJECT_QP:
        {
                struct mlx5_ib_qp *qp = to_mqp(uobj->object);
-               enum ib_qp_type qp_type = qp->ibqp.qp_type;
 
-               if (qp_type == IB_QPT_RAW_PACKET ||
+               if (qp->type == IB_QPT_RAW_PACKET ||
                    (qp->flags & IB_QP_CREATE_SOURCE_QPN)) {
                        struct mlx5_ib_raw_packet_qp *raw_packet_qp =
                                                         &qp->raw_packet_qp;
@@ -649,10 +648,9 @@ static bool devx_is_valid_obj_id(struct uverbs_attr_bundle *attrs,
                                               sq->tisn) == obj_id);
                }
 
-               if (qp_type == MLX5_IB_QPT_DCT)
+               if (qp->type == MLX5_IB_QPT_DCT)
                        return get_enc_obj_id(MLX5_CMD_OP_CREATE_DCT,
                                              qp->dct.mdct.mqp.qpn) == obj_id;
-
                return get_enc_obj_id(MLX5_CMD_OP_CREATE_QP,
                                      qp->ibqp.qp_num) == obj_id;
        }
index 094bf85..001d766 100644 (file)
@@ -217,6 +217,9 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DM_MAP_OP_ADDR)(
        if (err)
                return err;
 
+       if (op >= BITS_PER_TYPE(u32))
+               return -EOPNOTSUPP;
+
        if (!(MLX5_CAP_DEV_MEM(dev->mdev, memic_operations) & BIT(op)))
                return -EOPNOTSUPP;
 
index 6d1dd09..644d5d0 100644 (file)
@@ -4419,6 +4419,7 @@ static int mlx5r_mp_probe(struct auxiliary_device *adev,
 
                if (bound) {
                        rdma_roce_rescan_device(&dev->ib_dev);
+                       mpi->ibdev->ib_active = true;
                        break;
                }
        }
index 2af2673..a6712e3 100644 (file)
@@ -346,13 +346,15 @@ static inline enum comp_state do_read(struct rxe_qp *qp,
        ret = copy_data(qp->pd, IB_ACCESS_LOCAL_WRITE,
                        &wqe->dma, payload_addr(pkt),
                        payload_size(pkt), to_mr_obj, NULL);
-       if (ret)
+       if (ret) {
+               wqe->status = IB_WC_LOC_PROT_ERR;
                return COMPST_ERROR;
+       }
 
        if (wqe->dma.resid == 0 && (pkt->mask & RXE_END_MASK))
                return COMPST_COMP_ACK;
-       else
-               return COMPST_UPDATE_COMP;
+
+       return COMPST_UPDATE_COMP;
 }
 
 static inline enum comp_state do_atomic(struct rxe_qp *qp,
@@ -366,10 +368,12 @@ static inline enum comp_state do_atomic(struct rxe_qp *qp,
        ret = copy_data(qp->pd, IB_ACCESS_LOCAL_WRITE,
                        &wqe->dma, &atomic_orig,
                        sizeof(u64), to_mr_obj, NULL);
-       if (ret)
+       if (ret) {
+               wqe->status = IB_WC_LOC_PROT_ERR;
                return COMPST_ERROR;
-       else
-               return COMPST_COMP_ACK;
+       }
+
+       return COMPST_COMP_ACK;
 }
 
 static void make_send_cqe(struct rxe_qp *qp, struct rxe_send_wqe *wqe,
index 34ae957..b0f350d 100644 (file)
@@ -242,6 +242,7 @@ static int rxe_qp_init_req(struct rxe_dev *rxe, struct rxe_qp *qp,
        if (err) {
                vfree(qp->sq.queue->buf);
                kfree(qp->sq.queue);
+               qp->sq.queue = NULL;
                return err;
        }
 
@@ -295,6 +296,7 @@ static int rxe_qp_init_resp(struct rxe_dev *rxe, struct rxe_qp *qp,
                if (err) {
                        vfree(qp->rq.queue->buf);
                        kfree(qp->rq.queue);
+                       qp->rq.queue = NULL;
                        return err;
                }
        }
@@ -355,6 +357,11 @@ int rxe_qp_from_init(struct rxe_dev *rxe, struct rxe_qp *qp, struct rxe_pd *pd,
 err2:
        rxe_queue_cleanup(qp->sq.queue);
 err1:
+       qp->pd = NULL;
+       qp->rcq = NULL;
+       qp->scq = NULL;
+       qp->srq = NULL;
+
        if (srq)
                rxe_drop_ref(srq);
        rxe_drop_ref(scq);
index d2313ef..3f175f2 100644 (file)
@@ -300,7 +300,6 @@ struct ib_qp *siw_create_qp(struct ib_pd *pd,
        struct siw_ucontext *uctx =
                rdma_udata_to_drv_context(udata, struct siw_ucontext,
                                          base_ucontext);
-       struct siw_cq *scq = NULL, *rcq = NULL;
        unsigned long flags;
        int num_sqe, num_rqe, rv = 0;
        size_t length;
@@ -343,10 +342,8 @@ struct ib_qp *siw_create_qp(struct ib_pd *pd,
                rv = -EINVAL;
                goto err_out;
        }
-       scq = to_siw_cq(attrs->send_cq);
-       rcq = to_siw_cq(attrs->recv_cq);
 
-       if (!scq || (!rcq && !attrs->srq)) {
+       if (!attrs->send_cq || (!attrs->recv_cq && !attrs->srq)) {
                siw_dbg(base_dev, "send CQ or receive CQ invalid\n");
                rv = -EINVAL;
                goto err_out;
@@ -378,7 +375,7 @@ struct ib_qp *siw_create_qp(struct ib_pd *pd,
        else {
                /* Zero sized SQ is not supported */
                rv = -EINVAL;
-               goto err_out;
+               goto err_out_xa;
        }
        if (num_rqe)
                num_rqe = roundup_pow_of_two(num_rqe);
@@ -401,8 +398,8 @@ struct ib_qp *siw_create_qp(struct ib_pd *pd,
                }
        }
        qp->pd = pd;
-       qp->scq = scq;
-       qp->rcq = rcq;
+       qp->scq = to_siw_cq(attrs->send_cq);
+       qp->rcq = to_siw_cq(attrs->recv_cq);
 
        if (attrs->srq) {
                /*
index b90e825..62543a4 100644 (file)
@@ -596,7 +596,7 @@ config IRQ_IDT3243X
 config APPLE_AIC
        bool "Apple Interrupt Controller (AIC)"
        depends on ARM64
-       default ARCH_APPLE
+       depends on ARCH_APPLE || COMPILE_TEST
        help
          Support for the Apple Interrupt Controller found on Apple Silicon SoCs,
          such as the M1.
index 91adf77..090bc3f 100644 (file)
@@ -359,10 +359,8 @@ static int mvebu_icu_probe(struct platform_device *pdev)
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        icu->base = devm_ioremap_resource(&pdev->dev, res);
-       if (IS_ERR(icu->base)) {
-               dev_err(&pdev->dev, "Failed to map icu base address.\n");
+       if (IS_ERR(icu->base))
                return PTR_ERR(icu->base);
-       }
 
        /*
         * Legacy bindings: ICU is one node with one MSI parent: force manually
index 18832cc..3a7b7a7 100644 (file)
@@ -384,10 +384,8 @@ static int mvebu_sei_probe(struct platform_device *pdev)
 
        sei->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        sei->base = devm_ioremap_resource(sei->dev, sei->res);
-       if (IS_ERR(sei->base)) {
-               dev_err(sei->dev, "Failed to remap SEI resource\n");
+       if (IS_ERR(sei->base))
                return PTR_ERR(sei->base);
-       }
 
        /* Retrieve the SEI capabilities with the interrupt ranges */
        sei->caps = of_device_get_match_data(&pdev->dev);
index b9db90c..4704f2e 100644 (file)
@@ -892,10 +892,8 @@ static int stm32_exti_probe(struct platform_device *pdev)
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        host_data->base = devm_ioremap_resource(dev, res);
-       if (IS_ERR(host_data->base)) {
-               dev_err(dev, "Unable to map registers\n");
+       if (IS_ERR(host_data->base))
                return PTR_ERR(host_data->base);
-       }
 
        for (i = 0; i < drv_data->bank_nr; i++)
                stm32_exti_chip_init(host_data, i, np);
index 7006199..cd5642c 100644 (file)
@@ -46,7 +46,7 @@ static void hfcsusb_start_endpoint(struct hfcsusb *hw, int channel);
 static void hfcsusb_stop_endpoint(struct hfcsusb *hw, int channel);
 static int  hfcsusb_setup_bch(struct bchannel *bch, int protocol);
 static void deactivate_bchannel(struct bchannel *bch);
-static void hfcsusb_ph_info(struct hfcsusb *hw);
+static int  hfcsusb_ph_info(struct hfcsusb *hw);
 
 /* start next background transfer for control channel */
 static void
@@ -241,7 +241,7 @@ hfcusb_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
  * send full D/B channel status information
  * as MPH_INFORMATION_IND
  */
-static void
+static int
 hfcsusb_ph_info(struct hfcsusb *hw)
 {
        struct ph_info *phi;
@@ -250,7 +250,7 @@ hfcsusb_ph_info(struct hfcsusb *hw)
 
        phi = kzalloc(struct_size(phi, bch, dch->dev.nrbchan), GFP_ATOMIC);
        if (!phi)
-               return;
+               return -ENOMEM;
 
        phi->dch.ch.protocol = hw->protocol;
        phi->dch.ch.Flags = dch->Flags;
@@ -263,6 +263,8 @@ hfcsusb_ph_info(struct hfcsusb *hw)
        _queue_data(&dch->dev.D, MPH_INFORMATION_IND, MISDN_ID_ANY,
                    struct_size(phi, bch, dch->dev.nrbchan), phi, GFP_ATOMIC);
        kfree(phi);
+
+       return 0;
 }
 
 /*
@@ -347,8 +349,7 @@ hfcusb_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb)
                        ret = l1_event(dch->l1, hh->prim);
                break;
        case MPH_INFORMATION_REQ:
-               hfcsusb_ph_info(hw);
-               ret = 0;
+               ret = hfcsusb_ph_info(hw);
                break;
        }
 
@@ -403,8 +404,7 @@ hfc_l1callback(struct dchannel *dch, u_int cmd)
                               hw->name, __func__, cmd);
                return -1;
        }
-       hfcsusb_ph_info(hw);
-       return 0;
+       return hfcsusb_ph_info(hw);
 }
 
 static int
@@ -746,8 +746,7 @@ hfcsusb_setup_bch(struct bchannel *bch, int protocol)
                        handle_led(hw, (bch->nr == 1) ? LED_B1_OFF :
                                   LED_B2_OFF);
        }
-       hfcsusb_ph_info(hw);
-       return 0;
+       return hfcsusb_ph_info(hw);
 }
 
 static void
index a16c7a2..88d592b 100644 (file)
@@ -630,17 +630,19 @@ static void
 release_io(struct inf_hw *hw)
 {
        if (hw->cfg.mode) {
-               if (hw->cfg.p) {
+               if (hw->cfg.mode == AM_MEMIO) {
                        release_mem_region(hw->cfg.start, hw->cfg.size);
-                       iounmap(hw->cfg.p);
+                       if (hw->cfg.p)
+                               iounmap(hw->cfg.p);
                } else
                        release_region(hw->cfg.start, hw->cfg.size);
                hw->cfg.mode = AM_NONE;
        }
        if (hw->addr.mode) {
-               if (hw->addr.p) {
+               if (hw->addr.mode == AM_MEMIO) {
                        release_mem_region(hw->addr.start, hw->addr.size);
-                       iounmap(hw->addr.p);
+                       if (hw->addr.p)
+                               iounmap(hw->addr.p);
                } else
                        release_region(hw->addr.start, hw->addr.size);
                hw->addr.mode = AM_NONE;
@@ -670,9 +672,12 @@ setup_io(struct inf_hw *hw)
                                (ulong)hw->cfg.start, (ulong)hw->cfg.size);
                        return err;
                }
-               if (hw->ci->cfg_mode == AM_MEMIO)
-                       hw->cfg.p = ioremap(hw->cfg.start, hw->cfg.size);
                hw->cfg.mode = hw->ci->cfg_mode;
+               if (hw->ci->cfg_mode == AM_MEMIO) {
+                       hw->cfg.p = ioremap(hw->cfg.start, hw->cfg.size);
+                       if (!hw->cfg.p)
+                               return -ENOMEM;
+               }
                if (debug & DEBUG_HW)
                        pr_notice("%s: IO cfg %lx (%lu bytes) mode%d\n",
                                  hw->name, (ulong)hw->cfg.start,
@@ -697,12 +702,12 @@ setup_io(struct inf_hw *hw)
                                (ulong)hw->addr.start, (ulong)hw->addr.size);
                        return err;
                }
+               hw->addr.mode = hw->ci->addr_mode;
                if (hw->ci->addr_mode == AM_MEMIO) {
                        hw->addr.p = ioremap(hw->addr.start, hw->addr.size);
-                       if (unlikely(!hw->addr.p))
+                       if (!hw->addr.p)
                                return -ENOMEM;
                }
-               hw->addr.mode = hw->ci->addr_mode;
                if (debug & DEBUG_HW)
                        pr_notice("%s: IO addr %lx (%lu bytes) mode%d\n",
                                  hw->name, (ulong)hw->addr.start,
index fc433e6..b1590cb 100644 (file)
@@ -307,7 +307,7 @@ static int lp5523_init_program_engine(struct lp55xx_chip *chip)
        usleep_range(3000, 6000);
        ret = lp55xx_read(chip, LP5523_REG_STATUS, &status);
        if (ret)
-               return ret;
+               goto out;
        status &= LP5523_ENG_STATUS_MASK;
 
        if (status != LP5523_ENG_STATUS_MASK) {
index 781942a..20f2510 100644 (file)
@@ -66,14 +66,14 @@ struct superblock {
        __u8 magic[8];
        __u8 version;
        __u8 log2_interleave_sectors;
-       __u16 integrity_tag_size;
-       __u32 journal_sections;
-       __u64 provided_data_sectors;    /* userspace uses this value */
-       __u32 flags;
+       __le16 integrity_tag_size;
+       __le32 journal_sections;
+       __le64 provided_data_sectors;   /* userspace uses this value */
+       __le32 flags;
        __u8 log2_sectors_per_block;
        __u8 log2_blocks_per_bitmap_bit;
        __u8 pad[2];
-       __u64 recalc_sector;
+       __le64 recalc_sector;
        __u8 pad2[8];
        __u8 salt[SALT_SIZE];
 };
@@ -86,16 +86,16 @@ struct superblock {
 
 #define        JOURNAL_ENTRY_ROUNDUP           8
 
-typedef __u64 commit_id_t;
+typedef __le64 commit_id_t;
 #define JOURNAL_MAC_PER_SECTOR         8
 
 struct journal_entry {
        union {
                struct {
-                       __u32 sector_lo;
-                       __u32 sector_hi;
+                       __le32 sector_lo;
+                       __le32 sector_hi;
                } s;
-               __u64 sector;
+               __le64 sector;
        } u;
        commit_id_t last_bytes[];
        /* __u8 tag[0]; */
@@ -806,7 +806,7 @@ static void section_mac(struct dm_integrity_c *ic, unsigned section, __u8 result
        }
 
        if (ic->sb->flags & cpu_to_le32(SB_FLAG_FIXED_HMAC)) {
-               uint64_t section_le;
+               __le64 section_le;
 
                r = crypto_shash_update(desc, (__u8 *)&ic->sb->salt, SALT_SIZE);
                if (unlikely(r < 0)) {
@@ -1640,7 +1640,7 @@ static void integrity_end_io(struct bio *bio)
 static void integrity_sector_checksum(struct dm_integrity_c *ic, sector_t sector,
                                      const char *data, char *result)
 {
-       __u64 sector_le = cpu_to_le64(sector);
+       __le64 sector_le = cpu_to_le64(sector);
        SHASH_DESC_ON_STACK(req, ic->internal_hash);
        int r;
        unsigned digest_size;
@@ -2689,30 +2689,26 @@ next_chunk:
        if (unlikely(dm_integrity_failed(ic)))
                goto err;
 
-       if (!ic->discard) {
-               io_req.bi_op = REQ_OP_READ;
-               io_req.bi_op_flags = 0;
-               io_req.mem.type = DM_IO_VMA;
-               io_req.mem.ptr.addr = ic->recalc_buffer;
-               io_req.notify.fn = NULL;
-               io_req.client = ic->io;
-               io_loc.bdev = ic->dev->bdev;
-               io_loc.sector = get_data_sector(ic, area, offset);
-               io_loc.count = n_sectors;
+       io_req.bi_op = REQ_OP_READ;
+       io_req.bi_op_flags = 0;
+       io_req.mem.type = DM_IO_VMA;
+       io_req.mem.ptr.addr = ic->recalc_buffer;
+       io_req.notify.fn = NULL;
+       io_req.client = ic->io;
+       io_loc.bdev = ic->dev->bdev;
+       io_loc.sector = get_data_sector(ic, area, offset);
+       io_loc.count = n_sectors;
 
-               r = dm_io(&io_req, 1, &io_loc, NULL);
-               if (unlikely(r)) {
-                       dm_integrity_io_error(ic, "reading data", r);
-                       goto err;
-               }
+       r = dm_io(&io_req, 1, &io_loc, NULL);
+       if (unlikely(r)) {
+               dm_integrity_io_error(ic, "reading data", r);
+               goto err;
+       }
 
-               t = ic->recalc_tags;
-               for (i = 0; i < n_sectors; i += ic->sectors_per_block) {
-                       integrity_sector_checksum(ic, logical_sector + i, ic->recalc_buffer + (i << SECTOR_SHIFT), t);
-                       t += ic->tag_size;
-               }
-       } else {
-               t = ic->recalc_tags + (n_sectors >> ic->sb->log2_sectors_per_block) * ic->tag_size;
+       t = ic->recalc_tags;
+       for (i = 0; i < n_sectors; i += ic->sectors_per_block) {
+               integrity_sector_checksum(ic, logical_sector + i, ic->recalc_buffer + (i << SECTOR_SHIFT), t);
+               t += ic->tag_size;
        }
 
        metadata_block = get_metadata_sector_and_offset(ic, area, offset, &metadata_offset);
@@ -3826,7 +3822,7 @@ static int create_journal(struct dm_integrity_c *ic, char **error)
                        for (i = 0; i < ic->journal_sections; i++) {
                                struct scatterlist sg;
                                struct skcipher_request *section_req;
-                               __u32 section_le = cpu_to_le32(i);
+                               __le32 section_le = cpu_to_le32(i);
 
                                memset(crypt_iv, 0x00, ivsize);
                                memset(crypt_data, 0x00, crypt_len);
@@ -4368,13 +4364,11 @@ try_smaller_buffer:
                        goto bad;
                }
                INIT_WORK(&ic->recalc_work, integrity_recalc);
-               if (!ic->discard) {
-                       ic->recalc_buffer = vmalloc(RECALC_SECTORS << SECTOR_SHIFT);
-                       if (!ic->recalc_buffer) {
-                               ti->error = "Cannot allocate buffer for recalculating";
-                               r = -ENOMEM;
-                               goto bad;
-                       }
+               ic->recalc_buffer = vmalloc(RECALC_SECTORS << SECTOR_SHIFT);
+               if (!ic->recalc_buffer) {
+                       ti->error = "Cannot allocate buffer for recalculating";
+                       r = -ENOMEM;
+                       goto bad;
                }
                ic->recalc_tags = kvmalloc_array(RECALC_SECTORS >> ic->sb->log2_sectors_per_block,
                                                 ic->tag_size, GFP_KERNEL);
@@ -4383,9 +4377,6 @@ try_smaller_buffer:
                        r = -ENOMEM;
                        goto bad;
                }
-               if (ic->discard)
-                       memset(ic->recalc_tags, DISCARD_FILLER,
-                              (RECALC_SECTORS >> ic->sb->log2_sectors_per_block) * ic->tag_size);
        } else {
                if (ic->sb->flags & cpu_to_le32(SB_FLAG_RECALCULATING)) {
                        ti->error = "Recalculate can only be specified with internal_hash";
@@ -4579,7 +4570,7 @@ static void dm_integrity_dtr(struct dm_target *ti)
 
 static struct target_type integrity_target = {
        .name                   = "integrity",
-       .version                = {1, 9, 0},
+       .version                = {1, 10, 0},
        .module                 = THIS_MODULE,
        .features               = DM_TARGET_SINGLETON | DM_TARGET_INTEGRITY,
        .ctr                    = dm_integrity_ctr,
index a2acb01..b8e4d31 100644 (file)
@@ -855,12 +855,11 @@ static int dm_add_exception(void *context, chunk_t old, chunk_t new)
 static uint32_t __minimum_chunk_size(struct origin *o)
 {
        struct dm_snapshot *snap;
-       unsigned chunk_size = 0;
+       unsigned chunk_size = rounddown_pow_of_two(UINT_MAX);
 
        if (o)
                list_for_each_entry(snap, &o->snapshots, list)
-                       chunk_size = min_not_zero(chunk_size,
-                                                 snap->store->chunk_size);
+                       chunk_size = min(chunk_size, snap->store->chunk_size);
 
        return (uint32_t) chunk_size;
 }
@@ -1409,6 +1408,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 
        if (!s->store->chunk_size) {
                ti->error = "Chunk size not set";
+               r = -EINVAL;
                goto bad_read_metadata;
        }
 
index 655db82..9767159 100644 (file)
@@ -281,7 +281,7 @@ static int sp8870_set_frontend_parameters(struct dvb_frontend *fe)
 
        // read status reg in order to clear pending irqs
        err = sp8870_readreg(state, 0x200);
-       if (err)
+       if (err < 0)
                return err;
 
        // system controller start
index 83bd9a4..1e3b68a 100644 (file)
@@ -915,7 +915,6 @@ static int rcar_drif_g_fmt_sdr_cap(struct file *file, void *priv,
 {
        struct rcar_drif_sdr *sdr = video_drvdata(file);
 
-       memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved));
        f->fmt.sdr.pixelformat = sdr->fmt->pixelformat;
        f->fmt.sdr.buffersize = sdr->fmt->buffersize;
 
index a4f7431..d93d384 100644 (file)
@@ -1424,7 +1424,6 @@ static int sd_config(struct gspca_dev *gspca_dev,
 {
        struct sd *sd = (struct sd *) gspca_dev;
        struct cam *cam;
-       int ret;
 
        sd->mainsFreq = FREQ_DEF == V4L2_CID_POWER_LINE_FREQUENCY_60HZ;
        reset_camera_params(gspca_dev);
@@ -1436,10 +1435,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
        cam->cam_mode = mode;
        cam->nmodes = ARRAY_SIZE(mode);
 
-       ret = goto_low_power(gspca_dev);
-       if (ret)
-               gspca_err(gspca_dev, "Cannot go to low power mode: %d\n",
-                         ret);
+       goto_low_power(gspca_dev);
        /* Check the firmware version. */
        sd->params.version.firmwareVersion = 0;
        get_version_information(gspca_dev);
index bfa3b38..bf1af6e 100644 (file)
@@ -195,7 +195,7 @@ static const struct v4l2_ctrl_config mt9m111_greenbal_cfg = {
 int mt9m111_probe(struct sd *sd)
 {
        u8 data[2] = {0x00, 0x00};
-       int i, rc = 0;
+       int i, err;
        struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
 
        if (force_sensor) {
@@ -213,18 +213,18 @@ int mt9m111_probe(struct sd *sd)
        /* Do the preinit */
        for (i = 0; i < ARRAY_SIZE(preinit_mt9m111); i++) {
                if (preinit_mt9m111[i][0] == BRIDGE) {
-                       rc |= m5602_write_bridge(sd,
-                               preinit_mt9m111[i][1],
-                               preinit_mt9m111[i][2]);
+                       err = m5602_write_bridge(sd,
+                                       preinit_mt9m111[i][1],
+                                       preinit_mt9m111[i][2]);
                } else {
                        data[0] = preinit_mt9m111[i][2];
                        data[1] = preinit_mt9m111[i][3];
-                       rc |= m5602_write_sensor(sd,
-                               preinit_mt9m111[i][1], data, 2);
+                       err = m5602_write_sensor(sd,
+                                       preinit_mt9m111[i][1], data, 2);
                }
+               if (err < 0)
+                       return err;
        }
-       if (rc < 0)
-               return rc;
 
        if (m5602_read_sensor(sd, MT9M111_SC_CHIPVER, data, 2))
                return -ENODEV;
index d680b77..8fd99ce 100644 (file)
@@ -154,8 +154,8 @@ static const struct v4l2_ctrl_config po1030_greenbal_cfg = {
 
 int po1030_probe(struct sd *sd)
 {
-       int rc = 0;
        u8 dev_id_h = 0, i;
+       int err;
        struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
 
        if (force_sensor) {
@@ -174,14 +174,14 @@ int po1030_probe(struct sd *sd)
        for (i = 0; i < ARRAY_SIZE(preinit_po1030); i++) {
                u8 data = preinit_po1030[i][2];
                if (preinit_po1030[i][0] == SENSOR)
-                       rc |= m5602_write_sensor(sd,
-                               preinit_po1030[i][1], &data, 1);
+                       err = m5602_write_sensor(sd, preinit_po1030[i][1],
+                                                &data, 1);
                else
-                       rc |= m5602_write_bridge(sd, preinit_po1030[i][1],
-                                               data);
+                       err = m5602_write_bridge(sd, preinit_po1030[i][1],
+                                                data);
+               if (err < 0)
+                       return err;
        }
-       if (rc < 0)
-               return rc;
 
        if (m5602_read_sensor(sd, PO1030_DEVID_H, &dev_id_h, 1))
                return -ENODEV;
index 926408b..7a6f01a 100644 (file)
@@ -763,7 +763,8 @@ static int at24_probe(struct i2c_client *client)
        at24->nvmem = devm_nvmem_register(dev, &nvmem_config);
        if (IS_ERR(at24->nvmem)) {
                pm_runtime_disable(dev);
-               regulator_disable(at24->vcc_reg);
+               if (!pm_runtime_status_suspended(dev))
+                       regulator_disable(at24->vcc_reg);
                return PTR_ERR(at24->nvmem);
        }
 
@@ -774,7 +775,8 @@ static int at24_probe(struct i2c_client *client)
        err = at24_read(at24, 0, &test_byte, 1);
        if (err) {
                pm_runtime_disable(dev);
-               regulator_disable(at24->vcc_reg);
+               if (!pm_runtime_status_suspended(dev))
+                       regulator_disable(at24->vcc_reg);
                return -ENODEV;
        }
 
index ff8791a..af3c497 100644 (file)
@@ -2017,7 +2017,7 @@ wait_again:
                if (completion_value >= target_value) {
                        *status = CS_WAIT_STATUS_COMPLETED;
                } else {
-                       timeout -= jiffies_to_usecs(completion_rc);
+                       timeout = completion_rc;
                        goto wait_again;
                }
        } else {
index 832dd5c..0713b2c 100644 (file)
@@ -362,12 +362,9 @@ static int fw_read_errors(struct hl_device *hdev, u32 boot_err0_reg,
        }
 
        if (err_val & CPU_BOOT_ERR0_SECURITY_NOT_RDY) {
-               dev_warn(hdev->dev,
+               dev_err(hdev->dev,
                        "Device boot warning - security not ready\n");
-               /* This is a warning so we don't want it to disable the
-                * device
-                */
-               err_val &= ~CPU_BOOT_ERR0_SECURITY_NOT_RDY;
+               err_exists = true;
        }
 
        if (err_val & CPU_BOOT_ERR0_SECURITY_FAIL) {
@@ -403,7 +400,8 @@ static int fw_read_errors(struct hl_device *hdev, u32 boot_err0_reg,
                err_exists = true;
        }
 
-       if (err_exists)
+       if (err_exists && ((err_val & ~CPU_BOOT_ERR0_ENABLED) &
+                               lower_32_bits(hdev->boot_error_status_mask)))
                return -EIO;
 
        return 0;
@@ -661,18 +659,13 @@ int hl_fw_cpucp_total_energy_get(struct hl_device *hdev, u64 *total_energy)
        return rc;
 }
 
-int get_used_pll_index(struct hl_device *hdev, enum pll_index input_pll_index,
+int get_used_pll_index(struct hl_device *hdev, u32 input_pll_index,
                                                enum pll_index *pll_index)
 {
        struct asic_fixed_properties *prop = &hdev->asic_prop;
        u8 pll_byte, pll_bit_off;
        bool dynamic_pll;
-
-       if (input_pll_index >= PLL_MAX) {
-               dev_err(hdev->dev, "PLL index %d is out of range\n",
-                                                       input_pll_index);
-               return -EINVAL;
-       }
+       int fw_pll_idx;
 
        dynamic_pll = prop->fw_security_status_valid &&
                (prop->fw_app_security_map & CPU_BOOT_DEV_STS0_DYN_PLL_EN);
@@ -680,28 +673,39 @@ int get_used_pll_index(struct hl_device *hdev, enum pll_index input_pll_index,
        if (!dynamic_pll) {
                /*
                 * in case we are working with legacy FW (each asic has unique
-                * PLL numbering) extract the legacy numbering
+                * PLL numbering) use the driver based index as they are
+                * aligned with fw legacy numbering
                 */
-               *pll_index = hdev->legacy_pll_map[input_pll_index];
+               *pll_index = input_pll_index;
                return 0;
        }
 
+       /* retrieve a FW compatible PLL index based on
+        * ASIC specific user request
+        */
+       fw_pll_idx = hdev->asic_funcs->map_pll_idx_to_fw_idx(input_pll_index);
+       if (fw_pll_idx < 0) {
+               dev_err(hdev->dev, "Invalid PLL index (%u) error %d\n",
+                       input_pll_index, fw_pll_idx);
+               return -EINVAL;
+       }
+
        /* PLL map is a u8 array */
-       pll_byte = prop->cpucp_info.pll_map[input_pll_index >> 3];
-       pll_bit_off = input_pll_index & 0x7;
+       pll_byte = prop->cpucp_info.pll_map[fw_pll_idx >> 3];
+       pll_bit_off = fw_pll_idx & 0x7;
 
        if (!(pll_byte & BIT(pll_bit_off))) {
                dev_err(hdev->dev, "PLL index %d is not supported\n",
-                                                       input_pll_index);
+                       fw_pll_idx);
                return -EINVAL;
        }
 
-       *pll_index = input_pll_index;
+       *pll_index = fw_pll_idx;
 
        return 0;
 }
 
-int hl_fw_cpucp_pll_info_get(struct hl_device *hdev, enum pll_index pll_index,
+int hl_fw_cpucp_pll_info_get(struct hl_device *hdev, u32 pll_index,
                u16 *pll_freq_arr)
 {
        struct cpucp_packet pkt;
@@ -844,8 +848,13 @@ int hl_fw_read_preboot_status(struct hl_device *hdev, u32 cpu_boot_status_reg,
        if (rc) {
                dev_err(hdev->dev, "Failed to read preboot version\n");
                detect_cpu_boot_status(hdev, status);
-               fw_read_errors(hdev, boot_err0_reg,
-                               cpu_security_boot_status_reg);
+
+               /* If we read all FF, then something is totally wrong, no point
+                * of reading specific errors
+                */
+               if (status != -1)
+                       fw_read_errors(hdev, boot_err0_reg,
+                                       cpu_security_boot_status_reg);
                return -EIO;
        }
 
index 44e89da..6579f87 100644 (file)
@@ -930,6 +930,9 @@ enum div_select_defs {
  *                         driver is ready to receive asynchronous events. This
  *                         function should be called during the first init and
  *                         after every hard-reset of the device
+ * @get_msi_info: Retrieve asic-specific MSI ID of the f/w async event
+ * @map_pll_idx_to_fw_idx: convert driver specific per asic PLL index to
+ *                         generic f/w compatible PLL Indexes
  */
 struct hl_asic_funcs {
        int (*early_init)(struct hl_device *hdev);
@@ -1054,6 +1057,7 @@ struct hl_asic_funcs {
                        u32 block_id, u32 block_size);
        void (*enable_events_from_fw)(struct hl_device *hdev);
        void (*get_msi_info)(u32 *table);
+       int (*map_pll_idx_to_fw_idx)(u32 pll_idx);
 };
 
 
@@ -1950,8 +1954,6 @@ struct hl_mmu_funcs {
  * @aggregated_cs_counters: aggregated cs counters among all contexts
  * @mmu_priv: device-specific MMU data.
  * @mmu_func: device-related MMU functions.
- * @legacy_pll_map: map holding map between dynamic (common) PLL indexes and
- *                  static (asic specific) PLL indexes.
  * @dram_used_mem: current DRAM memory consumption.
  * @timeout_jiffies: device CS timeout value.
  * @max_power: the max power of the device, as configured by the sysadmin. This
@@ -1960,6 +1962,12 @@ struct hl_mmu_funcs {
  * @clock_gating_mask: is clock gating enabled. bitmask that represents the
  *                     different engines. See debugfs-driver-habanalabs for
  *                     details.
+ * @boot_error_status_mask: contains a mask of the device boot error status.
+ *                          Each bit represents a different error, according to
+ *                          the defines in hl_boot_if.h. If the bit is cleared,
+ *                          the error will be ignored by the driver during
+ *                          device initialization. Mainly used to debug and
+ *                          workaround firmware bugs
  * @in_reset: is device in reset flow.
  * @curr_pll_profile: current PLL profile.
  * @card_type: Various ASICs have several card types. This indicates the card
@@ -2071,12 +2079,11 @@ struct hl_device {
        struct hl_mmu_priv              mmu_priv;
        struct hl_mmu_funcs             mmu_func[MMU_NUM_PGT_LOCATIONS];
 
-       enum pll_index                  *legacy_pll_map;
-
        atomic64_t                      dram_used_mem;
        u64                             timeout_jiffies;
        u64                             max_power;
        u64                             clock_gating_mask;
+       u64                             boot_error_status_mask;
        atomic_t                        in_reset;
        enum hl_pll_frequency           curr_pll_profile;
        enum cpucp_card_types           card_type;
@@ -2387,9 +2394,9 @@ int hl_fw_cpucp_pci_counters_get(struct hl_device *hdev,
                struct hl_info_pci_counters *counters);
 int hl_fw_cpucp_total_energy_get(struct hl_device *hdev,
                        u64 *total_energy);
-int get_used_pll_index(struct hl_device *hdev, enum pll_index input_pll_index,
+int get_used_pll_index(struct hl_device *hdev, u32 input_pll_index,
                                                enum pll_index *pll_index);
-int hl_fw_cpucp_pll_info_get(struct hl_device *hdev, enum pll_index pll_index,
+int hl_fw_cpucp_pll_info_get(struct hl_device *hdev, u32 pll_index,
                u16 *pll_freq_arr);
 int hl_fw_cpucp_power_get(struct hl_device *hdev, u64 *power);
 int hl_fw_init_cpu(struct hl_device *hdev, u32 cpu_boot_status_reg,
@@ -2411,9 +2418,9 @@ int hl_pci_set_outbound_region(struct hl_device *hdev,
 int hl_pci_init(struct hl_device *hdev);
 void hl_pci_fini(struct hl_device *hdev);
 
-long hl_get_frequency(struct hl_device *hdev, enum pll_index pll_index,
+long hl_get_frequency(struct hl_device *hdev, u32 pll_index,
                                                                bool curr);
-void hl_set_frequency(struct hl_device *hdev, enum pll_index pll_index,
+void hl_set_frequency(struct hl_device *hdev, u32 pll_index,
                                                                u64 freq);
 int hl_get_temperature(struct hl_device *hdev,
                       int sensor_index, u32 attr, long *value);
index 7135f1e..64d1530 100644 (file)
@@ -30,6 +30,7 @@ static DEFINE_MUTEX(hl_devs_idr_lock);
 static int timeout_locked = 30;
 static int reset_on_lockup = 1;
 static int memory_scrub = 1;
+static ulong boot_error_status_mask = ULONG_MAX;
 
 module_param(timeout_locked, int, 0444);
 MODULE_PARM_DESC(timeout_locked,
@@ -43,6 +44,10 @@ module_param(memory_scrub, int, 0444);
 MODULE_PARM_DESC(memory_scrub,
        "Scrub device memory in various states (0 = no, 1 = yes, default yes)");
 
+module_param(boot_error_status_mask, ulong, 0444);
+MODULE_PARM_DESC(boot_error_status_mask,
+       "Mask of the error status during device CPU boot (If bitX is cleared then error X is masked. Default all 1's)");
+
 #define PCI_VENDOR_ID_HABANALABS       0x1da3
 
 #define PCI_IDS_GOYA                   0x0001
@@ -319,6 +324,8 @@ int create_hdev(struct hl_device **dev, struct pci_dev *pdev,
        hdev->major = hl_major;
        hdev->reset_on_lockup = reset_on_lockup;
        hdev->memory_scrub = memory_scrub;
+       hdev->boot_error_status_mask = boot_error_status_mask;
+
        hdev->pldm = 0;
 
        set_driver_behavior_per_device(hdev);
index 9fa6157..c9f649b 100644 (file)
@@ -9,7 +9,7 @@
 
 #include <linux/pci.h>
 
-long hl_get_frequency(struct hl_device *hdev, enum pll_index pll_index,
+long hl_get_frequency(struct hl_device *hdev, u32 pll_index,
                                                                bool curr)
 {
        struct cpucp_packet pkt;
@@ -44,7 +44,7 @@ long hl_get_frequency(struct hl_device *hdev, enum pll_index pll_index,
        return (long) result;
 }
 
-void hl_set_frequency(struct hl_device *hdev, enum pll_index pll_index,
+void hl_set_frequency(struct hl_device *hdev, u32 pll_index,
                                                                u64 freq)
 {
        struct cpucp_packet pkt;
index b751652..9e4a6bb 100644 (file)
 
 #define GAUDI_PLL_MAX 10
 
-/*
- * this enum kept here for compatibility with old FW (in which each asic has
- * unique PLL numbering
- */
-enum gaudi_pll_index {
-       GAUDI_CPU_PLL = 0,
-       GAUDI_PCI_PLL,
-       GAUDI_SRAM_PLL,
-       GAUDI_HBM_PLL,
-       GAUDI_NIC_PLL,
-       GAUDI_DMA_PLL,
-       GAUDI_MESH_PLL,
-       GAUDI_MME_PLL,
-       GAUDI_TPC_PLL,
-       GAUDI_IF_PLL,
-};
-
-static enum pll_index gaudi_pll_map[PLL_MAX] = {
-       [CPU_PLL] = GAUDI_CPU_PLL,
-       [PCI_PLL] = GAUDI_PCI_PLL,
-       [SRAM_PLL] = GAUDI_SRAM_PLL,
-       [HBM_PLL] = GAUDI_HBM_PLL,
-       [NIC_PLL] = GAUDI_NIC_PLL,
-       [DMA_PLL] = GAUDI_DMA_PLL,
-       [MESH_PLL] = GAUDI_MESH_PLL,
-       [MME_PLL] = GAUDI_MME_PLL,
-       [TPC_PLL] = GAUDI_TPC_PLL,
-       [IF_PLL] = GAUDI_IF_PLL,
-};
-
 static const char gaudi_irq_name[GAUDI_MSI_ENTRIES][GAUDI_MAX_STRING_LEN] = {
                "gaudi cq 0_0", "gaudi cq 0_1", "gaudi cq 0_2", "gaudi cq 0_3",
                "gaudi cq 1_0", "gaudi cq 1_1", "gaudi cq 1_2", "gaudi cq 1_3",
@@ -810,7 +780,7 @@ static int gaudi_fetch_psoc_frequency(struct hl_device *hdev)
                        freq = 0;
                }
        } else {
-               rc = hl_fw_cpucp_pll_info_get(hdev, CPU_PLL, pll_freq_arr);
+               rc = hl_fw_cpucp_pll_info_get(hdev, HL_GAUDI_CPU_PLL, pll_freq_arr);
 
                if (rc)
                        return rc;
@@ -1652,9 +1622,6 @@ static int gaudi_sw_init(struct hl_device *hdev)
 
        hdev->asic_specific = gaudi;
 
-       /* store legacy PLL map */
-       hdev->legacy_pll_map = gaudi_pll_map;
-
        /* Create DMA pool for small allocations */
        hdev->dma_pool = dma_pool_create(dev_name(hdev->dev),
                        &hdev->pdev->dev, GAUDI_DMA_POOL_BLK_SIZE, 8, 0);
@@ -5612,6 +5579,7 @@ static int gaudi_memset_device_memory(struct hl_device *hdev, u64 addr,
        struct hl_cs_job *job;
        u32 cb_size, ctl, err_cause;
        struct hl_cb *cb;
+       u64 id;
        int rc;
 
        cb = hl_cb_kernel_create(hdev, PAGE_SIZE, false);
@@ -5678,8 +5646,9 @@ static int gaudi_memset_device_memory(struct hl_device *hdev, u64 addr,
        }
 
 release_cb:
+       id = cb->id;
        hl_cb_put(cb);
-       hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, cb->id << PAGE_SHIFT);
+       hl_cb_destroy(hdev, &hdev->kernel_cb_mgr, id << PAGE_SHIFT);
 
        return rc;
 }
@@ -8783,6 +8752,23 @@ static void gaudi_enable_events_from_fw(struct hl_device *hdev)
        WREG32(mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR, GAUDI_EVENT_INTS_REGISTER);
 }
 
+static int gaudi_map_pll_idx_to_fw_idx(u32 pll_idx)
+{
+       switch (pll_idx) {
+       case HL_GAUDI_CPU_PLL: return CPU_PLL;
+       case HL_GAUDI_PCI_PLL: return PCI_PLL;
+       case HL_GAUDI_NIC_PLL: return NIC_PLL;
+       case HL_GAUDI_DMA_PLL: return DMA_PLL;
+       case HL_GAUDI_MESH_PLL: return MESH_PLL;
+       case HL_GAUDI_MME_PLL: return MME_PLL;
+       case HL_GAUDI_TPC_PLL: return TPC_PLL;
+       case HL_GAUDI_IF_PLL: return IF_PLL;
+       case HL_GAUDI_SRAM_PLL: return SRAM_PLL;
+       case HL_GAUDI_HBM_PLL: return HBM_PLL;
+       default: return -EINVAL;
+       }
+}
+
 static const struct hl_asic_funcs gaudi_funcs = {
        .early_init = gaudi_early_init,
        .early_fini = gaudi_early_fini,
@@ -8866,7 +8852,8 @@ static const struct hl_asic_funcs gaudi_funcs = {
        .ack_protection_bits_errors = gaudi_ack_protection_bits_errors,
        .get_hw_block_id = gaudi_get_hw_block_id,
        .hw_block_mmap = gaudi_block_mmap,
-       .enable_events_from_fw = gaudi_enable_events_from_fw
+       .enable_events_from_fw = gaudi_enable_events_from_fw,
+       .map_pll_idx_to_fw_idx = gaudi_map_pll_idx_to_fw_idx
 };
 
 /**
index 8c49da4..9b60ead 100644 (file)
@@ -13,7 +13,7 @@ void gaudi_set_pll_profile(struct hl_device *hdev, enum hl_pll_frequency freq)
        struct gaudi_device *gaudi = hdev->asic_specific;
 
        if (freq == PLL_LAST)
-               hl_set_frequency(hdev, MME_PLL, gaudi->max_freq_value);
+               hl_set_frequency(hdev, HL_GAUDI_MME_PLL, gaudi->max_freq_value);
 }
 
 int gaudi_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk)
@@ -23,7 +23,7 @@ int gaudi_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk)
        if (!hl_device_operational(hdev, NULL))
                return -ENODEV;
 
-       value = hl_get_frequency(hdev, MME_PLL, false);
+       value = hl_get_frequency(hdev, HL_GAUDI_MME_PLL, false);
 
        if (value < 0) {
                dev_err(hdev->dev, "Failed to retrieve device max clock %ld\n",
@@ -33,7 +33,7 @@ int gaudi_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk)
 
        *max_clk = (value / 1000 / 1000);
 
-       value = hl_get_frequency(hdev, MME_PLL, true);
+       value = hl_get_frequency(hdev, HL_GAUDI_MME_PLL, true);
 
        if (value < 0) {
                dev_err(hdev->dev,
@@ -57,7 +57,7 @@ static ssize_t clk_max_freq_mhz_show(struct device *dev,
        if (!hl_device_operational(hdev, NULL))
                return -ENODEV;
 
-       value = hl_get_frequency(hdev, MME_PLL, false);
+       value = hl_get_frequency(hdev, HL_GAUDI_MME_PLL, false);
 
        gaudi->max_freq_value = value;
 
@@ -85,7 +85,7 @@ static ssize_t clk_max_freq_mhz_store(struct device *dev,
 
        gaudi->max_freq_value = value * 1000 * 1000;
 
-       hl_set_frequency(hdev, MME_PLL, gaudi->max_freq_value);
+       hl_set_frequency(hdev, HL_GAUDI_MME_PLL, gaudi->max_freq_value);
 
 fail:
        return count;
@@ -100,7 +100,7 @@ static ssize_t clk_cur_freq_mhz_show(struct device *dev,
        if (!hl_device_operational(hdev, NULL))
                return -ENODEV;
 
-       value = hl_get_frequency(hdev, MME_PLL, true);
+       value = hl_get_frequency(hdev, HL_GAUDI_MME_PLL, true);
 
        return sprintf(buf, "%lu\n", (value / 1000 / 1000));
 }
index e27338f..e0ad2a2 100644 (file)
 #define IS_MME_IDLE(mme_arch_sts) \
        (((mme_arch_sts) & MME_ARCH_IDLE_MASK) == MME_ARCH_IDLE_MASK)
 
-/*
- * this enum kept here for compatibility with old FW (in which each asic has
- * unique PLL numbering
- */
-enum goya_pll_index {
-       GOYA_CPU_PLL = 0,
-       GOYA_IC_PLL,
-       GOYA_MC_PLL,
-       GOYA_MME_PLL,
-       GOYA_PCI_PLL,
-       GOYA_EMMC_PLL,
-       GOYA_TPC_PLL,
-};
-
-static enum pll_index goya_pll_map[PLL_MAX] = {
-       [CPU_PLL] = GOYA_CPU_PLL,
-       [IC_PLL] = GOYA_IC_PLL,
-       [MC_PLL] = GOYA_MC_PLL,
-       [MME_PLL] = GOYA_MME_PLL,
-       [PCI_PLL] = GOYA_PCI_PLL,
-       [EMMC_PLL] = GOYA_EMMC_PLL,
-       [TPC_PLL] = GOYA_TPC_PLL,
-};
-
 static const char goya_irq_name[GOYA_MSIX_ENTRIES][GOYA_MAX_STRING_LEN] = {
                "goya cq 0", "goya cq 1", "goya cq 2", "goya cq 3",
                "goya cq 4", "goya cpu eq"
@@ -775,7 +751,8 @@ static void goya_fetch_psoc_frequency(struct hl_device *hdev)
                        freq = 0;
                }
        } else {
-               rc = hl_fw_cpucp_pll_info_get(hdev, PCI_PLL, pll_freq_arr);
+               rc = hl_fw_cpucp_pll_info_get(hdev, HL_GOYA_PCI_PLL,
+                               pll_freq_arr);
 
                if (rc)
                        return;
@@ -897,9 +874,6 @@ static int goya_sw_init(struct hl_device *hdev)
 
        hdev->asic_specific = goya;
 
-       /* store legacy PLL map */
-       hdev->legacy_pll_map = goya_pll_map;
-
        /* Create DMA pool for small allocations */
        hdev->dma_pool = dma_pool_create(dev_name(hdev->dev),
                        &hdev->pdev->dev, GOYA_DMA_POOL_BLK_SIZE, 8, 0);
@@ -5512,6 +5486,20 @@ static void goya_enable_events_from_fw(struct hl_device *hdev)
                        GOYA_ASYNC_EVENT_ID_INTS_REGISTER);
 }
 
+static int goya_map_pll_idx_to_fw_idx(u32 pll_idx)
+{
+       switch (pll_idx) {
+       case HL_GOYA_CPU_PLL: return CPU_PLL;
+       case HL_GOYA_PCI_PLL: return PCI_PLL;
+       case HL_GOYA_MME_PLL: return MME_PLL;
+       case HL_GOYA_TPC_PLL: return TPC_PLL;
+       case HL_GOYA_IC_PLL: return IC_PLL;
+       case HL_GOYA_MC_PLL: return MC_PLL;
+       case HL_GOYA_EMMC_PLL: return EMMC_PLL;
+       default: return -EINVAL;
+       }
+}
+
 static const struct hl_asic_funcs goya_funcs = {
        .early_init = goya_early_init,
        .early_fini = goya_early_fini,
@@ -5595,7 +5583,8 @@ static const struct hl_asic_funcs goya_funcs = {
        .ack_protection_bits_errors = goya_ack_protection_bits_errors,
        .get_hw_block_id = goya_get_hw_block_id,
        .hw_block_mmap = goya_block_mmap,
-       .enable_events_from_fw = goya_enable_events_from_fw
+       .enable_events_from_fw = goya_enable_events_from_fw,
+       .map_pll_idx_to_fw_idx = goya_map_pll_idx_to_fw_idx
 };
 
 /*
index 3acb36a..7d00712 100644 (file)
@@ -13,19 +13,19 @@ void goya_set_pll_profile(struct hl_device *hdev, enum hl_pll_frequency freq)
 
        switch (freq) {
        case PLL_HIGH:
-               hl_set_frequency(hdev, MME_PLL, hdev->high_pll);
-               hl_set_frequency(hdev, TPC_PLL, hdev->high_pll);
-               hl_set_frequency(hdev, IC_PLL, hdev->high_pll);
+               hl_set_frequency(hdev, HL_GOYA_MME_PLL, hdev->high_pll);
+               hl_set_frequency(hdev, HL_GOYA_TPC_PLL, hdev->high_pll);
+               hl_set_frequency(hdev, HL_GOYA_IC_PLL, hdev->high_pll);
                break;
        case PLL_LOW:
-               hl_set_frequency(hdev, MME_PLL, GOYA_PLL_FREQ_LOW);
-               hl_set_frequency(hdev, TPC_PLL, GOYA_PLL_FREQ_LOW);
-               hl_set_frequency(hdev, IC_PLL, GOYA_PLL_FREQ_LOW);
+               hl_set_frequency(hdev, HL_GOYA_MME_PLL, GOYA_PLL_FREQ_LOW);
+               hl_set_frequency(hdev, HL_GOYA_TPC_PLL, GOYA_PLL_FREQ_LOW);
+               hl_set_frequency(hdev, HL_GOYA_IC_PLL, GOYA_PLL_FREQ_LOW);
                break;
        case PLL_LAST:
-               hl_set_frequency(hdev, MME_PLL, goya->mme_clk);
-               hl_set_frequency(hdev, TPC_PLL, goya->tpc_clk);
-               hl_set_frequency(hdev, IC_PLL, goya->ic_clk);
+               hl_set_frequency(hdev, HL_GOYA_MME_PLL, goya->mme_clk);
+               hl_set_frequency(hdev, HL_GOYA_TPC_PLL, goya->tpc_clk);
+               hl_set_frequency(hdev, HL_GOYA_IC_PLL, goya->ic_clk);
                break;
        default:
                dev_err(hdev->dev, "unknown frequency setting\n");
@@ -39,7 +39,7 @@ int goya_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk)
        if (!hl_device_operational(hdev, NULL))
                return -ENODEV;
 
-       value = hl_get_frequency(hdev, MME_PLL, false);
+       value = hl_get_frequency(hdev, HL_GOYA_MME_PLL, false);
 
        if (value < 0) {
                dev_err(hdev->dev, "Failed to retrieve device max clock %ld\n",
@@ -49,7 +49,7 @@ int goya_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk)
 
        *max_clk = (value / 1000 / 1000);
 
-       value = hl_get_frequency(hdev, MME_PLL, true);
+       value = hl_get_frequency(hdev, HL_GOYA_MME_PLL, true);
 
        if (value < 0) {
                dev_err(hdev->dev,
@@ -72,7 +72,7 @@ static ssize_t mme_clk_show(struct device *dev, struct device_attribute *attr,
        if (!hl_device_operational(hdev, NULL))
                return -ENODEV;
 
-       value = hl_get_frequency(hdev, MME_PLL, false);
+       value = hl_get_frequency(hdev, HL_GOYA_MME_PLL, false);
 
        if (value < 0)
                return value;
@@ -105,7 +105,7 @@ static ssize_t mme_clk_store(struct device *dev, struct device_attribute *attr,
                goto fail;
        }
 
-       hl_set_frequency(hdev, MME_PLL, value);
+       hl_set_frequency(hdev, HL_GOYA_MME_PLL, value);
        goya->mme_clk = value;
 
 fail:
@@ -121,7 +121,7 @@ static ssize_t tpc_clk_show(struct device *dev, struct device_attribute *attr,
        if (!hl_device_operational(hdev, NULL))
                return -ENODEV;
 
-       value = hl_get_frequency(hdev, TPC_PLL, false);
+       value = hl_get_frequency(hdev, HL_GOYA_TPC_PLL, false);
 
        if (value < 0)
                return value;
@@ -154,7 +154,7 @@ static ssize_t tpc_clk_store(struct device *dev, struct device_attribute *attr,
                goto fail;
        }
 
-       hl_set_frequency(hdev, TPC_PLL, value);
+       hl_set_frequency(hdev, HL_GOYA_TPC_PLL, value);
        goya->tpc_clk = value;
 
 fail:
@@ -170,7 +170,7 @@ static ssize_t ic_clk_show(struct device *dev, struct device_attribute *attr,
        if (!hl_device_operational(hdev, NULL))
                return -ENODEV;
 
-       value = hl_get_frequency(hdev, IC_PLL, false);
+       value = hl_get_frequency(hdev, HL_GOYA_IC_PLL, false);
 
        if (value < 0)
                return value;
@@ -203,7 +203,7 @@ static ssize_t ic_clk_store(struct device *dev, struct device_attribute *attr,
                goto fail;
        }
 
-       hl_set_frequency(hdev, IC_PLL, value);
+       hl_set_frequency(hdev, HL_GOYA_IC_PLL, value);
        goya->ic_clk = value;
 
 fail:
@@ -219,7 +219,7 @@ static ssize_t mme_clk_curr_show(struct device *dev,
        if (!hl_device_operational(hdev, NULL))
                return -ENODEV;
 
-       value = hl_get_frequency(hdev, MME_PLL, true);
+       value = hl_get_frequency(hdev, HL_GOYA_MME_PLL, true);
 
        if (value < 0)
                return value;
@@ -236,7 +236,7 @@ static ssize_t tpc_clk_curr_show(struct device *dev,
        if (!hl_device_operational(hdev, NULL))
                return -ENODEV;
 
-       value = hl_get_frequency(hdev, TPC_PLL, true);
+       value = hl_get_frequency(hdev, HL_GOYA_TPC_PLL, true);
 
        if (value < 0)
                return value;
@@ -253,7 +253,7 @@ static ssize_t ic_clk_curr_show(struct device *dev,
        if (!hl_device_operational(hdev, NULL))
                return -ENODEV;
 
-       value = hl_get_frequency(hdev, IC_PLL, true);
+       value = hl_get_frequency(hdev, HL_GOYA_IC_PLL, true);
 
        if (value < 0)
                return value;
index 2bdf560..0f9ea75 100644 (file)
@@ -134,7 +134,7 @@ static struct ics932s401_data *ics932s401_update_device(struct device *dev)
        for (i = 0; i < NUM_MIRRORED_REGS; i++) {
                temp = i2c_smbus_read_word_data(client, regs_to_copy[i]);
                if (temp < 0)
-                       data->regs[regs_to_copy[i]] = 0;
+                       temp = 0;
                data->regs[regs_to_copy[i]] = temp >> 8;
        }
 
index c394c0b..7ac788f 100644 (file)
@@ -271,6 +271,7 @@ struct lis3lv02d {
        int                     regs_size;
        u8                      *reg_cache;
        bool                    regs_stored;
+       bool                    init_required;
        u8                      odr_mask;  /* ODR bit mask */
        u8                      whoami;    /* indicates measurement precision */
        s16 (*read_data) (struct lis3lv02d *lis3, int reg);
index b8b771b..016a610 100644 (file)
@@ -236,7 +236,8 @@ static void meson_mmc_get_transfer_mode(struct mmc_host *mmc,
        if (host->dram_access_quirk)
                return;
 
-       if (data->blocks > 1) {
+       /* SD_IO_RW_EXTENDED (CMD53) can also use block mode under the hood */
+       if (data->blocks > 1 || mrq->cmd->opcode == SD_IO_RW_EXTENDED) {
                /*
                 * In block mode DMA descriptor format, "length" field indicates
                 * number of blocks and there is no way to pass DMA size that
@@ -258,7 +259,9 @@ static void meson_mmc_get_transfer_mode(struct mmc_host *mmc,
        for_each_sg(data->sg, sg, data->sg_len, i) {
                /* check for 8 byte alignment */
                if (sg->offset % 8) {
-                       WARN_ONCE(1, "unaligned scatterlist buffer\n");
+                       dev_warn_once(mmc_dev(mmc),
+                                     "unaligned sg offset %u, disabling descriptor DMA for transfer\n",
+                                     sg->offset);
                        return;
                }
        }
index 592d790..061618a 100644 (file)
@@ -627,8 +627,13 @@ static void sdhci_gli_voltage_switch(struct sdhci_host *host)
         *
         * Wait 5ms after set 1.8V signal enable in Host Control 2 register
         * to ensure 1.8V signal enable bit is set by GL9750/GL9755.
+        *
+        * ...however, the controller in the NUC10i3FNK4 (a 9755) requires
+        * slightly longer than 5ms before the control register reports that
+        * 1.8V is ready, and far longer still before the card will actually
+        * work reliably.
         */
-       usleep_range(5000, 5500);
+       usleep_range(100000, 110000);
 }
 
 static void sdhci_gl9750_reset(struct sdhci_host *host, u8 mask)
index da6fffb..d174823 100644 (file)
@@ -269,9 +269,6 @@ static netdev_tx_t caif_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct ser_device *ser;
 
-       if (WARN_ON(!dev))
-               return -EINVAL;
-
        ser = netdev_priv(dev);
 
        /* Send flow off once, on high water mark */
index 7c5af4b..591229b 100644 (file)
@@ -1153,7 +1153,7 @@ static void octeon_destroy_resources(struct octeon_device *oct)
  * @lio: per-network private data
  * @start_stop: whether to start or stop
  */
-static void send_rx_ctrl_cmd(struct lio *lio, int start_stop)
+static int send_rx_ctrl_cmd(struct lio *lio, int start_stop)
 {
        struct octeon_soft_command *sc;
        union octnet_cmd *ncmd;
@@ -1161,15 +1161,15 @@ static void send_rx_ctrl_cmd(struct lio *lio, int start_stop)
        int retval;
 
        if (oct->props[lio->ifidx].rx_on == start_stop)
-               return;
+               return 0;
 
        sc = (struct octeon_soft_command *)
                octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE,
                                          16, 0);
        if (!sc) {
                netif_info(lio, rx_err, lio->netdev,
-                          "Failed to allocate octeon_soft_command\n");
-               return;
+                          "Failed to allocate octeon_soft_command struct\n");
+               return -ENOMEM;
        }
 
        ncmd = (union octnet_cmd *)sc->virtdptr;
@@ -1192,18 +1192,19 @@ static void send_rx_ctrl_cmd(struct lio *lio, int start_stop)
        if (retval == IQ_SEND_FAILED) {
                netif_info(lio, rx_err, lio->netdev, "Failed to send RX Control message\n");
                octeon_free_soft_command(oct, sc);
-               return;
        } else {
                /* Sleep on a wait queue till the cond flag indicates that the
                 * response arrived or timed-out.
                 */
                retval = wait_for_sc_completion_timeout(oct, sc, 0);
                if (retval)
-                       return;
+                       return retval;
 
                oct->props[lio->ifidx].rx_on = start_stop;
                WRITE_ONCE(sc->caller_is_done, true);
        }
+
+       return retval;
 }
 
 /**
@@ -1778,6 +1779,7 @@ static int liquidio_open(struct net_device *netdev)
        struct octeon_device_priv *oct_priv =
                (struct octeon_device_priv *)oct->priv;
        struct napi_struct *napi, *n;
+       int ret = 0;
 
        if (oct->props[lio->ifidx].napi_enabled == 0) {
                tasklet_disable(&oct_priv->droq_tasklet);
@@ -1813,7 +1815,9 @@ static int liquidio_open(struct net_device *netdev)
        netif_info(lio, ifup, lio->netdev, "Interface Open, ready for traffic\n");
 
        /* tell Octeon to start forwarding packets to host */
-       send_rx_ctrl_cmd(lio, 1);
+       ret = send_rx_ctrl_cmd(lio, 1);
+       if (ret)
+               return ret;
 
        /* start periodical statistics fetch */
        INIT_DELAYED_WORK(&lio->stats_wk.work, lio_fetch_stats);
@@ -1824,7 +1828,7 @@ static int liquidio_open(struct net_device *netdev)
        dev_info(&oct->pci_dev->dev, "%s interface is opened\n",
                 netdev->name);
 
-       return 0;
+       return ret;
 }
 
 /**
@@ -1838,6 +1842,7 @@ static int liquidio_stop(struct net_device *netdev)
        struct octeon_device_priv *oct_priv =
                (struct octeon_device_priv *)oct->priv;
        struct napi_struct *napi, *n;
+       int ret = 0;
 
        ifstate_reset(lio, LIO_IFSTATE_RUNNING);
 
@@ -1854,7 +1859,9 @@ static int liquidio_stop(struct net_device *netdev)
        lio->link_changes++;
 
        /* Tell Octeon that nic interface is down. */
-       send_rx_ctrl_cmd(lio, 0);
+       ret = send_rx_ctrl_cmd(lio, 0);
+       if (ret)
+               return ret;
 
        if (OCTEON_CN23XX_PF(oct)) {
                if (!oct->msix_on)
@@ -1889,7 +1896,7 @@ static int liquidio_stop(struct net_device *netdev)
 
        dev_info(&oct->pci_dev->dev, "%s interface is stopped\n", netdev->name);
 
-       return 0;
+       return ret;
 }
 
 /**
index 516f166..ffddb31 100644 (file)
@@ -595,7 +595,7 @@ static void octeon_destroy_resources(struct octeon_device *oct)
  * @lio: per-network private data
  * @start_stop: whether to start or stop
  */
-static void send_rx_ctrl_cmd(struct lio *lio, int start_stop)
+static int send_rx_ctrl_cmd(struct lio *lio, int start_stop)
 {
        struct octeon_device *oct = (struct octeon_device *)lio->oct_dev;
        struct octeon_soft_command *sc;
@@ -603,11 +603,16 @@ static void send_rx_ctrl_cmd(struct lio *lio, int start_stop)
        int retval;
 
        if (oct->props[lio->ifidx].rx_on == start_stop)
-               return;
+               return 0;
 
        sc = (struct octeon_soft_command *)
                octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE,
                                          16, 0);
+       if (!sc) {
+               netif_info(lio, rx_err, lio->netdev,
+                          "Failed to allocate octeon_soft_command struct\n");
+               return -ENOMEM;
+       }
 
        ncmd = (union octnet_cmd *)sc->virtdptr;
 
@@ -635,11 +640,13 @@ static void send_rx_ctrl_cmd(struct lio *lio, int start_stop)
                 */
                retval = wait_for_sc_completion_timeout(oct, sc, 0);
                if (retval)
-                       return;
+                       return retval;
 
                oct->props[lio->ifidx].rx_on = start_stop;
                WRITE_ONCE(sc->caller_is_done, true);
        }
+
+       return retval;
 }
 
 /**
@@ -906,6 +913,7 @@ static int liquidio_open(struct net_device *netdev)
        struct octeon_device_priv *oct_priv =
                (struct octeon_device_priv *)oct->priv;
        struct napi_struct *napi, *n;
+       int ret = 0;
 
        if (!oct->props[lio->ifidx].napi_enabled) {
                tasklet_disable(&oct_priv->droq_tasklet);
@@ -932,11 +940,13 @@ static int liquidio_open(struct net_device *netdev)
                                        (LIQUIDIO_NDEV_STATS_POLL_TIME_MS));
 
        /* tell Octeon to start forwarding packets to host */
-       send_rx_ctrl_cmd(lio, 1);
+       ret = send_rx_ctrl_cmd(lio, 1);
+       if (ret)
+               return ret;
 
        dev_info(&oct->pci_dev->dev, "%s interface is opened\n", netdev->name);
 
-       return 0;
+       return ret;
 }
 
 /**
@@ -950,9 +960,12 @@ static int liquidio_stop(struct net_device *netdev)
        struct octeon_device_priv *oct_priv =
                (struct octeon_device_priv *)oct->priv;
        struct napi_struct *napi, *n;
+       int ret = 0;
 
        /* tell Octeon to stop forwarding packets to host */
-       send_rx_ctrl_cmd(lio, 0);
+       ret = send_rx_ctrl_cmd(lio, 0);
+       if (ret)
+               return ret;
 
        netif_info(lio, ifdown, lio->netdev, "Stopping interface!\n");
        /* Inform that netif carrier is down */
@@ -986,7 +999,7 @@ static int liquidio_stop(struct net_device *netdev)
 
        dev_info(&oct->pci_dev->dev, "%s interface is stopped\n", netdev->name);
 
-       return 0;
+       return ret;
 }
 
 /**
index a7b7a4a..b0c0504 100644 (file)
@@ -548,8 +548,8 @@ static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id)
 
     base = ioremap(link->resource[2]->start, resource_size(link->resource[2]));
     if (!base) {
-           pcmcia_release_window(link, link->resource[2]);
-           return -ENOMEM;
+       pcmcia_release_window(link, link->resource[2]);
+       return -1;
     }
 
     pcmcia_map_mem_page(link, link->resource[2], 0);
index d8a3eca..d8f0863 100644 (file)
@@ -1048,7 +1048,7 @@ int qlcnic_do_lb_test(struct qlcnic_adapter *adapter, u8 mode)
        for (i = 0; i < QLCNIC_NUM_ILB_PKT; i++) {
                skb = netdev_alloc_skb(adapter->netdev, QLCNIC_ILB_PKT_SIZE);
                if (!skb)
-                       break;
+                       goto error;
                qlcnic_create_loopback_buff(skb->data, adapter->mac_addr);
                skb_put(skb, QLCNIC_ILB_PKT_SIZE);
                adapter->ahw->diag_cnt = 0;
@@ -1072,6 +1072,7 @@ int qlcnic_do_lb_test(struct qlcnic_adapter *adapter, u8 mode)
                        cnt++;
        }
        if (cnt != i) {
+error:
                dev_err(&adapter->pdev->dev,
                        "LB Test: failed, TX[%d], RX[%d]\n", i, cnt);
                if (mode != QLCNIC_ILB_MODE)
index 527077c..fc3b0ac 100644 (file)
@@ -30,7 +30,7 @@ struct sunxi_priv_data {
 static int sun7i_gmac_init(struct platform_device *pdev, void *priv)
 {
        struct sunxi_priv_data *gmac = priv;
-       int ret;
+       int ret = 0;
 
        if (gmac->regulator) {
                ret = regulator_enable(gmac->regulator);
@@ -51,11 +51,11 @@ static int sun7i_gmac_init(struct platform_device *pdev, void *priv)
        } else {
                clk_set_rate(gmac->tx_clk, SUN7I_GMAC_MII_RATE);
                ret = clk_prepare(gmac->tx_clk);
-               if (ret)
-                       return ret;
+               if (ret && gmac->regulator)
+                       regulator_disable(gmac->regulator);
        }
 
-       return 0;
+       return ret;
 }
 
 static void sun7i_gmac_exit(struct platform_device *pdev, void *priv)
index 707ccdd..74e7486 100644 (file)
@@ -8144,10 +8144,10 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
                                     "VPD_SCAN: Reading in property [%s] len[%d]\n",
                                     namebuf, prop_len);
                        for (i = 0; i < prop_len; i++) {
-                               err = niu_pci_eeprom_read(np, off + i);
-                               if (err >= 0)
-                                       *prop_buf = err;
-                               ++prop_buf;
+                               err =  niu_pci_eeprom_read(np, off + i);
+                               if (err < 0)
+                                       return err;
+                               *prop_buf++ = err;
                        }
                }
 
@@ -8158,14 +8158,14 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
 }
 
 /* ESPC_PIO_EN_ENABLE must be set */
-static void niu_pci_vpd_fetch(struct niu *np, u32 start)
+static int niu_pci_vpd_fetch(struct niu *np, u32 start)
 {
        u32 offset;
        int err;
 
        err = niu_pci_eeprom_read16_swp(np, start + 1);
        if (err < 0)
-               return;
+               return err;
 
        offset = err + 3;
 
@@ -8174,12 +8174,14 @@ static void niu_pci_vpd_fetch(struct niu *np, u32 start)
                u32 end;
 
                err = niu_pci_eeprom_read(np, here);
+               if (err < 0)
+                       return err;
                if (err != 0x90)
-                       return;
+                       return -EINVAL;
 
                err = niu_pci_eeprom_read16_swp(np, here + 1);
                if (err < 0)
-                       return;
+                       return err;
 
                here = start + offset + 3;
                end = start + offset + err;
@@ -8187,9 +8189,12 @@ static void niu_pci_vpd_fetch(struct niu *np, u32 start)
                offset += err;
 
                err = niu_pci_vpd_scan_props(np, here, end);
-               if (err < 0 || err == 1)
-                       return;
+               if (err < 0)
+                       return err;
+               if (err == 1)
+                       return -EINVAL;
        }
+       return 0;
 }
 
 /* ESPC_PIO_EN_ENABLE must be set */
@@ -9280,8 +9285,11 @@ static int niu_get_invariants(struct niu *np)
                offset = niu_pci_vpd_offset(np);
                netif_printk(np, probe, KERN_DEBUG, np->dev,
                             "%s() VPD offset [%08x]\n", __func__, offset);
-               if (offset)
-                       niu_pci_vpd_fetch(np, offset);
+               if (offset) {
+                       err = niu_pci_vpd_fetch(np, offset);
+                       if (err < 0)
+                               return err;
+               }
                nw64(ESPC_PIO_EN, 0);
 
                if (np->flags & NIU_FLAGS_VPD_VALID) {
index 7506cea..433a047 100644 (file)
@@ -1027,14 +1027,17 @@ static ssize_t ath6kl_lrssi_roam_write(struct file *file,
 {
        struct ath6kl *ar = file->private_data;
        unsigned long lrssi_roam_threshold;
+       int ret;
 
        if (kstrtoul_from_user(user_buf, count, 0, &lrssi_roam_threshold))
                return -EINVAL;
 
        ar->lrssi_roam_threshold = lrssi_roam_threshold;
 
-       ath6kl_wmi_set_roam_lrssi_cmd(ar->wmi, ar->lrssi_roam_threshold);
+       ret = ath6kl_wmi_set_roam_lrssi_cmd(ar->wmi, ar->lrssi_roam_threshold);
 
+       if (ret)
+               return ret;
        return count;
 }
 
index ce8c102..633d0ab 100644 (file)
@@ -1217,13 +1217,9 @@ static struct sdio_driver brcmf_sdmmc_driver = {
        },
 };
 
-void brcmf_sdio_register(void)
+int brcmf_sdio_register(void)
 {
-       int ret;
-
-       ret = sdio_register_driver(&brcmf_sdmmc_driver);
-       if (ret)
-               brcmf_err("sdio_register_driver failed: %d\n", ret);
+       return sdio_register_driver(&brcmf_sdmmc_driver);
 }
 
 void brcmf_sdio_exit(void)
index 08f9d47..3f5da3b 100644 (file)
@@ -275,11 +275,26 @@ void brcmf_bus_add_txhdrlen(struct device *dev, uint len);
 
 #ifdef CONFIG_BRCMFMAC_SDIO
 void brcmf_sdio_exit(void);
-void brcmf_sdio_register(void);
+int brcmf_sdio_register(void);
+#else
+static inline void brcmf_sdio_exit(void) { }
+static inline int brcmf_sdio_register(void) { return 0; }
 #endif
+
 #ifdef CONFIG_BRCMFMAC_USB
 void brcmf_usb_exit(void);
-void brcmf_usb_register(void);
+int brcmf_usb_register(void);
+#else
+static inline void brcmf_usb_exit(void) { }
+static inline int brcmf_usb_register(void) { return 0; }
+#endif
+
+#ifdef CONFIG_BRCMFMAC_PCIE
+void brcmf_pcie_exit(void);
+int brcmf_pcie_register(void);
+#else
+static inline void brcmf_pcie_exit(void) { }
+static inline int brcmf_pcie_register(void) { return 0; }
 #endif
 
 #endif /* BRCMFMAC_BUS_H */
index 838b09b..cee1682 100644 (file)
@@ -1518,40 +1518,34 @@ void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state)
        }
 }
 
-static void brcmf_driver_register(struct work_struct *work)
-{
-#ifdef CONFIG_BRCMFMAC_SDIO
-       brcmf_sdio_register();
-#endif
-#ifdef CONFIG_BRCMFMAC_USB
-       brcmf_usb_register();
-#endif
-#ifdef CONFIG_BRCMFMAC_PCIE
-       brcmf_pcie_register();
-#endif
-}
-static DECLARE_WORK(brcmf_driver_work, brcmf_driver_register);
-
 int __init brcmf_core_init(void)
 {
-       if (!schedule_work(&brcmf_driver_work))
-               return -EBUSY;
+       int err;
 
+       err = brcmf_sdio_register();
+       if (err)
+               return err;
+
+       err = brcmf_usb_register();
+       if (err)
+               goto error_usb_register;
+
+       err = brcmf_pcie_register();
+       if (err)
+               goto error_pcie_register;
        return 0;
+
+error_pcie_register:
+       brcmf_usb_exit();
+error_usb_register:
+       brcmf_sdio_exit();
+       return err;
 }
 
 void __exit brcmf_core_exit(void)
 {
-       cancel_work_sync(&brcmf_driver_work);
-
-#ifdef CONFIG_BRCMFMAC_SDIO
        brcmf_sdio_exit();
-#endif
-#ifdef CONFIG_BRCMFMAC_USB
        brcmf_usb_exit();
-#endif
-#ifdef CONFIG_BRCMFMAC_PCIE
        brcmf_pcie_exit();
-#endif
 }
 
index ad79e3b..143a705 100644 (file)
@@ -2140,15 +2140,10 @@ static struct pci_driver brcmf_pciedrvr = {
 };
 
 
-void brcmf_pcie_register(void)
+int brcmf_pcie_register(void)
 {
-       int err;
-
        brcmf_dbg(PCIE, "Enter\n");
-       err = pci_register_driver(&brcmf_pciedrvr);
-       if (err)
-               brcmf_err(NULL, "PCIE driver registration failed, err=%d\n",
-                         err);
+       return pci_register_driver(&brcmf_pciedrvr);
 }
 
 
index d026401..8e6c227 100644 (file)
@@ -11,9 +11,4 @@ struct brcmf_pciedev {
        struct brcmf_pciedev_info *devinfo;
 };
 
-
-void brcmf_pcie_exit(void);
-void brcmf_pcie_register(void);
-
-
 #endif /* BRCMFMAC_PCIE_H */
index 586f4df..9fb68c2 100644 (file)
@@ -1584,12 +1584,8 @@ void brcmf_usb_exit(void)
        usb_deregister(&brcmf_usbdrvr);
 }
 
-void brcmf_usb_register(void)
+int brcmf_usb_register(void)
 {
-       int ret;
-
        brcmf_dbg(USB, "Enter\n");
-       ret = usb_register(&brcmf_usbdrvr);
-       if (ret)
-               brcmf_err("usb_register failed %d\n", ret);
+       return usb_register(&brcmf_usbdrvr);
 }
index f5b7825..c688148 100644 (file)
@@ -801,24 +801,6 @@ static const struct attribute_group mesh_ie_group = {
        .attrs = mesh_ie_attrs,
 };
 
-static void lbs_persist_config_init(struct net_device *dev)
-{
-       int ret;
-       ret = sysfs_create_group(&(dev->dev.kobj), &boot_opts_group);
-       if (ret)
-               pr_err("failed to create boot_opts_group.\n");
-
-       ret = sysfs_create_group(&(dev->dev.kobj), &mesh_ie_group);
-       if (ret)
-               pr_err("failed to create mesh_ie_group.\n");
-}
-
-static void lbs_persist_config_remove(struct net_device *dev)
-{
-       sysfs_remove_group(&(dev->dev.kobj), &boot_opts_group);
-       sysfs_remove_group(&(dev->dev.kobj), &mesh_ie_group);
-}
-
 
 /***************************************************************************
  * Initializing and starting, stopping mesh
@@ -1014,6 +996,10 @@ static int lbs_add_mesh(struct lbs_private *priv)
        SET_NETDEV_DEV(priv->mesh_dev, priv->dev->dev.parent);
 
        mesh_dev->flags |= IFF_BROADCAST | IFF_MULTICAST;
+       mesh_dev->sysfs_groups[0] = &lbs_mesh_attr_group;
+       mesh_dev->sysfs_groups[1] = &boot_opts_group;
+       mesh_dev->sysfs_groups[2] = &mesh_ie_group;
+
        /* Register virtual mesh interface */
        ret = register_netdev(mesh_dev);
        if (ret) {
@@ -1021,19 +1007,10 @@ static int lbs_add_mesh(struct lbs_private *priv)
                goto err_free_netdev;
        }
 
-       ret = sysfs_create_group(&(mesh_dev->dev.kobj), &lbs_mesh_attr_group);
-       if (ret)
-               goto err_unregister;
-
-       lbs_persist_config_init(mesh_dev);
-
        /* Everything successful */
        ret = 0;
        goto done;
 
-err_unregister:
-       unregister_netdev(mesh_dev);
-
 err_free_netdev:
        free_netdev(mesh_dev);
 
@@ -1054,8 +1031,6 @@ void lbs_remove_mesh(struct lbs_private *priv)
 
        netif_stop_queue(mesh_dev);
        netif_carrier_off(mesh_dev);
-       sysfs_remove_group(&(mesh_dev->dev.kobj), &lbs_mesh_attr_group);
-       lbs_persist_config_remove(mesh_dev);
        unregister_netdev(mesh_dev);
        priv->mesh_dev = NULL;
        kfree(mesh_dev->ieee80211_ptr);
index 2a7ee90..ffd150e 100644 (file)
@@ -440,9 +440,14 @@ static void rtl_watchdog_wq_callback(struct work_struct *work);
 static void rtl_fwevt_wq_callback(struct work_struct *work);
 static void rtl_c2hcmd_wq_callback(struct work_struct *work);
 
-static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
+static int _rtl_init_deferred_work(struct ieee80211_hw *hw)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
+       struct workqueue_struct *wq;
+
+       wq = alloc_workqueue("%s", 0, 0, rtlpriv->cfg->name);
+       if (!wq)
+               return -ENOMEM;
 
        /* <1> timer */
        timer_setup(&rtlpriv->works.watchdog_timer,
@@ -451,11 +456,7 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
                    rtl_easy_concurrent_retrytimer_callback, 0);
        /* <2> work queue */
        rtlpriv->works.hw = hw;
-       rtlpriv->works.rtl_wq = alloc_workqueue("%s", 0, 0, rtlpriv->cfg->name);
-       if (unlikely(!rtlpriv->works.rtl_wq)) {
-               pr_err("Failed to allocate work queue\n");
-               return;
-       }
+       rtlpriv->works.rtl_wq = wq;
 
        INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq,
                          rtl_watchdog_wq_callback);
@@ -466,6 +467,7 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
                          rtl_swlps_rfon_wq_callback);
        INIT_DELAYED_WORK(&rtlpriv->works.fwevt_wq, rtl_fwevt_wq_callback);
        INIT_DELAYED_WORK(&rtlpriv->works.c2hcmd_wq, rtl_c2hcmd_wq_callback);
+       return 0;
 }
 
 void rtl_deinit_deferred_work(struct ieee80211_hw *hw, bool ips_wq)
@@ -564,9 +566,7 @@ int rtl_init_core(struct ieee80211_hw *hw)
        rtlmac->link_state = MAC80211_NOLINK;
 
        /* <6> init deferred work */
-       _rtl_init_deferred_work(hw);
-
-       return 0;
+       return _rtl_init_deferred_work(hw);
 }
 EXPORT_SYMBOL_GPL(rtl_init_core);
 
index 522c9b2..762125f 100644 (file)
@@ -2901,7 +2901,7 @@ static int nvme_init_identify(struct nvme_ctrl *ctrl)
                ctrl->hmmaxd = le16_to_cpu(id->hmmaxd);
        }
 
-       ret = nvme_mpath_init(ctrl, id);
+       ret = nvme_mpath_init_identify(ctrl, id);
        if (ret < 0)
                goto out_free;
 
@@ -4364,6 +4364,7 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev,
                min(default_ps_max_latency_us, (unsigned long)S32_MAX));
 
        nvme_fault_inject_init(&ctrl->fault_inject, dev_name(ctrl->device));
+       nvme_mpath_init_ctrl(ctrl);
 
        return 0;
 out_free_name:
index d9ab9e7..256e877 100644 (file)
@@ -2461,6 +2461,18 @@ nvme_fc_terminate_exchange(struct request *req, void *data, bool reserved)
 static void
 __nvme_fc_abort_outstanding_ios(struct nvme_fc_ctrl *ctrl, bool start_queues)
 {
+       int q;
+
+       /*
+        * if aborting io, the queues are no longer good, mark them
+        * all as not live.
+        */
+       if (ctrl->ctrl.queue_count > 1) {
+               for (q = 1; q < ctrl->ctrl.queue_count; q++)
+                       clear_bit(NVME_FC_Q_LIVE, &ctrl->queues[q].flags);
+       }
+       clear_bit(NVME_FC_Q_LIVE, &ctrl->queues[0].flags);
+
        /*
         * If io queues are present, stop them and terminate all outstanding
         * ios on them. As FC allocates FC exchange for each io, the
index 0551796..f81871c 100644 (file)
@@ -781,9 +781,18 @@ void nvme_mpath_remove_disk(struct nvme_ns_head *head)
        put_disk(head->disk);
 }
 
-int nvme_mpath_init(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
+void nvme_mpath_init_ctrl(struct nvme_ctrl *ctrl)
 {
-       int error;
+       mutex_init(&ctrl->ana_lock);
+       timer_setup(&ctrl->anatt_timer, nvme_anatt_timeout, 0);
+       INIT_WORK(&ctrl->ana_work, nvme_ana_work);
+}
+
+int nvme_mpath_init_identify(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
+{
+       size_t max_transfer_size = ctrl->max_hw_sectors << SECTOR_SHIFT;
+       size_t ana_log_size;
+       int error = 0;
 
        /* check if multipath is enabled and we have the capability */
        if (!multipath || !ctrl->subsys ||
@@ -795,37 +804,31 @@ int nvme_mpath_init(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
        ctrl->nanagrpid = le32_to_cpu(id->nanagrpid);
        ctrl->anagrpmax = le32_to_cpu(id->anagrpmax);
 
-       mutex_init(&ctrl->ana_lock);
-       timer_setup(&ctrl->anatt_timer, nvme_anatt_timeout, 0);
-       ctrl->ana_log_size = sizeof(struct nvme_ana_rsp_hdr) +
-               ctrl->nanagrpid * sizeof(struct nvme_ana_group_desc);
-       ctrl->ana_log_size += ctrl->max_namespaces * sizeof(__le32);
-
-       if (ctrl->ana_log_size > ctrl->max_hw_sectors << SECTOR_SHIFT) {
+       ana_log_size = sizeof(struct nvme_ana_rsp_hdr) +
+               ctrl->nanagrpid * sizeof(struct nvme_ana_group_desc) +
+               ctrl->max_namespaces * sizeof(__le32);
+       if (ana_log_size > max_transfer_size) {
                dev_err(ctrl->device,
-                       "ANA log page size (%zd) larger than MDTS (%d).\n",
-                       ctrl->ana_log_size,
-                       ctrl->max_hw_sectors << SECTOR_SHIFT);
+                       "ANA log page size (%zd) larger than MDTS (%zd).\n",
+                       ana_log_size, max_transfer_size);
                dev_err(ctrl->device, "disabling ANA support.\n");
-               return 0;
+               goto out_uninit;
        }
-
-       INIT_WORK(&ctrl->ana_work, nvme_ana_work);
-       kfree(ctrl->ana_log_buf);
-       ctrl->ana_log_buf = kmalloc(ctrl->ana_log_size, GFP_KERNEL);
-       if (!ctrl->ana_log_buf) {
-               error = -ENOMEM;
-               goto out;
+       if (ana_log_size > ctrl->ana_log_size) {
+               nvme_mpath_stop(ctrl);
+               kfree(ctrl->ana_log_buf);
+               ctrl->ana_log_buf = kmalloc(ana_log_size, GFP_KERNEL);
+               if (!ctrl->ana_log_buf)
+                       return -ENOMEM;
        }
-
+       ctrl->ana_log_size = ana_log_size;
        error = nvme_read_ana_log(ctrl);
        if (error)
-               goto out_free_ana_log_buf;
+               goto out_uninit;
        return 0;
-out_free_ana_log_buf:
-       kfree(ctrl->ana_log_buf);
-       ctrl->ana_log_buf = NULL;
-out:
+
+out_uninit:
+       nvme_mpath_uninit(ctrl);
        return error;
 }
 
index 05f31a2..0015860 100644 (file)
@@ -712,7 +712,8 @@ void nvme_kick_requeue_lists(struct nvme_ctrl *ctrl);
 int nvme_mpath_alloc_disk(struct nvme_ctrl *ctrl,struct nvme_ns_head *head);
 void nvme_mpath_add_disk(struct nvme_ns *ns, struct nvme_id_ns *id);
 void nvme_mpath_remove_disk(struct nvme_ns_head *head);
-int nvme_mpath_init(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id);
+int nvme_mpath_init_identify(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id);
+void nvme_mpath_init_ctrl(struct nvme_ctrl *ctrl);
 void nvme_mpath_uninit(struct nvme_ctrl *ctrl);
 void nvme_mpath_stop(struct nvme_ctrl *ctrl);
 bool nvme_mpath_clear_current_path(struct nvme_ns *ns);
@@ -780,7 +781,10 @@ static inline void nvme_mpath_check_last_path(struct nvme_ns *ns)
 static inline void nvme_trace_bio_complete(struct request *req)
 {
 }
-static inline int nvme_mpath_init(struct nvme_ctrl *ctrl,
+static inline void nvme_mpath_init_ctrl(struct nvme_ctrl *ctrl)
+{
+}
+static inline int nvme_mpath_init_identify(struct nvme_ctrl *ctrl,
                struct nvme_id_ctrl *id)
 {
        if (ctrl->subsys->cmic & NVME_CTRL_CMIC_ANA)
index 0222e23..34f4b34 100644 (file)
@@ -943,7 +943,6 @@ static int nvme_tcp_try_send_data(struct nvme_tcp_request *req)
                if (ret <= 0)
                        return ret;
 
-               nvme_tcp_advance_req(req, ret);
                if (queue->data_digest)
                        nvme_tcp_ddgst_update(queue->snd_hash, page,
                                        offset, ret);
@@ -960,6 +959,7 @@ static int nvme_tcp_try_send_data(struct nvme_tcp_request *req)
                        }
                        return 1;
                }
+               nvme_tcp_advance_req(req, ret);
        }
        return -EAGAIN;
 }
@@ -1140,7 +1140,8 @@ static void nvme_tcp_io_work(struct work_struct *w)
                                pending = true;
                        else if (unlikely(result < 0))
                                break;
-               }
+               } else
+                       pending = !llist_empty(&queue->req_list);
 
                result = nvme_tcp_try_recv(queue);
                if (result > 0)
index e7a367c..dcd49a7 100644 (file)
@@ -975,10 +975,7 @@ u16 nvmet_parse_admin_cmd(struct nvmet_req *req)
        case nvme_admin_keep_alive:
                req->execute = nvmet_execute_keep_alive;
                return 0;
+       default:
+               return nvmet_report_invalid_opcode(req);
        }
-
-       pr_debug("unhandled cmd %d on qid %d\n", cmd->common.opcode,
-              req->sq->qid);
-       req->error_loc = offsetof(struct nvme_common_command, opcode);
-       return NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
 }
index 25cc2ee..1853db3 100644 (file)
@@ -1372,7 +1372,7 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn,
                goto out_free_changed_ns_list;
 
        if (subsys->cntlid_min > subsys->cntlid_max)
-               goto out_free_changed_ns_list;
+               goto out_free_sqs;
 
        ret = ida_simple_get(&cntlid_ida,
                             subsys->cntlid_min, subsys->cntlid_max,
index 4845d12..fc3645f 100644 (file)
@@ -379,7 +379,7 @@ u16 nvmet_parse_discovery_cmd(struct nvmet_req *req)
                req->execute = nvmet_execute_disc_identify;
                return 0;
        default:
-               pr_err("unhandled cmd %d\n", cmd->common.opcode);
+               pr_debug("unhandled cmd %d\n", cmd->common.opcode);
                req->error_loc = offsetof(struct nvme_common_command, opcode);
                return NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
        }
index 1420a8e..7d0f352 100644 (file)
@@ -94,7 +94,7 @@ u16 nvmet_parse_fabrics_cmd(struct nvmet_req *req)
                req->execute = nvmet_execute_prop_get;
                break;
        default:
-               pr_err("received unknown capsule type 0x%x\n",
+               pr_debug("received unknown capsule type 0x%x\n",
                        cmd->fabrics.fctype);
                req->error_loc = offsetof(struct nvmf_common_command, fctype);
                return NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
@@ -284,13 +284,13 @@ u16 nvmet_parse_connect_cmd(struct nvmet_req *req)
        struct nvme_command *cmd = req->cmd;
 
        if (!nvme_is_fabrics(cmd)) {
-               pr_err("invalid command 0x%x on unconnected queue.\n",
+               pr_debug("invalid command 0x%x on unconnected queue.\n",
                        cmd->fabrics.opcode);
                req->error_loc = offsetof(struct nvme_common_command, opcode);
                return NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
        }
        if (cmd->fabrics.fctype != nvme_fabrics_type_connect) {
-               pr_err("invalid capsule type 0x%x on unconnected queue.\n",
+               pr_debug("invalid capsule type 0x%x on unconnected queue.\n",
                        cmd->fabrics.fctype);
                req->error_loc = offsetof(struct nvmf_common_command, fctype);
                return NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
index 9a8b372..429263c 100644 (file)
@@ -258,7 +258,7 @@ static void nvmet_bdev_execute_rw(struct nvmet_req *req)
 
        sector = nvmet_lba_to_sect(req->ns, req->cmd->rw.slba);
 
-       if (req->transfer_len <= NVMET_MAX_INLINE_DATA_LEN) {
+       if (nvmet_use_inline_bvec(req)) {
                bio = &req->b.inline_bio;
                bio_init(bio, req->inline_bvec, ARRAY_SIZE(req->inline_bvec));
        } else {
index 715d437..7fdbdc4 100644 (file)
@@ -49,9 +49,11 @@ int nvmet_file_ns_enable(struct nvmet_ns *ns)
 
        ns->file = filp_open(ns->device_path, flags, 0);
        if (IS_ERR(ns->file)) {
-               pr_err("failed to open file %s: (%ld)\n",
-                               ns->device_path, PTR_ERR(ns->file));
-               return PTR_ERR(ns->file);
+               ret = PTR_ERR(ns->file);
+               pr_err("failed to open file %s: (%d)\n",
+                       ns->device_path, ret);
+               ns->file = NULL;
+               return ret;
        }
 
        ret = nvmet_file_ns_revalidate(ns);
index 74b3b15..cb30cb9 100644 (file)
@@ -590,8 +590,10 @@ static struct nvme_ctrl *nvme_loop_create_ctrl(struct device *dev,
 
        ret = nvme_init_ctrl(&ctrl->ctrl, dev, &nvme_loop_ctrl_ops,
                                0 /* no quirks, we're perfect! */);
-       if (ret)
+       if (ret) {
+               kfree(ctrl);
                goto out;
+       }
 
        if (!nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_CONNECTING))
                WARN_ON_ONCE(1);
index 5566ed4..d69a409 100644 (file)
@@ -616,4 +616,10 @@ static inline sector_t nvmet_lba_to_sect(struct nvmet_ns *ns, __le64 lba)
        return le64_to_cpu(lba) << (ns->blksize_shift - SECTOR_SHIFT);
 }
 
+static inline bool nvmet_use_inline_bvec(struct nvmet_req *req)
+{
+       return req->transfer_len <= NVMET_MAX_INLINE_DATA_LEN &&
+              req->sg_cnt <= NVMET_MAX_INLINE_BIOVEC;
+}
+
 #endif /* _NVMET_H */
index 2798944..39b1473 100644 (file)
@@ -194,7 +194,7 @@ static int nvmet_passthru_map_sg(struct nvmet_req *req, struct request *rq)
        if (req->sg_cnt > BIO_MAX_VECS)
                return -EINVAL;
 
-       if (req->transfer_len <= NVMET_MAX_INLINE_DATA_LEN) {
+       if (nvmet_use_inline_bvec(req)) {
                bio = &req->p.inline_bio;
                bio_init(bio, req->inline_bvec, ARRAY_SIZE(req->inline_bvec));
        } else {
index 6c1f3ab..7d607f4 100644 (file)
@@ -700,7 +700,7 @@ static void nvmet_rdma_send_done(struct ib_cq *cq, struct ib_wc *wc)
 {
        struct nvmet_rdma_rsp *rsp =
                container_of(wc->wr_cqe, struct nvmet_rdma_rsp, send_cqe);
-       struct nvmet_rdma_queue *queue = cq->cq_context;
+       struct nvmet_rdma_queue *queue = wc->qp->qp_context;
 
        nvmet_rdma_release_rsp(rsp);
 
@@ -786,7 +786,7 @@ static void nvmet_rdma_write_data_done(struct ib_cq *cq, struct ib_wc *wc)
 {
        struct nvmet_rdma_rsp *rsp =
                container_of(wc->wr_cqe, struct nvmet_rdma_rsp, write_cqe);
-       struct nvmet_rdma_queue *queue = cq->cq_context;
+       struct nvmet_rdma_queue *queue = wc->qp->qp_context;
        struct rdma_cm_id *cm_id = rsp->queue->cm_id;
        u16 status;
 
index bbc4e71..38800e8 100644 (file)
@@ -294,6 +294,9 @@ mlxbf_tmfifo_get_next_desc(struct mlxbf_tmfifo_vring *vring)
        if (vring->next_avail == virtio16_to_cpu(vdev, vr->avail->idx))
                return NULL;
 
+       /* Make sure 'avail->idx' is visible already. */
+       virtio_rmb(false);
+
        idx = vring->next_avail % vr->num;
        head = virtio16_to_cpu(vdev, vr->avail->ring[idx]);
        if (WARN_ON(head >= vr->num))
@@ -322,7 +325,7 @@ static void mlxbf_tmfifo_release_desc(struct mlxbf_tmfifo_vring *vring,
         * done or not. Add a memory barrier here to make sure the update above
         * completes before updating the idx.
         */
-       mb();
+       virtio_mb(false);
        vr->used->idx = cpu_to_virtio16(vdev, vr_idx + 1);
 }
 
@@ -733,6 +736,12 @@ static bool mlxbf_tmfifo_rxtx_one_desc(struct mlxbf_tmfifo_vring *vring,
                desc = NULL;
                fifo->vring[is_rx] = NULL;
 
+               /*
+                * Make sure the load/store are in order before
+                * returning back to virtio.
+                */
+               virtio_mb(false);
+
                /* Notify upper layer that packet is done. */
                spin_lock_irqsave(&fifo->spin_lock[is_rx], flags);
                vring_interrupt(0, vring->vq);
index 69e86cd..8a70df6 100644 (file)
@@ -2483,8 +2483,7 @@ int ssam_irq_setup(struct ssam_controller *ctrl)
         * interrupt, and let the SAM resume callback during the controller
         * resume process clear it.
         */
-       const int irqf = IRQF_SHARED | IRQF_ONESHOT |
-                        IRQF_TRIGGER_RISING | IRQF_NO_AUTOEN;
+       const int irqf = IRQF_ONESHOT | IRQF_TRIGGER_RISING | IRQF_NO_AUTOEN;
 
        gpiod = gpiod_get(dev, "ssam_wakeup-int", GPIOD_ASIS);
        if (IS_ERR(gpiod))
index 63ce587..5d9b758 100644 (file)
@@ -527,20 +527,14 @@ static __poll_t surface_dtx_poll(struct file *file, struct poll_table_struct *pt
        struct sdtx_client *client = file->private_data;
        __poll_t events = 0;
 
-       if (down_read_killable(&client->ddev->lock))
-               return -ERESTARTSYS;
-
-       if (test_bit(SDTX_DEVICE_SHUTDOWN_BIT, &client->ddev->flags)) {
-               up_read(&client->ddev->lock);
+       if (test_bit(SDTX_DEVICE_SHUTDOWN_BIT, &client->ddev->flags))
                return EPOLLHUP | EPOLLERR;
-       }
 
        poll_wait(file, &client->ddev->waitq, pt);
 
        if (!kfifo_is_empty(&client->buffer))
                events |= EPOLLIN | EPOLLRDNORM;
 
-       up_read(&client->ddev->lock);
        return events;
 }
 
index 2714f7c..60592fb 100644 (file)
@@ -711,7 +711,7 @@ config INTEL_HID_EVENT
 
 config INTEL_INT0002_VGPIO
        tristate "Intel ACPI INT0002 Virtual GPIO driver"
-       depends on GPIOLIB && ACPI
+       depends on GPIOLIB && ACPI && PM_SLEEP
        select GPIOLIB_IRQCHIP
        help
          Some peripherals on Bay Trail and Cherry Trail platforms signal a
index a175348..33f8237 100644 (file)
@@ -270,7 +270,8 @@ int init_dell_smbios_wmi(void)
 
 void exit_dell_smbios_wmi(void)
 {
-       wmi_driver_unregister(&dell_smbios_wmi_driver);
+       if (wmi_supported)
+               wmi_driver_unregister(&dell_smbios_wmi_driver);
 }
 
 MODULE_DEVICE_TABLE(wmi, dell_smbios_wmi_id_table);
index 13d5743..5529d7b 100644 (file)
@@ -133,31 +133,21 @@ static u8 gigabyte_wmi_detect_sensor_usability(struct wmi_device *wdev)
        return r;
 }
 
+#define DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME(name) \
+       { .matches = { \
+               DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."), \
+               DMI_EXACT_MATCH(DMI_BOARD_NAME, name), \
+       }}
+
 static const struct dmi_system_id gigabyte_wmi_known_working_platforms[] = {
-       { .matches = {
-               DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."),
-               DMI_EXACT_MATCH(DMI_BOARD_NAME, "B550 GAMING X V2"),
-       }},
-       { .matches = {
-               DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."),
-               DMI_EXACT_MATCH(DMI_BOARD_NAME, "B550M AORUS PRO-P"),
-       }},
-       { .matches = {
-               DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."),
-               DMI_EXACT_MATCH(DMI_BOARD_NAME, "B550M DS3H"),
-       }},
-       { .matches = {
-               DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."),
-               DMI_EXACT_MATCH(DMI_BOARD_NAME, "Z390 I AORUS PRO WIFI-CF"),
-       }},
-       { .matches = {
-               DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."),
-               DMI_EXACT_MATCH(DMI_BOARD_NAME, "X570 AORUS ELITE"),
-       }},
-       { .matches = {
-               DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."),
-               DMI_EXACT_MATCH(DMI_BOARD_NAME, "X570 I AORUS PRO WIFI"),
-       }},
+       DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550 AORUS ELITE"),
+       DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550 GAMING X V2"),
+       DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550M AORUS PRO-P"),
+       DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550M DS3H"),
+       DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("Z390 I AORUS PRO WIFI-CF"),
+       DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("X570 AORUS ELITE"),
+       DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("X570 I AORUS PRO WIFI"),
+       DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("X570 UD"),
        { }
 };
 
index 12c31fd..0753ef1 100644 (file)
@@ -17,12 +17,14 @@ MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Alex Hung");
 MODULE_ALIAS("acpi*:HPQ6001:*");
 MODULE_ALIAS("acpi*:WSTADEF:*");
+MODULE_ALIAS("acpi*:AMDI0051:*");
 
 static struct input_dev *hpwl_input_dev;
 
 static const struct acpi_device_id hpwl_ids[] = {
        {"HPQ6001", 0},
        {"WSTADEF", 0},
+       {"AMDI0051", 0},
        {"", 0},
 };
 
index 799cbe2..8c0867b 100644 (file)
@@ -88,6 +88,9 @@ MODULE_DEVICE_TABLE(acpi, lis3lv02d_device_ids);
 static int lis3lv02d_acpi_init(struct lis3lv02d *lis3)
 {
        struct acpi_device *dev = lis3->bus_priv;
+       if (!lis3->init_required)
+               return 0;
+
        if (acpi_evaluate_object(dev->handle, METHOD_NAME__INI,
                                 NULL, NULL) != AE_OK)
                return -EINVAL;
@@ -356,6 +359,7 @@ static int lis3lv02d_add(struct acpi_device *device)
        }
 
        /* call the core layer do its init */
+       lis3_dev.init_required = true;
        ret = lis3lv02d_init_device(&lis3_dev);
        if (ret)
                return ret;
@@ -403,11 +407,27 @@ static int lis3lv02d_suspend(struct device *dev)
 
 static int lis3lv02d_resume(struct device *dev)
 {
+       lis3_dev.init_required = false;
+       lis3lv02d_poweron(&lis3_dev);
+       return 0;
+}
+
+static int lis3lv02d_restore(struct device *dev)
+{
+       lis3_dev.init_required = true;
        lis3lv02d_poweron(&lis3_dev);
        return 0;
 }
 
-static SIMPLE_DEV_PM_OPS(hp_accel_pm, lis3lv02d_suspend, lis3lv02d_resume);
+static const struct dev_pm_ops hp_accel_pm = {
+       .suspend = lis3lv02d_suspend,
+       .resume = lis3lv02d_resume,
+       .freeze = lis3lv02d_suspend,
+       .thaw = lis3lv02d_resume,
+       .poweroff = lis3lv02d_suspend,
+       .restore = lis3lv02d_restore,
+};
+
 #define HP_ACCEL_PM (&hp_accel_pm)
 #else
 #define HP_ACCEL_PM NULL
index 6cb5ad4..3878172 100644 (file)
@@ -57,8 +57,8 @@ enum {
 };
 
 enum {
-       SMBC_CONSERVATION_ON  = 3,
-       SMBC_CONSERVATION_OFF = 5,
+       SBMC_CONSERVATION_ON  = 3,
+       SBMC_CONSERVATION_OFF = 5,
 };
 
 enum {
@@ -182,9 +182,9 @@ static int eval_gbmd(acpi_handle handle, unsigned long *res)
        return eval_int(handle, "GBMD", res);
 }
 
-static int exec_smbc(acpi_handle handle, unsigned long arg)
+static int exec_sbmc(acpi_handle handle, unsigned long arg)
 {
-       return exec_simple_method(handle, "SMBC", arg);
+       return exec_simple_method(handle, "SBMC", arg);
 }
 
 static int eval_hals(acpi_handle handle, unsigned long *res)
@@ -477,7 +477,7 @@ static ssize_t conservation_mode_store(struct device *dev,
        if (err)
                return err;
 
-       err = exec_smbc(priv->adev->handle, state ? SMBC_CONSERVATION_ON : SMBC_CONSERVATION_OFF);
+       err = exec_sbmc(priv->adev->handle, state ? SBMC_CONSERVATION_ON : SBMC_CONSERVATION_OFF);
        if (err)
                return err;
 
@@ -809,6 +809,7 @@ static int dytc_profile_set(struct platform_profile_handler *pprof,
 {
        struct ideapad_dytc_priv *dytc = container_of(pprof, struct ideapad_dytc_priv, pprof);
        struct ideapad_private *priv = dytc->priv;
+       unsigned long output;
        int err;
 
        err = mutex_lock_interruptible(&dytc->mutex);
@@ -829,7 +830,7 @@ static int dytc_profile_set(struct platform_profile_handler *pprof,
 
                /* Determine if we are in CQL mode. This alters the commands we do */
                err = dytc_cql_command(priv, DYTC_SET_COMMAND(DYTC_FUNCTION_MMC, perfmode, 1),
-                                      NULL);
+                                      &output);
                if (err)
                        goto unlock;
        }
index 289c665..569342a 100644 (file)
 #define GPE0A_STS_PORT                 0x420
 #define GPE0A_EN_PORT                  0x428
 
+struct int0002_data {
+       struct gpio_chip chip;
+       int parent_irq;
+       int wake_enable_count;
+};
+
 /*
  * As this is not a real GPIO at all, but just a hack to model an event in
  * ACPI the get / set functions are dummy functions.
@@ -98,14 +104,16 @@ static void int0002_irq_mask(struct irq_data *data)
 static int int0002_irq_set_wake(struct irq_data *data, unsigned int on)
 {
        struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
-       struct platform_device *pdev = to_platform_device(chip->parent);
-       int irq = platform_get_irq(pdev, 0);
+       struct int0002_data *int0002 = container_of(chip, struct int0002_data, chip);
 
-       /* Propagate to parent irq */
+       /*
+        * Applying of the wakeup flag to our parent IRQ is delayed till system
+        * suspend, because we only want to do this when using s2idle.
+        */
        if (on)
-               enable_irq_wake(irq);
+               int0002->wake_enable_count++;
        else
-               disable_irq_wake(irq);
+               int0002->wake_enable_count--;
 
        return 0;
 }
@@ -135,7 +143,7 @@ static bool int0002_check_wake(void *data)
        return (gpe_sts_reg & GPE0A_PME_B0_STS_BIT);
 }
 
-static struct irq_chip int0002_byt_irqchip = {
+static struct irq_chip int0002_irqchip = {
        .name                   = DRV_NAME,
        .irq_ack                = int0002_irq_ack,
        .irq_mask               = int0002_irq_mask,
@@ -143,21 +151,9 @@ static struct irq_chip int0002_byt_irqchip = {
        .irq_set_wake           = int0002_irq_set_wake,
 };
 
-static struct irq_chip int0002_cht_irqchip = {
-       .name                   = DRV_NAME,
-       .irq_ack                = int0002_irq_ack,
-       .irq_mask               = int0002_irq_mask,
-       .irq_unmask             = int0002_irq_unmask,
-       /*
-        * No set_wake, on CHT the IRQ is typically shared with the ACPI SCI
-        * and we don't want to mess with the ACPI SCI irq settings.
-        */
-       .flags                  = IRQCHIP_SKIP_SET_WAKE,
-};
-
 static const struct x86_cpu_id int0002_cpu_ids[] = {
-       X86_MATCH_INTEL_FAM6_MODEL(ATOM_SILVERMONT,     &int0002_byt_irqchip),
-       X86_MATCH_INTEL_FAM6_MODEL(ATOM_AIRMONT,        &int0002_cht_irqchip),
+       X86_MATCH_INTEL_FAM6_MODEL(ATOM_SILVERMONT, NULL),
+       X86_MATCH_INTEL_FAM6_MODEL(ATOM_AIRMONT, NULL),
        {}
 };
 
@@ -172,8 +168,9 @@ static int int0002_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        const struct x86_cpu_id *cpu_id;
-       struct gpio_chip *chip;
+       struct int0002_data *int0002;
        struct gpio_irq_chip *girq;
+       struct gpio_chip *chip;
        int irq, ret;
 
        /* Menlow has a different INT0002 device? <sigh> */
@@ -185,10 +182,13 @@ static int int0002_probe(struct platform_device *pdev)
        if (irq < 0)
                return irq;
 
-       chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
-       if (!chip)
+       int0002 = devm_kzalloc(dev, sizeof(*int0002), GFP_KERNEL);
+       if (!int0002)
                return -ENOMEM;
 
+       int0002->parent_irq = irq;
+
+       chip = &int0002->chip;
        chip->label = DRV_NAME;
        chip->parent = dev;
        chip->owner = THIS_MODULE;
@@ -214,7 +214,7 @@ static int int0002_probe(struct platform_device *pdev)
        }
 
        girq = &chip->irq;
-       girq->chip = (struct irq_chip *)cpu_id->driver_data;
+       girq->chip = &int0002_irqchip;
        /* This let us handle the parent IRQ in the driver */
        girq->parent_handler = NULL;
        girq->num_parents = 0;
@@ -230,6 +230,7 @@ static int int0002_probe(struct platform_device *pdev)
 
        acpi_register_wakeup_handler(irq, int0002_check_wake, NULL);
        device_init_wakeup(dev, true);
+       dev_set_drvdata(dev, int0002);
        return 0;
 }
 
@@ -240,6 +241,36 @@ static int int0002_remove(struct platform_device *pdev)
        return 0;
 }
 
+static int int0002_suspend(struct device *dev)
+{
+       struct int0002_data *int0002 = dev_get_drvdata(dev);
+
+       /*
+        * The INT0002 parent IRQ is often shared with the ACPI GPE IRQ, don't
+        * muck with it when firmware based suspend is used, otherwise we may
+        * cause spurious wakeups from firmware managed suspend.
+        */
+       if (!pm_suspend_via_firmware() && int0002->wake_enable_count)
+               enable_irq_wake(int0002->parent_irq);
+
+       return 0;
+}
+
+static int int0002_resume(struct device *dev)
+{
+       struct int0002_data *int0002 = dev_get_drvdata(dev);
+
+       if (!pm_suspend_via_firmware() && int0002->wake_enable_count)
+               disable_irq_wake(int0002->parent_irq);
+
+       return 0;
+}
+
+static const struct dev_pm_ops int0002_pm_ops = {
+       .suspend = int0002_suspend,
+       .resume = int0002_resume,
+};
+
 static const struct acpi_device_id int0002_acpi_ids[] = {
        { "INT0002", 0 },
        { },
@@ -250,6 +281,7 @@ static struct platform_driver int0002_driver = {
        .driver = {
                .name                   = DRV_NAME,
                .acpi_match_table       = int0002_acpi_ids,
+               .pm                     = &int0002_pm_ops,
        },
        .probe  = int0002_probe,
        .remove = int0002_remove,
index 05cced5..f58b854 100644 (file)
@@ -312,6 +312,7 @@ static const struct acpi_device_id punit_ipc_acpi_ids[] = {
        { "INT34D4", 0 },
        { }
 };
+MODULE_DEVICE_TABLE(acpi, punit_ipc_acpi_ids);
 
 static struct platform_driver intel_punit_ipc_driver = {
        .probe = intel_punit_ipc_probe,
index 90fe4f8..bde740d 100644 (file)
@@ -115,6 +115,32 @@ static const struct ts_dmi_data chuwi_hi10_plus_data = {
        .properties     = chuwi_hi10_plus_props,
 };
 
+static const struct property_entry chuwi_hi10_pro_props[] = {
+       PROPERTY_ENTRY_U32("touchscreen-min-x", 8),
+       PROPERTY_ENTRY_U32("touchscreen-min-y", 8),
+       PROPERTY_ENTRY_U32("touchscreen-size-x", 1912),
+       PROPERTY_ENTRY_U32("touchscreen-size-y", 1272),
+       PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"),
+       PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-chuwi-hi10-pro.fw"),
+       PROPERTY_ENTRY_U32("silead,max-fingers", 10),
+       PROPERTY_ENTRY_BOOL("silead,home-button"),
+       { }
+};
+
+static const struct ts_dmi_data chuwi_hi10_pro_data = {
+       .embedded_fw = {
+               .name   = "silead/gsl1680-chuwi-hi10-pro.fw",
+               .prefix = { 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 },
+               .length = 42504,
+               .sha256 = { 0xdb, 0x92, 0x68, 0xa8, 0xdb, 0x81, 0x31, 0x00,
+                           0x1f, 0x58, 0x89, 0xdb, 0x19, 0x1b, 0x15, 0x8c,
+                           0x05, 0x14, 0xf4, 0x95, 0xba, 0x15, 0x45, 0x98,
+                           0x42, 0xa3, 0xbb, 0x65, 0xe3, 0x30, 0xa5, 0x93 },
+       },
+       .acpi_name      = "MSSL1680:00",
+       .properties     = chuwi_hi10_pro_props,
+};
+
 static const struct property_entry chuwi_vi8_props[] = {
        PROPERTY_ENTRY_U32("touchscreen-min-x", 4),
        PROPERTY_ENTRY_U32("touchscreen-min-y", 6),
@@ -916,6 +942,15 @@ const struct dmi_system_id touchscreen_dmi_table[] = {
                },
        },
        {
+               /* Chuwi Hi10 Prus (CWI597) */
+               .driver_data = (void *)&chuwi_hi10_pro_data,
+               .matches = {
+                       DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Hi10 pro tablet"),
+                       DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"),
+               },
+       },
+       {
                /* Chuwi Vi8 (CWI506) */
                .driver_data = (void *)&chuwi_vi8_data,
                .matches = {
@@ -1097,6 +1132,14 @@ const struct dmi_system_id touchscreen_dmi_table[] = {
                },
        },
        {
+               /* Mediacom WinPad 7.0 W700 (same hw as Wintron surftab 7") */
+               .driver_data = (void *)&trekstor_surftab_wintron70_data,
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "MEDIACOM"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "WinPad 7 W10 - WPW700"),
+               },
+       },
+       {
                /* Mediacom Flexbook Edge 11 (same hw as TS Primebook C11) */
                .driver_data = (void *)&trekstor_primebook_c11_data,
                .matches = {
index 50ec53d..db4c265 100644 (file)
@@ -2127,6 +2127,14 @@ static int riocm_add_mport(struct device *dev,
                return -ENODEV;
        }
 
+       cm->rx_wq = create_workqueue(DRV_NAME "/rxq");
+       if (!cm->rx_wq) {
+               rio_release_inb_mbox(mport, cmbox);
+               rio_release_outb_mbox(mport, cmbox);
+               kfree(cm);
+               return -ENOMEM;
+       }
+
        /*
         * Allocate and register inbound messaging buffers to be ready
         * to receive channel and system management requests
@@ -2137,15 +2145,6 @@ static int riocm_add_mport(struct device *dev,
        cm->rx_slots = RIOCM_RX_RING_SIZE;
        mutex_init(&cm->rx_lock);
        riocm_rx_fill(cm, RIOCM_RX_RING_SIZE);
-       cm->rx_wq = create_workqueue(DRV_NAME "/rxq");
-       if (!cm->rx_wq) {
-               riocm_error("failed to allocate IBMBOX_%d on %s",
-                           cmbox, mport->name);
-               rio_release_outb_mbox(mport, cmbox);
-               kfree(cm);
-               return -ENOMEM;
-       }
-
        INIT_WORK(&cm->rx_work, rio_ibmsg_handler);
 
        cm->tx_slot = 0;
index 3ee46a8..adddcd5 100644 (file)
@@ -2926,11 +2926,11 @@ static int blogic_qcmd_lck(struct scsi_cmnd *command,
                ccb->opcode = BLOGIC_INITIATOR_CCB_SG;
                ccb->datalen = count * sizeof(struct blogic_sg_seg);
                if (blogic_multimaster_type(adapter))
-                       ccb->data = (void *)((unsigned int) ccb->dma_handle +
+                       ccb->data = (unsigned int) ccb->dma_handle +
                                        ((unsigned long) &ccb->sglist -
-                                       (unsigned long) ccb));
+                                       (unsigned long) ccb);
                else
-                       ccb->data = ccb->sglist;
+                       ccb->data = virt_to_32bit_virt(ccb->sglist);
 
                scsi_for_each_sg(command, sg, count, i) {
                        ccb->sglist[i].segbytes = sg_dma_len(sg);
index a8e4a19..7d1ec10 100644 (file)
@@ -806,7 +806,7 @@ struct blogic_ccb {
        unsigned char cdblen;                           /* Byte 2 */
        unsigned char sense_datalen;                    /* Byte 3 */
        u32 datalen;                                    /* Bytes 4-7 */
-       void *data;                                     /* Bytes 8-11 */
+       u32 data;                                       /* Bytes 8-11 */
        unsigned char:8;                                /* Byte 12 */
        unsigned char:8;                                /* Byte 13 */
        enum blogic_adapter_status adapter_status;      /* Byte 14 */
index ecd06d2..71aa6af 100644 (file)
@@ -3765,11 +3765,13 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
        case HW_EVENT_PHY_START_STATUS:
                pm8001_dbg(pm8001_ha, MSG, "HW_EVENT_PHY_START_STATUS status = %x\n",
                           status);
-               if (status == 0) {
+               if (status == 0)
                        phy->phy_state = 1;
-                       if (pm8001_ha->flags == PM8001F_RUN_TIME &&
-                                       phy->enable_completion != NULL)
-                               complete(phy->enable_completion);
+
+               if (pm8001_ha->flags == PM8001F_RUN_TIME &&
+                               phy->enable_completion != NULL) {
+                       complete(phy->enable_completion);
+                       phy->enable_completion = NULL;
                }
                break;
        case HW_EVENT_SAS_PHY_UP:
index 390c33d..af09bd2 100644 (file)
@@ -1151,8 +1151,8 @@ static int pm8001_pci_probe(struct pci_dev *pdev,
                goto err_out_shost;
        }
        list_add_tail(&pm8001_ha->list, &hba_list);
-       scsi_scan_host(pm8001_ha->shost);
        pm8001_ha->flags = PM8001F_RUN_TIME;
+       scsi_scan_host(pm8001_ha->shost);
        return 0;
 
 err_out_shost:
index d28af41..335cf37 100644 (file)
@@ -264,12 +264,17 @@ void pm8001_scan_start(struct Scsi_Host *shost)
        int i;
        struct pm8001_hba_info *pm8001_ha;
        struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
+       DECLARE_COMPLETION_ONSTACK(completion);
        pm8001_ha = sha->lldd_ha;
        /* SAS_RE_INITIALIZATION not available in SPCv/ve */
        if (pm8001_ha->chip_id == chip_8001)
                PM8001_CHIP_DISP->sas_re_init_req(pm8001_ha);
-       for (i = 0; i < pm8001_ha->chip->n_phy; ++i)
+       for (i = 0; i < pm8001_ha->chip->n_phy; ++i) {
+               pm8001_ha->phy[i].enable_completion = &completion;
                PM8001_CHIP_DISP->phy_start_req(pm8001_ha, i);
+               wait_for_completion(&completion);
+               msleep(300);
+       }
 }
 
 int pm8001_scan_finished(struct Scsi_Host *shost, unsigned long time)
index 4e98083..700530e 100644 (file)
@@ -3487,13 +3487,13 @@ static int mpi_phy_start_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
        pm8001_dbg(pm8001_ha, INIT,
                   "phy start resp status:0x%x, phyid:0x%x\n",
                   status, phy_id);
-       if (status == 0) {
+       if (status == 0)
                phy->phy_state = PHY_LINK_DOWN;
-               if (pm8001_ha->flags == PM8001F_RUN_TIME &&
-                               phy->enable_completion != NULL) {
-                       complete(phy->enable_completion);
-                       phy->enable_completion = NULL;
-               }
+
+       if (pm8001_ha->flags == PM8001F_RUN_TIME &&
+                       phy->enable_completion != NULL) {
+               complete(phy->enable_completion);
+               phy->enable_completion = NULL;
        }
        return 0;
 
index 69f7784..7562311 100644 (file)
@@ -536,7 +536,9 @@ static void qedf_update_link_speed(struct qedf_ctx *qedf,
        if (linkmode_intersects(link->supported_caps, sup_caps))
                lport->link_supported_speeds |= FC_PORTSPEED_20GBIT;
 
-       fc_host_supported_speeds(lport->host) = lport->link_supported_speeds;
+       if (lport->host && lport->host->shost_data)
+               fc_host_supported_speeds(lport->host) =
+                       lport->link_supported_speeds;
 }
 
 static void qedf_bw_update(void *dev)
index 0677295..615e44a 100644 (file)
@@ -1063,7 +1063,8 @@ qla82xx_write_flash_dword(struct qla_hw_data *ha, uint32_t flashaddr,
                return ret;
        }
 
-       if (qla82xx_flash_set_write_enable(ha))
+       ret = qla82xx_flash_set_write_enable(ha);
+       if (ret < 0)
                goto done_write;
 
        qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_WDATA, data);
index 0aa5813..d062677 100644 (file)
@@ -467,21 +467,24 @@ static int ufs_hisi_init_common(struct ufs_hba *hba)
        host->hba = hba;
        ufshcd_set_variant(hba, host);
 
-       host->rst  = devm_reset_control_get(dev, "rst");
+       host->rst = devm_reset_control_get(dev, "rst");
        if (IS_ERR(host->rst)) {
                dev_err(dev, "%s: failed to get reset control\n", __func__);
-               return PTR_ERR(host->rst);
+               err = PTR_ERR(host->rst);
+               goto error;
        }
 
        ufs_hisi_set_pm_lvl(hba);
 
        err = ufs_hisi_get_resource(host);
-       if (err) {
-               ufshcd_set_variant(hba, NULL);
-               return err;
-       }
+       if (err)
+               goto error;
 
        return 0;
+
+error:
+       ufshcd_set_variant(hba, NULL);
+       return err;
 }
 
 static int ufs_hi3660_init(struct ufs_hba *hba)
index a981f26..aee3cfc 100644 (file)
@@ -922,6 +922,7 @@ static void ufs_mtk_vreg_set_lpm(struct ufs_hba *hba, bool lpm)
 static int ufs_mtk_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
 {
        int err;
+       struct arm_smccc_res res;
 
        if (ufshcd_is_link_hibern8(hba)) {
                err = ufs_mtk_link_set_lpm(hba);
@@ -941,6 +942,9 @@ static int ufs_mtk_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
                        goto fail;
        }
 
+       if (ufshcd_is_link_off(hba))
+               ufs_mtk_device_reset_ctrl(0, res);
+
        return 0;
 fail:
        /*
index 3eb5493..72fd41b 100644 (file)
@@ -2842,7 +2842,7 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
  * ufshcd_exec_dev_cmd - API for sending device management requests
  * @hba: UFS hba
  * @cmd_type: specifies the type (NOP, Query...)
- * @timeout: time in seconds
+ * @timeout: timeout in milliseconds
  *
  * NOTE: Since there is only one available tag for device management commands,
  * it is expected you hold the hba->dev_cmd.lock mutex.
@@ -2872,6 +2872,9 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
        }
        tag = req->tag;
        WARN_ON_ONCE(!ufshcd_valid_tag(hba, tag));
+       /* Set the timeout such that the SCSI error handler is not activated. */
+       req->timeout = msecs_to_jiffies(2 * timeout);
+       blk_mq_start_request(req);
 
        init_completion(&wait);
        lrbp = &hba->lrb[tag];
index c1dac6e..a6d731e 100644 (file)
@@ -527,6 +527,9 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_pa
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct security_priv *psecuritypriv =  &(padapter->securitypriv);
        struct sta_priv *pstapriv = &padapter->stapriv;
+       char *grpkey = padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey;
+       char *txkey = padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey;
+       char *rxkey = padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey;
 
        param->u.crypt.err = 0;
        param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0';
@@ -609,7 +612,7 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_pa
                {
                        if (strcmp(param->u.crypt.alg, "WEP") == 0)
                        {
-                               memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
+                               memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
 
                                psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
                                if (param->u.crypt.key_len == 13)
@@ -622,12 +625,12 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_pa
                        {
                                psecuritypriv->dot118021XGrpPrivacy = _TKIP_;
 
-                               memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
+                               memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
 
                                /* DEBUG_ERR("set key length :param->u.crypt.key_len =%d\n", param->u.crypt.key_len); */
                                /* set mic key */
-                               memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8);
-                               memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8);
+                               memcpy(txkey, &(param->u.crypt.key[16]), 8);
+                               memcpy(rxkey, &(param->u.crypt.key[24]), 8);
 
                                psecuritypriv->busetkipkey = true;
 
@@ -636,7 +639,7 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_pa
                        {
                                psecuritypriv->dot118021XGrpPrivacy = _AES_;
 
-                               memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
+                               memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
                        }
                        else
                        {
@@ -713,7 +716,7 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_pa
                        {
                                if (strcmp(param->u.crypt.alg, "WEP") == 0)
                                {
-                                       memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
+                                       memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
 
                                        psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
                                        if (param->u.crypt.key_len == 13)
@@ -725,12 +728,12 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_pa
                                {
                                        psecuritypriv->dot118021XGrpPrivacy = _TKIP_;
 
-                                       memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
+                                       memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
 
                                        /* DEBUG_ERR("set key length :param->u.crypt.key_len =%d\n", param->u.crypt.key_len); */
                                        /* set mic key */
-                                       memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8);
-                                       memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8);
+                                       memcpy(txkey, &(param->u.crypt.key[16]), 8);
+                                       memcpy(rxkey, &(param->u.crypt.key[24]), 8);
 
                                        psecuritypriv->busetkipkey = true;
 
@@ -739,7 +742,7 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_pa
                                {
                                        psecuritypriv->dot118021XGrpPrivacy = _AES_;
 
-                                       memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
+                                       memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
                                }
                                else
                                {
index e98e538..5088c37 100644 (file)
@@ -2963,6 +2963,9 @@ static int rtw_set_encryption(struct net_device *dev, struct ieee_param *param,
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct security_priv *psecuritypriv = &(padapter->securitypriv);
        struct sta_priv *pstapriv = &padapter->stapriv;
+       char *txkey = padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey;
+       char *rxkey = padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey;
+       char *grpkey = psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey;
 
        param->u.crypt.err = 0;
        param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0';
@@ -3064,7 +3067,7 @@ static int rtw_set_encryption(struct net_device *dev, struct ieee_param *param,
        if (!psta && check_fwstate(pmlmepriv, WIFI_AP_STATE)) { /*  group key */
                if (param->u.crypt.set_tx == 1) {
                        if (strcmp(param->u.crypt.alg, "WEP") == 0) {
-                               memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
+                               memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
 
                                psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
                                if (param->u.crypt.key_len == 13)
@@ -3073,11 +3076,11 @@ static int rtw_set_encryption(struct net_device *dev, struct ieee_param *param,
                        } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) {
                                psecuritypriv->dot118021XGrpPrivacy = _TKIP_;
 
-                               memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
+                               memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
 
                                /* DEBUG_ERR("set key length :param->u.crypt.key_len =%d\n", param->u.crypt.key_len); */
                                /* set mic key */
-                               memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8);
+                               memcpy(txkey, &(param->u.crypt.key[16]), 8);
                                memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8);
 
                                psecuritypriv->busetkipkey = true;
@@ -3086,7 +3089,7 @@ static int rtw_set_encryption(struct net_device *dev, struct ieee_param *param,
                        else if (strcmp(param->u.crypt.alg, "CCMP") == 0) {
                                psecuritypriv->dot118021XGrpPrivacy = _AES_;
 
-                               memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
+                               memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
                        } else {
                                psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;
                        }
@@ -3142,7 +3145,7 @@ static int rtw_set_encryption(struct net_device *dev, struct ieee_param *param,
 
                        } else { /* group key??? */
                                if (strcmp(param->u.crypt.alg, "WEP") == 0) {
-                                       memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
+                                       memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
 
                                        psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
                                        if (param->u.crypt.key_len == 13)
@@ -3150,19 +3153,19 @@ static int rtw_set_encryption(struct net_device *dev, struct ieee_param *param,
                                } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) {
                                        psecuritypriv->dot118021XGrpPrivacy = _TKIP_;
 
-                                       memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
+                                       memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
 
                                        /* DEBUG_ERR("set key length :param->u.crypt.key_len =%d\n", param->u.crypt.key_len); */
                                        /* set mic key */
-                                       memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8);
-                                       memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8);
+                                       memcpy(txkey, &(param->u.crypt.key[16]), 8);
+                                       memcpy(rxkey, &(param->u.crypt.key[24]), 8);
 
                                        psecuritypriv->busetkipkey = true;
 
                                } else if (strcmp(param->u.crypt.alg, "CCMP") == 0) {
                                        psecuritypriv->dot118021XGrpPrivacy = _AES_;
 
-                                       memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
+                                       memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len));
                                } else {
                                        psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;
                                }
index 337c8d8..6d0f706 100644 (file)
@@ -21,6 +21,7 @@
 #define TEEC_SUCCESS                   0x00000000
 #define TEEC_ERROR_GENERIC             0xFFFF0000
 #define TEEC_ERROR_BAD_PARAMETERS      0xFFFF0006
+#define TEEC_ERROR_OUT_OF_MEMORY       0xFFFF000C
 #define TEEC_ERROR_COMMUNICATION       0xFFFF000E
 
 #define TEEC_ORIGIN_COMMS              0x00000002
@@ -93,6 +94,18 @@ struct amdtee_shm_data {
        u32     buf_id;
 };
 
+/**
+ * struct amdtee_ta_data - Keeps track of all TAs loaded in AMD Secure
+ *                        Processor
+ * @ta_handle: Handle to TA loaded in TEE
+ * @refcount:  Reference count for the loaded TA
+ */
+struct amdtee_ta_data {
+       struct list_head list_node;
+       u32 ta_handle;
+       u32 refcount;
+};
+
 #define LOWER_TWO_BYTE_MASK    0x0000FFFF
 
 /**
index 096dd4d..07f36ac 100644 (file)
@@ -121,15 +121,69 @@ static int amd_params_to_tee_params(struct tee_param *tee, u32 count,
        return ret;
 }
 
+static DEFINE_MUTEX(ta_refcount_mutex);
+static struct list_head ta_list = LIST_HEAD_INIT(ta_list);
+
+static u32 get_ta_refcount(u32 ta_handle)
+{
+       struct amdtee_ta_data *ta_data;
+       u32 count = 0;
+
+       /* Caller must hold a mutex */
+       list_for_each_entry(ta_data, &ta_list, list_node)
+               if (ta_data->ta_handle == ta_handle)
+                       return ++ta_data->refcount;
+
+       ta_data = kzalloc(sizeof(*ta_data), GFP_KERNEL);
+       if (ta_data) {
+               ta_data->ta_handle = ta_handle;
+               ta_data->refcount = 1;
+               count = ta_data->refcount;
+               list_add(&ta_data->list_node, &ta_list);
+       }
+
+       return count;
+}
+
+static u32 put_ta_refcount(u32 ta_handle)
+{
+       struct amdtee_ta_data *ta_data;
+       u32 count = 0;
+
+       /* Caller must hold a mutex */
+       list_for_each_entry(ta_data, &ta_list, list_node)
+               if (ta_data->ta_handle == ta_handle) {
+                       count = --ta_data->refcount;
+                       if (count == 0) {
+                               list_del(&ta_data->list_node);
+                               kfree(ta_data);
+                               break;
+                       }
+               }
+
+       return count;
+}
+
 int handle_unload_ta(u32 ta_handle)
 {
        struct tee_cmd_unload_ta cmd = {0};
-       u32 status;
+       u32 status, count;
        int ret;
 
        if (!ta_handle)
                return -EINVAL;
 
+       mutex_lock(&ta_refcount_mutex);
+
+       count = put_ta_refcount(ta_handle);
+
+       if (count) {
+               pr_debug("unload ta: not unloading %u count %u\n",
+                        ta_handle, count);
+               ret = -EBUSY;
+               goto unlock;
+       }
+
        cmd.ta_handle = ta_handle;
 
        ret = psp_tee_process_cmd(TEE_CMD_ID_UNLOAD_TA, (void *)&cmd,
@@ -137,8 +191,12 @@ int handle_unload_ta(u32 ta_handle)
        if (!ret && status != 0) {
                pr_err("unload ta: status = 0x%x\n", status);
                ret = -EBUSY;
+       } else {
+               pr_debug("unloaded ta handle %u\n", ta_handle);
        }
 
+unlock:
+       mutex_unlock(&ta_refcount_mutex);
        return ret;
 }
 
@@ -340,7 +398,8 @@ int handle_open_session(struct tee_ioctl_open_session_arg *arg, u32 *info,
 
 int handle_load_ta(void *data, u32 size, struct tee_ioctl_open_session_arg *arg)
 {
-       struct tee_cmd_load_ta cmd = {0};
+       struct tee_cmd_unload_ta unload_cmd = {};
+       struct tee_cmd_load_ta load_cmd = {};
        phys_addr_t blob;
        int ret;
 
@@ -353,21 +412,36 @@ int handle_load_ta(void *data, u32 size, struct tee_ioctl_open_session_arg *arg)
                return -EINVAL;
        }
 
-       cmd.hi_addr = upper_32_bits(blob);
-       cmd.low_addr = lower_32_bits(blob);
-       cmd.size = size;
+       load_cmd.hi_addr = upper_32_bits(blob);
+       load_cmd.low_addr = lower_32_bits(blob);
+       load_cmd.size = size;
 
-       ret = psp_tee_process_cmd(TEE_CMD_ID_LOAD_TA, (void *)&cmd,
-                                 sizeof(cmd), &arg->ret);
+       mutex_lock(&ta_refcount_mutex);
+
+       ret = psp_tee_process_cmd(TEE_CMD_ID_LOAD_TA, (void *)&load_cmd,
+                                 sizeof(load_cmd), &arg->ret);
        if (ret) {
                arg->ret_origin = TEEC_ORIGIN_COMMS;
                arg->ret = TEEC_ERROR_COMMUNICATION;
-       } else {
-               set_session_id(cmd.ta_handle, 0, &arg->session);
+       } else if (arg->ret == TEEC_SUCCESS) {
+               ret = get_ta_refcount(load_cmd.ta_handle);
+               if (!ret) {
+                       arg->ret_origin = TEEC_ORIGIN_COMMS;
+                       arg->ret = TEEC_ERROR_OUT_OF_MEMORY;
+
+                       /* Unload the TA on error */
+                       unload_cmd.ta_handle = load_cmd.ta_handle;
+                       psp_tee_process_cmd(TEE_CMD_ID_UNLOAD_TA,
+                                           (void *)&unload_cmd,
+                                           sizeof(unload_cmd), &ret);
+               } else {
+                       set_session_id(load_cmd.ta_handle, 0, &arg->session);
+               }
        }
+       mutex_unlock(&ta_refcount_mutex);
 
        pr_debug("load TA: TA handle = 0x%x, RO = 0x%x, ret = 0x%x\n",
-                cmd.ta_handle, arg->ret_origin, arg->ret);
+                load_cmd.ta_handle, arg->ret_origin, arg->ret);
 
        return 0;
 }
index 8a6a8f3..da6b88e 100644 (file)
@@ -59,10 +59,9 @@ static void release_session(struct amdtee_session *sess)
                        continue;
 
                handle_close_session(sess->ta_handle, sess->session_info[i]);
+               handle_unload_ta(sess->ta_handle);
        }
 
-       /* Unload Trusted Application once all sessions are closed */
-       handle_unload_ta(sess->ta_handle);
        kfree(sess);
 }
 
@@ -224,8 +223,6 @@ static void destroy_session(struct kref *ref)
        struct amdtee_session *sess = container_of(ref, struct amdtee_session,
                                                   refcount);
 
-       /* Unload the TA from TEE */
-       handle_unload_ta(sess->ta_handle);
        mutex_lock(&session_list_mutex);
        list_del(&sess->list_node);
        mutex_unlock(&session_list_mutex);
@@ -238,7 +235,7 @@ int amdtee_open_session(struct tee_context *ctx,
 {
        struct amdtee_context_data *ctxdata = ctx->data;
        struct amdtee_session *sess = NULL;
-       u32 session_info;
+       u32 session_info, ta_handle;
        size_t ta_size;
        int rc, i;
        void *ta;
@@ -259,11 +256,14 @@ int amdtee_open_session(struct tee_context *ctx,
        if (arg->ret != TEEC_SUCCESS)
                goto out;
 
+       ta_handle = get_ta_handle(arg->session);
+
        mutex_lock(&session_list_mutex);
        sess = alloc_session(ctxdata, arg->session);
        mutex_unlock(&session_list_mutex);
 
        if (!sess) {
+               handle_unload_ta(ta_handle);
                rc = -ENOMEM;
                goto out;
        }
@@ -277,6 +277,7 @@ int amdtee_open_session(struct tee_context *ctx,
 
        if (i >= TEE_NUM_SESSIONS) {
                pr_err("reached maximum session count %d\n", TEE_NUM_SESSIONS);
+               handle_unload_ta(ta_handle);
                kref_put(&sess->refcount, destroy_session);
                rc = -ENOMEM;
                goto out;
@@ -289,12 +290,13 @@ int amdtee_open_session(struct tee_context *ctx,
                spin_lock(&sess->lock);
                clear_bit(i, sess->sess_mask);
                spin_unlock(&sess->lock);
+               handle_unload_ta(ta_handle);
                kref_put(&sess->refcount, destroy_session);
                goto out;
        }
 
        sess->session_info[i] = session_info;
-       set_session_id(sess->ta_handle, i, &arg->session);
+       set_session_id(ta_handle, i, &arg->session);
 out:
        free_pages((u64)ta, get_order(ta_size));
        return rc;
@@ -329,6 +331,7 @@ int amdtee_close_session(struct tee_context *ctx, u32 session)
 
        /* Close the session */
        handle_close_session(ta_handle, session_info);
+       handle_unload_ta(ta_handle);
 
        kref_put(&sess->refcount, destroy_session);
 
index 8534d6e..3cbc757 100644 (file)
@@ -1519,6 +1519,8 @@ static int __init max310x_uart_init(void)
 
 #ifdef CONFIG_SPI_MASTER
        ret = spi_register_driver(&max310x_spi_driver);
+       if (ret)
+               uart_unregister_driver(&max310x_uart);
 #endif
 
        return ret;
index e0c00a1..51b0eca 100644 (file)
@@ -818,9 +818,6 @@ static int mvebu_uart_probe(struct platform_device *pdev)
                return -EINVAL;
        }
 
-       if (!match)
-               return -ENODEV;
-
        /* Assume that all UART ports have a DT alias or none has */
        id = of_alias_get_id(pdev->dev.of_node, "serial");
        if (!pdev->dev.of_node || id < 0)
index 01645e8..fa1548d 100644 (file)
@@ -1171,7 +1171,7 @@ static inline int resize_screen(struct vc_data *vc, int width, int height,
        /* Resizes the resolution of the display adapater */
        int err = 0;
 
-       if (vc->vc_mode != KD_GRAPHICS && vc->vc_sw->con_resize)
+       if (vc->vc_sw->con_resize)
                err = vc->vc_sw->con_resize(vc, width, height, user);
 
        return err;
index 89aeaf3..0e0cd9e 100644 (file)
@@ -671,21 +671,58 @@ static int vt_resizex(struct vc_data *vc, struct vt_consize __user *cs)
        if (copy_from_user(&v, cs, sizeof(struct vt_consize)))
                return -EFAULT;
 
-       if (v.v_vlin)
-               pr_info_once("\"struct vt_consize\"->v_vlin is ignored. Please report if you need this.\n");
-       if (v.v_clin)
-               pr_info_once("\"struct vt_consize\"->v_clin is ignored. Please report if you need this.\n");
+       /* FIXME: Should check the copies properly */
+       if (!v.v_vlin)
+               v.v_vlin = vc->vc_scan_lines;
+
+       if (v.v_clin) {
+               int rows = v.v_vlin / v.v_clin;
+               if (v.v_rows != rows) {
+                       if (v.v_rows) /* Parameters don't add up */
+                               return -EINVAL;
+                       v.v_rows = rows;
+               }
+       }
+
+       if (v.v_vcol && v.v_ccol) {
+               int cols = v.v_vcol / v.v_ccol;
+               if (v.v_cols != cols) {
+                       if (v.v_cols)
+                               return -EINVAL;
+                       v.v_cols = cols;
+               }
+       }
+
+       if (v.v_clin > 32)
+               return -EINVAL;
 
-       console_lock();
        for (i = 0; i < MAX_NR_CONSOLES; i++) {
-               vc = vc_cons[i].d;
+               struct vc_data *vcp;
 
-               if (vc) {
-                       vc->vc_resize_user = 1;
-                       vc_resize(vc, v.v_cols, v.v_rows);
+               if (!vc_cons[i].d)
+                       continue;
+               console_lock();
+               vcp = vc_cons[i].d;
+               if (vcp) {
+                       int ret;
+                       int save_scan_lines = vcp->vc_scan_lines;
+                       int save_cell_height = vcp->vc_cell_height;
+
+                       if (v.v_vlin)
+                               vcp->vc_scan_lines = v.v_vlin;
+                       if (v.v_clin)
+                               vcp->vc_cell_height = v.v_clin;
+                       vcp->vc_resize_user = 1;
+                       ret = vc_resize(vcp, v.v_cols, v.v_rows);
+                       if (ret) {
+                               vcp->vc_scan_lines = save_scan_lines;
+                               vcp->vc_cell_height = save_cell_height;
+                               console_unlock();
+                               return ret;
+                       }
                }
+               console_unlock();
        }
-       console_unlock();
 
        return 0;
 }
index 0330ba9..652fe25 100644 (file)
@@ -291,13 +291,15 @@ hv_uio_probe(struct hv_device *dev,
        pdata->recv_buf = vzalloc(RECV_BUFFER_SIZE);
        if (pdata->recv_buf == NULL) {
                ret = -ENOMEM;
-               goto fail_close;
+               goto fail_free_ring;
        }
 
        ret = vmbus_establish_gpadl(channel, pdata->recv_buf,
                                    RECV_BUFFER_SIZE, &pdata->recv_gpadl);
-       if (ret)
+       if (ret) {
+               vfree(pdata->recv_buf);
                goto fail_close;
+       }
 
        /* put Global Physical Address Label in name */
        snprintf(pdata->recv_name, sizeof(pdata->recv_name),
@@ -316,8 +318,10 @@ hv_uio_probe(struct hv_device *dev,
 
        ret = vmbus_establish_gpadl(channel, pdata->send_buf,
                                    SEND_BUFFER_SIZE, &pdata->send_gpadl);
-       if (ret)
+       if (ret) {
+               vfree(pdata->send_buf);
                goto fail_close;
+       }
 
        snprintf(pdata->send_name, sizeof(pdata->send_name),
                 "send:%u", pdata->send_gpadl);
@@ -347,6 +351,8 @@ hv_uio_probe(struct hv_device *dev,
 
 fail_close:
        hv_uio_cleanup(dev, pdata);
+fail_free_ring:
+       vmbus_free_ring(dev->channel);
 
        return ret;
 }
index c7d681f..3bb0b00 100644 (file)
@@ -82,7 +82,7 @@ static int probe(struct pci_dev *pdev,
        }
 
        if (pdev->irq && !pci_intx_mask_supported(pdev))
-               return -ENOMEM;
+               return -ENODEV;
 
        gdev = devm_kzalloc(&pdev->dev, sizeof(struct uio_pci_generic_dev), GFP_KERNEL);
        if (!gdev)
index 508b1c3..d1e4a73 100644 (file)
@@ -321,12 +321,23 @@ exit:
 
 }
 
-static void kill_urbs(struct wdm_device *desc)
+static void poison_urbs(struct wdm_device *desc)
 {
        /* the order here is essential */
-       usb_kill_urb(desc->command);
-       usb_kill_urb(desc->validity);
-       usb_kill_urb(desc->response);
+       usb_poison_urb(desc->command);
+       usb_poison_urb(desc->validity);
+       usb_poison_urb(desc->response);
+}
+
+static void unpoison_urbs(struct wdm_device *desc)
+{
+       /*
+        *  the order here is not essential
+        *  it is symmetrical just to be nice
+        */
+       usb_unpoison_urb(desc->response);
+       usb_unpoison_urb(desc->validity);
+       usb_unpoison_urb(desc->command);
 }
 
 static void free_urbs(struct wdm_device *desc)
@@ -741,11 +752,12 @@ static int wdm_release(struct inode *inode, struct file *file)
        if (!desc->count) {
                if (!test_bit(WDM_DISCONNECTING, &desc->flags)) {
                        dev_dbg(&desc->intf->dev, "wdm_release: cleanup\n");
-                       kill_urbs(desc);
+                       poison_urbs(desc);
                        spin_lock_irq(&desc->iuspin);
                        desc->resp_count = 0;
                        spin_unlock_irq(&desc->iuspin);
                        desc->manage_power(desc->intf, 0);
+                       unpoison_urbs(desc);
                } else {
                        /* must avoid dev_printk here as desc->intf is invalid */
                        pr_debug(KBUILD_MODNAME " %s: device gone - cleaning up\n", __func__);
@@ -1037,9 +1049,9 @@ static void wdm_disconnect(struct usb_interface *intf)
        wake_up_all(&desc->wait);
        mutex_lock(&desc->rlock);
        mutex_lock(&desc->wlock);
+       poison_urbs(desc);
        cancel_work_sync(&desc->rxwork);
        cancel_work_sync(&desc->service_outs_intr);
-       kill_urbs(desc);
        mutex_unlock(&desc->wlock);
        mutex_unlock(&desc->rlock);
 
@@ -1080,9 +1092,10 @@ static int wdm_suspend(struct usb_interface *intf, pm_message_t message)
                set_bit(WDM_SUSPENDING, &desc->flags);
                spin_unlock_irq(&desc->iuspin);
                /* callback submits work - order is essential */
-               kill_urbs(desc);
+               poison_urbs(desc);
                cancel_work_sync(&desc->rxwork);
                cancel_work_sync(&desc->service_outs_intr);
+               unpoison_urbs(desc);
        }
        if (!PMSG_IS_AUTO(message)) {
                mutex_unlock(&desc->wlock);
@@ -1140,7 +1153,7 @@ static int wdm_pre_reset(struct usb_interface *intf)
        wake_up_all(&desc->wait);
        mutex_lock(&desc->rlock);
        mutex_lock(&desc->wlock);
-       kill_urbs(desc);
+       poison_urbs(desc);
        cancel_work_sync(&desc->rxwork);
        cancel_work_sync(&desc->service_outs_intr);
        return 0;
@@ -1151,6 +1164,7 @@ static int wdm_post_reset(struct usb_interface *intf)
        struct wdm_device *desc = wdm_find_device(intf);
        int rv;
 
+       unpoison_urbs(desc);
        clear_bit(WDM_OVERFLOW, &desc->flags);
        clear_bit(WDM_RESETTING, &desc->flags);
        rv = recover_from_urb_loss(desc);
index b2bc4b7..fc7d6cd 100644 (file)
@@ -3642,9 +3642,6 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg)
                 * sequence.
                 */
                status = hub_port_status(hub, port1, &portstatus, &portchange);
-
-               /* TRSMRCY = 10 msec */
-               msleep(10);
        }
 
  SuspendCleared:
@@ -3659,6 +3656,9 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg)
                                usb_clear_port_feature(hub->hdev, port1,
                                                USB_PORT_FEAT_C_SUSPEND);
                }
+
+               /* TRSMRCY = 10 msec */
+               msleep(10);
        }
 
        if (udev->persist_enabled)
index da5ac4a..ab6b815 100644 (file)
@@ -113,6 +113,7 @@ struct dwc2_hsotg_req;
  * @debugfs: File entry for debugfs file for this endpoint.
  * @dir_in: Set to true if this endpoint is of the IN direction, which
  *          means that it is sending data to the Host.
+ * @map_dir: Set to the value of dir_in when the DMA buffer is mapped.
  * @index: The index for the endpoint registers.
  * @mc: Multi Count - number of transactions per microframe
  * @interval: Interval for periodic endpoints, in frames or microframes.
@@ -162,6 +163,7 @@ struct dwc2_hsotg_ep {
        unsigned short          fifo_index;
 
        unsigned char           dir_in;
+       unsigned char           map_dir;
        unsigned char           index;
        unsigned char           mc;
        u16                     interval;
index e6bb1bd..1849641 100644 (file)
@@ -422,7 +422,7 @@ static void dwc2_hsotg_unmap_dma(struct dwc2_hsotg *hsotg,
 {
        struct usb_request *req = &hs_req->req;
 
-       usb_gadget_unmap_request(&hsotg->gadget, req, hs_ep->dir_in);
+       usb_gadget_unmap_request(&hsotg->gadget, req, hs_ep->map_dir);
 }
 
 /*
@@ -1242,6 +1242,7 @@ static int dwc2_hsotg_map_dma(struct dwc2_hsotg *hsotg,
 {
        int ret;
 
+       hs_ep->map_dir = hs_ep->dir_in;
        ret = usb_gadget_map_request(&hsotg->gadget, req, hs_ep->dir_in);
        if (ret)
                goto dma_error;
index 3024785..520a0be 100644 (file)
@@ -776,7 +776,3 @@ static struct platform_driver dwc2_platform_driver = {
 };
 
 module_platform_driver(dwc2_platform_driver);
-
-MODULE_DESCRIPTION("DESIGNWARE HS OTG Platform Glue");
-MODULE_AUTHOR("Matthijs Kooijman <matthijs@stdin.nl>");
-MODULE_LICENSE("Dual BSD/GPL");
index b1e875c..c5d5760 100644 (file)
@@ -57,7 +57,7 @@
 #define DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE   3
 #define DWC3_DEVICE_EVENT_WAKEUP               4
 #define DWC3_DEVICE_EVENT_HIBER_REQ            5
-#define DWC3_DEVICE_EVENT_EOPF                 6
+#define DWC3_DEVICE_EVENT_SUSPEND              6
 #define DWC3_DEVICE_EVENT_SOF                  7
 #define DWC3_DEVICE_EVENT_ERRATIC_ERROR                9
 #define DWC3_DEVICE_EVENT_CMD_CMPL             10
 #define DWC3_DEVTEN_CMDCMPLTEN         BIT(10)
 #define DWC3_DEVTEN_ERRTICERREN                BIT(9)
 #define DWC3_DEVTEN_SOFEN              BIT(7)
-#define DWC3_DEVTEN_EOPFEN             BIT(6)
+#define DWC3_DEVTEN_U3L2L1SUSPEN       BIT(6)
 #define DWC3_DEVTEN_HIBERNATIONREQEVTEN        BIT(5)
 #define DWC3_DEVTEN_WKUPEVTEN          BIT(4)
 #define DWC3_DEVTEN_ULSTCNGEN          BIT(3)
@@ -850,6 +850,7 @@ struct dwc3_trb {
  * @hwparams6: GHWPARAMS6
  * @hwparams7: GHWPARAMS7
  * @hwparams8: GHWPARAMS8
+ * @hwparams9: GHWPARAMS9
  */
 struct dwc3_hwparams {
        u32     hwparams0;
@@ -1374,7 +1375,7 @@ struct dwc3_event_depevt {
  *     3       - ULStChng
  *     4       - WkUpEvt
  *     5       - Reserved
- *     6       - EOPF
+ *     6       - Suspend (EOPF on revisions 2.10a and prior)
  *     7       - SOF
  *     8       - Reserved
  *     9       - ErrticErr
index db231de..d0ac89c 100644 (file)
@@ -221,8 +221,8 @@ static inline const char *dwc3_gadget_event_string(char *str, size_t size,
                snprintf(str, size, "WakeUp [%s]",
                                dwc3_gadget_link_string(state));
                break;
-       case DWC3_DEVICE_EVENT_EOPF:
-               snprintf(str, size, "End-Of-Frame [%s]",
+       case DWC3_DEVICE_EVENT_SUSPEND:
+               snprintf(str, size, "Suspend [%s]",
                                dwc3_gadget_link_string(state));
                break;
        case DWC3_DEVICE_EVENT_SOF:
@@ -353,8 +353,8 @@ static inline const char *dwc3_gadget_event_type_string(u8 event)
                return "Wake-Up";
        case DWC3_DEVICE_EVENT_HIBER_REQ:
                return "Hibernation";
-       case DWC3_DEVICE_EVENT_EOPF:
-               return "End of Periodic Frame";
+       case DWC3_DEVICE_EVENT_SUSPEND:
+               return "Suspend";
        case DWC3_DEVICE_EVENT_SOF:
                return "Start of Frame";
        case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
index b13cfab..756faa4 100644 (file)
@@ -165,8 +165,9 @@ static int dwc3_imx8mp_probe(struct platform_device *pdev)
        if (err < 0)
                goto disable_rpm;
 
-       dwc3_np = of_get_child_by_name(node, "dwc3");
+       dwc3_np = of_get_compatible_child(node, "snps,dwc3");
        if (!dwc3_np) {
+               err = -ENODEV;
                dev_err(dev, "failed to find dwc3 core child\n");
                goto disable_rpm;
        }
index 3db1780..e196673 100644 (file)
@@ -437,8 +437,13 @@ static int dwc3_omap_extcon_register(struct dwc3_omap *omap)
 
                if (extcon_get_state(edev, EXTCON_USB) == true)
                        dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_VALID);
+               else
+                       dwc3_omap_set_mailbox(omap, OMAP_DWC3_VBUS_OFF);
+
                if (extcon_get_state(edev, EXTCON_USB_HOST) == true)
                        dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_GROUND);
+               else
+                       dwc3_omap_set_mailbox(omap, OMAP_DWC3_ID_FLOAT);
 
                omap->edev = edev;
        }
index e7b932d..1e51460 100644 (file)
@@ -123,6 +123,7 @@ static const struct property_entry dwc3_pci_mrfld_properties[] = {
        PROPERTY_ENTRY_STRING("linux,extcon-name", "mrfld_bcove_pwrsrc"),
        PROPERTY_ENTRY_BOOL("snps,dis_u3_susphy_quirk"),
        PROPERTY_ENTRY_BOOL("snps,dis_u2_susphy_quirk"),
+       PROPERTY_ENTRY_BOOL("snps,usb2-gadget-lpm-disable"),
        PROPERTY_ENTRY_BOOL("linux,sysdev_is_parent"),
        {}
 };
index dd80e5c..49ca5da 100644 (file)
@@ -1684,7 +1684,9 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
                }
        }
 
-       return __dwc3_gadget_kick_transfer(dep);
+       __dwc3_gadget_kick_transfer(dep);
+
+       return 0;
 }
 
 static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request,
@@ -2323,6 +2325,10 @@ static void dwc3_gadget_enable_irq(struct dwc3 *dwc)
        if (DWC3_VER_IS_PRIOR(DWC3, 250A))
                reg |= DWC3_DEVTEN_ULSTCNGEN;
 
+       /* On 2.30a and above this bit enables U3/L2-L1 Suspend Events */
+       if (!DWC3_VER_IS_PRIOR(DWC3, 230A))
+               reg |= DWC3_DEVTEN_U3L2L1SUSPEN;
+
        dwc3_writel(dwc->regs, DWC3_DEVTEN, reg);
 }
 
@@ -3740,7 +3746,7 @@ static void dwc3_gadget_interrupt(struct dwc3 *dwc,
        case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
                dwc3_gadget_linksts_change_interrupt(dwc, event->event_info);
                break;
-       case DWC3_DEVICE_EVENT_EOPF:
+       case DWC3_DEVICE_EVENT_SUSPEND:
                /* It changed to be suspend event for version 2.30a and above */
                if (!DWC3_VER_IS_PRIOR(DWC3, 230A)) {
                        /*
@@ -4058,8 +4064,9 @@ err0:
 
 void dwc3_gadget_exit(struct dwc3 *dwc)
 {
-       usb_del_gadget_udc(dwc->gadget);
+       usb_del_gadget(dwc->gadget);
        dwc3_gadget_free_endpoints(dwc);
+       usb_put_gadget(dwc->gadget);
        dma_free_coherent(dwc->sysdev, DWC3_BOUNCE_SIZE, dwc->bounce,
                          dwc->bounce_addr);
        kfree(dwc->setup_buf);
index 6cac642..9c2eda0 100644 (file)
@@ -5568,7 +5568,7 @@ static int fotg210_hcd_probe(struct platform_device *pdev)
        struct usb_hcd *hcd;
        struct resource *res;
        int irq;
-       int retval = -ENODEV;
+       int retval;
        struct fotg210_hcd *fotg210;
 
        if (usb_disabled())
@@ -5588,7 +5588,7 @@ static int fotg210_hcd_probe(struct platform_device *pdev)
        hcd = usb_create_hcd(&fotg210_fotg210_hc_driver, dev,
                        dev_name(dev));
        if (!hcd) {
-               dev_err(dev, "failed to create hcd with err %d\n", retval);
+               dev_err(dev, "failed to create hcd\n");
                retval = -ENOMEM;
                goto fail_create_hcd;
        }
index fa59b24..e8af0a1 100644 (file)
@@ -7,8 +7,9 @@
  * Author: Sarah Sharp
  * Some code borrowed from the Linux EHCI driver.
  */
-/* Up to 16 ms to halt an HC */
-#define XHCI_MAX_HALT_USEC     (16*1000)
+
+/* HC should halt within 16 ms, but use 32 ms as some hosts take longer */
+#define XHCI_MAX_HALT_USEC     (32 * 1000)
 /* HC not running - set to 1 when run/stop bit is cleared. */
 #define XHCI_STS_HALT          (1<<0)
 
index 5bbccc9..7bc18cf 100644 (file)
@@ -57,6 +57,7 @@
 #define PCI_DEVICE_ID_INTEL_CML_XHCI                   0xa3af
 #define PCI_DEVICE_ID_INTEL_TIGER_LAKE_XHCI            0x9a13
 #define PCI_DEVICE_ID_INTEL_MAPLE_RIDGE_XHCI           0x1138
+#define PCI_DEVICE_ID_INTEL_ALDER_LAKE_XHCI            0x461e
 
 #define PCI_DEVICE_ID_AMD_PROMONTORYA_4                        0x43b9
 #define PCI_DEVICE_ID_AMD_PROMONTORYA_3                        0x43ba
@@ -166,8 +167,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
            (pdev->device == 0x15e0 || pdev->device == 0x15e1))
                xhci->quirks |= XHCI_SNPS_BROKEN_SUSPEND;
 
-       if (pdev->vendor == PCI_VENDOR_ID_AMD && pdev->device == 0x15e5)
+       if (pdev->vendor == PCI_VENDOR_ID_AMD && pdev->device == 0x15e5) {
                xhci->quirks |= XHCI_DISABLE_SPARSE;
+               xhci->quirks |= XHCI_RESET_ON_RESUME;
+       }
 
        if (pdev->vendor == PCI_VENDOR_ID_AMD)
                xhci->quirks |= XHCI_TRUST_TX_LENGTH;
@@ -243,7 +246,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
             pdev->device == PCI_DEVICE_ID_INTEL_TITAN_RIDGE_DD_XHCI ||
             pdev->device == PCI_DEVICE_ID_INTEL_ICE_LAKE_XHCI ||
             pdev->device == PCI_DEVICE_ID_INTEL_TIGER_LAKE_XHCI ||
-            pdev->device == PCI_DEVICE_ID_INTEL_MAPLE_RIDGE_XHCI))
+            pdev->device == PCI_DEVICE_ID_INTEL_MAPLE_RIDGE_XHCI ||
+            pdev->device == PCI_DEVICE_ID_INTEL_ALDER_LAKE_XHCI))
                xhci->quirks |= XHCI_DEFAULT_PM_RUNTIME_ALLOW;
 
        if (pdev->vendor == PCI_VENDOR_ID_ETRON &&
index 05c38dd..a8e4189 100644 (file)
@@ -862,7 +862,7 @@ done:
        return ret;
 }
 
-static void xhci_handle_halted_endpoint(struct xhci_hcd *xhci,
+static int xhci_handle_halted_endpoint(struct xhci_hcd *xhci,
                                struct xhci_virt_ep *ep, unsigned int stream_id,
                                struct xhci_td *td,
                                enum xhci_ep_reset_type reset_type)
@@ -875,7 +875,7 @@ static void xhci_handle_halted_endpoint(struct xhci_hcd *xhci,
         * Device will be reset soon to recover the link so don't do anything
         */
        if (ep->vdev->flags & VDEV_PORT_ERROR)
-               return;
+               return -ENODEV;
 
        /* add td to cancelled list and let reset ep handler take care of it */
        if (reset_type == EP_HARD_RESET) {
@@ -888,16 +888,18 @@ static void xhci_handle_halted_endpoint(struct xhci_hcd *xhci,
 
        if (ep->ep_state & EP_HALTED) {
                xhci_dbg(xhci, "Reset ep command already pending\n");
-               return;
+               return 0;
        }
 
        err = xhci_reset_halted_ep(xhci, slot_id, ep->ep_index, reset_type);
        if (err)
-               return;
+               return err;
 
        ep->ep_state |= EP_HALTED;
 
        xhci_ring_cmd_db(xhci);
+
+       return 0;
 }
 
 /*
@@ -1014,6 +1016,7 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id,
        struct xhci_td *td = NULL;
        enum xhci_ep_reset_type reset_type;
        struct xhci_command *command;
+       int err;
 
        if (unlikely(TRB_TO_SUSPEND_PORT(le32_to_cpu(trb->generic.field[3])))) {
                if (!xhci->devs[slot_id])
@@ -1058,7 +1061,10 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id,
                                        td->status = -EPROTO;
                        }
                        /* reset ep, reset handler cleans up cancelled tds */
-                       xhci_handle_halted_endpoint(xhci, ep, 0, td, reset_type);
+                       err = xhci_handle_halted_endpoint(xhci, ep, 0, td,
+                                                         reset_type);
+                       if (err)
+                               break;
                        xhci_stop_watchdog_timer_in_irq(xhci, ep);
                        return;
                case EP_STATE_RUNNING:
index ca9385d..2728365 100644 (file)
@@ -1514,7 +1514,7 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci,
  * we need to issue an evaluate context command and wait on it.
  */
 static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id,
-               unsigned int ep_index, struct urb *urb)
+               unsigned int ep_index, struct urb *urb, gfp_t mem_flags)
 {
        struct xhci_container_ctx *out_ctx;
        struct xhci_input_control_ctx *ctrl_ctx;
@@ -1545,7 +1545,7 @@ static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id,
                 * changes max packet sizes.
                 */
 
-               command = xhci_alloc_command(xhci, true, GFP_KERNEL);
+               command = xhci_alloc_command(xhci, true, mem_flags);
                if (!command)
                        return -ENOMEM;
 
@@ -1639,7 +1639,7 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flag
                 */
                if (urb->dev->speed == USB_SPEED_FULL) {
                        ret = xhci_check_maxpacket(xhci, slot_id,
-                                       ep_index, urb);
+                                       ep_index, urb, mem_flags);
                        if (ret < 0) {
                                xhci_urb_free_priv(urb_priv);
                                urb->hcpriv = NULL;
index eebeadd..6b92d03 100644 (file)
@@ -518,8 +518,8 @@ static int mtk_musb_probe(struct platform_device *pdev)
 
        glue->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
        if (IS_ERR(glue->xceiv)) {
-               dev_err(dev, "fail to getting usb-phy %d\n", ret);
                ret = PTR_ERR(glue->xceiv);
+               dev_err(dev, "fail to getting usb-phy %d\n", ret);
                goto err_unregister_usb_phy;
        }
 
index c4fdc00..64133e5 100644 (file)
@@ -259,6 +259,7 @@ enum frs_typec_current {
 #define ALTMODE_DISCOVERY_MAX  (SVID_DISCOVERY_MAX * MODE_DISCOVERY_MAX)
 
 #define GET_SINK_CAP_RETRY_MS  100
+#define SEND_DISCOVER_RETRY_MS 100
 
 struct pd_mode_data {
        int svid_index;         /* current SVID index           */
@@ -366,6 +367,8 @@ struct tcpm_port {
        struct kthread_work vdm_state_machine;
        struct hrtimer enable_frs_timer;
        struct kthread_work enable_frs;
+       struct hrtimer send_discover_timer;
+       struct kthread_work send_discover_work;
        bool state_machine_running;
        bool vdm_sm_running;
 
@@ -1178,6 +1181,16 @@ static void mod_enable_frs_delayed_work(struct tcpm_port *port, unsigned int del
        }
 }
 
+static void mod_send_discover_delayed_work(struct tcpm_port *port, unsigned int delay_ms)
+{
+       if (delay_ms) {
+               hrtimer_start(&port->send_discover_timer, ms_to_ktime(delay_ms), HRTIMER_MODE_REL);
+       } else {
+               hrtimer_cancel(&port->send_discover_timer);
+               kthread_queue_work(port->wq, &port->send_discover_work);
+       }
+}
+
 static void tcpm_set_state(struct tcpm_port *port, enum tcpm_state state,
                           unsigned int delay_ms)
 {
@@ -1855,6 +1868,9 @@ static void vdm_run_state_machine(struct tcpm_port *port)
                                res = tcpm_ams_start(port, DISCOVER_IDENTITY);
                                if (res == 0)
                                        port->send_discover = false;
+                               else if (res == -EAGAIN)
+                                       mod_send_discover_delayed_work(port,
+                                                                      SEND_DISCOVER_RETRY_MS);
                                break;
                        case CMD_DISCOVER_SVID:
                                res = tcpm_ams_start(port, DISCOVER_SVIDS);
@@ -1880,7 +1896,7 @@ static void vdm_run_state_machine(struct tcpm_port *port)
                        }
 
                        if (res < 0) {
-                               port->vdm_sm_running = false;
+                               port->vdm_state = VDM_STATE_ERR_BUSY;
                                return;
                        }
                }
@@ -1896,6 +1912,7 @@ static void vdm_run_state_machine(struct tcpm_port *port)
                port->vdo_data[0] = port->vdo_retry;
                port->vdo_count = 1;
                port->vdm_state = VDM_STATE_READY;
+               tcpm_ams_finish(port);
                break;
        case VDM_STATE_BUSY:
                port->vdm_state = VDM_STATE_ERR_TMOUT;
@@ -1961,7 +1978,7 @@ static void vdm_state_machine_work(struct kthread_work *work)
                 port->vdm_state != VDM_STATE_BUSY &&
                 port->vdm_state != VDM_STATE_SEND_MESSAGE);
 
-       if (port->vdm_state == VDM_STATE_ERR_TMOUT)
+       if (port->vdm_state < VDM_STATE_READY)
                port->vdm_sm_running = false;
 
        mutex_unlock(&port->lock);
@@ -2390,7 +2407,7 @@ static void tcpm_pd_data_request(struct tcpm_port *port,
                port->nr_sink_caps = cnt;
                port->sink_cap_done = true;
                if (port->ams == GET_SINK_CAPABILITIES)
-                       tcpm_pd_handle_state(port, ready_state(port), NONE_AMS, 0);
+                       tcpm_set_state(port, ready_state(port), 0);
                /* Unexpected Sink Capabilities */
                else
                        tcpm_pd_handle_msg(port,
@@ -2552,6 +2569,16 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
                        port->sink_cap_done = true;
                        tcpm_set_state(port, ready_state(port), 0);
                        break;
+               case SRC_READY:
+               case SNK_READY:
+                       if (port->vdm_state > VDM_STATE_READY) {
+                               port->vdm_state = VDM_STATE_DONE;
+                               if (tcpm_vdm_ams(port))
+                                       tcpm_ams_finish(port);
+                               mod_vdm_delayed_work(port, 0);
+                               break;
+                       }
+                       fallthrough;
                default:
                        tcpm_pd_handle_state(port,
                                             port->pwr_role == TYPEC_SOURCE ?
@@ -3682,14 +3709,6 @@ static inline enum tcpm_state unattached_state(struct tcpm_port *port)
        return SNK_UNATTACHED;
 }
 
-static void tcpm_check_send_discover(struct tcpm_port *port)
-{
-       if ((port->data_role == TYPEC_HOST || port->negotiated_rev > PD_REV20) &&
-           port->send_discover && port->pd_capable)
-               tcpm_send_vdm(port, USB_SID_PD, CMD_DISCOVER_IDENT, NULL, 0);
-       port->send_discover = false;
-}
-
 static void tcpm_swap_complete(struct tcpm_port *port, int result)
 {
        if (port->swap_pending) {
@@ -3926,7 +3945,18 @@ static void run_state_machine(struct tcpm_port *port)
                        break;
                }
 
-               tcpm_check_send_discover(port);
+               /*
+                * 6.4.4.3.1 Discover Identity
+                * "The Discover Identity Command Shall only be sent to SOP when there is an
+                * Explicit Contract."
+                * For now, this driver only supports SOP for DISCOVER_IDENTITY, thus using
+                * port->explicit_contract to decide whether to send the command.
+                */
+               if (port->explicit_contract)
+                       mod_send_discover_delayed_work(port, 0);
+               else
+                       port->send_discover = false;
+
                /*
                 * 6.3.5
                 * Sending ping messages is not necessary if
@@ -4055,7 +4085,7 @@ static void run_state_machine(struct tcpm_port *port)
                if (port->vbus_present) {
                        u32 current_lim = tcpm_get_current_limit(port);
 
-                       if (port->slow_charger_loop || (current_lim > PD_P_SNK_STDBY_MW / 5))
+                       if (port->slow_charger_loop && (current_lim > PD_P_SNK_STDBY_MW / 5))
                                current_lim = PD_P_SNK_STDBY_MW / 5;
                        tcpm_set_current_limit(port, current_lim, 5000);
                        tcpm_set_charge(port, true);
@@ -4194,7 +4224,18 @@ static void run_state_machine(struct tcpm_port *port)
                        break;
                }
 
-               tcpm_check_send_discover(port);
+               /*
+                * 6.4.4.3.1 Discover Identity
+                * "The Discover Identity Command Shall only be sent to SOP when there is an
+                * Explicit Contract."
+                * For now, this driver only supports SOP for DISCOVER_IDENTITY, thus using
+                * port->explicit_contract.
+                */
+               if (port->explicit_contract)
+                       mod_send_discover_delayed_work(port, 0);
+               else
+                       port->send_discover = false;
+
                power_supply_changed(port->psy);
                break;
 
@@ -5288,6 +5329,29 @@ unlock:
        mutex_unlock(&port->lock);
 }
 
+static void tcpm_send_discover_work(struct kthread_work *work)
+{
+       struct tcpm_port *port = container_of(work, struct tcpm_port, send_discover_work);
+
+       mutex_lock(&port->lock);
+       /* No need to send DISCOVER_IDENTITY anymore */
+       if (!port->send_discover)
+               goto unlock;
+
+       /* Retry if the port is not idle */
+       if ((port->state != SRC_READY && port->state != SNK_READY) || port->vdm_sm_running) {
+               mod_send_discover_delayed_work(port, SEND_DISCOVER_RETRY_MS);
+               goto unlock;
+       }
+
+       /* Only send the Message if the port is host for PD rev2.0 */
+       if (port->data_role == TYPEC_HOST || port->negotiated_rev > PD_REV20)
+               tcpm_send_vdm(port, USB_SID_PD, CMD_DISCOVER_IDENT, NULL, 0);
+
+unlock:
+       mutex_unlock(&port->lock);
+}
+
 static int tcpm_dr_set(struct typec_port *p, enum typec_data_role data)
 {
        struct tcpm_port *port = typec_get_drvdata(p);
@@ -5754,6 +5818,15 @@ static int tcpm_fw_get_caps(struct tcpm_port *port,
        if (!fwnode)
                return -EINVAL;
 
+       /*
+        * This fwnode has a "compatible" property, but is never populated as a
+        * struct device. Instead we simply parse it to read the properties.
+        * This it breaks fw_devlink=on. To maintain backward compatibility
+        * with existing DT files, we work around this by deleting any
+        * fwnode_links to/from this fwnode.
+        */
+       fw_devlink_purge_absent_suppliers(fwnode);
+
        /* USB data support is optional */
        ret = fwnode_property_read_string(fwnode, "data-role", &cap_str);
        if (ret == 0) {
@@ -6093,6 +6166,14 @@ static enum hrtimer_restart enable_frs_timer_handler(struct hrtimer *timer)
        return HRTIMER_NORESTART;
 }
 
+static enum hrtimer_restart send_discover_timer_handler(struct hrtimer *timer)
+{
+       struct tcpm_port *port = container_of(timer, struct tcpm_port, send_discover_timer);
+
+       kthread_queue_work(port->wq, &port->send_discover_work);
+       return HRTIMER_NORESTART;
+}
+
 struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
 {
        struct tcpm_port *port;
@@ -6123,12 +6204,15 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
        kthread_init_work(&port->vdm_state_machine, vdm_state_machine_work);
        kthread_init_work(&port->event_work, tcpm_pd_event_handler);
        kthread_init_work(&port->enable_frs, tcpm_enable_frs_work);
+       kthread_init_work(&port->send_discover_work, tcpm_send_discover_work);
        hrtimer_init(&port->state_machine_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
        port->state_machine_timer.function = state_machine_timer_handler;
        hrtimer_init(&port->vdm_state_machine_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
        port->vdm_state_machine_timer.function = vdm_state_machine_timer_handler;
        hrtimer_init(&port->enable_frs_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
        port->enable_frs_timer.function = enable_frs_timer_handler;
+       hrtimer_init(&port->send_discover_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+       port->send_discover_timer.function = send_discover_timer_handler;
 
        spin_lock_init(&port->pd_event_lock);
 
index 282c3c8..1d8b7df 100644 (file)
@@ -495,7 +495,8 @@ static void ucsi_unregister_altmodes(struct ucsi_connector *con, u8 recipient)
        }
 }
 
-static void ucsi_get_pdos(struct ucsi_connector *con, int is_partner)
+static int ucsi_get_pdos(struct ucsi_connector *con, int is_partner,
+                        u32 *pdos, int offset, int num_pdos)
 {
        struct ucsi *ucsi = con->ucsi;
        u64 command;
@@ -503,17 +504,39 @@ static void ucsi_get_pdos(struct ucsi_connector *con, int is_partner)
 
        command = UCSI_COMMAND(UCSI_GET_PDOS) | UCSI_CONNECTOR_NUMBER(con->num);
        command |= UCSI_GET_PDOS_PARTNER_PDO(is_partner);
-       command |= UCSI_GET_PDOS_NUM_PDOS(UCSI_MAX_PDOS - 1);
+       command |= UCSI_GET_PDOS_PDO_OFFSET(offset);
+       command |= UCSI_GET_PDOS_NUM_PDOS(num_pdos - 1);
        command |= UCSI_GET_PDOS_SRC_PDOS;
-       ret = ucsi_send_command(ucsi, command, con->src_pdos,
-                              sizeof(con->src_pdos));
-       if (ret < 0) {
+       ret = ucsi_send_command(ucsi, command, pdos + offset,
+                               num_pdos * sizeof(u32));
+       if (ret < 0)
                dev_err(ucsi->dev, "UCSI_GET_PDOS failed (%d)\n", ret);
+       if (ret == 0 && offset == 0)
+               dev_warn(ucsi->dev, "UCSI_GET_PDOS returned 0 bytes\n");
+
+       return ret;
+}
+
+static void ucsi_get_src_pdos(struct ucsi_connector *con, int is_partner)
+{
+       int ret;
+
+       /* UCSI max payload means only getting at most 4 PDOs at a time */
+       ret = ucsi_get_pdos(con, 1, con->src_pdos, 0, UCSI_MAX_PDOS);
+       if (ret < 0)
                return;
-       }
+
        con->num_pdos = ret / sizeof(u32); /* number of bytes to 32-bit PDOs */
-       if (ret == 0)
-               dev_warn(ucsi->dev, "UCSI_GET_PDOS returned 0 bytes\n");
+       if (con->num_pdos < UCSI_MAX_PDOS)
+               return;
+
+       /* get the remaining PDOs, if any */
+       ret = ucsi_get_pdos(con, 1, con->src_pdos, UCSI_MAX_PDOS,
+                           PDO_MAX_OBJECTS - UCSI_MAX_PDOS);
+       if (ret < 0)
+               return;
+
+       con->num_pdos += ret / sizeof(u32);
 }
 
 static void ucsi_pwr_opmode_change(struct ucsi_connector *con)
@@ -522,7 +545,7 @@ static void ucsi_pwr_opmode_change(struct ucsi_connector *con)
        case UCSI_CONSTAT_PWR_OPMODE_PD:
                con->rdo = con->status.request_data_obj;
                typec_set_pwr_opmode(con->port, TYPEC_PWR_MODE_PD);
-               ucsi_get_pdos(con, 1);
+               ucsi_get_src_pdos(con, 1);
                break;
        case UCSI_CONSTAT_PWR_OPMODE_TYPEC1_5:
                con->rdo = 0;
@@ -999,6 +1022,7 @@ static const struct typec_operations ucsi_ops = {
        .pr_set = ucsi_pr_swap
 };
 
+/* Caller must call fwnode_handle_put() after use */
 static struct fwnode_handle *ucsi_find_fwnode(struct ucsi_connector *con)
 {
        struct fwnode_handle *fwnode;
@@ -1033,7 +1057,7 @@ static int ucsi_register_port(struct ucsi *ucsi, int index)
        command |= UCSI_CONNECTOR_NUMBER(con->num);
        ret = ucsi_send_command(ucsi, command, &con->cap, sizeof(con->cap));
        if (ret < 0)
-               goto out;
+               goto out_unlock;
 
        if (con->cap.op_mode & UCSI_CONCAP_OPMODE_DRP)
                cap->data = TYPEC_PORT_DRD;
@@ -1151,6 +1175,8 @@ static int ucsi_register_port(struct ucsi *ucsi, int index)
        trace_ucsi_register_port(con->num, &con->status);
 
 out:
+       fwnode_handle_put(cap->fwnode);
+out_unlock:
        mutex_unlock(&con->lock);
        return ret;
 }
index 3920e20..cee6667 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/power_supply.h>
 #include <linux/types.h>
 #include <linux/usb/typec.h>
+#include <linux/usb/pd.h>
 #include <linux/usb/role.h>
 
 /* -------------------------------------------------------------------------- */
@@ -134,7 +135,9 @@ void ucsi_connector_change(struct ucsi *ucsi, u8 num);
 
 /* GET_PDOS command bits */
 #define UCSI_GET_PDOS_PARTNER_PDO(_r_)         ((u64)(_r_) << 23)
+#define UCSI_GET_PDOS_PDO_OFFSET(_r_)          ((u64)(_r_) << 24)
 #define UCSI_GET_PDOS_NUM_PDOS(_r_)            ((u64)(_r_) << 32)
+#define UCSI_MAX_PDOS                          (4)
 #define UCSI_GET_PDOS_SRC_PDOS                 ((u64)1 << 34)
 
 /* -------------------------------------------------------------------------- */
@@ -302,7 +305,6 @@ struct ucsi {
 
 #define UCSI_MAX_SVID          5
 #define UCSI_MAX_ALTMODES      (UCSI_MAX_SVID * 6)
-#define UCSI_MAX_PDOS          (4)
 
 #define UCSI_TYPEC_VSAFE5V     5000
 #define UCSI_TYPEC_1_5_CURRENT 1500
@@ -330,7 +332,7 @@ struct ucsi_connector {
        struct power_supply *psy;
        struct power_supply_desc psy_desc;
        u32 rdo;
-       u32 src_pdos[UCSI_MAX_PDOS];
+       u32 src_pdos[PDO_MAX_OBJECTS];
        int num_pdos;
 
        struct usb_role_switch *usb_role_sw;
index 39258f9..ef9c57c 100644 (file)
@@ -380,7 +380,7 @@ static void vgacon_init(struct vc_data *c, int init)
                vc_resize(c, vga_video_num_columns, vga_video_num_lines);
 
        c->vc_scan_lines = vga_scan_lines;
-       c->vc_font.height = vga_video_font_height;
+       c->vc_font.height = c->vc_cell_height = vga_video_font_height;
        c->vc_complement_mask = 0x7700;
        if (vga_512_chars)
                c->vc_hi_font_mask = 0x0800;
@@ -515,32 +515,32 @@ static void vgacon_cursor(struct vc_data *c, int mode)
                switch (CUR_SIZE(c->vc_cursor_type)) {
                case CUR_UNDERLINE:
                        vgacon_set_cursor_size(c->state.x,
-                                              c->vc_font.height -
-                                              (c->vc_font.height <
+                                              c->vc_cell_height -
+                                              (c->vc_cell_height <
                                                10 ? 2 : 3),
-                                              c->vc_font.height -
-                                              (c->vc_font.height <
+                                              c->vc_cell_height -
+                                              (c->vc_cell_height <
                                                10 ? 1 : 2));
                        break;
                case CUR_TWO_THIRDS:
                        vgacon_set_cursor_size(c->state.x,
-                                              c->vc_font.height / 3,
-                                              c->vc_font.height -
-                                              (c->vc_font.height <
+                                              c->vc_cell_height / 3,
+                                              c->vc_cell_height -
+                                              (c->vc_cell_height <
                                                10 ? 1 : 2));
                        break;
                case CUR_LOWER_THIRD:
                        vgacon_set_cursor_size(c->state.x,
-                                              (c->vc_font.height * 2) / 3,
-                                              c->vc_font.height -
-                                              (c->vc_font.height <
+                                              (c->vc_cell_height * 2) / 3,
+                                              c->vc_cell_height -
+                                              (c->vc_cell_height <
                                                10 ? 1 : 2));
                        break;
                case CUR_LOWER_HALF:
                        vgacon_set_cursor_size(c->state.x,
-                                              c->vc_font.height / 2,
-                                              c->vc_font.height -
-                                              (c->vc_font.height <
+                                              c->vc_cell_height / 2,
+                                              c->vc_cell_height -
+                                              (c->vc_cell_height <
                                                10 ? 1 : 2));
                        break;
                case CUR_NONE:
@@ -551,7 +551,7 @@ static void vgacon_cursor(struct vc_data *c, int mode)
                        break;
                default:
                        vgacon_set_cursor_size(c->state.x, 1,
-                                              c->vc_font.height);
+                                              c->vc_cell_height);
                        break;
                }
                break;
@@ -562,13 +562,13 @@ static int vgacon_doresize(struct vc_data *c,
                unsigned int width, unsigned int height)
 {
        unsigned long flags;
-       unsigned int scanlines = height * c->vc_font.height;
+       unsigned int scanlines = height * c->vc_cell_height;
        u8 scanlines_lo = 0, r7 = 0, vsync_end = 0, mode, max_scan;
 
        raw_spin_lock_irqsave(&vga_lock, flags);
 
        vgacon_xres = width * VGA_FONTWIDTH;
-       vgacon_yres = height * c->vc_font.height;
+       vgacon_yres = height * c->vc_cell_height;
        if (vga_video_type >= VIDEO_TYPE_VGAC) {
                outb_p(VGA_CRTC_MAX_SCAN, vga_video_port_reg);
                max_scan = inb_p(vga_video_port_val);
@@ -623,9 +623,9 @@ static int vgacon_doresize(struct vc_data *c,
 static int vgacon_switch(struct vc_data *c)
 {
        int x = c->vc_cols * VGA_FONTWIDTH;
-       int y = c->vc_rows * c->vc_font.height;
+       int y = c->vc_rows * c->vc_cell_height;
        int rows = screen_info.orig_video_lines * vga_default_font_height/
-               c->vc_font.height;
+               c->vc_cell_height;
        /*
         * We need to save screen size here as it's the only way
         * we can spot the screen has been resized and we need to
@@ -1038,7 +1038,7 @@ static int vgacon_adjust_height(struct vc_data *vc, unsigned fontheight)
                                cursor_size_lastto = 0;
                                c->vc_sw->con_cursor(c, CM_DRAW);
                        }
-                       c->vc_font.height = fontheight;
+                       c->vc_font.height = c->vc_cell_height = fontheight;
                        vc_resize(c, 0, rows);  /* Adjust console size */
                }
        }
@@ -1086,12 +1086,20 @@ static int vgacon_resize(struct vc_data *c, unsigned int width,
        if ((width << 1) * height > vga_vram_size)
                return -EINVAL;
 
+       if (user) {
+               /*
+                * Ho ho!  Someone (svgatextmode, eh?) may have reprogrammed
+                * the video mode!  Set the new defaults then and go away.
+                */
+               screen_info.orig_video_cols = width;
+               screen_info.orig_video_lines = height;
+               vga_default_font_height = c->vc_cell_height;
+               return 0;
+       }
        if (width % 2 || width > screen_info.orig_video_cols ||
            height > (screen_info.orig_video_lines * vga_default_font_height)/
-           c->vc_font.height)
-               /* let svgatextmode tinker with video timings and
-                  return success */
-               return (user) ? 0 : -EINVAL;
+           c->vc_cell_height)
+               return -EINVAL;
 
        if (con_is_visible(c) && !vga_is_gfx) /* who knows */
                vgacon_doresize(c, width, height);
index 3406067..22bb389 100644 (file)
@@ -2019,7 +2019,7 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width,
                        return -EINVAL;
 
                pr_debug("resize now %ix%i\n", var.xres, var.yres);
-               if (con_is_visible(vc)) {
+               if (con_is_visible(vc) && vc->vc_mode == KD_TEXT) {
                        var.activate = FB_ACTIVATE_NOW |
                                FB_ACTIVATE_FORCE;
                        fb_set_var(info, &var);
index 8bbac71..cc8e62a 100644 (file)
@@ -286,7 +286,7 @@ static int hga_card_detect(void)
 
        hga_vram = ioremap(0xb0000, hga_vram_len);
        if (!hga_vram)
-               goto error;
+               return -ENOMEM;
 
        if (request_region(0x3b0, 12, "hgafb"))
                release_io_ports = 1;
@@ -346,13 +346,18 @@ static int hga_card_detect(void)
                        hga_type_name = "Hercules";
                        break;
        }
-       return 1;
+       return 0;
 error:
        if (release_io_ports)
                release_region(0x3b0, 12);
        if (release_io_port)
                release_region(0x3bf, 1);
-       return 0;
+
+       iounmap(hga_vram);
+
+       pr_err("hgafb: HGA card not detected.\n");
+
+       return -EINVAL;
 }
 
 /**
@@ -550,13 +555,11 @@ static const struct fb_ops hgafb_ops = {
 static int hgafb_probe(struct platform_device *pdev)
 {
        struct fb_info *info;
+       int ret;
 
-       if (! hga_card_detect()) {
-               printk(KERN_INFO "hgafb: HGA card not detected.\n");
-               if (hga_vram)
-                       iounmap(hga_vram);
-               return -EINVAL;
-       }
+       ret = hga_card_detect();
+       if (!ret)
+               return ret;
 
        printk(KERN_INFO "hgafb: %s with %ldK of memory detected.\n",
                hga_type_name, hga_vram_len/1024);
index 3ac053b..16f272a 100644 (file)
@@ -1469,6 +1469,7 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        struct imstt_par *par;
        struct fb_info *info;
        struct device_node *dp;
+       int ret = -ENOMEM;
        
        dp = pci_device_to_OF_node(pdev);
        if(dp)
@@ -1504,28 +1505,37 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                default:
                        printk(KERN_INFO "imsttfb: Device 0x%x unknown, "
                                         "contact maintainer.\n", pdev->device);
-                       release_mem_region(addr, size);
-                       framebuffer_release(info);
-                       return -ENODEV;
+                       ret = -ENODEV;
+                       goto error;
        }
 
        info->fix.smem_start = addr;
        info->screen_base = (__u8 *)ioremap(addr, par->ramdac == IBM ?
                                            0x400000 : 0x800000);
-       if (!info->screen_base) {
-               release_mem_region(addr, size);
-               framebuffer_release(info);
-               return -ENOMEM;
-       }
+       if (!info->screen_base)
+               goto error;
        info->fix.mmio_start = addr + 0x800000;
        par->dc_regs = ioremap(addr + 0x800000, 0x1000);
+       if (!par->dc_regs)
+               goto error;
        par->cmap_regs_phys = addr + 0x840000;
        par->cmap_regs = (__u8 *)ioremap(addr + 0x840000, 0x1000);
+       if (!par->cmap_regs)
+               goto error;
        info->pseudo_palette = par->palette;
        init_imstt(info);
 
        pci_set_drvdata(pdev, info);
        return 0;
+
+error:
+       if (par->dc_regs)
+               iounmap(par->dc_regs);
+       if (info->screen_base)
+               iounmap(info->screen_base);
+       release_mem_region(addr, size);
+       framebuffer_release(info);
+       return ret;
 }
 
 static void imsttfb_remove(struct pci_dev *pdev)
index f01d58c..a3e7be9 100644 (file)
@@ -1017,8 +1017,10 @@ static int gntdev_mmap(struct file *flip, struct vm_area_struct *vma)
                err = mmu_interval_notifier_insert_locked(
                        &map->notifier, vma->vm_mm, vma->vm_start,
                        vma->vm_end - vma->vm_start, &gntdev_mmu_ops);
-               if (err)
+               if (err) {
+                       map->vma = NULL;
                        goto out_unlock_put;
+               }
        }
        mutex_unlock(&priv->lock);
 
index 4c89afc..24d1186 100644 (file)
@@ -164,6 +164,11 @@ int __ref xen_swiotlb_init(void)
        int rc = -ENOMEM;
        char *start;
 
+       if (io_tlb_default_mem != NULL) {
+               pr_warn("swiotlb buffer already initialized\n");
+               return -EEXIST;
+       }
+
 retry:
        m_ret = XEN_SWIOTLB_ENOMEM;
        order = get_order(bytes);
index e64e6be..87e6b7d 100644 (file)
@@ -39,8 +39,10 @@ static int fill_list(unsigned int nr_pages)
        }
 
        pgmap = kzalloc(sizeof(*pgmap), GFP_KERNEL);
-       if (!pgmap)
+       if (!pgmap) {
+               ret = -ENOMEM;
                goto err_pgmap;
+       }
 
        pgmap->type = MEMORY_DEVICE_GENERIC;
        pgmap->range = (struct range) {
index 4162d0e..cc7450f 100644 (file)
@@ -70,7 +70,7 @@ static int __xen_pcibk_add_pci_dev(struct xen_pcibk_device *pdev,
                                   struct pci_dev *dev, int devid,
                                   publish_pci_dev_cb publish_cb)
 {
-       int err = 0, slot, func = -1;
+       int err = 0, slot, func = PCI_FUNC(dev->devfn);
        struct pci_dev_entry *t, *dev_entry;
        struct vpci_dev_data *vpci_dev = pdev->pci_dev_data;
 
@@ -95,22 +95,25 @@ static int __xen_pcibk_add_pci_dev(struct xen_pcibk_device *pdev,
 
        /*
         * Keep multi-function devices together on the virtual PCI bus, except
-        * virtual functions.
+        * that we want to keep virtual functions at func 0 on their own. They
+        * aren't multi-function devices and hence their presence at func 0
+        * may cause guests to not scan the other functions.
         */
-       if (!dev->is_virtfn) {
+       if (!dev->is_virtfn || func) {
                for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
                        if (list_empty(&vpci_dev->dev_list[slot]))
                                continue;
 
                        t = list_entry(list_first(&vpci_dev->dev_list[slot]),
                                       struct pci_dev_entry, list);
+                       if (t->dev->is_virtfn && !PCI_FUNC(t->dev->devfn))
+                               continue;
 
                        if (match_slot(dev, t->dev)) {
                                dev_info(&dev->dev, "vpci: assign to virtual slot %d func %d\n",
-                                        slot, PCI_FUNC(dev->devfn));
+                                        slot, func);
                                list_add_tail(&dev_entry->list,
                                              &vpci_dev->dev_list[slot]);
-                               func = PCI_FUNC(dev->devfn);
                                goto unlock;
                        }
                }
@@ -123,7 +126,6 @@ static int __xen_pcibk_add_pci_dev(struct xen_pcibk_device *pdev,
                                 slot);
                        list_add_tail(&dev_entry->list,
                                      &vpci_dev->dev_list[slot]);
-                       func = dev->is_virtfn ? 0 : PCI_FUNC(dev->devfn);
                        goto unlock;
                }
        }
index 5188f02..c09c7eb 100644 (file)
@@ -359,7 +359,8 @@ out:
        return err;
 }
 
-static int xen_pcibk_reconfigure(struct xen_pcibk_device *pdev)
+static int xen_pcibk_reconfigure(struct xen_pcibk_device *pdev,
+                                enum xenbus_state state)
 {
        int err = 0;
        int num_devs;
@@ -373,9 +374,7 @@ static int xen_pcibk_reconfigure(struct xen_pcibk_device *pdev)
        dev_dbg(&pdev->xdev->dev, "Reconfiguring device ...\n");
 
        mutex_lock(&pdev->dev_lock);
-       /* Make sure we only reconfigure once */
-       if (xenbus_read_driver_state(pdev->xdev->nodename) !=
-           XenbusStateReconfiguring)
+       if (xenbus_read_driver_state(pdev->xdev->nodename) != state)
                goto out;
 
        err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, "num_devs", "%d",
@@ -500,6 +499,10 @@ static int xen_pcibk_reconfigure(struct xen_pcibk_device *pdev)
                }
        }
 
+       if (state != XenbusStateReconfiguring)
+               /* Make sure we only reconfigure once. */
+               goto out;
+
        err = xenbus_switch_state(pdev->xdev, XenbusStateReconfigured);
        if (err) {
                xenbus_dev_fatal(pdev->xdev, err,
@@ -525,7 +528,7 @@ static void xen_pcibk_frontend_changed(struct xenbus_device *xdev,
                break;
 
        case XenbusStateReconfiguring:
-               xen_pcibk_reconfigure(pdev);
+               xen_pcibk_reconfigure(pdev, XenbusStateReconfiguring);
                break;
 
        case XenbusStateConnected:
@@ -664,6 +667,15 @@ static void xen_pcibk_be_watch(struct xenbus_watch *watch,
                xen_pcibk_setup_backend(pdev);
                break;
 
+       case XenbusStateInitialised:
+               /*
+                * We typically move to Initialised when the first device was
+                * added. Hence subsequent devices getting added may need
+                * reconfiguring.
+                */
+               xen_pcibk_reconfigure(pdev, XenbusStateInitialised);
+               break;
+
        default:
                break;
        }
index b8abccd..6cc4d4c 100644 (file)
@@ -1244,6 +1244,9 @@ int bdev_disk_changed(struct block_device *bdev, bool invalidate)
 
        lockdep_assert_held(&bdev->bd_mutex);
 
+       if (!(disk->flags & GENHD_FL_UP))
+               return -ENXIO;
+
 rescan:
        if (bdev->bd_part_count)
                return -EBUSY;
@@ -1298,6 +1301,9 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode)
        struct gendisk *disk = bdev->bd_disk;
        int ret = 0;
 
+       if (!(disk->flags & GENHD_FL_UP))
+               return -ENXIO;
+
        if (!bdev->bd_openers) {
                if (!bdev_is_partition(bdev)) {
                        ret = 0;
@@ -1332,8 +1338,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode)
                        whole->bd_part_count++;
                        mutex_unlock(&whole->bd_mutex);
 
-                       if (!(disk->flags & GENHD_FL_UP) ||
-                           !bdev_nr_sectors(bdev)) {
+                       if (!bdev_nr_sectors(bdev)) {
                                __blkdev_put(whole, mode, 1);
                                bdput(whole);
                                return -ENXIO;
@@ -1364,16 +1369,12 @@ struct block_device *blkdev_get_no_open(dev_t dev)
        struct block_device *bdev;
        struct gendisk *disk;
 
-       down_read(&bdev_lookup_sem);
        bdev = bdget(dev);
        if (!bdev) {
-               up_read(&bdev_lookup_sem);
                blk_request_module(dev);
-               down_read(&bdev_lookup_sem);
-
                bdev = bdget(dev);
                if (!bdev)
-                       goto unlock;
+                       return NULL;
        }
 
        disk = bdev->bd_disk;
@@ -1383,14 +1384,11 @@ struct block_device *blkdev_get_no_open(dev_t dev)
                goto put_disk;
        if (!try_module_get(bdev->bd_disk->fops->owner))
                goto put_disk;
-       up_read(&bdev_lookup_sem);
        return bdev;
 put_disk:
        put_disk(disk);
 bdput:
        bdput(bdev);
-unlock:
-       up_read(&bdev_lookup_sem);
        return NULL;
 }
 
index 2bea01d..d17ac30 100644 (file)
@@ -28,6 +28,7 @@
 #include "compression.h"
 #include "extent_io.h"
 #include "extent_map.h"
+#include "zoned.h"
 
 static const char* const btrfs_compress_types[] = { "", "zlib", "lzo", "zstd" };
 
@@ -349,6 +350,7 @@ static void end_compressed_bio_write(struct bio *bio)
         */
        inode = cb->inode;
        cb->compressed_pages[0]->mapping = cb->inode->i_mapping;
+       btrfs_record_physical_zoned(inode, cb->start, bio);
        btrfs_writepage_endio_finish_ordered(cb->compressed_pages[0],
                        cb->start, cb->start + cb->len - 1,
                        bio->bi_status == BLK_STS_OK);
@@ -401,6 +403,8 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,
        u64 first_byte = disk_start;
        blk_status_t ret;
        int skip_sum = inode->flags & BTRFS_INODE_NODATASUM;
+       const bool use_append = btrfs_use_zone_append(inode, disk_start);
+       const unsigned int bio_op = use_append ? REQ_OP_ZONE_APPEND : REQ_OP_WRITE;
 
        WARN_ON(!PAGE_ALIGNED(start));
        cb = kmalloc(compressed_bio_size(fs_info, compressed_len), GFP_NOFS);
@@ -418,10 +422,31 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,
        cb->nr_pages = nr_pages;
 
        bio = btrfs_bio_alloc(first_byte);
-       bio->bi_opf = REQ_OP_WRITE | write_flags;
+       bio->bi_opf = bio_op | write_flags;
        bio->bi_private = cb;
        bio->bi_end_io = end_compressed_bio_write;
 
+       if (use_append) {
+               struct extent_map *em;
+               struct map_lookup *map;
+               struct block_device *bdev;
+
+               em = btrfs_get_chunk_map(fs_info, disk_start, PAGE_SIZE);
+               if (IS_ERR(em)) {
+                       kfree(cb);
+                       bio_put(bio);
+                       return BLK_STS_NOTSUPP;
+               }
+
+               map = em->map_lookup;
+               /* We only support single profile for now */
+               ASSERT(map->num_stripes == 1);
+               bdev = map->stripes[0].dev->bdev;
+
+               bio_set_dev(bio, bdev);
+               free_extent_map(em);
+       }
+
        if (blkcg_css) {
                bio->bi_opf |= REQ_CGROUP_PUNT;
                kthread_associate_blkcg(blkcg_css);
@@ -432,6 +457,7 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,
        bytes_left = compressed_len;
        for (pg_index = 0; pg_index < cb->nr_pages; pg_index++) {
                int submit = 0;
+               int len;
 
                page = compressed_pages[pg_index];
                page->mapping = inode->vfs_inode.i_mapping;
@@ -439,9 +465,13 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,
                        submit = btrfs_bio_fits_in_stripe(page, PAGE_SIZE, bio,
                                                          0);
 
+               if (pg_index == 0 && use_append)
+                       len = bio_add_zone_append_page(bio, page, PAGE_SIZE, 0);
+               else
+                       len = bio_add_page(bio, page, PAGE_SIZE, 0);
+
                page->mapping = NULL;
-               if (submit || bio_add_page(bio, page, PAGE_SIZE, 0) <
-                   PAGE_SIZE) {
+               if (submit || len < PAGE_SIZE) {
                        /*
                         * inc the count before we submit the bio so
                         * we know the end IO handler won't happen before
@@ -465,11 +495,15 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,
                        }
 
                        bio = btrfs_bio_alloc(first_byte);
-                       bio->bi_opf = REQ_OP_WRITE | write_flags;
+                       bio->bi_opf = bio_op | write_flags;
                        bio->bi_private = cb;
                        bio->bi_end_io = end_compressed_bio_write;
                        if (blkcg_css)
                                bio->bi_opf |= REQ_CGROUP_PUNT;
+                       /*
+                        * Use bio_add_page() to ensure the bio has at least one
+                        * page.
+                        */
                        bio_add_page(bio, page, PAGE_SIZE, 0);
                }
                if (bytes_left < PAGE_SIZE) {
index f83fd3c..9fb7682 100644 (file)
@@ -3127,7 +3127,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
                               struct btrfs_inode *inode, u64 new_size,
                               u32 min_type);
 
-int btrfs_start_delalloc_snapshot(struct btrfs_root *root);
+int btrfs_start_delalloc_snapshot(struct btrfs_root *root, bool in_reclaim_context);
 int btrfs_start_delalloc_roots(struct btrfs_fs_info *fs_info, long nr,
                               bool in_reclaim_context);
 int btrfs_set_extent_delalloc(struct btrfs_inode *inode, u64 start, u64 end,
index 7a28314..f1d15b6 100644 (file)
@@ -1340,12 +1340,16 @@ int btrfs_discard_extent(struct btrfs_fs_info *fs_info, u64 bytenr,
                stripe = bbio->stripes;
                for (i = 0; i < bbio->num_stripes; i++, stripe++) {
                        u64 bytes;
+                       struct btrfs_device *device = stripe->dev;
 
-                       if (!stripe->dev->bdev) {
+                       if (!device->bdev) {
                                ASSERT(btrfs_test_opt(fs_info, DEGRADED));
                                continue;
                        }
 
+                       if (!test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state))
+                               continue;
+
                        ret = do_discard_extent(stripe, &bytes);
                        if (!ret) {
                                discarded_bytes += bytes;
index 074a78a..dee2daf 100644 (file)
@@ -3753,7 +3753,7 @@ static noinline_for_stack int __extent_writepage_io(struct btrfs_inode *inode,
                /* Note that em_end from extent_map_end() is exclusive */
                iosize = min(em_end, end + 1) - cur;
 
-               if (btrfs_use_zone_append(inode, em))
+               if (btrfs_use_zone_append(inode, em->block_start))
                        opf = REQ_OP_ZONE_APPEND;
 
                free_extent_map(em);
@@ -5196,7 +5196,7 @@ int extent_fiemap(struct btrfs_inode *inode, struct fiemap_extent_info *fieinfo,
                  u64 start, u64 len)
 {
        int ret = 0;
-       u64 off = start;
+       u64 off;
        u64 max = start + len;
        u32 flags = 0;
        u32 found_type;
@@ -5231,6 +5231,11 @@ int extent_fiemap(struct btrfs_inode *inode, struct fiemap_extent_info *fieinfo,
                goto out_free_ulist;
        }
 
+       /*
+        * We can't initialize that to 'start' as this could miss extents due
+        * to extent item merging
+        */
+       off = 0;
        start = round_down(start, btrfs_inode_sectorsize(inode));
        len = round_up(max, btrfs_inode_sectorsize(inode)) - start;
 
index 864c08d..3b10d98 100644 (file)
@@ -2067,6 +2067,30 @@ static int start_ordered_ops(struct inode *inode, loff_t start, loff_t end)
        return ret;
 }
 
+static inline bool skip_inode_logging(const struct btrfs_log_ctx *ctx)
+{
+       struct btrfs_inode *inode = BTRFS_I(ctx->inode);
+       struct btrfs_fs_info *fs_info = inode->root->fs_info;
+
+       if (btrfs_inode_in_log(inode, fs_info->generation) &&
+           list_empty(&ctx->ordered_extents))
+               return true;
+
+       /*
+        * If we are doing a fast fsync we can not bail out if the inode's
+        * last_trans is <= then the last committed transaction, because we only
+        * update the last_trans of the inode during ordered extent completion,
+        * and for a fast fsync we don't wait for that, we only wait for the
+        * writeback to complete.
+        */
+       if (inode->last_trans <= fs_info->last_trans_committed &&
+           (test_bit(BTRFS_INODE_NEEDS_FULL_SYNC, &inode->runtime_flags) ||
+            list_empty(&ctx->ordered_extents)))
+               return true;
+
+       return false;
+}
+
 /*
  * fsync call for both files and directories.  This logs the inode into
  * the tree log instead of forcing full commits whenever possible.
@@ -2185,17 +2209,8 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
 
        atomic_inc(&root->log_batch);
 
-       /*
-        * If we are doing a fast fsync we can not bail out if the inode's
-        * last_trans is <= then the last committed transaction, because we only
-        * update the last_trans of the inode during ordered extent completion,
-        * and for a fast fsync we don't wait for that, we only wait for the
-        * writeback to complete.
-        */
        smp_mb();
-       if (btrfs_inode_in_log(BTRFS_I(inode), fs_info->generation) ||
-           (BTRFS_I(inode)->last_trans <= fs_info->last_trans_committed &&
-            (full_sync || list_empty(&ctx.ordered_extents)))) {
+       if (skip_inode_logging(&ctx)) {
                /*
                 * We've had everything committed since the last time we were
                 * modified so clear this flag in case it was set for whatever
index e54466f..4806295 100644 (file)
@@ -3949,7 +3949,7 @@ static int cleanup_free_space_cache_v1(struct btrfs_fs_info *fs_info,
 {
        struct btrfs_block_group *block_group;
        struct rb_node *node;
-       int ret;
+       int ret = 0;
 
        btrfs_info(fs_info, "cleaning free space cache v1");
 
index 4af3360..33f1457 100644 (file)
@@ -3241,6 +3241,7 @@ void btrfs_run_delayed_iputs(struct btrfs_fs_info *fs_info)
                inode = list_first_entry(&fs_info->delayed_iputs,
                                struct btrfs_inode, delayed_iput);
                run_delayed_iput_locked(fs_info, inode);
+               cond_resched_lock(&fs_info->delayed_iput_lock);
        }
        spin_unlock(&fs_info->delayed_iput_lock);
 }
@@ -7785,7 +7786,7 @@ static int btrfs_dio_iomap_begin(struct inode *inode, loff_t start,
        iomap->bdev = fs_info->fs_devices->latest_bdev;
        iomap->length = len;
 
-       if (write && btrfs_use_zone_append(BTRFS_I(inode), em))
+       if (write && btrfs_use_zone_append(BTRFS_I(inode), em->block_start))
                iomap->flags |= IOMAP_F_ZONE_APPEND;
 
        free_extent_map(em);
@@ -9678,7 +9679,7 @@ out:
        return ret;
 }
 
-int btrfs_start_delalloc_snapshot(struct btrfs_root *root)
+int btrfs_start_delalloc_snapshot(struct btrfs_root *root, bool in_reclaim_context)
 {
        struct writeback_control wbc = {
                .nr_to_write = LONG_MAX,
@@ -9691,7 +9692,7 @@ int btrfs_start_delalloc_snapshot(struct btrfs_root *root)
        if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state))
                return -EROFS;
 
-       return start_delalloc_inodes(root, &wbc, true, false);
+       return start_delalloc_inodes(root, &wbc, true, in_reclaim_context);
 }
 
 int btrfs_start_delalloc_roots(struct btrfs_fs_info *fs_info, long nr,
index ee1dbab..5dc2fd8 100644 (file)
@@ -259,6 +259,8 @@ int btrfs_fileattr_set(struct user_namespace *mnt_userns,
        if (!fa->flags_valid) {
                /* 1 item for the inode */
                trans = btrfs_start_transaction(root, 1);
+               if (IS_ERR(trans))
+                       return PTR_ERR(trans);
                goto update_flags;
        }
 
@@ -907,7 +909,7 @@ static noinline int btrfs_mksnapshot(const struct path *parent,
         */
        btrfs_drew_read_lock(&root->snapshot_lock);
 
-       ret = btrfs_start_delalloc_snapshot(root);
+       ret = btrfs_start_delalloc_snapshot(root, false);
        if (ret)
                goto out;
 
index 07b0b42..6c413bb 100644 (file)
@@ -984,7 +984,7 @@ int btrfs_split_ordered_extent(struct btrfs_ordered_extent *ordered, u64 pre,
 
        if (pre)
                ret = clone_ordered_extent(ordered, 0, pre);
-       if (post)
+       if (ret == 0 && post)
                ret = clone_ordered_extent(ordered, pre + ordered->disk_num_bytes,
                                           post);
 
index 2319c92..3ded812 100644 (file)
@@ -3545,11 +3545,15 @@ static int try_flush_qgroup(struct btrfs_root *root)
        struct btrfs_trans_handle *trans;
        int ret;
 
-       /* Can't hold an open transaction or we run the risk of deadlocking */
-       ASSERT(current->journal_info == NULL ||
-              current->journal_info == BTRFS_SEND_TRANS_STUB);
-       if (WARN_ON(current->journal_info &&
-                   current->journal_info != BTRFS_SEND_TRANS_STUB))
+       /*
+        * Can't hold an open transaction or we run the risk of deadlocking,
+        * and can't either be under the context of a send operation (where
+        * current->journal_info is set to BTRFS_SEND_TRANS_STUB), as that
+        * would result in a crash when starting a transaction and does not
+        * make sense either (send is a read-only operation).
+        */
+       ASSERT(current->journal_info == NULL);
+       if (WARN_ON(current->journal_info))
                return 0;
 
        /*
@@ -3562,7 +3566,7 @@ static int try_flush_qgroup(struct btrfs_root *root)
                return 0;
        }
 
-       ret = btrfs_start_delalloc_snapshot(root);
+       ret = btrfs_start_delalloc_snapshot(root, true);
        if (ret < 0)
                goto out;
        btrfs_wait_ordered_extents(root, U64_MAX, 0, (u64)-1);
index 3928ecc..d434dc7 100644 (file)
@@ -282,6 +282,11 @@ copy_inline_extent:
 out:
        if (!ret && !trans) {
                /*
+                * Release path before starting a new transaction so we don't
+                * hold locks that would confuse lockdep.
+                */
+               btrfs_release_path(path);
+               /*
                 * No transaction here means we copied the inline extent into a
                 * page of the destination inode.
                 *
index 55741ad..bd69db7 100644 (file)
@@ -7170,7 +7170,7 @@ static int flush_delalloc_roots(struct send_ctx *sctx)
        int i;
 
        if (root) {
-               ret = btrfs_start_delalloc_snapshot(root);
+               ret = btrfs_start_delalloc_snapshot(root, false);
                if (ret)
                        return ret;
                btrfs_wait_ordered_extents(root, U64_MAX, 0, U64_MAX);
@@ -7178,7 +7178,7 @@ static int flush_delalloc_roots(struct send_ctx *sctx)
 
        for (i = 0; i < sctx->clone_roots_cnt; i++) {
                root = sctx->clone_roots[i].root;
-               ret = btrfs_start_delalloc_snapshot(root);
+               ret = btrfs_start_delalloc_snapshot(root, false);
                if (ret)
                        return ret;
                btrfs_wait_ordered_extents(root, U64_MAX, 0, U64_MAX);
index f67721d..326be57 100644 (file)
@@ -1858,8 +1858,6 @@ static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans,
                ret = btrfs_update_inode(trans, root, BTRFS_I(inode));
        } else if (ret == -EEXIST) {
                ret = 0;
-       } else {
-               BUG(); /* Logic Error */
        }
        iput(inode);
 
@@ -6061,7 +6059,8 @@ static int btrfs_log_inode_parent(struct btrfs_trans_handle *trans,
         * (since logging them is pointless, a link count of 0 means they
         * will never be accessible).
         */
-       if (btrfs_inode_in_log(inode, trans->transid) ||
+       if ((btrfs_inode_in_log(inode, trans->transid) &&
+            list_empty(&ctx->ordered_extents)) ||
            inode->vfs_inode.i_nlink == 0) {
                ret = BTRFS_NO_LOG_SYNC;
                goto end_no_trans;
@@ -6462,6 +6461,24 @@ void btrfs_log_new_name(struct btrfs_trans_handle *trans,
            (!old_dir || old_dir->logged_trans < trans->transid))
                return;
 
+       /*
+        * If we are doing a rename (old_dir is not NULL) from a directory that
+        * was previously logged, make sure the next log attempt on the directory
+        * is not skipped and logs the inode again. This is because the log may
+        * not currently be authoritative for a range including the old
+        * BTRFS_DIR_ITEM_KEY and BTRFS_DIR_INDEX_KEY keys, so we want to make
+        * sure after a log replay we do not end up with both the new and old
+        * dentries around (in case the inode is a directory we would have a
+        * directory with two hard links and 2 inode references for different
+        * parents). The next log attempt of old_dir will happen at
+        * btrfs_log_all_parents(), called through btrfs_log_inode_parent()
+        * below, because we have previously set inode->last_unlink_trans to the
+        * current transaction ID, either here or at btrfs_record_unlink_dir() in
+        * case inode is a directory.
+        */
+       if (old_dir)
+               old_dir->logged_trans = 0;
+
        btrfs_init_log_ctx(&ctx, &inode->vfs_inode);
        ctx.logging_new_name = true;
        /*
index 9a1ead0..47d2705 100644 (file)
@@ -1459,7 +1459,7 @@ static bool dev_extent_hole_check_zoned(struct btrfs_device *device,
                /* Given hole range was invalid (outside of device) */
                if (ret == -ERANGE) {
                        *hole_start += *hole_size;
-                       *hole_size = false;
+                       *hole_size = 0;
                        return true;
                }
 
index 70b23a0..1bb8ee9 100644 (file)
@@ -1126,6 +1126,11 @@ int btrfs_load_block_group_zone_info(struct btrfs_block_group *cache, bool new)
                        goto out;
                }
 
+               if (zone.type == BLK_ZONE_TYPE_CONVENTIONAL) {
+                       ret = -EIO;
+                       goto out;
+               }
+
                switch (zone.cond) {
                case BLK_ZONE_COND_OFFLINE:
                case BLK_ZONE_COND_READONLY:
@@ -1273,7 +1278,7 @@ void btrfs_free_redirty_list(struct btrfs_transaction *trans)
        spin_unlock(&trans->releasing_ebs_lock);
 }
 
-bool btrfs_use_zone_append(struct btrfs_inode *inode, struct extent_map *em)
+bool btrfs_use_zone_append(struct btrfs_inode *inode, u64 start)
 {
        struct btrfs_fs_info *fs_info = inode->root->fs_info;
        struct btrfs_block_group *cache;
@@ -1288,7 +1293,7 @@ bool btrfs_use_zone_append(struct btrfs_inode *inode, struct extent_map *em)
        if (!is_data_inode(&inode->vfs_inode))
                return false;
 
-       cache = btrfs_lookup_block_group(fs_info, em->block_start);
+       cache = btrfs_lookup_block_group(fs_info, start);
        ASSERT(cache);
        if (!cache)
                return false;
index 5e41a74..e55d325 100644 (file)
@@ -53,7 +53,7 @@ void btrfs_calc_zone_unusable(struct btrfs_block_group *cache);
 void btrfs_redirty_list_add(struct btrfs_transaction *trans,
                            struct extent_buffer *eb);
 void btrfs_free_redirty_list(struct btrfs_transaction *trans);
-bool btrfs_use_zone_append(struct btrfs_inode *inode, struct extent_map *em);
+bool btrfs_use_zone_append(struct btrfs_inode *inode, u64 start);
 void btrfs_record_physical_zoned(struct inode *inode, u64 file_offset,
                                 struct bio *bio);
 void btrfs_rewrite_logical_zoned(struct btrfs_ordered_extent *ordered);
@@ -152,8 +152,7 @@ static inline void btrfs_redirty_list_add(struct btrfs_transaction *trans,
                                          struct extent_buffer *eb) { }
 static inline void btrfs_free_redirty_list(struct btrfs_transaction *trans) { }
 
-static inline bool btrfs_use_zone_append(struct btrfs_inode *inode,
-                                        struct extent_map *em)
+static inline bool btrfs_use_zone_append(struct btrfs_inode *inode, u64 start)
 {
        return false;
 }
index d7ea9c5..2ffcb29 100644 (file)
@@ -133,7 +133,7 @@ struct workqueue_struct     *cifsiod_wq;
 struct workqueue_struct        *decrypt_wq;
 struct workqueue_struct        *fileinfo_put_wq;
 struct workqueue_struct        *cifsoplockd_wq;
-struct workqueue_struct *deferredclose_wq;
+struct workqueue_struct        *deferredclose_wq;
 __u32 cifs_lock_secret;
 
 /*
index d88b4b5..8488d70 100644 (file)
@@ -1257,8 +1257,7 @@ struct cifsFileInfo {
        struct work_struct oplock_break; /* work for oplock breaks */
        struct work_struct put; /* work for the final part of _put */
        struct delayed_work deferred;
-       bool oplock_break_received; /* Flag to indicate oplock break */
-       bool deferred_scheduled;
+       bool deferred_close_scheduled; /* Flag to indicate close is scheduled */
 };
 
 struct cifs_io_parms {
@@ -1418,6 +1417,7 @@ struct cifsInodeInfo {
        struct inode vfs_inode;
        struct list_head deferred_closes; /* list of deferred closes */
        spinlock_t deferred_lock; /* protection on deferred list */
+       bool lease_granted; /* Flag to indicate whether lease or oplock is granted. */
 };
 
 static inline struct cifsInodeInfo *
index 6caad10..379a427 100644 (file)
@@ -323,8 +323,7 @@ cifs_new_fileinfo(struct cifs_fid *fid, struct file *file,
        cfile->dentry = dget(dentry);
        cfile->f_flags = file->f_flags;
        cfile->invalidHandle = false;
-       cfile->oplock_break_received = false;
-       cfile->deferred_scheduled = false;
+       cfile->deferred_close_scheduled = false;
        cfile->tlink = cifs_get_tlink(tlink);
        INIT_WORK(&cfile->oplock_break, cifs_oplock_break);
        INIT_WORK(&cfile->put, cifsFileInfo_put_work);
@@ -574,21 +573,18 @@ int cifs_open(struct inode *inode, struct file *file)
                        file->f_op = &cifs_file_direct_ops;
        }
 
-       spin_lock(&CIFS_I(inode)->deferred_lock);
        /* Get the cached handle as SMB2 close is deferred */
        rc = cifs_get_readable_path(tcon, full_path, &cfile);
        if (rc == 0) {
                if (file->f_flags == cfile->f_flags) {
                        file->private_data = cfile;
+                       spin_lock(&CIFS_I(inode)->deferred_lock);
                        cifs_del_deferred_close(cfile);
                        spin_unlock(&CIFS_I(inode)->deferred_lock);
                        goto out;
                } else {
-                       spin_unlock(&CIFS_I(inode)->deferred_lock);
                        _cifsFileInfo_put(cfile, true, false);
                }
-       } else {
-               spin_unlock(&CIFS_I(inode)->deferred_lock);
        }
 
        if (server->oplocks)
@@ -878,12 +874,8 @@ void smb2_deferred_work_close(struct work_struct *work)
                        struct cifsFileInfo, deferred.work);
 
        spin_lock(&CIFS_I(d_inode(cfile->dentry))->deferred_lock);
-       if (!cfile->deferred_scheduled) {
-               spin_unlock(&CIFS_I(d_inode(cfile->dentry))->deferred_lock);
-               return;
-       }
        cifs_del_deferred_close(cfile);
-       cfile->deferred_scheduled = false;
+       cfile->deferred_close_scheduled = false;
        spin_unlock(&CIFS_I(d_inode(cfile->dentry))->deferred_lock);
        _cifsFileInfo_put(cfile, true, false);
 }
@@ -900,19 +892,26 @@ int cifs_close(struct inode *inode, struct file *file)
                file->private_data = NULL;
                dclose = kmalloc(sizeof(struct cifs_deferred_close), GFP_KERNEL);
                if ((cinode->oplock == CIFS_CACHE_RHW_FLG) &&
+                   cinode->lease_granted &&
                    dclose) {
                        if (test_bit(CIFS_INO_MODIFIED_ATTR, &cinode->flags))
                                inode->i_ctime = inode->i_mtime = current_time(inode);
                        spin_lock(&cinode->deferred_lock);
                        cifs_add_deferred_close(cfile, dclose);
-                       if (cfile->deferred_scheduled) {
-                               mod_delayed_work(deferredclose_wq,
-                                               &cfile->deferred, cifs_sb->ctx->acregmax);
+                       if (cfile->deferred_close_scheduled &&
+                           delayed_work_pending(&cfile->deferred)) {
+                               /*
+                                * If there is no pending work, mod_delayed_work queues new work.
+                                * So, Increase the ref count to avoid use-after-free.
+                                */
+                               if (!mod_delayed_work(deferredclose_wq,
+                                               &cfile->deferred, cifs_sb->ctx->acregmax))
+                                       cifsFileInfo_get(cfile);
                        } else {
                                /* Deferred close for files */
                                queue_delayed_work(deferredclose_wq,
                                                &cfile->deferred, cifs_sb->ctx->acregmax);
-                               cfile->deferred_scheduled = true;
+                               cfile->deferred_close_scheduled = true;
                                spin_unlock(&cinode->deferred_lock);
                                return 0;
                        }
@@ -2020,8 +2019,7 @@ struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode,
                if (fsuid_only && !uid_eq(open_file->uid, current_fsuid()))
                        continue;
                if (OPEN_FMODE(open_file->f_flags) & FMODE_READ) {
-                       if ((!open_file->invalidHandle) &&
-                               (!open_file->oplock_break_received)) {
+                       if ((!open_file->invalidHandle)) {
                                /* found a good file */
                                /* lock it so it will not be closed on us */
                                cifsFileInfo_get(open_file);
@@ -4874,14 +4872,20 @@ oplock_break_ack:
        }
        /*
         * When oplock break is received and there are no active
-        * file handles but cached, then set the flag oplock_break_received.
+        * file handles but cached, then schedule deferred close immediately.
         * So, new open will not use cached handle.
         */
        spin_lock(&CIFS_I(inode)->deferred_lock);
        is_deferred = cifs_is_deferred_close(cfile, &dclose);
-       if (is_deferred && cfile->deferred_scheduled) {
-               cfile->oplock_break_received = true;
-               mod_delayed_work(deferredclose_wq, &cfile->deferred, 0);
+       if (is_deferred &&
+           cfile->deferred_close_scheduled &&
+           delayed_work_pending(&cfile->deferred)) {
+               /*
+                * If there is no pending work, mod_delayed_work queues new work.
+                * So, Increase the ref count to avoid use-after-free.
+                */
+               if (!mod_delayed_work(deferredclose_wq, &cfile->deferred, 0))
+                       cifsFileInfo_get(cfile);
        }
        spin_unlock(&CIFS_I(inode)->deferred_lock);
        _cifsFileInfo_put(cfile, false /* do not wait for ourself */, false);
index 5d21cd9..92d4ab0 100644 (file)
@@ -1145,7 +1145,7 @@ static int smb3_fs_context_parse_param(struct fs_context *fc,
                /* if iocharset not set then load_nls_default
                 * is used by caller
                 */
-                cifs_dbg(FYI, "iocharset set to %s\n", ctx->iocharset);
+               cifs_dbg(FYI, "iocharset set to %s\n", ctx->iocharset);
                break;
        case Opt_netbiosname:
                memset(ctx->source_rfc1001_name, 0x20,
index 524dbdf..7207a63 100644 (file)
@@ -672,6 +672,11 @@ cifs_add_pending_open(struct cifs_fid *fid, struct tcon_link *tlink,
        spin_unlock(&tlink_tcon(open->tlink)->open_file_lock);
 }
 
+/*
+ * Critical section which runs after acquiring deferred_lock.
+ * As there is no reference count on cifs_deferred_close, pdclose
+ * should not be used outside deferred_lock.
+ */
 bool
 cifs_is_deferred_close(struct cifsFileInfo *cfile, struct cifs_deferred_close **pdclose)
 {
@@ -688,6 +693,9 @@ cifs_is_deferred_close(struct cifsFileInfo *cfile, struct cifs_deferred_close **
        return false;
 }
 
+/*
+ * Critical section which runs after acquiring deferred_lock.
+ */
 void
 cifs_add_deferred_close(struct cifsFileInfo *cfile, struct cifs_deferred_close *dclose)
 {
@@ -707,6 +715,9 @@ cifs_add_deferred_close(struct cifsFileInfo *cfile, struct cifs_deferred_close *
        list_add_tail(&dclose->dlist, &CIFS_I(d_inode(cfile->dentry))->deferred_closes);
 }
 
+/*
+ * Critical section which runs after acquiring deferred_lock.
+ */
 void
 cifs_del_deferred_close(struct cifsFileInfo *cfile)
 {
@@ -738,15 +749,19 @@ void
 cifs_close_all_deferred_files(struct cifs_tcon *tcon)
 {
        struct cifsFileInfo *cfile;
-       struct cifsInodeInfo *cinode;
        struct list_head *tmp;
 
        spin_lock(&tcon->open_file_lock);
        list_for_each(tmp, &tcon->openFileList) {
                cfile = list_entry(tmp, struct cifsFileInfo, tlist);
-               cinode = CIFS_I(d_inode(cfile->dentry));
-               if (delayed_work_pending(&cfile->deferred))
-                       mod_delayed_work(deferredclose_wq, &cfile->deferred, 0);
+               if (delayed_work_pending(&cfile->deferred)) {
+                       /*
+                        * If there is no pending work, mod_delayed_work queues new work.
+                        * So, Increase the ref count to avoid use-after-free.
+                        */
+                       if (!mod_delayed_work(deferredclose_wq, &cfile->deferred, 0))
+                               cifsFileInfo_get(cfile);
+               }
        }
        spin_unlock(&tcon->open_file_lock);
 }
index dd0eb66..21ef51d 100644 (file)
@@ -1861,6 +1861,8 @@ smb2_copychunk_range(const unsigned int xid,
                        cpu_to_le32(min_t(u32, len, tcon->max_bytes_chunk));
 
                /* Request server copy to target from src identified by key */
+               kfree(retbuf);
+               retbuf = NULL;
                rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid,
                        trgtfile->fid.volatile_fid, FSCTL_SRV_COPYCHUNK_WRITE,
                        true /* is_fsctl */, (char *)pcchunk,
@@ -3981,6 +3983,7 @@ smb2_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
                      unsigned int epoch, bool *purge_cache)
 {
        oplock &= 0xFF;
+       cinode->lease_granted = false;
        if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
                return;
        if (oplock == SMB2_OPLOCK_LEVEL_BATCH) {
@@ -4007,6 +4010,7 @@ smb21_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
        unsigned int new_oplock = 0;
 
        oplock &= 0xFF;
+       cinode->lease_granted = true;
        if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE)
                return;
 
index a8bf431..9f24eb8 100644 (file)
@@ -3900,10 +3900,10 @@ smb2_new_read_req(void **buf, unsigned int *total_len,
                         * Related requests use info from previous read request
                         * in chain.
                         */
-                       shdr->SessionId = 0xFFFFFFFF;
+                       shdr->SessionId = 0xFFFFFFFFFFFFFFFF;
                        shdr->TreeId = 0xFFFFFFFF;
-                       req->PersistentFileId = 0xFFFFFFFF;
-                       req->VolatileFileId = 0xFFFFFFFF;
+                       req->PersistentFileId = 0xFFFFFFFFFFFFFFFF;
+                       req->VolatileFileId = 0xFFFFFFFFFFFFFFFF;
                }
        }
        if (remaining_bytes > io_parms->length)
index 6921624..62352cb 100644 (file)
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -144,6 +144,16 @@ struct wait_exceptional_entry_queue {
        struct exceptional_entry_key key;
 };
 
+/**
+ * enum dax_wake_mode: waitqueue wakeup behaviour
+ * @WAKE_ALL: wake all waiters in the waitqueue
+ * @WAKE_NEXT: wake only the first waiter in the waitqueue
+ */
+enum dax_wake_mode {
+       WAKE_ALL,
+       WAKE_NEXT,
+};
+
 static wait_queue_head_t *dax_entry_waitqueue(struct xa_state *xas,
                void *entry, struct exceptional_entry_key *key)
 {
@@ -182,7 +192,8 @@ static int wake_exceptional_entry_func(wait_queue_entry_t *wait,
  * The important information it's conveying is whether the entry at
  * this index used to be a PMD entry.
  */
-static void dax_wake_entry(struct xa_state *xas, void *entry, bool wake_all)
+static void dax_wake_entry(struct xa_state *xas, void *entry,
+                          enum dax_wake_mode mode)
 {
        struct exceptional_entry_key key;
        wait_queue_head_t *wq;
@@ -196,7 +207,7 @@ static void dax_wake_entry(struct xa_state *xas, void *entry, bool wake_all)
         * must be in the waitqueue and the following check will see them.
         */
        if (waitqueue_active(wq))
-               __wake_up(wq, TASK_NORMAL, wake_all ? 0 : 1, &key);
+               __wake_up(wq, TASK_NORMAL, mode == WAKE_ALL ? 0 : 1, &key);
 }
 
 /*
@@ -264,11 +275,11 @@ static void wait_entry_unlocked(struct xa_state *xas, void *entry)
        finish_wait(wq, &ewait.wait);
 }
 
-static void put_unlocked_entry(struct xa_state *xas, void *entry)
+static void put_unlocked_entry(struct xa_state *xas, void *entry,
+                              enum dax_wake_mode mode)
 {
-       /* If we were the only waiter woken, wake the next one */
        if (entry && !dax_is_conflict(entry))
-               dax_wake_entry(xas, entry, false);
+               dax_wake_entry(xas, entry, mode);
 }
 
 /*
@@ -286,7 +297,7 @@ static void dax_unlock_entry(struct xa_state *xas, void *entry)
        old = xas_store(xas, entry);
        xas_unlock_irq(xas);
        BUG_ON(!dax_is_locked(old));
-       dax_wake_entry(xas, entry, false);
+       dax_wake_entry(xas, entry, WAKE_NEXT);
 }
 
 /*
@@ -524,7 +535,7 @@ retry:
 
                dax_disassociate_entry(entry, mapping, false);
                xas_store(xas, NULL);   /* undo the PMD join */
-               dax_wake_entry(xas, entry, true);
+               dax_wake_entry(xas, entry, WAKE_ALL);
                mapping->nrpages -= PG_PMD_NR;
                entry = NULL;
                xas_set(xas, index);
@@ -622,7 +633,7 @@ struct page *dax_layout_busy_page_range(struct address_space *mapping,
                        entry = get_unlocked_entry(&xas, 0);
                if (entry)
                        page = dax_busy_page(entry);
-               put_unlocked_entry(&xas, entry);
+               put_unlocked_entry(&xas, entry, WAKE_NEXT);
                if (page)
                        break;
                if (++scanned % XA_CHECK_SCHED)
@@ -664,7 +675,7 @@ static int __dax_invalidate_entry(struct address_space *mapping,
        mapping->nrpages -= 1UL << dax_entry_order(entry);
        ret = 1;
 out:
-       put_unlocked_entry(&xas, entry);
+       put_unlocked_entry(&xas, entry, WAKE_ALL);
        xas_unlock_irq(&xas);
        return ret;
 }
@@ -937,13 +948,13 @@ static int dax_writeback_one(struct xa_state *xas, struct dax_device *dax_dev,
        xas_lock_irq(xas);
        xas_store(xas, entry);
        xas_clear_mark(xas, PAGECACHE_TAG_DIRTY);
-       dax_wake_entry(xas, entry, false);
+       dax_wake_entry(xas, entry, WAKE_NEXT);
 
        trace_dax_writeback_one(mapping->host, index, count);
        return ret;
 
  put_unlocked:
-       put_unlocked_entry(xas, entry);
+       put_unlocked_entry(xas, entry, WAKE_NEXT);
        return ret;
 }
 
@@ -1684,7 +1695,7 @@ dax_insert_pfn_mkwrite(struct vm_fault *vmf, pfn_t pfn, unsigned int order)
        /* Did we race with someone splitting entry or so? */
        if (!entry || dax_is_conflict(entry) ||
            (order == 0 && !dax_is_pte_entry(entry))) {
-               put_unlocked_entry(&xas, entry);
+               put_unlocked_entry(&xas, entry, WAKE_NEXT);
                xas_unlock_irq(&xas);
                trace_dax_insert_pfn_mkwrite_no_entry(mapping->host, vmf,
                                                      VM_FAULT_NOPAGE);
index 345f806..e3f5d7f 100644 (file)
@@ -296,10 +296,6 @@ static int crypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat,
        struct extent_crypt_result ecr;
        int rc = 0;
 
-       if (!crypt_stat || !crypt_stat->tfm
-              || !(crypt_stat->flags & ECRYPTFS_STRUCT_INITIALIZED))
-               return -EINVAL;
-
        if (unlikely(ecryptfs_verbosity > 0)) {
                ecryptfs_printk(KERN_DEBUG, "Key size [%zd]; key:\n",
                                crypt_stat->key_size);
index e62d813..efaf325 100644 (file)
@@ -450,14 +450,31 @@ static int z_erofs_get_extent_compressedlen(struct z_erofs_maprecorder *m,
        lcn = m->lcn + 1;
        if (m->compressedlcs)
                goto out;
-       if (lcn == initial_lcn)
-               goto err_bonus_cblkcnt;
 
        err = z_erofs_load_cluster_from_disk(m, lcn);
        if (err)
                return err;
 
+       /*
+        * If the 1st NONHEAD lcluster has already been handled initially w/o
+        * valid compressedlcs, which means at least it mustn't be CBLKCNT, or
+        * an internal implemenatation error is detected.
+        *
+        * The following code can also handle it properly anyway, but let's
+        * BUG_ON in the debugging mode only for developers to notice that.
+        */
+       DBG_BUGON(lcn == initial_lcn &&
+                 m->type == Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD);
+
        switch (m->type) {
+       case Z_EROFS_VLE_CLUSTER_TYPE_PLAIN:
+       case Z_EROFS_VLE_CLUSTER_TYPE_HEAD:
+               /*
+                * if the 1st NONHEAD lcluster is actually PLAIN or HEAD type
+                * rather than CBLKCNT, it's a 1 lcluster-sized pcluster.
+                */
+               m->compressedlcs = 1;
+               break;
        case Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD:
                if (m->delta[0] != 1)
                        goto err_bonus_cblkcnt;
index 53b1378..925a5ca 100644 (file)
@@ -117,19 +117,6 @@ static void f2fs_unlock_rpages(struct compress_ctx *cc, int len)
        f2fs_drop_rpages(cc, len, true);
 }
 
-static void f2fs_put_rpages_mapping(struct address_space *mapping,
-                               pgoff_t start, int len)
-{
-       int i;
-
-       for (i = 0; i < len; i++) {
-               struct page *page = find_get_page(mapping, start + i);
-
-               put_page(page);
-               put_page(page);
-       }
-}
-
 static void f2fs_put_rpages_wbc(struct compress_ctx *cc,
                struct writeback_control *wbc, bool redirty, int unlock)
 {
@@ -158,13 +145,14 @@ int f2fs_init_compress_ctx(struct compress_ctx *cc)
        return cc->rpages ? 0 : -ENOMEM;
 }
 
-void f2fs_destroy_compress_ctx(struct compress_ctx *cc)
+void f2fs_destroy_compress_ctx(struct compress_ctx *cc, bool reuse)
 {
        page_array_free(cc->inode, cc->rpages, cc->cluster_size);
        cc->rpages = NULL;
        cc->nr_rpages = 0;
        cc->nr_cpages = 0;
-       cc->cluster_idx = NULL_CLUSTER;
+       if (!reuse)
+               cc->cluster_idx = NULL_CLUSTER;
 }
 
 void f2fs_compress_ctx_add_page(struct compress_ctx *cc, struct page *page)
@@ -1036,7 +1024,7 @@ retry:
                }
 
                if (PageUptodate(page))
-                       unlock_page(page);
+                       f2fs_put_page(page, 1);
                else
                        f2fs_compress_ctx_add_page(cc, page);
        }
@@ -1046,33 +1034,35 @@ retry:
 
                ret = f2fs_read_multi_pages(cc, &bio, cc->cluster_size,
                                        &last_block_in_bio, false, true);
-               f2fs_destroy_compress_ctx(cc);
+               f2fs_put_rpages(cc);
+               f2fs_destroy_compress_ctx(cc, true);
                if (ret)
-                       goto release_pages;
+                       goto out;
                if (bio)
                        f2fs_submit_bio(sbi, bio, DATA);
 
                ret = f2fs_init_compress_ctx(cc);
                if (ret)
-                       goto release_pages;
+                       goto out;
        }
 
        for (i = 0; i < cc->cluster_size; i++) {
                f2fs_bug_on(sbi, cc->rpages[i]);
 
                page = find_lock_page(mapping, start_idx + i);
-               f2fs_bug_on(sbi, !page);
+               if (!page) {
+                       /* page can be truncated */
+                       goto release_and_retry;
+               }
 
                f2fs_wait_on_page_writeback(page, DATA, true, true);
-
                f2fs_compress_ctx_add_page(cc, page);
-               f2fs_put_page(page, 0);
 
                if (!PageUptodate(page)) {
+release_and_retry:
+                       f2fs_put_rpages(cc);
                        f2fs_unlock_rpages(cc, i + 1);
-                       f2fs_put_rpages_mapping(mapping, start_idx,
-                                       cc->cluster_size);
-                       f2fs_destroy_compress_ctx(cc);
+                       f2fs_destroy_compress_ctx(cc, true);
                        goto retry;
                }
        }
@@ -1103,10 +1093,10 @@ retry:
        }
 
 unlock_pages:
+       f2fs_put_rpages(cc);
        f2fs_unlock_rpages(cc, i);
-release_pages:
-       f2fs_put_rpages_mapping(mapping, start_idx, i);
-       f2fs_destroy_compress_ctx(cc);
+       f2fs_destroy_compress_ctx(cc, true);
+out:
        return ret;
 }
 
@@ -1141,7 +1131,7 @@ bool f2fs_compress_write_end(struct inode *inode, void *fsdata,
                set_cluster_dirty(&cc);
 
        f2fs_put_rpages_wbc(&cc, NULL, false, 1);
-       f2fs_destroy_compress_ctx(&cc);
+       f2fs_destroy_compress_ctx(&cc, false);
 
        return first_index;
 }
@@ -1361,7 +1351,7 @@ unlock_continue:
        f2fs_put_rpages(cc);
        page_array_free(cc->inode, cc->cpages, cc->nr_cpages);
        cc->cpages = NULL;
-       f2fs_destroy_compress_ctx(cc);
+       f2fs_destroy_compress_ctx(cc, false);
        return 0;
 
 out_destroy_crypt:
@@ -1372,7 +1362,8 @@ out_destroy_crypt:
        for (i = 0; i < cc->nr_cpages; i++) {
                if (!cc->cpages[i])
                        continue;
-               f2fs_put_page(cc->cpages[i], 1);
+               f2fs_compress_free_page(cc->cpages[i]);
+               cc->cpages[i] = NULL;
        }
 out_put_cic:
        kmem_cache_free(cic_entry_slab, cic);
@@ -1522,7 +1513,7 @@ write:
        err = f2fs_write_raw_pages(cc, submitted, wbc, io_type);
        f2fs_put_rpages_wbc(cc, wbc, false, 0);
 destroy_out:
-       f2fs_destroy_compress_ctx(cc);
+       f2fs_destroy_compress_ctx(cc, false);
        return err;
 }
 
index 96f1a35..009a09f 100644 (file)
@@ -2287,7 +2287,7 @@ static int f2fs_mpage_readpages(struct inode *inode,
                                                        max_nr_pages,
                                                        &last_block_in_bio,
                                                        rac != NULL, false);
-                               f2fs_destroy_compress_ctx(&cc);
+                               f2fs_destroy_compress_ctx(&cc, false);
                                if (ret)
                                        goto set_error_page;
                        }
@@ -2332,7 +2332,7 @@ next_page:
                                                        max_nr_pages,
                                                        &last_block_in_bio,
                                                        rac != NULL, false);
-                               f2fs_destroy_compress_ctx(&cc);
+                               f2fs_destroy_compress_ctx(&cc, false);
                        }
                }
 #endif
@@ -3033,7 +3033,7 @@ next:
                }
        }
        if (f2fs_compressed_file(inode))
-               f2fs_destroy_compress_ctx(&cc);
+               f2fs_destroy_compress_ctx(&cc, false);
 #endif
        if (retry) {
                index = 0;
@@ -3801,6 +3801,7 @@ static int f2fs_is_file_aligned(struct inode *inode)
        block_t pblock;
        unsigned long nr_pblocks;
        unsigned int blocks_per_sec = BLKS_PER_SEC(sbi);
+       unsigned int not_aligned = 0;
        int ret = 0;
 
        cur_lblock = 0;
@@ -3833,13 +3834,20 @@ static int f2fs_is_file_aligned(struct inode *inode)
 
                if ((pblock - main_blkaddr) & (blocks_per_sec - 1) ||
                        nr_pblocks & (blocks_per_sec - 1)) {
-                       f2fs_err(sbi, "Swapfile does not align to section");
-                       ret = -EINVAL;
-                       goto out;
+                       if (f2fs_is_pinned_file(inode)) {
+                               f2fs_err(sbi, "Swapfile does not align to section");
+                               ret = -EINVAL;
+                               goto out;
+                       }
+                       not_aligned++;
                }
 
                cur_lblock += nr_pblocks;
        }
+       if (not_aligned)
+               f2fs_warn(sbi, "Swapfile (%u) is not align to section: \n"
+                       "\t1) creat(), 2) ioctl(F2FS_IOC_SET_PIN_FILE), 3) fallocate()",
+                       not_aligned);
 out:
        return ret;
 }
@@ -3858,6 +3866,7 @@ static int check_swap_activate_fast(struct swap_info_struct *sis,
        int nr_extents = 0;
        unsigned long nr_pblocks;
        unsigned int blocks_per_sec = BLKS_PER_SEC(sbi);
+       unsigned int not_aligned = 0;
        int ret = 0;
 
        /*
@@ -3887,7 +3896,7 @@ static int check_swap_activate_fast(struct swap_info_struct *sis,
                /* hole */
                if (!(map.m_flags & F2FS_MAP_FLAGS)) {
                        f2fs_err(sbi, "Swapfile has holes\n");
-                       ret = -ENOENT;
+                       ret = -EINVAL;
                        goto out;
                }
 
@@ -3896,9 +3905,12 @@ static int check_swap_activate_fast(struct swap_info_struct *sis,
 
                if ((pblock - SM_I(sbi)->main_blkaddr) & (blocks_per_sec - 1) ||
                                nr_pblocks & (blocks_per_sec - 1)) {
-                       f2fs_err(sbi, "Swapfile does not align to section");
-                       ret = -EINVAL;
-                       goto out;
+                       if (f2fs_is_pinned_file(inode)) {
+                               f2fs_err(sbi, "Swapfile does not align to section");
+                               ret = -EINVAL;
+                               goto out;
+                       }
+                       not_aligned++;
                }
 
                if (cur_lblock + nr_pblocks >= sis->max)
@@ -3927,6 +3939,11 @@ static int check_swap_activate_fast(struct swap_info_struct *sis,
        sis->max = cur_lblock;
        sis->pages = cur_lblock - 1;
        sis->highest_bit = cur_lblock - 1;
+
+       if (not_aligned)
+               f2fs_warn(sbi, "Swapfile (%u) is not align to section: \n"
+                       "\t1) creat(), 2) ioctl(F2FS_IOC_SET_PIN_FILE), 3) fallocate()",
+                       not_aligned);
 out:
        return ret;
 }
@@ -4035,7 +4052,7 @@ out:
        return ret;
 bad_bmap:
        f2fs_err(sbi, "Swapfile has holes\n");
-       return -ENOENT;
+       return -EINVAL;
 }
 
 static int f2fs_swap_activate(struct swap_info_struct *sis, struct file *file,
index 0448788..c83d901 100644 (file)
@@ -3956,7 +3956,7 @@ struct decompress_io_ctx *f2fs_alloc_dic(struct compress_ctx *cc);
 void f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed);
 void f2fs_put_page_dic(struct page *page);
 int f2fs_init_compress_ctx(struct compress_ctx *cc);
-void f2fs_destroy_compress_ctx(struct compress_ctx *cc);
+void f2fs_destroy_compress_ctx(struct compress_ctx *cc, bool reuse);
 void f2fs_init_compress_info(struct f2fs_sb_info *sbi);
 int f2fs_init_page_array_cache(struct f2fs_sb_info *sbi);
 void f2fs_destroy_page_array_cache(struct f2fs_sb_info *sbi);
index 44a4650..ceb575f 100644 (file)
@@ -1817,7 +1817,8 @@ static int f2fs_setflags_common(struct inode *inode, u32 iflags, u32 mask)
        struct f2fs_inode_info *fi = F2FS_I(inode);
        u32 masked_flags = fi->i_flags & mask;
 
-       f2fs_bug_on(F2FS_I_SB(inode), (iflags & ~mask));
+       /* mask can be shrunk by flags_valid selector */
+       iflags &= mask;
 
        /* Is it quota file? Do not allow user to mess with it */
        if (IS_NOQUOTA(inode))
index c605415..51dc79f 100644 (file)
@@ -3574,12 +3574,12 @@ int f2fs_inplace_write_data(struct f2fs_io_info *fio)
 
        return err;
 drop_bio:
-       if (fio->bio) {
+       if (fio->bio && *(fio->bio)) {
                struct bio *bio = *(fio->bio);
 
                bio->bi_status = BLK_STS_IOERR;
                bio_endio(bio);
-               fio->bio = NULL;
+               *(fio->bio) = NULL;
        }
        return err;
 }
index a930ddd..7054a54 100644 (file)
@@ -598,13 +598,15 @@ void hfsplus_file_truncate(struct inode *inode)
                res = __hfsplus_ext_cache_extent(&fd, inode, alloc_cnt);
                if (res)
                        break;
-               hfs_brec_remove(&fd);
 
-               mutex_unlock(&fd.tree->tree_lock);
                start = hip->cached_start;
+               if (blk_cnt <= start)
+                       hfs_brec_remove(&fd);
+               mutex_unlock(&fd.tree->tree_lock);
                hfsplus_free_extents(sb, hip->cached_extents,
                                     alloc_cnt - start, alloc_cnt - blk_cnt);
                hfsplus_dump_extent(hip->cached_extents);
+               mutex_lock(&fd.tree->tree_lock);
                if (blk_cnt > start) {
                        hip->extent_state |= HFSPLUS_EXT_DIRTY;
                        break;
@@ -612,7 +614,6 @@ void hfsplus_file_truncate(struct inode *inode)
                alloc_cnt = start;
                hip->cached_start = hip->cached_blocks = 0;
                hip->extent_state &= ~(HFSPLUS_EXT_DIRTY | HFSPLUS_EXT_NEW);
-               mutex_lock(&fd.tree->tree_lock);
        }
        hfs_find_exit(&fd);
 
index a2a4233..55efd3d 100644 (file)
@@ -131,6 +131,7 @@ static void huge_pagevec_release(struct pagevec *pvec)
 static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma)
 {
        struct inode *inode = file_inode(file);
+       struct hugetlbfs_inode_info *info = HUGETLBFS_I(inode);
        loff_t len, vma_len;
        int ret;
        struct hstate *h = hstate_file(file);
@@ -146,6 +147,10 @@ static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma)
        vma->vm_flags |= VM_HUGETLB | VM_DONTEXPAND;
        vma->vm_ops = &hugetlb_vm_ops;
 
+       ret = seal_check_future_write(info->seals, vma);
+       if (ret)
+               return ret;
+
        /*
         * page based offset in vm_pgoff could be sufficiently large to
         * overflow a loff_t when converted to byte offset.  This can
@@ -524,7 +529,7 @@ static void remove_inode_hugepages(struct inode *inode, loff_t lstart,
                         * the subpool and global reserve usage count can need
                         * to be adjusted.
                         */
-                       VM_BUG_ON(PagePrivate(page));
+                       VM_BUG_ON(HPageRestoreReserve(page));
                        remove_huge_page(page);
                        freed++;
                        if (!truncate_op) {
index f46acbb..5f82954 100644 (file)
 #define IORING_MAX_RESTRICTIONS        (IORING_RESTRICTION_LAST + \
                                 IORING_REGISTER_LAST + IORING_OP_LAST)
 
+#define IORING_MAX_REG_BUFFERS (1U << 14)
+
 #define SQE_VALID_FLAGS        (IOSQE_FIXED_FILE|IOSQE_IO_DRAIN|IOSQE_IO_LINK| \
                                IOSQE_IO_HARDLINK | IOSQE_ASYNC | \
                                IOSQE_BUFFER_SELECT)
@@ -4035,7 +4037,7 @@ static int io_epoll_ctl_prep(struct io_kiocb *req,
 #if defined(CONFIG_EPOLL)
        if (sqe->ioprio || sqe->buf_index)
                return -EINVAL;
-       if (unlikely(req->ctx->flags & (IORING_SETUP_IOPOLL | IORING_SETUP_SQPOLL)))
+       if (unlikely(req->ctx->flags & IORING_SETUP_IOPOLL))
                return -EINVAL;
 
        req->epoll.epfd = READ_ONCE(sqe->fd);
@@ -4150,7 +4152,7 @@ static int io_fadvise(struct io_kiocb *req, unsigned int issue_flags)
 
 static int io_statx_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
 {
-       if (unlikely(req->ctx->flags & (IORING_SETUP_IOPOLL | IORING_SETUP_SQPOLL)))
+       if (unlikely(req->ctx->flags & IORING_SETUP_IOPOLL))
                return -EINVAL;
        if (sqe->ioprio || sqe->buf_index)
                return -EINVAL;
@@ -5017,10 +5019,10 @@ static void __io_queue_proc(struct io_poll_iocb *poll, struct io_poll_table *pt,
                 * Can't handle multishot for double wait for now, turn it
                 * into one-shot mode.
                 */
-               if (!(req->poll.events & EPOLLONESHOT))
-                       req->poll.events |= EPOLLONESHOT;
+               if (!(poll_one->events & EPOLLONESHOT))
+                       poll_one->events |= EPOLLONESHOT;
                /* double add on the same waitqueue head, ignore */
-               if (poll->head == head)
+               if (poll_one->head == head)
                        return;
                poll = kmalloc(sizeof(*poll), GFP_ATOMIC);
                if (!poll) {
@@ -5827,8 +5829,6 @@ done:
 static int io_rsrc_update_prep(struct io_kiocb *req,
                                const struct io_uring_sqe *sqe)
 {
-       if (unlikely(req->ctx->flags & IORING_SETUP_SQPOLL))
-               return -EINVAL;
        if (unlikely(req->flags & (REQ_F_FIXED_FILE | REQ_F_BUFFER_SELECT)))
                return -EINVAL;
        if (sqe->ioprio || sqe->rw_flags)
@@ -6354,19 +6354,20 @@ static enum hrtimer_restart io_link_timeout_fn(struct hrtimer *timer)
         * We don't expect the list to be empty, that will only happen if we
         * race with the completion of the linked work.
         */
-       if (prev && req_ref_inc_not_zero(prev))
+       if (prev) {
                io_remove_next_linked(prev);
-       else
-               prev = NULL;
+               if (!req_ref_inc_not_zero(prev))
+                       prev = NULL;
+       }
        spin_unlock_irqrestore(&ctx->completion_lock, flags);
 
        if (prev) {
                io_async_find_and_cancel(ctx, req, prev->user_data, -ETIME);
                io_put_req_deferred(prev, 1);
+               io_put_req_deferred(req, 1);
        } else {
                io_req_complete_post(req, -ETIME, 0);
        }
-       io_put_req_deferred(req, 1);
        return HRTIMER_NORESTART;
 }
 
@@ -8390,7 +8391,7 @@ static int io_sqe_buffers_register(struct io_ring_ctx *ctx, void __user *arg,
 
        if (ctx->user_bufs)
                return -EBUSY;
-       if (!nr_args || nr_args > UIO_MAXIOV)
+       if (!nr_args || nr_args > IORING_MAX_REG_BUFFERS)
                return -EINVAL;
        ret = io_rsrc_node_switch_start(ctx);
        if (ret)
@@ -9034,15 +9035,15 @@ static void io_uring_del_task_file(unsigned long index)
 
 static void io_uring_clean_tctx(struct io_uring_task *tctx)
 {
+       struct io_wq *wq = tctx->io_wq;
        struct io_tctx_node *node;
        unsigned long index;
 
+       tctx->io_wq = NULL;
        xa_for_each(&tctx->xa, index, node)
                io_uring_del_task_file(index);
-       if (tctx->io_wq) {
-               io_wq_put_and_exit(tctx->io_wq);
-               tctx->io_wq = NULL;
-       }
+       if (wq)
+               io_wq_put_and_exit(wq);
 }
 
 static s64 tctx_inflight(struct io_uring_task *tctx, bool tracked)
index f2cd203..9023717 100644 (file)
@@ -394,7 +394,7 @@ void iomap_readahead(struct readahead_control *rac, const struct iomap_ops *ops)
 {
        struct inode *inode = rac->mapping->host;
        loff_t pos = readahead_pos(rac);
-       loff_t length = readahead_length(rac);
+       size_t length = readahead_length(rac);
        struct iomap_readpage_ctx ctx = {
                .rac    = rac,
        };
@@ -402,7 +402,7 @@ void iomap_readahead(struct readahead_control *rac, const struct iomap_ops *ops)
        trace_iomap_readahead(inode, readahead_count(rac));
 
        while (length > 0) {
-               loff_t ret = iomap_apply(inode, pos, length, 0, ops,
+               ssize_t ret = iomap_apply(inode, pos, length, 0, ops,
                                &ctx, iomap_readahead_actor);
                if (ret <= 0) {
                        WARN_ON_ONCE(ret == 0);
index f633378..c3f1a78 100644 (file)
@@ -3855,8 +3855,12 @@ static int can_idmap_mount(const struct mount_kattr *kattr, struct mount *mnt)
        if (!(m->mnt_sb->s_type->fs_flags & FS_ALLOW_IDMAP))
                return -EINVAL;
 
+       /* Don't yet support filesystem mountable in user namespaces. */
+       if (m->mnt_sb->s_user_ns != &init_user_ns)
+               return -EINVAL;
+
        /* We're not controlling the superblock. */
-       if (!ns_capable(m->mnt_sb->s_user_ns, CAP_SYS_ADMIN))
+       if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
 
        /* Mount has already been visible in the filesystem hierarchy. */
index 4f13734..22d904b 100644 (file)
@@ -288,14 +288,12 @@ static inline void remove_dquot_hash(struct dquot *dquot)
 static struct dquot *find_dquot(unsigned int hashent, struct super_block *sb,
                                struct kqid qid)
 {
-       struct hlist_node *node;
        struct dquot *dquot;
 
-       hlist_for_each (node, dquot_hash+hashent) {
-               dquot = hlist_entry(node, struct dquot, dq_hash);
+       hlist_for_each_entry(dquot, dquot_hash+hashent, dq_hash)
                if (dquot->dq_sb == sb && qid_eq(dquot->dq_id, qid))
                        return dquot;
-       }
+
        return NULL;
 }
 
index 040a114..167b588 100644 (file)
@@ -114,29 +114,24 @@ static int signalfd_copyinfo(struct signalfd_siginfo __user *uinfo,
                break;
        case SIL_FAULT_BNDERR:
        case SIL_FAULT_PKUERR:
+       case SIL_PERF_EVENT:
                /*
-                * Fall through to the SIL_FAULT case.  Both SIL_FAULT_BNDERR
-                * and SIL_FAULT_PKUERR are only generated by faults that
-                * deliver them synchronously to userspace.  In case someone
-                * injects one of these signals and signalfd catches it treat
-                * it as SIL_FAULT.
+                * Fall through to the SIL_FAULT case.  SIL_FAULT_BNDERR,
+                * SIL_FAULT_PKUERR, and SIL_PERF_EVENT are only
+                * generated by faults that deliver them synchronously to
+                * userspace.  In case someone injects one of these signals
+                * and signalfd catches it treat it as SIL_FAULT.
                 */
        case SIL_FAULT:
                new.ssi_addr = (long) kinfo->si_addr;
-#ifdef __ARCH_SI_TRAPNO
-               new.ssi_trapno = kinfo->si_trapno;
-#endif
                break;
-       case SIL_FAULT_MCEERR:
+       case SIL_FAULT_TRAPNO:
                new.ssi_addr = (long) kinfo->si_addr;
-#ifdef __ARCH_SI_TRAPNO
                new.ssi_trapno = kinfo->si_trapno;
-#endif
-               new.ssi_addr_lsb = (short) kinfo->si_addr_lsb;
                break;
-       case SIL_PERF_EVENT:
+       case SIL_FAULT_MCEERR:
                new.ssi_addr = (long) kinfo->si_addr;
-               new.ssi_perf = kinfo->si_perf;
+               new.ssi_addr_lsb = (short) kinfo->si_addr_lsb;
                break;
        case SIL_CHLD:
                new.ssi_pid    = kinfo->si_pid;
index 7b11283..89d4929 100644 (file)
@@ -211,11 +211,11 @@ failure:
  * If the skip factor is limited in this way then the file will use multiple
  * slots.
  */
-static inline int calculate_skip(int blocks)
+static inline int calculate_skip(u64 blocks)
 {
-       int skip = blocks / ((SQUASHFS_META_ENTRIES + 1)
+       u64 skip = blocks / ((SQUASHFS_META_ENTRIES + 1)
                 * SQUASHFS_META_INDEXES);
-       return min(SQUASHFS_CACHED_BLKS - 1, skip + 1);
+       return min((u64) SQUASHFS_CACHED_BLKS - 1, skip + 1);
 }
 
 
index a83bdd0..bde2b4c 100644 (file)
@@ -770,6 +770,8 @@ struct xfs_scrub_metadata {
 /*
  * ioctl commands that are used by Linux filesystems
  */
+#define XFS_IOC_GETXFLAGS      FS_IOC_GETFLAGS
+#define XFS_IOC_SETXFLAGS      FS_IOC_SETFLAGS
 #define XFS_IOC_GETVERSION     FS_IOC_GETVERSION
 
 /*
@@ -780,6 +782,8 @@ struct xfs_scrub_metadata {
 #define XFS_IOC_ALLOCSP                _IOW ('X', 10, struct xfs_flock64)
 #define XFS_IOC_FREESP         _IOW ('X', 11, struct xfs_flock64)
 #define XFS_IOC_DIOINFO                _IOR ('X', 30, struct dioattr)
+#define XFS_IOC_FSGETXATTR     FS_IOC_FSGETXATTR
+#define XFS_IOC_FSSETXATTR     FS_IOC_FSSETXATTR
 #define XFS_IOC_ALLOCSP64      _IOW ('X', 36, struct xfs_flock64)
 #define XFS_IOC_FREESP64       _IOW ('X', 37, struct xfs_flock64)
 #define XFS_IOC_GETBMAP                _IOWR('X', 38, struct getbmap)
index aa87460..be38c96 100644 (file)
@@ -74,7 +74,9 @@ __xchk_process_error(
                return true;
        case -EDEADLOCK:
                /* Used to restart an op with deadlock avoidance. */
-               trace_xchk_deadlock_retry(sc->ip, sc->sm, *error);
+               trace_xchk_deadlock_retry(
+                               sc->ip ? sc->ip : XFS_I(file_inode(sc->file)),
+                               sc->sm, *error);
                break;
        case -EFSBADCRC:
        case -EFSCORRUPTED:
index a5e9d7d..0936f3a 100644 (file)
@@ -71,18 +71,24 @@ xfs_zero_extent(
 #ifdef CONFIG_XFS_RT
 int
 xfs_bmap_rtalloc(
-       struct xfs_bmalloca     *ap)    /* bmap alloc argument struct */
+       struct xfs_bmalloca     *ap)
 {
-       int             error;          /* error return value */
-       xfs_mount_t     *mp;            /* mount point structure */
-       xfs_extlen_t    prod = 0;       /* product factor for allocators */
-       xfs_extlen_t    mod = 0;        /* product factor for allocators */
-       xfs_extlen_t    ralen = 0;      /* realtime allocation length */
-       xfs_extlen_t    align;          /* minimum allocation alignment */
-       xfs_rtblock_t   rtb;
-
-       mp = ap->ip->i_mount;
+       struct xfs_mount        *mp = ap->ip->i_mount;
+       xfs_fileoff_t           orig_offset = ap->offset;
+       xfs_rtblock_t           rtb;
+       xfs_extlen_t            prod = 0;  /* product factor for allocators */
+       xfs_extlen_t            mod = 0;   /* product factor for allocators */
+       xfs_extlen_t            ralen = 0; /* realtime allocation length */
+       xfs_extlen_t            align;     /* minimum allocation alignment */
+       xfs_extlen_t            orig_length = ap->length;
+       xfs_extlen_t            minlen = mp->m_sb.sb_rextsize;
+       xfs_extlen_t            raminlen;
+       bool                    rtlocked = false;
+       bool                    ignore_locality = false;
+       int                     error;
+
        align = xfs_get_extsz_hint(ap->ip);
+retry:
        prod = align / mp->m_sb.sb_rextsize;
        error = xfs_bmap_extsize_align(mp, &ap->got, &ap->prev,
                                        align, 1, ap->eof, 0,
@@ -93,6 +99,15 @@ xfs_bmap_rtalloc(
        ASSERT(ap->length % mp->m_sb.sb_rextsize == 0);
 
        /*
+        * If we shifted the file offset downward to satisfy an extent size
+        * hint, increase minlen by that amount so that the allocator won't
+        * give us an allocation that's too short to cover at least one of the
+        * blocks that the caller asked for.
+        */
+       if (ap->offset != orig_offset)
+               minlen += orig_offset - ap->offset;
+
+       /*
         * If the offset & length are not perfectly aligned
         * then kill prod, it will just get us in trouble.
         */
@@ -116,10 +131,13 @@ xfs_bmap_rtalloc(
        /*
         * Lock out modifications to both the RT bitmap and summary inodes
         */
-       xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL|XFS_ILOCK_RTBITMAP);
-       xfs_trans_ijoin(ap->tp, mp->m_rbmip, XFS_ILOCK_EXCL);
-       xfs_ilock(mp->m_rsumip, XFS_ILOCK_EXCL|XFS_ILOCK_RTSUM);
-       xfs_trans_ijoin(ap->tp, mp->m_rsumip, XFS_ILOCK_EXCL);
+       if (!rtlocked) {
+               xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL|XFS_ILOCK_RTBITMAP);
+               xfs_trans_ijoin(ap->tp, mp->m_rbmip, XFS_ILOCK_EXCL);
+               xfs_ilock(mp->m_rsumip, XFS_ILOCK_EXCL|XFS_ILOCK_RTSUM);
+               xfs_trans_ijoin(ap->tp, mp->m_rsumip, XFS_ILOCK_EXCL);
+               rtlocked = true;
+       }
 
        /*
         * If it's an allocation to an empty file at offset 0,
@@ -141,33 +159,59 @@ xfs_bmap_rtalloc(
        /*
         * Realtime allocation, done through xfs_rtallocate_extent.
         */
-       do_div(ap->blkno, mp->m_sb.sb_rextsize);
+       if (ignore_locality)
+               ap->blkno = 0;
+       else
+               do_div(ap->blkno, mp->m_sb.sb_rextsize);
        rtb = ap->blkno;
        ap->length = ralen;
-       error = xfs_rtallocate_extent(ap->tp, ap->blkno, 1, ap->length,
-                               &ralen, ap->wasdel, prod, &rtb);
+       raminlen = max_t(xfs_extlen_t, 1, minlen / mp->m_sb.sb_rextsize);
+       error = xfs_rtallocate_extent(ap->tp, ap->blkno, raminlen, ap->length,
+                       &ralen, ap->wasdel, prod, &rtb);
        if (error)
                return error;
 
-       ap->blkno = rtb;
-       if (ap->blkno != NULLFSBLOCK) {
-               ap->blkno *= mp->m_sb.sb_rextsize;
-               ralen *= mp->m_sb.sb_rextsize;
-               ap->length = ralen;
-               ap->ip->i_nblocks += ralen;
+       if (rtb != NULLRTBLOCK) {
+               ap->blkno = rtb * mp->m_sb.sb_rextsize;
+               ap->length = ralen * mp->m_sb.sb_rextsize;
+               ap->ip->i_nblocks += ap->length;
                xfs_trans_log_inode(ap->tp, ap->ip, XFS_ILOG_CORE);
                if (ap->wasdel)
-                       ap->ip->i_delayed_blks -= ralen;
+                       ap->ip->i_delayed_blks -= ap->length;
                /*
                 * Adjust the disk quota also. This was reserved
                 * earlier.
                 */
                xfs_trans_mod_dquot_byino(ap->tp, ap->ip,
                        ap->wasdel ? XFS_TRANS_DQ_DELRTBCOUNT :
-                                       XFS_TRANS_DQ_RTBCOUNT, (long) ralen);
-       } else {
-               ap->length = 0;
+                                       XFS_TRANS_DQ_RTBCOUNT, ap->length);
+               return 0;
        }
+
+       if (align > mp->m_sb.sb_rextsize) {
+               /*
+                * We previously enlarged the request length to try to satisfy
+                * an extent size hint.  The allocator didn't return anything,
+                * so reset the parameters to the original values and try again
+                * without alignment criteria.
+                */
+               ap->offset = orig_offset;
+               ap->length = orig_length;
+               minlen = align = mp->m_sb.sb_rextsize;
+               goto retry;
+       }
+
+       if (!ignore_locality && ap->blkno != 0) {
+               /*
+                * If we can't allocate near a specific rt extent, try again
+                * without locality criteria.
+                */
+               ignore_locality = true;
+               goto retry;
+       }
+
+       ap->blkno = NULLFSBLOCK;
+       ap->length = 0;
        return 0;
 }
 #endif /* CONFIG_XFS_RT */
diff --git a/include/dt-bindings/clock/r9a07g044-cpg.h b/include/dt-bindings/clock/r9a07g044-cpg.h
new file mode 100644 (file)
index 0000000..1d89865
--- /dev/null
@@ -0,0 +1,89 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+ *
+ * Copyright (C) 2021 Renesas Electronics Corp.
+ */
+#ifndef __DT_BINDINGS_CLOCK_R9A07G044_CPG_H__
+#define __DT_BINDINGS_CLOCK_R9A07G044_CPG_H__
+
+#include <dt-bindings/clock/renesas-cpg-mssr.h>
+
+/* R9A07G044 CPG Core Clocks */
+#define R9A07G044_CLK_I                        0
+#define R9A07G044_CLK_I2               1
+#define R9A07G044_CLK_G                        2
+#define R9A07G044_CLK_S0               3
+#define R9A07G044_CLK_S1               4
+#define R9A07G044_CLK_SPI0             5
+#define R9A07G044_CLK_SPI1             6
+#define R9A07G044_CLK_SD0              7
+#define R9A07G044_CLK_SD1              8
+#define R9A07G044_CLK_M0               9
+#define R9A07G044_CLK_M1               10
+#define R9A07G044_CLK_M2               11
+#define R9A07G044_CLK_M3               12
+#define R9A07G044_CLK_M4               13
+#define R9A07G044_CLK_HP               14
+#define R9A07G044_CLK_TSU              15
+#define R9A07G044_CLK_ZT               16
+#define R9A07G044_CLK_P0               17
+#define R9A07G044_CLK_P1               18
+#define R9A07G044_CLK_P2               19
+#define R9A07G044_CLK_AT               20
+#define R9A07G044_OSCCLK               21
+
+/* R9A07G044 Module Clocks */
+#define R9A07G044_CLK_GIC600           0
+#define R9A07G044_CLK_IA55             1
+#define R9A07G044_CLK_SYC              2
+#define R9A07G044_CLK_DMAC             3
+#define R9A07G044_CLK_SYSC             4
+#define R9A07G044_CLK_MTU              5
+#define R9A07G044_CLK_GPT              6
+#define R9A07G044_CLK_ETH0             7
+#define R9A07G044_CLK_ETH1             8
+#define R9A07G044_CLK_I2C0             9
+#define R9A07G044_CLK_I2C1             10
+#define R9A07G044_CLK_I2C2             11
+#define R9A07G044_CLK_I2C3             12
+#define R9A07G044_CLK_SCIF0            13
+#define R9A07G044_CLK_SCIF1            14
+#define R9A07G044_CLK_SCIF2            15
+#define R9A07G044_CLK_SCIF3            16
+#define R9A07G044_CLK_SCIF4            17
+#define R9A07G044_CLK_SCI0             18
+#define R9A07G044_CLK_SCI1             19
+#define R9A07G044_CLK_GPIO             20
+#define R9A07G044_CLK_SDHI0            21
+#define R9A07G044_CLK_SDHI1            22
+#define R9A07G044_CLK_USB0             23
+#define R9A07G044_CLK_USB1             24
+#define R9A07G044_CLK_CANFD            25
+#define R9A07G044_CLK_SSI0             26
+#define R9A07G044_CLK_SSI1             27
+#define R9A07G044_CLK_SSI2             28
+#define R9A07G044_CLK_SSI3             29
+#define R9A07G044_CLK_MHU              30
+#define R9A07G044_CLK_OSTM0            31
+#define R9A07G044_CLK_OSTM1            32
+#define R9A07G044_CLK_OSTM2            33
+#define R9A07G044_CLK_WDT0             34
+#define R9A07G044_CLK_WDT1             35
+#define R9A07G044_CLK_WDT2             36
+#define R9A07G044_CLK_WDT_PON          37
+#define R9A07G044_CLK_GPU              38
+#define R9A07G044_CLK_ISU              39
+#define R9A07G044_CLK_H264             40
+#define R9A07G044_CLK_CRU              41
+#define R9A07G044_CLK_MIPI_DSI         42
+#define R9A07G044_CLK_LCDC             43
+#define R9A07G044_CLK_SRC              44
+#define R9A07G044_CLK_RSPI0            45
+#define R9A07G044_CLK_RSPI1            46
+#define R9A07G044_CLK_RSPI2            47
+#define R9A07G044_CLK_ADC              48
+#define R9A07G044_CLK_TSU_PCLK         49
+#define R9A07G044_CLK_SPI              50
+#define R9A07G044_CLK_MIPI_DSI_V       51
+#define R9A07G044_CLK_MIPI_DSI_PIN     52
+
+#endif /* __DT_BINDINGS_CLOCK_R9A07G044_CPG_H__ */
index 4c23eef..eb91a6c 100644 (file)
@@ -29,5 +29,6 @@
 #define IPCC_CLIENT_PCIE1              14
 #define IPCC_CLIENT_PCIE2              15
 #define IPCC_CLIENT_SPSS               16
+#define IPCC_CLIENT_WPSS               24
 
 #endif
index 0359bfd..93064c7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This header provides constants for hisilicon pinctrl bindings.
  *
- * Copyright (c) 2015 Hisilicon Limited.
+ * Copyright (c) 2015 HiSilicon Limited.
  * Copyright (c) 2015 Linaro Limited.
  *
  * This program is free software; you can redistribute it and/or modify
index 7f475d5..87d1126 100644 (file)
@@ -22,7 +22,7 @@
 #include <linux/build_bug.h>
 #define GENMASK_INPUT_CHECK(h, l) \
        (BUILD_BUG_ON_ZERO(__builtin_choose_expr( \
-               __builtin_constant_p((l) > (h)), (l) > (h), 0)))
+               __is_constexpr((l) > (h)), (l) > (h), 0)))
 #else
 /*
  * BUILD_BUG_ON_ZERO is not available in h files included from asm files,
index 1255823..f69c75b 100644 (file)
@@ -676,11 +676,6 @@ bool blk_queue_flag_test_and_set(unsigned int flag, struct request_queue *q);
 extern void blk_set_pm_only(struct request_queue *q);
 extern void blk_clear_pm_only(struct request_queue *q);
 
-static inline bool blk_account_rq(struct request *rq)
-{
-       return (rq->rq_flags & RQF_STARTED) && !blk_rq_is_passthrough(rq);
-}
-
 #define list_entry_rq(ptr)     list_entry((ptr), struct request, queuelist)
 
 #define rq_data_dir(rq)                (op_is_write(req_op(rq)) ? WRITE : READ)
index 98dd7b3..8855b1b 100644 (file)
@@ -213,12 +213,11 @@ typedef struct compat_siginfo {
                /* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, SIGEMT */
                struct {
                        compat_uptr_t _addr;    /* faulting insn/memory ref. */
-#ifdef __ARCH_SI_TRAPNO
-                       int _trapno;    /* TRAP # which caused the signal */
-#endif
 #define __COMPAT_ADDR_BND_PKEY_PAD  (__alignof__(compat_uptr_t) < sizeof(short) ? \
                                     sizeof(short) : __alignof__(compat_uptr_t))
                        union {
+                               /* used on alpha and sparc */
+                               int _trapno;    /* TRAP # which caused the signal */
                                /*
                                 * used when si_code=BUS_MCEERR_AR or
                                 * used when si_code=BUS_MCEERR_AO
@@ -236,7 +235,10 @@ typedef struct compat_siginfo {
                                        u32 _pkey;
                                } _addr_pkey;
                                /* used when si_code=TRAP_PERF */
-                               compat_ulong_t _perf;
+                               struct {
+                                       compat_ulong_t _data;
+                                       u32 _type;
+                               } _perf;
                        };
                } _sigfault;
 
index 1537348..d5b9c8d 100644 (file)
@@ -101,6 +101,7 @@ struct vc_data {
        unsigned int    vc_rows;
        unsigned int    vc_size_row;            /* Bytes per row */
        unsigned int    vc_scan_lines;          /* # of scan lines */
+       unsigned int    vc_cell_height;         /* CRTC character cell height */
        unsigned long   vc_origin;              /* [!] Start of real screen */
        unsigned long   vc_scr_end;             /* [!] End of real screen */
        unsigned long   vc_visible_origin;      /* [!] Top of visible window */
index 81b8aae..435ddd7 100644 (file)
@@ -3,4 +3,12 @@
 
 #include <vdso/const.h>
 
+/*
+ * This returns a constant expression while determining if an argument is
+ * a constant expression, most importantly without evaluating the argument.
+ * Glory to Martin Uecker <Martin.Uecker@med.uni-goettingen.de>
+ */
+#define __is_constexpr(x) \
+       (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
+
 #endif /* _LINUX_CONST_H */
index a57ee75..dce631e 100644 (file)
@@ -32,6 +32,11 @@ struct _ddebug {
 #define _DPRINTK_FLAGS_INCL_FUNCNAME   (1<<2)
 #define _DPRINTK_FLAGS_INCL_LINENO     (1<<3)
 #define _DPRINTK_FLAGS_INCL_TID                (1<<4)
+
+#define _DPRINTK_FLAGS_INCL_ANY                \
+       (_DPRINTK_FLAGS_INCL_MODNAME | _DPRINTK_FLAGS_INCL_FUNCNAME |\
+        _DPRINTK_FLAGS_INCL_LINENO  | _DPRINTK_FLAGS_INCL_TID)
+
 #if defined DEBUG
 #define _DPRINTK_FLAGS_DEFAULT _DPRINTK_FLAGS_PRINT
 #else
index 1fe8e10..dcb2f90 100644 (file)
@@ -34,7 +34,7 @@ struct elevator_mq_ops {
        void (*depth_updated)(struct blk_mq_hw_ctx *);
 
        bool (*allow_merge)(struct request_queue *, struct request *, struct bio *);
-       bool (*bio_merge)(struct blk_mq_hw_ctx *, struct bio *, unsigned int);
+       bool (*bio_merge)(struct request_queue *, struct bio *, unsigned int);
        int (*request_merge)(struct request_queue *q, struct request **, struct bio *);
        void (*request_merged)(struct request_queue *, struct request *, enum elv_merge);
        void (*requests_merged)(struct request_queue *, struct request *, struct request *);
index ed4e67a..5982851 100644 (file)
@@ -187,5 +187,6 @@ extern u32 fw_devlink_get_flags(void);
 extern bool fw_devlink_is_strict(void);
 int fwnode_link_add(struct fwnode_handle *con, struct fwnode_handle *sup);
 void fwnode_links_purge(struct fwnode_handle *fwnode);
+void fw_devlink_purge_absent_suppliers(struct fwnode_handle *fwnode);
 
 #endif
index 7e9660e..6fc26f7 100644 (file)
@@ -306,8 +306,6 @@ static inline void bd_unlink_disk_holder(struct block_device *bdev,
 }
 #endif /* CONFIG_SYSFS */
 
-extern struct rw_semaphore bdev_lookup_sem;
-
 dev_t blk_lookup_devt(const char *name, int partno);
 void blk_request_module(dev_t devt);
 #ifdef CONFIG_BLOCK
index 01f251b..89b69e6 100644 (file)
@@ -141,7 +141,6 @@ static inline void __iomem *devm_nvdimm_ioremap(struct device *dev,
 
 struct nvdimm_bus;
 struct module;
-struct device;
 struct nd_blk_region;
 struct nd_blk_region_desc {
        int (*enable)(struct nvdimm_bus *nvdimm_bus, struct device *dev);
index c0f57b0..5433c08 100644 (file)
@@ -2,6 +2,8 @@
 #ifndef _LINUX_MINMAX_H
 #define _LINUX_MINMAX_H
 
+#include <linux/const.h>
+
 /*
  * min()/max()/clamp() macros must accomplish three things:
  *
 #define __typecheck(x, y) \
        (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
 
-/*
- * This returns a constant expression while determining if an argument is
- * a constant expression, most importantly without evaluating the argument.
- * Glory to Martin Uecker <Martin.Uecker@med.uni-goettingen.de>
- */
-#define __is_constexpr(x) \
-       (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
-
 #define __no_side_effects(x, y) \
                (__is_constexpr(x) && __is_constexpr(y))
 
index 322ec61..c274f75 100644 (file)
@@ -3216,5 +3216,37 @@ void mem_dump_obj(void *object);
 static inline void mem_dump_obj(void *object) {}
 #endif
 
+/**
+ * seal_check_future_write - Check for F_SEAL_FUTURE_WRITE flag and handle it
+ * @seals: the seals to check
+ * @vma: the vma to operate on
+ *
+ * Check whether F_SEAL_FUTURE_WRITE is set; if so, do proper check/handling on
+ * the vma flags.  Return 0 if check pass, or <0 for errors.
+ */
+static inline int seal_check_future_write(int seals, struct vm_area_struct *vma)
+{
+       if (seals & F_SEAL_FUTURE_WRITE) {
+               /*
+                * New PROT_WRITE and MAP_SHARED mmaps are not allowed when
+                * "future write" seal active.
+                */
+               if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_WRITE))
+                       return -EPERM;
+
+               /*
+                * Since an F_SEAL_FUTURE_WRITE sealed memfd can be mapped as
+                * MAP_SHARED and read-only, take care to not allow mprotect to
+                * revert protections on such mappings. Do this only for shared
+                * mappings. For private mappings, don't need to mask
+                * VM_MAYWRITE as we still want them to be COW-writable.
+                */
+               if (vma->vm_flags & VM_SHARED)
+                       vma->vm_flags &= ~(VM_MAYWRITE);
+       }
+
+       return 0;
+}
+
 #endif /* __KERNEL__ */
 #endif /* _LINUX_MM_H */
index 6613b26..5aacc1c 100644 (file)
@@ -97,10 +97,10 @@ struct page {
                };
                struct {        /* page_pool used by netstack */
                        /**
-                        * @dma_addr: might require a 64-bit value even on
+                        * @dma_addr: might require a 64-bit value on
                         * 32-bit architectures.
                         */
-                       dma_addr_t dma_addr;
+                       unsigned long dma_addr[2];
                };
                struct {        /* slab, slob and slub */
                        union {
index a4bd411..e89df44 100644 (file)
@@ -997,9 +997,9 @@ static inline loff_t readahead_pos(struct readahead_control *rac)
  * readahead_length - The number of bytes in this readahead request.
  * @rac: The readahead request.
  */
-static inline loff_t readahead_length(struct readahead_control *rac)
+static inline size_t readahead_length(struct readahead_control *rac)
 {
-       return (loff_t)rac->_nr_pages * PAGE_SIZE;
+       return rac->_nr_pages * PAGE_SIZE;
 }
 
 /**
@@ -1024,7 +1024,7 @@ static inline unsigned int readahead_count(struct readahead_control *rac)
  * readahead_batch_length - The number of bytes in the current batch.
  * @rac: The readahead request.
  */
-static inline loff_t readahead_batch_length(struct readahead_control *rac)
+static inline size_t readahead_batch_length(struct readahead_control *rac)
 {
        return rac->_batch_count * PAGE_SIZE;
 }
index c965740..1d8209c 100644 (file)
@@ -601,6 +601,7 @@ struct dev_pm_info {
        unsigned int            idle_notification:1;
        unsigned int            request_pending:1;
        unsigned int            deferred_resume:1;
+       unsigned int            needs_force_resume:1;
        unsigned int            runtime_auto:1;
        bool                    ignore_children:1;
        unsigned int            no_callbacks:1;
index fd80fab..bebc911 100644 (file)
@@ -38,7 +38,7 @@ void *__builtin_alloca(size_t size);
                u32 offset = raw_cpu_read(kstack_offset);               \
                u8 *ptr = __builtin_alloca(KSTACK_OFFSET_MAX(offset));  \
                /* Keep allocation even after "ptr" loses scope. */     \
-               asm volatile("" : "=o"(*ptr) :: "memory");              \
+               asm volatile("" :: "r"(ptr) : "memory");                \
        }                                                               \
 } while (0)
 
index 3f6a0fc..7f4278f 100644 (file)
@@ -326,6 +326,7 @@ int send_sig_mceerr(int code, void __user *, short, struct task_struct *);
 
 int force_sig_bnderr(void __user *addr, void __user *lower, void __user *upper);
 int force_sig_pkuerr(void __user *addr, u32 pkey);
+int force_sig_perf(void __user *addr, u32 type, u64 sig_data);
 
 int force_sig_ptrace_errno_trap(int errno, void __user *addr);
 
index 0dbfda8..201f88e 100644 (file)
@@ -40,6 +40,7 @@ enum siginfo_layout {
        SIL_TIMER,
        SIL_POLL,
        SIL_FAULT,
+       SIL_FAULT_TRAPNO,
        SIL_FAULT_MCEERR,
        SIL_FAULT_BNDERR,
        SIL_FAULT_PKUERR,
index 4441ad6..6ff9c58 100644 (file)
@@ -98,9 +98,9 @@ struct ssam_device_uid {
                     | (((fun) != SSAM_ANY_FUN) ? SSAM_MATCH_FUNCTION : 0),     \
        .domain   = d,                                                          \
        .category = cat,                                                        \
-       .target   = ((tid) != SSAM_ANY_TID) ? (tid) : 0,                        \
-       .instance = ((iid) != SSAM_ANY_IID) ? (iid) : 0,                        \
-       .function = ((fun) != SSAM_ANY_FUN) ? (fun) : 0                         \
+       .target   = __builtin_choose_expr((tid) != SSAM_ANY_TID, (tid), 0),     \
+       .instance = __builtin_choose_expr((iid) != SSAM_ANY_IID, (iid), 0),     \
+       .function = __builtin_choose_expr((fun) != SSAM_ANY_FUN, (fun), 0)
 
 /**
  * SSAM_VDEV() - Initialize a &struct ssam_device_id as virtual device with
index 6d517a3..b4b6de9 100644 (file)
@@ -198,7 +198,17 @@ static inline void page_pool_recycle_direct(struct page_pool *pool,
 
 static inline dma_addr_t page_pool_get_dma_addr(struct page *page)
 {
-       return page->dma_addr;
+       dma_addr_t ret = page->dma_addr[0];
+       if (sizeof(dma_addr_t) > sizeof(unsigned long))
+               ret |= (dma_addr_t)page->dma_addr[1] << 16 << 16;
+       return ret;
+}
+
+static inline void page_pool_set_dma_addr(struct page *page, dma_addr_t addr)
+{
+       page->dma_addr[0] = addr;
+       if (sizeof(dma_addr_t) > sizeof(unsigned long))
+               page->dma_addr[1] = upper_32_bits(addr);
 }
 
 static inline bool is_page_pool_compiled_in(void)
index 03d6f6d..5a3c221 100644 (file)
@@ -63,9 +63,6 @@ union __sifields {
        /* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, SIGEMT */
        struct {
                void __user *_addr; /* faulting insn/memory ref. */
-#ifdef __ARCH_SI_TRAPNO
-               int _trapno;    /* TRAP # which caused the signal */
-#endif
 #ifdef __ia64__
                int _imm;               /* immediate value for "break" */
                unsigned int _flags;    /* see ia64 si_flags */
@@ -75,6 +72,8 @@ union __sifields {
 #define __ADDR_BND_PKEY_PAD  (__alignof__(void *) < sizeof(short) ? \
                              sizeof(short) : __alignof__(void *))
                union {
+                       /* used on alpha and sparc */
+                       int _trapno;    /* TRAP # which caused the signal */
                        /*
                         * used when si_code=BUS_MCEERR_AR or
                         * used when si_code=BUS_MCEERR_AO
@@ -92,7 +91,10 @@ union __sifields {
                                __u32 _pkey;
                        } _addr_pkey;
                        /* used when si_code=TRAP_PERF */
-                       unsigned long _perf;
+                       struct {
+                               unsigned long _data;
+                               __u32 _type;
+                       } _perf;
                };
        } _sigfault;
 
@@ -150,14 +152,13 @@ typedef struct siginfo {
 #define si_int         _sifields._rt._sigval.sival_int
 #define si_ptr         _sifields._rt._sigval.sival_ptr
 #define si_addr                _sifields._sigfault._addr
-#ifdef __ARCH_SI_TRAPNO
 #define si_trapno      _sifields._sigfault._trapno
-#endif
 #define si_addr_lsb    _sifields._sigfault._addr_lsb
 #define si_lower       _sifields._sigfault._addr_bnd._lower
 #define si_upper       _sifields._sigfault._addr_bnd._upper
 #define si_pkey                _sifields._sigfault._addr_pkey._pkey
-#define si_perf                _sifields._sigfault._perf
+#define si_perf_data   _sifields._sigfault._perf._data
+#define si_perf_type   _sifields._sigfault._perf._type
 #define si_band                _sifields._sigpoll._band
 #define si_fd          _sifields._sigpoll._fd
 #define si_call_addr   _sifields._sigsys._call_addr
index f44eb0a..4c32e97 100644 (file)
@@ -185,7 +185,7 @@ struct fsxattr {
 #define BLKROTATIONAL _IO(0x12,126)
 #define BLKZEROOUT _IO(0x12,127)
 /*
- * A jump here: 130-131 are reserved for zoned block devices
+ * A jump here: 130-136 are reserved for zoned block devices
  * (see uapi/linux/blkzoned.h)
  */
 
index bf81435..f92880a 100644 (file)
@@ -464,7 +464,7 @@ struct perf_event_attr {
 
        /*
         * User provided data if sigtrap=1, passed back to user via
-        * siginfo_t::si_perf, e.g. to permit user to identify the event.
+        * siginfo_t::si_perf_data, e.g. to permit user to identify the event.
         */
        __u64   sig_data;
 };
index 7e33304..83429a0 100644 (file)
@@ -39,8 +39,6 @@ struct signalfd_siginfo {
        __s32 ssi_syscall;
        __u64 ssi_call_addr;
        __u32 ssi_arch;
-       __u32 __pad3;
-       __u64 ssi_perf;
 
        /*
         * Pad strcture to 128 bytes. Remember to update the
@@ -51,7 +49,7 @@ struct signalfd_siginfo {
         * comes out of a read(2) and we really don't want to have
         * a compat on read(2).
         */
-       __u8 __pad[16];
+       __u8 __pad[28];
 };
 
 
index d3e017b..6d2d34c 100644 (file)
@@ -239,6 +239,39 @@ enum gaudi_engine_id {
        GAUDI_ENGINE_ID_SIZE
 };
 
+/*
+ * ASIC specific PLL index
+ *
+ * Used to retrieve in frequency info of different IPs via
+ * HL_INFO_PLL_FREQUENCY under HL_IOCTL_INFO IOCTL. The enums need to be
+ * used as an index in struct hl_pll_frequency_info
+ */
+
+enum hl_goya_pll_index {
+       HL_GOYA_CPU_PLL = 0,
+       HL_GOYA_IC_PLL,
+       HL_GOYA_MC_PLL,
+       HL_GOYA_MME_PLL,
+       HL_GOYA_PCI_PLL,
+       HL_GOYA_EMMC_PLL,
+       HL_GOYA_TPC_PLL,
+       HL_GOYA_PLL_MAX
+};
+
+enum hl_gaudi_pll_index {
+       HL_GAUDI_CPU_PLL = 0,
+       HL_GAUDI_PCI_PLL,
+       HL_GAUDI_SRAM_PLL,
+       HL_GAUDI_HBM_PLL,
+       HL_GAUDI_NIC_PLL,
+       HL_GAUDI_DMA_PLL,
+       HL_GAUDI_MESH_PLL,
+       HL_GAUDI_MME_PLL,
+       HL_GAUDI_TPC_PLL,
+       HL_GAUDI_IF_PLL,
+       HL_GAUDI_PLL_MAX
+};
+
 enum hl_device_status {
        HL_DEVICE_STATUS_OPERATIONAL,
        HL_DEVICE_STATUS_IN_RESET,
index 2994fe6..33336ab 100644 (file)
@@ -2,6 +2,19 @@
 #ifndef _ASM_ARM_SWIOTLB_XEN_H
 #define _ASM_ARM_SWIOTLB_XEN_H
 
-extern int xen_swiotlb_detect(void);
+#include <xen/features.h>
+#include <xen/xen.h>
+
+static inline int xen_swiotlb_detect(void)
+{
+       if (!xen_domain())
+               return 0;
+       if (xen_feature(XENFEAT_direct_mapped))
+               return 1;
+       /* legacy case */
+       if (!xen_feature(XENFEAT_not_direct_mapped) && xen_initial_domain())
+               return 1;
+       return 0;
+}
 
 #endif /* _ASM_ARM_SWIOTLB_XEN_H */
index 8031464..4e4e611 100644 (file)
@@ -1004,12 +1004,14 @@ static inline void __pipelined_op(struct wake_q_head *wake_q,
                                  struct mqueue_inode_info *info,
                                  struct ext_wait_queue *this)
 {
+       struct task_struct *task;
+
        list_del(&this->list);
-       get_task_struct(this->task);
+       task = get_task_struct(this->task);
 
        /* see MQ_BARRIER for purpose/pairing */
        smp_store_release(&this->state, STATE_READY);
-       wake_q_add_safe(wake_q, this->task);
+       wake_q_add_safe(wake_q, task);
 }
 
 /* pipelined_send() - send a message directly to the task waiting in
index acd1bc7..6e6c8e0 100644 (file)
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -251,11 +251,13 @@ static void expunge_all(struct msg_queue *msq, int res,
        struct msg_receiver *msr, *t;
 
        list_for_each_entry_safe(msr, t, &msq->q_receivers, r_list) {
-               get_task_struct(msr->r_tsk);
+               struct task_struct *r_tsk;
+
+               r_tsk = get_task_struct(msr->r_tsk);
 
                /* see MSG_BARRIER for purpose/pairing */
                smp_store_release(&msr->r_msg, ERR_PTR(res));
-               wake_q_add_safe(wake_q, msr->r_tsk);
+               wake_q_add_safe(wake_q, r_tsk);
        }
 }
 
index e0ec239..bf534c7 100644 (file)
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -784,12 +784,14 @@ would_block:
 static inline void wake_up_sem_queue_prepare(struct sem_queue *q, int error,
                                             struct wake_q_head *wake_q)
 {
-       get_task_struct(q->sleeper);
+       struct task_struct *sleeper;
+
+       sleeper = get_task_struct(q->sleeper);
 
        /* see SEM_BARRIER_2 for purpose/pairing */
        smp_store_release(&q->status, error);
 
-       wake_q_add_safe(wake_q, q->sleeper);
+       wake_q_add_safe(wake_q, sleeper);
 }
 
 static void unlink_queue(struct sem_array *sma, struct sem_queue *q)
index 2e947a4..6fee4a7 100644 (file)
@@ -6389,8 +6389,6 @@ void perf_event_wakeup(struct perf_event *event)
 
 static void perf_sigtrap(struct perf_event *event)
 {
-       struct kernel_siginfo info;
-
        /*
         * We'd expect this to only occur if the irq_work is delayed and either
         * ctx->task or current has changed in the meantime. This can be the
@@ -6405,13 +6403,8 @@ static void perf_sigtrap(struct perf_event *event)
        if (current->flags & PF_EXITING)
                return;
 
-       clear_siginfo(&info);
-       info.si_signo = SIGTRAP;
-       info.si_code = TRAP_PERF;
-       info.si_errno = event->attr.type;
-       info.si_perf = event->attr.sig_data;
-       info.si_addr = (void __user *)event->pending_addr;
-       force_sig_info(&info);
+       force_sig_perf((void __user *)event->pending_addr,
+                      event->attr.type, event->attr.sig_data);
 }
 
 static void perf_pending_event_disable(struct perf_event *event)
index c1dd02f..e65de17 100644 (file)
@@ -266,9 +266,10 @@ static const struct file_operations debugfs_ops =
        .release = single_release
 };
 
-static void __init kcsan_debugfs_init(void)
+static int __init kcsan_debugfs_init(void)
 {
        debugfs_create_file("kcsan", 0644, NULL, NULL, &debugfs_ops);
+       return 0;
 }
 
 late_initcall(kcsan_debugfs_init);
index 48d736a..7641bd4 100644 (file)
@@ -5736,7 +5736,7 @@ void lock_contended(struct lockdep_map *lock, unsigned long ip)
 {
        unsigned long flags;
 
-       trace_lock_acquired(lock, ip);
+       trace_lock_contended(lock, ip);
 
        if (unlikely(!lock_stat || !lockdep_enabled()))
                return;
@@ -5754,7 +5754,7 @@ void lock_acquired(struct lockdep_map *lock, unsigned long ip)
 {
        unsigned long flags;
 
-       trace_lock_contended(lock, ip);
+       trace_lock_acquired(lock, ip);
 
        if (unlikely(!lock_stat || !lockdep_enabled()))
                return;
index a7276aa..db93015 100644 (file)
@@ -57,7 +57,7 @@ void debug_mutex_add_waiter(struct mutex *lock, struct mutex_waiter *waiter,
        task->blocked_on = waiter;
 }
 
-void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter,
+void debug_mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter,
                         struct task_struct *task)
 {
        DEBUG_LOCKS_WARN_ON(list_empty(&waiter->list));
@@ -65,7 +65,7 @@ void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter,
        DEBUG_LOCKS_WARN_ON(task->blocked_on != waiter);
        task->blocked_on = NULL;
 
-       list_del_init(&waiter->list);
+       INIT_LIST_HEAD(&waiter->list);
        waiter->task = NULL;
 }
 
index 1edd3f4..53e631e 100644 (file)
@@ -22,7 +22,7 @@ extern void debug_mutex_free_waiter(struct mutex_waiter *waiter);
 extern void debug_mutex_add_waiter(struct mutex *lock,
                                   struct mutex_waiter *waiter,
                                   struct task_struct *task);
-extern void mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter,
+extern void debug_mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter,
                                struct task_struct *task);
 extern void debug_mutex_unlock(struct mutex *lock);
 extern void debug_mutex_init(struct mutex *lock, const char *name,
index cb6b112..013e1b0 100644 (file)
@@ -194,7 +194,7 @@ static inline bool __mutex_waiter_is_first(struct mutex *lock, struct mutex_wait
  * Add @waiter to a given location in the lock wait_list and set the
  * FLAG_WAITERS flag if it's the first waiter.
  */
-static void __sched
+static void
 __mutex_add_waiter(struct mutex *lock, struct mutex_waiter *waiter,
                   struct list_head *list)
 {
@@ -205,6 +205,16 @@ __mutex_add_waiter(struct mutex *lock, struct mutex_waiter *waiter,
                __mutex_set_flag(lock, MUTEX_FLAG_WAITERS);
 }
 
+static void
+__mutex_remove_waiter(struct mutex *lock, struct mutex_waiter *waiter)
+{
+       list_del(&waiter->list);
+       if (likely(list_empty(&lock->wait_list)))
+               __mutex_clear_flag(lock, MUTEX_FLAGS);
+
+       debug_mutex_remove_waiter(lock, waiter, current);
+}
+
 /*
  * Give up ownership to a specific task, when @task = NULL, this is equivalent
  * to a regular unlock. Sets PICKUP on a handoff, clears HANDOFF, preserves
@@ -1061,9 +1071,7 @@ acquired:
                        __ww_mutex_check_waiters(lock, ww_ctx);
        }
 
-       mutex_remove_waiter(lock, &waiter, current);
-       if (likely(list_empty(&lock->wait_list)))
-               __mutex_clear_flag(lock, MUTEX_FLAGS);
+       __mutex_remove_waiter(lock, &waiter);
 
        debug_mutex_free_waiter(&waiter);
 
@@ -1080,7 +1088,7 @@ skip_wait:
 
 err:
        __set_current_state(TASK_RUNNING);
-       mutex_remove_waiter(lock, &waiter, current);
+       __mutex_remove_waiter(lock, &waiter);
 err_early_kill:
        spin_unlock(&lock->wait_lock);
        debug_mutex_free_waiter(&waiter);
index 1c2287d..f0c710b 100644 (file)
  * !CONFIG_DEBUG_MUTEXES case. Most of them are NOPs:
  */
 
-#define mutex_remove_waiter(lock, waiter, task) \
-               __list_del((waiter)->list.prev, (waiter)->list.next)
-
 #define debug_mutex_wake_waiter(lock, waiter)          do { } while (0)
 #define debug_mutex_free_waiter(waiter)                        do { } while (0)
 #define debug_mutex_add_waiter(lock, waiter, ti)       do { } while (0)
+#define debug_mutex_remove_waiter(lock, waiter, ti)     do { } while (0)
 #define debug_mutex_unlock(lock)                       do { } while (0)
 #define debug_mutex_init(lock, name, key)              do { } while (0)
 
index b5dd92e..7e78dfa 100644 (file)
@@ -2401,6 +2401,15 @@ static long get_offset(struct module *mod, unsigned int *size,
        return ret;
 }
 
+static bool module_init_layout_section(const char *sname)
+{
+#ifndef CONFIG_MODULE_UNLOAD
+       if (module_exit_section(sname))
+               return true;
+#endif
+       return module_init_section(sname);
+}
+
 /*
  * Lay out the SHF_ALLOC sections in a way not dissimilar to how ld
  * might -- code, read-only data, read-write data, small data.  Tally
@@ -2435,7 +2444,7 @@ static void layout_sections(struct module *mod, struct load_info *info)
                        if ((s->sh_flags & masks[m][0]) != masks[m][0]
                            || (s->sh_flags & masks[m][1])
                            || s->sh_entsize != ~0UL
-                           || module_init_section(sname))
+                           || module_init_layout_section(sname))
                                continue;
                        s->sh_entsize = get_offset(mod, &mod->core_layout.size, s, i);
                        pr_debug("\t%s\n", sname);
@@ -2468,7 +2477,7 @@ static void layout_sections(struct module *mod, struct load_info *info)
                        if ((s->sh_flags & masks[m][0]) != masks[m][0]
                            || (s->sh_flags & masks[m][1])
                            || s->sh_entsize != ~0UL
-                           || !module_init_section(sname))
+                           || !module_init_layout_section(sname))
                                continue;
                        s->sh_entsize = (get_offset(mod, &mod->init_layout.size, s, i)
                                         | INIT_OFFSET_MASK);
@@ -2807,11 +2816,7 @@ void * __weak module_alloc(unsigned long size)
 
 bool __weak module_init_section(const char *name)
 {
-#ifndef CONFIG_MODULE_UNLOAD
-       return strstarts(name, ".init") || module_exit_section(name);
-#else
        return strstarts(name, ".init");
-#endif
 }
 
 bool __weak module_exit_section(const char *name)
index 76f0945..2997ca6 100644 (file)
@@ -170,6 +170,21 @@ void __ptrace_unlink(struct task_struct *child)
        spin_unlock(&child->sighand->siglock);
 }
 
+static bool looks_like_a_spurious_pid(struct task_struct *task)
+{
+       if (task->exit_code != ((PTRACE_EVENT_EXEC << 8) | SIGTRAP))
+               return false;
+
+       if (task_pid_vnr(task) == task->ptrace_message)
+               return false;
+       /*
+        * The tracee changed its pid but the PTRACE_EVENT_EXEC event
+        * was not wait()'ed, most probably debugger targets the old
+        * leader which was destroyed in de_thread().
+        */
+       return true;
+}
+
 /* Ensure that nothing can wake it up, even SIGKILL */
 static bool ptrace_freeze_traced(struct task_struct *task)
 {
@@ -180,7 +195,8 @@ static bool ptrace_freeze_traced(struct task_struct *task)
                return ret;
 
        spin_lock_irq(&task->sighand->siglock);
-       if (task_is_traced(task) && !__fatal_signal_pending(task)) {
+       if (task_is_traced(task) && !looks_like_a_spurious_pid(task) &&
+           !__fatal_signal_pending(task)) {
                task->state = __TASK_TRACED;
                ret = true;
        }
index 028a5ab..ca9f519 100644 (file)
@@ -1805,7 +1805,7 @@ static struct resource *__request_free_mem_region(struct device *dev,
                                REGION_DISJOINT)
                        continue;
 
-               if (!__request_region_locked(res, &iomem_resource, addr, size,
+               if (__request_region_locked(res, &iomem_resource, addr, size,
                                                name, 0))
                        break;
 
index 20aa234..3248e24 100644 (file)
@@ -6217,7 +6217,7 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, bool
        }
 
        if (has_idle_core)
-               set_idle_cores(this, false);
+               set_idle_cores(target, false);
 
        if (sched_feat(SIS_PROP) && !has_idle_core) {
                time = cpu_clock(this) - time;
index 66e8864..f7c6ffc 100644 (file)
@@ -1236,6 +1236,7 @@ static inline bool has_si_pid_and_uid(struct kernel_siginfo *info)
        case SIL_TIMER:
        case SIL_POLL:
        case SIL_FAULT:
+       case SIL_FAULT_TRAPNO:
        case SIL_FAULT_MCEERR:
        case SIL_FAULT_BNDERR:
        case SIL_FAULT_PKUERR:
@@ -1804,6 +1805,21 @@ int force_sig_pkuerr(void __user *addr, u32 pkey)
 }
 #endif
 
+int force_sig_perf(void __user *addr, u32 type, u64 sig_data)
+{
+       struct kernel_siginfo info;
+
+       clear_siginfo(&info);
+       info.si_signo     = SIGTRAP;
+       info.si_errno     = 0;
+       info.si_code      = TRAP_PERF;
+       info.si_addr      = addr;
+       info.si_perf_data = sig_data;
+       info.si_perf_type = type;
+
+       return force_sig_info(&info);
+}
+
 /* For the crazy architectures that include trap information in
  * the errno field, instead of an actual errno value.
  */
@@ -2564,6 +2580,7 @@ static void hide_si_addr_tag_bits(struct ksignal *ksig)
 {
        switch (siginfo_layout(ksig->sig, ksig->info.si_code)) {
        case SIL_FAULT:
+       case SIL_FAULT_TRAPNO:
        case SIL_FAULT_MCEERR:
        case SIL_FAULT_BNDERR:
        case SIL_FAULT_PKUERR:
@@ -3251,6 +3268,10 @@ enum siginfo_layout siginfo_layout(unsigned sig, int si_code)
 #endif
                        else if ((sig == SIGTRAP) && (si_code == TRAP_PERF))
                                layout = SIL_PERF_EVENT;
+#ifdef __ARCH_SI_TRAPNO
+                       else if (layout == SIL_FAULT)
+                               layout = SIL_FAULT_TRAPNO;
+#endif
                }
                else if (si_code <= NSIGPOLL)
                        layout = SIL_POLL;
@@ -3354,35 +3375,28 @@ void copy_siginfo_to_external32(struct compat_siginfo *to,
                break;
        case SIL_FAULT:
                to->si_addr = ptr_to_compat(from->si_addr);
-#ifdef __ARCH_SI_TRAPNO
+               break;
+       case SIL_FAULT_TRAPNO:
+               to->si_addr = ptr_to_compat(from->si_addr);
                to->si_trapno = from->si_trapno;
-#endif
                break;
        case SIL_FAULT_MCEERR:
                to->si_addr = ptr_to_compat(from->si_addr);
-#ifdef __ARCH_SI_TRAPNO
-               to->si_trapno = from->si_trapno;
-#endif
                to->si_addr_lsb = from->si_addr_lsb;
                break;
        case SIL_FAULT_BNDERR:
                to->si_addr = ptr_to_compat(from->si_addr);
-#ifdef __ARCH_SI_TRAPNO
-               to->si_trapno = from->si_trapno;
-#endif
                to->si_lower = ptr_to_compat(from->si_lower);
                to->si_upper = ptr_to_compat(from->si_upper);
                break;
        case SIL_FAULT_PKUERR:
                to->si_addr = ptr_to_compat(from->si_addr);
-#ifdef __ARCH_SI_TRAPNO
-               to->si_trapno = from->si_trapno;
-#endif
                to->si_pkey = from->si_pkey;
                break;
        case SIL_PERF_EVENT:
                to->si_addr = ptr_to_compat(from->si_addr);
-               to->si_perf = from->si_perf;
+               to->si_perf_data = from->si_perf_data;
+               to->si_perf_type = from->si_perf_type;
                break;
        case SIL_CHLD:
                to->si_pid = from->si_pid;
@@ -3438,35 +3452,28 @@ static int post_copy_siginfo_from_user32(kernel_siginfo_t *to,
                break;
        case SIL_FAULT:
                to->si_addr = compat_ptr(from->si_addr);
-#ifdef __ARCH_SI_TRAPNO
+               break;
+       case SIL_FAULT_TRAPNO:
+               to->si_addr = compat_ptr(from->si_addr);
                to->si_trapno = from->si_trapno;
-#endif
                break;
        case SIL_FAULT_MCEERR:
                to->si_addr = compat_ptr(from->si_addr);
-#ifdef __ARCH_SI_TRAPNO
-               to->si_trapno = from->si_trapno;
-#endif
                to->si_addr_lsb = from->si_addr_lsb;
                break;
        case SIL_FAULT_BNDERR:
                to->si_addr = compat_ptr(from->si_addr);
-#ifdef __ARCH_SI_TRAPNO
-               to->si_trapno = from->si_trapno;
-#endif
                to->si_lower = compat_ptr(from->si_lower);
                to->si_upper = compat_ptr(from->si_upper);
                break;
        case SIL_FAULT_PKUERR:
                to->si_addr = compat_ptr(from->si_addr);
-#ifdef __ARCH_SI_TRAPNO
-               to->si_trapno = from->si_trapno;
-#endif
                to->si_pkey = from->si_pkey;
                break;
        case SIL_PERF_EVENT:
                to->si_addr = compat_ptr(from->si_addr);
-               to->si_perf = from->si_perf;
+               to->si_perf_data = from->si_perf_data;
+               to->si_perf_type = from->si_perf_type;
                break;
        case SIL_CHLD:
                to->si_pid    = from->si_pid;
@@ -4644,11 +4651,13 @@ static inline void siginfo_buildtime_checks(void)
 
        /* sigfault */
        CHECK_OFFSET(si_addr);
+       CHECK_OFFSET(si_trapno);
        CHECK_OFFSET(si_addr_lsb);
        CHECK_OFFSET(si_lower);
        CHECK_OFFSET(si_upper);
        CHECK_OFFSET(si_pkey);
-       CHECK_OFFSET(si_perf);
+       CHECK_OFFSET(si_perf_data);
+       CHECK_OFFSET(si_perf_type);
 
        /* sigpoll */
        CHECK_OFFSET(si_band);
index bea9d08..5897828 100644 (file)
@@ -92,7 +92,7 @@ static int alarmtimer_rtc_add_device(struct device *dev,
        if (rtcdev)
                return -EBUSY;
 
-       if (!rtc->ops->set_alarm)
+       if (!test_bit(RTC_FEATURE_ALARM, rtc->features))
                return -1;
        if (!device_may_wakeup(rtc->dev.parent))
                return -1;
index 560e4c8..a21ef9c 100644 (file)
@@ -3704,6 +3704,9 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,
                goto print;
 
        while (*p) {
+               bool star = false;
+               int len = 0;
+
                j = 0;
 
                /* We only care about %s and variants */
@@ -3725,13 +3728,17 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,
                                /* Need to test cases like %08.*s */
                                for (j = 1; p[i+j]; j++) {
                                        if (isdigit(p[i+j]) ||
-                                           p[i+j] == '*' ||
                                            p[i+j] == '.')
                                                continue;
+                                       if (p[i+j] == '*') {
+                                               star = true;
+                                               continue;
+                                       }
                                        break;
                                }
                                if (p[i+j] == 's')
                                        break;
+                               star = false;
                        }
                        j = 0;
                }
@@ -3744,6 +3751,9 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,
                iter->fmt[i] = '\0';
                trace_seq_vprintf(&iter->seq, iter->fmt, ap);
 
+               if (star)
+                       len = va_arg(ap, int);
+
                /* The ap now points to the string data of the %s */
                str = va_arg(ap, const char *);
 
@@ -3762,8 +3772,18 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,
                        int ret;
 
                        /* Try to safely read the string */
-                       ret = strncpy_from_kernel_nofault(iter->fmt, str,
-                                                         iter->fmt_size);
+                       if (star) {
+                               if (len + 1 > iter->fmt_size)
+                                       len = iter->fmt_size - 1;
+                               if (len < 0)
+                                       len = 0;
+                               ret = copy_from_kernel_nofault(iter->fmt, str, len);
+                               iter->fmt[len] = 0;
+                               star = false;
+                       } else {
+                               ret = strncpy_from_kernel_nofault(iter->fmt, str,
+                                                                 iter->fmt_size);
+                       }
                        if (ret < 0)
                                trace_seq_printf(&iter->seq, "(0x%px)", str);
                        else
@@ -3775,7 +3795,10 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,
                        strncpy(iter->fmt, p + i, j + 1);
                        iter->fmt[j+1] = '\0';
                }
-               trace_seq_printf(&iter->seq, iter->fmt, str);
+               if (star)
+                       trace_seq_printf(&iter->seq, iter->fmt, len, str);
+               else
+                       trace_seq_printf(&iter->seq, iter->fmt, str);
 
                p += i + j + 1;
        }
index 7c39790..92d3bcc 100644 (file)
@@ -302,10 +302,10 @@ void touch_softlockup_watchdog_sync(void)
        __this_cpu_write(watchdog_report_ts, SOFTLOCKUP_DELAY_REPORT);
 }
 
-static int is_softlockup(unsigned long touch_ts, unsigned long period_ts)
+static int is_softlockup(unsigned long touch_ts,
+                        unsigned long period_ts,
+                        unsigned long now)
 {
-       unsigned long now = get_timestamp();
-
        if ((watchdog_enabled & SOFT_WATCHDOG_ENABLED) && watchdog_thresh){
                /* Warn about unreasonable delays. */
                if (time_after(now, period_ts + get_softlockup_thresh()))
@@ -353,8 +353,7 @@ static int softlockup_fn(void *data)
 /* watchdog kicker functions */
 static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
 {
-       unsigned long touch_ts = __this_cpu_read(watchdog_touch_ts);
-       unsigned long period_ts = __this_cpu_read(watchdog_report_ts);
+       unsigned long touch_ts, period_ts, now;
        struct pt_regs *regs = get_irq_regs();
        int duration;
        int softlockup_all_cpu_backtrace = sysctl_softlockup_all_cpu_backtrace;
@@ -377,11 +376,22 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
        hrtimer_forward_now(hrtimer, ns_to_ktime(sample_period));
 
        /*
+        * Read the current timestamp first. It might become invalid anytime
+        * when a virtual machine is stopped by the host or when the watchog
+        * is touched from NMI.
+        */
+       now = get_timestamp();
+       /*
         * If a virtual machine is stopped by the host it can look to
-        * the watchdog like a soft lockup. Check to see if the host
-        * stopped the vm before we process the timestamps.
+        * the watchdog like a soft lockup. This function touches the watchdog.
         */
        kvm_check_and_clear_guest_paused();
+       /*
+        * The stored timestamp is comparable with @now only when not touched.
+        * It might get touched anytime from NMI. Make sure that is_softlockup()
+        * uses the same (valid) value.
+        */
+       period_ts = READ_ONCE(*this_cpu_ptr(&watchdog_report_ts));
 
        /* Reset the interval when touched by known problematic code. */
        if (period_ts == SOFTLOCKUP_DELAY_REPORT) {
@@ -398,13 +408,9 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
                return HRTIMER_RESTART;
        }
 
-       /* check for a softlockup
-        * This is done by making sure a high priority task is
-        * being scheduled.  The task touches the watchdog to
-        * indicate it is getting cpu time.  If it hasn't then
-        * this is a good indication some task is hogging the cpu
-        */
-       duration = is_softlockup(touch_ts, period_ts);
+       /* Check for a softlockup. */
+       touch_ts = __this_cpu_read(watchdog_touch_ts);
+       duration = is_softlockup(touch_ts, period_ts, now);
        if (unlikely(duration)) {
                /*
                 * Prevent multiple soft-lockup reports if one cpu is already
index e11cfc1..2cc359e 100644 (file)
@@ -348,6 +348,7 @@ obj-$(CONFIG_OBJAGG) += objagg.o
 obj-$(CONFIG_PLDMFW) += pldmfw/
 
 # KUnit tests
+CFLAGS_bitfield_kunit.o := $(call cc-option,-Wframe-larger-than=10240)
 obj-$(CONFIG_BITFIELD_KUNIT) += bitfield_kunit.o
 obj-$(CONFIG_LIST_KUNIT_TEST) += list-test.o
 obj-$(CONFIG_LINEAR_RANGES_TEST) += test_linear_ranges.o
index 921d0a6..641767b 100644 (file)
@@ -586,13 +586,11 @@ static int remaining(int wrote)
        return 0;
 }
 
-static char *dynamic_emit_prefix(const struct _ddebug *desc, char *buf)
+static char *__dynamic_emit_prefix(const struct _ddebug *desc, char *buf)
 {
        int pos_after_tid;
        int pos = 0;
 
-       *buf = '\0';
-
        if (desc->flags & _DPRINTK_FLAGS_INCL_TID) {
                if (in_interrupt())
                        pos += snprintf(buf + pos, remaining(pos), "<intr> ");
@@ -618,11 +616,18 @@ static char *dynamic_emit_prefix(const struct _ddebug *desc, char *buf)
        return buf;
 }
 
+static inline char *dynamic_emit_prefix(struct _ddebug *desc, char *buf)
+{
+       if (unlikely(desc->flags & _DPRINTK_FLAGS_INCL_ANY))
+               return __dynamic_emit_prefix(desc, buf);
+       return buf;
+}
+
 void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...)
 {
        va_list args;
        struct va_format vaf;
-       char buf[PREFIX_SIZE];
+       char buf[PREFIX_SIZE] = "";
 
        BUG_ON(!descriptor);
        BUG_ON(!fmt);
@@ -655,7 +660,7 @@ void __dynamic_dev_dbg(struct _ddebug *descriptor,
        if (!dev) {
                printk(KERN_DEBUG "(NULL device *): %pV", &vaf);
        } else {
-               char buf[PREFIX_SIZE];
+               char buf[PREFIX_SIZE] = "";
 
                dev_printk_emit(LOGLEVEL_DEBUG, dev, "%s%s %s: %pV",
                                dynamic_emit_prefix(descriptor, buf),
@@ -684,7 +689,7 @@ void __dynamic_netdev_dbg(struct _ddebug *descriptor,
        vaf.va = &args;
 
        if (dev && dev->dev.parent) {
-               char buf[PREFIX_SIZE];
+               char buf[PREFIX_SIZE] = "";
 
                dev_printk_emit(LOGLEVEL_DEBUG, dev->dev.parent,
                                "%s%s %s %s%s: %pV",
@@ -720,7 +725,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
        vaf.va = &args;
 
        if (ibdev && ibdev->dev.parent) {
-               char buf[PREFIX_SIZE];
+               char buf[PREFIX_SIZE] = "";
 
                dev_printk_emit(LOGLEVEL_DEBUG, ibdev->dev.parent,
                                "%s%s %s %s: %pV",
@@ -915,7 +920,6 @@ static const struct seq_operations ddebug_proc_seqops = {
 
 static int ddebug_proc_open(struct inode *inode, struct file *file)
 {
-       vpr_info("called\n");
        return seq_open_private(file, &ddebug_proc_seqops,
                                sizeof(struct ddebug_iter));
 }
index dc05cfc..cacbbbd 100644 (file)
@@ -654,8 +654,20 @@ static char global_array[10];
 
 static void kasan_global_oob(struct kunit *test)
 {
-       volatile int i = 3;
-       char *p = &global_array[ARRAY_SIZE(global_array) + i];
+       /*
+        * Deliberate out-of-bounds access. To prevent CONFIG_UBSAN_LOCAL_BOUNDS
+        * from failing here and panicing the kernel, access the array via a
+        * volatile pointer, which will prevent the compiler from being able to
+        * determine the array bounds.
+        *
+        * This access uses a volatile pointer to char (char *volatile) rather
+        * than the more conventional pointer to volatile char (volatile char *)
+        * because we want to prevent the compiler from making inferences about
+        * the pointer itself (i.e. its array bounds), not the data that it
+        * refers to.
+        */
+       char *volatile array = global_array;
+       char *p = &array[ARRAY_SIZE(global_array) + 3];
 
        /* Only generic mode instruments globals. */
        KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_GENERIC);
@@ -703,8 +715,9 @@ static void ksize_uaf(struct kunit *test)
 static void kasan_stack_oob(struct kunit *test)
 {
        char stack_array[10];
-       volatile int i = OOB_TAG_OFF;
-       char *p = &stack_array[ARRAY_SIZE(stack_array) + i];
+       /* See comment in kasan_global_oob. */
+       char *volatile array = stack_array;
+       char *p = &array[ARRAY_SIZE(stack_array) + OOB_TAG_OFF];
 
        KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_STACK);
 
@@ -715,7 +728,9 @@ static void kasan_alloca_oob_left(struct kunit *test)
 {
        volatile int i = 10;
        char alloca_array[i];
-       char *p = alloca_array - 1;
+       /* See comment in kasan_global_oob. */
+       char *volatile array = alloca_array;
+       char *p = array - 1;
 
        /* Only generic mode instruments dynamic allocas. */
        KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_GENERIC);
@@ -728,7 +743,9 @@ static void kasan_alloca_oob_right(struct kunit *test)
 {
        volatile int i = 10;
        char alloca_array[i];
-       char *p = alloca_array + i;
+       /* See comment in kasan_global_oob. */
+       char *volatile array = alloca_array;
+       char *p = array + i;
 
        /* Only generic mode instruments dynamic allocas. */
        KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_GENERIC);
index 0697134..3ded6a5 100644 (file)
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -1593,10 +1593,6 @@ struct page *get_dump_page(unsigned long addr)
                                      FOLL_FORCE | FOLL_DUMP | FOLL_GET);
        if (locked)
                mmap_read_unlock(mm);
-
-       if (ret == 1 && is_page_poisoned(page))
-               return NULL;
-
        return (ret == 1) ? page : NULL;
 }
 #endif /* CONFIG_ELF_CORE */
index 3db405d..95918f4 100644 (file)
@@ -4056,6 +4056,7 @@ again:
                                 * See Documentation/vm/mmu_notifier.rst
                                 */
                                huge_ptep_set_wrprotect(src, addr, src_pte);
+                               entry = huge_pte_wrprotect(entry);
                        }
 
                        page_dup_rmap(ptepage, true);
index 54bd0dc..2f11829 100644 (file)
@@ -96,26 +96,6 @@ static inline void set_page_refcounted(struct page *page)
        set_page_count(page, 1);
 }
 
-/*
- * When kernel touch the user page, the user page may be have been marked
- * poison but still mapped in user space, if without this page, the kernel
- * can guarantee the data integrity and operation success, the kernel is
- * better to check the posion status and avoid touching it, be good not to
- * panic, coredump for process fatal signal is a sample case matching this
- * scenario. Or if kernel can't guarantee the data integrity, it's better
- * not to call this function, let kernel touch the poison page and get to
- * panic.
- */
-static inline bool is_page_poisoned(struct page *page)
-{
-       if (PageHWPoison(page))
-               return true;
-       else if (PageHuge(page) && PageHWPoison(compound_head(page)))
-               return true;
-
-       return false;
-}
-
 extern unsigned long highest_memmap_pfn;
 
 /*
index d1dcc7e..8ee0136 100644 (file)
 #include "pgalloc-track.h"
 
 #ifdef CONFIG_HAVE_ARCH_HUGE_VMAP
-static bool __ro_after_init iomap_max_page_shift = PAGE_SHIFT;
+static unsigned int __ro_after_init iomap_max_page_shift = BITS_PER_LONG - 1;
 
 static int __init set_nohugeiomap(char *str)
 {
-       iomap_max_page_shift = P4D_SHIFT;
+       iomap_max_page_shift = PAGE_SHIFT;
        return 0;
 }
 early_param("nohugeiomap", set_nohugeiomap);
 #else /* CONFIG_HAVE_ARCH_HUGE_VMAP */
-static const bool iomap_max_page_shift = PAGE_SHIFT;
+static const unsigned int iomap_max_page_shift = PAGE_SHIFT;
 #endif /* CONFIG_HAVE_ARCH_HUGE_VMAP */
 
 int ioremap_page_range(unsigned long addr,
index 6bbe314..2f3aaeb 100644 (file)
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -776,11 +776,12 @@ static void remove_rmap_item_from_tree(struct rmap_item *rmap_item)
                struct page *page;
 
                stable_node = rmap_item->head;
-               page = get_ksm_page(stable_node, GET_KSM_PAGE_NOLOCK);
+               page = get_ksm_page(stable_node, GET_KSM_PAGE_LOCK);
                if (!page)
                        goto out;
 
                hlist_del(&rmap_item->hlist);
+               unlock_page(page);
                put_page(page);
 
                if (!hlist_empty(&stable_node->hlist))
index a08cede..5d46611 100644 (file)
@@ -2258,25 +2258,11 @@ out_nomem:
 static int shmem_mmap(struct file *file, struct vm_area_struct *vma)
 {
        struct shmem_inode_info *info = SHMEM_I(file_inode(file));
+       int ret;
 
-       if (info->seals & F_SEAL_FUTURE_WRITE) {
-               /*
-                * New PROT_WRITE and MAP_SHARED mmaps are not allowed when
-                * "future write" seal active.
-                */
-               if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_WRITE))
-                       return -EPERM;
-
-               /*
-                * Since an F_SEAL_FUTURE_WRITE sealed memfd can be mapped as
-                * MAP_SHARED and read-only, take care to not allow mprotect to
-                * revert protections on such mappings. Do this only for shared
-                * mappings. For private mappings, don't need to mask
-                * VM_MAYWRITE as we still want them to be COW-writable.
-                */
-               if (vma->vm_flags & VM_SHARED)
-                       vma->vm_flags &= ~(VM_MAYWRITE);
-       }
+       ret = seal_check_future_write(info->seals, vma);
+       if (ret)
+               return ret;
 
        /* arm64 - allow memory tagging on RAM-based files */
        vma->vm_flags |= VM_MTE_ALLOWED;
@@ -2375,8 +2361,18 @@ static int shmem_mfill_atomic_pte(struct mm_struct *dst_mm,
        pgoff_t offset, max_off;
 
        ret = -ENOMEM;
-       if (!shmem_inode_acct_block(inode, 1))
+       if (!shmem_inode_acct_block(inode, 1)) {
+               /*
+                * We may have got a page, returned -ENOENT triggering a retry,
+                * and now we find ourselves with -ENOMEM. Release the page, to
+                * avoid a BUG_ON in our caller.
+                */
+               if (unlikely(*pagep)) {
+                       put_page(*pagep);
+                       *pagep = NULL;
+               }
                goto out;
+       }
 
        if (!*pagep) {
                page = shmem_alloc_page(gfp, info, pgoff);
index 71b784f..cec6298 100644 (file)
@@ -10,7 +10,7 @@
 DECLARE_STATIC_KEY_FALSE(page_alloc_shuffle_key);
 extern void __shuffle_free_memory(pg_data_t *pgdat);
 extern bool shuffle_pick_tail(void);
-static inline void shuffle_free_memory(pg_data_t *pgdat)
+static inline void __meminit shuffle_free_memory(pg_data_t *pgdat)
 {
        if (!static_branch_unlikely(&page_alloc_shuffle_key))
                return;
@@ -18,7 +18,7 @@ static inline void shuffle_free_memory(pg_data_t *pgdat)
 }
 
 extern void __shuffle_zone(struct zone *z);
-static inline void shuffle_zone(struct zone *z)
+static inline void __meminit shuffle_zone(struct zone *z)
 {
        if (!static_branch_unlikely(&page_alloc_shuffle_key))
                return;
index f8833d3..a4a5714 100644 (file)
@@ -318,6 +318,16 @@ kmem_cache_create_usercopy(const char *name,
        const char *cache_name;
        int err;
 
+#ifdef CONFIG_SLUB_DEBUG
+       /*
+        * If no slub_debug was enabled globally, the static key is not yet
+        * enabled by setup_slub_debug(). Enable it if the cache is being
+        * created with any of the debugging flags passed explicitly.
+        */
+       if (flags & SLAB_DEBUG_FLAGS)
+               static_branch_enable(&slub_debug_enabled);
+#endif
+
        mutex_lock(&slab_mutex);
 
        err = kmem_cache_sanity_check(name, size);
index feda53a..3f96e09 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -301,6 +301,7 @@ static inline void *get_freepointer_safe(struct kmem_cache *s, void *object)
        if (!debug_pagealloc_enabled_static())
                return get_freepointer(s, object);
 
+       object = kasan_reset_tag(object);
        freepointer_addr = (unsigned long)object + s->offset;
        copy_from_kernel_nofault(&p, (void **)freepointer_addr, sizeof(p));
        return freelist_ptr(s, p, freepointer_addr);
@@ -3828,15 +3829,6 @@ static int calculate_sizes(struct kmem_cache *s, int forced_order)
 
 static int kmem_cache_open(struct kmem_cache *s, slab_flags_t flags)
 {
-#ifdef CONFIG_SLUB_DEBUG
-       /*
-        * If no slub_debug was enabled globally, the static key is not yet
-        * enabled by setup_slub_debug(). Enable it if the cache is being
-        * created with any of the debugging flags passed explicitly.
-        */
-       if (flags & SLAB_DEBUG_FLAGS)
-               static_branch_enable(&slub_debug_enabled);
-#endif
        s->flags = kmem_cache_flags(s->size, flags, s->name);
 #ifdef CONFIG_SLAB_FREELIST_HARDENED
        s->random = get_random_long();
index e14b382..63a73e1 100644 (file)
@@ -360,38 +360,38 @@ out:
                 * If a reservation for the page existed in the reservation
                 * map of a private mapping, the map was modified to indicate
                 * the reservation was consumed when the page was allocated.
-                * We clear the PagePrivate flag now so that the global
+                * We clear the HPageRestoreReserve flag now so that the global
                 * reserve count will not be incremented in free_huge_page.
                 * The reservation map will still indicate the reservation
                 * was consumed and possibly prevent later page allocation.
                 * This is better than leaking a global reservation.  If no
-                * reservation existed, it is still safe to clear PagePrivate
-                * as no adjustments to reservation counts were made during
-                * allocation.
+                * reservation existed, it is still safe to clear
+                * HPageRestoreReserve as no adjustments to reservation counts
+                * were made during allocation.
                 *
                 * The reservation map for shared mappings indicates which
                 * pages have reservations.  When a huge page is allocated
                 * for an address with a reservation, no change is made to
-                * the reserve map.  In this case PagePrivate will be set
-                * to indicate that the global reservation count should be
+                * the reserve map.  In this case HPageRestoreReserve will be
+                * set to indicate that the global reservation count should be
                 * incremented when the page is freed.  This is the desired
                 * behavior.  However, when a huge page is allocated for an
                 * address without a reservation a reservation entry is added
-                * to the reservation map, and PagePrivate will not be set.
-                * When the page is freed, the global reserve count will NOT
-                * be incremented and it will appear as though we have leaked
-                * reserved page.  In this case, set PagePrivate so that the
-                * global reserve count will be incremented to match the
-                * reservation map entry which was created.
+                * to the reservation map, and HPageRestoreReserve will not be
+                * set. When the page is freed, the global reserve count will
+                * NOT be incremented and it will appear as though we have
+                * leaked reserved page.  In this case, set HPageRestoreReserve
+                * so that the global reserve count will be incremented to
+                * match the reservation map entry which was created.
                 *
                 * Note that vm_alloc_shared is based on the flags of the vma
                 * for which the page was originally allocated.  dst_vma could
                 * be different or NULL on error.
                 */
                if (vm_alloc_shared)
-                       SetPagePrivate(page);
+                       SetHPageRestoreReserve(page);
                else
-                       ClearPagePrivate(page);
+                       ClearHPageRestoreReserve(page);
                put_page(page);
        }
        BUG_ON(copied < 0);
index 9ec1aa9..3c4c4c7 100644 (file)
@@ -174,8 +174,10 @@ static void page_pool_dma_sync_for_device(struct page_pool *pool,
                                          struct page *page,
                                          unsigned int dma_sync_size)
 {
+       dma_addr_t dma_addr = page_pool_get_dma_addr(page);
+
        dma_sync_size = min(dma_sync_size, pool->p.max_len);
-       dma_sync_single_range_for_device(pool->p.dev, page->dma_addr,
+       dma_sync_single_range_for_device(pool->p.dev, dma_addr,
                                         pool->p.offset, dma_sync_size,
                                         pool->p.dma_dir);
 }
@@ -195,7 +197,7 @@ static bool page_pool_dma_map(struct page_pool *pool, struct page *page)
        if (dma_mapping_error(pool->p.dev, dma))
                return false;
 
-       page->dma_addr = dma;
+       page_pool_set_dma_addr(page, dma);
 
        if (pool->p.flags & PP_FLAG_DMA_SYNC_DEV)
                page_pool_dma_sync_for_device(pool, page, pool->p.max_len);
@@ -331,13 +333,13 @@ void page_pool_release_page(struct page_pool *pool, struct page *page)
                 */
                goto skip_dma_unmap;
 
-       dma = page->dma_addr;
+       dma = page_pool_get_dma_addr(page);
 
-       /* When page is unmapped, it cannot be returned our pool */
+       /* When page is unmapped, it cannot be returned to our pool */
        dma_unmap_page_attrs(pool->p.dev, dma,
                             PAGE_SIZE << pool->p.order, pool->p.dma_dir,
                             DMA_ATTR_SKIP_CPU_SYNC);
-       page->dma_addr = 0;
+       page_pool_set_dma_addr(page, 0);
 skip_dma_unmap:
        /* This may be the last page returned, releasing the pool, so
         * it is not safe to reference pool afterwards.
index 9c6e958..94b31f2 100644 (file)
@@ -402,6 +402,14 @@ struct smcd_dev *smcd_alloc_dev(struct device *parent, const char *name,
                return NULL;
        }
 
+       smcd->event_wq = alloc_ordered_workqueue("ism_evt_wq-%s)",
+                                                WQ_MEM_RECLAIM, name);
+       if (!smcd->event_wq) {
+               kfree(smcd->conn);
+               kfree(smcd);
+               return NULL;
+       }
+
        smcd->dev.parent = parent;
        smcd->dev.release = smcd_release;
        device_initialize(&smcd->dev);
@@ -415,13 +423,6 @@ struct smcd_dev *smcd_alloc_dev(struct device *parent, const char *name,
        INIT_LIST_HEAD(&smcd->vlan);
        INIT_LIST_HEAD(&smcd->lgr_list);
        init_waitqueue_head(&smcd->lgrs_deleted);
-       smcd->event_wq = alloc_ordered_workqueue("ism_evt_wq-%s)",
-                                                WQ_MEM_RECLAIM, name);
-       if (!smcd->event_wq) {
-               kfree(smcd->conn);
-               kfree(smcd);
-               return NULL;
-       }
        return smcd;
 }
 EXPORT_SYMBOL_GPL(smcd_alloc_dev);
index f6d5437..b248314 100755 (executable)
@@ -76,7 +76,11 @@ fi
 if arg_contain -S "$@"; then
        # For scripts/gcc-x86-*-has-stack-protector.sh
        if arg_contain -fstack-protector "$@"; then
-               echo "%gs"
+               if arg_contain -mstack-protector-guard-reg=fs "$@"; then
+                       echo "%fs"
+               else
+                       echo "%gs"
+               fi
                exit 0
        fi
 
index 48d141e..8762887 100755 (executable)
@@ -10,7 +10,7 @@ from __future__ import print_function
 import os, sys, errno
 import subprocess
 
-# Extract and prepare jobserver file descriptors from envirnoment.
+# Extract and prepare jobserver file descriptors from environment.
 claim = 0
 jobs = b""
 try:
index 4693945..aa108be 100644 (file)
@@ -493,10 +493,12 @@ static int tpm_seal(struct tpm_buf *tb, uint16_t keytype,
 
        ret = tpm_get_random(chip, td->nonceodd, TPM_NONCE_SIZE);
        if (ret < 0)
-               return ret;
+               goto out;
 
-       if (ret != TPM_NONCE_SIZE)
-               return -EIO;
+       if (ret != TPM_NONCE_SIZE) {
+               ret = -EIO;
+               goto out;
+       }
 
        ordinal = htonl(TPM_ORD_SEAL);
        datsize = htonl(datalen);
index 617fabd..0165da3 100644 (file)
@@ -336,9 +336,9 @@ out:
                        rc = -EPERM;
        }
        if (blob_len < 0)
-               return blob_len;
-
-       payload->blob_len = blob_len;
+               rc = blob_len;
+       else
+               payload->blob_len = blob_len;
 
        tpm_put_ops(chip);
        return rc;
index 2577876..9897bd2 100644 (file)
@@ -38,7 +38,7 @@ config SND_OXFW
           * Mackie(Loud) Onyx 1640i (former model)
           * Mackie(Loud) Onyx Satellite
           * Mackie(Loud) Tapco Link.Firewire
-          * Mackie(Loud) d.2 pro/d.4 pro
+          * Mackie(Loud) d.4 pro
           * Mackie(Loud) U.420/U.420d
           * TASCAM FireOne
           * Stanton Controllers & Systems 1 Deck/Mixer
@@ -84,7 +84,7 @@ config SND_BEBOB
          * PreSonus FIREBOX/FIREPOD/FP10/Inspire1394
          * BridgeCo RDAudio1/Audio5
          * Mackie Onyx 1220/1620/1640 (FireWire I/O Card)
-         * Mackie d.2 (FireWire Option)
+         * Mackie d.2 (FireWire Option) and d.2 Pro
          * Stanton FinalScratch 2 (ScratchAmp)
          * Tascam IF-FW/DM
          * Behringer XENIX UFX 1204/1604
index 26e7cb5..aa53c13 100644 (file)
@@ -14,8 +14,8 @@
 #include <linux/tracepoint.h>
 
 TRACE_EVENT(amdtp_packet,
-       TP_PROTO(const struct amdtp_stream *s, u32 cycles, const __be32 *cip_header, unsigned int payload_length, unsigned int data_blocks, unsigned int data_block_counter, unsigned int index),
-       TP_ARGS(s, cycles, cip_header, payload_length, data_blocks, data_block_counter, index),
+       TP_PROTO(const struct amdtp_stream *s, u32 cycles, const __be32 *cip_header, unsigned int payload_length, unsigned int data_blocks, unsigned int data_block_counter, unsigned int packet_index, unsigned int index),
+       TP_ARGS(s, cycles, cip_header, payload_length, data_blocks, data_block_counter, packet_index, index),
        TP_STRUCT__entry(
                __field(unsigned int, second)
                __field(unsigned int, cycle)
@@ -48,7 +48,7 @@ TRACE_EVENT(amdtp_packet,
                __entry->payload_quadlets = payload_length / sizeof(__be32);
                __entry->data_blocks = data_blocks;
                __entry->data_block_counter = data_block_counter,
-               __entry->packet_index = s->packet_index;
+               __entry->packet_index = packet_index;
                __entry->irq = !!in_interrupt();
                __entry->index = index;
        ),
index 4e2f2bb..e0faa66 100644 (file)
@@ -526,7 +526,7 @@ static void build_it_pkt_header(struct amdtp_stream *s, unsigned int cycle,
        }
 
        trace_amdtp_packet(s, cycle, cip_header, payload_length, data_blocks,
-                          data_block_counter, index);
+                          data_block_counter, s->packet_index, index);
 }
 
 static int check_cip_header(struct amdtp_stream *s, const __be32 *buf,
@@ -630,21 +630,27 @@ static int parse_ir_ctx_header(struct amdtp_stream *s, unsigned int cycle,
                               unsigned int *payload_length,
                               unsigned int *data_blocks,
                               unsigned int *data_block_counter,
-                              unsigned int *syt, unsigned int index)
+                              unsigned int *syt, unsigned int packet_index, unsigned int index)
 {
        const __be32 *cip_header;
+       unsigned int cip_header_size;
        int err;
 
        *payload_length = be32_to_cpu(ctx_header[0]) >> ISO_DATA_LENGTH_SHIFT;
-       if (*payload_length > s->ctx_data.tx.ctx_header_size +
-                                       s->ctx_data.tx.max_ctx_payload_length) {
+
+       if (!(s->flags & CIP_NO_HEADER))
+               cip_header_size = 8;
+       else
+               cip_header_size = 0;
+
+       if (*payload_length > cip_header_size + s->ctx_data.tx.max_ctx_payload_length) {
                dev_err(&s->unit->device,
                        "Detect jumbo payload: %04x %04x\n",
-                       *payload_length, s->ctx_data.tx.max_ctx_payload_length);
+                       *payload_length, cip_header_size + s->ctx_data.tx.max_ctx_payload_length);
                return -EIO;
        }
 
-       if (!(s->flags & CIP_NO_HEADER)) {
+       if (cip_header_size > 0) {
                cip_header = ctx_header + 2;
                err = check_cip_header(s, cip_header, *payload_length,
                                       data_blocks, data_block_counter, syt);
@@ -662,7 +668,7 @@ static int parse_ir_ctx_header(struct amdtp_stream *s, unsigned int cycle,
        }
 
        trace_amdtp_packet(s, cycle, cip_header, *payload_length, *data_blocks,
-                          *data_block_counter, index);
+                          *data_block_counter, packet_index, index);
 
        return err;
 }
@@ -701,12 +707,13 @@ static int generate_device_pkt_descs(struct amdtp_stream *s,
                                     unsigned int packets)
 {
        unsigned int dbc = s->data_block_counter;
+       unsigned int packet_index = s->packet_index;
+       unsigned int queue_size = s->queue_size;
        int i;
        int err;
 
        for (i = 0; i < packets; ++i) {
                struct pkt_desc *desc = descs + i;
-               unsigned int index = (s->packet_index + i) % s->queue_size;
                unsigned int cycle;
                unsigned int payload_length;
                unsigned int data_blocks;
@@ -715,7 +722,7 @@ static int generate_device_pkt_descs(struct amdtp_stream *s,
                cycle = compute_cycle_count(ctx_header[1]);
 
                err = parse_ir_ctx_header(s, cycle, ctx_header, &payload_length,
-                                         &data_blocks, &dbc, &syt, i);
+                                         &data_blocks, &dbc, &syt, packet_index, i);
                if (err < 0)
                        return err;
 
@@ -723,13 +730,15 @@ static int generate_device_pkt_descs(struct amdtp_stream *s,
                desc->syt = syt;
                desc->data_blocks = data_blocks;
                desc->data_block_counter = dbc;
-               desc->ctx_payload = s->buffer.packets[index].buffer;
+               desc->ctx_payload = s->buffer.packets[packet_index].buffer;
 
                if (!(s->flags & CIP_DBC_IS_END_EVENT))
                        dbc = (dbc + desc->data_blocks) & 0xff;
 
                ctx_header +=
                        s->ctx_data.tx.ctx_header_size / sizeof(*ctx_header);
+
+               packet_index = (packet_index + 1) % queue_size;
        }
 
        s->data_block_counter = dbc;
@@ -1065,23 +1074,22 @@ static int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed,
                s->data_block_counter = 0;
        }
 
-       /* initialize packet buffer */
+       // initialize packet buffer.
+       max_ctx_payload_size = amdtp_stream_get_max_payload(s);
        if (s->direction == AMDTP_IN_STREAM) {
                dir = DMA_FROM_DEVICE;
                type = FW_ISO_CONTEXT_RECEIVE;
-               if (!(s->flags & CIP_NO_HEADER))
+               if (!(s->flags & CIP_NO_HEADER)) {
+                       max_ctx_payload_size -= 8;
                        ctx_header_size = IR_CTX_HEADER_SIZE_CIP;
-               else
+               } else {
                        ctx_header_size = IR_CTX_HEADER_SIZE_NO_CIP;
-
-               max_ctx_payload_size = amdtp_stream_get_max_payload(s) -
-                                      ctx_header_size;
+               }
        } else {
                dir = DMA_TO_DEVICE;
                type = FW_ISO_CONTEXT_TRANSMIT;
                ctx_header_size = 0;    // No effect for IT context.
 
-               max_ctx_payload_size = amdtp_stream_get_max_payload(s);
                if (!(s->flags & CIP_NO_HEADER))
                        max_ctx_payload_size -= IT_PKT_HEADER_SIZE_CIP;
        }
index 2c8e339..daeecfa 100644 (file)
@@ -387,7 +387,7 @@ static const struct ieee1394_device_id bebob_id_table[] = {
        SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010049, &spec_normal),
        /* Mackie, Onyx 1220/1620/1640 (Firewire I/O Card) */
        SND_BEBOB_DEV_ENTRY(VEN_MACKIE2, 0x00010065, &spec_normal),
-       /* Mackie, d.2 (Firewire Option) */
+       // Mackie, d.2 (Firewire option card) and d.2 Pro (the card is built-in).
        SND_BEBOB_DEV_ENTRY(VEN_MACKIE1, 0x00010067, &spec_normal),
        /* Stanton, ScratchAmp */
        SND_BEBOB_DEV_ENTRY(VEN_STANTON, 0x00000001, &spec_normal),
index 0916864..27c13b9 100644 (file)
@@ -16,7 +16,7 @@ alesis_io14_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
 static const unsigned int
 alesis_io26_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
        {10, 10, 4},    /* Tx0 = Analog + S/PDIF. */
-       {16, 8, 0},     /* Tx1 = ADAT1 + ADAT2. */
+       {16, 4, 0},     /* Tx1 = ADAT1 + ADAT2 (available at low rate). */
 };
 
 int snd_dice_detect_alesis_formats(struct snd_dice *dice)
index af8a90e..a69ca11 100644 (file)
@@ -218,7 +218,7 @@ static int pcm_open(struct snd_pcm_substream *substream)
 
                if (frames_per_period > 0) {
                        // For double_pcm_frame quirk.
-                       if (rate > 96000) {
+                       if (rate > 96000 && !dice->disable_double_pcm_frames) {
                                frames_per_period *= 2;
                                frames_per_buffer *= 2;
                        }
@@ -273,7 +273,7 @@ static int pcm_hw_params(struct snd_pcm_substream *substream,
 
                mutex_lock(&dice->mutex);
                // For double_pcm_frame quirk.
-               if (rate > 96000) {
+               if (rate > 96000 && !dice->disable_double_pcm_frames) {
                        events_per_period /= 2;
                        events_per_buffer /= 2;
                }
index 1a14c08..c4dfe76 100644 (file)
@@ -181,7 +181,7 @@ static int keep_resources(struct snd_dice *dice, struct amdtp_stream *stream,
        // as 'Dual Wire'.
        // For this quirk, blocking mode is required and PCM buffer size should
        // be aligned to SYT_INTERVAL.
-       double_pcm_frames = rate > 96000;
+       double_pcm_frames = (rate > 96000 && !dice->disable_double_pcm_frames);
        if (double_pcm_frames) {
                rate /= 2;
                pcm_chs *= 2;
index a8875d2..43a3bcb 100644 (file)
@@ -38,8 +38,8 @@ static const struct dice_tc_spec konnekt_24d = {
 };
 
 static const struct dice_tc_spec konnekt_live = {
-       .tx_pcm_chs = {{16, 16, 16}, {0, 0, 0} },
-       .rx_pcm_chs = {{16, 16, 16}, {0, 0, 0} },
+       .tx_pcm_chs = {{16, 16, 6}, {0, 0, 0} },
+       .rx_pcm_chs = {{16, 16, 6}, {0, 0, 0} },
        .has_midi = true,
 };
 
index 107a816..239d164 100644 (file)
@@ -21,6 +21,7 @@ MODULE_LICENSE("GPL v2");
 #define OUI_SSL                        0x0050c2        // Actually ID reserved by IEEE.
 #define OUI_PRESONUS           0x000a92
 #define OUI_HARMAN             0x000fd7
+#define OUI_AVID               0x00a07e
 
 #define DICE_CATEGORY_ID       0x04
 #define WEISS_CATEGORY_ID      0x00
@@ -222,6 +223,14 @@ static int dice_probe(struct fw_unit *unit,
                                (snd_dice_detect_formats_t)entry->driver_data;
        }
 
+       // Below models are compliant to IEC 61883-1/6 and have no quirk at high sampling transfer
+       // frequency.
+       // * Avid M-Box 3 Pro
+       // * M-Audio Profire 610
+       // * M-Audio Profire 2626
+       if (entry->vendor_id == OUI_MAUDIO || entry->vendor_id == OUI_AVID)
+               dice->disable_double_pcm_frames = true;
+
        spin_lock_init(&dice->lock);
        mutex_init(&dice->mutex);
        init_completion(&dice->clock_accepted);
@@ -278,7 +287,22 @@ static void dice_bus_reset(struct fw_unit *unit)
 
 #define DICE_INTERFACE 0x000001
 
+#define DICE_DEV_ENTRY_TYPICAL(vendor, model, data) \
+       { \
+               .match_flags    = IEEE1394_MATCH_VENDOR_ID | \
+                                 IEEE1394_MATCH_MODEL_ID | \
+                                 IEEE1394_MATCH_SPECIFIER_ID | \
+                                 IEEE1394_MATCH_VERSION, \
+               .vendor_id      = (vendor), \
+               .model_id       = (model), \
+               .specifier_id   = (vendor), \
+               .version        = DICE_INTERFACE, \
+               .driver_data = (kernel_ulong_t)(data), \
+       }
+
 static const struct ieee1394_device_id dice_id_table[] = {
+       // Avid M-Box 3 Pro. To match in probe function.
+       DICE_DEV_ENTRY_TYPICAL(OUI_AVID, 0x000004, snd_dice_detect_extension_formats),
        /* M-Audio Profire 2626 has a different value in version field. */
        {
                .match_flags    = IEEE1394_MATCH_VENDOR_ID |
index adc6f7c..3c967d1 100644 (file)
@@ -109,7 +109,8 @@ struct snd_dice {
        struct fw_iso_resources rx_resources[MAX_STREAMS];
        struct amdtp_stream tx_stream[MAX_STREAMS];
        struct amdtp_stream rx_stream[MAX_STREAMS];
-       bool global_enabled;
+       bool global_enabled:1;
+       bool disable_double_pcm_frames:1;
        struct completion clock_accepted;
        unsigned int substreams_counter;
 
index 1f1e323..9eea25c 100644 (file)
@@ -355,7 +355,6 @@ static const struct ieee1394_device_id oxfw_id_table[] = {
         *  Onyx-i series (former models):      0x081216
         *  Mackie Onyx Satellite:              0x00200f
         *  Tapco LINK.firewire 4x6:            0x000460
-        *  d.2 pro:                            Unknown
         *  d.4 pro:                            Unknown
         *  U.420:                              Unknown
         *  U.420d:                             Unknown
index afc088f..b751812 100644 (file)
@@ -77,17 +77,8 @@ static const struct snd_kcontrol_new snd_gus_joystick_control = {
 
 static void snd_gus_init_control(struct snd_gus_card *gus)
 {
-       int ret;
-
-       if (!gus->ace_flag) {
-               ret =
-                       snd_ctl_add(gus->card,
-                                       snd_ctl_new1(&snd_gus_joystick_control,
-                                               gus));
-               if (ret)
-                       snd_printk(KERN_ERR "gus: snd_ctl_add failed: %d\n",
-                                       ret);
-       }
+       if (!gus->ace_flag)
+               snd_ctl_add(gus->card, snd_ctl_new1(&snd_gus_joystick_control, gus));
 }
 
 /*
index 38dc1fd..aa48705 100644 (file)
@@ -846,14 +846,10 @@ int snd_sb16dsp_pcm(struct snd_sb *chip, int device)
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_sb16_playback_ops);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_sb16_capture_ops);
 
-       if (chip->dma16 >= 0 && chip->dma8 != chip->dma16) {
-               err = snd_ctl_add(card, snd_ctl_new1(
-                                       &snd_sb16_dma_control, chip));
-               if (err)
-                       return err;
-       } else {
+       if (chip->dma16 >= 0 && chip->dma8 != chip->dma16)
+               snd_ctl_add(card, snd_ctl_new1(&snd_sb16_dma_control, chip));
+       else
                pcm->info_flags = SNDRV_PCM_INFO_HALF_DUPLEX;
-       }
 
        snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
                                       card->dev, 64*1024, 128*1024);
index 6c9d534..ed3a87e 100644 (file)
@@ -93,12 +93,12 @@ static int snd_sb8_probe(struct device *pdev, unsigned int dev)
        acard = card->private_data;
        card->private_free = snd_sb8_free;
 
-       /* block the 0x388 port to avoid PnP conflicts */
+       /*
+        * Block the 0x388 port to avoid PnP conflicts.
+        * No need to check this value after request_region,
+        * as we never do anything with it.
+        */
        acard->fm_res = request_region(0x388, 4, "SoundBlaster FM");
-       if (!acard->fm_res) {
-               err = -EBUSY;
-               goto _err;
-       }
 
        if (port[dev] != SNDRV_AUTO_PORT) {
                if ((err = snd_sbdsp_create(card, port[dev], irq[dev],
index 6d58f24..552e2cb 100644 (file)
@@ -395,7 +395,6 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
        case 0x10ec0282:
        case 0x10ec0283:
        case 0x10ec0286:
-       case 0x10ec0287:
        case 0x10ec0288:
        case 0x10ec0285:
        case 0x10ec0298:
@@ -406,6 +405,10 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
        case 0x10ec0275:
                alc_update_coef_idx(codec, 0xe, 0, 1<<0);
                break;
+       case 0x10ec0287:
+               alc_update_coef_idx(codec, 0x10, 1<<9, 0);
+               alc_write_coef_idx(codec, 0x8, 0x4ab7);
+               break;
        case 0x10ec0293:
                alc_update_coef_idx(codec, 0xa, 1<<13, 0);
                break;
@@ -6251,6 +6254,35 @@ static void alc294_fixup_gx502_hp(struct hda_codec *codec,
        }
 }
 
+static void alc294_gu502_toggle_output(struct hda_codec *codec,
+                                      struct hda_jack_callback *cb)
+{
+       /* Windows sets 0x10 to 0x8420 for Node 0x20 which is
+        * responsible from changes between speakers and headphones
+        */
+       if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
+               alc_write_coef_idx(codec, 0x10, 0x8420);
+       else
+               alc_write_coef_idx(codec, 0x10, 0x0a20);
+}
+
+static void alc294_fixup_gu502_hp(struct hda_codec *codec,
+                                 const struct hda_fixup *fix, int action)
+{
+       if (!is_jack_detectable(codec, 0x21))
+               return;
+
+       switch (action) {
+       case HDA_FIXUP_ACT_PRE_PROBE:
+               snd_hda_jack_detect_enable_callback(codec, 0x21,
+                               alc294_gu502_toggle_output);
+               break;
+       case HDA_FIXUP_ACT_INIT:
+               alc294_gu502_toggle_output(codec, NULL);
+               break;
+       }
+}
+
 static void  alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
                              const struct hda_fixup *fix, int action)
 {
@@ -6468,6 +6500,9 @@ enum {
        ALC294_FIXUP_ASUS_GX502_HP,
        ALC294_FIXUP_ASUS_GX502_PINS,
        ALC294_FIXUP_ASUS_GX502_VERBS,
+       ALC294_FIXUP_ASUS_GU502_HP,
+       ALC294_FIXUP_ASUS_GU502_PINS,
+       ALC294_FIXUP_ASUS_GU502_VERBS,
        ALC285_FIXUP_HP_GPIO_LED,
        ALC285_FIXUP_HP_MUTE_LED,
        ALC236_FIXUP_HP_GPIO_LED,
@@ -6507,6 +6542,7 @@ enum {
        ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST,
        ALC295_FIXUP_ASUS_DACS,
        ALC295_FIXUP_HP_OMEN,
+       ALC285_FIXUP_HP_SPECTRE_X360,
 };
 
 static const struct hda_fixup alc269_fixups[] = {
@@ -7709,6 +7745,35 @@ static const struct hda_fixup alc269_fixups[] = {
                .type = HDA_FIXUP_FUNC,
                .v.func = alc294_fixup_gx502_hp,
        },
+       [ALC294_FIXUP_ASUS_GU502_PINS] = {
+               .type = HDA_FIXUP_PINS,
+               .v.pins = (const struct hda_pintbl[]) {
+                       { 0x19, 0x01a11050 }, /* rear HP mic */
+                       { 0x1a, 0x01a11830 }, /* rear external mic */
+                       { 0x21, 0x012110f0 }, /* rear HP out */
+                       { }
+               },
+               .chained = true,
+               .chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
+       },
+       [ALC294_FIXUP_ASUS_GU502_VERBS] = {
+               .type = HDA_FIXUP_VERBS,
+               .v.verbs = (const struct hda_verb[]) {
+                       /* set 0x15 to HP-OUT ctrl */
+                       { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
+                       /* unmute the 0x15 amp */
+                       { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
+                       /* set 0x1b to HP-OUT */
+                       { 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
+                       { }
+               },
+               .chained = true,
+               .chain_id = ALC294_FIXUP_ASUS_GU502_HP
+       },
+       [ALC294_FIXUP_ASUS_GU502_HP] = {
+               .type = HDA_FIXUP_FUNC,
+               .v.func = alc294_fixup_gu502_hp,
+       },
        [ALC294_FIXUP_ASUS_COEF_1B] = {
                .type = HDA_FIXUP_VERBS,
                .v.verbs = (const struct hda_verb[]) {
@@ -8035,6 +8100,15 @@ static const struct hda_fixup alc269_fixups[] = {
                .chained = true,
                .chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
        },
+       [ALC285_FIXUP_HP_SPECTRE_X360] = {
+               .type = HDA_FIXUP_PINS,
+               .v.pins = (const struct hda_pintbl[]) {
+                       { 0x14, 0x90170110 }, /* enable top speaker */
+                       {}
+               },
+               .chained = true,
+               .chain_id = ALC285_FIXUP_SPEAKER2_TO_DAC1,
+       },
 };
 
 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -8195,6 +8269,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
        SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
        SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
+       SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
        SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
        SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
        SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
@@ -8253,6 +8328,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
        SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
        SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
+       SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
        SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
        SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
        SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
@@ -8309,12 +8385,19 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
@@ -8332,9 +8415,17 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL53RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL5XNU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
        SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
        SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
@@ -8600,6 +8691,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
        {.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
        {.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
        {.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
+       {.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
        {}
 };
 #define ALC225_STANDARD_PINS \
index 35903d1..5b124c4 100644 (file)
@@ -331,6 +331,7 @@ struct ichdev {
        unsigned int ali_slot;                  /* ALI DMA slot */
        struct ac97_pcm *pcm;
        int pcm_open_flag;
+       unsigned int prepared:1;
        unsigned int suspended: 1;
 };
 
@@ -691,6 +692,9 @@ static inline void snd_intel8x0_update(struct intel8x0 *chip, struct ichdev *ich
        int status, civ, i, step;
        int ack = 0;
 
+       if (!ichdev->prepared || ichdev->suspended)
+               return;
+
        spin_lock_irqsave(&chip->reg_lock, flags);
        status = igetbyte(chip, port + ichdev->roff_sr);
        civ = igetbyte(chip, port + ICH_REG_OFF_CIV);
@@ -881,6 +885,7 @@ static int snd_intel8x0_hw_params(struct snd_pcm_substream *substream,
        if (ichdev->pcm_open_flag) {
                snd_ac97_pcm_close(ichdev->pcm);
                ichdev->pcm_open_flag = 0;
+               ichdev->prepared = 0;
        }
        err = snd_ac97_pcm_open(ichdev->pcm, params_rate(hw_params),
                                params_channels(hw_params),
@@ -902,6 +907,7 @@ static int snd_intel8x0_hw_free(struct snd_pcm_substream *substream)
        if (ichdev->pcm_open_flag) {
                snd_ac97_pcm_close(ichdev->pcm);
                ichdev->pcm_open_flag = 0;
+               ichdev->prepared = 0;
        }
        return 0;
 }
@@ -976,6 +982,7 @@ static int snd_intel8x0_pcm_prepare(struct snd_pcm_substream *substream)
                        ichdev->pos_shift = (runtime->sample_bits > 16) ? 2 : 1;
        }
        snd_intel8x0_setup_periods(chip, ichdev);
+       ichdev->prepared = 1;
        return 0;
 }
 
index 80bc7c1..80cd3ea 100644 (file)
@@ -1735,6 +1735,14 @@ static DEVICE_ATTR(hpload_dc_r, 0444, cs43130_show_dc_r, NULL);
 static DEVICE_ATTR(hpload_ac_l, 0444, cs43130_show_ac_l, NULL);
 static DEVICE_ATTR(hpload_ac_r, 0444, cs43130_show_ac_r, NULL);
 
+static struct attribute *hpload_attrs[] = {
+       &dev_attr_hpload_dc_l.attr,
+       &dev_attr_hpload_dc_r.attr,
+       &dev_attr_hpload_ac_l.attr,
+       &dev_attr_hpload_ac_r.attr,
+};
+ATTRIBUTE_GROUPS(hpload);
+
 static struct reg_sequence hp_en_cal_seq[] = {
        {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL},
        {CS43130_HP_MEAS_LOAD_1, 0},
@@ -2302,25 +2310,15 @@ static int cs43130_probe(struct snd_soc_component *component)
 
        cs43130->hpload_done = false;
        if (cs43130->dc_meas) {
-               ret = device_create_file(component->dev, &dev_attr_hpload_dc_l);
-               if (ret < 0)
-                       return ret;
-
-               ret = device_create_file(component->dev, &dev_attr_hpload_dc_r);
-               if (ret < 0)
-                       return ret;
-
-               ret = device_create_file(component->dev, &dev_attr_hpload_ac_l);
-               if (ret < 0)
-                       return ret;
-
-               ret = device_create_file(component->dev, &dev_attr_hpload_ac_r);
-               if (ret < 0)
+               ret = sysfs_create_groups(&component->dev->kobj, hpload_groups);
+               if (ret)
                        return ret;
 
                cs43130->wq = create_singlethread_workqueue("cs43130_hp");
-               if (!cs43130->wq)
+               if (!cs43130->wq) {
+                       sysfs_remove_groups(&component->dev->kobj, hpload_groups);
                        return -ENOMEM;
+               }
                INIT_WORK(&cs43130->work, cs43130_imp_meas);
        }
 
index 9408ee6..438fa18 100644 (file)
@@ -3388,30 +3388,44 @@ static int rt5645_probe(struct snd_soc_component *component)
 {
        struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
        struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
+       int ret = 0;
 
        rt5645->component = component;
 
        switch (rt5645->codec_type) {
        case CODEC_TYPE_RT5645:
-               snd_soc_dapm_new_controls(dapm,
+               ret = snd_soc_dapm_new_controls(dapm,
                        rt5645_specific_dapm_widgets,
                        ARRAY_SIZE(rt5645_specific_dapm_widgets));
-               snd_soc_dapm_add_routes(dapm,
+               if (ret < 0)
+                       goto exit;
+
+               ret = snd_soc_dapm_add_routes(dapm,
                        rt5645_specific_dapm_routes,
                        ARRAY_SIZE(rt5645_specific_dapm_routes));
+               if (ret < 0)
+                       goto exit;
+
                if (rt5645->v_id < 3) {
-                       snd_soc_dapm_add_routes(dapm,
+                       ret = snd_soc_dapm_add_routes(dapm,
                                rt5645_old_dapm_routes,
                                ARRAY_SIZE(rt5645_old_dapm_routes));
+                       if (ret < 0)
+                               goto exit;
                }
                break;
        case CODEC_TYPE_RT5650:
-               snd_soc_dapm_new_controls(dapm,
+               ret = snd_soc_dapm_new_controls(dapm,
                        rt5650_specific_dapm_widgets,
                        ARRAY_SIZE(rt5650_specific_dapm_widgets));
-               snd_soc_dapm_add_routes(dapm,
+               if (ret < 0)
+                       goto exit;
+
+               ret = snd_soc_dapm_add_routes(dapm,
                        rt5650_specific_dapm_routes,
                        ARRAY_SIZE(rt5650_specific_dapm_routes));
+               if (ret < 0)
+                       goto exit;
                break;
        }
 
@@ -3419,9 +3433,17 @@ static int rt5645_probe(struct snd_soc_component *component)
 
        /* for JD function */
        if (rt5645->pdata.jd_mode) {
-               snd_soc_dapm_force_enable_pin(dapm, "JD Power");
-               snd_soc_dapm_force_enable_pin(dapm, "LDO2");
-               snd_soc_dapm_sync(dapm);
+               ret = snd_soc_dapm_force_enable_pin(dapm, "JD Power");
+               if (ret < 0)
+                       goto exit;
+
+               ret = snd_soc_dapm_force_enable_pin(dapm, "LDO2");
+               if (ret < 0)
+                       goto exit;
+
+               ret = snd_soc_dapm_sync(dapm);
+               if (ret < 0)
+                       goto exit;
        }
 
        if (rt5645->pdata.long_name)
@@ -3432,9 +3454,14 @@ static int rt5645_probe(struct snd_soc_component *component)
                GFP_KERNEL);
 
        if (!rt5645->eq_param)
-               return -ENOMEM;
-
-       return 0;
+               ret = -ENOMEM;
+exit:
+       /*
+        * If there was an error above, everything will be cleaned up by the
+        * caller if we return an error here.  This will be done with a later
+        * call to rt5645_remove().
+        */
+       return ret;
 }
 
 static void rt5645_remove(struct snd_soc_component *component)
index a030dd6..9602929 100644 (file)
@@ -699,6 +699,10 @@ static int line6_init_cap_control(struct usb_line6 *line6)
                line6->buffer_message = kmalloc(LINE6_MIDI_MESSAGE_MAXLEN, GFP_KERNEL);
                if (!line6->buffer_message)
                        return -ENOMEM;
+
+               ret = line6_init_midi(line6);
+               if (ret < 0)
+                       return ret;
        } else {
                ret = line6_hwdep_init(line6);
                if (ret < 0)
index cd44cb5..16e6443 100644 (file)
@@ -376,11 +376,6 @@ static int pod_init(struct usb_line6 *line6,
        if (err < 0)
                return err;
 
-       /* initialize MIDI subsystem: */
-       err = line6_init_midi(line6);
-       if (err < 0)
-               return err;
-
        /* initialize PCM subsystem: */
        err = line6_init_pcm(line6, &pod_pcm_properties);
        if (err < 0)
index ed158f0..c2245aa 100644 (file)
@@ -159,7 +159,6 @@ static int variax_init(struct usb_line6 *line6,
                       const struct usb_device_id *id)
 {
        struct usb_line6_variax *variax = line6_to_variax(line6);
-       int err;
 
        line6->process_message = line6_variax_process_message;
        line6->disconnect = line6_variax_disconnect;
@@ -172,11 +171,6 @@ static int variax_init(struct usb_line6 *line6,
        if (variax->buffer_activate == NULL)
                return -ENOMEM;
 
-       /* initialize MIDI subsystem: */
-       err = line6_init_midi(&variax->line6);
-       if (err < 0)
-               return err;
-
        /* initiate startup procedure: */
        schedule_delayed_work(&line6->startup_work,
                              msecs_to_jiffies(VARIAX_STARTUP_DELAY1));
index a10ac75..2c01649 100644 (file)
@@ -1750,7 +1750,7 @@ static struct usb_midi_in_jack_descriptor *find_usb_in_jack_descriptor(
                struct usb_midi_in_jack_descriptor *injd =
                                (struct usb_midi_in_jack_descriptor *)extra;
 
-               if (injd->bLength > 4 &&
+               if (injd->bLength >= sizeof(*injd) &&
                    injd->bDescriptorType == USB_DT_CS_INTERFACE &&
                    injd->bDescriptorSubtype == UAC_MIDI_IN_JACK &&
                                injd->bJackID == jack_id)
@@ -1773,7 +1773,7 @@ static struct usb_midi_out_jack_descriptor *find_usb_out_jack_descriptor(
                struct usb_midi_out_jack_descriptor *outjd =
                                (struct usb_midi_out_jack_descriptor *)extra;
 
-               if (outjd->bLength > 4 &&
+               if (outjd->bLength >= sizeof(*outjd) &&
                    outjd->bDescriptorType == USB_DT_CS_INTERFACE &&
                    outjd->bDescriptorSubtype == UAC_MIDI_OUT_JACK &&
                                outjd->bJackID == jack_id)
@@ -1820,7 +1820,8 @@ static void snd_usbmidi_init_substream(struct snd_usb_midi *umidi,
                        outjd = find_usb_out_jack_descriptor(hostif, jack_id);
                        if (outjd) {
                                sz = USB_DT_MIDI_OUT_SIZE(outjd->bNrInputPins);
-                               iJack = *(((uint8_t *) outjd) + sz - sizeof(uint8_t));
+                               if (outjd->bLength >= sz)
+                                       iJack = *(((uint8_t *) outjd) + sz - sizeof(uint8_t));
                        }
                } else {
                        /* and out jacks connect to ins */
@@ -1956,8 +1957,12 @@ static int snd_usbmidi_get_ms_info(struct snd_usb_midi *umidi,
                ms_ep = find_usb_ms_endpoint_descriptor(hostep);
                if (!ms_ep)
                        continue;
+               if (ms_ep->bLength <= sizeof(*ms_ep))
+                       continue;
                if (ms_ep->bNumEmbMIDIJack > 0x10)
                        continue;
+               if (ms_ep->bLength < sizeof(*ms_ep) + ms_ep->bNumEmbMIDIJack)
+                       continue;
                if (usb_endpoint_dir_out(ep)) {
                        if (endpoints[epidx].out_ep) {
                                if (++epidx >= MIDI_MAX_ENDPOINTS) {
index cc79856..4ba87de 100644 (file)
@@ -2,6 +2,7 @@
 #ifndef _ASM_POWERPC_ERRNO_H
 #define _ASM_POWERPC_ERRNO_H
 
+#undef EDEADLOCK
 #include <asm-generic/errno.h>
 
 #undef EDEADLOCK
index cc96e26..ac37830 100644 (file)
@@ -84,7 +84,7 @@
 
 /* CPU types for specific tunings: */
 #define X86_FEATURE_K8                 ( 3*32+ 4) /* "" Opteron, Athlon64 */
-#define X86_FEATURE_K7                 ( 3*32+ 5) /* "" Athlon */
+/* FREE, was #define X86_FEATURE_K7                    ( 3*32+ 5) "" Athlon */
 #define X86_FEATURE_P3                 ( 3*32+ 6) /* "" P3 */
 #define X86_FEATURE_P4                 ( 3*32+ 7) /* "" P4 */
 #define X86_FEATURE_CONSTANT_TSC       ( 3*32+ 8) /* TSC ticks at a constant rate */
 #define X86_FEATURE_EPT_AD             ( 8*32+17) /* Intel Extended Page Table access-dirty bit */
 #define X86_FEATURE_VMCALL             ( 8*32+18) /* "" Hypervisor supports the VMCALL instruction */
 #define X86_FEATURE_VMW_VMMCALL                ( 8*32+19) /* "" VMware prefers VMMCALL hypercall instruction */
+#define X86_FEATURE_PVUNLOCK           ( 8*32+20) /* "" PV unlock function */
+#define X86_FEATURE_VCPUPREEMPT                ( 8*32+21) /* "" PV vcpu_is_preempted function */
 
 /* Intel-defined CPU features, CPUID level 0x00000007:0 (EBX), word 9 */
 #define X86_FEATURE_FSGSBASE           ( 9*32+ 0) /* RDFSBASE, WRFSBASE, RDGSBASE, WRGSBASE instructions*/
 #define X86_FEATURE_FENCE_SWAPGS_KERNEL        (11*32+ 5) /* "" LFENCE in kernel entry SWAPGS path */
 #define X86_FEATURE_SPLIT_LOCK_DETECT  (11*32+ 6) /* #AC for split lock */
 #define X86_FEATURE_PER_THREAD_MBA     (11*32+ 7) /* "" Per-thread Memory Bandwidth Allocation */
+#define X86_FEATURE_SGX1               (11*32+ 8) /* "" Basic SGX */
+#define X86_FEATURE_SGX2               (11*32+ 9) /* "" SGX Enclave Dynamic Memory Management (EDMM) */
 
 /* Intel-defined CPU features, CPUID level 0x00000007:1 (EAX), word 12 */
 #define X86_FEATURE_AVX_VNNI           (12*32+ 4) /* AVX VNNI instructions */
 #define X86_FEATURE_AVIC               (15*32+13) /* Virtual Interrupt Controller */
 #define X86_FEATURE_V_VMSAVE_VMLOAD    (15*32+15) /* Virtual VMSAVE VMLOAD */
 #define X86_FEATURE_VGIF               (15*32+16) /* Virtual GIF */
+#define X86_FEATURE_V_SPEC_CTRL                (15*32+20) /* Virtual SPEC_CTRL */
 #define X86_FEATURE_SVME_ADDR_CHK      (15*32+28) /* "" SVME addr check */
 
 /* Intel-defined CPU features, CPUID level 0x00000007:0 (ECX), word 16 */
 #define X86_FEATURE_AVX512_VPOPCNTDQ   (16*32+14) /* POPCNT for vectors of DW/QW */
 #define X86_FEATURE_LA57               (16*32+16) /* 5-level page tables */
 #define X86_FEATURE_RDPID              (16*32+22) /* RDPID instruction */
+#define X86_FEATURE_BUS_LOCK_DETECT    (16*32+24) /* Bus Lock detect */
 #define X86_FEATURE_CLDEMOTE           (16*32+25) /* CLDEMOTE instruction */
 #define X86_FEATURE_MOVDIRI            (16*32+27) /* MOVDIRI instruction */
 #define X86_FEATURE_MOVDIR64B          (16*32+28) /* MOVDIR64B instruction */
 #define X86_FEATURE_MD_CLEAR           (18*32+10) /* VERW clears CPU buffers */
 #define X86_FEATURE_TSX_FORCE_ABORT    (18*32+13) /* "" TSX_FORCE_ABORT */
 #define X86_FEATURE_SERIALIZE          (18*32+14) /* SERIALIZE instruction */
+#define X86_FEATURE_HYBRID_CPU         (18*32+15) /* "" This part has CPUs of more than one type */
 #define X86_FEATURE_TSXLDTRK           (18*32+16) /* TSX Suspend Load Address Tracking */
 #define X86_FEATURE_PCONFIG            (18*32+18) /* Intel PCONFIG */
 #define X86_FEATURE_ARCH_LBR           (18*32+19) /* Intel ARCH LBR */
index 4502935..211ba33 100644 (file)
 #define MSR_PEBS_DATA_CFG              0x000003f2
 #define MSR_IA32_DS_AREA               0x00000600
 #define MSR_IA32_PERF_CAPABILITIES     0x00000345
+#define PERF_CAP_METRICS_IDX           15
+#define PERF_CAP_PT_IDX                        16
+
 #define MSR_PEBS_LD_LAT_THRESHOLD      0x000003f6
 
 #define MSR_IA32_RTIT_CTL              0x00000570
 #define DEBUGCTLMSR_LBR                        (1UL <<  0) /* last branch recording */
 #define DEBUGCTLMSR_BTF_SHIFT          1
 #define DEBUGCTLMSR_BTF                        (1UL <<  1) /* single-step on branches */
+#define DEBUGCTLMSR_BUS_LOCK_DETECT    (1UL <<  2)
 #define DEBUGCTLMSR_TR                 (1UL <<  6)
 #define DEBUGCTLMSR_BTS                        (1UL <<  7)
 #define DEBUGCTLMSR_BTINT              (1UL <<  8)
 /* K8 MSRs */
 #define MSR_K8_TOP_MEM1                        0xc001001a
 #define MSR_K8_TOP_MEM2                        0xc001001d
-#define MSR_K8_SYSCFG                  0xc0010010
-#define MSR_K8_SYSCFG_MEM_ENCRYPT_BIT  23
-#define MSR_K8_SYSCFG_MEM_ENCRYPT      BIT_ULL(MSR_K8_SYSCFG_MEM_ENCRYPT_BIT)
+#define MSR_AMD64_SYSCFG               0xc0010010
+#define MSR_AMD64_SYSCFG_MEM_ENCRYPT_BIT       23
+#define MSR_AMD64_SYSCFG_MEM_ENCRYPT   BIT_ULL(MSR_AMD64_SYSCFG_MEM_ENCRYPT_BIT)
 #define MSR_K8_INT_PENDING_MSG         0xc0010055
 /* C1E active bits in int pending message */
 #define K8_INTP_C1E_ACTIVE_MASK                0x18000000
index b8e650a..946d761 100644 (file)
@@ -27,6 +27,7 @@
 
 
 #define VMX_EXIT_REASONS_FAILED_VMENTRY         0x80000000
+#define VMX_EXIT_REASONS_SGX_ENCLAVE_MODE      0x08000000
 
 #define EXIT_REASON_EXCEPTION_NMI       0
 #define EXIT_REASON_EXTERNAL_INTERRUPT  1
index 1e299ac..1cc9da6 100644 (file)
@@ -4,7 +4,7 @@
 #include <linux/linkage.h>
 #include <asm/errno.h>
 #include <asm/cpufeatures.h>
-#include <asm/alternative-asm.h>
+#include <asm/alternative.h>
 #include <asm/export.h>
 
 .pushsection .noinstr.text, "ax"
index 0bfd26e..9827ae2 100644 (file)
@@ -3,7 +3,7 @@
 
 #include <linux/linkage.h>
 #include <asm/cpufeatures.h>
-#include <asm/alternative-asm.h>
+#include <asm/alternative.h>
 #include <asm/export.h>
 
 /*
index cd72016..715092f 100644 (file)
@@ -51,39 +51,39 @@ subdir-obj-y :=
 build-file := $(dir)/Build
 -include $(build-file)
 
-quiet_cmd_flex  = FLEX     $@
-quiet_cmd_bison = BISON    $@
+quiet_cmd_flex  = FLEX    $@
+quiet_cmd_bison = BISON   $@
 
 # Create directory unless it exists
-quiet_cmd_mkdir = MKDIR    $(dir $@)
+quiet_cmd_mkdir = MKDIR   $(dir $@)
       cmd_mkdir = mkdir -p $(dir $@)
      rule_mkdir = $(if $(wildcard $(dir $@)),,@$(call echo-cmd,mkdir) $(cmd_mkdir))
 
 # Compile command
-quiet_cmd_cc_o_c = CC       $@
+quiet_cmd_cc_o_c = CC      $@
       cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
 
-quiet_cmd_host_cc_o_c = HOSTCC   $@
+quiet_cmd_host_cc_o_c = HOSTCC  $@
       cmd_host_cc_o_c = $(HOSTCC) $(host_c_flags) -c -o $@ $<
 
-quiet_cmd_cxx_o_c = CXX      $@
+quiet_cmd_cxx_o_c = CXX     $@
       cmd_cxx_o_c = $(CXX) $(cxx_flags) -c -o $@ $<
 
-quiet_cmd_cpp_i_c = CPP      $@
+quiet_cmd_cpp_i_c = CPP     $@
       cmd_cpp_i_c = $(CC) $(c_flags) -E -o $@ $<
 
-quiet_cmd_cc_s_c = AS       $@
+quiet_cmd_cc_s_c = AS      $@
       cmd_cc_s_c = $(CC) $(c_flags) -S -o $@ $<
 
-quiet_cmd_gen = GEN      $@
+quiet_cmd_gen = GEN     $@
 
 # Link agregate command
 # If there's nothing to link, create empty $@ object.
-quiet_cmd_ld_multi = LD       $@
+quiet_cmd_ld_multi = LD      $@
       cmd_ld_multi = $(if $(strip $(obj-y)),\
                      $(LD) -r -o $@  $(filter $(obj-y),$^),rm -f $@; $(AR) rcs $@)
 
-quiet_cmd_host_ld_multi = HOSTLD   $@
+quiet_cmd_host_ld_multi = HOSTLD  $@
       cmd_host_ld_multi = $(if $(strip $(obj-y)),\
                           $(HOSTLD) -r -o $@  $(filter $(obj-y),$^),rm -f $@; $(HOSTAR) rcs $@)
 
index 7f475d5..87d1126 100644 (file)
@@ -22,7 +22,7 @@
 #include <linux/build_bug.h>
 #define GENMASK_INPUT_CHECK(h, l) \
        (BUILD_BUG_ON_ZERO(__builtin_choose_expr( \
-               __builtin_constant_p((l) > (h)), (l) > (h), 0)))
+               __is_constexpr((l) > (h)), (l) > (h), 0)))
 #else
 /*
  * BUILD_BUG_ON_ZERO is not available in h files included from asm files,
index 81b8aae..435ddd7 100644 (file)
@@ -3,4 +3,12 @@
 
 #include <vdso/const.h>
 
+/*
+ * This returns a constant expression while determining if an argument is
+ * a constant expression, most importantly without evaluating the argument.
+ * Glory to Martin Uecker <Martin.Uecker@med.uni-goettingen.de>
+ */
+#define __is_constexpr(x) \
+       (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
+
 #endif /* _LINUX_CONST_H */
index ce58cff..6de5a7f 100644 (file)
@@ -863,9 +863,18 @@ __SYSCALL(__NR_process_madvise, sys_process_madvise)
 __SC_COMP(__NR_epoll_pwait2, sys_epoll_pwait2, compat_sys_epoll_pwait2)
 #define __NR_mount_setattr 442
 __SYSCALL(__NR_mount_setattr, sys_mount_setattr)
+#define __NR_quotactl_path 443
+__SYSCALL(__NR_quotactl_path, sys_quotactl_path)
+
+#define __NR_landlock_create_ruleset 444
+__SYSCALL(__NR_landlock_create_ruleset, sys_landlock_create_ruleset)
+#define __NR_landlock_add_rule 445
+__SYSCALL(__NR_landlock_add_rule, sys_landlock_add_rule)
+#define __NR_landlock_restrict_self 446
+__SYSCALL(__NR_landlock_restrict_self, sys_landlock_restrict_self)
 
 #undef __NR_syscalls
-#define __NR_syscalls 443
+#define __NR_syscalls 447
 
 /*
  * 32 bit systems traditionally used different
index 0827037..67b94bc 100644 (file)
@@ -625,30 +625,147 @@ struct drm_gem_open {
        __u64 size;
 };
 
+/**
+ * DRM_CAP_DUMB_BUFFER
+ *
+ * If set to 1, the driver supports creating dumb buffers via the
+ * &DRM_IOCTL_MODE_CREATE_DUMB ioctl.
+ */
 #define DRM_CAP_DUMB_BUFFER            0x1
+/**
+ * DRM_CAP_VBLANK_HIGH_CRTC
+ *
+ * If set to 1, the kernel supports specifying a CRTC index in the high bits of
+ * &drm_wait_vblank_request.type.
+ *
+ * Starting kernel version 2.6.39, this capability is always set to 1.
+ */
 #define DRM_CAP_VBLANK_HIGH_CRTC       0x2
+/**
+ * DRM_CAP_DUMB_PREFERRED_DEPTH
+ *
+ * The preferred bit depth for dumb buffers.
+ *
+ * The bit depth is the number of bits used to indicate the color of a single
+ * pixel excluding any padding. This is different from the number of bits per
+ * pixel. For instance, XRGB8888 has a bit depth of 24 but has 32 bits per
+ * pixel.
+ *
+ * Note that this preference only applies to dumb buffers, it's irrelevant for
+ * other types of buffers.
+ */
 #define DRM_CAP_DUMB_PREFERRED_DEPTH   0x3
+/**
+ * DRM_CAP_DUMB_PREFER_SHADOW
+ *
+ * If set to 1, the driver prefers userspace to render to a shadow buffer
+ * instead of directly rendering to a dumb buffer. For best speed, userspace
+ * should do streaming ordered memory copies into the dumb buffer and never
+ * read from it.
+ *
+ * Note that this preference only applies to dumb buffers, it's irrelevant for
+ * other types of buffers.
+ */
 #define DRM_CAP_DUMB_PREFER_SHADOW     0x4
+/**
+ * DRM_CAP_PRIME
+ *
+ * Bitfield of supported PRIME sharing capabilities. See &DRM_PRIME_CAP_IMPORT
+ * and &DRM_PRIME_CAP_EXPORT.
+ *
+ * PRIME buffers are exposed as dma-buf file descriptors. See
+ * Documentation/gpu/drm-mm.rst, section "PRIME Buffer Sharing".
+ */
 #define DRM_CAP_PRIME                  0x5
+/**
+ * DRM_PRIME_CAP_IMPORT
+ *
+ * If this bit is set in &DRM_CAP_PRIME, the driver supports importing PRIME
+ * buffers via the &DRM_IOCTL_PRIME_FD_TO_HANDLE ioctl.
+ */
 #define  DRM_PRIME_CAP_IMPORT          0x1
+/**
+ * DRM_PRIME_CAP_EXPORT
+ *
+ * If this bit is set in &DRM_CAP_PRIME, the driver supports exporting PRIME
+ * buffers via the &DRM_IOCTL_PRIME_HANDLE_TO_FD ioctl.
+ */
 #define  DRM_PRIME_CAP_EXPORT          0x2
+/**
+ * DRM_CAP_TIMESTAMP_MONOTONIC
+ *
+ * If set to 0, the kernel will report timestamps with ``CLOCK_REALTIME`` in
+ * struct drm_event_vblank. If set to 1, the kernel will report timestamps with
+ * ``CLOCK_MONOTONIC``. See ``clock_gettime(2)`` for the definition of these
+ * clocks.
+ *
+ * Starting from kernel version 2.6.39, the default value for this capability
+ * is 1. Starting kernel version 4.15, this capability is always set to 1.
+ */
 #define DRM_CAP_TIMESTAMP_MONOTONIC    0x6
+/**
+ * DRM_CAP_ASYNC_PAGE_FLIP
+ *
+ * If set to 1, the driver supports &DRM_MODE_PAGE_FLIP_ASYNC.
+ */
 #define DRM_CAP_ASYNC_PAGE_FLIP                0x7
-/*
- * The CURSOR_WIDTH and CURSOR_HEIGHT capabilities return a valid widthxheight
- * combination for the hardware cursor. The intention is that a hardware
- * agnostic userspace can query a cursor plane size to use.
+/**
+ * DRM_CAP_CURSOR_WIDTH
+ *
+ * The ``CURSOR_WIDTH`` and ``CURSOR_HEIGHT`` capabilities return a valid
+ * width x height combination for the hardware cursor. The intention is that a
+ * hardware agnostic userspace can query a cursor plane size to use.
  *
  * Note that the cross-driver contract is to merely return a valid size;
  * drivers are free to attach another meaning on top, eg. i915 returns the
  * maximum plane size.
  */
 #define DRM_CAP_CURSOR_WIDTH           0x8
+/**
+ * DRM_CAP_CURSOR_HEIGHT
+ *
+ * See &DRM_CAP_CURSOR_WIDTH.
+ */
 #define DRM_CAP_CURSOR_HEIGHT          0x9
+/**
+ * DRM_CAP_ADDFB2_MODIFIERS
+ *
+ * If set to 1, the driver supports supplying modifiers in the
+ * &DRM_IOCTL_MODE_ADDFB2 ioctl.
+ */
 #define DRM_CAP_ADDFB2_MODIFIERS       0x10
+/**
+ * DRM_CAP_PAGE_FLIP_TARGET
+ *
+ * If set to 1, the driver supports the &DRM_MODE_PAGE_FLIP_TARGET_ABSOLUTE and
+ * &DRM_MODE_PAGE_FLIP_TARGET_RELATIVE flags in
+ * &drm_mode_crtc_page_flip_target.flags for the &DRM_IOCTL_MODE_PAGE_FLIP
+ * ioctl.
+ */
 #define DRM_CAP_PAGE_FLIP_TARGET       0x11
+/**
+ * DRM_CAP_CRTC_IN_VBLANK_EVENT
+ *
+ * If set to 1, the kernel supports reporting the CRTC ID in
+ * &drm_event_vblank.crtc_id for the &DRM_EVENT_VBLANK and
+ * &DRM_EVENT_FLIP_COMPLETE events.
+ *
+ * Starting kernel version 4.12, this capability is always set to 1.
+ */
 #define DRM_CAP_CRTC_IN_VBLANK_EVENT   0x12
+/**
+ * DRM_CAP_SYNCOBJ
+ *
+ * If set to 1, the driver supports sync objects. See
+ * Documentation/gpu/drm-mm.rst, section "DRM Sync Objects".
+ */
 #define DRM_CAP_SYNCOBJ                0x13
+/**
+ * DRM_CAP_SYNCOBJ_TIMELINE
+ *
+ * If set to 1, the driver supports timeline operations on sync objects. See
+ * Documentation/gpu/drm-mm.rst, section "DRM Sync Objects".
+ */
 #define DRM_CAP_SYNCOBJ_TIMELINE       0x14
 
 /* DRM_IOCTL_GET_CAP ioctl argument type */
index 1987e2e..ddc47bb 100644 (file)
@@ -943,6 +943,7 @@ struct drm_i915_gem_exec_object {
        __u64 offset;
 };
 
+/* DRM_IOCTL_I915_GEM_EXECBUFFER was removed in Linux 5.13 */
 struct drm_i915_gem_execbuffer {
        /**
         * List of buffers to be validated with their relocations to be
index f6afee2..3fd9a7e 100644 (file)
@@ -1078,6 +1078,10 @@ struct kvm_ppc_resize_hpt {
 #define KVM_CAP_DIRTY_LOG_RING 192
 #define KVM_CAP_X86_BUS_LOCK_EXIT 193
 #define KVM_CAP_PPC_DAWR1 194
+#define KVM_CAP_SET_GUEST_DEBUG2 195
+#define KVM_CAP_SGX_ATTRIBUTE 196
+#define KVM_CAP_VM_COPY_ENC_CONTEXT_FROM 197
+#define KVM_CAP_PTP_KVM 198
 
 #ifdef KVM_CAP_IRQ_ROUTING
 
@@ -1671,6 +1675,8 @@ enum sev_cmd_id {
        KVM_SEV_CERT_EXPORT,
        /* Attestation report */
        KVM_SEV_GET_ATTESTATION_REPORT,
+       /* Guest Migration Extension */
+       KVM_SEV_SEND_CANCEL,
 
        KVM_SEV_NR_MAX,
 };
@@ -1729,6 +1735,45 @@ struct kvm_sev_attestation_report {
        __u32 len;
 };
 
+struct kvm_sev_send_start {
+       __u32 policy;
+       __u64 pdh_cert_uaddr;
+       __u32 pdh_cert_len;
+       __u64 plat_certs_uaddr;
+       __u32 plat_certs_len;
+       __u64 amd_certs_uaddr;
+       __u32 amd_certs_len;
+       __u64 session_uaddr;
+       __u32 session_len;
+};
+
+struct kvm_sev_send_update_data {
+       __u64 hdr_uaddr;
+       __u32 hdr_len;
+       __u64 guest_uaddr;
+       __u32 guest_len;
+       __u64 trans_uaddr;
+       __u32 trans_len;
+};
+
+struct kvm_sev_receive_start {
+       __u32 handle;
+       __u32 policy;
+       __u64 pdh_uaddr;
+       __u32 pdh_len;
+       __u64 session_uaddr;
+       __u32 session_len;
+};
+
+struct kvm_sev_receive_update_data {
+       __u64 hdr_uaddr;
+       __u32 hdr_len;
+       __u64 guest_uaddr;
+       __u32 guest_len;
+       __u64 trans_uaddr;
+       __u32 trans_len;
+};
+
 #define KVM_DEV_ASSIGN_ENABLE_IOMMU    (1 << 0)
 #define KVM_DEV_ASSIGN_PCI_2_3         (1 << 1)
 #define KVM_DEV_ASSIGN_MASK_INTX       (1 << 2)
index 14332f4..bf81435 100644 (file)
@@ -127,6 +127,7 @@ enum perf_sw_ids {
        PERF_COUNT_SW_EMULATION_FAULTS          = 8,
        PERF_COUNT_SW_DUMMY                     = 9,
        PERF_COUNT_SW_BPF_OUTPUT                = 10,
+       PERF_COUNT_SW_CGROUP_SWITCHES           = 11,
 
        PERF_COUNT_SW_MAX,                      /* non-ABI */
 };
@@ -326,6 +327,7 @@ enum perf_event_read_format {
 #define PERF_ATTR_SIZE_VER4    104     /* add: sample_regs_intr */
 #define PERF_ATTR_SIZE_VER5    112     /* add: aux_watermark */
 #define PERF_ATTR_SIZE_VER6    120     /* add: aux_sample_size */
+#define PERF_ATTR_SIZE_VER7    128     /* add: sig_data */
 
 /*
  * Hardware event_id to monitor via a performance monitoring event:
@@ -404,7 +406,10 @@ struct perf_event_attr {
                                cgroup         :  1, /* include cgroup events */
                                text_poke      :  1, /* include text poke events */
                                build_id       :  1, /* use build id in mmap2 events */
-                               __reserved_1   : 29;
+                               inherit_thread :  1, /* children only inherit if cloned with CLONE_THREAD */
+                               remove_on_exec :  1, /* event is removed from task on exec */
+                               sigtrap        :  1, /* send synchronous SIGTRAP on event */
+                               __reserved_1   : 26;
 
        union {
                __u32           wakeup_events;    /* wakeup every n events */
@@ -456,6 +461,12 @@ struct perf_event_attr {
        __u16   __reserved_2;
        __u32   aux_sample_size;
        __u32   __reserved_3;
+
+       /*
+        * User provided data if sigtrap=1, passed back to user via
+        * siginfo_t::si_perf, e.g. to permit user to identify the event.
+        */
+       __u64   sig_data;
 };
 
 /*
@@ -1171,10 +1182,15 @@ enum perf_callchain_context {
 /**
  * PERF_RECORD_AUX::flags bits
  */
-#define PERF_AUX_FLAG_TRUNCATED                0x01    /* record was truncated to fit */
-#define PERF_AUX_FLAG_OVERWRITE                0x02    /* snapshot from overwrite mode */
-#define PERF_AUX_FLAG_PARTIAL          0x04    /* record contains gaps */
-#define PERF_AUX_FLAG_COLLISION                0x08    /* sample collided with another */
+#define PERF_AUX_FLAG_TRUNCATED                        0x01    /* record was truncated to fit */
+#define PERF_AUX_FLAG_OVERWRITE                        0x02    /* snapshot from overwrite mode */
+#define PERF_AUX_FLAG_PARTIAL                  0x04    /* record contains gaps */
+#define PERF_AUX_FLAG_COLLISION                        0x08    /* sample collided with another */
+#define PERF_AUX_FLAG_PMU_FORMAT_TYPE_MASK     0xff00  /* PMU specific trace format type */
+
+/* CoreSight PMU AUX buffer formats */
+#define PERF_AUX_FLAG_CORESIGHT_FORMAT_CORESIGHT       0x0000 /* Default for backward compatibility */
+#define PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW             0x0100 /* Raw format of the source */
 
 #define PERF_FLAG_FD_NO_GROUP          (1UL << 0)
 #define PERF_FLAG_FD_OUTPUT            (1UL << 1)
index 667f1ae..18a9f59 100644 (file)
@@ -255,4 +255,8 @@ struct prctl_mm_map {
 # define SYSCALL_DISPATCH_FILTER_ALLOW 0
 # define SYSCALL_DISPATCH_FILTER_BLOCK 1
 
+/* Set/get enabled arm64 pointer authentication keys */
+#define PR_PAC_SET_ENABLED_KEYS                60
+#define PR_PAC_GET_ENABLED_KEYS                61
+
 #endif /* _LINUX_PRCTL_H */
index feaf464..3a9f203 100644 (file)
@@ -111,7 +111,7 @@ OPTIONS
 --tracepoints::
         retrieve statistics from tracepoints
 
-*z*::
+-z::
 --skip-zero-records::
         omit records with all zeros in logging mode
 
index cedf3ed..24295d3 100644 (file)
@@ -19,6 +19,7 @@
 #include <objtool/elf.h>
 #include <objtool/arch.h>
 #include <objtool/warn.h>
+#include <objtool/endianness.h>
 #include <arch/elf.h>
 
 static int is_x86_64(const struct elf *elf)
@@ -725,7 +726,7 @@ static int elf_add_alternative(struct elf *elf,
                return -1;
        }
 
-       alt->cpuid = cpuid;
+       alt->cpuid = bswap_if_needed(cpuid);
        alt->instrlen = orig_len;
        alt->replacementlen = repl_len;
 
index d08f5f3..743c2e9 100644 (file)
@@ -762,6 +762,7 @@ struct symbol *elf_create_undef_symbol(struct elf *elf, const char *name)
        data->d_buf = &sym->sym;
        data->d_size = sizeof(sym->sym);
        data->d_align = 1;
+       data->d_type = ELF_T_SYM;
 
        sym->idx = symtab->len / sizeof(sym->sym);
 
index 0d66190..406a951 100644 (file)
@@ -540,6 +540,7 @@ ifndef NO_LIBELF
       ifdef LIBBPF_DYNAMIC
         ifeq ($(feature-libbpf), 1)
           EXTLIBS += -lbpf
+          $(call detected,CONFIG_LIBBPF_DYNAMIC)
         else
           dummy := $(error Error: No libbpf devel library found, please install libbpf-devel);
         endif
index 2303256..73d18e0 100644 (file)
@@ -71,7 +71,7 @@ struct kvm_reg_events_ops kvm_reg_events_ops[] = {
                .name   = "vmexit",
                .ops    = &exit_events,
        },
-       { NULL },
+       { NULL, NULL },
 };
 
 const char * const kvm_skip_events[] = {
index 9164969..9974f5f 100644 (file)
 439    n64     faccessat2                      sys_faccessat2
 440    n64     process_madvise                 sys_process_madvise
 441    n64     epoll_pwait2                    sys_epoll_pwait2
+442    n64     mount_setattr                   sys_mount_setattr
+443    n64     quotactl_path                   sys_quotactl_path
+444    n64     landlock_create_ruleset         sys_landlock_create_ruleset
+445    n64     landlock_add_rule               sys_landlock_add_rule
+446    n64     landlock_restrict_self          sys_landlock_restrict_self
index 0b2480c..2e68fbb 100644 (file)
 440    common  process_madvise                 sys_process_madvise
 441    common  epoll_pwait2                    sys_epoll_pwait2                compat_sys_epoll_pwait2
 442    common  mount_setattr                   sys_mount_setattr
+443    common  quotactl_path                   sys_quotactl_path
+444    common  landlock_create_ruleset         sys_landlock_create_ruleset
+445    common  landlock_add_rule               sys_landlock_add_rule
+446    common  landlock_restrict_self          sys_landlock_restrict_self
index 3abef21..7e4a2ab 100644 (file)
 440  common    process_madvise         sys_process_madvise             sys_process_madvise
 441  common    epoll_pwait2            sys_epoll_pwait2                compat_sys_epoll_pwait2
 442  common    mount_setattr           sys_mount_setattr               sys_mount_setattr
+443  common    quotactl_path           sys_quotactl_path               sys_quotactl_path
+444  common    landlock_create_ruleset sys_landlock_create_ruleset     sys_landlock_create_ruleset
+445  common    landlock_add_rule       sys_landlock_add_rule           sys_landlock_add_rule
+446  common    landlock_restrict_self  sys_landlock_restrict_self      sys_landlock_restrict_self
index 7bf01cb..ecd551b 100644 (file)
 440    common  process_madvise         sys_process_madvise
 441    common  epoll_pwait2            sys_epoll_pwait2
 442    common  mount_setattr           sys_mount_setattr
+443    common  quotactl_path           sys_quotactl_path
+444    common  landlock_create_ruleset sys_landlock_create_ruleset
+445    common  landlock_add_rule       sys_landlock_add_rule
+446    common  landlock_restrict_self  sys_landlock_restrict_self
 
 #
 # Due to a historical design error, certain syscalls are numbered differently
index ed4f0bd..7422b0e 100644 (file)
@@ -1123,8 +1123,10 @@ static int process_one_file(const char *fpath, const struct stat *sb,
                        mapfile = strdup(fpath);
                        return 0;
                }
-
-               pr_info("%s: Ignoring file %s\n", prog, fpath);
+               if (is_json_file(bname))
+                       pr_debug("%s: ArchStd json is preprocessed %s\n", prog, fpath);
+               else
+                       pr_info("%s: Ignoring file %s\n", prog, fpath);
                return 0;
        }
 
index 645009c..4a7b8de 100644 (file)
@@ -5,7 +5,7 @@ group_fd=-1
 flags=0|8
 cpu=*
 type=0|1
-size=120
+size=128
 config=0
 sample_period=*
 sample_type=263
index b0f42c3..4081644 100644 (file)
@@ -5,7 +5,7 @@ group_fd=-1
 flags=0|8
 cpu=*
 type=0
-size=120
+size=128
 config=0
 sample_period=0
 sample_type=65536
index eba723c..86a15dd 100644 (file)
@@ -7,7 +7,7 @@ cpu=*
 pid=-1
 flags=8
 type=1
-size=120
+size=128
 config=9
 sample_period=4000
 sample_type=455
index 8c0d9f3..b64bdc1 100644 (file)
@@ -145,7 +145,14 @@ perf-$(CONFIG_LIBELF) += symbol-elf.o
 perf-$(CONFIG_LIBELF) += probe-file.o
 perf-$(CONFIG_LIBELF) += probe-event.o
 
+ifdef CONFIG_LIBBPF_DYNAMIC
+  hashmap := 1
+endif
 ifndef CONFIG_LIBBPF
+  hashmap := 1
+endif
+
+ifdef hashmap
 perf-y += hashmap.o
 endif
 
index f99852d..43e5b56 100644 (file)
@@ -157,9 +157,15 @@ static int get_max_rate(unsigned int *rate)
 static int record_opts__config_freq(struct record_opts *opts)
 {
        bool user_freq = opts->user_freq != UINT_MAX;
+       bool user_interval = opts->user_interval != ULLONG_MAX;
        unsigned int max_rate;
 
-       if (opts->user_interval != ULLONG_MAX)
+       if (user_interval && user_freq) {
+               pr_err("cannot set frequency and period at the same time\n");
+               return -1;
+       }
+
+       if (user_interval)
                opts->default_interval = opts->user_interval;
        if (user_freq)
                opts->freq = opts->user_freq;
index a12cf4f..106b3d6 100644 (file)
@@ -904,7 +904,7 @@ static void perf_event__cpu_map_swap(union perf_event *event,
        struct perf_record_record_cpu_map *mask;
        unsigned i;
 
-       data->type = bswap_64(data->type);
+       data->type = bswap_16(data->type);
 
        switch (data->type) {
        case PERF_CPU_MAP__CPUS:
@@ -937,7 +937,7 @@ static void perf_event__stat_config_swap(union perf_event *event,
 {
        u64 size;
 
-       size  = event->stat_config.nr * sizeof(event->stat_config.data[0]);
+       size  = bswap_64(event->stat_config.nr) * sizeof(event->stat_config.data[0]);
        size += 1; /* nr item itself */
        mem_bswap_64(&event->stat_config.nr, size);
 }
index f9271f3..071312f 100644 (file)
@@ -131,29 +131,29 @@ QUIET_SUBDIR1  =
 
 ifneq ($(silent),1)
   ifneq ($(V),1)
-       QUIET_CC       = @echo '  CC       '$@;
-       QUIET_CC_FPIC  = @echo '  CC FPIC  '$@;
-       QUIET_CLANG    = @echo '  CLANG    '$@;
-       QUIET_AR       = @echo '  AR       '$@;
-       QUIET_LINK     = @echo '  LINK     '$@;
-       QUIET_MKDIR    = @echo '  MKDIR    '$@;
-       QUIET_GEN      = @echo '  GEN      '$@;
+       QUIET_CC       = @echo '  CC      '$@;
+       QUIET_CC_FPIC  = @echo '  CC FPIC '$@;
+       QUIET_CLANG    = @echo '  CLANG   '$@;
+       QUIET_AR       = @echo '  AR      '$@;
+       QUIET_LINK     = @echo '  LINK    '$@;
+       QUIET_MKDIR    = @echo '  MKDIR   '$@;
+       QUIET_GEN      = @echo '  GEN     '$@;
        QUIET_SUBDIR0  = +@subdir=
        QUIET_SUBDIR1  = ;$(NO_SUBDIR) \
-                         echo '  SUBDIR   '$$subdir; \
+                         echo '  SUBDIR  '$$subdir; \
                         $(MAKE) $(PRINT_DIR) -C $$subdir
-       QUIET_FLEX     = @echo '  FLEX     '$@;
-       QUIET_BISON    = @echo '  BISON    '$@;
-       QUIET_GENSKEL  = @echo '  GEN-SKEL '$@;
+       QUIET_FLEX     = @echo '  FLEX    '$@;
+       QUIET_BISON    = @echo '  BISON   '$@;
+       QUIET_GENSKEL  = @echo '  GENSKEL '$@;
 
        descend = \
-               +@echo         '  DESCEND  '$(1); \
+               +@echo         '  DESCEND '$(1); \
                mkdir -p $(OUTPUT)$(1) && \
                $(MAKE) $(COMMAND_O) subdir=$(if $(subdir),$(subdir)/$(1),$(1)) $(PRINT_DIR) -C $(1) $(2)
 
-       QUIET_CLEAN    = @printf '  CLEAN    %s\n' $1;
-       QUIET_INSTALL  = @printf '  INSTALL  %s\n' $1;
-       QUIET_UNINST   = @printf '  UNINST   %s\n' $1;
+       QUIET_CLEAN    = @printf '  CLEAN   %s\n' $1;
+       QUIET_INSTALL  = @printf '  INSTALL %s\n' $1;
+       QUIET_UNINST   = @printf '  UNINST  %s\n' $1;
   endif
 endif
 
index c62d372..ed563bd 100644 (file)
@@ -62,7 +62,7 @@ struct nfit_test_resource *get_nfit_res(resource_size_t resource)
 }
 EXPORT_SYMBOL(get_nfit_res);
 
-void __iomem *__nfit_test_ioremap(resource_size_t offset, unsigned long size,
+static void __iomem *__nfit_test_ioremap(resource_size_t offset, unsigned long size,
                void __iomem *(*fallback_fn)(resource_size_t, unsigned long))
 {
        struct nfit_test_resource *nfit_res = get_nfit_res(offset);
index 9b185bf..54f367c 100644 (file)
@@ -1871,9 +1871,16 @@ static void smart_init(struct nfit_test *t)
        }
 }
 
+static size_t sizeof_spa(struct acpi_nfit_system_address *spa)
+{
+       /* until spa location cookie support is added... */
+       return sizeof(*spa) - 8;
+}
+
 static int nfit_test0_alloc(struct nfit_test *t)
 {
-       size_t nfit_size = sizeof(struct acpi_nfit_system_address) * NUM_SPA
+       struct acpi_nfit_system_address *spa = NULL;
+       size_t nfit_size = sizeof_spa(spa) * NUM_SPA
                        + sizeof(struct acpi_nfit_memory_map) * NUM_MEM
                        + sizeof(struct acpi_nfit_control_region) * NUM_DCR
                        + offsetof(struct acpi_nfit_control_region,
@@ -1937,7 +1944,8 @@ static int nfit_test0_alloc(struct nfit_test *t)
 
 static int nfit_test1_alloc(struct nfit_test *t)
 {
-       size_t nfit_size = sizeof(struct acpi_nfit_system_address) * 2
+       struct acpi_nfit_system_address *spa = NULL;
+       size_t nfit_size = sizeof_spa(spa) * 2
                + sizeof(struct acpi_nfit_memory_map) * 2
                + offsetof(struct acpi_nfit_control_region, window_size) * 2;
        int i;
@@ -2000,7 +2008,7 @@ static void nfit_test0_setup(struct nfit_test *t)
         */
        spa = nfit_buf;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-       spa->header.length = sizeof(*spa);
+       spa->header.length = sizeof_spa(spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_PM), 16);
        spa->range_index = 0+1;
        spa->address = t->spa_set_dma[0];
@@ -2014,7 +2022,7 @@ static void nfit_test0_setup(struct nfit_test *t)
         */
        spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-       spa->header.length = sizeof(*spa);
+       spa->header.length = sizeof_spa(spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_PM), 16);
        spa->range_index = 1+1;
        spa->address = t->spa_set_dma[1];
@@ -2024,7 +2032,7 @@ static void nfit_test0_setup(struct nfit_test *t)
        /* spa2 (dcr0) dimm0 */
        spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-       spa->header.length = sizeof(*spa);
+       spa->header.length = sizeof_spa(spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16);
        spa->range_index = 2+1;
        spa->address = t->dcr_dma[0];
@@ -2034,7 +2042,7 @@ static void nfit_test0_setup(struct nfit_test *t)
        /* spa3 (dcr1) dimm1 */
        spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-       spa->header.length = sizeof(*spa);
+       spa->header.length = sizeof_spa(spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16);
        spa->range_index = 3+1;
        spa->address = t->dcr_dma[1];
@@ -2044,7 +2052,7 @@ static void nfit_test0_setup(struct nfit_test *t)
        /* spa4 (dcr2) dimm2 */
        spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-       spa->header.length = sizeof(*spa);
+       spa->header.length = sizeof_spa(spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16);
        spa->range_index = 4+1;
        spa->address = t->dcr_dma[2];
@@ -2054,7 +2062,7 @@ static void nfit_test0_setup(struct nfit_test *t)
        /* spa5 (dcr3) dimm3 */
        spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-       spa->header.length = sizeof(*spa);
+       spa->header.length = sizeof_spa(spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16);
        spa->range_index = 5+1;
        spa->address = t->dcr_dma[3];
@@ -2064,7 +2072,7 @@ static void nfit_test0_setup(struct nfit_test *t)
        /* spa6 (bdw for dcr0) dimm0 */
        spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-       spa->header.length = sizeof(*spa);
+       spa->header.length = sizeof_spa(spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
        spa->range_index = 6+1;
        spa->address = t->dimm_dma[0];
@@ -2074,7 +2082,7 @@ static void nfit_test0_setup(struct nfit_test *t)
        /* spa7 (bdw for dcr1) dimm1 */
        spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-       spa->header.length = sizeof(*spa);
+       spa->header.length = sizeof_spa(spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
        spa->range_index = 7+1;
        spa->address = t->dimm_dma[1];
@@ -2084,7 +2092,7 @@ static void nfit_test0_setup(struct nfit_test *t)
        /* spa8 (bdw for dcr2) dimm2 */
        spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-       spa->header.length = sizeof(*spa);
+       spa->header.length = sizeof_spa(spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
        spa->range_index = 8+1;
        spa->address = t->dimm_dma[2];
@@ -2094,7 +2102,7 @@ static void nfit_test0_setup(struct nfit_test *t)
        /* spa9 (bdw for dcr3) dimm3 */
        spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-       spa->header.length = sizeof(*spa);
+       spa->header.length = sizeof_spa(spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
        spa->range_index = 9+1;
        spa->address = t->dimm_dma[3];
@@ -2581,7 +2589,7 @@ static void nfit_test0_setup(struct nfit_test *t)
                /* spa10 (dcr4) dimm4 */
                spa = nfit_buf + offset;
                spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-               spa->header.length = sizeof(*spa);
+               spa->header.length = sizeof_spa(spa);
                memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16);
                spa->range_index = 10+1;
                spa->address = t->dcr_dma[4];
@@ -2595,7 +2603,7 @@ static void nfit_test0_setup(struct nfit_test *t)
                 */
                spa = nfit_buf + offset;
                spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-               spa->header.length = sizeof(*spa);
+               spa->header.length = sizeof_spa(spa);
                memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_PM), 16);
                spa->range_index = 11+1;
                spa->address = t->spa_set_dma[2];
@@ -2605,7 +2613,7 @@ static void nfit_test0_setup(struct nfit_test *t)
                /* spa12 (bdw for dcr4) dimm4 */
                spa = nfit_buf + offset;
                spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-               spa->header.length = sizeof(*spa);
+               spa->header.length = sizeof_spa(spa);
                memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
                spa->range_index = 12+1;
                spa->address = t->dimm_dma[4];
@@ -2739,7 +2747,7 @@ static void nfit_test1_setup(struct nfit_test *t)
        /* spa0 (flat range with no bdw aliasing) */
        spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-       spa->header.length = sizeof(*spa);
+       spa->header.length = sizeof_spa(spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_PM), 16);
        spa->range_index = 0+1;
        spa->address = t->spa_set_dma[0];
@@ -2749,7 +2757,7 @@ static void nfit_test1_setup(struct nfit_test *t)
        /* virtual cd region */
        spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
-       spa->header.length = sizeof(*spa);
+       spa->header.length = sizeof_spa(spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_VCD), 16);
        spa->range_index = 0;
        spa->address = t->spa_set_dma[1];
index 656b049..67b77ab 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "system.h"
 
+#include <stddef.h>
 #include <linux/errno.h>
 #include <linux/auxvec.h>
 #include <linux/signal.h>
index cf69b2f..dd61118 100644 (file)
@@ -28,8 +28,8 @@ $(OUTPUT)/execveat.denatured: $(OUTPUT)/execveat
        cp $< $@
        chmod -x $@
 $(OUTPUT)/load_address_4096: load_address.c
-       $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-z,max-page-size=0x1000 -pie $< -o $@
+       $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-z,max-page-size=0x1000 -pie -static $< -o $@
 $(OUTPUT)/load_address_2097152: load_address.c
-       $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-z,max-page-size=0x200000 -pie $< -o $@
+       $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-z,max-page-size=0x200000 -pie -static $< -o $@
 $(OUTPUT)/load_address_16777216: load_address.c
-       $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-z,max-page-size=0x1000000 -pie $< -o $@
+       $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-z,max-page-size=0x1000000 -pie -static $< -o $@
index aaf7bc7..7629819 100644 (file)
@@ -54,9 +54,9 @@ idt_handlers:
        .align 8
 
        /* Fetch current address and append it to idt_handlers. */
-       current_handler = .
+666 :
 .pushsection .rodata
-.quad current_handler
+       .quad 666b
 .popsection
 
        .if ! \has_error
index ca22ee6..63096ce 100644 (file)
 #include "vmx.h"
 
 #define VCPU_ID                5
+#define NMI_VECTOR     2
+
+static int ud_count;
+
+void enable_x2apic(void)
+{
+       uint32_t spiv_reg = APIC_BASE_MSR + (APIC_SPIV >> 4);
+
+       wrmsr(MSR_IA32_APICBASE, rdmsr(MSR_IA32_APICBASE) |
+             MSR_IA32_APICBASE_ENABLE | MSR_IA32_APICBASE_EXTD);
+       wrmsr(spiv_reg, rdmsr(spiv_reg) | APIC_SPIV_APIC_ENABLED);
+}
+
+static void guest_ud_handler(struct ex_regs *regs)
+{
+       ud_count++;
+       regs->rip += 3; /* VMLAUNCH */
+}
+
+static void guest_nmi_handler(struct ex_regs *regs)
+{
+}
 
 void l2_guest_code(void)
 {
@@ -25,15 +47,23 @@ void l2_guest_code(void)
 
        GUEST_SYNC(8);
 
+       /* Forced exit to L1 upon restore */
+       GUEST_SYNC(9);
+
        /* Done, exit to L1 and never come back.  */
        vmcall();
 }
 
-void l1_guest_code(struct vmx_pages *vmx_pages)
+void guest_code(struct vmx_pages *vmx_pages)
 {
 #define L2_GUEST_STACK_SIZE 64
        unsigned long l2_guest_stack[L2_GUEST_STACK_SIZE];
 
+       enable_x2apic();
+
+       GUEST_SYNC(1);
+       GUEST_SYNC(2);
+
        enable_vp_assist(vmx_pages->vp_assist_gpa, vmx_pages->vp_assist);
 
        GUEST_ASSERT(vmx_pages->vmcs_gpa);
@@ -55,27 +85,40 @@ void l1_guest_code(struct vmx_pages *vmx_pages)
        current_evmcs->revision_id = EVMCS_VERSION;
        GUEST_SYNC(6);
 
+       current_evmcs->pin_based_vm_exec_control |=
+               PIN_BASED_NMI_EXITING;
        GUEST_ASSERT(!vmlaunch());
        GUEST_ASSERT(vmptrstz() == vmx_pages->enlightened_vmcs_gpa);
-       GUEST_SYNC(9);
+
+       /*
+        * NMI forces L2->L1 exit, resuming L2 and hope that EVMCS is
+        * up-to-date (RIP points where it should and not at the beginning
+        * of l2_guest_code(). GUEST_SYNC(9) checkes that.
+        */
        GUEST_ASSERT(!vmresume());
-       GUEST_ASSERT(vmreadz(VM_EXIT_REASON) == EXIT_REASON_VMCALL);
+
        GUEST_SYNC(10);
+
+       GUEST_ASSERT(vmreadz(VM_EXIT_REASON) == EXIT_REASON_VMCALL);
+       GUEST_SYNC(11);
+
+       /* Try enlightened vmptrld with an incorrect GPA */
+       evmcs_vmptrld(0xdeadbeef, vmx_pages->enlightened_vmcs);
+       GUEST_ASSERT(vmlaunch());
+       GUEST_ASSERT(ud_count == 1);
+       GUEST_DONE();
 }
 
-void guest_code(struct vmx_pages *vmx_pages)
+void inject_nmi(struct kvm_vm *vm)
 {
-       GUEST_SYNC(1);
-       GUEST_SYNC(2);
+       struct kvm_vcpu_events events;
 
-       if (vmx_pages)
-               l1_guest_code(vmx_pages);
+       vcpu_events_get(vm, VCPU_ID, &events);
 
-       GUEST_DONE();
+       events.nmi.pending = 1;
+       events.flags |= KVM_VCPUEVENT_VALID_NMI_PENDING;
 
-       /* Try enlightened vmptrld with an incorrect GPA */
-       evmcs_vmptrld(0xdeadbeef, vmx_pages->enlightened_vmcs);
-       GUEST_ASSERT(vmlaunch());
+       vcpu_events_set(vm, VCPU_ID, &events);
 }
 
 int main(int argc, char *argv[])
@@ -109,6 +152,13 @@ int main(int argc, char *argv[])
        vcpu_alloc_vmx(vm, &vmx_pages_gva);
        vcpu_args_set(vm, VCPU_ID, 1, vmx_pages_gva);
 
+       vm_init_descriptor_tables(vm);
+       vcpu_init_descriptor_tables(vm, VCPU_ID);
+       vm_handle_exception(vm, UD_VECTOR, guest_ud_handler);
+       vm_handle_exception(vm, NMI_VECTOR, guest_nmi_handler);
+
+       pr_info("Running L1 which uses EVMCS to run L2\n");
+
        for (stage = 1;; stage++) {
                _vcpu_run(vm, VCPU_ID);
                TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
@@ -124,7 +174,7 @@ int main(int argc, char *argv[])
                case UCALL_SYNC:
                        break;
                case UCALL_DONE:
-                       goto part1_done;
+                       goto done;
                default:
                        TEST_FAIL("Unknown ucall %lu", uc.cmd);
                }
@@ -154,12 +204,14 @@ int main(int argc, char *argv[])
                TEST_ASSERT(!memcmp(&regs1, &regs2, sizeof(regs2)),
                            "Unexpected register values after vcpu_load_state; rdi: %lx rsi: %lx",
                            (ulong) regs2.rdi, (ulong) regs2.rsi);
-       }
 
-part1_done:
-       _vcpu_run(vm, VCPU_ID);
-       TEST_ASSERT(run->exit_reason == KVM_EXIT_SHUTDOWN,
-                   "Unexpected successful VMEnter with invalid eVMCS pointer!");
+               /* Force immediate L2->L1 exit before resuming */
+               if (stage == 8) {
+                       pr_info("Injecting NMI into L1 before L2 had a chance to run after restore\n");
+                       inject_nmi(vm);
+               }
+       }
 
+done:
        kvm_vm_free(vm);
 }
index 78ddf5e..8e83cf9 100644 (file)
@@ -43,7 +43,7 @@ static struct {
        siginfo_t first_siginfo;        /* First observed siginfo_t. */
 } ctx;
 
-/* Unique value to check si_perf is correctly set from perf_event_attr::sig_data. */
+/* Unique value to check si_perf_data is correctly set from perf_event_attr::sig_data. */
 #define TEST_SIG_DATA(addr) (~(unsigned long)(addr))
 
 static struct perf_event_attr make_event_attr(bool enabled, volatile void *addr)
@@ -164,8 +164,8 @@ TEST_F(sigtrap_threads, enable_event)
        EXPECT_EQ(ctx.signal_count, NUM_THREADS);
        EXPECT_EQ(ctx.tids_want_signal, 0);
        EXPECT_EQ(ctx.first_siginfo.si_addr, &ctx.iterate_on);
-       EXPECT_EQ(ctx.first_siginfo.si_errno, PERF_TYPE_BREAKPOINT);
-       EXPECT_EQ(ctx.first_siginfo.si_perf, TEST_SIG_DATA(&ctx.iterate_on));
+       EXPECT_EQ(ctx.first_siginfo.si_perf_type, PERF_TYPE_BREAKPOINT);
+       EXPECT_EQ(ctx.first_siginfo.si_perf_data, TEST_SIG_DATA(&ctx.iterate_on));
 
        /* Check enabled for parent. */
        ctx.iterate_on = 0;
@@ -183,8 +183,8 @@ TEST_F(sigtrap_threads, modify_and_enable_event)
        EXPECT_EQ(ctx.signal_count, NUM_THREADS);
        EXPECT_EQ(ctx.tids_want_signal, 0);
        EXPECT_EQ(ctx.first_siginfo.si_addr, &ctx.iterate_on);
-       EXPECT_EQ(ctx.first_siginfo.si_errno, PERF_TYPE_BREAKPOINT);
-       EXPECT_EQ(ctx.first_siginfo.si_perf, TEST_SIG_DATA(&ctx.iterate_on));
+       EXPECT_EQ(ctx.first_siginfo.si_perf_type, PERF_TYPE_BREAKPOINT);
+       EXPECT_EQ(ctx.first_siginfo.si_perf_data, TEST_SIG_DATA(&ctx.iterate_on));
 
        /* Check enabled for parent. */
        ctx.iterate_on = 0;
@@ -203,8 +203,8 @@ TEST_F(sigtrap_threads, signal_stress)
        EXPECT_EQ(ctx.signal_count, NUM_THREADS * ctx.iterate_on);
        EXPECT_EQ(ctx.tids_want_signal, 0);
        EXPECT_EQ(ctx.first_siginfo.si_addr, &ctx.iterate_on);
-       EXPECT_EQ(ctx.first_siginfo.si_errno, PERF_TYPE_BREAKPOINT);
-       EXPECT_EQ(ctx.first_siginfo.si_perf, TEST_SIG_DATA(&ctx.iterate_on));
+       EXPECT_EQ(ctx.first_siginfo.si_perf_type, PERF_TYPE_BREAKPOINT);
+       EXPECT_EQ(ctx.first_siginfo.si_perf_data, TEST_SIG_DATA(&ctx.iterate_on));
 }
 
 TEST_HARNESS_MAIN
index 98c3b64..e3d5c77 100644 (file)
@@ -1753,16 +1753,25 @@ TEST_F(TRACE_poke, getpid_runs_normally)
 # define SYSCALL_RET_SET(_regs, _val)                          \
        do {                                                    \
                typeof(_val) _result = (_val);                  \
-               /*                                              \
-                * A syscall error is signaled by CR0 SO bit    \
-                * and the code is stored as a positive value.  \
-                */                                             \
-               if (_result < 0) {                              \
-                       SYSCALL_RET(_regs) = -_result;          \
-                       (_regs).ccr |= 0x10000000;              \
-               } else {                                        \
+               if ((_regs.trap & 0xfff0) == 0x3000) {          \
+                       /*                                      \
+                        * scv 0 system call uses -ve result    \
+                        * for error, so no need to adjust.     \
+                        */                                     \
                        SYSCALL_RET(_regs) = _result;           \
-                       (_regs).ccr &= ~0x10000000;             \
+               } else {                                        \
+                       /*                                      \
+                        * A syscall error is signaled by the   \
+                        * CR0 SO bit and the code is stored as \
+                        * a positive value.                    \
+                        */                                     \
+                       if (_result < 0) {                      \
+                               SYSCALL_RET(_regs) = -_result;  \
+                               (_regs).ccr |= 0x10000000;      \
+                       } else {                                \
+                               SYSCALL_RET(_regs) = _result;   \
+                               (_regs).ccr &= ~0x10000000;     \
+                       }                                       \
                }                                               \
        } while (0)
 # define SYSCALL_RET_SET_ON_PTRACE_EXIT
index 2799c66..6b4feb9 100644 (file)
@@ -2893,8 +2893,8 @@ static void grow_halt_poll_ns(struct kvm_vcpu *vcpu)
        if (val < grow_start)
                val = grow_start;
 
-       if (val > halt_poll_ns)
-               val = halt_poll_ns;
+       if (val > vcpu->kvm->max_halt_poll_ns)
+               val = vcpu->kvm->max_halt_poll_ns;
 
        vcpu->halt_poll_ns = val;
 out:
@@ -2973,7 +2973,8 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)
                                goto out;
                        }
                        poll_end = cur = ktime_get();
-               } while (single_task_running() && ktime_before(cur, stop));
+               } while (single_task_running() && !need_resched() &&
+                        ktime_before(cur, stop));
        }
 
        prepare_to_rcuwait(&vcpu->wait);