Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf
authorDavid S. Miller <davem@davemloft.net>
Wed, 31 Jul 2019 15:49:09 +0000 (08:49 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 31 Jul 2019 15:49:09 +0000 (08:49 -0700)
Pablo Neira Ayuso says:

====================
netfilter fixes for net

The following patchset contains Netfilter fixes for your net tree:

1) memleak in ebtables from the error path for the 32/64 compat layer,
   from Florian Westphal.

2) Fix inverted meta ifname/ifidx matching when no interface is set
   on either from the input/output path, from Phil Sutter.

3) Remove goto label in nft_meta_bridge, also from Phil.

4) Missing include guard in xt_connlabel, from Masahiro Yamada.

5) Two patch to fix ipset destination MAC matching coming from
   Stephano Brivio, via Jozsef Kadlecsik.

6) Fix set rename and listing concurrency problem, from Shijie Luo.
   Patch also coming via Jozsef Kadlecsik.

7) ebtables 32/64 compat missing base chain policy in rule count,
   from Florian Westphal.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
1030 files changed:
.gitignore
Documentation/devicetree/bindings/arm/amlogic.txt [deleted file]
Documentation/devicetree/bindings/arm/amlogic.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/arm/amlogic/amlogic,meson-gx-ao-secure.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/arm,scmi.txt
Documentation/devicetree/bindings/arm/atmel-at91.txt [deleted file]
Documentation/devicetree/bindings/arm/atmel-at91.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/arm/emtrion.txt [deleted file]
Documentation/devicetree/bindings/arm/fsl.yaml
Documentation/devicetree/bindings/arm/mediatek.txt [deleted file]
Documentation/devicetree/bindings/arm/mediatek.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/arm/omap/omap.txt
Documentation/devicetree/bindings/arm/renesas.yaml
Documentation/devicetree/bindings/arm/rockchip.yaml
Documentation/devicetree/bindings/arm/stm32/stm32.txt [deleted file]
Documentation/devicetree/bindings/arm/stm32/stm32.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/arm/sunxi.yaml
Documentation/devicetree/bindings/arm/ti/k3.txt
Documentation/devicetree/bindings/bus/allwinner,sun8i-a23-rsb.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/bus/sunxi-rsb.txt [deleted file]
Documentation/devicetree/bindings/display/bridge/renesas,dw-hdmi.txt
Documentation/devicetree/bindings/dma/fsl-qdma.txt
Documentation/devicetree/bindings/gpu/arm,mali-midgard.txt
Documentation/devicetree/bindings/gpu/arm,mali-utgard.txt
Documentation/devicetree/bindings/iio/adc/adi,ad7124.yaml
Documentation/devicetree/bindings/iio/adc/avia-hx711.yaml
Documentation/devicetree/bindings/input/sun4i-lradc-keys.txt
Documentation/devicetree/bindings/misc/fsl,dpaa2-console.txt [new file with mode: 0644]
Documentation/devicetree/bindings/mtd/allwinner,sun4i-a10-nand.yaml
Documentation/devicetree/bindings/mtd/nand-controller.yaml
Documentation/devicetree/bindings/net/can/rcar_can.txt
Documentation/devicetree/bindings/net/can/rcar_canfd.txt
Documentation/devicetree/bindings/pinctrl/aspeed,ast2400-pinctrl.yaml
Documentation/devicetree/bindings/pinctrl/aspeed,ast2500-pinctrl.yaml
Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.yaml
Documentation/devicetree/bindings/power/qcom,rpmpd.txt
Documentation/devicetree/bindings/pwm/allwinner,sun4i-a10-pwm.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/pwm/pwm-sun4i.txt [deleted file]
Documentation/devicetree/bindings/reset/bitmain,bm1880-reset.txt [new file with mode: 0644]
Documentation/devicetree/bindings/reset/fsl,imx7-src.txt
Documentation/devicetree/bindings/riscv/cpus.yaml
Documentation/devicetree/bindings/serial/omap_serial.txt
Documentation/devicetree/bindings/soc/amlogic/amlogic,canvas.txt
Documentation/devicetree/bindings/soc/qcom/qcom,aoss-qmp.txt [new file with mode: 0644]
Documentation/devicetree/bindings/soc/qcom/qcom,apr.txt
Documentation/devicetree/bindings/spi/allwinner,sun4i-a10-spi.yaml
Documentation/devicetree/bindings/spi/allwinner,sun6i-a31-spi.yaml
Documentation/devicetree/bindings/timer/renesas,cmt.txt
Documentation/devicetree/bindings/vendor-prefixes.yaml
Documentation/dontdiff
Documentation/driver-api/ntb.rst
Documentation/filesystems/porting
Documentation/kbuild/kbuild.rst
Documentation/kbuild/makefiles.rst
Documentation/networking/tls-offload.rst
Documentation/virtual/kvm/api.txt
MAINTAINERS
Makefile
arch/Kconfig
arch/arm/Kconfig
arch/arm/Kconfig.debug
arch/arm/Makefile
arch/arm/boot/dts/Makefile
arch/arm/boot/dts/am335x-baltos-ir2110.dts
arch/arm/boot/dts/am335x-baltos-ir3220.dts
arch/arm/boot/dts/am335x-baltos-ir5221.dts
arch/arm/boot/dts/am335x-pcm-953.dtsi
arch/arm/boot/dts/am335x-phycore-rdk.dts
arch/arm/boot/dts/am335x-phycore-som.dtsi
arch/arm/boot/dts/am335x-regor-rdk.dts [new file with mode: 0644]
arch/arm/boot/dts/am335x-regor.dtsi [new file with mode: 0644]
arch/arm/boot/dts/am335x-wega-rdk.dts
arch/arm/boot/dts/am335x-wega.dtsi
arch/arm/boot/dts/arm-realview-eb.dtsi
arch/arm/boot/dts/arm-realview-pb1176.dts
arch/arm/boot/dts/arm-realview-pb11mp.dts
arch/arm/boot/dts/arm-realview-pbx.dtsi
arch/arm/boot/dts/armada-370-netgear-rn104.dts
arch/arm/boot/dts/aspeed-bmc-facebook-cmm.dts
arch/arm/boot/dts/aspeed-bmc-facebook-yamp.dts [new file with mode: 0644]
arch/arm/boot/dts/aspeed-bmc-inspur-fp5280g2.dts [new file with mode: 0644]
arch/arm/boot/dts/aspeed-bmc-lenovo-hr630.dts [new file with mode: 0644]
arch/arm/boot/dts/aspeed-bmc-microsoft-olympus.dts [new file with mode: 0644]
arch/arm/boot/dts/aspeed-bmc-opp-lanyang.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 [new file with mode: 0644]
arch/arm/boot/dts/aspeed-bmc-opp-vesnin.dts [new file with mode: 0644]
arch/arm/boot/dts/aspeed-bmc-opp-witherspoon.dts
arch/arm/boot/dts/aspeed-bmc-opp-zaius.dts
arch/arm/boot/dts/aspeed-bmc-quanta-q71l.dts
arch/arm/boot/dts/aspeed-g4.dtsi
arch/arm/boot/dts/aspeed-g5.dtsi
arch/arm/boot/dts/at91-wb50n.dtsi
arch/arm/boot/dts/at91sam9261ek.dts
arch/arm/boot/dts/at91sam9g45.dtsi
arch/arm/boot/dts/at91sam9rl.dtsi
arch/arm/boot/dts/at91sam9x5.dtsi
arch/arm/boot/dts/bcm-cygnus-clock.dtsi
arch/arm/boot/dts/bcm-cygnus.dtsi
arch/arm/boot/dts/bcm-nsp.dtsi
arch/arm/boot/dts/bcm11351.dtsi
arch/arm/boot/dts/bcm21664-garnet.dts
arch/arm/boot/dts/bcm21664.dtsi
arch/arm/boot/dts/bcm23550-sparrow.dts
arch/arm/boot/dts/bcm23550.dtsi
arch/arm/boot/dts/bcm28155-ap.dts
arch/arm/boot/dts/bcm283x.dtsi
arch/arm/boot/dts/bcm4708-asus-rt-ac56u.dts
arch/arm/boot/dts/bcm4708-asus-rt-ac68u.dts
arch/arm/boot/dts/bcm4708-buffalo-wzr-1750dhp.dts
arch/arm/boot/dts/bcm4708-linksys-ea6300-v1.dts
arch/arm/boot/dts/bcm4708-linksys-ea6500-v2.dts
arch/arm/boot/dts/bcm4708-luxul-xap-1510.dts
arch/arm/boot/dts/bcm4708-luxul-xwc-1000.dts
arch/arm/boot/dts/bcm4708-netgear-r6250.dts
arch/arm/boot/dts/bcm4708-netgear-r6300-v2.dts
arch/arm/boot/dts/bcm4708-smartrg-sr400ac.dts
arch/arm/boot/dts/bcm47081-asus-rt-n18u.dts
arch/arm/boot/dts/bcm47081-buffalo-wzr-600dhp2.dts
arch/arm/boot/dts/bcm47081-buffalo-wzr-900dhp.dts
arch/arm/boot/dts/bcm47081-luxul-xap-1410.dts
arch/arm/boot/dts/bcm47081-luxul-xwr-1200.dts
arch/arm/boot/dts/bcm47081-tplink-archer-c5-v2.dts
arch/arm/boot/dts/bcm47094-dlink-dir-885l.dts
arch/arm/boot/dts/bcm47094-linksys-panamera.dts
arch/arm/boot/dts/bcm47094-luxul-abr-4500.dts
arch/arm/boot/dts/bcm47094-luxul-xap-1610.dts
arch/arm/boot/dts/bcm47094-luxul-xbr-4500.dts
arch/arm/boot/dts/bcm47094-luxul-xwr-3100.dts
arch/arm/boot/dts/bcm47094-luxul-xwr-3150-v1.dts
arch/arm/boot/dts/bcm47094-netgear-r8500.dts
arch/arm/boot/dts/bcm47094-phicomm-k3.dts
arch/arm/boot/dts/bcm47189-luxul-xap-1440.dts
arch/arm/boot/dts/bcm47189-luxul-xap-810.dts
arch/arm/boot/dts/bcm47189-tenda-ac9.dts
arch/arm/boot/dts/bcm5301x.dtsi
arch/arm/boot/dts/bcm53573.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/bcm947189acdbmr.dts
arch/arm/boot/dts/bcm953012er.dts
arch/arm/boot/dts/bcm953012k.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-evm.dts
arch/arm/boot/dts/da850-lcdk.dts
arch/arm/boot/dts/da850-lego-ev3.dts
arch/arm/boot/dts/da850.dtsi
arch/arm/boot/dts/emev2-kzm9d.dts
arch/arm/boot/dts/exynos3250-artik5.dtsi
arch/arm/boot/dts/exynos3250-monk.dts
arch/arm/boot/dts/exynos3250-rinato.dts
arch/arm/boot/dts/exynos3250.dtsi
arch/arm/boot/dts/exynos4.dtsi
arch/arm/boot/dts/exynos4210-origen.dts
arch/arm/boot/dts/exynos4210-trats.dts
arch/arm/boot/dts/exynos4210-universal_c210.dts
arch/arm/boot/dts/exynos4210.dtsi
arch/arm/boot/dts/exynos4412-galaxy-s3.dtsi
arch/arm/boot/dts/exynos4412-itop-scp-core.dtsi
arch/arm/boot/dts/exynos4412-midas.dtsi
arch/arm/boot/dts/exynos4412-odroid-common.dtsi
arch/arm/boot/dts/exynos4412-prime.dtsi
arch/arm/boot/dts/exynos4412.dtsi
arch/arm/boot/dts/exynos5410-odroidxu.dts
arch/arm/boot/dts/exynos5410.dtsi
arch/arm/boot/dts/exynos5420-arndale-octa.dts
arch/arm/boot/dts/exynos5420.dtsi
arch/arm/boot/dts/exynos5422-odroid-core.dtsi
arch/arm/boot/dts/exynos5422-odroidxu3-common.dtsi
arch/arm/boot/dts/exynos54xx.dtsi
arch/arm/boot/dts/gemini-dlink-dir-685.dts
arch/arm/boot/dts/hip04.dtsi
arch/arm/boot/dts/ibm-power9-dual.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx53-m53menlo.dts
arch/arm/boot/dts/imx53-smd.dts
arch/arm/boot/dts/imx53.dtsi
arch/arm/boot/dts/imx6dl-kontron-samx6i.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx6q-kontron-samx6i.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx6qdl-sabresd.dtsi
arch/arm/boot/dts/imx6qdl.dtsi
arch/arm/boot/dts/imx6sl-evk.dts
arch/arm/boot/dts/imx6sl.dtsi
arch/arm/boot/dts/imx6sll-evk.dts
arch/arm/boot/dts/imx6sll.dtsi
arch/arm/boot/dts/imx6sx-sdb-reva.dts
arch/arm/boot/dts/imx6sx-sdb.dts
arch/arm/boot/dts/imx6sx-udoo-neo-basic.dts
arch/arm/boot/dts/imx6sx-udoo-neo-extended.dts
arch/arm/boot/dts/imx6sx-udoo-neo-full.dts
arch/arm/boot/dts/imx6sx-udoo-neo.dtsi
arch/arm/boot/dts/imx6sx.dtsi
arch/arm/boot/dts/imx6ul-14x14-evk.dtsi
arch/arm/boot/dts/imx6ul-geam.dts
arch/arm/boot/dts/imx6ul-isiot.dtsi
arch/arm/boot/dts/imx6ul.dtsi
arch/arm/boot/dts/imx6ull-colibri-eval-v3.dtsi
arch/arm/boot/dts/imx6ull-colibri.dtsi
arch/arm/boot/dts/imx6ull.dtsi
arch/arm/boot/dts/imx7d-meerkat96.dts [new file with mode: 0644]
arch/arm/boot/dts/imx7d-sdb.dts
arch/arm/boot/dts/imx7d-zii-rpu2.dts
arch/arm/boot/dts/imx7d.dtsi
arch/arm/boot/dts/imx7s.dtsi
arch/arm/boot/dts/imx7ulp-evk.dts
arch/arm/boot/dts/imx7ulp.dtsi
arch/arm/boot/dts/integrator.dtsi
arch/arm/boot/dts/iwg20d-q7-common.dtsi
arch/arm/boot/dts/logicpd-torpedo-37xx-devkit-28.dts [new file with mode: 0644]
arch/arm/boot/dts/ls1021a-tsn.dts [new file with mode: 0644]
arch/arm/boot/dts/meson.dtsi
arch/arm/boot/dts/meson6-atv1200.dts
arch/arm/boot/dts/meson6.dtsi
arch/arm/boot/dts/meson8-minix-neo-x8.dts
arch/arm/boot/dts/meson8.dtsi
arch/arm/boot/dts/meson8b-ec100.dts
arch/arm/boot/dts/meson8b-mxq.dts
arch/arm/boot/dts/meson8b-odroidc1.dts
arch/arm/boot/dts/meson8b.dtsi
arch/arm/boot/dts/meson8m2-mxiii-plus.dts
arch/arm/boot/dts/meson8m2.dtsi
arch/arm/boot/dts/omap4-l4.dtsi
arch/arm/boot/dts/pxa300-raumfeld-common.dtsi
arch/arm/boot/dts/pxa300-raumfeld-controller.dts
arch/arm/boot/dts/pxa300-raumfeld-speaker-one.dts
arch/arm/boot/dts/pxa3xx.dtsi
arch/arm/boot/dts/qcom-apq8064.dtsi
arch/arm/boot/dts/qcom-msm8974-fairphone-fp2.dts
arch/arm/boot/dts/qcom-msm8974-lge-nexus5-hammerhead.dts
arch/arm/boot/dts/qcom-msm8974.dtsi
arch/arm/boot/dts/r7s72100-genmai.dts
arch/arm/boot/dts/r7s72100-rskrza1.dts
arch/arm/boot/dts/r7s72100.dtsi
arch/arm/boot/dts/r7s9210-rza2mevb.dts
arch/arm/boot/dts/r7s9210.dtsi
arch/arm/boot/dts/r8a73a4-ape6evm.dts
arch/arm/boot/dts/r8a7740-armadillo800eva.dts
arch/arm/boot/dts/r8a7743-sk-rzg1m.dts
arch/arm/boot/dts/r8a7745-iwg22d-sodimm.dts
arch/arm/boot/dts/r8a7745-sk-rzg1e.dts
arch/arm/boot/dts/r8a77470-iwg23s-sbc.dts
arch/arm/boot/dts/r8a7778-bockw.dts
arch/arm/boot/dts/r8a7779-marzen.dts
arch/arm/boot/dts/r8a7790-lager.dts
arch/arm/boot/dts/r8a7790-stout.dts
arch/arm/boot/dts/r8a7791-koelsch.dts
arch/arm/boot/dts/r8a7791-porter.dts
arch/arm/boot/dts/r8a7792-blanche.dts
arch/arm/boot/dts/r8a7792-wheat.dts
arch/arm/boot/dts/r8a7792.dtsi
arch/arm/boot/dts/r8a7793-gose.dts
arch/arm/boot/dts/r8a7794-alt.dts
arch/arm/boot/dts/r8a7794-silk.dts
arch/arm/boot/dts/rk322x.dtsi
arch/arm/boot/dts/rk3288-veyron-chromebook.dtsi
arch/arm/boot/dts/rk3288-veyron-jaq.dts
arch/arm/boot/dts/rk3288-veyron-jerry.dts
arch/arm/boot/dts/rk3288-veyron-mickey.dts
arch/arm/boot/dts/rk3288-veyron-minnie.dts
arch/arm/boot/dts/rk3288-veyron-pinky.dts
arch/arm/boot/dts/rk3288-veyron-speedy.dts
arch/arm/boot/dts/rk3288-veyron.dtsi
arch/arm/boot/dts/rk3288.dtsi
arch/arm/boot/dts/sama5d3.dtsi
arch/arm/boot/dts/sh73a0-kzm9g.dts
arch/arm/boot/dts/socfpga_arria10.dtsi
arch/arm/boot/dts/socfpga_arria10_socdk.dtsi
arch/arm/boot/dts/stm32746g-eval.dts
arch/arm/boot/dts/stm32mp157-pinctrl.dtsi
arch/arm/boot/dts/stm32mp157a-avenger96.dts [new file with mode: 0644]
arch/arm/boot/dts/stm32mp157a-dk1.dts
arch/arm/boot/dts/stm32mp157c-ed1.dts
arch/arm/boot/dts/stm32mp157c-ev1.dts
arch/arm/boot/dts/stm32mp157c.dtsi
arch/arm/boot/dts/stm32mp157xaa-pinctrl.dtsi [new file with mode: 0644]
arch/arm/boot/dts/stm32mp157xab-pinctrl.dtsi [new file with mode: 0644]
arch/arm/boot/dts/stm32mp157xac-pinctrl.dtsi [new file with mode: 0644]
arch/arm/boot/dts/stm32mp157xad-pinctrl.dtsi [new file with mode: 0644]
arch/arm/boot/dts/sun5i-gr8-evb.dts
arch/arm/boot/dts/sun6i-a31.dtsi
arch/arm/boot/dts/sun7i-a20-icnova-swac.dts
arch/arm/boot/dts/sun7i-a20-olinuxino-lime2.dts
arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts
arch/arm/boot/dts/sun8i-a83t.dtsi
arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts
arch/arm/boot/dts/sun8i-h2-plus-orangepi-zero.dts
arch/arm/boot/dts/sun8i-h3-beelink-x2.dts
arch/arm/boot/dts/sun8i-h3-orangepi-one.dts
arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts
arch/arm/boot/dts/sun8i-r40.dtsi
arch/arm/boot/dts/sun8i-v3s.dtsi
arch/arm/boot/dts/sun8i-v40-bananapi-m2-berry.dts
arch/arm/boot/dts/sunxi-bananapi-m2-plus-v1.2.dtsi
arch/arm/boot/dts/uniphier-ld4-ref.dts
arch/arm/boot/dts/uniphier-ld4.dtsi
arch/arm/boot/dts/uniphier-ld6b-ref.dts
arch/arm/boot/dts/uniphier-pro4-ref.dts
arch/arm/boot/dts/uniphier-pro4.dtsi
arch/arm/boot/dts/uniphier-pro5.dtsi
arch/arm/boot/dts/uniphier-pxs2.dtsi
arch/arm/boot/dts/uniphier-sld8-ref.dts
arch/arm/boot/dts/uniphier-sld8.dtsi
arch/arm/boot/dts/versatile-ab.dts
arch/arm/boot/dts/vexpress-v2m-rs1.dtsi
arch/arm/boot/dts/vexpress-v2m.dtsi
arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts
arch/arm/boot/dts/vf610-zii-dev.dtsi
arch/arm/configs/acs5k_defconfig
arch/arm/configs/acs5k_tiny_defconfig
arch/arm/configs/am200epdkit_defconfig
arch/arm/configs/aspeed_g4_defconfig
arch/arm/configs/aspeed_g5_defconfig
arch/arm/configs/at91_dt_defconfig
arch/arm/configs/axm55xx_defconfig
arch/arm/configs/cm_x2xx_defconfig
arch/arm/configs/cm_x300_defconfig
arch/arm/configs/cns3420vb_defconfig
arch/arm/configs/colibri_pxa270_defconfig
arch/arm/configs/colibri_pxa300_defconfig
arch/arm/configs/collie_defconfig
arch/arm/configs/corgi_defconfig
arch/arm/configs/davinci_all_defconfig
arch/arm/configs/dove_defconfig
arch/arm/configs/em_x270_defconfig
arch/arm/configs/ep93xx_defconfig
arch/arm/configs/eseries_pxa_defconfig
arch/arm/configs/exynos_defconfig
arch/arm/configs/ezx_defconfig
arch/arm/configs/gemini_defconfig
arch/arm/configs/h3600_defconfig
arch/arm/configs/h5000_defconfig
arch/arm/configs/imote2_defconfig
arch/arm/configs/imx_v4_v5_defconfig
arch/arm/configs/imx_v6_v7_defconfig
arch/arm/configs/integrator_defconfig
arch/arm/configs/iop13xx_defconfig
arch/arm/configs/iop32x_defconfig
arch/arm/configs/iop33x_defconfig
arch/arm/configs/ixp4xx_defconfig
arch/arm/configs/jornada720_defconfig
arch/arm/configs/keystone_defconfig
arch/arm/configs/ks8695_defconfig
arch/arm/configs/lpc18xx_defconfig
arch/arm/configs/lpc32xx_defconfig
arch/arm/configs/magician_defconfig
arch/arm/configs/mini2440_defconfig
arch/arm/configs/mmp2_defconfig
arch/arm/configs/moxart_defconfig
arch/arm/configs/multi_v5_defconfig
arch/arm/configs/multi_v7_defconfig
arch/arm/configs/mv78xx0_defconfig
arch/arm/configs/mvebu_v5_defconfig
arch/arm/configs/mvebu_v7_defconfig
arch/arm/configs/mxs_defconfig
arch/arm/configs/netx_defconfig [deleted file]
arch/arm/configs/nhk8815_defconfig
arch/arm/configs/nuc910_defconfig
arch/arm/configs/nuc950_defconfig
arch/arm/configs/nuc960_defconfig
arch/arm/configs/omap1_defconfig
arch/arm/configs/orion5x_defconfig
arch/arm/configs/palmz72_defconfig
arch/arm/configs/pcm027_defconfig
arch/arm/configs/prima2_defconfig
arch/arm/configs/pxa168_defconfig
arch/arm/configs/pxa3xx_defconfig
arch/arm/configs/pxa910_defconfig
arch/arm/configs/pxa_defconfig
arch/arm/configs/qcom_defconfig
arch/arm/configs/realview_defconfig
arch/arm/configs/s3c2410_defconfig
arch/arm/configs/s3c6400_defconfig
arch/arm/configs/s5pv210_defconfig
arch/arm/configs/sama5_defconfig
arch/arm/configs/shmobile_defconfig
arch/arm/configs/socfpga_defconfig
arch/arm/configs/spear13xx_defconfig
arch/arm/configs/spear3xx_defconfig
arch/arm/configs/spear6xx_defconfig
arch/arm/configs/spitz_defconfig
arch/arm/configs/tango4_defconfig
arch/arm/configs/tct_hammer_defconfig
arch/arm/configs/trizeps4_defconfig
arch/arm/configs/u300_defconfig
arch/arm/configs/u8500_defconfig
arch/arm/configs/versatile_defconfig
arch/arm/configs/vexpress_defconfig
arch/arm/configs/viper_defconfig
arch/arm/configs/xcep_defconfig
arch/arm/configs/zeus_defconfig
arch/arm/configs/zx_defconfig
arch/arm/include/debug/netx.S [deleted file]
arch/arm/lib/Makefile
arch/arm/mach-at91/pm.c
arch/arm/mach-bcm/Kconfig
arch/arm/mach-bcm/Makefile
arch/arm/mach-bcm/bcm63xx_smp.c
arch/arm/mach-bcm/bcm_kona_smc.c
arch/arm/mach-bcm/board_bcm281xx.c
arch/arm/mach-bcm/platsmp-brcmstb.c
arch/arm/mach-davinci/board-da850-evm.c
arch/arm/mach-exynos/Kconfig
arch/arm/mach-exynos/Makefile
arch/arm/mach-exynos/exynos-smc.S
arch/arm/mach-exynos/sleep.S
arch/arm/mach-exynos/suspend.c
arch/arm/mach-highbank/Makefile
arch/arm/mach-highbank/smc.S
arch/arm/mach-imx/cpuidle-imx6q.c
arch/arm/mach-imx/mach-imx7d.c
arch/arm/mach-keystone/Makefile
arch/arm/mach-keystone/smc.S
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/omap-headsmp.S
arch/arm/mach-omap2/omap-smc.S
arch/arm/mach-omap2/omap_hwmod.c
arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c
arch/arm/mach-omap2/pdata-quirks.c
arch/arm/mach-omap2/sleep33xx.S
arch/arm/mach-omap2/sleep34xx.S
arch/arm/mach-omap2/sleep43xx.S
arch/arm/mach-omap2/sleep44xx.S
arch/arm/mach-pxa/include/mach/lubbock.h
arch/arm/mach-pxa/lubbock.c
arch/arm/mach-rockchip/platsmp.c
arch/arm/mach-rockchip/pm.c
arch/arm/mach-rpc/Makefile
arch/arm/mach-rpc/dma.c
arch/arm/mach-rpc/ecard-loader.S [moved from arch/arm/lib/ecard.S with 100% similarity]
arch/arm/mach-rpc/ecard.c
arch/arm/mach-rpc/floppydma.S [moved from arch/arm/lib/floppydma.S with 100% similarity]
arch/arm/mach-rpc/include/mach/uncompress.h
arch/arm/mach-rpc/io-acorn.S [moved from arch/arm/lib/io-acorn.S with 100% similarity]
arch/arm/mach-rpc/irq.c
arch/arm/mach-rpc/time.c
arch/arm/mach-sa1100/assabet.c
arch/arm/mach-sa1100/badge4.c
arch/arm/mach-sa1100/clock.c
arch/arm/mach-sa1100/h3xxx.c
arch/arm/mach-sa1100/hackkit.c
arch/arm/mach-sa1100/neponset.c
arch/arm/mach-shmobile/setup-rcar-gen2.c
arch/arm/mach-stm32/Kconfig
arch/arm/mach-tango/Makefile
arch/arm/mach-tango/smc.S
arch/arm/mach-versatile/versatile_dt.c
arch/arm/vdso/Makefile
arch/arm64/Kconfig.platforms
arch/arm64/boot/dts/allwinner/axp803.dtsi
arch/arm64/boot/dts/allwinner/sun50i-a64-amarula-relic.dts
arch/arm64/boot/dts/allwinner/sun50i-a64-bananapi-m64.dts
arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts
arch/arm64/boot/dts/allwinner/sun50i-a64-oceanic-5205-5inmfd.dts
arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts
arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts
arch/arm64/boot/dts/allwinner/sun50i-a64-teres-i.dts
arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
arch/arm64/boot/dts/allwinner/sun50i-h5-emlid-neutis-n5-devboard.dts
arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo-plus2.dts
arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts
arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi
arch/arm64/boot/dts/amlogic/Makefile
arch/arm64/boot/dts/amlogic/meson-axg-s400.dts
arch/arm64/boot/dts/amlogic/meson-axg.dtsi
arch/arm64/boot/dts/amlogic/meson-g12a-sei510.dts
arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts
arch/arm64/boot/dts/amlogic/meson-g12a-x96-max.dts
arch/arm64/boot/dts/amlogic/meson-g12a.dtsi
arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts [new file with mode: 0644]
arch/arm64/boot/dts/amlogic/meson-g12b.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi
arch/arm64/boot/dts/amlogic/meson-gx.dtsi
arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts
arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
arch/arm64/boot/dts/amlogic/meson-gxbb-p200.dts
arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi
arch/arm64/boot/dts/amlogic/meson-gxbb-vega-s95.dtsi
arch/arm64/boot/dts/amlogic/meson-gxbb-wetek.dtsi
arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
arch/arm64/boot/dts/amlogic/meson-gxl-s805x-p241.dts
arch/arm64/boot/dts/amlogic/meson-gxl-s905d-p230.dts
arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts
arch/arm64/boot/dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts
arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dtsi
arch/arm64/boot/dts/amlogic/meson-gxl.dtsi
arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts
arch/arm64/boot/dts/amlogic/meson-gxm-nexbox-a1.dts
arch/arm64/boot/dts/amlogic/meson-gxm-q200.dts
arch/arm64/boot/dts/amlogic/meson-gxm-rbox-pro.dts
arch/arm64/boot/dts/arm/juno-base.dtsi
arch/arm64/boot/dts/arm/juno-cs-r1r2.dtsi
arch/arm64/boot/dts/arm/juno-motherboard.dtsi
arch/arm64/boot/dts/broadcom/stingray/stingray-usb.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi
arch/arm64/boot/dts/exynos/exynos5433-tm2-common.dtsi
arch/arm64/boot/dts/exynos/exynos5433.dtsi
arch/arm64/boot/dts/exynos/exynos7-espresso.dts
arch/arm64/boot/dts/exynos/exynos7.dtsi
arch/arm64/boot/dts/freescale/Makefile
arch/arm64/boot/dts/freescale/fsl-ls1028a-qds.dts
arch/arm64/boot/dts/freescale/fsl-ls1028a-rdb.dts
arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi
arch/arm64/boot/dts/freescale/imx8mm-evk.dts
arch/arm64/boot/dts/freescale/imx8mm.dtsi
arch/arm64/boot/dts/freescale/imx8mq-evk.dts
arch/arm64/boot/dts/freescale/imx8mq-librem5-devkit.dts [new file with mode: 0644]
arch/arm64/boot/dts/freescale/imx8mq.dtsi
arch/arm64/boot/dts/freescale/imx8qxp.dtsi
arch/arm64/boot/dts/hisilicon/hi3660-coresight.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/hisilicon/hi3660.dtsi
arch/arm64/boot/dts/hisilicon/hi6220-coresight.dtsi
arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts
arch/arm64/boot/dts/marvell/armada-7040-db.dts
arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts
arch/arm64/boot/dts/marvell/armada-8040-db.dts
arch/arm64/boot/dts/marvell/armada-8040-mcbin.dtsi
arch/arm64/boot/dts/marvell/armada-ap806-dual.dtsi
arch/arm64/boot/dts/marvell/armada-ap806-quad.dtsi
arch/arm64/boot/dts/marvell/armada-ap806.dtsi
arch/arm64/boot/dts/marvell/armada-cp110.dtsi
arch/arm64/boot/dts/mediatek/Makefile
arch/arm64/boot/dts/mediatek/mt8183-evb.dts [new file with mode: 0644]
arch/arm64/boot/dts/mediatek/mt8183.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/nvidia/tegra186-p2771-0000.dts
arch/arm64/boot/dts/nvidia/tegra186-p3310.dtsi
arch/arm64/boot/dts/nvidia/tegra186.dtsi
arch/arm64/boot/dts/nvidia/tegra194-p2888.dtsi
arch/arm64/boot/dts/nvidia/tegra194-p2972-0000.dts
arch/arm64/boot/dts/nvidia/tegra194.dtsi
arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi
arch/arm64/boot/dts/nvidia/tegra210-p2371-2180.dts
arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts
arch/arm64/boot/dts/nvidia/tegra210.dtsi
arch/arm64/boot/dts/qcom/Makefile
arch/arm64/boot/dts/qcom/msm8916.dtsi
arch/arm64/boot/dts/qcom/msm8996.dtsi
arch/arm64/boot/dts/qcom/msm8998.dtsi
arch/arm64/boot/dts/qcom/pm8998.dtsi
arch/arm64/boot/dts/qcom/pms405.dtsi
arch/arm64/boot/dts/qcom/qcs404-evb.dtsi
arch/arm64/boot/dts/qcom/qcs404.dtsi
arch/arm64/boot/dts/qcom/sdm845-cheza-r1.dts [new file with mode: 0644]
arch/arm64/boot/dts/qcom/sdm845-cheza-r2.dts [new file with mode: 0644]
arch/arm64/boot/dts/qcom/sdm845-cheza-r3.dts [new file with mode: 0644]
arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/qcom/sdm845-db845c.dts [new file with mode: 0644]
arch/arm64/boot/dts/qcom/sdm845-mtp.dts
arch/arm64/boot/dts/qcom/sdm845.dtsi
arch/arm64/boot/dts/renesas/Makefile
arch/arm64/boot/dts/renesas/hihope-common.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/renesas/r8a774a1-hihope-rzg2m-ex.dts [new file with mode: 0644]
arch/arm64/boot/dts/renesas/r8a774a1-hihope-rzg2m.dts [new file with mode: 0644]
arch/arm64/boot/dts/renesas/r8a774a1.dtsi
arch/arm64/boot/dts/renesas/r8a774c0-cat874.dts
arch/arm64/boot/dts/renesas/r8a774c0.dtsi
arch/arm64/boot/dts/renesas/r8a7795.dtsi
arch/arm64/boot/dts/renesas/r8a7796.dtsi
arch/arm64/boot/dts/renesas/r8a77965.dtsi
arch/arm64/boot/dts/renesas/r8a77970-eagle.dts
arch/arm64/boot/dts/renesas/r8a77990-ebisu.dts
arch/arm64/boot/dts/renesas/r8a77990.dtsi
arch/arm64/boot/dts/renesas/r8a77995-draak.dts
arch/arm64/boot/dts/renesas/r8a77995.dtsi
arch/arm64/boot/dts/renesas/salvator-common.dtsi
arch/arm64/boot/dts/renesas/ulcb-kf.dtsi
arch/arm64/boot/dts/renesas/ulcb.dtsi
arch/arm64/boot/dts/rockchip/Makefile
arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts
arch/arm64/boot/dts/rockchip/rk3328.dtsi
arch/arm64/boot/dts/rockchip/rk3399-ficus.dts
arch/arm64/boot/dts/rockchip/rk3399-hugsun-x99.dts [new file with mode: 0644]
arch/arm64/boot/dts/rockchip/rk3399-khadas-edge-captain.dts [new file with mode: 0644]
arch/arm64/boot/dts/rockchip/rk3399-khadas-edge-v.dts [new file with mode: 0644]
arch/arm64/boot/dts/rockchip/rk3399-khadas-edge.dts [new file with mode: 0644]
arch/arm64/boot/dts/rockchip/rk3399-khadas-edge.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts
arch/arm64/boot/dts/rockchip/rk3399-rock960.dts
arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dts
arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi
arch/arm64/boot/dts/rockchip/rk3399.dtsi
arch/arm64/boot/dts/rockchip/rk3399pro.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/socionext/uniphier-ld11-global.dts
arch/arm64/boot/dts/socionext/uniphier-ld11.dtsi
arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi
arch/arm64/boot/dts/socionext/uniphier-pxs3-ref.dts
arch/arm64/boot/dts/socionext/uniphier-pxs3.dtsi
arch/arm64/boot/dts/sprd/sc9836.dtsi
arch/arm64/boot/dts/sprd/sc9860.dtsi
arch/arm64/boot/dts/sprd/whale2.dtsi
arch/arm64/boot/dts/ti/Makefile
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-am65.dtsi
arch/arm64/boot/dts/ti/k3-am654-base-board.dts
arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts [new file with mode: 0644]
arch/arm64/boot/dts/ti/k3-j721e-main.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/ti/k3-j721e-mcu-wakeup.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/ti/k3-j721e-som-p0.dtsi [new file with mode: 0644]
arch/arm64/boot/dts/ti/k3-j721e.dtsi [new file with mode: 0644]
arch/arm64/configs/defconfig
arch/arm64/kernel/vdso32/Makefile
arch/hexagon/include/asm/pgalloc.h
arch/riscv/Makefile
arch/s390/Kconfig
arch/s390/kvm/interrupt.c
arch/s390/mm/init.c
arch/sparc/vdso/Makefile
arch/x86/Kconfig
arch/x86/boot/compressed/eboot.c
arch/x86/boot/compressed/misc.c
arch/x86/boot/compressed/misc.h
arch/x86/boot/compressed/pgtable_64.c
arch/x86/entry/calling.h
arch/x86/entry/entry_32.S
arch/x86/entry/entry_64.S
arch/x86/entry/thunk_64.S
arch/x86/entry/vdso/Makefile
arch/x86/hyperv/hv_init.c
arch/x86/include/asm/apic.h
arch/x86/include/asm/kvm_host.h
arch/x86/include/asm/kvm_para.h
arch/x86/include/asm/paravirt.h
arch/x86/include/asm/paravirt_types.h
arch/x86/include/asm/traps.h
arch/x86/include/uapi/asm/kvm.h
arch/x86/kernel/apic/apic.c
arch/x86/kernel/asm-offsets.c
arch/x86/kernel/e820.c
arch/x86/kernel/head_64.S
arch/x86/kernel/kvm.c
arch/x86/kernel/mpparse.c
arch/x86/kernel/paravirt.c
arch/x86/kernel/process_64.c
arch/x86/kernel/ptrace.c
arch/x86/kernel/traps.c
arch/x86/kvm/cpuid.c
arch/x86/kvm/emulate.c
arch/x86/kvm/hyperv.c
arch/x86/kvm/ioapic.c
arch/x86/kvm/lapic.c
arch/x86/kvm/lapic.h
arch/x86/kvm/mmu.c
arch/x86/kvm/pmu.c
arch/x86/kvm/svm.c
arch/x86/kvm/vmx/nested.c
arch/x86/kvm/vmx/pmu_intel.c
arch/x86/kvm/vmx/vmenter.S
arch/x86/kvm/vmx/vmx.c
arch/x86/kvm/x86.c
arch/x86/kvm/x86.h
arch/x86/lib/copy_user_64.S
arch/x86/lib/getuser.S
arch/x86/lib/putuser.S
arch/x86/lib/usercopy_64.c
arch/x86/math-emu/fpu_emu.h
arch/x86/math-emu/reg_constant.c
arch/x86/mm/fault.c
arch/x86/mm/mem_encrypt.c
arch/x86/xen/enlighten_pv.c
arch/x86/xen/mmu_pv.c
arch/x86/xen/xen-asm.S
arch/x86/xen/xen-ops.h
drivers/bus/brcmstb_gisb.c
drivers/bus/fsl-mc/dprc.c
drivers/bus/fsl-mc/fsl-mc-bus.c
drivers/bus/fsl-mc/fsl-mc-private.h
drivers/bus/ti-sysc.c
drivers/connector/connector.c
drivers/firmware/arm_scmi/clock.c
drivers/firmware/arm_scmi/sensors.c
drivers/firmware/psci/psci_checker.c
drivers/firmware/tegra/bpmp.c
drivers/firmware/ti_sci.c
drivers/firmware/ti_sci.h
drivers/hwmon/scmi-hwmon.c
drivers/infiniband/ulp/iser/iscsi_iser.c
drivers/infiniband/ulp/srp/ib_srp.c
drivers/input/joystick/iforce/iforce-ff.c
drivers/input/joystick/iforce/iforce-main.c
drivers/input/joystick/iforce/iforce-packets.c
drivers/input/joystick/iforce/iforce-serio.c
drivers/input/joystick/iforce/iforce-usb.c
drivers/input/joystick/iforce/iforce.h
drivers/input/keyboard/Kconfig
drivers/input/keyboard/Makefile
drivers/input/keyboard/adp5589-keys.c
drivers/input/keyboard/applespi.c [new file with mode: 0644]
drivers/input/keyboard/applespi.h [new file with mode: 0644]
drivers/input/keyboard/applespi_trace.h [new file with mode: 0644]
drivers/input/keyboard/mtk-pmic-keys.c
drivers/input/keyboard/sun4i-lradc-keys.c
drivers/input/mouse/alps.c
drivers/input/mouse/synaptics.c
drivers/input/mouse/trackpoint.h
drivers/input/serio/hyperv-keyboard.c
drivers/input/tablet/gtco.c
drivers/input/touchscreen/auo-pixcir-ts.c
drivers/iommu/amd_iommu.c
drivers/isdn/hardware/mISDN/hfcsusb.c
drivers/media/v4l2-core/v4l2-subdev.c
drivers/memory/.gitignore [new file with mode: 0644]
drivers/memory/Kconfig
drivers/memory/Makefile
drivers/memory/brcmstb_dpfe.c
drivers/memory/emif.c
drivers/memory/jedec_ddr.h [moved from include/memory/jedec_ddr.h with 97% similarity]
drivers/memory/jedec_ddr_data.c [moved from lib/jedec_ddr_data.c with 98% similarity]
drivers/memory/of_memory.c
drivers/memory/tegra/tegra124.c
drivers/memory/ti-emif-sram-pm.S
drivers/net/arcnet/arc-rimi.c
drivers/net/arcnet/com20020-isa.c
drivers/net/arcnet/com90io.c
drivers/net/arcnet/com90xx.c
drivers/net/bonding/bond_main.c
drivers/net/can/dev.c
drivers/net/can/flexcan.c
drivers/net/can/rcar/rcar_canfd.c
drivers/net/can/spi/mcp251x.c
drivers/net/can/usb/peak_usb/pcan_usb_core.c
drivers/net/dsa/mv88e6xxx/chip.c
drivers/net/dsa/qca8k.c
drivers/net/dsa/sja1105/sja1105_main.c
drivers/net/ethernet/agere/et131x.c
drivers/net/ethernet/atheros/ag71xx.c
drivers/net/ethernet/broadcom/bcmsysport.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/genet/bcmgenet.c
drivers/net/ethernet/cavium/thunder/thunder_bgx.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
drivers/net/ethernet/emulex/benet/be_main.c
drivers/net/ethernet/freescale/enetc/Kconfig
drivers/net/ethernet/freescale/fman/fman.c
drivers/net/ethernet/ibm/ehea/ehea_main.c
drivers/net/ethernet/intel/igc/igc_main.c
drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
drivers/net/ethernet/marvell/sky2.c
drivers/net/ethernet/mellanox/mlx5/core/dev.c
drivers/net/ethernet/mellanox/mlx5/core/en.h
drivers/net/ethernet/mellanox/mlx5/core/en/params.h
drivers/net/ethernet/mellanox/mlx5/core/en/port.c
drivers/net/ethernet/mellanox/mlx5/core/en/port.h
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c
drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
drivers/net/ethernet/mellanox/mlx5/core/en_fs_ethtool.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
drivers/net/ethernet/mellanox/mlx5/core/en_stats.c
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib_vlan.c
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
drivers/net/ethernet/mellanox/mlxsw/spectrum.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_nve_vxlan.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_ptp.c
drivers/net/ethernet/mscc/ocelot.c
drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c
drivers/net/ethernet/qlogic/qed/qed_rdma.c
drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c
drivers/net/ethernet/realtek/r8169_main.c
drivers/net/ethernet/rocker/rocker_main.c
drivers/net/ethernet/smsc/smc911x.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
drivers/net/ethernet/toshiba/spider_net.c
drivers/net/hamradio/baycom_epp.c
drivers/net/hyperv/netvsc_drv.c
drivers/net/phy/fixed_phy.c
drivers/net/phy/mscc.c
drivers/net/phy/phylink.c
drivers/net/ppp/pppoe.c
drivers/net/ppp/pppox.c
drivers/net/ppp/pptp.c
drivers/net/tun.c
drivers/net/usb/qmi_wwan.c
drivers/net/vrf.c
drivers/net/wan/sdla.c
drivers/nfc/st-nci/se.c
drivers/nfc/st21nfca/se.c
drivers/ntb/Kconfig
drivers/ntb/Makefile
drivers/ntb/core.c [moved from drivers/ntb/ntb.c with 100% similarity]
drivers/ntb/hw/amd/ntb_hw_amd.c
drivers/ntb/hw/intel/ntb_hw_gen3.c
drivers/ntb/hw/mscc/ntb_hw_switchtec.c
drivers/ntb/msi.c [new file with mode: 0644]
drivers/ntb/ntb_transport.c
drivers/ntb/test/Kconfig
drivers/ntb/test/Makefile
drivers/ntb/test/ntb_msi_test.c [new file with mode: 0644]
drivers/ntb/test/ntb_perf.c
drivers/pci/msi.c
drivers/pci/switch/switchtec.c
drivers/reset/Kconfig
drivers/reset/core.c
drivers/reset/reset-simple.c
drivers/s390/scsi/zfcp_erp.c
drivers/s390/scsi/zfcp_fsf.c
drivers/scsi/Makefile
drivers/scsi/hosts.c
drivers/scsi/libfc/fc_exch.c
drivers/scsi/libsas/sas_scsi_host.c
drivers/scsi/lpfc/lpfc_debugfs.h
drivers/scsi/megaraid/megaraid_sas.h
drivers/scsi/megaraid/megaraid_sas_base.c
drivers/scsi/mpt3sas/mpt3sas_scsih.c
drivers/scsi/pm8001/pm8001_sas.c
drivers/scsi/pm8001/pm80xx_hwi.c
drivers/scsi/pm8001/pm80xx_hwi.h
drivers/scsi/scsi_devinfo.c
drivers/scsi/scsi_lib.c
drivers/scsi/sd_zbc.c
drivers/scsi/storvsc_drv.c
drivers/scsi/ufs/ufshcd.c
drivers/soc/amlogic/meson-canvas.c
drivers/soc/aspeed/aspeed-lpc-ctrl.c
drivers/soc/fsl/Kconfig
drivers/soc/fsl/Makefile
drivers/soc/fsl/dpaa2-console.c [new file with mode: 0644]
drivers/soc/fsl/dpio/dpio-driver.c
drivers/soc/fsl/dpio/qbman-portal.c
drivers/soc/fsl/dpio/qbman-portal.h
drivers/soc/fsl/guts.c
drivers/soc/fsl/qbman/bman_portal.c
drivers/soc/fsl/qbman/qman_ccsr.c
drivers/soc/fsl/qbman/qman_portal.c
drivers/soc/fsl/qbman/qman_priv.h
drivers/soc/imx/Kconfig
drivers/soc/imx/Makefile
drivers/soc/imx/soc-imx-scu.c [new file with mode: 0644]
drivers/soc/imx/soc-imx8.c
drivers/soc/qcom/Kconfig
drivers/soc/qcom/Makefile
drivers/soc/qcom/apr.c
drivers/soc/qcom/qcom_aoss.c [new file with mode: 0644]
drivers/soc/qcom/rpmpd.c
drivers/soc/renesas/Kconfig
drivers/soc/rockchip/pm_domains.c
drivers/soc/tegra/Kconfig
drivers/soc/tegra/fuse/fuse-tegra.c
drivers/soc/tegra/pmc.c
drivers/soc/ti/Kconfig
drivers/soc/ti/pm33xx.c
drivers/tty/serial/Kconfig
drivers/tty/serial/sa1100.c
fs/btrfs/Kconfig
fs/btrfs/disk-io.c
fs/btrfs/inode.c
fs/btrfs/volumes.c
fs/ceph/dir.c
fs/cifs/cifsfs.c
fs/cifs/cifsfs.h
fs/cifs/inode.c
fs/cifs/smb2file.c
fs/cifs/smb2ops.c
fs/cifs/smb2pdu.c
fs/cifs/smb2pdu.h
fs/cifs/smb2proto.h
fs/compat_ioctl.c
fs/dcache.c
fs/fs_pin.c
fs/internal.h
fs/mount.h
fs/namespace.c
fs/nfs/super.c
include/Kbuild
include/dt-bindings/gpio/tegra186-gpio.h
include/dt-bindings/power/qcom-aoss-qmp.h [new file with mode: 0644]
include/dt-bindings/power/qcom-rpmpd.h
include/dt-bindings/reset/bitmain,bm1880-reset.h [new file with mode: 0644]
include/linux/compiler-gcc.h
include/linux/compiler.h
include/linux/compiler_types.h
include/linux/connector.h
include/linux/dim.h
include/linux/dma-direct.h
include/linux/dma-mapping.h
include/linux/filter.h
include/linux/fs_pin.h
include/linux/if_pppox.h
include/linux/if_rmnet.h
include/linux/kvm_host.h
include/linux/mlx5/fs.h
include/linux/mlx5/mlx5_ifc.h
include/linux/msi.h
include/linux/ntb.h
include/linux/pci.h
include/linux/platform_data/ti-sysc.h
include/linux/platform_data/video-clcd-versatile.h [deleted file]
include/linux/sched/isolation.h
include/linux/scmi_protocol.h
include/linux/skmsg.h
include/linux/soc/ti/ti_sci_protocol.h
include/net/tcp.h
include/net/tls.h
include/scsi/scsi_host.h
include/soc/fsl/bman.h
include/soc/fsl/qman.h
include/uapi/linux/videodev2.h
kernel/Kconfig.preempt
kernel/bpf/core.c
kernel/bpf/verifier.c
kernel/dma/Kconfig
kernel/dma/direct.c
kernel/exit.c
kernel/sched/isolation.c
kernel/smp.c
kernel/stacktrace.c
lib/Kconfig
lib/Kconfig.debug
lib/Makefile
lib/dim/dim.c
lib/dim/net_dim.c
net/bridge/br_vlan.c
net/can/gw.c
net/core/dev.c
net/core/filter.c
net/core/skmsg.c
net/core/sock_map.c
net/ipv4/inet_fragment.c
net/ipv4/ipip.c
net/ipv4/tcp_output.c
net/ipv4/tcp_ulp.c
net/ipv6/ip6_gre.c
net/ipv6/ip6_tunnel.c
net/iucv/af_iucv.c
net/l2tp/l2tp_ppp.c
net/netrom/af_netrom.c
net/openvswitch/datapath.c
net/rds/rdma_transport.c
net/rxrpc/ar-internal.h
net/rxrpc/peer_event.c
net/rxrpc/peer_object.c
net/rxrpc/sendmsg.c
net/sched/act_ife.c
net/sched/sch_codel.c
net/sctp/socket.c
net/tipc/socket.c
net/tls/tls_main.c
net/tls/tls_sw.c
scripts/Kbuild.include
scripts/Makefile.build
scripts/Makefile.lib
scripts/Makefile.modbuiltin
scripts/Makefile.modinst
scripts/Makefile.modpost
scripts/Makefile.modsign
scripts/adjust_autoksyms.sh
scripts/coccinelle/api/devm_platform_ioremap_resource.cocci [new file with mode: 0644]
scripts/export_report.pl
scripts/kconfig/Makefile
scripts/kconfig/confdata.c
scripts/kconfig/expr.h
scripts/mod/sumversion.c
scripts/modules-check.sh
scripts/package/builddeb
scripts/package/mkdebian
scripts/package/mkspec
tools/lib/bpf/btf.c
tools/lib/bpf/libbpf.c
tools/lib/bpf/xsk.c
tools/objtool/arch.h
tools/objtool/arch/x86/decode.c
tools/objtool/check.c
tools/objtool/check.h
tools/objtool/elf.c
tools/objtool/elf.h
tools/perf/builtin-script.c
tools/perf/builtin-trace.c
tools/perf/builtin-version.c
tools/perf/pmu-events/arch/s390/cf_m8561/basic.json [new file with mode: 0644]
tools/perf/pmu-events/arch/s390/cf_m8561/crypto.json [new file with mode: 0644]
tools/perf/pmu-events/arch/s390/cf_m8561/crypto6.json [new file with mode: 0644]
tools/perf/pmu-events/arch/s390/cf_m8561/extended.json [new file with mode: 0644]
tools/perf/pmu-events/arch/s390/mapfile.csv
tools/perf/scripts/python/export-to-postgresql.py
tools/perf/scripts/python/export-to-sqlite.py
tools/perf/scripts/python/exported-sql-viewer.py
tools/perf/tests/builtin-test.c
tools/perf/util/Build
tools/perf/util/cs-etm.c
tools/perf/util/db-export.c
tools/perf/util/db-export.h
tools/perf/util/rlimit.c [new file with mode: 0644]
tools/perf/util/rlimit.h [new file with mode: 0644]
tools/perf/util/scripting-engines/trace-event-python.c
tools/perf/util/trace-event.h
tools/power/cpupower/debug/kernel/Makefile
tools/testing/selftests/bpf/progs/sendmsg6_prog.c
tools/testing/selftests/bpf/verifier/ctx_skb.c
tools/testing/selftests/kvm/Makefile
tools/testing/selftests/kvm/include/kvm_util.h
tools/testing/selftests/kvm/include/s390x/processor.h [new file with mode: 0644]
tools/testing/selftests/kvm/kvm_create_max_vcpus.c [moved from tools/testing/selftests/kvm/x86_64/kvm_create_max_vcpus.c with 95% similarity]
tools/testing/selftests/kvm/lib/aarch64/processor.c
tools/testing/selftests/kvm/lib/kvm_util.c
tools/testing/selftests/kvm/lib/s390x/processor.c [new file with mode: 0644]
tools/testing/selftests/kvm/lib/x86_64/processor.c
tools/testing/selftests/kvm/lib/x86_64/vmx.c
tools/testing/selftests/kvm/s390x/sync_regs_test.c [new file with mode: 0644]
tools/testing/selftests/net/.gitignore
tools/testing/selftests/net/forwarding/gre_multipath.sh
tools/testing/selftests/net/tls.c
tools/testing/selftests/ntb/ntb_test.sh
tools/testing/selftests/x86/fsgsbase.c
usr/include/Makefile
virt/kvm/kvm_main.c

index 7587ef56b92dcc93ba85db2ee022201b3502225f..8f5422cba6e2b0b687e7f16b2cc1adf1e5bf2cab 100644 (file)
@@ -30,6 +30,7 @@
 *.lz4
 *.lzma
 *.lzo
+*.mod
 *.mod.c
 *.o
 *.o.*
diff --git a/Documentation/devicetree/bindings/arm/amlogic.txt b/Documentation/devicetree/bindings/arm/amlogic.txt
deleted file mode 100644 (file)
index 061f7b9..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-Amlogic MesonX device tree bindings
--------------------------------------------
-
-Work in progress statement:
-
-Device tree files and bindings applying to Amlogic SoCs and boards are
-considered "unstable". Any Amlogic device tree binding may change at
-any time. Be sure to use a device tree binary and a kernel image
-generated from the same source tree.
-
-Please refer to Documentation/devicetree/bindings/ABI.txt for a definition of a
-stable binding/ABI.
-
----------------------------------------------------------------
-
-Boards with the Amlogic Meson6 SoC shall have the following properties:
-  Required root node property:
-    compatible: "amlogic,meson6"
-
-Boards with the Amlogic Meson8 SoC shall have the following properties:
-  Required root node property:
-    compatible: "amlogic,meson8";
-
-Boards with the Amlogic Meson8b SoC shall have the following properties:
-  Required root node property:
-    compatible: "amlogic,meson8b";
-
-Boards with the Amlogic Meson8m2 SoC shall have the following properties:
-  Required root node property:
-    compatible: "amlogic,meson8m2";
-
-Boards with the Amlogic Meson GXBaby SoC shall have the following properties:
-  Required root node property:
-    compatible: "amlogic,meson-gxbb";
-
-Boards with the Amlogic Meson GXL S905X SoC shall have the following properties:
-  Required root node property:
-    compatible: "amlogic,s905x", "amlogic,meson-gxl";
-
-Boards with the Amlogic Meson GXL S905D SoC shall have the following properties:
-  Required root node property:
-    compatible: "amlogic,s905d", "amlogic,meson-gxl";
-
-Boards with the Amlogic Meson GXL S805X SoC shall have the following properties:
-  Required root node property:
-    compatible: "amlogic,s805x", "amlogic,meson-gxl";
-
-Boards with the Amlogic Meson GXL S905W SoC shall have the following properties:
-  Required root node property:
-    compatible: "amlogic,s905w", "amlogic,meson-gxl";
-
-Boards with the Amlogic Meson GXM S912 SoC shall have the following properties:
-  Required root node property:
-    compatible: "amlogic,s912", "amlogic,meson-gxm";
-
-Boards with the Amlogic Meson AXG A113D SoC shall have the following properties:
-  Required root node property:
-    compatible: "amlogic,a113d", "amlogic,meson-axg";
-
-Boards with the Amlogic Meson G12A S905D2 SoC shall have the following properties:
-  Required root node property:
-    compatible: "amlogic,g12a";
-
-Board compatible values (alphabetically, grouped by SoC):
-
-  - "geniatech,atv1200" (Meson6)
-
-  - "minix,neo-x8" (Meson8)
-
-  - "endless,ec100" (Meson8b)
-  - "hardkernel,odroid-c1" (Meson8b)
-  - "tronfy,mxq" (Meson8b)
-
-  - "tronsmart,mxiii-plus" (Meson8m2)
-
-  - "amlogic,p200" (Meson gxbb)
-  - "amlogic,p201" (Meson gxbb)
-  - "friendlyarm,nanopi-k2" (Meson gxbb)
-  - "hardkernel,odroid-c2" (Meson gxbb)
-  - "nexbox,a95x" (Meson gxbb or Meson gxl s905x)
-  - "tronsmart,vega-s95-pro", "tronsmart,vega-s95" (Meson gxbb)
-  - "tronsmart,vega-s95-meta", "tronsmart,vega-s95" (Meson gxbb)
-  - "tronsmart,vega-s95-telos", "tronsmart,vega-s95" (Meson gxbb)
-  - "wetek,hub" (Meson gxbb)
-  - "wetek,play2" (Meson gxbb)
-
-  - "amlogic,p212" (Meson gxl s905x)
-  - "hwacom,amazetv" (Meson gxl s905x)
-  - "khadas,vim" (Meson gxl s905x)
-  - "libretech,cc" (Meson gxl s905x)
-
-  - "amlogic,p230" (Meson gxl s905d)
-  - "amlogic,p231" (Meson gxl s905d)
-  - "phicomm,n1" (Meson gxl s905d)
-
-  - "amlogic,p241" (Meson gxl s805x)
-  - "libretech,aml-s805x-ac" (Meson gxl s805x)
-
-  - "amlogic,p281" (Meson gxl s905w)
-  - "oranth,tx3-mini" (Meson gxl s905w)
-
-  - "amlogic,q200" (Meson gxm s912)
-  - "amlogic,q201" (Meson gxm s912)
-  - "khadas,vim2" (Meson gxm s912)
-  - "kingnovel,r-box-pro" (Meson gxm S912)
-  - "nexbox,a1" (Meson gxm s912)
-  - "tronsmart,vega-s96" (Meson gxm s912)
-
-  - "amlogic,s400" (Meson axg a113d)
-
-  - "amlogic,u200" (Meson g12a s905d2)
-  - "amediatech,x96-max" (Meson g12a s905x2)
-  - "seirobotics,sei510" (Meson g12a s905x2)
-
-Amlogic Meson Firmware registers Interface
-------------------------------------------
-
-The Meson SoCs have a register bank with status and data shared with the
-secure firmware.
-
-Required properties:
- - compatible: For Meson GX SoCs, must be "amlogic,meson-gx-ao-secure", "syscon"
-
-Properties should indentify components of this register interface :
-
-Meson GX SoC Information
-------------------------
-A firmware register encodes the SoC type, package and revision information on
-the Meson GX SoCs.
-If present, the following property should be added :
-
-Optional properties:
-  - amlogic,has-chip-id: If present, the interface gives the current SoC version.
-
-Example
--------
-
-ao-secure@140 {
-       compatible = "amlogic,meson-gx-ao-secure", "syscon";
-       reg = <0x0 0x140 0x0 0x140>;
-       amlogic,has-chip-id;
-};
diff --git a/Documentation/devicetree/bindings/arm/amlogic.yaml b/Documentation/devicetree/bindings/arm/amlogic.yaml
new file mode 100644 (file)
index 0000000..325c6fd
--- /dev/null
@@ -0,0 +1,144 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/arm/amlogic.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Amlogic MesonX device tree bindings
+
+maintainers:
+  - Kevin Hilman <khilman@baylibre.com>
+
+description: |+
+  Work in progress statement:
+
+  Device tree files and bindings applying to Amlogic SoCs and boards are
+  considered "unstable". Any Amlogic device tree binding may change at
+  any time. Be sure to use a device tree binary and a kernel image
+  generated from the same source tree.
+
+  Please refer to Documentation/devicetree/bindings/ABI.txt for a definition of a
+  stable binding/ABI.
+
+properties:
+  $nodename:
+    const: '/'
+  compatible:
+    oneOf:
+      - description: Boards with the Amlogic Meson6 SoC
+        items:
+          - enum:
+              - geniatech,atv1200
+          - const: amlogic,meson6
+
+      - description: Boards with the Amlogic Meson8 SoC
+        items:
+          - enum:
+              - minix,neo-x8
+          - const: amlogic,meson8
+
+      - description: Boards with the Amlogic Meson8m2 SoC
+        items:
+          - enum:
+              - tronsmart,mxiii-plus
+          - const: amlogic,meson8m2
+
+      - description: Boards with the Amlogic Meson8b SoC
+        items:
+          - enum:
+              - endless,ec100
+              - hardkernel,odroid-c1
+              - tronfy,mxq
+          - const: amlogic,meson8b
+
+      - description: Boards with the Amlogic Meson GXBaby SoC
+        items:
+          - enum:
+              - amlogic,p200
+              - amlogic,p201
+              - friendlyarm,nanopi-k2
+              - hardkernel,odroid-c2
+              - nexbox,a95x
+              - wetek,hub
+              - wetek,play2
+          - const: amlogic,meson-gxbb
+
+      - description: Tronsmart Vega S95 devices
+        items:
+          - enum:
+              - tronsmart,vega-s95-pro
+              - tronsmart,vega-s95-meta
+              - tronsmart,vega-s95-telos
+          - const: tronsmart,vega-s95
+          - const: amlogic,meson-gxbb
+
+      - description: Boards with the Amlogic Meson GXL S805X SoC
+        items:
+          - enum:
+              - amlogic,p241
+              - libretech,aml-s805x-ac
+          - const: amlogic,s805x
+          - const: amlogic,meson-gxl
+
+      - description: Boards with the Amlogic Meson GXL S905W SoC
+        items:
+          - enum:
+              - amlogic,p281
+              - oranth,tx3-mini
+          - const: amlogic,s905w
+          - const: amlogic,meson-gxl
+
+      - description: Boards with the Amlogic Meson GXL S905X SoC
+        items:
+          - enum:
+              - amediatech,x96-max
+              - amlogic,p212
+              - hwacom,amazetv
+              - khadas,vim
+              - libretech,cc
+              - nexbox,a95x
+              - seirobotics,sei510
+          - const: amlogic,s905x
+          - const: amlogic,meson-gxl
+
+      - description: Boards with the Amlogic Meson GXL S905D SoC
+        items:
+          - enum:
+              - amlogic,p230
+              - amlogic,p231
+              - phicomm,n1
+          - const: amlogic,s905d
+          - const: amlogic,meson-gxl
+
+      - description: Boards with the Amlogic Meson GXM S912 SoC
+        items:
+          - enum:
+              - amlogic,q200
+              - amlogic,q201
+              - khadas,vim2
+              - kingnovel,r-box-pro
+              - nexbox,a1
+              - tronsmart,vega-s96
+          - const: amlogic,s912
+          - const: amlogic,meson-gxm
+
+      - description: Boards with the Amlogic Meson AXG A113D SoC
+        items:
+          - enum:
+              - amlogic,s400
+          - const: amlogic,a113d
+          - const: amlogic,meson-axg
+
+      - description: Boards with the Amlogic Meson G12A S905D2 SoC
+        items:
+          - enum:
+              - amlogic,u200
+          - const: amlogic,g12a
+
+      - description: Boards with the Amlogic Meson G12B S922X SoC
+        items:
+          - enum:
+              - hardkernel,odroid-n2
+          - const: amlogic,g12b
+
+...
diff --git a/Documentation/devicetree/bindings/arm/amlogic/amlogic,meson-gx-ao-secure.txt b/Documentation/devicetree/bindings/arm/amlogic/amlogic,meson-gx-ao-secure.txt
new file mode 100644 (file)
index 0000000..c67d9f4
--- /dev/null
@@ -0,0 +1,28 @@
+Amlogic Meson Firmware registers Interface
+------------------------------------------
+
+The Meson SoCs have a register bank with status and data shared with the
+secure firmware.
+
+Required properties:
+ - compatible: For Meson GX SoCs, must be "amlogic,meson-gx-ao-secure", "syscon"
+
+Properties should indentify components of this register interface :
+
+Meson GX SoC Information
+------------------------
+A firmware register encodes the SoC type, package and revision information on
+the Meson GX SoCs.
+If present, the following property should be added :
+
+Optional properties:
+  - amlogic,has-chip-id: If present, the interface gives the current SoC version.
+
+Example
+-------
+
+ao-secure@140 {
+       compatible = "amlogic,meson-gx-ao-secure", "syscon";
+       reg = <0x0 0x140 0x0 0x140>;
+       amlogic,has-chip-id;
+};
index 5f3719ab7075af8952864e4156e28f29c8abb943..317a2fc3667a91d51cd45a6162e96e2b014b90ed 100644 (file)
@@ -6,7 +6,7 @@ that are provided by the hardware platform it is running on, including power
 and performance functions.
 
 This binding is intended to define the interface the firmware implementing
-the SCMI as described in ARM document number ARM DUI 0922B ("ARM System Control
+the SCMI as described in ARM document number ARM DEN 0056A ("ARM System Control
 and Management Interface Platform Design Document")[0] provide for OSPM in
 the device tree.
 
diff --git a/Documentation/devicetree/bindings/arm/atmel-at91.txt b/Documentation/devicetree/bindings/arm/atmel-at91.txt
deleted file mode 100644 (file)
index 99dee23..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-Atmel AT91 device tree bindings.
-================================
-
-Boards with a SoC of the Atmel AT91 or SMART family shall have the following
-properties:
-
-Required root node properties:
-compatible: must be one of:
- * "atmel,at91rm9200"
-
- * "atmel,at91sam9" for SoCs using an ARM926EJ-S core, shall be extended with
-   the specific SoC family or compatible:
-    o "atmel,at91sam9260"
-    o "atmel,at91sam9261"
-    o "atmel,at91sam9263"
-    o "atmel,at91sam9x5" for the 5 series, shall be extended with the specific
-      SoC compatible:
-       - "atmel,at91sam9g15"
-       - "atmel,at91sam9g25"
-       - "atmel,at91sam9g35"
-       - "atmel,at91sam9x25"
-       - "atmel,at91sam9x35"
-    o "atmel,at91sam9g20"
-    o "atmel,at91sam9g45"
-    o "atmel,at91sam9n12"
-    o "atmel,at91sam9rl"
-    o "atmel,at91sam9xe"
-    o "microchip,sam9x60"
- * "atmel,sama5" for SoCs using a Cortex-A5, shall be extended with the specific
-   SoC family:
-    o "atmel,sama5d2" shall be extended with the specific SoC compatible:
-       - "atmel,sama5d27"
-    o "atmel,sama5d3" shall be extended with the specific SoC compatible:
-       - "atmel,sama5d31"
-       - "atmel,sama5d33"
-       - "atmel,sama5d34"
-       - "atmel,sama5d35"
-       - "atmel,sama5d36"
-    o "atmel,sama5d4" shall be extended with the specific SoC compatible:
-       - "atmel,sama5d41"
-       - "atmel,sama5d42"
-       - "atmel,sama5d43"
-       - "atmel,sama5d44"
-
- * "atmel,samv7" for MCUs using a Cortex-M7, shall be extended with the specific
-   SoC family:
-    o "atmel,sams70" shall be extended with the specific MCU compatible:
-       - "atmel,sams70j19"
-       - "atmel,sams70j20"
-       - "atmel,sams70j21"
-       - "atmel,sams70n19"
-       - "atmel,sams70n20"
-       - "atmel,sams70n21"
-       - "atmel,sams70q19"
-       - "atmel,sams70q20"
-       - "atmel,sams70q21"
-    o "atmel,samv70" shall be extended with the specific MCU compatible:
-       - "atmel,samv70j19"
-       - "atmel,samv70j20"
-       - "atmel,samv70n19"
-       - "atmel,samv70n20"
-       - "atmel,samv70q19"
-       - "atmel,samv70q20"
-    o "atmel,samv71" shall be extended with the specific MCU compatible:
-       - "atmel,samv71j19"
-       - "atmel,samv71j20"
-       - "atmel,samv71j21"
-       - "atmel,samv71n19"
-       - "atmel,samv71n20"
-       - "atmel,samv71n21"
-       - "atmel,samv71q19"
-       - "atmel,samv71q20"
-       - "atmel,samv71q21"
diff --git a/Documentation/devicetree/bindings/arm/atmel-at91.yaml b/Documentation/devicetree/bindings/arm/atmel-at91.yaml
new file mode 100644 (file)
index 0000000..6e168ab
--- /dev/null
@@ -0,0 +1,134 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/arm/atmel-at91.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Atmel AT91 device tree bindings.
+
+maintainers:
+  - Alexandre Belloni <alexandre.belloni@bootlin.com>
+  - Ludovic Desroches <ludovic.desroches@microchip.com>
+
+description: |
+  Boards with a SoC of the Atmel AT91 or SMART family shall have the following
+
+properties:
+  $nodename:
+    const: '/'
+  compatible:
+    oneOf:
+      - items:
+          - const: atmel,at91rm9200
+      - items:
+          - enum:
+              - olimex,sam9-l9260
+          - enum:
+              - atmel,at91sam9260
+              - atmel,at91sam9261
+              - atmel,at91sam9263
+              - atmel,at91sam9g20
+              - atmel,at91sam9g45
+              - atmel,at91sam9n12
+              - atmel,at91sam9rl
+              - atmel,at91sam9xe
+              - atmel,at91sam9x60
+          - const: atmel,at91sam9
+
+      - items:
+          - enum:
+              - atmel,at91sam9g15
+              - atmel,at91sam9g25
+              - atmel,at91sam9g35
+              - atmel,at91sam9x25
+              - atmel,at91sam9x35
+          - const: atmel,at91sam9x5
+          - const: atmel,at91sam9
+
+      - items:
+          - const: atmel,sama5d27
+          - const: atmel,sama5d2
+          - const: atmel,sama5
+
+      - description: Nattis v2 board with Natte v2 power board
+        items:
+          - const: axentia,nattis-2
+          - const: axentia,natte-2
+          - const: axentia,linea
+          - const: atmel,sama5d31
+          - const: atmel,sama5d3
+          - const: atmel,sama5
+
+      - description: TSE-850 v3 board
+        items:
+          - const: axentia,tse850v3
+          - const: axentia,linea
+          - const: atmel,sama5d31
+          - const: atmel,sama5d3
+          - const: atmel,sama5
+
+      - items:
+          - const: axentia,linea
+          - const: atmel,sama5d31
+          - const: atmel,sama5d3
+          - const: atmel,sama5
+
+      - items:
+          - enum:
+              - atmel,sama5d31
+              - atmel,sama5d33
+              - atmel,sama5d34
+              - atmel,sama5d35
+              - atmel,sama5d36
+          - const: atmel,sama5d3
+          - const: atmel,sama5
+
+      - items:
+          - enum:
+              - atmel,sama5d41
+              - atmel,sama5d42
+              - atmel,sama5d43
+              - atmel,sama5d44
+          - const: atmel,sama5d4
+          - const: atmel,sama5
+
+      - items:
+          - enum:
+              - atmel,sams70j19
+              - atmel,sams70j20
+              - atmel,sams70j21
+              - atmel,sams70n19
+              - atmel,sams70n20
+              - atmel,sams70n21
+              - atmel,sams70q19
+              - atmel,sams70q20
+              - atmel,sams70q21
+          - const: atmel,sams70
+          - const: atmel,samv7
+
+      - items:
+          - enum:
+              - atmel,samv70j19
+              - atmel,samv70j20
+              - atmel,samv70n19
+              - atmel,samv70n20
+              - atmel,samv70q19
+              - atmel,samv70q20
+          - const: atmel,samv70
+          - const: atmel,samv7
+
+      - items:
+          - enum:
+              - atmel,samv71j19
+              - atmel,samv71j20
+              - atmel,samv71j21
+              - atmel,samv71n19
+              - atmel,samv71n20
+              - atmel,samv71n21
+              - atmel,samv71q19
+              - atmel,samv71q20
+              - atmel,samv71q21
+          - const: atmel,samv71
+          - const: atmel,samv7
+
+...
diff --git a/Documentation/devicetree/bindings/arm/emtrion.txt b/Documentation/devicetree/bindings/arm/emtrion.txt
deleted file mode 100644 (file)
index 83329ae..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Emtrion Devicetree Bindings
-===========================
-
-emCON Series:
--------------
-
-Required root node properties
-       - compatible:
-       - "emtrion,emcon-mx6", "fsl,imx6q";             : emCON-MX6D or emCON-MX6Q SoM
-       - "emtrion,emcon-mx6-avari", "fsl,imx6q";       : emCON-MX6D or emCON-MX6Q SoM on Avari Base
-       - "emtrion,emcon-mx6", "fsl,imx6dl";            : emCON-MX6S or emCON-MX6DL SoM
-       - "emtrion,emcon-mx6-avari", "fsl,imx6dl";      : emCON-MX6S or emCON-MX6DL SoM on Avari Base
index 407138ebc0d0a934f33b79f569c96f22a849bc49..7294ac36f4c0be99557a1d6b7dca331d97222d80 100644 (file)
@@ -15,6 +15,13 @@ properties:
     const: '/'
   compatible:
     oneOf:
+      - description: i.MX1 based Boards
+        items:
+          - enum:
+              - armadeus,imx1-apf9328
+              - fsl,imx1ads
+          - const: fsl,imx1
+
       - description: i.MX23 based Boards
         items:
           - enum:
@@ -51,6 +58,25 @@ properties:
           - const: i2se,duckbill-2
           - const: fsl,imx28
 
+      - description: i.MX31 based Boards
+        items:
+          - enum:
+              - buglabs,imx31-bug
+              - logicpd,imx31-lite
+          - const: fsl,imx31
+
+      - description: i.MX35 based Boards
+        items:
+          - enum:
+              - fsl,imx35-pdk
+          - const: fsl,imx35
+
+      - description: i.MX35 Eukrea CPUIMX35 Board
+        items:
+          - const: eukrea,mbimxsd35-baseboard
+          - const: eukrea,cpuimx35
+          - const: fsl,imx35
+
       - description: i.MX50 based Boards
         items:
           - enum:
@@ -80,6 +106,8 @@ properties:
       - description: i.MX6Q based Boards
         items:
           - enum:
+              - emtrion,emcon-mx6         # emCON-MX6D or emCON-MX6Q SoM
+              - emtrion,emcon-mx6-avari   # emCON-MX6D or emCON-MX6Q SoM on Avari Base
               - fsl,imx6q-arm2
               - fsl,imx6q-sabreauto
               - fsl,imx6q-sabrelite
@@ -99,6 +127,8 @@ properties:
         items:
           - enum:
               - eckelmann,imx6dl-ci4x10
+              - emtrion,emcon-mx6         # emCON-MX6S or emCON-MX6DL SoM
+              - emtrion,emcon-mx6-avari   # emCON-MX6S or emCON-MX6DL SoM on Avari Base
               - fsl,imx6dl-sabreauto      # i.MX6 DualLite/Solo SABRE Automotive Board
               - fsl,imx6dl-sabresd        # i.MX6 DualLite SABRE Smart Device Board
               - technologic,imx6dl-ts4900
@@ -156,6 +186,7 @@ properties:
         items:
           - enum:
               - fsl,imx7d-sdb             # i.MX7 SabreSD Board
+              - novtech,imx7d-meerkat96   # i.MX7 Meerkat96 Board
               - tq,imx7d-mba7             # i.MX7D TQ MBa7 with TQMa7D SoM
               - zii,imx7d-rpu2            # ZII RPU2 Board
           - const: fsl,imx7d
@@ -171,12 +202,25 @@ properties:
           - const: compulab,cl-som-imx7
           - const: fsl,imx7d
 
+      - description: i.MX7ULP based Boards
+        items:
+          - enum:
+              - fsl,imx7ulp-evk           # i.MX7ULP Evaluation Kit
+          - const: fsl,imx7ulp
+
       - description: i.MX8MM based Boards
         items:
           - enum:
               - fsl,imx8mm-evk            # i.MX8MM EVK Board
           - const: fsl,imx8mm
 
+      - description: i.MX8MQ based Boards
+        items:
+          - enum:
+              - fsl,imx8mq-evk            # i.MX8MQ EVK Board
+              - purism,librem5-devkit     # Purism Librem5 devkit
+          - const: fsl,imx8mq
+
       - description: i.MX8QXP based Boards
         items:
           - enum:
diff --git a/Documentation/devicetree/bindings/arm/mediatek.txt b/Documentation/devicetree/bindings/arm/mediatek.txt
deleted file mode 100644 (file)
index 56ac789..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-MediaTek SoC based Platforms Device Tree Bindings
-
-Boards with a MediaTek SoC shall have the following property:
-
-Required root node property:
-
-compatible: Must contain one of
-   "mediatek,mt2701"
-   "mediatek,mt2712"
-   "mediatek,mt6580"
-   "mediatek,mt6589"
-   "mediatek,mt6592"
-   "mediatek,mt6755"
-   "mediatek,mt6765"
-   "mediatek,mt6795"
-   "mediatek,mt6797"
-   "mediatek,mt7622"
-   "mediatek,mt7623"
-   "mediatek,mt7629"
-   "mediatek,mt8127"
-   "mediatek,mt8135"
-   "mediatek,mt8173"
-   "mediatek,mt8183"
-
-
-Supported boards:
-
-- Evaluation board for MT2701:
-    Required root node properties:
-      - compatible = "mediatek,mt2701-evb", "mediatek,mt2701";
-- Evaluation board for MT2712:
-    Required root node properties:
-      - compatible = "mediatek,mt2712-evb", "mediatek,mt2712";
-- Evaluation board for MT6580:
-    Required root node properties:
-      - compatible = "mediatek,mt6580-evbp1", "mediatek,mt6580";
-- bq Aquaris5 smart phone:
-    Required root node properties:
-      - compatible = "mundoreader,bq-aquaris5", "mediatek,mt6589";
-- Evaluation board for MT6592:
-    Required root node properties:
-      - compatible = "mediatek,mt6592-evb", "mediatek,mt6592";
-- Evaluation phone for MT6755(Helio P10):
-    Required root node properties:
-      - compatible = "mediatek,mt6755-evb", "mediatek,mt6755";
-- Evaluation board for MT6765(Helio P22):
-    Required root node properties:
-      - compatible = "mediatek,mt6765-evb", "mediatek,mt6765";
-- Evaluation board for MT6795(Helio X10):
-    Required root node properties:
-      - compatible = "mediatek,mt6795-evb", "mediatek,mt6795";
-- Evaluation board for MT6797(Helio X20):
-    Required root node properties:
-      - compatible = "mediatek,mt6797-evb", "mediatek,mt6797";
-- Mediatek X20 Development Board:
-    Required root node properties:
-      - compatible = "archermind,mt6797-x20-dev", "mediatek,mt6797";
-- Reference board variant 1 for MT7622:
-    Required root node properties:
-      - compatible = "mediatek,mt7622-rfb1", "mediatek,mt7622";
-- Bananapi BPI-R64 for MT7622:
-    Required root node properties:
-      - compatible = "bananapi,bpi-r64", "mediatek,mt7622";
-- Reference board for MT7623a with eMMC:
-    Required root node properties:
-      - compatible = "mediatek,mt7623a-rfb-emmc", "mediatek,mt7623";
-- Reference board for MT7623a with NAND:
-    Required root node properties:
-      - compatible = "mediatek,mt7623a-rfb-nand", "mediatek,mt7623";
-- Reference board for MT7623n with eMMC:
-    Required root node properties:
-      - compatible = "mediatek,mt7623n-rfb-emmc", "mediatek,mt7623";
-- Bananapi BPI-R2 board:
-      - compatible = "bananapi,bpi-r2", "mediatek,mt7623";
-- Reference board for MT7629:
-    Required root node properties:
-      - compatible = "mediatek,mt7629-rfb", "mediatek,mt7629";
-- MTK mt8127 tablet moose EVB:
-    Required root node properties:
-      - compatible = "mediatek,mt8127-moose", "mediatek,mt8127";
-- MTK mt8135 tablet EVB:
-    Required root node properties:
-      - compatible = "mediatek,mt8135-evbp1", "mediatek,mt8135";
-- MTK mt8173 tablet EVB:
-    Required root node properties:
-      - compatible = "mediatek,mt8173-evb", "mediatek,mt8173";
-- Evaluation board for MT8183:
-    Required root node properties:
-      - compatible = "mediatek,mt8183-evb", "mediatek,mt8183";
diff --git a/Documentation/devicetree/bindings/arm/mediatek.yaml b/Documentation/devicetree/bindings/arm/mediatek.yaml
new file mode 100644 (file)
index 0000000..a4ad2eb
--- /dev/null
@@ -0,0 +1,91 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/arm/mediatek.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek SoC based Platforms Device Tree Bindings
+
+maintainers:
+  - Sean Wang <sean.wang@mediatek.com>
+  - Matthias Brugger <matthias.bgg@gmail.com>
+description: |
+  Boards with a MediaTek SoC shall have the following properties.
+
+properties:
+  $nodename:
+    const: '/'
+  compatible:
+    oneOf:
+      - items:
+          - enum:
+              - mediatek,mt2701-evb
+          - const: mediatek,mt2701
+
+      - items:
+          - enum:
+              - mediatek,mt2712-evb
+          - const: mediatek,mt2712
+      - items:
+          - enum:
+              - mediatek,mt6580-evbp1
+          - const: mediatek,mt6580
+      - items:
+          - enum:
+              - mundoreader,bq-aquaris5
+          - const: mediatek,mt6589
+      - items:
+          - enum:
+              - mediatek,mt6592-evb
+          - const: mediatek,mt6592
+      - items:
+          - enum:
+              - mediatek,mt6755-evb
+          - const: mediatek,mt6755
+      - items:
+          - enum:
+              - mediatek,mt6765-evb
+          - const: mediatek,mt6765
+      - items:
+          - enum:
+              - mediatek,mt6795-evb
+          - const: mediatek,mt6795
+      - items:
+          - enum:
+              - archermind,mt6797-x20-dev
+              - mediatek,mt6797-evb
+          - const: mediatek,mt6797
+      - items:
+          - enum:
+              - bananapi,bpi-r64
+              - mediatek,mt7622-rfb1
+          - const: mediatek,mt7622
+      - items:
+          - enum:
+              - mediatek,mt7623a-rfb-emmc
+              - mediatek,mt7623a-rfb-nand
+              - mediatek,mt7623n-rfb-emmc
+              - bananapi,bpi-r2
+          - const: mediatek,mt7623
+
+      - items:
+          - enum:
+              - mediatek,mt7629-rfb
+          - const: mediatek,mt7629
+      - items:
+          - enum:
+              - mediatek,mt8127-moose
+          - const: mediatek,mt8127
+      - items:
+          - enum:
+              - mediatek,mt8135-evbp1
+          - const: mediatek,mt8135
+      - items:
+          - enum:
+              - mediatek,mt8173-evb
+          - const: mediatek,mt8173
+      - items:
+          - enum:
+              - mediatek,mt8183-evb
+          - const: mediatek,mt8183
+...
index 1c1e48fd94b553c2681591c5489a84e26c72ac4b..b301f753ed2c213d4f67b94d31f1652d57eedc3c 100644 (file)
@@ -160,6 +160,9 @@ Boards:
 - AM335X phyCORE-AM335x: Development kit
   compatible = "phytec,am335x-pcm-953", "phytec,am335x-phycore-som", "ti,am33xx"
 
+- AM335x phyBOARD-REGOR: Single Board Computer
+  compatible = "phytec,am335x-regor", "phytec,am335x-phycore-som", "ti,am33xx"
+
 - AM335X UC-8100-ME-T: Communication-centric industrial computing platform
   compatible = "moxa,uc-8100-me-t", "ti,am33xx";
 
index 19f379863d50bd414ed1b0668b21c40263ba1f14..08c923f8c25788b6c563a8f48dfb4fd5dd7b6242 100644 (file)
@@ -106,6 +106,14 @@ properties:
 
       - description: RZ/G2M (R8A774A1)
         items:
+          - enum:
+              - hoperun,hihope-rzg2m # HopeRun HiHope RZ/G2M platform
+          - const: renesas,r8a774a1
+
+      - items:
+          - enum:
+              - hoperun,hihope-rzg2-ex # HopeRun expansion board for HiHope RZ/G2 platforms
+          - const: hoperun,hihope-rzg2m
           - const: renesas,r8a774a1
 
       - description: RZ/G2E (R8A774C0)
index 5c6bbf10abc9c1624f586afc08c239c8878dcf24..34865042f4e458077c7a32c9b7394467c2f3f33e 100644 (file)
@@ -316,6 +316,19 @@ properties:
           - const: haoyu,marsboard-rk3066
           - const: rockchip,rk3066a
 
+      - description: Hugsun X99 TV Box
+        items:
+          - const: hugsun,x99
+          - const: rockchip,rk3399
+
+      - description: Khadas Edge series boards
+        items:
+          - enum:
+              - khadas,edge
+              - khadas,edge-captain
+              - khadas,edge-v
+          - const: rockchip,rk3399
+
       - description: mqmaker MiQi
         items:
           - const: mqmaker,miqi
diff --git a/Documentation/devicetree/bindings/arm/stm32/stm32.txt b/Documentation/devicetree/bindings/arm/stm32/stm32.txt
deleted file mode 100644 (file)
index 6808ed9..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-STMicroelectronics STM32 Platforms Device Tree Bindings
-
-Each device tree must specify which STM32 SoC it uses,
-using one of the following compatible strings:
-
-  st,stm32f429
-  st,stm32f469
-  st,stm32f746
-  st,stm32h743
-  st,stm32mp157
diff --git a/Documentation/devicetree/bindings/arm/stm32/stm32.yaml b/Documentation/devicetree/bindings/arm/stm32/stm32.yaml
new file mode 100644 (file)
index 0000000..4d194f1
--- /dev/null
@@ -0,0 +1,31 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/arm/stm32/stm32.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: STMicroelectronics STM32 Platforms Device Tree Bindings
+
+maintainers:
+  - Alexandre Torgue <alexandre.torgue@st.com>
+
+properties:
+  compatible:
+    oneOf:
+      - items:
+          - const: st,stm32f429
+
+      - items:
+          - const: st,stm32f469
+
+      - items:
+          - const: st,stm32f746
+
+      - items:
+          - const: st,stm32h743
+
+      - items:
+          - enum:
+              - arrow,stm32mp157a-avenger96 # Avenger96
+          - const: st,stm32mp157
+...
index 285f4fc8519d29cf4d63303c0873a67c31f5bdfa..000a00d12d6a44267ef86e0c0d39d8c215721f5a 100644 (file)
@@ -263,7 +263,7 @@ properties:
 
       - description: ICNova A20 SWAC
         items:
-          - const: swac,icnova-a20-swac
+          - const: incircuit,icnova-a20-swac
           - const: incircuit,icnova-a20
           - const: allwinner,sun7i-a20
 
index 6a059cabb2da09bc842816d4f41a59983d5f2adf..333e7256126a8810ca0179673dddc7784e8652f6 100644 (file)
@@ -13,6 +13,9 @@ architecture it uses, using one of the following compatible values:
 - AM654
   compatible = "ti,am654";
 
+- J721E
+  compatible = "ti,j721e";
+
 Boards
 ------
 
diff --git a/Documentation/devicetree/bindings/bus/allwinner,sun8i-a23-rsb.yaml b/Documentation/devicetree/bindings/bus/allwinner,sun8i-a23-rsb.yaml
new file mode 100644 (file)
index 0000000..be32f08
--- /dev/null
@@ -0,0 +1,80 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/bus/allwinner,sun8i-a23-rsb.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Allwinner A23 RSB Device Tree Bindings
+
+maintainers:
+  - Chen-Yu Tsai <wens@csie.org>
+  - Maxime Ripard <maxime.ripard@bootlin.com>
+
+properties:
+  "#address-cells":
+    const: 1
+
+  "#size-cells":
+    const: 0
+
+  compatible:
+    oneOf:
+      - const: allwinner,sun8i-a23-rsb
+      - items:
+        - const: allwinner,sun8i-a83t-rsb
+        - const: allwinner,sun8i-a23-rsb
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  clocks:
+    maxItems: 1
+
+  resets:
+    maxItems: 1
+
+  clock-frequency:
+    minimum: 1
+    maximum: 20000000
+
+patternProperties:
+  "^.*@[0-9a-fA-F]+$":
+    type: object
+    properties:
+      reg:
+        maxItems: 1
+
+    required:
+      - reg
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - clocks
+  - resets
+
+examples:
+  - |
+    rsb@1f03400 {
+        compatible = "allwinner,sun8i-a23-rsb";
+        reg = <0x01f03400 0x400>;
+        interrupts = <0 39 4>;
+        clocks = <&apb0_gates 3>;
+        clock-frequency = <3000000>;
+        resets = <&apb0_rst 3>;
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        pmic@3e3 {
+            compatible = "...";
+            reg = <0x3e3>;
+
+            /* ... */
+        };
+    };
+
+additionalProperties: false
diff --git a/Documentation/devicetree/bindings/bus/sunxi-rsb.txt b/Documentation/devicetree/bindings/bus/sunxi-rsb.txt
deleted file mode 100644 (file)
index eb3ed62..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-Allwinner Reduced Serial Bus (RSB) controller
-
-The RSB controller found on later Allwinner SoCs is an SMBus like 2 wire
-serial bus with 1 master and up to 15 slaves. It is represented by a node
-for the controller itself, and child nodes representing the slave devices.
-
-Required properties :
-
- - reg             : Offset and length of the register set for the controller.
- - compatible      : Shall be "allwinner,sun8i-a23-rsb".
- - interrupts      : The interrupt line associated to the RSB controller.
- - clocks          : The gate clk associated to the RSB controller.
- - resets          : The reset line associated to the RSB controller.
- - #address-cells  : shall be 1
- - #size-cells     : shall be 0
-
-Optional properties :
-
- - clock-frequency : Desired RSB bus clock frequency in Hz. Maximum is 20MHz.
-                    If not set this defaults to 3MHz.
-
-Child nodes:
-
-An RSB controller node can contain zero or more child nodes representing
-slave devices on the bus.  Child 'reg' properties should contain the slave
-device's hardware address. The hardware address is hardwired in the device,
-which can normally be found in the datasheet.
-
-Example:
-
-       rsb@1f03400 {
-               compatible = "allwinner,sun8i-a23-rsb";
-               reg = <0x01f03400 0x400>;
-               interrupts = <0 39 4>;
-               clocks = <&apb0_gates 3>;
-               clock-frequency = <3000000>;
-               resets = <&apb0_rst 3>;
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               pmic@3e3 {
-                       compatible = "...";
-                       reg = <0x3e3>;
-
-                       /* ... */
-               };
-       };
index a41d280c3f9f74a5dc2b600a868ec0f8d6e73426..db680413e89c2957594dcac9430861e794b0349e 100644 (file)
@@ -12,10 +12,12 @@ following device-specific properties.
 Required properties:
 
 - compatible : Shall contain one or more of
+  - "renesas,r8a774a1-hdmi" for R8A774A1 (RZ/G2M) compatible HDMI TX
   - "renesas,r8a7795-hdmi" for R8A7795 (R-Car H3) compatible HDMI TX
   - "renesas,r8a7796-hdmi" for R8A7796 (R-Car M3-W) compatible HDMI TX
   - "renesas,r8a77965-hdmi" for R8A77965 (R-Car M3-N) compatible HDMI TX
-  - "renesas,rcar-gen3-hdmi" for the generic R-Car Gen3 compatible HDMI TX
+  - "renesas,rcar-gen3-hdmi" for the generic R-Car Gen3 and RZ/G2 compatible
+                            HDMI TX
 
     When compatible with generic versions, nodes must list the SoC-specific
     version corresponding to the platform first, followed by the
index 6a0ff9059e72f1e8b5ec00dca256f6f059c55c10..da371c4d406ce74f8bf00113ad16cf273a2acd3e 100644 (file)
@@ -7,6 +7,7 @@ Required properties:
 
 - compatible:          Must be one of
                         "fsl,ls1021a-qdma": for LS1021A Board
+                        "fsl,ls1028a-qdma": for LS1028A Board
                         "fsl,ls1043a-qdma": for ls1043A Board
                         "fsl,ls1046a-qdma": for ls1046A Board
 - reg:                 Should contain the register's base address and length.
index e5ad3b2afe17d9d8c4c7fbe7b011726fb19f5300..9b298edec5b2206aaf37465c06738aeb425161c3 100644 (file)
@@ -17,6 +17,7 @@ Required properties:
   * which must be preceded by one of the following vendor specifics:
     + "allwinner,sun50i-h6-mali"
     + "amlogic,meson-gxm-mali"
+    + "samsung,exynos5433-mali"
     + "rockchip,rk3288-mali"
     + "rockchip,rk3399-mali"
 
index ae63f09fda7d5e9128134c4a4ac4ae4b1ed97a0b..b352a6851a0689aeb37321ba5907639a9ec25132 100644 (file)
@@ -17,6 +17,7 @@ Required properties:
       + amlogic,meson8b-mali
       + amlogic,meson-gxbb-mali
       + amlogic,meson-gxl-mali
+      + samsung,exynos4210-mali
       + rockchip,rk3036-mali
       + rockchip,rk3066-mali
       + rockchip,rk3188-mali
index cf494a08b8378080e19b8923f2bed16f1eae5c5b..9692b7f719f55ce286fbf56f58166d402d91bb27 100644 (file)
@@ -114,42 +114,47 @@ patternProperties:
 
 examples:
   - |
-    adc@0 {
-      compatible = "adi,ad7124-4";
-      reg = <0>;
-      spi-max-frequency = <5000000>;
-      interrupts = <25 2>;
-      interrupt-parent = <&gpio>;
-      refin1-supply = <&adc_vref>;
-      clocks = <&ad7124_mclk>;
-      clock-names = "mclk";
-
+    spi {
       #address-cells = <1>;
       #size-cells = <0>;
 
-      channel@0 {
+      adc@0 {
+        compatible = "adi,ad7124-4";
         reg = <0>;
-        diff-channels = <0 1>;
-        adi,reference-select = <0>;
-        adi,buffered-positive;
-      };
-
-      channel@1 {
-        reg = <1>;
-        bipolar;
-        diff-channels = <2 3>;
-        adi,reference-select = <0>;
-        adi,buffered-positive;
-        adi,buffered-negative;
-      };
-
-      channel@2 {
-        reg = <2>;
-        diff-channels = <4 5>;
-      };
-
-      channel@3 {
-        reg = <3>;
-        diff-channels = <6 7>;
+        spi-max-frequency = <5000000>;
+        interrupts = <25 2>;
+        interrupt-parent = <&gpio>;
+        refin1-supply = <&adc_vref>;
+        clocks = <&ad7124_mclk>;
+        clock-names = "mclk";
+
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        channel@0 {
+          reg = <0>;
+          diff-channels = <0 1>;
+          adi,reference-select = <0>;
+          adi,buffered-positive;
+        };
+
+        channel@1 {
+          reg = <1>;
+          bipolar;
+          diff-channels = <2 3>;
+          adi,reference-select = <0>;
+          adi,buffered-positive;
+          adi,buffered-negative;
+        };
+
+        channel@2 {
+          reg = <2>;
+          diff-channels = <4 5>;
+        };
+
+        channel@3 {
+          reg = <3>;
+          diff-channels = <6 7>;
+        };
       };
     };
index 8a4100ceeaf254eb7a0f51f4b5227e4613004d3a..d76ece97c76c1639fbb1dd8397d159cbd5f646fe 100644 (file)
@@ -61,6 +61,6 @@ examples:
         compatible = "avia,hx711";
         sck-gpios = <&gpio3 10 GPIO_ACTIVE_HIGH>;
         dout-gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
-        avdd-suppy = <&avdd>;
+        avdd-supply = <&avdd>;
         clock-frequency = <100000>;
     };
index 496125c6bfb7d28168f1afe203f0ba3c716a9563..507b737612eae9bd74b81f0b2efe7615f903fa2a 100644 (file)
@@ -5,6 +5,7 @@ Required properties:
  - compatible: should be one of the following string:
                "allwinner,sun4i-a10-lradc-keys"
                "allwinner,sun8i-a83t-r-lradc"
+               "allwinner,sun50i-a64-lradc", "allwinner,sun8i-a83t-r-lradc"
  - reg: mmio address range of the chip
  - interrupts: interrupt to which the chip is connected
  - vref-supply: powersupply for the lradc reference voltage
diff --git a/Documentation/devicetree/bindings/misc/fsl,dpaa2-console.txt b/Documentation/devicetree/bindings/misc/fsl,dpaa2-console.txt
new file mode 100644 (file)
index 0000000..1442ba5
--- /dev/null
@@ -0,0 +1,11 @@
+DPAA2 console support
+
+Required properties:
+
+    - compatible
+        Value type: <string>
+        Definition: Must be "fsl,dpaa2-console".
+    - reg
+        Value type: <prop-encoded-array>
+        Definition: A standard property.  Specifies the region where the MCFBA
+                    (MC firmware base address) register can be found.
index e5a411518be1ed2c902f34a1d9a623fd6e4ace54..b5b3cf5b1ac236770c0a741c934f6edea65dee00 100644 (file)
@@ -55,6 +55,7 @@ patternProperties:
   "^pinctrl-[0-9]+$": true
 
   "^nand@[a-f0-9]+$":
+    type: object
     properties:
       reg:
         minimum: 0
index 199ba5ac2a06cad9453620e6edc3e400ddf14ebe..d261b7096c696ec70542621642a59d843865e2d1 100644 (file)
@@ -40,6 +40,7 @@ properties:
 
 patternProperties:
   "^nand@[a-f0-9]$":
+    type: object
     properties:
       reg:
         description:
index 9936b9ee67c36672afeb050a5641aa44cebbb728..b463e1268ac4f253a4f3704af511c7c490319747 100644 (file)
@@ -6,6 +6,7 @@ Required properties:
              "renesas,can-r8a7744" if CAN controller is a part of R8A7744 SoC.
              "renesas,can-r8a7745" if CAN controller is a part of R8A7745 SoC.
              "renesas,can-r8a774a1" if CAN controller is a part of R8A774A1 SoC.
+             "renesas,can-r8a774c0" if CAN controller is a part of R8A774C0 SoC.
              "renesas,can-r8a7778" if CAN controller is a part of R8A7778 SoC.
              "renesas,can-r8a7779" if CAN controller is a part of R8A7779 SoC.
              "renesas,can-r8a7790" if CAN controller is a part of R8A7790 SoC.
@@ -27,13 +28,8 @@ Required properties:
 
 - reg: physical base address and size of the R-Car CAN register map.
 - interrupts: interrupt specifier for the sole interrupt.
-- clocks: phandles and clock specifiers for 2 CAN clock inputs for RZ/G2
-         devices.
-         phandles and clock specifiers for 3 CAN clock inputs for every other
-         SoC.
-- clock-names: 2 clock input name strings for RZ/G2: "clkp1", "can_clk".
-              3 clock input name strings for every other SoC: "clkp1", "clkp2",
-              "can_clk".
+- clocks: phandles and clock specifiers for 3 CAN clock inputs.
+- clock-names: 3 clock input name strings: "clkp1", "clkp2", and "can_clk".
 - pinctrl-0: pin control group to be used for this controller.
 - pinctrl-names: must be "default".
 
@@ -49,8 +45,7 @@ using the below properties:
 Optional properties:
 - renesas,can-clock-select: R-Car CAN Clock Source Select. Valid values are:
                            <0x0> (default) : Peripheral clock (clkp1)
-                           <0x1> : Peripheral clock (clkp2) (not supported by
-                                   RZ/G2 devices)
+                           <0x1> : Peripheral clock (clkp2)
                            <0x3> : External input clock
 
 Example
index ac71daa4619505030ac1373e678ca13241727f82..32f051f6d338ee74d7af3361f7a9cee3313fac94 100644 (file)
@@ -3,11 +3,14 @@ Renesas R-Car CAN FD controller Device Tree Bindings
 
 Required properties:
 - compatible: Must contain one or more of the following:
-  - "renesas,rcar-gen3-canfd" for R-Car Gen3 compatible controller.
+  - "renesas,rcar-gen3-canfd" for R-Car Gen3 and RZ/G2 compatible controllers.
+  - "renesas,r8a774c0-canfd" for R8A774C0 (RZ/G2E) compatible controller.
   - "renesas,r8a7795-canfd" for R8A7795 (R-Car H3) compatible controller.
   - "renesas,r8a7796-canfd" for R8A7796 (R-Car M3-W) compatible controller.
+  - "renesas,r8a77965-canfd" for R8A77965 (R-Car M3-N) compatible controller.
   - "renesas,r8a77970-canfd" for R8A77970 (R-Car V3M) compatible controller.
   - "renesas,r8a77980-canfd" for R8A77980 (R-Car V3H) compatible controller.
+  - "renesas,r8a77990-canfd" for R8A77990 (R-Car E3) compatible controller.
 
   When compatible with the generic version, nodes must list the
   SoC-specific version corresponding to the platform first, followed by the
@@ -26,12 +29,13 @@ The name of the child nodes are "channel0" and "channel1" respectively. Each
 child node supports the "status" property only, which is used to
 enable/disable the respective channel.
 
-Required properties for "renesas,r8a7795-canfd" and "renesas,r8a7796-canfd"
+Required properties for "renesas,r8a774c0-canfd", "renesas,r8a7795-canfd",
+"renesas,r8a7796-canfd", "renesas,r8a77965-canfd", and "renesas,r8a77990-canfd"
 compatible:
-In R8A7795 and R8A7796 SoCs, canfd clock is a div6 clock and can be used by both
-CAN and CAN FD controller at the same time. It needs to be scaled to maximum
-frequency if any of these controllers use it. This is done using the below
-properties:
+In R8A774C0, R8A7795, R8A7796, R8A77965, and R8A77990 SoCs, canfd clock is a
+div6 clock and can be used by both CAN and CAN FD controller at the same time.
+It needs to be scaled to maximum frequency if any of these controllers use it.
+This is done using the below properties:
 
 - assigned-clocks: phandle of canfd clock.
 - assigned-clock-rates: maximum frequency of this clock.
index 61a110a7db8a11e8b041eaf738c84dfbf223daf4..125599a2dc5e45ca1bdb0a4729c7b78f3d21c28d 100644 (file)
@@ -22,7 +22,9 @@ description: |+
 
 properties:
   compatible:
-    enum: [ aspeed,ast2400-pinctrl, aspeed,g4-pinctrl ]
+    enum:
+      - aspeed,ast2400-pinctrl
+      - aspeed,g4-pinctrl
 
 patternProperties:
   '^.*$':
index cf561bd55128280c65ec12ccc6e2ca68da89e5d6..3e6d85318577e557e19dde856466d0a4839b4dbf 100644 (file)
@@ -22,7 +22,9 @@ description: |+
 
 properties:
   compatible:
-    enum: [ aspeed,ast2500-pinctrl, aspeed,g5-pinctrl ]
+    enum:
+      - aspeed,ast2500-pinctrl
+      - aspeed,g5-pinctrl
   aspeed,external-nodes:
     minItems: 2
     maxItems: 2
@@ -74,9 +76,6 @@ required:
 
 examples:
   - |
-    compatible = "simple-bus";
-    ranges;
-
     apb {
         compatible = "simple-bus";
         #address-cells = <1>;
@@ -89,7 +88,7 @@ examples:
 
             pinctrl: pinctrl {
                 compatible = "aspeed,g5-pinctrl";
-                aspeed,external-nodes = <&gfx &lhc>;
+                aspeed,external-nodes = <&gfx>, <&lhc>;
 
                 pinctrl_i2c3_default: i2c3_default {
                     function = "I2C3";
index 06c4b66c3ee68726ba7581d5241c2c13e8ba462e..91d3e78b3395cd3b23b07826f6fcee9cda71166e 100644 (file)
@@ -55,6 +55,7 @@ properties:
 
 patternProperties:
   '^gpio@[0-9a-f]*$':
+    type: object
     properties:
       gpio-controller: true
       '#gpio-cells':
@@ -113,8 +114,10 @@ patternProperties:
       - st,bank-name
 
   '-[0-9]*$':
+    type: object
     patternProperties:
       '^pins':
+        type: object
         description: |
           A pinctrl node should contain at least one subnode representing the
           pinctrl group available on the machine. Each subnode will list the
@@ -194,6 +197,7 @@ required:
 examples:
   - |
     #include <dt-bindings/pinctrl/stm32-pinfunc.h>
+    #include <dt-bindings/mfd/stm32f4-rcc.h>
     //Example 1
       pinctrl@40020000 {
               #address-cells = <1>;
@@ -207,6 +211,7 @@ examples:
                       #gpio-cells = <2>;
                       reg = <0x0 0x400>;
                       resets = <&reset_ahb1 0>;
+                      clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOA)>;
                       st,bank-name = "GPIOA";
               };
        };
@@ -224,6 +229,7 @@ examples:
                       #gpio-cells = <2>;
                       reg = <0x1000 0x400>;
                       resets = <&reset_ahb1 0>;
+                      clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOB)>;
                       st,bank-name = "GPIOB";
                       gpio-ranges = <&pinctrl 0 0 16>;
               };
@@ -233,6 +239,7 @@ examples:
                       #gpio-cells = <2>;
                       reg = <0x2000 0x400>;
                       resets = <&reset_ahb1 0>;
+                      clocks = <&rcc 0 STM32F4_AHB1_CLOCK(GPIOC)>;
                       st,bank-name = "GPIOC";
                       ngpios = <5>;
                       gpio-ranges = <&pinctrl 0 16 3>,
index 980e5413d18fe22403fbf14f1dac3f5c376c98a3..eb35b22f9e230d10d791cab438d8eb36206265e4 100644 (file)
@@ -6,6 +6,8 @@ which then translates it into a corresponding voltage on a rail
 Required Properties:
  - compatible: Should be one of the following
        * qcom,msm8996-rpmpd: RPM Power domain for the msm8996 family of SoC
+       * qcom,msm8998-rpmpd: RPM Power domain for the msm8998 family of SoC
+       * qcom,qcs404-rpmpd: RPM Power domain for the qcs404 family of SoC
        * qcom,sdm845-rpmhpd: RPMh Power domain for the sdm845 family of SoC
  - #power-domain-cells: number of cells in Power domain specifier
        must be 1.
diff --git a/Documentation/devicetree/bindings/pwm/allwinner,sun4i-a10-pwm.yaml b/Documentation/devicetree/bindings/pwm/allwinner,sun4i-a10-pwm.yaml
new file mode 100644 (file)
index 0000000..0ac52f8
--- /dev/null
@@ -0,0 +1,57 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/pwm/allwinner,sun4i-a10-pwm.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Allwinner A10 PWM Device Tree Bindings
+
+maintainers:
+  - Chen-Yu Tsai <wens@csie.org>
+  - Maxime Ripard <maxime.ripard@bootlin.com>
+
+properties:
+  "#pwm-cells":
+    const: 3
+
+  compatible:
+    oneOf:
+      - const: allwinner,sun4i-a10-pwm
+      - const: allwinner,sun5i-a10s-pwm
+      - const: allwinner,sun5i-a13-pwm
+      - const: allwinner,sun7i-a20-pwm
+      - const: allwinner,sun8i-h3-pwm
+      - items:
+          - const: allwinner,sun8i-a83t-pwm
+          - const: allwinner,sun8i-h3-pwm
+      - items:
+          - const: allwinner,sun50i-a64-pwm
+          - const: allwinner,sun5i-a13-pwm
+      - items:
+          - const: allwinner,sun50i-h5-pwm
+          - const: allwinner,sun5i-a13-pwm
+
+  reg:
+    maxItems: 1
+
+  clocks:
+    maxItems: 1
+
+required:
+  - "#pwm-cells"
+  - compatible
+  - reg
+  - clocks
+
+additionalProperties: false
+
+examples:
+  - |
+    pwm: pwm@1c20e00 {
+        compatible = "allwinner,sun7i-a20-pwm";
+        reg = <0x01c20e00 0xc>;
+        clocks = <&osc24M>;
+        #pwm-cells = <3>;
+    };
+
+...
diff --git a/Documentation/devicetree/bindings/pwm/pwm-sun4i.txt b/Documentation/devicetree/bindings/pwm/pwm-sun4i.txt
deleted file mode 100644 (file)
index 2a1affb..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-Allwinner sun4i and sun7i SoC PWM controller
-
-Required properties:
-  - compatible: should be one of:
-    - "allwinner,sun4i-a10-pwm"
-    - "allwinner,sun5i-a10s-pwm"
-    - "allwinner,sun5i-a13-pwm"
-    - "allwinner,sun7i-a20-pwm"
-    - "allwinner,sun8i-h3-pwm"
-    - "allwinner,sun50i-a64-pwm", "allwinner,sun5i-a13-pwm"
-    - "allwinner,sun50i-h5-pwm", "allwinner,sun5i-a13-pwm"
-  - reg: physical base address and length of the controller's registers
-  - #pwm-cells: should be 3. See pwm.txt in this directory for a description of
-    the cells format.
-  - clocks: From common clock binding, handle to the parent clock.
-
-Example:
-
-       pwm: pwm@1c20e00 {
-               compatible = "allwinner,sun7i-a20-pwm";
-               reg = <0x01c20e00 0xc>;
-               clocks = <&osc24M>;
-               #pwm-cells = <3>;
-       };
diff --git a/Documentation/devicetree/bindings/reset/bitmain,bm1880-reset.txt b/Documentation/devicetree/bindings/reset/bitmain,bm1880-reset.txt
new file mode 100644 (file)
index 0000000..a6f8455
--- /dev/null
@@ -0,0 +1,18 @@
+Bitmain BM1880 SoC Reset Controller
+===================================
+
+Please also refer to reset.txt in this directory for common reset
+controller binding usage.
+
+Required properties:
+- compatible:   Should be "bitmain,bm1880-reset"
+- reg:          Offset and length of reset controller space in SCTRL.
+- #reset-cells: Must be 1.
+
+Example:
+
+        rst: reset-controller@c00 {
+                compatible = "bitmain,bm1880-reset";
+                reg = <0xc00 0x8>;
+                #reset-cells = <1>;
+        };
index 2ecf33815d1823cb41a2a51bde0c24adcc956b88..13e095182db4c6e305e7e7f6b05f3fd87e83ec15 100644 (file)
@@ -45,6 +45,6 @@ Example:
         };
 
 
-For list of all valid reset indicies see
+For list of all valid reset indices see
 <dt-bindings/reset/imx7-reset.h> for i.MX7 and
 <dt-bindings/reset/imx8mq-reset.h> for i.MX8MQ
index f97a4ecd7b9196eff515ed9b68f6c767a1f1266d..c899111aa5e3799cf84524d932dbd55448164c0f 100644 (file)
@@ -10,97 +10,76 @@ maintainers:
   - Paul Walmsley <paul.walmsley@sifive.com>
   - Palmer Dabbelt <palmer@sifive.com>
 
-allOf:
-  - $ref: /schemas/cpus.yaml#
-
 properties:
-  $nodename:
-    const: cpus
-    description: Container of cpu nodes
-
-  '#address-cells':
-    const: 1
-    description: |
-      A single unsigned 32-bit integer uniquely identifies each RISC-V
-      hart in a system.  (See the "reg" node under the "cpu" node,
-      below).
-
-  '#size-cells':
-    const: 0
+  compatible:
+    items:
+      - enum:
+          - sifive,rocket0
+          - sifive,e5
+          - sifive,e51
+          - sifive,u54-mc
+          - sifive,u54
+          - sifive,u5
+      - const: riscv
+    description:
+      Identifies that the hart uses the RISC-V instruction set
+      and identifies the type of the hart.
+
+  mmu-type:
+    allOf:
+      - $ref: "/schemas/types.yaml#/definitions/string"
+      - enum:
+          - riscv,sv32
+          - riscv,sv39
+          - riscv,sv48
+    description:
+      Identifies the MMU address translation mode used on this
+      hart.  These values originate from the RISC-V Privileged
+      Specification document, available from
+      https://riscv.org/specifications/
+
+  riscv,isa:
+    allOf:
+      - $ref: "/schemas/types.yaml#/definitions/string"
+      - enum:
+          - rv64imac
+          - rv64imafdc
+    description:
+      Identifies the specific RISC-V instruction set architecture
+      supported by the hart.  These are documented in the RISC-V
+      User-Level ISA document, available from
+      https://riscv.org/specifications/
+
+  timebase-frequency:
+    type: integer
+    minimum: 1
+    description:
+      Specifies the clock frequency of the system timer in Hz.
+      This value is common to all harts on a single system image.
+
+  interrupt-controller:
+    type: object
+    description: Describes the CPU's local interrupt controller
 
-patternProperties:
-  '^cpu@[0-9a-f]+$':
     properties:
-      compatible:
-        type: array
-        items:
-          - enum:
-              - sifive,rocket0
-              - sifive,e5
-              - sifive,e51
-              - sifive,u54-mc
-              - sifive,u54
-              - sifive,u5
-          - const: riscv
-        description:
-          Identifies that the hart uses the RISC-V instruction set
-          and identifies the type of the hart.
-
-      mmu-type:
-        allOf:
-          - $ref: "/schemas/types.yaml#/definitions/string"
-          - enum:
-              - riscv,sv32
-              - riscv,sv39
-              - riscv,sv48
-        description:
-          Identifies the MMU address translation mode used on this
-          hart.  These values originate from the RISC-V Privileged
-          Specification document, available from
-          https://riscv.org/specifications/
-
-      riscv,isa:
-        allOf:
-          - $ref: "/schemas/types.yaml#/definitions/string"
-          - enum:
-              - rv64imac
-              - rv64imafdc
-        description:
-          Identifies the specific RISC-V instruction set architecture
-          supported by the hart.  These are documented in the RISC-V
-          User-Level ISA document, available from
-          https://riscv.org/specifications/
+      '#interrupt-cells':
+        const: 1
 
-      timebase-frequency:
-        type: integer
-        minimum: 1
-        description:
-          Specifies the clock frequency of the system timer in Hz.
-          This value is common to all harts on a single system image.
-
-      interrupt-controller:
-        type: object
-        description: Describes the CPU's local interrupt controller
-
-        properties:
-          '#interrupt-cells':
-            const: 1
-
-          compatible:
-            const: riscv,cpu-intc
-
-          interrupt-controller: true
+      compatible:
+        const: riscv,cpu-intc
 
-        required:
-          - '#interrupt-cells'
-          - compatible
-          - interrupt-controller
+      interrupt-controller: true
 
     required:
-      - riscv,isa
-      - timebase-frequency
+      - '#interrupt-cells'
+      - compatible
       - interrupt-controller
 
+required:
+  - riscv,isa
+  - timebase-frequency
+  - interrupt-controller
+
 examples:
   - |
     // Example 1: SiFive Freedom U540G Development Kit
index 0a9b5444f4e62dfb725c1b007d0b5f4a3e86a818..dcba86b0a0d0bc8d9513b9fd2a0b38f2614b55fb 100644 (file)
@@ -1,6 +1,7 @@
 OMAP UART controller
 
 Required properties:
+- compatible : should be "ti,j721e-uart", "ti,am654-uart" for J721E controllers
 - compatible : should be "ti,am654-uart" for AM654 controllers
 - compatible : should be "ti,omap2-uart" for OMAP2 controllers
 - compatible : should be "ti,omap3-uart" for OMAP3 controllers
index 436d2106e80da38c6ce5c77629ce92cc882995ac..e876f3ce54f6de6bc1f8f76e9bbc45192e379cec 100644 (file)
@@ -2,8 +2,8 @@ Amlogic Canvas
 ================================
 
 A canvas is a collection of metadata that describes a pixel buffer.
-Those metadata include: width, height, phyaddr, wrapping, block mode
-and endianness.
+Those metadata include: width, height, phyaddr, wrapping and block mode.
+Starting with GXBB the endianness can also be described.
 
 Many IPs within Amlogic SoCs rely on canvas indexes to read/write pixel data
 rather than use the phy addresses directly. For instance, this is the case for
@@ -18,7 +18,11 @@ Video Lookup Table
 --------------------------
 
 Required properties:
-- compatible: "amlogic,canvas"
+- compatible: has to be one of:
+               - "amlogic,meson8-canvas", "amlogic,canvas" on Meson8
+               - "amlogic,meson8b-canvas", "amlogic,canvas" on Meson8b
+               - "amlogic,meson8m2-canvas", "amlogic,canvas" on Meson8m2
+               - "amlogic,canvas" on GXBB and newer
 - reg: Base physical address and size of the canvas registers.
 
 Example:
diff --git a/Documentation/devicetree/bindings/soc/qcom/qcom,aoss-qmp.txt b/Documentation/devicetree/bindings/soc/qcom/qcom,aoss-qmp.txt
new file mode 100644 (file)
index 0000000..954ffee
--- /dev/null
@@ -0,0 +1,81 @@
+Qualcomm Always-On Subsystem side channel binding
+
+This binding describes the hardware component responsible for side channel
+requests to the always-on subsystem (AOSS), used for certain power management
+requests that is not handled by the standard RPMh interface. Each client in the
+SoC has it's own block of message RAM and IRQ for communication with the AOSS.
+The protocol used to communicate in the message RAM is known as Qualcomm
+Messaging Protocol (QMP)
+
+The AOSS side channel exposes control over a set of resources, used to control
+a set of debug related clocks and to affect the low power state of resources
+related to the secondary subsystems. These resources are exposed as a set of
+power-domains.
+
+- compatible:
+       Usage: required
+       Value type: <string>
+       Definition: must be "qcom,sdm845-aoss-qmp"
+
+- reg:
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: the base address and size of the message RAM for this
+                   client's communication with the AOSS
+
+- interrupts:
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: should specify the AOSS message IRQ for this client
+
+- mboxes:
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: reference to the mailbox representing the outgoing doorbell
+                   in APCS for this client, as described in mailbox/mailbox.txt
+
+- #clock-cells:
+       Usage: optional
+       Value type: <u32>
+       Definition: must be 0
+                   The single clock represents the QDSS clock.
+
+- #power-domain-cells:
+       Usage: optional
+       Value type: <u32>
+       Definition: must be 1
+                   The provided power-domains are:
+                   CDSP state (0), LPASS state (1), modem state (2), SLPI
+                   state (3), SPSS state (4) and Venus state (5).
+
+= SUBNODES
+The AOSS side channel also provides the controls for three cooling devices,
+these are expressed as subnodes of the QMP node. The name of the node is used
+to identify the resource and must therefor be "cx", "mx" or "ebi".
+
+- #cooling-cells:
+       Usage: optional
+       Value type: <u32>
+       Definition: must be 2
+
+= EXAMPLE
+
+The following example represents the AOSS side-channel message RAM and the
+mechanism exposing the power-domains, as found in SDM845.
+
+  aoss_qmp: qmp@c300000 {
+         compatible = "qcom,sdm845-aoss-qmp";
+         reg = <0x0c300000 0x100000>;
+         interrupts = <GIC_SPI 389 IRQ_TYPE_EDGE_RISING>;
+         mboxes = <&apss_shared 0>;
+
+         #power-domain-cells = <1>;
+
+         cx_cdev: cx {
+               #cooling-cells = <2>;
+         };
+
+         mx_cdev: mx {
+               #cooling-cells = <2>;
+         };
+  };
index bcc612cc74232235e553072fddd7169e08f7794e..db501269f47b84cdebb6af7eff987d529727eb05 100644 (file)
@@ -9,7 +9,7 @@ used for audio/voice services on the QDSP.
        Value type: <stringlist>
        Definition: must be "qcom,apr-v<VERSION-NUMBER>", example "qcom,apr-v2"
 
-- reg
+- qcom,apr-domain
        Usage: required
        Value type: <u32>
        Definition: Destination processor ID.
@@ -49,9 +49,9 @@ by the individual bindings for the specific service
 The following example represents a QDSP based sound card on a MSM8996 device
 which uses apr as communication between Apps and QDSP.
 
-       apr@4 {
+       apr {
                compatible = "qcom,apr-v2";
-               reg = <APR_DOMAIN_ADSP>;
+               qcom,apr-domain = <APR_DOMAIN_ADSP>;
 
                q6core@3 {
                        compatible = "qcom,q6core";
index c374fd4923a670e97924c7270f34d0a6fd6918d7..6d1329c281707fbefe0aa403b860c6105d5a4a71 100644 (file)
@@ -50,6 +50,7 @@ properties:
 
 patternProperties:
   "^.*@[0-9a-f]+":
+    type: object
     properties:
       reg:
         items:
index bda7a5befd8bb042636ac0dd5e4800e5eb69fdcf..f36c46d236d7a6afdf82ee2a7af704ecbf68e1a6 100644 (file)
@@ -55,6 +55,7 @@ properties:
 
 patternProperties:
   "^.*@[0-9a-f]+":
+    type: object
     properties:
       reg:
         items:
index c0594450e9efa9ba2117ddb93321a9bf87f34889..c5220bcd852b5a5949d9439cb0d0883b64d7436b 100644 (file)
@@ -42,12 +42,18 @@ Required Properties:
     - "renesas,r8a7793-cmt1" for the 48-bit CMT1 device included in r8a7793.
     - "renesas,r8a7794-cmt0" for the 32-bit CMT0 device included in r8a7794.
     - "renesas,r8a7794-cmt1" for the 48-bit CMT1 device included in r8a7794.
+    - "renesas,r8a7795-cmt0" for the 32-bit CMT0 device included in r8a7795.
+    - "renesas,r8a7795-cmt1" for the 48-bit CMT1 device included in r8a7795.
     - "renesas,r8a7796-cmt0" for the 32-bit CMT0 device included in r8a7796.
     - "renesas,r8a7796-cmt1" for the 48-bit CMT1 device included in r8a7796.
+    - "renesas,r8a77965-cmt0" for the 32-bit CMT0 device included in r8a77965.
+    - "renesas,r8a77965-cmt1" for the 48-bit CMT1 device included in r8a77965.
     - "renesas,r8a77970-cmt0" for the 32-bit CMT0 device included in r8a77970.
     - "renesas,r8a77970-cmt1" for the 48-bit CMT1 device included in r8a77970.
     - "renesas,r8a77980-cmt0" for the 32-bit CMT0 device included in r8a77980.
     - "renesas,r8a77980-cmt1" for the 48-bit CMT1 device included in r8a77980.
+    - "renesas,r8a77990-cmt0" for the 32-bit CMT0 device included in r8a77990.
+    - "renesas,r8a77990-cmt1" for the 48-bit CMT1 device included in r8a77990.
 
     - "renesas,rcar-gen2-cmt0" for 32-bit CMT0 devices included in R-Car Gen2
                and RZ/G1.
index eade302345a3d89d8d3af3b83f66a8e46e09c0b4..6992bbbbffab6a57b185a244048ea9d03d60ea15 100644 (file)
@@ -395,12 +395,16 @@ patternProperties:
     description: Holt Integrated Circuits, Inc.
   "^honeywell,.*":
     description: Honeywell
+  "^hoperun,.*":
+    description: Jiangsu HopeRun Software Co., Ltd.
   "^hp,.*":
     description: Hewlett Packard
   "^hsg,.*":
     description: HannStar Display Co.
   "^holtek,.*":
     description: Holtek Semiconductor, Inc.
+  "^hugsun,.*":
+    description: Shenzhen Hugsun Technology Co. Ltd.
   "^hwacom,.*":
     description: HwaCom Systems Inc.
   "^hyundai,.*":
@@ -735,6 +739,8 @@ patternProperties:
     description: PROBOX2 (by W2COMP Co., Ltd.)
   "^pulsedlight,.*":
     description: PulsedLight, Inc
+  "^purism,.*":
+    description: Purism, SPC
   "^qca,.*":
     description: Qualcomm Atheros, Inc.
   "^qcom,.*":
index 5eba889ea84da0b95728adfb6f82fa9b0213bbdb..9f43928760998e2db5268ad3cf955f39e101e693 100644 (file)
@@ -30,6 +30,7 @@
 *.lzo
 *.mo
 *.moc
+*.mod
 *.mod.c
 *.o
 *.o.*
index 074a423c853cf7f66cc96b80484a2a4c7038d698..87d1372da879dc5433da570be3f1df8ffd0d4ff9 100644 (file)
@@ -200,6 +200,33 @@ Debugfs Files:
        This file is used to read and write peer scratchpads.  See
        *spad* for details.
 
+NTB MSI Test Client (ntb\_msi\_test)
+------------------------------------
+
+The MSI test client serves to test and debug the MSI library which
+allows for passing MSI interrupts across NTB memory windows. The
+test client is interacted with through the debugfs filesystem:
+
+* *debugfs*/ntb\_tool/*hw*/
+       A directory in debugfs will be created for each
+       NTB device probed by the tool.  This directory is shortened to *hw*
+       below.
+* *hw*/port
+       This file describes the local port number
+* *hw*/irq*_occurrences
+       One occurrences file exists for each interrupt and, when read,
+       returns the number of times the interrupt has been triggered.
+* *hw*/peer*/port
+       This file describes the port number for each peer
+* *hw*/peer*/count
+       This file describes the number of interrupts that can be
+       triggered on each peer
+* *hw*/peer*/trigger
+       Writing an interrupt number (any number less than the value
+       specified in count) will trigger the interrupt on the
+       specified peer. That peer's interrupt's occurrence file
+       should be incremented.
+
 NTB Hardware Drivers
 ====================
 
index 209672010fb465c282ca597e694ad0bb635bca81..6b7a41cfcaed05f9847553afb169181419599a85 100644 (file)
@@ -436,7 +436,7 @@ for the inode.  If d_make_root(inode) is passed a NULL inode it returns NULL
 and also requires no further error handling. Typical usage is:
 
        inode = foofs_new_inode(....);
-       s->s_root = d_make_inode(inode);
+       s->s_root = d_make_root(inode);
        if (!s->s_root)
                /* Nothing needed for the inode cleanup */
                return -ENOMEM;
index ce9b99c004ae2e54a76546ea166da9319449d7e7..61b2181ed3ea8dd826f541b8128d6f84303bf1ea 100644 (file)
@@ -38,12 +38,11 @@ Additional options to the assembler (for built-in and modules).
 
 AFLAGS_MODULE
 -------------
-Additional module specific options to use for $(AS).
+Additional assembler options for modules.
 
 AFLAGS_KERNEL
 -------------
-Additional options for $(AS) when used for assembler
-code for code that is compiled as built-in.
+Additional assembler options for built-in.
 
 KCFLAGS
 -------
index f311584577530ba8a2a2447dab99e47852dd7abe..f4f0f7ffde2bf87944899d666e8d8c54d1349a95 100644 (file)
@@ -328,7 +328,7 @@ more details, with real examples.
        variable $(KBUILD_CFLAGS) and uses it for compilation flags for the
        entire tree.
 
-       asflags-y specifies options for assembling with $(AS).
+       asflags-y specifies assembler options.
 
        Example::
 
@@ -490,7 +490,7 @@ more details, with real examples.
        as-instr checks if the assembler reports a specific instruction
        and then outputs either option1 or option2
        C escapes are supported in the test instruction
-       Note: as-instr-option uses KBUILD_AFLAGS for $(AS) options
+       Note: as-instr-option uses KBUILD_AFLAGS for assembler options
 
     cc-option
        cc-option is used to check if $(CC) supports a given option, and if
@@ -906,7 +906,7 @@ When kbuild executes, the following steps are followed (roughly):
        vmlinux. The usage of $(call if_changed,xxx) will be described later.
 
     KBUILD_AFLAGS
-       $(AS) assembler flags
+       Assembler flags
 
        Default value - see top level Makefile
        Append or modify as required per architecture.
@@ -949,16 +949,16 @@ When kbuild executes, the following steps are followed (roughly):
        to 'y' when selected.
 
     KBUILD_AFLAGS_KERNEL
-       $(AS) options specific for built-in
+       Assembler options specific for built-in
 
        $(KBUILD_AFLAGS_KERNEL) contains extra C compiler flags used to compile
        resident kernel code.
 
     KBUILD_AFLAGS_MODULE
-       Options for $(AS) when building modules
+       Assembler options specific for modules
 
        $(KBUILD_AFLAGS_MODULE) is used to add arch-specific options that
-       are used for $(AS).
+       are used for assembler.
 
        From commandline AFLAGS_MODULE shall be used (see kbuild.txt).
 
index 048e5ca44824b4bd7304ee26b5a4c0b7185f828c..2d9f9ebf411782b13a764c87be50520d37c6d860 100644 (file)
@@ -424,13 +424,24 @@ Statistics
 Following minimum set of TLS-related statistics should be reported
 by the driver:
 
- * ``rx_tls_decrypted`` - number of successfully decrypted TLS segments
- * ``tx_tls_encrypted`` - number of in-order TLS segments passed to device
-   for encryption
+ * ``rx_tls_decrypted_packets`` - number of successfully decrypted RX packets
+   which were part of a TLS stream.
+ * ``rx_tls_decrypted_bytes`` - number of TLS payload bytes in RX packets
+   which were successfully decrypted.
+ * ``tx_tls_encrypted_packets`` - number of TX packets passed to the device
+   for encryption of their TLS payload.
+ * ``tx_tls_encrypted_bytes`` - number of TLS payload bytes in TX packets
+   passed to the device for encryption.
+ * ``tx_tls_ctx`` - number of TLS TX HW offload contexts added to device for
+   encryption.
  * ``tx_tls_ooo`` - number of TX packets which were part of a TLS stream
-   but did not arrive in the expected order
- * ``tx_tls_drop_no_sync_data`` - number of TX packets dropped because
-   they arrived out of order and associated record could not be found
+   but did not arrive in the expected order.
+ * ``tx_tls_drop_no_sync_data`` - number of TX packets which were part of
+   a TLS stream dropped, because they arrived out of order and associated
+   record could not be found.
+ * ``tx_tls_drop_bypass_req`` - number of TX packets which were part of a TLS
+   stream dropped, because they contain both data that has been encrypted by
+   software and data that expects hardware crypto offload.
 
 Notable corner cases, exceptions and additional requirements
 ============================================================
@@ -513,3 +524,9 @@ Redirects leak clear text
 
 In the RX direction, if segment has already been decrypted by the device
 and it gets redirected or mirrored - clear text will be transmitted out.
+
+shutdown() doesn't clear TLS state
+----------------------------------
+
+shutdown() system call allows for a TLS socket to be reused as a different
+connection. Offload doesn't currently handle that.
index 2cd6250b289676ac0091f6a6299d33fabcd4d2f7..e54a3f51ddc514e60e736cd32c06ebde18110e88 100644 (file)
@@ -4090,17 +4090,22 @@ Parameters: struct kvm_pmu_event_filter (in)
 Returns: 0 on success, -1 on error
 
 struct kvm_pmu_event_filter {
-       __u32 action;
-       __u32 nevents;
-       __u64 events[0];
+       __u32 action;
+       __u32 nevents;
+       __u32 fixed_counter_bitmap;
+       __u32 flags;
+       __u32 pad[4];
+       __u64 events[0];
 };
 
 This ioctl restricts the set of PMU events that the guest can program.
 The argument holds a list of events which will be allowed or denied.
 The eventsel+umask of each event the guest attempts to program is compared
 against the events field to determine whether the guest should have access.
-This only affects general purpose counters; fixed purpose counters can
-be disabled by changing the perfmon CPUID leaf.
+The events field only controls general purpose counters; fixed purpose
+counters are controlled by the fixed_counter_bitmap.
+
+No flags are defined yet, the field must be zero.
 
 Valid values for 'action':
 #define KVM_PMU_EVENT_ALLOW 0
index a63d465d3e2db16cd872bda73387a2a59d436f2e..b540794cbd91f86e3d58380bd54a77b19c2b9e98 100644 (file)
@@ -1264,7 +1264,7 @@ F:        include/uapi/drm/panfrost_drm.h
 ARM MFM AND FLOPPY DRIVERS
 M:     Ian Molton <spyro@f2s.com>
 S:     Maintained
-F:     arch/arm/lib/floppydma.S
+F:     arch/arm/mach-rpc/floppydma.S
 F:     arch/arm/include/asm/floppy.h
 
 ARM PMU PROFILING AND DEBUGGING
@@ -1863,6 +1863,7 @@ F:        arch/arm/mach-orion5x/
 F:     arch/arm/plat-orion/
 F:     arch/arm/boot/dts/dove*
 F:     arch/arm/boot/dts/orion5x*
+T:     git git://git.infradead.org/linux-mvebu.git
 
 ARM/Marvell Kirkwood and Armada 370, 375, 38x, 39x, XP, 3700, 7K/8K SOC support
 M:     Jason Cooper <jason@lakedaemon.net>
@@ -1883,6 +1884,7 @@ F:        drivers/irqchip/irq-armada-370-xp.c
 F:     drivers/irqchip/irq-mvebu-*
 F:     drivers/pinctrl/mvebu/
 F:     drivers/rtc/rtc-armada38x.c
+T:     git git://git.infradead.org/linux-mvebu.git
 
 ARM/Mediatek RTC DRIVER
 M:     Eddie Huang <eddie.huang@mediatek.com>
@@ -2089,7 +2091,6 @@ S:        Maintained
 
 ARM/QUALCOMM SUPPORT
 M:     Andy Gross <agross@kernel.org>
-M:     David Brown <david.brown@linaro.org>
 L:     linux-arm-msm@vger.kernel.org
 S:     Maintained
 F:     Documentation/devicetree/bindings/soc/qcom/
@@ -2111,7 +2112,7 @@ F:        drivers/i2c/busses/i2c-qup.c
 F:     drivers/i2c/busses/i2c-qcom-geni.c
 F:     drivers/mfd/ssbi.c
 F:     drivers/mmc/host/mmci_qcom*
-F:     drivers/mmc/host/sdhci_msm.c
+F:     drivers/mmc/host/sdhci-msm.c
 F:     drivers/pci/controller/dwc/pcie-qcom.c
 F:     drivers/phy/qualcomm/
 F:     drivers/power/*/msm*
@@ -6525,6 +6526,7 @@ M:        Li Yang <leoyang.li@nxp.com>
 L:     linuxppc-dev@lists.ozlabs.org
 L:     linux-arm-kernel@lists.infradead.org
 S:     Maintained
+F:     Documentation/devicetree/bindings/misc/fsl,dpaa2-console.txt
 F:     Documentation/devicetree/bindings/soc/fsl/
 F:     drivers/soc/fsl/
 F:     include/linux/fsl/
@@ -6820,13 +6822,6 @@ F:       Documentation/filesystems/gfs2*.txt
 F:     fs/gfs2/
 F:     include/uapi/linux/gfs2_ondisk.h
 
-GIGASET ISDN DRIVERS
-M:     Paul Bolle <pebolle@tiscali.nl>
-L:     gigaset307x-common@lists.sourceforge.net
-W:     http://gigaset307x.sourceforge.net/
-S:     Odd Fixes
-F:     drivers/staging/isdn/gigaset/
-
 GNSS SUBSYSTEM
 M:     Johan Hovold <johan@kernel.org>
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/johan/gnss.git
@@ -8876,6 +8871,8 @@ F:        arch/s390/include/asm/gmap.h
 F:     arch/s390/include/asm/kvm*
 F:     arch/s390/kvm/
 F:     arch/s390/mm/gmap.c
+F:     tools/testing/selftests/kvm/s390x/
+F:     tools/testing/selftests/kvm/*/s390x/
 
 KERNEL VIRTUAL MACHINE FOR X86 (KVM/x86)
 M:     Paolo Bonzini <pbonzini@redhat.com>
@@ -11140,6 +11137,7 @@ L:      netdev@vger.kernel.org
 S:     Maintained
 W:     https://fedorahosted.org/dropwatch/
 F:     net/core/drop_monitor.c
+F:     include/uapi/linux/net_dropmon.h
 
 NETWORKING DRIVERS
 M:     "David S. Miller" <davem@davemloft.net>
@@ -11278,6 +11276,7 @@ M:      Aviad Yehezkel <aviadye@mellanox.com>
 M:     Dave Watson <davejwatson@fb.com>
 M:     John Fastabend <john.fastabend@gmail.com>
 M:     Daniel Borkmann <daniel@iogearbox.net>
+M:     Jakub Kicinski <jakub.kicinski@netronome.com>
 L:     netdev@vger.kernel.org
 S:     Maintained
 F:     net/tls/*
@@ -11905,11 +11904,13 @@ F:    include/linux/mtd/onenand*.h
 
 OP-TEE DRIVER
 M:     Jens Wiklander <jens.wiklander@linaro.org>
+L:     tee-dev@lists.linaro.org
 S:     Maintained
 F:     drivers/tee/optee/
 
 OP-TEE RANDOM NUMBER GENERATOR (RNG) DRIVER
 M:     Sumit Garg <sumit.garg@linaro.org>
+L:     tee-dev@lists.linaro.org
 S:     Maintained
 F:     drivers/char/hw_random/optee-rng.c
 
@@ -12127,7 +12128,8 @@ F:      Documentation/driver-api/parport*.rst
 
 PARAVIRT_OPS INTERFACE
 M:     Juergen Gross <jgross@suse.com>
-M:     Alok Kataria <akataria@vmware.com>
+M:     Thomas Hellstrom <thellstrom@vmware.com>
+M:     "VMware, Inc." <pv-drivers@vmware.com>
 L:     virtualization@lists.linux-foundation.org
 S:     Supported
 F:     Documentation/virtual/paravirt_ops.txt
@@ -13293,7 +13295,7 @@ M:      Niklas Cassel <niklas.cassel@linaro.org>
 L:     netdev@vger.kernel.org
 S:     Maintained
 F:     drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
-F:     Documentation/devicetree/bindings/net/qcom,dwmac.txt
+F:     Documentation/devicetree/bindings/net/qcom,ethqos.txt
 
 QUALCOMM GENERIC INTERFACE I2C DRIVER
 M:     Alok Chauhan <alokc@codeaurora.org>
@@ -15743,6 +15745,7 @@ F:      include/media/i2c/tw9910.h
 
 TEE SUBSYSTEM
 M:     Jens Wiklander <jens.wiklander@linaro.org>
+L:     tee-dev@lists.linaro.org
 S:     Maintained
 F:     include/linux/tee_drv.h
 F:     include/uapi/linux/tee.h
@@ -17172,7 +17175,8 @@ S:      Maintained
 F:     drivers/misc/vmw_balloon.c
 
 VMWARE HYPERVISOR INTERFACE
-M:     Alok Kataria <akataria@vmware.com>
+M:     Thomas Hellstrom <thellstrom@vmware.com>
+M:     "VMware, Inc." <pv-drivers@vmware.com>
 L:     virtualization@lists.linux-foundation.org
 S:     Supported
 F:     arch/x86/kernel/cpu/vmware.c
@@ -17546,7 +17550,6 @@ M:      Jakub Kicinski <jakub.kicinski@netronome.com>
 M:     Jesper Dangaard Brouer <hawk@kernel.org>
 M:     John Fastabend <john.fastabend@gmail.com>
 L:     netdev@vger.kernel.org
-L:     xdp-newbies@vger.kernel.org
 L:     bpf@vger.kernel.org
 S:     Supported
 F:     net/core/xdp.c
index 2c5d00ba537e3f761a02b7f7f83a8d30180a2193..9be5834073f8937f5ceb358e620af0795243b56d 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,8 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 5
-PATCHLEVEL = 2
+PATCHLEVEL = 3
 SUBLEVEL = 0
-EXTRAVERSION =
+EXTRAVERSION = -rc1
 NAME = Bobtail Squid
 
 # *DOCUMENTATION*
@@ -486,11 +486,6 @@ export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
 export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
 export KBUILD_ARFLAGS
 
-# When compiling out-of-tree modules, put MODVERDIR in the module
-# tree rather than in the kernel tree. The kernel tree might
-# even be read-only.
-export MODVERDIR := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_versions
-
 # Files to ignore in find ... statements
 
 export RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o    \
@@ -887,6 +882,12 @@ KBUILD_CFLAGS   += $(call cc-option,-Werror=designated-init)
 # change __FILE__ to the relative path from the srctree
 KBUILD_CFLAGS  += $(call cc-option,-fmacro-prefix-map=$(srctree)/=)
 
+# ensure -fcf-protection is disabled when using retpoline as it is
+# incompatible with -mindirect-branch=thunk-extern
+ifdef CONFIG_RETPOLINE
+KBUILD_CFLAGS += $(call cc-option,-fcf-protection=none)
+endif
+
 # use the deterministic mode of AR if available
 KBUILD_ARFLAGS := $(call ar-option,D)
 
@@ -900,10 +901,8 @@ KBUILD_CPPFLAGS += $(ARCH_CPPFLAGS) $(KCPPFLAGS)
 KBUILD_AFLAGS   += $(ARCH_AFLAGS)   $(KAFLAGS)
 KBUILD_CFLAGS   += $(ARCH_CFLAGS)   $(KCFLAGS)
 
-# Use --build-id when available.
-LDFLAGS_BUILD_ID := $(call ld-option, --build-id)
-KBUILD_LDFLAGS_MODULE += $(LDFLAGS_BUILD_ID)
-LDFLAGS_vmlinux += $(LDFLAGS_BUILD_ID)
+KBUILD_LDFLAGS_MODULE += --build-id
+LDFLAGS_vmlinux += --build-id
 
 ifeq ($(CONFIG_STRIP_ASM_SYMS),y)
 LDFLAGS_vmlinux        += $(call ld-option, -X,)
@@ -1031,8 +1030,8 @@ vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS)
 
 # Recurse until adjust_autoksyms.sh is satisfied
 PHONY += autoksyms_recursive
-autoksyms_recursive: $(vmlinux-deps)
 ifdef CONFIG_TRIM_UNUSED_KSYMS
+autoksyms_recursive: $(vmlinux-deps) modules.order
        $(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \
          "$(MAKE) -f $(srctree)/Makefile vmlinux"
 endif
@@ -1074,7 +1073,7 @@ $(sort $(vmlinux-deps)): $(vmlinux-dirs) ;
 
 PHONY += $(vmlinux-dirs)
 $(vmlinux-dirs): prepare
-       $(Q)$(MAKE) $(build)=$@ need-builtin=1
+       $(Q)$(MAKE) $(build)=$@ need-builtin=1 need-modorder=1
 
 filechk_kernel.release = \
        echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
@@ -1096,7 +1095,7 @@ scripts: scripts_basic scripts_dtc
 # archprepare is used in arch Makefiles and when processed asm symlink,
 # version.h and scripts_basic is processed / created.
 
-PHONY += prepare archprepare prepare1 prepare3
+PHONY += prepare archprepare prepare3
 
 # prepare3 is used to check if we are building in a separate output directory,
 # and if so do:
@@ -1113,11 +1112,8 @@ ifdef building_out_of_srctree
        fi;
 endif
 
-prepare1: prepare3 outputmakefile asm-generic $(version_h) $(autoksyms_h) \
-                                               include/generated/utsrelease.h
-       $(cmd_crmodverdir)
-
-archprepare: archheaders archscripts prepare1 scripts
+archprepare: archheaders archscripts scripts prepare3 outputmakefile \
+       asm-generic $(version_h) $(autoksyms_h) include/generated/utsrelease.h
 
 prepare0: archprepare
        $(Q)$(MAKE) $(build)=scripts/mod
@@ -1331,8 +1327,8 @@ _modinst_:
                rm -f $(MODLIB)/build ; \
                ln -s $(CURDIR) $(MODLIB)/build ; \
        fi
-       @cp -f $(objtree)/modules.order $(MODLIB)/
-       @cp -f $(objtree)/modules.builtin $(MODLIB)/
+       @sed 's:^:kernel/:' modules.order > $(MODLIB)/modules.order
+       @sed 's:^:kernel/:' modules.builtin > $(MODLIB)/modules.builtin
        @cp -f $(objtree)/modules.builtin.modinfo $(MODLIB)/
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
 
@@ -1373,18 +1369,22 @@ endif # CONFIG_MODULES
 # make distclean Remove editor backup files, patch leftover files and the like
 
 # Directories & files removed with 'make clean'
-CLEAN_DIRS  += $(MODVERDIR) include/ksym
+CLEAN_DIRS  += include/ksym
 CLEAN_FILES += modules.builtin.modinfo
 
 # Directories & files removed with 'make mrproper'
 MRPROPER_DIRS  += include/config include/generated          \
                  arch/$(SRCARCH)/include/generated .tmp_objdiff
 MRPROPER_FILES += .config .config.old .version \
-                 Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \
+                 Module.symvers \
                  signing_key.pem signing_key.priv signing_key.x509     \
                  x509.genkey extra_certificates signing_key.x509.keyid \
                  signing_key.x509.signer vmlinux-gdb.py
 
+# Directories & files removed with 'make distclean'
+DISTCLEAN_DIRS  +=
+DISTCLEAN_FILES += tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS
+
 # clean - Delete most, but leave enough to build external modules
 #
 clean: rm-dirs  := $(CLEAN_DIRS)
@@ -1417,9 +1417,14 @@ mrproper: clean $(mrproper-dirs)
 
 # distclean
 #
+distclean: rm-dirs  := $(wildcard $(DISTCLEAN_DIRS))
+distclean: rm-files := $(wildcard $(DISTCLEAN_FILES))
+
 PHONY += distclean
 
 distclean: mrproper
+       $(call cmd,rmdirs)
+       $(call cmd,rmfiles)
        @find $(srctree) $(RCS_FIND_IGNORE) \
                \( -name '*.orig' -o -name '*.rej' -o -name '*~' \
                -o -name '*.bak' -o -name '#*#' -o -name '*%' \
@@ -1609,7 +1614,7 @@ $(objtree)/Module.symvers:
 module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD))
 PHONY += $(module-dirs) modules
 $(module-dirs): prepare $(objtree)/Module.symvers
-       $(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@)
+       $(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@) need-modorder=1
 
 modules: $(module-dirs)
        @$(kecho) '  Building modules, stage 2.';
@@ -1634,7 +1639,6 @@ PHONY += $(clean-dirs) clean
 $(clean-dirs):
        $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)
 
-clean: rm-dirs := $(MODVERDIR)
 clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers
 
 PHONY += help
@@ -1648,8 +1652,6 @@ help:
        @echo  ''
 
 PHONY += prepare
-prepare:
-       $(cmd_crmodverdir)
 endif # KBUILD_EXTMOD
 
 clean: $(clean-dirs)
@@ -1660,7 +1662,7 @@ clean: $(clean-dirs)
                -o -name '*.ko.*' \
                -o -name '*.dtb' -o -name '*.dtb.S' -o -name '*.dt.yaml' \
                -o -name '*.dwo' -o -name '*.lst' \
-               -o -name '*.su'  \
+               -o -name '*.su' -o -name '*.mod' \
                -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
                -o -name '*.lex.c' -o -name '*.tab.[ch]' \
                -o -name '*.asn1.[ch]' \
@@ -1765,8 +1767,6 @@ build-dir = $(patsubst %/,%,$(dir $(build-target)))
        $(Q)$(MAKE) $(build)=$(build-dir) $(build-target)
 %.symtypes: prepare FORCE
        $(Q)$(MAKE) $(build)=$(build-dir) $(build-target)
-%.ko: %.o
-       $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
 
 # Modules
 PHONY += /
@@ -1789,11 +1789,6 @@ quiet_cmd_depmod = DEPMOD  $(KERNELRELEASE)
       cmd_depmod = $(CONFIG_SHELL) $(srctree)/scripts/depmod.sh $(DEPMOD) \
                    $(KERNELRELEASE)
 
-# Create temporary dir for module support files
-# clean it up only when building all modules
-cmd_crmodverdir = $(Q)mkdir -p $(MODVERDIR) \
-                  $(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*)
-
 # read saved command lines for existing targets
 existing-targets := $(wildcard $(sort $(targets)))
 
index ac0fba400ded689e03e428893f897a76740f117d..a7b57dd42c26698b319430ac65cd81610ba08b71 100644 (file)
@@ -796,6 +796,9 @@ config ARCH_NO_COHERENT_DMA_MMAP
 config ARCH_NO_PREEMPT
        bool
 
+config ARCH_SUPPORTS_RT
+       bool
+
 config CPU_NO_EFFICIENT_FFS
        def_bool n
 
index 600c5ba1af418f90a9428a50b0d22c810357ec84..33b00579befff2d4ea0809965398f67cedb6fc77 100644 (file)
@@ -377,15 +377,6 @@ config ARCH_FOOTBRIDGE
          Support for systems based on the DC21285 companion chip
          ("FootBridge"), such as the Simtec CATS and the Rebel NetWinder.
 
-config ARCH_NETX
-       bool "Hilscher NetX based"
-       select ARM_VIC
-       select CLKSRC_MMIO
-       select CPU_ARM926T
-       select GENERIC_CLOCKEVENTS
-       help
-         This enables support for systems based on the Hilscher NetX Soc
-
 config ARCH_IOP13XX
        bool "IOP13xx-based"
        depends on MMU
@@ -531,7 +522,7 @@ config ARCH_RPC
        select ARCH_ACORN
        select ARCH_MAY_HAVE_PC_FDC
        select ARCH_SPARSEMEM_ENABLE
-       select ARCH_USES_GETTIMEOFFSET
+       select ARM_HAS_SG_CHAIN
        select CPU_SA110
        select FIQ
        select HAVE_IDE
@@ -552,6 +543,7 @@ config ARCH_SA1100
        select CLKSRC_MMIO
        select CLKSRC_PXA
        select TIMER_OF if OF
+       select COMMON_CLK
        select CPU_FREQ
        select CPU_SA1100
        select GENERIC_CLOCKEVENTS
@@ -770,8 +762,6 @@ source "arch/arm/mach-mvebu/Kconfig"
 
 source "arch/arm/mach-mxs/Kconfig"
 
-source "arch/arm/mach-netx/Kconfig"
-
 source "arch/arm/mach-nomadik/Kconfig"
 
 source "arch/arm/mach-npcm/Kconfig"
index 9a8862fee7381c1bc6fd31edba6d4f1941fd5e20..c929bea9a9ffe56dd9db0b9498054f61fb9a9204 100644 (file)
@@ -638,13 +638,6 @@ choice
                  Say Y here if you want kernel low-level debugging support
                  for Mediatek mt8135 based platforms on UART3.
 
-       config DEBUG_NETX_UART
-               bool "Kernel low-level debugging messages via NetX UART"
-               depends on ARCH_NETX
-               help
-                 Say Y here if you want kernel low-level debugging support
-                 on Hilscher NetX based platforms.
-
        config DEBUG_NOMADIK_UART
                bool "Kernel low-level debugging messages via NOMADIK UART"
                depends on ARCH_NOMADIK
index f863c6935d0e5008ce70da79245f96afe5fbeb6f..c3624ca6c0bca7c036c6f7e386a9a6fc1ae72b3c 100644 (file)
@@ -191,7 +191,6 @@ machine-$(CONFIG_ARCH_MXC)          += imx
 machine-$(CONFIG_ARCH_MEDIATEK)                += mediatek
 machine-$(CONFIG_ARCH_MILBEAUT)                += milbeaut
 machine-$(CONFIG_ARCH_MXS)             += mxs
-machine-$(CONFIG_ARCH_NETX)            += netx
 machine-$(CONFIG_ARCH_NOMADIK)         += nomadik
 machine-$(CONFIG_ARCH_NPCM)            += npcm
 machine-$(CONFIG_ARCH_NSPIRE)          += nspire
index dab2914fa293cde2916a4fd0ceddf0e9929e411f..9159fa2cea90c22b8163d12e978b7fd5063dbad0 100644 (file)
@@ -586,6 +586,7 @@ dtb-$(CONFIG_SOC_IMX7D) += \
        imx7d-colibri-emmc-eval-v3.dtb \
        imx7d-colibri-eval-v3.dtb \
        imx7d-mba7.dtb \
+       imx7d-meerkat96.dtb \
        imx7d-nitrogen7.dtb \
        imx7d-pico-hobbit.dtb \
        imx7d-pico-pi.dtb \
@@ -602,6 +603,7 @@ dtb-$(CONFIG_SOC_IMX7ULP) += \
 dtb-$(CONFIG_SOC_LS1021A) += \
        ls1021a-moxa-uc-8410a.dtb \
        ls1021a-qds.dtb \
+       ls1021a-tsn.dtb \
        ls1021a-twr.dtb
 dtb-$(CONFIG_SOC_VF610) += \
        vf500-colibri-eval-v3.dtb \
@@ -748,6 +750,7 @@ dtb-$(CONFIG_SOC_AM33XX) += \
        am335x-pepper.dtb \
        am335x-phycore-rdk.dtb \
        am335x-pocketbeagle.dtb \
+       am335x-regor-rdk.dtb \
        am335x-sancloud-bbe.dtb \
        am335x-shc.dtb \
        am335x-sbc-t335.dtb \
@@ -975,6 +978,7 @@ dtb-$(CONFIG_ARCH_STM32) += \
        stm32746g-eval.dtb \
        stm32h743i-eval.dtb \
        stm32h743i-disco.dtb \
+       stm32mp157a-avenger96.dtb \
        stm32mp157a-dk1.dtb \
        stm32mp157c-dk2.dtb \
        stm32mp157c-ed1.dtb \
@@ -1268,10 +1272,16 @@ dtb-$(CONFIG_ARCH_ASPEED) += \
        aspeed-bmc-arm-stardragon4800-rep2.dtb \
        aspeed-bmc-facebook-cmm.dtb \
        aspeed-bmc-facebook-tiogapass.dtb \
+       aspeed-bmc-facebook-yamp.dtb \
        aspeed-bmc-intel-s2600wf.dtb \
+       aspeed-bmc-inspur-fp5280g2.dtb \
+       aspeed-bmc-lenovo-hr630.dtb \
+       aspeed-bmc-microsoft-olympus.dtb \
        aspeed-bmc-opp-lanyang.dtb \
        aspeed-bmc-opp-palmetto.dtb \
        aspeed-bmc-opp-romulus.dtb \
+       aspeed-bmc-opp-swift.dtb \
+       aspeed-bmc-opp-vesnin.dtb \
        aspeed-bmc-opp-witherspoon.dtb \
        aspeed-bmc-opp-zaius.dtb \
        aspeed-bmc-portwell-neptune.dtb \
index 49e46baf954246b8b76a212f36b2756c22828bf2..386d5f89978e3384b8f0ae53fd9ad32e6a3b2a78 100644 (file)
                        AM33XX_PADCONF(AM335X_PIN_LCD_AC_BIAS_EN, PIN_INPUT_PULLDOWN, MUX_MODE7)      /* lcd_ac_bias_en.gpio2[25] RI */
                >;
        };
+
+       mmc1_pins: pinmux_mmc1_pins {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD15, PIN_INPUT, MUX_MODE7)     /* MMC1 CD */
+               >;
+       };
 };
 
 &uart1 {
 };
 
 &cpsw_emac1 {
-       phy-mode = "rgmii-txid";
+       phy-mode = "rgmii-id";
        dual_emac_res_vlan = <2>;
        phy-handle = <&phy1>;
 };
+
+&mmc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mmc1_pins>;
+       cd-gpios = <&gpio1 15 GPIO_ACTIVE_LOW>;
+};
index 9e88bc2f64652ce89783152e4cdde6cf48544264..b0df7256db13b8fcadb1e51ea7b73dac2518fbfb 100644 (file)
                        AM33XX_PADCONF(AM335X_PIN_MCASP0_ACLKR, PIN_INPUT_PULLUP, MUX_MODE7)      /* mcasp0_aclkr.gpio3[18], INPUT_PULLDOWN | MODE7 */
                >;
        };
+
+       mmc1_pins: pinmux_mmc1_pins {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD3, PIN_INPUT, MUX_MODE7)     /* MMC1 CD */
+               >;
+       };
 };
 
 &uart1 {
 };
 
 &cpsw_emac1 {
-       phy-mode = "rgmii-txid";
+       phy-mode = "rgmii-id";
        dual_emac_res_vlan = <2>;
        phy-handle = <&phy1>;
 };
+
+&mmc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mmc1_pins>;
+       cd-gpios = <&gpio2 18 GPIO_ACTIVE_LOW>;
+};
index 28aa00422951555a660ec23699bc97c7cf0927c9..d6aa46e8700e9250a4a0a057a2c3a1f3744ea91b 100644 (file)
                >;
        };
 
+       mmc1_pins: pinmux_mmc1_pins {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RXD3, PIN_INPUT, MUX_MODE7)     /* MMC1 CD */
+               >;
+       };
 };
 
 &uart1 {
 };
 
 &cpsw_emac1 {
-       phy-mode = "rgmii-txid";
+       phy-mode = "rgmii-id";
        dual_emac_res_vlan = <2>;
        phy-handle = <&phy1>;
 };
 
        status = "okay";
 };
+
+&mmc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mmc1_pins>;
+       cd-gpios = <&gpio2 18 GPIO_ACTIVE_LOW>;
+};
index d774bf76720c5596aa6b909990af721b86ef36aa..9bfa032bcada76248c618499024f0656f21f5430 100644 (file)
                pinctrl-names = "default";
                pinctrl-0 = <&user_leds_pins>;
 
-               green {
-                       label = "green:user";
+               user-led0 {
                        gpios = <&gpio1 30 GPIO_ACTIVE_HIGH>;
                        linux,default-trigger = "gpio";
                        default-state = "on";
                };
 
-               yellow {
-                       label = "yellow:user";
+               user-led1 {
                        gpios = <&gpio1 31 GPIO_ACTIVE_LOW>;
                        linux,default-trigger = "gpio";
                        default-state = "on";
 &davinci_mdio {
        phy1: ethernet-phy@2 {
                reg = <2>;
-
-               /* Register 260 (104h) â€“ RGMII Clock and Control Pad Skew */
-               rxc-skew-ps = <1400>;
-               rxdv-skew-ps = <0>;
-               txc-skew-ps = <1400>;
-               txen-skew-ps = <0>;
-               /* Register 261 (105h) â€“ RGMII RX Data Pad Skew */
-               rxd3-skew-ps = <0>;
-               rxd2-skew-ps = <0>;
-               rxd1-skew-ps = <0>;
-               rxd0-skew-ps = <0>;
-               /* Register 262 (106h) â€“ RGMII TX Data Pad Skew */
-               txd3-skew-ps = <0>;
-               txd2-skew-ps = <0>;
-               txd1-skew-ps = <0>;
-               txd0-skew-ps = <0>;
        };
 };
 
index 672daf9d36be1f8266746d16718e58863fbc7d12..43907d03e67597dcd18777728274a0a1791e20f3 100644 (file)
 #include "am335x-pcm-953.dtsi"
 
 /* SoM */
+&gpmc {
+       status = "okay";
+};
+
 &i2c_eeprom {
        status = "okay";
 };
index ee6b1cb27ce550fd76c8f1d3de25b0599050f34c..3d0672b53d779e84b76a0e992bdcba8486d83bc7 100644 (file)
                reg = <0x80000000 0x10000000>; /* 256 MB */
        };
 
-       regulators {
-               compatible = "simple-bus";
-
-               vcc5v: fixedregulator0 {
-                       compatible = "regulator-fixed";
-                       regulator-name = "vcc5v";
-                       regulator-min-microvolt = <5000000>;
-                       regulator-max-microvolt = <5000000>;
-                       regulator-boot-on;
-                       regulator-always-on;
-               };
+       vcc5v: fixedregulator0 {
+               compatible = "regulator-fixed";
+               regulator-name = "vcc5v";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               regulator-boot-on;
+               regulator-always-on;
        };
 };
 
        status = "okay";
 };
 
+/* EMMC */
+&am33xx_pinmux {
+       emmc_pins: pinmux_emmc_pins {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_CSN1, PIN_INPUT_PULLUP, MUX_MODE2)       /* gpmc_csn1.mmc1_clk */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_CSN2, PIN_INPUT_PULLUP, MUX_MODE2)       /* gpmc_csn2.mmc1_cmd */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD0, PIN_INPUT_PULLUP, MUX_MODE1)        /* gpmc_ad0.mmc1_dat0 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD1, PIN_INPUT_PULLUP, MUX_MODE1)        /* gpmc_ad1.mmc1_dat1 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD2, PIN_INPUT_PULLUP, MUX_MODE1)        /* gpmc_ad2.mmc1_dat2 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD3, PIN_INPUT_PULLUP, MUX_MODE1)        /* gpmc_ad3.mmc1_dat3 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD4, PIN_INPUT_PULLUP, MUX_MODE1)        /* gpmc_ad4.mmc1_dat4 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD5, PIN_INPUT_PULLUP, MUX_MODE1)        /* gpmc_ad5.mmc1_dat5 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD6, PIN_INPUT_PULLUP, MUX_MODE1)        /* gpmc_ad6.mmc1_dat6 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD7, PIN_INPUT_PULLUP, MUX_MODE1)        /* gpmc_ad7.mmc1_dat7 */
+               >;
+       };
+};
+
+&mmc2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&emmc_pins>;
+       vmmc-supply = <&vmmc_reg>;
+       bus-width = <8>;
+       ti,non-removable;
+       status = "disabled";
+};
+
 /* Ethernet */
 &am33xx_pinmux {
        ethernet0_pins: pinmux_ethernet0 {
 };
 
 &gpmc {
-       status = "okay";
+       status = "disabled";
        pinctrl-names = "default";
        pinctrl-0 = <&nandflash_pins>;
        ranges = <0 0 0x08000000 0x1000000>;   /* CS0: NAND */
diff --git a/arch/arm/boot/dts/am335x-regor-rdk.dts b/arch/arm/boot/dts/am335x-regor-rdk.dts
new file mode 100644 (file)
index 0000000..66a1360
--- /dev/null
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 Phytec Messtechnik GmbH
+ * Author: Teresa Remmet <t.remmet@phytec.de>
+ *
+ */
+
+/dts-v1/;
+
+#include "am335x-phycore-som.dtsi"
+#include "am335x-regor.dtsi"
+
+/* SoM */
+&gpmc {
+       status = "okay";
+};
+
+&i2c_eeprom {
+       status = "okay";
+};
+
+&serial_flash {
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/am335x-regor.dtsi b/arch/arm/boot/dts/am335x-regor.dtsi
new file mode 100644 (file)
index 0000000..5aff02a
--- /dev/null
@@ -0,0 +1,223 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 Phytec Messtechnik GmbH
+ * Author: Teresa Remmet <t.remmet@phytec.de>
+ *
+ */
+
+/ {
+       model = "Phytec AM335x phyBOARD-REGOR";
+       compatible = "phytec,am335x-regor", "phytec,am335x-phycore-som", "ti,am33xx";
+
+       vcc3v3: fixedregulator@1 {
+               compatible = "regulator-fixed";
+               regulator-name = "vcc3v3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-boot-on;
+       };
+
+       /* User IO */
+       user_leds: user_leds {
+               compatible = "gpio-leds";
+               pinctrl-names = "default";
+               pinctrl-0 = <&user_leds_pins>;
+
+               run_stop-led {
+                       gpios = <&gpio2 22 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "gpio";
+                       default-state = "off";
+               };
+
+               error-led {
+                       gpios = <&gpio3 15 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "gpio";
+                       default-state = "off";
+               };
+       };
+};
+
+/* User Leds */
+&am33xx_pinmux {
+       user_leds_pins: pinmux_user_leds {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_LCD_VSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE7)    /* lcd_hsync.gpio2_22 */
+                       AM33XX_PADCONF(AM335X_PIN_MCASP0_FSX, PIN_OUTPUT_PULLDOWN, MUX_MODE7)   /* mcasp0_fsx.gpio3_15 */
+               >;
+       };
+};
+
+/* CAN Busses */
+&am33xx_pinmux {
+       dcan1_pins: pinmux_dcan1 {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_UART0_CTSN, PIN_OUTPUT_PULLUP, MUX_MODE2)     /* uart0_ctsn.d_can1_tx */
+                       AM33XX_PADCONF(AM335X_PIN_UART0_RTSN, PIN_INPUT_PULLUP, MUX_MODE2)      /* uart0_rtsn.d_can1_rx */
+               >;
+       };
+};
+
+&dcan1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&dcan1_pins>;
+       status = "okay";
+};
+
+/* Ethernet */
+&am33xx_pinmux {
+       ethernet1_pins: pinmux_ethernet1 {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A0, PIN_OUTPUT, MUX_MODE1)               /* gpmc_a0.mii2_txen */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A1, PIN_INPUT_PULLDOWN, MUX_MODE1)       /* gpmc_a1.mii2_rxdv */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A2, PIN_OUTPUT, MUX_MODE1)               /* gpmc_a2.mii2_txd3 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A3, PIN_OUTPUT, MUX_MODE1)               /* gpmc_a3.mii2_txd2 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A4, PIN_OUTPUT, MUX_MODE1)               /* gpmc_a4.mii2_txd1 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A5, PIN_OUTPUT, MUX_MODE1)               /* gpmc_a5.mii2_txd0 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A6, PIN_INPUT_PULLDOWN, MUX_MODE1)       /* gpmc_a6.mii2_txclk */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A7, PIN_INPUT_PULLDOWN, MUX_MODE1)       /* gpmc_a7.mii2_rxclk */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A8, PIN_INPUT_PULLDOWN, MUX_MODE1)       /* gpmc_a8.mii2_rxd3 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A9, PIN_INPUT_PULLDOWN, MUX_MODE1)        /* gpmc_a9.mii2_rxd2 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A10, PIN_INPUT_PULLDOWN, MUX_MODE1)      /* gpmc_a10.mii2_rxd1 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_A11, PIN_INPUT_PULLDOWN, MUX_MODE1)      /* gpmc_a11.mii2_rxd0 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_WPN, PIN_INPUT_PULLDOWN, MUX_MODE1)      /* gpmc_wpn.mii2_rxerr */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_BEN1, PIN_INPUT_PULLDOWN, MUX_MODE1)     /* gpmc_ben1.mii2_col */
+               >;
+       };
+};
+
+&cpsw_emac1 {
+       phy-handle = <&phy1>;
+       phy-mode = "mii";
+       dual_emac_res_vlan = <2>;
+};
+
+&davinci_mdio {
+       phy1: ethernet-phy@1 {
+               reg = <1>;
+       };
+};
+
+&mac {
+       slaves = <2>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&ethernet0_pins &ethernet1_pins>;
+       dual_emac = <1>;
+};
+
+/* GPIOs */
+&am33xx_pinmux {
+       pinctrl-names = "default";
+       pinctrl-0 = <&user_gpios_pins>;
+
+       user_gpios_pins: pinmux_user_gpios {
+               pinctrl-single,pins = <
+                       /* DIGIN 1-4 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD11, PIN_INPUT, MUX_MODE7)              /* gpmc_ad11.gpio0_27 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD10, PIN_INPUT, MUX_MODE7)              /* gpmc_ad10.gpio0_26 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD9, PIN_INPUT, MUX_MODE7)               /* gpmc_ad9.gpio0_23 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD8, PIN_INPUT, MUX_MODE7)               /* gpmc_ad8.gpio0_22 */
+                       /* DIGOUT 1-4 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD15, PIN_OUTPUT, MUX_MODE7)             /* gpmc_ad15.gpio1_15 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD14, PIN_OUTPUT, MUX_MODE7)             /* gpmc_ad14.gpio1_14 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD13, PIN_OUTPUT, MUX_MODE7)             /* gpmc_ad13.gpio1_13 */
+                       AM33XX_PADCONF(AM335X_PIN_GPMC_AD12, PIN_OUTPUT, MUX_MODE7)             /* gpmc_ad12.gpio1_12 */
+               >;
+       };
+};
+
+/* MMC */
+&am33xx_pinmux {
+       mmc1_pins: pinmux_mmc1 {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_MMC0_DAT3, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MMC0_DAT2, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MMC0_DAT1, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MMC0_DAT0, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MMC0_CLK, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_MMC0_CMD, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_SPI0_CS1, PIN_INPUT_PULLUP, MUX_MODE7)        /* spi0_cs1.mmc0_sdcd */
+               >;
+       };
+};
+
+&mmc1 {
+       vmmc-supply = <&vcc3v3>;
+       bus-width = <4>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&mmc1_pins>;
+       cd-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
+       status = "okay";
+};
+
+/* RTC */
+&i2c_rtc {
+       status = "okay";
+};
+
+/* UARTs */
+&am33xx_pinmux {
+       uart0_pins: pinmux_uart0 {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_UART0_RXD, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_UART0_TXD, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+               >;
+       };
+
+       uart2_pins: pinmux_uart2 {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_MII1_TX_CLK, PIN_INPUT_PULLUP, MUX_MODE1)     /* mii1_tx_clk.uart2_rxd */
+                       AM33XX_PADCONF(AM335X_PIN_MII1_RX_CLK, PIN_OUTPUT_PULLDOWN, MUX_MODE1)  /* mii1_rx_clk.uart2_txd */
+               >;
+       };
+};
+
+&uart0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_pins>;
+       status = "okay";
+};
+
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart2_pins>;
+       status = "okay";
+};
+
+/* RS485 - UART1 */
+&am33xx_pinmux {
+       uart1_rs485_pins: pinmux_uart1_rs485_pins {
+               pinctrl-single,pins = <
+                       AM33XX_PADCONF(AM335X_PIN_UART1_RXD, PIN_INPUT_PULLUP, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_UART1_TXD, PIN_OUTPUT_PULLDOWN, MUX_MODE0)
+                       AM33XX_PADCONF(AM335X_PIN_UART1_RTSN, PIN_OUTPUT_PULLUP, MUX_MODE0)
+               >;
+       };
+};
+
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart1_rs485_pins>;
+       status = "okay";
+       linux,rs485-enabled-at-boot-time;
+};
+
+/* USB */
+&cppi41dma {
+       status = "okay";
+};
+
+&usb_ctrl_mod {
+       status = "okay";
+};
+
+&usb {
+       status = "okay";
+};
+
+&usb0 {
+       status = "okay";
+};
+
+&usb0_phy {
+       status = "okay";
+};
index 2e04f6df825797ce1bd8dd260a288adc83ed8a26..866b5f0cbfbc4960903ef0be045695e645edfe73 100644 (file)
 #include "am335x-wega.dtsi"
 
 /* SoM */
+&gpmc {
+       status = "okay";
+};
+
 &i2c_eeprom {
        status = "okay";
 };
index 67bde56f89fd3e05aad25171c9846385cb1213a5..61fc4cd2d164e57543ac3ac02fa01daf0d9a0839 100644 (file)
                compatible = "ti,da830-evm-audio";
        };
 
-       regulators {
-               compatible = "simple-bus";
-
-               vcc3v3: fixedregulator1 {
-                       compatible = "regulator-fixed";
-                       regulator-name = "vcc3v3";
-                       regulator-min-microvolt = <3300000>;
-                       regulator-max-microvolt = <3300000>;
-                       regulator-boot-on;
-               };
+       vcc3v3: fixedregulator1 {
+               compatible = "regulator-fixed";
+               regulator-name = "vcc3v3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-boot-on;
        };
 };
 
index 610506723ea5de1c6e0458445085890726fe7ee7..fe0207b88053d3971e851ace3d2c1d10697b3ff4 100644 (file)
                compatible = "arm,versatile-flash", "cfi-flash";
                reg = <0x40000000 0x04000000>;
                bank-width = <4>;
+               partitions {
+                       compatible = "arm,arm-firmware-suite";
+               };
        };
 
        flash1@44000000 {
                compatible = "arm,versatile-flash", "cfi-flash";
                reg = <0x44000000 0x04000000>;
                bank-width = <4>;
+               partitions {
+                       compatible = "arm,arm-firmware-suite";
+               };
        };
 
        /* SMSC LAN91C111 ethernet with PHY and EEPROM */
index cbbb8878daa3a841d9247088c7c713d8bc169b29..2625ce66f8e7e64d45d869f25bd6d0c17a430e9a 100644 (file)
                compatible = "arm,versatile-flash", "cfi-flash";
                reg = <0x30000000 0x4000000>;
                bank-width = <4>;
+               partitions {
+                       compatible = "arm,arm-firmware-suite";
+               };
        };
 
        fpga_flash@38000000 {
                compatible = "arm,versatile-flash", "cfi-flash";
                reg = <0x38000000 0x800000>;
                bank-width = <4>;
+               partitions {
+                       compatible = "arm,arm-firmware-suite";
+               };
        };
 
        /*
index 2015619ca22cdb90f673b3713f5012f1546a8340..c69cf7ddbe614aa091b95f0e44f81e1d0b59fc63 100644 (file)
                compatible = "arm,versatile-flash", "cfi-flash";
                reg = <0x40000000 0x04000000>;
                bank-width = <4>;
+               partitions {
+                       compatible = "arm,arm-firmware-suite";
+               };
        };
 
        flash1@44000000 {
                compatible = "arm,versatile-flash", "cfi-flash";
                reg = <0x44000000 0x04000000>;
                bank-width = <4>;
+               partitions {
+                       compatible = "arm,arm-firmware-suite";
+               };
        };
 
        bridge {
index a81e9c28243219d80c0627e772efc197569da566..09f3f544f3a73eb81e33acce2e0fb4e3c7f5efbf 100644 (file)
                compatible = "arm,versatile-flash", "cfi-flash";
                reg = <0x40000000 0x04000000>;
                bank-width = <4>;
+               partitions {
+                       compatible = "arm,arm-firmware-suite";
+               };
        };
 
        flash1@44000000 {
                compatible = "arm,versatile-flash", "cfi-flash";
                reg = <0x44000000 0x04000000>;
                bank-width = <4>;
+               partitions {
+                       compatible = "arm,arm-firmware-suite";
+               };
        };
 
        /* SMSC 9118 ethernet with PHY and EEPROM */
index 9fd1cb9f499219535d00280c0cd5a1e2875eda94..85e2e9e27a9f367d8e020f80e002c78e37cc8ec7 100644 (file)
                };
        };
 
+       auxdisplay {
+               compatible = "hit,hd44780";
+               data-gpios = <&gpio1 25 GPIO_ACTIVE_HIGH>,
+                               <&gpio1 26 GPIO_ACTIVE_HIGH>,
+                               <&gpio1 27 GPIO_ACTIVE_HIGH>,
+                               <&gpio1 29 GPIO_ACTIVE_HIGH>;
+               enable-gpios = <&gpio1 24 GPIO_ACTIVE_HIGH>;
+               rs-gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>;
+               rw-gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>;
+               backlight-gpios = <&gpio1 21 GPIO_ACTIVE_LOW>;
+               display-height-chars = <2>;
+               display-width-chars = <16>;
+       };
+
        gpio-keys {
                compatible = "gpio-keys";
                pinctrl-0 = <&backup_button_pin
index 43aba4071a5c2c610ebd00f219fec074cb3133f1..d519d307aa2aef3f07c31e22490c864e7b2c82cc 100644 (file)
 &adc {
        status = "okay";
 };
+
+&ehci0 {
+       status = "okay";
+};
+
+&ehci1 {
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/aspeed-bmc-facebook-yamp.dts b/arch/arm/boot/dts/aspeed-bmc-facebook-yamp.dts
new file mode 100644 (file)
index 0000000..4e09a9c
--- /dev/null
@@ -0,0 +1,160 @@
+// SPDX-License-Identifier: GPL-2.0+
+// Copyright (c) 2018 Facebook Inc.
+/dts-v1/;
+
+#include "aspeed-g5.dtsi"
+
+/ {
+       model = "Facebook YAMP 100 BMC";
+       compatible = "facebook,yamp-bmc", "aspeed,ast2500";
+
+       aliases {
+               /*
+                * Override the default uart aliases to avoid breaking
+                * the legacy applications.
+                */
+               serial0 = &uart5;
+               serial1 = &uart1;
+               serial2 = &uart2;
+               serial3 = &uart3;
+       };
+
+       chosen {
+               stdout-path = &uart5;
+               bootargs = "console=ttyS0,9600n8 root=/dev/ram rw";
+       };
+
+       memory@80000000 {
+               reg = <0x80000000 0x20000000>;
+       };
+};
+
+&pinctrl {
+       aspeed,external-nodes = <&gfx &lhc>;
+};
+
+/*
+ * Update reset type to "system" (full chip) to fix warm reboot hang issue
+ * when reset type is set to default ("soc", gated by reset mask registers).
+ */
+&wdt1 {
+       status = "okay";
+       aspeed,reset-type = "system";
+};
+
+/*
+ * wdt2 is not used by Yamp.
+ */
+&wdt2 {
+       status = "disabled";
+};
+
+&fmc {
+       status = "okay";
+       flash@0 {
+               status = "okay";
+               m25p,fast-read;
+               label = "bmc";
+#include "facebook-bmc-flash-layout.dtsi"
+       };
+};
+
+&uart1 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_txd1_default
+                    &pinctrl_rxd1_default>;
+};
+
+&uart2 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_txd2_default
+                    &pinctrl_rxd2_default>;
+};
+
+&uart3 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_txd3_default
+                    &pinctrl_rxd3_default>;
+};
+
+&uart5 {
+       status = "okay";
+};
+
+&mac0 {
+       status = "okay";
+       use-ncsi;
+       no-hw-checksum;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_rmii1_default>;
+};
+
+&i2c0 {
+       status = "okay";
+};
+
+&i2c1 {
+       status = "okay";
+};
+
+&i2c2 {
+       status = "okay";
+
+       i2c-switch@75 {
+               compatible = "nxp,pca9548";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               reg = <0x75>;
+       };
+};
+
+&i2c3 {
+       status = "okay";
+};
+
+&i2c4 {
+       status = "okay";
+};
+
+&i2c5 {
+       status = "okay";
+};
+
+&i2c6 {
+       status = "okay";
+};
+
+&i2c7 {
+       status = "okay";
+};
+
+&i2c8 {
+       status = "okay";
+};
+
+&i2c9 {
+       status = "okay";
+};
+
+&i2c10 {
+       status = "okay";
+};
+
+&i2c11 {
+       status = "okay";
+};
+
+&i2c12 {
+       status = "okay";
+};
+
+&i2c13 {
+       status = "okay";
+};
+
+&vhub {
+       status = "okay";
+};
diff --git a/arch/arm/boot/dts/aspeed-bmc-inspur-fp5280g2.dts b/arch/arm/boot/dts/aspeed-bmc-inspur-fp5280g2.dts
new file mode 100644 (file)
index 0000000..628195b
--- /dev/null
@@ -0,0 +1,846 @@
+// SPDX-License-Identifier: GPL-2.0+
+/dts-v1/;
+#include "aspeed-g5.dtsi"
+#include <dt-bindings/gpio/aspeed-gpio.h>
+#include <dt-bindings/leds/leds-pca955x.h>
+
+/ {
+       model = "FP5280G2 BMC";
+       compatible = "inspur,fp5280g2-bmc", "aspeed,ast2500";
+
+       chosen {
+               stdout-path = &uart5;
+               bootargs = "console=ttyS4,115200 earlyprintk";
+       };
+
+       memory@80000000 {
+               reg = <0x80000000 0x20000000>;
+       };
+
+       reserved-memory {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               vga_memory: framebuffer@9f000000 {
+                       no-map;
+                       reg = <0x9f000000 0x01000000>; /* 16M */
+               };
+
+               flash_memory: region@98000000 {
+                       no-map;
+                       reg = <0x98000000 0x04000000>; /* 64M */
+               };
+
+               coldfire_memory: codefire_memory@9ef00000 {
+                       reg = <0x9ef00000 0x00100000>;
+                       no-map;
+               };
+
+               gfx_memory: framebuffer {
+                       size = <0x01000000>;
+                       alignment = <0x01000000>;
+                       compatible = "shared-dma-pool";
+                       reusable;
+               };
+
+               video_engine_memory: jpegbuffer {
+                       size = <0x02000000>;    /* 32M */
+                       alignment = <0x01000000>;
+                       compatible = "shared-dma-pool";
+                       reusable;
+               };
+       };
+
+       fsi: gpio-fsi {
+               compatible = "aspeed,ast2500-cf-fsi-master", "fsi-master";
+               #address-cells = <2>;
+               #size-cells = <0>;
+               no-gpio-delays;
+
+               memory-region = <&coldfire_memory>;
+               aspeed,sram = <&sram>;
+               aspeed,cvic = <&cvic>;
+
+               clock-gpios = <&gpio ASPEED_GPIO(AA, 0) GPIO_ACTIVE_HIGH>;
+               data-gpios = <&gpio ASPEED_GPIO(AA, 2) GPIO_ACTIVE_HIGH>;
+               mux-gpios = <&gpio ASPEED_GPIO(I, 2) GPIO_ACTIVE_HIGH>;
+               enable-gpios = <&gpio ASPEED_GPIO(I, 3) GPIO_ACTIVE_HIGH>;
+               trans-gpios = <&gpio ASPEED_GPIO(R, 2) GPIO_ACTIVE_HIGH>;
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               checkstop {
+                       label = "checkstop";
+                       gpios = <&gpio ASPEED_GPIO(B, 3) GPIO_ACTIVE_LOW>;
+                       linux,code = <ASPEED_GPIO(B, 3)>;
+               };
+
+               ps0-presence {
+                       label = "ps0-presence";
+                       gpios = <&gpio ASPEED_GPIO(F, 0) GPIO_ACTIVE_LOW>;
+                       linux,code = <ASPEED_GPIO(F, 0)>;
+               };
+
+               ps1-presence {
+                       label = "ps1-presence";
+                       gpios = <&gpio ASPEED_GPIO(F, 1) GPIO_ACTIVE_LOW>;
+                       linux,code = <ASPEED_GPIO(F, 1)>;
+               };
+
+       };
+
+       gpio-keys-polled {
+               compatible = "gpio-keys-polled";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               poll-interval = <1000>;
+
+               fan0-presence {
+                       label = "fan0-presence";
+                       gpios = <&pca1 0 GPIO_ACTIVE_LOW>;
+                       linux,code = <1>;
+               };
+
+               fan1-presence {
+                       label = "fan1-presence";
+                       gpios = <&pca1 1 GPIO_ACTIVE_LOW>;
+                       linux,code = <2>;
+               };
+
+               fan2-presence {
+                       label = "fan2-presence";
+                       gpios = <&pca1 2 GPIO_ACTIVE_LOW>;
+                       linux,code = <3>;
+               };
+
+               fan3-presence {
+                       label = "fan3-presence";
+                       gpios = <&pca1 3 GPIO_ACTIVE_LOW>;
+                       linux,code = <4>;
+               };
+
+               fan4-presence {
+                       label = "fan4-presence";
+                       gpios = <&pca1 4 GPIO_ACTIVE_LOW>;
+                       linux,code = <5>;
+               };
+
+               fan5-presence {
+                       label = "fan5-presence";
+                       gpios = <&pca1 5 GPIO_ACTIVE_LOW>;
+                       linux,code = <6>;
+               };
+
+               fan6-presence {
+                       label = "fan6-presence";
+                       gpios = <&pca1 6 GPIO_ACTIVE_LOW>;
+                       linux,code = <7>;
+               };
+
+               fan7-presence {
+                       label = "fan7-presence";
+                       gpios = <&pca1 7 GPIO_ACTIVE_LOW>;
+                       linux,code = <8>;
+               };
+       };
+
+       leds {
+           compatible = "gpio-leds";
+
+           power {
+                   label = "power";
+                   /* TODO: dummy gpio */
+                   gpios = <&gpio ASPEED_GPIO(R, 1) GPIO_ACTIVE_LOW>;
+           };
+
+       };
+
+       iio-hwmon-battery {
+               compatible = "iio-hwmon";
+               io-channels = <&adc 15>;
+       };
+
+       iio-hwmon {
+               compatible = "iio-hwmon";
+               io-channels = <&adc 0>, <&adc 1>, <&adc 2>, <&adc 3>, <&adc 4>,
+                       <&adc 5>, <&adc 6>, <&adc 7>, <&adc 8>, <&adc 9>,
+                       <&adc 10>, <&adc 11>, <&adc 12>, <&adc 13>, <&adc 14>;
+       };
+
+};
+
+&fmc {
+       status = "okay";
+
+       flash@0 {
+               status = "okay";
+               label = "bmc";
+               m25p,fast-read;
+               spi-max-frequency = <50000000>;
+#include "openbmc-flash-layout.dtsi"
+       };
+};
+
+&spi1 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_spi1_default>;
+
+       flash@0 {
+               status = "okay";
+               label = "pnor";
+               m25p,fast-read;
+               spi-max-frequency = <100000000>;
+       };
+};
+
+&uart1 {
+       /* Rear RS-232 connector */
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_txd1_default
+                       &pinctrl_rxd1_default
+                       &pinctrl_nrts1_default
+                       &pinctrl_ndtr1_default
+                       &pinctrl_ndsr1_default
+                       &pinctrl_ncts1_default
+                       &pinctrl_ndcd1_default
+                       &pinctrl_nri1_default>;
+};
+
+&uart2 {
+       /* Test Point */
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_txd2_default &pinctrl_rxd2_default>;
+};
+
+&uart3 {
+       /* APSS */
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_txd3_default &pinctrl_rxd3_default>;
+};
+
+&uart5 {
+       status = "okay";
+};
+
+&lpc_ctrl {
+       status = "okay";
+       memory-region = <&flash_memory>;
+       flash = <&spi1>;
+};
+
+&mac0 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_rmii1_default>;
+       use-ncsi;
+};
+
+&mac1 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_rgmii2_default &pinctrl_mdio2_default>;
+};
+
+&i2c0 {
+       /* LCD */
+       status = "okay";
+};
+
+&i2c1 {
+       status = "okay";
+
+       eeprom@50 {
+               compatible = "atmel,24c256";
+               reg = <0x50>;
+               label = "fru";
+       };
+
+};
+
+&i2c2 {
+       status = "okay";
+
+       tmp112@48 {
+               compatible = "ti,tmp112";
+               reg = <0x48>;
+               label = "inlet";
+       };
+
+       tmp112@49 {
+               compatible = "ti,tmp112";
+               reg = <0x49>;
+               label = "outlet";
+       };
+
+       i2c-switch@70 {
+               compatible = "nxp,pca9546";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               i2c@0 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0>;
+
+                       tmp112@4a {
+                               compatible = "ti,tmp112";
+                               reg = <0x4a>;
+                               label = "psu_inlet";
+                       };
+
+               };
+
+               i2c@1 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <1>;
+
+                       tmp112@4a {
+                               compatible = "ti,tmp112";
+                               reg = <0x4a>;
+                               label = "ocp_zone";
+                       };
+               };
+
+               i2c@2 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <2>;
+
+                       tmp112@4a {
+                               compatible = "ti,tmp112";
+                               reg = <0x4a>;
+                               label = "bmc_zone";
+                       };
+               };
+
+               i2c@3 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <3>;
+
+                       tmp112@7c {
+                               compatible = "microchip,emc1413";
+                               reg = <0x7c>;
+                       };
+               };
+
+       };
+};
+
+&i2c3 {
+       /* Riser Card */
+       status = "okay";
+};
+
+&i2c4 {
+       status = "okay";
+
+       rtc@68 {
+               compatible = "dallas,ds3232";
+               reg = <0x68>;
+       };
+};
+
+&i2c5 {
+       /* vr  */
+       status = "okay";
+};
+
+&i2c6 {
+       /* bp card */
+       status = "okay";
+};
+
+&i2c7 {
+       status = "okay";
+
+       i2c-switch@70 {
+               compatible = "nxp,pca9546";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               i2c@0 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0>;
+
+                       adm1278@10 {
+                               compatible = "adi,adm1278";
+                               reg = <0x10>;
+                       };
+
+                       adm1278@13 {
+                               compatible = "adi,adm1278";
+                               reg = <0x13>;
+                       };
+
+                       adm1278@50 {
+                               compatible = "adi,adm1278";
+                               reg = <0x50>;
+                       };
+
+                       adm1278@53 {
+                               compatible = "adi,adm1278";
+                               reg = <0x53>;
+                       };
+
+               };
+
+               /*pcie riser*/
+
+       };
+};
+
+&i2c8 {
+       status = "okay";
+
+       pca0: pca9555@20 {
+               compatible = "nxp,pca9555";
+               reg = <0x20>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               gpio@0 {
+                       reg = <0>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@1 {
+                       reg = <1>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               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>;
+               };
+
+       };
+
+       pca1: pca9555@21 {
+               compatible = "nxp,pca9555";
+               reg = <0x21>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               gpio@0 {
+                       reg = <0>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@1 {
+                       reg = <1>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               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>;
+               };
+       };
+
+       pca2: pca9555@22 {
+               compatible = "nxp,pca9555";
+               reg = <0x22>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               gpio@0 {
+                       reg = <0>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@1 {
+                       reg = <1>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               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>;
+               };
+       };
+
+       pca3: pca9555@23 {
+               compatible = "nxp,pca9555";
+               reg = <0x23>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               gpio@0 {
+                       reg = <0>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@1 {
+                       reg = <1>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               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>;
+               };
+       };
+
+       pca4: pca9555@24 {
+               compatible = "nxp,pca9555";
+               reg = <0x24>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               gpio@0 {
+                       reg = <0>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@1 {
+                       reg = <1>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               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>;
+               };
+       };
+
+       pca5: pca9555@25 {
+               compatible = "nxp,pca9555";
+               reg = <0x25>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               gpio@0 {
+                       reg = <0>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@1 {
+                       reg = <1>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               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>;
+               };
+       };
+
+};
+
+&i2c9 {
+       /* cpld */
+       status = "okay";
+};
+
+&i2c10 {
+       /* hdd bp */
+       status = "okay";
+};
+
+&i2c11 {
+       status = "okay";
+
+       power-supply@58 {
+               compatible = "pmbus";
+               reg = <0x58>;
+       };
+
+       power-supply@5a {
+               compatible = "pmbus";
+               reg = <0x5a>;
+       };
+};
+
+&i2c12 {
+       /* odcc */
+       status = "okay";
+};
+
+&vuart {
+       status = "okay";
+};
+
+&gfx {
+       status = "okay";
+       memory-region = <&gfx_memory>;
+};
+
+&pinctrl {
+       aspeed,external-nodes = <&gfx &lhc>;
+};
+
+&gpio {
+       pin_gpio_b7 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(B,7) GPIO_ACTIVE_LOW>;
+               output-high;
+               line-name = "BMC_INIT_OK";
+       };
+};
+
+&wdt1 {
+       aspeed,reset-type = "none";
+       aspeed,external-signal;
+       aspeed,ext-push-pull;
+       aspeed,ext-active-high;
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_wdtrst1_default>;
+};
+
+&ibt {
+       status = "okay";
+
+};
+
+&adc {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_adc0_default &pinctrl_adc1_default
+        &pinctrl_adc2_default &pinctrl_adc3_default &pinctrl_adc4_default
+        &pinctrl_adc5_default &pinctrl_adc6_default &pinctrl_adc7_default
+        &pinctrl_adc8_default &pinctrl_adc9_default &pinctrl_adc10_default
+        &pinctrl_adc11_default &pinctrl_adc12_default &pinctrl_adc13_default
+        &pinctrl_adc14_default &pinctrl_adc15_default>;
+};
+
+&vhub {
+       status = "okay";
+};
+
+&video {
+       status = "okay";
+       memory-region = <&video_engine_memory>;
+};
+
+&pwm_tacho {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_pwm0_default &pinctrl_pwm1_default
+               &pinctrl_pwm2_default &pinctrl_pwm3_default
+               &pinctrl_pwm4_default &pinctrl_pwm5_default
+               &pinctrl_pwm6_default &pinctrl_pwm7_default>;
+
+       fan@0 {
+               reg = <0x00>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x00 0x01>;
+       };
+
+       fan@1 {
+               reg = <0x01>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x02 0x03>;
+       };
+
+       fan@2 {
+               reg = <0x02>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x04 0x05>;
+       };
+
+       fan@3 {
+               reg = <0x03>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x06 0x07>;
+       };
+
+       fan@4 {
+               reg = <0x04>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x08 0x09>;
+       };
+
+       fan@5 {
+               reg = <0x05>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x0a 0x0b>;
+       };
+
+       fan@6 {
+               reg = <0x06>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x0c 0x0d>;
+       };
+
+       fan@7 {
+               reg = <0x07>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x0e 0x0f>;
+       };
+
+};
+
+#include "ibm-power9-dual.dtsi"
diff --git a/arch/arm/boot/dts/aspeed-bmc-lenovo-hr630.dts b/arch/arm/boot/dts/aspeed-bmc-lenovo-hr630.dts
new file mode 100644 (file)
index 0000000..d3695a3
--- /dev/null
@@ -0,0 +1,566 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Device Tree file for Lenovo Hr630 platform
+ *
+ * Copyright (C) 2019-present Lenovo
+ */
+
+/dts-v1/;
+
+#include "aspeed-g5.dtsi"
+#include <dt-bindings/gpio/aspeed-gpio.h>
+
+/ {
+       model = "HR630 BMC";
+       compatible = "lenovo,hr630-bmc", "aspeed,ast2500";
+
+       aliases {
+               i2c14 = &i2c_rbp;
+               i2c15 = &i2c_fbp1;
+               i2c16 = &i2c_fbp2;
+               i2c17 = &i2c_fbp3;
+               i2c18 = &i2c_riser2;
+               i2c19 = &i2c_pcie4;
+               i2c20 = &i2c_riser1;
+               i2c21 = &i2c_ocp;
+       };
+
+       chosen {
+               stdout-path = &uart5;
+               bootargs = "console=tty0 console=ttyS4,115200 earlyprintk";
+       };
+
+       memory@80000000 {
+               device_type = "memory";
+               reg = <0x80000000 0x20000000>;
+       };
+
+       reserved-memory {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               flash_memory: region@98000000 {
+                       no-map;
+                       reg = <0x98000000 0x00100000>; /* 1M */
+               };
+
+               gfx_memory: framebuffer {
+                       size = <0x01000000>;
+                       alignment = <0x01000000>;
+                       compatible = "shared-dma-pool";
+                       reusable;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               heartbeat {
+                       gpios = <&gpio ASPEED_GPIO(J, 1) GPIO_ACTIVE_LOW>;
+               };
+
+               fault {
+                       gpios = <&gpio ASPEED_GPIO(J, 0) GPIO_ACTIVE_LOW>;
+               };
+       };
+
+       iio-hwmon {
+               compatible = "iio-hwmon";
+               io-channels = <&adc 0>, <&adc 1>, <&adc 2>, <&adc 3>,
+               <&adc 4>, <&adc 5>, <&adc 6>, <&adc 7>,
+               <&adc 8>, <&adc 9>, <&adc 10>,
+               <&adc 12>, <&adc 13>, <&adc 14>;
+       };
+
+};
+
+&fmc {
+       status = "okay";
+       flash@0 {
+               status = "okay";
+               m25p,fast-read;
+               label = "bmc";
+               spi-max-frequency = <50000000>;
+#include "openbmc-flash-layout.dtsi"
+       };
+};
+
+&lpc_ctrl {
+       status = "okay";
+       memory-region = <&flash_memory>;
+       flash = <&spi1>;
+};
+
+&uart1 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_txd1_default
+                       &pinctrl_rxd1_default>;
+};
+
+&uart2 {
+       /* Rear RS-232 connector */
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_txd2_default
+                       &pinctrl_rxd2_default
+                       &pinctrl_nrts2_default
+                       &pinctrl_ndtr2_default
+                       &pinctrl_ndsr2_default
+                       &pinctrl_ncts2_default
+                       &pinctrl_ndcd2_default
+                       &pinctrl_nri2_default>;
+};
+
+&uart3 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_txd3_default
+                       &pinctrl_rxd3_default>;
+};
+
+&uart5 {
+       status = "okay";
+};
+
+&ibt {
+       status = "okay";
+};
+
+&mac0 {
+       status = "okay";
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_rmii1_default>;
+       use-ncsi;
+};
+
+&mac1 {
+       status = "okay";
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_rgmii2_default &pinctrl_mdio2_default>;
+};
+
+&adc {
+       status = "okay";
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_adc0_default
+                       &pinctrl_adc1_default
+                       &pinctrl_adc2_default
+                       &pinctrl_adc3_default
+                       &pinctrl_adc4_default
+                       &pinctrl_adc5_default
+                       &pinctrl_adc6_default
+                       &pinctrl_adc7_default
+                       &pinctrl_adc8_default
+                       &pinctrl_adc9_default
+                       &pinctrl_adc10_default
+                       &pinctrl_adc12_default
+                       &pinctrl_adc13_default
+                       &pinctrl_adc14_default>;
+};
+
+&i2c0 {
+       status = "okay";
+       /* temp1 inlet */
+       tmp75@4e {
+               compatible = "national,lm75";
+               reg = <0x4e>;
+       };
+};
+
+&i2c1 {
+       status = "okay";
+       /* temp2 outlet */
+       tmp75@4d {
+               compatible = "national,lm75";
+               reg = <0x4d>;
+       };
+};
+
+&i2c2 {
+       status = "okay";
+};
+
+&i2c3 {
+       status = "okay";
+};
+
+&i2c4 {
+       status = "okay";
+};
+
+&i2c5 {
+       status = "okay";
+};
+
+&i2c6 {
+       status = "okay";
+       /*      Slot 0,
+        *      Slot 1,
+        *      Slot 2,
+        *      Slot 3
+        */
+
+       i2c-switch@70 {
+               compatible = "nxp,pca9545";
+               reg = <0x70>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               i2c-mux-idle-disconnect;        /* may use mux@70 next. */
+
+               i2c_rbp: i2c@0 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0>;
+               };
+
+               i2c_fbp1: i2c@1 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <1>;
+               };
+
+               i2c_fbp2: i2c@2 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <2>;
+               };
+
+               i2c_fbp3: i2c@3 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <3>;
+               };
+       };
+};
+
+&i2c7 {
+       status = "okay";
+
+       /*      Slot 0,
+        *      Slot 1,
+        *      Slot 2,
+        *      Slot 3
+        */
+       i2c-switch@76 {
+               compatible = "nxp,pca9546";
+               reg = <0x76>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               i2c-mux-idle-disconnect;  /* may use mux@76 next. */
+
+               i2c_riser2: i2c@0 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0>;
+               };
+
+               i2c_pcie4: i2c@1 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <1>;
+               };
+
+               i2c_riser1: i2c@2 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <2>;
+               };
+
+               i2c_ocp: i2c@3 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <3>;
+               };
+       };
+};
+
+&i2c8 {
+       status = "okay";
+
+       eeprom@57 {
+               compatible = "atmel,24c256";
+               reg = <0x57>;
+               pagesize = <16>;
+       };
+};
+
+&i2c9 {
+       status = "okay";
+};
+
+&i2c10 {
+       status = "okay";
+};
+
+&i2c11 {
+       status = "okay";
+};
+
+&i2c12 {
+       status = "okay";
+};
+
+&ehci1 {
+       status = "okay";
+};
+
+&uhci {
+       status = "okay";
+};
+
+&gfx {
+       status = "okay";
+       memory-region = <&gfx_memory>;
+};
+
+&pwm_tacho {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_pwm0_default
+       &pinctrl_pwm1_default
+       &pinctrl_pwm2_default
+       &pinctrl_pwm3_default
+       &pinctrl_pwm4_default
+       &pinctrl_pwm5_default
+       &pinctrl_pwm6_default>;
+
+       fan@0 {
+               reg = <0x00>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x00>;
+       };
+
+       fan@1 {
+               reg = <0x00>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x01>;
+       };
+
+       fan@2 {
+               reg = <0x01>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x02>;
+       };
+
+       fan@3 {
+               reg = <0x01>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x03>;
+       };
+
+       fan@4 {
+               reg = <0x02>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x04>;
+       };
+
+       fan@5 {
+               reg = <0x02>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x05>;
+       };
+
+       fan@6 {
+               reg = <0x03>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x06>;
+       };
+
+       fan@7 {
+               reg = <0x03>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x07>;
+       };
+
+       fan@8 {
+               reg = <0x04>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x08>;
+       };
+
+       fan@9 {
+               reg = <0x04>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x09>;
+       };
+
+       fan@10 {
+               reg = <0x05>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x0a>;
+       };
+
+       fan@11 {
+               reg = <0x05>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x0b>;
+       };
+
+       fan@12 {
+               reg = <0x06>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x0c>;
+       };
+
+       fan@13 {
+               reg = <0x06>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x0d>;
+       };
+};
+
+&gpio {
+
+       pin_gpio_b5 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(B, 5) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "IRQ_BMC_PCH_SMI_LPC_N";
+       };
+
+       pin_gpio_f0 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(F, 0) GPIO_ACTIVE_HIGH>;
+               output-low;
+               line-name = "IRQ_BMC_PCH_NMI_R";
+       };
+
+       pin_gpio_f3 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(F, 3) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "I2C_BUS0_RST_OUT_N";
+       };
+
+       pin_gpio_f4 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(F, 4) GPIO_ACTIVE_HIGH>;
+               output-low;
+               line-name = "FM_SKT0_FAULT_LED";
+       };
+
+       pin_gpio_f5 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(F, 5) GPIO_ACTIVE_HIGH>;
+               output-low;
+               line-name = "FM_SKT1_FAULT_LED";
+       };
+
+       pin_gpio_g4 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(G, 4) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "FAN_PWR_CTL_N";
+       };
+
+       pin_gpio_g7 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(G, 7) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "RST_BMC_PCIE_I2CMUX_N";
+       };
+
+       pin_gpio_h2 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(H, 2) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "PSU1_FFS_N_R";
+       };
+
+       pin_gpio_h3 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(H, 3) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "PSU2_FFS_N_R";
+       };
+
+       pin_gpio_i3 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(I, 3) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "BMC_INTRUDED_COVER";
+       };
+
+       pin_gpio_j2 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(J, 2) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "BMC_BIOS_UPDATE_N";
+       };
+
+       pin_gpio_j3 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(J, 3) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "RST_BMC_HDD_I2CMUX_N";
+       };
+
+       pin_gpio_s2 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(S, 2) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "BMC_VGA_SW";
+       };
+
+       pin_gpio_s4 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(S, 4) GPIO_ACTIVE_HIGH>;
+               output;
+               line-name = "VBAT_EN_N";
+       };
+
+       pin_gpio_s6 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(S, 6) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "PU_BMC_GPIOS6";
+       };
+
+       pin_gpio_y0 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(Y, 0) GPIO_ACTIVE_HIGH>;
+               output-low;
+               line-name = "BMC_NCSI_MUX_CTL_S0";
+       };
+
+       pin_gpio_y1 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(Y, 1) GPIO_ACTIVE_HIGH>;
+               output-low;
+               line-name = "BMC_NCSI_MUX_CTL_S1";
+       };
+
+       pin_gpio_z0 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(Z, 0) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "I2C_RISER2_INT_N";
+       };
+
+       pin_gpio_z2 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(Z, 2) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "I2C_RISER2_RESET_N";
+       };
+
+       pin_gpio_z3 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(Z, 3) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "FM_BMC_PCH_SCI_LPC_N";
+       };
+
+       pin_gpio_z7 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(Z, 7) GPIO_ACTIVE_HIGH>;
+               output-low;
+               line-name = "BMC_POST_CMPLT_N";
+       };
+
+       pin_gpio_aa0 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(AA, 0) GPIO_ACTIVE_HIGH>;
+               output-low;
+               line-name = "HOST_BMC_USB_SEL";
+       };
+
+       pin_gpio_aa5 {
+               gpio-hog;
+               gpios = <ASPEED_GPIO(AA, 5) GPIO_ACTIVE_HIGH>;
+               output-high;
+               line-name = "I2C_BUS1_RST_OUT_N";
+       };
+
+};
diff --git a/arch/arm/boot/dts/aspeed-bmc-microsoft-olympus.dts b/arch/arm/boot/dts/aspeed-bmc-microsoft-olympus.dts
new file mode 100644 (file)
index 0000000..7331991
--- /dev/null
@@ -0,0 +1,207 @@
+//SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+#include "aspeed-g4.dtsi"
+#include <dt-bindings/gpio/aspeed-gpio.h>
+
+/ {
+       model = "Olympus BMC";
+       compatible = "microsoft,olympus-bmc", "aspeed,ast2400";
+
+       chosen {
+               stdout-path = &uart5;
+               bootargs = "console=ttyS4,115200 earlyprintk";
+       };
+
+       memory@40000000 {
+               reg = <0x40000000 0x20000000>;
+       };
+
+       reserved-memory {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               vga_memory: framebuffer@5f000000 {
+                       no-map;
+                       reg = <0x5f000000 0x01000000>; /* 16M */
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               bmc_heartbeat {
+                       gpios = <&gpio ASPEED_GPIO(B, 0) GPIO_ACTIVE_LOW>;
+               };
+
+               power_green {
+                       gpios = <&gpio ASPEED_GPIO(U, 2) GPIO_ACTIVE_HIGH>;
+               };
+
+               power_amber {
+                       gpios = <&gpio ASPEED_GPIO(U, 3) GPIO_ACTIVE_HIGH>;
+               };
+
+               identify {
+                       gpios = <&gpio ASPEED_GPIO(Q, 5) GPIO_ACTIVE_LOW>;
+               };
+
+               fault {
+                       gpios = <&gpio ASPEED_GPIO(A, 1) GPIO_ACTIVE_LOW>;
+               };
+       };
+
+
+       iio-hwmon {
+               compatible = "iio-hwmon";
+               io-channels = <&adc 0>, <&adc 1>, <&adc 2>, <&adc 3>,
+               <&adc 4>, <&adc 5>, <&adc 6>, <&adc 7>;
+       };
+};
+
+&adc {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 =    <&pinctrl_adc0_default
+                       &pinctrl_adc1_default
+                       &pinctrl_adc2_default
+                       &pinctrl_adc3_default
+                       &pinctrl_adc4_default
+                       &pinctrl_adc5_default
+                       &pinctrl_adc6_default
+                       &pinctrl_adc7_default>;
+};
+
+&fmc {
+       status = "okay";
+
+       flash@0 {
+               status = "okay";
+               m25p,fast-read;
+               label = "bmc";
+#include "openbmc-flash-layout.dtsi"
+       };
+};
+
+&spi {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_spi1_default>;
+
+       flash@0 {
+               status = "okay";
+               m25p,fast-read;
+               label = "pnor";
+       };
+};
+
+&uart5 {
+       status = "okay";
+};
+
+&mac0 {
+       status = "okay";
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_rgmii1_default &pinctrl_mdio1_default>;
+};
+
+&i2c0 {
+       status = "okay";
+};
+
+&i2c1 {
+       status = "okay";
+
+       tmp421@4c {
+               compatible = "ti,tmp421";
+               reg = <0x4c>;
+       };
+};
+
+&i2c2 {
+       status = "okay";
+};
+
+&i2c3 {
+       status = "okay";
+};
+
+&i2c4 {
+       status = "okay";
+       clock-frequency = <100000>;
+};
+
+&i2c5 {
+       status = "okay";
+};
+
+&i2c6 {
+       status = "okay";
+
+       tmp421@4c {
+               compatible = "ti,tmp421";
+               reg = <0x4c>;
+       };
+};
+
+&i2c7 {
+       status = "okay";
+};
+
+&vuart {
+       status = "okay";
+};
+
+&wdt2 {
+       status = "okay";
+};
+
+&lpc_ctrl {
+       status = "okay";
+};
+
+&pwm_tacho {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 =    <&pinctrl_pwm0_default
+                       &pinctrl_pwm1_default
+                       &pinctrl_pwm2_default
+                       &pinctrl_pwm3_default
+                       &pinctrl_pwm4_default
+                       &pinctrl_pwm5_default
+                       &pinctrl_pwm6_default>;
+
+       fan@0 {
+               reg = <0x00>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x00>;
+       };
+
+       fan@1 {
+               reg = <0x01>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x01>;
+       };
+
+       fan@2 {
+               reg = <0x02>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x02>;
+       };
+
+       fan@3 {
+               reg = <0x03>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x03>;
+       };
+
+       fan@4 {
+               reg = <0x04>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x04>;
+       };
+
+       fan@5 {
+               reg = <0x05>;
+               aspeed,fan-tach-ch = /bits/ 8 <0x05>;
+       };
+
+};
index 024e52a6cd0f8f8e781c7f62a7811cecf8e5d7b6..de95112e2a04f110ad41b92670b6adf2b300a1cf 100644 (file)
 &adc {
        status = "okay";
 };
+
+#include "ibm-power9-dual.dtsi"
index b249da80fb83e56fe4182f188059c140611d3b62..b0cb34ccb1356ec54359cfdf3bf62644f07b3ebf 100644 (file)
                line-name = "BMC_TPM_INT_N";
        };
 };
+
+&fsi {
+       cfam@0,0 {
+               reg = <0 0>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               chip-id = <0>;
+
+               scom@1000 {
+                       compatible = "ibm,fsi2pib";
+                       reg = <0x1000 0x400>;
+               };
+
+               fsi_hub0: hub@3400 {
+                       compatible = "ibm,fsi-master-hub";
+                       reg = <0x3400 0x400>;
+                       #address-cells = <2>;
+                       #size-cells = <0>;
+                       no-scan-on-init;
+               };
+       };
+};
index 418a1988b262a43466e4fd227c6b20b28b271750..9628ecb879cf53d59004432ff84581f6a26efa8f 100644 (file)
                        compatible = "shared-dma-pool";
                        reusable;
                };
+
+               video_engine_memory: jpegbuffer {
+                       size = <0x02000000>;    /* 32M */
+                       alignment = <0x01000000>;
+                       compatible = "shared-dma-pool";
+                       reusable;
+               };
        };
 
        leds {
 &adc {
        status = "okay";
 };
+
+&video {
+       status = "okay";
+       memory-region = <&video_engine_memory>;
+};
+
+#include "ibm-power9-dual.dtsi"
diff --git a/arch/arm/boot/dts/aspeed-bmc-opp-swift.dts b/arch/arm/boot/dts/aspeed-bmc-opp-swift.dts
new file mode 100644 (file)
index 0000000..caac895
--- /dev/null
@@ -0,0 +1,966 @@
+// SPDX-License-Identifier: GPL-2.0+
+/dts-v1/;
+#include "aspeed-g5.dtsi"
+#include <dt-bindings/gpio/aspeed-gpio.h>
+#include <dt-bindings/leds/leds-pca955x.h>
+
+/ {
+       model = "Swift BMC";
+       compatible = "ibm,swift-bmc", "aspeed,ast2500";
+
+       chosen {
+               stdout-path = &uart5;
+               bootargs = "console=ttyS4,115200 earlyprintk";
+       };
+
+       memory@80000000 {
+               reg = <0x80000000 0x20000000>;
+       };
+
+       reserved-memory {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               flash_memory: region@98000000 {
+                       no-map;
+                       reg = <0x98000000 0x04000000>; /* 64M */
+               };
+
+               gfx_memory: framebuffer {
+                       size = <0x01000000>;
+                       alignment = <0x01000000>;
+                       compatible = "shared-dma-pool";
+                       reusable;
+               };
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               air-water {
+                       label = "air-water";
+                       gpios = <&gpio ASPEED_GPIO(B, 5) GPIO_ACTIVE_LOW>;
+                       linux,code = <ASPEED_GPIO(B, 5)>;
+               };
+
+               checkstop {
+                       label = "checkstop";
+                       gpios = <&gpio ASPEED_GPIO(J, 2) GPIO_ACTIVE_LOW>;
+                       linux,code = <ASPEED_GPIO(J, 2)>;
+               };
+
+               ps0-presence {
+                       label = "ps0-presence";
+                       gpios = <&gpio ASPEED_GPIO(R, 7) GPIO_ACTIVE_LOW>;
+                       linux,code = <ASPEED_GPIO(R, 7)>;
+               };
+
+               ps1-presence {
+                       label = "ps1-presence";
+                       gpios = <&gpio ASPEED_GPIO(N, 0) GPIO_ACTIVE_LOW>;
+                       linux,code = <ASPEED_GPIO(N, 0)>;
+               };
+
+               oppanel-presence {
+                       label = "oppanel-presence";
+                       gpios = <&gpio ASPEED_GPIO(A, 7) GPIO_ACTIVE_LOW>;
+                       linux,code = <ASPEED_GPIO(A, 7)>;
+               };
+
+               opencapi-riser-presence {
+                       label = "opencapi-riser-presence";
+                       gpios = <&gpio ASPEED_GPIO(I, 0) GPIO_ACTIVE_LOW>;
+                       linux,code = <ASPEED_GPIO(I, 0)>;
+               };
+       };
+
+       iio-hwmon-battery {
+               compatible = "iio-hwmon";
+               io-channels = <&adc 12>;
+       };
+
+       gpio-keys-polled {
+               compatible = "gpio-keys-polled";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               poll-interval = <1000>;
+
+               scm0-presence {
+                       label = "scm0-presence";
+                       gpios = <&pca9552 6 GPIO_ACTIVE_LOW>;
+                       linux,code = <6>;
+               };
+
+               scm1-presence {
+                       label = "scm1-presence";
+                       gpios = <&pca9552 7 GPIO_ACTIVE_LOW>;
+                       linux,code = <7>;
+               };
+
+               cpu0vrm-presence {
+                       label = "cpu0vrm-presence";
+                       gpios = <&pca9552 12 GPIO_ACTIVE_LOW>;
+                       linux,code = <12>;
+               };
+
+               cpu1vrm-presence {
+                       label = "cpu1vrm-presence";
+                       gpios = <&pca9552 13 GPIO_ACTIVE_LOW>;
+                       linux,code = <13>;
+               };
+
+               fan0-presence {
+                       label = "fan0-presence";
+                       gpios = <&pca0 5 GPIO_ACTIVE_LOW>;
+                       linux,code = <5>;
+               };
+
+               fan1-presence {
+                       label = "fan1-presence";
+                       gpios = <&pca0 6 GPIO_ACTIVE_LOW>;
+                       linux,code = <6>;
+               };
+
+               fan2-presence {
+                       label = "fan2-presence";
+                       gpios = <&pca0 7 GPIO_ACTIVE_LOW>;
+                       linux,code = <7>;
+               };
+
+               fan3-presence {
+                       label = "fan3-presence";
+                       gpios = <&pca0 8 GPIO_ACTIVE_LOW>;
+                       linux,code = <8>;
+               };
+
+               fanboost-presence {
+                       label = "fanboost-presence";
+                       gpios = <&pca0 9 GPIO_ACTIVE_LOW>;
+                       linux,code = <9>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               fan0 {
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       gpios = <&pca0 0 GPIO_ACTIVE_LOW>;
+               };
+
+               fan1 {
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       gpios = <&pca0 1 GPIO_ACTIVE_LOW>;
+               };
+
+               fan2 {
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       gpios = <&pca0 2 GPIO_ACTIVE_LOW>;
+               };
+
+               fan3 {
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       gpios = <&pca0 3 GPIO_ACTIVE_LOW>;
+               };
+
+               fanboost {
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       gpios = <&pca0 4 GPIO_ACTIVE_LOW>;
+               };
+
+               front-fault {
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       gpios = <&pca1 2 GPIO_ACTIVE_LOW>;
+               };
+
+               front-power {
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       gpios = <&pca1 3 GPIO_ACTIVE_LOW>;
+               };
+
+               front-id {
+                       retain-state-shutdown;
+                       default-state = "keep";
+                       gpios = <&pca1 0 GPIO_ACTIVE_LOW>;
+               };
+
+               rear-fault {
+                       gpios = <&gpio ASPEED_GPIO(N, 2) GPIO_ACTIVE_LOW>;
+               };
+
+               rear-id {
+                       gpios = <&gpio ASPEED_GPIO(N, 4) GPIO_ACTIVE_LOW>;
+               };
+       };
+
+       fsi: gpio-fsi {
+               compatible = "fsi-master-gpio", "fsi-master";
+               #address-cells = <2>;
+               #size-cells = <0>;
+               no-gpio-delays;
+
+               clock-gpios = <&gpio ASPEED_GPIO(AA, 0) GPIO_ACTIVE_HIGH>;
+               data-gpios = <&gpio ASPEED_GPIO(E, 0) GPIO_ACTIVE_HIGH>;
+               mux-gpios = <&gpio ASPEED_GPIO(P, 4) GPIO_ACTIVE_HIGH>;
+               enable-gpios = <&gpio ASPEED_GPIO(P, 0) GPIO_ACTIVE_HIGH>;
+               trans-gpios = <&gpio ASPEED_GPIO(P, 3) GPIO_ACTIVE_HIGH>;
+       };
+
+       iio-hwmon-dps310 {
+               compatible = "iio-hwmon";
+               io-channels = <&dps 0>;
+       };
+
+};
+
+&fmc {
+       status = "okay";
+
+       flash@0 {
+               status = "okay";
+               label = "bmc";
+               m25p,fast-read;
+               spi-max-frequency = <100000000>;
+               partitions {
+                       #address-cells = < 1 >;
+                       #size-cells = < 1 >;
+                       compatible = "fixed-partitions";
+                       u-boot@0 {
+                               reg = < 0 0x60000 >;
+                               label = "u-boot";
+                       };
+                       u-boot-env@60000 {
+                               reg = < 0x60000 0x20000 >;
+                               label = "u-boot-env";
+                       };
+                       obmc-ubi@80000 {
+                               reg = < 0x80000 0x7F80000>;
+                               label = "obmc-ubi";
+                       };
+               };
+       };
+
+       flash@1 {
+               status = "okay";
+               label = "alt-bmc";
+               m25p,fast-read;
+               spi-max-frequency = <100000000>;
+               partitions {
+                       #address-cells = < 1 >;
+                       #size-cells = < 1 >;
+                       compatible = "fixed-partitions";
+                       u-boot@0 {
+                               reg = < 0 0x60000 >;
+                               label = "alt-u-boot";
+                       };
+                       u-boot-env@60000 {
+                               reg = < 0x60000 0x20000 >;
+                               label = "alt-u-boot-env";
+                       };
+                       obmc-ubi@80000 {
+                               reg = < 0x80000 0x7F80000>;
+                               label = "alt-obmc-ubi";
+                       };
+               };
+       };
+};
+
+&spi1 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_spi1_default>;
+
+       flash@0 {
+               status = "okay";
+               label = "pnor";
+               m25p,fast-read;
+               spi-max-frequency = <100000000>;
+       };
+};
+
+&uart1 {
+       /* Rear RS-232 connector */
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_txd1_default
+                       &pinctrl_rxd1_default
+                       &pinctrl_nrts1_default
+                       &pinctrl_ndtr1_default
+                       &pinctrl_ndsr1_default
+                       &pinctrl_ncts1_default
+                       &pinctrl_ndcd1_default
+                       &pinctrl_nri1_default>;
+};
+
+&uart2 {
+       /* APSS */
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_txd2_default &pinctrl_rxd2_default>;
+};
+
+&uart5 {
+       status = "okay";
+};
+
+&lpc_ctrl {
+       status = "okay";
+       memory-region = <&flash_memory>;
+       flash = <&spi1>;
+};
+
+&mac0 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_rmii1_default>;
+       use-ncsi;
+};
+
+&i2c2 {
+       status = "okay";
+
+       /* MUX ->
+        *    Samtec 1
+        *    Samtec 2
+        */
+};
+
+&i2c3 {
+       status = "okay";
+
+       max31785@52 {
+               compatible = "maxim,max31785a";
+               reg = <0x52>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               fan@0 {
+                       compatible = "pmbus-fan";
+                       reg = <0>;
+                       tach-pulses = <2>;
+                       maxim,fan-rotor-input = "tach";
+                       maxim,fan-pwm-freq = <25000>;
+                       maxim,fan-no-watchdog;
+                       maxim,fan-no-fault-ramp;
+                       maxim,fan-ramp = <2>;
+                       maxim,fan-fault-pin-mon;
+               };
+
+               fan@1 {
+                       compatible = "pmbus-fan";
+                       reg = <1>;
+                       tach-pulses = <2>;
+                       maxim,fan-rotor-input = "tach";
+                       maxim,fan-pwm-freq = <25000>;
+                       maxim,fan-no-watchdog;
+                       maxim,fan-no-fault-ramp;
+                       maxim,fan-ramp = <2>;
+                       maxim,fan-fault-pin-mon;
+               };
+
+               fan@2 {
+                       compatible = "pmbus-fan";
+                       reg = <2>;
+                       tach-pulses = <2>;
+                       maxim,fan-rotor-input = "tach";
+                       maxim,fan-pwm-freq = <25000>;
+                       maxim,fan-no-watchdog;
+                       maxim,fan-no-fault-ramp;
+                       maxim,fan-ramp = <2>;
+                       maxim,fan-fault-pin-mon;
+               };
+
+               fan@3 {
+                       compatible = "pmbus-fan";
+                       reg = <3>;
+                       tach-pulses = <2>;
+                       maxim,fan-rotor-input = "tach";
+                       maxim,fan-pwm-freq = <25000>;
+                       maxim,fan-no-watchdog;
+                       maxim,fan-no-fault-ramp;
+                       maxim,fan-ramp = <2>;
+                       maxim,fan-fault-pin-mon;
+               };
+
+               fan@4 {
+                       compatible = "pmbus-fan";
+                       reg = <4>;
+                       tach-pulses = <2>;
+                       maxim,fan-rotor-input = "tach";
+                       maxim,fan-pwm-freq = <25000>;
+                       maxim,fan-no-watchdog;
+                       maxim,fan-no-fault-ramp;
+                       maxim,fan-ramp = <2>;
+                       maxim,fan-fault-pin-mon;
+               };
+       };
+
+       pca0: pca9552@60 {
+               compatible = "nxp,pca9552";
+               reg = <0x60>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               gpio@0 {
+                       reg = <0>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@1 {
+                       reg = <1>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               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>;
+               };
+
+               gpio@8 {
+                       reg = <8>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@9 {
+                       reg = <9>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@10 {
+                       reg = <10>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@11 {
+                       reg = <11>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               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>;
+               };
+       };
+
+       power-supply@68 {
+               compatible = "ibm,cffps1";
+               reg = <0x68>;
+       };
+
+       eeprom@50 {
+               compatible = "atmel,24c64";
+               reg = <0x50>;
+       };
+
+       power-supply@69 {
+               compatible = "ibm,cffps1";
+               reg = <0x69>;
+       };
+
+       eeprom@51 {
+               compatible = "atmel,24c64";
+               reg = <0x51>;
+       };
+};
+
+&i2c7 {
+       status = "okay";
+
+       dps: dps310@76 {
+               compatible = "infineon,dps310";
+               reg = <0x76>;
+               #io-channel-cells = <0>;
+       };
+
+       tmp275@48 {
+               compatible = "ti,tmp275";
+               reg = <0x48>;
+       };
+
+       si7021a20@20 {
+               compatible = "si,si7021a20";
+               reg = <0x20>;
+       };
+
+       eeprom@50 {
+               compatible = "atmel,24c64";
+               reg = <0x50>;
+       };
+
+       pca1: pca9551@60 {
+               compatible = "nxp,pca9551";
+               reg = <0x60>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               gpio@0 {
+                       reg = <0>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@1 {
+                       reg = <1>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               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>;
+               };
+       };
+};
+
+&i2c8 {
+       status = "okay";
+
+       pca9552: pca9552@60 {
+               compatible = "nxp,pca9552";
+               reg = <0x60>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               gpio-line-names = "PS_SMBUS_RESET_N", "APSS_RESET_N",
+                       "GPU0_TH_OVERT_N_BUFF", "GPU1_TH_OVERT_N_BUFF",
+                       "GPU2_TH_OVERT_N_BUFF", "GPU3_TH_OVERT_N_BUFF",
+                       "P9_SCM0_PRES", "P9_SCM1_PRES",
+                       "GPU0_PWR_GOOD_BUFF", "GPU1_PWR_GOOD_BUFF",
+                       "GPU2_PWR_GOOD_BUFF", "GPU3_PWR_GOOD_BUFF",
+                       "PRESENT_VRM_CP0_N", "PRESENT_VRM_CP1_N",
+                       "12V_BREAKER_FLT_N", "THROTTLE_UNLATCHED_N";
+
+               gpio@0 {
+                       reg = <0>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@1 {
+                       reg = <1>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               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>;
+               };
+
+               gpio@8 {
+                       reg = <8>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@9 {
+                       reg = <9>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@10 {
+                       reg = <10>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               gpio@11 {
+                       reg = <11>;
+                       type = <PCA955X_TYPE_GPIO>;
+               };
+
+               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>;
+               };
+       };
+
+       rtc@32 {
+               compatible = "epson,rx8900";
+               reg = <0x32>;
+       };
+
+       eeprom@51 {
+               compatible = "atmel,24c64";
+               reg = <0x51>;
+       };
+
+       ucd90160@64 {
+               compatible = "ti,ucd90160";
+               reg = <0x64>;
+       };
+};
+
+&i2c9 {
+       status = "okay";
+
+       eeprom@50 {
+               compatible = "atmel,24c64";
+               reg = <0x50>;
+       };
+
+       tmp423a@4c {
+               compatible = "ti,tmp423";
+               reg = <0x4c>;
+       };
+
+       ir35221@71 {
+               compatible = "infineon,ir35221";
+               reg = <0x71>;
+       };
+
+       ir35221@72 {
+               compatible = "infineon,ir35221";
+               reg = <0x72>;
+       };
+
+       pca2: pca9539@74 {
+               compatible = "nxp,pca9539";
+               reg = <0x74>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               gpio@0 {
+                       reg = <0>;
+               };
+
+               gpio@1 {
+                       reg = <1>;
+               };
+
+               gpio@2 {
+                       reg = <2>;
+               };
+
+               gpio@3 {
+                       reg = <3>;
+               };
+
+               gpio@4 {
+                       reg = <4>;
+               };
+
+               gpio@5 {
+                       reg = <5>;
+               };
+
+               gpio@6 {
+                       reg = <6>;
+               };
+
+               gpio@7 {
+                       reg = <7>;
+               };
+
+               gpio@8 {
+                       reg = <8>;
+               };
+
+               gpio@9 {
+                       reg = <9>;
+               };
+
+               gpio@10 {
+                       reg = <10>;
+               };
+
+               gpio@11 {
+                       reg = <11>;
+               };
+
+               gpio@12 {
+                       reg = <12>;
+               };
+
+               gpio@13 {
+                       reg = <13>;
+               };
+
+               gpio@14 {
+                       reg = <14>;
+               };
+
+               gpio@15 {
+                       reg = <15>;
+               };
+       };
+};
+
+&i2c10 {
+       status = "okay";
+
+       eeprom@50 {
+               compatible = "atmel,24c64";
+               reg = <0x50>;
+       };
+
+       tmp423a@4c {
+               compatible = "ti,tmp423";
+               reg = <0x4c>;
+       };
+
+       ir35221@71 {
+               compatible = "infineon,ir35221";
+               reg = <0x71>;
+       };
+
+       ir35221@72 {
+               compatible = "infineon,ir35221";
+               reg = <0x72>;
+       };
+
+       pca3: pca9539@74 {
+               compatible = "nxp,pca9539";
+               reg = <0x74>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               gpio@0 {
+                       reg = <0>;
+               };
+
+               gpio@1 {
+                       reg = <1>;
+               };
+
+               gpio@2 {
+                       reg = <2>;
+               };
+
+               gpio@3 {
+                       reg = <3>;
+               };
+
+               gpio@4 {
+                       reg = <4>;
+               };
+
+               gpio@5 {
+                       reg = <5>;
+               };
+
+               gpio@6 {
+                       reg = <6>;
+               };
+
+               gpio@7 {
+                       reg = <7>;
+               };
+
+               gpio@8 {
+                       reg = <8>;
+               };
+
+               gpio@9 {
+                       reg = <9>;
+               };
+
+               gpio@10 {
+                       reg = <10>;
+               };
+
+               gpio@11 {
+                       reg = <11>;
+               };
+
+               gpio@12 {
+                       reg = <12>;
+               };
+
+               gpio@13 {
+                       reg = <13>;
+               };
+
+               gpio@14 {
+                       reg = <14>;
+               };
+
+               gpio@15 {
+                       reg = <15>;
+               };
+       };
+};
+
+&i2c11 {
+       /* MUX
+        *   -> PCIe Slot 0
+        *   -> PCIe Slot 1
+        *   -> PCIe Slot 2
+        *   -> PCIe Slot 3
+        */
+       status = "okay";
+};
+
+&i2c12 {
+       status = "okay";
+
+       tmp275@48 {
+               compatible = "ti,tmp275";
+               reg = <0x48>;
+       };
+
+       tmp275@4a {
+               compatible = "ti,tmp275";
+               reg = <0x4a>;
+       };
+};
+
+&i2c13 {
+       status = "okay";
+};
+
+&vuart {
+       status = "okay";
+};
+
+&gfx {
+       status = "okay";
+       memory-region = <&gfx_memory>;
+};
+
+&pinctrl {
+       aspeed,external-nodes = <&gfx &lhc>;
+};
+
+&wdt1 {
+       aspeed,reset-type = "none";
+       aspeed,external-signal;
+       aspeed,ext-push-pull;
+       aspeed,ext-active-high;
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_wdtrst1_default>;
+};
+
+&wdt2 {
+       aspeed,alt-boot;
+};
+
+&ibt {
+       status = "okay";
+};
+
+&adc {
+       status = "okay";
+};
+
+#include "ibm-power9-dual.dtsi"
diff --git a/arch/arm/boot/dts/aspeed-bmc-opp-vesnin.dts b/arch/arm/boot/dts/aspeed-bmc-opp-vesnin.dts
new file mode 100644 (file)
index 0000000..0b9e29c
--- /dev/null
@@ -0,0 +1,224 @@
+// SPDX-License-Identifier: GPL-2.0+
+// Copyright 2019 YADRO
+/dts-v1/;
+
+#include "aspeed-g4.dtsi"
+#include <dt-bindings/gpio/aspeed-gpio.h>
+
+/ {
+       model = "Vesnin BMC";
+       compatible = "yadro,vesnin-bmc", "aspeed,ast2400";
+
+       chosen {
+               stdout-path = &uart5;
+               bootargs = "console=ttyS4,115200 earlyprintk";
+       };
+
+       memory {
+               reg = <0x40000000 0x20000000>;
+       };
+
+       reserved-memory {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               vga_memory: framebuffer@5f000000 {
+                       no-map;
+                       reg = <0x5f000000 0x01000000>; /* 16MB */
+               };
+               flash_memory: region@5c000000 {
+                       no-map;
+                       reg = <0x5c000000 0x02000000>; /* 32M */
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               heartbeat {
+                       gpios = <&gpio ASPEED_GPIO(R, 4) GPIO_ACTIVE_LOW>;
+               };
+               power_red {
+                       gpios = <&gpio ASPEED_GPIO(N, 1) GPIO_ACTIVE_LOW>;
+               };
+
+               id_blue {
+                       gpios = <&gpio ASPEED_GPIO(O, 0) GPIO_ACTIVE_LOW>;
+               };
+
+               alarm_red {
+                       gpios = <&gpio ASPEED_GPIO(N, 6) GPIO_ACTIVE_LOW>;
+               };
+
+               alarm_yel {
+                       gpios = <&gpio ASPEED_GPIO(N, 7) GPIO_ACTIVE_HIGH>;
+               };
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               button_checkstop {
+                       label = "checkstop";
+                       linux,code = <74>;
+                       gpios = <&gpio ASPEED_GPIO(P, 5) GPIO_ACTIVE_LOW>;
+               };
+
+               button_identify {
+                       label = "identify";
+                       linux,code = <152>;
+                       gpios = <&gpio ASPEED_GPIO(O, 7) GPIO_ACTIVE_LOW>;
+               };
+       };
+};
+
+&fmc {
+       status = "okay";
+       flash@0 {
+               status = "okay";
+               m25p,fast-read;
+        label = "bmc";
+#include "openbmc-flash-layout.dtsi"
+       };
+};
+
+&spi {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_spi1debug_default>;
+
+       flash@0 {
+               status = "okay";
+               label = "pnor";
+               m25p,fast-read;
+       };
+};
+
+&mac0 {
+       status = "okay";
+
+       use-ncsi;
+       no-hw-checksum;
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_rmii1_default>;
+};
+
+
+&uart5 {
+       status = "okay";
+};
+
+&lpc_ctrl {
+       status = "okay";
+       memory-region = <&flash_memory>;
+       flash = <&spi>;
+};
+
+&ibt {
+       status = "okay";
+};
+
+&uart3 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_txd2_default &pinctrl_rxd2_default>;
+};
+
+&i2c0 {
+       status = "okay";
+
+       eeprom@50 {
+               compatible = "atmel,24c256";
+               reg = <0x50>;
+               pagesize = <64>;
+       };
+};
+
+&i2c1 {
+       status = "okay";
+
+       tmp75@49 {
+               compatible = "ti,tmp75";
+               reg = <0x49>;
+       };
+};
+
+&i2c2 {
+       status = "okay";
+};
+
+&i2c3 {
+       status = "okay";
+};
+
+&i2c4 {
+       status = "okay";
+
+       occ-hwmon@50 {
+               compatible = "ibm,p8-occ-hwmon";
+               reg = <0x50>;
+       };
+};
+
+&i2c5 {
+       status = "okay";
+
+       occ-hwmon@51 {
+               compatible = "ibm,p8-occ-hwmon";
+               reg = <0x51>;
+       };
+};
+
+&i2c6 {
+       status = "okay";
+
+       w83795g@2f {
+               compatible = "nuvoton,w83795g";
+               reg = <0x2f>;
+       };
+};
+
+&i2c7 {
+       status = "okay";
+
+       occ-hwmon@56 {
+               compatible = "ibm,p8-occ-hwmon";
+               reg = <0x56>;
+       };
+};
+
+&i2c9 {
+       status = "okay";
+};
+
+&i2c10 {
+       status = "okay";
+};
+
+&i2c11 {
+       status = "okay";
+
+       occ-hwmon@57 {
+               compatible = "ibm,p8-occ-hwmon";
+               reg = <0x57>;
+       };
+};
+
+&i2c12 {
+       status = "okay";
+
+       rtc@68 {
+               compatible = "maxim,ds3231";
+               reg = <0x68>;
+       };
+};
+
+&i2c13 {
+       status = "okay";
+};
+
+&vuart {
+       status = "okay";
+};
index f1356ca794d8b866cfa41e1d362095c42df2c8ce..31ea34e14c79a2016d7582e2e46e591e0f77d2ae 100644 (file)
                        compatible = "shared-dma-pool";
                        reusable;
                };
+
+               video_engine_memory: jpegbuffer {
+                       size = <0x02000000>;    /* 32MM */
+                       alignment = <0x01000000>;
+                       compatible = "shared-dma-pool";
+                       reusable;
+               };
        };
 
        gpio-keys {
 &vhub {
        status = "okay";
 };
+
+&video {
+       status = "okay";
+       memory-region = <&video_engine_memory>;
+};
+
+#include "ibm-power9-dual.dtsi"
index 2c5aa90a546d7f99e811a2fbd6da567d8c757af1..30624378316dad4415b00efc93372ccc6d14a896 100644 (file)
@@ -7,6 +7,14 @@
        model = "Zaius BMC";
        compatible = "ingrasys,zaius-bmc", "aspeed,ast2500";
 
+       aliases {
+               i2c15 = &i2cpcie0;
+               i2c16 = &i2cpcie1;
+               i2c17 = &i2cpcie2;
+               i2c19 = &i2cpcie3;
+               i2c20 = &i2cpcie4;
+       };
+
        chosen {
                stdout-path = &uart5;
                bootargs = "console=ttyS4,115200 earlyprintk";
                reg = <0x71>;
                #address-cells = <1>;
                #size-cells = <0>;
+
+               i2cpcie0: i2c@0 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0>;
+               };
+               i2cpcie1: i2c@1 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <1>;
+               };
+               i2cpcie2: i2c@2 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <2>;
+               };
+               i2ctpm: i2c@3 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <3>;
+               };
        };
 
        /* MUX1 PCA9546A @71h
                reg = <0x71>;
                #address-cells = <1>;
                #size-cells = <0>;
+
+               i2cpcie3: i2c@0 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0>;
+               };
+               i2cpcie4: i2c@1 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <1>;
+               };
        };
 
        /* MUX1 PCA9546A @71h
                                reg = <0x54>;
                        };
                };
+
+       };
+
+       vrm@64 {
+               compatible = "isil,isl68137";
+               reg = <0x64>;
+       };
+
+       vrm@40 {
+               compatible = "isil,isl68137";
+               reg = <0x40>;
+       };
+
+       vrm@60 {
+               compatible = "isil,isl68137";
+               reg = <0x60>;
+       };
+
+       vrm@43 {
+               compatible = "infineon,ir38064";
+               reg = <0x43>;
+       };
+
+       vrm@41 {
+               compatible = "isil,isl68137";
+               reg = <0x41>;
        };
 
        /* Master selector PCA9541A @70h (other master: CPU0)
         *   LM5066I PMBUS @10h
         */
 
-       /* 12V Quarter Brick DC/DC Converter Q54SJ12050 @61h */
-       power-brick@61 {
+       /*
+        * Brick will be one of these types/addresses.  Depending
+        * on the board SKU only one is actually present and will successfully
+        * instantiate while the others will fail the probe operation.
+        * These are the PVT (and presumably beyond) addresses:
+        *    12V Quarter Brick DC/DC Converter Q54SJ12050 @6Ah
+        *    12V Quarter Brick DC/DC Converter Q54SH12050 @30h
+        */
+       power-brick@6a {
+               compatible = "delta,dps800";
+               reg = <0x6a>;
+       };
+       power-brick@30 {
                compatible = "delta,dps800";
-               reg = <0x61>;
+               reg = <0x30>;
        };
 
        /* CPU0 VR ISL68137 0.7V, 0.96V PMBUS @64h */
        /* CPU0 VR ISL68137 1.2V CH03 PMBUS @40h */
        /* CPU0 VR ISL68137 0.8V PMBUS @60h */
-       /* CPU0 VR 1.0V IR38064 I2C @11h, PMBUS @41h */
+       /* CPU0 VR 1.0V IR38064 I2C @11h, PMBUS @43h */
        /* CPU0 VR ISL68137 1.2V CH47 PMBUS @41h */
+       /* Master selector PCA9541A @70h (other master: CPU0)
+        *   LM5066I PMBUS @10h
+        */
 };
 
 &i2c8 {
        status = "okay";
 
-       /* CPU1 VR ISL68137 0.7V, 0.96V PMBUS @65h */
-       /* CPU1 VR ISL68137 1.2V CH03 PMBUS @44h */
-       /* CPU1 VR ISL68137 0.8V PMBUS @61h */
+       vrm@64 {
+               compatible = "isil,isl68137";
+               reg = <0x64>;
+       };
+
+       vrm@40 {
+               compatible = "isil,isl68137";
+               reg = <0x40>;
+       };
+
+       vrm@41 {
+               compatible = "isil,isl68137";
+               reg = <0x41>;
+       };
+
+       vrm@42 {
+               compatible = "infineon,ir38064";
+               reg = <0x42>;
+       };
+
+       vrm@60 {
+               compatible = "isil,isl68137";
+               reg = <0x60>;
+       };
+
+       /* CPU1 VR ISL68137 0.7V, 0.96V PMBUS @64h */
+       /* CPU1 VR ISL68137 1.2V CH03 PMBUS @40h */
+       /* CPU1 VR ISL68137 1.2V CH47 PMBUS @41h */
        /* CPU1 VR 1.0V IR38064 I2C @12h, PMBUS @42h */
-       /* CPU0 VR ISL68137 1.2V CH47 PMBUS @45h */
+       /* CPU1 VR ISL68137 0.8V PMBUS @60h */
 };
 
 
 &ibt {
        status = "okay";
 };
+
+#include "ibm-power9-dual.dtsi"
index 0d7c6339da4657cd45b907bf936cb088af76c982..a68ff0675c28a05e1ed266da769625754f7cb656 100644 (file)
                        &pinctrl_ddcclk_default &pinctrl_ddcdat_default>;
 };
 
+&p2a {
+       status = "okay";
+       memory-region = <&vga_memory>;
+};
+
 &ibt {
        status = "okay";
 };
index 5d7050d00874299b5b264b2732eaf333342b2874..dd4b0b15afcfdc114305931bed0a9757595acf68 100644 (file)
@@ -53,7 +53,7 @@
                #size-cells = <1>;
                ranges;
 
-               fmc: flash-controller@1e620000 {
+               fmc: spi@1e620000 {
                        reg = < 0x1e620000 0x94
                                0x20000000 0x10000000 >;
                        #address-cells = <1>;
@@ -69,7 +69,7 @@
                        };
                };
 
-               spi: flash-controller@1e630000 {
+               spi: spi@1e630000 {
                        reg = < 0x1e630000 0x18
                                0x30000000 0x10000000 >;
                        #address-cells = <1>;
                                        compatible = "aspeed,g4-pinctrl";
                                };
 
+                               p2a: p2a-control {
+                                       compatible = "aspeed,ast2400-p2a-ctrl";
+                                       status = "disabled";
+                               };
                        };
 
                        rng: hwrng@1e6e2078 {
index 4345c3153ca74cf73b2703b9aa0a87fc3f0005f3..5b1ca265c2ce487c57aa6171ade5ff413f1ef8b4 100644 (file)
@@ -60,7 +60,7 @@
                #size-cells = <1>;
                ranges;
 
-               fmc: flash-controller@1e620000 {
+               fmc: spi@1e620000 {
                        reg = < 0x1e620000 0xc4
                                0x20000000 0x10000000 >;
                        #address-cells = <1>;
@@ -86,7 +86,7 @@
                        };
                };
 
-               spi1: flash-controller@1e630000 {
+               spi1: spi@1e630000 {
                        reg = < 0x1e630000 0xc4
                                0x30000000 0x08000000 >;
                        #address-cells = <1>;
                        };
                };
 
-               spi2: flash-controller@1e631000 {
+               spi2: spi@1e631000 {
                        reg = < 0x1e631000 0xc4
                                0x38000000 0x08000000 >;
                        #address-cells = <1>;
                                        aspeed,external-nodes = <&gfx &lhc>;
 
                                };
+
+                               p2a: p2a-control {
+                                       compatible = "aspeed,ast2500-p2a-ctrl";
+                                       status = "disabled";
+                               };
                        };
 
                        rng: hwrng@1e6e2078 {
index 85692c8ef2b174d174cdf5970d68a7ce635b3089..4ed8500a5cb8e659af17af99ac265bd821e7bde3 100644 (file)
@@ -42,7 +42,7 @@
        clock-frequency = <12000000>;
 };
 
-&slow_osc {
+&clk32k {
        atmel,osc-bypass;
 };
 
index 1fa84d2f06c79e048612758eb5de9d880cf30ad3..7debdeabcf2f7f7f71396bf7714260bff1aba4fb 100644 (file)
        chosen {
                bootargs = "rootfstype=ubifs ubi.mtd=5 root=ubi0:rootfs rw";
                stdout-path = "serial0:115200n8";
-
-               clocksource {
-                       timer = <&timer0>;
-               };
-
-               clockevent {
-                       timer = <&timer1>;
-               };
        };
 
        memory {
index 9483609a2105dbbcbe4fb564861fb4035194d251..691c95ea61754d7bef410c4aa954b9d836442a81 100644 (file)
                                };
                        };
 
-                       sckc@fffffd50 {
+                       clk32k: sckc@fffffd50 {
                                compatible = "atmel,at91sam9x5-sckc";
                                reg = <0xfffffd50 0x4>;
-
-                               slow_osc: slow_osc {
-                                       compatible = "atmel,at91sam9x5-clk-slow-osc";
-                                       #clock-cells = <0>;
-                                       atmel,startup-time-usec = <1200000>;
-                                       clocks = <&slow_xtal>;
-                               };
-
-                               slow_rc_osc: slow_rc_osc {
-                                       compatible = "atmel,at91sam9x5-clk-slow-rc-osc";
-                                       #clock-cells = <0>;
-                                       atmel,startup-time-usec = <75>;
-                                       clock-frequency = <32768>;
-                                       clock-accuracy = <50000000>;
-                               };
-
-                               clk32k: slck {
-                                       compatible = "atmel,at91sam9x5-clk-slow";
-                                       #clock-cells = <0>;
-                                       clocks = <&slow_rc_osc &slow_osc>;
-                               };
+                               clocks = <&slow_xtal>;
+                               #clock-cells = <0>;
                        };
 
                        rtc@fffffd20 {
index e2d38ce43442999de42e3e54235b5359cc06949a..8643b7151565044db4c38ee74928fcf94de09e25 100644 (file)
                                status = "disabled";
                        };
 
-                       sckc@fffffd50 {
+                       clk32k: sckc@fffffd50 {
                                compatible = "atmel,at91sam9x5-sckc";
                                reg = <0xfffffd50 0x4>;
-
-                               slow_osc: slow_osc {
-                                       compatible = "atmel,at91sam9x5-clk-slow-osc";
-                                       #clock-cells = <0>;
-                                       atmel,startup-time-usec = <1200000>;
-                                       clocks = <&slow_xtal>;
-                               };
-
-                               slow_rc_osc: slow_rc_osc {
-                                       compatible = "atmel,at91sam9x5-clk-slow-rc-osc";
-                                       #clock-cells = <0>;
-                                       atmel,startup-time-usec = <75>;
-                                       clock-frequency = <32768>;
-                                       clock-accuracy = <50000000>;
-                               };
-
-                               clk32k: slck {
-                                       compatible = "atmel,at91sam9x5-clk-slow";
-                                       #clock-cells = <0>;
-                                       clocks = <&slow_rc_osc &slow_osc>;
-                               };
+                               clocks = <&slow_xtal>;
+                               #clock-cells = <0>;
                        };
 
                        rtc@fffffd20 {
index 9b7ce6bb1ddc31c6d856534a34d7d4edafe570e1..ef47c005ef034c2194ec9266212ef30322aa9e8d 100644 (file)
                                clocks = <&pmc PMC_TYPE_CORE PMC_MCK>;
                        };
 
-                       sckc@fffffe50 {
+                       clk32k: sckc@fffffe50 {
                                compatible = "atmel,at91sam9x5-sckc";
                                reg = <0xfffffe50 0x4>;
-
-                               slow_osc: slow_osc {
-                                       compatible = "atmel,at91sam9x5-clk-slow-osc";
-                                       #clock-cells = <0>;
-                                       clocks = <&slow_xtal>;
-                               };
-
-                               slow_rc_osc: slow_rc_osc {
-                                       compatible = "atmel,at91sam9x5-clk-slow-rc-osc";
-                                       #clock-cells = <0>;
-                                       clock-frequency = <32768>;
-                                       clock-accuracy = <50000000>;
-                               };
-
-                               clk32k: slck {
-                                       compatible = "atmel,at91sam9x5-clk-slow";
-                                       #clock-cells = <0>;
-                                       clocks = <&slow_rc_osc>, <&slow_osc>;
-                               };
+                               clocks = <&slow_xtal>;
+                               #clock-cells = <0>;
                        };
 
                        tcb0: timer@f8008000 {
index 80b6ba4ca50c96757b7bf25983e236147cc84ca8..52f91a12a99aa20a0dd1b2021e26cf4cd0f1ea9e 100644 (file)
@@ -42,7 +42,7 @@ clocks {
        };
 
        /* Cygnus ARM PLL */
-       armpll: armpll {
+       armpll: armpll@19000000 {
                #clock-cells = <0>;
                compatible = "brcm,cygnus-armpll";
                clocks = <&osc>;
@@ -67,7 +67,7 @@ clocks {
                clock-mult = <1>;
        };
 
-       genpll: genpll {
+       genpll: genpll@301d000 {
                #clock-cells = <1>;
                compatible = "brcm,cygnus-genpll";
                reg = <0x0301d000 0x2c>, <0x0301c020 0x4>;
@@ -94,7 +94,7 @@ clocks {
                clock-mult = <1>;
        };
 
-       lcpll0: lcpll0 {
+       lcpll0: lcpll0@301d02c {
                #clock-cells = <1>;
                compatible = "brcm,cygnus-lcpll0";
                reg = <0x0301d02c 0x1c>, <0x0301c020 0x4>;
@@ -103,7 +103,7 @@ clocks {
                                     "usb_phy", "smart_card", "ch5";
        };
 
-       mipipll: mipipll {
+       mipipll: mipipll@180a9800 {
                #clock-cells = <1>;
                compatible = "brcm,cygnus-mipipll";
                reg = <0x180a9800 0x2c>, <0x0301c020 0x4>, <0x180aa024 0x4>;
@@ -113,7 +113,7 @@ clocks {
                                     "ch5_unused";
        };
 
-       asiu_clks: asiu_clks {
+       asiu_clks: asiu_clks@301d048 {
                #clock-cells = <1>;
                compatible = "brcm,cygnus-asiu-clk";
                reg = <0x0301d048 0xc>, <0x180aa024 0x4>;
@@ -122,7 +122,7 @@ clocks {
                clock-output-names = "keypad", "adc/touch", "pwm";
        };
 
-       audiopll: audiopll {
+       audiopll: audiopll@180aeb00 {
                #clock-cells = <1>;
                compatible = "brcm,cygnus-audiopll";
                reg = <0x180aeb00 0x68>;
index 5f7b46503a51b2518e6eb7c2a733d16d528225f7..2dac3efc7640595c352037485ebd89bfde7cff76 100644 (file)
@@ -45,7 +45,7 @@
                ethernet0 = &eth0;
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0 0>;
        };
@@ -69,7 +69,7 @@
                interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
        };
 
-       core {
+       core@19000000 {
                compatible = "simple-bus";
                ranges = <0x00000000 0x19000000 0x1000000>;
                #address-cells = <1>;
@@ -91,7 +91,7 @@
                              <0x20100 0x100>;
                };
 
-               L2: l2-cache {
+               L2: l2-cache@22000 {
                        compatible = "arm,pl310-cache";
                        reg = <0x22000 0x1000>;
                        cache-unified;
index 6925b30c22539d9bb24d931cb81df0ed818e8f28..da6d70f09ef19b4dd480c5d98b4b8b73cc80d1dc 100644 (file)
@@ -77,7 +77,7 @@
                interrupt-affinity = <&cpu0>, <&cpu1>;
        };
 
-       mpcore {
+       mpcore@19000000 {
                compatible = "simple-bus";
                ranges = <0x00000000 0x19000000 0x00023000>;
                #address-cells = <1>;
                              <0x20100 0x100>;
                };
 
-               L2: l2-cache {
+               L2: l2-cache@22000 {
                        compatible = "arm,pl310-cache";
                        reg = <0x22000 0x1000>;
                        cache-unified;
                };
        };
 
-       axi {
+       axi@18000000 {
                compatible = "simple-bus";
                ranges = <0x00000000 0x18000000 0x0011c40c>;
                #address-cells = <1>;
                                          "imp_sleep_timer_p5",
                                          "imp_sleep_timer_p7",
                                          "imp_sleep_timer_p8";
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-
                        status = "disabled";
 
                        /* ports are defined in board DTS */
index b99c2e5796228b777353c05215d085613e01f822..6197e7d80e3bc5ff6554dc2aaf06d8e8bc64a9d7 100644 (file)
                reg-io-width = <4>;
        };
 
-       L2: l2-cache {
+       L2: l2-cache@3ff20000 {
                compatible = "brcm,bcm11351-a2-pl310-cache";
                reg = <0x3ff20000 0x1000>;
                cache-unified;
                #size-cells = <1>;
                ranges;
 
-               root_ccu: root_ccu {
+               root_ccu: root_ccu@35001000 {
                        compatible = "brcm,bcm11351-root-ccu";
                        reg = <0x35001000 0x0f00>;
                        #clock-cells = <1>;
                        clock-output-names = "frac_1m";
                };
 
-               hub_ccu: hub_ccu {
+               hub_ccu: hub_ccu@34000000 {
                        compatible = "brcm,bcm11351-hub-ccu";
                        reg = <0x34000000 0x0f00>;
                        #clock-cells = <1>;
                        clock-output-names = "tmon_1m";
                };
 
-               aon_ccu: aon_ccu {
+               aon_ccu: aon_ccu@35002000 {
                        compatible = "brcm,bcm11351-aon-ccu";
                        reg = <0x35002000 0x0f00>;
                        #clock-cells = <1>;
                                             "pmu_bsc_var";
                };
 
-               master_ccu: master_ccu {
+               master_ccu: master_ccu@3f001000 {
                        compatible = "brcm,bcm11351-master-ccu";
                        reg = <0x3f001000 0x0f00>;
                        #clock-cells = <1>;
                                             "hsic2_12m";
                };
 
-               slave_ccu: slave_ccu {
+               slave_ccu: slave_ccu@3e011000 {
                        compatible = "brcm,bcm11351-slave-ccu";
                        reg = <0x3e011000 0x0f00>;
                        #clock-cells = <1>;
index 8b045cfab64b3b7fb7cd773b74331536c14304f3..be468f4adc377a1740b8b98c458da1941a0701d2 100644 (file)
@@ -21,7 +21,7 @@
        model = "BCM21664 Garnet board";
        compatible = "brcm,bcm21664-garnet", "brcm,bcm21664";
 
-       memory {
+       memory@80000000 {
                device_type = "memory";
                reg = <0x80000000 0x40000000>; /* 1 GB */
        };
index 758daa334148352224324b365e8698bacd5bc23c..3cf66faf3b56833d775a813f4e8257ce64890955 100644 (file)
@@ -90,7 +90,7 @@
                reg-io-width = <4>;
        };
 
-       L2: l2-cache {
+       L2: l2-cache@3ff20000 {
                compatible = "arm,pl310-cache";
                reg = <0x3ff20000 0x1000>;
                cache-unified;
                        clock-frequency = <156000000>;
                };
 
-               root_ccu: root_ccu {
+               root_ccu: root_ccu@35001000 {
                        compatible = BCM21664_DT_ROOT_CCU_COMPAT;
                        reg = <0x35001000 0x0f00>;
                        #clock-cells = <1>;
                        clock-output-names = "frac_1m";
                };
 
-               aon_ccu: aon_ccu {
+               aon_ccu: aon_ccu@35002000 {
                        compatible = BCM21664_DT_AON_CCU_COMPAT;
                        reg = <0x35002000 0x0f00>;
                        #clock-cells = <1>;
                        clock-output-names = "hub_timer";
                };
 
-               master_ccu: master_ccu {
+               master_ccu: master_ccu@3f001000 {
                        compatible = BCM21664_DT_MASTER_CCU_COMPAT;
                        reg = <0x3f001000 0x0f00>;
                        #clock-cells = <1>;
                                             "sdio4_sleep";
                };
 
-               slave_ccu: slave_ccu {
+               slave_ccu: slave_ccu@3e011000 {
                        compatible = BCM21664_DT_SLAVE_CCU_COMPAT;
                        reg = <0x3e011000 0x0f00>;
                        #clock-cells = <1>;
index 1c66b15f3013c3f356abc4797774a2389a66df4f..ace77709f468bb543568ea9bd30a3a9f6ebe6b7a 100644 (file)
@@ -45,7 +45,7 @@
                bootargs = "console=ttyS0,115200n8";
        };
 
-       memory {
+       memory@80000000 {
                device_type = "memory";
                reg = <0x80000000 0x20000000>; /* 512 MB */
        };
index 701198f5f498397e0025dfdaa9a707835d590f91..a36c9b1d23c8eb6cc7633df18be6b32fa35838b9 100644 (file)
                        clock-frequency = <156000000>;
                };
 
-               root_ccu: root_ccu {
+               root_ccu: root_ccu@35001000 {
                        compatible = BCM21664_DT_ROOT_CCU_COMPAT;
                        reg = <0x35001000 0x0f00>;
                        #clock-cells = <1>;
                        clock-output-names = "frac_1m";
                };
 
-               aon_ccu: aon_ccu {
+               aon_ccu: aon_ccu@35002000 {
                        compatible = BCM21664_DT_AON_CCU_COMPAT;
                        reg = <0x35002000 0x0f00>;
                        #clock-cells = <1>;
                        clock-output-names = "hub_timer";
                };
 
-               slave_ccu: slave_ccu {
+               slave_ccu: slave_ccu@3e011000 {
                        compatible = BCM21664_DT_SLAVE_CCU_COMPAT;
                        reg = <0x3e011000 0x0f00>;
                        #clock-cells = <1>;
                                             "bsc4";
                };
 
-               master_ccu: master_ccu {
+               master_ccu: master_ccu@3f001000 {
                        compatible = BCM21664_DT_MASTER_CCU_COMPAT;
                        reg = <0x3f001000 0x0f00>;
                        #clock-cells = <1>;
index fbfca83bd28ff080b914049233a52aebb349b5ab..ead6e9804dbf4908cd02bb2a299e4aeb3e9a2453 100644 (file)
@@ -21,7 +21,7 @@
        model = "BCM28155 AP board";
        compatible = "brcm,bcm28155-ap", "brcm,bcm11351";
 
-       memory {
+       memory@80000000 {
                device_type = "memory";
                reg = <0x80000000 0x40000000>; /* 1 GB */
        };
index 9777644c6c2b44d34ca67b7781b524b8d0998ea8..4b21ddb26aa563d935bb96757ecc5a3c426a11ba 100644 (file)
                        reg = <0x7e204000 0x1000>;
                        interrupts = <2 22>;
                        clocks = <&clocks BCM2835_CLOCK_VPU>;
+                       dmas = <&dma 6>, <&dma 7>;
+                       dma-names = "tx", "rx";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
index 1c6f561ac52b2739570e3638f2855d920626748f..6a96655d86260920093d6489ecb02f93064fa1c1 100644 (file)
@@ -19,7 +19,7 @@
                bootargs = "console=ttyS0,115200";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x08000000>;
@@ -69,8 +69,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                rfkill {
                        label = "WiFi";
index e550799a6ae0529276ac520dde3ce95e86da2f7f..3b0029e61b4c65b2ff95584df8554ffe7b7ef3be 100644 (file)
@@ -19,7 +19,7 @@
                bootargs = "console=ttyS0,115200";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x08000000>;
@@ -53,8 +53,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                brightness {
                        label = "Backlight";
index 7bfa2238f70bc6b0b440dce02637d41cb45c229c..90f57bad6b24395fd59f89ae274beea11318155a 100644 (file)
@@ -19,7 +19,7 @@
                bootargs = "console=ttyS0,115200 earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x18000000>;
@@ -99,8 +99,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index fd361c9b1374361f23f932396f13a54fb688823a..41548d6d479a54e3d40290783a00714cd7a2fe7e 100644 (file)
                bootargs = "console=ttyS0,115200";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000>;
        };
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                wps {
                        label = "WPS";
index 7c34360d3285d5c2ce460089e62434775c50f688..cd797b4202ad83cfe5503a3bc2596092221ad2c3 100644 (file)
                bootargs = "console=ttyS0,115200";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000>;
        };
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                wps {
                        label = "WPS";
index 969b8d78e4929b6db22bebaf8d932756aae7aa0c..e58c8077be1dcbec58afe1ef8139375b762e5307 100644 (file)
@@ -15,7 +15,7 @@
                bootargs = "console=ttyS0,115200 earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000>;
        };
@@ -44,8 +44,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index b62854ee27abb4404d0e77bfda0a4a498adf76f7..766db617455b99c0630755ce2eb9f68a1f4a5bdd 100644 (file)
@@ -19,7 +19,7 @@
                bootargs = "console=ttyS0,115200 earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000>;
        };
@@ -51,8 +51,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index 75f7b4ef35da6b0021041202ae529ac5fa7e0ebd..fed75e6ab58ca8b2df9cec515784330f064a2726 100644 (file)
@@ -62,8 +62,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                wps {
                        label = "WPS";
index 148d16a9085e89d6176f05bef6512fca329ef9e3..79542e18915c5d964520e6e0b2212d6cb15129ed 100644 (file)
@@ -19,7 +19,7 @@
                bootargs = "console=ttyS0,115200";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x08000000>;
@@ -58,8 +58,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                wps {
                        label = "WPS";
index eed3aab6679b783d09cad511235a27074fbfc6bb..abd35a518046dc58104d4437f6cd29e15a8c9677 100644 (file)
@@ -19,7 +19,7 @@
                bootargs = "console=ttyS0,115200 earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x08000000>;
@@ -93,8 +93,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                rfkill {
                        label = "WiFi";
index fe842f2f1ca7437c3d1b05c8dace8c39d0ecee77..c29950b43a95392b957271ab571bcd87982a6f58 100644 (file)
@@ -19,7 +19,7 @@
                bootargs = "console=ttyS0,115200";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x08000000>;
@@ -59,8 +59,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index 6fcbb0509ba0318e8e02e85eb166f82dc7c3f488..4dcec6865469ac2ebed680a532600a6ba183cc1c 100644 (file)
@@ -19,7 +19,7 @@
                bootargs = "console=ttyS0,115200 earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x08000000>;
@@ -90,8 +90,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                aoss {
                        label = "AOSS";
index b3e8cc90b13fb3071fb109e4e98cb1bc53da47f8..0e349e39f6081e01430688aff0db5f2715ebf06b 100644 (file)
@@ -19,7 +19,7 @@
                bootargs = "console=ttyS0,115200";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x08000000>;
@@ -95,8 +95,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index fdeaa895512f63e33aee8b5c01d1608c54cca7b8..b9d95011637d8faf811b8880ac76df3509005468 100644 (file)
@@ -15,7 +15,7 @@
                bootargs = "console=ttyS0,115200";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000>;
        };
@@ -44,8 +44,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index 0d510cb15ec3a2e99ad85e1c2951cf6e0e74e35e..0052e1b2413023f977e8df0c0655664504a94e72 100644 (file)
@@ -16,7 +16,7 @@
                bootargs = "console=ttyS0,115200";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000>;
        };
@@ -88,8 +88,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index 962e89edba117ef209cf25ca10be94a6402ab357..01c390ed48eac805993c7b7a2d994ecd4590f20f 100644 (file)
@@ -15,7 +15,7 @@
                bootargs = "earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000>;
        };
@@ -76,8 +76,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                rfkill {
                        label = "WiFi";
index 658a56ff8a5cf81aaf059fb1a3b5802cb0415603..911c65fbf2510cddb06d1c5dc227f044d1ed6658 100644 (file)
@@ -19,7 +19,7 @@
                bootargs = "console=ttyS0,115200 earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x08000000>;
@@ -85,8 +85,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                wps {
                        label = "WPS";
index 5fd47eec4407e9b1a3e363b8dbf67b55d472a2a5..18d0ae46e76c48c96c609ef7f093d8bd48401557 100644 (file)
@@ -16,7 +16,7 @@
                bootargs = "console=ttyS0,115200";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x08000000>;
@@ -24,8 +24,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                wps {
                        label = "WPS";
index 6604be6ff0a0acdf86ae4ce8af8ac8bf591682cf..50f7cd08cfbbc41e6d76211f0510cb977e2dbc7f 100644 (file)
@@ -16,7 +16,7 @@
                bootargs = "earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x18000000>;
@@ -43,8 +43,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index 567ebbd5a0e9641ca0a9ac487e1b21d0e778ff6b..b47fb0700a1f024176f9b1395b9ff85687dad577 100644 (file)
@@ -15,7 +15,7 @@
                bootargs = "earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000>;
        };
@@ -42,8 +42,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index ac2d136ed334093d1c24278069e0588bab695f84..bcc420f85b566fe73e93e62a09f1f6f31702cc62 100644 (file)
@@ -16,7 +16,7 @@
                bootargs = "earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x18000000>;
@@ -43,8 +43,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index 74371e821b1a498f573791891431b92baf416b5b..ac75154234745f8979c5ce0724b282028e664b06 100644 (file)
@@ -16,7 +16,7 @@
                bootargs = "console=ttyS0,115200 earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x08000000>;
@@ -83,8 +83,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index b44af63ee3102d76a601d51a1ab94ecd08df0d4a..6d28b7dacd05f7af4e8a421efb860a59ff7f2dc3 100644 (file)
@@ -16,7 +16,7 @@
                bootargs = "earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x18000000>;
@@ -58,8 +58,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index eebc0d43e220b22f51516306bb28f7fa4339d308..f42a1703f4ab1a90cc728c45f2e1a544ef1b71df 100644 (file)
@@ -16,7 +16,7 @@
                bootargs = "console=ttyS0,115200";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x18000000>;
@@ -64,8 +64,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                brightness {
                        label = "Backlight";
index 456045f17a00d7239c3580266d20f039ac18a7ba..ac3a4483dcb3f870c77751bfc0c5a4d536a374ca 100644 (file)
@@ -13,7 +13,7 @@
        compatible = "phicomm,k3", "brcm,bcm47094", "brcm,bcm4708";
        model = "Phicomm K3";
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000
                       0x88000000 0x18000000>;
@@ -21,8 +21,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index eb59508578e4f03a24bc87348d15f3c63e03f987..57ca1cfaecd8e8192d4923db24b356bdd0b6359c 100644 (file)
@@ -15,7 +15,7 @@
                bootargs = "earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000>;
        };
@@ -38,8 +38,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index 4c71f5e95e005c7e47ae992c14e5acc02a887109..2e1a7e382cb7a43fe7247267e92b6a561441ad9f 100644 (file)
@@ -15,7 +15,7 @@
                bootargs = "earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000>;
        };
@@ -48,8 +48,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index 5ad53ea52d0aab838076fdb6c4aceb41d132e968..049cdfd92706f8ddd19ae859fb9da17b739b3e53 100644 (file)
@@ -15,7 +15,7 @@
                bootargs = "console=ttyS0,115200 earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000>;
        };
@@ -58,8 +58,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                rfkill {
                        label = "WiFi";
index ac5266ee8d4ccce31ec40ab936591d7062c877c4..372dc1eb88a0e82883e2049cec701034f8374b2d 100644 (file)
@@ -19,7 +19,7 @@
        #size-cells = <1>;
        interrupt-parent = <&gic>;
 
-       chipcommonA {
+       chipcommonA@18000000 {
                compatible = "simple-bus";
                ranges = <0x00000000 0x18000000 0x00001000>;
                #address-cells = <1>;
@@ -44,7 +44,7 @@
                };
        };
 
-       mpcore {
+       mpcore@19000000 {
                compatible = "simple-bus";
                ranges = <0x00000000 0x19000000 0x00023000>;
                #address-cells = <1>;
                };
        };
 
-       usb2_phy: usb2-phy {
+       usb2_phy: usb2-phy@1800c000 {
                compatible = "brcm,ns-usb2-phy";
                reg = <0x1800c000 0x1000>;
                reg-names = "dmu";
                #address-cells = <0>;
        };
 
-       mdio-bus-mux {
+       mdio-bus-mux@18003000 {
                compatible = "mdio-mux-mmioreg";
                mdio-parent-bus = <&mdio>;
                #address-cells = <1>;
        srab: srab@18007000 {
                compatible = "brcm,bcm5301x-srab";
                reg = <0x18007000 0x1000>;
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                status = "disabled";
 
index b29695bd48551c8a2aed816b3663081c03cf2d6f..4af8e3293cff4a059d7284ad1a73a6328efa4845 100644 (file)
@@ -32,7 +32,7 @@
                };
        };
 
-       mpcore {
+       mpcore@18310000 {
                compatible = "simple-bus";
                ranges = <0x00000000 0x18310000 0x00008000>;
                #address-cells = <1>;
index e6a41e1b27fdffb2cc172a566d87110dd84c94e7..9c0325cf9e22eedf0dffa69decb36f4f8255565f 100644 (file)
@@ -41,9 +41,6 @@
        };
 
        clocks {
-               #address-cells = <1>;
-               #size-cells = <0>;
-
                /* UBUS peripheral clock */
                periph_clk: periph_clk {
                        #clock-cells = <0>;
@@ -94,7 +91,7 @@
                        reg = <0x1e000 0x100>;
                };
 
-               gic: interrupt-controller@1e100 {
+               gic: interrupt-controller@1f000 {
                        compatible = "arm,cortex-a9-gic";
                        reg = <0x1f000 0x1000
                                0x1e100 0x100>;
                                                  IRQ_TYPE_LEVEL_HIGH)>;
                };
 
-               armpll: armpll {
+               armpll: armpll@20000 {
                        #clock-cells = <0>;
                        compatible = "brcm,bcm63138-armpll";
                        clocks = <&periph_clk>;
                        #reset-cells = <2>;
                };
 
-               ahci: sata@8000 {
+               ahci: sata@a000 {
                        compatible = "brcm,bcm63138-ahci", "brcm,sata3-ahci";
                        reg-names = "ahci", "top-ctrl";
                        reg = <0xa000 0x9ac>, <0x8040 0x24>;
index 8006c69a3fdf6e738b50f3fff86b0ab7f60e496f..8313b7cad542732145c954e29ca41f12b5e01ce2 100644 (file)
@@ -6,7 +6,7 @@
        model = "Broadcom STB (bcm7445), SVMB reference board";
        compatible = "brcm,bcm7445", "brcm,brcmstb";
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00 0x00000000 0x00 0x40000000>,
                      <0x00 0x40000000 0x00 0x40000000>,
index 504a63236a5e4972bb57697de2d4b20dee9c9295..58f67c9b830b85e5eaa6ccf35fc45b6d0c4ec22e 100644 (file)
@@ -63,7 +63,7 @@
                             <GIC_PPI 10 (GIC_CPU_MASK_RAW(15) | IRQ_TYPE_LEVEL_LOW)>;
        };
 
-       rdb {
+       rdb@f0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
                compatible = "simple-bus";
 
        };
 
-       memory_controllers {
+       memory_controllers@f1100000 {
                compatible = "simple-bus";
                ranges = <0x0 0x0 0xf1100000 0x200000>;
                #address-cells = <1>;
                        };
                };
 
-               memc@1 {
+               memc@80000 {
                        compatible = "brcm,brcmstb-memc", "simple-bus";
                        #address-cells = <1>;
                        #size-cells = <1>;
                        };
                };
 
-               memc@2 {
+               memc@100000 {
                        compatible = "brcm,brcmstb-memc", "simple-bus";
                        #address-cells = <1>;
                        #size-cells = <1>;
index 53f990defd6ae9f7af35eac9e1a04a16ae47c048..b2d323f4a5aba35a89d6689fa27a57fb005d0499 100644 (file)
@@ -49,8 +49,6 @@
 
        gpio_keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                hook {
                        label = "HOOK";
index 4991700ae6b0876f18ab66db13524001309bb39a..b0b8c774a37f995230be8bb11d66d0d414d949b4 100644 (file)
@@ -17,7 +17,7 @@
                bootargs = "console=ttyS0,115200 earlycon";
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x08000000>;
        };
@@ -43,8 +43,6 @@
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                restart {
                        label = "Reset";
index 250a1d6f2d05cdd3a12aaf32dcaafc1a594f9132..9574682246228ce51faf503e8cbf1e64489eb710 100644 (file)
        model = "NorthStar Enterprise Router (BCM953012ER)";
        compatible = "brcm,bcm953012er", "brcm,brcm53012", "brcm,bcm4708";
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x00000000 0x8000000>;
        };
 
        gpio-keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
 
                wps {
                        label = "WPS";
index 52c4c6c9d3f1fba30c9f7311f86886b94e42d5cb..046c59fb48462135d27b45bb0253af1af7c6ed76 100644 (file)
@@ -43,7 +43,7 @@
                serial1 = &uart1;
        };
 
-       memory {
+       memory@80000000 {
                device_type = "memory";
                reg = <0x80000000 0x10000000>;
        };
index 21479b4ce8233fc6ad073e97e7593c1c5a9684dc..8c388eb8a08f8618beea5aa5a90fb258329ae5cc 100644 (file)
@@ -43,7 +43,7 @@
                stdout-path = "serial0:115200n8";
        };
 
-       memory {
+       memory@60000000 {
                device_type = "memory";
                reg = <0x60000000 0x80000000>;
        };
index cda3d790965ba685d02c3da330eddd904120bbf3..c339771bb22e067d2ef5d132c8330f029b7315c2 100644 (file)
@@ -43,7 +43,7 @@
                stdout-path = "serial0:115200n8";
        };
 
-       memory {
+       memory@60000000 {
                device_type = "memory";
                reg = <0x60000000 0x80000000>;
        };
index f86649812b591ef3488589fe5fd47b8abff78f0c..1c72ec8288de4d945164c448937c73e293750e69 100644 (file)
@@ -43,7 +43,7 @@
                stdout-path = "serial0:115200n8";
        };
 
-       memory {
+       memory@60000000 {
                device_type = "memory";
                reg = <0x60000000 0x40000000>;
        };
index df60602b054dcf212e63ee3bab3c8b23749104a6..96a021cebd97b1e63005db8c636326d6b93f912d 100644 (file)
@@ -43,7 +43,7 @@
                stdout-path = "serial0:115200n8";
        };
 
-       memory {
+       memory@60000000 {
                device_type = "memory";
                reg = <0x60000000 0x80000000>;
        };
index 3893e7af343a0fa2fc7d5c18779f6cf549ff8487..b2c7f21d471e629cc00437feef183b9bb09d8605 100644 (file)
@@ -43,7 +43,7 @@
                stdout-path = "serial0:115200n8";
        };
 
-       memory {
+       memory@60000000 {
                device_type = "memory";
                reg = <0x60000000 0x80000000>;
        };
index cf226b02141f0e524141dcc4f1a17f2d76382f2f..a2c9de35ddfbd3e40b07e50ba4d003ffcbdc3cbb 100644 (file)
@@ -43,7 +43,7 @@
                stdout-path = "serial0:115200n8";
        };
 
-       memory {
+       memory@60000000 {
                device_type = "memory";
                reg = <0x60000000 0x20000000>;
        };
index 10b3d512bb330f7fd8886b3f815ce1231f03b846..3fcca12d83c2d5df60699956ccc2d5ae3e10f96c 100644 (file)
@@ -42,7 +42,7 @@
                stdout-path = "serial0:115200n8";
        };
 
-       memory {
+       memory@60000000 {
                device_type = "memory";
                reg = <0x60000000 0x80000000>;
        };
index 29525686e51a060dd31130e0d2cc10f526d23780..5b177274f1826f18a2b0cc6b55dafb6a6d15417e 100644 (file)
@@ -16,7 +16,7 @@
                stdout-path = &serial0;
        };
 
-       memory {
+       memory@0 {
                device_type = "memory";
                reg = <0x0 0x08000000>;
        };
index e39db14d805e162b9ed9e92e57dfdca5844e0077..edd0f630e02511e17ab5336700db50026b9f1c9b 100644 (file)
@@ -43,7 +43,7 @@
                stdout-path = "serial0:115200n8";
        };
 
-       memory {
+       memory@60000000 {
                device_type = "memory";
                reg = <0x60000000 0x80000000>;
        };
index f2d2b872333e6fc554142a5c5d4da1d614d5c7ed..5b2b1ed04d510cf52a952cdfc2c43d580d4f0d83 100644 (file)
        };
 };
 
+&cpu {
+       cpu-supply = <&vdcdc3_reg>;
+};
+
+/*
+ * The standard da850-evm kits and SOM's are 375MHz so enable this operating
+ * point by default. Higher frequencies must be enabled for custom boards with
+ * other variants of the SoC.
+ */
+&opp_375 {
+       status = "okay";
+};
+
 &sata {
        status = "okay";
 };
index 2fd2a6838dab4844be9ddf960d2e73f758484d43..e379d6e7ad499233d924976272692221128bb36e 100644 (file)
                        };
                };
        };
+
+       cvdd: regulator0 {
+               compatible = "regulator-fixed";
+               regulator-name = "cvdd";
+               regulator-min-microvolt = <1300000>;
+               regulator-max-microvolt = <1300000>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
 };
 
 &ref_clk {
        clock-frequency = <24000000>;
 };
 
+&cpu {
+       cpu-supply = <&cvdd>;
+};
+
+/*
+ * LCDK has a fixed CVDD of 1.3V, so only operating points >= 300MHz are
+ * valid. Unfortunately due to a problem with the DA8XX OHCI controller, we
+ * can't enable more than one OPP by default, since the controller sometimes
+ * becomes unresponsive after a transition. Fix the frequency at 456 MHz.
+ */
+
+&opp_100 {
+       status = "disabled";
+};
+
+&opp_200 {
+       status = "disabled";
+};
+
+&opp_300 {
+       status = "disabled";
+};
+
+&opp_456 {
+       status = "okay";
+};
+
 &pmx_core {
        status = "okay";
 
index 09c3666def66dcd8c932ff8073d6d5ccc6fab0d6..afd04a423856df5ff7f122e21dcb2ca6bcadb8c7 100644 (file)
                amp-supply = <&amp>;
        };
 
+       cvdd: regulator0 {
+               compatible = "regulator-fixed";
+               regulator-name = "cvdd";
+               regulator-min-microvolt = <1200000>;
+               regulator-max-microvolt = <1200000>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
        /*
         * This is a 5V current limiting regulator that is shared by USB,
         * the sensor (input) ports, the motor (output) ports and the A/DC.
        clock-frequency = <24000000>;
 };
 
+&cpu {
+       cpu-supply = <&cvdd>;
+};
+
+/* since we have a fixed regulator, we can't run at these points */
+&opp_100 {
+       status = "disabled";
+};
+
+&opp_200 {
+       status = "disabled";
+};
+
+/*
+ * The SoC is actually the 456MHz version, but because of the fixed regulator
+ * This is the fastest we can go.
+ */
+&opp_375 {
+       status = "okay";
+};
+
 &pmx_core {
        status = "okay";
 
index e6e78b88cacb4fcbf090400756f5cb96a3d437b7..7cf31b6e48b7bee0215e019a367b3f4554422c60 100644 (file)
                reg = <0xc0000000 0x0>;
        };
 
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu: cpu@0 {
+                       compatible = "arm,arm926ej-s";
+                       device_type = "cpu";
+                       reg = <0>;
+                       clocks = <&psc0 14>;
+                       operating-points-v2 = <&opp_table>;
+               };
+       };
+
+       opp_table: opp-table {
+               compatible = "operating-points-v2";
+
+               opp_100: opp100-100000000 {
+                       opp-hz = /bits/ 64 <100000000>;
+                       opp-microvolt = <1000000 950000 1050000>;
+               };
+
+               opp_200: opp110-200000000 {
+                       opp-hz = /bits/ 64 <200000000>;
+                       opp-microvolt = <1100000 1050000 1160000>;
+               };
+
+               opp_300: opp120-300000000 {
+                       opp-hz = /bits/ 64 <300000000>;
+                       opp-microvolt = <1200000 1140000 1320000>;
+               };
+
+               /*
+                * Original silicon was 300MHz max, so higher frequencies
+                * need to be enabled on a per-board basis if the chip is
+                * capable.
+                */
+
+               opp_375: opp120-375000000 {
+                       status = "disabled";
+                       opp-hz = /bits/ 64 <375000000>;
+                       opp-microvolt = <1200000 1140000 1320000>;
+               };
+
+               opp_456: opp130-456000000 {
+                       status = "disabled";
+                       opp-hz = /bits/ 64 <456000000>;
+                       opp-microvolt = <1300000 1250000 1350000>;
+               };
+       };
+
        arm {
                #address-cells = <1>;
                #size-cells = <1>;
index abfff54d6de5e040729a5252c9939cc07f008920..0a27f034dd6b51b9564237e2e87d16bfa0804cda 100644 (file)
@@ -25,7 +25,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial1:115200n8";
        };
 
index ace50e194a455e93b89c8aa15349d0c182ccd762..dee35e3a5c4ba850b3d6072835467557162b4200 100644 (file)
        cpu0-supply = <&buck2_reg>;
 };
 
+&gpu {
+       mali-supply = <&buck3_reg>;
+       status = "okay";
+};
+
 &i2c_0 {
        #address-cells = <1>;
        #size-cells = <0>;
index e25765500e99f0d520b64bfbae7785bb5b5ab563..248bd372fe705109597f0e19534083359c58c627 100644 (file)
        status = "okay";
 };
 
+&gpu {
+       mali-supply = <&buck3_reg>;
+       status = "okay";
+};
+
 &hsotg {
        vusb_d-supply = <&ldo15_reg>;
        vusb_a-supply = <&ldo12_reg>;
index 7479993755dacbebfc4f9efc4a593e3a84b96ef2..86c26a4edfd72c54e05413052216ceb4e90a15ad 100644 (file)
        };
 };
 
+&gpu {
+       mali-supply = <&buck3_reg>;
+       status = "okay";
+};
+
 &i2c_0 {
        #address-cells = <1>;
        #size-cells = <0>;
index 8ce3a7786b19808c74ab7996b24cf27ab6d1d4c2..5659c4a107296d3012a33a436097a7b1f7337788 100644 (file)
                        status = "disabled";
                };
 
+               gpu: gpu@13000000 {
+                       compatible = "samsung,exynos4210-mali", "arm,mali-400";
+                       reg = <0x13000000 0x10000>;
+                       interrupts = <GIC_SPI 187 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 182 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 183 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 178 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 179 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 185 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 180 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 186 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 181 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 177 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "gp",
+                                         "gpmmu",
+                                         "pp0",
+                                         "ppmmu0",
+                                         "pp1",
+                                         "ppmmu1",
+                                         "pp2",
+                                         "ppmmu2",
+                                         "pp3",
+                                         "ppmmu3",
+                                         "pmu";
+                       clocks = <&cmu CLK_G3D>,
+                                <&cmu CLK_SCLK_G3D>;
+                       clock-names = "bus", "core";
+                       power-domains = <&pd_g3d>;
+                       status = "disabled";
+                       /* TODO: operating points for DVFS, assigned clock as 134 MHz */
+               };
+
                mfc: codec@13400000 {
                        compatible = "samsung,mfc-v7";
                        reg = <0x13400000 0x10000>;
index 36ccf227434da6b8e37fc7e392910ce690a8ebdf..1264cc431ff6f0654d1affc20ab81c945e44e7df 100644 (file)
@@ -54,7 +54,7 @@
        pmu: pmu {
                compatible = "arm,cortex-a9-pmu";
                interrupt-parent = <&combiner>;
-               interrupts = <2 2>, <3 2>;
+               status = "disabled";
        };
 
        soc: soc {
                        };
                };
 
+               gpu: gpu@13000000 {
+                       compatible = "samsung,exynos4210-mali", "arm,mali-400";
+                       reg = <0x13000000 0x10000>;
+                       /*
+                        * CLK_G3D is not actually bus clock but a IP-level clock.
+                        * The bus clock is not described in hardware manual.
+                        */
+                       clocks = <&clock CLK_G3D>,
+                                <&clock CLK_SCLK_G3D>;
+                       clock-names = "bus", "core";
+                       power-domains = <&pd_g3d>;
+                       status = "disabled";
+               };
+
                i2s1: i2s@13960000 {
                        compatible = "samsung,s3c6410-i2s";
                        reg = <0x13960000 0x100>;
index 36b1edea254a80e411531fde19d3305b1eb252e4..0d1e1a9c2f6e0b5a6ad62109b1a486c3da55184e 100644 (file)
        status = "okay";
 };
 
+&gpu {
+       mali-supply = <&buck3_reg>;
+       status = "okay";
+};
+
 &hsotg {
        vusb_d-supply = <&ldo3_reg>;
        vusb_a-supply = <&ldo8_reg>;
index 6882480dbaf7a50ea08cc9e67db6bef5072ae2bf..7c39dd1c4d3a4580e2232b5ad0b9413d854c3d75 100644 (file)
        status = "okay";
 };
 
+&gpu {
+       status = "okay";
+};
+
 &hsotg {
        vusb_d-supply = <&vusb_reg>;
        vusb_a-supply = <&vusbdac_reg>;
index bf092e97e14f043f7fce322a17150087d6b39e16..82a8b5449978a166d4fd1e2d120e54deee98d852 100644 (file)
        };
 };
 
+&gpu {
+       mali-supply = <&buck2_reg>;
+       status = "okay";
+};
+
 &hdmi {
        hpd-gpios = <&gpx3 7 GPIO_ACTIVE_HIGH>;
        pinctrl-names = "default";
index b491c345b2e8edcdfebf8940af7d24dd15822277..f220716239dbf06658c949e224acff26626b2565 100644 (file)
@@ -8,7 +8,7 @@
  *             www.linaro.org
  *
  * Samsung's Exynos4210 SoC device nodes are listed in this file. Exynos4210
- * based board files can include this file and provide values for board specfic
+ * based board files can include this file and provide values for board specific
  * bindings.
  *
  * Note: This file does not include device nodes for all the controllers in
 
                        trips {
                                cpu_alert0: cpu-alert-0 {
-                               temperature = <85000>; /* millicelsius */
+                                       temperature = <85000>; /* millicelsius */
                                };
                                cpu_alert1: cpu-alert-1 {
-                               temperature = <100000>; /* millicelsius */
+                                       temperature = <100000>; /* millicelsius */
                                };
                                cpu_alert2: cpu-alert-2 {
-                               temperature = <110000>; /* millicelsius */
+                                       temperature = <110000>; /* millicelsius */
                                };
                        };
                };
        samsung,lcd-wb;
 };
 
+&gpu {
+       interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
+       interrupt-names = "gp",
+                         "gpmmu",
+                         "pp0",
+                         "ppmmu0",
+                         "pp1",
+                         "ppmmu1",
+                         "pp2",
+                         "ppmmu2",
+                         "pp3",
+                         "ppmmu3";
+       operating-points-v2 = <&gpu_opp_table>;
+
+       gpu_opp_table: opp_table {
+               compatible = "operating-points-v2";
+
+               opp-160000000 {
+                       opp-hz = /bits/ 64 <160000000>;
+                       opp-microvolt = <950000>;
+               };
+               opp-267000000 {
+                       opp-hz = /bits/ 64 <267000000>;
+                       opp-microvolt = <1050000>;
+               };
+       };
+};
+
 &mdma1 {
        power-domains = <&pd_lcd0>;
 };
                 <&clock CLK_MOUT_MIXER>, <&clock CLK_SCLK_MIXER>;
 };
 
+&pmu {
+       interrupts = <2 2>, <3 2>;
+       interrupt-affinity = <&cpu0>, <&cpu1>;
+       status = "okay";
+};
+
 &pmu_system_controller {
        clock-names = "clkout0", "clkout1", "clkout2", "clkout3",
                        "clkout4", "clkout8", "clkout9";
index 30eee5942effeff02e3095d6c49d0dd6e35a97d0..ce87d2ff27aabc218a1de9fbca7b60b7c82f492f 100644 (file)
                i2c10 = &i2c_cm36651;
        };
 
+       aat1290 {
+               compatible = "skyworks,aat1290";
+               flen-gpios = <&gpj1 1 GPIO_ACTIVE_HIGH>;
+               enset-gpios = <&gpj1 2 GPIO_ACTIVE_HIGH>;
+
+               pinctrl-names = "default", "host", "isp";
+               pinctrl-0 = <&camera_flash_host>;
+               pinctrl-1 = <&camera_flash_host>;
+               pinctrl-2 = <&camera_flash_isp>;
+
+               flash-led {
+                       label = "flash";
+                       led-max-microamp = <520833>;
+                       flash-max-microamp = <1012500>;
+                       flash-max-timeout-us = <1940000>;
+               };
+       };
+
        lcd_vdd3_reg: voltage-regulator-6 {
                compatible = "regulator-fixed";
                regulator-name = "LCD_VDD_2.2V";
        regulator-max-microvolt = <2800000>;
 };
 
+&pinctrl_0 {
+       camera_flash_host: camera-flash-host {
+               samsung,pins = "gpj1-0";
+               samsung,pin-function = <EXYNOS_PIN_FUNC_OUTPUT>;
+               samsung,pin-val = <0>;
+       };
+
+       camera_flash_isp: camera-flash-isp {
+               samsung,pins = "gpj1-0";
+               samsung,pin-function = <EXYNOS_PIN_FUNC_OUTPUT>;
+               samsung,pin-val = <1>;
+       };
+};
+
 &s5c73m3 {
        standby-gpios = <&gpm0 1 GPIO_ACTIVE_LOW>;   /* ISP_STANDBY */
        vdda-supply = <&ldo17_reg>;
index 0038465f38f19e217eb565d474f0bb87b0669a9b..462a5409b1de3e3cf47191ecb6835c8d8b62a6cf 100644 (file)
        cpu0-supply = <&buck2_reg>;
 };
 
+&gpu {
+       mali-supply = <&buck4_reg>;
+       status = "okay";
+};
+
 &hsotg {
        vusb_d-supply = <&ldo15_reg>;
        vusb_a-supply = <&ldo12_reg>;
index 4c15cb616cdf214bc901877715e222873c755041..83be3a797411eaf82ff728cb2505ea6740b3f902 100644 (file)
        status = "okay";
 };
 
+&gpu {
+       mali-supply = <&buck4_reg>;
+       status = "okay";
+};
+
 &hdmi {
        hpd-gpios = <&gpx3 7 GPIO_ACTIVE_HIGH>;
        pinctrl-names = "default";
index 08d3a0a7b4eb32476e0824216dbc71a67134bfd3..ea55f377d17c003bad44f7f4d538cbb21dae53f8 100644 (file)
        assigned-clock-rates = <0>, <176000000>;
 };
 
+&gpu {
+       mali-supply = <&buck4_reg>;
+       status = "okay";
+};
+
 &hdmi {
        hpd-gpios = <&gpx3 7 GPIO_ACTIVE_HIGH>;
        pinctrl-names = "default";
index d83fbd4e434c905692f4ba6877617e94f0dcca71..3731a225f77913306a8330ee088e2b56678642a2 100644 (file)
        cooling-device = <&cpu0 15 15>, <&cpu1 15 15>,
                         <&cpu2 15 15>, <&cpu3 15 15>;
 };
+
+&gpu_opp_table {
+       opp-533000000 {
+               opp-hz = /bits/ 64 <533000000>;
+               opp-microvolt = <1075000>;
+       };
+};
index e5c041ec07569312b9afa36cdda24da627693589..d20db2dfe8e26d83fba590afcc6f9cd31f480bcc 100644 (file)
        cpu-offset = <0x4000>;
 };
 
+&gpu {
+       interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>;
+       interrupt-names = "gp",
+                         "gpmmu",
+                         "pp0",
+                         "ppmmu0",
+                         "pp1",
+                         "ppmmu1",
+                         "pp2",
+                         "ppmmu2",
+                         "pp3",
+                         "ppmmu3",
+                         "pmu";
+       operating-points-v2 = <&gpu_opp_table>;
+
+       gpu_opp_table: opp_table {
+               compatible = "operating-points-v2";
+
+               opp-160000000 {
+                       opp-hz = /bits/ 64 <160000000>;
+                       opp-microvolt = <875000>;
+               };
+               opp-267000000 {
+                       opp-hz = /bits/ 64 <267000000>;
+                       opp-microvolt = <900000>;
+               };
+               opp-350000000 {
+                       opp-hz = /bits/ 64 <350000000>;
+                       opp-microvolt = <950000>;
+               };
+               opp-440000000 {
+                       opp-hz = /bits/ 64 <440000000>;
+                       opp-microvolt = <1025000>;
+               };
+       };
+};
+
 &hdmi {
        compatible = "samsung,exynos4212-hdmi";
 };
 
 &pmu {
        interrupts = <2 2>, <3 2>, <18 2>, <19 2>;
+       interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;
+       status = "okay";
 };
 
 &pmu_system_controller {
index 8f9e08f940ab4d454f97239d51cd987c2a797953..e0db251e253f0e5a41dad06eef9ff40f3d978c35 100644 (file)
        };
 };
 
+&adc {
+       vdd-supply = <&ldo10_reg>;
+       status = "okay";
+};
+
 &audi2s0 {
        status = "okay";
 };
index 57fc9c949e54a807d3d6742c1970d1bbfe0258cd..e6f78b1cee7c84b3b51bef788dc01fe97a8bbe71 100644 (file)
        };
 };
 
+&adc {
+       clocks = <&clock CLK_TSADC>;
+       clock-names = "adc";
+       samsung,syscon-phandle = <&pmu_system_controller>;
+};
+
 &arm_a15_pmu {
        interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;
        status = "okay";
index dbf0306896f65e23fdcb684e3b0327644375089d..592d7b45ecc8797e61d45d65b724b84188df6359 100644 (file)
                                 * (Linaro for Arndale Octa, v2012.07).
                                 */
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo4_reg: LDO4 {
                                regulator-name = "PVDD_ANAIP_1V8";
                                regulator-min-microvolt = <1800000>;
                                regulator-max-microvolt = <1800000>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo8_reg: LDO8 {
                                regulator-name = "PVDD_APIO_MMCOFF_2V8";
                                regulator-min-microvolt = <1800000>;
                                regulator-max-microvolt = <2800000>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo14_reg: LDO14 {
                                regulator-name = "PVDD_PERI_2V8";
                                regulator-min-microvolt = <3300000>;
                                regulator-max-microvolt = <3300000>;
+
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                               };
                        };
 
                        ldo16_reg: LDO16 {
                                regulator-name = "PVDD_PERI_3V3";
                                regulator-min-microvolt = <2200000>;
                                regulator-max-microvolt = <2200000>;
+
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                               };
                        };
 
                        ldo17_reg: LDO17 {
                                regulator-name = "PVDD_EMMC_1V8";
                                regulator-min-microvolt = <1800000>;
                                regulator-max-microvolt = <1800000>;
+                               /*
+                                * Must stay in "off" mode during shutdown for
+                                * proper eMMC reset.  The "off" mode is in
+                                * fact controlled by LDO18EN.  The eMMC does
+                                * not have reset pin connected so the reset
+                                * will be triggered by falling edge of
+                                * LDO18EN.
+                                */
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo19_reg: LDO19 {
                                regulator-name = "PVDD_TFLASH_2V8";
                                regulator-min-microvolt = <2800000>;
                                regulator-max-microvolt = <2800000>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo20_reg: LDO20 {
                                regulator-min-microvolt = <800000>;
                                regulator-max-microvolt = <1100000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                               };
                        };
 
                        ldo24_reg: LDO24 {
                                regulator-name = "PVDD_CAM1_AVDD_2V8";
                                regulator-min-microvolt = <2800000>;
                                regulator-max-microvolt = <2800000>;
+
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                               };
                        };
 
                        ldo25_reg: LDO25 {
                                regulator-name = "PVDD_G3DS_1V0";
                                regulator-min-microvolt = <800000>;
                                regulator-max-microvolt = <1100000>;
+
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                               };
                        };
 
                        ldo28_reg: LDO28 {
                        buck1_reg: BUCK1 {
                                regulator-name = "PVDD_MIF_1V1";
                                regulator-min-microvolt = <800000>;
-                               regulator-max-microvolt = <1100000>;
+                               regulator-max-microvolt = <1300000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        buck2_reg: BUCK2 {
                                regulator-name = "vdd_arm";
                                regulator-min-microvolt = <800000>;
-                               regulator-max-microvolt = <1000000>;
+                               regulator-max-microvolt = <1500000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        buck3_reg: BUCK3 {
                                regulator-name = "PVDD_INT_1V0";
                                regulator-min-microvolt = <800000>;
-                               regulator-max-microvolt = <1000000>;
+                               regulator-max-microvolt = <1400000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        buck4_reg: BUCK4 {
                                regulator-name = "PVDD_G3D_1V0";
                                regulator-min-microvolt = <800000>;
-                               regulator-max-microvolt = <1000000>;
+                               regulator-max-microvolt = <1400000>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        buck5_reg: BUCK5 {
                                regulator-name = "PVDD_LPDDR3_1V2";
                                regulator-min-microvolt = <800000>;
-                               regulator-max-microvolt = <1200000>;
+                               regulator-max-microvolt = <1400000>;
                                regulator-always-on;
                        };
 
                        buck6_reg: BUCK6 {
                                regulator-name = "PVDD_KFC_1V0";
                                regulator-min-microvolt = <800000>;
-                               regulator-max-microvolt = <1000000>;
+                               regulator-max-microvolt = <1500000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        buck7_reg: BUCK7 {
                                regulator-name = "VIN_LLDO_1V4";
-                               regulator-min-microvolt = <800000>;
-                               regulator-max-microvolt = <1400000>;
+                               regulator-min-microvolt = <1200000>;
+                               regulator-max-microvolt = <1500000>;
                                regulator-always-on;
                        };
 
                        buck8_reg: BUCK8 {
                                regulator-name = "VIN_MLDO_2V0";
-                               regulator-min-microvolt = <800000>;
-                               regulator-max-microvolt = <2000000>;
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <2100000>;
                                regulator-always-on;
                        };
 
                                regulator-name = "PVDD_EMMCF_2V8";
                                regulator-min-microvolt = <2800000>;
                                regulator-max-microvolt = <2800000>;
+                               /*
+                                * Must stay in "off" mode during shutdown for
+                                * proper eMMC reset.  The "off" mode is in
+                                * fact controlled by BUCK10EN.  The eMMC does
+                                * not have reset pin connected so the reset
+                                * will be triggered by falling edge of
+                                * BUCK10EN.
+                                */
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
                };
        };
        samsung,dw-mshc-ddr-timing = <0 2>;
        pinctrl-names = "default";
        pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_bus1 &sd0_bus4 &sd0_bus8>;
-       vmmc-supply = <&ldo10_reg>;
+       vmmc-supply = <&ldo18_reg>;
        vqmmc-supply = <&ldo3_reg>;
        bus-width = <8>;
        cap-mmc-highspeed;
index 5fb2326875dcb72576a9930ad63dcaaa69e57689..55d4dbf6f83a9a34826c675048265010083d038d 100644 (file)
         * by exynos5420-cpus.dtsi or exynos5422-cpus.dtsi.
         */
 
-       soc: soc {
-               cluster_a15_opp_table: opp_table0 {
-                       compatible = "operating-points-v2";
-                       opp-shared;
-                       opp-1800000000 {
-                               opp-hz = /bits/ 64 <1800000000>;
-                               opp-microvolt = <1250000>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-1700000000 {
-                               opp-hz = /bits/ 64 <1700000000>;
-                               opp-microvolt = <1212500>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-1600000000 {
-                               opp-hz = /bits/ 64 <1600000000>;
-                               opp-microvolt = <1175000>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-1500000000 {
-                               opp-hz = /bits/ 64 <1500000000>;
-                               opp-microvolt = <1137500>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-1400000000 {
-                               opp-hz = /bits/ 64 <1400000000>;
-                               opp-microvolt = <1112500>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-1300000000 {
-                               opp-hz = /bits/ 64 <1300000000>;
-                               opp-microvolt = <1062500>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-1200000000 {
-                               opp-hz = /bits/ 64 <1200000000>;
-                               opp-microvolt = <1037500>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-1100000000 {
-                               opp-hz = /bits/ 64 <1100000000>;
-                               opp-microvolt = <1012500>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-1000000000 {
-                               opp-hz = /bits/ 64 <1000000000>;
-                               opp-microvolt = < 987500>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-900000000 {
-                               opp-hz = /bits/ 64 <900000000>;
-                               opp-microvolt = < 962500>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-800000000 {
-                               opp-hz = /bits/ 64 <800000000>;
-                               opp-microvolt = < 937500>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-700000000 {
-                               opp-hz = /bits/ 64 <700000000>;
-                               opp-microvolt = < 912500>;
-                               clock-latency-ns = <140000>;
-                       };
+       cluster_a15_opp_table: opp_table0 {
+               compatible = "operating-points-v2";
+               opp-shared;
+
+               opp-1800000000 {
+                       opp-hz = /bits/ 64 <1800000000>;
+                       opp-microvolt = <1250000>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-1700000000 {
+                       opp-hz = /bits/ 64 <1700000000>;
+                       opp-microvolt = <1212500>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-1600000000 {
+                       opp-hz = /bits/ 64 <1600000000>;
+                       opp-microvolt = <1175000>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-1500000000 {
+                       opp-hz = /bits/ 64 <1500000000>;
+                       opp-microvolt = <1137500>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-1400000000 {
+                       opp-hz = /bits/ 64 <1400000000>;
+                       opp-microvolt = <1112500>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-1300000000 {
+                       opp-hz = /bits/ 64 <1300000000>;
+                       opp-microvolt = <1062500>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-1200000000 {
+                       opp-hz = /bits/ 64 <1200000000>;
+                       opp-microvolt = <1037500>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-1100000000 {
+                       opp-hz = /bits/ 64 <1100000000>;
+                       opp-microvolt = <1012500>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-1000000000 {
+                       opp-hz = /bits/ 64 <1000000000>;
+                       opp-microvolt = < 987500>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-900000000 {
+                       opp-hz = /bits/ 64 <900000000>;
+                       opp-microvolt = < 962500>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-800000000 {
+                       opp-hz = /bits/ 64 <800000000>;
+                       opp-microvolt = < 937500>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-700000000 {
+                       opp-hz = /bits/ 64 <700000000>;
+                       opp-microvolt = < 912500>;
+                       clock-latency-ns = <140000>;
                };
+       };
 
-               cluster_a7_opp_table: opp_table1 {
-                       compatible = "operating-points-v2";
-                       opp-shared;
-                       opp-1300000000 {
-                               opp-hz = /bits/ 64 <1300000000>;
-                               opp-microvolt = <1275000>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-1200000000 {
-                               opp-hz = /bits/ 64 <1200000000>;
-                               opp-microvolt = <1212500>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-1100000000 {
-                               opp-hz = /bits/ 64 <1100000000>;
-                               opp-microvolt = <1162500>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-1000000000 {
-                               opp-hz = /bits/ 64 <1000000000>;
-                               opp-microvolt = <1112500>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-900000000 {
-                               opp-hz = /bits/ 64 <900000000>;
-                               opp-microvolt = <1062500>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-800000000 {
-                               opp-hz = /bits/ 64 <800000000>;
-                               opp-microvolt = <1025000>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-700000000 {
-                               opp-hz = /bits/ 64 <700000000>;
-                               opp-microvolt = <975000>;
-                               clock-latency-ns = <140000>;
-                       };
-                       opp-600000000 {
-                               opp-hz = /bits/ 64 <600000000>;
-                               opp-microvolt = <937500>;
-                               clock-latency-ns = <140000>;
-                       };
+       cluster_a7_opp_table: opp_table1 {
+               compatible = "operating-points-v2";
+               opp-shared;
+
+               opp-1300000000 {
+                       opp-hz = /bits/ 64 <1300000000>;
+                       opp-microvolt = <1275000>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-1200000000 {
+                       opp-hz = /bits/ 64 <1200000000>;
+                       opp-microvolt = <1212500>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-1100000000 {
+                       opp-hz = /bits/ 64 <1100000000>;
+                       opp-microvolt = <1162500>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-1000000000 {
+                       opp-hz = /bits/ 64 <1000000000>;
+                       opp-microvolt = <1112500>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-900000000 {
+                       opp-hz = /bits/ 64 <900000000>;
+                       opp-microvolt = <1062500>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-800000000 {
+                       opp-hz = /bits/ 64 <800000000>;
+                       opp-microvolt = <1025000>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-700000000 {
+                       opp-hz = /bits/ 64 <700000000>;
+                       opp-microvolt = <975000>;
+                       clock-latency-ns = <140000>;
+               };
+               opp-600000000 {
+                       opp-hz = /bits/ 64 <600000000>;
+                       opp-microvolt = <937500>;
+                       clock-latency-ns = <140000>;
                };
+       };
 
+       soc: soc {
                cci: cci@10d20000 {
                        compatible = "arm,cci-400";
                        #address-cells = <1>;
                        status = "disabled";
                };
 
-               adc: adc@12d10000 {
-                       compatible = "samsung,exynos-adc-v2";
-                       reg = <0x12D10000 0x100>;
-                       interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&clock CLK_TSADC>;
-                       clock-names = "adc";
-                       #io-channel-cells = <1>;
-                       io-channel-ranges;
-                       samsung,syscon-phandle = <&pmu_system_controller>;
-                       status = "disabled";
-               };
-
                hsi2c_8: i2c@12e00000 {
                        compatible = "samsung,exynos5250-hsi2c";
                        reg = <0x12E00000 0x1000>;
        };
 };
 
+&adc {
+       clocks = <&clock CLK_TSADC>;
+       clock-names = "adc";
+       samsung,syscon-phandle = <&pmu_system_controller>;
+};
+
 &dp {
        clocks = <&clock CLK_DP1>;
        clock-names = "dp";
index 25d95de15c9b3e772bfe0d5e51ad6c1c6b4faafd..829147e320e081165642924e5a7bf48e07b76eb9 100644 (file)
                                regulator-name = "vdd_adc";
                                regulator-min-microvolt = <1800000>;
                                regulator-max-microvolt = <1800000>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo5_reg: LDO5 {
                                regulator-min-microvolt = <1800000>;
                                regulator-max-microvolt = <1800000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo6_reg: LDO6 {
                                regulator-min-microvolt = <1000000>;
                                regulator-max-microvolt = <1000000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo7_reg: LDO7 {
                                regulator-min-microvolt = <1800000>;
                                regulator-max-microvolt = <1800000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo8_reg: LDO8 {
                                regulator-min-microvolt = <1800000>;
                                regulator-max-microvolt = <1800000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo9_reg: LDO9 {
                                regulator-min-microvolt = <3000000>;
                                regulator-max-microvolt = <3000000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo10_reg: LDO10 {
                                regulator-min-microvolt = <1800000>;
                                regulator-max-microvolt = <1800000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo11_reg: LDO11 {
                                regulator-min-microvolt = <1000000>;
                                regulator-max-microvolt = <1000000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo12_reg: LDO12 {
                                regulator-name = "vddq_mmc2";
                                regulator-min-microvolt = <1800000>;
                                regulator-max-microvolt = <2800000>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo14_reg: LDO14 {
                                regulator-min-microvolt = <3300000>;
                                regulator-max-microvolt = <3300000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo16_reg: LDO16 {
                                regulator-min-microvolt = <3300000>;
                                regulator-max-microvolt = <3300000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo18_reg: LDO18 {
                                regulator-name = "vdd_emmc_1V8";
                                regulator-min-microvolt = <1800000>;
                                regulator-max-microvolt = <1800000>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo19_reg: LDO19 {
                                regulator-name = "vdd_sd";
                                regulator-min-microvolt = <2800000>;
                                regulator-max-microvolt = <2800000>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo20_reg: LDO20 {
                                regulator-min-microvolt = <1100000>;
                                regulator-max-microvolt = <1100000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo24_reg: LDO24 {
                                regulator-name = "vdd_ldo26";
                                regulator-min-microvolt = <800000>;
                                regulator-max-microvolt = <3950000>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo27_reg: LDO27 {
                                regulator-min-microvolt = <1000000>;
                                regulator-max-microvolt = <1000000>;
                                regulator-always-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo28_reg: LDO28 {
                                regulator-name = "vdd_ldo28";
                                regulator-min-microvolt = <800000>;
                                regulator-max-microvolt = <3950000>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        ldo29_reg: LDO29 {
                                regulator-max-microvolt = <1300000>;
                                regulator-always-on;
                                regulator-boot-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        buck2_reg: BUCK2 {
                                regulator-max-microvolt = <1500000>;
                                regulator-always-on;
                                regulator-boot-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        buck3_reg: BUCK3 {
                                regulator-max-microvolt = <1400000>;
                                regulator-always-on;
                                regulator-boot-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        buck4_reg: BUCK4 {
                                regulator-max-microvolt = <1400000>;
                                regulator-always-on;
                                regulator-boot-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        buck5_reg: BUCK5 {
                                regulator-max-microvolt = <1500000>;
                                regulator-always-on;
                                regulator-boot-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        buck7_reg: BUCK7 {
-                               regulator-name = "vdd_1.0v_ldo";
-                               regulator-min-microvolt = <800000>;
+                               regulator-name = "vdd_1.35v_ldo";
+                               regulator-min-microvolt = <1200000>;
                                regulator-max-microvolt = <1500000>;
                                regulator-always-on;
                                regulator-boot-on;
                        };
 
                        buck8_reg: BUCK8 {
-                               regulator-name = "vdd_1.8v_ldo";
-                               regulator-min-microvolt = <800000>;
-                               regulator-max-microvolt = <2000000>;
+                               regulator-name = "vdd_2.0v_ldo";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <2100000>;
                                regulator-always-on;
                                regulator-boot-on;
                        };
                                regulator-max-microvolt = <3750000>;
                                regulator-always-on;
                                regulator-boot-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
 
                        buck10_reg: BUCK10 {
                                regulator-name = "vdd_vmem";
                                regulator-min-microvolt = <2850000>;
                                regulator-max-microvolt = <2850000>;
-                               regulator-always-on;
-                               regulator-boot-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
                        };
                };
        };
index 93a48f2dda49c5e3faf33f1b7b8f6652393be638..8388720374932d29459fd5ad0095d0c38dc553db 100644 (file)
        };
 };
 
+&buck10_reg {
+       /* Supplies vmmc-supply of mmc_0 */
+       regulator-always-on;
+       regulator-boot-on;
+};
+
 &hdmi {
        status = "okay";
        ddc = <&i2c_2>;
index ae866bcc30c4e3c029b96e7d41e79fe4ce9c6729..0b27bebf9528c20bcdb85f7d5c354e8937f44264 100644 (file)
                        interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
                };
 
+               adc: adc@12d10000 {
+                       compatible = "samsung,exynos-adc-v2";
+                       reg = <0x12d10000 0x100>;
+                       interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
+                       #io-channel-cells = <1>;
+                       io-channel-ranges;
+                       status = "disabled";
+               };
+
                /* i2c_0-3 are defined in exynos5.dtsi */
                hsi2c_4: i2c@12ca0000 {
                        compatible = "samsung,exynos5250-hsi2c";
index 3613f05f8a80aad7c2de243333f84dfc3c410a53..bfaa2de63a1001e7aec1ca5154b47f60983dad1c 100644 (file)
@@ -64,7 +64,7 @@
                gpio-sck = <&gpio1 5 GPIO_ACTIVE_HIGH>;
                gpio-miso = <&gpio1 8 GPIO_ACTIVE_HIGH>;
                gpio-mosi = <&gpio1 7 GPIO_ACTIVE_HIGH>;
-               cs-gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>;
+               cs-gpios = <&gpio0 20 GPIO_ACTIVE_LOW>;
                num-chipselects = <1>;
 
                panel: display@0 {
index bf0cb55809f8f7c07289c33ba58564080aca0adc..4263a9339c2e5899901041acaa2c16a34112e8ce 100644 (file)
                /* non-configurable replicators don't show up on the
                 * AMBA bus.  As such no need to add "arm,primecell".
                 */
-               compatible = "arm,coresight-replicator";
+               compatible = "arm,coresight-static-replicator";
 
                out-ports {
                        #address-cells = <1>;
                /* non-configurable replicators don't show up on the
                 * AMBA bus.  As such no need to add "arm,primecell".
                 */
-               compatible = "arm,coresight-replicator";
+               compatible = "arm,coresight-static-replicator";
 
                out-ports {
                        #address-cells = <1>;
                /* non-configurable replicators don't show up on the
                 * AMBA bus.  As such no need to add "arm,primecell".
                 */
-               compatible = "arm,coresight-replicator";
+               compatible = "arm,coresight-static-replicator";
 
                out-ports {
                        #address-cells = <1>;
                /* non-configurable replicators don't show up on the
                 * AMBA bus.  As such no need to add "arm,primecell".
                 */
-               compatible = "arm,coresight-replicator";
+               compatible = "arm,coresight-static-replicator";
 
                out-ports {
                        #address-cells = <1>;
        };
 
        funnel@0,e3c41000 {
-               compatible = "arm,coresight-funnel", "arm,primecell";
+               compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                reg = <0 0xe3c41000 0 0x1000>;
 
                clocks = <&clk_375m>;
        };
 
        funnel@0,e3c81000 {
-               compatible = "arm,coresight-funnel", "arm,primecell";
+               compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                reg = <0 0xe3c81000 0 0x1000>;
 
                clocks = <&clk_375m>;
        };
 
        funnel@0,e3cc1000 {
-               compatible = "arm,coresight-funnel", "arm,primecell";
+               compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                reg = <0 0xe3cc1000 0 0x1000>;
 
                clocks = <&clk_375m>;
        };
 
        funnel@0,e3d01000 {
-               compatible = "arm,coresight-funnel", "arm,primecell";
+               compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                reg = <0 0xe3d01000 0 0x1000>;
 
                clocks = <&clk_375m>;
        };
 
        funnel@0,e3c04000 {
-               compatible = "arm,coresight-funnel", "arm,primecell";
+               compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                reg = <0 0xe3c04000 0 0x1000>;
 
                clocks = <&clk_375m>;
diff --git a/arch/arm/boot/dts/ibm-power9-dual.dtsi b/arch/arm/boot/dts/ibm-power9-dual.dtsi
new file mode 100644 (file)
index 0000000..2abc42e
--- /dev/null
@@ -0,0 +1,248 @@
+// SPDX-License-Identifier: GPL-2.0+
+// Copyright 2018 IBM Corp
+
+&fsi {
+       cfam@0,0 {
+               reg = <0 0>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               chip-id = <0>;
+
+               scom@1000 {
+                       compatible = "ibm,fsi2pib";
+                       reg = <0x1000 0x400>;
+               };
+
+               i2c@1800 {
+                       compatible = "ibm,fsi-i2c-master";
+                       reg = <0x1800 0x400>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       cfam0_i2c0: i2c-bus@0 {
+                               reg = <0>;
+                       };
+
+                       cfam0_i2c1: i2c-bus@1 {
+                               reg = <1>;
+                       };
+
+                       cfam0_i2c2: i2c-bus@2 {
+                               reg = <2>;
+                       };
+
+                       cfam0_i2c3: i2c-bus@3 {
+                               reg = <3>;
+                       };
+
+                       cfam0_i2c4: i2c-bus@4 {
+                               reg = <4>;
+                       };
+
+                       cfam0_i2c5: i2c-bus@5 {
+                               reg = <5>;
+                       };
+
+                       cfam0_i2c6: i2c-bus@6 {
+                               reg = <6>;
+                       };
+
+                       cfam0_i2c7: i2c-bus@7 {
+                               reg = <7>;
+                       };
+
+                       cfam0_i2c8: i2c-bus@8 {
+                               reg = <8>;
+                       };
+
+                       cfam0_i2c9: i2c-bus@9 {
+                               reg = <9>;
+                       };
+
+                       cfam0_i2c10: i2c-bus@a {
+                               reg = <10>;
+                       };
+
+                       cfam0_i2c11: i2c-bus@b {
+                               reg = <11>;
+                       };
+
+                       cfam0_i2c12: i2c-bus@c {
+                               reg = <12>;
+                       };
+
+                       cfam0_i2c13: i2c-bus@d {
+                               reg = <13>;
+                       };
+
+                       cfam0_i2c14: i2c-bus@e {
+                               reg = <14>;
+                       };
+               };
+
+               sbefifo@2400 {
+                       compatible = "ibm,p9-sbefifo";
+                       reg = <0x2400 0x400>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       fsi_occ0: occ {
+                               compatible = "ibm,p9-occ";
+                       };
+               };
+
+               fsi_hub0: hub@3400 {
+                       compatible = "fsi-master-hub";
+                       reg = <0x3400 0x400>;
+                       #address-cells = <2>;
+                       #size-cells = <0>;
+
+                       no-scan-on-init;
+               };
+       };
+};
+
+&fsi_hub0 {
+       cfam@1,0 {
+               reg = <1 0>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               chip-id = <1>;
+
+               scom@1000 {
+                       compatible = "ibm,fsi2pib";
+                       reg = <0x1000 0x400>;
+               };
+
+               i2c@1800 {
+                       compatible = "ibm,fsi-i2c-master";
+                       reg = <0x1800 0x400>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       cfam1_i2c0: i2c-bus@0 {
+                               reg = <0>;
+                       };
+
+                       cfam1_i2c1: i2c-bus@1 {
+                               reg = <1>;
+                       };
+
+                       cfam1_i2c2: i2c-bus@2 {
+                               reg = <2>;
+                       };
+
+                       cfam1_i2c3: i2c-bus@3 {
+                               reg = <3>;
+                       };
+
+                       cfam1_i2c4: i2c-bus@4 {
+                               reg = <4>;
+                       };
+
+                       cfam1_i2c5: i2c-bus@5 {
+                               reg = <5>;
+                       };
+
+                       cfam1_i2c6: i2c-bus@6 {
+                               reg = <6>;
+                       };
+
+                       cfam1_i2c7: i2c-bus@7 {
+                               reg = <7>;
+                       };
+
+                       cfam1_i2c8: i2c-bus@8 {
+                               reg = <8>;
+                       };
+
+                       cfam1_i2c9: i2c-bus@9 {
+                               reg = <9>;
+                       };
+
+                       cfam1_i2c10: i2c-bus@a {
+                               reg = <10>;
+                       };
+
+                       cfam1_i2c11: i2c-bus@b {
+                               reg = <11>;
+                       };
+
+                       cfam1_i2c12: i2c-bus@c {
+                               reg = <12>;
+                       };
+
+                       cfam1_i2c13: i2c-bus@d {
+                               reg = <13>;
+                       };
+
+                       cfam1_i2c14: i2c-bus@e {
+                               reg = <14>;
+                       };
+               };
+
+               sbefifo@2400 {
+                       compatible = "ibm,p9-sbefifo";
+                       reg = <0x2400 0x400>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       fsi_occ1: occ {
+                               compatible = "ibm,p9-occ";
+                       };
+               };
+
+               fsi_hub1: hub@3400 {
+                       compatible = "fsi-master-hub";
+                       reg = <0x3400 0x400>;
+                       #address-cells = <2>;
+                       #size-cells = <0>;
+
+                       no-scan-on-init;
+               };
+       };
+};
+
+/* Legacy OCC numbering (to get rid of when userspace is fixed) */
+&fsi_occ0 {
+       reg = <1>;
+};
+
+&fsi_occ1 {
+       reg = <2>;
+};
+
+/ {
+       aliases {
+               i2c100 = &cfam0_i2c0;
+               i2c101 = &cfam0_i2c1;
+               i2c102 = &cfam0_i2c2;
+               i2c103 = &cfam0_i2c3;
+               i2c104 = &cfam0_i2c4;
+               i2c105 = &cfam0_i2c5;
+               i2c106 = &cfam0_i2c6;
+               i2c107 = &cfam0_i2c7;
+               i2c108 = &cfam0_i2c8;
+               i2c109 = &cfam0_i2c9;
+               i2c110 = &cfam0_i2c10;
+               i2c111 = &cfam0_i2c11;
+               i2c112 = &cfam0_i2c12;
+               i2c113 = &cfam0_i2c13;
+               i2c114 = &cfam0_i2c14;
+               i2c200 = &cfam1_i2c0;
+               i2c201 = &cfam1_i2c1;
+               i2c202 = &cfam1_i2c2;
+               i2c203 = &cfam1_i2c3;
+               i2c204 = &cfam1_i2c4;
+               i2c205 = &cfam1_i2c5;
+               i2c206 = &cfam1_i2c6;
+               i2c207 = &cfam1_i2c7;
+               i2c208 = &cfam1_i2c8;
+               i2c209 = &cfam1_i2c9;
+               i2c210 = &cfam1_i2c10;
+               i2c211 = &cfam1_i2c11;
+               i2c212 = &cfam1_i2c12;
+               i2c213 = &cfam1_i2c13;
+               i2c214 = &cfam1_i2c14;
+       };
+};
index f0a3fde0739c1d95a32f4ee367e4c07e507fd5e6..10acc5331ba6a2ee7828d5870396c3748b68fbb6 100644 (file)
        model = "MENLO M53 EMBEDDED DEVICE";
        compatible = "menlo,m53menlo", "fsl,imx53";
 
+       gpio-keys {
+               compatible = "gpio-keys";
+               pinctrl-0 = <&pinctrl_power_button>;
+               pinctrl-names = "default";
+
+               power-button {
+                       label = "Power button";
+                       gpios = <&gpio1 15 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_POWER>;
+               };
+       };
+
+       gpio-poweroff {
+               compatible = "gpio-poweroff";
+               pinctrl-0 = <&pinctrl_power_out>;
+               pinctrl-names = "default";
+               gpios = <&gpio1 13 GPIO_ACTIVE_LOW>;
+       };
+
        leds {
                compatible = "gpio-leds";
                pinctrl-names = "default";
@@ -30,7 +49,7 @@
                eth {
                        label = "EthLedYe";
                        gpios = <&gpio2 11 GPIO_ACTIVE_LOW>;
-                       linux,default-trigger = "none";
+                       linux,default-trigger = "netdev";
                };
        };
 
                };
        };
 
+       beeper {
+               compatible = "gpio-beeper";
+               pinctrl-0 = <&pinctrl_beeper>;
+               gpios = <&gpio6 3 GPIO_ACTIVE_HIGH>;
+       };
+
        reg_usbh1_vbus: regulator-usbh1-vbus {
                compatible = "regulator-fixed";
                regulator-name = "vbus";
                regulator-min-microvolt = <5000000>;
                regulator-max-microvolt = <5000000>;
-               gpio = <&gpio1 2 GPIO_ACTIVE_LOW>;
+               gpio = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
        };
 };
 
        assigned-clock-rates = <133333334>, <33333334>, <33333334>;
 };
 
+&ecspi2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ecspi2>;
+       cs-gpios = <&gpio2 26 GPIO_ACTIVE_HIGH>, <&gpio2 27 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+
+       spidev@0 {
+               compatible = "menlo,m53cpld";
+               spi-max-frequency = <25000000>;
+               reg = <0>;
+       };
+
+       spidev@1 {
+               compatible = "menlo,m53cpld";
+               spi-max-frequency = <25000000>;
+               reg = <1>;
+       };
+};
+
 &esdhc1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_esdhc1>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_fec>;
        phy-mode = "rmii";
+       phy-reset-gpios = <&gpio7 7 GPIO_ACTIVE_LOW>;
        status = "okay";
 };
 
+&gpio1 {
+       gpio-line-names =
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "";
+};
+
+&gpio2 {
+       gpio-line-names =
+               "", "", "", "",
+               "", "", "", "",
+               "TestPin_SV2_3", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "";
+};
+
+&gpio3 {
+       gpio-line-names =
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "CPLD_JTAG_TDI", "CPLD_JTAG_TMS", "", "",
+               "", "CPLD_JTAG_TDO", "", "";
+};
+
+&gpio5 {
+       gpio-line-names =
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "CPLD_JTAG_TCK", "KBD_intK",
+               "CPLD_int", "CPLD_JTAG_internal", "CPLD_D[0]", "CPLD_D[1]",
+               "CPLD_D[2]", "CPLD_D[3]", "CPLD_D[4]", "CPLD_D[5]",
+               "CPLD_D[6]", "CPLD_D[7]", "DISP_reset", "KBD_intI";
+};
+
+&gpio6 {
+       gpio-line-names =
+               "", "", "", "",
+               "CPLD_reset", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "";
+};
+
+&gpio7 {
+       gpio-line-names =
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "USB-OTG_OverCurrent", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "",
+               "", "", "", "";
+};
+
 &i2c1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_i2c1>;
        imx53-m53evk {
                hoggrp {
                        fsl,pins = <
-                               MX53_PAD_GPIO_0__CCM_SSI_EXT1_CLK       0x1c4
-                               MX53_PAD_EIM_EB3__GPIO2_31              0x1d5
-                               MX53_PAD_PATA_DA_0__GPIO7_6             0x1d5
-                               MX53_PAD_GPIO_19__CCM_CLKO              0x1d5
-                               MX53_PAD_CSI0_MCLK__CCM_CSI0_MCLK       0x1d5
-                               MX53_PAD_CSI0_DAT4__GPIO5_22            0x1d5
-                               MX53_PAD_CSI0_DAT5__GPIO5_23            0x1d5
-                               MX53_PAD_CSI0_DAT6__GPIO5_24            0x1d5
-                               MX53_PAD_CSI0_DAT7__GPIO5_25            0x1d5
-                               MX53_PAD_CSI0_DAT8__GPIO5_26            0x1d5
-                               MX53_PAD_CSI0_DAT9__GPIO5_27            0x1d5
-                               MX53_PAD_CSI0_DAT10__GPIO5_28           0x1d5
-                               MX53_PAD_CSI0_DAT11__GPIO5_29           0x1d5
-                               MX53_PAD_CSI0_DAT14__GPIO6_0            0x1d5
+                               MX53_PAD_GPIO_19__CCM_CLKO              0x1e4
+                               MX53_PAD_CSI0_DATA_EN__GPIO5_20         0x1e4
+                               MX53_PAD_CSI0_DAT4__GPIO5_22            0x1e4
+                               MX53_PAD_CSI0_DAT5__GPIO5_23            0x1c4
+                               MX53_PAD_CSI0_DAT6__GPIO5_24            0x1e4
+                               MX53_PAD_CSI0_DAT7__GPIO5_25            0x1e4
+                               MX53_PAD_CSI0_DAT8__GPIO5_26            0x1e4
+                               MX53_PAD_CSI0_DAT9__GPIO5_27            0x1c4
+                               MX53_PAD_CSI0_DAT10__GPIO5_28           0x1e4
+                               MX53_PAD_CSI0_DAT11__GPIO5_29           0x1e4
+                               MX53_PAD_PATA_DATA11__GPIO2_11          0x1e4
+                               MX53_PAD_EIM_D24__GPIO3_24              0x1e4
+                               MX53_PAD_EIM_D25__GPIO3_25              0x1e4
+                               MX53_PAD_EIM_D29__GPIO3_29              0x1e4
+                               MX53_PAD_CSI0_PIXCLK__GPIO5_18          0x1e4
+                               MX53_PAD_CSI0_VSYNC__GPIO5_21           0x1e4
+                               MX53_PAD_CSI0_DAT18__GPIO6_4            0x1c4
+                               MX53_PAD_PATA_DATA8__GPIO2_8            0x1e4
                        >;
                };
 
                pinctrl_led: ledgrp {
                        fsl,pins = <
-                               MX53_PAD_CSI0_DAT15__GPIO6_1            0x1d5
-                               MX53_PAD_CSI0_DAT16__GPIO6_2            0x1d5
+                               MX53_PAD_CSI0_DAT15__GPIO6_1            0x1c4
+                               MX53_PAD_CSI0_DAT16__GPIO6_2            0x1c4
+                       >;
+               };
+
+               pinctrl_beeper: beepergrp {
+                       fsl,pins = <
+                               MX53_PAD_CSI0_DAT17__GPIO6_3            0x1c4
                        >;
                };
 
 
                pinctrl_can2: can2grp {
                        fsl,pins = <
-                               MX53_PAD_KEY_COL4__CAN2_TXCAN           0x1c4
+                               MX53_PAD_KEY_COL4__CAN2_TXCAN           0x1e4
                                MX53_PAD_KEY_ROW4__CAN2_RXCAN           0x1c4
                        >;
                };
 
                pinctrl_display_gpio: display-gpiogrp {
                        fsl,pins = <
-                               MX53_PAD_CSI0_DAT12__GPIO5_30           0x1d5 /* Reset */
-                               MX53_PAD_CSI0_DAT13__GPIO5_31           0x1d5 /* Interrupt */
+                               MX53_PAD_CSI0_DAT12__GPIO5_30           0x1c4 /* Reset */
+                               MX53_PAD_CSI0_MCLK__GPIO5_19            0x1e4 /* Int-K */
+                               MX53_PAD_CSI0_DAT13__GPIO5_31           0x1c4 /* Int-I */
+
+                               MX53_PAD_CSI0_DAT14__GPIO6_0            0x1c4 /* Power down */
                        >;
                };
 
                pinctrl_edt_ft5x06: edt-ft5x06grp {
                        fsl,pins = <
-                               MX53_PAD_PATA_DATA9__GPIO2_9            0x1d5 /* Reset */
-                               MX53_PAD_CSI0_DAT19__GPIO6_5            0x1d5 /* Interrupt */
-                               MX53_PAD_PATA_DATA10__GPIO2_10          0x1d5 /* Wake */
+                               MX53_PAD_PATA_DATA9__GPIO2_9            0x1e4 /* Reset */
+                               MX53_PAD_CSI0_DAT19__GPIO6_5            0x1c4 /* Interrupt */
+                               MX53_PAD_PATA_DATA10__GPIO2_10          0x1e4 /* Wake */
+                       >;
+               };
+
+               pinctrl_ecspi2: ecspi2grp {
+                       fsl,pins = <
+                               MX53_PAD_EIM_CS0__ECSPI2_SCLK           0xe4
+                               MX53_PAD_EIM_OE__ECSPI2_MISO            0xe4
+                               MX53_PAD_EIM_CS1__ECSPI2_MOSI           0xe4
+                               MX53_PAD_EIM_RW__GPIO2_26               0xe4
+                               MX53_PAD_EIM_LBA__GPIO2_27              0xe4
                        >;
                };
 
                pinctrl_esdhc1: esdhc1grp {
                        fsl,pins = <
-                               MX53_PAD_SD1_DATA0__ESDHC1_DAT0         0x1d5
-                               MX53_PAD_SD1_DATA1__ESDHC1_DAT1         0x1d5
-                               MX53_PAD_SD1_DATA2__ESDHC1_DAT2         0x1d5
-                               MX53_PAD_SD1_DATA3__ESDHC1_DAT3         0x1d5
-                               MX53_PAD_SD1_CMD__ESDHC1_CMD            0x1d5
-                               MX53_PAD_SD1_CLK__ESDHC1_CLK            0x1d5
+                               MX53_PAD_SD1_DATA0__ESDHC1_DAT0         0x1e4
+                               MX53_PAD_SD1_DATA1__ESDHC1_DAT1         0x1e4
+                               MX53_PAD_SD1_DATA2__ESDHC1_DAT2         0x1e4
+                               MX53_PAD_SD1_DATA3__ESDHC1_DAT3         0x1e4
+                               MX53_PAD_SD1_CMD__ESDHC1_CMD            0x1e4
+                               MX53_PAD_SD1_CLK__ESDHC1_CLK            0x1e4
+                               MX53_PAD_GPIO_1__GPIO1_1                0x1c4
+                               MX53_PAD_GPIO_9__GPIO1_9                0x1e4
                        >;
                };
 
                pinctrl_fec: fecgrp {
                        fsl,pins = <
-                               MX53_PAD_FEC_MDC__FEC_MDC               0x4
-                               MX53_PAD_FEC_MDIO__FEC_MDIO             0x1fc
-                               MX53_PAD_FEC_REF_CLK__FEC_TX_CLK        0x180
-                               MX53_PAD_FEC_RX_ER__FEC_RX_ER           0x180
-                               MX53_PAD_FEC_CRS_DV__FEC_RX_DV          0x180
-                               MX53_PAD_FEC_RXD1__FEC_RDATA_1          0x180
-                               MX53_PAD_FEC_RXD0__FEC_RDATA_0          0x180
-                               MX53_PAD_FEC_TX_EN__FEC_TX_EN           0x4
-                               MX53_PAD_FEC_TXD1__FEC_TDATA_1          0x4
-                               MX53_PAD_FEC_TXD0__FEC_TDATA_0          0x4
+                               MX53_PAD_FEC_MDC__FEC_MDC               0x1e4
+                               MX53_PAD_FEC_MDIO__FEC_MDIO             0x1e4
+                               MX53_PAD_FEC_REF_CLK__FEC_TX_CLK        0x1e4
+                               MX53_PAD_FEC_RX_ER__FEC_RX_ER           0x1e4
+                               MX53_PAD_FEC_CRS_DV__FEC_RX_DV          0x1e4
+                               MX53_PAD_FEC_RXD1__FEC_RDATA_1          0x1e4
+                               MX53_PAD_FEC_RXD0__FEC_RDATA_0          0x1e4
+                               MX53_PAD_FEC_TX_EN__FEC_TX_EN           0x1c4
+                               MX53_PAD_FEC_TXD1__FEC_TDATA_1          0x1e4
+                               MX53_PAD_FEC_TXD0__FEC_TDATA_0          0x1e4
+                               MX53_PAD_PATA_DA_1__GPIO7_7             0x1e4
+                               MX53_PAD_EIM_EB3__GPIO2_31              0x1e4
                        >;
                };
 
                        >;
                };
 
+               pinctrl_power_button: powerbutgrp {
+                       fsl,pins = <
+                               MX53_PAD_SD2_DATA2__GPIO1_13            0x1e4
+                       >;
+               };
+
+               pinctrl_power_out: poweroutgrp {
+                       fsl,pins = <
+                               MX53_PAD_SD2_DATA0__GPIO1_15            0x1e4
+                       >;
+               };
+
                pinctrl_uart1: uart1grp {
                        fsl,pins = <
                                MX53_PAD_PATA_DIOW__UART1_TXD_MUX       0x1e4
                                MX53_PAD_PATA_DMACK__UART1_RXD_MUX      0x1e4
+                               MX53_PAD_PATA_IORDY__UART1_RTS          0x1e4
+                               MX53_PAD_PATA_RESET_B__UART1_CTS        0x1e4
                        >;
                };
 
                        fsl,pins = <
                                MX53_PAD_PATA_BUFFER_EN__UART2_RXD_MUX  0x1e4
                                MX53_PAD_PATA_DMARQ__UART2_TXD_MUX      0x1e4
+                               MX53_PAD_PATA_DIOR__UART2_RTS           0x1e4
+                               MX53_PAD_PATA_INTRQ__UART2_CTS          0x1e4
+                       >;
+               };
+
+               pinctrl_uart3: uart3grp {
+                       fsl,pins = <
+                               MX53_PAD_PATA_CS_1__UART3_RXD_MUX       0x1e4
+                               MX53_PAD_PATA_CS_0__UART3_TXD_MUX       0x1e4
+                               MX53_PAD_PATA_DA_2__UART3_RTS           0x1e4
                        >;
                };
 
                pinctrl_usb: usbgrp {
                        fsl,pins = <
-                               MX53_PAD_GPIO_2__GPIO1_2                0x1d5
-                               MX53_PAD_GPIO_3__USBOH3_USBH1_OC        0x1d5
+                               MX53_PAD_GPIO_2__GPIO1_2                0x1c4
+                               MX53_PAD_GPIO_3__USBOH3_USBH1_OC        0x1c4
+                               MX53_PAD_GPIO_4__GPIO1_4                0x1c4
+                               MX53_PAD_GPIO_18__GPIO7_13              0x1c4
                        >;
                };
        };
 &uart1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_uart1>;
+       uart-has-rtscts;
        status = "okay";
 };
 
 &uart2 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_uart2>;
+       uart-has-rtscts;
+       status = "okay";
+};
+
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart3>;
+       linux,rs485-enabled-at-boot-time;
        status = "okay";
 };
 
        pinctrl-0 = <&pinctrl_usb>;
        vbus-supply = <&reg_usbh1_vbus>;
        phy_type = "utmi";
-       dr_mode = "peripheral";
+       dr_mode = "host";
        status = "okay";
 };
 
index 09071ca11c6cfa1d0ef5adbed75289847d00caab..ec9fb8940ffa22e7c587bba9b7d4fe498988c47c 100644 (file)
                        >;
                };
 
+               pinctrl_ipu_csi0: ipucsi0grp {
+                       fsl,pins = <
+                               MX53_PAD_CSI0_DAT12__IPU_CSI0_D_12    0x1c4
+                               MX53_PAD_CSI0_DAT13__IPU_CSI0_D_13    0x1c4
+                               MX53_PAD_CSI0_DAT14__IPU_CSI0_D_14    0x1c4
+                               MX53_PAD_CSI0_DAT15__IPU_CSI0_D_15    0x1c4
+                               MX53_PAD_CSI0_DAT16__IPU_CSI0_D_16    0x1c4
+                               MX53_PAD_CSI0_DAT17__IPU_CSI0_D_17    0x1c4
+                               MX53_PAD_CSI0_DAT18__IPU_CSI0_D_18    0x1c4
+                               MX53_PAD_CSI0_DAT19__IPU_CSI0_D_19    0x1c4
+                               MX53_PAD_CSI0_PIXCLK__IPU_CSI0_PIXCLK 0x1e4
+                               MX53_PAD_CSI0_VSYNC__IPU_CSI0_VSYNC   0x1e4
+                               MX53_PAD_CSI0_MCLK__IPU_CSI0_HSYNC    0x1e4
+                               MX53_PAD_CSI0_DATA_EN__IPU_CSI0_DATA_EN 0x1e4
+                       >;
+               };
+
+               pinctrl_ov5642: ov5642grp {
+                       fsl,pins = <
+                               MX53_PAD_NANDF_WP_B__GPIO6_9   0x1e4
+                               MX53_PAD_NANDF_RB0__GPIO6_10   0x1e4
+                               MX53_PAD_GPIO_0__CCM_SSI_EXT1_CLK 0x1c4
+                       >;
+               };
+
                pinctrl_uart1: uart1grp {
                        fsl,pins = <
                                MX53_PAD_CSI0_DAT10__UART1_TXD_MUX      0x1e4
        camera: ov5642@3c {
                compatible = "ovti,ov5642";
                reg = <0x3c>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_ov5642>;
+               assigned-clocks = <&clks IMX5_CLK_SSI_EXT1_SEL>,
+                                 <&clks IMX5_CLK_SSI_EXT1_COM_SEL>;
+               assigned-clock-parents = <&clks IMX5_CLK_PLL2_SW>,
+                                        <&clks IMX5_CLK_SSI_EXT1_PODF>;
+               assigned-clock-rates = <0>, <24000000>;
+               clocks = <&clks IMX5_CLK_SSI_EXT1_GATE>;
+               clock-names = "xclk";
+               DVDD-supply = <&ldo9_reg>;
+               AVDD-supply = <&ldo7_reg>;
+               reset-gpios = <&gpio6 9 GPIO_ACTIVE_LOW>;
+               powerdown-gpios = <&gpio6 10 GPIO_ACTIVE_HIGH>;
+
+               port {
+                       ov5642_to_ipu_csi0: endpoint {
+                               remote-endpoint = <&ipu_csi0_from_parallel_sensor>;
+                               bus-width = <8>;
+                               hsync-active = <1>;
+                               vsync-active = <1>;
+                       };
+               };
        };
 
        pmic: dialog@48 {
                compatible = "dlg,da9053", "dlg,da9052";
                reg = <0x48>;
+               interrupt-parent = <&gpio7>;
+               interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
+
+               regulators {
+                       ldo7_reg: ldo7 {
+                               regulator-min-microvolt = <1200000>;
+                               regulator-max-microvolt = <3600000>;
+                       };
+
+                       ldo9_reg: ldo9 {
+                               regulator-min-microvolt = <1250000>;
+                               regulator-max-microvolt = <3650000>;
+                       };
+               };
        };
 };
 
        phy-reset-gpios = <&gpio7 6 GPIO_ACTIVE_LOW>;
        status = "okay";
 };
+
+&ipu_csi0_from_parallel_sensor {
+       remote-endpoint = <&ov5642_to_ipu_csi0>;
+       data-shift = <12>; /* Lines 19:12 used */
+       hsync-active = <1>;
+       vsync-active = <1>;
+};
+
+&ipu_csi0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ipu_csi0>;
+};
index 9b672ed2486d12b87872d4b355a109c54c5320ef..ed341cfd9d097a4298f219be355c67c8fc02328e 100644 (file)
@@ -31,6 +31,7 @@
                i2c0 = &i2c1;
                i2c1 = &i2c2;
                i2c2 = &i2c3;
+               ipu0 = &ipu;
                mmc0 = &esdhc1;
                mmc1 = &esdhc2;
                mmc2 = &esdhc3;
                ports = <&ipu_di0>, <&ipu_di1>;
        };
 
+       capture_subsystem {
+               compatible = "fsl,imx-capture-subsystem";
+               ports = <&ipu_csi0>, <&ipu_csi1>;
+       };
+
        tzic: tz-interrupt-controller@fffc000 {
                compatible = "fsl,imx53-tzic", "fsl,tzic";
                interrupt-controller;
 
                        ipu_csi0: port@0 {
                                reg = <0>;
+
+                               ipu_csi0_from_parallel_sensor: endpoint {
+                               };
                        };
 
                        ipu_csi1: port@1 {
                                reg = <1>;
+
+                               ipu_csi1_from_parallel_sensor: endpoint {
+                               };
                        };
 
                        ipu_di0: port@2 {
diff --git a/arch/arm/boot/dts/imx6dl-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6dl-kontron-samx6i.dtsi
new file mode 100644 (file)
index 0000000..a864fdb
--- /dev/null
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0 OR X11
+/*
+ * Copyright 2019 (C) Pengutronix, Marco Felsch <kernel@pengutronix.de>
+ */
+
+#include "imx6dl.dtsi"
+#include "imx6qdl-kontron-samx6i.dtsi"
+
+/ {
+       model = "Kontron SMARC sAMX6i Dual-Lite/Solo";
+       compatible = "kontron,imx6dl-samx6i", "fsl,imx6dl";
+};
diff --git a/arch/arm/boot/dts/imx6q-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6q-kontron-samx6i.dtsi
new file mode 100644 (file)
index 0000000..2618ecc
--- /dev/null
@@ -0,0 +1,36 @@
+// SPDX-License-Identifier: GPL-2.0 OR X11
+/*
+ * Copyright 2019 (C) Pengutronix, Marco Felsch <kernel@pengutronix.de>
+ */
+
+#include "imx6q.dtsi"
+#include "imx6qdl-kontron-samx6i.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+       model = "Kontron SMARC sAMX6i Quad/Dual";
+       compatible = "kontron,imx6q-samx6i", "fsl,imx6q";
+};
+
+/* Quad/Dual SoMs have 3 chip-select signals */
+&ecspi4 {
+       fsl,spi-num-chipselects = <3>;
+       cs-gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>,
+                  <&gpio3 29 GPIO_ACTIVE_HIGH>,
+                  <&gpio3 25 GPIO_ACTIVE_HIGH>;
+};
+
+&pinctrl_ecspi4 {
+       fsl,pins = <
+               MX6QDL_PAD_EIM_D21__ECSPI4_SCLK 0x100b1
+               MX6QDL_PAD_EIM_D28__ECSPI4_MOSI 0x100b1
+               MX6QDL_PAD_EIM_D22__ECSPI4_MISO 0x100b1
+
+               /* SPI4_IMX_CS2# - connected to internal flash */
+               MX6QDL_PAD_EIM_D24__GPIO3_IO24 0x1b0b0
+               /* SPI4_IMX_CS0# - connected to SMARC SPI0_CS0# */
+               MX6QDL_PAD_EIM_D29__GPIO3_IO29 0x1b0b0
+               /* SPI4_CS3# - connected to  SMARC SPI0_CS1# */
+               MX6QDL_PAD_EIM_D25__GPIO3_IO25 0x1b0b0
+       >;
+};
diff --git a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
new file mode 100644 (file)
index 0000000..81c7ebb
--- /dev/null
@@ -0,0 +1,815 @@
+// SPDX-License-Identifier: GPL-2.0 OR X11
+/*
+ * Copyright 2017 (C) Priit Laes <plaes@plaes.org>
+ * Copyright 2018 (C) Pengutronix, Michael Grzeschik <mgr@pengutronix.de>
+ * Copyright 2019 (C) Pengutronix, Marco Felsch <kernel@pengutronix.de>
+ *
+ * Based on initial work by Nikita Yushchenko <nyushchenko at dev.rtsoft.ru>
+ */
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/sound/fsl-imx-audmux.h>
+
+/ {
+       reg_1p0v_s0: regulator-1p0v-s0 {
+               compatible = "regulator-fixed";
+               regulator-name = "V_1V0_S0";
+               regulator-min-microvolt = <1000000>;
+               regulator-max-microvolt = <1000000>;
+               regulator-always-on;
+               regulator-boot-on;
+               vin-supply = <&reg_smarc_suppy>;
+       };
+
+       reg_1p35v_vcoredig_s5: regulator-1p35v-vcoredig-s5 {
+               compatible = "regulator-fixed";
+               regulator-name = "V_1V35_VCOREDIG_S5";
+               regulator-min-microvolt = <1350000>;
+               regulator-max-microvolt = <1350000>;
+               regulator-always-on;
+               regulator-boot-on;
+               vin-supply = <&reg_3p3v_s5>;
+       };
+
+       reg_1p8v_s5: regulator-1p8v-s5 {
+               compatible = "regulator-fixed";
+               regulator-name = "V_1V8_S5";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               regulator-always-on;
+               regulator-boot-on;
+               vin-supply = <&reg_3p3v_s5>;
+       };
+
+       reg_3p3v_s0: regulator-3p3v-s0 {
+               compatible = "regulator-fixed";
+               regulator-name = "V_3V3_S0";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+               regulator-boot-on;
+               vin-supply = <&reg_3p3v_s5>;
+       };
+
+       reg_3p3v_s0: regulator-3p3v-s0 {
+               compatible = "regulator-fixed";
+               regulator-name = "V_3V3_S0";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+               regulator-boot-on;
+               vin-supply = <&reg_3p3v_s5>;
+       };
+
+       reg_3p3v_s5: regulator-3p3v-s5 {
+               compatible = "regulator-fixed";
+               regulator-name = "V_3V3_S5";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+               regulator-boot-on;
+               vin-supply = <&reg_smarc_suppy>;
+       };
+
+       reg_smarc_lcdbklt: regulator-smarc-lcdbklt {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_lcdbklt_en>;
+               regulator-name = "LCD_BKLT_EN";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               gpio = <&gpio1 16 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       reg_smarc_lcdvdd: regulator-smarc-lcdvdd {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_lcdvdd_en>;
+               regulator-name = "LCD_VDD_EN";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               gpio = <&gpio1 17 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       reg_smarc_rtc: regulator-smarc-rtc {
+               compatible = "regulator-fixed";
+               regulator-name = "V_IN_RTC_BATT";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
+       /* Module supply range can be 3.00V ... 5.25V */
+       reg_smarc_suppy: regulator-smarc-supply {
+               compatible = "regulator-fixed";
+               regulator-name = "V_IN_WIDE";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
+       lcd: lcd {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "fsl,imx-parallel-display";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_lcd>;
+               status = "disabled";
+
+               port@0 {
+                       reg = <0>;
+
+                       lcd_in: endpoint {
+                       };
+               };
+
+               port@1 {
+                       reg = <1>;
+
+                       lcd_out: endpoint {
+                       };
+               };
+       };
+
+       lcd_backlight: lcd-backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm4 0 5000000>;
+               pwm-names = "LCD_BKLT_PWM";
+
+               brightness-levels = <0 10 20 30 40 50 60 70 80 90 100>;
+               default-brightness-level = <4>;
+
+               power-supply = <&reg_smarc_lcdbklt>;
+               status = "disabled";
+       };
+
+       i2c_intern: i2c-gpio-intern {
+               compatible = "i2c-gpio";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_i2c_gpio_intern>;
+               sda-gpios = <&gpio1 28 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+               scl-gpios = <&gpio1 30 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+               i2c-gpio,delay-us = <2>; /* ~100 kHz */
+               #address-cells = <1>;
+               #size-cells = <0>;
+       };
+
+       i2c_lcd: i2c-gpio-lcd {
+               compatible = "i2c-gpio";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_i2c_gpio_lcd>;
+               sda-gpios = <&gpio1 21 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+               scl-gpios = <&gpio1 19 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+               i2c-gpio,delay-us = <2>; /* ~100 kHz */
+               #address-cells = <1>;
+               #size-cells = <0>;
+               status = "disabld";
+       };
+
+       i2c_cam: i2c-gpio-cam {
+               compatible = "i2c-gpio";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_i2c_gpio_cam>;
+               sda-gpios = <&gpio4 10 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+               scl-gpios = <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+               i2c-gpio,delay-us = <2>; /* ~100 kHz */
+               #address-cells = <1>;
+               #size-cells = <0>;
+               status = "disabld";
+       };
+};
+
+/* I2S0, I2S1 */
+&audmux {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_audmux>;
+
+       audmux_ssi1 {
+               fsl,audmux-port = <MX51_AUDMUX_PORT1_SSI0>;
+               fsl,port-config = <
+                       (IMX_AUDMUX_V2_PTCR_TFSEL(MX51_AUDMUX_PORT3) |
+                        IMX_AUDMUX_V2_PTCR_TCSEL(MX51_AUDMUX_PORT3) |
+                        IMX_AUDMUX_V2_PTCR_SYN    |
+                        IMX_AUDMUX_V2_PTCR_TFSDIR |
+                        IMX_AUDMUX_V2_PTCR_TCLKDIR)
+                       IMX_AUDMUX_V2_PDCR_RXDSEL(MX51_AUDMUX_PORT3)
+               >;
+       };
+
+       audmux_adu3 {
+               fsl,audmux-port = <MX51_AUDMUX_PORT3>;
+               fsl,port-config = <
+                       IMX_AUDMUX_V2_PTCR_SYN
+                       IMX_AUDMUX_V2_PDCR_RXDSEL(MX51_AUDMUX_PORT1_SSI0)
+               >;
+       };
+
+       audmux_ssi2 {
+               fsl,audmux-port = <MX51_AUDMUX_PORT2_SSI1>;
+               fsl,port-config = <
+                       (IMX_AUDMUX_V2_PTCR_TFSEL(MX51_AUDMUX_PORT4) |
+                        IMX_AUDMUX_V2_PTCR_TCSEL(MX51_AUDMUX_PORT4) |
+                        IMX_AUDMUX_V2_PTCR_SYN    |
+                        IMX_AUDMUX_V2_PTCR_TFSDIR |
+                        IMX_AUDMUX_V2_PTCR_TCLKDIR)
+                       IMX_AUDMUX_V2_PDCR_RXDSEL(MX51_AUDMUX_PORT4)
+               >;
+       };
+
+       audmux_adu4 {
+               fsl,audmux-port = <MX51_AUDMUX_PORT4>;
+               fsl,port-config = <
+                       IMX_AUDMUX_V2_PTCR_SYN
+                       IMX_AUDMUX_V2_PDCR_RXDSEL(MX51_AUDMUX_PORT2_SSI1)
+               >;
+       };
+};
+
+/* CAN0 */
+&can1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_flexcan1>;
+};
+
+/* CAN1 */
+&can2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_flexcan2>;
+};
+
+/* SPI1 */
+&ecspi2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ecspi2>;
+       cs-gpios = <&gpio2 26 GPIO_ACTIVE_HIGH>,
+                  <&gpio2 27 GPIO_ACTIVE_HIGH>;
+};
+
+/* SPI0 */
+&ecspi4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ecspi4>;
+       cs-gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>,
+                  <&gpio3 29 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+
+       /* default boot source: workaround #1 for errata ERR006282 */
+       smarc_flash: spi-flash@0 {
+               compatible = "winbond,w25q16dw", "jedec,spi-nor";
+               reg = <0>;
+               spi-max-frequency = <20000000>;
+       };
+};
+
+/* GBE */
+&fec {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_enet>;
+       phy-mode = "rgmii";
+       phy-reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>;
+};
+
+&i2c_intern {
+       pmic@8 {
+               compatible = "fsl,pfuze100";
+               reg = <0x08>;
+
+               regulators {
+                       reg_v_core_s0: sw1ab {
+                               regulator-name = "V_CORE_S0";
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       reg_vddsoc_s0: sw1c {
+                               regulator-name = "V_VDDSOC_S0";
+                               regulator-min-microvolt = <300000>;
+                               regulator-max-microvolt = <1875000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       reg_3p15v_s0: sw2 {
+                               regulator-name = "V_3V15_S0";
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       /* sw3a/b is used in dual mode, but driver does not
+                        * support it. Although, there's no need to control
+                        * DDR power - so just leaving dummy entries for sw3a
+                        * and sw3b for now.
+                        */
+                       sw3a {
+                               regulator-min-microvolt = <400000>;
+                               regulator-max-microvolt = <1975000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       sw3b {
+                               regulator-min-microvolt = <400000>;
+                               regulator-max-microvolt = <1975000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       reg_1p8v_s0: sw4 {
+                               regulator-name = "V_1V8_S0";
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       /* Regulator for USB */
+                       reg_5p0v_s0: swbst {
+                               regulator-name = "V_5V0_S0";
+                               regulator-min-microvolt = <5000000>;
+                               regulator-max-microvolt = <5150000>;
+                               regulator-boot-on;
+                       };
+
+                       reg_vsnvs: vsnvs {
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <3000000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       reg_vrefddr: vrefddr {
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       /*
+                        * Per schematics, of all VGEN's, only VGEN5 has some
+                        * usage ... but even that - over DNI resistor
+                        */
+                       vgen1 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1550000>;
+                       };
+
+                       vgen2 {
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1550000>;
+                       };
+
+                       vgen3 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                       };
+
+                       vgen4 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                       };
+
+                       reg_2p5v_s0: vgen5 {
+                               regulator-name = "V_2V5_S0";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                       };
+
+                       vgen6 {
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                       };
+               };
+       };
+};
+
+/* I2C_GP */
+&i2c1 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+};
+
+/* HDMI_CTRL */
+&i2c2 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+};
+
+/* I2C_PM */
+&i2c3 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c3>;
+       status = "okay";
+
+       smarc_eeprom: eeprom@50 {
+               compatible = "atmel,24c32";
+               reg = <0x50>;
+               pagesize = <32>;
+       };
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_mgmt_gpios &pinctrl_gpio>;
+
+       pinctrl_audmux: audmuxgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT4__AUD3_TXC          0x130b0
+                       MX6QDL_PAD_CSI0_DAT5__AUD3_TXD          0x130b0
+                       MX6QDL_PAD_CSI0_DAT6__AUD3_TXFS         0x130b0
+                       MX6QDL_PAD_CSI0_DAT7__AUD3_RXD          0x130b0
+
+                       MX6QDL_PAD_DISP0_DAT20__AUD4_TXC        0x130b0
+                       MX6QDL_PAD_DISP0_DAT21__AUD4_TXD        0x130b0
+                       MX6QDL_PAD_DISP0_DAT22__AUD4_TXFS       0x130b0
+                       MX6QDL_PAD_DISP0_DAT23__AUD4_RXD        0x130b0
+
+                       /* AUDIO MCLK */
+                       MX6QDL_PAD_NANDF_CS2__CCM_CLKO2         0x000b0
+               >;
+       };
+
+       pinctrl_ecspi2: ecspi2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_CS0__ECSPI2_SCLK 0x100b1
+                       MX6QDL_PAD_EIM_CS1__ECSPI2_MOSI 0x100b1
+                       MX6QDL_PAD_EIM_OE__ECSPI2_MISO  0x100b1
+
+                       MX6QDL_PAD_EIM_RW__GPIO2_IO26  0x1b0b0 /* CS0 */
+                       MX6QDL_PAD_EIM_LBA__GPIO2_IO27 0x1b0b0 /* CS1 */
+               >;
+       };
+
+       pinctrl_ecspi4: ecspi4grp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D21__ECSPI4_SCLK 0x100b1
+                       MX6QDL_PAD_EIM_D28__ECSPI4_MOSI 0x100b1
+                       MX6QDL_PAD_EIM_D22__ECSPI4_MISO 0x100b1
+
+                       /* SPI_IMX_CS2# - connected to internal flash */
+                       MX6QDL_PAD_EIM_D24__GPIO3_IO24 0x1b0b0
+                       /* SPI_IMX_CS0# - connected to SMARC SPI0_CS0# */
+                       MX6QDL_PAD_EIM_D29__GPIO3_IO29 0x1b0b0
+               >;
+       };
+
+       pinctrl_flexcan1: flexcan1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_7__FLEXCAN1_TX 0x1b0b0
+                       MX6QDL_PAD_GPIO_8__FLEXCAN1_RX 0x1b0b0
+               >;
+       };
+
+       pinctrl_flexcan2: flexcan2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_COL4__FLEXCAN2_TX 0x1b0b0
+                       MX6QDL_PAD_KEY_ROW4__FLEXCAN2_RX 0x1b0b0
+               >;
+       };
+
+       pinctrl_gpio: gpiogrp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_DA0__GPIO3_IO00  0x1b0b0 /* GPIO0 / CAM0_PWR# */
+                       MX6QDL_PAD_EIM_DA1__GPIO3_IO01  0x1b0b0 /* GPIO1 / CAM1_PWR# */
+                       MX6QDL_PAD_EIM_DA2__GPIO3_IO02  0x1b0b0 /* GPIO2 / CAM0_RST# */
+                       MX6QDL_PAD_EIM_DA3__GPIO3_IO03  0x1b0b0 /* GPIO3 / CAM1_RST# */
+                       MX6QDL_PAD_EIM_DA4__GPIO3_IO04  0x1b0b0 /* GPIO4 / HDA_RST#  */
+                       MX6QDL_PAD_EIM_DA5__GPIO3_IO05  0x1b0b0 /* GPIO5 / PWM_OUT   */
+                       MX6QDL_PAD_EIM_DA6__GPIO3_IO06  0x1b0b0 /* GPIO6 / TACHIN    */
+                       MX6QDL_PAD_EIM_DA7__GPIO3_IO07  0x1b0b0 /* GPIO7 / PCAM_FLD  */
+                       MX6QDL_PAD_EIM_DA8__GPIO3_IO08  0x1b0b0 /* GPIO8 / CAN0_ERR# */
+                       MX6QDL_PAD_EIM_DA9__GPIO3_IO09  0x1b0b0 /* GPIO9 / CAN1_ERR# */
+                       MX6QDL_PAD_EIM_DA10__GPIO3_IO10 0x1b0b0 /* GPIO10            */
+                       MX6QDL_PAD_EIM_DA11__GPIO3_IO11 0x1b0b0 /* GPIO11            */
+               >;
+       };
+
+       pinctrl_enet: enetgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_RGMII_TXC__RGMII_TXC       0x1b0b0
+                       MX6QDL_PAD_RGMII_TD0__RGMII_TD0       0x1b0b0
+                       MX6QDL_PAD_RGMII_TD1__RGMII_TD1       0x1b0b0
+                       MX6QDL_PAD_RGMII_TD2__RGMII_TD2       0x1b0b0
+                       MX6QDL_PAD_RGMII_TD3__RGMII_TD3       0x1b0b0
+                       MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
+                       MX6QDL_PAD_RGMII_RXC__RGMII_RXC       0x1b0b0
+                       MX6QDL_PAD_RGMII_RD0__RGMII_RD0       0x1b0b0
+                       MX6QDL_PAD_RGMII_RD1__RGMII_RD1       0x1b0b0
+                       MX6QDL_PAD_RGMII_RD2__RGMII_RD2       0x1b0b0
+                       MX6QDL_PAD_RGMII_RD3__RGMII_RD3       0x1b0b0
+                       MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
+
+                       MX6QDL_PAD_ENET_MDIO__ENET_MDIO       0x1b0b0
+                       MX6QDL_PAD_ENET_MDC__ENET_MDC         0x1b0b0
+                       MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK  0x1b0b0
+                       MX6QDL_PAD_ENET_CRS_DV__GPIO1_IO25    0x1b0b0 /* RST_GBE0_PHY# */
+               >;
+       };
+
+       pinctrl_i2c_gpio_cam: i2c-gpiocamgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_6__GPIO1_IO06   0x1b0b0 /* SCL */
+                       MX6QDL_PAD_KEY_COL2__GPIO4_IO10 0x1b0b0 /* SDA */
+               >;
+       };
+
+       pinctrl_i2c_gpio_intern: i2c-gpiointerngrp {
+               fsl,pins = <
+                       MX6QDL_PAD_ENET_TXD0__GPIO1_IO30  0x1b0b0 /* SCL */
+                       MX6QDL_PAD_ENET_TX_EN__GPIO1_IO28 0x1b0b0 /* SDA */
+               >;
+       };
+
+       pinctrl_i2c_gpio_lcd: i2c-gpiolcdgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD1_DAT2__GPIO1_IO19 0x1b0b0 /* SCL */
+                       MX6QDL_PAD_SD1_DAT3__GPIO1_IO21 0x1b0b0 /* SDA */
+               >;
+       };
+
+       pinctrl_i2c1: i2c1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT9__I2C1_SCL          0x4001b8b1
+                       MX6QDL_PAD_CSI0_DAT8__I2C1_SDA          0x4001b8b1
+               >;
+       };
+
+       pinctrl_i2c2: i2c2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_KEY_COL3__I2C2_SCL           0x4001b8b1
+                       MX6QDL_PAD_KEY_ROW3__I2C2_SDA           0x4001b8b1
+               >;
+       };
+
+       pinctrl_i2c3: i2c3grp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_3__I2C3_SCL             0x4001b8b1
+                       MX6QDL_PAD_GPIO_16__I2C3_SDA            0x4001b8b1
+               >;
+       };
+
+       pinctrl_lcd: lcdgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_DISP0_DAT0__IPU1_DISP0_DATA00  0x100f1
+                       MX6QDL_PAD_DISP0_DAT1__IPU1_DISP0_DATA01  0x100f1
+                       MX6QDL_PAD_DISP0_DAT2__IPU1_DISP0_DATA02  0x100f1
+                       MX6QDL_PAD_DISP0_DAT3__IPU1_DISP0_DATA03  0x100f1
+                       MX6QDL_PAD_DISP0_DAT4__IPU1_DISP0_DATA04  0x100f1
+                       MX6QDL_PAD_DISP0_DAT5__IPU1_DISP0_DATA05  0x100f1
+                       MX6QDL_PAD_DISP0_DAT6__IPU1_DISP0_DATA06  0x100f1
+                       MX6QDL_PAD_DISP0_DAT7__IPU1_DISP0_DATA07  0x100f1
+                       MX6QDL_PAD_DISP0_DAT8__IPU1_DISP0_DATA08  0x100f1
+                       MX6QDL_PAD_DISP0_DAT9__IPU1_DISP0_DATA09  0x100f1
+                       MX6QDL_PAD_DISP0_DAT10__IPU1_DISP0_DATA10 0x100f1
+                       MX6QDL_PAD_DISP0_DAT11__IPU1_DISP0_DATA11 0x100f1
+                       MX6QDL_PAD_DISP0_DAT12__IPU1_DISP0_DATA12 0x100f1
+                       MX6QDL_PAD_DISP0_DAT13__IPU1_DISP0_DATA13 0x100f1
+                       MX6QDL_PAD_DISP0_DAT14__IPU1_DISP0_DATA14 0x100f1
+                       MX6QDL_PAD_DISP0_DAT15__IPU1_DISP0_DATA15 0x100f1
+                       MX6QDL_PAD_DISP0_DAT16__IPU1_DISP0_DATA16 0x100f1
+                       MX6QDL_PAD_DISP0_DAT17__IPU1_DISP0_DATA17 0x100f1
+                       MX6QDL_PAD_DISP0_DAT18__IPU1_DISP0_DATA18 0x100f1
+                       MX6QDL_PAD_DISP0_DAT19__IPU1_DISP0_DATA19 0x100f1
+                       MX6QDL_PAD_DISP0_DAT20__IPU1_DISP0_DATA20 0x100f1
+                       MX6QDL_PAD_DISP0_DAT21__IPU1_DISP0_DATA21 0x100f1
+                       MX6QDL_PAD_DISP0_DAT22__IPU1_DISP0_DATA22 0x100f1
+                       MX6QDL_PAD_DISP0_DAT23__IPU1_DISP0_DATA23 0x100f1
+
+                       MX6QDL_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK 0x100f1
+                       MX6QDL_PAD_DI0_PIN15__IPU1_DI0_PIN15       0x100f1 /* DE */
+                       MX6QDL_PAD_DI0_PIN2__IPU1_DI0_PIN02        0x100f1 /* HSYNC */
+                       MX6QDL_PAD_DI0_PIN3__IPU1_DI0_PIN03        0x100f1 /* VSYNC */
+               >;
+       };
+
+       pinctrl_lcdbklt_en: lcdbkltengrp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD1_DAT0__GPIO1_IO16 0x1b0b1
+               >;
+       };
+
+       pinctrl_lcdvdd_en: lcdvddengrp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD1_DAT1__GPIO1_IO17 0x1b0b0
+               >;
+       };
+
+       pinctrl_mipi_csi: mipi-csigrp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_MCLK__CCM_CLKO1 0x000b0 /* CSI0/1 MCLK */
+               >;
+       };
+
+       pinctrl_mgmt_gpios: mgmt-gpiosgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_WAIT__GPIO5_IO00         0x1b0b0 /* LID#           */
+                       MX6QDL_PAD_SD3_DAT7__GPIO6_IO17         0x1b0b0 /* SLEEP#         */
+                       MX6QDL_PAD_GPIO_17__GPIO7_IO12          0x1b0b0 /* CHARGING#      */
+                       MX6QDL_PAD_GPIO_0__GPIO1_IO00           0x1b0b0 /* CHARGER_PRSNT# */
+                       MX6QDL_PAD_SD1_CLK__GPIO1_IO20          0x1b0b0 /* CARRIER_STBY#  */
+                       MX6QDL_PAD_DI0_PIN4__GPIO4_IO20         0x1b0b0 /* BATLOW#        */
+                       MX6QDL_PAD_CSI0_VSYNC__GPIO5_IO21       0x1b0b0 /* TEST#          */
+                       MX6QDL_PAD_GPIO_2__GPIO1_IO02           0x1b0b0 /* VDD_IO_SEL_D#  */
+                       MX6QDL_PAD_NANDF_CS3__GPIO6_IO16        0x1b0b0 /* POWER_BTN#     */
+               >;
+       };
+
+       pinctrl_pcie: pciegrp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D18__GPIO3_IO18  0x1b0b0 /* PCI_A_PRSNT# */
+                       MX6QDL_PAD_EIM_DA13__GPIO3_IO13 0x1b0b0 /* RST_PCIE_A#  */
+                       MX6QDL_PAD_SD3_DAT6__GPIO6_IO18 0x1b0b0 /* PCIE_WAKE#   */
+               >;
+       };
+
+       pinctrl_pwm4: pwm4grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD1_CMD__PWM4_OUT 0x1b0b1
+               >;
+       };
+
+       pinctrl_uart1: uart1grp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA 0x1b0b1
+                       MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA 0x1b0b1
+                       MX6QDL_PAD_EIM_D20__UART1_RTS_B 0x1b0b1
+                       MX6QDL_PAD_EIM_D19__UART1_CTS_B 0x1b0b1
+               >;
+       };
+
+       pinctrl_uart2: uart2grp {
+               fsl,pins = <
+                       MX6QDL_PAD_EIM_D27__UART2_RX_DATA 0x1b0b1
+                       MX6QDL_PAD_EIM_D26__UART2_TX_DATA 0x1b0b1
+               >;
+       };
+
+       pinctrl_uart4: uart4grp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT13__UART4_RX_DATA 0x1b0b1
+                       MX6QDL_PAD_CSI0_DAT12__UART4_TX_DATA 0x1b0b1
+                       MX6QDL_PAD_CSI0_DAT16__UART4_RTS_B 0x1b0b1
+                       MX6QDL_PAD_CSI0_DAT17__UART4_CTS_B 0x1b0b1
+               >;
+       };
+
+       pinctrl_uart5: uart5grp {
+               fsl,pins = <
+                       MX6QDL_PAD_CSI0_DAT15__UART5_RX_DATA 0x1b0b1
+                       MX6QDL_PAD_CSI0_DAT14__UART5_TX_DATA 0x1b0b1
+               >;
+       };
+
+       pinctrl_usbotg: usbotggrp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_1__USB_OTG_ID 0x1f8b0
+                       /* power, oc muxed but not used by the driver */
+                       MX6QDL_PAD_CSI0_PIXCLK__GPIO5_IO18      0x1b0b0 /* USB power */
+                       MX6QDL_PAD_CSI0_DATA_EN__GPIO5_IO20     0x1b0b0 /* USB OC */
+               >;
+       };
+
+       pinctrl_usdhc3: usdhc3grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD3_CLK__SD3_CLK 0x17059
+                       MX6QDL_PAD_SD3_CMD__SD3_CMD 0x17059
+                       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_NANDF_CS1__GPIO6_IO14 0x1b0b0 /* CD */
+                       MX6QDL_PAD_ENET_RXD1__GPIO1_IO26 0x1b0b0 /* WP */
+                       MX6QDL_PAD_ENET_TXD1__GPIO1_IO29 0x1b0b0 /* PWR_EN */
+               >;
+       };
+
+       pinctrl_usdhc4: usdhc4grp {
+               fsl,pins = <
+                       MX6QDL_PAD_SD4_CLK__SD4_CLK 0x17059
+                       MX6QDL_PAD_SD4_CMD__SD4_CMD 0x17059
+                       MX6QDL_PAD_SD4_DAT0__SD4_DATA0 0x17059
+                       MX6QDL_PAD_SD4_DAT1__SD4_DATA1 0x17059
+                       MX6QDL_PAD_SD4_DAT2__SD4_DATA2 0x17059
+                       MX6QDL_PAD_SD4_DAT3__SD4_DATA3 0x17059
+                       MX6QDL_PAD_SD4_DAT4__SD4_DATA4 0x17059
+                       MX6QDL_PAD_SD4_DAT5__SD4_DATA5 0x17059
+                       MX6QDL_PAD_SD4_DAT6__SD4_DATA6 0x17059
+                       MX6QDL_PAD_SD4_DAT7__SD4_DATA7 0x17059
+               >;
+       };
+
+       pinctrl_wdog1: wdog1rp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_9__WDOG1_B      0x1b0b0
+               >;
+       };
+};
+
+&mipi_csi {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_mipi_csi>;
+};
+
+&pcie {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_pcie>;
+       wake-up-gpio = <&gpio6 18 GPIO_ACTIVE_HIGH>;
+       reset-gpio = <&gpio3 13 GPIO_ACTIVE_HIGH>;
+};
+
+/* LCD_BKLT_PWM */
+&pwm4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_pwm4>;
+};
+
+&reg_arm {
+       vin-supply = <&reg_v_core_s0>;
+};
+
+&reg_pu {
+       vin-supply = <&reg_vddsoc_s0>;
+};
+
+&reg_soc {
+       vin-supply = <&reg_vddsoc_s0>;
+};
+
+/* SER0 */
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart1>;
+       uart-has-rtscts;
+};
+
+/* SER1 */
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart2>;
+};
+
+/* SER2 */
+&uart4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart4>;
+       uart-has-rtscts;
+};
+
+/* SER3 */
+&uart5 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart5>;
+};
+
+/* USB0 */
+&usbotg {
+       /*
+        * no 'imx6-usb-charger-detection'
+        * since USB_OTG_CHD_B pin is not wired
+        */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usbotg>;
+};
+
+/* USB1/2 via hub */
+&usbh1 {
+       vbus-supply = <&reg_5p0v_s0>;
+};
+
+/* SDIO */
+&usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       cd-gpios = <&gpio6 14 GPIO_ACTIVE_LOW>;
+       wp-gpios = <&gpio1 26 GPIO_ACTIVE_HIGH>;
+       no-1-8-v;
+};
+
+/* SDMMC */
+&usdhc4 {
+       /* Internal eMMC, optional on some boards */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc4>;
+       bus-width = <8>;
+       no-sdio;
+       no-sd;
+       non-removable;
+       vmmc-supply = <&reg_3p3v_s0>;
+       vqmmc-supply = <&reg_1p8v_s0>;
+};
+
+&wdog1 {
+       /* CPLD is feeded by watchdog (hardwired) */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_wdog1>;
+       status = "okay";
+};
index 185fb17a35001e8165dc5cf77b79cd0c344868d6..71ca76a5e4a513730c1c0c1c0fe5b832c469a24e 100644 (file)
        vin-supply = <&sw1c_reg>;
 };
 
+&reg_vdd1p1 {
+       vin-supply = <&vgen5_reg>;
+};
+
+&reg_vdd3p0 {
+       vin-supply = <&sw2_reg>;
+};
+
+&reg_vdd2p5 {
+       vin-supply = <&vgen5_reg>;
+};
+
 &snvs_poweroff {
        status = "okay";
 };
 
+&snvs_pwrkey {
+       status = "okay";
+};
+
 &ssi2 {
        status = "okay";
 };
index b3a77bcf00d51c9572cd4af1d5317bbfae6cc6ae..4b801935cad11498b66dcef965a4615fbf7693ed 100644 (file)
                                compatible = "fsl,imx6q-wdt", "fsl,imx21-wdt";
                                reg = <0x020bc000 0x4000>;
                                interrupts = <0 80 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks IMX6QDL_CLK_DUMMY>;
+                               clocks = <&clks IMX6QDL_CLK_IPG>;
                        };
 
                        wdog2: wdog@20c0000 {
                                compatible = "fsl,imx6q-wdt", "fsl,imx21-wdt";
                                reg = <0x020c0000 0x4000>;
                                interrupts = <0 81 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks IMX6QDL_CLK_DUMMY>;
+                               clocks = <&clks IMX6QDL_CLK_IPG>;
                                status = "disabled";
                        };
 
                                             <0 54 IRQ_TYPE_LEVEL_HIGH>,
                                             <0 127 IRQ_TYPE_LEVEL_HIGH>;
 
-                               regulator-1p1 {
+                               reg_vdd1p1: regulator-1p1 {
                                        compatible = "fsl,anatop-regulator";
                                        regulator-name = "vdd1p1";
                                        regulator-min-microvolt = <1000000>;
                                        anatop-enable-bit = <0>;
                                };
 
-                               regulator-3p0 {
+                               reg_vdd3p0: regulator-3p0 {
                                        compatible = "fsl,anatop-regulator";
                                        regulator-name = "vdd3p0";
                                        regulator-min-microvolt = <2800000>;
                                        anatop-enable-bit = <0>;
                                };
 
-                               regulator-2p5 {
+                               reg_vdd2p5: regulator-2p5 {
                                        compatible = "fsl,anatop-regulator";
                                        regulator-name = "vdd2p5";
                                        regulator-min-microvolt = <2250000>;
                                        interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
                                        linux,keycode = <KEY_POWER>;
                                        wakeup-source;
+                                       status = "disabled";
                                };
 
                                snvs_lpgpr: snvs-lpgpr {
index f7a48e4622e1bc85a7984312173ad3f3abd7d69d..4829aa682aeb01cbc3e9a0c7485e87ca59bebdbf 100644 (file)
        status = "okay";
 };
 
+&reg_vdd1p1 {
+       vin-supply = <&sw2_reg>;
+};
+
+&reg_vdd3p0 {
+       vin-supply = <&sw2_reg>;
+};
+
+&reg_vdd2p5 {
+       vin-supply = <&sw2_reg>;
+};
+
 &snvs_poweroff {
        status = "okay";
 };
index 9ddbeea64b724947a2682d4039a6d053887324cd..b36fc012ff066d4032832dcd9105a088d5b1edf4 100644 (file)
                                compatible = "fsl,imx6sl-kpp", "fsl,imx21-kpp";
                                reg = <0x020b8000 0x4000>;
                                interrupts = <0 82 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks IMX6SL_CLK_DUMMY>;
+                               clocks = <&clks IMX6SL_CLK_IPG>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6sl-wdt", "fsl,imx21-wdt";
                                reg = <0x020bc000 0x4000>;
                                interrupts = <0 80 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks IMX6SL_CLK_DUMMY>;
+                               clocks = <&clks IMX6SL_CLK_IPG>;
                        };
 
                        wdog2: wdog@20c0000 {
                                compatible = "fsl,imx6sl-wdt", "fsl,imx21-wdt";
                                reg = <0x020c0000 0x4000>;
                                interrupts = <0 81 IRQ_TYPE_LEVEL_HIGH>;
-                               clocks = <&clks IMX6SL_CLK_DUMMY>;
+                               clocks = <&clks IMX6SL_CLK_IPG>;
                                status = "disabled";
                        };
 
                                             <0 54 IRQ_TYPE_LEVEL_HIGH>,
                                             <0 127 IRQ_TYPE_LEVEL_HIGH>;
 
-                               regulator-1p1 {
+                               reg_vdd1p1: regulator-1p1 {
                                        compatible = "fsl,anatop-regulator";
                                        regulator-name = "vdd1p1";
                                        regulator-min-microvolt = <1000000>;
                                        anatop-enable-bit = <0>;
                                };
 
-                               regulator-3p0 {
+                               reg_vdd3p0: regulator-3p0 {
                                        compatible = "fsl,anatop-regulator";
                                        regulator-name = "vdd3p0";
                                        regulator-min-microvolt = <2800000>;
                                        anatop-enable-bit = <0>;
                                };
 
-                               regulator-2p5 {
+                               reg_vdd2p5: regulator-2p5 {
                                        compatible = "fsl,anatop-regulator";
                                        regulator-name = "vdd2p5";
                                        regulator-min-microvolt = <2250000>;
index 4a31a415f88e295fa37881b2991f4edaed04024f..3e1d32fdf4b856f4742ae7685fa3d7e48da4d440 100644 (file)
        status = "okay";
 };
 
+&reg_3p0 {
+       vin-supply = <&sw2_reg>;
+};
+
+&snvs_poweroff {
+       status = "okay";
+};
+
+&snvs_pwrkey {
+       status = "okay";
+};
+
 &uart1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_uart1>;
index 1b4899f0fcded0607cd62b5b37aa0f4238e06ba1..b0a77ff70b67a3f54357ee84730b9e2154a6d004 100644 (file)
                                        regmap = <&snvs>;
                                        offset = <0x38>;
                                        mask = <0x61>;
+                                       status = "disabled";
                                };
 
                                snvs_pwrkey: snvs-powerkey {
                                        interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
                                        linux,keycode = <KEY_POWER>;
                                        wakeup-source;
+                                       status = "disabled";
                                };
                        };
 
index 00c48548230128344bc4754f58ea1ac6335e6783..f1830ed387a5512ed99ea71b82cbc09876d2f8aa 100644 (file)
        enable-active-high;
        vin-supply = <&reg_can_en>;
 };
+
+&reg_vdd1p1 {
+       vin-supply = <&vgen6_reg>;
+};
+
+&reg_vdd3p0 {
+       vin-supply = <&sw2_reg>;
+};
+
+&reg_vdd2p5 {
+       vin-supply = <&vgen6_reg>;
+};
+
+&snvs_pwrkey {
+       status = "okay";
+};
index 998e3e13a00526929b4f1f2be1255956ae3cf759..a8ee7087af5a5e769d505a048f7cc438c14a7a47 100644 (file)
        vin-supply = <&sw1a_reg>;
 };
 
+&reg_vdd1p1 {
+       vin-supply = <&vgen6_reg>;
+};
+
+&reg_vdd3p0 {
+       vin-supply = <&sw2_reg>;
+};
+
+&reg_vdd2p5 {
+       vin-supply = <&vgen6_reg>;
+};
+
 &reg_can_stby {
        /* Transceiver EN/STBY is active low on RevB board */
        gpio = <&gpio4 27 GPIO_ACTIVE_LOW>;
 };
+
+&snvs_pwrkey {
+       status = "okay";
+};
index db0feb9b9f5d7ef3dfce9181566287e14d6a1b75..205ea26484e353bfaf8be2315b89bfe8afef60a8 100644 (file)
@@ -1,43 +1,6 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
  * Copyright (c) 2016 Andreas Färber
- *
- * 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
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This library is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- * Or, alternatively,
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use,
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
  */
 
 /dts-v1/;
index 5c7a2bb9141cba474375434f1f6fa84bd7a047e5..5817b498539106c28b4577726dba551dfad1b18a 100644 (file)
@@ -1,43 +1,6 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
  * Copyright (c) 2016 Andreas Färber
- *
- * 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
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This library is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- * Or, alternatively,
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use,
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
  */
 
 /dts-v1/;
                reg = <0x80000000 0x40000000>;
        };
 };
+
+&i2c4 { /* Onboard Motion sensors */
+       status = "okay";
+};
+
+&uart3 { /* Bluetooth */
+       status = "okay";
+};
index 13dfe2afaba563ce5648a78d6756a0300370133e..96f4d89848a3c9aa1cd6d05569db5df1ad39636b 100644 (file)
@@ -1,43 +1,6 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
  * Copyright (c) 2016 Andreas Färber
- *
- * 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
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This library is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- * Or, alternatively,
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use,
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
  */
 
 /dts-v1/;
                };
        };
 };
+
+&i2c4 { /* Onboard Motion sensors */
+       status = "okay";
+};
+
+&uart3 { /* Bluetooth */
+       status = "okay";
+};
index 53b3eac94f0de605606260e111c7980887349d3c..25d4aa985a69444774d75941b764aa31e616ad7b 100644 (file)
@@ -1,43 +1,6 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
  * Copyright (c) 2016 Andreas Färber
- *
- * 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
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This library is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- * Or, alternatively,
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use,
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
  */
 
 #include "imx6sx.dtsi"
                startup-delay-us = <70000>;
                enable-active-high;
        };
-
-       reg_bt: regulator-bt {
-               compatible = "regulator-fixed";
-               pinctrl-names = "default";
-               pinctrl-0 = <&pinctrl_bt_reg>;
-               enable-active-high;
-               gpio = <&gpio2 17 GPIO_ACTIVE_HIGH>;
-               regulator-name = "bt_reg";
-               regulator-min-microvolt = <1800000>;
-               regulator-max-microvolt = <1800000>;
-               regulator-always-on;
-       };
 };
 
 &fec1 {
        };
 };
 
+&i2c2 { /* Brick snap in sensors connector */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       clock-frequency = <100000>;
+       status = "okay";
+};
+
+&i2c4 { /* Onboard Motion sensors */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c4>;
+       clock-frequency = <100000>;
+       status = "disabled";
+};
+
 &iomuxc {
        pinctrl_bt_reg: btreggrp {
                fsl,pins =
                        <MX6SX_PAD_GPIO1_IO01__I2C1_SDA         0x4001b8b1>;
        };
 
+       pinctrl_i2c2: i2c2grp {
+               fsl,pins =
+                       <MX6SX_PAD_GPIO1_IO03__I2C2_SDA         0x4001b8b1>,
+                       <MX6SX_PAD_GPIO1_IO02__I2C2_SCL         0x4001b8b1>;
+       };
+
+       pinctrl_i2c4: i2c4grp {
+               fsl,pins =
+                       <MX6SX_PAD_USB_H_DATA__I2C4_SDA         0x4001b8b1>,
+                       <MX6SX_PAD_USB_H_STROBE__I2C4_SCL       0x4001b8b1>;
+       };
+
        pinctrl_uart1: uart1grp {
                fsl,pins =
                        <MX6SX_PAD_GPIO1_IO04__UART1_TX         0x1b0b1>,
        status = "disabled";
 };
 
-&uart3 { /* Bluetooth */
+&uart3 { /* Bluetooth - only on Extended/Full versions */
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_uart3>;
        uart-has-rtscts;
-       status = "okay";
+       status = "disabled";
+
+       bluetooth {
+               compatible = "ti,wl1831-st";
+               enable-gpios = <&gpio2 17 GPIO_ACTIVE_HIGH>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_bt_reg>;
+               max-speed = <921600>;
+       };
 };
 
 /* Arduino serial */
index b16a123990a266b62d7c8b49fdef6caa01d47e59..bb25add90f19a5f6d886cee7378fbc6b9f52853d 100644 (file)
                                             <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>,
                                             <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>;
 
-                               regulator-1p1 {
+                               reg_vdd1p1: regulator-1p1 {
                                        compatible = "fsl,anatop-regulator";
                                        regulator-name = "vdd1p1";
                                        regulator-min-microvolt = <1000000>;
                                        anatop-enable-bit = <0>;
                                };
 
-                               regulator-3p0 {
+                               reg_vdd3p0: regulator-3p0 {
                                        compatible = "fsl,anatop-regulator";
                                        regulator-name = "vdd3p0";
                                        regulator-min-microvolt = <2800000>;
                                        anatop-enable-bit = <0>;
                                };
 
-                               regulator-2p5 {
+                               reg_vdd2p5: regulator-2p5 {
                                        compatible = "fsl,anatop-regulator";
                                        regulator-name = "vdd2p5";
                                        regulator-min-microvolt = <2250000>;
                                        interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
                                        linux,keycode = <KEY_POWER>;
                                        wakeup-source;
+                                       status = "disabled";
                                };
                        };
 
index 9207d5d071f11c334da9d9e4c6cc7b7566c4d279..cbe61b61a21201d31068ea1af7210306583f35c8 100644 (file)
        status = "okay";
 };
 
+&snvs_pwrkey {
+       status = "okay";
+};
+
 &tsc {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_tsc>;
index bc77f26a2f1dee7ccaf5141ea6c4f6eea751cad2..21ddd359d3ed68b99281a86c9f6136e25e5f1b60 100644 (file)
        display = <&display0>;
        status = "okay";
 
-       display0: display {
+       display0: display0 {
                bits-per-pixel = <16>;
                bus-width = <18>;
 
index 213e802bf35c5dc1a5a6162eae28917d2acd30ca..b26d4f57c6555009b6aa5bca6ff67b03aa64f83b 100644 (file)
        display = <&display0>;
        status = "okay";
 
-       display0: display {
+       display0: display0 {
                bits-per-pixel = <16>;
                bus-width = <18>;
 
index a7f6d1d58e20dfc66d5c80bd8810369a9fe948f7..81d4b4925127fe025e6dac4dfc5aeeae8ab904ec 100644 (file)
@@ -59,6 +59,7 @@
                        compatible = "arm,cortex-a7";
                        device_type = "cpu";
                        reg = <0>;
+                       clock-frequency = <696000000>;
                        clock-latency = <61036>; /* two CLK32 periods */
                        #cooling-cells = <2>;
                        operating-points = <
                                        interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
                                        linux,keycode = <KEY_POWER>;
                                        wakeup-source;
+                                       status = "disabled";
                                };
 
                                snvs_lpgpr: snvs-lpgpr {
                                         <&clks IMX6UL_CLK_USDHC1>,
                                         <&clks IMX6UL_CLK_USDHC1>;
                                clock-names = "ipg", "ahb", "per";
+                               fsl,tuning-step= <2>;
+                               fsl,tuning-start-tap = <20>;
                                bus-width = <4>;
                                status = "disabled";
                        };
                                         <&clks IMX6UL_CLK_USDHC2>;
                                clock-names = "ipg", "ahb", "per";
                                bus-width = <4>;
+                               fsl,tuning-step= <2>;
+                               fsl,tuning-start-tap = <20>;
                                status = "disabled";
                        };
 
                                status = "disabled";
                        };
 
+                       pxp: pxp@21cc000 {
+                               compatible = "fsl,imx6ul-pxp";
+                               reg = <0x021cc000 0x4000>;
+                               interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clks IMX6UL_CLK_PXP>;
+                               clock-names = "axi";
+                       };
+
                        qspi: spi@21e0000 {
                                #address-cells = <1>;
                                #size-cells = <0>;
index 006690ea98c0f613c0d3d1e53d099d929c274074..b6147c76d159abeb1df9f8ee4feec7d75aca0faf 100644 (file)
 };
 
 &usdhc1 {
-       pinctrl-names = "default";
+       pinctrl-names = "default", "state_100mhz", "state_200mhz", "sleep";
        pinctrl-0 = <&pinctrl_usdhc1 &pinctrl_snvs_usdhc1_cd>;
-       no-1-8-v;
+       pinctrl-1 = <&pinctrl_usdhc1_100mhz &pinctrl_snvs_usdhc1_cd>;
+       pinctrl-2 = <&pinctrl_usdhc1_200mhz &pinctrl_snvs_usdhc1_cd>;
+       pinctrl-3 = <&pinctrl_usdhc1 &pinctrl_snvs_usdhc1_sleep_cd>;
        cd-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
        disable-wp;
        wakeup-source;
        keep-power-in-suspend;
        vmmc-supply = <&reg_3v3>;
+       vqmmc-supply = <&reg_sd1_vmmc>;
+       sd-uhs-sdr12;
+       sd-uhs-sdr25;
+       sd-uhs-sdr50;
+       sd-uhs-sdr104;
        status = "okay";
 };
index 9ad1da15976835cc57294ae0ac93df37098748f9..d56728f03c35fb7ed377e41c6b481bbd35595674 100644 (file)
                >;
        };
 
+       pinctrl_snvs_usdhc1_sleep_cd: snvs-usdhc1-cd-grp-slp {
+               fsl,pins = <
+                       MX6ULL_PAD_SNVS_TAMPER0__GPIO5_IO00     0x0
+               >;
+       };
+
        pinctrl_snvs_wifi_pdn: snvs-wifi-pdn-grp {
                fsl,pins = <
                        MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11       0x14
index 22e4a307fa5934b08c6c16052c8f84bd636278e0..b7e67d1213229ded70138c300305afafbba70d5d 100644 (file)
@@ -12,6 +12,7 @@
 /delete-node/ &crypto;
 
 &cpu0 {
+       clock-frequency = <900000000>;
        operating-points = <
                /* kHz  uV */
                900000  1275000
        compatible = "fsl,imx6ull-ocotp", "syscon";
 };
 
+&pxp {
+       compatible = "fsl,imx6ull-pxp";
+       interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
+                    <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
+};
+
 &usdhc1 {
        compatible = "fsl,imx6ull-usdhc", "fsl,imx6sx-usdhc";
 };
diff --git a/arch/arm/boot/dts/imx7d-meerkat96.dts b/arch/arm/boot/dts/imx7d-meerkat96.dts
new file mode 100644 (file)
index 0000000..5339210
--- /dev/null
@@ -0,0 +1,375 @@
+// SPDX-License-Identifier: GPL-2.0+ OR MIT
+/*
+ * Copyright (C) 2019 Linaro Ltd.
+ */
+
+/dts-v1/;
+
+#include "imx7d.dtsi"
+
+/ {
+       model = "96Boards Meerkat96 Board";
+       compatible = "novtech,imx7d-meerkat96", "fsl,imx7d";
+
+       chosen {
+               stdout-path = &uart6;
+       };
+
+       memory@80000000 {
+               device_type = "memory";
+               reg = <0x80000000 0x20000000>; /* 512MB */
+       };
+
+       reg_wlreg_on: regulator-wlreg-on {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_wlreg_on>;
+               regulator-name = "wlreg_on";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               startup-delay-us = <100>;
+               gpio = <&gpio6 15 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               regulator-always-on;
+       };
+
+       reg_3p3v: regulator-3p3v {
+               compatible = "regulator-fixed";
+               regulator-name = "3P3V";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+       };
+
+       reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
+               compatible = "regulator-fixed";
+               regulator-name = "usb_otg1_vbus";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+       };
+
+       reg_usb_otg2_vbus: regulator-usb-otg2-vbus {
+               compatible = "regulator-fixed";
+               regulator-name = "usb_otg2_vbus";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               gpio = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_gpio_leds>;
+
+               led1 {
+                       label = "green:user1";
+                       gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "heartbeat";
+                       default-state = "off";
+               };
+
+               led2 {
+                       label = "green:user2";
+                       gpios = <&gpio1 5 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "mmc0";
+                       default-state = "off";
+               };
+
+               led3 {
+                       label = "green:user3";
+                       gpios = <&gpio1 6 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "mmc1";
+                       default-state = "off";
+               };
+
+               led4 {
+                       label = "green:user4";
+                       gpios = <&gpio1 7 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "none";
+                       default-state = "off";
+                       panic-indicator;
+               };
+
+               led5 {
+                       label = "yellow:wlan";
+                       gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "phy0tx";
+                       default-state = "off";
+               };
+
+               led6 {
+                       label = "blue:bt";
+                       gpios = <&gpio5 2 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "bluetooth-power";
+                       default-state = "off";
+               };
+       };
+};
+
+&i2c1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       status = "okay";
+};
+
+&i2c2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       status = "okay";
+};
+
+&i2c3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c3>;
+       status = "okay";
+};
+
+&i2c4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c4>;
+       status = "okay";
+};
+
+&lcdif {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_lcdif>;
+       status = "okay";
+};
+
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart1>;
+       assigned-clocks = <&clks IMX7D_UART1_ROOT_SRC>;
+       assigned-clock-parents = <&clks IMX7D_PLL_SYS_MAIN_240M_CLK>;
+       status = "okay";
+};
+
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart3>;
+       assigned-clocks = <&clks IMX7D_UART3_ROOT_SRC>;
+       assigned-clock-parents = <&clks IMX7D_PLL_SYS_MAIN_240M_CLK>;
+       uart-has-rtscts;
+       status = "okay";
+};
+
+&uart6 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart6>;
+       assigned-clocks = <&clks IMX7D_UART6_ROOT_SRC>;
+       assigned-clock-parents = <&clks IMX7D_PLL_SYS_MAIN_240M_CLK>;
+       status = "okay";
+};
+
+&uart7 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart7 &pinctrl_bt_gpios>;
+       assigned-clocks = <&clks IMX7D_UART7_ROOT_SRC>;
+       assigned-clock-parents = <&clks IMX7D_PLL_SYS_MAIN_240M_CLK>;
+       uart-has-rtscts;
+       fsl,dte-mode;
+       status = "okay";
+
+       bluetooth {
+               compatible = "brcm,bcm43438-bt";
+               device-wakeup-gpios = <&gpio6 13 GPIO_ACTIVE_HIGH>;
+               host-wakeup-gpios = <&gpio4 17 GPIO_ACTIVE_HIGH>;
+       };
+};
+
+&usbotg1 {
+       vbus-supply = <&reg_usb_otg1_vbus>;
+       status = "okay";
+};
+
+&usbotg2 {
+       vbus-supply = <&reg_usb_otg2_vbus>;
+       dr_mode = "host";
+       status = "okay";
+};
+
+&usdhc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc1>;
+       keep-power-in-suspend;
+       tuning-step = <2>;
+       vmmc-supply = <&reg_3p3v>;
+       no-1-8-v;
+       broken-cd;
+       status = "okay";
+};
+
+&usdhc3 {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       bus-width = <4>;
+       no-1-8-v;
+       no-mmc;
+       non-removable;
+       keep-power-in-suspend;
+       wakeup-source;
+       vmmc-supply = <&reg_wlreg_on>;
+       vqmmc-supply =<&reg_3p3v>;
+       status = "okay";
+
+       brcmf: wifi@1 {
+               reg = <1>;
+               compatible = "brcm,bcm4329-fmac";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_wlan_irq>;
+               interrupt-parent = <&gpio6>;
+               interrupts = <14 IRQ_TYPE_LEVEL_HIGH>;
+               interrupt-names = "host-wake";
+       };
+};
+
+&iomuxc {
+       pinctrl_bt_gpios: btgpiosgrp {
+               fsl,pins = <
+                       MX7D_PAD_SAI1_TX_BCLK__GPIO6_IO13       0x59
+                       MX7D_PAD_ECSPI1_MOSI__GPIO4_IO17        0x1f
+               >;
+       };
+
+       pinctrl_gpio_leds: gpioledsgrp {
+               fsl,pins = <
+                       MX7D_PAD_LPSR_GPIO1_IO00__GPIO1_IO0     0x59
+                       MX7D_PAD_LPSR_GPIO1_IO04__GPIO1_IO4     0x59
+                       MX7D_PAD_LPSR_GPIO1_IO05__GPIO1_IO5     0x59
+                       MX7D_PAD_LPSR_GPIO1_IO06__GPIO1_IO6     0x59
+                       MX7D_PAD_LPSR_GPIO1_IO07__GPIO1_IO7     0x59
+                       MX7D_PAD_SD1_RESET_B__GPIO5_IO2         0x59
+               >;
+       };
+
+       pinctrl_i2c1: i2c1grp {
+               fsl,pins = <
+                       MX7D_PAD_I2C1_SDA__I2C1_SDA             0x4000007f
+                       MX7D_PAD_I2C1_SCL__I2C1_SCL             0x4000007f
+               >;
+       };
+
+       pinctrl_i2c2: i2c2grp {
+               fsl,pins = <
+                       MX7D_PAD_I2C2_SDA__I2C2_SDA             0x4000007f
+                       MX7D_PAD_I2C2_SCL__I2C2_SCL             0x4000007f
+               >;
+       };
+
+       pinctrl_i2c3: i2c3grp {
+               fsl,pins = <
+                       MX7D_PAD_ENET1_RGMII_RD1__I2C3_SDA      0x4000007f
+                       MX7D_PAD_ENET1_RGMII_RD0__I2C3_SCL      0x4000007f
+               >;
+       };
+
+       pinctrl_i2c4: i2c4grp {
+               fsl,pins = <
+                       MX7D_PAD_SAI1_RX_BCLK__I2C4_SDA         0x4000007f
+                       MX7D_PAD_SAI1_RX_SYNC__I2C4_SCL         0x4000007f
+               >;
+       };
+
+       pinctrl_lcdif: lcdifgrp {
+               fsl,pins = <
+                       MX7D_PAD_LCD_DATA00__LCD_DATA0          0x79
+                       MX7D_PAD_LCD_DATA01__LCD_DATA1          0x79
+                       MX7D_PAD_LCD_DATA02__LCD_DATA2          0x79
+                       MX7D_PAD_LCD_DATA03__LCD_DATA3          0x79
+                       MX7D_PAD_LCD_DATA04__LCD_DATA4          0x79
+                       MX7D_PAD_LCD_DATA05__LCD_DATA5          0x79
+                       MX7D_PAD_LCD_DATA06__LCD_DATA6          0x79
+                       MX7D_PAD_LCD_DATA07__LCD_DATA7          0x79
+                       MX7D_PAD_LCD_DATA08__LCD_DATA8          0x79
+                       MX7D_PAD_LCD_DATA09__LCD_DATA9          0x79
+                       MX7D_PAD_LCD_DATA10__LCD_DATA10         0x79
+                       MX7D_PAD_LCD_DATA11__LCD_DATA11         0x79
+                       MX7D_PAD_LCD_DATA12__LCD_DATA12         0x79
+                       MX7D_PAD_LCD_DATA13__LCD_DATA13         0x79
+                       MX7D_PAD_LCD_DATA14__LCD_DATA14         0x79
+                       MX7D_PAD_LCD_DATA15__LCD_DATA15         0x79
+                       MX7D_PAD_LCD_DATA16__LCD_DATA16         0x79
+                       MX7D_PAD_LCD_DATA17__LCD_DATA17         0x79
+                       MX7D_PAD_LCD_DATA18__LCD_DATA18         0x79
+                       MX7D_PAD_LCD_DATA19__LCD_DATA19         0x79
+                       MX7D_PAD_LCD_DATA20__LCD_DATA20         0x79
+                       MX7D_PAD_LCD_DATA21__LCD_DATA21         0x79
+                       MX7D_PAD_LCD_DATA22__LCD_DATA22         0x79
+                       MX7D_PAD_LCD_DATA23__LCD_DATA23         0x79
+                       MX7D_PAD_LCD_CLK__LCD_CLK               0x79
+                       MX7D_PAD_LCD_ENABLE__LCD_ENABLE         0x79
+                       MX7D_PAD_LCD_VSYNC__LCD_VSYNC           0x79
+                       MX7D_PAD_LCD_HSYNC__LCD_HSYNC           0x79
+                       MX7D_PAD_LCD_RESET__LCD_RESET           0x79
+               >;
+       };
+
+       pinctrl_uart1: uart1grp {
+               fsl,pins = <
+                       MX7D_PAD_UART1_TX_DATA__UART1_DCE_TX    0x79
+                       MX7D_PAD_UART1_RX_DATA__UART1_DCE_RX    0x79
+               >;
+       };
+
+       pinctrl_uart3: uart3grp {
+               fsl,pins = <
+                       MX7D_PAD_SD3_DATA4__UART3_DCE_RX        0x79
+                       MX7D_PAD_SD3_DATA5__UART3_DCE_TX        0x79
+                       MX7D_PAD_SD3_DATA6__UART3_DCE_RTS       0x79
+                       MX7D_PAD_SD3_DATA7__UART3_DCE_CTS       0x79
+               >;
+       };
+
+       pinctrl_uart6: uart6grp {
+               fsl,pins = <
+                       MX7D_PAD_SD1_CD_B__UART6_DCE_RX         0x79
+                       MX7D_PAD_SD1_WP__UART6_DCE_TX           0x79
+               >;
+       };
+
+       pinctrl_uart7: uart7grp {
+               fsl,pins = <
+                       MX7D_PAD_ECSPI2_SCLK__UART7_DTE_TX      0x79
+                       MX7D_PAD_ECSPI2_MOSI__UART7_DTE_RX      0x79
+                       MX7D_PAD_ECSPI2_MISO__UART7_DTE_CTS     0x79
+                       MX7D_PAD_ECSPI2_SS0__UART7_DTE_RTS      0x79
+               >;
+       };
+
+       pinctrl_usdhc1: usdhc1grp {
+               fsl,pins = <
+                       MX7D_PAD_SD1_CMD__SD1_CMD               0x59
+                       MX7D_PAD_SD1_CLK__SD1_CLK               0x19
+                       MX7D_PAD_SD1_DATA0__SD1_DATA0           0x59
+                       MX7D_PAD_SD1_DATA1__SD1_DATA1           0x59
+                       MX7D_PAD_SD1_DATA2__SD1_DATA2           0x59
+                       MX7D_PAD_SD1_DATA3__SD1_DATA3           0x59
+               >;
+       };
+
+       pinctrl_usdhc3: usdhc3grp {
+               fsl,pins = <
+                       MX7D_PAD_SD3_CMD__SD3_CMD               0x59
+                       MX7D_PAD_SD3_CLK__SD3_CLK               0x0D
+                       MX7D_PAD_SD3_DATA0__SD3_DATA0           0x59
+                       MX7D_PAD_SD3_DATA1__SD3_DATA1           0x59
+                       MX7D_PAD_SD3_DATA2__SD3_DATA2           0x59
+                       MX7D_PAD_SD3_DATA3__SD3_DATA3           0x59
+               >;
+       };
+
+       pinctrl_wlan_irq: wlanirqgrp {
+               fsl,pins = <
+                       MX7D_PAD_SAI1_TX_SYNC__GPIO6_IO14       0x19
+               >;
+       };
+
+       pinctrl_wlreg_on: wlregongrp {
+               fsl,pins = <
+                       MX7D_PAD_SAI1_TX_DATA__GPIO6_IO15       0x19
+               >;
+       };
+};
index 202922ed37544c8dba229439de84118e62344944..869efbc4af42c75e02c90b1c424999f99eaeeba0 100644 (file)
                        };
 
                        sw2_reg: sw2 {
-                               regulator-min-microvolt = <1500000>;
-                               regulator-max-microvolt = <1850000>;
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
                                regulator-boot-on;
                                regulator-always-on;
                        };
        status = "okay";
 };
 
+&reg_1p0d {
+       vin-supply = <&sw2_reg>;
+};
+
+&reg_1p2 {
+       vin-supply = <&sw2_reg>;
+};
+
+&snvs_pwrkey {
+       status = "okay";
+};
+
 &uart1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_uart1>;
index 3e467a94e8a6fe448c339a036aa4c30698935c19..4a78ddc7513dcac4d772eeb960b0bb5e31c2065a 100644 (file)
@@ -16,7 +16,7 @@
        compatible = "zii,imx7d-rpu2", "fsl,imx7d";
 
        chosen {
-               stdout-path = &uart1;
+               stdout-path = &uart2;
        };
 
        cs2000_ref: oscillator {
                >;
        };
 
-       pinctrl_i2c1_gpio: i2c1gpiogrp {
-               fsl,pins = <
-                       MX7D_PAD_I2C1_SDA__GPIO4_IO9            0x4000007f
-                       MX7D_PAD_I2C1_SCL__GPIO4_IO8            0x4000007f
-               >;
-       };
-
        pinctrl_i2c2: i2c2grp {
                fsl,pins = <
                        MX7D_PAD_I2C2_SDA__I2C2_SDA             0x4000007f
                >;
        };
 
-       pinctrl_i2c2_gpio: i2c2gpiogrp {
-               fsl,pins = <
-                       MX7D_PAD_I2C2_SDA__GPIO4_IO11           0x4000007f
-                       MX7D_PAD_I2C2_SCL__GPIO4_IO10           0x4000007f
-               >;
-       };
-
        pinctrl_i2c3: i2c3grp {
                fsl,pins = <
                        MX7D_PAD_I2C3_SDA__I2C3_SDA             0x4000007f
index f33b560821b8a7d1de70228394022f33ff830f37..42528d2812a2eb758b031769e0fd032ba04f5c89 100644 (file)
@@ -12,6 +12,8 @@
                        clock-frequency = <996000000>;
                        operating-points-v2 = <&cpu0_opp_table>;
                        #cooling-cells = <2>;
+                       nvmem-cells = <&cpu_speed_grade>;
+                       nvmem-cell-names = "speed_grade";
                };
 
                cpu1: cpu@1 {
 
                opp-792000000 {
                        opp-hz = /bits/ 64 <792000000>;
-                       opp-microvolt = <975000>;
+                       opp-microvolt = <1000000>;
                        clock-latency-ns = <150000>;
+                       opp-supported-hw = <0xf>, <0xf>;
                };
 
                opp-996000000 {
                        opp-hz = /bits/ 64 <996000000>;
-                       opp-microvolt = <1075000>;
+                       opp-microvolt = <1100000>;
                        clock-latency-ns = <150000>;
-                       opp-suspend;
+                       opp-supported-hw = <0xc>, <0xf>;
+               };
+
+               opp-1200000000 {
+                       opp-hz = /bits/ 64 <1200000000>;
+                       opp-microvolt = <1225000>;
+                       clock-latency-ns = <150000>;
+                       opp-supported-hw = <0x8>, <0xf>;
                };
        };
 
index 106711d2c01b05e33ee20335eee2368c0565b9d4..c1a4fff5ceda9791603a4ce23e142fd539b443da 100644 (file)
                 * non-configurable replicators don't show up on the
                 * AMBA bus.  As such no need to add "arm,primecell"
                 */
-               compatible = "arm,coresight-replicator";
+               compatible = "arm,coresight-static-replicator";
 
                out-ports {
                        #address-cells = <1>;
                ranges;
 
                funnel@30041000 {
-                       compatible = "arm,coresight-funnel", "arm,primecell";
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                        reg = <0x30041000 0x1000>;
                        clocks = <&clks IMX7D_MAIN_AXI_ROOT_CLK>;
                        clock-names = "apb_pclk";
                };
 
                funnel@30083000 {
-                       compatible = "arm,coresight-funnel", "arm,primecell";
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                        reg = <0x30083000 0x1000>;
                        clocks = <&clks IMX7D_MAIN_AXI_ROOT_CLK>;
                        clock-names = "apb_pclk";
                                tempmon_temp_grade: temp-grade@10 {
                                        reg = <0x10 0x4>;
                                };
+
+                               cpu_speed_grade: speed-grade@10 {
+                                       reg = <0x10 0x4>;
+                               };
                        };
 
                        anatop: anatop@30360000 {
                                        interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
                                        linux,keycode = <KEY_POWER>;
                                        wakeup-source;
+                                       status = "disabled";
                                };
                        };
 
index a09026a6d22ee41362a1290f789c0841c31af20e..4245b33bb451851d86fb8bd29ee9f40650d73b40 100644 (file)
                reg = <0x60000000 0x40000000>;
        };
 
+       backlight {
+               compatible = "pwm-backlight";
+               pwms = <&tpm4 1 50000 0>;
+               brightness-levels = <0 20 25 30 35 40 100>;
+               default-brightness-level = <6>;
+               status = "okay";
+       };
+
+       reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_usbotg1_vbus>;
+               regulator-name = "usb_otg1_vbus";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               gpio = <&gpio_ptc 0 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
        reg_vsd_3v3: regulator-vsd-3v3 {
                compatible = "regulator-fixed";
                regulator-name = "VSD_3V3";
        status = "okay";
 };
 
+&tpm4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_pwm0>;
+       status = "okay";
+};
+
+&usbotg1 {
+       vbus-supply = <&reg_usb_otg1_vbus>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usbotg1_id>;
+       srp-disable;
+       hnp-disable;
+       adp-disable;
+       over-current-active-low;
+       status = "okay";
+};
+
 &usdhc0 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_usdhc0>;
                bias-pull-up;
        };
 
+       pinctrl_pwm0: pwm0grp {
+               fsl,pins = <
+                       IMX7ULP_PAD_PTF2__TPM4_CH1      0x2
+               >;
+       };
+
+       pinctrl_usbotg1_vbus: otg1vbusgrp {
+               fsl,pins = <
+                       IMX7ULP_PAD_PTC0__PTC0          0x20000
+               >;
+       };
+
+       pinctrl_usbotg1_id: otg1idgrp {
+               fsl,pins = <
+                       IMX7ULP_PAD_PTC13__USB0_ID      0x10003
+                       IMX7ULP_PAD_PTC16__USB1_OC2     0x10003
+               >;
+       };
+
        pinctrl_usdhc0: usdhc0grp {
                fsl,pins = <
                        IMX7ULP_PAD_PTD1__SDHC0_CMD     0x43
index e20483714be5fb7d88be9f7e793e1f8c1def665c..992747a5744205c58aa34e3a36be6eb473df6eb1 100644 (file)
@@ -30,6 +30,7 @@
                serial1 = &lpuart5;
                serial2 = &lpuart6;
                serial3 = &lpuart7;
+               usbphy0 = &usbphy1;
        };
 
        cpus {
                        status = "disabled";
                };
 
+               tpm4: pwm@40250000 {
+                       compatible = "fsl,imx7ulp-pwm";
+                       reg = <0x40250000 0x1000>;
+                       assigned-clocks = <&pcc2 IMX7ULP_CLK_LPTPM4>;
+                       assigned-clock-parents = <&scg1 IMX7ULP_CLK_SOSC_BUS_CLK>;
+                       clocks = <&pcc2 IMX7ULP_CLK_LPTPM4>;
+                       #pwm-cells = <3>;
+                       status = "disabled";
+               };
+
                tpm5: tpm@40260000 {
                        compatible = "fsl,imx7ulp-tpm";
                        reg = <0x40260000 0x1000>;
                        clock-names = "ipg", "per";
                };
 
+               usbotg1: usb@40330000 {
+                       compatible = "fsl,imx7ulp-usb", "fsl,imx6ul-usb";
+                       reg = <0x40330000 0x200>;
+                       interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&pcc2 IMX7ULP_CLK_USB0>;
+                       phys = <&usbphy1>;
+                       fsl,usbmisc = <&usbmisc1 0>;
+                       ahb-burst-config = <0x0>;
+                       tx-burst-size-dword = <0x8>;
+                       rx-burst-size-dword = <0x8>;
+                       status = "disabled";
+               };
+
+               usbmisc1: usbmisc@40330200 {
+                       compatible = "fsl,imx7ulp-usbmisc", "fsl,imx7d-usbmisc";
+                       #index-cells = <1>;
+                       reg = <0x40330200 0x200>;
+               };
+
+               usbphy1: usb-phy@0x40350000 {
+                       compatible = "fsl,imx7ulp-usbphy", "fsl,imx6ul-usbphy";
+                       reg = <0x40350000 0x1000>;
+                       interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&pcc2 IMX7ULP_CLK_USB_PHY>;
+                       #phy-cells = <0>;
+               };
+
                usdhc0: mmc@40370000 {
                        compatible = "fsl,imx7ulp-usdhc", "fsl,imx6sx-usdhc";
                        reg = <0x40370000 0x10000>;
index 1612a869a4f7cb97a77505e3dd8e964887e31aa1..602f74d2c758eb1bda981baba36f995a7c13774c 100644 (file)
@@ -62,6 +62,9 @@
                compatible = "arm,versatile-flash", "cfi-flash";
                reg = <0x24000000 0x02000000>;
                bank-width = <4>;
+               partitions {
+                       compatible = "arm,arm-firmware-suite";
+               };
        };
 
        fpga {
index e2b1ab9b56e5657eedfc710061db76d962bf4390..ae75a1db3d9ae25505e86dbec0b987b774e44aa9 100644 (file)
@@ -87,7 +87,7 @@
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <3300000>;
 
-               gpios = <&gpio2 30 GPIO_ACTIVE_LOW>;
+               gpios = <&gpio2 30 GPIO_ACTIVE_HIGH>;
                gpios-states = <1>;
                states = <3300000 1
                          1800000 0>;
diff --git a/arch/arm/boot/dts/logicpd-torpedo-37xx-devkit-28.dts b/arch/arm/boot/dts/logicpd-torpedo-37xx-devkit-28.dts
new file mode 100644 (file)
index 0000000..07ac99b
--- /dev/null
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0
+
+/dts-v1/;
+
+/*
+ * There are two types of 4.3" LCD, Type 15 and Type 28.
+ * By default, type 15 was used.  This device tree file
+ * uses the timing for the type 28 LCD
+ */
+
+#include "logicpd-torpedo-37xx-devkit.dts"
+
+&lcd0 {
+
+       label = "28";
+
+       panel-timing {
+               clock-frequency = <9000000>;
+               hactive = <480>;
+               vactive = <272>;
+               hfront-porch = <3>;
+               hback-porch = <2>;
+               hsync-len = <42>;
+               vback-porch = <3>;
+               vfront-porch = <2>;
+               vsync-len = <11>;
+               hsync-active = <1>;
+               vsync-active = <1>;
+               de-active = <1>;
+               pixelclk-active = <0>;
+       };
+};
diff --git a/arch/arm/boot/dts/ls1021a-tsn.dts b/arch/arm/boot/dts/ls1021a-tsn.dts
new file mode 100644 (file)
index 0000000..5b76890
--- /dev/null
@@ -0,0 +1,289 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright 2016-2018 NXP Semiconductors
+ * Copyright 2019 Vladimir Oltean <olteanv@gmail.com>
+ */
+
+/dts-v1/;
+#include "ls1021a.dtsi"
+
+/ {
+       model = "NXP LS1021A-TSN Board";
+
+       sys_mclk: clock-mclk {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <24576000>;
+       };
+
+       reg_vdda_codec: regulator-3V3 {
+               compatible = "regulator-fixed";
+               regulator-name = "3P3V";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+       };
+
+       reg_vddio_codec: regulator-2V5 {
+               compatible = "regulator-fixed";
+               regulator-name = "2P5V";
+               regulator-min-microvolt = <2500000>;
+               regulator-max-microvolt = <2500000>;
+               regulator-always-on;
+       };
+};
+
+&dspi0 {
+       bus-num = <0>;
+       status = "okay";
+
+       /* ADG704BRMZ 1:4 SPI mux/demux */
+       sja1105: ethernet-switch@1 {
+               reg = <0x1>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "nxp,sja1105t";
+               /* 12 MHz */
+               spi-max-frequency = <12000000>;
+               /* Sample data on trailing clock edge */
+               spi-cpha;
+               /* SPI controller settings for SJA1105 timing requirements */
+               fsl,spi-cs-sck-delay = <1000>;
+               fsl,spi-sck-cs-delay = <1000>;
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       port@0 {
+                               /* ETH5 written on chassis */
+                               label = "swp5";
+                               phy-handle = <&rgmii_phy6>;
+                               phy-mode = "rgmii-id";
+                               reg = <0>;
+                       };
+
+                       port@1 {
+                               /* ETH2 written on chassis */
+                               label = "swp2";
+                               phy-handle = <&rgmii_phy3>;
+                               phy-mode = "rgmii-id";
+                               reg = <1>;
+                       };
+
+                       port@2 {
+                               /* ETH3 written on chassis */
+                               label = "swp3";
+                               phy-handle = <&rgmii_phy4>;
+                               phy-mode = "rgmii-id";
+                               reg = <2>;
+                       };
+
+                       port@3 {
+                               /* ETH4 written on chassis */
+                               label = "swp4";
+                               phy-handle = <&rgmii_phy5>;
+                               phy-mode = "rgmii-id";
+                               reg = <3>;
+                       };
+
+                       port@4 {
+                               /* Internal port connected to eth2 */
+                               ethernet = <&enet2>;
+                               phy-mode = "rgmii";
+                               reg = <4>;
+
+                               fixed-link {
+                                       speed = <1000>;
+                                       full-duplex;
+                               };
+                       };
+               };
+       };
+};
+
+&enet0 {
+       tbi-handle = <&tbi0>;
+       phy-handle = <&sgmii_phy2>;
+       phy-mode = "sgmii";
+       status = "okay";
+};
+
+&enet1 {
+       tbi-handle = <&tbi1>;
+       phy-handle = <&sgmii_phy1>;
+       phy-mode = "sgmii";
+       status = "okay";
+};
+
+/* RGMII delays added via PCB traces */
+&enet2 {
+       phy-mode = "rgmii";
+       status = "okay";
+
+       fixed-link {
+               speed = <1000>;
+               full-duplex;
+       };
+};
+
+&esdhc {
+       status = "okay";
+};
+
+&i2c0 {
+       status = "okay";
+
+       /* 3 axis accelerometer */
+       accelerometer@1e {
+               compatible = "fsl,fxls8471";
+               position = <0>;
+               reg = <0x1e>;
+       };
+
+       /* Audio codec (SAI2) */
+       audio-codec@2a {
+               compatible = "fsl,sgtl5000";
+               VDDIO-supply = <&reg_vddio_codec>;
+               VDDA-supply = <&reg_vdda_codec>;
+               #sound-dai-cells = <0>;
+               clocks = <&sys_mclk>;
+               reg = <0x2a>;
+       };
+
+       /* Current sensing circuit for 1V VDDCORE PMIC rail */
+       current-sensor@44 {
+               compatible = "ti,ina220";
+               shunt-resistor = <1000>;
+               reg = <0x44>;
+       };
+
+       /* Current sensing circuit for 12V VCC rail */
+       current-sensor@45 {
+               compatible = "ti,ina220";
+               shunt-resistor = <1000>;
+               reg = <0x45>;
+       };
+
+       /* Thermal monitor - case */
+       temperature-sensor@48 {
+               compatible = "national,lm75";
+               reg = <0x48>;
+       };
+
+       /* Thermal monitor - chip */
+       temperature-sensor@4c {
+               compatible = "ti,tmp451";
+               reg = <0x4c>;
+       };
+
+       eeprom@51 {
+               compatible = "atmel,24c32";
+               reg = <0x51>;
+       };
+
+       /* Unsupported devices:
+        * - FXAS21002C Gyroscope at 0x20
+        * - TI ADS7924 4-channel ADC at 0x49
+        */
+};
+
+&ifc {
+       status = "disabled";
+};
+
+&lpuart0 {
+       status = "okay";
+};
+
+&lpuart3 {
+       status = "okay";
+};
+
+&mdio0 {
+       /* AR8031 */
+       sgmii_phy1: ethernet-phy@1 {
+               reg = <0x1>;
+       };
+
+       /* AR8031 */
+       sgmii_phy2: ethernet-phy@2 {
+               reg = <0x2>;
+       };
+
+       /* BCM5464 quad PHY */
+       rgmii_phy3: ethernet-phy@3 {
+               reg = <0x3>;
+       };
+
+       rgmii_phy4: ethernet-phy@4 {
+               reg = <0x4>;
+       };
+
+       rgmii_phy5: ethernet-phy@5 {
+               reg = <0x5>;
+       };
+
+       rgmii_phy6: ethernet-phy@6 {
+               reg = <0x6>;
+       };
+
+       /* SGMII PCS for enet0 */
+       tbi0: tbi-phy@1f {
+               reg = <0x1f>;
+               device_type = "tbi-phy";
+       };
+};
+
+&mdio1 {
+       /* SGMII PCS for enet1 */
+       tbi1: tbi-phy@1f {
+               reg = <0x1f>;
+               device_type = "tbi-phy";
+       };
+};
+
+&qspi {
+       status = "okay";
+
+       flash@0 {
+               /* Rev. A uses 64MB flash, Rev. B & C use 32MB flash */
+               compatible = "jedec,spi-nor", "s25fl256s1", "s25fl512s";
+               spi-max-frequency = <20000000>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               label = "RCW";
+                               reg = <0x0 0x40000>;
+                       };
+
+                       partition@40000 {
+                               label = "U-Boot";
+                               reg = <0x40000 0x300000>;
+                       };
+
+                       partition@340000 {
+                               label = "U-Boot Env";
+                               reg = <0x340000 0x100000>;
+                       };
+               };
+       };
+};
+
+&sai2 {
+       status = "okay";
+};
+
+&sata {
+       status = "okay";
+};
+
+&uart0 {
+       status = "okay";
+};
index 8841783aceec93e4158d0539fd89269243524529..c4447f6c8b2cb0fa4ff6c70419cff895b6c08c1d 100644 (file)
@@ -1,48 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0 OR MIT
 /*
  * Copyright 2014 Carlo Caione <carlo@caione.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
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This library is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this library; if not, write to the Free
- *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- *     MA 02110-1301 USA
- *
- * Or, alternatively,
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use,
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
  */
 
 #include <dt-bindings/interrupt-controller/irq.h>
index 997e69c5963e2727d091aee82ea1dbc29cc9d85d..98e1c94c02611ecc41735659649cc7d0bb525a56 100644 (file)
@@ -1,48 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0 OR MIT
 /*
  * Copyright 2014 Carlo Caione <carlo@caione.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
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This library is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this library; if not, write to the Free
- *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- *     MA 02110-1301 USA
- *
- * Or, alternatively,
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use,
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
  */
 
 /dts-v1/;
index 65585255910a8cfc12049ee0c4a1fa18e5deb46b..2d31b7ce3f8cb144eeeabe80001d3a00a21fb616 100644 (file)
@@ -1,48 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0 OR MIT
 /*
  * Copyright 2014 Carlo Caione <carlo@caione.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
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This library is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this library; if not, write to the Free
- *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- *     MA 02110-1301 USA
- *
- * Or, alternatively,
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use,
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
  */
 
 #include "meson.dtsi"
index 8686abd5de7fe47b1e355da76f0d5bc6d6ce8d93..61ec929ab86e27c6cafcad237126900e9c9a1d70 100644 (file)
@@ -1,43 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0 OR MIT
 /*
  * Copyright 2014 Beniamino Galvani <b.galvani@gmail.com>
- *
- * 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
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This library is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- * Or, alternatively,
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use,
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
  */
 
 /dts-v1/;
index 40c11b6b217aad3498bd6ea1a9b34774effed87f..5a7e3e5caebe2fc4e7f0880ab9f37d8ff026f9b3 100644 (file)
@@ -1,46 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0 OR MIT
 /*
  * Copyright 2014 Carlo Caione <carlo@caione.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
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This library is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public License
- *     along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * Or, alternatively,
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use,
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
  */
 
 #include <dt-bindings/clock/meson8b-clkc.h>
                };
        };
 
+       mmcbus: bus@c8000000 {
+               compatible = "simple-bus";
+               reg = <0xc8000000 0x8000>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x0 0xc8000000 0x8000>;
+
+               dmcbus: bus@6000 {
+                       compatible = "simple-bus";
+                       reg = <0x6000 0x400>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0x0 0x6000 0x400>;
+
+                       canvas: video-lut@20 {
+                               compatible = "amlogic,meson8-canvas",
+                                            "amlogic,canvas";
+                               reg = <0x20 0x14>;
+                       };
+               };
+       };
+
        apb: bus@d0000000 {
                compatible = "simple-bus";
                reg = <0xd0000000 0x200000>;
index 9bf4249cb60d00effefe87dd6016885293e1caab..96d239d8334ee29478bb4cfa1ec5078dbcde2459 100644 (file)
        phy-handle = <&eth_phy0>;
        phy-mode = "rmii";
 
-       snps,reset-gpio = <&gpio GPIOH_4 0>;
-       snps,reset-delays-us = <0 10000 1000000>;
-       snps,reset-active-low;
-
        mdio {
                compatible = "snps,dwmac-mdio";
                #address-cells = <1>;
                eth_phy0: ethernet-phy@0 {
                        /* IC Plus IP101A/G (0x02430c54) */
                        reg = <0>;
+
+                       reset-assert-us = <10000>;
+                       reset-deassert-us = <10000>;
+                       reset-gpios = <&gpio GPIOH_4 GPIO_ACTIVE_LOW>;
+
                        icplus,select-interrupt;
                        interrupt-parent = <&gpio_intc>;
                        /* GPIOH_3 */
index 08ddd7fb0bf8ade757709714fcd2f791fa8c98e8..bb27b34eb34613ca124153abfb93998bc833b19f 100644 (file)
@@ -1,50 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0 OR MIT
 /*
  * Copyright 2015 Endless Mobile, Inc.
  * Author: Carlo Caione <carlo@endlessm.com>
- *
- * 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
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This library is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public License
- *     along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * Or, alternatively,
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use,
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
  */
 
 /dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+
 #include "meson8b.dtsi"
 
 / {
                device_type = "memory";
                reg = <0x40000000 0x40000000>;
        };
+
+       iio-hwmon {
+               compatible = "iio-hwmon";
+               io-channels = <&saradc 8>;
+       };
+
+       vcck: regulator-vcck {
+               compatible = "pwm-regulator";
+
+               regulator-name = "VCCK";
+               regulator-min-microvolt = <860000>;
+               regulator-max-microvolt = <1140000>;
+
+               pwms = <&pwm_cd 0 1148 0>;
+               pwm-dutycycle-range = <100 0>;
+
+               regulator-boot-on;
+               regulator-always-on;
+       };
+
+       vcc_1v8: regulator-vcc1v8 {
+               compatible = "regulator-fixed";
+
+               regulator-name = "VCC1V8";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+
+               vin-supply = <&vcc_3v3>;
+       };
+
+       vcc_3v3: regulator-vcc3v3 {
+               compatible = "regulator-fixed";
+
+               regulator-name = "VCC3V3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+
+               vin-supply = <&vcc_5v>;
+       };
+
+       vcc_5v: regulator-vcc5v {
+               compatible = "regulator-fixed";
+
+               regulator-name = "VCC5V";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+
+               regulator-boot-on;
+               regulator-always-on;
+       };
+};
+
+&cpu0 {
+       cpu-supply = <&vcck>;
+};
+
+&ethmac {
+       status = "okay";
+
+       pinctrl-0 = <&eth_rmii_pins>;
+       pinctrl-names = "default";
+
+       phy-handle = <&eth_phy0>;
+       phy-mode = "rmii";
+
+       mdio {
+               compatible = "snps,dwmac-mdio";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               eth_phy0: ethernet-phy@0 {
+                       /* IC Plus IP101A/G (0x02430c54) */
+                       reg = <0>;
+
+                       reset-assert-us = <10000>;
+                       reset-deassert-us = <10000>;
+                       reset-gpios = <&gpio GPIOH_4 GPIO_ACTIVE_LOW>;
+
+                       icplus,select-interrupt;
+                       interrupt-parent = <&gpio_intc>;
+                       /* GPIOH_3 */
+                       interrupts = <17 IRQ_TYPE_LEVEL_LOW>;
+               };
+       };
+};
+
+&saradc {
+       status = "okay";
+       vref-supply = <&vcc_1v8>;
+};
+
+&sdio {
+       status = "okay";
+
+       pinctrl-0 = <&sd_b_pins>;
+       pinctrl-names = "default";
+
+       /* SD card */
+       sd_card_slot: slot@1 {
+               compatible = "mmc-slot";
+               reg = <1>;
+               status = "okay";
+
+               bus-width = <4>;
+               no-sdio;
+               cap-mmc-highspeed;
+               cap-sd-highspeed;
+               disable-wp;
+
+               cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
+
+               vmmc-supply = <&vcc_3v3>;
+       };
+};
+
+&pwm_cd {
+       status = "okay";
+       pinctrl-0 = <&pwm_c1_pins>;
+       pinctrl-names = "default";
+       clocks = <&clkc CLKID_XTAL>;
+       clock-names = "clkin0";
 };
 
 &uart_AO {
        pinctrl-0 = <&uart_ao_a_pins>;
        pinctrl-names = "default";
 };
+
+&usb0 {
+       status = "okay";
+};
+
+&usb0_phy {
+       status = "okay";
+};
+
+&usb1 {
+       status = "okay";
+};
+
+&usb1_phy {
+       status = "okay";
+};
index f3ad9397f670931c064f3511ea7ae86ca6f6e66c..86c4614e0a387520591ce50f0d695e5023bf4db7 100644 (file)
@@ -1,47 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0 OR MIT
 /*
  * Copyright 2015 Endless Mobile, Inc.
  * Author: Carlo Caione <carlo@endlessm.com>
- *
- * 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
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This library is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public License
- *     along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * Or, alternatively,
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use,
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
  */
 
 /dts-v1/;
 &ethmac {
        status = "okay";
 
-       snps,reset-gpio = <&gpio GPIOH_4 GPIO_ACTIVE_HIGH>;
-       snps,reset-active-low;
-       snps,reset-delays-us = <0 10000 30000>;
-
        pinctrl-0 = <&eth_rgmii_pins>;
        pinctrl-names = "default";
 
                /* Realtek RTL8211F (0x001cc916) */
                eth_phy: ethernet-phy@0 {
                        reg = <0>;
+
+                       reset-assert-us = <10000>;
+                       reset-deassert-us = <30000>;
+                       reset-gpios = <&gpio GPIOH_4 GPIO_ACTIVE_LOW>;
+
                        interrupt-parent = <&gpio_intc>;
                        /* GPIOH_3 */
                        interrupts = <17 IRQ_TYPE_LEVEL_LOW>;
index ec67f49116d9cabf9fcc2730d813d7ae3da1aa24..fba2c70c2fda321155ffa498f4d6691af70720eb 100644 (file)
@@ -1,47 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0 OR MIT
 /*
  * Copyright 2015 Endless Mobile, Inc.
  * Author: Carlo Caione <carlo@endlessm.com>
- *
- * 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
- * licensing only applies to this file, and not this project as a
- * whole.
- *
- *  a) This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     This library is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public License
- *     along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * Or, alternatively,
- *
- *  b) Permission is hereby granted, free of charge, to any person
- *     obtaining a copy of this software and associated documentation
- *     files (the "Software"), to deal in the Software without
- *     restriction, including without limitation the rights to use,
- *     copy, modify, merge, publish, distribute, sublicense, and/or
- *     sell copies of the Software, and to permit persons to whom the
- *     Software is furnished to do so, subject to the following
- *     conditions:
- *
- *     The above copyright notice and this permission notice shall be
- *     included in all copies or substantial portions of the Software.
- *
- *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *     OTHER DEALINGS IN THE SOFTWARE.
  */
 
 #include <dt-bindings/clock/meson8b-clkc.h>
                };
        };
 
+       mmcbus: bus@c8000000 {
+               compatible = "simple-bus";
+               reg = <0xc8000000 0x8000>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x0 0xc8000000 0x8000>;
+
+               dmcbus: bus@6000 {
+                       compatible = "simple-bus";
+                       reg = <0x6000 0x400>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0x0 0x6000 0x400>;
+
+                       canvas: video-lut@48 {
+                               compatible = "amlogic,meson8b-canvas",
+                                            "amlogic,canvas";
+                               reg = <0x48 0x14>;
+                       };
+               };
+       };
+
        apb: bus@d0000000 {
                compatible = "simple-bus";
                reg = <0xd0000000 0x200000>;
index 29d830ae4bf468b84ae10e60f4610675b1e76f35..d54477b1001ca775a2137060870b9cface45ece6 100644 (file)
 
        amlogic,tx-delay-ns = <4>;
 
-       snps,reset-gpio = <&gpio GPIOH_4 0>;
-       snps,reset-delays-us = <0 10000 1000000>;
-       snps,reset-active-low;
-
        mdio {
                compatible = "snps,dwmac-mdio";
                #address-cells = <1>;
                eth_phy0: ethernet-phy@0 {
                        /* Realtek RTL8211F (0x001cc916) */
                        reg = <0>;
+
+                       reset-assert-us = <10000>;
+                       reset-deassert-us = <30000>;
+                       reset-gpios = <&gpio GPIOH_4 GPIO_ACTIVE_LOW>;
                };
        };
 };
                                regulator-always-on;
                        };
 
-                       DCDC2 {
-                               regulator-name = "VDDAO";
+                       vddee: DCDC2 {
+                               /* the output is also used as VDDAO */
+                               regulator-name = "VDD_EE";
                                regulator-min-microvolt = <950000>;
                                regulator-max-microvolt = <1150000>;
                                regulator-boot-on;
        };
 };
 
+&mali {
+       mali-supply = <&vddee>;
+};
+
 &saradc {
        status = "okay";
        vref-supply = <&vddio_ao1v8>;
index bb87b251e16de240a6ae1764e9552110e73832d5..5bde7f502007d603d11c2e538734a93933289b7f 100644 (file)
        compatible = "amlogic,meson8m2-clkc", "amlogic,meson8-clkc";
 };
 
+&dmcbus {
+       /* the offset of the canvas registers has changed compared to Meson8 */
+       /delete-node/ video-lut@20;
+
+       canvas: video-lut@48 {
+               compatible = "amlogic,meson8m2-canvas", "amlogic,canvas";
+               reg = <0x48 0x14>;
+       };
+};
+
 &ethmac {
        compatible = "amlogic,meson8m2-dwmac", "snps,dwmac";
        reg = <0xc9410000 0x10000
index 5059ecac44787cd6711b869b03cdb92ab0da5be8..bea05dc4ef0f96ce3ae8c596b2392ac8d95129da 100644 (file)
 
                target-module@20000 {                   /* 0x48020000, ap 3 06.0 */
                        compatible = "ti,sysc-omap2", "ti,sysc";
-                       ti,hwmods = "uart3";
                        reg = <0x20050 0x4>,
                              <0x20054 0x4>,
                              <0x20058 0x4>;
 
                target-module@6a000 {                   /* 0x4806a000, ap 26 18.0 */
                        compatible = "ti,sysc-omap2", "ti,sysc";
-                       ti,hwmods = "uart1";
                        reg = <0x6a050 0x4>,
                              <0x6a054 0x4>,
                              <0x6a058 0x4>;
 
                target-module@6c000 {                   /* 0x4806c000, ap 28 20.0 */
                        compatible = "ti,sysc-omap2", "ti,sysc";
-                       ti,hwmods = "uart2";
                        reg = <0x6c050 0x4>,
                              <0x6c054 0x4>,
                              <0x6c058 0x4>;
 
                target-module@6e000 {                   /* 0x4806e000, ap 30 1c.1 */
                        compatible = "ti,sysc-omap2", "ti,sysc";
-                       ti,hwmods = "uart4";
                        reg = <0x6e050 0x4>,
                              <0x6e054 0x4>,
                              <0x6e058 0x4>;
 
                target-module@9c000 {                   /* 0x4809c000, ap 53 36.0 */
                        compatible = "ti,sysc-omap4", "ti,sysc";
-                       ti,hwmods = "mmc1";
                        reg = <0x9c000 0x4>,
                              <0x9c010 0x4>;
                        reg-names = "rev", "sysc";
 
                target-module@ad000 {                   /* 0x480ad000, ap 63 50.0 */
                        compatible = "ti,sysc-omap4", "ti,sysc";
-                       ti,hwmods = "mmc3";
                        reg = <0xad000 0x4>,
                              <0xad010 0x4>;
                        reg-names = "rev", "sysc";
 
                target-module@b4000 {                   /* 0x480b4000, ap 67 46.0 */
                        compatible = "ti,sysc-omap4", "ti,sysc";
-                       ti,hwmods = "mmc2";
                        reg = <0xb4000 0x4>,
                              <0xb4010 0x4>;
                        reg-names = "rev", "sysc";
 
                target-module@d1000 {                   /* 0x480d1000, ap 73 44.0 */
                        compatible = "ti,sysc-omap4", "ti,sysc";
-                       ti,hwmods = "mmc4";
                        reg = <0xd1000 0x4>,
                              <0xd1010 0x4>;
                        reg-names = "rev", "sysc";
 
                target-module@d5000 {                   /* 0x480d5000, ap 75 4e.0 */
                        compatible = "ti,sysc-omap4", "ti,sysc";
-                       ti,hwmods = "mmc5";
                        reg = <0xd5000 0x4>,
                              <0xd5010 0x4>;
                        reg-names = "rev", "sysc";
index 8ac24e3c851388428ed51d17eda5b0e572b23258..8a6721d436bde259e3b555ce72c279623bebfeca 100644 (file)
 
        gpio_keys_pins: gpio-keys-pins {
                pinctrl-single,pins = <
-                       MFP_PIN_PXA300(14) MFP_AF0      /* SCK          */
-                       MFP_PIN_PXA300(115) MFP_AF0     /* MOSI         */
-                       MFP_PIN_PXA300(119) MFP_AF0     /* MISO         */
+                       MFP_PIN_PXA300(14) MFP_AF0      /* on-off       */
+                       MFP_PIN_PXA300(115) MFP_AF0     /* rescue boot  */
+                       MFP_PIN_PXA300(119) MFP_AF0     /* setup        */
                >;
                pinctrl-single,low-power-mode = MFP_LPM(MFP_LPM_FLOAT);
        };
index 65d825091f0dcbc18483f0c5b5d1bfab923c1983..12b15945ac6d12cccf9ae43b7fe839e25151b9ea 100644 (file)
@@ -41,6 +41,8 @@
        };
 
        charger: charger {
+               pinctrl-names = "default";
+               pinctrl-0 = <&charger_pins>;
                compatible = "gpio-charger";
                charger-type = "mains";
                gpios = <&gpio 101 GPIO_ACTIVE_LOW>;
 };
 
 &keys {
+       pinctrl-0 = <&gpio_keys_pins &dock_detect_pins>;
        dock-detect {
                label = "dock detect";
-               gpios = <&gpio 116 GPIO_ACTIVE_HIGH>;
+               gpios = <&gpio 116 GPIO_ACTIVE_LOW>;
                linux,code = <KEY_F5>;
        };
 };
                pinctrl-single,low-power-mode = MFP_LPM(MFP_LPM_FLOAT);
        };
 
+       charger_pins: charger_pins {
+               pinctrl-single,pins = <
+                       MFP_PIN_PXA300(31) MFP_AF0      /* PEN2 */
+               >;
+               pinctrl-single,low-power-mode = MFP_LPM(MFP_LPM_PULL_HIGH);
+               pinctrl-single,bias-pullup = MPF_PULL_UP;
+       };
+
+       dock_detect_pins: dock_detect_pins {
+               pinctrl-single,pins = <
+                       MFP_PIN_PXA300(116) MFP_AF0     /* DOCK_DETECT  */
+               >;
+               pinctrl-single,low-power-mode = MFP_LPM(MFP_LPM_PULL_HIGH);
+               pinctrl-single,bias-pullup = MPF_PULL_UP;
+       };
+
        lcdc_pins: lcdc-pins {
                pinctrl-single,pins = <
                        MFP_PIN_PXA300(54) MFP_AF1      /* LDD_0        */
index 5f9e37585a28c7e4dcd0449d1a9cf601b21ea608..a70560a8ea920fc9b2ea3fbcc648837b7289c000 100644 (file)
                st,invalid-input-detect-mute;
                /* 2 (half-bridge) and 1 (full-bridge) on-board power */
                st,output-conf = /bits/ 8 <0x1>;
+               st,ch1-output-mapping = /bits/ 8 <0>;
+               st,ch2-output-mapping = /bits/ 8 <1>;
+               st,ch3-output-mapping = /bits/ 8 <2>;
                st,needs_esd_watchdog;
        };
 };
index e1e607f53ce637551e30c7c8922c4402e487c686..c237a0e4b12ae6f9b47e6eaa014a4f9811c3eab3 100644 (file)
 #define MFP_DS10X      < (0x6 << 10) MFP_DSMSK >
 #define MFP_DS13X      < (0x7 << 10) MFP_DSMSK >
 
+/*
+ * MFP bias pull mode for pins.
+ * Example of use: pinctrl-single,bias-pullup = MPF_PULL_UP;
+ */
+#define MPF_PULL_MSK   (0x7 << 13)
+#define MPF_PULL_DOWN  < (0x5 << 13) (0x5 << 13) 0 MPF_PULL_MSK >
+#define MPF_PULL_UP    < (0x6 << 13) (0x6 << 13) 0 MPF_PULL_MSK >
+
 /*
  * MFP low power mode for pins.
  * Example of use:
index 65975df6a8c34d7e3ffef2c1b2e3452b026e9c7c..8b79b4112ee1a92a00b910109a58907e70ae8648 100644 (file)
                };
 
                replicator {
-                       compatible = "arm,coresight-replicator";
+                       compatible = "arm,coresight-static-replicator";
 
                        clocks = <&rpmcc RPM_QDSS_CLK>;
                        clock-names = "apb_pclk";
                };
 
                funnel@1a04000 {
-                       compatible = "arm,coresight-funnel", "arm,primecell";
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                        reg = <0x1a04000 0x1000>;
 
                        clocks = <&rpmcc RPM_QDSS_CLK>;
index 643c57f848184c338a5a09439ad9f78dfa622ce6..bf402ae39226a908cd6fe59ecd58f2b46aac8f19 100644 (file)
                };
        };
 
+       vibrator {
+               compatible = "gpio-vibrator";
+               enable-gpios = <&msmgpio 86 GPIO_ACTIVE_HIGH>;
+               vcc-supply = <&pm8941_l18>;
+       };
+
        smd {
                rpm {
                        rpm_requests {
index b3b04736a15991a12952fdee98c71123cc8c2198..3487daf98e8131adc9895f03c20bac45d5f37242 100644 (file)
                        };
                };
 
+               i2c2_pins: i2c2 {
+                       mux {
+                               pins = "gpio6", "gpio7";
+                               function = "blsp_i2c2";
+
+                               drive-strength = <2>;
+                               bias-disable;
+                       };
+               };
+
                i2c3_pins: i2c3 {
                        mux {
                                pins = "gpio10", "gpio11";
                        };
                };
 
+               i2c11_pins: i2c11 {
+                       mux {
+                               pins = "gpio83", "gpio84";
+                               function = "blsp_i2c11";
+
+                               drive-strength = <2>;
+                               bias-disable;
+                       };
+               };
+
                i2c12_pins: i2c12 {
                        mux {
                                pins = "gpio87", "gpio88";
                                input-enable;
                        };
                };
+
+               touch_pin: touch {
+                       int {
+                               pins = "gpio5";
+                               function = "gpio";
+
+                               drive-strength = <2>;
+                               bias-disable;
+                               input-enable;
+                       };
+
+                       reset {
+                               pins = "gpio8";
+                               function = "gpio";
+
+                               drive-strength = <2>;
+                               bias-pull-up;
+                       };
+               };
+
+               panel_pin: panel {
+                       te {
+                               pins = "gpio12";
+                               function = "mdp_vsync";
+
+                               drive-strength = <2>;
+                               bias-disable;
+                       };
+               };
        };
 
        sdhci@f9824900 {
                };
        };
 
+       i2c@f9967000 {
+               status = "ok";
+               pinctrl-names = "default";
+               pinctrl-0 = <&i2c11_pins>;
+               clock-frequency = <355000>;
+               qcom,src-freq = <50000000>;
+
+               led-controller@38 {
+                       compatible = "ti,lm3630a";
+                       status = "ok";
+                       reg = <0x38>;
+
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       led@0 {
+                               reg = <0>;
+                               led-sources = <0 1>;
+                               label = "lcd-backlight";
+                               default-brightness = <200>;
+                       };
+               };
+       };
+
        i2c@f9968000 {
                status = "ok";
                pinctrl-names = "default";
                };
        };
 
+       i2c@f9924000 {
+               status = "ok";
+
+               clock-frequency = <355000>;
+               qcom,src-freq = <50000000>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&i2c2_pins>;
+
+               synaptics@70 {
+                       compatible = "syna,rmi4-i2c";
+                       reg = <0x70>;
+
+                       interrupts-extended = <&msmgpio 5 IRQ_TYPE_EDGE_FALLING>;
+                       vdd-supply = <&pm8941_l22>;
+                       vio-supply = <&pm8941_lvs3>;
+
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&touch_pin>;
+
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       rmi4-f01@1 {
+                               reg = <0x1>;
+                               syna,nosleep-mode = <1>;
+                       };
+
+                       rmi4-f12@12 {
+                               reg = <0x12>;
+                               syna,sensor-type = <1>;
+                       };
+               };
+       };
+
        i2c@f9925000 {
                status = "ok";
                pinctrl-names = "default";
                        };
                };
        };
+
+       mdss@fd900000 {
+               status = "ok";
+
+               mdp@fd900000 {
+                       status = "ok";
+               };
+
+               dsi@fd922800 {
+                       status = "ok";
+
+                       vdda-supply = <&pm8941_l2>;
+                       vdd-supply = <&pm8941_lvs3>;
+                       vddio-supply = <&pm8941_l12>;
+
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       ports {
+                               port@1 {
+                                       endpoint {
+                                               remote-endpoint = <&panel_in>;
+                                               data-lanes = <0 1 2 3>;
+                                       };
+                               };
+                       };
+
+                       panel: panel@0 {
+                               reg = <0>;
+                               compatible = "lg,acx467akm-7";
+
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&panel_pin>;
+
+                               port {
+                                       panel_in: endpoint {
+                                               remote-endpoint = <&dsi0_out>;
+                                       };
+                               };
+                       };
+               };
+
+               dsi-phy@fd922a00 {
+                       status = "ok";
+
+                       vddio-supply = <&pm8941_l12>;
+               };
+       };
 };
 
 &spmi_bus {
index 45b5c8ef0374fde6b0b1ed7a66750f3d05fb696e..369e58f64145da6bd1b011007a13af336fd8a496 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/clock/qcom,gcc-msm8974.h>
+#include <dt-bindings/clock/qcom,mmcc-msm8974.h>
 #include <dt-bindings/clock/qcom,rpmcc.h>
 #include <dt-bindings/reset/qcom,gcc-msm8974.h>
 #include <dt-bindings/gpio/gpio.h>
                };
 
                funnel@fc31b000 {
-                       compatible = "arm,coresight-funnel", "arm,primecell";
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                        reg = <0xfc31b000 0x1000>;
 
                        clocks = <&rpmcc RPM_SMD_QDSS_CLK>, <&rpmcc RPM_SMD_QDSS_A_CLK>;
                };
 
                funnel@fc31a000 {
-                       compatible = "arm,coresight-funnel", "arm,primecell";
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                        reg = <0xfc31a000 0x1000>;
 
                        clocks = <&rpmcc RPM_SMD_QDSS_CLK>, <&rpmcc RPM_SMD_QDSS_A_CLK>;
                };
 
                funnel@fc345000 { /* KPSS funnel only 4 inputs are used */
-                       compatible = "arm,coresight-funnel", "arm,primecell";
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                        reg = <0xfc345000 0x1000>;
 
                        clocks = <&rpmcc RPM_SMD_QDSS_CLK>, <&rpmcc RPM_SMD_QDSS_A_CLK>;
                                };
                        };
                };
+
+               mdss: mdss@fd900000 {
+                       status = "disabled";
+
+                       compatible = "qcom,mdss";
+                       reg = <0xfd900000 0x100>,
+                             <0xfd924000 0x1000>;
+                       reg-names = "mdss_phys",
+                                   "vbif_phys";
+
+                       power-domains = <&mmcc MDSS_GDSC>;
+
+                       clocks = <&mmcc MDSS_AHB_CLK>,
+                                <&mmcc MDSS_AXI_CLK>,
+                                <&mmcc MDSS_VSYNC_CLK>;
+                       clock-names = "iface",
+                                     "bus",
+                                     "vsync";
+
+                       interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
+
+                       interrupt-controller;
+                       #interrupt-cells = <1>;
+
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+
+                       mdp: mdp@fd900000 {
+                               status = "disabled";
+
+                               compatible = "qcom,mdp5";
+                               reg = <0xfd900100 0x22000>;
+                               reg-names = "mdp_phys";
+
+                               interrupt-parent = <&mdss>;
+                               interrupts = <0 0>;
+
+                               clocks = <&mmcc MDSS_AHB_CLK>,
+                                        <&mmcc MDSS_AXI_CLK>,
+                                        <&mmcc MDSS_MDP_CLK>,
+                                        <&mmcc MDSS_VSYNC_CLK>;
+                               clock-names = "iface",
+                                             "bus",
+                                             "core",
+                                             "vsync";
+
+                               ports {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       port@0 {
+                                               reg = <0>;
+                                               mdp5_intf1_out: endpoint {
+                                                       remote-endpoint = <&dsi0_in>;
+                                               };
+                                       };
+                               };
+                       };
+
+                       dsi0: dsi@fd922800 {
+                               status = "disabled";
+
+                               compatible = "qcom,mdss-dsi-ctrl";
+                               reg = <0xfd922800 0x1f8>;
+                               reg-names = "dsi_ctrl";
+
+                               interrupt-parent = <&mdss>;
+                               interrupts = <4 IRQ_TYPE_LEVEL_HIGH>;
+
+                               assigned-clocks = <&mmcc BYTE0_CLK_SRC>,
+                                                 <&mmcc PCLK0_CLK_SRC>;
+                               assigned-clock-parents = <&dsi_phy0 0>,
+                                                        <&dsi_phy0 1>;
+
+                               clocks = <&mmcc MDSS_MDP_CLK>,
+                                        <&mmcc MDSS_AHB_CLK>,
+                                        <&mmcc MDSS_AXI_CLK>,
+                                        <&mmcc MDSS_BYTE0_CLK>,
+                                        <&mmcc MDSS_PCLK0_CLK>,
+                                        <&mmcc MDSS_ESC0_CLK>,
+                                        <&mmcc MMSS_MISC_AHB_CLK>;
+                               clock-names = "mdp_core",
+                                             "iface",
+                                             "bus",
+                                             "byte",
+                                             "pixel",
+                                             "core",
+                                             "core_mmss";
+
+                               phys = <&dsi_phy0>;
+                               phy-names = "dsi-phy";
+
+                               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 {
+                                               };
+                                       };
+                               };
+                       };
+
+                       dsi_phy0: dsi-phy@fd922a00 {
+                               status = "disabled";
+
+                               compatible = "qcom,dsi-phy-28nm-hpm";
+                               reg = <0xfd922a00 0xd4>,
+                                     <0xfd922b00 0x280>,
+                                     <0xfd922d80 0x30>;
+                               reg-names = "dsi_pll",
+                                           "dsi_phy",
+                                           "dsi_phy_regulator";
+
+                               #clock-cells = <1>;
+                               #phy-cells = <0>;
+                               qcom,dsi-phy-index = <0>;
+
+                               clocks = <&mmcc MDSS_AHB_CLK>;
+                               clock-names = "iface";
+                       };
+               };
        };
 
        smd {
index 474baa0c7cfc2cc16f7c704c77884e129d82606f..07d611d2b7b5275635d8e225695df9b2ba91d342 100644 (file)
@@ -20,7 +20,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
index ff24301dc1be54de6dad77934b75e645395d5142..99acfe4fe11aaed9d07221763874ed1f50d70896 100644 (file)
@@ -8,6 +8,7 @@
 /dts-v1/;
 #include "r7s72100.dtsi"
 #include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
 #include <dt-bindings/pinctrl/r7s72100-pinctrl.h>
 
 / {
                reg = <0x08000000 0x02000000>;
        };
 
+       keyboard {
+               compatible = "gpio-keys";
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&keyboard_pins>;
+
+               key-1 {
+                       interrupt-parent = <&irqc>;
+                       interrupts = <3 IRQ_TYPE_EDGE_BOTH>;
+                       linux,code = <KEY_1>;
+                       label = "SW1";
+                       wakeup-source;
+               };
+
+               key-2 {
+                       interrupt-parent = <&irqc>;
+                       interrupts = <2 IRQ_TYPE_EDGE_BOTH>;
+                       linux,code = <KEY_2>;
+                       label = "SW2";
+                       wakeup-source;
+               };
+
+               key-3 {
+                       interrupt-parent = <&irqc>;
+                       interrupts = <5 IRQ_TYPE_EDGE_BOTH>;
+                       linux,code = <KEY_3>;
+                       label = "SW3";
+                       wakeup-source;
+               };
+       };
+
        lbsc {
                #address-cells = <1>;
                #size-cells = <1>;
                         <RZA1_PINMUX(1, 7, 1)>;        /* RIIC3SDA */
        };
 
+       keyboard_pins: keyboard {
+               pinmux = <RZA1_PINMUX(1, 9, 3)>,        /* IRQ3 */
+                        <RZA1_PINMUX(1, 8, 3)>,        /* IRQ2 */
+                        <RZA1_PINMUX(1, 11, 3)>;       /* IRQ5 */
+       };
+
        /* Serial Console */
        scif2_pins: serial2 {
                pinmux = <RZA1_PINMUX(3, 0, 6)>,        /* TxD2 */
index 2211f88ede2ad351fdbbd1c2e07865a3448f8a97..d03dcd919d6f5cfb17e493aa196d568e24d84cb4 100644 (file)
                        status = "disabled";
                };
 
+               irqc: interrupt-controller@fcfef800 {
+                       compatible = "renesas,r7s72100-irqc",
+                                    "renesas,rza1-irqc";
+                       #interrupt-cells = <2>;
+                       #address-cells = <0>;
+                       interrupt-controller;
+                       reg = <0xfcfef800 0x6>;
+                       interrupt-map =
+                               <0 0 &gic GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
+                               <1 0 &gic GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
+                               <2 0 &gic GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
+                               <3 0 &gic GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>,
+                               <4 0 &gic GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
+                               <5 0 &gic GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
+                               <6 0 &gic GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
+                               <7 0 &gic GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-map-mask = <7 0>;
+               };
+
                mtu2: timer@fcff0000 {
                        compatible = "renesas,mtu2-r7s72100", "renesas,mtu2";
                        reg = <0xfcff0000 0x400>;
index 991e09de12198f95ffcab393e93ebc5b34c09988..d062d02865e7dfbb34a7ad6ebf76ee1ffd3b25e5 100644 (file)
@@ -9,6 +9,7 @@
 /dts-v1/;
 #include "r7s9210.dtsi"
 #include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
 #include <dt-bindings/pinctrl/r7s9210-pinctrl.h>
 
 / {
@@ -17,6 +18,8 @@
 
        aliases {
                serial0 = &scif4;
+               ethernet0 = &ether0;
+               ethernet1 = &ether1;
        };
 
        chosen {
                stdout-path = "serial0:115200n8";
        };
 
-       memory@40000000 {
-               device_type = "memory";
-               reg = <0x40000000 0x00800000>;   /* HyperRAM */
+       keyboard {
+               compatible = "gpio-keys";
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&keyboard_pins>;
+
+               key-3 {
+                       interrupt-parent = <&irqc>;
+                       interrupts = <0 IRQ_TYPE_EDGE_BOTH>;
+                       linux,code = <KEY_3>;
+                       label = "SW3";
+                       wakeup-source;
+               };
        };
 
        lbsc {
                        gpios = <&pinctrl RZA2_PIN(PORTC, 1) GPIO_ACTIVE_HIGH>;
                };
        };
+
+       memory@40000000 {
+               device_type = "memory";
+               reg = <0x40000000 0x00800000>;   /* HyperRAM */
+       };
+};
+
+&ehci0 {
+       status = "okay";
+};
+
+&ehci1 {
+       status = "okay";
+};
+
+&ether0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&eth0_pins>;
+       status = "okay";
+       renesas,no-ether-link;
+       phy-handle = <&phy0>;
+       phy0: ethernet-phy@0 {
+               reg = <0>;
+       };
+};
+
+&ether1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&eth1_pins>;
+       status = "okay";
+       renesas,no-ether-link;
+       phy-handle = <&phy1>;
+       phy1: ethernet-phy@1 {
+               reg = <0>;
+       };
 };
 
 /* EXTAL */
        clock-frequency = <24000000>;   /* 24MHz */
 };
 
-/* RTC_X1 */
-&rtc_x1_clk {
-       clock-frequency = <32768>;
+/* High resolution System tick timers */
+&ostm0 {
+       status = "okay";
+};
+
+&ostm1 {
+       status = "okay";
 };
 
 &pinctrl {
+       eth0_pins: eth0 {
+               pinmux = <RZA2_PINMUX(PORTE, 0, 7)>, /* REF50CK0 */
+                        <RZA2_PINMUX(PORT6, 1, 7)>, /* RMMI0_TXDEN */
+                        <RZA2_PINMUX(PORT6, 2, 7)>, /* RMII0_TXD0 */
+                        <RZA2_PINMUX(PORT6, 3, 7)>, /* RMII0_TXD1 */
+                        <RZA2_PINMUX(PORTE, 4, 7)>, /* RMII0_CRSDV */
+                        <RZA2_PINMUX(PORTE, 1, 7)>, /* RMII0_RXD0 */
+                        <RZA2_PINMUX(PORTE, 2, 7)>, /* RMII0_RXD1 */
+                        <RZA2_PINMUX(PORTE, 3, 7)>, /* RMII0_RXER */
+                        <RZA2_PINMUX(PORTE, 5, 1)>, /* ET0_MDC */
+                        <RZA2_PINMUX(PORTE, 6, 1)>, /* ET0_MDIO */
+                        <RZA2_PINMUX(PORTL, 0, 5)>; /* IRQ4 */
+       };
+
+       eth1_pins: eth1 {
+               pinmux = <RZA2_PINMUX(PORTK, 3, 7)>, /* REF50CK1 */
+                        <RZA2_PINMUX(PORTK, 0, 7)>, /* RMMI1_TXDEN */
+                        <RZA2_PINMUX(PORTK, 1, 7)>, /* RMII1_TXD0 */
+                        <RZA2_PINMUX(PORTK, 2, 7)>, /* RMII1_TXD1 */
+                        <RZA2_PINMUX(PORT3, 2, 7)>, /* RMII1_CRSDV */
+                        <RZA2_PINMUX(PORTK, 4, 7)>, /* RMII1_RXD0 */
+                        <RZA2_PINMUX(PORT3, 5, 7)>, /* RMII1_RXD1 */
+                        <RZA2_PINMUX(PORT3, 1, 7)>, /* RMII1_RXER */
+                        <RZA2_PINMUX(PORT3, 3, 1)>, /* ET1_MDC */
+                        <RZA2_PINMUX(PORT3, 4, 1)>, /* ET1_MDIO */
+                        <RZA2_PINMUX(PORTL, 1, 5)>; /* IRQ5 */
+       };
+
+       keyboard_pins: keyboard {
+               pinmux = <RZA2_PINMUX(PORTJ, 1, 6)>;    /* IRQ0 */
+       };
+
        /* Serial Console */
        scif4_pins: serial4 {
                pinmux = <RZA2_PINMUX(PORT9, 0, 4)>,    /* TxD4 */
                         <RZA2_PINMUX(PORT9, 1, 4)>;    /* RxD4 */
        };
-};
 
-/* High resolution System tick timers */
-&ostm0 {
-       status = "okay";
+       sdhi0_pins: sdhi0 {
+               pinmux = <RZA2_PINMUX(PORT5, 0, 3)>,    /* SD0_CD */
+                        <RZA2_PINMUX(PORT5, 1, 3)>;    /* SD0_WP */
+       };
+
+       sdhi1_pins: sdhi1 {
+               pinmux = <RZA2_PINMUX(PORT5, 4, 3)>,    /* SD1_CD */
+                        <RZA2_PINMUX(PORT5, 5, 3)>;    /* SD1_WP */
+       };
+
+       usb0_pins: usb0 {
+               pinmux = <RZA2_PINMUX(PORT5, 2, 3)>,    /* VBUSIN0 */
+                        <RZA2_PINMUX(PORTC, 6, 1)>,    /* VBUSEN0 */
+                        <RZA2_PINMUX(PORTC, 7, 1)>;    /* OVRCUR0 */
+       };
+
+       usb1_pins: usb1 {
+               pinmux = <RZA2_PINMUX(PORTC, 0, 1)>,    /* VBUSIN1 */
+                        <RZA2_PINMUX(PORTC, 5, 1)>,    /* VBUSEN1 */
+                        <RZA2_PINMUX(PORT7, 5, 5)>;    /* OVRCUR1 */
+       };
 };
 
-&ostm1 {
-       status = "okay";
+/* RTC_X1 */
+&rtc_x1_clk {
+       clock-frequency = <32768>;
 };
 
 /* Serial Console */
 
        status = "okay";
 };
+
+&sdhi0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&sdhi0_pins>;
+       bus-width = <4>;
+       status = "okay";
+};
+
+&sdhi1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&sdhi1_pins>;
+       bus-width = <4>;
+       status = "okay";
+};
+
+/* USB-0 as Host */
+&usb2_phy0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&usb0_pins>;
+       dr_mode = "host";       /* Requires JP3 to be fitted */
+       status = "okay";
+};
+
+/* USB-1 as Host */
+&usb2_phy1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&usb1_pins>;
+       dr_mode = "host";
+       status = "okay";
+};
+
+/* USB_X1 */
+&usb_x1_clk {
+       clock-frequency = <48000000>;
+};
index 22baa96f597454cb5182b9e3b0256498faf970df..72b79770e336a79ef33cf222e51ed6d34b5e19fc 100644 (file)
                clock-frequency = <0>;
        };
 
+       usb_x1_clk: usb_x1 {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               /* If clk present, value (48000000) must be set by board */
+               clock-frequency = <0>;
+       };
+
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
                        status = "disabled";
                };
 
+               spi0: spi@e800c800 {
+                       compatible = "renesas,rspi-r7s9210", "renesas,rspi-rz";
+                       reg = <0xe800c800 0x24>;
+                       interrupts = <GIC_SPI 312 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 313 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 314 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "error", "rx", "tx";
+                       clocks = <&cpg CPG_MOD 97>;
+                       power-domains = <&cpg>;
+                       num-cs = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               spi1: spi@e800d000 {
+                       compatible = "renesas,rspi-r7s9210", "renesas,rspi-rz";
+                       reg = <0xe800d000 0x24>;
+                       interrupts = <GIC_SPI 315 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 316 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 317 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "error", "rx", "tx";
+                       clocks = <&cpg CPG_MOD 96>;
+                       power-domains = <&cpg>;
+                       num-cs = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               spi2: spi@e800d800 {
+                       compatible = "renesas,rspi-r7s9210", "renesas,rspi-rz";
+                       reg = <0xe800d800 0x24>;
+                       interrupts = <GIC_SPI 318 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 319 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 320 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "error", "rx", "tx";
+                       clocks = <&cpg CPG_MOD 95>;
+                       power-domains = <&cpg>;
+                       num-cs = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               ether0: ethernet@e8204000 {
+                       compatible = "renesas,ether-r7s9210";
+                       reg = <0xe8204000 0x200>;
+                       interrupts = <GIC_SPI 341 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 65>;
+                       power-domains = <&cpg>;
+
+                       phy-mode = "rmii";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               ether1: ethernet@e8204200 {
+                       compatible = "renesas,ether-r7s9210";
+                       reg = <0xe8204200 0x200>;
+                       interrupts = <GIC_SPI 342 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 64>;
+                       power-domains = <&cpg>;
+                       phy-mode = "rmii";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               i2c0: i2c@e803a000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "renesas,riic-r7s9210", "renesas,riic-rz";
+                       reg = <0xe803a000 0x44>;
+                       interrupts = <GIC_SPI 232 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 233 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 234 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 235 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 236 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 237 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 238 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 239 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 87>;
+                       power-domains = <&cpg>;
+                       clock-frequency = <100000>;
+                       status = "disabled";
+               };
+
+               i2c1: i2c@e803a400 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "renesas,riic-r7s9210", "renesas,riic-rz";
+                       reg = <0xe803a400 0x44>;
+                       interrupts = <GIC_SPI 240 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 241 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 242 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 243 IRQ_TYPE_LEVEL_HIGH>,
+                                    <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>;
+                       clocks = <&cpg CPG_MOD 86>;
+                       power-domains = <&cpg>;
+                       clock-frequency = <100000>;
+                       status = "disabled";
+               };
+
+               i2c2: i2c@e803a800 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "renesas,riic-r7s9210", "renesas,riic-rz";
+                       reg = <0xe803a800 0x44>;
+                       interrupts = <GIC_SPI 248 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 249 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 250 IRQ_TYPE_EDGE_RISING>,
+                                    <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>;
+                       clocks = <&cpg CPG_MOD 85>;
+                       power-domains = <&cpg>;
+                       clock-frequency = <100000>;
+                       status = "disabled";
+               };
+
+               i2c3: i2c@e803ac00 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "renesas,riic-r7s9210", "renesas,riic-rz";
+                       reg = <0xe803ac00 0x44>;
+                       interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 257 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 258 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 259 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 260 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 261 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 262 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 263 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 84>;
+                       power-domains = <&cpg>;
+                       clock-frequency = <100000>;
+                       status = "disabled";
+               };
+
                ostm0: timer@e803b000 {
                        compatible = "renesas,r7s9210-ostm", "renesas,ostm";
                        reg = <0xe803b000 0x30>;
                        status = "disabled";
                };
 
+               ohci0: usb@e8218000 {
+                       compatible = "generic-ohci";
+                       reg = <0xe8218000 0x100>;
+                       interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 61>;
+                       phys = <&usb2_phy0>;
+                       phy-names = "usb";
+                       power-domains = <&cpg>;
+                       status = "disabled";
+               };
+
+               ehci0: usb@e8218100 {
+                       compatible = "generic-ehci";
+                       reg = <0xe8218100 0x100>;
+                       interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 61>;
+                       phys = <&usb2_phy0>;
+                       phy-names = "usb";
+                       power-domains = <&cpg>;
+                       status = "disabled";
+               };
+
+               usb2_phy0: usb-phy@e8218200 {
+                       compatible = "renesas,usb2-phy-r7s9210", "renesas,rcar-gen3-usb2-phy";
+                       reg = <0xe8218200 0x700>;
+                       interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 61>, <&usb_x1_clk>;
+                       clock-names = "fck", "usb_x1";
+                       power-domains = <&cpg>;
+                       #phy-cells = <0>;
+                       status = "disabled";
+               };
+
+               usbhs0: usb@e8219000 {
+                       compatible = "renesas,usbhs-r7s9210", "renesas,rza2-usbhs";
+                       reg = <0xe8219000 0x724>;
+                       interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 61>;
+                       renesas,buswait = <7>;
+                       phys = <&usb2_phy0>;
+                       phy-names = "usb";
+                       power-domains = <&cpg>;
+                       status = "disabled";
+               };
+
+               ohci1: usb@e821a000 {
+                       compatible = "generic-ohci";
+                       reg = <0xe821a000 0x100>;
+                       interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 60>;
+                       phys = <&usb2_phy1>;
+                       phy-names = "usb";
+                       power-domains = <&cpg>;
+                       status = "disabled";
+               };
+
+               ehci1: usb@e821a100 {
+                       compatible = "generic-ehci";
+                       reg = <0xe821a100 0x100>;
+                       interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 60>;
+                       phys = <&usb2_phy1>;
+                       phy-names = "usb";
+                       power-domains = <&cpg>;
+                       status = "disabled";
+               };
+
+               usb2_phy1: usb-phy@e821a200 {
+                       compatible = "renesas,usb2-phy-r7s9210", "renesas,rcar-gen3-usb2-phy";
+                       reg = <0xe821a200 0x700>;
+                       interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 60>, <&usb_x1_clk>;
+                       clock-names = "fck", "usb_x1";
+                       power-domains = <&cpg>;
+                       #phy-cells = <0>;
+                       status = "disabled";
+               };
+
+               usbhs1: usb@e821b000 {
+                       compatible = "renesas,usbhs-r7s9210", "renesas,rza2-usbhs";
+                       reg = <0xe821b000 0x724>;
+                       interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 60>;
+                       renesas,buswait = <7>;
+                       phys = <&usb2_phy1>;
+                       phy-names = "usb";
+                       power-domains = <&cpg>;
+                       status = "disabled";
+               };
+
+               sdhi0: sd@e8228000 {
+                       compatible = "renesas,sdhi-r7s9210";
+                       reg = <0xe8228000 0x8c0>;
+                       interrupts = <GIC_SPI 322 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 103>, <&cpg CPG_MOD 102>;
+                       clock-names = "core", "cd";
+                       power-domains = <&cpg>;
+                       cap-sd-highspeed;
+                       cap-sdio-irq;
+                       status = "disabled";
+               };
+
+               sdhi1: sd@e822a000 {
+                       compatible = "renesas,sdhi-r7s9210";
+                       reg = <0xe822a000 0x8c0>;
+                       interrupts = <GIC_SPI 324 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 101>, <&cpg CPG_MOD 100>;
+                       clock-names = "core", "cd";
+                       power-domains = <&cpg>;
+                       cap-sd-highspeed;
+                       cap-sdio-irq;
+                       status = "disabled";
+               };
+
                gic: interrupt-controller@e8221000 {
                        compatible = "arm,gic-400";
                        #interrupt-cells = <3>;
                        reg = <0xfcfe8004 4>;
                };
 
+               irqc: interrupt-controller@fcfef800 {
+                       compatible = "renesas,r7s9210-irqc",
+                                    "renesas,rza1-irqc";
+                       #interrupt-cells = <2>;
+                       #address-cells = <0>;
+                       interrupt-controller;
+                       reg = <0xfcfef800 0x6>;
+                       interrupt-map =
+                               <0 0 &gic GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
+                               <1 0 &gic GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
+                               <2 0 &gic GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
+                               <3 0 &gic GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
+                               <4 0 &gic GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
+                               <5 0 &gic GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>,
+                               <6 0 &gic GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>,
+                               <7 0 &gic GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-map-mask = <7 0>;
+               };
+
                pinctrl: pin-controller@fcffe000 {
                        compatible = "renesas,r7s9210-pinctrl";
                        reg = <0xfcffe000 0x1000>;
index f70f4a3e5c438e0a3b5272e8646baae1c3651f6e..a5351ddbf50604dc95a07f99c41dff0605d309c9 100644 (file)
@@ -19,7 +19,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
index 32757caa258410125a9d10e43e098ec2cd9efa92..758360a2edc322899b6247793031b9d9efc78e00 100644 (file)
@@ -21,7 +21,7 @@
        };
 
        chosen {
-               bootargs = "earlyprintk ignore_loglevel root=/dev/nfs ip=dhcp rw";
+               bootargs = "earlyprintk ignore_loglevel root=/dev/nfs ip=on rw";
                stdout-path = "serial0:115200n8";
        };
 
index ca0e0fc9b2467743b87ad90589ad00ed312e861f..807e7d0d6b620c83a3e9c3116c82e7bfb501ce64 100644 (file)
@@ -17,7 +17,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
index 1db220cfc1a1d0ee5a6de6f44bdfe8ce306b0414..ce6603b0994b7f369502f5f5104bb766ce540485 100644 (file)
@@ -42,7 +42,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial3:115200n8";
        };
 
index 655b10bb42d576ba6ddd660876229780017e1ad2..db72a801abe548fe9e767098ac6c3f18bae5ec79 100644 (file)
@@ -17,7 +17,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
index 2840eb0d6fd42d37787e70c74152f3c831f4098e..450efe92300876ea40dff2f05fbf6d60360005a6 100644 (file)
@@ -18,7 +18,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial1:115200n8";
        };
 
@@ -63,7 +63,7 @@
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <3300000>;
 
-               gpios = <&gpio2 24 GPIO_ACTIVE_LOW>;
+               gpios = <&gpio2 24 GPIO_ACTIVE_HIGH>;
                gpios-states = <1>;
                states = <3300000 1
                          1800000 0>;
index 0b49956069fcd522281c170d43fee361f0d1ae84..6c7b07c4b9d36492ec48a734b40cf5a4a76034b9 100644 (file)
@@ -25,7 +25,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
index d4bee1ec904459e0d196870289a617b59ae9bd43..c755f0b8fd0d72dbf2df816fea537a58046041d3 100644 (file)
@@ -21,7 +21,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
index 7b9508e83d46c54df2d2b424a63f3ae9db1cdc87..83cc619861b2bb20c54dfcd8bcfd7db71567b10d 100644 (file)
@@ -56,7 +56,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
         */
        i2cpwr: i2c-13 {
                compatible = "i2c-demux-pinctrl";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pmic_irq_pins>;
                i2c-parent = <&iic3>, <&i2c3>;
                i2c-bus-name = "i2c-pwr";
                #address-cells = <1>;
                function = "iic3";
        };
 
+       pmic_irq_pins: pmicirq {
+               groups = "intc_irq2";
+               function = "intc";
+       };
+
        hsusb_pins: hsusb {
                groups = "usb0_ovc_vbus";
                function = "usb0";
index 7a7d3b84d1a6b21d1ddccd4afd2ac55747de5689..a315ba749aa44176608719d8a0a7958af8f262c0 100644 (file)
@@ -19,7 +19,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
                function = "iic3";
        };
 
+       pmic_irq_pins: pmicirq {
+               groups = "intc_irq2";
+               function = "intc";
+       };
+
        usb0_pins: usb0 {
                groups = "usb0";
                function = "usb0";
 
 &iic3 {
        pinctrl-names = "default";
-       pinctrl-0 = <&iic3_pins>;
+       pinctrl-0 = <&iic3_pins &pmic_irq_pins>;
        status = "okay";
 
        pmic@58 {
index e6580aa0cea3573fd3c7b52e560f4a076f6e58cb..af6bd8fcd5a4e36425700050471c3fca97a52022 100644 (file)
@@ -56,7 +56,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
                function = "intc";
        };
 
+       pmic_irq_pins: pmicirq {
+               groups = "intc_irq2";
+               function = "intc";
+       };
+
        sdhi0_pins: sd0 {
                groups = "sdhi0_data4", "sdhi0_ctrl";
                function = "sdhi0";
 };
 
 &i2c6 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pmic_irq_pins>;
        status = "okay";
        clock-frequency = <100000>;
 
index fefdf8238bbe900226f338c60753e0f68919258e..d6cf16aac14d80f5cc5ac4af4bf10459c9bf7aa9 100644 (file)
@@ -31,7 +31,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
                function = "intc";
        };
 
+       pmic_irq_pins: pmicirq {
+               groups = "intc_irq2";
+               function = "intc";
+       };
+
        sdhi0_pins: sd0 {
                groups = "sdhi0_data4", "sdhi0_ctrl";
                function = "sdhi0";
 };
 
 &i2c6 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pmic_irq_pins>;
        status = "okay";
        clock-frequency = <100000>;
 
index b6fa80c3b07e2df90304c636b0af38fae9d79c4d..248eb717eb3500b6d5963b76a395cf7b05fbb572 100644 (file)
@@ -21,7 +21,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
                groups = "du1_rgb666", "du1_sync", "du1_disp";
                function = "du1";
        };
+
+       pmic_irq_pins: pmicirq {
+               groups = "intc_irq2";
+               function = "intc";
+       };
 };
 
 &rwdt {
        pmic@58 {
                compatible = "dlg,da9063";
                reg = <0x58>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pmic_irq_pins>;
                interrupt-parent = <&irqc>;
                interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
                interrupt-controller;
index f46f4567b3d41484d9e47c874f92d34b827994e5..bd2a63bdab3d650e20c9d3fa0fd00a576b0047af 100644 (file)
@@ -20,7 +20,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
index 38fb43d11b271d5e5f91ef6a246dffdbdd95e52a..c4ea2d67603017062d1df7c50866c309872fc14d 100644 (file)
                        compatible = "renesas,prr";
                        reg = <0 0xff000044 0 4>;
                };
+
+               cmt0: timer@ffca0000 {
+                       compatible = "renesas,r8a7792-cmt0",
+                                    "renesas,rcar-gen2-cmt0";
+                       reg = <0 0xffca0000 0 0x1004>;
+                       interrupts = <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 124>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A7792_PD_ALWAYS_ON>;
+                       resets = <&cpg 124>;
+
+                       status = "disabled";
+               };
+
+               cmt1: timer@e6130000 {
+                       compatible = "renesas,r8a7792-cmt1",
+                                    "renesas,rcar-gen2-cmt1";
+                       reg = <0 0xe6130000 0 0x1004>;
+                       interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 329>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A7792_PD_ALWAYS_ON>;
+                       resets = <&cpg 329>;
+
+                       status = "disabled";
+               };
        };
 
        timer {
index f51601af89a2f4d5324e891a85944a6d57d2b074..42f3313e6988affab4dfe89a117d7dfd03373b5b 100644 (file)
@@ -52,7 +52,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
                function = "intc";
        };
 
+       pmic_irq_pins: pmicirq {
+               groups = "intc_irq2";
+               function = "intc";
+       };
+
        sdhi0_pins: sd0 {
                groups = "sdhi0_data4", "sdhi0_ctrl";
                function = "sdhi0";
 };
 
 &i2c6 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pmic_irq_pins>;
        status = "okay";
        clock-frequency = <100000>;
 
index 0ab3d8d57f6ddc5672d94ad601a4ab9e603bbea1..1d22fcdc5d22358da161bccdf8c0d3d36f6c2f84 100644 (file)
@@ -22,7 +22,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
index 60e91ebfa65dc5b3d76cd28218b51aa4fceb8c17..b3177aea45d10252b97a84839baa47012e79f6f4 100644 (file)
@@ -34,7 +34,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
index da102fff96a26b2974e86476c4f0143effe07e5b..340ed6ccb08f886b81d1fb5c0e37d225b4734bb4 100644 (file)
                #clock-cells = <0>;
        };
 
+       display_subsystem: display-subsystem {
+               compatible = "rockchip,display-subsystem";
+               ports = <&vop_out>;
+       };
+
        i2s1: i2s1@100b0000 {
                compatible = "rockchip,rk3228-i2s", "rockchip,rk3066-i2s";
                reg = <0x100b0000 0x4000>;
                status = "disabled";
        };
 
+       hdmi_phy: hdmi-phy@12030000 {
+               compatible = "rockchip,rk3228-hdmi-phy";
+               reg = <0x12030000 0x10000>;
+               clocks = <&cru PCLK_HDMI_PHY>, <&xin24m>, <&cru DCLK_HDMI_PHY>;
+               clock-names = "sysclk", "refoclk", "refpclk";
+               #clock-cells = <0>;
+               clock-output-names = "hdmiphy_phy";
+               #phy-cells = <0>;
+               status = "disabled";
+       };
+
        gpu: gpu@20000000 {
                compatible = "rockchip,rk3228-mali", "arm,mali-400";
                reg = <0x20000000 0x10000>;
                status = "disabled";
        };
 
+       vop: vop@20050000 {
+               compatible = "rockchip,rk3228-vop";
+               reg = <0x20050000 0x1ffc>;
+               interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cru ACLK_VOP>, <&cru DCLK_VOP>, <&cru HCLK_VOP>;
+               clock-names = "aclk_vop", "dclk_vop", "hclk_vop";
+               resets = <&cru SRST_VOP_A>, <&cru SRST_VOP_H>, <&cru SRST_VOP_D>;
+               reset-names = "axi", "ahb", "dclk";
+               iommus = <&vop_mmu>;
+               status = "disabled";
+
+               vop_out: port {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       vop_out_hdmi: endpoint@0 {
+                               reg = <0>;
+                               remote-endpoint = <&hdmi_in_vop>;
+                       };
+               };
+       };
+
        vop_mmu: iommu@20053f00 {
                compatible = "rockchip,iommu";
                reg = <0x20053f00 0x100>;
                interrupt-names = "vop_mmu";
                clocks = <&cru ACLK_VOP>, <&cru HCLK_VOP>;
                clock-names = "aclk", "iface";
-               iommu-cells = <0>;
+               #iommu-cells = <0>;
                status = "disabled";
        };
 
                status = "disabled";
        };
 
+       hdmi: hdmi@200a0000 {
+               compatible = "rockchip,rk3228-dw-hdmi";
+               reg = <0x200a0000 0x20000>;
+               reg-io-width = <4>;
+               interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
+               assigned-clocks = <&cru SCLK_HDMI_PHY>;
+               assigned-clock-parents = <&hdmi_phy>;
+               clocks = <&cru SCLK_HDMI_HDCP>, <&cru PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_CEC>;
+               clock-names = "isfr", "iahb", "cec";
+               pinctrl-names = "default";
+               pinctrl-0 = <&hdmii2c_xfer &hdmi_hpd &hdmi_cec>;
+               resets = <&cru SRST_HDMI_P>;
+               reset-names = "hdmi";
+               phys = <&hdmi_phy>;
+               phy-names = "hdmi";
+               rockchip,grf = <&grf>;
+               status = "disabled";
+
+               ports {
+                       hdmi_in: port {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               hdmi_in_vop: endpoint@0 {
+                                       reg = <0>;
+                                       remote-endpoint = <&vop_out_hdmi>;
+                               };
+                       };
+               };
+       };
+
        sdmmc: dwmmc@30000000 {
                compatible = "rockchip,rk3228-dw-mshc", "rockchip,rk3288-dw-mshc";
                reg = <0x30000000 0x4000>;
                        };
                };
 
+               hdmi {
+                       hdmi_hpd: hdmi-hpd {
+                               rockchip,pins = <0 RK_PB7 1 &pcfg_pull_down>;
+                       };
+
+                       hdmii2c_xfer: hdmii2c-xfer {
+                               rockchip,pins = <0 RK_PA6 2 &pcfg_pull_none>,
+                                               <0 RK_PA7 2 &pcfg_pull_none>;
+                       };
+
+                       hdmi_cec: hdmi-cec {
+                               rockchip,pins = <0 RK_PC4 1 &pcfg_pull_none>;
+                       };
+               };
+
                i2c0 {
                        i2c0_xfer: i2c0-xfer {
                                rockchip,pins = <0 RK_PA0 1 &pcfg_pull_none>,
index fbef34578100f443b2cfbedcf564c8d799c7116d..1cadb522fd0de0c1f104aa13db0f74e3a614d261 100644 (file)
                pinctrl-0 = <&ac_present_ap>;
        };
 
+       lid_switch: lid-switch {
+               compatible = "gpio-keys";
+               pinctrl-names = "default";
+               pinctrl-0 = <&ap_lid_int_l>;
+
+               lid {
+                       label = "Lid";
+                       gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_LOW>;
+                       wakeup-source;
+                       linux,code = <SW_LID>;
+                       linux,input-type = <EV_SW>;
+                       debounce-interval = <1>;
+               };
+       };
+
        panel: panel {
                compatible ="innolux,n116bge", "simple-panel";
                status = "okay";
        status = "okay";
 };
 
-&gpio_keys {
-       pinctrl-0 = <&pwr_key_l &ap_lid_int_l>;
-       lid {
-               label = "Lid";
-               gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_LOW>;
-               wakeup-source;
-               linux,code = <0>; /* SW_LID */
-               linux,input-type = <5>; /* EV_SW */
-               debounce-interval = <1>;
-       };
-};
-
 &pwm0 {
        status = "okay";
 };
 
                /* Wake only */
                &suspend_l_wake
+               &bt_dev_wake_awake
        >;
        pinctrl-1 = <
                /* Common for sleep and wake, but no owners */
 
                /* Sleep only */
                &suspend_l_sleep
+               &bt_dev_wake_sleep
        >;
 
        backlight {
index e248f55ee8d2e6fa6487906f31aa95b430170b84..fcd119168cb65ac0aaebac80b98208d09a401deb 100644 (file)
        pinctrl-0 = <&vcc50_hdmi_en>;
 };
 
+&gpio0 {
+       gpio-line-names = "PMIC_SLEEP_AP",
+                         "DDRIO_PWROFF",
+                         "DDRIO_RETEN",
+                         "TS3A227E_INT_L",
+                         "PMIC_INT_L",
+                         "PWR_KEY_L",
+                         "AP_LID_INT_L",
+                         "EC_IN_RW",
+
+                         "AC_PRESENT_AP",
+                         /*
+                          * RECOVERY_SW_L is Chrome OS ABI.  Schematics call
+                          * it REC_MODE_L.
+                          */
+                         "RECOVERY_SW_L",
+                         "OTP_OUT",
+                         "HOST1_PWR_EN",
+                         "USBOTG_PWREN_H",
+                         "AP_WARM_RESET_H",
+                         "nFALUT2",
+                         "I2C0_SDA_PMIC",
+
+                         "I2C0_SCL_PMIC",
+                         "SUSPEND_L",
+                         "USB_INT";
+};
+
+&gpio2 {
+       gpio-line-names = "CONFIG0",
+                         "CONFIG1",
+                         "CONFIG2",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "CONFIG3",
+
+                         "",
+                         "EMMC_RST_L",
+                         "",
+                         "",
+                         "BL_PWR_EN",
+                         "AVDD_1V8_DISP_EN";
+};
+
+&gpio3 {
+       gpio-line-names = "FLASH0_D0",
+                         "FLASH0_D1",
+                         "FLASH0_D2",
+                         "FLASH0_D3",
+                         "FLASH0_D4",
+                         "FLASH0_D5",
+                         "FLASH0_D6",
+                         "FLASH0_D7",
+
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "FLASH0_CS2/EMMC_CMD",
+                         "",
+                         "FLASH0_DQS/EMMC_CLKO";
+};
+
+&gpio4 {
+       gpio-line-names = "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "UART0_RXD",
+                         "UART0_TXD",
+                         "UART0_CTS",
+                         "UART0_RTS",
+                         "SDIO0_D0",
+                         "SDIO0_D1",
+                         "SDIO0_D2",
+                         "SDIO0_D3",
+
+                         "SDIO0_CMD",
+                         "SDIO0_CLK",
+                         "BT_DEV_WAKE",        /* Maybe missing from mighty? */
+                         "",
+                         "WIFI_ENABLE_H",
+                         "BT_ENABLE_L",
+                         "WIFI_HOST_WAKE",
+                         "BT_HOST_WAKE";
+};
+
+&gpio5 {
+       gpio-line-names = "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "",
+                         "",
+                         "",
+                         "",
+                         "SPI0_CLK",
+                         "SPI0_CS0",
+                         "SPI0_TXD",
+                         "SPI0_RXD",
+
+                         "",
+                         "",
+                         "",
+                         "VCC50_HDMI_EN";
+};
+
+&gpio6 {
+       gpio-line-names = "I2S0_SCLK",
+                         "I2S0_LRCK_RX",
+                         "I2S0_LRCK_TX",
+                         "I2S0_SDI",
+                         "I2S0_SDO0",
+                         "HP_DET_H",
+                         "ALS_INT",
+                         "INT_CODEC",
+
+                         "I2S0_CLK",
+                         "I2C2_SDA",
+                         "I2C2_SCL",
+                         "MICDET",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "SDMMC_D0",
+                         "SDMMC_D1",
+                         "SDMMC_D2",
+                         "SDMMC_D3",
+                         "SDMMC_CLK",
+                         "SDMMC_CMD";
+};
+
+&gpio7 {
+       gpio-line-names = "LCDC_BL",
+                         "PWM_LOG",
+                         "BL_EN",
+                         "TRACKPAD_INT",
+                         "TPM_INT_H",
+                         "SDMMC_DET_L",
+                         /*
+                          * AP_FLASH_WP_L is Chrome OS ABI.  Schematics call
+                          * it FW_WP_AP.
+                          */
+                         "AP_FLASH_WP_L",
+                         "EC_INT",
+
+                         "CPU_NMI",
+                         "DVSOK",
+                         "SDMMC_WP",           /* mighty only */
+                         "EDP_HPD",
+                         "DVS1",
+                         "nFALUT1",            /* nFAULT1 on jaq */
+                         "LCD_EN",
+                         "DVS2",
+
+                         "VCC5V_GOOD_H",
+                         "I2C4_SDA_TP",
+                         "I2C4_SCL_TP",
+                         "I2C5_SDA_HDMI",
+                         "I2C5_SCL_HDMI",
+                         "5V_DRV",
+                         "UART2_RXD",
+                         "UART2_TXD";
+};
+
+&gpio8 {
+       gpio-line-names = "RAM_ID0",
+                         "RAM_ID1",
+                         "RAM_ID2",
+                         "RAM_ID3",
+                         "I2C1_SDA_TPM",
+                         "I2C1_SCL_TPM",
+                         "SPI2_CLK",
+                         "SPI2_CS0",
+
+                         "SPI2_RXD",
+                         "SPI2_TXD";
+};
+
 &pinctrl {
        backlight {
                bl_pwr_en: bl_pwr_en {
index b1613af83d5daeb978db5dbd7dd79b70b53fb65a..164561f04c1d5172e9965a43fdaa1c04217e8dc9 100644 (file)
        pinctrl-0 = <&vcc50_hdmi_en>;
 };
 
+&gpio0 {
+       gpio-line-names = "PMIC_SLEEP_AP",
+                         "DDRIO_PWROFF",
+                         "DDRIO_RETEN",
+                         "TS3A227E_INT_L",
+                         "PMIC_INT_L",
+                         "PWR_KEY_L",
+                         "AP_LID_INT_L",
+                         "EC_IN_RW",
+
+                         "AC_PRESENT_AP",
+                         /*
+                          * RECOVERY_SW_L is Chrome OS ABI.  Schematics call
+                          * it REC_MODE_L.
+                          */
+                         "RECOVERY_SW_L",
+                         "OTP_OUT",
+                         "HOST1_PWR_EN",
+                         "USBOTG_PWREN_H",
+                         "AP_WARM_RESET_H",
+                         "nFAULT2",
+                         "I2C0_SDA_PMIC",
+
+                         "I2C0_SCL_PMIC",
+                         "SUSPEND_L",
+                         "USB_INT";
+};
+
+&gpio2 {
+       gpio-line-names = "CONFIG0",
+                         "CONFIG1",
+                         "CONFIG2",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "CONFIG3",
+
+                         "",
+                         "EMMC_RST_L",
+                         "",
+                         "",
+                         "BL_PWR_EN",
+                         "AVDD_1V8_DISP_EN";
+};
+
+&gpio3 {
+       gpio-line-names = "FLASH0_D0",
+                         "FLASH0_D1",
+                         "FLASH0_D2",
+                         "FLASH0_D3",
+                         "FLASH0_D4",
+                         "FLASH0_D5",
+                         "FLASH0_D6",
+                         "FLASH0_D7",
+
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "FLASH0_CS2/EMMC_CMD",
+                         "",
+                         "FLASH0_DQS/EMMC_CLKO";
+};
+
+&gpio4 {
+       gpio-line-names = "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "UART0_RXD",
+                         "UART0_TXD",
+                         "UART0_CTS",
+                         "UART0_RTS",
+                         "SDIO0_D0",
+                         "SDIO0_D1",
+                         "SDIO0_D2",
+                         "SDIO0_D3",
+
+                         "SDIO0_CMD",
+                         "SDIO0_CLK",
+                         "BT_DEV_WAKE",
+                         "",
+                         "WIFI_ENABLE_H",
+                         "BT_ENABLE_L",
+                         "WIFI_HOST_WAKE",
+                         "BT_HOST_WAKE";
+};
+
+&gpio5 {
+       gpio-line-names = "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "",
+                         "",
+                         "",
+                         "",
+                         "SPI0_CLK",
+                         "SPI0_CS0",
+                         "SPI0_TXD",
+                         "SPI0_RXD",
+
+                         "",
+                         "",
+                         "",
+                         "VCC50_HDMI_EN";
+};
+
+&gpio6 {
+       gpio-line-names = "I2S0_SCLK",
+                         "I2S0_LRCK_RX",
+                         "I2S0_LRCK_TX",
+                         "I2S0_SDI",
+                         "I2S0_SDO0",
+                         "HP_DET_H",
+                         "",
+                         "INT_CODEC",
+
+                         "I2S0_CLK",
+                         "I2C2_SDA",
+                         "I2C2_SCL",
+                         "MICDET",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "SDMMC_D0",
+                         "SDMMC_D1",
+                         "SDMMC_D2",
+                         "SDMMC_D3",
+                         "SDMMC_CLK",
+                         "SDMMC_CMD";
+};
+
+&gpio7 {
+       gpio-line-names = "LCDC_BL",
+                         "PWM_LOG",
+                         "BL_EN",
+                         "TRACKPAD_INT",
+                         "TPM_INT_H",
+                         "SDMMC_DET_L",
+                         /*
+                          * AP_FLASH_WP_L is Chrome OS ABI.  Schematics call
+                          * it FW_WP_AP.
+                          */
+                         "AP_FLASH_WP_L",
+                         "EC_INT",
+
+                         "CPU_NMI",
+                         "DVSOK",
+                         "",
+                         "EDP_HPD",
+                         "DVS1",
+                         "nFAULT1",
+                         "LCD_EN",
+                         "DVS2",
+
+                         "VCC5V_GOOD_H",
+                         "I2C4_SDA_TP",
+                         "I2C4_SCL_TP",
+                         "I2C5_SDA_HDMI",
+                         "I2C5_SCL_HDMI",
+                         "5V_DRV",
+                         "UART2_RXD",
+                         "UART2_TXD";
+};
+
+&gpio8 {
+       gpio-line-names = "RAM_ID0",
+                         "RAM_ID1",
+                         "RAM_ID2",
+                         "RAM_ID3",
+                         "I2C1_SDA_TPM",
+                         "I2C1_SCL_TPM",
+                         "SPI2_CLK",
+                         "SPI2_CS0",
+
+                         "SPI2_RXD",
+                         "SPI2_TXD";
+};
+
 &pinctrl {
        backlight {
                bl_pwr_en: bl_pwr_en {
index e852594417b585f95be5ef1666a34c42407e0c53..aa352d40c99113d4d232cb2ff1fd9dfc941efea7 100644 (file)
@@ -75,9 +75,7 @@
        cooling-maps {
                /*
                 * After 1st level, throttle the CPU down to as low as 1.4 GHz
-                * and don't let the GPU go faster than 400 MHz.  Note that we
-                * won't throttle the GPU lower than 400 MHz due to CPU
-                * heat--we'll let the GPU do the rest itself.
+                * and don't let the GPU go faster than 400 MHz.
                 */
                cpu_warm_limit_cpu {
                        trip = <&cpu_alert_warm>;
                                         <&cpu2 THERMAL_NO_LIMIT 4>,
                                         <&cpu3 THERMAL_NO_LIMIT 4>;
                };
+               cpu_warm_limit_gpu {
+                       trip = <&cpu_alert_warm>;
+                       cooling-device = <&gpu 1 1>;
+               };
 
                /*
                 * Add some discrete steps to help throttling system deal
                                         <&cpu2 8 THERMAL_NO_LIMIT>,
                                         <&cpu3 8 THERMAL_NO_LIMIT>;
                };
+
+               /* At very hot, don't let GPU go over 300 MHz */
+               cpu_very_hot_limit_gpu {
+                       trip = <&cpu_alert_very_hot>;
+                       cooling-device = <&gpu 2 2>;
+               };
        };
 };
 
-&emmc {
-       /delete-property/mmc-hs200-1_8v;
+&gpu_thermal {
+       /delete-node/ trips;
+       /delete-node/ cooling-maps;
+
+       trips {
+               gpu_alert_warmish: gpu_alert_warmish {
+                       temperature = <60000>; /* millicelsius */
+                       hysteresis = <2000>; /* millicelsius */
+                       type = "passive";
+               };
+               gpu_alert_warm: gpu_alert_warm {
+                       temperature = <65000>; /* millicelsius */
+                       hysteresis = <2000>; /* millicelsius */
+                       type = "passive";
+               };
+               gpu_alert_hotter: gpu_alert_hotter {
+                       temperature = <84000>; /* millicelsius */
+                       hysteresis = <2000>; /* millicelsius */
+                       type = "passive";
+               };
+               gpu_alert_very_very_hot: gpu_alert_very_very_hot {
+                       temperature = <86000>; /* millicelsius */
+                       hysteresis = <2000>; /* millicelsius */
+                       type = "passive";
+               };
+               gpu_crit: gpu_crit {
+                       temperature = <90000>; /* millicelsius */
+                       hysteresis = <2000>; /* millicelsius */
+                       type = "critical";
+               };
+       };
+
+       cooling-maps {
+               /* After 1st level throttle the GPU down to as low as 400 MHz */
+               gpu_warmish_limit_gpu {
+                       trip = <&gpu_alert_warmish>;
+                       cooling-device = <&gpu THERMAL_NO_LIMIT 1>;
+               };
+
+               /*
+                * Slightly after we throttle the GPU, we'll also make sure that
+                * the CPU can't go faster than 1.4 GHz.  Note that we won't
+                * throttle the CPU lower than 1.4 GHz due to GPU heat--we'll
+                * let the CPU do the rest itself.
+                */
+               gpu_warm_limit_cpu {
+                       trip = <&gpu_alert_warm>;
+                       cooling-device = <&cpu0 4 4>,
+                                        <&cpu1 4 4>,
+                                        <&cpu2 4 4>,
+                                        <&cpu3 4 4>;
+               };
+
+               /* When hot, GPU goes down to 300 MHz */
+               gpu_hotter_limit_gpu {
+                       trip = <&gpu_alert_hotter>;
+                       cooling-device = <&gpu 2 2>;
+               };
+
+               /* When really hot, don't let GPU go _above_ 300 MHz */
+               gpu_very_very_hot_limit_gpu {
+                       trip = <&gpu_alert_very_very_hot>;
+                       cooling-device = <&gpu 2 THERMAL_NO_LIMIT>;
+               };
+       };
 };
 
 &i2c2 {
 
 &i2s {
        status = "okay";
-       clock-names = "i2s_hclk", "i2s_clk", "i2s_clk_out";
-       clocks = <&cru HCLK_I2S0>, <&cru SCLK_I2S0>, <&cru SCLK_I2S0_OUT>;
 };
 
 &rk808 {
        };
 };
 
+&gpio0 {
+       gpio-line-names = "PMIC_SLEEP_AP",
+                         "",
+                         "",
+                         "",
+                         "PMIC_INT_L",
+                         "POWER_BUTTON_L",
+                         "",
+                         "",
+
+                         "",
+                         /*
+                          * RECOVERY_SW_L is Chrome OS ABI.  Schematics call
+                          * it REC_MODE_L.
+                          */
+                         "RECOVERY_SW_L",
+                         "OT_RESET",
+                         "",
+                         "",
+                         "AP_WARM_RESET_H",
+                         "",
+                         "I2C0_SDA_PMIC",
+
+                         "I2C0_SCL_PMIC",
+                         "",
+                         "nFALUT";
+};
+
+&gpio2 {
+       gpio-line-names = "CONFIG0",
+                         "CONFIG1",
+                         "CONFIG2",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "CONFIG3",
+
+                         "",
+                         "EMMC_RST_L";
+};
+
+&gpio3 {
+       gpio-line-names = "FLASH0_D0",
+                         "FLASH0_D1",
+                         "FLASH0_D2",
+                         "FLASH0_D3",
+                         "FLASH0_D4",
+                         "FLASH0_D5",
+                         "FLASH0_D6",
+                         "FLASH0_D7",
+
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "FLASH0_CS2/EMMC_CMD",
+                         "",
+                         "FLASH0_DQS/EMMC_CLKO";
+};
+
+&gpio4 {
+       gpio-line-names = "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "UART0_RXD",
+                         "UART0_TXD",
+                         "UART0_CTS_L",
+                         "UART0_RTS_L",
+                         "SDIO0_D0",
+                         "SDIO0_D1",
+                         "SDIO0_D2",
+                         "SDIO0_D3",
+
+                         "SDIO0_CMD",
+                         "SDIO0_CLK",
+                         "BT_DEV_WAKE",
+                         "",
+                         "WIFI_ENABLE_H",
+                         "BT_ENABLE_L",
+                         "WIFI_HOST_WAKE",
+                         "BT_HOST_WAKE";
+};
+
+&gpio7 {
+       gpio-line-names = "",
+                         "PWM_LOG",
+                         "",
+                         "",
+                         "TPM_INT_H",
+                         "SDMMC_DET_L",
+                         /*
+                          * AP_FLASH_WP_L is Chrome OS ABI.  Schematics call
+                          * it FW_WP_AP.
+                          */
+                         "AP_FLASH_WP_L",
+                         "",
+
+                         "CPU_NMI",
+                         "DVSOK",
+                         "HDMI_WAKE",
+                         "POWER_HDMI_ON",
+                         "DVS1",
+                         "",
+                         "",
+                         "DVS2",
+
+                         "HDMI_CEC",
+                         "",
+                         "",
+                         "I2C5_SDA_HDMI",
+                         "I2C5_SCL_HDMI",
+                         "",
+                         "UART2_RXD",
+                         "UART2_TXD";
+};
+
+&gpio8 {
+       gpio-line-names = "RAM_ID0",
+                         "RAM_ID1",
+                         "RAM_ID2",
+                         "RAM_ID3",
+                         "I2C1_SDA_TPM",
+                         "I2C1_SCL_TPM",
+                         "SPI2_CLK",
+                         "SPI2_CS0",
+
+                         "SPI2_RXD",
+                         "SPI2_TXD";
+};
+
 &pinctrl {
        hdmi {
                power_hdmi_on: power-hdmi-on {
index 468a1818545d1c86ce8c7ac8ce8a43e321520bad..9008e703c07e71b20a0c8b39b53787ba9873fcee 100644 (file)
                regulator-boot-on;
                vin-supply = <&vcc18_wl>;
        };
+
+       volume_buttons: volume-buttons {
+               compatible = "gpio-keys";
+               pinctrl-names = "default";
+               pinctrl-0 = <&volum_down_l &volum_up_l>;
+
+               volum_down {
+                       label = "Volum_down";
+                       gpios = <&gpio5 RK_PB3 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_VOLUMEDOWN>;
+                       debounce-interval = <100>;
+               };
+
+               volum_up {
+                       label = "Volum_up";
+                       gpios = <&gpio5 RK_PB2 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_VOLUMEUP>;
+                       debounce-interval = <100>;
+               };
+       };
 };
 
 &backlight {
                        240 241 242 243 244 245 246 247
                        248 249 250 251 252 253 254 255>;
        power-supply = <&backlight_regulator>;
-       post-pwm-on-delay-ms = <200>;
-       pwm-off-delay-ms = <200>;
-};
-
-&emmc {
-       /delete-property/mmc-hs200-1_8v;
-};
-
-&gpio_keys {
-       pinctrl-0 = <&pwr_key_l &ap_lid_int_l &volum_down_l &volum_up_l>;
-
-       volum_down {
-               label = "Volum_down";
-               gpios = <&gpio5 RK_PB3 GPIO_ACTIVE_LOW>;
-               linux,code = <KEY_VOLUMEDOWN>;
-               debounce-interval = <100>;
-       };
-
-       volum_up {
-               label = "Volum_up";
-               gpios = <&gpio5 RK_PB2 GPIO_ACTIVE_LOW>;
-               linux,code = <KEY_VOLUMEUP>;
-               debounce-interval = <100>;
-       };
 };
 
 &i2c_tunnel {
        pinctrl-0 = <&vcc50_hdmi_en>;
 };
 
+&gpio0 {
+       gpio-line-names = "PMIC_SLEEP_AP",
+                         "DDRIO_PWROFF",
+                         "DDRIO_RETEN",
+                         "TS3A227E_INT_L",
+                         "PMIC_INT_L",
+                         "PWR_KEY_L",
+                         "AP_LID_INT_L",
+                         "EC_IN_RW",
+
+                         "AC_PRESENT_AP",
+                         /*
+                          * RECOVERY_SW_L is Chrome OS ABI.  Schematics call
+                          * it REC_MODE_L.
+                          */
+                         "RECOVERY_SW_L",
+                         "OTP_OUT",
+                         "HOST1_PWR_EN",
+                         "USBOTG_PWREN_H",
+                         "AP_WARM_RESET_H",
+                         "nFALUT2",
+                         "I2C0_SDA_PMIC",
+
+                         "I2C0_SCL_PMIC",
+                         "SUSPEND_L",
+                         "USB_INT";
+};
+
+&gpio2 {
+       gpio-line-names = "CONFIG0",
+                         "CONFIG1",
+                         "CONFIG2",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "CONFIG3",
+
+                         "PROCHOT#",
+                         "EMMC_RST_L",
+                         "",
+                         "",
+                         "BL_PWR_EN",
+                         "AVDD_1V8_DISP_EN",
+                         "TOUCH_INT",
+                         "TOUCH_RST",
+
+                         "I2C3_SCL_TP",
+                         "I2C3_SDA_TP";
+};
+
+&gpio3 {
+       gpio-line-names = "FLASH0_D0",
+                         "FLASH0_D1",
+                         "FLASH0_D2",
+                         "FLASH0_D3",
+                         "FLASH0_D4",
+                         "FLASH0_D5",
+                         "FLASH0_D6",
+                         "FLASH0_D7",
+
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "FLASH0_CS2/EMMC_CMD",
+                         "",
+                         "FLASH0_DQS/EMMC_CLKO";
+};
+
+&gpio4 {
+       gpio-line-names = "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "UART0_RXD",
+                         "UART0_TXD",
+                         "UART0_CTS",
+                         "UART0_RTS",
+                         "SDIO0_D0",
+                         "SDIO0_D1",
+                         "SDIO0_D2",
+                         "SDIO0_D3",
+
+                         "SDIO0_CMD",
+                         "SDIO0_CLK",
+                         "dev_wake",
+                         "",
+                         "WIFI_ENABLE_H",
+                         "BT_ENABLE_L",
+                         "WIFI_HOST_WAKE",
+                         "BT_HOST_WAKE";
+};
+
+&gpio5 {
+       gpio-line-names = "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "",
+                         "",
+                         "Volum_Up#",
+                         "Volum_Down#",
+                         "SPI0_CLK",
+                         "SPI0_CS0",
+                         "SPI0_TXD",
+                         "SPI0_RXD",
+
+                         "",
+                         "",
+                         "",
+                         "VCC50_HDMI_EN";
+};
+
+&gpio6 {
+       gpio-line-names = "I2S0_SCLK",
+                         "I2S0_LRCK_RX",
+                         "I2S0_LRCK_TX",
+                         "I2S0_SDI",
+                         "I2S0_SDO0",
+                         "HP_DET_H",
+                         "",
+                         "INT_CODEC",
+
+                         "I2S0_CLK",
+                         "I2C2_SDA",
+                         "I2C2_SCL",
+                         "MICDET",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "SDMMC_D0",
+                         "SDMMC_D1",
+                         "SDMMC_D2",
+                         "SDMMC_D3",
+                         "SDMMC_CLK",
+                         "SDMMC_CMD";
+};
+
+&gpio7 {
+       gpio-line-names = "LCDC_BL",
+                         "PWM_LOG",
+                         "BL_EN",
+                         "TRACKPAD_INT",
+                         "TPM_INT_H",
+                         "SDMMC_DET_L",
+                         /*
+                          * AP_FLASH_WP_L is Chrome OS ABI.  Schematics call
+                          * it FW_WP_AP.
+                          */
+                         "AP_FLASH_WP_L",
+                         "EC_INT",
+
+                         "CPU_NMI",
+                         "DVS_OK",
+                         "SDMMC_WP",
+                         "EDP_HPD",
+                         "DVS1",
+                         "nFALUT1",
+                         "LCD_EN",
+                         "DVS2",
+
+                         "VCC5V_GOOD_H",
+                         "I2C4_SDA_TP",
+                         "I2C4_SCL_TP",
+                         "I2C5_SDA_HDMI",
+                         "I2C5_SCL_HDMI",
+                         "5V_DRV",
+                         "UART2_RXD",
+                         "UART2_TXD";
+};
+
+&gpio8 {
+       gpio-line-names = "RAM_ID0",
+                         "RAM_ID1",
+                         "RAM_ID2",
+                         "RAM_ID3",
+                         "I2C1_SDA_TPM",
+                         "I2C1_SCL_TPM",
+                         "SPI2_CLK",
+                         "SPI2_CS0",
+
+                         "SPI2_RXD",
+                         "SPI2_TXD";
+};
+
 &pinctrl {
        backlight {
                bl_pwr_en: bl_pwr_en {
index 9645be7b3d8ce94a57de997a7b1b3e6c0c2c4897..9b6f4d9b03b64d4c5ea01e68fc9343bfe19ae94b 100644 (file)
@@ -35,7 +35,7 @@
        force-hpd;
 };
 
-&gpio_keys {
+&lid_switch {
        pinctrl-0 = <&pwr_key_h &ap_lid_int_l>;
 
        power {
index 2ac8748a3a0cc0fc22d33b40bc53f49cceecd730..9b140db0445632d5a8793b02bdbaaeb9940a7e85 100644 (file)
        temperature = <70000>;
 };
 
+&cpu_crit {
+       temperature = <90000>;
+};
+
 &edp {
        /delete-property/pinctrl-names;
        /delete-property/pinctrl-0;
        force-hpd;
 };
 
+&gpu_alert0 {
+       temperature = <80000>;
+};
+
+&gpu_crit {
+       temperature = <90000>;
+};
+
 &panel {
        power-supply= <&panel_regulator>;
 };
        pinctrl-0 = <&vcc50_hdmi_en>;
 };
 
+&gpio0 {
+       gpio-line-names = "PMIC_SLEEP_AP",
+                         "DDRIO_PWROFF",
+                         "DDRIO_RETEN",
+                         "TS3A227E_INT_L",
+                         "PMIC_INT_L",
+                         "PWR_KEY_L",
+                         "AP_LID_INT_L",
+                         "EC_IN_RW",
+
+                         "AC_PRESENT_AP",
+                         /*
+                          * RECOVERY_SW_L is Chrome OS ABI.  Schematics call
+                          * it REC_MODE_L.
+                          */
+                         "RECOVERY_SW_L",
+                         "OTP_OUT",
+                         "HOST1_PWR_EN",
+                         "USBOTG_PWREN_H",
+                         "AP_WARM_RESET_H",
+                         "nFALUT2",
+                         "I2C0_SDA_PMIC",
+
+                         "I2C0_SCL_PMIC",
+                         "SUSPEND_L",
+                         "USB_INT";
+};
+
+&gpio2 {
+       gpio-line-names = "CONFIG0",
+                         "CONFIG1",
+                         "CONFIG2",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "CONFIG3",
+
+                         "PWRLIMIT#_CPU",
+                         "EMMC_RST_L",
+                         "",
+                         "",
+                         "BL_PWR_EN",
+                         "AVDD_1V8_DISP_EN";
+};
+
+&gpio3 {
+       gpio-line-names = "FLASH0_D0",
+                         "FLASH0_D1",
+                         "FLASH0_D2",
+                         "FLASH0_D3",
+                         "FLASH0_D4",
+                         "FLASH0_D5",
+                         "FLASH0_D6",
+                         "FLASH0_D7",
+
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "FLASH0_CS2/EMMC_CMD",
+                         "",
+                         "FLASH0_DQS/EMMC_CLKO";
+};
+
+&gpio4 {
+       gpio-line-names = "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "UART0_RXD",
+                         "UART0_TXD",
+                         "UART0_CTS",
+                         "UART0_RTS",
+                         "SDIO0_D0",
+                         "SDIO0_D1",
+                         "SDIO0_D2",
+                         "SDIO0_D3",
+
+                         "SDIO0_CMD",
+                         "SDIO0_CLK",
+                         "BT_DEV_WAKE",
+                         "",
+                         "WIFI_ENABLE_H",
+                         "BT_ENABLE_L",
+                         "WIFI_HOST_WAKE",
+                         "BT_HOST_WAKE";
+};
+
+&gpio5 {
+       gpio-line-names = "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "",
+                         "",
+                         "",
+                         "",
+                         "SPI0_CLK",
+                         "SPI0_CS0",
+                         "SPI0_TXD",
+                         "SPI0_RXD",
+
+                         "",
+                         "",
+                         "",
+                         "VCC50_HDMI_EN";
+};
+
+&gpio6 {
+       gpio-line-names = "I2S0_SCLK",
+                         "I2S0_LRCK_RX",
+                         "I2S0_LRCK_TX",
+                         "I2S0_SDI",
+                         "I2S0_SDO0",
+                         "HP_DET_H",
+                         "ALS_INT",            /* not connected */
+                         "INT_CODEC",
+
+                         "I2S0_CLK",
+                         "I2C2_SDA",
+                         "I2C2_SCL",
+                         "MICDET",
+                         "",
+                         "",
+                         "",
+                         "",
+
+                         "SDMMC_D0",
+                         "SDMMC_D1",
+                         "SDMMC_D2",
+                         "SDMMC_D3",
+                         "SDMMC_CLK",
+                         "SDMMC_CMD";
+};
+
+&gpio7 {
+       gpio-line-names = "LCDC_BL",
+                         "PWM_LOG",
+                         "BL_EN",
+                         "TRACKPAD_INT",
+                         "TPM_INT_H",
+                         "SDMMC_DET_L",
+                         /*
+                          * AP_FLASH_WP_L is Chrome OS ABI.  Schematics call
+                          * it FW_WP_AP.
+                          */
+                         "AP_FLASH_WP_L",
+                         "EC_INT",
+
+                         "CPU_NMI",
+                         "DVS_OK",
+                         "",
+                         "EDP_HOTPLUG",
+                         "DVS1",
+                         "nFALUT1",
+                         "LCD_EN",
+                         "DVS2",
+
+                         "VCC5V_GOOD_H",
+                         "I2C4_SDA_TP",
+                         "I2C4_SCL_TP",
+                         "I2C5_SDA_HDMI",
+                         "I2C5_SCL_HDMI",
+                         "5V_DRV",
+                         "UART2_RXD",
+                         "UART2_TXD";
+};
+
+&gpio8 {
+       gpio-line-names = "RAM_ID0",
+                         "RAM_ID1",
+                         "RAM_ID2",
+                         "RAM_ID3",
+                         "I2C1_SDA_TPM",
+                         "I2C1_SCL_TPM",
+                         "SPI2_CLK",
+                         "SPI2_CS0",
+
+                         "SPI2_RXD",
+                         "SPI2_TXD";
+};
+
 &pinctrl {
        backlight {
                bl_pwr_en: bl_pwr_en {
index 1d8bfed7830cabd9a58dfdbe16c92d96713edb45..8fc8eac699bf513f324e3762d05657911b6c0b1a 100644 (file)
                reg = <0x0 0x0 0x0 0x80000000>;
        };
 
-       gpio_keys: gpio-keys {
+       bt_activity: bt-activity {
                compatible = "gpio-keys";
+               pinctrl-names = "default";
+               pinctrl-0 = <&bt_host_wake>;
+
+               /*
+                * HACK: until we have an LPM driver, we'll use an
+                * ugly GPIO key to allow Bluetooth to wake from S3.
+                * This is expected to only be used by BT modules that
+                * use UART for comms.  For BT modules that talk over
+                * SDIO we should use a wakeup mechanism related to SDIO.
+                *
+                * Use KEY_RESERVED here since that will work as a wakeup but
+                * doesn't get reported to higher levels (so doesn't confuse
+                * Chrome).
+                */
+               bt-wake {
+                       label = "BT Wakeup";
+                       gpios = <&gpio4 RK_PD7 GPIO_ACTIVE_HIGH>;
+                       linux,code = <KEY_RESERVED>;
+                       wakeup-source;
+               };
+
+       };
 
+       power_button: power-button {
+               compatible = "gpio-keys";
                pinctrl-names = "default";
                pinctrl-0 = <&pwr_key_l>;
+
                power {
                        label = "Power";
                        gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>;
        cpu0-supply = <&vdd_cpu>;
 };
 
+&cpu_crit {
+       temperature = <100000>;
+};
+
 /* rk3288-c used in Veyron Chrome-devices has slightly changed OPPs */
 &cpu_opp_table {
        /delete-node/ opp-312000000;
        status = "okay";
 };
 
+&gpu_alert0 {
+       temperature = <72500>;
+};
+
+&gpu_crit {
+       temperature = <100000>;
+};
+
 &hdmi {
-       ddc-i2c-bus = <&i2c5>;
+       pinctrl-names = "default", "unwedge";
+       pinctrl-0 = <&hdmi_ddc>;
+       pinctrl-1 = <&hdmi_ddc_unwedge>;
        status = "okay";
 };
 
        i2c-scl-rising-time-ns = <300>;         /* 225ns measured */
 };
 
-&i2c5 {
-       status = "okay";
-
-       clock-frequency = <100000>;
-       i2c-scl-falling-time-ns = <300>;
-       i2c-scl-rising-time-ns = <1000>;
-};
-
 &io_domains {
        status = "okay";
 
 
        rockchip,hw-tshut-mode = <1>; /* tshut mode 0:CRU 1:GPIO */
        rockchip,hw-tshut-polarity = <1>; /* tshut polarity 0:LOW 1:HIGH */
+       rockchip,hw-tshut-temp = <125000>;
 };
 
 &uart0 {
                &ddr0_retention
                &ddrio_pwroff
                &global_pwroff
+
+               /* Wake only */
+               &bt_dev_wake_awake
        >;
        pinctrl-1 = <
                /* Common for sleep and wake, but no owners */
                &ddr0_retention
                &ddrio_pwroff
                &global_pwroff
+
+               /* Sleep only */
+               &bt_dev_wake_sleep
        >;
 
        pcfg_pull_none_drv_8ma: pcfg-pull-none-drv-8ma {
                        rockchip,pins = <4 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>;
                };
 
+               bt_host_wake: bt-host-wake {
+                       rockchip,pins = <4 RK_PD7 RK_FUNC_GPIO &pcfg_pull_down>;
+               };
+
                /*
                 * We run sdio0 at max speed; bump up drive strength.
                 * We also have external pulls, so disable the internal ones.
                sdio0_clk: sdio0-clk {
                        rockchip,pins = <4 RK_PD1 1 &pcfg_pull_none_drv_8ma>;
                };
+
+               /*
+                * These pins are only present on very new veyron boards; on
+                * older boards bt_dev_wake is simply always high.  Note that
+                * gpio4_D2 is a NC on old veyron boards, so it doesn't hurt
+                * to map this pin everywhere
+                */
+               bt_dev_wake_sleep: bt-dev-wake-sleep {
+                       rockchip,pins = <4 RK_PD2 RK_FUNC_GPIO &pcfg_output_low>;
+               };
+
+               bt_dev_wake_awake: bt-dev-wake-awake {
+                       rockchip,pins = <4 RK_PD2 RK_FUNC_GPIO &pcfg_output_high>;
+               };
        };
 
        tpm {
index aa017abf4f42179b11ee02008b1ab24f2c2e3386..cc893e154fe5a4ea6a9d1be776e745b249a0426c 100644 (file)
                             <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
                             <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
                clock-frequency = <24000000>;
+               arm,no-tick-in-suspend;
        };
 
        timer: timer@ff810000 {
                                map0 {
                                        trip = <&gpu_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>;
+                                               <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
                                };
                        };
                };
                #pwm-cells = <3>;
                pinctrl-names = "default";
                pinctrl-0 = <&pwm0_pin>;
-               clocks = <&cru PCLK_PWM>;
+               clocks = <&cru PCLK_RKPWM>;
                clock-names = "pwm";
                status = "disabled";
        };
                #pwm-cells = <3>;
                pinctrl-names = "default";
                pinctrl-0 = <&pwm1_pin>;
-               clocks = <&cru PCLK_PWM>;
+               clocks = <&cru PCLK_RKPWM>;
                clock-names = "pwm";
                status = "disabled";
        };
                #pwm-cells = <3>;
                pinctrl-names = "default";
                pinctrl-0 = <&pwm2_pin>;
-               clocks = <&cru PCLK_PWM>;
+               clocks = <&cru PCLK_RKPWM>;
                clock-names = "pwm";
                status = "disabled";
        };
        pwm3: pwm@ff680030 {
                compatible = "rockchip,rk3288-pwm";
                reg = <0x0 0xff680030 0x0 0x10>;
-               #pwm-cells = <2>;
+               #pwm-cells = <3>;
                pinctrl-names = "default";
                pinctrl-0 = <&pwm3_pin>;
-               clocks = <&cru PCLK_PWM>;
+               clocks = <&cru PCLK_RKPWM>;
                clock-names = "pwm";
                status = "disabled";
        };
                interrupt-names = "job", "mmu", "gpu";
                clocks = <&cru ACLK_GPU>;
                operating-points-v2 = <&gpu_opp_table>;
+               #cooling-cells = <2>; /* min followed by max */
                power-domains = <&power RK3288_PD_GPU>;
                status = "disabled";
        };
                        opp-hz = /bits/ 64 <400000000>;
                        opp-microvolt = <1100000>;
                };
-               opp-500000000 {
-                       opp-hz = /bits/ 64 <500000000>;
-                       opp-microvolt = <1200000>;
-               };
                opp-600000000 {
                        opp-hz = /bits/ 64 <600000000>;
                        opp-microvolt = <1250000>;
                                rockchip,pins = <7 RK_PC3 2 &pcfg_pull_none>,
                                                <7 RK_PC4 2 &pcfg_pull_none>;
                        };
+
+                       hdmi_ddc_unwedge: hdmi-ddc-unwedge {
+                               rockchip,pins = <7 RK_PC3 RK_FUNC_GPIO &pcfg_output_low>,
+                                               <7 RK_PC4 2 &pcfg_pull_none>;
+                       };
+               };
+
+               pcfg_output_low: pcfg-output-low {
+                       output-low;
                };
 
                pcfg_pull_up: pcfg-pull-up {
index 3bbc84bf8dbf716200017f13566645ba544bb6fa..f770aace0efd6c8602c7d964926f47a7e463d8e8 100644 (file)
                                status = "disabled";
                        };
 
-                       sckc@fffffe50 {
-                               compatible = "atmel,at91sam9x5-sckc";
+                       clk32k: sckc@fffffe50 {
+                               compatible = "atmel,sama5d3-sckc";
                                reg = <0xfffffe50 0x4>;
-
-                               slow_rc_osc: slow_rc_osc {
-                                       compatible = "atmel,at91sam9x5-clk-slow-rc-osc";
-                                       #clock-cells = <0>;
-                                       clock-frequency = <32768>;
-                                       clock-accuracy = <50000000>;
-                                       atmel,startup-time-usec = <75>;
-                               };
-
-                               slow_osc: slow_osc {
-                                       compatible = "atmel,at91sam9x5-clk-slow-osc";
-                                       #clock-cells = <0>;
-                                       clocks = <&slow_xtal>;
-                                       atmel,startup-time-usec = <1200000>;
-                               };
-
-                               clk32k: slowck {
-                                       compatible = "atmel,at91sam9x5-clk-slow";
-                                       #clock-cells = <0>;
-                                       clocks = <&slow_rc_osc &slow_osc>;
-                               };
+                               clocks = <&slow_xtal>;
+                               #clock-cells = <0>;
                        };
 
                        rtc@fffffeb0 {
index daac0c6078c5b68fd0c53fecf802e0c598d15489..1916f31a30ff23e00849d9a5cd23e2ccf1dc6104 100644 (file)
@@ -36,7 +36,7 @@
        };
 
        chosen {
-               bootargs = "root=/dev/nfs ip=dhcp ignore_loglevel rw";
+               bootargs = "root=/dev/nfs ip=on ignore_loglevel rw";
                stdout-path = "serial0:115200n8";
        };
 
index ae24599d58296f4ede568c2ce91b89216c6afa5c..a0a6d85072653ad74a789f2532739cfe3d3ae23e 100644 (file)
                };
 
                gmac0: ethernet@ff800000 {
-                       compatible = "altr,socfpga-stmmac", "snps,dwmac-3.72a", "snps,dwmac";
+                       compatible = "altr,socfpga-stmmac-a10-s10", "snps,dwmac-3.72a", "snps,dwmac";
                        altr,sysmgr-syscon = <&sysmgr 0x44 0>;
                        reg = <0xff800000 0x2000>;
                        interrupts = <0 92 IRQ_TYPE_LEVEL_HIGH>;
                        rx-fifo-depth = <16384>;
                        clocks = <&l4_mp_clk>;
                        clock-names = "stmmaceth";
-                       resets = <&rst EMAC0_RESET>;
-                       reset-names = "stmmaceth";
+                       resets = <&rst EMAC0_RESET>, <&rst EMAC0_OCP_RESET>;
+                       reset-names = "stmmaceth", "stmmaceth-ocp";
                        snps,axi-config = <&socfpga_axi_setup>;
                        status = "disabled";
                };
 
                gmac1: ethernet@ff802000 {
-                       compatible = "altr,socfpga-stmmac", "snps,dwmac-3.72a", "snps,dwmac";
-                       altr,sysmgr-syscon = <&sysmgr 0x48 0>;
+                       compatible = "altr,socfpga-stmmac-a10-s10", "snps,dwmac-3.72a", "snps,dwmac";
+                       altr,sysmgr-syscon = <&sysmgr 0x48 8>;
                        reg = <0xff802000 0x2000>;
                        interrupts = <0 93 IRQ_TYPE_LEVEL_HIGH>;
                        interrupt-names = "macirq";
                        rx-fifo-depth = <16384>;
                        clocks = <&l4_mp_clk>;
                        clock-names = "stmmaceth";
-                       resets = <&rst EMAC1_RESET>;
-                       reset-names = "stmmaceth";
+                       resets = <&rst EMAC1_RESET>, <&rst EMAC1_OCP_RESET>;
+                       reset-names = "stmmaceth", "stmmaceth-ocp";
                        snps,axi-config = <&socfpga_axi_setup>;
                        status = "disabled";
                };
 
                gmac2: ethernet@ff804000 {
-                       compatible = "altr,socfpga-stmmac", "snps,dwmac-3.72a", "snps,dwmac";
-                       altr,sysmgr-syscon = <&sysmgr 0x4C 0>;
+                       compatible = "altr,socfpga-stmmac-a10-s10", "snps,dwmac-3.72a", "snps,dwmac";
+                       altr,sysmgr-syscon = <&sysmgr 0x4C 16>;
                        reg = <0xff804000 0x2000>;
                        interrupts = <0 94 IRQ_TYPE_LEVEL_HIGH>;
                        interrupt-names = "macirq";
                        tx-fifo-depth = <4096>;
                        rx-fifo-depth = <16384>;
                        clocks = <&l4_mp_clk>;
-                       resets = <&rst EMAC2_RESET>;
                        clock-names = "stmmaceth";
+                       resets = <&rst EMAC2_RESET>, <&rst EMAC2_OCP_RESET>;
+                       reset-names = "stmmaceth", "stmmaceth-ocp";
                        snps,axi-config = <&socfpga_axi_setup>;
                        status = "disabled";
                };
index 360dae5a5b122155ea4263df656ac9d28d2c62b9..0efbeccc5cd2cde7758869749ec91799bf0cd0a8 100644 (file)
                };
        };
 
+       ref_033v: 033-v-ref {
+               compatible = "regulator-fixed";
+               regulator-name = "0.33V";
+               regulator-min-microvolt = <330000>;
+               regulator-max-microvolt = <330000>;
+       };
+
        soc {
                clkmgr@ffd04000 {
                        clocks {
        i2c-sda-falling-time-ns = <6000>;
        i2c-scl-falling-time-ns = <6000>;
 
+       adc@14 {
+               compatible = "lltc,ltc2497";
+               reg = <0x14>;
+               vref-supply = <&ref_033v>;
+       };
+
+       adc@16 {
+               compatible = "lltc,ltc2497";
+               reg = <0x16>;
+               vref-supply = <&ref_033v>;
+       };
+
        eeprom@51 {
                compatible = "atmel,24c32";
                reg = <0x51>;
index d90b0d1e18c799425241289090214d53fd825e17..2b1664884ae7b3b28fbfbe7887d6cb96850d2846 100644 (file)
@@ -44,6 +44,7 @@
 #include "stm32f746.dtsi"
 #include "stm32f746-pinctrl.dtsi"
 #include <dt-bindings/input/input.h>
+#include <dt-bindings/interrupt-controller/irq.h>
 
 / {
        model = "STMicroelectronics STM32746g-EVAL board";
                        gpios = <&gpiof 10 1>;
                        linux,default-trigger = "heartbeat";
                };
+               orange {
+                       gpios = <&stmfx_pinctrl 17 1>;
+               };
                red {
                        gpios = <&gpiob 7 1>;
                };
+               blue {
+                       gpios = <&stmfx_pinctrl 19 1>;
+               };
        };
 
        gpio_keys {
                };
        };
 
+       joystick {
+               compatible = "gpio-keys";
+               #size-cells = <0>;
+               pinctrl-0 = <&joystick_pins>;
+               pinctrl-names = "default";
+               button-0 {
+                       label = "JoySel";
+                       linux,code = <KEY_ENTER>;
+                       interrupt-parent = <&stmfx_pinctrl>;
+                       interrupts = <0 IRQ_TYPE_EDGE_FALLING>;
+               };
+               button-1 {
+                       label = "JoyDown";
+                       linux,code = <KEY_DOWN>;
+                       interrupt-parent = <&stmfx_pinctrl>;
+                       interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
+               };
+               button-2 {
+                       label = "JoyLeft";
+                       linux,code = <KEY_LEFT>;
+                       interrupt-parent = <&stmfx_pinctrl>;
+                       interrupts = <2 IRQ_TYPE_EDGE_FALLING>;
+               };
+               button-3 {
+                       label = "JoyRight";
+                       linux,code = <KEY_RIGHT>;
+                       interrupt-parent = <&stmfx_pinctrl>;
+                       interrupts = <3 IRQ_TYPE_EDGE_FALLING>;
+               };
+               button-4 {
+                       label = "JoyUp";
+                       linux,code = <KEY_UP>;
+                       interrupt-parent = <&stmfx_pinctrl>;
+                       interrupts = <4 IRQ_TYPE_EDGE_FALLING>;
+               };
+       };
+
        usbotg_hs_phy: usb-phy {
                #phy-cells = <0>;
                compatible = "usb-nop-xceiv";
        i2c-scl-rising-time-ns = <185>;
        i2c-scl-falling-time-ns = <20>;
        status = "okay";
+
+       stmfx: stmfx@42 {
+               compatible = "st,stmfx-0300";
+               reg = <0x42>;
+               interrupts = <8 IRQ_TYPE_EDGE_RISING>;
+               interrupt-parent = <&gpioi>;
+
+               stmfx_pinctrl: stmfx-pin-controller {
+                       compatible = "st,stmfx-0300-pinctrl";
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+                       gpio-ranges = <&stmfx_pinctrl 0 0 24>;
+
+                       joystick_pins: joystick {
+                               pins = "gpio0", "gpio1", "gpio2", "gpio3", "gpio4";
+                               drive-push-pull;
+                               bias-pull-up;
+                       };
+               };
+       };
 };
 
 &rtc {
index 85c417d9983b98ec1001b340c1521cc0318c664e..df64701335741c5ed62721a24cd380c8b48f4219 100644 (file)
@@ -26,6 +26,7 @@
                                st,bank-name = "GPIOA";
                                ngpios = <16>;
                                gpio-ranges = <&pinctrl 0 0 16>;
+                               status = "disabled";
                        };
 
                        gpiob: gpio@50003000 {
@@ -38,6 +39,7 @@
                                st,bank-name = "GPIOB";
                                ngpios = <16>;
                                gpio-ranges = <&pinctrl 0 16 16>;
+                               status = "disabled";
                        };
 
                        gpioc: gpio@50004000 {
@@ -50,6 +52,7 @@
                                st,bank-name = "GPIOC";
                                ngpios = <16>;
                                gpio-ranges = <&pinctrl 0 32 16>;
+                               status = "disabled";
                        };
 
                        gpiod: gpio@50005000 {
@@ -62,6 +65,7 @@
                                st,bank-name = "GPIOD";
                                ngpios = <16>;
                                gpio-ranges = <&pinctrl 0 48 16>;
+                               status = "disabled";
                        };
 
                        gpioe: gpio@50006000 {
@@ -74,6 +78,7 @@
                                st,bank-name = "GPIOE";
                                ngpios = <16>;
                                gpio-ranges = <&pinctrl 0 64 16>;
+                               status = "disabled";
                        };
 
                        gpiof: gpio@50007000 {
@@ -86,6 +91,7 @@
                                st,bank-name = "GPIOF";
                                ngpios = <16>;
                                gpio-ranges = <&pinctrl 0 80 16>;
+                               status = "disabled";
                        };
 
                        gpiog: gpio@50008000 {
                                st,bank-name = "GPIOG";
                                ngpios = <16>;
                                gpio-ranges = <&pinctrl 0 96 16>;
+                               status = "disabled";
                        };
 
                        gpioh: gpio@50009000 {
                                st,bank-name = "GPIOH";
                                ngpios = <16>;
                                gpio-ranges = <&pinctrl 0 112 16>;
+                               status = "disabled";
                        };
 
                        gpioi: gpio@5000a000 {
                                st,bank-name = "GPIOI";
                                ngpios = <16>;
                                gpio-ranges = <&pinctrl 0 128 16>;
+                               status = "disabled";
                        };
 
                        gpioj: gpio@5000b000 {
                                st,bank-name = "GPIOJ";
                                ngpios = <16>;
                                gpio-ranges = <&pinctrl 0 144 16>;
+                               status = "disabled";
                        };
 
                        gpiok: gpio@5000c000 {
                                st,bank-name = "GPIOK";
                                ngpios = <8>;
                                gpio-ranges = <&pinctrl 0 160 8>;
+                               status = "disabled";
                        };
 
                        cec_pins_a: cec-0 {
                                };
                        };
 
+                       dcmi_pins_a: dcmi-0 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('H', 8,  AF13)>,/* DCMI_HSYNC */
+                                                <STM32_PINMUX('B', 7,  AF13)>,/* DCMI_VSYNC */
+                                                <STM32_PINMUX('A', 6,  AF13)>,/* DCMI_PIXCLK */
+                                                <STM32_PINMUX('H', 9,  AF13)>,/* DCMI_D0 */
+                                                <STM32_PINMUX('H', 10, AF13)>,/* DCMI_D1 */
+                                                <STM32_PINMUX('H', 11, AF13)>,/* DCMI_D2 */
+                                                <STM32_PINMUX('H', 12, AF13)>,/* DCMI_D3 */
+                                                <STM32_PINMUX('H', 14, AF13)>,/* DCMI_D4 */
+                                                <STM32_PINMUX('I', 4,  AF13)>,/* DCMI_D5 */
+                                                <STM32_PINMUX('B', 8,  AF13)>,/* DCMI_D6 */
+                                                <STM32_PINMUX('E', 6,  AF13)>,/* DCMI_D7 */
+                                                <STM32_PINMUX('I', 1,  AF13)>,/* DCMI_D8 */
+                                                <STM32_PINMUX('H', 7,  AF13)>,/* DCMI_D9 */
+                                                <STM32_PINMUX('I', 3,  AF13)>,/* DCMI_D10 */
+                                                <STM32_PINMUX('H', 15, AF13)>;/* DCMI_D11 */
+                                       bias-disable;
+                               };
+                       };
+
+                       dcmi_sleep_pins_a: dcmi-sleep-0 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('H', 8,  ANALOG)>,/* DCMI_HSYNC */
+                                                <STM32_PINMUX('B', 7,  ANALOG)>,/* DCMI_VSYNC */
+                                                <STM32_PINMUX('A', 6,  ANALOG)>,/* DCMI_PIXCLK */
+                                                <STM32_PINMUX('H', 9,  ANALOG)>,/* DCMI_D0 */
+                                                <STM32_PINMUX('H', 10, ANALOG)>,/* DCMI_D1 */
+                                                <STM32_PINMUX('H', 11, ANALOG)>,/* DCMI_D2 */
+                                                <STM32_PINMUX('H', 12, ANALOG)>,/* DCMI_D3 */
+                                                <STM32_PINMUX('H', 14, ANALOG)>,/* DCMI_D4 */
+                                                <STM32_PINMUX('I', 4,  ANALOG)>,/* DCMI_D5 */
+                                                <STM32_PINMUX('B', 8,  ANALOG)>,/* DCMI_D6 */
+                                                <STM32_PINMUX('E', 6,  ANALOG)>,/* DCMI_D7 */
+                                                <STM32_PINMUX('I', 1,  ANALOG)>,/* DCMI_D8 */
+                                                <STM32_PINMUX('H', 7,  ANALOG)>,/* DCMI_D9 */
+                                                <STM32_PINMUX('I', 3,  ANALOG)>,/* DCMI_D10 */
+                                                <STM32_PINMUX('H', 15, ANALOG)>;/* DCMI_D11 */
+                               };
+                       };
+
                        ethernet0_rgmii_pins_a: rgmii-0 {
                                pins1 {
                                        pinmux = <STM32_PINMUX('G', 5, AF11)>, /* ETH_RGMII_CLK125 */
                                };
                        };
 
+                       i2c1_pins_b: i2c1-2 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('F', 14, AF5)>, /* I2C1_SCL */
+                                                <STM32_PINMUX('F', 15, AF5)>; /* I2C1_SDA */
+                                       bias-disable;
+                                       drive-open-drain;
+                                       slew-rate = <0>;
+                               };
+                       };
+
+                       i2c1_pins_sleep_b: i2c1-3 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('F', 14, ANALOG)>, /* I2C1_SCL */
+                                                <STM32_PINMUX('F', 15, ANALOG)>; /* I2C1_SDA */
+                               };
+                       };
+
                        i2c2_pins_a: i2c2-0 {
                                pins {
                                        pinmux = <STM32_PINMUX('H', 4, AF4)>, /* I2C2_SCL */
                                };
                        };
 
+                       i2c2_pins_b1: i2c2-2 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('H', 5, AF4)>; /* I2C2_SDA */
+                                       bias-disable;
+                                       drive-open-drain;
+                                       slew-rate = <0>;
+                               };
+                       };
+
+                       i2c2_pins_sleep_b1: i2c2-3 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('H', 5, ANALOG)>; /* I2C2_SDA */
+                               };
+                       };
+
                        i2c5_pins_a: i2c5-0 {
                                pins {
                                        pinmux = <STM32_PINMUX('A', 11, AF4)>, /* I2C5_SCL */
                                };
                        };
 
+                       i2s2_pins_a: i2s2-0 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('I', 3, AF5)>, /* I2S2_SDO */
+                                                <STM32_PINMUX('B', 9, AF5)>, /* I2S2_WS */
+                                                <STM32_PINMUX('A', 9, AF5)>; /* I2S2_CK */
+                                       slew-rate = <1>;
+                                       drive-push-pull;
+                                       bias-disable;
+                               };
+                       };
+
+                       i2s2_pins_sleep_a: i2s2-1 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('I', 3, ANALOG)>, /* I2S2_SDO */
+                                                <STM32_PINMUX('B', 9, ANALOG)>, /* I2S2_WS */
+                                                <STM32_PINMUX('A', 9, ANALOG)>; /* I2S2_CK */
+                               };
+                       };
+
                        ltdc_pins_a: ltdc-a-0 {
                                pins {
                                        pinmux = <STM32_PINMUX('G',  7, AF14)>, /* LCD_CLK */
                                };
                        };
 
+                       qspi_clk_sleep_pins_a: qspi-clk-sleep-0 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('F', 10, ANALOG)>; /* QSPI_CLK */
+                               };
+                       };
+
                        qspi_bk1_pins_a: qspi-bk1-0 {
                                pins1 {
                                        pinmux = <STM32_PINMUX('F', 8, AF10)>, /* QSPI_BK1_IO0 */
                                };
                        };
 
+                       qspi_bk1_sleep_pins_a: qspi-bk1-sleep-0 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('F', 8, ANALOG)>, /* QSPI_BK1_IO0 */
+                                                <STM32_PINMUX('F', 9, ANALOG)>, /* QSPI_BK1_IO1 */
+                                                <STM32_PINMUX('F', 7, ANALOG)>, /* QSPI_BK1_IO2 */
+                                                <STM32_PINMUX('F', 6, ANALOG)>, /* QSPI_BK1_IO3 */
+                                                <STM32_PINMUX('B', 6, ANALOG)>; /* QSPI_BK1_NCS */
+                               };
+                       };
+
                        qspi_bk2_pins_a: qspi-bk2-0 {
                                pins1 {
                                        pinmux = <STM32_PINMUX('H', 2, AF9)>, /* QSPI_BK2_IO0 */
                                };
                        };
 
+                       qspi_bk2_sleep_pins_a: qspi-bk2-sleep-0 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('H', 2, ANALOG)>, /* QSPI_BK2_IO0 */
+                                                <STM32_PINMUX('H', 3, ANALOG)>, /* QSPI_BK2_IO1 */
+                                                <STM32_PINMUX('G', 10, ANALOG)>, /* QSPI_BK2_IO2 */
+                                                <STM32_PINMUX('G', 7, ANALOG)>, /* QSPI_BK2_IO3 */
+                                                <STM32_PINMUX('C', 0, ANALOG)>; /* QSPI_BK2_NCS */
+                               };
+                       };
+
+                       sai2a_pins_a: sai2a-0 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('I', 5, AF10)>, /* SAI2_SCK_A */
+                                                <STM32_PINMUX('I', 6, AF10)>, /* SAI2_SD_A */
+                                                <STM32_PINMUX('I', 7, AF10)>, /* SAI2_FS_A */
+                                                <STM32_PINMUX('E', 0, AF10)>; /* SAI2_MCLK_A */
+                                       slew-rate = <0>;
+                                       drive-push-pull;
+                                       bias-disable;
+                               };
+                       };
+
+                       sai2a_sleep_pins_a: sai2a-1 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('I', 5, ANALOG)>, /* SAI2_SCK_A */
+                                                <STM32_PINMUX('I', 6, ANALOG)>, /* SAI2_SD_A */
+                                                <STM32_PINMUX('I', 7, ANALOG)>, /* SAI2_FS_A */
+                                                <STM32_PINMUX('E', 0, ANALOG)>; /* SAI2_MCLK_A */
+                               };
+                       };
+
+                       sai2b_pins_a: sai2b-0 {
+                               pins1 {
+                                       pinmux = <STM32_PINMUX('E', 12, AF10)>, /* SAI2_SCK_B */
+                                                <STM32_PINMUX('E', 13, AF10)>, /* SAI2_FS_B */
+                                                <STM32_PINMUX('E', 14, AF10)>; /* SAI2_MCLK_B */
+                                       slew-rate = <0>;
+                                       drive-push-pull;
+                                       bias-disable;
+                               };
+                               pins2 {
+                                       pinmux = <STM32_PINMUX('F', 11, AF10)>; /* SAI2_SD_B */
+                                       bias-disable;
+                               };
+                       };
+
+                       sai2b_sleep_pins_a: sai2b-1 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('F', 11, ANALOG)>, /* SAI2_SD_B */
+                                                <STM32_PINMUX('E', 12, ANALOG)>, /* SAI2_SCK_B */
+                                                <STM32_PINMUX('E', 13, ANALOG)>, /* SAI2_FS_B */
+                                                <STM32_PINMUX('E', 14, ANALOG)>; /* SAI2_MCLK_B */
+                               };
+                       };
+
+                       sai2b_pins_b: sai2b-2 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('F', 11, AF10)>; /* SAI2_SD_B */
+                                       bias-disable;
+                               };
+                       };
+
+                       sai2b_sleep_pins_b: sai2b-3 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('F', 11, ANALOG)>; /* SAI2_SD_B */
+                               };
+                       };
+
+                       sai4a_pins_a: sai4a-0 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('B', 5, AF10)>; /* SAI4_SD_A */
+                                       slew-rate = <0>;
+                                       drive-push-pull;
+                                       bias-disable;
+                               };
+                       };
+
+                       sai4a_sleep_pins_a: sai4a-1 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('B', 5, ANALOG)>; /* SAI4_SD_A */
+                               };
+                       };
+
                        sdmmc1_b4_pins_a: sdmmc1-b4-0 {
                                pins {
                                        pinmux = <STM32_PINMUX('C', 8, AF12)>, /* SDMMC1_D0 */
                                        bias-disable;
                                };
                        };
+
+                       uart4_pins_b: uart4-1 {
+                               pins1 {
+                                       pinmux = <STM32_PINMUX('D', 1, AF8)>; /* UART4_TX */
+                                       bias-disable;
+                                       drive-push-pull;
+                                       slew-rate = <0>;
+                               };
+                               pins2 {
+                                       pinmux = <STM32_PINMUX('B', 2, AF8)>; /* UART4_RX */
+                                       bias-disable;
+                               };
+                       };
+
+                       uart7_pins_a: uart7-0 {
+                               pins1 {
+                                       pinmux = <STM32_PINMUX('E', 8, AF7)>; /* UART4_TX */
+                                       bias-disable;
+                                       drive-push-pull;
+                                       slew-rate = <0>;
+                               };
+                               pins2 {
+                                       pinmux = <STM32_PINMUX('E', 7, AF7)>, /* UART4_RX */
+                                                <STM32_PINMUX('E', 10, AF7)>, /* UART4_CTS */
+                                                <STM32_PINMUX('E', 9, AF7)>; /* UART4_RTS */
+                                       bias-disable;
+                               };
+                       };
                };
 
                pinctrl_z: pin-controller-z@54004000 {
                                st,bank-ioport = <11>;
                                ngpios = <8>;
                                gpio-ranges = <&pinctrl_z 0 400 8>;
+                               status = "disabled";
+                       };
+
+                       i2c2_pins_b2: i2c2-0 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('Z', 0, AF3)>; /* I2C2_SCL */
+                                       bias-disable;
+                                       drive-open-drain;
+                                       slew-rate = <0>;
+                               };
+                       };
+
+                       i2c2_pins_sleep_b2: i2c2-1 {
+                               pins {
+                                       pinmux = <STM32_PINMUX('Z', 0, ANALOG)>; /* I2C2_SCL */
+                               };
                        };
 
                        i2c4_pins_a: i2c4-0 {
diff --git a/arch/arm/boot/dts/stm32mp157a-avenger96.dts b/arch/arm/boot/dts/stm32mp157a-avenger96.dts
new file mode 100644 (file)
index 0000000..2e4742c
--- /dev/null
@@ -0,0 +1,321 @@
+// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
+/*
+ * Copyright (C) Linaro Ltd 2019 - All Rights Reserved
+ * Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+ */
+
+/dts-v1/;
+
+#include "stm32mp157c.dtsi"
+#include "stm32mp157xac-pinctrl.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/mfd/st,stpmic1.h>
+
+/ {
+       model = "Arrow Electronics STM32MP157A Avenger96 board";
+       compatible = "arrow,stm32mp157a-avenger96", "st,stm32mp157";
+
+       aliases {
+               ethernet0 = &ethernet0;
+               mmc0 = &sdmmc1;
+               serial0 = &uart4;
+               serial1 = &uart7;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       memory@c0000000 {
+               device_type = "memory";
+               reg = <0xc0000000 0x40000000>;
+       };
+
+       led {
+               compatible = "gpio-leds";
+               led1 {
+                       label = "green:user1";
+                       gpios = <&gpioz 7 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "heartbeat";
+                       default-state = "off";
+               };
+
+               led2 {
+                       label = "green:user2";
+                       gpios = <&gpiof 3 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "mmc0";
+                       default-state = "off";
+               };
+
+               led3 {
+                       label = "green:user3";
+                       gpios = <&gpiog 0 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "mmc1";
+                       default-state = "off";
+               };
+
+               led4 {
+                       label = "green:user3";
+                       gpios = <&gpiog 1 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "none";
+                       default-state = "off";
+                       panic-indicator;
+               };
+
+               led5 {
+                       label = "yellow:wifi";
+                       gpios = <&gpioz 3 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "phy0tx";
+                       default-state = "off";
+               };
+
+               led6 {
+                       label = "blue:bt";
+                       gpios = <&gpioz 6 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "bluetooth-power";
+                       default-state = "off";
+               };
+       };
+};
+
+&ethernet0 {
+       status = "okay";
+       pinctrl-0 = <&ethernet0_rgmii_pins_a>;
+       pinctrl-1 = <&ethernet0_rgmii_pins_sleep_a>;
+       pinctrl-names = "default", "sleep";
+       phy-mode = "rgmii";
+       max-speed = <1000>;
+       phy-handle = <&phy0>;
+
+       mdio0 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "snps,dwmac-mdio";
+               phy0: ethernet-phy@7 {
+                       reg = <7>;
+               };
+       };
+};
+
+&i2c1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c1_pins_b>;
+       i2c-scl-rising-time-ns = <185>;
+       i2c-scl-falling-time-ns = <20>;
+       status = "okay";
+       /delete-property/dmas;
+       /delete-property/dma-names;
+};
+
+&i2c2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c2_pins_b1 &i2c2_pins_b2>;
+       i2c-scl-rising-time-ns = <185>;
+       i2c-scl-falling-time-ns = <20>;
+       status = "okay";
+       /delete-property/dmas;
+       /delete-property/dma-names;
+};
+
+&i2c4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c4_pins_a>;
+       i2c-scl-rising-time-ns = <185>;
+       i2c-scl-falling-time-ns = <20>;
+       status = "okay";
+       /delete-property/dmas;
+       /delete-property/dma-names;
+
+       pmic: stpmic@33 {
+               compatible = "st,stpmic1";
+               reg = <0x33>;
+               interrupts-extended = <&exti 55 IRQ_TYPE_EDGE_FALLING>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+               status = "okay";
+
+               st,main-control-register = <0x04>;
+               st,vin-control-register = <0xc0>;
+               st,usb-control-register = <0x30>;
+
+               regulators {
+                       compatible = "st,stpmic1-regulators";
+
+                       ldo1-supply = <&v3v3>;
+                       ldo2-supply = <&v3v3>;
+                       ldo3-supply = <&vdd_ddr>;
+                       ldo5-supply = <&v3v3>;
+                       ldo6-supply = <&v3v3>;
+                       pwr_sw1-supply = <&bst_out>;
+                       pwr_sw2-supply = <&bst_out>;
+
+                       vddcore: buck1 {
+                               regulator-name = "vddcore";
+                               regulator-min-microvolt = <1200000>;
+                               regulator-max-microvolt = <1350000>;
+                               regulator-always-on;
+                               regulator-initial-mode = <0>;
+                               regulator-over-current-protection;
+                       };
+
+                       vdd_ddr: buck2 {
+                               regulator-name = "vdd_ddr";
+                               regulator-min-microvolt = <1350000>;
+                               regulator-max-microvolt = <1350000>;
+                               regulator-always-on;
+                               regulator-initial-mode = <0>;
+                               regulator-over-current-protection;
+                       };
+
+                       vdd: buck3 {
+                               regulator-name = "vdd";
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                               st,mask_reset;
+                               regulator-initial-mode = <0>;
+                               regulator-over-current-protection;
+                       };
+
+                       v3v3: buck4 {
+                               regulator-name = "v3v3";
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                               regulator-over-current-protection;
+                               regulator-initial-mode = <0>;
+                       };
+
+                       vdda: ldo1 {
+                               regulator-name = "vdda";
+                               regulator-min-microvolt = <2900000>;
+                               regulator-max-microvolt = <2900000>;
+                               interrupts = <IT_CURLIM_LDO1 0>;
+                               interrupt-parent = <&pmic>;
+                       };
+
+                       v2v8: ldo2 {
+                               regulator-name = "v2v8";
+                               regulator-min-microvolt = <2800000>;
+                               regulator-max-microvolt = <2800000>;
+                               interrupts = <IT_CURLIM_LDO2 0>;
+                               interrupt-parent = <&pmic>;
+                       };
+
+                       vtt_ddr: ldo3 {
+                               regulator-name = "vtt_ddr";
+                               regulator-min-microvolt = <500000>;
+                               regulator-max-microvolt = <750000>;
+                               regulator-always-on;
+                               regulator-over-current-protection;
+                       };
+
+                       vdd_usb: ldo4 {
+                               regulator-name = "vdd_usb";
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               interrupts = <IT_CURLIM_LDO4 0>;
+                               interrupt-parent = <&pmic>;
+                       };
+
+                       vdd_sd: ldo5 {
+                               regulator-name = "vdd_sd";
+                               regulator-min-microvolt = <2900000>;
+                               regulator-max-microvolt = <2900000>;
+                               interrupts = <IT_CURLIM_LDO5 0>;
+                               interrupt-parent = <&pmic>;
+                               regulator-boot-on;
+                       };
+
+                       v1v8: ldo6 {
+                               regulator-name = "v1v8";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               interrupts = <IT_CURLIM_LDO6 0>;
+                               interrupt-parent = <&pmic>;
+                               regulator-enable-ramp-delay = <300000>;
+                       };
+
+                       vref_ddr: vref_ddr {
+                               regulator-name = "vref_ddr";
+                               regulator-always-on;
+                               regulator-over-current-protection;
+                       };
+
+                       bst_out: boost {
+                               regulator-name = "bst_out";
+                               interrupts = <IT_OCP_BOOST 0>;
+                               interrupt-parent = <&pmic>;
+                       };
+
+                       vbus_otg: pwr_sw1 {
+                               regulator-name = "vbus_otg";
+                               interrupts = <IT_OCP_OTG 0>;
+                               interrupt-parent = <&pmic>;
+                               regulator-active-discharge;
+                       };
+
+                       vbus_sw: pwr_sw2 {
+                               regulator-name = "vbus_sw";
+                               interrupts = <IT_OCP_SWOUT 0>;
+                               interrupt-parent = <&pmic>;
+                               regulator-active-discharge;
+                       };
+               };
+
+               onkey {
+                       compatible = "st,stpmic1-onkey";
+                       interrupts = <IT_PONKEY_F 0>, <IT_PONKEY_R 1>;
+                       interrupt-names = "onkey-falling", "onkey-rising";
+                       status = "okay";
+               };
+
+               watchdog {
+                       compatible = "st,stpmic1-wdt";
+                       status = "disabled";
+               };
+       };
+};
+
+&iwdg2 {
+       timeout-sec = <32>;
+       status = "okay";
+};
+
+&rng1 {
+       status = "okay";
+};
+
+&rtc {
+       status = "okay";
+};
+
+&sdmmc1 {
+       pinctrl-names = "default", "opendrain", "sleep";
+       pinctrl-0 = <&sdmmc1_b4_pins_a &sdmmc1_dir_pins_a>;
+       pinctrl-1 = <&sdmmc1_b4_od_pins_a>;
+       pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;
+       broken-cd;
+       st,sig-dir;
+       st,neg-edge;
+       st,use-ckin;
+       bus-width = <4>;
+       vmmc-supply = <&vdd_sd>;
+       status = "okay";
+};
+
+&uart4 {
+       /* On Low speed expansion header */
+       label = "LS-UART1";
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart4_pins_b>;
+       status = "okay";
+};
+
+&uart7 {
+       /* On Low speed expansion header */
+       label = "LS-UART0";
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart7_pins_a>;
+       status = "okay";
+};
index 098dbfb06b613bbc40b6018e1394964130be0b24..f3f0e37aad4dd19914e400a9bda399668c96a65d 100644 (file)
@@ -7,7 +7,7 @@
 /dts-v1/;
 
 #include "stm32mp157c.dtsi"
-#include "stm32mp157-pinctrl.dtsi"
+#include "stm32mp157xac-pinctrl.dtsi"
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/mfd/st,stpmic1.h>
 
                reg = <0xc0000000 0x20000000>;
        };
 
+       reserved-memory {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               gpu_reserved: gpu@d4000000 {
+                       reg = <0xd4000000 0x4000000>;
+                       no-map;
+               };
+       };
+
        led {
                compatible = "gpio-leds";
                blue {
@@ -51,7 +62,7 @@
        pinctrl-0 = <&ethernet0_rgmii_pins_a>;
        pinctrl-1 = <&ethernet0_rgmii_pins_sleep_a>;
        pinctrl-names = "default", "sleep";
-       phy-mode = "rgmii";
+       phy-mode = "rgmii-id";
        max-speed = <1000>;
        phy-handle = <&phy0>;
 
        };
 };
 
+&gpu {
+       contiguous-area = <&gpu_reserved>;
+       status = "okay";
+};
+
+&i2c1 {
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&i2c1_pins_a>;
+       pinctrl-1 = <&i2c1_pins_sleep_a>;
+       i2c-scl-rising-time-ns = <100>;
+       i2c-scl-falling-time-ns = <7>;
+       status = "okay";
+       /delete-property/dmas;
+       /delete-property/dma-names;
+
+       hdmi-transmitter@39 {
+               compatible = "sil,sii9022";
+               reg = <0x39>;
+               iovcc-supply = <&v3v3_hdmi>;
+               cvcc12-supply = <&v1v2_hdmi>;
+               reset-gpios = <&gpioa 10 GPIO_ACTIVE_LOW>;
+               interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
+               interrupt-parent = <&gpiog>;
+               pinctrl-names = "default", "sleep";
+               pinctrl-0 = <&ltdc_pins_a>;
+               pinctrl-1 = <&ltdc_pins_sleep_a>;
+               status = "okay";
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       port@0 {
+                               reg = <0>;
+                               sii9022_in: endpoint {
+                                       remote-endpoint = <&ltdc_ep0_out>;
+                               };
+                       };
+               };
+       };
+};
 
 &i2c4 {
        pinctrl-names = "default";
        status = "okay";
 };
 
+&ltdc {
+       status = "okay";
+
+       port {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               ltdc_ep0_out: endpoint@0 {
+                       reg = <0>;
+                       remote-endpoint = <&sii9022_in>;
+               };
+       };
+};
+
 &rng1 {
        status = "okay";
 };
index 62a8c78e7e2e1c55e9831aa355cfccc5f3a9a670..4fe7f71a74d36daa836e9983a1c141a3b0d2f03c 100644 (file)
@@ -6,7 +6,7 @@
 /dts-v1/;
 
 #include "stm32mp157c.dtsi"
-#include "stm32mp157-pinctrl.dtsi"
+#include "stm32mp157xaa-pinctrl.dtsi"
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/mfd/st,stpmic1.h>
 
                reg = <0xC0000000 0x40000000>;
        };
 
+       reserved-memory {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               gpu_reserved: gpu@e8000000 {
+                       reg = <0xe8000000 0x8000000>;
+                       no-map;
+               };
+       };
+
        aliases {
                serial0 = &uart4;
        };
        status = "okay";
 };
 
+&gpu {
+       contiguous-area = <&gpu_reserved>;
+       status = "okay";
+};
+
 &i2c4 {
        pinctrl-names = "default";
        pinctrl-0 = <&i2c4_pins_a>;
index b6aca40b9b90bcd675c0b111c555ffb8941b88af..feb8f7727270b670c68e5229113dda63984b6f53 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "stm32mp157c-ed1.dts"
 #include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
 
 / {
        model = "STMicroelectronics STM32MP157C eval daughter on eval mother";
                ethernet0 = &ethernet0;
        };
 
+       clocks {
+               clk_ext_camera: clk-ext-camera {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <24000000>;
+               };
+       };
+
+       joystick {
+               compatible = "gpio-keys";
+               #size-cells = <0>;
+               pinctrl-0 = <&joystick_pins>;
+               pinctrl-names = "default";
+               button-0 {
+                       label = "JoySel";
+                       linux,code = <KEY_ENTER>;
+                       interrupt-parent = <&stmfx_pinctrl>;
+                       interrupts = <0 IRQ_TYPE_EDGE_RISING>;
+               };
+               button-1 {
+                       label = "JoyDown";
+                       linux,code = <KEY_DOWN>;
+                       interrupt-parent = <&stmfx_pinctrl>;
+                       interrupts = <1 IRQ_TYPE_EDGE_RISING>;
+               };
+               button-2 {
+                       label = "JoyLeft";
+                       linux,code = <KEY_LEFT>;
+                       interrupt-parent = <&stmfx_pinctrl>;
+                       interrupts = <2 IRQ_TYPE_EDGE_RISING>;
+               };
+               button-3 {
+                       label = "JoyRight";
+                       linux,code = <KEY_RIGHT>;
+                       interrupt-parent = <&stmfx_pinctrl>;
+                       interrupts = <3 IRQ_TYPE_EDGE_RISING>;
+               };
+               button-4 {
+                       label = "JoyUp";
+                       linux,code = <KEY_UP>;
+                       interrupt-parent = <&stmfx_pinctrl>;
+                       interrupts = <4 IRQ_TYPE_EDGE_RISING>;
+               };
+       };
+
        panel_backlight: panel-backlight {
                compatible = "gpio-backlight";
                gpios = <&gpiod 13 GPIO_ACTIVE_LOW>;
        status = "okay";
 };
 
+&dcmi {
+       status = "okay";
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&dcmi_pins_a>;
+       pinctrl-1 = <&dcmi_sleep_pins_a>;
+
+       port {
+               dcmi_0: endpoint {
+                       remote-endpoint = <&ov5640_0>;
+                       bus-width = <8>;
+                       hsync-active = <0>;
+                       vsync-active = <0>;
+                       pclk-sample = <1>;
+               };
+       };
+};
+
 &dsi {
        #address-cells = <1>;
        #size-cells = <0>;
                reg = <0>;
                reset-gpios = <&gpiof 15 GPIO_ACTIVE_LOW>;
                backlight = <&panel_backlight>;
+               power-supply = <&v3v3>;
                status = "okay";
 
                port {
        pinctrl-0 = <&ethernet0_rgmii_pins_a>;
        pinctrl-1 = <&ethernet0_rgmii_pins_sleep_a>;
        pinctrl-names = "default", "sleep";
-       phy-mode = "rgmii";
+       phy-mode = "rgmii-id";
        max-speed = <1000>;
        phy-handle = <&phy0>;
 
        i2c-scl-rising-time-ns = <185>;
        i2c-scl-falling-time-ns = <20>;
        status = "okay";
+
+       ov5640: camera@3c {
+               compatible = "ovti,ov5640";
+               pinctrl-names = "default";
+               pinctrl-0 = <&ov5640_pins>;
+               reg = <0x3c>;
+               clocks = <&clk_ext_camera>;
+               clock-names = "xclk";
+               DOVDD-supply = <&v2v8>;
+               powerdown-gpios = <&stmfx_pinctrl 18 GPIO_ACTIVE_HIGH>;
+               reset-gpios = <&stmfx_pinctrl 19 GPIO_ACTIVE_LOW>;
+               rotation = <180>;
+               status = "okay";
+
+               port {
+                       ov5640_0: endpoint {
+                               remote-endpoint = <&dcmi_0>;
+                               bus-width = <8>;
+                               data-shift = <2>; /* lines 9:2 are used */
+                               hsync-active = <0>;
+                               vsync-active = <0>;
+                               pclk-sample = <1>;
+                       };
+               };
+       };
+
+       stmfx: stmfx@42 {
+               compatible = "st,stmfx-0300";
+               reg = <0x42>;
+               interrupts = <8 IRQ_TYPE_EDGE_RISING>;
+               interrupt-parent = <&gpioi>;
+               vdd-supply = <&v3v3>;
+
+               stmfx_pinctrl: stmfx-pin-controller {
+                       compatible = "st,stmfx-0300-pinctrl";
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+                       gpio-ranges = <&stmfx_pinctrl 0 0 24>;
+
+                       joystick_pins: joystick {
+                               pins = "gpio0", "gpio1", "gpio2", "gpio3", "gpio4";
+                               drive-push-pull;
+                               bias-pull-down;
+                       };
+
+                       ov5640_pins: camera {
+                               pins = "agpio2", "agpio3"; /* stmfx pins 18 & 19 */
+                               drive-push-pull;
+                               output-low;
+                       };
+               };
+       };
 };
 
 &i2c5 {
 };
 
 &qspi {
-       pinctrl-names = "default";
+       pinctrl-names = "default", "sleep";
        pinctrl-0 = <&qspi_clk_pins_a &qspi_bk1_pins_a &qspi_bk2_pins_a>;
+       pinctrl-1 = <&qspi_clk_sleep_pins_a &qspi_bk1_sleep_pins_a &qspi_bk2_sleep_pins_a>;
        reg = <0x58003000 0x1000>, <0x70000000 0x4000000>;
        #address-cells = <1>;
        #size-cells = <0>;
        status = "okay";
 
        flash0: mx66l51235l@0 {
+               compatible = "jedec,spi-nor";
                reg = <0>;
                spi-rx-bus-width = <4>;
                spi-max-frequency = <108000000>;
        };
 
        flash1: mx66l51235l@1 {
+               compatible = "jedec,spi-nor";
                reg = <1>;
                spi-rx-bus-width = <4>;
                spi-max-frequency = <108000000>;
index 2afeee65c3eadb5a714b3bdf228eabfe5c2378a3..0c4e6ebc35291e8e243c816d0a7631ae1ee8ab9f 100644 (file)
                        status = "disabled";
                };
 
+               i2s2: audio-controller@4000b000 {
+                       compatible = "st,stm32h7-i2s";
+                       #sound-dai-cells = <0>;
+                       reg = <0x4000b000 0x400>;
+                       interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+                       dmas = <&dmamux1 39 0x400 0x01>,
+                              <&dmamux1 40 0x400 0x01>;
+                       dma-names = "rx", "tx";
+                       status = "disabled";
+               };
+
                spi3: spi@4000c000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                };
 
+               i2s3: audio-controller@4000c000 {
+                       compatible = "st,stm32h7-i2s";
+                       #sound-dai-cells = <0>;
+                       reg = <0x4000c000 0x400>;
+                       interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
+                       dmas = <&dmamux1 61 0x400 0x01>,
+                              <&dmamux1 62 0x400 0x01>;
+                       dma-names = "rx", "tx";
+                       status = "disabled";
+               };
+
                spdifrx: audio-controller@4000d000 {
                        compatible = "st,stm32h7-spdifrx";
                        #sound-dai-cells = <0>;
                        status = "disabled";
                };
 
+               i2s1: audio-controller@44004000 {
+                       compatible = "st,stm32h7-i2s";
+                       #sound-dai-cells = <0>;
+                       reg = <0x44004000 0x400>;
+                       interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
+                       dmas = <&dmamux1 37 0x400 0x01>,
+                              <&dmamux1 38 0x400 0x01>;
+                       dma-names = "rx", "tx";
+                       status = "disabled";
+               };
+
                spi4: spi@44005000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                };
 
+               sai1: sai@4400a000 {
+                       compatible = "st,stm32h7-sai";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0 0x4400a000 0x400>;
+                       reg = <0x4400a000 0x4>, <0x4400a3f0 0x10>;
+                       interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>;
+                       resets = <&rcc SAI1_R>;
+                       status = "disabled";
+
+                       sai1a: audio-controller@4400a004 {
+                               #sound-dai-cells = <0>;
+
+                               compatible = "st,stm32-sai-sub-a";
+                               reg = <0x4 0x1c>;
+                               clocks = <&rcc SAI1_K>;
+                               clock-names = "sai_ck";
+                               dmas = <&dmamux1 87 0x400 0x01>;
+                               status = "disabled";
+                       };
+
+                       sai1b: audio-controller@4400a024 {
+                               #sound-dai-cells = <0>;
+                               compatible = "st,stm32-sai-sub-b";
+                               reg = <0x24 0x1c>;
+                               clocks = <&rcc SAI1_K>;
+                               clock-names = "sai_ck";
+                               dmas = <&dmamux1 88 0x400 0x01>;
+                               status = "disabled";
+                       };
+               };
+
+               sai2: sai@4400b000 {
+                       compatible = "st,stm32h7-sai";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0 0x4400b000 0x400>;
+                       reg = <0x4400b000 0x4>, <0x4400b3f0 0x10>;
+                       interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>;
+                       resets = <&rcc SAI2_R>;
+                       status = "disabled";
+
+                       sai2a: audio-controller@4400b004 {
+                               #sound-dai-cells = <0>;
+                               compatible = "st,stm32-sai-sub-a";
+                               reg = <0x4 0x1c>;
+                               clocks = <&rcc SAI2_K>;
+                               clock-names = "sai_ck";
+                               dmas = <&dmamux1 89 0x400 0x01>;
+                               status = "disabled";
+                       };
+
+                       sai2b: audio-controller@4400b024 {
+                               #sound-dai-cells = <0>;
+                               compatible = "st,stm32-sai-sub-b";
+                               reg = <0x24 0x1c>;
+                               clocks = <&rcc SAI2_K>;
+                               clock-names = "sai_ck";
+                               dmas = <&dmamux1 90 0x400 0x01>;
+                               status = "disabled";
+                       };
+               };
+
+               sai3: sai@4400c000 {
+                       compatible = "st,stm32h7-sai";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0 0x4400c000 0x400>;
+                       reg = <0x4400c000 0x4>, <0x4400c3f0 0x10>;
+                       interrupts = <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>;
+                       resets = <&rcc SAI3_R>;
+                       status = "disabled";
+
+                       sai3a: audio-controller@4400c004 {
+                               #sound-dai-cells = <0>;
+                               compatible = "st,stm32-sai-sub-a";
+                               reg = <0x04 0x1c>;
+                               clocks = <&rcc SAI3_K>;
+                               clock-names = "sai_ck";
+                               dmas = <&dmamux1 113 0x400 0x01>;
+                               status = "disabled";
+                       };
+
+                       sai3b: audio-controller@4400c024 {
+                               #sound-dai-cells = <0>;
+                               compatible = "st,stm32-sai-sub-b";
+                               reg = <0x24 0x1c>;
+                               clocks = <&rcc SAI3_K>;
+                               clock-names = "sai_ck";
+                               dmas = <&dmamux1 114 0x400 0x01>;
+                               status = "disabled";
+                       };
+               };
+
                dfsdm: dfsdm@4400d000 {
                        compatible = "st,stm32mp1-dfsdm";
                        reg = <0x4400d000 0x800>;
                        status = "disabled";
                };
 
+               dcmi: dcmi@4c006000 {
+                       compatible = "st,stm32-dcmi";
+                       reg = <0x4c006000 0x400>;
+                       interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
+                       resets = <&rcc CAMITF_R>;
+                       clocks = <&rcc DCMI>;
+                       clock-names = "mclk";
+                       dmas = <&dmamux1 75 0x400 0x0d>;
+                       dma-names = "tx";
+                       status = "disabled";
+               };
+
                rcc: rcc@50000000 {
                        compatible = "st,stm32mp1-rcc", "syscon";
                        reg = <0x50000000 0x1000>;
                        status = "disabled";
                };
 
+               sai4: sai@50027000 {
+                       compatible = "st,stm32h7-sai";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0 0x50027000 0x400>;
+                       reg = <0x50027000 0x4>, <0x500273f0 0x10>;
+                       interrupts = <GIC_SPI 146 IRQ_TYPE_LEVEL_HIGH>;
+                       resets = <&rcc SAI4_R>;
+                       status = "disabled";
+
+                       sai4a: audio-controller@50027004 {
+                               #sound-dai-cells = <0>;
+                               compatible = "st,stm32-sai-sub-a";
+                               reg = <0x04 0x1c>;
+                               clocks = <&rcc SAI4_K>;
+                               clock-names = "sai_ck";
+                               dmas = <&dmamux1 99 0x400 0x01>;
+                               status = "disabled";
+                       };
+
+                       sai4b: audio-controller@50027024 {
+                               #sound-dai-cells = <0>;
+                               compatible = "st,stm32-sai-sub-b";
+                               reg = <0x24 0x1c>;
+                               clocks = <&rcc SAI4_K>;
+                               clock-names = "sai_ck";
+                               dmas = <&dmamux1 100 0x400 0x01>;
+                               status = "disabled";
+                       };
+               };
+
                dts: thermal@50028000 {
                        compatible = "st,stm32-thermal";
                        reg = <0x50028000 0x100>;
                        status = "disabled";
                };
 
+               gpu: gpu@59000000 {
+                       compatible = "vivante,gc";
+                       reg = <0x59000000 0x800>;
+                       interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc GPU>, <&rcc GPU_K>;
+                       clock-names = "bus" ,"core";
+                       resets = <&rcc GPU_R>;
+                       status = "disabled";
+               };
+
                dsi: dsi@5a000000 {
                        compatible = "st,stm32-dsi";
                        reg = <0x5a000000 0x800>;
diff --git a/arch/arm/boot/dts/stm32mp157xaa-pinctrl.dtsi b/arch/arm/boot/dts/stm32mp157xaa-pinctrl.dtsi
new file mode 100644 (file)
index 0000000..875adf5
--- /dev/null
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
+ * Author: Alexandre Torgue <alexandre.torgue@st.com>
+ */
+
+#include "stm32mp157-pinctrl.dtsi"
+/ {
+       soc {
+               pinctrl: pin-controller@50002000 {
+                       st,package = <STM32MP_PKG_AA>;
+
+                       gpioa: gpio@50002000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 0 16>;
+                       };
+
+                       gpiob: gpio@50003000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 16 16>;
+                       };
+
+                       gpioc: gpio@50004000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 32 16>;
+                       };
+
+                       gpiod: gpio@50005000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 48 16>;
+                       };
+
+                       gpioe: gpio@50006000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 64 16>;
+                       };
+
+                       gpiof: gpio@50007000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 80 16>;
+                       };
+
+                       gpiog: gpio@50008000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 96 16>;
+                       };
+
+                       gpioh: gpio@50009000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 112 16>;
+                       };
+
+                       gpioi: gpio@5000a000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 128 16>;
+                       };
+
+                       gpioj: gpio@5000b000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 144 16>;
+                       };
+
+                       gpiok: gpio@5000c000 {
+                               status = "okay";
+                               ngpios = <8>;
+                               gpio-ranges = <&pinctrl 0 160 8>;
+                       };
+               };
+
+               pinctrl_z: pin-controller-z@54004000 {
+                       st,package = <STM32MP_PKG_AA>;
+
+                       gpioz: gpio@54004000 {
+                               status = "okay";
+                               ngpios = <8>;
+                               gpio-ranges = <&pinctrl_z 0 400 8>;
+                       };
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/stm32mp157xab-pinctrl.dtsi b/arch/arm/boot/dts/stm32mp157xab-pinctrl.dtsi
new file mode 100644 (file)
index 0000000..961fa12
--- /dev/null
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
+ * Author: Alexandre Torgue <alexandre.torgue@st.com>
+ */
+
+#include "stm32mp157-pinctrl.dtsi"
+/ {
+       soc {
+               pinctrl: pin-controller@50002000 {
+                       st,package = <STM32MP_PKG_AB>;
+
+                       gpioa: gpio@50002000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 0 16>;
+                       };
+
+                       gpiob: gpio@50003000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 16 16>;
+                       };
+
+                       gpioc: gpio@50004000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 32 16>;
+                       };
+
+                       gpiod: gpio@50005000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 48 16>;
+                       };
+
+                       gpioe: gpio@50006000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 64 16>;
+                       };
+
+                       gpiof: gpio@50007000 {
+                               status = "okay";
+                               ngpios = <6>;
+                               gpio-ranges = <&pinctrl 6 86 6>;
+                       };
+
+                       gpiog: gpio@50008000 {
+                               status = "okay";
+                               ngpios = <10>;
+                               gpio-ranges = <&pinctrl 6 102 10>;
+                       };
+
+                       gpioh: gpio@50009000 {
+                               status = "okay";
+                               ngpios = <2>;
+                               gpio-ranges = <&pinctrl 0 112 2>;
+                       };
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/stm32mp157xac-pinctrl.dtsi b/arch/arm/boot/dts/stm32mp157xac-pinctrl.dtsi
new file mode 100644 (file)
index 0000000..26600f1
--- /dev/null
@@ -0,0 +1,78 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
+ * Author: Alexandre Torgue <alexandre.torgue@st.com>
+ */
+
+#include "stm32mp157-pinctrl.dtsi"
+/ {
+       soc {
+               pinctrl: pin-controller@50002000 {
+                       st,package = <STM32MP_PKG_AC>;
+
+                       gpioa: gpio@50002000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 0 16>;
+                       };
+
+                       gpiob: gpio@50003000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 16 16>;
+                       };
+
+                       gpioc: gpio@50004000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 32 16>;
+                       };
+
+                       gpiod: gpio@50005000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 48 16>;
+                       };
+
+                       gpioe: gpio@50006000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 64 16>;
+                       };
+
+                       gpiof: gpio@50007000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 80 16>;
+                       };
+
+                       gpiog: gpio@50008000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 96 16>;
+                       };
+
+                       gpioh: gpio@50009000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 112 16>;
+                       };
+
+                       gpioi: gpio@5000a000 {
+                               status = "okay";
+                               ngpios = <12>;
+                               gpio-ranges = <&pinctrl 0 128 12>;
+                       };
+               };
+
+               pinctrl_z: pin-controller-z@54004000 {
+                       st,package = <STM32MP_PKG_AC>;
+
+                       gpioz: gpio@54004000 {
+                               status = "okay";
+                               ngpios = <8>;
+                               gpio-ranges = <&pinctrl_z 0 400 8>;
+                       };
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/stm32mp157xad-pinctrl.dtsi b/arch/arm/boot/dts/stm32mp157xad-pinctrl.dtsi
new file mode 100644 (file)
index 0000000..910113f
--- /dev/null
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
+ * Author: Alexandre Torgue <alexandre.torgue@st.com>
+ */
+
+#include "stm32mp157-pinctrl.dtsi"
+/ {
+       soc {
+               pinctrl: pin-controller@50002000 {
+                       st,package = <STM32MP_PKG_AD>;
+
+                       gpioa: gpio@50002000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 0 16>;
+                       };
+
+                       gpiob: gpio@50003000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 16 16>;
+                       };
+
+                       gpioc: gpio@50004000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 32 16>;
+                       };
+
+                       gpiod: gpio@50005000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 48 16>;
+                       };
+
+                       gpioe: gpio@50006000 {
+                               status = "okay";
+                               ngpios = <16>;
+                               gpio-ranges = <&pinctrl 0 64 16>;
+                       };
+
+                       gpiof: gpio@50007000 {
+                               status = "okay";
+                               ngpios = <6>;
+                               gpio-ranges = <&pinctrl 6 86 6>;
+                       };
+
+                       gpiog: gpio@50008000 {
+                               status = "okay";
+                               ngpios = <10>;
+                               gpio-ranges = <&pinctrl 6 102 10>;
+                       };
+
+                       gpioh: gpio@50009000 {
+                               status = "okay";
+                               ngpios = <2>;
+                               gpio-ranges = <&pinctrl 0 112 2>;
+                       };
+               };
+       };
+};
index d003b895a696eae5b4f5a88f5cfc81e2ef1f78e7..4c20d731a9c69a7d2f30d88ab29532e82f6762c5 100644 (file)
        };
 
        pcf8563: rtc@51 {
-               compatible = "phg,pcf8563";
+               compatible = "nxp,pcf8563";
                reg = <0x51>;
        };
 };
index c04efad81bbc9eb05135e6b84b7c786684b7ebf8..dcddc3392460ff5874523b6cb19c2be4dac657d0 100644 (file)
                        #clock-cells = <0>;
                        compatible = "fixed-clock";
                        clock-frequency = <24000000>;
+                       clock-accuracy = <50000>;
                        clock-output-names = "osc24M";
                };
 
                        #clock-cells = <0>;
                        compatible = "fixed-clock";
                        clock-frequency = <32768>;
-                       clock-output-names = "osc32k";
+                       clock-accuracy = <50000>;
+                       clock-output-names = "ext_osc32k";
                };
 
                /*
                ccu: clock@1c20000 {
                        compatible = "allwinner,sun6i-a31-ccu";
                        reg = <0x01c20000 0x400>;
-                       clocks = <&osc24M>, <&osc32k>;
+                       clocks = <&osc24M>, <&rtc 0>;
                        clock-names = "hosc", "losc";
                        #clock-cells = <1>;
                        #reset-cells = <1>;
                                     <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&ccu CLK_APB1_PIO>, <&osc24M>, <&osc32k>;
+                       clocks = <&ccu CLK_APB1_PIO>, <&osc24M>, <&rtc 0>;
                        clock-names = "apb", "hosc", "losc";
                        gpio-controller;
                        interrupt-controller;
                        dma-names = "rx", "tx";
                        resets = <&ccu RST_AHB1_SPI0>;
                        status = "disabled";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
                };
 
                spi1: spi@1c69000 {
                        dma-names = "rx", "tx";
                        resets = <&ccu RST_AHB1_SPI1>;
                        status = "disabled";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
                };
 
                spi2: spi@1c6a000 {
                        dma-names = "rx", "tx";
                        resets = <&ccu RST_AHB1_SPI2>;
                        status = "disabled";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
                };
 
                spi3: spi@1c6b000 {
                        dma-names = "rx", "tx";
                        resets = <&ccu RST_AHB1_SPI3>;
                        status = "disabled";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
                };
 
                gic: interrupt-controller@1c81000 {
                };
 
                rtc: rtc@1f00000 {
+                       #clock-cells = <1>;
                        compatible = "allwinner,sun6i-a31-rtc";
                        reg = <0x01f00000 0x54>;
                        interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&osc32k>;
+                       clock-output-names = "osc32k";
                };
 
                nmi_intc: interrupt-controller@1f00c00 {
                        ar100: ar100_clk {
                                compatible = "allwinner,sun6i-a31-ar100-clk";
                                #clock-cells = <0>;
-                               clocks = <&osc32k>, <&osc24M>,
+                               clocks = <&rtc 0>, <&osc24M>,
                                         <&ccu CLK_PLL_PERIPH>,
                                         <&ccu CLK_PLL_PERIPH>;
                                clock-output-names = "ar100";
                        ir_clk: ir_clk {
                                #clock-cells = <0>;
                                compatible = "allwinner,sun4i-a10-mod0-clk";
-                               clocks = <&osc32k>, <&osc24M>;
+                               clocks = <&rtc 0>, <&osc24M>;
                                clock-output-names = "ir";
                        };
 
                        reg = <0x01f02c00 0x400>;
                        interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&apb0_gates 0>, <&osc24M>, <&osc32k>;
+                       clocks = <&apb0_gates 0>, <&osc24M>, <&rtc 0>;
                        clock-names = "apb", "hosc", "losc";
                        resets = <&apb0_rst 0>;
                        gpio-controller;
index 949494730aee9cfba54624b0cd6b7985481dcef8..7449aac3f43b70d46862c9d6ee055c62da0ffc6a 100644 (file)
@@ -49,7 +49,8 @@
 
 / {
        model = "ICnova-A20 SWAC";
-       compatible = "swac,icnova-a20-swac", "incircuit,icnova-a20", "allwinner,sun7i-a20";
+       compatible = "incircuit,icnova-a20-swac", "incircuit,icnova-a20",
+                    "allwinner,sun7i-a20";
 
        aliases {
                serial0 = &uart0;
index 95c6f8949076842882ebafd9ad0aad0cdfb92383..56f451c07f9376b397497f45fa2a0a04309cc82a 100644 (file)
 
 #include "axp209.dtsi"
 
+&ac_power_supply {
+       status = "okay";
+};
+
+&battery_power_supply {
+       status = "okay";
+};
+
 &reg_dcdc2 {
        regulator-always-on;
        regulator-min-microvolt = <1000000>;
index 66d078053d5fbbe1cba08f16a55a67fd9a46f29b..568b90ece34273c147b9a177cf6965335ebc922f 100644 (file)
        vref-supply = <&reg_aldo2>;
        status = "okay";
 
-       button@210 {
+       button-210 {
                label = "Volume Up";
                linux,code = <KEY_VOLUMEUP>;
                channel = <0>;
                voltage = <210000>;
        };
 
-       button@410 {
+       button-410 {
                label = "Volume Down";
                linux,code = <KEY_VOLUMEDOWN>;
                channel = <0>;
index 392b0cabbf0d34621965fb3021a70b062dcb3c76..ada6d08bc5404484780bafe9a0dc6ef2c3579f4a 100644 (file)
                        #interrupt-cells = <3>;
                        #gpio-cells = <3>;
 
+                       /omit-if-no-ref/
+                       csi_8bit_parallel_pins: csi-8bit-parallel-pins {
+                               pins = "PE0", "PE2", "PE3", "PE6", "PE7",
+                                      "PE8", "PE9", "PE10", "PE11",
+                                      "PE12", "PE13";
+                               function = "csi";
+                       };
+
+                       /omit-if-no-ref/
+                       csi_mclk_pin: csi-mclk-pin {
+                               pins = "PE1";
+                               function = "csi";
+                       };
+
                        emac_rgmii_pins: emac-rgmii-pins {
                                pins = "PD2", "PD3", "PD4", "PD5", "PD6", "PD7",
                                       "PD11", "PD12", "PD13", "PD14", "PD18",
                        interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(8) | IRQ_TYPE_LEVEL_HIGH)>;
                };
 
+               csi: camera@1cb0000 {
+                       compatible = "allwinner,sun8i-a83t-csi";
+                       reg = <0x01cb0000 0x1000>;
+                       interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_CSI>,
+                                <&ccu CLK_CSI_SCLK>,
+                                <&ccu CLK_DRAM_CSI>;
+                       clock-names = "bus", "mod", "ram";
+                       resets = <&ccu RST_BUS_CSI>;
+                       status = "disabled";
+
+                       csi_in: port {
+                       };
+               };
+
                hdmi: hdmi@1ee0000 {
                        compatible = "allwinner,sun8i-a83t-dw-hdmi";
                        reg = <0x01ee0000 0x10000>;
index 78a37a47185a0930a1fcf77ab7d62a47f432aaf2..d277d043031b230f9de1e3f22da70ba7c69db760 100644 (file)
@@ -59,8 +59,7 @@
                gpios = <&r_pio 0 1 GPIO_ACTIVE_HIGH>; /* PL1 */
                enable-active-high;
                gpios-states = <0x1>;
-               states = <1100000 0x0
-                         1300000 0x1>;
+               states = <1100000 0>, <1300000 1>;
        };
 
        wifi_pwrseq: wifi_pwrseq {
index 4970eda2877e1174df30d08b221b8f0758afd4f0..f19ed981da9d92d4b842fcb799bb1681d173e266 100644 (file)
                gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
                enable-active-high;
                gpios-states = <1>;
-               states = <1100000 0
-                         1300000 1>;
+               states = <1100000 0>, <1300000 1>;
        };
 
        wifi_pwrseq: wifi_pwrseq {
index 6277f13f3eb32ec3a5878fa5f7cc69287815fce5..ac9e26b1d90620ad4cba5feec13f6619e9b3b05e 100644 (file)
@@ -90,6 +90,8 @@
        wifi_pwrseq: wifi_pwrseq {
                compatible = "mmc-pwrseq-simple";
                reset-gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>; /* PL7 */
+               clocks = <&rtc 1>;
+               clock-names = "ext_clock";
        };
 
        sound_spdif {
 
 &mmc1 {
        vmmc-supply = <&reg_vcc3v3>;
+       vqmmc-supply = <&reg_vcc3v3>;
+       mmc-pwrseq = <&wifi_pwrseq>;
        bus-width = <4>;
        non-removable;
        status = "okay";
index 840849169bed6ac625c0d75afa0c8c2855591001..4759ba3f2986e031d4eb21669cd33cad1134d3bd 100644 (file)
                gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
                enable-active-high;
                gpios-states = <0x1>;
-               states = <1100000 0x0
-                         1300000 0x1>;
+               states = <1100000 0>, <1300000 1>;
        };
 };
 
index c488aaacbd68b087d2dec9e936e13d40d6a8458a..42d62d1ba1dc7d752282933767ecfef064421850 100644 (file)
 &pio {
        pinctrl-names = "default";
        pinctrl-0 = <&clk_out_a_pin>;
+       vcc-pa-supply = <&reg_aldo2>;
+       vcc-pc-supply = <&reg_dcdc1>;
+       vcc-pd-supply = <&reg_dcdc1>;
+       vcc-pe-supply = <&reg_eldo1>;
+       vcc-pf-supply = <&reg_dcdc1>;
+       vcc-pg-supply = <&reg_dldo1>;
 };
 
 &reg_aldo2 {
-       regulator-always-on;
        regulator-min-microvolt = <2500000>;
        regulator-max-microvolt = <2500000>;
        regulator-name = "vcc-pa";
index bb856e53b806bfc261ef2838758872721115ceb7..6007d0cc252d3a05aeff9ab9b340781c6d99d794 100644 (file)
                };
 
                rtc: rtc@1c20400 {
-                       compatible = "allwinner,sun8i-r40-rtc",
-                                    "allwinner,sun8i-h3-rtc";
+                       compatible = "allwinner,sun8i-r40-rtc";
                        reg = <0x01c20400 0x400>;
                        interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
                        clock-output-names = "osc32k", "osc32k-out";
index df72b1719c341241b9170fd7c763e9c1dbfe67f9..d7aef128acb37d53035b5857fba3f3d845fe10dc 100644 (file)
@@ -84,6 +84,7 @@
                        #clock-cells = <0>;
                        compatible = "fixed-clock";
                        clock-frequency = <24000000>;
+                       clock-accuracy = <50000>;
                        clock-output-names = "osc24M";
                };
 
@@ -91,7 +92,8 @@
                        #clock-cells = <0>;
                        compatible = "fixed-clock";
                        clock-frequency = <32768>;
-                       clock-output-names = "osc32k";
+                       clock-accuracy = <50000>;
+                       clock-output-names = "ext-osc32k";
                };
        };
 
                ccu: clock@1c20000 {
                        compatible = "allwinner,sun8i-v3s-ccu";
                        reg = <0x01c20000 0x400>;
-                       clocks = <&osc24M>, <&osc32k>;
+                       clocks = <&osc24M>, <&rtc 0>;
                        clock-names = "hosc", "losc";
                        #clock-cells = <1>;
                        #reset-cells = <1>;
                };
 
                rtc: rtc@1c20400 {
-                       compatible = "allwinner,sun6i-a31-rtc";
+                       #clock-cells = <1>;
+                       compatible = "allwinner,sun8i-v3-rtc";
                        reg = <0x01c20400 0x54>;
                        interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&osc32k>;
+                       clock-output-names = "osc32k", "osc32k-out";
                };
 
                pio: pinctrl@1c20800 {
                        reg = <0x01c20800 0x400>;
                        interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&ccu CLK_BUS_PIO>, <&osc24M>, <&osc32k>;
+                       clocks = <&ccu CLK_BUS_PIO>, <&osc24M>, <&rtc 0>;
                        clock-names = "apb", "hosc", "losc";
                        gpio-controller;
                        #gpio-cells = <3>;
index f05cabd34b8e397f1b97f9f90ed0bb3ad98b48f4..15c22b06fc4b630ff05ffe806eb68a9a983600c8 100644 (file)
@@ -50,6 +50,7 @@
        compatible = "sinovoip,bpi-m2-berry", "allwinner,sun8i-r40";
 
        aliases {
+               ethernet0 = &gmac;
                serial0 = &uart0;
        };
 
                stdout-path = "serial0:115200n8";
        };
 
+       connector {
+               compatible = "hdmi-connector";
+               type = "a";
+
+               port {
+                       hdmi_con_in: endpoint {
+                               remote-endpoint = <&hdmi_out_con>;
+                       };
+               };
+       };
+
        leds {
                compatible = "gpio-leds";
 
        wifi_pwrseq: wifi_pwrseq {
                compatible = "mmc-pwrseq-simple";
                reset-gpios = <&pio 6 10 GPIO_ACTIVE_LOW>; /* PG10 WIFI_EN */
+               clocks = <&ccu CLK_OUTA>;
+               clock-names = "ext_clock";
        };
 };
 
+&ahci {
+       ahci-supply = <&reg_dldo4>;
+       phy-supply = <&reg_eldo3>;
+       status = "okay";
+};
+
+&de {
+       status = "okay";
+};
+
 &ehci1 {
        /* Terminus Tech FE 1.1s 4-port USB 2.0 hub here */
        status = "okay";
 };
 
+&gmac {
+       pinctrl-names = "default";
+       pinctrl-0 = <&gmac_rgmii_pins>;
+       phy-handle = <&phy1>;
+       phy-mode = "rgmii";
+       phy-supply = <&reg_dc1sw>;
+       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>;
+       };
+};
+
 &i2c0 {
        status = "okay";
 
        status = "okay";
 };
 
+&pio {
+       pinctrl-names = "default";
+       pinctrl-0 = <&clk_out_a_pin>;
+       vcc-pa-supply = <&reg_aldo2>;
+       vcc-pc-supply = <&reg_dcdc1>;
+       vcc-pd-supply = <&reg_dcdc1>;
+       vcc-pe-supply = <&reg_eldo1>;
+       vcc-pf-supply = <&reg_dcdc1>;
+       vcc-pg-supply = <&reg_dldo1>;
+};
+
+&reg_aldo2 {
+       regulator-min-microvolt = <2500000>;
+       regulator-max-microvolt = <2500000>;
+       regulator-name = "vcc-pa";
+};
+
 &reg_aldo3 {
        regulator-always-on;
        regulator-min-microvolt = <2700000>;
        regulator-name = "avcc";
 };
 
+&reg_dc1sw {
+       regulator-min-microvolt = <3000000>;
+       regulator-max-microvolt = <3000000>;
+       regulator-name = "vcc-gmac-phy";
+};
+
 &reg_dcdc1 {
        regulator-always-on;
        regulator-min-microvolt = <3000000>;
        regulator-name = "vcc-wifi-io";
 };
 
+/*
+ * Our WiFi chip needs both DLDO2 and DLDO3 to be powered at the same
+ * time, with the two being in sync, to be able to meet maximum power
+ * consumption during transmits. Since this is not really supported
+ * right now, just use the two as always on, and we will fix it later.
+ */
+
 &reg_dldo2 {
+       regulator-always-on;
        regulator-min-microvolt = <3300000>;
        regulator-max-microvolt = <3300000>;
        regulator-name = "vcc-wifi";
 };
 
+&reg_dldo3 {
+       regulator-always-on;
+       regulator-min-microvolt = <3300000>;
+       regulator-max-microvolt = <3300000>;
+       regulator-name = "vcc-wifi-2";
+};
+
+&reg_dldo4 {
+       regulator-min-microvolt = <2500000>;
+       regulator-max-microvolt = <2500000>;
+       regulator-name = "vdd2v5-sata";
+};
+
+&reg_eldo3 {
+       regulator-min-microvolt = <1200000>;
+       regulator-max-microvolt = <1200000>;
+       regulator-name = "vdd1v2-sata";
+};
+
+&tcon_tv0 {
+       status = "okay";
+};
+
 &uart0 {
        pinctrl-names = "default";
        pinctrl-0 = <&uart0_pb_pins>;
        status = "okay";
 };
 
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart3_pg_pins>, <&uart3_rts_cts_pg_pins>;
+       uart-has-rtscts;
+       status = "okay";
+
+       bluetooth {
+               compatible = "brcm,bcm43438-bt";
+               clocks = <&ccu CLK_OUTA>;
+               clock-names = "lpo";
+               vbat-supply = <&reg_dldo2>;
+               vddio-supply = <&reg_dldo1>;
+               device-wakeup-gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>; /* PG11 */
+               /* TODO host wake line connected to PMIC GPIO pins */
+               shutdown-gpios = <&pio 7 12 GPIO_ACTIVE_HIGH>; /* PH12 */
+               max-speed = <1500000>;
+       };
+};
+
 &usbphy {
        usb1_vbus-supply = <&reg_vcc5v0>;
        status = "okay";
index 53edd1faee9989d8374bc95823134c0821c48c2d..22466afd38a3a06e714fb7382827091531b34ef9 100644 (file)
@@ -21,8 +21,7 @@
                regulator-ramp-delay = <50>; /* 4ms */
                gpios = <&r_pio 0 1 GPIO_ACTIVE_HIGH>; /* PL1 */
                gpios-states = <0x1>;
-               states = <1100000 0x0
-                         1300000 0x1>;
+               states = <1100000 0>, <1300000 1>;
        };
 };
 
index 3aaca10f6644ab25f739403ae4550105b40763c3..f2d060f403cc05306b9d930ffae65cc4eb199a8e 100644 (file)
@@ -77,4 +77,8 @@
 
 &nand {
        status = "okay";
+
+       nand@0 {
+               reg = <0>;
+       };
 };
index c2706cef0b8a1105ab539f3be9efd18c1dcab1ee..58cd4e8fa5beea9f03d7d8de17a7daa67eeab0ce 100644 (file)
                        status = "disabled";
                        reg-names = "nand_data", "denali_reg";
                        reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
                        interrupts = <0 65 4>;
                        pinctrl-names = "default";
-                       pinctrl-0 = <&pinctrl_nand2cs>;
+                       pinctrl-0 = <&pinctrl_nand>;
                        clock-names = "nand", "nand_x", "ecc";
                        clocks = <&sys_clk 2>, <&sys_clk 3>, <&sys_clk 3>;
                        resets = <&sys_rst 2>;
index 3d9080ee7aef73b5a1642757d5931b5345e698a6..60994b6e8b99946dc27b350aeb13474daab4e62d 100644 (file)
@@ -90,4 +90,8 @@
 
 &nand {
        status = "okay";
+
+       nand@0 {
+               reg = <0>;
+       };
 };
index 28038b17bbb3a784975ee4a5add93478ee1752a1..854f2eba3e72ef173597423b772b3d1306c8bebd 100644 (file)
@@ -98,4 +98,8 @@
 
 &nand {
        status = "okay";
+
+       nand@0 {
+               reg = <0>;
+       };
 };
index 97d051ef4968abfa28d1575348b8a12c42bc1d78..7f64e5a616d6bb687e0c5a44131baab708492c31 100644 (file)
                        status = "disabled";
                        reg-names = "nand_data", "denali_reg";
                        reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
                        interrupts = <0 65 4>;
                        pinctrl-names = "default";
                        pinctrl-0 = <&pinctrl_nand>;
index 3657387394126b802de7e2eb918f609de4585960..eff74717b37c6ce29e8ffb0570ebfc3bb834e1de 100644 (file)
                        status = "disabled";
                        reg-names = "nand_data", "denali_reg";
                        reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
                        interrupts = <0 65 4>;
                        pinctrl-names = "default";
-                       pinctrl-0 = <&pinctrl_nand2cs>;
+                       pinctrl-0 = <&pinctrl_nand>;
                        clock-names = "nand", "nand_x", "ecc";
                        clocks = <&sys_clk 2>, <&sys_clk 3>, <&sys_clk 3>;
                        resets = <&sys_rst 2>;
index 06a049f6edf8082549180d887f767c4a8eb4a838..4eddbb8d7fcac0a1ea8915b8553d5450ab767fb5 100644 (file)
                        status = "disabled";
                        reg-names = "nand_data", "denali_reg";
                        reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
                        interrupts = <0 65 4>;
                        pinctrl-names = "default";
-                       pinctrl-0 = <&pinctrl_nand2cs>;
+                       pinctrl-0 = <&pinctrl_nand>;
                        clock-names = "nand", "nand_x", "ecc";
                        clocks = <&sys_clk 2>, <&sys_clk 3>, <&sys_clk 3>;
                        resets = <&sys_rst 2>;
index 01bf94c6b93aeabacb954fbcf1dd1efdf02b313b..cf9ea0b1506522701f967e929a7a8e0e4aed9f1e 100644 (file)
@@ -81,4 +81,8 @@
 
 &nand {
        status = "okay";
+
+       nand@0 {
+               reg = <0>;
+       };
 };
index efce02768b6fb5b44798ca291f1c5d699a7e00c4..cbebb6e4c6167ee9b7a0e05f5b7a1e0e1a55a361 100644 (file)
                        status = "disabled";
                        reg-names = "nand_data", "denali_reg";
                        reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
                        interrupts = <0 65 4>;
                        pinctrl-names = "default";
-                       pinctrl-0 = <&pinctrl_nand2cs>;
+                       pinctrl-0 = <&pinctrl_nand>;
                        clock-names = "nand", "nand_x", "ecc";
                        clocks = <&sys_clk 2>, <&sys_clk 3>, <&sys_clk 3>;
                        resets = <&sys_rst 2>;
index 269e6bf99ccb39d287298e28227f9349a430dcdf..37bd41ff8dffa9c060c2180bf568dd766667dca4 100644 (file)
                compatible = "arm,versatile-flash", "cfi-flash";
                reg = <0x34000000 0x04000000>;
                bank-width = <4>;
+               partitions {
+                       compatible = "arm,arm-firmware-suite";
+               };
        };
 
        i2c0: i2c@10002000 {
index d3963e9eaf4881e959e73911b8cdffd380789742..d6a1fc269241e5c3e0c925f01a0298fa71a2e87e 100644 (file)
                        #interrupt-cells = <1>;
                        ranges;
 
-                       flash@0,00000000 {
+                       nor_flash: flash@0,00000000 {
                                compatible = "arm,vexpress-flash", "cfi-flash";
                                reg = <0 0x00000000 0x04000000>,
                                      <4 0x00000000 0x04000000>;
                                bank-width = <4>;
+                               partitions {
+                                       compatible = "arm,arm-firmware-suite";
+                               };
                        };
 
                        psram@1,00000000 {
index 798c97aff7fa3b996ca928ee82e56b823f90cfb8..8e57e15307e20a623abb1855b3df206af325db84 100644 (file)
@@ -35,6 +35,9 @@
                                reg = <0 0x00000000 0x04000000>,
                                      <1 0x00000000 0x04000000>;
                                bank-width = <4>;
+                               partitions {
+                                       compatible = "arm,arm-firmware-suite";
+                               };
                        };
 
                        psram@2,00000000 {
index 00cd9f5bef2ec06d3d5fa652a5b99020831b76db..1de0a658adf124c4cc7c25ca3eb20096477848d1 100644 (file)
                /* non-configurable replicators don't show up on the
                 * AMBA bus.  As such no need to add "arm,primecell".
                 */
-               compatible = "arm,coresight-replicator";
+               compatible = "arm,coresight-static-replicator";
 
                out-ports {
                        #address-cells = <1>;
        };
 
        funnel@20040000 {
-               compatible = "arm,coresight-funnel", "arm,primecell";
+               compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                reg = <0 0x20040000 0 0x1000>;
 
                clocks = <&oscclk6a>;
                                <0 3 &gic 0 39 4>;
        };
 };
+
+&nor_flash {
+       /*
+        * Unfortunately, accessing the flash disturbs the CPU idle states
+        * (suspend) and CPU hotplug of this platform. For this reason, flash
+        * hardware access is disabled by default on this platform alone.
+        */
+       status = "disabled";
+};
index 0507e6dcbb216a9f46a8735dc768e5b8aa7e9900..a1b4ccee2a10fbf5923cf86d1e52f9e7daf516d0 100644 (file)
        status = "okay";
 };
 
+&qspi0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_qspi0>;
+       status = "okay";
+
+       /*
+        * Attached MT25QL02 can go up to 90Mhz in DTR and 166 in STR
+        * modes, so, spi-max-frequency is limited to 90MHz
+        */
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               spi-max-frequency = <90000000>;
+               spi-rx-bus-width = <4>;
+               reg = <0>;
+               m25p,fast-read;
+       };
+
+       flash@2 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               spi-max-frequency = <90000000>;
+               spi-rx-bus-width = <4>;
+               reg = <2>;
+               m25p,fast-read;
+       };
+};
+
 &uart0 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_uart0>;
 
        pinctrl_qspi0: qspi0grp {
                fsl,pins = <
-                       VF610_PAD_PTD7__QSPI0_B_QSCK    0x31c3
-                       VF610_PAD_PTD8__QSPI0_B_CS0     0x31ff
-                       VF610_PAD_PTD9__QSPI0_B_DATA3   0x31c3
-                       VF610_PAD_PTD10__QSPI0_B_DATA2  0x31c3
-                       VF610_PAD_PTD11__QSPI0_B_DATA1  0x31c3
-                       VF610_PAD_PTD12__QSPI0_B_DATA0  0x31c3
+                       VF610_PAD_PTD0__QSPI0_A_QSCK    0x38c2
+                       VF610_PAD_PTD1__QSPI0_A_CS0     0x38c2
+                       VF610_PAD_PTD2__QSPI0_A_DATA3   0x38c3
+                       VF610_PAD_PTD3__QSPI0_A_DATA2   0x38c3
+                       VF610_PAD_PTD4__QSPI0_A_DATA1   0x38c3
+                       VF610_PAD_PTD5__QSPI0_A_DATA0   0x38c3
+                       VF610_PAD_PTD7__QSPI0_B_QSCK    0x38c2
+                       VF610_PAD_PTD8__QSPI0_B_CS0     0x38c2
+                       VF610_PAD_PTD9__QSPI0_B_DATA3   0x38c3
+                       VF610_PAD_PTD10__QSPI0_B_DATA2  0x38c3
+                       VF610_PAD_PTD11__QSPI0_B_DATA1  0x38c3
+                       VF610_PAD_PTD12__QSPI0_B_DATA0  0x38c3
                >;
        };
 
 
        pinctrl_uart2: uart2grp {
                fsl,pins = <
-                       VF610_PAD_PTD0__UART2_TX        0x21a2
-                       VF610_PAD_PTD1__UART2_RX        0x21a1
+                       VF610_PAD_PTD23__UART2_TX       0x21a2
+                       VF610_PAD_PTD22__UART2_RX       0x21a1
                >;
        };
 
index d04ee19e5b751e7dd4649425ccbc9cdc8ea1ed5e..bcb8bda09158cc398439118e04027359de9cb982 100644 (file)
@@ -30,7 +30,6 @@ CONFIG_INET=y
 CONFIG_IP_PNP=y
 CONFIG_IP_PNP_DHCP=y
 # CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_BLOCK=y
 CONFIG_MTD_CFI=y
index 25c593df41d1384536547e0efb19b1e98f168059..e802cdebfd0be35ac251d5550896c17c5deba0bf 100644 (file)
@@ -25,7 +25,6 @@ CONFIG_INET=y
 # CONFIG_INET_XFRM_MODE_TUNNEL is not set
 # CONFIG_INET_XFRM_MODE_BEET is not set
 # CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_BLOCK=y
 CONFIG_MTD_CFI=y
index 8c9b6ea46188f71abe93c1546a16990b505c3619..622436f44783461ebd145d2879d2b5a45ffeb343 100644 (file)
@@ -37,7 +37,6 @@ CONFIG_BT_RFCOMM_TTY=y
 CONFIG_BT_BNEP=m
 CONFIG_BT_HCIUART=m
 CONFIG_BT_HCIUART_H4=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_BLOCK=y
 CONFIG_MTD_CFI=y
index 190d6e9d3296e320acc064d8fd433ec62f0a64fd..019828d7b25178d6e289303da103c176b2ad777a 100644 (file)
@@ -64,7 +64,6 @@ CONFIG_VLAN_8021Q=y
 CONFIG_NET_NCSI=y
 CONFIG_BPF_STREAM_PARSER=y
 # CONFIG_WIRELESS is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 # CONFIG_PREVENT_FIRMWARE_BUILD is not set
@@ -78,8 +77,6 @@ CONFIG_MTD_UBI=y
 CONFIG_MTD_UBI_FASTMAP=y
 CONFIG_MTD_UBI_BLOCK=y
 CONFIG_BLK_DEV_LOOP=y
-CONFIG_ASPEED_LPC_CTRL=y
-CONFIG_ASPEED_LPC_SNOOP=y
 CONFIG_EEPROM_AT24=y
 CONFIG_NETDEVICES=y
 CONFIG_NETCONSOLE=y
@@ -169,6 +166,10 @@ CONFIG_SENSORS_UCD9200=y
 CONFIG_SENSORS_TMP421=y
 CONFIG_SENSORS_W83773G=y
 CONFIG_WATCHDOG_SYSFS=y
+CONFIG_MEDIA_SUPPORT=y
+CONFIG_MEDIA_CAMERA_SUPPORT=y
+CONFIG_V4L_PLATFORM_DRIVERS=y
+CONFIG_VIDEO_ASPEED=y
 CONFIG_DRM=y
 CONFIG_USB=y
 CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
@@ -207,8 +208,12 @@ CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_DS1307=y
 CONFIG_RTC_DRV_PCF8523=y
 CONFIG_RTC_DRV_RV8803=y
+CONFIG_RTC_DRV_ASPEED=y
 # CONFIG_VIRTIO_MENU is not set
 # CONFIG_IOMMU_SUPPORT is not set
+CONFIG_ASPEED_LPC_CTRL=y
+CONFIG_ASPEED_LPC_SNOOP=y
+CONFIG_ASPEED_P2A_CTRL=y
 CONFIG_IIO=y
 CONFIG_ASPEED_ADC=y
 CONFIG_MAX1363=y
index 407ffb7655a80019aa392c4c889415414877aaec..28fe392c7dfa52318162c21fc000fcb37b2620ad 100644 (file)
@@ -64,7 +64,6 @@ CONFIG_VLAN_8021Q=y
 CONFIG_NET_NCSI=y
 CONFIG_BPF_STREAM_PARSER=y
 # CONFIG_WIRELESS is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 # CONFIG_PREVENT_FIRMWARE_BUILD is not set
@@ -78,8 +77,6 @@ CONFIG_MTD_UBI=y
 CONFIG_MTD_UBI_FASTMAP=y
 CONFIG_MTD_UBI_BLOCK=y
 CONFIG_BLK_DEV_LOOP=y
-CONFIG_ASPEED_LPC_CTRL=y
-CONFIG_ASPEED_LPC_SNOOP=y
 CONFIG_EEPROM_AT24=y
 CONFIG_NETDEVICES=y
 CONFIG_NETCONSOLE=y
@@ -169,7 +166,12 @@ CONFIG_SENSORS_UCD9200=y
 CONFIG_SENSORS_TMP421=y
 CONFIG_SENSORS_W83773G=y
 CONFIG_WATCHDOG_SYSFS=y
+CONFIG_MEDIA_SUPPORT=y
+CONFIG_MEDIA_CAMERA_SUPPORT=y
+CONFIG_V4L_PLATFORM_DRIVERS=y
+CONFIG_VIDEO_ASPEED=y
 CONFIG_DRM=y
+CONFIG_DRM_ASPEED_GFX=y
 CONFIG_USB=y
 CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
 CONFIG_USB_DYNAMIC_MINORS=y
@@ -203,16 +205,23 @@ CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGER_TIMER=y
 CONFIG_LEDS_TRIGGER_HEARTBEAT=y
 CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
+CONFIG_EDAC=y
+CONFIG_EDAC_ASPEED=y
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_DS1307=y
 CONFIG_RTC_DRV_PCF8523=y
 CONFIG_RTC_DRV_RV8803=y
+CONFIG_RTC_DRV_ASPEED=y
 # CONFIG_VIRTIO_MENU is not set
 # CONFIG_IOMMU_SUPPORT is not set
+CONFIG_ASPEED_LPC_CTRL=y
+CONFIG_ASPEED_LPC_SNOOP=y
+CONFIG_ASPEED_P2A_CTRL=y
 CONFIG_IIO=y
 CONFIG_ASPEED_ADC=y
 CONFIG_MAX1363=y
 CONFIG_BMP280=y
+CONFIG_RAS=y
 CONFIG_FSI=y
 CONFIG_FSI_MASTER_GPIO=y
 CONFIG_FSI_MASTER_HUB=y
index a88e314498800cbbaeea5a3d4969cf2b77519c93..309c55a8d107dfe2debeed3ad73a7b6b48893a14 100644 (file)
@@ -46,7 +46,6 @@ CONFIG_IP_PNP_RARP=y
 CONFIG_IPV6_SIT_6RD=y
 CONFIG_CFG80211=y
 CONFIG_MAC80211=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 # CONFIG_STANDALONE is not set
index 53864316bee18ce384c16e313897795c2c7e513c..31bfe1647d280cd4d1367efd2e8aa1725132e667 100644 (file)
@@ -78,7 +78,6 @@ CONFIG_INET_IPCOMP=y
 CONFIG_NETWORK_PHY_TIMESTAMPING=y
 CONFIG_BRIDGE=y
 # CONFIG_WIRELESS is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_MTD=y
index 5344434df6520d7d8d6d7275f7f3257f4daf2177..fa997ae2673ef3ad61a1351ff28336f2144ec89e 100644 (file)
@@ -45,7 +45,6 @@ CONFIG_BT_RFCOMM=m
 CONFIG_BT_BNEP=m
 CONFIG_BT_HIDP=m
 CONFIG_LIB80211=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_FW_LOADER=m
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
@@ -103,7 +102,6 @@ CONFIG_FB=y
 CONFIG_FB_PXA=y
 CONFIG_FB_PXA_PARAMETERS=y
 CONFIG_FB_MBX=m
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_LCD_CLASS_DEVICE is not set
 # CONFIG_BACKLIGHT_CLASS_DEVICE is not set
 # CONFIG_VGA_CONSOLE is not set
index 3707a014cbc466b746de28f15d113fcd551f7a1e..2f7acde2d921800f7f9ce31c3145622f8efb36e9 100644 (file)
@@ -45,7 +45,6 @@ CONFIG_BT_BNEP_PROTO_FILTER=y
 CONFIG_BT_HIDP=m
 CONFIG_BT_HCIBTUSB=m
 CONFIG_LIB80211=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_BLOCK=y
 CONFIG_MTD_RAW_NAND=y
@@ -86,7 +85,6 @@ CONFIG_REGULATOR=y
 CONFIG_REGULATOR_DA903X=y
 CONFIG_FB=y
 CONFIG_FB_PXA=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_LCD_TDO24M=y
 # CONFIG_BACKLIGHT_GENERIC is not set
index 419b73564f294b375bbd27bcd60dc667d3b2df67..89df0a55a0655924a5b099906c6a67d1b3eee1b8 100644 (file)
@@ -27,7 +27,6 @@ CONFIG_AEABI=y
 CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
 CONFIG_CMDLINE="console=ttyS0,38400 mem=128M root=/dev/mmcblk0p1 ro rootwait"
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_BLOCK=y
index 8d484e4d51cc05f1d17888c83163c3aa244f7759..52bad9a544a09405a7373305173f954cbd63e588 100644 (file)
@@ -49,7 +49,6 @@ CONFIG_BT_BNEP_MC_FILTER=y
 CONFIG_BT_BNEP_PROTO_FILTER=y
 CONFIG_BT_HIDP=m
 CONFIG_CFG80211=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_CONNECTOR=y
 CONFIG_MTD=y
 CONFIG_MTD_BLOCK=y
@@ -102,7 +101,6 @@ CONFIG_WATCHDOG=y
 CONFIG_FB=y
 CONFIG_FIRMWARE_EDID=y
 CONFIG_FB_PXA=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 # CONFIG_VGA_CONSOLE is not set
index d282e8b0bf33c1d5cd025c0d715fc99286e126b8..446134c70a335759ef5399c845f6b4621273f0bf 100644 (file)
@@ -14,7 +14,6 @@ CONFIG_IP_MULTICAST=y
 CONFIG_IP_PNP=y
 CONFIG_SYN_COOKIES=y
 CONFIG_IPV6=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_SCSI=y
 CONFIG_BLK_DEV_SD=y
 CONFIG_CHR_DEV_SG=y
@@ -33,7 +32,6 @@ CONFIG_DEBUG_GPIO=y
 # CONFIG_HWMON is not set
 CONFIG_FB=y
 CONFIG_FB_PXA=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_LCD_CLASS_DEVICE is not set
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 # CONFIG_BACKLIGHT_GENERIC is not set
index d398ae53aba7aa69db2499e2f8fd22f708c7b481..e6df11e906bade8bf8335d035bc74d66231c5a35 100644 (file)
@@ -63,7 +63,6 @@ CONFIG_MCP_UCB1200_TS=y
 CONFIG_FB=y
 CONFIG_FB_MODE_HELPERS=y
 CONFIG_FB_SA1100=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_FRAMEBUFFER_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
index d99725984947130b604776959207a7ee1a8b17a9..e4f6442588e716b14832b2712f9f246e73163ba9 100644 (file)
@@ -81,7 +81,6 @@ CONFIG_BT_HCIBT3C=m
 CONFIG_BT_HCIBLUECARD=m
 CONFIG_BT_HCIBTUART=m
 CONFIG_BT_HCIVHCI=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_BLOCK=y
@@ -132,7 +131,6 @@ CONFIG_SPI=y
 CONFIG_SPI_PXA2XX=y
 CONFIG_FB=y
 CONFIG_FB_W100=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_LCD_CORGI=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
index 4a8cad4d37073d7c2584d3edc961a2fff5b70d96..9a32a8c0f8735a93d36760ee2b8fbd834eb832db 100644 (file)
@@ -45,6 +45,7 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
 CONFIG_CPU_FREQ_GOV_PERFORMANCE=m
 CONFIG_CPU_FREQ_GOV_POWERSAVE=m
 CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPUFREQ_DT=m
 CONFIG_CPU_IDLE=y
 CONFIG_NET=y
 CONFIG_PACKET=y
index 2f01e84b3d8c2d469c285334cbc7c48e0a992250..e70c997d5f4ccb0f85bbd10f4f412c3f7f6d3167 100644 (file)
@@ -31,7 +31,6 @@ CONFIG_IP_PNP=y
 CONFIG_IP_PNP_DHCP=y
 CONFIG_IP_PNP_BOOTP=y
 # CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_MTD=y
index 61228a25ba8d297160a2543463428de362c42616..d08f020147557890bd11c3b1c06f3a929390a2f8 100644 (file)
@@ -41,7 +41,6 @@ CONFIG_BT_BNEP=m
 CONFIG_BT_HIDP=m
 CONFIG_BT_HCIBTUSB=m
 CONFIG_LIB80211=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_FW_LOADER=m
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
@@ -101,7 +100,6 @@ CONFIG_FB=y
 CONFIG_FB_PXA=y
 CONFIG_FB_PXA_PARAMETERS=y
 CONFIG_FB_MBX=m
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_LCD_TDO24M=y
 # CONFIG_BACKLIGHT_GENERIC is not set
index 14889a785f07ca0423f59607f6e60b7235b5332f..ef2d2a820c30b20a76285d9301666542656fb71d 100644 (file)
@@ -50,7 +50,6 @@ CONFIG_IPV6=y
 # CONFIG_INET6_XFRM_MODE_TUNNEL is not set
 # CONFIG_INET6_XFRM_MODE_BEET is not set
 # CONFIG_IPV6_SIT is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 # CONFIG_FW_LOADER is not set
 CONFIG_MTD=y
 CONFIG_MTD_REDBOOT_PARTS=y
index b85575867d21d3dce1699c08d9134b0d8c3f29e1..56452fa03d56782329cd4d7fb257b643b9cf3279 100644 (file)
@@ -40,7 +40,6 @@ CONFIG_CFG80211=m
 CONFIG_MAC80211=m
 CONFIG_MAC80211_RC_PID=y
 # CONFIG_MAC80211_RC_MINSTREL is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 # CONFIG_STANDALONE is not set
 CONFIG_MTD=m
 CONFIG_MTD_RAW_NAND=m
@@ -74,7 +73,6 @@ CONFIG_MFD_TC6393XB=y
 CONFIG_FB=y
 CONFIG_FB_PXA=y
 CONFIG_FB_W100=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 # CONFIG_VGA_CONSOLE is not set
index 9b959afaaa12ad3967e39741bb48be2fda660f0f..2e6a863d25aa0c904b45560200f44af963f877cf 100644 (file)
@@ -1,22 +1,16 @@
 CONFIG_SYSVIPC=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
+CONFIG_PREEMPT=y
 CONFIG_CGROUPS=y
 CONFIG_BLK_DEV_INITRD=y
 CONFIG_PERF_EVENTS=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-CONFIG_PARTITION_ADVANCED=y
 CONFIG_ARCH_EXYNOS=y
-CONFIG_ARCH_EXYNOS3=y
 CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND=y
 CONFIG_SMP=y
 CONFIG_BIG_LITTLE=y
 CONFIG_NR_CPUS=8
-CONFIG_PREEMPT=y
-CONFIG_AEABI=y
 CONFIG_HIGHMEM=y
-CONFIG_CMA=y
 CONFIG_SECCOMP=y
 CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
@@ -38,6 +32,16 @@ CONFIG_NEON=y
 CONFIG_KERNEL_MODE_NEON=y
 CONFIG_PM_DEBUG=y
 CONFIG_PM_ADVANCED_DEBUG=y
+CONFIG_ARM_CRYPTO=y
+CONFIG_CRYPTO_SHA1_ARM_NEON=m
+CONFIG_CRYPTO_SHA256_ARM=m
+CONFIG_CRYPTO_SHA512_ARM=m
+CONFIG_CRYPTO_AES_ARM_BS=m
+CONFIG_CRYPTO_CHACHA20_NEON=m
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_CMA=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
@@ -61,10 +65,7 @@ CONFIG_BT_HCIBTSDIO=m
 CONFIG_BT_HCIUART=m
 CONFIG_BT_HCIUART_BCSP=y
 CONFIG_BT_HCIUART_ATH3K=y
-CONFIG_BT_HCIUART_3WIRE=y
 CONFIG_BT_HCIUART_INTEL=y
-CONFIG_BT_HCIUART_BCM=y
-CONFIG_BT_HCIUART_QCA=y
 CONFIG_BT_HCIUART_AG6XX=y
 CONFIG_BT_HCIUART_MRVL=y
 CONFIG_BT_HCIBCM203X=m
@@ -87,8 +88,6 @@ CONFIG_NFC_SHDLC=y
 CONFIG_NFC_S3FWRN5_I2C=y
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
-CONFIG_DMA_CMA=y
-CONFIG_CMA_SIZE_MBYTES=96
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_CRYPTOLOOP=y
 CONFIG_BLK_DEV_RAM=y
@@ -156,8 +155,6 @@ CONFIG_THERMAL_EMULATION=y
 CONFIG_WATCHDOG=y
 CONFIG_S3C2410_WATCHDOG=y
 CONFIG_MFD_CROS_EC=y
-CONFIG_CROS_EC_I2C=y
-CONFIG_CROS_EC_SPI=y
 CONFIG_MFD_MAX14577=y
 CONFIG_MFD_MAX77686=y
 CONFIG_MFD_MAX77693=y
@@ -216,6 +213,8 @@ CONFIG_DRM_NXP_PTN3460=y
 CONFIG_DRM_PARADE_PS8622=y
 CONFIG_DRM_SII9234=y
 CONFIG_DRM_TOSHIBA_TC358764=y
+CONFIG_DRM_LIMA=y
+CONFIG_DRM_PANFROST=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_LCD_PLATFORM=y
 CONFIG_BACKLIGHT_PWM=y
@@ -283,16 +282,16 @@ CONFIG_RTC_DRV_S5M=y
 CONFIG_RTC_DRV_S3C=y
 CONFIG_DMADEVICES=y
 CONFIG_PL330_DMA=y
-CONFIG_CROS_EC_CHARDEV=y
+CONFIG_CROS_EC_I2C=y
+CONFIG_CROS_EC_SPI=y
 CONFIG_COMMON_CLK_MAX77686=y
 CONFIG_COMMON_CLK_S2MPS11=y
-CONFIG_PM_DEVFREQ=y
+CONFIG_EXYNOS_IOMMU=y
 CONFIG_DEVFREQ_GOV_PERFORMANCE=y
 CONFIG_DEVFREQ_GOV_POWERSAVE=y
 CONFIG_DEVFREQ_GOV_USERSPACE=y
 CONFIG_ARM_EXYNOS_BUS_DEVFREQ=y
 CONFIG_DEVFREQ_EVENT_EXYNOS_NOCP=y
-CONFIG_EXYNOS_IOMMU=y
 CONFIG_EXTCON=y
 CONFIG_EXTCON_MAX14577=y
 CONFIG_EXTCON_MAX77693=y
@@ -320,21 +319,9 @@ CONFIG_NLS_CODEPAGE_437=y
 CONFIG_NLS_ASCII=y
 CONFIG_NLS_ISO8859_1=y
 CONFIG_NLS_UTF8=y
-CONFIG_PRINTK_TIME=y
-CONFIG_DYNAMIC_DEBUG=y
-CONFIG_DEBUG_INFO=y
-CONFIG_DEBUG_FS=y
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_SOFTLOCKUP_DETECTOR=y
-# CONFIG_DETECT_HUNG_TASK is not set
-CONFIG_PROVE_LOCKING=y
-CONFIG_DEBUG_ATOMIC_SLEEP=y
-CONFIG_DEBUG_USER=y
-CONFIG_CRYPTO_RSA=m
-CONFIG_CRYPTO_DH=m
 CONFIG_CRYPTO_USER=m
 CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_DH=m
 CONFIG_CRYPTO_LRW=m
 CONFIG_CRYPTO_XTS=m
 CONFIG_CRYPTO_MD5=m
@@ -349,12 +336,18 @@ CONFIG_CRYPTO_USER_API_RNG=m
 CONFIG_CRYPTO_USER_API_AEAD=m
 CONFIG_CRYPTO_DEV_EXYNOS_RNG=y
 CONFIG_CRYPTO_DEV_S5P=y
-CONFIG_ARM_CRYPTO=y
-CONFIG_CRYPTO_SHA1_ARM_NEON=m
-CONFIG_CRYPTO_SHA256_ARM=m
-CONFIG_CRYPTO_SHA512_ARM=m
-CONFIG_CRYPTO_AES_ARM_BS=m
-CONFIG_CRYPTO_CHACHA20_NEON=m
 CONFIG_CRC_CCITT=y
+CONFIG_DMA_CMA=y
+CONFIG_CMA_SIZE_MBYTES=96
 CONFIG_FONTS=y
 CONFIG_FONT_7x14=y
+CONFIG_PRINTK_TIME=y
+CONFIG_DYNAMIC_DEBUG=y
+CONFIG_DEBUG_INFO=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_KERNEL=y
+CONFIG_SOFTLOCKUP_DETECTOR=y
+# CONFIG_DETECT_HUNG_TASK is not set
+CONFIG_PROVE_LOCKING=y
+CONFIG_DEBUG_ATOMIC_SLEEP=y
+CONFIG_DEBUG_USER=y
index e3afca5bd9d6d7c87b9a990e15b04e61b8da46f8..4e28771beecdb7d53aaf74953b03202ed955b503 100644 (file)
@@ -160,7 +160,6 @@ CONFIG_BT_HCIVHCI=m
 CONFIG_BT_MRVL=m
 CONFIG_BT_MRVL_SDIO=m
 # CONFIG_WIRELESS is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_FW_LOADER=m
 CONFIG_CONNECTOR=m
 CONFIG_MTD=y
@@ -247,7 +246,6 @@ CONFIG_FB=y
 CONFIG_FB_PXA=y
 CONFIG_FB_PXA_OVERLAY=y
 CONFIG_FB_PXA_PARAMETERS=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_LCD_CLASS_DEVICE is not set
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_PWM=y
index ef9aae89907d49ee206d9427308ae8598dd752dc..f012e81a2fe45e34d9cb5eca7a9636ed91378d1e 100644 (file)
@@ -22,7 +22,6 @@ CONFIG_PM=y
 CONFIG_NET=y
 CONFIG_UNIX=y
 CONFIG_INET=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_MTD=y
 CONFIG_MTD_BLOCK=y
index 175881b7da7c50dcaef8f93c6a83b2ac44cb66c2..4d91e41cb628bf0982f9245bdba2a74dff1b053a 100644 (file)
@@ -25,7 +25,6 @@ CONFIG_IRLAN=m
 CONFIG_IRNET=m
 CONFIG_IRCOMM=m
 # CONFIG_WIRELESS is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_REDBOOT_PARTS=y
 CONFIG_MTD_BLOCK=y
index e90d1dfeb18814f471ce2b097437317a60492338..3946c608732724b01d79d2dd97a41e5fbb8b27df 100644 (file)
@@ -32,7 +32,6 @@ CONFIG_IP_PNP=y
 # CONFIG_INET_XFRM_MODE_BEET is not set
 # CONFIG_INET_DIAG is not set
 # CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_BLOCK=y
 CONFIG_MTD_CFI=y
index 9b779e13e05df7979ef74dc83b022df24d3c1869..770469f61c3e44bc92de074577ba20e3521c4be8 100644 (file)
@@ -138,7 +138,6 @@ CONFIG_BRIDGE=m
 # CONFIG_BRIDGE_IGMP_SNOOPING is not set
 CONFIG_IEEE802154=y
 # CONFIG_WIRELESS is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_FW_LOADER=m
@@ -228,7 +227,6 @@ CONFIG_FB=y
 CONFIG_FB_PXA=y
 CONFIG_FB_PXA_OVERLAY=y
 CONFIG_FB_PXA_PARAMETERS=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_LCD_CLASS_DEVICE is not set
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 # CONFIG_VGA_CONSOLE is not set
index f2cf0722e8e1a41ac049ac406f686279cf43162e..2b2d617e279d4232793e2bf0bb235813ba0e6061 100644 (file)
@@ -47,7 +47,6 @@ CONFIG_IP_PNP_DHCP=y
 # CONFIG_INET_DIAG is not set
 # CONFIG_IPV6 is not set
 CONFIG_NETFILTER=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_IMX_WEIM=y
index 8116648a8efd0240233f1df173e3a5cf51a24b8d..a53b29251ed4404dbafac203037acdb00540e56b 100644 (file)
@@ -57,6 +57,7 @@ CONFIG_CPU_FREQ_GOV_USERSPACE=y
 CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
 CONFIG_CPUFREQ_DT=y
 CONFIG_ARM_IMX6Q_CPUFREQ=y
+CONFIG_ARM_IMX_CPUFREQ_DT=y
 CONFIG_CPU_IDLE=y
 CONFIG_ARM_CPUIDLE=y
 CONFIG_VFP=y
@@ -211,9 +212,11 @@ CONFIG_SPI_GPIO=y
 CONFIG_SPI_IMX=y
 CONFIG_SPI_FSL_DSPI=y
 CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_SIOX=m
 CONFIG_GPIO_MAX732X=y
 CONFIG_GPIO_MC9S08DZ60=y
 CONFIG_GPIO_PCA953X=y
+CONFIG_GPIO_PCF857X=y
 CONFIG_GPIO_STMPE=y
 CONFIG_GPIO_74X164=y
 CONFIG_POWER_RESET=y
@@ -223,6 +226,7 @@ CONFIG_POWER_SUPPLY=y
 CONFIG_SENSORS_MC13783_ADC=y
 CONFIG_SENSORS_GPIO_FAN=y
 CONFIG_SENSORS_IIO_HWMON=y
+CONFIG_THERMAL_STATISTICS=y
 CONFIG_THERMAL_WRITABLE_TRIPS=y
 CONFIG_CPU_THERMAL=y
 CONFIG_IMX_THERMAL=y
@@ -266,6 +270,7 @@ CONFIG_VIDEO_CODA=m
 CONFIG_VIDEO_IMX_PXP=y
 # CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
 CONFIG_VIDEO_ADV7180=m
+CONFIG_VIDEO_OV2680=m
 CONFIG_VIDEO_OV5640=m
 CONFIG_IMX_IPUV3_CORE=y
 CONFIG_DRM=y
@@ -399,11 +404,15 @@ CONFIG_MPL3115=y
 CONFIG_PWM=y
 CONFIG_PWM_FSL_FTM=y
 CONFIG_PWM_IMX27=y
+CONFIG_PWM_IMX_TPM=y
 CONFIG_NVMEM_IMX_OCOTP=y
 CONFIG_NVMEM_VF610_OCOTP=y
+CONFIG_NVMEM_SNVS_LPGPR=y
 CONFIG_TEE=y
 CONFIG_OPTEE=y
 CONFIG_MUX_MMIO=y
+CONFIG_SIOX=m
+CONFIG_SIOX_BUS_GPIO=m
 CONFIG_EXT2_FS=y
 CONFIG_EXT2_FS_XATTR=y
 CONFIG_EXT2_FS_POSIX_ACL=y
index 747550c7af2f3a73d9651e3bbe427552728c506e..2f0a762dc3a0e3c3d8eeb3ee58695c93135d1de1 100644 (file)
@@ -61,7 +61,6 @@ CONFIG_FB_MODE_HELPERS=y
 CONFIG_FB_MATROX=y
 CONFIG_FB_MATROX_MILLENIUM=y
 CONFIG_FB_MATROX_MYSTIQUE=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_LOGO=y
index a73b6a31a4ab21f56ce0db09e94ef0bebee8a794..30cdb287e1b404590e8c7ecdfa590866fc29b023 100644 (file)
@@ -34,7 +34,6 @@ CONFIG_IPV6=y
 # CONFIG_INET6_XFRM_MODE_TUNNEL is not set
 # CONFIG_INET6_XFRM_MODE_BEET is not set
 # CONFIG_IPV6_SIT is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_REDBOOT_PARTS=y
 CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y
index f63362b665ebba637856d4b3ad564fa30ca3ac8e..18a21faa834cbcb5166e97c39fb89b4e071479b9 100644 (file)
@@ -30,7 +30,6 @@ CONFIG_IPV6=y
 # CONFIG_INET6_XFRM_MODE_TUNNEL is not set
 # CONFIG_INET6_XFRM_MODE_BEET is not set
 # CONFIG_IPV6_SIT is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_REDBOOT_PARTS=y
 CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y
index d22f832ccfd6d8b8074ae213d2eeb171826d8693..089eca43214adba35a5cfc97f692894df378a045 100644 (file)
@@ -28,7 +28,6 @@ CONFIG_IPV6=y
 # CONFIG_INET6_XFRM_MODE_TUNNEL is not set
 # CONFIG_INET6_XFRM_MODE_BEET is not set
 # CONFIG_IPV6_SIT is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_REDBOOT_PARTS=y
 CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y
index 39ebcce3bc2f52d93d3b4256a97a678924866d4a..27e7c0714b96576ac46213d1ada5fe9892cf659d 100644 (file)
@@ -104,7 +104,6 @@ CONFIG_NET_CLS_RSVP6=m
 CONFIG_NET_CLS_ACT=y
 CONFIG_NET_ACT_POLICE=y
 CONFIG_NET_PKTGEN=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_REDBOOT_PARTS=y
 CONFIG_MTD_BLOCK=y
index 65d37ad6e6b83c2637b4e57a11a391d5fdd600b2..9f079be2b84baed72b8a3be4a72a40bad2ab87db 100644 (file)
@@ -24,7 +24,6 @@ CONFIG_IRDA=m
 CONFIG_IRLAN=m
 CONFIG_IRCOMM=m
 CONFIG_SA1100_FIR=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_NBD=y
 CONFIG_BLK_DEV_SD=y
@@ -47,7 +46,6 @@ CONFIG_LEGACY_PTY_COUNT=32
 # CONFIG_HWMON is not set
 CONFIG_FB=y
 CONFIG_FB_S1D13XXX=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 # CONFIG_BACKLIGHT_GENERIC is not set
index 72fee57aad2fa204d5a38034c467bf482905a36d..3d5f5b5013308d0bf4863854aab44cc6e2846a6a 100644 (file)
@@ -115,7 +115,6 @@ CONFIG_VLAN_8021Q=y
 CONFIG_CAN=m
 CONFIG_CAN_C_CAN=m
 CONFIG_CAN_C_CAN_PLATFORM=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_DMA_CMA=y
index b8b91d790e9b0393320b2fc7b9d13a2d6d3a62ad..df62d4dfbbb721b79977fb2385130e68b4d52838 100644 (file)
@@ -28,7 +28,6 @@ CONFIG_INET=y
 CONFIG_IP_PNP=y
 CONFIG_IP_PNP_DHCP=y
 # CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_REDBOOT_PARTS=y
 CONFIG_MTD_CMDLINE_PARTS=y
index e3d5e15d66d1b5750d0e6cf020eed7bb5ca46149..e518168a06276363988558da66884a5440d3a613 100644 (file)
@@ -119,7 +119,6 @@ CONFIG_REGULATOR_FIXED_VOLTAGE=y
 CONFIG_DRM=y
 CONFIG_DRM_PL111=y
 CONFIG_FB_MODE_HELPERS=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_EHCI_ROOT_HUB_TT=y
index 4b3b2c693c296e1600b417faf6dcd46a5f822868..0cdc6c7974b340fe704e4d2edb38c1ffba7ee697 100644 (file)
@@ -40,7 +40,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_INET_XFRM_MODE_BEET is not set
 # CONFIG_INET_DIAG is not set
 # CONFIG_WIRELESS is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 # CONFIG_FW_LOADER is not set
@@ -110,7 +109,6 @@ CONFIG_DRM=y
 CONFIG_DRM_PANEL_SIMPLE=y
 CONFIG_DRM_PL111=y
 CONFIG_FB_MODE_HELPERS=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
 CONFIG_LOGO=y
index de5be2fc7306ac7f64fe6e6092bb297e6ae5e459..e6486c95922065e353889585e69fc6d16595899c 100644 (file)
@@ -53,7 +53,6 @@ CONFIG_BT_BNEP_MC_FILTER=y
 CONFIG_BT_BNEP_PROTO_FILTER=y
 CONFIG_BT_HIDP=m
 CONFIG_BT_HCIBTUSB=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_BLOCK=y
@@ -96,7 +95,6 @@ CONFIG_FB=y
 CONFIG_FB_PXA=y
 CONFIG_FB_PXA_OVERLAY=y
 CONFIG_FB_W100=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 # CONFIG_BACKLIGHT_GENERIC is not set
index 7d26ca0b13025283ab3b5fd7cfb6ce2fa342b482..301f29a1fcc390dda3132d6ad43b28f8b73eae61 100644 (file)
@@ -4,6 +4,16 @@ CONFIG_POSIX_MQUEUE=y
 CONFIG_RELAY=y
 CONFIG_BLK_DEV_INITRD=y
 # CONFIG_COMPAT_BRK is not set
+CONFIG_ARCH_S3C24XX=y
+CONFIG_S3C_ADC=y
+CONFIG_S3C24XX_PWM=y
+# CONFIG_CPU_S3C2410 is not set
+CONFIG_CPU_S3C2440=y
+CONFIG_MACH_MINI2440=y
+CONFIG_AEABI=y
+CONFIG_KEXEC=y
+CONFIG_CPU_IDLE=y
+CONFIG_APM_EMULATION=y
 CONFIG_MODULES=y
 CONFIG_MODULE_FORCE_LOAD=y
 CONFIG_MODULE_UNLOAD=y
@@ -16,17 +26,7 @@ CONFIG_MINIX_SUBPARTITION=y
 CONFIG_SOLARIS_X86_PARTITION=y
 CONFIG_UNIXWARE_DISKLABEL=y
 CONFIG_LDM_PARTITION=y
-CONFIG_ARCH_S3C24XX=y
-# CONFIG_CPU_S3C2410 is not set
-CONFIG_CPU_S3C2440=y
-CONFIG_MACH_MINI2440=y
-CONFIG_S3C_ADC=y
-CONFIG_S3C24XX_PWM=y
-CONFIG_AEABI=y
-CONFIG_KEXEC=y
-CONFIG_CPU_IDLE=y
 CONFIG_BINFMT_MISC=m
-CONFIG_APM_EMULATION=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
@@ -46,9 +46,6 @@ CONFIG_IP_MROUTE=y
 CONFIG_IP_PIMSM_V1=y
 CONFIG_IP_PIMSM_V2=y
 CONFIG_SYN_COOKIES=y
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
 CONFIG_INET_DIAG=m
 # CONFIG_IPV6 is not set
 CONFIG_NETFILTER=y
@@ -76,7 +73,6 @@ CONFIG_CFG80211=m
 CONFIG_MAC80211=m
 CONFIG_MAC80211_MESH=y
 CONFIG_MAC80211_LEDS=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_CONNECTOR=m
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
@@ -126,7 +122,6 @@ CONFIG_LIBERTAS=m
 CONFIG_LIBERTAS_SDIO=m
 CONFIG_ZD1211RW=m
 CONFIG_ZD1211RW_DEBUG=y
-CONFIG_INPUT_FF_MEMLESS=y
 CONFIG_INPUT_EVDEV=y
 CONFIG_INPUT_EVBUG=m
 # CONFIG_KEYBOARD_ATKBD is not set
@@ -160,7 +155,6 @@ CONFIG_FIRMWARE_EDID=y
 CONFIG_FB_MODE_HELPERS=y
 CONFIG_FB_TILEBLITTING=y
 CONFIG_FB_S3C2410=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_LCD_PLATFORM=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
@@ -174,12 +168,9 @@ CONFIG_LOGO=y
 # CONFIG_LOGO_LINUX_VGA16 is not set
 CONFIG_SOUND=y
 CONFIG_SND=y
+CONFIG_SND_DYNAMIC_MINORS=y
 CONFIG_SND_SEQUENCER=m
 CONFIG_SND_SEQ_DUMMY=m
-CONFIG_SND_MIXER_OSS=m
-CONFIG_SND_PCM_OSS=m
-CONFIG_SND_SEQUENCER_OSS=y
-CONFIG_SND_DYNAMIC_MINORS=y
 # CONFIG_SND_DRIVERS is not set
 # CONFIG_SND_ARM is not set
 # CONFIG_SND_SPI is not set
@@ -297,13 +288,6 @@ CONFIG_NLS_ISO8859_15=m
 CONFIG_NLS_KOI8_R=m
 CONFIG_NLS_KOI8_U=m
 CONFIG_NLS_UTF8=m
-CONFIG_DEBUG_INFO=y
-# CONFIG_ENABLE_MUST_CHECK is not set
-CONFIG_STRIP_ASM_SYMS=y
-CONFIG_DEBUG_FS=y
-CONFIG_DEBUG_KERNEL=y
-# CONFIG_SCHED_DEBUG is not set
-CONFIG_DEBUG_USER=y
 CONFIG_CRYPTO_CRYPTD=m
 CONFIG_CRYPTO_AUTHENC=m
 CONFIG_CRYPTO_TEST=m
@@ -342,3 +326,10 @@ CONFIG_LIBCRC32C=m
 CONFIG_FONTS=y
 CONFIG_FONT_8x8=y
 CONFIG_FONT_MINI_4x6=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_ENABLE_MUST_CHECK is not set
+CONFIG_STRIP_ASM_SYMS=y
+CONFIG_DEBUG_FS=y
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_SCHED_DEBUG is not set
+CONFIG_DEBUG_USER=y
index 94deb0ed0541d74dbbac06ae837c0be6bd7f7e3f..a5e8d2235a1a4dd300465cb1966419326e90735c 100644 (file)
@@ -50,7 +50,6 @@ CONFIG_MFD_MAX8925=y
 CONFIG_REGULATOR=y
 CONFIG_REGULATOR_MAX8649=y
 CONFIG_REGULATOR_MAX8925=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_MAX8925=y
index 6a11669fa536723f6416d6609df03fb6f45fcbeb..9b98761e51c9908ca82304e01543a83bce055b92 100644 (file)
@@ -38,7 +38,6 @@ CONFIG_IP_PNP_DHCP=y
 # CONFIG_INET_DIAG is not set
 # CONFIG_IPV6 is not set
 # CONFIG_WIRELESS is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 # CONFIG_PREVENT_FIRMWARE_BUILD is not set
index 63b5a8824f0fa5d3c2a0427f8c38346466096c6e..201237002c65f2d69a260d3498aacaa79cceecb7 100644 (file)
@@ -72,7 +72,6 @@ CONFIG_NET_DSA=y
 CONFIG_NET_PKTGEN=m
 CONFIG_CFG80211=y
 CONFIG_MAC80211=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_IMX_WEIM=y
@@ -96,8 +95,6 @@ CONFIG_MTD_UBI=y
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_ATMEL_TCLIB=y
 CONFIG_ATMEL_SSC=m
-CONFIG_ASPEED_LPC_CTRL=m
-CONFIG_ASPEED_LPC_SNOOP=m
 CONFIG_EEPROM_AT24=y
 # CONFIG_SCSI_PROC_FS is not set
 CONFIG_BLK_DEV_SD=y
@@ -178,10 +175,12 @@ CONFIG_MEDIA_SUPPORT=y
 CONFIG_MEDIA_CAMERA_SUPPORT=y
 CONFIG_V4L_PLATFORM_DRIVERS=y
 CONFIG_SOC_CAMERA=y
+CONFIG_VIDEO_ASPEED=m
 CONFIG_VIDEO_ATMEL_ISI=m
 CONFIG_DRM=y
 CONFIG_DRM_ATMEL_HLCDC=m
 CONFIG_DRM_PANEL_SIMPLE=y
+CONFIG_DRM_ASPEED_GFX=m
 CONFIG_FB_IMX=y
 CONFIG_FB_ATMEL=y
 CONFIG_BACKLIGHT_ATMEL_LCDC=y
@@ -226,6 +225,8 @@ CONFIG_USB_CHIPIDEA_HOST=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_AT91=m
 CONFIG_USB_ATMEL_USBA=m
+CONFIG_USB_ASPEED_VHUB=m
+CONFIG_USB_CONFIGFS=m
 CONFIG_MMC=y
 CONFIG_SDIO_UART=y
 CONFIG_MMC_ATMELMCI=y
@@ -245,11 +246,15 @@ CONFIG_RTC_DRV_RV3029C2=m
 CONFIG_RTC_DRV_AT91RM9200=m
 CONFIG_RTC_DRV_AT91SAM9=m
 CONFIG_RTC_DRV_MV=y
+CONFIG_RTC_DRV_ASPEED=m
 CONFIG_DMADEVICES=y
 CONFIG_AT_HDMAC=y
 CONFIG_MV_XOR=y
 CONFIG_STAGING=y
 CONFIG_FB_XGI=y
+CONFIG_ASPEED_LPC_CTRL=m
+CONFIG_ASPEED_LPC_SNOOP=m
+CONFIG_ASPEED_P2A_CTRL=m
 CONFIG_IIO=m
 CONFIG_ASPEED_ADC=m
 CONFIG_AT91_ADC=m
index 6b748f214eae9aa484eba18deb7e19bee048258e..6a40bc2ef2718bf788a908e989ebd61ec14e3edc 100644 (file)
@@ -413,6 +413,7 @@ CONFIG_SPI_SPIDEV=y
 CONFIG_SPMI=y
 CONFIG_PINCTRL_AS3722=y
 CONFIG_PINCTRL_RZA2=y
+CONFIG_PINCTRL_STMFX=y
 CONFIG_PINCTRL_PALMAS=y
 CONFIG_PINCTRL_APQ8064=y
 CONFIG_PINCTRL_APQ8084=y
@@ -656,6 +657,8 @@ CONFIG_DRM_VC4=m
 CONFIG_DRM_ETNAVIV=m
 CONFIG_DRM_MXSFB=m
 CONFIG_DRM_PL111=m
+CONFIG_DRM_LIMA=m
+CONFIG_DRM_PANFROST=m
 CONFIG_FB_EFI=y
 CONFIG_FB_WM8505=y
 CONFIG_FB_SH_MOBILE_LCDC=y
@@ -940,7 +943,6 @@ CONFIG_ARCH_TEGRA_2x_SOC=y
 CONFIG_ARCH_TEGRA_3x_SOC=y
 CONFIG_ARCH_TEGRA_114_SOC=y
 CONFIG_ARCH_TEGRA_124_SOC=y
-CONFIG_PM_DEVFREQ=y
 CONFIG_ARM_TEGRA_DEVFREQ=m
 CONFIG_TI_AEMIF=y
 CONFIG_IIO=y
index e9567513f0685f72dd8f61b4cf9346e1b12f164a..b39b1300a459f561c07a79024a33758fcfa2fef4 100644 (file)
@@ -36,7 +36,6 @@ CONFIG_IP_PNP_DHCP=y
 CONFIG_IP_PNP_BOOTP=y
 # CONFIG_IPV6 is not set
 CONFIG_NET_PKTGEN=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_BLOCK=y
index 0e5577a31851b4968902bc87072e86f30f6aa353..226f2e97c6e2ed0e17da0a30e8ca802282ac6a9a 100644 (file)
@@ -62,7 +62,6 @@ CONFIG_NET_SWITCHDEV=y
 CONFIG_NET_PKTGEN=m
 CONFIG_CFG80211=y
 CONFIG_MAC80211=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_MTD=y
index 3ac2e84fdeaa465dba7659782904497659d53867..cddce57fe4b9ed986bcedad55c7bd7cff7aafe83 100644 (file)
@@ -40,7 +40,6 @@ CONFIG_BT=y
 CONFIG_BT_MRVL=y
 CONFIG_BT_MRVL_SDIO=y
 CONFIG_CFG80211=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_MTD=y
index ed570a0d1f2ac530e47e90e9d8cff21fad546b46..2773899c21b384ff4e0672c942a61cee90840350 100644 (file)
@@ -96,7 +96,6 @@ CONFIG_DRM=y
 CONFIG_DRM_PANEL_SEIKO_43WVF1G=y
 CONFIG_DRM_MXSFB=y
 CONFIG_FB_MODE_HELPERS=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_PWM=y
diff --git a/arch/arm/configs/netx_defconfig b/arch/arm/configs/netx_defconfig
deleted file mode 100644 (file)
index cc5c5f9..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-CONFIG_BSD_PROCESS_ACCT=y
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_SLAB=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-CONFIG_MODULE_FORCE_UNLOAD=y
-CONFIG_ARCH_NETX=y
-CONFIG_MACH_NXDKN=y
-CONFIG_MACH_NXDB500=y
-CONFIG_MACH_NXEB500HMI=y
-CONFIG_PREEMPT=y
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttySMX0,115200"
-CONFIG_NET=y
-CONFIG_PACKET=y
-CONFIG_UNIX=y
-CONFIG_XFRM_USER=m
-CONFIG_NET_KEY=y
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-CONFIG_NET_IPGRE=m
-CONFIG_SYN_COOKIES=y
-CONFIG_INET_AH=y
-CONFIG_INET_ESP=y
-CONFIG_INET_IPCOMP=y
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_NETFILTER=y
-CONFIG_NET_PKTGEN=m
-CONFIG_MTD=y
-CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_BLOCK=y
-CONFIG_MTD_CFI=y
-CONFIG_MTD_CFI_INTELEXT=y
-CONFIG_MTD_PLATRAM=y
-CONFIG_BLK_DEV_LOOP=m
-CONFIG_BLK_DEV_CRYPTOLOOP=m
-CONFIG_NETDEVICES=y
-CONFIG_NET_ETHERNET=y
-CONFIG_NET_NETX=y
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-CONFIG_SERIAL_NETX=y
-CONFIG_SERIAL_NETX_CONSOLE=y
-# CONFIG_HWMON is not set
-CONFIG_FB=y
-CONFIG_FB_ARMCLCD=y
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_LOGO=y
-CONFIG_RTC_CLASS=y
-CONFIG_TMPFS=y
-CONFIG_JFFS2_FS=y
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-CONFIG_NFS_V4=y
-CONFIG_ROOT_NFS=y
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRC_CCITT=m
-CONFIG_LIBCRC32C=m
index cfc094189d09a32adf9548a026c8ba8fa70ff873..3f35761dc9ff287a7a190b44d595081c8735719a 100644 (file)
@@ -45,7 +45,6 @@ CONFIG_BT_HCIUART=m
 CONFIG_BT_HCIUART_H4=y
 CONFIG_BT_HCIUART_BCSP=y
 CONFIG_BT_HCIVHCI=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_TESTS=m
 CONFIG_MTD_CMDLINE_PARTS=y
@@ -98,7 +97,6 @@ CONFIG_REGULATOR=y
 CONFIG_DRM=y
 CONFIG_DRM_PANEL_TPO_TPG110=y
 CONFIG_DRM_PL111=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_PWM=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
index c0d152c02fba4e27918d1e398960e33d9f46ccdc..63dba62c3326084349d78e86bf58dd9476e67caf 100644 (file)
@@ -13,7 +13,6 @@ CONFIG_AEABI=y
 CONFIG_CMDLINE="root=/dev/ram0 console=ttyS0,115200n8 rdinit=/sbin/init mem=64M"
 CONFIG_KEXEC=y
 CONFIG_FPE_NWFPE=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_BLOCK=y
 CONFIG_MTD_CFI=y
index 8dde1186c2effa8cda17320a6d951b93d4e49158..cb5a8788ebe8832806b0b96608957935aeab79dc 100644 (file)
@@ -19,7 +19,6 @@ CONFIG_KEXEC=y
 CONFIG_FPE_NWFPE=y
 CONFIG_BINFMT_AOUT=y
 CONFIG_BINFMT_MISC=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_BLOCK=y
 CONFIG_MTD_CFI=y
index 6bb784f8eb5be9d60c9566457e7581dbe7dd8e64..f7af84e23a053524d461163d3e4a227b790ed4f6 100644 (file)
@@ -19,7 +19,6 @@ CONFIG_KEXEC=y
 CONFIG_FPE_NWFPE=y
 CONFIG_BINFMT_AOUT=y
 CONFIG_BINFMT_MISC=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_BLOCK=y
 CONFIG_MTD_CFI=y
index 82af77c093f16dd34dc924a1e2642e4e7a368591..0c43c589f191c991b0bf017935776a1eba98c18d 100644 (file)
@@ -79,7 +79,6 @@ CONFIG_BT_RFCOMM=y
 CONFIG_BT_RFCOMM_TTY=y
 CONFIG_BT_BNEP=y
 CONFIG_BT_HIDP=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 # CONFIG_STANDALONE is not set
 # CONFIG_PREVENT_FIRMWARE_BUILD is not set
 CONFIG_CONNECTOR=y
@@ -154,7 +153,6 @@ CONFIG_FB_OMAP_LCDC_EXTERNAL=y
 CONFIG_FB_OMAP_LCDC_HWA742=y
 CONFIG_FB_OMAP_MANUAL_UPDATE=y
 CONFIG_FB_OMAP_LCD_MIPID=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
index 077e0fde1ff95e91c23e0e9148dbc420e792ff3e..4bdbb036ac26152d03be2900d239800dfd63f875 100644 (file)
@@ -59,7 +59,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_IPV6 is not set
 CONFIG_NET_DSA=y
 CONFIG_NET_PKTGEN=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_BLOCK=y
index e0a6142725619dd1caed8172187762d0281c1eb3..4a3fd82c2a0c4a99cec375277c1cb25685efadc3 100644 (file)
@@ -30,7 +30,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_INET_XFRM_MODE_TUNNEL is not set
 # CONFIG_INET_XFRM_MODE_BEET is not set
 # CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_INPUT_MOUSEDEV_PSAUX is not set
 CONFIG_INPUT_EVDEV=y
@@ -49,7 +48,6 @@ CONFIG_PDA_POWER=y
 # CONFIG_HWMON is not set
 CONFIG_FB=y
 CONFIG_FB_PXA=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_LCD_CLASS_DEVICE is not set
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_PWM=y
index 9c88a193490c395df0394146a55138190d8119a0..a8c53228b0c180cc90f2f6493b0331986e19ddb3 100644 (file)
@@ -35,7 +35,6 @@ CONFIG_IP_PNP=y
 # CONFIG_INET_XFRM_MODE_BEET is not set
 # CONFIG_INET_DIAG is not set
 # CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_BLOCK=y
index 7cc8e8e4d2961e0fd933efdc9b6c7e7a15dcd79c..be19aa1275957be697e38eeb321e28cecb647e0a 100644 (file)
@@ -16,7 +16,6 @@ CONFIG_PREEMPT=y
 CONFIG_AEABI=y
 CONFIG_KEXEC=y
 CONFIG_BINFMT_MISC=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=8192
index e7c7b91b6de2b2e6ee66e6b2efefe82f0750b493..0947f022954d465796b9eba766fdef861b51422d 100644 (file)
@@ -24,7 +24,6 @@ CONFIG_UNIX=y
 CONFIG_INET=y
 CONFIG_IP_PNP=y
 # CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 # CONFIG_STANDALONE is not set
 # CONFIG_PREVENT_FIRMWARE_BUILD is not set
 # CONFIG_BLK_DEV is not set
index 7681eea601276f3f0b4a1fa43699ed57d42d7373..06bbc7a59b602bfd7d59f014741c9c63126019dd 100644 (file)
@@ -26,7 +26,6 @@ CONFIG_IP_PNP=y
 # CONFIG_INET_XFRM_MODE_BEET is not set
 # CONFIG_INET_DIAG is not set
 # CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 # CONFIG_STANDALONE is not set
 # CONFIG_PREVENT_FIRMWARE_BUILD is not set
 CONFIG_MTD=y
@@ -72,7 +71,6 @@ CONFIG_REGULATOR_DEBUG=y
 CONFIG_REGULATOR_DA903X=y
 CONFIG_FB=y
 CONFIG_FB_PXA=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_LCD_TDO24M=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
index 3aff71e6dae54225744fbbe0afd1205663321ead..b21196372158d6c5c7eb29d9387eb408b9c59963 100644 (file)
@@ -24,7 +24,6 @@ CONFIG_UNIX=y
 CONFIG_INET=y
 CONFIG_IP_PNP=y
 # CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 # CONFIG_STANDALONE is not set
 # CONFIG_PREVENT_FIRMWARE_BUILD is not set
 # CONFIG_BLK_DEV is not set
index 07ebbdce36451c85e0a868d501821583f7c35315..787c3f9be4142c88f5881f6c37116a306901bfa0 100644 (file)
@@ -156,7 +156,6 @@ CONFIG_MAC80211=m
 CONFIG_RFKILL=y
 CONFIG_RFKILL_INPUT=y
 CONFIG_RFKILL_GPIO=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_CONNECTOR=y
@@ -462,7 +461,6 @@ CONFIG_PXA3XX_GCU=m
 CONFIG_FB_MBX=m
 CONFIG_FB_VIRTUAL=m
 CONFIG_FB_SIMPLE=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CORGI=m
 CONFIG_LCD_PLATFORM=m
 CONFIG_LCD_TOSA=m
index c1854751c99af28c7b242877056654a785770b57..34433bf5885d049869d75ad731f34ec071fc52c1 100644 (file)
@@ -37,6 +37,7 @@ CONFIG_ARM_CPUIDLE=y
 CONFIG_VFP=y
 CONFIG_NEON=y
 # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_CMA=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
@@ -146,12 +147,13 @@ CONFIG_REGULATOR_QCOM_SMD_RPM=y
 CONFIG_REGULATOR_QCOM_SPMI=y
 CONFIG_MEDIA_SUPPORT=y
 CONFIG_DRM=y
+CONFIG_DRM_PANEL_SIMPLE=y
 CONFIG_FB=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_LCD_CLASS_DEVICE is not set
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 # CONFIG_BACKLIGHT_GENERIC is not set
+CONFIG_BACKLIGHT_LM3630A=y
 CONFIG_BACKLIGHT_LP855X=y
 CONFIG_SOUND=y
 CONFIG_SND=y
@@ -183,6 +185,7 @@ CONFIG_USB_CONFIGFS_NCM=y
 CONFIG_USB_CONFIGFS_ECM=y
 CONFIG_USB_CONFIGFS_F_FS=y
 CONFIG_USB_ULPI_BUS=y
+CONFIG_USB_ETH=m
 CONFIG_MMC=y
 CONFIG_MMC_BLOCK_MINORS=32
 CONFIG_MMC_ARMMMCI=y
@@ -262,6 +265,8 @@ CONFIG_NLS_CODEPAGE_437=y
 CONFIG_NLS_ASCII=y
 CONFIG_NLS_ISO8859_1=y
 CONFIG_NLS_UTF8=y
+CONFIG_DMA_CMA=y
+CONFIG_CMA_SIZE_MBYTES=256
 CONFIG_PRINTK_TIME=y
 CONFIG_DYNAMIC_DEBUG=y
 CONFIG_DEBUG_INFO=y
index cc9fa24d4b8f284913e5cc43db9677a06c382efb..8a056cc0c1ec21285d891e2ac68311ff4bfcbc01 100644 (file)
@@ -34,7 +34,6 @@ CONFIG_IP_PNP=y
 CONFIG_IP_PNP_DHCP=y
 CONFIG_IP_PNP_BOOTP=y
 # CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_AFS_PARTS=y
@@ -65,7 +64,6 @@ CONFIG_DRM=y
 CONFIG_DRM_PANEL_SIMPLE=y
 CONFIG_DRM_PL111=y
 CONFIG_FB_MODE_HELPERS=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_LOGO=y
 # CONFIG_LOGO_LINUX_MONO is not set
index 39c648594d934c2864d6ecf71589ca0a1e626430..95b5a4ffddeabba1ece89ae9a70f2ab38c049e64 100644 (file)
@@ -4,13 +4,8 @@ CONFIG_IKCONFIG_PROC=y
 CONFIG_LOG_BUF_SHIFT=16
 CONFIG_BLK_DEV_INITRD=y
 CONFIG_SLAB=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_BLK_DEV_BSG is not set
-CONFIG_PARTITION_ADVANCED=y
-CONFIG_BSD_DISKLABEL=y
-CONFIG_SOLARIS_X86_PARTITION=y
 CONFIG_ARCH_S3C24XX=y
+CONFIG_S3C_ADC=y
 CONFIG_CPU_S3C2412=y
 CONFIG_CPU_S3C2416=y
 CONFIG_CPU_S3C2440=y
@@ -40,13 +35,18 @@ CONFIG_ARCH_S3C2440=y
 CONFIG_MACH_NEO1973_GTA02=y
 CONFIG_MACH_RX1950=y
 CONFIG_MACH_SMDK2443=y
-CONFIG_S3C_ADC=y
 CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
 CONFIG_CMDLINE="root=/dev/hda1 ro init=/bin/bash console=ttySAC0"
 CONFIG_FPE_NWFPE=y
 CONFIG_FPE_NWFPE_XP=y
 CONFIG_APM_EMULATION=m
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_BLK_DEV_BSG is not set
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_BSD_DISKLABEL=y
+CONFIG_SOLARIS_X86_PARTITION=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
@@ -74,7 +74,6 @@ CONFIG_INET6_AH=m
 CONFIG_INET6_ESP=m
 CONFIG_INET6_IPCOMP=m
 CONFIG_IPV6_MIP6=m
-CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
 CONFIG_IPV6_TUNNEL=m
 CONFIG_NETFILTER=y
 CONFIG_NF_CONNTRACK=m
@@ -129,7 +128,6 @@ CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
 CONFIG_NETFILTER_XT_MATCH_TIME=m
 CONFIG_NETFILTER_XT_MATCH_U32=m
 CONFIG_IP_VS=m
-CONFIG_NF_CONNTRACK_IPV4=m
 CONFIG_IP_NF_IPTABLES=m
 CONFIG_IP_NF_MATCH_AH=m
 CONFIG_IP_NF_MATCH_ECN=m
@@ -148,7 +146,6 @@ CONFIG_IP_NF_RAW=m
 CONFIG_IP_NF_ARPTABLES=m
 CONFIG_IP_NF_ARPFILTER=m
 CONFIG_IP_NF_ARP_MANGLE=m
-CONFIG_NF_CONNTRACK_IPV6=m
 CONFIG_IP6_NF_IPTABLES=m
 CONFIG_IP6_NF_MATCH_AH=m
 CONFIG_IP6_NF_MATCH_EUI64=m
@@ -181,11 +178,10 @@ CONFIG_CFG80211=m
 CONFIG_MAC80211=m
 CONFIG_MAC80211_MESH=y
 CONFIG_MAC80211_LEDS=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
+CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_REDBOOT_PARTS=y
 CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y
-CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_BLOCK=y
 CONFIG_MTD_CFI=y
 CONFIG_MTD_JEDECPROBE=y
@@ -291,11 +287,8 @@ CONFIG_BACKLIGHT_PWM=m
 CONFIG_FRAMEBUFFER_CONSOLE=y
 CONFIG_SOUND=y
 CONFIG_SND=y
-CONFIG_SND_SEQUENCER=m
-CONFIG_SND_MIXER_OSS=m
-CONFIG_SND_PCM_OSS=m
-CONFIG_SND_SEQUENCER_OSS=y
 CONFIG_SND_VERBOSE_PRINTK=y
+CONFIG_SND_SEQUENCER=m
 # CONFIG_SND_DRIVERS is not set
 # CONFIG_SND_ARM is not set
 # CONFIG_SND_SPI is not set
index 6e2656567da64d7b6678f234f43a47334ff484e1..59a258d504aa5b4b93aefdce83e7ccb378d6d506 100644 (file)
@@ -2,9 +2,6 @@ CONFIG_SYSFS_DEPRECATED=y
 CONFIG_SYSFS_DEPRECATED_V2=y
 CONFIG_BLK_DEV_INITRD=y
 CONFIG_KALLSYMS_ALL=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_BLK_DEV_BSG is not set
 CONFIG_ARCH_MULTI_V6=y
 # CONFIG_ARCH_MULTI_V7 is not set
 CONFIG_ARCH_S3C64XX=y
@@ -18,10 +15,11 @@ CONFIG_MACH_HMT=y
 CONFIG_MACH_SMARTQ5=y
 CONFIG_MACH_SMARTQ7=y
 CONFIG_MACH_WLF_CRAGG_6410=y
-CONFIG_AEABI=y
 CONFIG_CMDLINE="console=ttySAC0,115200 root=/dev/ram init=/linuxrc initrd=0x51000000,6M ramdisk_size=6144"
 CONFIG_VFP=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_BLK_DEV_BSG is not set
 CONFIG_MTD=y
 CONFIG_MTD_RAW_NAND=y
 CONFIG_MTD_NAND_S3C2410=y
@@ -40,15 +38,12 @@ CONFIG_SPI_GPIO=m
 CONFIG_SPI_S3C64XX=m
 CONFIG_FB=y
 CONFIG_FB_S3C=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_LCD_LTV350QV=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_PWM=y
 CONFIG_SOUND=y
 CONFIG_SND=m
-CONFIG_SND_MIXER_OSS=m
-CONFIG_SND_PCM_OSS=m
 CONFIG_SND_SOC=m
 CONFIG_USB=y
 CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
@@ -61,8 +56,8 @@ CONFIG_USB_SERIAL_EMPEG=m
 CONFIG_USB_SERIAL_FTDI_SIO=m
 CONFIG_USB_SERIAL_PL2303=m
 CONFIG_MMC=y
-CONFIG_MMC_DEBUG=y
 CONFIG_SDIO_UART=y
+CONFIG_MMC_DEBUG=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_S3C=y
 CONFIG_RTC_CLASS=y
index fd4f28aabda6cc37e5a91970d8285887b2856fdf..70919716f8155c26776b366a6cb3a24d45f1206f 100644 (file)
@@ -40,7 +40,6 @@ CONFIG_BT_HCIUART=m
 CONFIG_BT_HCIUART_BCM=y
 CONFIG_CFG80211=m
 CONFIG_MAC80211=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_BLK_DEV_LOOP=y
index d5341b0bd88d1d4e64552d0cb9e13f9c451ee005..ef785340e6f8de6ae4f64ffc8ecb078dd890df9b 100644 (file)
@@ -56,7 +56,6 @@ CONFIG_CAN_M_CAN=y
 CONFIG_CFG80211=y
 CONFIG_MAC80211=y
 CONFIG_MAC80211_LEDS=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 # CONFIG_STANDALONE is not set
@@ -154,7 +153,6 @@ CONFIG_SOC_CAMERA_OV2640=m
 CONFIG_DRM=y
 CONFIG_DRM_ATMEL_HLCDC=y
 CONFIG_DRM_PANEL_SIMPLE=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 # CONFIG_BACKLIGHT_GENERIC is not set
index eb02ba9ec6e625f9264b9a09e754408d320a0221..c6c70355141c38faeb73553133c92d894b360305 100644 (file)
@@ -197,7 +197,6 @@ CONFIG_PWM=y
 CONFIG_PWM_RCAR=y
 CONFIG_PWM_RENESAS_TPU=y
 CONFIG_RESET_CONTROLLER=y
-CONFIG_GENERIC_PHY=y
 CONFIG_PHY_RCAR_GEN2=y
 CONFIG_PHY_RCAR_GEN3_USB2=y
 # CONFIG_DNOTIFY is not set
index 6701a975e785c8695d952d324a6aed8db69fe946..fe2e1e82e23399dacdc4dbe6a68fd1957fd0f4df 100644 (file)
@@ -44,7 +44,6 @@ CONFIG_PCI=y
 CONFIG_PCI_MSI=y
 CONFIG_PCIE_ALTERA=y
 CONFIG_PCIE_ALTERA_MSI=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_MTD=y
index 8ee3679ca8b29dbcfafdf18b64b91e02dcf4eb70..3b206a31902ff27e0ba79f6d370ac2a25912aced 100644 (file)
@@ -28,7 +28,6 @@ CONFIG_IP_PNP=y
 CONFIG_IP_PNP_DHCP=y
 CONFIG_IP_PNP_BOOTP=y
 CONFIG_NET_IPIP=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_OF_PARTS=y
 CONFIG_MTD_BLOCK=y
index ddd73b25f75e86b22c35c006f54fb783652ca522..fc5f71c765edcfc24743cf71b116b1d14d87bacd 100644 (file)
@@ -13,7 +13,6 @@ CONFIG_MACH_SPEAR310=y
 CONFIG_MACH_SPEAR320=y
 CONFIG_BINFMT_MISC=y
 CONFIG_NET=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_OF_PARTS=y
 CONFIG_MTD_BLOCK=y
@@ -54,7 +53,6 @@ CONFIG_WATCHDOG=y
 CONFIG_ARM_SP805_WATCHDOG=y
 CONFIG_DRM=y
 CONFIG_DRM_PL111=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
index 5b410f0a365b1af6fab83aefd9fa8f1a8ee63501..52a56b8ce6a71e39c2bad2aa7a6d69f98c029511 100644 (file)
@@ -10,7 +10,6 @@ CONFIG_PLAT_SPEAR=y
 CONFIG_ARCH_SPEAR6XX=y
 CONFIG_BINFMT_MISC=y
 CONFIG_NET=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_OF_PARTS=y
 CONFIG_MTD_BLOCK=y
index f6d2f674517c2768e8369a37890402878b9a129c..4fb51d665abb888b172886bf6eb6525ae9619e90 100644 (file)
@@ -78,7 +78,6 @@ CONFIG_BT_HCIBT3C=m
 CONFIG_BT_HCIBLUECARD=m
 CONFIG_BT_HCIBTUART=m
 CONFIG_BT_HCIVHCI=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_BLOCK=y
@@ -126,7 +125,6 @@ CONFIG_SPI=y
 CONFIG_SPI_PXA2XX=y
 CONFIG_FB=y
 CONFIG_FB_PXA=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_LCD_CORGI=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
index 68eb16e583ac2a3ac2b56eceac9f33ea2c1cc254..cbc9ade78f14b312842399d726083cc576755447 100644 (file)
@@ -33,7 +33,6 @@ CONFIG_IP_PNP_DHCP=y
 # CONFIG_INET_XFRM_MODE_TUNNEL is not set
 # CONFIG_INET_XFRM_MODE_BEET is not set
 # CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_MTD=y
index d0a9e5dd9135a4fa5da046f8f355f70fc02d43da..3a9503fe84cba82de9064e7db62962c7984b019c 100644 (file)
@@ -22,7 +22,6 @@ CONFIG_FPE_NWFPE=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 # CONFIG_PREVENT_FIRMWARE_BUILD is not set
 CONFIG_MTD=y
 CONFIG_MTD_BLOCK=y
index ecad22501b48f213f2c313c14d39f59183c10d32..d66f0c287d415a3b9eb70522f2f8de814179522a 100644 (file)
@@ -136,7 +136,6 @@ CONFIG_SA1100_WATCHDOG=y
 CONFIG_FB=y
 CONFIG_FIRMWARE_EDID=y
 CONFIG_FB_PXA=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 # CONFIG_VGA_CONSOLE is not set
index bedf397c75dec42b6f5f66d4106200bd4cf781aa..8223397db047eb7939b03be3dceff1b7558d847b 100644 (file)
@@ -22,7 +22,6 @@ CONFIG_ZBOOT_ROM_BSS=0x0
 CONFIG_CMDLINE="root=/dev/ram0 rw rootfstype=rootfs console=ttyAMA0,115200n8 lpj=515072"
 CONFIG_CPU_IDLE=y
 # CONFIG_SUSPEND is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 # CONFIG_PREVENT_FIRMWARE_BUILD is not set
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
@@ -43,7 +42,6 @@ CONFIG_WATCHDOG=y
 CONFIG_REGULATOR=y
 CONFIG_REGULATOR_FIXED_VOLTAGE=y
 CONFIG_FB=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_LCD_CLASS_DEVICE is not set
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 # CONFIG_USB_SUPPORT is not set
index e2151a7aaf49947d01ea1e87506727a4abece782..e6b98b6eb88ddf779aa30f8a453172171aab101f 100644 (file)
@@ -38,7 +38,6 @@ CONFIG_CFG80211_DEBUGFS=y
 CONFIG_MAC80211=y
 CONFIG_MAC80211_LEDS=y
 CONFIG_CAIF=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_BLK_DEV_RAM=y
index 5282324c7cefba5d9fc11c8c79b6a723053bc1b3..fe4d4b5965859edb784b5d482ad8549ddb6180d1 100644 (file)
@@ -62,7 +62,6 @@ CONFIG_DRM_PANEL_SIMPLE=y
 CONFIG_DRM_DUMB_VGA_DAC=y
 CONFIG_DRM_PL111=y
 CONFIG_FB_MODE_HELPERS=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_LOGO=y
 CONFIG_SOUND=y
index 484d77a7f589eb029fa4975fbffea8caa43e2f91..25753552277ad18f973d7e0877dc2d741d014f6d 100644 (file)
@@ -45,7 +45,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_WIRELESS is not set
 CONFIG_NET_9P=y
 CONFIG_NET_9P_VIRTIO=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DMA_CMA=y
 CONFIG_MTD=y
@@ -86,7 +85,6 @@ CONFIG_DRM_PANEL_SIMPLE=y
 CONFIG_DRM_SII902X=y
 CONFIG_DRM_PL111=y
 CONFIG_FB_MODE_HELPERS=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_LOGO=y
 # CONFIG_LOGO_LINUX_MONO is not set
index 070e5074f1ee5b118ed35612c9cd09d65f611255..2ff16168d9c2892df5b5ba31f1cd8cbcdaa2ec99 100644 (file)
@@ -41,7 +41,6 @@ CONFIG_BT_BNEP=m
 CONFIG_BT_HCIUART=m
 CONFIG_BT_HCIUART_H4=y
 CONFIG_BT_HCIUART_BCSP=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_FW_LOADER=m
 CONFIG_MTD=y
 CONFIG_MTD_REDBOOT_PARTS=y
@@ -110,7 +109,6 @@ CONFIG_WATCHDOG=y
 CONFIG_FB=y
 CONFIG_FB_PXA=m
 CONFIG_FB_PXA_PARAMETERS=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_BACKLIGHT_PWM=m
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_FRAMEBUFFER_CONSOLE=y
index 2eda24635e65ec131d4e96d078c9906eef70f8bc..f1fbdfc5c8c62f03a033402249fb17501441d120 100644 (file)
@@ -43,7 +43,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_INET_XFRM_MODE_BEET is not set
 # CONFIG_INET_DIAG is not set
 # CONFIG_IPV6 is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 # CONFIG_PREVENT_FIRMWARE_BUILD is not set
 # CONFIG_FW_LOADER is not set
 CONFIG_MTD_COMPLEX_MAPPINGS=y
index 09e7050d56532dabd512cc99e1038a6dae525d69..aa3023c9a01196b43ec816094ee8302d7d197dd8 100644 (file)
@@ -39,7 +39,6 @@ CONFIG_BT_HCIUART_BCSP=y
 CONFIG_CFG80211=m
 CONFIG_LIB80211=m
 CONFIG_MAC80211=m
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_REDBOOT_PARTS=y
 CONFIG_MTD_REDBOOT_PARTS_READONLY=y
@@ -110,7 +109,6 @@ CONFIG_WATCHDOG=y
 CONFIG_FB=y
 CONFIG_FB_PXA=m
 CONFIG_FB_PXA_PARAMETERS=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_FRAMEBUFFER_CONSOLE=y
 CONFIG_LOGO=y
index dfc061d87d2f7e59117986b7e05b17a640600339..c4070c19ea6c78820cadd5d828feb9a7dfda4437 100644 (file)
@@ -41,7 +41,6 @@ CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
 CONFIG_CMDLINE="console=ttyAMA0,115200 debug earlyprintk root=/dev/ram rw rootwait"
 #CONFIG_NET is not set
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_DMA_CMA=y
diff --git a/arch/arm/include/debug/netx.S b/arch/arm/include/debug/netx.S
deleted file mode 100644 (file)
index 08afc58..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Debugging macro include header
- *
- *  Copyright (C) 1994-1999 Russell King
- *  Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
-*/
-
-#define UART_DATA 0
-#define UART_FLAG 0x18
-#define UART_FLAG_BUSY (1 << 3)
-
-               .macro  addruart, rp, rv, tmp
-               ldr     \rp, =CONFIG_DEBUG_UART_PHYS
-               ldr     \rv, =CONFIG_DEBUG_UART_VIRT
-               .endm
-
-               .macro  senduart,rd,rx
-               str     \rd, [\rx, #UART_DATA]
-               .endm
-
-               .macro  busyuart,rd,rx
-1002:          ldr     \rd, [\rx, #UART_FLAG]
-               tst     \rd, #UART_FLAG_BUSY
-               bne     1002b
-               .endm
-
-               .macro  waituart,rd,rx
-1001:          ldr     \rd, [\rx, #UART_FLAG]
-               tst     \rd, #UART_FLAG_BUSY
-               bne     1001b
-               .endm
index 0bff0176db2c4f1bb31dd9cdaa3b0eceaa26dcd9..b25c54585048ccc07026ded3c520d0c994832b7b 100644 (file)
@@ -31,7 +31,6 @@ else
 endif
 
 ifeq ($(CONFIG_ARCH_RPC),y)
-  lib-y                                += ecard.o io-acorn.o floppydma.o
   AFLAGS_delay-loop.o          += -march=armv4
 endif
 
index da85e64143e935e03978f2efb5e610c00584f057..d5af6aedc02c4d4d8a9ac598ae30413c7b063d86 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/suspend.h>
 
 #include <linux/clk/at91_pmc.h>
+#include <linux/platform_data/atmel.h>
 
 #include <asm/cacheflush.h>
 #include <asm/fncpy.h>
index 4ef1e55f4a0bffb37f138f6b04020fa1248d64c7..5e5f1fabc3d409f4a5e2e6f6ab453b6e718d6d04 100644 (file)
@@ -208,6 +208,7 @@ config ARCH_BCM_63XX
 config ARCH_BRCMSTB
        bool "Broadcom BCM7XXX based boards"
        depends on ARCH_MULTI_V7
+       select ARCH_HAS_RESET_CONTROLLER
        select ARM_GIC
        select ARM_ERRATA_798181 if SMP
        select HAVE_ARM_ARCH_TIMER
@@ -217,6 +218,7 @@ config ARCH_BRCMSTB
        select ZONE_DMA if ARM_LPAE
        select SOC_BRCMSTB
        select SOC_BUS
+       select PINCTRL
        help
          Say Y if you intend to run the kernel on a Broadcom ARM-based STB
          chipset.
index 8fd23b263c602b92bf0c95790061d4a12abb4b3b..b59c813b1af45a1cea45471b6b517ed563814149 100644 (file)
@@ -40,9 +40,6 @@ obj-$(CONFIG_ARCH_BCM_MOBILE_L2_CACHE) += kona_l2_cache.o
 
 # Support for secure monitor traps
 obj-$(CONFIG_ARCH_BCM_MOBILE_SMC) += bcm_kona_smc.o
-ifeq ($(call as-instr,.arch_extension sec,as_has_sec),as_has_sec)
-CFLAGS_bcm_kona_smc.o          += -Wa,-march=armv7-a+sec -DREQUIRES_SEC
-endif
 
 # BCM2835
 obj-$(CONFIG_ARCH_BCM2835)     += board_bcm2835.o
index 83dd0c10fa47bcfad4194bea5bf0b8ca7d5dbac1..641e1f8fcf5e7c9b92bc205f5a2414a7f67c1a2a 100644 (file)
@@ -141,6 +141,7 @@ static int bcm63138_smp_boot_secondary(unsigned int cpu,
         * return
         */
        ret = bcm63xx_pmb_power_on_cpu(dn);
+       of_node_put(dn);
        if (ret)
                goto out;
 out:
index a55a7ecf146a277df8c55603837b67d6fdc30a03..541e850a736c99929788395ffca3b3d8f5a1ed3d 100644 (file)
@@ -125,9 +125,7 @@ static int bcm_kona_do_smc(u32 service_id, u32 buffer_phys)
                __asmeq("%2", "r4")
                __asmeq("%3", "r5")
                __asmeq("%4", "r6")
-#ifdef REQUIRES_SEC
                ".arch_extension sec\n"
-#endif
                "       smc    #0\n"
                : "=r" (ip), "=r" (r0)
                : "r" (r4), "r" (r5), "r" (r6)
index b81bb386951dc2b414c0df526d720480afcf701a..1238ac801530ed08f98285dffa600543dd38cdbd 100644 (file)
@@ -38,6 +38,7 @@ static void bcm281xx_restart(enum reboot_mode mode, const char *cmd)
                return;
        }
        base = of_iomap(np_wdog, 0);
+       of_node_put(np_wdog);
        if (!base) {
                pr_emerg("Couldn't map brcm,kona-wdt\n");
                return;
index 12379960e982de5ea427bfee05a28d05a78af680..4555f21e70775ffe4c3d5c32ea6a4bf1ed0981f1 100644 (file)
@@ -334,11 +334,14 @@ static void __init brcmstb_cpu_ctrl_setup(unsigned int max_cpus)
 
        rc = setup_hifcpubiuctrl_regs(np);
        if (rc)
-               return;
+               goto out_put_node;
 
        rc = setup_hifcont_regs(np);
        if (rc)
-               return;
+               goto out_put_node;
+
+out_put_node:
+       of_node_put(np);
 }
 
 static int brcmstb_boot_secondary(unsigned int cpu, struct task_struct *idle)
index 31ae3be5741d60cf22407955923b7eaa5ca3d540..0628e7d7dcf3f05ce6c6c83ae7b939e9676cba65 100644 (file)
@@ -631,13 +631,12 @@ static void da850_evm_bb_keys_init(unsigned gpio)
        }
 }
 
-#define DA850_N_BB_USER_LED    2
-
 static struct gpio_led da850_evm_bb_leds[] = {
-       [0 ... DA850_N_BB_USER_LED - 1] = {
-               .active_low = 1,
-               .gpio = -1, /* assigned at runtime */
-               .name = NULL, /* assigned at runtime */
+       {
+               .name = "user_led2",
+       },
+       {
+               .name = "user_led1",
        },
 };
 
@@ -646,6 +645,20 @@ static struct gpio_led_platform_data da850_evm_bb_leds_pdata = {
        .num_leds = ARRAY_SIZE(da850_evm_bb_leds),
 };
 
+static struct gpiod_lookup_table da850_evm_bb_leds_gpio_table = {
+       .dev_id = "leds-gpio",
+       .table = {
+               GPIO_LOOKUP_IDX("i2c-bb-expander",
+                               DA850_EVM_BB_EXP_USER_LED2, NULL,
+                               0, GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP_IDX("i2c-bb-expander",
+                               DA850_EVM_BB_EXP_USER_LED2 + 1, NULL,
+                               1, GPIO_ACTIVE_LOW),
+
+               { },
+       },
+};
+
 static struct platform_device da850_evm_bb_leds_device = {
        .name           = "leds-gpio",
        .id             = -1,
@@ -654,20 +667,6 @@ static struct platform_device da850_evm_bb_leds_device = {
        }
 };
 
-static void da850_evm_bb_leds_init(unsigned gpio)
-{
-       int i;
-       struct gpio_led *led;
-
-       for (i = 0; i < DA850_N_BB_USER_LED; i++) {
-               led = &da850_evm_bb_leds[i];
-
-               led->gpio = gpio + DA850_EVM_BB_EXP_USER_LED2 + i;
-               led->name =
-                       da850_evm_bb_exp[DA850_EVM_BB_EXP_USER_LED2 + i];
-       }
-}
-
 static int da850_evm_bb_expander_setup(struct i2c_client *client,
                                                unsigned gpio, unsigned ngpio,
                                                void *c)
@@ -685,7 +684,7 @@ static int da850_evm_bb_expander_setup(struct i2c_client *client,
                goto io_exp_setup_sw_fail;
        }
 
-       da850_evm_bb_leds_init(gpio);
+       gpiod_add_lookup_table(&da850_evm_bb_leds_gpio_table);
        ret = platform_device_register(&da850_evm_bb_leds_device);
        if (ret) {
                pr_warn("Could not register baseboard GPIO expander LEDs");
@@ -729,10 +728,12 @@ static struct i2c_board_info __initdata da850_evm_i2c_devices[] = {
        },
        {
                I2C_BOARD_INFO("tca6416", 0x20),
+               .dev_name = "ui-expander",
                .platform_data = &da850_evm_ui_expander_info,
        },
        {
                I2C_BOARD_INFO("tca6416", 0x21),
+               .dev_name = "bb-expander",
                .platform_data = &da850_evm_bb_expander_info,
        },
 };
index 1c518b8ee520cca3854c3a12d4b7b165f3a515d4..d7422233a1306861a7bb99375c13cfef1c451a8d 100644 (file)
@@ -49,6 +49,7 @@ config S5P_DEV_MFC
 
 config ARCH_EXYNOS3
        bool "SAMSUNG EXYNOS3"
+       default y
        select ARM_CPU_SUSPEND if PM
        help
          Samsung EXYNOS3 (Cortex-A7) SoC based systems
@@ -106,7 +107,7 @@ config SOC_EXYNOS5420
        bool "SAMSUNG EXYNOS5420"
        default y
        depends on ARCH_EXYNOS5
-       select MCPM if SMP
+       select EXYNOS_MCPM if SMP
        select ARM_CCI400_PORT_CTRL
        select ARM_CPU_SUSPEND
 
@@ -115,6 +116,10 @@ config SOC_EXYNOS5800
        default y
        depends on SOC_EXYNOS5420
 
+config EXYNOS_MCPM
+       bool
+       select MCPM
+
 config EXYNOS_CPU_SUSPEND
        bool
        select ARM_CPU_SUSPEND
index 264dbaa89c3db721478fe7f2ba001b01a2883523..0fd3fcf8bfb0dd6ded26fdbdb74065dc10fe7ac6 100644 (file)
@@ -14,9 +14,5 @@ obj-$(CONFIG_PM_SLEEP)                += suspend.o
 
 obj-$(CONFIG_SMP)              += platsmp.o headsmp.o
 
-plus_sec := $(call as-instr,.arch_extension sec,+sec)
-AFLAGS_exynos-smc.o            :=-Wa,-march=armv7-a$(plus_sec)
-AFLAGS_sleep.o                 :=-Wa,-march=armv7-a$(plus_sec)
-
-obj-$(CONFIG_MCPM)             += mcpm-exynos.o
+obj-$(CONFIG_EXYNOS_MCPM)      += mcpm-exynos.o
 CFLAGS_mcpm-exynos.o           += -march=armv7-a
index d259532ba937ef94df22a586f3fd79e937d2df24..6da31e6a7acbc74397020a2bf9498f8eb223a3f5 100644 (file)
@@ -10,7 +10,8 @@
 /*
  * Function signature: void exynos_smc(u32 cmd, u32 arg1, u32 arg2, u32 arg3)
  */
-
+       .arch armv7-a
+       .arch_extension sec
 ENTRY(exynos_smc)
        stmfd   sp!, {r4-r11, lr}
        dsb
index 2783c3a0c06ac679959bb2ddd3af5c708052374c..ed93f91853b8cddc3c3e869adeaee1bcb1fe3650 100644 (file)
@@ -44,7 +44,8 @@ ENTRY(exynos_cpu_resume)
 ENDPROC(exynos_cpu_resume)
 
        .align
-
+       .arch armv7-a
+       .arch_extension sec
 ENTRY(exynos_cpu_resume_ns)
        mrc     p15, 0, r0, c0, c0, 0
        ldr     r1, =CPU_MASK
index be122af0de8f8df4ad645ee8680bfe2f43cef831..6a0d3448ea00862192682c8538f246570355a589 100644 (file)
@@ -268,7 +268,7 @@ static int exynos5420_cpu_suspend(unsigned long arg)
        unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
        unsigned int cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
 
-       if (IS_ENABLED(CONFIG_MCPM)) {
+       if (IS_ENABLED(CONFIG_EXYNOS_MCPM)) {
                mcpm_set_entry_vector(cpu, cluster, exynos_cpu_resume);
                mcpm_cpu_suspend();
        }
@@ -285,7 +285,7 @@ static void exynos_pm_set_wakeup_mask(void)
         * Set wake-up mask registers
         * EXYNOS_EINT_WAKEUP_MASK is set by pinctrl driver in late suspend.
         */
-       pmu_raw_writel(exynos_irqwake_intmask & ~(1 << 31), S5P_WAKEUP_MASK);
+       pmu_raw_writel(exynos_irqwake_intmask & ~BIT(31), S5P_WAKEUP_MASK);
 }
 
 static void exynos_pm_enter_sleep_mode(void)
@@ -351,7 +351,7 @@ static void exynos5420_pm_prepare(void)
        exynos_pm_enter_sleep_mode();
 
        /* ensure at least INFORM0 has the resume address */
-       if (IS_ENABLED(CONFIG_MCPM))
+       if (IS_ENABLED(CONFIG_EXYNOS_MCPM))
                pmu_raw_writel(__pa_symbol(mcpm_entry_point), S5P_INFORM0);
 
        tmp = pmu_raw_readl(EXYNOS_L2_OPTION(0));
@@ -455,7 +455,7 @@ static void exynos5420_prepare_pm_resume(void)
        mpidr = read_cpuid_mpidr();
        cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
 
-       if (IS_ENABLED(CONFIG_MCPM))
+       if (IS_ENABLED(CONFIG_EXYNOS_MCPM))
                WARN_ON(mcpm_cpu_powered_up());
 
        if (IS_ENABLED(CONFIG_HW_PERF_EVENTS) && cluster != 0) {
index 7e6732c16862fe87695c07c480fc91f3dfe2531e..71cc68041d92565abef4c0bb520b6d657dfd385c 100644 (file)
@@ -1,7 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0-only
 obj-y                                  := highbank.o system.o smc.o
 
-plus_sec := $(call as-instr,.arch_extension sec,+sec)
-AFLAGS_smc.o                           :=-Wa,-march=armv7-a$(plus_sec)
-
 obj-$(CONFIG_PM_SLEEP)                 += pm.o
index b16c0442e81232e957875be6685668d87fcaf97e..78b3f19e7f37fe83edb25a723037417c1d2d7bd8 100644 (file)
@@ -13,7 +13,8 @@
  * the monitor API number.
  * Function signature : void highbank_smc1(u32 fn, u32 arg)
  */
-
+       .arch armv7-a
+       .arch_extension sec
 ENTRY(highbank_smc1)
        stmfd   sp!, {r4-r11, lr}
        mov     r12, r0
index a2441ed6b673ea3c37a4bde14779ca286816094d..39a7d93936417a7a44354cb77ba42ed2f09498d0 100644 (file)
 #include "hardware.h"
 
 static int num_idle_cpus = 0;
-static DEFINE_SPINLOCK(cpuidle_lock);
+static DEFINE_RAW_SPINLOCK(cpuidle_lock);
 
 static int imx6q_enter_wait(struct cpuidle_device *dev,
                            struct cpuidle_driver *drv, int index)
 {
-       spin_lock(&cpuidle_lock);
+       raw_spin_lock(&cpuidle_lock);
        if (++num_idle_cpus == num_online_cpus())
                imx6_set_lpm(WAIT_UNCLOCKED);
-       spin_unlock(&cpuidle_lock);
+       raw_spin_unlock(&cpuidle_lock);
 
        cpu_do_idle();
 
-       spin_lock(&cpuidle_lock);
+       raw_spin_lock(&cpuidle_lock);
        if (num_idle_cpus-- == num_online_cpus())
                imx6_set_lpm(WAIT_CLOCKED);
-       spin_unlock(&cpuidle_lock);
+       raw_spin_unlock(&cpuidle_lock);
 
        return index;
 }
index dec5d90a66ce7cbe1303c52ca1ba611ec9579889..95713450591ae7acc98c18768f93118aeff2c088 100644 (file)
@@ -94,6 +94,12 @@ static void __init imx7d_init_machine(void)
        imx7d_enet_init();
 }
 
+static void __init imx7d_init_late(void)
+{
+       if (IS_ENABLED(CONFIG_ARM_IMX_CPUFREQ_DT))
+               platform_device_register_simple("imx-cpufreq-dt", -1, NULL, 0);
+}
+
 static void __init imx7d_init_irq(void)
 {
        imx_init_revision_from_anatop();
@@ -110,5 +116,6 @@ static const char *const imx7d_dt_compat[] __initconst = {
 DT_MACHINE_START(IMX7D, "Freescale i.MX7 Dual (Device Tree)")
        .init_irq       = imx7d_init_irq,
        .init_machine   = imx7d_init_machine,
+       .init_late      = imx7d_init_late,
        .dt_compat      = imx7d_dt_compat,
 MACHINE_END
index f8b0dccac8dca21a51460e1c30e847f13f9272a4..739b38be569683c52d137c280d7733cd63750531 100644 (file)
@@ -1,9 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 obj-y                                  := keystone.o smc.o
 
-plus_sec := $(call as-instr,.arch_extension sec,+sec)
-AFLAGS_smc.o                           :=-Wa,-march=armv7-a$(plus_sec)
-
 obj-$(CONFIG_SMP)                      += platsmp.o
 
 # PM domain driver for Keystone SOCs
index 76d0bf6ac73ccf767c55a1b23ff03a320a7b2ca0..21ef75cf537091fa9262d928e22bfdcda4228666 100644 (file)
@@ -18,6 +18,7 @@
  *
  * Return: Non zero value on failure
  */
+       .arch_extension sec
 ENTRY(keystone_cpu_smc)
        stmfd   sp!, {r4-r11, lr}
        smc     #0
index 85d1b13c9215b89da7087e19b2aefe0ceb68e515..60065055162199dc4188fff1e448acb37e6d4627 100644 (file)
@@ -41,18 +41,10 @@ obj-$(CONFIG_SOC_OMAP5)                     += $(omap-4-5-common) $(smp-y) sleep44xx.o
 obj-$(CONFIG_SOC_AM43XX)               += $(omap-4-5-common)
 obj-$(CONFIG_SOC_DRA7XX)               += $(omap-4-5-common) $(smp-y) sleep44xx.o
 
-plus_sec := $(call as-instr,.arch_extension sec,+sec)
-AFLAGS_omap-headsmp.o                  :=-Wa,-march=armv7-a$(plus_sec)
-AFLAGS_omap-smc.o                      :=-Wa,-march=armv7-a$(plus_sec)
-AFLAGS_sleep44xx.o                     :=-Wa,-march=armv7-a$(plus_sec)
-
 # Functions loaded to SRAM
 obj-$(CONFIG_SOC_OMAP2420)             += sram242x.o
 obj-$(CONFIG_SOC_OMAP2430)             += sram243x.o
 
-AFLAGS_sram242x.o                      :=-Wa,-march=armv6
-AFLAGS_sram243x.o                      :=-Wa,-march=armv6
-
 # Restart code (OMAP4/5 currently in omap4-common.c)
 obj-$(CONFIG_SOC_OMAP2420)             += omap2-restart.o
 obj-$(CONFIG_SOC_OMAP2430)             += omap2-restart.o
@@ -94,11 +86,6 @@ obj-$(CONFIG_PM_DEBUG)                       += pm-debug.o
 obj-$(CONFIG_POWER_AVS_OMAP)           += sr_device.o
 obj-$(CONFIG_POWER_AVS_OMAP_CLASS3)    += smartreflex-class3.o
 
-AFLAGS_sleep24xx.o                     :=-Wa,-march=armv6
-AFLAGS_sleep34xx.o                     :=-Wa,-march=armv7-a$(plus_sec)
-AFLAGS_sleep33xx.o                     :=-Wa,-march=armv7-a$(plus_sec)
-AFLAGS_sleep43xx.o                     :=-Wa,-march=armv7-a$(plus_sec)
-
 endif
 
 ifeq ($(CONFIG_CPU_IDLE),y)
index 7d0db77ab8cbf84914fa70d3aa6787c679ef9e05..1762f919941f4f98d3159e83d8d39f882f23477c 100644 (file)
@@ -55,6 +55,8 @@ ENDPROC(omap5_secondary_startup)
  * omap5_secondary_startup if the primary CPU was put into HYP mode by
  * the boot loader.
  */
+       .arch armv7-a
+       .arch_extension sec
 ENTRY(omap5_secondary_hyp_startup)
 wait_2:        ldr     r2, =AUX_CORE_BOOT0_PA  @ read from AuxCoreBoot0
        ldr     r0, [r2]
index 630b9bd099e0ddfa39f2414ee20f82066e200c46..fd2bcd91f4a14c874bd8b833bd91a7e5ef0d8c8c 100644 (file)
@@ -20,7 +20,8 @@
  * link register "lr".
  * Function signature : void omap_smc1(u32 fn, u32 arg)
  */
-
+       .arch armv7-a
+       .arch_extension sec
 ENTRY(omap_smc1)
        stmfd   sp!, {r2-r12, lr}
        mov     r12, r0
index e0350476feaad3a8bbe4300e9d5457a02bc33ccc..203664c40d3d2de2728ef48abbec2b0ccbc6226f 100644 (file)
@@ -3442,6 +3442,7 @@ static int omap_hwmod_check_module(struct device *dev,
  * @dev: struct device
  * @oh: module
  * @sysc_fields: sysc register bits
+ * @clockdomain: clockdomain
  * @rev_offs: revision register offset
  * @sysc_offs: sysconfig register offset
  * @syss_offs: sysstatus register offset
@@ -3453,6 +3454,7 @@ static int omap_hwmod_check_module(struct device *dev,
 static int omap_hwmod_allocate_module(struct device *dev, struct omap_hwmod *oh,
                                      const struct ti_sysc_module_data *data,
                                      struct sysc_regbits *sysc_fields,
+                                     struct clockdomain *clkdm,
                                      s32 rev_offs, s32 sysc_offs,
                                      s32 syss_offs, u32 sysc_flags,
                                      u32 idlemodes)
@@ -3460,8 +3462,6 @@ static int omap_hwmod_allocate_module(struct device *dev, struct omap_hwmod *oh,
        struct omap_hwmod_class_sysconfig *sysc;
        struct omap_hwmod_class *class = NULL;
        struct omap_hwmod_ocp_if *oi = NULL;
-       struct clockdomain *clkdm = NULL;
-       struct clk *clk = NULL;
        void __iomem *regs = NULL;
        unsigned long flags;
 
@@ -3508,36 +3508,6 @@ static int omap_hwmod_allocate_module(struct device *dev, struct omap_hwmod *oh,
                oi->user = OCP_USER_MPU | OCP_USER_SDMA;
        }
 
-       if (!oh->_clk) {
-               struct clk_hw_omap *hwclk;
-
-               clk = of_clk_get_by_name(dev->of_node, "fck");
-               if (!IS_ERR(clk))
-                       clk_prepare(clk);
-               else
-                       clk = NULL;
-
-               /*
-                * Populate clockdomain based on dts clock. It is needed for
-                * clkdm_deny_idle() and clkdm_allow_idle() until we have have
-                * interconnect driver and reset driver capable of blocking
-                * clockdomain idle during reset, enable and idle.
-                */
-               if (clk) {
-                       hwclk = to_clk_hw_omap(__clk_get_hw(clk));
-                       if (hwclk && hwclk->clkdm_name)
-                               clkdm = clkdm_lookup(hwclk->clkdm_name);
-               }
-
-               /*
-                * Note that we assume interconnect driver manages the clocks
-                * and do not need to populate oh->_clk for dynamically
-                * allocated modules.
-                */
-               clk_unprepare(clk);
-               clk_put(clk);
-       }
-
        spin_lock_irqsave(&oh->_lock, flags);
        if (regs)
                oh->_mpu_rt_va = regs;
@@ -3623,7 +3593,7 @@ int omap_hwmod_init_module(struct device *dev,
        u32 sysc_flags, idlemodes;
        int error;
 
-       if (!dev || !data)
+       if (!dev || !data || !data->name || !cookie)
                return -EINVAL;
 
        oh = _lookup(data->name);
@@ -3694,7 +3664,8 @@ int omap_hwmod_init_module(struct device *dev,
                return error;
 
        return omap_hwmod_allocate_module(dev, oh, data, sysc_fields,
-                                         rev_offs, sysc_offs, syss_offs,
+                                         cookie->clkdm, rev_offs,
+                                         sysc_offs, syss_offs,
                                          sysc_flags, idlemodes);
 }
 
index 4c3543bae562a18ebca8a28968e7735b858598cc..adb6271f819be0caa4ea0154e77b21ee5756782b 100644 (file)
@@ -529,7 +529,7 @@ static struct omap_hwmod_class_sysconfig am33xx_gpio_sysc = {
        .sysc_fields    = &omap_hwmod_sysc_type1,
 };
 
-struct omap_hwmod_class am33xx_gpio_hwmod_class = {
+static struct omap_hwmod_class am33xx_gpio_hwmod_class = {
        .name           = "gpio",
        .sysc           = &am33xx_gpio_sysc,
 };
@@ -539,7 +539,7 @@ static struct omap_hwmod_opt_clk gpio1_opt_clks[] = {
        { .role = "dbclk", .clk = "gpio1_dbclk" },
 };
 
-struct omap_hwmod am33xx_gpio1_hwmod = {
+static struct omap_hwmod am33xx_gpio1_hwmod = {
        .name           = "gpio2",
        .class          = &am33xx_gpio_hwmod_class,
        .clkdm_name     = "l4ls_clkdm",
@@ -559,7 +559,7 @@ static struct omap_hwmod_opt_clk gpio2_opt_clks[] = {
        { .role = "dbclk", .clk = "gpio2_dbclk" },
 };
 
-struct omap_hwmod am33xx_gpio2_hwmod = {
+static struct omap_hwmod am33xx_gpio2_hwmod = {
        .name           = "gpio3",
        .class          = &am33xx_gpio_hwmod_class,
        .clkdm_name     = "l4ls_clkdm",
@@ -579,7 +579,7 @@ static struct omap_hwmod_opt_clk gpio3_opt_clks[] = {
        { .role = "dbclk", .clk = "gpio3_dbclk" },
 };
 
-struct omap_hwmod am33xx_gpio3_hwmod = {
+static struct omap_hwmod am33xx_gpio3_hwmod = {
        .name           = "gpio4",
        .class          = &am33xx_gpio_hwmod_class,
        .clkdm_name     = "l4ls_clkdm",
index b0f8c9a70c6899d456558c1802bd498e5de504db..6c6f8fce854e2040276ab85b01419930940895bd 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/platform_data/wkup_m3.h>
 #include <linux/platform_data/asoc-ti-mcbsp.h>
 
+#include "clockdomain.h"
 #include "common.h"
 #include "common-board-devices.h"
 #include "control.h"
@@ -460,6 +461,62 @@ static void __init dra7x_evm_mmc_quirk(void)
 }
 #endif
 
+static struct clockdomain *ti_sysc_find_one_clockdomain(struct clk *clk)
+{
+       struct clockdomain *clkdm = NULL;
+       struct clk_hw_omap *hwclk;
+
+       hwclk = to_clk_hw_omap(__clk_get_hw(clk));
+       if (hwclk && hwclk->clkdm_name)
+               clkdm = clkdm_lookup(hwclk->clkdm_name);
+
+       return clkdm;
+}
+
+/**
+ * ti_sysc_clkdm_init - find clockdomain based on clock
+ * @fck: device functional clock
+ * @ick: device interface clock
+ * @dev: struct device
+ *
+ * Populate clockdomain based on clock. It is needed for
+ * clkdm_deny_idle() and clkdm_allow_idle() for blocking clockdomain
+ * clockdomain idle during reset, enable and idle.
+ *
+ * Note that we assume interconnect driver manages the clocks
+ * and do not need to populate oh->_clk for dynamically
+ * allocated modules.
+ */
+static int ti_sysc_clkdm_init(struct device *dev,
+                             struct clk *fck, struct clk *ick,
+                             struct ti_sysc_cookie *cookie)
+{
+       if (fck)
+               cookie->clkdm = ti_sysc_find_one_clockdomain(fck);
+       if (cookie->clkdm)
+               return 0;
+       if (ick)
+               cookie->clkdm = ti_sysc_find_one_clockdomain(ick);
+       if (cookie->clkdm)
+               return 0;
+
+       return -ENODEV;
+}
+
+static void ti_sysc_clkdm_deny_idle(struct device *dev,
+                                   const struct ti_sysc_cookie *cookie)
+{
+       if (cookie->clkdm)
+               clkdm_deny_idle(cookie->clkdm);
+}
+
+static void ti_sysc_clkdm_allow_idle(struct device *dev,
+                                    const struct ti_sysc_cookie *cookie)
+{
+       if (cookie->clkdm)
+               clkdm_allow_idle(cookie->clkdm);
+}
+
 static int ti_sysc_enable_module(struct device *dev,
                                 const struct ti_sysc_cookie *cookie)
 {
@@ -491,6 +548,9 @@ static struct of_dev_auxdata omap_auxdata_lookup[];
 
 static struct ti_sysc_platform_data ti_sysc_pdata = {
        .auxdata = omap_auxdata_lookup,
+       .init_clockdomain = ti_sysc_clkdm_init,
+       .clkdm_deny_idle = ti_sysc_clkdm_deny_idle,
+       .clkdm_allow_idle = ti_sysc_clkdm_allow_idle,
        .init_module = omap_hwmod_init_module,
        .enable_module = ti_sysc_enable_module,
        .idle_module = ti_sysc_idle_module,
index 47a816468cdb45a2cf55b3751dfd8dd82c1c40c3..68fee339d3f12755bf0172bc27eac07e2743838e 100644 (file)
@@ -24,6 +24,7 @@
 #define BIT(nr)                        (1 << (nr))
 
        .arm
+       .arch armv7-a
        .align 3
 
 ENTRY(am33xx_do_wfi)
index 75ea4723ec0e888aa939f03a2be7347f61cd7f85..ac1324c6453b5b121a4466b833787a1a9086d2cd 100644 (file)
@@ -83,6 +83,8 @@ ENDPROC(enable_omap3630_toggle_l2_on_restore)
  *
  * r0 = physical address of the parameters
  */
+       .arch armv7-a
+       .arch_extension sec
 ENTRY(save_secure_ram_context)
        stmfd   sp!, {r4 - r11, lr}     @ save registers on stack
        mov     r3, r0                  @ physical address of parameters
index 0c1031442571ff3933789ba72068429782f1e144..c1f4e4852644e7e1e917e216d20fd50485c57530 100644 (file)
@@ -56,6 +56,8 @@
 #define RTC_PMIC_EXT_WAKEUP_EN                         BIT(0)
 
        .arm
+       .arch armv7-a
+       .arch_extension sec
        .align 3
 
 ENTRY(am43xx_do_wfi)
index 934033ad847fb13d2a81fca2c387269b3f3c4fd4..f60f6a9aed7351532fbe0116a0fa7025e20dc367 100644 (file)
 #include "omap44xx.h"
 #include "omap4-sar-layout.h"
 
+       .arch armv7-a
+
 #if defined(CONFIG_SMP) && defined(CONFIG_PM)
 
+       .arch_extension sec
 .macro DO_SMC
        dsb
        smc     #0
index 72b5c3db37dc6942565439de234359dd104b3988..a3af4a2f9446941e8e8388fcdccb6a1c58d8f65f 100644 (file)
@@ -47,7 +47,3 @@
 #define LUBBOCK_LAST_IRQ       LUBBOCK_IRQ(6)
 
 #define LUBBOCK_SA1111_IRQ_BASE        (LUBBOCK_NR_IRQS + 32)
-
-#ifndef __ASSEMBLY__
-extern void lubbock_set_misc_wr(unsigned int mask, unsigned int set);
-#endif
index a3ecccc24ec5f000dcca601b8c2744c90903f280..742d18a1f7dc8c0424efcd79133f800397a43d61 100644 (file)
@@ -116,12 +116,11 @@ void lubbock_set_hexled(uint32_t value)
 
 static struct gpio_chip *lubbock_misc_wr_gc;
 
-void lubbock_set_misc_wr(unsigned int mask, unsigned int set)
+static void lubbock_set_misc_wr(unsigned int mask, unsigned int set)
 {
        unsigned long m = mask, v = set;
        lubbock_misc_wr_gc->set_multiple(lubbock_misc_wr_gc, &m, &v);
 }
-EXPORT_SYMBOL(lubbock_set_misc_wr);
 
 static int lubbock_udc_is_connected(void)
 {
index 909fffee024044f2dc0475dca18d67db694eb5e3..649e0a54784cd75b4a94779d9646cf6fdd60cbcc 100644 (file)
@@ -269,19 +269,25 @@ static void __init rockchip_smp_prepare_cpus(unsigned int max_cpus)
        sram_base_addr = of_iomap(node, 0);
        if (!sram_base_addr) {
                pr_err("%s: could not map sram registers\n", __func__);
+               of_node_put(node);
                return;
        }
 
-       if (has_pmu && rockchip_smp_prepare_pmu())
+       if (has_pmu && rockchip_smp_prepare_pmu()) {
+               of_node_put(node);
                return;
+       }
 
        if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) {
-               if (rockchip_smp_prepare_sram(node))
+               if (rockchip_smp_prepare_sram(node)) {
+                       of_node_put(node);
                        return;
+               }
 
                /* enable the SCU power domain */
                pmu_set_power_domain(PMU_PWRDN_SCU, true);
 
+               of_node_put(node);
                node = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-scu");
                if (!node) {
                        pr_err("%s: missing scu\n", __func__);
@@ -291,6 +297,7 @@ static void __init rockchip_smp_prepare_cpus(unsigned int max_cpus)
                scu_base_addr = of_iomap(node, 0);
                if (!scu_base_addr) {
                        pr_err("%s: could not map scu registers\n", __func__);
+                       of_node_put(node);
                        return;
                }
 
@@ -309,6 +316,7 @@ static void __init rockchip_smp_prepare_cpus(unsigned int max_cpus)
                asm ("mrc p15, 1, %0, c9, c0, 2\n" : "=r" (l2ctlr));
                ncores = ((l2ctlr >> 24) & 0x3) + 1;
        }
+       of_node_put(node);
 
        /* Make sure that all cores except the first are really off */
        for (i = 1; i < ncores; i++)
index 744b5b332e42e138dfe65566504feaab968b6592..87389d9456b95c30fc0730df589310d0c2523005 100644 (file)
@@ -257,12 +257,14 @@ static int __init rk3288_suspend_init(struct device_node *np)
        rk3288_bootram_base = of_iomap(sram_np, 0);
        if (!rk3288_bootram_base) {
                pr_err("%s: could not map bootram base\n", __func__);
+               of_node_put(sram_np);
                return -ENOMEM;
        }
 
        ret = of_address_to_resource(sram_np, 0, &res);
        if (ret) {
                pr_err("%s: could not get bootram phy addr\n", __func__);
+               of_node_put(sram_np);
                return ret;
        }
        rk3288_bootram_phy = res.start;
index 056ef54602901df4ae2c9e961fb68601d35796c1..90a645a18444583b199f663752993f9dae4597d8 100644 (file)
@@ -5,4 +5,5 @@
 
 # Object file lists.
 
-obj-y                  := dma.o ecard.o fiq.o irq.o riscpc.o time.o
+obj-y  :=dma.o ecard.o ecard-loader.o fiq.o floppydma.o io-acorn.o irq.o \
+         riscpc.o time.o
index 488d5c3b37f44ce6bfb35de1ac7d3f68384ac90f..50e0f97afd75ebef90153f5f61a565e87f0bf175 100644 (file)
 
 struct iomd_dma {
        struct dma_struct       dma;
-       unsigned int            state;
-       unsigned long           base;           /* Controller base address */
+       void __iomem            *base;          /* Controller base address */
        int                     irq;            /* Controller IRQ */
-       struct scatterlist      cur_sg;         /* Current controller buffer */
+       unsigned int            state;
+       dma_addr_t              cur_addr;
+       unsigned int            cur_len;
        dma_addr_t              dma_addr;
        unsigned int            dma_len;
 };
@@ -50,13 +51,13 @@ typedef enum {
 #define CR     (IOMD_IO0CR - IOMD_IO0CURA)
 #define ST     (IOMD_IO0ST - IOMD_IO0CURA)
 
-static void iomd_get_next_sg(struct scatterlist *sg, struct iomd_dma *idma)
+static void iomd_get_next_sg(struct iomd_dma *idma)
 {
        unsigned long end, offset, flags = 0;
 
        if (idma->dma.sg) {
-               sg->dma_address = idma->dma_addr;
-               offset = sg->dma_address & ~PAGE_MASK;
+               idma->cur_addr = idma->dma_addr;
+               offset = idma->cur_addr & ~PAGE_MASK;
 
                end = offset + idma->dma_len;
 
@@ -66,7 +67,7 @@ static void iomd_get_next_sg(struct scatterlist *sg, struct iomd_dma *idma)
                if (offset + TRANSFER_SIZE >= end)
                        flags |= DMA_END_L;
 
-               sg->length = end - TRANSFER_SIZE;
+               idma->cur_len = end - TRANSFER_SIZE;
 
                idma->dma_len -= end - offset;
                idma->dma_addr += end - offset;
@@ -84,52 +85,49 @@ static void iomd_get_next_sg(struct scatterlist *sg, struct iomd_dma *idma)
                }
        } else {
                flags = DMA_END_S | DMA_END_L;
-               sg->dma_address = 0;
-               sg->length = 0;
+               idma->cur_addr = 0;
+               idma->cur_len = 0;
        }
 
-       sg->length |= flags;
+       idma->cur_len |= flags;
 }
 
 static irqreturn_t iomd_dma_handle(int irq, void *dev_id)
 {
        struct iomd_dma *idma = dev_id;
-       unsigned long base = idma->base;
+       void __iomem *base = idma->base;
+       unsigned int state = idma->state;
+       unsigned int status, cur, end;
 
        do {
-               unsigned int status;
-
-               status = iomd_readb(base + ST);
+               status = readb(base + ST);
                if (!(status & DMA_ST_INT))
-                       return IRQ_HANDLED;
-
-               if ((idma->state ^ status) & DMA_ST_AB)
-                       iomd_get_next_sg(&idma->cur_sg, idma);
-
-               switch (status & (DMA_ST_OFL | DMA_ST_AB)) {
-               case DMA_ST_OFL:                        /* OIA */
-               case DMA_ST_AB:                         /* .IB */
-                       iomd_writel(idma->cur_sg.dma_address, base + CURA);
-                       iomd_writel(idma->cur_sg.length, base + ENDA);
-                       idma->state = DMA_ST_AB;
-                       break;
-
-               case DMA_ST_OFL | DMA_ST_AB:            /* OIB */
-               case 0:                                 /* .IA */
-                       iomd_writel(idma->cur_sg.dma_address, base + CURB);
-                       iomd_writel(idma->cur_sg.length, base + ENDB);
-                       idma->state = 0;
-                       break;
+                       goto out;
+
+               if ((state ^ status) & DMA_ST_AB)
+                       iomd_get_next_sg(idma);
+
+               // This efficiently implements state = OFL != AB ? AB : 0
+               state = ((status >> 2) ^ status) & DMA_ST_AB;
+               if (state) {
+                       cur = CURA;
+                       end = ENDA;
+               } else {
+                       cur = CURB;
+                       end = ENDB;
                }
+               writel(idma->cur_addr, base + cur);
+               writel(idma->cur_len, base + end);
 
                if (status & DMA_ST_OFL &&
-                   idma->cur_sg.length == (DMA_END_S|DMA_END_L))
+                   idma->cur_len == (DMA_END_S|DMA_END_L))
                        break;
        } while (1);
 
-       idma->state = ~DMA_ST_AB;
-       disable_irq(irq);
-
+       state = ~DMA_ST_AB;
+       disable_irq_nosync(irq);
+out:
+       idma->state = state;
        return IRQ_HANDLED;
 }
 
@@ -157,7 +155,7 @@ static struct device isa_dma_dev = {
 static void iomd_enable_dma(unsigned int chan, dma_t *dma)
 {
        struct iomd_dma *idma = container_of(dma, struct iomd_dma, dma);
-       unsigned long dma_base = idma->base;
+       void __iomem *base = idma->base;
        unsigned int ctrl = TRANSFER_SIZE | DMA_CR_E;
 
        if (idma->dma.invalid) {
@@ -177,27 +175,30 @@ static void iomd_enable_dma(unsigned int chan, dma_t *dma)
                                DMA_FROM_DEVICE : DMA_TO_DEVICE);
                }
 
-               iomd_writeb(DMA_CR_C, dma_base + CR);
+               idma->dma_addr = idma->dma.sg->dma_address;
+               idma->dma_len = idma->dma.sg->length;
+
+               writeb(DMA_CR_C, base + CR);
                idma->state = DMA_ST_AB;
        }
 
        if (idma->dma.dma_mode == DMA_MODE_READ)
                ctrl |= DMA_CR_D;
 
-       iomd_writeb(ctrl, dma_base + CR);
+       writeb(ctrl, base + CR);
        enable_irq(idma->irq);
 }
 
 static void iomd_disable_dma(unsigned int chan, dma_t *dma)
 {
        struct iomd_dma *idma = container_of(dma, struct iomd_dma, dma);
-       unsigned long dma_base = idma->base;
+       void __iomem *base = idma->base;
        unsigned long flags;
 
        local_irq_save(flags);
        if (idma->state != ~DMA_ST_AB)
                disable_irq(idma->irq);
-       iomd_writeb(0, dma_base + CR);
+       writeb(0, base + CR);
        local_irq_restore(flags);
 }
 
@@ -360,17 +361,17 @@ static int __init rpc_dma_init(void)
         */
        iomd_writeb(DMA_EXT_IO3|DMA_EXT_IO2, IOMD_DMAEXT);
 
-       iomd_dma[DMA_0].base    = IOMD_IO0CURA;
+       iomd_dma[DMA_0].base    = IOMD_BASE + IOMD_IO0CURA;
        iomd_dma[DMA_0].irq     = IRQ_DMA0;
-       iomd_dma[DMA_1].base    = IOMD_IO1CURA;
+       iomd_dma[DMA_1].base    = IOMD_BASE + IOMD_IO1CURA;
        iomd_dma[DMA_1].irq     = IRQ_DMA1;
-       iomd_dma[DMA_2].base    = IOMD_IO2CURA;
+       iomd_dma[DMA_2].base    = IOMD_BASE + IOMD_IO2CURA;
        iomd_dma[DMA_2].irq     = IRQ_DMA2;
-       iomd_dma[DMA_3].base    = IOMD_IO3CURA;
+       iomd_dma[DMA_3].base    = IOMD_BASE + IOMD_IO3CURA;
        iomd_dma[DMA_3].irq     = IRQ_DMA3;
-       iomd_dma[DMA_S0].base   = IOMD_SD0CURA;
+       iomd_dma[DMA_S0].base   = IOMD_BASE + IOMD_SD0CURA;
        iomd_dma[DMA_S0].irq    = IRQ_DMAS0;
-       iomd_dma[DMA_S1].base   = IOMD_SD1CURA;
+       iomd_dma[DMA_S1].base   = IOMD_BASE + IOMD_SD1CURA;
        iomd_dma[DMA_S1].irq    = IRQ_DMAS1;
 
        for (i = DMA_0; i <= DMA_S1; i++) {
index cf0593bc42d2f97dd5c26261ab6932b4c4cb23cf..75cfad2cb143cf14b035b0433b9505db0ff52e20 100644 (file)
@@ -67,17 +67,21 @@ struct expcard_blacklist {
        unsigned short   manufacturer;
        unsigned short   product;
        const char      *type;
+       void (*init)(ecard_t *ec);
 };
 
 static ecard_t *cards;
 static ecard_t *slot_to_expcard[MAX_ECARDS];
 static unsigned int ectcr;
 
+static void atomwide_3p_quirk(ecard_t *ec);
+
 /* List of descriptions of cards which don't have an extended
  * identification, or chunk directories containing a description.
  */
 static struct expcard_blacklist __initdata blacklist[] = {
-       { MANU_ACORN, PROD_ACORN_ETHER1, "Acorn Ether1" }
+       { MANU_ACORN, PROD_ACORN_ETHER1, "Acorn Ether1" },
+       { MANU_ATOMWIDE, PROD_ATOMWIDE_3PSERIAL, NULL, atomwide_3p_quirk },
 };
 
 asmlinkage extern int
@@ -493,18 +497,21 @@ static void ecard_dump_irq_state(void)
        printk("Expansion card IRQ state:\n");
 
        for (ec = cards; ec; ec = ec->next) {
+               const char *claimed;
+
                if (ec->slot_no == 8)
                        continue;
 
-               printk("  %d: %sclaimed, ",
-                      ec->slot_no, ec->claimed ? "" : "not ");
+               claimed = ec->claimed ? "" : "not ";
 
                if (ec->ops && ec->ops->irqpending &&
                    ec->ops != &ecard_default_ops)
-                       printk("irq %spending\n",
+                       printk("  %d: %sclaimed irq %spending\n",
+                              ec->slot_no, claimed,
                               ec->ops->irqpending(ec) ? "" : "not ");
                else
-                       printk("irqaddr %p, mask = %02X, status = %02X\n",
+                       printk("  %d: %sclaimed irqaddr %p, mask = %02X, status = %02X\n",
+                              ec->slot_no, claimed,
                               ec->irqaddr, ec->irqmask, readb(ec->irqaddr));
        }
 }
@@ -865,6 +872,16 @@ void __iomem *ecardm_iomap(struct expansion_card *ec, unsigned int res,
 }
 EXPORT_SYMBOL(ecardm_iomap);
 
+static void atomwide_3p_quirk(ecard_t *ec)
+{
+       void __iomem *addr = __ecard_address(ec, ECARD_IOC, ECARD_SYNC);
+       unsigned int i;
+
+       /* Disable interrupts on each port */
+       for (i = 0x2000; i <= 0x2800; i += 0x0400)
+               writeb(0, addr + i + 4);        
+}
+
 /*
  * Probe for an expansion card.
  *
@@ -921,7 +938,10 @@ static int __init ecard_probe(int slot, unsigned irq, card_type_t type)
        for (i = 0; i < ARRAY_SIZE(blacklist); i++)
                if (blacklist[i].manufacturer == ec->cid.manufacturer &&
                    blacklist[i].product == ec->cid.product) {
-                       ec->card_desc = blacklist[i].type;
+                       if (blacklist[i].type)
+                               ec->card_desc = blacklist[i].type;
+                       if (blacklist[i].init)
+                               blacklist[i].init(ec);
                        break;
                }
 
index a023b5f9bbbbace8695fcece2db33d136b8713ef..1fbe7eb956fd20f3e7e6b903ddfabcd978c24983 100644 (file)
@@ -115,29 +115,22 @@ static void arch_decomp_setup(void)
        struct tag *t = (struct tag *)params;
        unsigned int nr_pages = 0, page_size = PAGE_SIZE;
 
-       if (t->hdr.tag == ATAG_CORE)
-       {
-               for (; t->hdr.size; t = tag_next(t))
-               {
-                       if (t->hdr.tag == ATAG_VIDEOTEXT)
-                       {
+       if (t->hdr.tag == ATAG_CORE) {
+               for (; t->hdr.size; t = tag_next(t)) {
+                       if (t->hdr.tag == ATAG_VIDEOTEXT) {
                                video_num_rows = t->u.videotext.video_lines;
                                video_num_cols = t->u.videotext.video_cols;
-                               bytes_per_char_h = t->u.videotext.video_points;
-                               bytes_per_char_v = t->u.videotext.video_points;
                                video_x = t->u.videotext.x;
                                video_y = t->u.videotext.y;
-                       }
-
-                       if (t->hdr.tag == ATAG_MEM)
-                       {
+                       } else if (t->hdr.tag == ATAG_VIDEOLFB) {
+                               bytes_per_char_h = t->u.videolfb.lfb_depth;
+                               bytes_per_char_v = 8;
+                       } else if (t->hdr.tag == ATAG_MEM) {
                                page_size = PAGE_SIZE;
                                nr_pages += (t->u.mem.size / PAGE_SIZE);
                        }
                }
-       }
-       else
-       {
+       } else {
                nr_pages = params->nr_pages;
                page_size = params->page_size;
                video_num_rows = params->video_num_rows;
index b8a61cb112073643256dbb693a8351e07c1f4335..803aeb126f0e9f9d6eaa061e26d7b21df6cc51b6 100644 (file)
 #include <asm/irq.h>
 #include <asm/fiq.h>
 
-static void iomd_ack_irq_a(struct irq_data *d)
-{
-       unsigned int val, mask;
-
-       mask = 1 << d->irq;
-       val = iomd_readb(IOMD_IRQMASKA);
-       iomd_writeb(val & ~mask, IOMD_IRQMASKA);
-       iomd_writeb(mask, IOMD_IRQCLRA);
-}
-
-static void iomd_mask_irq_a(struct irq_data *d)
-{
-       unsigned int val, mask;
+// These are offsets from the stat register for each IRQ bank
+#define STAT   0x00
+#define REQ    0x04
+#define CLR    0x04
+#define MASK   0x08
 
-       mask = 1 << d->irq;
-       val = iomd_readb(IOMD_IRQMASKA);
-       iomd_writeb(val & ~mask, IOMD_IRQMASKA);
-}
-
-static void iomd_unmask_irq_a(struct irq_data *d)
+static void __iomem *iomd_get_base(struct irq_data *d)
 {
-       unsigned int val, mask;
+       void *cd = irq_data_get_irq_chip_data(d);
 
-       mask = 1 << d->irq;
-       val = iomd_readb(IOMD_IRQMASKA);
-       iomd_writeb(val | mask, IOMD_IRQMASKA);
+       return (void __iomem *)(unsigned long)cd;
 }
 
-static struct irq_chip iomd_a_chip = {
-       .irq_ack        = iomd_ack_irq_a,
-       .irq_mask       = iomd_mask_irq_a,
-       .irq_unmask     = iomd_unmask_irq_a,
-};
-
-static void iomd_mask_irq_b(struct irq_data *d)
+static void iomd_set_base_mask(unsigned int irq, void __iomem *base, u32 mask)
 {
-       unsigned int val, mask;
+       struct irq_data *d = irq_get_irq_data(irq);
 
-       mask = 1 << (d->irq & 7);
-       val = iomd_readb(IOMD_IRQMASKB);
-       iomd_writeb(val & ~mask, IOMD_IRQMASKB);
+       d->mask = mask;
+       irq_set_chip_data(irq, (void *)(unsigned long)base);
 }
 
-static void iomd_unmask_irq_b(struct irq_data *d)
+static void iomd_irq_mask_ack(struct irq_data *d)
 {
-       unsigned int val, mask;
+       void __iomem *base = iomd_get_base(d);
+       unsigned int val, mask = d->mask;
 
-       mask = 1 << (d->irq & 7);
-       val = iomd_readb(IOMD_IRQMASKB);
-       iomd_writeb(val | mask, IOMD_IRQMASKB);
+       val = readb(base + MASK);
+       writeb(val & ~mask, base + MASK);
+       writeb(mask, base + CLR);
 }
 
-static struct irq_chip iomd_b_chip = {
-       .irq_ack        = iomd_mask_irq_b,
-       .irq_mask       = iomd_mask_irq_b,
-       .irq_unmask     = iomd_unmask_irq_b,
-};
-
-static void iomd_mask_irq_dma(struct irq_data *d)
+static void iomd_irq_mask(struct irq_data *d)
 {
-       unsigned int val, mask;
+       void __iomem *base = iomd_get_base(d);
+       unsigned int val, mask = d->mask;
 
-       mask = 1 << (d->irq & 7);
-       val = iomd_readb(IOMD_DMAMASK);
-       iomd_writeb(val & ~mask, IOMD_DMAMASK);
+       val = readb(base + MASK);
+       writeb(val & ~mask, base + MASK);
 }
 
-static void iomd_unmask_irq_dma(struct irq_data *d)
+static void iomd_irq_unmask(struct irq_data *d)
 {
-       unsigned int val, mask;
+       void __iomem *base = iomd_get_base(d);
+       unsigned int val, mask = d->mask;
 
-       mask = 1 << (d->irq & 7);
-       val = iomd_readb(IOMD_DMAMASK);
-       iomd_writeb(val | mask, IOMD_DMAMASK);
+       val = readb(base + MASK);
+       writeb(val | mask, base + MASK);
 }
 
-static struct irq_chip iomd_dma_chip = {
-       .irq_ack        = iomd_mask_irq_dma,
-       .irq_mask       = iomd_mask_irq_dma,
-       .irq_unmask     = iomd_unmask_irq_dma,
+static struct irq_chip iomd_chip_clr = {
+       .irq_mask_ack   = iomd_irq_mask_ack,
+       .irq_mask       = iomd_irq_mask,
+       .irq_unmask     = iomd_irq_unmask,
 };
 
-static void iomd_mask_irq_fiq(struct irq_data *d)
-{
-       unsigned int val, mask;
-
-       mask = 1 << (d->irq & 7);
-       val = iomd_readb(IOMD_FIQMASK);
-       iomd_writeb(val & ~mask, IOMD_FIQMASK);
-}
-
-static void iomd_unmask_irq_fiq(struct irq_data *d)
-{
-       unsigned int val, mask;
-
-       mask = 1 << (d->irq & 7);
-       val = iomd_readb(IOMD_FIQMASK);
-       iomd_writeb(val | mask, IOMD_FIQMASK);
-}
-
-static struct irq_chip iomd_fiq_chip = {
-       .irq_ack        = iomd_mask_irq_fiq,
-       .irq_mask       = iomd_mask_irq_fiq,
-       .irq_unmask     = iomd_unmask_irq_fiq,
+static struct irq_chip iomd_chip_noclr = {
+       .irq_mask       = iomd_irq_mask,
+       .irq_unmask     = iomd_irq_unmask,
 };
 
 extern unsigned char rpc_default_fiq_start, rpc_default_fiq_end;
 
 void __init rpc_init_irq(void)
 {
-       unsigned int irq, clr, set = 0;
+       unsigned int irq, clr, set;
 
        iomd_writeb(0, IOMD_IRQMASKA);
        iomd_writeb(0, IOMD_IRQMASKB);
@@ -130,6 +84,7 @@ void __init rpc_init_irq(void)
 
        for (irq = 0; irq < NR_IRQS; irq++) {
                clr = IRQ_NOREQUEST;
+               set = 0;
 
                if (irq <= 6 || (irq >= 9 && irq <= 15))
                        clr |= IRQ_NOPROBE;
@@ -140,30 +95,37 @@ void __init rpc_init_irq(void)
 
                switch (irq) {
                case 0 ... 7:
-                       irq_set_chip_and_handler(irq, &iomd_a_chip,
+                       irq_set_chip_and_handler(irq, &iomd_chip_clr,
                                                 handle_level_irq);
                        irq_modify_status(irq, clr, set);
+                       iomd_set_base_mask(irq, IOMD_BASE + IOMD_IRQSTATA,
+                                          BIT(irq));
                        break;
 
                case 8 ... 15:
-                       irq_set_chip_and_handler(irq, &iomd_b_chip,
+                       irq_set_chip_and_handler(irq, &iomd_chip_noclr,
                                                 handle_level_irq);
                        irq_modify_status(irq, clr, set);
+                       iomd_set_base_mask(irq, IOMD_BASE + IOMD_IRQSTATB,
+                                          BIT(irq - 8));
                        break;
 
                case 16 ... 21:
-                       irq_set_chip_and_handler(irq, &iomd_dma_chip,
+                       irq_set_chip_and_handler(irq, &iomd_chip_noclr,
                                                 handle_level_irq);
                        irq_modify_status(irq, clr, set);
+                       iomd_set_base_mask(irq, IOMD_BASE + IOMD_DMASTAT,
+                                          BIT(irq - 16));
                        break;
 
                case 64 ... 71:
-                       irq_set_chip(irq, &iomd_fiq_chip);
+                       irq_set_chip(irq, &iomd_chip_noclr);
                        irq_modify_status(irq, clr, set);
+                       iomd_set_base_mask(irq, IOMD_BASE + IOMD_FIQSTAT,
+                                          BIT(irq - 64));
                        break;
                }
        }
 
        init_FIQ(FIQ_START);
 }
-
index e97f93a0af1def139656dd79200d1f9872806500..1d750152b160bec69194a923e59eda368e482037 100644 (file)
@@ -10,7 +10,7 @@
  *   04-Dec-1997       RMK     Updated for new arch/arm/time.c
  *   13=Jun-2004       DS      Moved to arch/arm/common b/c shared w/CLPS7500
  */
-#include <linux/timex.h>
+#include <linux/clocksource.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
 #define RPC_CLOCK_FREQ 2000000
 #define RPC_LATCH DIV_ROUND_CLOSEST(RPC_CLOCK_FREQ, HZ)
 
-static u32 ioc_timer_gettimeoffset(void)
+static u32 ioc_time;
+
+static u64 ioc_timer_read(struct clocksource *cs)
 {
        unsigned int count1, count2, status;
-       long offset;
+       unsigned long flags;
+       u32 ticks;
 
+       local_irq_save(flags);
        ioc_writeb (0, IOC_T0LATCH);
        barrier ();
        count1 = ioc_readb(IOC_T0CNTL) | (ioc_readb(IOC_T0CNTH) << 8);
@@ -38,27 +42,34 @@ static u32 ioc_timer_gettimeoffset(void)
        ioc_writeb (0, IOC_T0LATCH);
        barrier ();
        count2 = ioc_readb(IOC_T0CNTL) | (ioc_readb(IOC_T0CNTH) << 8);
+       ticks = ioc_time + RPC_LATCH - count2;
+       local_irq_restore(flags);
 
-       offset = count2;
        if (count2 < count1) {
                /*
-                * We have not had an interrupt between reading count1
-                * and count2.
+                * The timer has not reloaded between reading count1 and
+                * count2, check whether an interrupt was actually pending.
                 */
                if (status & (1 << 5))
-                       offset -= RPC_LATCH;
+                       ticks += RPC_LATCH;
        } else if (count2 > count1) {
                /*
-                * We have just had another interrupt between reading
-                * count1 and count2.
+                * The timer has reloaded, so count2 indicates the new
+                * count since the wrap.  The interrupt would not have
+                * been processed, so add the missed ticks.
                 */
-               offset -= RPC_LATCH;
+               ticks += RPC_LATCH;
        }
 
-       offset = (RPC_LATCH - offset) * (tick_nsec / 1000);
-       return DIV_ROUND_CLOSEST(offset, RPC_LATCH) * 1000;
+       return ticks;
 }
 
+static struct clocksource ioctime_clocksource = {
+       .read = ioc_timer_read,
+       .mask = CLOCKSOURCE_MASK(32),
+       .rating = 100,
+};
+
 void __init ioctime_init(void)
 {
        ioc_writeb(RPC_LATCH & 255, IOC_T0LTCHL);
@@ -69,6 +80,7 @@ void __init ioctime_init(void)
 static irqreturn_t
 ioc_timer_interrupt(int irq, void *dev_id)
 {
+       ioc_time += RPC_LATCH;
        timer_tick();
        return IRQ_HANDLED;
 }
@@ -83,7 +95,7 @@ static struct irqaction ioc_timer_irq = {
  */
 void __init ioc_timer_init(void)
 {
-       arch_gettimeoffset = ioc_timer_gettimeoffset;
+       WARN_ON(clocksource_register_hz(&ioctime_clocksource, RPC_CLOCK_FREQ));
        ioctime_init();
        setup_irq(IRQ_TIMER0, &ioc_timer_irq);
 }
index dd8d13fb8450c7af251e161d02cda05a94ab1c02..d96a101e550487e79c7e801ff9602846dffacae4 100644 (file)
@@ -519,6 +519,29 @@ static const struct gpio_keys_platform_data assabet_keys_pdata = {
        .rep = 0,
 };
 
+static struct gpiod_lookup_table assabet_uart1_gpio_table = {
+       .dev_id = "sa11x0-uart.1",
+       .table = {
+               GPIO_LOOKUP("assabet", 16, "dtr", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("assabet", 17, "rts", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("assabet", 25, "dcd", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("assabet", 26, "cts", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("assabet", 27, "dsr", GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
+static struct gpiod_lookup_table assabet_uart3_gpio_table = {
+       .dev_id = "sa11x0-uart.3",
+       .table = {
+               GPIO_LOOKUP("assabet", 28, "cts", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("assabet", 29, "dsr", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("assabet", 30, "dcd", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("assabet", 31, "rng", GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 static void __init assabet_init(void)
 {
        /*
@@ -565,7 +588,10 @@ static void __init assabet_init(void)
                        neponset_resources, ARRAY_SIZE(neponset_resources));
 #endif
        } else {
+               gpiod_add_lookup_table(&assabet_uart1_gpio_table);
+               gpiod_add_lookup_table(&assabet_uart3_gpio_table);
                gpiod_add_lookup_table(&assabet_cf_vcc_gpio_table);
+
                sa11x0_register_fixed_regulator(0, &assabet_cf_vcc_pdata,
                                        assabet_cf_vcc_consumers,
                                        ARRAY_SIZE(assabet_cf_vcc_consumers),
@@ -655,74 +681,13 @@ static void assabet_uart_pm(struct uart_port *port, u_int state, u_int oldstate)
 {
        if (port->mapbase == _Ser1UTCR0) {
                if (state)
-                       ASSABET_BCR_clear(ASSABET_BCR_RS232EN |
-                                         ASSABET_BCR_COM_RTS |
-                                         ASSABET_BCR_COM_DTR);
-               else
-                       ASSABET_BCR_set(ASSABET_BCR_RS232EN |
-                                       ASSABET_BCR_COM_RTS |
-                                       ASSABET_BCR_COM_DTR);
-       }
-}
-
-/*
- * Assabet uses COM_RTS and COM_DTR for both UART1 (com port)
- * and UART3 (radio module).  We only handle them for UART1 here.
- */
-static void assabet_set_mctrl(struct uart_port *port, u_int mctrl)
-{
-       if (port->mapbase == _Ser1UTCR0) {
-               u_int set = 0, clear = 0;
-
-               if (mctrl & TIOCM_RTS)
-                       clear |= ASSABET_BCR_COM_RTS;
+                       ASSABET_BCR_clear(ASSABET_BCR_RS232EN);
                else
-                       set |= ASSABET_BCR_COM_RTS;
-
-               if (mctrl & TIOCM_DTR)
-                       clear |= ASSABET_BCR_COM_DTR;
-               else
-                       set |= ASSABET_BCR_COM_DTR;
-
-               ASSABET_BCR_clear(clear);
-               ASSABET_BCR_set(set);
-       }
-}
-
-static u_int assabet_get_mctrl(struct uart_port *port)
-{
-       u_int ret = 0;
-       u_int bsr = ASSABET_BSR;
-
-       /* need 2 reads to read current value */
-       bsr = ASSABET_BSR;
-
-       if (port->mapbase == _Ser1UTCR0) {
-               if (bsr & ASSABET_BSR_COM_DCD)
-                       ret |= TIOCM_CD;
-               if (bsr & ASSABET_BSR_COM_CTS)
-                       ret |= TIOCM_CTS;
-               if (bsr & ASSABET_BSR_COM_DSR)
-                       ret |= TIOCM_DSR;
-       } else if (port->mapbase == _Ser3UTCR0) {
-               if (bsr & ASSABET_BSR_RAD_DCD)
-                       ret |= TIOCM_CD;
-               if (bsr & ASSABET_BSR_RAD_CTS)
-                       ret |= TIOCM_CTS;
-               if (bsr & ASSABET_BSR_RAD_DSR)
-                       ret |= TIOCM_DSR;
-               if (bsr & ASSABET_BSR_RAD_RI)
-                       ret |= TIOCM_RI;
-       } else {
-               ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR;
+                       ASSABET_BCR_set(ASSABET_BCR_RS232EN);
        }
-
-       return ret;
 }
 
 static struct sa1100_port_fns assabet_port_fns __initdata = {
-       .set_mctrl      = assabet_set_mctrl,
-       .get_mctrl      = assabet_get_mctrl,
        .pm             = assabet_uart_pm,
 };
 
index bc0e0e24ecb797f43623c11fcba24d0b9dad9624..de79f35020457bc9e7b344716295c53c1afbcee9 100644 (file)
@@ -311,8 +311,6 @@ badge4_uart_pm(struct uart_port *port, u_int state, u_int oldstate)
 }
 
 static struct sa1100_port_fns badge4_port_fns __initdata = {
-       //.get_mctrl    = badge4_get_mctrl,
-       //.set_mctrl    = badge4_set_mctrl,
        .pm             = badge4_uart_pm,
 };
 
index 6199e87447ca600bb38f66f14bc017c97e529958..e8691921c69adb78760c13b35045601714b474ba 100644 (file)
 /*
  *  linux/arch/arm/mach-sa1100/clock.c
  */
-#include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/device.h>
-#include <linux/list.h>
 #include <linux/errno.h>
 #include <linux/err.h>
-#include <linux/string.h>
 #include <linux/clk.h>
-#include <linux/spinlock.h>
-#include <linux/mutex.h>
-#include <linux/io.h>
 #include <linux/clkdev.h>
+#include <linux/clk-provider.h>
+#include <linux/io.h>
+#include <linux/spinlock.h>
 
 #include <mach/hardware.h>
 #include <mach/generic.h>
 
-struct clkops {
-       void                    (*enable)(struct clk *);
-       void                    (*disable)(struct clk *);
-       unsigned long           (*get_rate)(struct clk *);
+static const char * const clk_tucr_parents[] = {
+       "clk32768", "clk3686400",
 };
 
-struct clk {
-       const struct clkops     *ops;
-       unsigned int            enabled;
-};
-
-#define DEFINE_CLK(_name, _ops)                                \
-struct clk clk_##_name = {                             \
-               .ops    = _ops,                         \
-       }
-
-static DEFINE_SPINLOCK(clocks_lock);
-
-/* Dummy clk routine to build generic kernel parts that may be using them */
-long clk_round_rate(struct clk *clk, unsigned long rate)
-{
-       return clk_get_rate(clk);
-}
-EXPORT_SYMBOL(clk_round_rate);
-
-int clk_set_rate(struct clk *clk, unsigned long rate)
-{
-       return 0;
-}
-EXPORT_SYMBOL(clk_set_rate);
-
-int clk_set_parent(struct clk *clk, struct clk *parent)
-{
-       return 0;
-}
-EXPORT_SYMBOL(clk_set_parent);
+static DEFINE_SPINLOCK(tucr_lock);
 
-struct clk *clk_get_parent(struct clk *clk)
+static int clk_gpio27_enable(struct clk_hw *hw)
 {
-       return NULL;
-}
-EXPORT_SYMBOL(clk_get_parent);
+       unsigned long flags;
 
-static void clk_gpio27_enable(struct clk *clk)
-{
        /*
         * First, set up the 3.6864MHz clock on GPIO 27 for the SA-1111:
         * (SA-1110 Developer's Manual, section 9.1.2.1)
         */
+       local_irq_save(flags);
        GAFR |= GPIO_32_768kHz;
        GPDR |= GPIO_32_768kHz;
-       TUCR = TUCR_3_6864MHz;
+       local_irq_restore(flags);
+
+       return 0;
 }
 
-static void clk_gpio27_disable(struct clk *clk)
+static void clk_gpio27_disable(struct clk_hw *hw)
 {
-       TUCR = 0;
+       unsigned long flags;
+
+       local_irq_save(flags);
        GPDR &= ~GPIO_32_768kHz;
        GAFR &= ~GPIO_32_768kHz;
+       local_irq_restore(flags);
 }
 
-static void clk_cpu_enable(struct clk *clk)
-{
-}
+static const struct clk_ops clk_gpio27_ops = {
+       .enable = clk_gpio27_enable,
+       .disable = clk_gpio27_disable,
+};
 
-static void clk_cpu_disable(struct clk *clk)
-{
-}
+static const char * const clk_gpio27_parents[] = {
+       "tucr-mux",
+};
 
-static unsigned long clk_cpu_get_rate(struct clk *clk)
+static const struct clk_init_data clk_gpio27_init_data __initconst = {
+       .name = "gpio27",
+       .ops = &clk_gpio27_ops,
+       .parent_names = clk_gpio27_parents,
+       .num_parents = ARRAY_SIZE(clk_gpio27_parents),
+};
+
+/*
+ * Derived from the table 8-1 in the SA1110 manual, the MPLL appears to
+ * multiply its input rate by 4 x (4 + PPCR).  This calculation gives
+ * the exact rate.  The figures given in the table are the rates rounded
+ * to 100kHz.  Stick with sa11x0_getspeed() for the time being.
+ */
+static unsigned long clk_mpll_recalc_rate(struct clk_hw *hw,
+       unsigned long prate)
 {
        return sa11x0_getspeed(0) * 1000;
 }
 
-int clk_enable(struct clk *clk)
-{
-       unsigned long flags;
-
-       if (clk) {
-               spin_lock_irqsave(&clocks_lock, flags);
-               if (clk->enabled++ == 0)
-                       clk->ops->enable(clk);
-               spin_unlock_irqrestore(&clocks_lock, flags);
-       }
-
-       return 0;
-}
-EXPORT_SYMBOL(clk_enable);
+static const struct clk_ops clk_mpll_ops = {
+       .recalc_rate = clk_mpll_recalc_rate,
+};
 
-void clk_disable(struct clk *clk)
-{
-       unsigned long flags;
+static const char * const clk_mpll_parents[] = {
+       "clk3686400",
+};
 
-       if (clk) {
-               WARN_ON(clk->enabled == 0);
-               spin_lock_irqsave(&clocks_lock, flags);
-               if (--clk->enabled == 0)
-                       clk->ops->disable(clk);
-               spin_unlock_irqrestore(&clocks_lock, flags);
-       }
-}
-EXPORT_SYMBOL(clk_disable);
+static const struct clk_init_data clk_mpll_init_data __initconst = {
+       .name = "mpll",
+       .ops = &clk_mpll_ops,
+       .parent_names = clk_mpll_parents,
+       .num_parents = ARRAY_SIZE(clk_mpll_parents),
+       .flags = CLK_GET_RATE_NOCACHE | CLK_IS_CRITICAL,
+};
 
-unsigned long clk_get_rate(struct clk *clk)
+int __init sa11xx_clk_init(void)
 {
-       if (clk && clk->ops && clk->ops->get_rate)
-               return clk->ops->get_rate(clk);
-
-       return 0;
-}
-EXPORT_SYMBOL(clk_get_rate);
+       struct clk_hw *hw;
+       int ret;
 
-const struct clkops clk_gpio27_ops = {
-       .enable         = clk_gpio27_enable,
-       .disable        = clk_gpio27_disable,
-};
+       hw = clk_hw_register_fixed_rate(NULL, "clk32768", NULL, 0, 32768);
+       if (IS_ERR(hw))
+               return PTR_ERR(hw);
 
-const struct clkops clk_cpu_ops = {
-       .enable         = clk_cpu_enable,
-       .disable        = clk_cpu_disable,
-       .get_rate       = clk_cpu_get_rate,
-};
+       clk_hw_register_clkdev(hw, NULL, "sa1100-rtc");
 
-static DEFINE_CLK(gpio27, &clk_gpio27_ops);
+       hw = clk_hw_register_fixed_rate(NULL, "clk3686400", NULL, 0, 3686400);
+       if (IS_ERR(hw))
+               return PTR_ERR(hw);
 
-static DEFINE_CLK(cpu, &clk_cpu_ops);
+       clk_hw_register_clkdev(hw, "OSTIMER0", NULL);
 
-static unsigned long clk_36864_get_rate(struct clk *clk)
-{
-       return 3686400;
-}
+       hw = kzalloc(sizeof(*hw), GFP_KERNEL);
+       if (!hw)
+               return -ENOMEM;
+       hw->init = &clk_mpll_init_data;
+       ret = clk_hw_register(NULL, hw);
+       if (ret) {
+               kfree(hw);
+               return ret;
+       }
 
-static struct clkops clk_36864_ops = {
-       .enable         = clk_cpu_enable,
-       .disable        = clk_cpu_disable,
-       .get_rate       = clk_36864_get_rate,
-};
+       clk_hw_register_clkdev(hw, NULL, "sa11x0-fb");
+       clk_hw_register_clkdev(hw, NULL, "sa11x0-pcmcia");
+       clk_hw_register_clkdev(hw, NULL, "sa11x0-pcmcia.0");
+       clk_hw_register_clkdev(hw, NULL, "sa11x0-pcmcia.1");
+       clk_hw_register_clkdev(hw, NULL, "1800");
+
+       hw = clk_hw_register_mux(NULL, "tucr-mux", clk_tucr_parents,
+                                ARRAY_SIZE(clk_tucr_parents), 0,
+                                (void __iomem *)&TUCR, FShft(TUCR_TSEL),
+                                FAlnMsk(TUCR_TSEL), 0, &tucr_lock);
+       clk_set_rate(hw->clk, 3686400);
+
+       hw = kzalloc(sizeof(*hw), GFP_KERNEL);
+       if (!hw)
+               return -ENOMEM;
+       hw->init = &clk_gpio27_init_data;
+       ret = clk_hw_register(NULL, hw);
+       if (ret) {
+               kfree(hw);
+               return ret;
+       }
 
-static DEFINE_CLK(36864, &clk_36864_ops);
-
-static struct clk_lookup sa11xx_clkregs[] = {
-       CLKDEV_INIT("sa1111.0", NULL, &clk_gpio27),
-       CLKDEV_INIT("sa1100-rtc", NULL, NULL),
-       CLKDEV_INIT("sa11x0-fb", NULL, &clk_cpu),
-       CLKDEV_INIT("sa11x0-pcmcia", NULL, &clk_cpu),
-       CLKDEV_INIT("sa11x0-pcmcia.0", NULL, &clk_cpu),
-       CLKDEV_INIT("sa11x0-pcmcia.1", NULL, &clk_cpu),
-       /* sa1111 names devices using internal offsets, PCMCIA is at 0x1800 */
-       CLKDEV_INIT("1800", NULL, &clk_cpu),
-       CLKDEV_INIT(NULL, "OSTIMER0", &clk_36864),
-};
+       clk_hw_register_clkdev(hw, NULL, "sa1111.0");
 
-int __init sa11xx_clk_init(void)
-{
-       clkdev_add_table(sa11xx_clkregs, ARRAY_SIZE(sa11xx_clkregs));
        return 0;
 }
index e93e3a1d60d593ce2e933c7544f5db4ad8cd40b6..d685f03f51f37944e54387a99e55668eec7aceb3 100644 (file)
@@ -83,57 +83,6 @@ static struct resource h3xxx_flash_resource =
 /*
  * H3xxx uart support
  */
-static struct gpio h3xxx_uart_gpio[] = {
-       { H3XXX_GPIO_COM_DCD,   GPIOF_IN,               "COM DCD" },
-       { H3XXX_GPIO_COM_CTS,   GPIOF_IN,               "COM CTS" },
-       { H3XXX_GPIO_COM_RTS,   GPIOF_OUT_INIT_LOW,     "COM RTS" },
-};
-
-static bool h3xxx_uart_request_gpios(void)
-{
-       static bool h3xxx_uart_gpio_ok;
-       int rc;
-
-       if (h3xxx_uart_gpio_ok)
-               return true;
-
-       rc = gpio_request_array(h3xxx_uart_gpio, ARRAY_SIZE(h3xxx_uart_gpio));
-       if (rc)
-               pr_err("h3xxx_uart_request_gpios: error %d\n", rc);
-       else
-               h3xxx_uart_gpio_ok = true;
-
-       return h3xxx_uart_gpio_ok;
-}
-
-static void h3xxx_uart_set_mctrl(struct uart_port *port, u_int mctrl)
-{
-       if (port->mapbase == _Ser3UTCR0) {
-               if (!h3xxx_uart_request_gpios())
-                       return;
-               gpio_set_value(H3XXX_GPIO_COM_RTS, !(mctrl & TIOCM_RTS));
-       }
-}
-
-static u_int h3xxx_uart_get_mctrl(struct uart_port *port)
-{
-       u_int ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR;
-
-       if (port->mapbase == _Ser3UTCR0) {
-               if (!h3xxx_uart_request_gpios())
-                       return ret;
-               /*
-                * DCD and CTS bits are inverted in GPLR by RS232 transceiver
-                */
-               if (gpio_get_value(H3XXX_GPIO_COM_DCD))
-                       ret &= ~TIOCM_CD;
-               if (gpio_get_value(H3XXX_GPIO_COM_CTS))
-                       ret &= ~TIOCM_CTS;
-       }
-
-       return ret;
-}
-
 static void h3xxx_uart_pm(struct uart_port *port, u_int state, u_int oldstate)
 {
        if (port->mapbase == _Ser3UTCR0) {
@@ -166,12 +115,20 @@ static int h3xxx_uart_set_wake(struct uart_port *port, u_int enable)
 }
 
 static struct sa1100_port_fns h3xxx_port_fns __initdata = {
-       .set_mctrl      = h3xxx_uart_set_mctrl,
-       .get_mctrl      = h3xxx_uart_get_mctrl,
        .pm             = h3xxx_uart_pm,
        .set_wake       = h3xxx_uart_set_wake,
 };
 
+static struct gpiod_lookup_table h3xxx_uart3_gpio_table = {
+       .dev_id = "sa11x0-uart.3",
+       .table = {
+               GPIO_LOOKUP("gpio", H3XXX_GPIO_COM_DCD, "dcd", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("gpio", H3XXX_GPIO_COM_CTS, "cts", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("gpio", H3XXX_GPIO_COM_RTS, "rts", GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 /*
  * EGPIO
  */
@@ -279,6 +236,7 @@ static struct gpiod_lookup_table h3xxx_pcmcia_gpio_table = {
 void __init h3xxx_mach_init(void)
 {
        gpiod_add_lookup_table(&h3xxx_pcmcia_gpio_table);
+       gpiod_add_lookup_table(&h3xxx_uart3_gpio_table);
        sa1100_register_uart_fns(&h3xxx_port_fns);
        sa11x0_register_mtd(&h3xxx_flash_data, &h3xxx_flash_resource, 1);
        platform_add_devices(h3xxx_devices, ARRAY_SIZE(h3xxx_devices));
index 4f4c1bb890e02689cdbcdc5fffccade3c8be2dcd..6d37d263e0d2c7e1ef3bf9fd39c834ffcb7b7b4d 100644 (file)
@@ -45,8 +45,6 @@
 /* init funcs */
 static void __init hackkit_map_io(void);
 
-static u_int hackkit_get_mctrl(struct uart_port *port);
-static void hackkit_set_mctrl(struct uart_port *port, u_int mctrl);
 static void hackkit_uart_pm(struct uart_port *port, u_int state, u_int oldstate);
 
 /**********************************************************************
@@ -67,8 +65,6 @@ static struct map_desc hackkit_io_desc[] __initdata = {
 };
 
 static struct sa1100_port_fns hackkit_port_fns __initdata = {
-       .set_mctrl      = hackkit_set_mctrl,
-       .get_mctrl      = hackkit_get_mctrl,
        .pm             = hackkit_uart_pm,
 };
 
@@ -101,50 +97,6 @@ static void hackkit_uart_pm(struct uart_port *port, u_int state, u_int oldstate)
        /* TODO: switch on/off uart in powersave mode */
 }
 
-/*
- * Note! this can be called from IRQ context.
- * FIXME: No modem ctrl lines yet.
- */
-static void hackkit_set_mctrl(struct uart_port *port, u_int mctrl)
-{
-#if 0
-       if (port->mapbase == _Ser1UTCR0) {
-               u_int set = 0, clear = 0;
-
-               if (mctrl & TIOCM_RTS)
-                       set |= PT_CTRL2_RS1_RTS;
-               else
-                       clear |= PT_CTRL2_RS1_RTS;
-
-               if (mctrl & TIOCM_DTR)
-                       set |= PT_CTRL2_RS1_DTR;
-               else
-                       clear |= PT_CTRL2_RS1_DTR;
-
-               PTCTRL2_clear(clear);
-               PTCTRL2_set(set);
-       }
-#endif
-}
-
-static u_int hackkit_get_mctrl(struct uart_port *port)
-{
-       u_int ret = 0;
-#if 0
-       u_int irqsr = PT_IRQSR;
-
-       /* need 2 reads to read current value */
-       irqsr = PT_IRQSR;
-
-       /* TODO: check IRQ source register for modem/com
-        status lines and set them correctly. */
-#endif
-
-       ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR;
-
-       return ret;
-}
-
 static struct mtd_partition hackkit_partitions[] = {
        {
                .name           = "BLOB",
index a671e4c994cfa315ea2b8025523abc9dbbf40ea5..6876bc1e33b44ec178499f85e4a3971d47b9b534 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/irq.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/platform_data/sa11x0-serial.h>
 #include <linux/platform_device.h>
 #include <linux/pm.h>
 #include <linux/serial_core.h>
 #define IRR_SA1111     (1 << 2)
 
 #define NCR_NGPIO      7
-
-#define MDM_CTL0_RTS1  (1 << 0)
-#define MDM_CTL0_DTR1  (1 << 1)
-#define MDM_CTL0_RTS2  (1 << 2)
-#define MDM_CTL0_DTR2  (1 << 3)
 #define MDM_CTL0_NGPIO 4
-
-#define MDM_CTL1_CTS1  (1 << 0)
-#define MDM_CTL1_DSR1  (1 << 1)
-#define MDM_CTL1_DCD1  (1 << 2)
-#define MDM_CTL1_CTS2  (1 << 3)
-#define MDM_CTL1_DSR2  (1 << 4)
-#define MDM_CTL1_DCD2  (1 << 5)
 #define MDM_CTL1_NGPIO 6
-
-#define AUD_SEL_1341   (1 << 0)
-#define AUD_MUTE_1341  (1 << 1)
 #define AUD_NGPIO      2
 
 extern void sa1110_mb_disable(void);
@@ -97,6 +81,30 @@ struct neponset_drvdata {
        struct gpio_chip *gpio[4];
 };
 
+static struct gpiod_lookup_table neponset_uart1_gpio_table = {
+       .dev_id = "sa11x0-uart.1",
+       .table = {
+               GPIO_LOOKUP("neponset-mdm-ctl0", 2, "rts", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("neponset-mdm-ctl0", 3, "dtr", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("neponset-mdm-ctl1", 3, "cts", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("neponset-mdm-ctl1", 4, "dsr", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("neponset-mdm-ctl1", 5, "dcd", GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
+static struct gpiod_lookup_table neponset_uart3_gpio_table = {
+       .dev_id = "sa11x0-uart.3",
+       .table = {
+               GPIO_LOOKUP("neponset-mdm-ctl0", 0, "rts", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("neponset-mdm-ctl0", 1, "dtr", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("neponset-mdm-ctl1", 0, "cts", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("neponset-mdm-ctl1", 1, "dsr", GPIO_ACTIVE_LOW),
+               GPIO_LOOKUP("neponset-mdm-ctl1", 2, "dcd", GPIO_ACTIVE_LOW),
+               { },
+       },
+};
+
 static struct gpiod_lookup_table neponset_pcmcia_table = {
        .dev_id = "1800",
        .table = {
@@ -124,69 +132,6 @@ void neponset_ncr_frob(unsigned int mask, unsigned int val)
 }
 EXPORT_SYMBOL(neponset_ncr_frob);
 
-static void neponset_set_mctrl(struct uart_port *port, u_int mctrl)
-{
-       struct neponset_drvdata *n = nep;
-       unsigned long mask, val = 0;
-
-       if (!n)
-               return;
-
-       if (port->mapbase == _Ser1UTCR0) {
-               mask = MDM_CTL0_RTS2 | MDM_CTL0_DTR2;
-
-               if (!(mctrl & TIOCM_RTS))
-                       val |= MDM_CTL0_RTS2;
-
-               if (!(mctrl & TIOCM_DTR))
-                       val |= MDM_CTL0_DTR2;
-       } else if (port->mapbase == _Ser3UTCR0) {
-               mask = MDM_CTL0_RTS1 | MDM_CTL0_DTR1;
-
-               if (!(mctrl & TIOCM_RTS))
-                       val |= MDM_CTL0_RTS1;
-
-               if (!(mctrl & TIOCM_DTR))
-                       val |= MDM_CTL0_DTR1;
-       }
-
-       n->gpio[1]->set_multiple(n->gpio[1], &mask, &val);
-}
-
-static u_int neponset_get_mctrl(struct uart_port *port)
-{
-       void __iomem *base = nep->base;
-       u_int ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR;
-       u_int mdm_ctl1;
-
-       if (!base)
-               return ret;
-
-       mdm_ctl1 = readb_relaxed(base + MDM_CTL_1);
-       if (port->mapbase == _Ser1UTCR0) {
-               if (mdm_ctl1 & MDM_CTL1_DCD2)
-                       ret &= ~TIOCM_CD;
-               if (mdm_ctl1 & MDM_CTL1_CTS2)
-                       ret &= ~TIOCM_CTS;
-               if (mdm_ctl1 & MDM_CTL1_DSR2)
-                       ret &= ~TIOCM_DSR;
-       } else if (port->mapbase == _Ser3UTCR0) {
-               if (mdm_ctl1 & MDM_CTL1_DCD1)
-                       ret &= ~TIOCM_CD;
-               if (mdm_ctl1 & MDM_CTL1_CTS1)
-                       ret &= ~TIOCM_CTS;
-               if (mdm_ctl1 & MDM_CTL1_DSR1)
-                       ret &= ~TIOCM_DSR;
-       }
-
-       return ret;
-}
-
-static struct sa1100_port_fns neponset_port_fns = {
-       .set_mctrl      = neponset_set_mctrl,
-       .get_mctrl      = neponset_get_mctrl,
-};
-
 /*
  * Install handler for Neponset IRQ.  Note that we have to loop here
  * since the ETHERNET and USAR IRQs are level based, and we need to
@@ -388,6 +333,8 @@ static int neponset_probe(struct platform_device *dev)
                           d->base + AUD_CTL, AUD_NGPIO, false,
                           neponset_aud_names);
 
+       gpiod_add_lookup_table(&neponset_uart1_gpio_table);
+       gpiod_add_lookup_table(&neponset_uart3_gpio_table);
        gpiod_add_lookup_table(&neponset_pcmcia_table);
 
        /*
@@ -402,8 +349,6 @@ static int neponset_probe(struct platform_device *dev)
                 d->irq_base, d->irq_base + NEP_IRQ_NR - 1);
        nep = d;
 
-       sa1100_register_uart_fns(&neponset_port_fns);
-
        /* Ensure that the memory bus request/grant signals are setup */
        sa1110_mb_disable();
 
@@ -442,6 +387,8 @@ static int neponset_remove(struct platform_device *dev)
                platform_device_unregister(d->smc91x);
 
        gpiod_remove_lookup_table(&neponset_pcmcia_table);
+       gpiod_remove_lookup_table(&neponset_uart3_gpio_table);
+       gpiod_remove_lookup_table(&neponset_uart1_gpio_table);
 
        irq_set_chained_handler(irq, NULL);
        irq_free_descs(d->irq_base, NEP_IRQ_NR);
index eea60b20c6b4605fe15f225388e66f5a209847f5..9e4bc1865f84abaed91b7c6e6e53b18e5411f6a3 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/of.h>
 #include <linux/of_fdt.h>
 #include <linux/of_platform.h>
+#include <linux/psci.h>
 #include <asm/mach/arch.h>
 #include <asm/secure_cntvoff.h>
 #include "common.h"
@@ -60,9 +61,24 @@ static unsigned int __init get_extal_freq(void)
 
 void __init rcar_gen2_timer_init(void)
 {
+       bool need_update = true;
        void __iomem *base;
        u32 freq;
 
+       /*
+        * If PSCI is available then most likely we are running on PSCI-enabled
+        * U-Boot which, we assume, has already taken care of resetting CNTVOFF
+        * and updating counter module before switching to non-secure mode
+        * and we don't need to.
+        */
+#ifdef CONFIG_ARM_PSCI_FW
+       if (psci_ops.cpu_on)
+               need_update = false;
+#endif
+
+       if (need_update == false)
+               goto skip_update;
+
        secure_cntvoff_init();
 
        if (of_machine_is_compatible("renesas,r8a7745") ||
@@ -102,6 +118,7 @@ void __init rcar_gen2_timer_init(void)
 
        iounmap(base);
 
+skip_update:
        of_clk_init(NULL);
        timer_probe();
 }
index 05d6b5aada801efc56d04fe3ed8c6ca8b2c31f62..57699bd8f10750f73410e142b9e791fac9a9dd5e 100644 (file)
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 menuconfig ARCH_STM32
-       bool "STMicroelectronics STM32 family" if ARM_SINGLE_ARMV7M || ARCH_MULTI_V7
+       bool "STMicroelectronics STM32 family"
+       depends on ARM_SINGLE_ARMV7M || ARCH_MULTI_V7
        select ARMV7M_SYSTICK if ARM_SINGLE_ARMV7M
        select HAVE_ARM_ARCH_TIMER if ARCH_MULTI_V7
        select ARM_GIC if ARCH_MULTI_V7
index da6c633d3cc04b337d0679afbd2a3118c7049b16..97cd04508fa1731ca9147c106ddc3f58a1a58344 100644 (file)
@@ -1,7 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0
-plus_sec := $(call as-instr,.arch_extension sec,+sec)
-AFLAGS_smc.o := -Wa,-march=armv7-a$(plus_sec)
-
 obj-y += setup.o smc.o
 obj-$(CONFIG_SMP) += platsmp.o
 obj-$(CONFIG_SUSPEND) += pm.o
index 361a8dc898042f2bbfeed0be7634c921518cfb5a..b1752aaa72bcbf0267a81e80728aa0999bfd0a87 100644 (file)
@@ -1,6 +1,8 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 #include <linux/linkage.h>
 
+       .arch armv7-a
+       .arch_extension sec
 ENTRY(tango_smc)
        push    {lr}
        mov     ip, r1
index 0b763239c0f8c4965365e0e7cb95c414b50a8c04..c00ea4f77af68843ac43a85d63de8ee2f0f56572 100644 (file)
@@ -16,8 +16,6 @@
 #include <linux/of_platform.h>
 #include <linux/slab.h>
 #include <linux/amba/bus.h>
-#include <linux/amba/clcd.h>
-#include <linux/platform_data/video-clcd-versatile.h>
 #include <linux/amba/mmci.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
  */
 #define VERSATILE_SYS_PCICTL_OFFSET           0x44
 #define VERSATILE_SYS_MCI_OFFSET              0x48
-#define VERSATILE_SYS_CLCD_OFFSET             0x50
 
 /*
  * VERSATILE peripheral addresses
  */
 #define VERSATILE_MMCI0_BASE           0x10005000      /* MMC interface */
 #define VERSATILE_MMCI1_BASE           0x1000B000      /* MMC Interface */
-#define VERSATILE_CLCD_BASE            0x10120000      /* CLCD */
 #define VERSATILE_SCTL_BASE            0x101E0000      /* System controller */
 #define VERSATILE_IB2_BASE             0x24000000      /* IB2 module */
 #define VERSATILE_IB2_CTL_BASE         (VERSATILE_IB2_BASE + 0x03000000)
@@ -83,158 +79,6 @@ static struct mmci_platform_data mmc1_plat_data = {
        .status         = mmc_status,
 };
 
-/*
- * CLCD support.
- */
-#define SYS_CLCD_MODE_MASK     (3 << 0)
-#define SYS_CLCD_MODE_888      (0 << 0)
-#define SYS_CLCD_MODE_5551     (1 << 0)
-#define SYS_CLCD_MODE_565_RLSB (2 << 0)
-#define SYS_CLCD_MODE_565_BLSB (3 << 0)
-#define SYS_CLCD_NLCDIOON      (1 << 2)
-#define SYS_CLCD_VDDPOSSWITCH  (1 << 3)
-#define SYS_CLCD_PWR3V5SWITCH  (1 << 4)
-#define SYS_CLCD_ID_MASK       (0x1f << 8)
-#define SYS_CLCD_ID_SANYO_3_8  (0x00 << 8)
-#define SYS_CLCD_ID_UNKNOWN_8_4        (0x01 << 8)
-#define SYS_CLCD_ID_EPSON_2_2  (0x02 << 8)
-#define SYS_CLCD_ID_SANYO_2_5  (0x07 << 8)
-#define SYS_CLCD_ID_VGA                (0x1f << 8)
-
-static bool is_sanyo_2_5_lcd;
-
-/*
- * Disable all display connectors on the interface module.
- */
-static void versatile_clcd_disable(struct clcd_fb *fb)
-{
-       void __iomem *sys_clcd = versatile_sys_base + VERSATILE_SYS_CLCD_OFFSET;
-       u32 val;
-
-       val = readl(sys_clcd);
-       val &= ~SYS_CLCD_NLCDIOON | SYS_CLCD_PWR3V5SWITCH;
-       writel(val, sys_clcd);
-
-       /*
-        * If the LCD is Sanyo 2x5 in on the IB2 board, turn the back-light off
-        */
-       if (of_machine_is_compatible("arm,versatile-ab") && is_sanyo_2_5_lcd) {
-               unsigned long ctrl;
-
-               ctrl = readl(versatile_ib2_ctrl);
-               ctrl &= ~0x01;
-               writel(ctrl, versatile_ib2_ctrl);
-       }
-}
-
-/*
- * Enable the relevant connector on the interface module.
- */
-static void versatile_clcd_enable(struct clcd_fb *fb)
-{
-       struct fb_var_screeninfo *var = &fb->fb.var;
-       void __iomem *sys_clcd = versatile_sys_base + VERSATILE_SYS_CLCD_OFFSET;
-       u32 val;
-
-       val = readl(sys_clcd);
-       val &= ~SYS_CLCD_MODE_MASK;
-
-       switch (var->green.length) {
-       case 5:
-               val |= SYS_CLCD_MODE_5551;
-               break;
-       case 6:
-               if (var->red.offset == 0)
-                       val |= SYS_CLCD_MODE_565_RLSB;
-               else
-                       val |= SYS_CLCD_MODE_565_BLSB;
-               break;
-       case 8:
-               val |= SYS_CLCD_MODE_888;
-               break;
-       }
-
-       /*
-        * Set the MUX
-        */
-       writel(val, sys_clcd);
-
-       /*
-        * And now enable the PSUs
-        */
-       val |= SYS_CLCD_NLCDIOON | SYS_CLCD_PWR3V5SWITCH;
-       writel(val, sys_clcd);
-
-       /*
-        * If the LCD is Sanyo 2x5 in on the IB2 board, turn the back-light on
-        */
-       if (of_machine_is_compatible("arm,versatile-ab") && is_sanyo_2_5_lcd) {
-               unsigned long ctrl;
-
-               ctrl = readl(versatile_ib2_ctrl);
-               ctrl |= 0x01;
-               writel(ctrl, versatile_ib2_ctrl);
-       }
-}
-
-/*
- * Detect which LCD panel is connected, and return the appropriate
- * clcd_panel structure.  Note: we do not have any information on
- * the required timings for the 8.4in panel, so we presently assume
- * VGA timings.
- */
-static int versatile_clcd_setup(struct clcd_fb *fb)
-{
-       void __iomem *sys_clcd = versatile_sys_base + VERSATILE_SYS_CLCD_OFFSET;
-       const char *panel_name;
-       u32 val;
-
-       is_sanyo_2_5_lcd = false;
-
-       val = readl(sys_clcd) & SYS_CLCD_ID_MASK;
-       if (val == SYS_CLCD_ID_SANYO_3_8)
-               panel_name = "Sanyo TM38QV67A02A";
-       else if (val == SYS_CLCD_ID_SANYO_2_5) {
-               panel_name = "Sanyo QVGA Portrait";
-               is_sanyo_2_5_lcd = true;
-       } else if (val == SYS_CLCD_ID_EPSON_2_2)
-               panel_name = "Epson L2F50113T00";
-       else if (val == SYS_CLCD_ID_VGA)
-               panel_name = "VGA";
-       else {
-               printk(KERN_ERR "CLCD: unknown LCD panel ID 0x%08x, using VGA\n",
-                       val);
-               panel_name = "VGA";
-       }
-
-       fb->panel = versatile_clcd_get_panel(panel_name);
-       if (!fb->panel)
-               return -EINVAL;
-
-       return versatile_clcd_setup_dma(fb, SZ_1M);
-}
-
-static void versatile_clcd_decode(struct clcd_fb *fb, struct clcd_regs *regs)
-{
-       clcdfb_decode(fb, regs);
-
-       /* Always clear BGR for RGB565: we do the routing externally */
-       if (fb->fb.var.green.length == 6)
-               regs->cntl &= ~CNTL_BGR;
-}
-
-static struct clcd_board clcd_plat_data = {
-       .name           = "Versatile",
-       .caps           = CLCD_CAP_5551 | CLCD_CAP_565 | CLCD_CAP_888,
-       .check          = clcdfb_check,
-       .decode         = versatile_clcd_decode,
-       .disable        = versatile_clcd_disable,
-       .enable         = versatile_clcd_enable,
-       .setup          = versatile_clcd_setup,
-       .mmap           = versatile_clcd_mmap_dma,
-       .remove         = versatile_clcd_remove_dma,
-};
-
 /*
  * Lookup table for attaching a specific name and platform_data pointer to
  * devices as they get created by of_platform_populate().  Ideally this table
@@ -244,7 +88,6 @@ static struct clcd_board clcd_plat_data = {
 struct of_dev_auxdata versatile_auxdata_lookup[] __initdata = {
        OF_DEV_AUXDATA("arm,primecell", VERSATILE_MMCI0_BASE, "fpga:05", &mmc0_plat_data),
        OF_DEV_AUXDATA("arm,primecell", VERSATILE_MMCI1_BASE, "fpga:0b", &mmc1_plat_data),
-       OF_DEV_AUXDATA("arm,primecell", VERSATILE_CLCD_BASE, "dev:20", &clcd_plat_data),
        {}
 };
 
@@ -299,12 +142,12 @@ static void __init versatile_dt_pci_init(void)
                 * driver had it so we will keep it.
                 */
                writel(1, versatile_sys_base + VERSATILE_SYS_PCICTL_OFFSET);
-               return;
+               goto out_put_node;
        }
 
        newprop = kzalloc(sizeof(*newprop), GFP_KERNEL);
        if (!newprop)
-               return;
+               goto out_put_node;
 
        newprop->name = kstrdup("status", GFP_KERNEL);
        newprop->value = kstrdup("disabled", GFP_KERNEL);
@@ -312,6 +155,9 @@ static void __init versatile_dt_pci_init(void)
        of_update_property(np, newprop);
 
        pr_info("Not plugged into PCI backplane!\n");
+
+out_put_node:
+       of_node_put(np);
 }
 
 static void __init versatile_dt_init(void)
index ca85df2477751d397d38a1b36e1ec4424cf55163..87b7769214e079c3f75bf9c89e4d965e295f117a 100644 (file)
@@ -13,8 +13,7 @@ ccflags-y += -DDISABLE_BRANCH_PROFILING
 ldflags-$(CONFIG_CPU_ENDIAN_BE8) := --be8
 ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
            -z max-page-size=4096 -nostdlib -shared $(ldflags-y) \
-           $(call ld-option, --hash-style=sysv) \
-           $(call ld-option, --build-id) \
+           --hash-style=sysv --build-id \
            -T
 
 obj-$(CONFIG_VDSO) += vdso.o
index d07fc063c930b6a4f56545bae435da31d6300282..4778c775de1ba056ee071bea079063586135f1b4 100644 (file)
@@ -66,8 +66,11 @@ config ARCH_BITMAIN
 
 config ARCH_BRCMSTB
        bool "Broadcom Set-Top-Box SoCs"
+       select ARCH_HAS_RESET_CONTROLLER
+       select BCM7038_L1_IRQ
        select BRCMSTB_L2_IRQ
        select GENERIC_IRQ_CHIP
+       select PINCTRL
        help
          This enables support for Broadcom's ARMv8 Set Top Box SoCs
 
index c3a618e1279a5b75419be383205995f96eb598dc..f0349ef4bfdd1dbc01fb22913f09a4161143a2c4 100644 (file)
                        status = "disabled";
                };
        };
+
+       usb_power_supply: usb-power-supply {
+               compatible = "x-powers,axp803-usb-power-supply",
+                            "x-powers,axp813-usb-power-supply";
+               status = "disabled";
+       };
 };
index 019ae09ea0fdd415d5898f63afa17b9a115b4feb..5634245d11dbfa90f8d586442ca3ed19e515daba 100644 (file)
@@ -85,8 +85,6 @@
 };
 
 &i2c0 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins>;
        status = "okay";
 
        sensor@48 {
        bias-pull-up;
 };
 
+&i2c1 {
+       status = "okay";
+
+       touchscreen@5d {
+               compatible = "goodix,gt5663";
+               reg = <0x5d>;
+               AVDD28-supply = <&reg_ldo_io0>;                 /* VCC-CTP: GPIO0-LDO */
+               interrupt-parent = <&pio>;
+               interrupts = <7 4 IRQ_TYPE_EDGE_FALLING>;
+               irq-gpios = <&pio 7 4 GPIO_ACTIVE_HIGH>;        /* CTP-INT: PH4 */
+               reset-gpios = <&pio 7 8 GPIO_ACTIVE_HIGH>;      /* CTP-RST: PH8 */
+               touchscreen-inverted-x;
+               touchscreen-inverted-y;
+       };
+};
+
 &mmc1 {
        pinctrl-names = "default";
        pinctrl-0 = <&mmc1_pins>;
        regulator-name = "vdd-cpus";
 };
 
+&reg_ldo_io0 {
+       regulator-min-microvolt = <2800000>;
+       regulator-max-microvolt = <2800000>;
+       regulator-name = "vcc-ctp";
+       status = "okay";
+};
+
 &reg_rtc_ldo {
        regulator-name = "vcc-rtc";
 };
index 0a56c0c23ba1b771e275c361d5b836a120658335..208373efee494d1a8258f12d7c6a7f4dd31b650a 100644 (file)
 };
 
 &i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins>;
        status = "okay";
 };
 
        status = "okay";
 };
 
+&usb_power_supply {
+       status = "okay";
+};
+
 &usbphy {
        usb0_id_det-gpios = <&pio 7 9 GPIO_ACTIVE_HIGH>; /* PH9 */
+       usb0_vbus_power-supply = <&usb_power_supply>;
        usb0_vbus-supply = <&reg_drivevbus>;
        status = "okay";
 };
index f4e78531f63961d0af2ca843bef1fe71bbf48e62..9b9d9157128c6e3620cc99ceee1ee8e0bcd96b07 100644 (file)
 };
 
 /* i2c1 connected with gpio headers like pine64, bananapi */
-&i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins>;
-       status = "disabled";
-};
-
 &i2c1_pins {
        bias-pull-up;
 };
index 6a2154525d1e90f757325463806283e261866977..787ebd805a3b3d868a067d9d32de65ac0817ef79 100644 (file)
        status = "okay";
 };
 
+&i2c0 {
+       status = "okay";
+
+       touchscreen@5d {
+               compatible = "goodix,gt911";
+               reg = <0x5d>;
+               AVDD28-supply = <&reg_ldo_io0>;                 /* VDD_CTP: GPIO0-LDO */
+               interrupt-parent = <&pio>;
+               interrupts = <7 4 IRQ_TYPE_EDGE_FALLING>;
+               irq-gpios = <&pio 7 4 GPIO_ACTIVE_HIGH>;        /* CTP-INT: PH4 */
+               reset-gpios = <&pio 7 11 GPIO_ACTIVE_HIGH>;     /* CTP-RST: PH11 */
+               touchscreen-inverted-x;
+               touchscreen-inverted-y;
+       };
+};
+
 &mdio {
        ext_rgmii_phy: ethernet-phy@1 {
                compatible = "ethernet-phy-ieee802.3-c22";
        regulator-name = "vcc-phy";
 };
 
+&reg_ldo_io0 {
+       regulator-min-microvolt = <2800000>;
+       regulator-max-microvolt = <2800000>;
+       regulator-name = "vdd-ctp";
+       status = "okay";
+};
+
 &uart0 {
        pinctrl-names = "default";
        pinctrl-0 = <&uart0_pb_pins>;
index 510f661229dc1f2428c090f428502dbb7f72e8d4..5ef3c62c765eb7a6698c57cee4db18f935beb236 100644 (file)
        wifi_pwrseq: wifi_pwrseq {
                compatible = "mmc-pwrseq-simple";
                reset-gpios = <&r_pio 0 8 GPIO_ACTIVE_LOW>; /* PL8 */
+               clocks = <&rtc 1>;
+               clock-names = "ext_clock";
        };
 };
 
        bus-width = <4>;
        non-removable;
        status = "okay";
+
+       brcmf: wifi@1 {
+               reg = <1>;
+               compatible = "brcm,bcm4329-fmac";
+               interrupt-parent = <&r_pio>;
+               interrupts = <0 7 IRQ_TYPE_LEVEL_LOW>; /* PL7 */
+               interrupt-names = "host-wake";
+       };
 };
 
 &ohci0 {
 &uart1 {
        pinctrl-names = "default";
        pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>;
+       uart-has-rtscts;
        status = "okay";
+
+       bluetooth {
+               compatible = "brcm,bcm43438-bt";
+               max-speed = <1500000>;
+               clocks = <&rtc 1>;
+               clock-names = "lpo";
+               vbat-supply = <&reg_dldo2>;
+               vddio-supply = <&reg_dldo4>;
+               device-wakeup-gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
+               host-wakeup-gpios = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; /* PL5 */
+               shutdown-gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */
+       };
 };
 
 /* On Pi-2 connector, RTS/CTS optional */
index b7ac6374b178d8a276d81c57bd7da9fc3d5c9e27..409523cb09506b0f956a78a918787441a69f5e14 100644 (file)
 };
 
 &i2c1 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins>;
        status = "okay";
 };
 
index 0ec46b969a75c3ad147666528337941deb4be700..1069e7012c9c08a06097c8143f106b5bf4afa0e0 100644 (file)
                compatible = "mmc-pwrseq-simple";
                reset-gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>; /* PL2 */
        };
+
+       speaker_amp: audio-amplifier {
+               compatible = "simple-audio-amplifier";
+               enable-gpios = <&r_pio 0 12 GPIO_ACTIVE_HIGH>; /* PL12 */
+               sound-name-prefix = "Speaker Amp";
+       };
+};
+
+&codec {
+       status = "okay";
+};
+
+&codec_analog {
+       cpvdd-supply = <&reg_eldo1>;
+       status = "okay";
+};
+
+&dai {
+       status = "okay";
 };
 
 &ehci1 {
  */
 &i2c0 {
        clock-frequency = <100000>;
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c0_pins>;
        status = "okay";
 };
 
        vcc-hdmi-supply = <&reg_dldo1>;
 };
 
+&sound {
+       simple-audio-card,aux-devs = <&codec_analog>, <&speaker_amp>;
+       simple-audio-card,widgets = "Headphone", "Headphone Jack",
+                                   "Microphone", "Headset Microphone",
+                                   "Microphone", "Internal Microphone",
+                                   "Speaker", "Internal Speaker";
+       simple-audio-card,routing =
+                       "Left DAC", "AIF1 Slot 0 Left",
+                       "Right DAC", "AIF1 Slot 0 Right",
+                       "AIF1 Slot 0 Left ADC", "Left ADC",
+                       "AIF1 Slot 0 Right ADC", "Right ADC",
+                       "Headphone Jack", "HP",
+                       "Speaker Amp INL", "LINEOUT",
+                       "Speaker Amp INR", "LINEOUT",
+                       "Internal Speaker", "Speaker Amp OUTL",
+                       "Internal Speaker", "Speaker Amp OUTR",
+                       "Internal Microphone", "MBIAS",
+                       "MIC1", "Internal Microphone",
+                       "Headset Microphone", "HBIAS",
+                       "MIC2", "Headset Microphone";
+       status = "okay";
+};
+
 &uart0 {
        pinctrl-names = "default";
        pinctrl-0 = <&uart0_pb_pins>;
index 8c5b521e6389dfc9e12c82f2adb92f455c84eaea..9cc9bdde81ac22dc670e6f35d55fcc905591b40d 100644 (file)
                                function = "i2c1";
                        };
 
+                       /omit-if-no-ref/
+                       lcd_rgb666_pins: lcd-rgb666-pins {
+                               pins = "PD0", "PD1", "PD2", "PD3", "PD4",
+                                      "PD5", "PD6", "PD7", "PD8", "PD9",
+                                      "PD10", "PD11", "PD12", "PD13",
+                                      "PD14", "PD15", "PD16", "PD17",
+                                      "PD18", "PD19", "PD20", "PD21";
+                               function = "lcd0";
+                       };
+
                        mmc0_pins: mmc0-pins {
                                pins = "PF0", "PF1", "PF2", "PF3",
                                       "PF4", "PF5";
                        status = "disabled";
                };
 
+               lradc: lradc@1c21800 {
+                       compatible = "allwinner,sun50i-a64-lradc",
+                                    "allwinner,sun8i-a83t-r-lradc";
+                       reg = <0x01c21800 0x400>;
+                       interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
+                       status = "disabled";
+               };
+
                i2s0: i2s@1c22000 {
                        #sound-dai-cells = <0>;
                        compatible = "allwinner,sun50i-a64-i2s",
                        interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&ccu CLK_BUS_I2C0>;
                        resets = <&ccu RST_BUS_I2C0>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c0_pins>;
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&ccu CLK_BUS_I2C1>;
                        resets = <&ccu RST_BUS_I2C1>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&i2c1_pins>;
                        status = "disabled";
                        #address-cells = <1>;
                        #size-cells = <0>;
index 62409afbaf06f5032fb69a8e5e54bcc2d3324e9c..c924090331d0b8960b60e00c80958dcad18eb2ca 100644 (file)
@@ -55,8 +55,7 @@
                regulator-ramp-delay = <50>; /* 4ms */
                gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
                gpios-states = <0x1>;
-               states = <1100000 0x0
-                         1300000 0x1>;
+               states = <1100000 0>, <1300000 1>;
        };
 };
 
index 9887948d5c8608451008a3ecf34a9cb00eb43f61..1c7dde84e54de6df9afc68b862350295379ea9cf 100644 (file)
                regulator-ramp-delay = <50>; /* 4ms */
                gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>;
                gpios-states = <0x1>;
-               states = <1100000 0x0
-                         1300000 0x1>;
+               states = <1100000 0>, <1300000 1>;
        };
 
        wifi_pwrseq: wifi_pwrseq {
index 4802902e128f980d58baf7bbdd93094230840b30..189834518391009a83c92629ead862e2f71af331 100644 (file)
        status = "okay";
 };
 
+&pio {
+       vcc-pc-supply = <&reg_bldo2>;
+       vcc-pd-supply = <&reg_cldo1>;
+       vcc-pg-supply = <&reg_aldo1>;
+};
+
 &r_i2c {
        status = "okay";
 
        pcf8563: rtc@51 {
                compatible = "nxp,pcf8563";
                reg = <0x51>;
+               interrupt-parent = <&r_intc>;
+               interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
                #clock-cells = <0>;
        };
 };
 
+&r_pio {
+       vcc-pm-supply = <&reg_aldo1>;
+};
+
 &uart0 {
        pinctrl-names = "default";
        pinctrl-0 = <&uart0_ph_pins>;
index 16c5c3d0fd813bda73d3ac0c65c5827d7d035f95..7628a7c8309641ce24b2c9b22350a8d4bc19d005 100644 (file)
                        #reset-cells = <1>;
                };
 
+               dma: dma-controller@3002000 {
+                       compatible = "allwinner,sun50i-h6-dma";
+                       reg = <0x03002000 0x1000>;
+                       interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&ccu CLK_BUS_DMA>, <&ccu CLK_MBUS_DMA>;
+                       clock-names = "bus", "mbus";
+                       dma-channels = <16>;
+                       dma-requests = <46>;
+                       resets = <&ccu RST_BUS_DMA>;
+                       #dma-cells = <1>;
+               };
+
                sid: sid@3006000 {
                        compatible = "allwinner,sun50i-h6-sid";
                        reg = <0x03006000 0x400>;
                };
 
+               watchdog: watchdog@30090a0 {
+                       compatible = "allwinner,sun50i-h6-wdt",
+                                    "allwinner,sun6i-a31-wdt";
+                       reg = <0x030090a0 0x20>;
+                       interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;
+                       /* Broken on some H6 boards */
+                       status = "disabled";
+               };
+
                pio: pinctrl@300b000 {
                        compatible = "allwinner,sun50i-h6-pinctrl";
                        reg = <0x0300b000 0x400>;
                        #reset-cells = <1>;
                };
 
+               r_watchdog: watchdog@7020400 {
+                       compatible = "allwinner,sun50i-h6-wdt",
+                                    "allwinner,sun6i-a31-wdt";
+                       reg = <0x07020400 0x20>;
+                       interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;
+               };
+
                r_intc: interrupt-controller@7021000 {
                        compatible = "allwinner,sun50i-h6-r-intc",
                                     "allwinner,sun6i-a31-r-intc";
index 4b0f674df84941209b7f0feeae09cc04987d5bf6..b05d78164fc178a64446e1b070b0d4dd7f023688 100644 (file)
                };
 
                gmac0: ethernet@ff800000 {
-                       compatible = "altr,socfpga-stmmac", "snps,dwmac-3.74a", "snps,dwmac";
+                       compatible = "altr,socfpga-stmmac-a10-s10", "snps,dwmac-3.74a", "snps,dwmac";
                        reg = <0xff800000 0x2000>;
                        interrupts = <0 90 4>;
                        interrupt-names = "macirq";
                };
 
                gmac1: ethernet@ff802000 {
-                       compatible = "altr,socfpga-stmmac", "snps,dwmac-3.74a", "snps,dwmac";
+                       compatible = "altr,socfpga-stmmac-a10-s10", "snps,dwmac-3.74a", "snps,dwmac";
                        reg = <0xff802000 0x2000>;
                        interrupts = <0 91 4>;
                        interrupt-names = "macirq";
                        rx-fifo-depth = <16384>;
                        snps,multicast-filter-bins = <256>;
                        iommus = <&smmu 2>;
-                       altr,sysmgr-syscon = <&sysmgr 0x48 0>;
+                       altr,sysmgr-syscon = <&sysmgr 0x48 8>;
                        status = "disabled";
                };
 
                gmac2: ethernet@ff804000 {
-                       compatible = "altr,socfpga-stmmac", "snps,dwmac-3.74a", "snps,dwmac";
+                       compatible = "altr,socfpga-stmmac-a10-s10", "snps,dwmac-3.74a", "snps,dwmac";
                        reg = <0xff804000 0x2000>;
                        interrupts = <0 92 4>;
                        interrupt-names = "macirq";
                        rx-fifo-depth = <16384>;
                        snps,multicast-filter-bins = <256>;
                        iommus = <&smmu 3>;
-                       altr,sysmgr-syscon = <&sysmgr 0x4c 0>;
+                       altr,sysmgr-syscon = <&sysmgr 0x4c 16>;
                        status = "disabled";
                };
 
index e129c03ced140713c6d3ec3f59ff4327c73351bd..07b861fe5fa5f43c8be0ff48e9d836af7da3e53c 100644 (file)
@@ -3,6 +3,7 @@ dtb-$(CONFIG_ARCH_MESON) += meson-axg-s400.dtb
 dtb-$(CONFIG_ARCH_MESON) += meson-g12a-sei510.dtb
 dtb-$(CONFIG_ARCH_MESON) += meson-g12a-u200.dtb
 dtb-$(CONFIG_ARCH_MESON) += meson-g12a-x96-max.dtb
+dtb-$(CONFIG_ARCH_MESON) += meson-g12b-odroid-n2.dtb
 dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-nanopi-k2.dtb
 dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-nexbox-a95x.dtb
 dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-odroidc2.dtb
index 75fe1a2c49d0a4b1e6db30040f79808f87769464..4cd2d595182282bffd73670110fa8e895a65fe41 100644 (file)
 
 /* emmc storage */
 &sd_emmc_c {
-       status = "disabled";
-       pinctrl-0 = <&emmc_pins>;
+       status = "okay";
+       pinctrl-0 = <&emmc_pins>, <&emmc_ds_pins>;
        pinctrl-1 = <&emmc_clk_gate_pins>;
        pinctrl-names = "default", "clk-gate";
 
index 34704fecf7566be1c326be41a58d5e02a24855f6..6219337033a0b7a344d84bda656e18079c820309 100644 (file)
                ranges;
 
                ethmac: ethernet@ff3f0000 {
-                       compatible = "amlogic,meson-axg-dwmac", "snps,dwmac";
+                       compatible = "amlogic,meson-axg-dwmac",
+                                    "snps,dwmac-3.70a",
+                                    "snps,dwmac";
                        reg = <0x0 0xff3f0000 0x0 0x10000
                               0x0 0xff634540 0x0 0x8>;
                        interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
                                };
 
                                emmc_pins: emmc {
-                                       mux {
+                                       mux-0 {
                                                groups = "emmc_nand_d0",
                                                         "emmc_nand_d1",
                                                         "emmc_nand_d2",
                                                         "emmc_nand_d5",
                                                         "emmc_nand_d6",
                                                         "emmc_nand_d7",
-                                                        "emmc_clk",
-                                                        "emmc_cmd",
-                                                        "emmc_ds";
+                                                        "emmc_cmd";
+                                               function = "emmc";
+                                               bias-pull-up;
+                                       };
+
+                                       mux-1 {
+                                               groups = "emmc_clk";
                                                function = "emmc";
                                                bias-disable;
                                        };
                                };
 
+                               emmc_ds_pins: emmc_ds {
+                                       mux {
+                                               groups = "emmc_ds";
+                                               function = "emmc";
+                                               bias-pull-down;
+                                       };
+                               };
+
                                emmc_clk_gate_pins: emmc_clk_gate {
                                        mux {
                                                groups = "BOOT_8";
                                };
 
                                sdio_pins: sdio {
-                                       mux {
+                                       mux-0 {
                                                groups = "sdio_d0",
                                                         "sdio_d1",
                                                         "sdio_d2",
                                                         "sdio_d3",
-                                                        "sdio_cmd",
-                                                        "sdio_clk";
+                                                        "sdio_cmd";
+                                               function = "sdio";
+                                               bias-pull-up;
+                                       };
+
+                                       mux-1 {
+                                               groups = "sdio_clk";
                                                function = "sdio";
                                                bias-disable;
                                        };
index 34b40587e5ef1db79a84f7d7c72de2131416b7bf..c7a87368850b03ffbacb0a8f122fd4da6b800e20 100644 (file)
@@ -9,15 +9,12 @@
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/input/input.h>
 #include <dt-bindings/gpio/meson-g12a-gpio.h>
+#include <dt-bindings/sound/meson-g12a-tohdmitx.h>
 
 / {
        compatible = "seirobotics,sei510", "amlogic,g12a";
        model = "SEI Robotics SEI510";
 
-       aliases {
-               serial0 = &uart_AO;
-       };
-
        adc_keys {
                compatible = "adc-keys";
                io-channels = <&saradc 0>;
                };
        };
 
-       ao_5v: regulator-ao_5v {
-               compatible = "regulator-fixed";
-               regulator-name = "AO_5V";
-               regulator-min-microvolt = <5000000>;
-               regulator-max-microvolt = <5000000>;
-               vin-supply = <&dc_in>;
-               regulator-always-on;
+       aliases {
+               serial0 = &uart_AO;
+               ethernet0 = &ethmac;
+       };
+
+       mono_dac: audio-codec-0 {
+               compatible = "maxim,max98357a";
+               #sound-dai-cells = <0>;
+               sound-name-prefix = "U16";
+               sdmode-gpios = <&gpio GPIOX_8 GPIO_ACTIVE_HIGH>;
+       };
+
+       dmics: audio-codec-1 {
+               #sound-dai-cells = <0>;
+               compatible = "dmic-codec";
+               num-channels = <2>;
+               wakeup-delay-ms = <50>;
+               status = "okay";
+               sound-name-prefix = "MIC";
        };
 
        chosen {
                };
        };
 
-       dc_in: regulator-dc_in {
-               compatible = "regulator-fixed";
-               regulator-name = "DC_IN";
-               regulator-min-microvolt = <5000000>;
-               regulator-max-microvolt = <5000000>;
-               regulator-always-on;
-       };
-
-       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;
+       emmc_pwrseq: emmc-pwrseq {
+               compatible = "mmc-pwrseq-emmc";
+               reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>;
        };
 
        hdmi-connector {
                reg = <0x0 0x0 0x0 0x40000000>;
        };
 
-       reserved-memory {
-               /* TEE Reserved Memory */
-               bl32_reserved: bl32@5000000 {
-                       reg = <0x0 0x05300000 0x0 0x2000000>;
-                       no-map;
-               };
+       ao_5v: regulator-ao_5v {
+               compatible = "regulator-fixed";
+               regulator-name = "AO_5V";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&dc_in>;
+               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;
+       };
+
+       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;
        };
 
        vddao_3v3: regulator-vddao_3v3 {
                vin-supply = <&vddao_3v3>;
                regulator-always-on;
        };
+
+       reserved-memory {
+               /* TEE Reserved Memory */
+               bl32_reserved: bl32@5000000 {
+                       reg = <0x0 0x05300000 0x0 0x2000000>;
+                       no-map;
+               };
+       };
+
+       sdio_pwrseq: sdio-pwrseq {
+               compatible = "mmc-pwrseq-simple";
+               reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>;
+               clocks = <&wifi32k>;
+               clock-names = "ext_clock";
+       };
+
+       wifi32k: wifi32k {
+               compatible = "pwm-clock";
+               #clock-cells = <0>;
+               clock-frequency = <32768>;
+               pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */
+       };
+
+       sound {
+               compatible = "amlogic,axg-sound-card";
+               model = "G12A-SEI510";
+               audio-aux-devs = <&tdmout_a>, <&tdmout_b>,
+                                <&tdmin_a>, <&tdmin_b>;
+               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",
+                               "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",
+                               "TODDR_A IN 4", "PDM Capture",
+                               "TODDR_B IN 4", "PDM Capture",
+                               "TODDR_C IN 4", "PDM Capture",
+                               "TDMIN_A IN 0", "TDM_A Capture",
+                               "TDMIN_A IN 3", "TDM_A Loopback",
+                               "TDMIN_B IN 0", "TDM_A Capture",
+                               "TDMIN_B IN 3", "TDM_A Loopback",
+                               "TDMIN_A IN 1", "TDM_B Capture",
+                               "TDMIN_A IN 4", "TDM_B Loopback",
+                               "TDMIN_B IN 1", "TDM_B Capture",
+                               "TDMIN_B IN 4", "TDM_B 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";
+
+               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>;
+               };
+
+               /* internal speaker interface */
+               dai-link-6 {
+                       sound-dai = <&tdmif_a>;
+                       dai-format = "i2s";
+                       dai-tdm-slot-tx-mask-0 = <1 1>;
+                       mclk-fs = <256>;
+
+                       codec-0 {
+                               sound-dai = <&mono_dac>;
+                       };
+
+                       codec-1 {
+                               sound-dai = <&tohdmitx TOHDMITX_I2S_IN_A>;
+                       };
+               };
+
+               /* 8ch hdmi interface */
+               dai-link-7 {
+                       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>;
+                       };
+               };
+
+               /* internal digital mics */
+               dai-link-8 {
+                       sound-dai = <&pdm>;
+
+                       codec {
+                               sound-dai = <&dmics>;
+                       };
+               };
+
+               /* hdmi glue */
+               dai-link-9 {
+                       sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>;
+
+                       codec {
+                               sound-dai = <&hdmi_tx>;
+                       };
+               };
+       };
+};
+
+&arb {
+       status = "okay";
 };
 
 &cec_AO {
        hdmi-phandle = <&hdmi_tx>;
 };
 
+&clkc_audio {
+       status = "okay";
+};
+
 &cvbs_vdac_port {
        cvbs_vdac_out: endpoint {
                remote-endpoint = <&cvbs_connector_in>;
        };
 };
 
-&saradc {
+&ethmac {
        status = "okay";
-       vref-supply = <&vddio_ao1v8>;
+       phy-handle = <&internal_ephy>;
+       phy-mode = "rmii";
 };
 
-&uart_A {
+&frddr_a {
        status = "okay";
-       pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>;
-       pinctrl-names = "default";
-       uart-has-rtscts;
+};
 
-       bluetooth {
-               compatible = "brcm,bcm43438-bt";
-               shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>;
-       };
+&frddr_b {
+       status = "okay";
+};
+
+&frddr_c {
+       status = "okay";
 };
 
 &hdmi_tx {
        };
 };
 
+&i2c3 {
+       status = "okay";
+       pinctrl-0 = <&i2c3_sda_a_pins>, <&i2c3_sck_a_pins>;
+       pinctrl-names = "default";
+};
+
+&pwm_ef {
+       status = "okay";
+       pinctrl-0 = <&pwm_e_pins>;
+       pinctrl-names = "default";
+       clocks = <&xtal>;
+       clock-names = "clkin0";
+};
+
+&pdm {
+       pinctrl-0 = <&pdm_din0_z_pins>, <&pdm_din1_z_pins>,
+                   <&pdm_din2_z_pins>, <&pdm_din3_z_pins>,
+                   <&pdm_dclk_z_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&saradc {
+       status = "okay";
+       vref-supply = <&vddio_ao1v8>;
+};
+
+/* SDIO */
+&sd_emmc_a {
+       status = "okay";
+       pinctrl-0 = <&sdio_pins>;
+       pinctrl-1 = <&sdio_clk_gate_pins>;
+       pinctrl-names = "default", "clk-gate";
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       bus-width = <4>;
+       cap-sd-highspeed;
+       sd-uhs-sdr50;
+       max-frequency = <100000000>;
+
+       non-removable;
+       disable-wp;
+
+       mmc-pwrseq = <&sdio_pwrseq>;
+
+       vmmc-supply = <&vddao_3v3>;
+       vqmmc-supply = <&vddio_ao1v8>;
+
+       brcmf: wifi@1 {
+               reg = <1>;
+               compatible = "brcm,bcm4329-fmac";
+       };
+};
+
+/* 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;
+
+       cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&vddao_3v3>;
+       vqmmc-supply = <&vddao_3v3>;
+};
+
+/* eMMC */
+&sd_emmc_c {
+       status = "okay";
+       pinctrl-0 = <&emmc_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>;
+       non-removable;
+       disable-wp;
+
+       mmc-pwrseq = <&emmc_pwrseq>;
+       vmmc-supply = <&vddao_3v3>;
+       vqmmc-supply = <&emmc_1v8>;
+};
+
+&tdmif_a {
+       pinctrl-0 = <&tdm_a_dout0_pins>, <&tdm_a_fs_pins>, <&tdm_a_sclk_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+
+       assigned-clocks = <&clkc_audio AUD_CLKID_TDM_SCLK_PAD0>,
+                         <&clkc_audio AUD_CLKID_TDM_LRCLK_PAD0>;
+       assigned-clock-parents = <&clkc_audio AUD_CLKID_MST_A_SCLK>,
+                                <&clkc_audio AUD_CLKID_MST_A_LRCLK>;
+       assigned-clock-rates = <0>, <0>;
+};
+
+&tdmif_b {
+       status = "okay";
+};
+
+&tdmin_a {
+       status = "okay";
+};
+
+&tdmin_b {
+       status = "okay";
+};
+
+&tdmout_a {
+       status = "okay";
+};
+
+&tdmout_b {
+       status = "okay";
+};
+
+&toddr_a {
+       status = "okay";
+};
+
+&toddr_b {
+       status = "okay";
+};
+
+&toddr_c {
+       status = "okay";
+};
+
+&tohdmitx {
+       status = "okay";
+};
+
+&uart_A {
+       status = "okay";
+       pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>;
+       pinctrl-names = "default";
+       uart-has-rtscts;
+
+       bluetooth {
+               compatible = "brcm,bcm43438-bt";
+               shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>;
+               max-speed = <2000000>;
+               clocks = <&wifi32k>;
+               clock-names = "lpo";
+               vbat-supply = <&vddao_3v3>;
+               vddio-supply = <&vddio_ao1v8>;
+       };
+};
+
 &uart_AO {
        status = "okay";
        pinctrl-0 = <&uart_ao_a_pins>;
index 0e8045b8a9158f4fc7d67d43f0dd6a6d35271bdb..8551fbd4a488cfd358c160104177e3a9e613108d 100644 (file)
 
        aliases {
                serial0 = &uart_AO;
+               ethernet0 = &ethmac;
        };
+
        chosen {
                stdout-path = "serial0:115200n8";
        };
-       memory@0 {
-               device_type = "memory";
-               reg = <0x0 0x0 0x0 0x40000000>;
-       };
 
        cvbs-connector {
                compatible = "composite-video-connector";
                };
        };
 
-       flash_1v8: regulator-flash_1v8 {
-               compatible = "regulator-fixed";
-               regulator-name = "FLASH_1V8";
-               regulator-min-microvolt = <1800000>;
-               regulator-max-microvolt = <1800000>;
-               vin-supply = <&vcc_3v3>;
-               regulator-always-on;
+       emmc_pwrseq: emmc-pwrseq {
+               compatible = "mmc-pwrseq-emmc";
+               reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>;
        };
 
        hdmi-connector {
                };
        };
 
+       memory@0 {
+               device_type = "memory";
+               reg = <0x0 0x0 0x0 0x40000000>;
+       };
+
+       flash_1v8: regulator-flash_1v8 {
+               compatible = "regulator-fixed";
+               regulator-name = "FLASH_1V8";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&vcc_3v3>;
+               regulator-always-on;
+       };
+
        main_12v: regulator-main_12v {
                compatible = "regulator-fixed";
                regulator-name = "12V";
                regulator-always-on;
        };
 
+       usb_pwr_en: regulator-usb_pwr_en {
+               compatible = "regulator-fixed";
+               regulator-name = "USB_PWR_EN";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&vcc_5v>;
+
+               gpio = <&gpio GPIOH_6 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
        vcc_1v8: regulator-vcc_1v8 {
                compatible = "regulator-fixed";
                regulator-name = "VCC_1V8";
                enable-active-high;
        };
 
-       usb_pwr_en: regulator-usb_pwr_en {
-               compatible = "regulator-fixed";
-               regulator-name = "USB_PWR_EN";
-               regulator-min-microvolt = <5000000>;
-               regulator-max-microvolt = <5000000>;
-               vin-supply = <&vcc_5v>;
-
-               gpio = <&gpio GPIOH_6 GPIO_ACTIVE_HIGH>;
-               enable-active-high;
-       };
-
        vddao_1v8: regulator-vddao_1v8 {
                compatible = "regulator-fixed";
                regulator-name = "VDDAO_1V8";
        };
 };
 
+&ethmac {
+       status = "okay";
+       phy-handle = <&internal_ephy>;
+       phy-mode = "rmii";
+};
+
 &hdmi_tx {
        status = "okay";
        pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>;
        };
 };
 
+&ir {
+       status = "okay";
+       pinctrl-0 = <&remote_input_ao_pins>;
+       pinctrl-names = "default";
+};
+
+/* i2c Touch */
+&i2c0 {
+       status = "okay";
+       pinctrl-0 = <&i2c0_sda_z0_pins>, <&i2c0_sck_z1_pins>;
+       pinctrl-names = "default";
+};
+
+/* i2c CM */
+&i2c2 {
+       status = "okay";
+       pinctrl-0 = <&i2c2_sda_z_pins>, <&i2c2_sck_z_pins>;
+       pinctrl-names = "default";
+};
+
+/* i2c Audio */
+&i2c3 {
+       status = "okay";
+       pinctrl-0 = <&i2c3_sda_a_pins>, <&i2c3_sck_a_pins>;
+       pinctrl-names = "default";
+};
+
+/* 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;
+
+       cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&vddao_3v3>;
+       vqmmc-supply = <&vddao_3v3>;
+};
+
+/* eMMC */
+&sd_emmc_c {
+       status = "okay";
+       pinctrl-0 = <&emmc_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>;
+       non-removable;
+       disable-wp;
+
+       mmc-pwrseq = <&emmc_pwrseq>;
+       vmmc-supply = <&vcc_3v3>;
+       vqmmc-supply = <&flash_1v8>;
+};
+
 &uart_AO {
        status = "okay";
        pinctrl-0 = <&uart_ao_a_pins>;
index b3d913f28f1211785cb4ba0940fa641ce7cd5219..fe4013cca87643f60d8238133b0ab2353a4b1666 100644 (file)
@@ -8,6 +8,7 @@
 #include "meson-g12a.dtsi"
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/gpio/meson-g12a-gpio.h>
+#include <dt-bindings/sound/meson-g12a-tohdmitx.h>
 
 / {
        compatible = "amediatech,x96-max", "amlogic,u200", "amlogic,g12a";
 
        aliases {
                serial0 = &uart_AO;
+               ethernet0 = &ethmac;
        };
+
+       spdif_dit: audio-codec-1 {
+               #sound-dai-cells = <0>;
+               compatible = "linux,spdif-dit";
+               status = "okay";
+               sound-name-prefix = "DIT";
+       };
+
        chosen {
                stdout-path = "serial0:115200n8";
        };
                };
        };
 
+       emmc_pwrseq: emmc-pwrseq {
+               compatible = "mmc-pwrseq-emmc";
+               reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>;
+       };
+
+       sdio_pwrseq: sdio-pwrseq {
+               compatible = "mmc-pwrseq-simple";
+               reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>;
+               clocks = <&wifi32k>;
+               clock-names = "ext_clock";
+       };
+
        flash_1v8: regulator-flash_1v8 {
                compatible = "regulator-fixed";
                regulator-name = "FLASH_1V8";
                vin-supply = <&dc_in>;
                regulator-always-on;
        };
+
+       sound {
+               compatible = "amlogic,axg-sound-card";
+               model = "G12A-X96-MAX";
+               audio-aux-devs = <&tdmout_b>;
+               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",
+                               "SPDIFOUT IN 0", "FRDDR_A OUT 3",
+                               "SPDIFOUT IN 1", "FRDDR_B OUT 3",
+                               "SPDIFOUT IN 2", "FRDDR_C OUT 3";
+
+               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>;
+               };
+
+               /* 8ch hdmi interface */
+               dai-link-3 {
+                       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 {
+                               sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>;
+                       };
+               };
+
+               /* spdif hdmi or toslink interface */
+               dai-link-4 {
+                       sound-dai = <&spdifout>;
+
+                       codec-0 {
+                               sound-dai = <&spdif_dit>;
+                       };
+
+                       codec-1 {
+                               sound-dai = <&tohdmitx TOHDMITX_SPDIF_IN_A>;
+                       };
+               };
+
+               /* spdif hdmi interface */
+               dai-link-5 {
+                       sound-dai = <&spdifout_b>;
+
+                       codec {
+                               sound-dai = <&tohdmitx TOHDMITX_SPDIF_IN_B>;
+                       };
+               };
+
+               /* hdmi glue */
+               dai-link-6 {
+                       sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>;
+
+                       codec {
+                               sound-dai = <&hdmi_tx>;
+                       };
+               };
+       };
+
+       wifi32k: wifi32k {
+               compatible = "pwm-clock";
+               #clock-cells = <0>;
+               clock-frequency = <32768>;
+               pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */
+       };
+};
+
+&arb {
+       status = "okay";
 };
 
 &cec_AO {
        hdmi-phandle = <&hdmi_tx>;
 };
 
+&clkc_audio {
+       status = "okay";
+};
+
 &cvbs_vdac_port {
        cvbs_vdac_out: endpoint {
                remote-endpoint = <&cvbs_connector_in>;
        };
 };
 
+&frddr_a {
+       status = "okay";
+};
+
+&frddr_b {
+       status = "okay";
+};
+
+&frddr_c {
+       status = "okay";
+};
+
 &hdmi_tx {
        status = "okay";
        pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>;
        };
 };
 
+&ir {
+       status = "okay";
+       pinctrl-0 = <&remote_input_ao_pins>;
+       pinctrl-names = "default";
+};
+
+&ext_mdio {
+       external_phy: ethernet-phy@0 {
+               /* Realtek RTL8211F (0x001cc916) */
+               reg = <0>;
+               max-speed = <1000>;
+               eee-broken-1000t;
+
+               reset-assert-us = <10000>;
+               reset-deassert-us = <30000>;
+               reset-gpios = <&gpio GPIOZ_15 (GPIO_ACTIVE_LOW | GPIO_OPEN_DRAIN)>;
+
+               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";
+       phy-handle = <&external_phy>;
+       amlogic,tx-delay-ns = <2>;
+};
+
+&pwm_ef {
+       status = "okay";
+       pinctrl-0 = <&pwm_e_pins>;
+       pinctrl-names = "default";
+       clocks = <&xtal>;
+       clock-names = "clkin0";
+};
+
 &uart_A {
        status = "okay";
        pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>;
        bluetooth {
                compatible = "brcm,bcm43438-bt";
                shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>;
+               max-speed = <2000000>;
+               clocks = <&wifi32k>;
+               clock-names = "lpo";
        };
 };
 
        status = "okay";
        dr_mode = "host";
 };
+
+/* SDIO */
+&sd_emmc_a {
+       status = "okay";
+       pinctrl-0 = <&sdio_pins>;
+       pinctrl-1 = <&sdio_clk_gate_pins>;
+       pinctrl-names = "default", "clk-gate";
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       bus-width = <4>;
+       cap-sd-highspeed;
+       sd-uhs-sdr50;
+       max-frequency = <100000000>;
+
+       non-removable;
+       disable-wp;
+
+       mmc-pwrseq = <&sdio_pwrseq>;
+
+       vmmc-supply = <&vddao_3v3>;
+       vqmmc-supply = <&vddao_1v8>;
+
+       brcmf: wifi@1 {
+               reg = <1>;
+               compatible = "brcm,bcm4329-fmac";
+       };
+};
+
+/* 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 = <100000000>;
+       disable-wp;
+
+       cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&vddao_3v3>;
+       vqmmc-supply = <&vddao_3v3>;
+};
+
+/* eMMC */
+&sd_emmc_c {
+       status = "okay";
+       pinctrl-0 = <&emmc_pins>, <&emmc_ds_pins>;
+       pinctrl-1 = <&emmc_clk_gate_pins>;
+       pinctrl-names = "default", "clk-gate";
+
+       bus-width = <8>;
+       cap-mmc-highspeed;
+       max-frequency = <100000000>;
+       non-removable;
+       disable-wp;
+
+       mmc-pwrseq = <&emmc_pwrseq>;
+       vmmc-supply = <&vcc_3v3>;
+       vqmmc-supply = <&flash_1v8>;
+};
+
+&spdifout {
+       pinctrl-0 = <&spdif_out_h_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&spdifout_b {
+       status = "okay";
+};
+
+&tdmif_b {
+       status = "okay";
+};
+
+&tdmout_b {
+       status = "okay";
+};
+
+&tohdmitx {
+       status = "okay";
+};
index 9f72396ba7103dcea37f8b13ce2b6f410d4ae2ec..f8d43e3dcf20ce4d57d2b17abd6693c4b2dad77a 100644 (file)
@@ -5,10 +5,12 @@
 
 #include <dt-bindings/phy/phy.h>
 #include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/clock/axg-audio-clkc.h>
 #include <dt-bindings/clock/g12a-clkc.h>
 #include <dt-bindings/clock/g12a-aoclkc.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 #include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/reset/amlogic,meson-axg-audio-arb.h>
 #include <dt-bindings/reset/amlogic,meson-g12a-reset.h>
 
 / {
        #address-cells = <2>;
        #size-cells = <2>;
 
+       tdmif_a: audio-controller-0 {
+               compatible = "amlogic,axg-tdm-iface";
+               #sound-dai-cells = <0>;
+               sound-name-prefix = "TDM_A";
+               clocks = <&clkc_audio AUD_CLKID_MST_A_MCLK>,
+                        <&clkc_audio AUD_CLKID_MST_A_SCLK>,
+                        <&clkc_audio AUD_CLKID_MST_A_LRCLK>;
+               clock-names = "mclk", "sclk", "lrclk";
+               status = "disabled";
+       };
+
+       tdmif_b: audio-controller-1 {
+               compatible = "amlogic,axg-tdm-iface";
+               #sound-dai-cells = <0>;
+               sound-name-prefix = "TDM_B";
+               clocks = <&clkc_audio AUD_CLKID_MST_B_MCLK>,
+                        <&clkc_audio AUD_CLKID_MST_B_SCLK>,
+                        <&clkc_audio AUD_CLKID_MST_B_LRCLK>;
+               clock-names = "mclk", "sclk", "lrclk";
+               status = "disabled";
+       };
+
+       tdmif_c: audio-controller-2 {
+               compatible = "amlogic,axg-tdm-iface";
+               #sound-dai-cells = <0>;
+               sound-name-prefix = "TDM_C";
+               clocks = <&clkc_audio AUD_CLKID_MST_C_MCLK>,
+                        <&clkc_audio AUD_CLKID_MST_C_SCLK>,
+                        <&clkc_audio AUD_CLKID_MST_C_LRCLK>;
+               clock-names = "mclk", "sclk", "lrclk";
+               status = "disabled";
+       };
+
        cpus {
                #address-cells = <0x2>;
                #size-cells = <0x0>;
                #size-cells = <2>;
                ranges;
 
+               ethmac: ethernet@ff3f0000 {
+                       compatible = "amlogic,meson-axg-dwmac",
+                                    "snps,dwmac-3.70a",
+                                    "snps,dwmac";
+                       reg = <0x0 0xff3f0000 0x0 0x10000
+                              0x0 0xff634540 0x0 0x8>;
+                       interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "macirq";
+                       clocks = <&clkc CLKID_ETH>,
+                                <&clkc CLKID_FCLK_DIV2>,
+                                <&clkc CLKID_MPLL2>;
+                       clock-names = "stmmaceth", "clkin0", "clkin1";
+                       status = "disabled";
+
+                       mdio0: mdio {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "snps,dwmac-mdio";
+                       };
+               };
+
                apb: bus@ff600000 {
                        compatible = "simple-bus";
                        reg = <0x0 0xff600000 0x0 0x200000>;
                                clock-names = "isfr", "iahb", "venci";
                                #address-cells = <1>;
                                #size-cells = <0>;
+                               #sound-dai-cells = <0>;
                                status = "disabled";
 
                                /* VPU VENC Input */
                                };
                        };
 
+                       apb_efuse: bus@30000 {
+                               compatible = "simple-bus";
+                               reg = <0x0 0x30000 0x0 0x2000>;
+                               #address-cells = <2>;
+                               #size-cells = <2>;
+                               ranges = <0x0 0x0 0x0 0x30000 0x0 0x2000>;
+
+                               hwrng: rng@218 {
+                                       compatible = "amlogic,meson-rng";
+                                       reg = <0x0 0x218 0x0 0x4>;
+                               };
+                       };
+
                        periphs: bus@34400 {
                                compatible = "simple-bus";
                                reg = <0x0 0x34400 0x0 0x400>;
                                                gpio-ranges = <&periphs_pinctrl 0 0 86>;
                                        };
 
-                                       cec_ao_a_h_pins: cec_ao_a_h {
+                                       cec_ao_a_h_pins: cec_ao_a_h {
+                                               mux {
+                                                       groups = "cec_ao_a_h";
+                                                       function = "cec_ao_a_h";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       cec_ao_b_h_pins: cec_ao_b_h {
+                                               mux {
+                                                       groups = "cec_ao_b_h";
+                                                       function = "cec_ao_b_h";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       emmc_pins: emmc {
+                                               mux-0 {
+                                                       groups = "emmc_nand_d0",
+                                                                "emmc_nand_d1",
+                                                                "emmc_nand_d2",
+                                                                "emmc_nand_d3",
+                                                                "emmc_nand_d4",
+                                                                "emmc_nand_d5",
+                                                                "emmc_nand_d6",
+                                                                "emmc_nand_d7",
+                                                                "emmc_cmd";
+                                                       function = "emmc";
+                                                       bias-pull-up;
+                                                       drive-strength-microamp = <4000>;
+                                               };
+
+                                               mux-1 {
+                                                       groups = "emmc_clk";
+                                                       function = "emmc";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <4000>;
+                                               };
+                                       };
+
+                                       emmc_ds_pins: emmc-ds {
+                                               mux {
+                                                       groups = "emmc_nand_ds";
+                                                       function = "emmc";
+                                                       bias-pull-down;
+                                                       drive-strength-microamp = <4000>;
+                                               };
+                                       };
+
+                                       emmc_clk_gate_pins: emmc_clk_gate {
+                                               mux {
+                                                       groups = "BOOT_8";
+                                                       function = "gpio_periphs";
+                                                       bias-pull-down;
+                                                       drive-strength-microamp = <4000>;
+                                               };
+                                       };
+
+                                       hdmitx_ddc_pins: hdmitx_ddc {
+                                               mux {
+                                                       groups = "hdmitx_sda",
+                                                                "hdmitx_sck";
+                                                       function = "hdmitx";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <4000>;
+                                               };
+                                       };
+
+                                       hdmitx_hpd_pins: hdmitx_hpd {
+                                               mux {
+                                                       groups = "hdmitx_hpd_in";
+                                                       function = "hdmitx";
+                                                       bias-disable;
+                                               };
+                                       };
+
+
+                                       i2c0_sda_c_pins: i2c0-sda-c {
+                                               mux {
+                                                       groups = "i2c0_sda_c";
+                                                       function = "i2c0";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+
+                                               };
+                                       };
+
+                                       i2c0_sck_c_pins: i2c0-sck-c {
+                                               mux {
+                                                       groups = "i2c0_sck_c";
+                                                       function = "i2c0";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c0_sda_z0_pins: i2c0-sda-z0 {
+                                               mux {
+                                                       groups = "i2c0_sda_z0";
+                                                       function = "i2c0";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c0_sck_z1_pins: i2c0-sck-z1 {
+                                               mux {
+                                                       groups = "i2c0_sck_z1";
+                                                       function = "i2c0";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c0_sda_z7_pins: i2c0-sda-z7 {
+                                               mux {
+                                                       groups = "i2c0_sda_z7";
+                                                       function = "i2c0";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c0_sda_z8_pins: i2c0-sda-z8 {
+                                               mux {
+                                                       groups = "i2c0_sda_z8";
+                                                       function = "i2c0";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c1_sda_x_pins: i2c1-sda-x {
+                                               mux {
+                                                       groups = "i2c1_sda_x";
+                                                       function = "i2c1";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c1_sck_x_pins: i2c1-sck-x {
+                                               mux {
+                                                       groups = "i2c1_sck_x";
+                                                       function = "i2c1";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c1_sda_h2_pins: i2c1-sda-h2 {
+                                               mux {
+                                                       groups = "i2c1_sda_h2";
+                                                       function = "i2c1";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c1_sck_h3_pins: i2c1-sck-h3 {
+                                               mux {
+                                                       groups = "i2c1_sck_h3";
+                                                       function = "i2c1";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c1_sda_h6_pins: i2c1-sda-h6 {
+                                               mux {
+                                                       groups = "i2c1_sda_h6";
+                                                       function = "i2c1";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c1_sck_h7_pins: i2c1-sck-h7 {
+                                               mux {
+                                                       groups = "i2c1_sck_h7";
+                                                       function = "i2c1";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c2_sda_x_pins: i2c2-sda-x {
+                                               mux {
+                                                       groups = "i2c2_sda_x";
+                                                       function = "i2c2";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c2_sck_x_pins: i2c2-sck-x {
+                                               mux {
+                                                       groups = "i2c2_sck_x";
+                                                       function = "i2c2";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c2_sda_z_pins: i2c2-sda-z {
+                                               mux {
+                                                       groups = "i2c2_sda_z";
+                                                       function = "i2c2";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c2_sck_z_pins: i2c2-sck-z {
+                                               mux {
+                                                       groups = "i2c2_sck_z";
+                                                       function = "i2c2";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c3_sda_h_pins: i2c3-sda-h {
+                                               mux {
+                                                       groups = "i2c3_sda_h";
+                                                       function = "i2c3";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c3_sck_h_pins: i2c3-sck-h {
+                                               mux {
+                                                       groups = "i2c3_sck_h";
+                                                       function = "i2c3";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c3_sda_a_pins: i2c3-sda-a {
+                                               mux {
+                                                       groups = "i2c3_sda_a";
+                                                       function = "i2c3";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c3_sck_a_pins: i2c3-sck-a {
+                                               mux {
+                                                       groups = "i2c3_sck_a";
+                                                       function = "i2c3";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       mclk0_a_pins: mclk0-a {
+                                               mux {
+                                                       groups = "mclk0_a";
+                                                       function = "mclk0";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       mclk1_a_pins: mclk1-a {
+                                               mux {
+                                                       groups = "mclk1_a";
+                                                       function = "mclk1";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       mclk1_x_pins: mclk1-x {
+                                               mux {
+                                                       groups = "mclk1_x";
+                                                       function = "mclk1";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       mclk1_z_pins: mclk1-z {
+                                               mux {
+                                                       groups = "mclk1_z";
+                                                       function = "mclk1";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       pdm_din0_a_pins: pdm-din0-a {
+                                               mux {
+                                                       groups = "pdm_din0_a";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din0_c_pins: pdm-din0-c {
+                                               mux {
+                                                       groups = "pdm_din0_c";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din0_x_pins: pdm-din0-x {
+                                               mux {
+                                                       groups = "pdm_din0_x";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din0_z_pins: pdm-din0-z {
+                                               mux {
+                                                       groups = "pdm_din0_z";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din1_a_pins: pdm-din1-a {
+                                               mux {
+                                                       groups = "pdm_din1_a";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din1_c_pins: pdm-din1-c {
+                                               mux {
+                                                       groups = "pdm_din1_c";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din1_x_pins: pdm-din1-x {
+                                               mux {
+                                                       groups = "pdm_din1_x";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din1_z_pins: pdm-din1-z {
+                                               mux {
+                                                       groups = "pdm_din1_z";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din2_a_pins: pdm-din2-a {
+                                               mux {
+                                                       groups = "pdm_din2_a";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din2_c_pins: pdm-din2-c {
+                                               mux {
+                                                       groups = "pdm_din2_c";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din2_x_pins: pdm-din2-x {
+                                               mux {
+                                                       groups = "pdm_din2_x";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din2_z_pins: pdm-din2-z {
+                                               mux {
+                                                       groups = "pdm_din2_z";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din3_a_pins: pdm-din3-a {
+                                               mux {
+                                                       groups = "pdm_din3_a";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din3_c_pins: pdm-din3-c {
+                                               mux {
+                                                       groups = "pdm_din3_c";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din3_x_pins: pdm-din3-x {
+                                               mux {
+                                                       groups = "pdm_din3_x";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_din3_z_pins: pdm-din3-z {
+                                               mux {
+                                                       groups = "pdm_din3_z";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pdm_dclk_a_pins: pdm-dclk-a {
+                                               mux {
+                                                       groups = "pdm_dclk_a";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <500>;
+                                               };
+                                       };
+
+                                       pdm_dclk_c_pins: pdm-dclk-c {
+                                               mux {
+                                                       groups = "pdm_dclk_c";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <500>;
+                                               };
+                                       };
+
+                                       pdm_dclk_x_pins: pdm-dclk-x {
+                                               mux {
+                                                       groups = "pdm_dclk_x";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <500>;
+                                               };
+                                       };
+
+                                       pdm_dclk_z_pins: pdm-dclk-z {
+                                               mux {
+                                                       groups = "pdm_dclk_z";
+                                                       function = "pdm";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <500>;
+                                               };
+                                       };
+
+                                       pwm_a_pins: pwm-a {
+                                               mux {
+                                                       groups = "pwm_a";
+                                                       function = "pwm_a";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_b_x7_pins: pwm-b-x7 {
+                                               mux {
+                                                       groups = "pwm_b_x7";
+                                                       function = "pwm_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_b_x19_pins: pwm-b-x19 {
+                                               mux {
+                                                       groups = "pwm_b_x19";
+                                                       function = "pwm_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_c_c_pins: pwm-c-c {
+                                               mux {
+                                                       groups = "pwm_c_c";
+                                                       function = "pwm_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_c_x5_pins: pwm-c-x5 {
+                                               mux {
+                                                       groups = "pwm_c_x5";
+                                                       function = "pwm_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_c_x8_pins: pwm-c-x8 {
+                                               mux {
+                                                       groups = "pwm_c_x8";
+                                                       function = "pwm_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_d_x3_pins: pwm-d-x3 {
+                                               mux {
+                                                       groups = "pwm_d_x3";
+                                                       function = "pwm_d";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_d_x6_pins: pwm-d-x6 {
+                                               mux {
+                                                       groups = "pwm_d_x6";
+                                                       function = "pwm_d";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_e_pins: pwm-e {
+                                               mux {
+                                                       groups = "pwm_e";
+                                                       function = "pwm_e";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_f_x_pins: pwm-f-x {
+                                               mux {
+                                                       groups = "pwm_f_x";
+                                                       function = "pwm_f";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_f_h_pins: pwm-f-h {
+                                               mux {
+                                                       groups = "pwm_f_h";
+                                                       function = "pwm_f";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       sdcard_c_pins: sdcard_c {
+                                               mux-0 {
+                                                       groups = "sdcard_d0_c",
+                                                                "sdcard_d1_c",
+                                                                "sdcard_d2_c",
+                                                                "sdcard_d3_c",
+                                                                "sdcard_cmd_c";
+                                                       function = "sdcard";
+                                                       bias-pull-up;
+                                                       drive-strength-microamp = <4000>;
+                                               };
+
+                                               mux-1 {
+                                                       groups = "sdcard_clk_c";
+                                                       function = "sdcard";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <4000>;
+                                               };
+                                       };
+
+                                       sdcard_clk_gate_c_pins: sdcard_clk_gate_c {
+                                               mux {
+                                                       groups = "GPIOC_4";
+                                                       function = "gpio_periphs";
+                                                       bias-pull-down;
+                                                       drive-strength-microamp = <4000>;
+                                               };
+                                       };
+
+                                       sdcard_z_pins: sdcard_z {
+                                               mux-0 {
+                                                       groups = "sdcard_d0_z",
+                                                                "sdcard_d1_z",
+                                                                "sdcard_d2_z",
+                                                                "sdcard_d3_z",
+                                                                "sdcard_cmd_z";
+                                                       function = "sdcard";
+                                                       bias-pull-up;
+                                                       drive-strength-microamp = <4000>;
+                                               };
+
+                                               mux-1 {
+                                                       groups = "sdcard_clk_z";
+                                                       function = "sdcard";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <4000>;
+                                               };
+                                       };
+
+                                       sdcard_clk_gate_z_pins: sdcard_clk_gate_z {
+                                               mux {
+                                                       groups = "GPIOZ_6";
+                                                       function = "gpio_periphs";
+                                                       bias-pull-down;
+                                                       drive-strength-microamp = <4000>;
+                                               };
+                                       };
+
+                                       sdio_pins: sdio {
+                                               mux {
+                                                       groups = "sdio_d0",
+                                                                "sdio_d1",
+                                                                "sdio_d2",
+                                                                "sdio_d3",
+                                                                "sdio_clk",
+                                                                "sdio_cmd";
+                                                       function = "sdio";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <4000>;
+                                               };
+                                       };
+
+                                       sdio_clk_gate_pins: sdio_clk_gate {
+                                               mux {
+                                                       groups = "GPIOX_4";
+                                                       function = "gpio_periphs";
+                                                       bias-pull-down;
+                                                       drive-strength-microamp = <4000>;
+                                               };
+                                       };
+
+                                       spdif_in_a10_pins: spdif-in-a10 {
+                                               mux {
+                                                       groups = "spdif_in_a10";
+                                                       function = "spdif_in";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       spdif_in_a12_pins: spdif-in-a12 {
+                                               mux {
+                                                       groups = "spdif_in_a12";
+                                                       function = "spdif_in";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       spdif_in_h_pins: spdif-in-h {
+                                               mux {
+                                                       groups = "spdif_in_h";
+                                                       function = "spdif_in";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       spdif_out_h_pins: spdif-out-h {
+                                               mux {
+                                                       groups = "spdif_out_h";
+                                                       function = "spdif_out";
+                                                       drive-strength-microamp = <500>;
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       spdif_out_a11_pins: spdif-out-a11 {
+                                               mux {
+                                                       groups = "spdif_out_a11";
+                                                       function = "spdif_out";
+                                                       drive-strength-microamp = <500>;
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       spdif_out_a13_pins: spdif-out-a13 {
+                                               mux {
+                                                       groups = "spdif_out_a13";
+                                                       function = "spdif_out";
+                                                       drive-strength-microamp = <500>;
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_a_din0_pins: tdm-a-din0 {
+                                               mux {
+                                                       groups = "tdm_a_din0";
+                                                       function = "tdm_a";
+                                                       bias-disable;
+                                               };
+                                       };
+
+
+                                       tdm_a_din1_pins: tdm-a-din1 {
+                                               mux {
+                                                       groups = "tdm_a_din1";
+                                                       function = "tdm_a";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_a_dout0_pins: tdm-a-dout0 {
+                                               mux {
+                                                       groups = "tdm_a_dout0";
+                                                       function = "tdm_a";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_a_dout1_pins: tdm-a-dout1 {
+                                               mux {
+                                                       groups = "tdm_a_dout1";
+                                                       function = "tdm_a";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_a_fs_pins: tdm-a-fs {
+                                               mux {
+                                                       groups = "tdm_a_fs";
+                                                       function = "tdm_a";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_a_sclk_pins: tdm-a-sclk {
+                                               mux {
+                                                       groups = "tdm_a_sclk";
+                                                       function = "tdm_a";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_a_slv_fs_pins: tdm-a-slv-fs {
+                                               mux {
+                                                       groups = "tdm_a_slv_fs";
+                                                       function = "tdm_a";
+                                                       bias-disable;
+                                               };
+                                       };
+
+
+                                       tdm_a_slv_sclk_pins: tdm-a-slv-sclk {
+                                               mux {
+                                                       groups = "tdm_a_slv_sclk";
+                                                       function = "tdm_a";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_b_din0_pins: tdm-b-din0 {
+                                               mux {
+                                                       groups = "tdm_b_din0";
+                                                       function = "tdm_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_b_din1_pins: tdm-b-din1 {
+                                               mux {
+                                                       groups = "tdm_b_din1";
+                                                       function = "tdm_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_b_din2_pins: tdm-b-din2 {
+                                               mux {
+                                                       groups = "tdm_b_din2";
+                                                       function = "tdm_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_b_din3_a_pins: tdm-b-din3-a {
+                                               mux {
+                                                       groups = "tdm_b_din3_a";
+                                                       function = "tdm_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_b_din3_h_pins: tdm-b-din3-h {
+                                               mux {
+                                                       groups = "tdm_b_din3_h";
+                                                       function = "tdm_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_b_dout0_pins: tdm-b-dout0 {
+                                               mux {
+                                                       groups = "tdm_b_dout0";
+                                                       function = "tdm_b";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_b_dout1_pins: tdm-b-dout1 {
+                                               mux {
+                                                       groups = "tdm_b_dout1";
+                                                       function = "tdm_b";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_b_dout2_pins: tdm-b-dout2 {
+                                               mux {
+                                                       groups = "tdm_b_dout2";
+                                                       function = "tdm_b";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_b_dout3_a_pins: tdm-b-dout3-a {
+                                               mux {
+                                                       groups = "tdm_b_dout3_a";
+                                                       function = "tdm_b";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_b_dout3_h_pins: tdm-b-dout3-h {
+                                               mux {
+                                                       groups = "tdm_b_dout3_h";
+                                                       function = "tdm_b";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_b_fs_pins: tdm-b-fs {
+                                               mux {
+                                                       groups = "tdm_b_fs";
+                                                       function = "tdm_b";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_b_sclk_pins: tdm-b-sclk {
+                                               mux {
+                                                       groups = "tdm_b_sclk";
+                                                       function = "tdm_b";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_b_slv_fs_pins: tdm-b-slv-fs {
+                                               mux {
+                                                       groups = "tdm_b_slv_fs";
+                                                       function = "tdm_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_b_slv_sclk_pins: tdm-b-slv-sclk {
+                                               mux {
+                                                       groups = "tdm_b_slv_sclk";
+                                                       function = "tdm_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_c_din0_a_pins: tdm-c-din0-a {
+                                               mux {
+                                                       groups = "tdm_c_din0_a";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_c_din0_z_pins: tdm-c-din0-z {
+                                               mux {
+                                                       groups = "tdm_c_din0_z";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_c_din1_a_pins: tdm-c-din1-a {
+                                               mux {
+                                                       groups = "tdm_c_din1_a";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_c_din1_z_pins: tdm-c-din1-z {
+                                               mux {
+                                                       groups = "tdm_c_din1_z";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_c_din2_a_pins: tdm-c-din2-a {
+                                               mux {
+                                                       groups = "tdm_c_din2_a";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       eth_leds_pins: eth-leds {
+                                               mux {
+                                                       groups = "eth_link_led",
+                                                                "eth_act_led";
+                                                       function = "eth";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       eth_pins: eth {
+                                               mux {
+                                                       groups = "eth_mdio",
+                                                                "eth_mdc",
+                                                                "eth_rgmii_rx_clk",
+                                                                "eth_rx_dv",
+                                                                "eth_rxd0",
+                                                                "eth_rxd1",
+                                                                "eth_txen",
+                                                                "eth_txd0",
+                                                                "eth_txd1";
+                                                       function = "eth";
+                                                       drive-strength-microamp = <4000>;
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       eth_rgmii_pins: eth-rgmii {
+                                               mux {
+                                                       groups = "eth_rxd2_rgmii",
+                                                                "eth_rxd3_rgmii",
+                                                                "eth_rgmii_tx_clk",
+                                                                "eth_txd2_rgmii",
+                                                                "eth_txd3_rgmii";
+                                                       function = "eth";
+                                                       drive-strength-microamp = <4000>;
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_c_din2_z_pins: tdm-c-din2-z {
+                                               mux {
+                                                       groups = "tdm_c_din2_z";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_c_din3_a_pins: tdm-c-din3-a {
+                                               mux {
+                                                       groups = "tdm_c_din3_a";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_c_din3_z_pins: tdm-c-din3-z {
+                                               mux {
+                                                       groups = "tdm_c_din3_z";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_c_dout0_a_pins: tdm-c-dout0-a {
+                                               mux {
+                                                       groups = "tdm_c_dout0_a";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_c_dout0_z_pins: tdm-c-dout0-z {
+                                               mux {
+                                                       groups = "tdm_c_dout0_z";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_c_dout1_a_pins: tdm-c-dout1-a {
+                                               mux {
+                                                       groups = "tdm_c_dout1_a";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_c_dout1_z_pins: tdm-c-dout1-z {
+                                               mux {
+                                                       groups = "tdm_c_dout1_z";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_c_dout2_a_pins: tdm-c-dout2-a {
+                                               mux {
+                                                       groups = "tdm_c_dout2_a";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_c_dout2_z_pins: tdm-c-dout2-z {
+                                               mux {
+                                                       groups = "tdm_c_dout2_z";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_c_dout3_a_pins: tdm-c-dout3-a {
+                                               mux {
+                                                       groups = "tdm_c_dout3_a";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_c_dout3_z_pins: tdm-c-dout3-z {
+                                               mux {
+                                                       groups = "tdm_c_dout3_z";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_c_fs_a_pins: tdm-c-fs-a {
+                                               mux {
+                                                       groups = "tdm_c_fs_a";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_c_fs_z_pins: tdm-c-fs-z {
+                                               mux {
+                                                       groups = "tdm_c_fs_z";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_c_sclk_a_pins: tdm-c-sclk-a {
                                                mux {
-                                                       groups = "cec_ao_a_h";
-                                                       function = "cec_ao_a_h";
+                                                       groups = "tdm_c_sclk_a";
+                                                       function = "tdm_c";
                                                        bias-disable;
+                                                       drive-strength-microamp = <3000>;
                                                };
                                        };
 
-                                       cec_ao_b_h_pins: cec_ao_b_h {
+                                       tdm_c_sclk_z_pins: tdm-c-sclk-z {
                                                mux {
-                                                       groups = "cec_ao_b_h";
-                                                       function = "cec_ao_b_h";
+                                                       groups = "tdm_c_sclk_z";
+                                                       function = "tdm_c";
                                                        bias-disable;
+                                                       drive-strength-microamp = <3000>;
                                                };
                                        };
 
-                                       hdmitx_ddc_pins: hdmitx_ddc {
+                                       tdm_c_slv_fs_a_pins: tdm-c-slv-fs-a {
                                                mux {
-                                                       groups = "hdmitx_sda",
-                                                                "hdmitx_sck";
-                                                       function = "hdmitx";
+                                                       groups = "tdm_c_slv_fs_a";
+                                                       function = "tdm_c";
                                                        bias-disable;
                                                };
                                        };
 
-                                       hdmitx_hpd_pins: hdmitx_hpd {
+                                       tdm_c_slv_fs_z_pins: tdm-c-slv-fs-z {
                                                mux {
-                                                       groups = "hdmitx_hpd_in";
-                                                       function = "hdmitx";
+                                                       groups = "tdm_c_slv_fs_z";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_c_slv_sclk_a_pins: tdm-c-slv-sclk-a {
+                                               mux {
+                                                       groups = "tdm_c_slv_sclk_a";
+                                                       function = "tdm_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_c_slv_sclk_z_pins: tdm-c-slv-sclk-z {
+                                               mux {
+                                                       groups = "tdm_c_slv_sclk_z";
+                                                       function = "tdm_c";
                                                        bias-disable;
                                                };
                                        };
                                };
                        };
 
+                       pdm: audio-controller@40000 {
+                               compatible = "amlogic,g12a-pdm",
+                                            "amlogic,axg-pdm";
+                               reg = <0x0 0x40000 0x0 0x34>;
+                               #sound-dai-cells = <0>;
+                               sound-name-prefix = "PDM";
+                               clocks = <&clkc_audio AUD_CLKID_PDM>,
+                                        <&clkc_audio AUD_CLKID_PDM_DCLK>,
+                                        <&clkc_audio AUD_CLKID_PDM_SYSCLK>;
+                               clock-names = "pclk", "dclk", "sysclk";
+                               status = "disabled";
+                       };
+
+                       audio: bus@42000 {
+                               compatible = "simple-bus";
+                               reg = <0x0 0x42000 0x0 0x2000>;
+                               #address-cells = <2>;
+                               #size-cells = <2>;
+                               ranges = <0x0 0x0 0x0 0x42000 0x0 0x2000>;
+
+                               clkc_audio: clock-controller@0 {
+                                       status = "disabled";
+                                       compatible = "amlogic,g12a-audio-clkc";
+                                       reg = <0x0 0x0 0x0 0xb4>;
+                                       #clock-cells = <1>;
+
+                                       clocks = <&clkc CLKID_AUDIO>,
+                                                <&clkc CLKID_MPLL0>,
+                                                <&clkc CLKID_MPLL1>,
+                                                <&clkc CLKID_MPLL2>,
+                                                <&clkc CLKID_MPLL3>,
+                                                <&clkc CLKID_HIFI_PLL>,
+                                                <&clkc CLKID_FCLK_DIV3>,
+                                                <&clkc CLKID_FCLK_DIV4>,
+                                                <&clkc CLKID_GP0_PLL>;
+                                       clock-names = "pclk",
+                                                     "mst_in0",
+                                                     "mst_in1",
+                                                     "mst_in2",
+                                                     "mst_in3",
+                                                     "mst_in4",
+                                                     "mst_in5",
+                                                     "mst_in6",
+                                                     "mst_in7";
+
+                                       resets = <&reset RESET_AUDIO>;
+                               };
+
+                               toddr_a: audio-controller@100 {
+                                       compatible = "amlogic,g12a-toddr",
+                                                    "amlogic,axg-toddr";
+                                       reg = <0x0 0x100 0x0 0x1c>;
+                                       #sound-dai-cells = <0>;
+                                       sound-name-prefix = "TODDR_A";
+                                       interrupts = <GIC_SPI 148 IRQ_TYPE_EDGE_RISING>;
+                                       clocks = <&clkc_audio AUD_CLKID_TODDR_A>;
+                                       resets = <&arb AXG_ARB_TODDR_A>;
+                                       status = "disabled";
+                               };
+
+                               toddr_b: audio-controller@140 {
+                                       compatible = "amlogic,g12a-toddr",
+                                                    "amlogic,axg-toddr";
+                                       reg = <0x0 0x140 0x0 0x1c>;
+                                       #sound-dai-cells = <0>;
+                                       sound-name-prefix = "TODDR_B";
+                                       interrupts = <GIC_SPI 149 IRQ_TYPE_EDGE_RISING>;
+                                       clocks = <&clkc_audio AUD_CLKID_TODDR_B>;
+                                       resets = <&arb AXG_ARB_TODDR_B>;
+                                       status = "disabled";
+                               };
+
+                               toddr_c: audio-controller@180 {
+                                       compatible = "amlogic,g12a-toddr",
+                                                    "amlogic,axg-toddr";
+                                       reg = <0x0 0x180 0x0 0x1c>;
+                                       #sound-dai-cells = <0>;
+                                       sound-name-prefix = "TODDR_C";
+                                       interrupts = <GIC_SPI 150 IRQ_TYPE_EDGE_RISING>;
+                                       clocks = <&clkc_audio AUD_CLKID_TODDR_C>;
+                                       resets = <&arb AXG_ARB_TODDR_C>;
+                                       status = "disabled";
+                               };
+
+                               frddr_a: audio-controller@1c0 {
+                                       compatible = "amlogic,g12a-frddr",
+                                                    "amlogic,axg-frddr";
+                                       reg = <0x0 0x1c0 0x0 0x1c>;
+                                       #sound-dai-cells = <0>;
+                                       sound-name-prefix = "FRDDR_A";
+                                       interrupts = <GIC_SPI 152 IRQ_TYPE_EDGE_RISING>;
+                                       clocks = <&clkc_audio AUD_CLKID_FRDDR_A>;
+                                       resets = <&arb AXG_ARB_FRDDR_A>;
+                                       status = "disabled";
+                               };
+
+                               frddr_b: audio-controller@200 {
+                                       compatible = "amlogic,g12a-frddr",
+                                                    "amlogic,axg-frddr";
+                                       reg = <0x0 0x200 0x0 0x1c>;
+                                       #sound-dai-cells = <0>;
+                                       sound-name-prefix = "FRDDR_B";
+                                       interrupts = <GIC_SPI 153 IRQ_TYPE_EDGE_RISING>;
+                                       clocks = <&clkc_audio AUD_CLKID_FRDDR_B>;
+                                       resets = <&arb AXG_ARB_FRDDR_B>;
+                                       status = "disabled";
+                               };
+
+                               frddr_c: audio-controller@240 {
+                                       compatible = "amlogic,g12a-frddr",
+                                                    "amlogic,axg-frddr";
+                                       reg = <0x0 0x240 0x0 0x1c>;
+                                       #sound-dai-cells = <0>;
+                                       sound-name-prefix = "FRDDR_C";
+                                       interrupts = <GIC_SPI 154 IRQ_TYPE_EDGE_RISING>;
+                                       clocks = <&clkc_audio AUD_CLKID_FRDDR_C>;
+                                       resets = <&arb AXG_ARB_FRDDR_C>;
+                                       status = "disabled";
+                               };
+
+                               arb: reset-controller@280 {
+                                       status = "disabled";
+                                       compatible = "amlogic,meson-axg-audio-arb";
+                                       reg = <0x0 0x280 0x0 0x4>;
+                                       #reset-cells = <1>;
+                                       clocks = <&clkc_audio AUD_CLKID_DDR_ARB>;
+                               };
+
+                               tdmin_a: audio-controller@300 {
+                                       compatible = "amlogic,g12a-tdmin",
+                                                    "amlogic,axg-tdmin";
+                                       reg = <0x0 0x300 0x0 0x40>;
+                                       sound-name-prefix = "TDMIN_A";
+                                       clocks = <&clkc_audio AUD_CLKID_TDMIN_A>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_A_SCLK>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_A_SCLK_SEL>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_A_LRCLK>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_A_LRCLK>;
+                                       clock-names = "pclk", "sclk", "sclk_sel",
+                                                     "lrclk", "lrclk_sel";
+                                       status = "disabled";
+                               };
+
+                               tdmin_b: audio-controller@340 {
+                                       compatible = "amlogic,g12a-tdmin",
+                                                    "amlogic,axg-tdmin";
+                                       reg = <0x0 0x340 0x0 0x40>;
+                                       sound-name-prefix = "TDMIN_B";
+                                       clocks = <&clkc_audio AUD_CLKID_TDMIN_B>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_B_SCLK>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_B_SCLK_SEL>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_B_LRCLK>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_B_LRCLK>;
+                                       clock-names = "pclk", "sclk", "sclk_sel",
+                                                     "lrclk", "lrclk_sel";
+                                       status = "disabled";
+                               };
+
+                               tdmin_c: audio-controller@380 {
+                                       compatible = "amlogic,g12a-tdmin",
+                                                    "amlogic,axg-tdmin";
+                                       reg = <0x0 0x380 0x0 0x40>;
+                                       sound-name-prefix = "TDMIN_C";
+                                       clocks = <&clkc_audio AUD_CLKID_TDMIN_C>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_C_SCLK>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_C_SCLK_SEL>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_C_LRCLK>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_C_LRCLK>;
+                                       clock-names = "pclk", "sclk", "sclk_sel",
+                                                     "lrclk", "lrclk_sel";
+                                       status = "disabled";
+                               };
+
+                               tdmin_lb: audio-controller@3c0 {
+                                       compatible = "amlogic,g12a-tdmin",
+                                                    "amlogic,axg-tdmin";
+                                       reg = <0x0 0x3c0 0x0 0x40>;
+                                       sound-name-prefix = "TDMIN_LB";
+                                       clocks = <&clkc_audio AUD_CLKID_TDMIN_LB>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_LB_SCLK>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_LB_SCLK_SEL>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_LB_LRCLK>,
+                                                <&clkc_audio AUD_CLKID_TDMIN_LB_LRCLK>;
+                                       clock-names = "pclk", "sclk", "sclk_sel",
+                                                     "lrclk", "lrclk_sel";
+                                       status = "disabled";
+                               };
+
+                               spdifin: audio-controller@400 {
+                                       compatible = "amlogic,g12a-spdifin",
+                                                    "amlogic,axg-spdifin";
+                                       reg = <0x0 0x400 0x0 0x30>;
+                                       #sound-dai-cells = <0>;
+                                       sound-name-prefix = "SPDIFIN";
+                                       interrupts = <GIC_SPI 151 IRQ_TYPE_EDGE_RISING>;
+                                       clocks = <&clkc_audio AUD_CLKID_SPDIFIN>,
+                                                <&clkc_audio AUD_CLKID_SPDIFIN_CLK>;
+                                       clock-names = "pclk", "refclk";
+                                       status = "disabled";
+                               };
+
+                               spdifout: audio-controller@480 {
+                                       compatible = "amlogic,g12a-spdifout",
+                                                    "amlogic,axg-spdifout";
+                                       reg = <0x0 0x480 0x0 0x50>;
+                                       #sound-dai-cells = <0>;
+                                       sound-name-prefix = "SPDIFOUT";
+                                       clocks = <&clkc_audio AUD_CLKID_SPDIFOUT>,
+                                                <&clkc_audio AUD_CLKID_SPDIFOUT_CLK>;
+                                       clock-names = "pclk", "mclk";
+                                       status = "disabled";
+                               };
+
+                               tdmout_a: audio-controller@500 {
+                                       compatible = "amlogic,g12a-tdmout";
+                                       reg = <0x0 0x500 0x0 0x40>;
+                                       sound-name-prefix = "TDMOUT_A";
+                                       clocks = <&clkc_audio AUD_CLKID_TDMOUT_A>,
+                                                <&clkc_audio AUD_CLKID_TDMOUT_A_SCLK>,
+                                                <&clkc_audio AUD_CLKID_TDMOUT_A_SCLK_SEL>,
+                                                <&clkc_audio AUD_CLKID_TDMOUT_A_LRCLK>,
+                                                <&clkc_audio AUD_CLKID_TDMOUT_A_LRCLK>;
+                                       clock-names = "pclk", "sclk", "sclk_sel",
+                                                     "lrclk", "lrclk_sel";
+                                       status = "disabled";
+                               };
+
+                               tdmout_b: audio-controller@540 {
+                                       compatible = "amlogic,g12a-tdmout";
+                                       reg = <0x0 0x540 0x0 0x40>;
+                                       sound-name-prefix = "TDMOUT_B";
+                                       clocks = <&clkc_audio AUD_CLKID_TDMOUT_B>,
+                                                <&clkc_audio AUD_CLKID_TDMOUT_B_SCLK>,
+                                                <&clkc_audio AUD_CLKID_TDMOUT_B_SCLK_SEL>,
+                                                <&clkc_audio AUD_CLKID_TDMOUT_B_LRCLK>,
+                                                <&clkc_audio AUD_CLKID_TDMOUT_B_LRCLK>;
+                                       clock-names = "pclk", "sclk", "sclk_sel",
+                                                     "lrclk", "lrclk_sel";
+                                       status = "disabled";
+                               };
+
+                               tdmout_c: audio-controller@580 {
+                                       compatible = "amlogic,g12a-tdmout";
+                                       reg = <0x0 0x580 0x0 0x40>;
+                                       sound-name-prefix = "TDMOUT_C";
+                                       clocks = <&clkc_audio AUD_CLKID_TDMOUT_C>,
+                                                <&clkc_audio AUD_CLKID_TDMOUT_C_SCLK>,
+                                                <&clkc_audio AUD_CLKID_TDMOUT_C_SCLK_SEL>,
+                                                <&clkc_audio AUD_CLKID_TDMOUT_C_LRCLK>,
+                                                <&clkc_audio AUD_CLKID_TDMOUT_C_LRCLK>;
+                                       clock-names = "pclk", "sclk", "sclk_sel",
+                                                     "lrclk", "lrclk_sel";
+                                       status = "disabled";
+                               };
+
+                               spdifout_b: audio-controller@680 {
+                                       compatible = "amlogic,g12a-spdifout",
+                                                    "amlogic,axg-spdifout";
+                                       reg = <0x0 0x680 0x0 0x50>;
+                                       #sound-dai-cells = <0>;
+                                       sound-name-prefix = "SPDIFOUT_B";
+                                       clocks = <&clkc_audio AUD_CLKID_SPDIFOUT_B>,
+                                                <&clkc_audio AUD_CLKID_SPDIFOUT_B_CLK>;
+                                       clock-names = "pclk", "mclk";
+                                       status = "disabled";
+                               };
+
+                               tohdmitx: audio-controller@744 {
+                                       compatible = "amlogic,g12a-tohdmitx";
+                                       reg = <0x0 0x744 0x0 0x4>;
+                                       #sound-dai-cells = <1>;
+                                       sound-name-prefix = "TOHDMITX";
+                                       status = "disabled";
+                               };
+                       };
+
                        usb3_pcie_phy: phy@46000 {
                                compatible = "amlogic,g12a-usb3-pcie-phy";
                                reg = <0x0 0x46000 0x0 0x2000>;
                                assigned-clock-rates = <100000000>;
                                #phy-cells = <1>;
                        };
+
+                       eth_phy: mdio-multiplexer@4c000 {
+                               compatible = "amlogic,g12a-mdio-mux";
+                               reg = <0x0 0x4c000 0x0 0xa4>;
+                               clocks = <&clkc CLKID_ETH_PHY>,
+                                        <&xtal>,
+                                        <&clkc CLKID_MPLL_50M>;
+                               clock-names = "pclk", "clkin0", "clkin1";
+                               mdio-parent-bus = <&mdio0>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               ext_mdio: mdio@0 {
+                                       reg = <0>;
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                               };
+
+                               int_mdio: mdio@1 {
+                                       reg = <1>;
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       internal_ephy: ethernet_phy@8 {
+                                               compatible = "ethernet-phy-id0180.3301",
+                                                            "ethernet-phy-ieee802.3-c22";
+                                               interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>;
+                                               reg = <8>;
+                                               max-speed = <100>;
+                                       };
+                               };
+                       };
                };
 
                aobus: bus@ff800000 {
                                                gpio-ranges = <&ao_pinctrl 0 0 15>;
                                        };
 
+                                       i2c_ao_sck_pins: i2c_ao_sck_pins {
+                                               mux {
+                                                       groups = "i2c_ao_sck";
+                                                       function = "i2c_ao";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c_ao_sda_pins: i2c_ao_sda {
+                                               mux {
+                                                       groups = "i2c_ao_sda";
+                                                       function = "i2c_ao";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c_ao_sck_e_pins: i2c_ao_sck_e {
+                                               mux {
+                                                       groups = "i2c_ao_sck_e";
+                                                       function = "i2c_ao";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       i2c_ao_sda_e_pins: i2c_ao_sda_e {
+                                               mux {
+                                                       groups = "i2c_ao_sda_e";
+                                                       function = "i2c_ao";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       mclk0_ao_pins: mclk0-ao {
+                                               mux {
+                                                       groups = "mclk0_ao";
+                                                       function = "mclk0_ao";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_ao_b_din0_pins: tdm-ao-b-din0 {
+                                               mux {
+                                                       groups = "tdm_ao_b_din0";
+                                                       function = "tdm_ao_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       spdif_ao_out_pins: spdif-ao-out {
+                                               mux {
+                                                       groups = "spdif_ao_out";
+                                                       function = "spdif_ao_out";
+                                                       drive-strength-microamp = <500>;
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_ao_b_din1_pins: tdm-ao-b-din1 {
+                                               mux {
+                                                       groups = "tdm_ao_b_din1";
+                                                       function = "tdm_ao_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_ao_b_din2_pins: tdm-ao-b-din2 {
+                                               mux {
+                                                       groups = "tdm_ao_b_din2";
+                                                       function = "tdm_ao_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_ao_b_dout0_pins: tdm-ao-b-dout0 {
+                                               mux {
+                                                       groups = "tdm_ao_b_dout0";
+                                                       function = "tdm_ao_b";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_ao_b_dout1_pins: tdm-ao-b-dout1 {
+                                               mux {
+                                                       groups = "tdm_ao_b_dout1";
+                                                       function = "tdm_ao_b";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_ao_b_dout2_pins: tdm-ao-b-dout2 {
+                                               mux {
+                                                       groups = "tdm_ao_b_dout2";
+                                                       function = "tdm_ao_b";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_ao_b_fs_pins: tdm-ao-b-fs {
+                                               mux {
+                                                       groups = "tdm_ao_b_fs";
+                                                       function = "tdm_ao_b";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_ao_b_sclk_pins: tdm-ao-b-sclk {
+                                               mux {
+                                                       groups = "tdm_ao_b_sclk";
+                                                       function = "tdm_ao_b";
+                                                       bias-disable;
+                                                       drive-strength-microamp = <3000>;
+                                               };
+                                       };
+
+                                       tdm_ao_b_slv_fs_pins: tdm-ao-b-slv-fs {
+                                               mux {
+                                                       groups = "tdm_ao_b_slv_fs";
+                                                       function = "tdm_ao_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       tdm_ao_b_slv_sclk_pins: tdm-ao-b-slv-sclk {
+                                               mux {
+                                                       groups = "tdm_ao_b_slv_sclk";
+                                                       function = "tdm_ao_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
                                        uart_ao_a_pins: uart-a-ao {
                                                mux {
                                                        groups = "uart_ao_a_tx",
                                                        bias-disable;
                                                };
                                        };
+
+                                       pwm_ao_a_pins: pwm-ao-a {
+                                               mux {
+                                                       groups = "pwm_ao_a";
+                                                       function = "pwm_ao_a";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_ao_b_pins: pwm-ao-b {
+                                               mux {
+                                                       groups = "pwm_ao_b";
+                                                       function = "pwm_ao_b";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_ao_c_4_pins: pwm-ao-c-4 {
+                                               mux {
+                                                       groups = "pwm_ao_c_4";
+                                                       function = "pwm_ao_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_ao_c_6_pins: pwm-ao-c-6 {
+                                               mux {
+                                                       groups = "pwm_ao_c_6";
+                                                       function = "pwm_ao_c";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_ao_d_5_pins: pwm-ao-d-5 {
+                                               mux {
+                                                       groups = "pwm_ao_d_5";
+                                                       function = "pwm_ao_d";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_ao_d_10_pins: pwm-ao-d-10 {
+                                               mux {
+                                                       groups = "pwm_ao_d_10";
+                                                       function = "pwm_ao_d";
+                                                       bias-disable;
+                                               };
+                                       };
+
+                                       pwm_ao_d_e_pins: pwm-ao-d-e {
+                                               mux {
+                                                       groups = "pwm_ao_d_e";
+                                                       function = "pwm_ao_d";
+                                               };
+                                       };
+
+                                       remote_input_ao_pins: remote-input-ao {
+                                               mux {
+                                                       groups = "remote_ao_input";
+                                                       function = "remote_ao_input";
+                                                       bias-disable;
+                                               };
+                                       };
                                };
                        };
 
                                status = "disabled";
                        };
 
+                       pwm_AO_cd: pwm@2000 {
+                               compatible = "amlogic,meson-g12a-ao-pwm-cd";
+                               reg = <0x0 0x2000 0x0 0x20>;
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
                        uart_AO: serial@3000 {
                                compatible = "amlogic,meson-gx-uart",
                                             "amlogic,meson-ao-uart";
                                reg = <0x0 0x3000 0x0 0x18>;
                                interrupts = <GIC_SPI 193 IRQ_TYPE_EDGE_RISING>;
-                               clocks = <&xtal>, <&xtal>, <&xtal>;
+                               clocks = <&xtal>, <&clkc_AO CLKID_AO_UART>, <&xtal>;
                                clock-names = "xtal", "pclk", "baud";
                                status = "disabled";
                        };
                                             "amlogic,meson-ao-uart";
                                reg = <0x0 0x4000 0x0 0x18>;
                                interrupts = <GIC_SPI 197 IRQ_TYPE_EDGE_RISING>;
-                               clocks = <&xtal>, <&xtal>, <&xtal>;
+                               clocks = <&xtal>, <&clkc_AO CLKID_AO_UART2>, <&xtal>;
                                clock-names = "xtal", "pclk", "baud";
                                status = "disabled";
                        };
 
+                       i2c_AO: i2c@5000 {
+                               compatible = "amlogic,meson-axg-i2c";
+                               status = "disabled";
+                               reg = <0x0 0x05000 0x0 0x20>;
+                               interrupts = <GIC_SPI 195 IRQ_TYPE_EDGE_RISING>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               clocks = <&clkc CLKID_I2C>;
+                       };
+
+                       pwm_AO_ab: pwm@7000 {
+                               compatible = "amlogic,meson-g12a-ao-pwm-ab";
+                               reg = <0x0 0x7000 0x0 0x20>;
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       ir: ir@8000 {
+                               compatible = "amlogic,meson-gxbb-ir";
+                               reg = <0x0 0x8000 0x0 0x20>;
+                               interrupts = <GIC_SPI 196 IRQ_TYPE_EDGE_RISING>;
+                               status = "disabled";
+                       };
+
                        saradc: adc@9000 {
                                compatible = "amlogic,meson-g12a-saradc",
                                             "amlogic,meson-saradc";
                                #reset-cells = <1>;
                        };
 
+                       gpio_intc: interrupt-controller@f080 {
+                               compatible = "amlogic,meson-g12a-gpio-intc",
+                                            "amlogic,meson-gpio-intc";
+                               reg = <0x0 0xf080 0x0 0x10>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               amlogic,channel-interrupts = <64 65 66 67 68 69 70 71>;
+                       };
+
+                       pwm_ef: pwm@19000 {
+                               compatible = "amlogic,meson-g12a-ee-pwm";
+                               reg = <0x0 0x19000 0x0 0x20>;
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       pwm_cd: pwm@1a000 {
+                               compatible = "amlogic,meson-g12a-ee-pwm";
+                               reg = <0x0 0x1a000 0x0 0x20>;
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       pwm_ab: pwm@1b000 {
+                               compatible = "amlogic,meson-g12a-ee-pwm";
+                               reg = <0x0 0x1b000 0x0 0x20>;
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       i2c3: i2c@1c000 {
+                               compatible = "amlogic,meson-axg-i2c";
+                               status = "disabled";
+                               reg = <0x0 0x1c000 0x0 0x20>;
+                               interrupts = <GIC_SPI 39 IRQ_TYPE_EDGE_RISING>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               clocks = <&clkc CLKID_I2C>;
+                       };
+
+                       i2c2: i2c@1d000 {
+                               compatible = "amlogic,meson-axg-i2c";
+                               status = "disabled";
+                               reg = <0x0 0x1d000 0x0 0x20>;
+                               interrupts = <GIC_SPI 215 IRQ_TYPE_EDGE_RISING>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               clocks = <&clkc CLKID_I2C>;
+                       };
+
+                       i2c1: i2c@1e000 {
+                               compatible = "amlogic,meson-axg-i2c";
+                               status = "disabled";
+                               reg = <0x0 0x1e000 0x0 0x20>;
+                               interrupts = <GIC_SPI 214 IRQ_TYPE_EDGE_RISING>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               clocks = <&clkc CLKID_I2C>;
+                       };
+
+                       i2c0: i2c@1f000 {
+                               compatible = "amlogic,meson-axg-i2c";
+                               status = "disabled";
+                               reg = <0x0 0x1f000 0x0 0x20>;
+                               interrupts = <GIC_SPI 21 IRQ_TYPE_EDGE_RISING>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               clocks = <&clkc CLKID_I2C>;
+                       };
+
                        clk_msr: clock-measure@18000 {
                                compatible = "amlogic,meson-g12a-clk-measure";
                                reg = <0x0 0x18000 0x0 0x10>;
                        };
                };
 
+               sd_emmc_a: sd@ffe03000 {
+                       compatible = "amlogic,meson-axg-mmc";
+                       reg = <0x0 0xffe03000 0x0 0x800>;
+                       interrupts = <GIC_SPI 189 IRQ_TYPE_EDGE_RISING>;
+                       status = "disabled";
+                       clocks = <&clkc CLKID_SD_EMMC_A>,
+                                <&clkc CLKID_SD_EMMC_A_CLK0>,
+                                <&clkc CLKID_FCLK_DIV2>;
+                       clock-names = "core", "clkin0", "clkin1";
+                       resets = <&reset RESET_SD_EMMC_A>;
+                       amlogic,dram-access-quirk;
+               };
+
+               sd_emmc_b: sd@ffe05000 {
+                       compatible = "amlogic,meson-axg-mmc";
+                       reg = <0x0 0xffe05000 0x0 0x800>;
+                       interrupts = <GIC_SPI 190 IRQ_TYPE_EDGE_RISING>;
+                       status = "disabled";
+                       clocks = <&clkc CLKID_SD_EMMC_B>,
+                                <&clkc CLKID_SD_EMMC_B_CLK0>,
+                                <&clkc CLKID_FCLK_DIV2>;
+                       clock-names = "core", "clkin0", "clkin1";
+                       resets = <&reset RESET_SD_EMMC_B>;
+               };
+
+               sd_emmc_c: mmc@ffe07000 {
+                       compatible = "amlogic,meson-axg-mmc";
+                       reg = <0x0 0xffe07000 0x0 0x800>;
+                       interrupts = <GIC_SPI 191 IRQ_TYPE_EDGE_RISING>;
+                       status = "disabled";
+                       clocks = <&clkc CLKID_SD_EMMC_C>,
+                                <&clkc CLKID_SD_EMMC_C_CLK0>,
+                                <&clkc CLKID_FCLK_DIV2>;
+                       clock-names = "core", "clkin0", "clkin1";
+                       resets = <&reset RESET_SD_EMMC_C>;
+               };
+
                usb: usb@ffe09000 {
                        status = "disabled";
                        compatible = "amlogic,meson-g12a-usb-ctrl";
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts b/arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts
new file mode 100644 (file)
index 0000000..81780ff
--- /dev/null
@@ -0,0 +1,386 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2019 BayLibre, SAS
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ */
+
+/dts-v1/;
+
+#include "meson-g12b.dtsi"
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/gpio/meson-g12a-gpio.h>
+#include <dt-bindings/sound/meson-g12a-tohdmitx.h>
+
+/ {
+       compatible = "hardkernel,odroid-n2", "amlogic,g12b";
+       model = "Hardkernel ODROID-N2";
+
+       aliases {
+               serial0 = &uart_AO;
+               ethernet0 = &ethmac;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       memory@0 {
+               device_type = "memory";
+               reg = <0x0 0x0 0x0 0x40000000>;
+       };
+
+       emmc_pwrseq: emmc-pwrseq {
+               compatible = "mmc-pwrseq-emmc";
+               reset-gpios = <&gpio BOOT_12 GPIO_ACTIVE_LOW>;
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               blue {
+                       label = "n2:blue";
+                       gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "heartbeat";
+               };
+       };
+
+       tflash_vdd: regulator-tflash_vdd {
+               compatible = "regulator-fixed";
+
+               regulator-name = "TFLASH_VDD";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpio = <&gpio_ao GPIOAO_8 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       tf_io: gpio-regulator-tf_io {
+               compatible = "regulator-gpio";
+
+               regulator-name = "TF_IO";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpios = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>;
+               gpios-states = <0>;
+
+               states = <3300000 0
+                         1800000 1>;
+       };
+
+       flash_1v8: regulator-flash_1v8 {
+               compatible = "regulator-fixed";
+               regulator-name = "FLASH_1V8";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&vcc_3v3>;
+               regulator-always-on;
+       };
+
+       main_12v: regulator-main_12v {
+               compatible = "regulator-fixed";
+               regulator-name = "12V";
+               regulator-min-microvolt = <12000000>;
+               regulator-max-microvolt = <12000000>;
+               regulator-always-on;
+       };
+
+       vcc_5v: regulator-vcc_5v {
+               compatible = "regulator-fixed";
+               regulator-name = "5V";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               regulator-always-on;
+               vin-supply = <&main_12v>;
+       };
+
+       vcc_1v8: regulator-vcc_1v8 {
+               compatible = "regulator-fixed";
+               regulator-name = "VCC_1V8";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&vcc_3v3>;
+               regulator-always-on;
+       };
+
+       vcc_3v3: regulator-vcc_3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "VCC_3V3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&vddao_3v3>;
+               regulator-always-on;
+               /* FIXME: actually controlled by VDDCPU_B_EN */
+       };
+
+       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_5 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       usb_pwr_en: regulator-usb_pwr_en {
+               compatible = "regulator-fixed";
+               regulator-name = "USB_PWR_EN";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&vcc_5v>;
+
+               /* Connected to the microUSB port power enable */
+               gpio = <&gpio GPIOH_6 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       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 = <&main_12v>;
+               regulator-always-on;
+       };
+
+       hdmi-connector {
+               compatible = "hdmi-connector";
+               type = "a";
+
+               port {
+                       hdmi_connector_in: endpoint {
+                               remote-endpoint = <&hdmi_tx_tmds_out>;
+                       };
+               };
+       };
+
+       sound {
+               compatible = "amlogic,axg-sound-card";
+               model = "G12A-ODROIDN2";
+               audio-aux-devs = <&tdmout_b>;
+               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";
+
+               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>;
+               };
+
+               /* 8ch hdmi interface */
+               dai-link-3 {
+                       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 {
+                               sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>;
+                       };
+               };
+
+               /* hdmi glue */
+               dai-link-4 {
+                       sound-dai = <&tohdmitx TOHDMITX_I2S_OUT>;
+
+                       codec {
+                               sound-dai = <&hdmi_tx>;
+                       };
+               };
+       };
+};
+
+&arb {
+       status = "okay";
+};
+
+&cec_AO {
+       pinctrl-0 = <&cec_ao_a_h_pins>;
+       pinctrl-names = "default";
+       status = "disabled";
+       hdmi-phandle = <&hdmi_tx>;
+};
+
+&cecb_AO {
+       pinctrl-0 = <&cec_ao_b_h_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+       hdmi-phandle = <&hdmi_tx>;
+};
+
+&clkc_audio {
+       status = "okay";
+};
+
+&ext_mdio {
+       external_phy: ethernet-phy@0 {
+               /* Realtek RTL8211F (0x001cc916) */     
+               reg = <0>;
+               max-speed = <1000>;
+
+               reset-assert-us = <10000>;
+               reset-deassert-us = <30000>;
+               reset-gpios = <&gpio GPIOZ_15 (GPIO_ACTIVE_LOW | GPIO_OPEN_DRAIN)>;
+
+               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";
+       phy-handle = <&external_phy>;
+       amlogic,tx-delay-ns = <2>;
+};
+
+&frddr_a {
+       status = "okay";
+};
+
+&frddr_b {
+       status = "okay";
+};
+
+&frddr_c {
+       status = "okay";
+};
+
+&gpio {
+       /*
+        * WARNING: The USB Hub on the Odroid-N2 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";
+       };
+};
+
+&hdmi_tx {
+       status = "okay";
+       pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>;
+       pinctrl-names = "default";
+       hdmi-supply = <&vcc_5v>;
+};
+
+&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";
+};
+
+/* 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;
+
+       cd-gpios = <&gpio GPIOC_6 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&tflash_vdd>;
+       vqmmc-supply = <&tf_io>;
+
+};
+
+/* eMMC */
+&sd_emmc_c {
+       status = "okay";
+       pinctrl-0 = <&emmc_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 = <&vcc_3v3>;
+       vqmmc-supply = <&flash_1v8>;
+};
+
+&tdmif_b {
+       status = "okay";
+};
+
+&tdmout_b {
+       status = "okay";
+};
+
+&tohdmitx {
+       status = "okay";
+};
+
+&uart_AO {
+       status = "okay";
+       pinctrl-0 = <&uart_ao_a_pins>;
+       pinctrl-names = "default";
+};
+
+&usb {
+       status = "okay";
+       vbus-supply = <&usb_pwr_en>;
+};
+
+&usb2_phy0 {
+       phy-supply = <&vcc_5v>;
+};
+
+&usb2_phy1 {
+       /* Enable the hub which is connected to this port */
+       phy-supply = <&hub_5v>;
+};
diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b.dtsi
new file mode 100644 (file)
index 0000000..9e88e51
--- /dev/null
@@ -0,0 +1,82 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2019 BayLibre, SAS
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ */
+
+#include "meson-g12a.dtsi"
+
+/ {
+       compatible = "amlogic,g12b";
+
+       cpus {
+               cpu-map {
+                       cluster0 {
+                               core0 {
+                                       cpu = <&cpu0>;
+                               };
+
+                               core1 {
+                                       cpu = <&cpu1>;
+                               };
+                       };
+
+                       cluster1 {
+                               core0 {
+                                       cpu = <&cpu100>;
+                               };
+
+                               core1 {
+                                       cpu = <&cpu101>;
+                               };
+
+                               core2 {
+                                       cpu = <&cpu102>;
+                               };
+
+                               core3 {
+                                       cpu = <&cpu103>;
+                               };
+                       };
+               };
+
+               /delete-node/ cpu@2;
+               /delete-node/ cpu@3;
+
+               cpu100: cpu@100 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a73";
+                       reg = <0x0 0x100>;
+                       enable-method = "psci";
+                       next-level-cache = <&l2>;
+               };
+
+               cpu101: cpu@101 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a73";
+                       reg = <0x0 0x101>;
+                       enable-method = "psci";
+                       next-level-cache = <&l2>;
+               };
+
+               cpu102: cpu@102 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a73";
+                       reg = <0x0 0x102>;
+                       enable-method = "psci";
+                       next-level-cache = <&l2>;
+               };
+
+               cpu103: cpu@103 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a73";
+                       reg = <0x0 0x103>;
+                       enable-method = "psci";
+                       next-level-cache = <&l2>;
+               };
+       };
+};
+
+&clkc {
+       compatible = "amlogic,g12b-clkc";
+};
index 016641a41694a4d0500a8db4f6340f19c4252be1..a9b778571cf5b11c5b8a26e510d6b9872374a839 100644 (file)
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
 
        non-removable;
        disable-wp;
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
        disable-wp;
 
        cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
index 6772709b9e195d59d9223213ef768a13634b6ef6..74d03fc706be1525d21dd7d07fec217ef289b9c0 100644 (file)
                };
 
                ethmac: ethernet@c9410000 {
-                       compatible = "amlogic,meson-gx-dwmac", "amlogic,meson-gxbb-dwmac", "snps,dwmac";
+                       compatible = "amlogic,meson-gxbb-dwmac",
+                                    "snps,dwmac-3.70a",
+                                    "snps,dwmac";
                        reg = <0x0 0xc9410000 0x0 0x10000
                               0x0 0xc8834540 0x0 0x4>;
                        interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
index ade2ee09ae9624cb1b89fcc5588649b4233dbc7d..c34c1c90ccb6b91a387007f4b70e219ddb1ad59f 100644 (file)
 
        amlogic,tx-delay-ns = <2>;
 
-       snps,reset-gpio = <&gpio GPIOZ_14 0>;
-       snps,reset-delays-us = <0 10000 1000000>;
-       snps,reset-active-low;
-
        mdio {
                compatible = "snps,dwmac-mdio";
                #address-cells = <1>;
                eth_phy0: ethernet-phy@0 {
                        /* Realtek RTL8211F (0x001cc916) */
                        reg = <0>;
+
+                       reset-assert-us = <10000>;
+                       reset-deassert-us = <30000>;
+                       reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
+
                        interrupt-parent = <&gpio_intc>;
                        /* MAC_INTR on GPIOZ_15 */
                        interrupts = <29 IRQ_TYPE_LEVEL_LOW>;
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <200000000>;
+       max-frequency = <50000000>;
 
        non-removable;
        disable-wp;
        sd-uhs-sdr12;
        sd-uhs-sdr25;
        sd-uhs-sdr50;
-       sd-uhs-sdr104;
-       max-frequency = <200000000>;
+       sd-uhs-ddr50;
+       max-frequency = <100000000>;
        disable-wp;
 
        cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
index 25105ac96d5596cf2a0abf412cccfa2ebfd7d502..b636912a271578f89a8836bb796f6d07b432737a 100644 (file)
        phy-handle = <&eth_phy0>;
        phy-mode = "rmii";
 
-       snps,reset-gpio = <&gpio GPIOZ_14 0>;
-       snps,reset-delays-us = <0 10000 1000000>;
-       snps,reset-active-low;
-
        mdio {
                compatible = "snps,dwmac-mdio";
                #address-cells = <1>;
                eth_phy0: ethernet-phy@0 {
                        /* IC Plus IP101GR (0x02430c54) */
                        reg = <0>;
+
+                       reset-assert-us = <10000>;
+                       reset-deassert-us = <10000>;
+                       reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
                };
        };
 };
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
        disable-wp;
 
        cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
index 1cc9dc68ef00be8b30bd45754be1e79123c09963..9972b1515da617993c7a872db083bd37ba10b32b 100644 (file)
        phy-handle = <&eth_phy0>;
        phy-mode = "rgmii";
 
-       snps,reset-gpio = <&gpio GPIOZ_14 0>;
-       snps,reset-delays-us = <0 10000 1000000>;
-       snps,reset-active-low;
-
        amlogic,tx-delay-ns = <2>;
 
        mdio {
                eth_phy0: ethernet-phy@0 {
                        /* Realtek RTL8211F (0x001cc916) */
                        reg = <0>;
+
+                       reset-assert-us = <10000>;
+                       reset-deassert-us = <30000>;
+                       reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
+
                        interrupt-parent = <&gpio_intc>;
                        /* MAC_INTR on GPIOZ_15 */
                        interrupts = <29 IRQ_TYPE_LEVEL_LOW>;
 
        bus-width = <4>;
        cap-sd-highspeed;
+       sd-uhs-sdr12;
+       sd-uhs-sdr25;
+       sd-uhs-sdr50;
+       sd-uhs-ddr50;
        max-frequency = <100000000>;
        disable-wp;
 
        pinctrl-names = "default", "clk-gate";
 
        bus-width = <8>;
-       max-frequency = <100000000>;
+       max-frequency = <200000000>;
        non-removable;
        disable-wp;
        cap-mmc-highspeed;
index 9d2406a7c4fadc21cd438cb75a5c3f30db224a8e..3c93d1898b4099bad289fa94bb8adb5284101e4a 100644 (file)
 
        amlogic,tx-delay-ns = <2>;
 
-       snps,reset-gpio = <&gpio GPIOZ_14 0>;
-       snps,reset-delays-us = <0 10000 1000000>;
-       snps,reset-active-low;
-
        mdio {
                compatible = "snps,dwmac-mdio";
                #address-cells = <1>;
                eth_phy0: ethernet-phy@3 {
                        /* Micrel KSZ9031 (0x00221620) */
                        reg = <3>;
+
+                       reset-assert-us = <10000>;
+                       reset-deassert-us = <30000>;
+                       reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
+
                        interrupt-parent = <&gpio_intc>;
                        /* MAC_INTR on GPIOZ_15 */
                        interrupts = <29 IRQ_TYPE_LEVEL_LOW>;
index 0be0f2a5d2fe918e2f1a43b798f2ee4899719bb9..e8f925871edfc5a98dfe2e6852b952eba0757bb5 100644 (file)
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
 
        non-removable;
        disable-wp;
index ad4d50bd9d7756043757139faa0a74dc9a598c52..43b11e3dfe1194883f3520af00fcd3196091a477 100644 (file)
                };
        };
 
-       usb_vbus: regulator-usb0-vbus {
+       usb_pwr: regulator-usb-pwrs {
                compatible = "regulator-fixed";
 
-               regulator-name = "USB0_VBUS";
+               regulator-name = "USB_PWR";
 
                regulator-min-microvolt = <5000000>;
                regulator-max-microvolt = <5000000>;
                enable-active-high;
        };
 
-       vcc_3v3: regulator-vcc_3v3 {
+       vddio_boot: regulator-vddio_boot {
                compatible = "regulator-fixed";
-               regulator-name = "VCC_3V3";
+               regulator-name = "VDDIO_BOOT";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+       };
+
+       vddao_3v3: regulator-vddao_3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "VDDAO_3V3";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
        };
 
-       vcc_1v8: regulator-vcc_1v8 {
+       vddio_ao18: regulator-vddio_ao18 {
                compatible = "regulator-fixed";
-               regulator-name = "VCC_1V8";
+               regulator-name = "VDDIO_AO18";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <1800000>;
        };
 
+       vcc_3v3: regulator-vcc_3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "VCC_3V3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
        emmc_pwrseq: emmc-pwrseq {
                compatible = "mmc-pwrseq-emmc";
                reset-gpios = <&gpio BOOT_9 GPIO_ACTIVE_LOW>;
                pwms = <&pwm_ef 0 30518 0>; /* PWM_E at 32.768KHz */
        };
 
+       hdmi-connector {
+               compatible = "hdmi-connector";
+               type = "a";
+
+               port {
+                       hdmi_connector_in: endpoint {
+                               remote-endpoint = <&hdmi_tx_tmds_out>;
+                       };
+               };
+       };
+
        sdio_pwrseq: sdio-pwrseq {
                compatible = "mmc-pwrseq-simple";
-               reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>,
-                               <&gpio GPIOX_20 GPIO_ACTIVE_LOW>;
+               reset-gpios = <&gpio GPIOX_6 GPIO_ACTIVE_LOW>;
                clocks = <&wifi32k>;
                clock-names = "ext_clock";
        };
 };
 
+&cec_AO {
+       status = "okay";
+       pinctrl-0 = <&ao_cec_pins>;
+       pinctrl-names = "default";
+       hdmi-phandle = <&hdmi_tx>;
+};
+
 &ethmac {
        status = "okay";
        pinctrl-0 = <&eth_rgmii_pins>;
 
        amlogic,tx-delay-ns = <2>;
 
-       snps,reset-gpio = <&gpio GPIOZ_14 0>;
-       snps,reset-delays-us = <0 10000 1000000>;
-       snps,reset-active-low;
-
        mdio {
                compatible = "snps,dwmac-mdio";
                #address-cells = <1>;
                eth_phy0: ethernet-phy@0 {
                        /* Realtek RTL8211F (0x001cc916) */
                        reg = <0>;
+
+                       reset-assert-us = <10000>;
+                       reset-deassert-us = <30000>;
+                       reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
+
+                       interrupt-parent = <&gpio_intc>;
+                       /* MAC_INTR on GPIOZ_15 */
+                       interrupts = <29 IRQ_TYPE_LEVEL_LOW>;
                };
        };
 };
 
+&hdmi_tx {
+       status = "okay";
+       pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>;
+       pinctrl-names = "default";
+};
+
+&hdmi_tx_tmds_port {
+       hdmi_tx_tmds_out: endpoint {
+               remote-endpoint = <&hdmi_connector_in>;
+       };
+};
+
 &ir {
        status = "okay";
        pinctrl-0 = <&remote_input_ao_pins>;
        clock-names = "clkin0";
 };
 
+&saradc {
+       status = "okay";
+       vref-supply = <&vddio_ao18>;
+};
+
 /* Wireless SDIO Module */
 &sd_emmc_a {
        status = "okay";
-       pinctrl-0 = <&sdio_pins &sdio_irq_pins>;
+       pinctrl-0 = <&sdio_pins>;
        pinctrl-1 = <&sdio_clk_gate_pins>;
        pinctrl-names = "default", "clk-gate";
        #address-cells = <1>;
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
 
        non-removable;
        disable-wp;
 
        mmc-pwrseq = <&sdio_pwrseq>;
 
-       vmmc-supply = <&vcc_3v3>;
-       vqmmc-supply = <&vcc_1v8>;
+       vmmc-supply = <&vddao_3v3>;
+       vqmmc-supply = <&vddio_boot>;
 
        brcmf: wifi@1 {
                reg = <1>;
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
        disable-wp;
 
        cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
 
-       vmmc-supply = <&vcc_3v3>;
+       vmmc-supply = <&vddao_3v3>;
+       vqmmc-supply = <&vcc_3v3>;
 };
 
 /* eMMC */
 
        mmc-pwrseq = <&emmc_pwrseq>;
        vmmc-supply = <&vcc_3v3>;
-       vmmcq-sumpply = <&vcc_1v8>;
+       vqmmc-supply = <&vddio_boot>;
+};
+
+/* This is connected to the Bluetooth module: */
+&uart_A {
+       status = "okay";
+       pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>;
+       pinctrl-names = "default";
+
+       bluetooth {
+               compatible = "brcm,bcm43438-bt";
+               shutdown-gpios = <&gpio GPIOX_20 GPIO_ACTIVE_HIGH>;
+       };
 };
 
+/* This UART is brought out to the DB9 connector */
 &uart_AO {
        status = "okay";
        pinctrl-0 = <&uart_ao_a_pins>;
 
 &usb0_phy {
        status = "okay";
-       phy-supply = <&usb_vbus>;
+       phy-supply = <&usb_pwr>;
 };
 
 &usb1_phy {
index 2d2db783c44c149d7c5bf6b4824da82f885e7261..4c539881fbb73f46fd2693a6a110161f718fe3a9 100644 (file)
                regulator-max-microvolt = <3300000>;
        };
 
+       vddio_ao18: regulator-vddio_ao18 {
+               compatible = "regulator-fixed";
+               regulator-name = "VDDIO_AO18";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+       };
+
        vcc_3v3: regulator-vcc_3v3 {
                compatible = "regulator-fixed";
                regulator-name = "VCC_3V3";
 
        amlogic,tx-delay-ns = <2>;
 
-       snps,reset-gpio = <&gpio GPIOZ_14 0>;
-       snps,reset-delays-us = <0 10000 1000000>;
-       snps,reset-active-low;
-
        mdio {
                compatible = "snps,dwmac-mdio";
                #address-cells = <1>;
                eth_phy0: ethernet-phy@0 {
                        /* Realtek RTL8211F (0x001cc916) */
                        reg = <0>;
+
+                       reset-assert-us = <10000>;
+                       reset-deassert-us = <30000>;
+                       reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
                };
        };
 };
        clock-names = "clkin0";
 };
 
+&saradc {
+       status = "okay";
+       vref-supply = <&vddio_ao18>;
+};
+
 /* Wireless SDIO Module */
 &sd_emmc_a {
        status = "okay";
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
 
        non-removable;
        disable-wp;
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
        disable-wp;
 
        cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
        vqmmc-supply = <&vddio_boot>;
 };
 
+/* This is connected to the Bluetooth module: */
+&uart_A {
+       status = "okay";
+       pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>;
+       pinctrl-names = "default";
+       uart-has-rtscts;
+
+       bluetooth {
+               compatible = "brcm,bcm43438-bt";
+               shutdown-gpios = <&gpio GPIOX_20 GPIO_ACTIVE_HIGH>;
+       };
+};
+
 /* This UART is brought out to the DB9 connector */
 &uart_AO {
        status = "okay";
index a60d3652beee1ad2791087860825e054b80fc78b..f734faaf7b78afd783769c44c965926f76feef8e 100644 (file)
                };
 
                emmc_pins: emmc {
-                       mux {
+                       mux-0 {
                                groups = "emmc_nand_d07",
-                                      "emmc_cmd",
-                                      "emmc_clk";
+                                      "emmc_cmd";
+                               function = "emmc";
+                               bias-pull-up;
+                       };
+
+                       mux-1 {
+                               groups = "emmc_clk";
                                function = "emmc";
                                bias-disable;
                        };
                        mux {
                                groups = "emmc_ds";
                                function = "emmc";
-                               bias-disable;
+                               bias-pull-down;
                        };
                };
 
                };
 
                sdcard_pins: sdcard {
-                       mux {
+                       mux-0 {
                                groups = "sdcard_d0",
                                       "sdcard_d1",
                                       "sdcard_d2",
                                       "sdcard_d3",
-                                      "sdcard_cmd",
-                                      "sdcard_clk";
+                                      "sdcard_cmd";
+                               function = "sdcard";
+                               bias-pull-up;
+                       };
+
+                       mux-1 {
+                               groups = "sdcard_clk";
                                function = "sdcard";
                                bias-disable;
                        };
                };
 
                sdio_pins: sdio {
-                       mux {
+                       mux-0 {
                                groups = "sdio_d0",
                                       "sdio_d1",
                                       "sdio_d2",
                                       "sdio_d3",
-                                      "sdio_cmd",
-                                      "sdio_clk";
+                                      "sdio_cmd";
+                               function = "sdio";
+                               bias-pull-up;
+                       };
+
+                       mux-1 {
+                               groups = "sdio_clk";
                                function = "sdio";
                                bias-disable;
                        };
index 70433e023fda5a8d07db1a0c238c33859ba8857f..3a1484e5b8e1d7e5f8033a8daa9868f74edd801c 100644 (file)
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
 
        non-removable;
        disable-wp;
index 0c8e8305b1f3d4c73766b47a4094b742f210c624..b08c4537f260dbfc556f6252ed0f00e66713da55 100644 (file)
 
        amlogic,tx-delay-ns = <2>;
 
-       /* External PHY reset is shared with internal PHY Led signals */
-       snps,reset-gpio = <&gpio GPIOZ_14 0>;
-       snps,reset-delays-us = <0 10000 1000000>;
-       snps,reset-active-low;
-
        /* External PHY is in RGMII */
        phy-mode = "rgmii";
 };
 
 &external_mdio {
        external_phy: ethernet-phy@0 {
-               compatible = "ethernet-phy-id001c.c916", "ethernet-phy-ieee802.3-c22";
+               /* Realtek RTL8211F (0x001cc916) */
                reg = <0>;
                max-speed = <1000>;
+
+               /* External PHY reset is shared with internal PHY Led signal */
+               reset-assert-us = <10000>;
+               reset-deassert-us = <30000>;
+               reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
+
                interrupt-parent = <&gpio_intc>;
                interrupts = <29 IRQ_TYPE_LEVEL_LOW>;
                eee-broken-1000t;
index 255cede7b4476ee7ae31007bb5f8fb139fcff05d..4b8ce738e2131ea0d9dafe5ce21e1fa76057d220 100644 (file)
                regulator-max-microvolt = <1800000>;
        };
 
+       /* This is provided by LDOs on the eMMC daugther card */
        vddio_boot: regulator-vddio_boot {
                compatible = "regulator-fixed";
                regulator-name = "VDDIO_BOOT";
-               regulator-min-microvolt = <3300000>;
-               regulator-max-microvolt = <3300000>;
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&vcc_3v3>;
        };
 };
 
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
        disable-wp;
 
        cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
 
        bus-width = <8>;
        cap-mmc-highspeed;
-       mmc-ddr-3_3v;
-       max-frequency = <50000000>;
-       non-removable;
+       mmc-ddr-1_8v;
+       mmc-hs200-1_8v;
+       max-frequency = <200000000>;
        disable-wp;
 
        mmc-pwrseq = <&emmc_pwrseq>;
index 9cbdb85fb591735f8c890a9c43d5a5b4e3911205..26907ac829301ef69f182b94ef41f36654a2b997 100644 (file)
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
        disable-wp;
 
        cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
index bc811a2faf4207dd42da6586cff3e013499f3b5e..e3c16f50814bfe518cd3908731ad85a01b0526b1 100644 (file)
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
 
        non-removable;
        disable-wp;
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
        disable-wp;
 
        cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
index 3093ae421b177c863600884aa6506858f6353dc1..c959456bacc667ca6f7c27741aaf894806c744a0 100644 (file)
                };
 
                emmc_pins: emmc {
-                       mux {
+                       mux-0 {
                                groups = "emmc_nand_d07",
-                                      "emmc_cmd",
-                                      "emmc_clk";
+                                      "emmc_cmd";
+                               function = "emmc";
+                               bias-pull-up;
+                       };
+
+                       mux-1 {
+                               groups = "emmc_clk";
                                function = "emmc";
                                bias-disable;
                        };
                        mux {
                                groups = "emmc_ds";
                                function = "emmc";
-                               bias-disable;
+                               bias-pull-down;
                        };
                };
 
                };
 
                sdcard_pins: sdcard {
-                       mux {
+                       mux-0 {
                                groups = "sdcard_d0",
                                       "sdcard_d1",
                                       "sdcard_d2",
                                       "sdcard_d3",
-                                      "sdcard_cmd",
-                                      "sdcard_clk";
+                                      "sdcard_cmd";
+                               function = "sdcard";
+                               bias-pull-up;
+                       };
+
+                       mux-1 {
+                               groups = "sdcard_clk";
                                function = "sdcard";
                                bias-disable;
                        };
                };
 
                sdio_pins: sdio {
-                       mux {
+                       mux-0 {
                                groups = "sdio_d0",
                                       "sdio_d1",
                                       "sdio_d2",
                                       "sdio_d3",
-                                      "sdio_cmd",
-                                      "sdio_clk";
+                                      "sdio_cmd";
+                               function = "sdio";
+                               bias-pull-up;
+                       };
+
+                       mux-1 {
+                               groups = "sdio_clk";
                                function = "sdio";
                                bias-disable;
                        };
index 3f086ed7de05525c3bcf11866133c085fb3e7bd4..989d33ac6eae80d69976ae15b4287784487b932d 100644 (file)
@@ -18,7 +18,6 @@
 
        aliases {
                serial0 = &uart_AO;
-               serial1 = &uart_A;
                serial2 = &uart_AO_B;
        };
 
 
        gpio-keys-polled {
                compatible = "gpio-keys-polled";
-               #address-cells = <1>;
-               #size-cells = <0>;
                poll-interval = <100>;
 
-               button@0 {
+               power-button {
                        label = "power";
                        linux,code = <KEY_POWER>;
                        gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>;
 
        amlogic,tx-delay-ns = <2>;
 
-       /* External PHY reset is shared with internal PHY Led signals */
-       snps,reset-gpio = <&gpio GPIOZ_14 0>;
-       snps,reset-delays-us = <0 10000 1000000>;
-       snps,reset-active-low;
-
        /* External PHY is in RGMII */
        phy-mode = "rgmii";
 
        external_phy: ethernet-phy@0 {
                /* Realtek RTL8211F (0x001cc916) */
                reg = <0>;
+
+               reset-assert-us = <10000>;
+               reset-deassert-us = <30000>;
+               reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
+
                interrupt-parent = <&gpio_intc>;
                /* MAC_INTR on GPIOZ_15 */
                interrupts = <25 IRQ_TYPE_LEVEL_LOW>;
 &sd_emmc_a {
        status = "okay";
        pinctrl-0 = <&sdio_pins>;
-       pinctrl-names = "default";
+       pinctrl-1 = <&sdio_clk_gate_pins>;
+       pinctrl-names = "default", "clk-gate";
        #address-cells = <1>;
        #size-cells = <0>;
 
        bus-width = <4>;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
 
        non-removable;
        disable-wp;
 &sd_emmc_b {
        status = "okay";
        pinctrl-0 = <&sdcard_pins>;
-       pinctrl-names = "default";
+       pinctrl-1 = <&sdcard_clk_gate_pins>;
+       pinctrl-names = "default", "clk-gate";
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
        disable-wp;
 
        cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
 &sd_emmc_c {
        status = "okay";
        pinctrl-0 = <&emmc_pins>, <&emmc_ds_pins>;
-       pinctrl-names = "default";
+       pinctrl-1 = <&emmc_clk_gate_pins>;
+       pinctrl-names = "default", "clk-gate";
 
        bus-width = <8>;
-       cap-sd-highspeed;
        cap-mmc-highspeed;
        max-frequency = <200000000>;
        non-removable;
        disable-wp;
        mmc-ddr-1_8v;
        mmc-hs200-1_8v;
-       mmc-hs400-1_8v;
 
        mmc-pwrseq = <&emmc_pwrseq>;
        vmmc-supply = <&vcc_3v3>;
 /* This one is connected to the Bluetooth module */
 &uart_A {
        status = "okay";
-       pinctrl-0 = <&uart_a_pins>;
+       pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>;
        pinctrl-names = "default";
+       uart-has-rtscts;
+
+       bluetooth {
+               compatible = "brcm,bcm43438-bt";
+               shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>;
+       };
 };
 
 /* This is brought out on the Linux_RX (18) and Linux_TX (19) pins: */
index 25f3b6b1404365c83a272ee0e131db077aca023b..c2bd4dbbf38c5408a2fbe3b34de0c4e8224d81cb 100644 (file)
 
        amlogic,tx-delay-ns = <2>;
 
-       snps,reset-gpio = <&gpio GPIOZ_14 0>;
-       snps,reset-delays-us = <0 10000 1000000>;
-       snps,reset-active-low;
-
        /* External PHY is in RGMII */
        phy-mode = "rgmii";
 };
 
 &external_mdio {
        external_phy: ethernet-phy@0 {
-               compatible = "ethernet-phy-id001c.c916", "ethernet-phy-ieee802.3-c22";
+               /* Realtek RTL8211F (0x001cc916) */
                reg = <0>;
                max-speed = <1000>;
+
+               reset-assert-us = <10000>;
+               reset-deassert-us = <30000>;
+               reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
        };
 };
 
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
        disable-wp;
 
        cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
index 73d656e4aadeae9be4346de49de06aa49a91ee2e..ea45ae0c71b7f16d00596453d13c628af25bd368 100644 (file)
 
        amlogic,tx-delay-ns = <2>;
 
-       /* External PHY reset is shared with internal PHY Led signals */
-       snps,reset-gpio = <&gpio GPIOZ_14 0>;
-       snps,reset-delays-us = <0 10000 1000000>;
-       snps,reset-active-low;
-
        /* External PHY is in RGMII */
        phy-mode = "rgmii";
 };
 
 &external_mdio {
        external_phy: ethernet-phy@0 {
-               compatible = "ethernet-phy-id001c.c916", "ethernet-phy-ieee802.3-c22";
+               /* Realtek RTL8211F (0x001cc916) */
                reg = <0>;
                max-speed = <1000>;
+
+               /* External PHY reset is shared with internal PHY Led signal */
+               reset-assert-us = <10000>;
+               reset-deassert-us = <30000>;
+               reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
+
                interrupt-parent = <&gpio_intc>;
                /* MAC_INTR on GPIOZ_15 */
                interrupts = <25 IRQ_TYPE_LEVEL_LOW>;
index 7fa20a8ede171e745610a3ad21de2b3ff07e24e8..5cd4d35006d097951c045f00221e4a59a806774a 100644 (file)
        /* Select external PHY by default */
        phy-handle = <&external_phy>;
 
-       snps,reset-gpio = <&gpio GPIOZ_14 0>;
-       snps,reset-delays-us = <0 10000 1000000>;
-       snps,reset-active-low;
-
        amlogic,tx-delay-ns = <2>;
 
        /* External PHY is in RGMII */
 
 &external_mdio {
        external_phy: ethernet-phy@0 {
-               compatible = "ethernet-phy-id001c.c916", "ethernet-phy-ieee802.3-c22";
+               /* Realtek RTL8211F (0x001cc916) */
                reg = <0>;
                max-speed = <1000>;
+
+               reset-assert-us = <10000>;
+               reset-deassert-us = <30000>;
+               reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
        };
 };
 
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
 
        non-removable;
        disable-wp;
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
        disable-wp;
 
        cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
index 7446e0dc154d84f4f16b378f0a81c06cb8fc7358..26a039a028b8e646bce2f5b21f8a26333a2bfc6d 100644 (file)
 
        /* main funnel on Juno r0, cssys0 funnel on Juno r1/r2 as per TRM*/
        main_funnel: funnel@20040000 {
-               compatible = "arm,coresight-funnel", "arm,primecell";
+               compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                reg = <0 0x20040000 0 0x1000>;
 
                clocks = <&soc_smc50mhz>;
        };
 
        funnel@220c0000 { /* cluster0 funnel */
-               compatible = "arm,coresight-funnel", "arm,primecell";
+               compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                reg = <0 0x220c0000 0 0x1000>;
 
                clocks = <&soc_smc50mhz>;
        };
 
        funnel@230c0000 { /* cluster1 funnel */
-               compatible = "arm,coresight-funnel", "arm,primecell";
+               compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                reg = <0 0x230c0000 0 0x1000>;
 
                clocks = <&soc_smc50mhz>;
index cf285152deab7fb39d20698e803cdfe94e0d974f..eda3d9e18af65a1eca66cb2efd8b953bd02e11ba 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 / {
        funnel@20130000 { /* cssys1 */
-               compatible = "arm,coresight-funnel", "arm,primecell";
+               compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                reg = <0 0x20130000 0 0x1000>;
 
                clocks = <&soc_smc50mhz>;
@@ -47,7 +47,7 @@
        };
 
        funnel@20150000 { /* cssys2 */
-               compatible = "arm,coresight-funnel", "arm,primecell";
+               compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                reg = <0 0x20150000 0 0x1000>;
 
                clocks = <&soc_smc50mhz>;
index 1792b074e9a3275a6702f681e02f8c0b2538738e..9f60dacb4f80fbe193185abb76d70f05a4106eef 100644 (file)
                        flash@0,00000000 {
                                /* 2 * 32MiB NOR Flash memory mounted on CS0 */
                                compatible = "arm,vexpress-flash", "cfi-flash";
-                               linux,part-probe = "afs";
                                reg = <0 0x00000000 0x04000000>;
                                bank-width = <4>;
                                /*
                                 * flash hardware access is disabled by default.
                                 */
                                status = "disabled";
+                               partitions {
+                                       compatible = "arm,arm-firmware-suite";
+                               };
                        };
 
                        ethernet@2,00000000 {
diff --git a/arch/arm64/boot/dts/broadcom/stingray/stingray-usb.dtsi b/arch/arm64/boot/dts/broadcom/stingray/stingray-usb.dtsi
new file mode 100644 (file)
index 0000000..55259f9
--- /dev/null
@@ -0,0 +1,72 @@
+// SPDX-License-Identifier: (GPL-2.0 or BSD-3-Clause)
+/*
+ *Copyright(c) 2018 Broadcom
+ */
+       usb {
+               compatible = "simple-bus";
+               dma-ranges;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x0 0x0 0x68500000 0x00400000>;
+
+               usbphy0: usb-phy@0 {
+                       compatible = "brcm,sr-usb-combo-phy";
+                       reg = <0x00000000 0x100>;
+                       #phy-cells = <1>;
+                       status = "disabled";
+               };
+
+               xhci0: usb@1000 {
+                       compatible = "generic-xhci";
+                       reg = <0x00001000 0x1000>;
+                       interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>;
+                       phys = <&usbphy0 1>, <&usbphy0 0>;
+                       phy-names = "phy0", "phy1";
+                       dma-coherent;
+                       status = "disabled";
+               };
+
+               bdc0: usb@2000 {
+                       compatible = "brcm,bdc-v0.16";
+                       reg = <0x00002000 0x1000>;
+                       interrupts = <GIC_SPI 259 IRQ_TYPE_LEVEL_HIGH>;
+                       phys = <&usbphy0 0>, <&usbphy0 1>;
+                       phy-names = "phy0", "phy1";
+                       dma-coherent;
+                       status = "disabled";
+               };
+
+               usbphy1: usb-phy@10000 {
+                       compatible = "brcm,sr-usb-combo-phy";
+                       reg = <0x00010000 0x100>;
+                       #phy-cells = <1>;
+                       status = "disabled";
+               };
+
+               usbphy2: usb-phy@20000 {
+                       compatible = "brcm,sr-usb-hs-phy";
+                       reg = <0x00020000 0x100>;
+                       #phy-cells = <0>;
+                       status = "disabled";
+               };
+
+               xhci1: usb@11000 {
+                       compatible = "generic-xhci";
+                       reg = <0x00011000 0x1000>;
+                       interrupts = <GIC_SPI 263 IRQ_TYPE_LEVEL_HIGH>;
+                       phys = <&usbphy1 1>, <&usbphy2>, <&usbphy1 0>;
+                       phy-names = "phy0", "phy1", "phy2";
+                       dma-coherent;
+                       status = "disabled";
+               };
+
+               bdc1: usb@21000 {
+                       compatible = "brcm,bdc-v0.16";
+                       reg = <0x00021000 0x1000>;
+                       interrupts = <GIC_SPI 266 IRQ_TYPE_LEVEL_HIGH>;
+                       phys = <&usbphy2>;
+                       phy-names = "phy0";
+                       dma-coherent;
+                       status = "disabled";
+               };
+       };
index 35c4670c00d1211928ca708d0f4618003c5ab7a8..71e2e34400d40dab63f864f347bb1203ec6873eb 100644 (file)
        #include "stingray-fs4.dtsi"
        #include "stingray-sata.dtsi"
        #include "stingray-pcie.dtsi"
+       #include "stingray-usb.dtsi"
 
        hsls {
                compatible = "simple-bus";
                        status = "disabled";
                };
        };
+
+       tmons {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x0 0x0 0x8f100000 0x100>;
+
+               tmon: tmon@0 {
+                       compatible = "brcm,sr-thermal";
+                       reg = <0x0 0x40>;
+                       brcm,tmon-mask = <0x3f>;
+                       #thermal-sensor-cells = <1>;
+               };
+       };
+
+       thermal-zones {
+               ihost0_thermal: ihost0-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <1000>;
+                       thermal-sensors = <&tmon 0>;
+                       trips {
+                               cpu-crit {
+                                       temperature = <105000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+               ihost1_thermal: ihost1-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <1000>;
+                       thermal-sensors = <&tmon 1>;
+                       trips {
+                               cpu-crit {
+                                       temperature = <105000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+               ihost2_thermal: ihost2-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <1000>;
+                       thermal-sensors = <&tmon 2>;
+                       trips {
+                               cpu-crit {
+                                       temperature = <105000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+               ihost3_thermal: ihost3-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <1000>;
+                       thermal-sensors = <&tmon 3>;
+                       trips {
+                               cpu-crit {
+                                       temperature = <105000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+               crmu_thermal: crmu-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <1000>;
+                       thermal-sensors = <&tmon 4>;
+                       trips {
+                               cpu-crit {
+                                       temperature = <105000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+               nitro_thermal: nitro-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <1000>;
+                       thermal-sensors = <&tmon 5>;
+                       trips {
+                               cpu-crit {
+                                       temperature = <105000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+               };
+       };
+
+       nic-hsls {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x0 0x0  0x0 0x7fffffff>;
+
+               nic_i2c0: i2c@60826100 {
+                       compatible = "brcm,iproc-nic-i2c";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0x60826100 0x100>,
+                             <0x60e00408 0x1000>;
+                       brcm,ape-hsls-addr-mask = <0x03400000>;
+                       clock-frequency = <100000>;
+                       status = "disabled";
+               };
+       };
 };
index d2de16645e101d13e5766ce8d7a20403f0406ec8..6f90b0e62cba619caf6a6744dfc206bde73d438c 100644 (file)
        pinctrl-0 = <&te_irq>;
 };
 
+&gpu {
+       mali-supply = <&buck6_reg>;
+       status = "okay";
+};
+
 &hdmi {
        hpd-gpios = <&gpa3 0 GPIO_ACTIVE_HIGH>;
        status = "okay";
index d29d13f4694f026ed51239cda91994ae96185c17..a76f620f7f35505855c438a80097b6d89df92888 100644 (file)
                };
        };
 
+       gpu: gpu@14ac0000 {
+               compatible = "samsung,exynos5433-mali", "arm,mali-t760";
+               reg = <0x14ac0000 0x5000>;
+               interrupts = <GIC_SPI 282 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 283 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 281 IRQ_TYPE_LEVEL_HIGH>;
+               interrupt-names = "job", "mmu", "gpu";
+               clocks = <&cmu_g3d CLK_ACLK_G3D>;
+               clock-names = "core";
+               power-domains = <&pd_g3d>;
+               operating-points-v2 = <&gpu_opp_table>;
+               status = "disabled";
+
+               gpu_opp_table: opp_table {
+                       compatible = "operating-points-v2";
+
+                       opp-160000000 {
+                               opp-hz = /bits/ 64 <160000000>;
+                               opp-microvolt = <1000000>;
+                       };
+                       opp-267000000 {
+                               opp-hz = /bits/ 64 <267000000>;
+                               opp-microvolt = <1000000>;
+                       };
+                       opp-350000000 {
+                               opp-hz = /bits/ 64 <350000000>;
+                               opp-microvolt = <1025000>;
+                       };
+                       opp-420000000 {
+                               opp-hz = /bits/ 64 <420000000>;
+                               opp-microvolt = <1025000>;
+                       };
+                       opp-500000000 {
+                               opp-hz = /bits/ 64 <500000000>;
+                               opp-microvolt = <1075000>;
+                       };
+                       opp-550000000 {
+                               opp-hz = /bits/ 64 <550000000>;
+                               opp-microvolt = <1125000>;
+                       };
+                       opp-600000000 {
+                               opp-hz = /bits/ 64 <600000000>;
+                               opp-microvolt = <1150000>;
+                       };
+                       opp-700000000 {
+                               opp-hz = /bits/ 64 <700000000>;
+                               opp-microvolt = <1150000>;
+                       };
+               };
+       };
+
        psci {
                compatible = "arm,psci";
                method = "smc";
index 00dd89b92b427382c497a3ea58ea616193ee174c..080e0f56e108f84d6fb7b6d8ec03e7e1f24b67b9 100644 (file)
        clock-frequency = <24000000>;
 };
 
+&gpu {
+       mali-supply = <&buck6_reg>;
+       status = "okay";
+};
+
 &serial_2 {
        status = "okay";
 };
index 077d234789019d06703831f3c9509b0b9024b79b..bcb9d8cee26776ec10f3234a8571fc05a272d0e4 100644 (file)
                };
        };
 
+       gpu: gpu@14ac0000 {
+               compatible = "samsung,exynos5433-mali", "arm,mali-t760";
+               reg = <0x14ac0000 0x5000>;
+               interrupts = <GIC_SPI 241 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 242 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 240 IRQ_TYPE_LEVEL_HIGH>;
+               interrupt-names = "job", "mmu", "gpu";
+               status = "disabled";
+               /* TODO: operating points for DVFS, cooling device */
+       };
+
        psci {
                compatible = "arm,psci-0.2";
                method = "smc";
index 0bd122f605495b4db9d4fe03c2acfd68b0775633..c043aca665726c09eb595a43da2fa0d8b588b8a6 100644 (file)
@@ -22,6 +22,7 @@ dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-lx2160a-rdb.dtb
 
 dtb-$(CONFIG_ARCH_MXC) += imx8mm-evk.dtb
 dtb-$(CONFIG_ARCH_MXC) += imx8mq-evk.dtb
+dtb-$(CONFIG_ARCH_MXC) += imx8mq-librem5-devkit.dtb
 dtb-$(CONFIG_ARCH_MXC) += imx8mq-zii-ultra-rmb3.dtb
 dtb-$(CONFIG_ARCH_MXC) += imx8mq-zii-ultra-zest.dtb
 dtb-$(CONFIG_ARCH_MXC) += imx8qxp-mek.dtb
index b359068d9605654fc438a63e6107af024648e7c7..de6ef39f3118ac27fe0a61ed347cf66b0080ab3f 100644 (file)
@@ -17,6 +17,7 @@
        compatible = "fsl,ls1028a-qds", "fsl,ls1028a";
 
        aliases {
+               crypto = &crypto;
                gpio0 = &gpio1;
                gpio1 = &gpio2;
                gpio2 = &gpio3;
                regulator-always-on;
        };
 
+       sb_3v3: regulator-sb3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "3v3_vbus";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-boot-on;
+               regulator-always-on;
+       };
+
        sound {
                compatible = "simple-audio-card";
                simple-audio-card,format = "i2s";
                        #size-cells = <0>;
                        reg = <0x3>;
 
+                       temperature-sensor@4c {
+                               compatible = "nxp,sa56004";
+                               reg = <0x4c>;
+                               vcc-supply = <&sb_3v3>;
+                       };
+
                        rtc@51 {
                                compatible = "nxp,pcf2129";
                                reg = <0x51>;
 &sai1 {
        status = "okay";
 };
+
+&sata {
+       status = "okay";
+};
index f9c272fb0738f95c4bf5ecde223551fe5c05aed1..9fb911317ecd6c98c9f350c14431e99a0f968f80 100644 (file)
@@ -16,6 +16,7 @@
        compatible = "fsl,ls1028a-rdb", "fsl,ls1028a";
 
        aliases {
+               crypto = &crypto;
                serial0 = &duart0;
                serial1 = &duart1;
        };
                regulator-always-on;
        };
 
+       sb_3v3: regulator-sb3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "3v3_vbus";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-boot-on;
+               regulator-always-on;
+       };
+
        sound {
                compatible = "simple-audio-card";
                simple-audio-card,format = "i2s";
                        #size-cells = <0>;
                        reg = <0x3>;
 
+                       temperature-sensor@4c {
+                               compatible = "nxp,sa56004";
+                               reg = <0x4c>;
+                               vcc-supply = <&sb_3v3>;
+                       };
+
                        rtc@51 {
                                compatible = "nxp,pcf2129";
                                reg = <0x51>;
 &sai4 {
        status = "okay";
 };
+
+&sata {
+       status = "okay";
+};
index 22a1c74dddf390a1f948fbfc7eb28ad5a32567af..7975519b4f5616f9b43c180224c20ddf438ea185 100644 (file)
                clock-output-names = "sysclk";
        };
 
+       dpclk: clock-dp {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <27000000>;
+               clock-output-names= "dpclk";
+       };
+
+       aclk: clock-axi {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <650000000>;
+               clock-output-names= "aclk";
+       };
+
+       pclk: clock-apb {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <650000000>;
+               clock-output-names= "pclk";
+       };
+
        reboot {
                compatible ="syscon-reboot";
                regmap = <&dcfg>;
                        #interrupt-cells = <2>;
                };
 
-               wdog0: watchdog@23c0000 {
-                       compatible = "fsl,ls1028a-wdt", "fsl,imx21-wdt";
-                       reg = <0x0 0x23c0000 0x0 0x10000>;
-                       interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&clockgen 4 1>;
-                       big-endian;
-                       status = "disabled";
+               usb0: usb@3100000 {
+                       compatible = "fsl,ls1028a-dwc3", "snps,dwc3";
+                       reg = <0x0 0x3100000 0x0 0x10000>;
+                       interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
+                       dr_mode = "host";
+                       snps,dis_rxdet_inp3_quirk;
+                       snps,quirk-frame-length-adjustment = <0x20>;
+                       snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>;
+               };
+
+               usb1: usb@3110000 {
+                       compatible = "fsl,ls1028a-dwc3", "snps,dwc3";
+                       reg = <0x0 0x3110000 0x0 0x10000>;
+                       interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
+                       dr_mode = "host";
+                       snps,dis_rxdet_inp3_quirk;
+                       snps,quirk-frame-length-adjustment = <0x20>;
+                       snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>;
                };
 
                sata: sata@3200000 {
                                     <GIC_SPI 208 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 209 IRQ_TYPE_LEVEL_HIGH>;
                };
 
+               crypto: crypto@8000000 {
+                       compatible = "fsl,sec-v5.0", "fsl,sec-v4.0";
+                       fsl,sec-era = <10>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0x0 0x00 0x8000000 0x100000>;
+                       reg = <0x00 0x8000000 0x0 0x100000>;
+                       interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>;
+                       dma-coherent;
+
+                       sec_jr0: jr@10000 {
+                               compatible = "fsl,sec-v5.0-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg     = <0x10000 0x10000>;
+                               interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
+                       };
+
+                       sec_jr1: jr@20000 {
+                               compatible = "fsl,sec-v5.0-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg     = <0x20000 0x10000>;
+                               interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>;
+                       };
+
+                       sec_jr2: jr@30000 {
+                               compatible = "fsl,sec-v5.0-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg     = <0x30000 0x10000>;
+                               interrupts = <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>;
+                       };
+
+                       sec_jr3: jr@40000 {
+                               compatible = "fsl,sec-v5.0-job-ring",
+                                            "fsl,sec-v4.0-job-ring";
+                               reg     = <0x40000 0x10000>;
+                               interrupts = <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
+                       };
+               };
+
+               qdma: dma-controller@8380000 {
+                       compatible = "fsl,ls1028a-qdma", "fsl,ls1021a-qdma";
+                       reg = <0x0 0x8380000 0x0 0x1000>, /* Controller regs */
+                             <0x0 0x8390000 0x0 0x10000>, /* Status regs */
+                             <0x0 0x83a0000 0x0 0x40000>; /* Block regs */
+                       interrupts = <GIC_SPI 43 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>;
+                       interrupt-names = "qdma-error", "qdma-queue0",
+                               "qdma-queue1", "qdma-queue2", "qdma-queue3";
+                       dma-channels = <8>;
+                       block-number = <1>;
+                       block-offset = <0x10000>;
+                       fsl,dma-queues = <2>;
+                       status-sizes = <64>;
+                       queue-sizes = <64 64>;
+               };
+
+               cluster1_core0_watchdog: watchdog@c000000 {
+                       compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc000000 0x0 0x1000>;
+                       clocks = <&clockgen 4 15>, <&clockgen 4 15>;
+                       clock-names = "apb_pclk", "wdog_clk";
+               };
+
+               cluster1_core1_watchdog: watchdog@c010000 {
+                       compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc010000 0x0 0x1000>;
+                       clocks = <&clockgen 4 15>, <&clockgen 4 15>;
+                       clock-names = "apb_pclk", "wdog_clk";
+               };
+
                sai1: audio-controller@f100000 {
                        #sound-dai-cells = <0>;
                        compatible = "fsl,vf610-sai";
                        };
                };
        };
+
+       malidp0: display@f080000 {
+               compatible = "arm,mali-dp500";
+               reg = <0x0 0xf080000 0x0 0x10000>;
+               interrupts = <0 222 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 223 IRQ_TYPE_LEVEL_HIGH>;
+               interrupt-names = "DE", "SE";
+               clocks = <&dpclk>, <&aclk>, <&aclk>, <&pclk>;
+               clock-names = "pxlclk", "mclk", "aclk", "pclk";
+               arm,malidp-output-port-lines = /bits/ 8 <8 8 8>;
+
+               port {
+                       dp0_out: endpoint {
+
+                       };
+               };
+       };
 };
index 2d5d89475b76c333940a57273b26ede4b6cd66a7..ee7f2b2fc1ffa7e3cd00ca1770b278de3146308d 100644 (file)
                gpio = <&gpio2 19 GPIO_ACTIVE_HIGH>;
                enable-active-high;
        };
+
+       wm8524: audio-codec {
+               #sound-dai-cells = <0>;
+               compatible = "wlf,wm8524";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_gpio_wlf>;
+               wlf,mute-gpios = <&gpio5 21 GPIO_ACTIVE_LOW>;
+       };
+
+       sound-wm8524 {
+               compatible = "simple-audio-card";
+               simple-audio-card,name = "wm8524-audio";
+               simple-audio-card,format = "i2s";
+               simple-audio-card,frame-master = <&cpudai>;
+               simple-audio-card,bitclock-master = <&cpudai>;
+               simple-audio-card,widgets =
+                       "Line", "Left Line Out Jack",
+                       "Line", "Right Line Out Jack";
+               simple-audio-card,routing =
+                       "Left Line Out Jack", "LINEVOUTL",
+                       "Right Line Out Jack", "LINEVOUTR";
+
+               cpudai: simple-audio-card,cpu {
+                       sound-dai = <&sai3>;
+               };
+
+               simple-audio-card,codec {
+                       sound-dai = <&wm8524>;
+                       clocks = <&clk IMX8MM_CLK_SAI3_ROOT>;
+               };
+       };
+};
+
+&A53_0 {
+       cpu-supply = <&buck2_reg>;
 };
 
 &fec1 {
        };
 };
 
+&sai3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_sai3>;
+       assigned-clocks = <&clk IMX8MM_CLK_SAI3>;
+       assigned-clock-parents = <&clk IMX8MM_AUDIO_PLL1_OUT>;
+       assigned-clock-rates = <24576000>;
+       status = "okay";
+};
+
+&snvs_pwrkey {
+       status = "okay";
+};
+
 &uart2 { /* console */
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_uart2>;
        status = "okay";
 };
 
+&i2c1 {
+       clock-frequency = <400000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       status = "okay";
+
+       pmic@4b {
+               compatible = "rohm,bd71847";
+               reg = <0x4b>;
+               pinctrl-0 = <&pinctrl_pmic>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <3 GPIO_ACTIVE_LOW>;
+               rohm,reset-snvs-powered;
+
+               regulators {
+                       buck1_reg: BUCK1 {
+                               regulator-name = "BUCK1";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                               regulator-ramp-delay = <1250>;
+                       };
+
+                       buck2_reg: 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>;
+                       };
+
+                       buck3_reg: BUCK3 {
+                               // BUCK5 in datasheet
+                               regulator-name = "BUCK3";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1350000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       buck4_reg: BUCK4 {
+                               // BUCK6 in datasheet
+                               regulator-name = "BUCK4";
+                               regulator-min-microvolt = <3000000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       buck5_reg: BUCK5 {
+                               // BUCK7 in datasheet
+                               regulator-name = "BUCK5";
+                               regulator-min-microvolt = <1605000>;
+                               regulator-max-microvolt = <1995000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       buck6_reg: BUCK6 {
+                               // BUCK8 in datasheet
+                               regulator-name = "BUCK6";
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1400000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       ldo1_reg: LDO1 {
+                               regulator-name = "LDO1";
+                               regulator-min-microvolt = <3000000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       ldo2_reg: LDO2 {
+                               regulator-name = "LDO2";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <900000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       ldo3_reg: LDO3 {
+                               regulator-name = "LDO3";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       ldo4_reg: LDO4 {
+                               regulator-name = "LDO4";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       ldo6_reg: LDO6 {
+                               regulator-name = "LDO6";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+               };
+       };
+};
+
 &iomuxc {
        pinctrl-names = "default";
 
                >;
        };
 
+       pinctrl_gpio_wlf: gpiowlfgrp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_I2C4_SDA_GPIO5_IO21        0xd6
+               >;
+       };
+
+       pinctrl_i2c1: i2c1grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_I2C1_SCL_I2C1_SCL                  0x400001c3
+                       MX8MM_IOMUXC_I2C1_SDA_I2C1_SDA                  0x400001c3
+               >;
+       };
+
+       pinctrl_pmic: pmicirq {
+               fsl,pins = <
+                       MX8MM_IOMUXC_GPIO1_IO03_GPIO1_IO3               0x41
+               >;
+       };
+
        pinctrl_reg_usdhc2_vmmc: regusdhc2vmmc {
                fsl,pins = <
                        MX8MM_IOMUXC_SD2_RESET_B_GPIO2_IO19     0x41
                >;
        };
 
+       pinctrl_sai3: sai3grp {
+               fsl,pins = <
+                       MX8MM_IOMUXC_SAI3_TXFS_SAI3_TX_SYNC     0xd6
+                       MX8MM_IOMUXC_SAI3_TXC_SAI3_TX_BCLK      0xd6
+                       MX8MM_IOMUXC_SAI3_MCLK_SAI3_MCLK        0xd6
+                       MX8MM_IOMUXC_SAI3_TXD_SAI3_TX_DATA0     0xd6
+               >;
+       };
+
        pinctrl_uart2: uart2grp {
                fsl,pins = <
                        MX8MM_IOMUXC_UART2_RXD_UART2_DCE_RX     0x140
index 6b407a94c06e7f6ae6ec77310ea60ccc6eb19235..232a7412755a917210d5e3bc44208b3d1cf42b93 100644 (file)
@@ -53,6 +53,8 @@
                        enable-method = "psci";
                        next-level-cache = <&A53_L2>;
                        operating-points-v2 = <&a53_opp_table>;
+                       nvmem-cells = <&cpu_speed_grade>;
+                       nvmem-cell-names = "speed_grade";
                };
 
                A53_1: cpu@1 {
                opp-1200000000 {
                        opp-hz = /bits/ 64 <1200000000>;
                        opp-microvolt = <850000>;
+                       opp-supported-hw = <0xe>, <0x7>;
                        clock-latency-ns = <150000>;
                };
 
                opp-1600000000 {
                        opp-hz = /bits/ 64 <1600000000>;
                        opp-microvolt = <900000>;
+                       opp-supported-hw = <0xc>, <0x7>;
+                       clock-latency-ns = <150000>;
+               };
+
+               opp-1800000000 {
+                       opp-hz = /bits/ 64 <1800000000>;
+                       opp-microvolt = <1000000>;
+                       /* Consumer only but rely on speed grading */
+                       opp-supported-hw = <0x8>, <0x7>;
                        clock-latency-ns = <150000>;
-                       opp-suspend;
                };
        };
 
                clock-output-names = "clk_ext4";
        };
 
-       gic: interrupt-controller@38800000 {
-               compatible = "arm,gic-v3";
-               reg = <0x0 0x38800000 0 0x10000>, /* GIC Dist */
-                     <0x0 0x38880000 0 0xC0000>; /* GICR (RD_base + SGI_base) */
-               #interrupt-cells = <3>;
-               interrupt-controller;
-               interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
-       };
-
        psci {
                compatible = "arm,psci-1.0";
                method = "smc";
                arm,no-tick-in-suspend;
        };
 
-       soc {
+       usbphynop1: usbphynop1 {
+               compatible = "usb-nop-xceiv";
+               clocks = <&clk IMX8MM_CLK_USB_PHY_REF>;
+               assigned-clocks = <&clk IMX8MM_CLK_USB_PHY_REF>;
+               assigned-clock-parents = <&clk IMX8MM_SYS_PLL1_100M>;
+               clock-names = "main_clk";
+       };
+
+       usbphynop2: usbphynop2 {
+               compatible = "usb-nop-xceiv";
+               clocks = <&clk IMX8MM_CLK_USB_PHY_REF>;
+               assigned-clocks = <&clk IMX8MM_CLK_USB_PHY_REF>;
+               assigned-clock-parents = <&clk IMX8MM_SYS_PLL1_100M>;
+               clock-names = "main_clk";
+       };
+
+       soc@0 {
                compatible = "simple-bus";
                #address-cells = <1>;
                #size-cells = <1>;
                        compatible = "fsl,aips-bus", "simple-bus";
                        #address-cells = <1>;
                        #size-cells = <1>;
-                       ranges;
+                       ranges = <0x30000000 0x30000000 0x400000>;
+
+                       sai1: sai@30010000 {
+                               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 {
+                               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";
+                       };
+
+                       sai5: sai@30050000 {
+                               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 {
+                               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";
+                       };
 
                        gpio1: gpio@30200000 {
                                compatible = "fsl,imx8mm-gpio", "fsl,imx35-gpio";
                                reg = <0x30200000 0x10000>;
                                interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>,
                                             <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MM_CLK_GPIO1_ROOT>;
                                gpio-controller;
                                #gpio-cells = <2>;
                                interrupt-controller;
                                reg = <0x30210000 0x10000>;
                                interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
                                             <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MM_CLK_GPIO2_ROOT>;
                                gpio-controller;
                                #gpio-cells = <2>;
                                interrupt-controller;
                                reg = <0x30220000 0x10000>;
                                interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>,
                                             <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MM_CLK_GPIO3_ROOT>;
                                gpio-controller;
                                #gpio-cells = <2>;
                                interrupt-controller;
                                reg = <0x30230000 0x10000>;
                                interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>,
                                             <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MM_CLK_GPIO4_ROOT>;
                                gpio-controller;
                                #gpio-cells = <2>;
                                interrupt-controller;
                                reg = <0x30240000 0x10000>;
                                interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>,
                                             <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MM_CLK_GPIO5_ROOT>;
                                gpio-controller;
                                #gpio-cells = <2>;
                                interrupt-controller;
                                /* For nvmem subnodes */
                                #address-cells = <1>;
                                #size-cells = <1>;
+
+                               cpu_speed_grade: speed-grade@10 {
+                                       reg = <0x10 4>;
+                               };
                        };
 
                        anatop: anatop@30360000 {
                                        offset = <0x34>;
                                        interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
                                                     <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MM_CLK_SNVS_ROOT>;
+                                       clock-names = "snvs-rtc";
                                };
 
                                snvs_pwrkey: snvs-powerkey {
                                        interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
                                        linux,keycode = <KEY_POWER>;
                                        wakeup-source;
+                                       status = "disabled";
                                };
                        };
 
                        compatible = "fsl,aips-bus", "simple-bus";
                        #address-cells = <1>;
                        #size-cells = <1>;
-                       ranges;
+                       ranges = <0x30400000 0x30400000 0x400000>;
 
                        pwm1: pwm@30660000 {
                                compatible = "fsl,imx8mm-pwm", "fsl,imx27-pwm";
                        compatible = "fsl,aips-bus", "simple-bus";
                        #address-cells = <1>;
                        #size-cells = <1>;
-                       ranges;
+                       ranges = <0x30800000 0x30800000 0x400000>;
 
                        ecspi1: spi@30820000 {
                                compatible = "fsl,imx8mm-ecspi", "fsl,imx51-ecspi";
                        compatible = "fsl,aips-bus", "simple-bus";
                        #address-cells = <1>;
                        #size-cells = <1>;
-                       ranges;
+                       ranges = <0x32c00000 0x32c00000 0x400000>;
 
                        usbotg1: usb@32e40000 {
                                compatible = "fsl,imx8mm-usb", "fsl,imx7d-usb";
                                status = "disabled";
                        };
 
-                       usbphynop1: usbphynop1 {
-                               compatible = "usb-nop-xceiv";
-                               clocks = <&clk IMX8MM_CLK_USB_PHY_REF>;
-                               assigned-clocks = <&clk IMX8MM_CLK_USB_PHY_REF>;
-                               assigned-clock-parents = <&clk IMX8MM_SYS_PLL1_100M>;
-                               clock-names = "main_clk";
-                       };
-
                        usbmisc1: usbmisc@32e40200 {
                                compatible = "fsl,imx8mm-usbmisc", "fsl,imx7d-usbmisc";
                                #index-cells = <1>;
                                status = "disabled";
                        };
 
-                       usbphynop2: usbphynop2 {
-                               compatible = "usb-nop-xceiv";
-                               clocks = <&clk IMX8MM_CLK_USB_PHY_REF>;
-                               assigned-clocks = <&clk IMX8MM_CLK_USB_PHY_REF>;
-                               assigned-clock-parents = <&clk IMX8MM_SYS_PLL1_100M>;
-                               clock-names = "main_clk";
-                       };
-
                        usbmisc2: usbmisc@32e50200 {
                                compatible = "fsl,imx8mm-usbmisc", "fsl,imx7d-usbmisc";
                                #index-cells = <1>;
                        dma-names = "rx-tx";
                        status = "disabled";
                };
+
+               gic: interrupt-controller@38800000 {
+                       compatible = "arm,gic-v3";
+                       reg = <0x38800000 0x10000>, /* GIC Dist */
+                             <0x38880000 0xc0000>; /* GICR (RD_base + SGI_base) */
+                       #interrupt-cells = <3>;
+                       interrupt-controller;
+                       interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
+               };
        };
 };
index b2038be8bbd7f679d31873f3095c88148caf74f8..e3df9b8cd9cac44125df2468501454e9303514d6 100644 (file)
        power-supply = <&sw1a_reg>;
 };
 
+&snvs_pwrkey {
+       status = "okay";
+};
+
 &uart1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_uart1>;
diff --git a/arch/arm64/boot/dts/freescale/imx8mq-librem5-devkit.dts b/arch/arm64/boot/dts/freescale/imx8mq-librem5-devkit.dts
new file mode 100644 (file)
index 0000000..5179e22
--- /dev/null
@@ -0,0 +1,809 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018-2019 Purism SPC
+ */
+
+/dts-v1/;
+
+#include "dt-bindings/input/input.h"
+#include "dt-bindings/pwm/pwm.h"
+#include "dt-bindings/usb/pd.h"
+#include "imx8mq.dtsi"
+
+/ {
+       model = "Purism Librem 5 devkit";
+       compatible = "purism,librem5-devkit", "fsl,imx8mq";
+
+       backlight_dsi: backlight-dsi {
+               compatible = "pwm-backlight";
+               /* 200 Hz for the PAM2841 */
+               pwms = <&pwm1 0 5000000>;
+               brightness-levels = <0 100>;
+               num-interpolated-steps = <100>;
+               /* Default brightness level (index into the array defined by */
+               /* the "brightness-levels" property) */
+               default-brightness-level = <0>;
+               power-supply = <&reg_22v4_p>;
+       };
+
+       chosen {
+               stdout-path = &uart1;
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_gpio_keys>;
+
+               btn1 {
+                       label = "VOL_UP";
+                       gpios = <&gpio4 21 GPIO_ACTIVE_LOW>;
+                       wakeup-source;
+                       linux,code = <KEY_VOLUMEUP>;
+               };
+
+               btn2 {
+                       label = "VOL_DOWN";
+                       gpios = <&gpio4 22 GPIO_ACTIVE_LOW>;
+                       wakeup-source;
+                       linux,code = <KEY_VOLUMEDOWN>;
+               };
+
+               hp-det {
+                       label = "HP_DET";
+                       gpios = <&gpio3 20 GPIO_ACTIVE_LOW>;
+                       wakeup-source;
+                       linux,code = <KEY_HP>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_gpio_leds>;
+
+               led1 {
+                       label = "LED 1";
+                       gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+       };
+
+       pmic_osc: clock-pmic {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <32768>;
+               clock-output-names = "pmic_osc";
+       };
+
+       reg_1v8_p: regulator-1v8-p {
+               compatible = "regulator-fixed";
+               regulator-name = "1v8_p";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&reg_pwr_en>;
+       };
+
+       reg_2v8_p: regulator-2v8-p {
+               compatible = "regulator-fixed";
+               regulator-name = "2v8_p";
+               regulator-min-microvolt = <2800000>;
+               regulator-max-microvolt = <2800000>;
+               vin-supply = <&reg_pwr_en>;
+       };
+
+       reg_3v3_p: regulator-3v3-p {
+               compatible = "regulator-fixed";
+               regulator-name = "3v3_p";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&reg_pwr_en>;
+
+               regulator-state-mem {
+                       regulator-on-in-suspend;
+               };
+       };
+
+       reg_5v_p: regulator-5v-p {
+               compatible = "regulator-fixed";
+               regulator-name = "5v_p";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&reg_pwr_en>;
+
+               regulator-state-mem {
+                       regulator-on-in-suspend;
+               };
+       };
+
+       reg_22v4_p: regulator-22v4-p  {
+               compatible = "regulator-fixed";
+               regulator-name = "22v4_P";
+               regulator-min-microvolt = <22400000>;
+               regulator-max-microvolt = <22400000>;
+               vin-supply = <&reg_pwr_en>;
+       };
+
+       reg_pwr_en: regulator-pwr-en {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_pwr_en>;
+               regulator-name = "PWR_EN";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               gpio = <&gpio1 8 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               regulator-always-on;
+       };
+
+       reg_usdhc2_vmmc: regulator-usdhc2-vmmc {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_usdhc2_pwr>;
+               regulator-name = "VSD_3V3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               gpio = <&gpio2 19 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               regulator-always-on;
+       };
+
+       vibrator {
+               compatible = "gpio-vibrator";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_haptic>;
+               enable-gpios = <&gpio5 4 GPIO_ACTIVE_LOW>;
+               vcc-supply = <&reg_3v3_p>;
+       };
+
+       wifi_pwr_en: regulator-wifi-en {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_wifi_pwr_en>;
+               regulator-name = "WIFI_EN";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               gpio = <&gpio3 5 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               regulator-always-on;
+       };
+};
+
+&clk {
+       assigned-clocks = <&clk IMX8MQ_AUDIO_PLL1>, <&clk IMX8MQ_AUDIO_PLL2>;
+       assigned-clock-rates = <786432000>, <722534400>;
+};
+
+&fec1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_fec1>;
+       phy-mode = "rgmii-id";
+       phy-handle = <&ethphy0>;
+       fsl,magic-packet;
+       phy-supply = <&reg_3v3_p>;
+       status = "okay";
+
+       mdio {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               ethphy0: ethernet-phy@1 {
+                       compatible = "ethernet-phy-ieee802.3-c22";
+                       reg = <1>;
+               };
+       };
+};
+
+&i2c1 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       status = "okay";
+
+       pmic: pmic@4b {
+               compatible = "rohm,bd71837";
+               reg = <0x4b>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_pmic>;
+               clocks = <&pmic_osc>;
+               clock-names = "osc";
+               clock-output-names = "pmic_clk";
+               interrupt-parent = <&gpio1>;
+               interrupts = <3 GPIO_ACTIVE_LOW>;
+               interrupt-names = "irq";
+               rohm,reset-snvs-powered;
+
+               regulators {
+                       buck1_reg: BUCK1 {
+                               regulator-name = "buck1";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1300000>;
+                               regulator-boot-on;
+                               regulator-ramp-delay = <1250>;
+                               rohm,dvs-run-voltage = <900000>;
+                               rohm,dvs-idle-voltage = <850000>;
+                               rohm,dvs-suspend-voltage = <800000>;
+                       };
+
+                       buck2_reg: BUCK2 {
+                               regulator-name = "buck2";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1300000>;
+                               regulator-boot-on;
+                               regulator-ramp-delay = <1250>;
+                               rohm,dvs-run-voltage = <1000000>;
+                               rohm,dvs-idle-voltage = <900000>;
+                       };
+
+                       buck3_reg: BUCK3 {
+                               regulator-name = "buck3";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1300000>;
+                               regulator-boot-on;
+                               rohm,dvs-run-voltage = <1000000>;
+                       };
+
+                       buck4_reg: BUCK4 {
+                               regulator-name = "buck4";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1300000>;
+                               rohm,dvs-run-voltage = <1000000>;
+                       };
+
+                       buck5_reg: BUCK5 {
+                               regulator-name = "buck5";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1350000>;
+                               regulator-boot-on;
+                       };
+
+                       buck6_reg: BUCK6 {
+                               regulator-name = "buck6";
+                               regulator-min-microvolt = <3000000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                       };
+
+                       buck7_reg: BUCK7 {
+                               regulator-name = "buck7";
+                               regulator-min-microvolt = <1605000>;
+                               regulator-max-microvolt = <1995000>;
+                               regulator-boot-on;
+                       };
+
+                       buck8_reg: BUCK8 {
+                               regulator-name = "buck8";
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1400000>;
+                               regulator-boot-on;
+                       };
+
+                       ldo1_reg: LDO1 {
+                               regulator-name = "ldo1";
+                               regulator-min-microvolt = <3000000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               /* leave on for snvs power button */
+                               regulator-always-on;
+                       };
+
+                       ldo2_reg: LDO2 {
+                               regulator-name = "ldo2";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <900000>;
+                               regulator-boot-on;
+                               /* leave on for snvs power button */
+                               regulator-always-on;
+                       };
+
+                       ldo3_reg: LDO3 {
+                               regulator-name = "ldo3";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                       };
+
+                       ldo4_reg: LDO4 {
+                               regulator-name = "ldo4";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-boot-on;
+                       };
+
+                       ldo5_reg: LDO5 {
+                               regulator-name = "ldo5";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                       };
+
+                       ldo6_reg: LDO6 {
+                               regulator-name = "ldo6";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-boot-on;
+                       };
+
+                       ldo7_reg: LDO7 {
+                               regulator-name = "ldo7";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                       };
+               };
+       };
+
+       typec_ptn5100: usb_typec@52 {
+               compatible = "nxp,ptn5110";
+               reg = <0x52>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_typec>;
+               interrupt-parent = <&gpio3>;
+               interrupts = <1 IRQ_TYPE_LEVEL_LOW>;
+
+               connector {
+                       compatible = "usb-c-connector";
+                       label = "USB-C";
+                       data-role = "dual";
+                       power-role = "dual";
+                       try-power-role = "sink";
+                       source-pdos = <PDO_FIXED(5000, 2000,
+                               PDO_FIXED_USB_COMM |
+                               PDO_FIXED_DUAL_ROLE |
+                               PDO_FIXED_DATA_SWAP )>;
+                       sink-pdos = <PDO_FIXED(5000, 2000, PDO_FIXED_USB_COMM |
+                               PDO_FIXED_DUAL_ROLE |
+                               PDO_FIXED_DATA_SWAP )
+                            PDO_VAR(5000, 3000, 3000)>;
+                       op-sink-microwatt = <10000000>;
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+
+                                       usb_con_hs: endpoint {
+                                               remote-endpoint = <&typec_hs>;
+                                       };
+                               };
+
+                               port@1 {
+                                       reg = <1>;
+
+                                       usb_con_ss: endpoint {
+                                               remote-endpoint = <&typec_ss>;
+                                       };
+                               };
+                       };
+               };
+       };
+
+       rtc@68 {
+               compatible = "microcrystal,rv4162";
+               reg = <0x68>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_rtc>;
+               interrupt-parent = <&gpio4>;
+               interrupts = <29 IRQ_TYPE_LEVEL_LOW>;
+       };
+
+       charger@6b { /* bq25896 */
+               compatible = "ti,bq25890";
+               reg = <0x6b>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_charger>;
+               interrupt-parent = <&gpio3>;
+               interrupts = <25 IRQ_TYPE_EDGE_FALLING>;
+               ti,battery-regulation-voltage = <4192000>; /* 4.192V */
+               ti,charge-current = <1600000>; /* 1.6A */
+               ti,termination-current = <66000>;  /* 66mA */
+               ti,precharge-current = <130000>; /* 130mA */
+               ti,minimum-sys-voltage = <3000000>; /* 3V */
+               ti,boost-voltage = <5000000>; /* 5V */
+               ti,boost-max-current = <50000>; /* 50mA */
+       };
+};
+
+&i2c3 {
+       clock-frequency = <100000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c3>;
+       status = "okay";
+
+       magnetometer@1e {
+               compatible = "st,lsm9ds1-magn";
+               reg = <0x1e>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_imu>;
+               interrupt-parent = <&gpio3>;
+               interrupts = <19 IRQ_TYPE_LEVEL_LOW>;
+               vdd-supply = <&reg_3v3_p>;
+               vddio-supply = <&reg_3v3_p>;
+       };
+
+       touchscreen@5d {
+               compatible = "goodix,gt5688";
+               reg = <0x5d>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_ts>;
+               interrupt-parent = <&gpio3>;
+               interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+               reset-gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;
+               irq-gpios = <&gpio3 0 GPIO_ACTIVE_HIGH>;
+               touchscreen-size-x = <720>;
+               touchscreen-size-y = <1440>;
+               AVDD28-supply = <&reg_2v8_p>;
+               VDDIO-supply = <&reg_1v8_p>;
+       };
+};
+
+&iomuxc {
+       pinctrl_bl: blgrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_GPIO1_IO01_PWM1_OUT        0x6 /* DSI_BL_PWM */
+               >;
+       };
+
+       pinctrl_bt: btgrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_NAND_DATA05_GPIO3_IO11     0x16 /* nBT_DISABLE */
+                       MX8MQ_IOMUXC_NAND_DATA01_GPIO3_IO7      0x10 /* BT_HOST_WAKE */
+               >;
+       };
+
+       pinctrl_charger: chargergrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SAI5_MCLK_GPIO3_IO25       0x80 /* CHRG_nINT */
+               >;
+       };
+
+       pinctrl_fec1: fec1grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_ENET_MDC_ENET1_MDC                 0x3
+                       MX8MQ_IOMUXC_ENET_MDIO_ENET1_MDIO               0x3
+                       MX8MQ_IOMUXC_ENET_TD3_ENET1_RGMII_TD3           0x1f
+                       MX8MQ_IOMUXC_ENET_TD2_ENET1_RGMII_TD2           0x1f
+                       MX8MQ_IOMUXC_ENET_TD1_ENET1_RGMII_TD1           0x1f
+                       MX8MQ_IOMUXC_ENET_TD0_ENET1_RGMII_TD0           0x1f
+                       MX8MQ_IOMUXC_ENET_RD3_ENET1_RGMII_RD3           0x91
+                       MX8MQ_IOMUXC_ENET_RD2_ENET1_RGMII_RD2           0x91
+                       MX8MQ_IOMUXC_ENET_RD1_ENET1_RGMII_RD1           0x91
+                       MX8MQ_IOMUXC_ENET_RD0_ENET1_RGMII_RD0           0x91
+                       MX8MQ_IOMUXC_ENET_TXC_ENET1_RGMII_TXC           0x1f
+                       MX8MQ_IOMUXC_ENET_RXC_ENET1_RGMII_RXC           0x91
+                       MX8MQ_IOMUXC_ENET_RX_CTL_ENET1_RGMII_RX_CTL     0x91
+                       MX8MQ_IOMUXC_ENET_TX_CTL_ENET1_RGMII_TX_CTL     0x1f
+                       MX8MQ_IOMUXC_GPIO1_IO09_GPIO1_IO9               0x19
+                       MX8MQ_IOMUXC_GPIO1_IO15_CCMSRCGPCMIX_CLKO2      0x1f
+               >;
+       };
+
+       pinctrl_ts: tsgrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_NAND_ALE_GPIO3_IO0         0x16  /* TOUCH INT */
+                       MX8MQ_IOMUXC_GPIO1_IO05_GPIO1_IO5       0x19  /* TOUCH RST */
+               >;
+       };
+
+       pinctrl_gpio_leds: gpioledgrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_GPIO1_IO13_GPIO1_IO13      0x16
+               >;
+       };
+
+       pinctrl_gpio_keys: gpiokeygrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SAI2_RXFS_GPIO4_IO21       0x16
+                       MX8MQ_IOMUXC_SAI2_RXC_GPIO4_IO22        0x16
+                       MX8MQ_IOMUXC_SAI5_RXC_GPIO3_IO20        0x180  /* HP_DET */
+               >;
+       };
+
+       pinctrl_haptic: hapticgrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SPDIF_RX_GPIO5_IO4         0xc6   /* nHAPTIC */
+               >;
+       };
+
+       pinctrl_i2c1: i2c1grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_I2C1_SCL_I2C1_SCL          0x4000001f
+                       MX8MQ_IOMUXC_I2C1_SDA_I2C1_SDA          0x4000001f
+               >;
+       };
+
+       pinctrl_i2c3: i2c3grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_I2C3_SCL_I2C3_SCL          0x4000001f
+                       MX8MQ_IOMUXC_I2C3_SDA_I2C3_SDA          0x4000001f
+               >;
+       };
+
+       pinctrl_imu: imugrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SAI5_RXFS_GPIO3_IO19       0x8  /* IMU_INT */
+               >;
+       };
+
+       pinctrl_pmic: pmicgrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_GPIO1_IO03_GPIO1_IO3       0x80  /* PMIC intr */
+               >;
+       };
+
+       pinctrl_pwr_en: pwrengrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_GPIO1_IO08_GPIO1_IO8       0x06
+               >;
+       };
+
+       pinctrl_rtc: rtcgrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SAI3_RXC_GPIO4_IO29        0x80  /* RTC intr */
+               >;
+       };
+
+       pinctrl_typec: typecgrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_NAND_DATA06_GPIO3_IO12             0x16
+                       MX8MQ_IOMUXC_NAND_CE0_B_GPIO3_IO1               0x80
+               >;
+       };
+
+       pinctrl_uart1: uart1grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_UART1_RXD_UART1_DCE_RX             0x49
+                       MX8MQ_IOMUXC_UART1_TXD_UART1_DCE_TX             0x49
+               >;
+       };
+
+       pinctrl_uart2: uart2grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_UART2_TXD_UART2_DCE_TX             0x49
+                       MX8MQ_IOMUXC_UART2_RXD_UART2_DCE_RX             0x49
+                       MX8MQ_IOMUXC_UART4_RXD_UART2_DCE_CTS_B          0x49
+                       MX8MQ_IOMUXC_UART4_TXD_UART2_DCE_RTS_B          0x49
+               >;
+       };
+
+       pinctrl_uart3: uart3grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_UART3_RXD_UART3_DCE_RX             0x49
+                       MX8MQ_IOMUXC_UART3_TXD_UART3_DCE_TX             0x49
+               >;
+       };
+
+       pinctrl_uart4: uart4grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_ECSPI2_SCLK_UART4_DCE_RX           0x49
+                       MX8MQ_IOMUXC_ECSPI2_MOSI_UART4_DCE_TX           0x49
+                       MX8MQ_IOMUXC_ECSPI2_MISO_UART4_DCE_CTS_B        0x49
+                       MX8MQ_IOMUXC_ECSPI2_SS0_UART4_DCE_RTS_B         0x49
+                       MX8MQ_IOMUXC_GPIO1_IO00_ANAMIX_REF_CLK_32K      0x49
+               >;
+       };
+
+       pinctrl_usdhc1: usdhc1grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK                 0x83
+                       MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD                 0xc3
+                       MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0             0xc3
+                       MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1             0xc3
+                       MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2             0xc3
+                       MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3             0xc3
+                       MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4             0xc3
+                       MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5             0xc3
+                       MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6             0xc3
+                       MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7             0xc3
+                       MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE           0x83
+                       MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B         0xc1
+               >;
+       };
+
+       pinctrl_usdhc1_100mhz: usdhc1grp100mhz {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK                 0x8d
+                       MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD                 0xcd
+                       MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0             0xcd
+                       MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1             0xcd
+                       MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2             0xcd
+                       MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3             0xcd
+                       MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4             0xcd
+                       MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5             0xcd
+                       MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6             0xcd
+                       MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7             0xcd
+                       MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE           0x8d
+                       MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B         0xc1
+               >;
+       };
+
+       pinctrl_usdhc1_200mhz: usdhc1grp200mhz {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK                 0x9f
+                       MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD                 0xdf
+                       MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0             0xdf
+                       MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1             0xdf
+                       MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2             0xdf
+                       MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3             0xdf
+                       MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4             0xdf
+                       MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5             0xdf
+                       MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6             0xdf
+                       MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7             0xdf
+                       MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE           0x9f
+                       MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B         0xc1
+               >;
+       };
+
+       pinctrl_usdhc2_pwr: usdhc2grppwr {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SD2_RESET_B_GPIO2_IO19     0x41
+               >;
+       };
+
+       pinctrl_usdhc2_gpio: usdhc2grpgpio {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SD2_WP_GPIO2_IO20          0x80 /* WIFI_WAKE */
+               >;
+       };
+
+       pinctrl_usdhc2: usdhc2grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK         0x83
+                       MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD         0xc3
+                       MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0     0xc3
+                       MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1     0xc3
+                       MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2     0xc3
+                       MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3     0xc3
+               >;
+       };
+
+       pinctrl_usdhc2_100mhz: usdhc2grp100mhz {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK         0x8d
+                       MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD         0xcd
+                       MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0     0xcd
+                       MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1     0xcd
+                       MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2     0xcd
+                       MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3     0xcd
+               >;
+       };
+
+       pinctrl_usdhc2_200mhz: usdhc2grp200mhz {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK         0x9f
+                       MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD         0xcf
+                       MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0     0xcf
+                       MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1     0xcf
+                       MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2     0xcf
+                       MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3     0xcf
+               >;
+       };
+
+       pinctrl_wdog: wdoggrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_GPIO1_IO02_WDOG1_WDOG_B    0xc6
+               >;
+       };
+
+       pinctrl_wifi_pwr_en: wifipwrengrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_NAND_CLE_GPIO3_IO5         0x06
+               >;
+       };
+
+       pinctrl_wwan: wwangrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_NAND_CE3_B_GPIO3_IO4       0x09 /* nWWAN_DISABLE */
+                       MX8MQ_IOMUXC_NAND_DATA02_GPIO3_IO8      0x80 /* nWoWWAN */
+                       MX8MQ_IOMUXC_NAND_DATA03_GPIO3_IO9      0x19 /* WWAN_RESET */
+               >;
+       };
+};
+
+&pgc_gpu {
+       power-supply = <&buck3_reg>;
+};
+
+&pgc_vpu {
+       power-supply = <&buck4_reg>;
+};
+
+&pwm1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_bl>;
+       status = "okay";
+};
+
+&snvs_pwrkey {
+       status = "okay";
+};
+
+&uart1 { /* console */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart1>;
+       status = "okay";
+};
+
+&uart3 { /* GNSS */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart3>;
+       status = "okay";
+};
+
+&uart4 { /* BT */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart4>, <&pinctrl_bt>;
+       uart-has-rtscts;
+       status = "okay";
+};
+
+&usb3_phy0 {
+       status = "okay";
+};
+
+&usb3_phy1 {
+       vbus-supply = <&reg_5v_p>;
+       status = "okay";
+};
+
+&usb_dwc3_0 {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       dr_mode = "otg";
+       status = "okay";
+
+       port@0 {
+               reg = <0>;
+
+               typec_hs: endpoint {
+                       remote-endpoint = <&usb_con_hs>;
+               };
+       };
+
+       port@1 {
+               reg = <1>;
+
+               typec_ss: endpoint {
+                       remote-endpoint = <&usb_con_ss>;
+               };
+       };
+};
+
+&usb_dwc3_1 {
+       dr_mode = "host";
+       status = "okay";
+};
+
+&usdhc1 {
+       pinctrl-names = "default", "state_100mhz", "state_200mhz";
+       pinctrl-0 = <&pinctrl_usdhc1>;
+       pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
+       pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
+       bus-width = <8>;
+       non-removable;
+       status = "okay";
+};
+
+&usdhc2 {
+       pinctrl-names = "default", "state_100mhz", "state_200mhz";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       pinctrl-1 = <&pinctrl_usdhc2_100mhz>;
+       pinctrl-2 = <&pinctrl_usdhc2_200mhz>;
+       bus-width = <4>;
+       vmmc-supply = <&reg_usdhc2_vmmc>;
+       power-supply = <&wifi_pwr_en>;
+       non-removable;
+       disable-wp;
+       cap-sdio-irq;
+       keep-power-in-suspend;
+       wakeup-source;
+       status = "okay";
+};
+
+&wdog1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_wdog>;
+       fsl,ext-reset-output;
+       status = "okay";
+};
index 6d635ba0904c509c4f035721934285549c815acd..d09b808eff87f9dca1cd73f035432346d33e836d 100644 (file)
@@ -8,6 +8,7 @@
 #include <dt-bindings/power/imx8mq-power.h>
 #include <dt-bindings/reset/imx8mq-reset.h>
 #include <dt-bindings/gpio/gpio.h>
+#include "dt-bindings/input/input.h"
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/thermal/thermal.h>
 #include "imx8mq-pinfunc.h"
        #size-cells = <2>;
 
        aliases {
+               gpio0 = &gpio1;
+               gpio1 = &gpio2;
+               gpio2 = &gpio3;
+               gpio3 = &gpio4;
+               gpio4 = &gpio5;
                i2c0 = &i2c1;
                i2c1 = &i2c2;
                i2c2 = &i2c3;
                        next-level-cache = <&A53_L2>;
                        operating-points-v2 = <&a53_opp_table>;
                        #cooling-cells = <2>;
+                       nvmem-cells = <&cpu_speed_grade>;
+                       nvmem-cell-names = "speed_grade";
                };
 
                A53_1: cpu@1 {
                opp-800000000 {
                        opp-hz = /bits/ 64 <800000000>;
                        opp-microvolt = <900000>;
+                       /* Industrial only */
+                       opp-supported-hw = <0xf>, <0x4>;
+                       clock-latency-ns = <150000>;
+               };
+
+               opp-1000000000 {
+                       opp-hz = /bits/ 64 <1000000000>;
+                       opp-microvolt = <900000>;
+                       /* Consumer only */
+                       opp-supported-hw = <0xe>, <0x3>;
                        clock-latency-ns = <150000>;
                };
 
                opp-1300000000 {
                        opp-hz = /bits/ 64 <1300000000>;
                        opp-microvolt = <1000000>;
+                       opp-supported-hw = <0xc>, <0x7>;
+                       clock-latency-ns = <150000>;
+               };
+
+               opp-1500000000 {
+                       opp-hz = /bits/ 64 <1500000000>;
+                       opp-microvolt = <1000000>;
+                       /* Consumer only but rely on speed grading */
+                       opp-supported-hw = <0x8>, <0x7>;
                        clock-latency-ns = <150000>;
-                       opp-suspend;
                };
        };
 
                                clocks = <&clk IMX8MQ_CLK_OCOTP_ROOT>;
                                #address-cells = <1>;
                                #size-cells = <1>;
+
+                               cpu_speed_grade: speed-grade@10 {
+                                       reg = <0x10 4>;
+                               };
                        };
 
                        anatop: syscon@30360000 {
                                        offset = <0x34>;
                                        interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
                                                <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MQ_CLK_SNVS_ROOT>;
+                                       clock-names = "snvs-rtc";
                                };
 
+                               snvs_pwrkey: snvs-powerkey {
+                                       compatible = "fsl,sec-v4.0-pwrkey";
+                                       regmap = <&snvs>;
+                                       interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
+                                       linux,keycode = <KEY_POWER>;
+                                       wakeup-source;
+                                       status = "disabled";
+                               };
                        };
 
                        clk: clock-controller@30380000 {
                        };
                };
 
+               bus@32c00000 { /* AIPS4 */
+                       compatible = "fsl,imx8mq-aips-bus", "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0x32c00000 0x32c00000 0x400000>;
+
+                       irqsteer: interrupt-controller@32e2d000 {
+                               compatible = "fsl,imx8m-irqsteer", "fsl,imx-irqsteer";
+                               reg = <0x32e2d000 0x1000>;
+                               interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MQ_CLK_DISP_APB_ROOT>;
+                               clock-names = "ipg";
+                               fsl,channel = <0>;
+                               fsl,num-irqs = <64>;
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                       };
+               };
+
                gpu: gpu@38000000 {
                        compatible = "vivante,gc";
                        reg = <0x38000000 0x40000>;
                        status = "disabled";
                };
 
-
                pcie0: pcie@33800000 {
                        compatible = "fsl,imx8mq-pcie";
                        reg = <0x33800000 0x400000>,
index 0683ee2a48ae5a8584fff3e2b136c7d4b112db65..05fa0b7f36bb18375a14d8255e4af2c0c02e5296 100644 (file)
        #size-cells = <2>;
 
        aliases {
+               gpio0 = &lsio_gpio0;
+               gpio1 = &lsio_gpio1;
+               gpio2 = &lsio_gpio2;
+               gpio3 = &lsio_gpio3;
+               gpio4 = &lsio_gpio4;
+               gpio5 = &lsio_gpio5;
+               gpio6 = &lsio_gpio6;
+               gpio7 = &lsio_gpio7;
                mmc0 = &usdhc1;
                mmc1 = &usdhc2;
                mmc2 = &usdhc3;
-               serial0 = &adma_lpuart0;
                mu1 = &lsio_mu1;
+               serial0 = &adma_lpuart0;
        };
 
        cpus {
                        compatible = "fsl,imx8qxp-iomuxc";
                };
 
+               ocotp: imx8qx-ocotp {
+                       compatible = "fsl,imx8qxp-scu-ocotp";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+               };
+
                pd: imx8qx-pd {
                        compatible = "fsl,imx8qxp-scu-pd";
                        #power-domain-cells = <1>;
                rtc: rtc {
                        compatible = "fsl,imx8qxp-sc-rtc";
                };
+
+               watchdog {
+                       compatible = "fsl,imx8qxp-sc-wdt", "fsl,imx-sc-wdt";
+                       timeout-sec = <60>;
+               };
        };
 
        timer {
                };
        };
 
-       lsio_subsys: bus@5d000000 {
+       ddr_subsyss: bus@5c000000 {
                compatible = "simple-bus";
                #address-cells = <1>;
                #size-cells = <1>;
-               ranges = <0x5d000000 0x0 0x5d000000 0x1000000>;
-
-               lsio_lpcg: clock-controller@5d400000 {
-                       compatible = "fsl,imx8qxp-lpcg-lsio";
-                       reg = <0x5d400000 0x400000>;
-                       #clock-cells = <1>;
-               };
+               ranges = <0x5c000000 0x0 0x5c000000 0x1000000>;
 
-               lsio_mu0: mailbox@5d1b0000 {
-                       compatible = "fsl,imx8qxp-mu", "fsl,imx6sx-mu";
-                       reg = <0x5d1b0000 0x10000>;
-                       interrupts = <GIC_SPI 176 IRQ_TYPE_LEVEL_HIGH>;
-                       #mbox-cells = <2>;
-                       status = "disabled";
-               };
-
-               lsio_mu1: mailbox@5d1c0000 {
-                       compatible = "fsl,imx8qxp-mu", "fsl,imx6sx-mu";
-                       reg = <0x5d1c0000 0x10000>;
-                       interrupts = <GIC_SPI 177 IRQ_TYPE_LEVEL_HIGH>;
-                       #mbox-cells = <2>;
-               };
-
-               lsio_mu2: mailbox@5d1d0000 {
-                       compatible = "fsl,imx8qxp-mu", "fsl,imx6sx-mu";
-                       reg = <0x5d1d0000 0x10000>;
-                       interrupts = <GIC_SPI 178 IRQ_TYPE_LEVEL_HIGH>;
-                       #mbox-cells = <2>;
-                       status = "disabled";
-               };
-
-               lsio_mu3: mailbox@5d1e0000 {
-                       compatible = "fsl,imx8qxp-mu", "fsl,imx6sx-mu";
-                       reg = <0x5d1e0000 0x10000>;
-                       interrupts = <GIC_SPI 179 IRQ_TYPE_LEVEL_HIGH>;
-                       #mbox-cells = <2>;
-                       status = "disabled";
+               ddr-pmu@5c020000 {
+                       compatible = "fsl,imx8-ddr-pmu";
+                       reg = <0x5c020000 0x10000>;
+                       interrupt-parent = <&gic>;
+                       interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
                };
+       };
 
-               lsio_mu4: mailbox@5d1f0000 {
-                       compatible = "fsl,imx8qxp-mu", "fsl,imx6sx-mu";
-                       reg = <0x5d1f0000 0x10000>;
-                       interrupts = <GIC_SPI 180 IRQ_TYPE_LEVEL_HIGH>;
-                       #mbox-cells = <2>;
-                       status = "disabled";
-               };
+       lsio_subsys: bus@5d000000 {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x5d000000 0x0 0x5d000000 0x1000000>;
 
                lsio_gpio0: gpio@5d080000 {
                        compatible = "fsl,imx8qxp-gpio", "fsl,imx35-gpio";
                        #interrupt-cells = <2>;
                        power-domains = <&pd IMX_SC_R_GPIO_7>;
                };
-       };
 
-       watchdog {
-               compatible = "fsl,imx8qxp-sc-wdt", "fsl,imx-sc-wdt";
-               timeout-sec = <60>;
+               lsio_mu0: mailbox@5d1b0000 {
+                       compatible = "fsl,imx8qxp-mu", "fsl,imx6sx-mu";
+                       reg = <0x5d1b0000 0x10000>;
+                       interrupts = <GIC_SPI 176 IRQ_TYPE_LEVEL_HIGH>;
+                       #mbox-cells = <2>;
+                       status = "disabled";
+               };
+
+               lsio_mu1: mailbox@5d1c0000 {
+                       compatible = "fsl,imx8qxp-mu", "fsl,imx6sx-mu";
+                       reg = <0x5d1c0000 0x10000>;
+                       interrupts = <GIC_SPI 177 IRQ_TYPE_LEVEL_HIGH>;
+                       #mbox-cells = <2>;
+               };
+
+               lsio_mu2: mailbox@5d1d0000 {
+                       compatible = "fsl,imx8qxp-mu", "fsl,imx6sx-mu";
+                       reg = <0x5d1d0000 0x10000>;
+                       interrupts = <GIC_SPI 178 IRQ_TYPE_LEVEL_HIGH>;
+                       #mbox-cells = <2>;
+                       status = "disabled";
+               };
+
+               lsio_mu3: mailbox@5d1e0000 {
+                       compatible = "fsl,imx8qxp-mu", "fsl,imx6sx-mu";
+                       reg = <0x5d1e0000 0x10000>;
+                       interrupts = <GIC_SPI 179 IRQ_TYPE_LEVEL_HIGH>;
+                       #mbox-cells = <2>;
+                       status = "disabled";
+               };
+
+               lsio_mu4: mailbox@5d1f0000 {
+                       compatible = "fsl,imx8qxp-mu", "fsl,imx6sx-mu";
+                       reg = <0x5d1f0000 0x10000>;
+                       interrupts = <GIC_SPI 180 IRQ_TYPE_LEVEL_HIGH>;
+                       #mbox-cells = <2>;
+                       status = "disabled";
+               };
+
+               lsio_mu13: mailbox@5d280000 {
+                       compatible = "fsl,imx8qxp-mu", "fsl,imx6sx-mu";
+                       reg = <0x5d280000 0x10000>;
+                       interrupts = <GIC_SPI 192 IRQ_TYPE_LEVEL_HIGH>;
+                       #mbox-cells = <2>;
+                       power-domains = <&pd IMX_SC_R_MU_13A>;
+               };
+
+               lsio_lpcg: clock-controller@5d400000 {
+                       compatible = "fsl,imx8qxp-lpcg-lsio";
+                       reg = <0x5d400000 0x400000>;
+                       #clock-cells = <1>;
+               };
        };
 };
diff --git a/arch/arm64/boot/dts/hisilicon/hi3660-coresight.dtsi b/arch/arm64/boot/dts/hisilicon/hi3660-coresight.dtsi
new file mode 100644 (file)
index 0000000..d607f2f
--- /dev/null
@@ -0,0 +1,456 @@
+// SPDX-License-Identifier: GPL-2.0
+
+/*
+ * dtsi for Hisilicon Hi3660 Coresight
+ *
+ * Copyright (C) 2016-2018 Hisilicon Ltd.
+ *
+ * Author: Wanglai Shi <shiwanglai@hisilicon.com>
+ *
+ */
+/ {
+       soc {
+               /* A53 cluster internals */
+               etm@ecc40000 {
+                       compatible = "arm,coresight-etm4x", "arm,primecell";
+                       reg = <0 0xecc40000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+                       cpu = <&cpu0>;
+
+                       out-ports {
+                               port {
+                                       etm0_out: endpoint {
+                                               remote-endpoint =
+                                                       <&cluster0_funnel_in0>;
+                                       };
+                               };
+                       };
+               };
+
+               etm@ecd40000 {
+                       compatible = "arm,coresight-etm4x", "arm,primecell";
+                       reg = <0 0xecd40000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+                       cpu = <&cpu1>;
+
+                       out-ports {
+                               port {
+                                       etm1_out: endpoint {
+                                               remote-endpoint =
+                                                       <&cluster0_funnel_in1>;
+                                       };
+                               };
+                       };
+               };
+
+               etm@ece40000 {
+                       compatible = "arm,coresight-etm4x", "arm,primecell";
+                       reg = <0 0xece40000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+                       cpu = <&cpu2>;
+
+                       out-ports {
+                               port {
+                                       etm2_out: endpoint {
+                                               remote-endpoint =
+                                                       <&cluster0_funnel_in2>;
+                                       };
+                               };
+                       };
+               };
+
+               etm@ecf40000 {
+                       compatible = "arm,coresight-etm4x", "arm,primecell";
+                       reg = <0 0xecf40000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+                       cpu = <&cpu3>;
+
+                       out-ports {
+                               port {
+                                       etm3_out: endpoint {
+                                               remote-endpoint =
+                                                       <&cluster0_funnel_in3>;
+                                       };
+                               };
+                       };
+               };
+
+               funnel@ec801000 {
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
+                       reg = <0 0xec801000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+
+                       out-ports {
+                               port {
+                                       cluster0_funnel_out: endpoint {
+                                               remote-endpoint =
+                                                       <&cluster0_etf_in>;
+                                       };
+                               };
+                       };
+
+                       in-ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       cluster0_funnel_in0: endpoint {
+                                               remote-endpoint = <&etm0_out>;
+                                       };
+                               };
+
+                               port@1 {
+                                       reg = <1>;
+                                       cluster0_funnel_in1: endpoint {
+                                               remote-endpoint = <&etm1_out>;
+                                       };
+                               };
+
+                               port@2 {
+                                       reg = <2>;
+                                       cluster0_funnel_in2: endpoint {
+                                               remote-endpoint = <&etm2_out>;
+                                       };
+                               };
+
+                               port@3 {
+                                       reg = <3>;
+                                       cluster0_funnel_in3: endpoint {
+                                               remote-endpoint = <&etm3_out>;
+                                       };
+                               };
+                       };
+               };
+
+               etf@ec802000 {
+                       compatible = "arm,coresight-tmc", "arm,primecell";
+                       reg = <0 0xec802000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+
+                       in-ports {
+                               port {
+                                       cluster0_etf_in: endpoint {
+                                               remote-endpoint =
+                                                       <&cluster0_funnel_out>;
+                                       };
+                               };
+                       };
+
+                       out-ports {
+                               port {
+                                       cluster0_etf_out: endpoint {
+                                               remote-endpoint =
+                                                       <&combo_funnel_in0>;
+                                       };
+                               };
+                       };
+               };
+
+               /* A73 cluster internals */
+               etm@ed440000 {
+                       compatible = "arm,coresight-etm4x", "arm,primecell";
+                       reg = <0 0xed440000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+                       cpu = <&cpu4>;
+
+                       out-ports {
+                               port {
+                                       etm4_out: endpoint {
+                                               remote-endpoint =
+                                                       <&cluster1_funnel_in0>;
+                                       };
+                               };
+                       };
+               };
+
+               etm@ed540000 {
+                       compatible = "arm,coresight-etm4x", "arm,primecell";
+                       reg = <0 0xed540000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+                       cpu = <&cpu5>;
+
+                       out-ports {
+                               port {
+                                       etm5_out: endpoint {
+                                               remote-endpoint =
+                                                       <&cluster1_funnel_in1>;
+                                       };
+                               };
+                       };
+               };
+
+               etm@ed640000 {
+                       compatible = "arm,coresight-etm4x", "arm,primecell";
+                       reg = <0 0xed640000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+                       cpu = <&cpu6>;
+
+                       out-ports {
+                               port {
+                                       etm6_out: endpoint {
+                                               remote-endpoint =
+                                                       <&cluster1_funnel_in2>;
+                                       };
+                               };
+                       };
+               };
+
+               etm@ed740000 {
+                       compatible = "arm,coresight-etm4x", "arm,primecell";
+                       reg = <0 0xed740000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+                       cpu = <&cpu7>;
+
+                       out-ports {
+                               port {
+                                       etm7_out: endpoint {
+                                               remote-endpoint =
+                                                       <&cluster1_funnel_in3>;
+                                       };
+                               };
+                       };
+               };
+
+               funnel@ed001000 {
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
+                       reg = <0 0xed001000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+                       out-ports {
+                               port {
+                                       cluster1_funnel_out: endpoint {
+                                               remote-endpoint =
+                                                       <&cluster1_etf_in>;
+                                       };
+                               };
+                       };
+
+                       in-ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       cluster1_funnel_in0: endpoint {
+                                               remote-endpoint = <&etm4_out>;
+                                       };
+                               };
+
+                               port@1 {
+                                       reg = <1>;
+                                       cluster1_funnel_in1: endpoint {
+                                               remote-endpoint = <&etm5_out>;
+                                       };
+                               };
+
+                               port@2 {
+                                       reg = <2>;
+                                       cluster1_funnel_in2: endpoint {
+                                               remote-endpoint = <&etm6_out>;
+                                       };
+                               };
+
+                               port@3 {
+                                       reg = <3>;
+                                       cluster1_funnel_in3: endpoint {
+                                               remote-endpoint = <&etm7_out>;
+                                       };
+                               };
+                       };
+               };
+
+               etf@ed002000 {
+                       compatible = "arm,coresight-tmc", "arm,primecell";
+                       reg = <0 0xed002000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+
+                       in-ports {
+                               port {
+                                       cluster1_etf_in: endpoint {
+                                               remote-endpoint =
+                                                       <&cluster1_funnel_out>;
+                                       };
+                               };
+                       };
+
+                       out-ports {
+                               port {
+                                       cluster1_etf_out: endpoint {
+                                               remote-endpoint =
+                                                       <&combo_funnel_in1>;
+                                       };
+                               };
+                       };
+               };
+
+               /* An invisible combo funnel between clusters and top funnel */
+               funnel {
+                       compatible = "arm,coresight-static-funnel";
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+
+                       out-ports {
+                               port {
+                                       combo_funnel_out: endpoint {
+                                               remote-endpoint =
+                                                       <&top_funnel_in>;
+                                       };
+                               };
+                       };
+
+                       in-ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       combo_funnel_in0: endpoint {
+                                               remote-endpoint =
+                                                       <&cluster0_etf_out>;
+                                       };
+                               };
+
+                               port@1 {
+                                       reg = <1>;
+                                       combo_funnel_in1: endpoint {
+                                               remote-endpoint =
+                                                       <&cluster1_etf_out>;
+                                       };
+                               };
+                       };
+               };
+
+               /* Top internals */
+               funnel@ec031000 {
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
+                       reg = <0 0xec031000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+
+                       out-ports {
+                               port {
+                                       top_funnel_out: endpoint {
+                                               remote-endpoint =
+                                                       <&top_etf_in>;
+                                       };
+                               };
+                       };
+
+                       in-ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       top_funnel_in: endpoint {
+                                               remote-endpoint =
+                                                       <&combo_funnel_out>;
+                                       };
+                               };
+                       };
+               };
+
+               etf@ec036000 {
+                       compatible = "arm,coresight-tmc", "arm,primecell";
+                       reg = <0 0xec036000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+
+                       in-ports {
+                               port {
+                                       top_etf_in: endpoint {
+                                               remote-endpoint =
+                                                       <&top_funnel_out>;
+                                       };
+                               };
+                       };
+
+                       out-ports {
+                               port {
+                                       top_etf_out: endpoint {
+                                               remote-endpoint =
+                                                       <&replicator_in>;
+                                       };
+                               };
+                       };
+               };
+
+               replicator {
+                       compatible = "arm,coresight-static-replicator";
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+
+                       in-ports {
+                               port {
+                                       replicator_in: endpoint {
+                                               remote-endpoint =
+                                                       <&top_etf_out>;
+                                       };
+                               };
+                       };
+
+                       out-ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       replicator0_out0: endpoint {
+                                               remote-endpoint = <&etr_in>;
+                                       };
+                               };
+
+                               port@1 {
+                                       reg = <1>;
+                                       replicator0_out1: endpoint {
+                                               remote-endpoint = <&tpiu_in>;
+                                       };
+                               };
+                       };
+               };
+
+               etr@ec033000 {
+                       compatible = "arm,coresight-tmc", "arm,primecell";
+                       reg = <0 0xec033000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+
+                       in-ports {
+                               port {
+                                       etr_in: endpoint {
+                                               remote-endpoint =
+                                                       <&replicator0_out0>;
+                                       };
+                               };
+                       };
+               };
+
+               tpiu@ec032000 {
+                       compatible = "arm,coresight-tpiu", "arm,primecell";
+                       reg = <0 0xec032000 0 0x1000>;
+                       clocks = <&crg_ctrl HI3660_PCLK>;
+                       clock-names = "apb_pclk";
+
+                       in-ports {
+                               port {
+                                       tpiu_in: endpoint {
+                                               remote-endpoint =
+                                                       <&replicator0_out1>;
+                                       };
+                               };
+                       };
+               };
+       };
+};
index aa6a8ad31be2fc1f45ecad2f57c06b74b9d4767f..253cc345f143af54c3f996d03122974d135fdb65 100644 (file)
                };
        };
 };
+
+#include "hi3660-coresight.dtsi"
index 30f54b77c2f1d4bf8564a4c790fdce86bd1ebc8e..651771a73ed66921a561d46a29598c9375f6f9ce 100644 (file)
@@ -11,7 +11,7 @@
 / {
        soc {
                funnel@f6401000 {
-                       compatible = "arm,coresight-funnel", "arm,primecell";
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                        reg = <0 0xf6401000 0 0x1000>;
                        clocks = <&acpu_sctrl HI6220_ACPU_SFT_AT_S>;
                        clock-names = "apb_pclk";
@@ -61,7 +61,7 @@
                };
 
                replicator {
-                       compatible = "arm,coresight-replicator";
+                       compatible = "arm,coresight-static-replicator";
                        clocks = <&acpu_sctrl HI6220_ACPU_SFT_AT_S>;
                        clock-names = "apb_pclk";
 
                };
 
                funnel@f6501000 {
-                       compatible = "arm,coresight-funnel", "arm,primecell";
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                        reg = <0 0xf6501000 0 0x1000>;
                        clocks = <&acpu_sctrl HI6220_ACPU_SFT_AT_S>;
                        clock-names = "apb_pclk";
index 6be019e1888e28339c5d3231b0a29356ba1b6aea..fbcf03f86c967538282f05479476479463a14d0c 100644 (file)
 
        flash@0 {
                reg = <0>;
-               compatible = "winbond,w25q32dw", "jedec,spi-flash";
+               compatible = "jedec,spi-nor";
                spi-max-frequency = <104000000>;
                m25p,fast-read;
-
-               partitions {
-                       compatible = "fixed-partitions";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-
-                       partition@0 {
-                               label = "uboot";
-                               reg = <0 0x180000>;
-                       };
-
-                       partition@180000 {
-                               label = "ubootenv";
-                               reg = <0x180000 0x10000>;
-                       };
-               };
        };
 };
 
index d20d84ce7ca86a08f6044827b8ce62dbf7392967..f34ee87a0f569e1fecab273a28c01b0ccd1e0b49 100644 (file)
                ethernet2 = &cp0_eth2;
        };
 
+       cp0_exp_usb3_0_current_regulator: gpio-regulator {
+               compatible = "regulator-gpio";
+               regulator-name = "cp0-usb3-0-current-regulator";
+               regulator-type = "current";
+               regulator-min-microamp = <500000>;
+               regulator-max-microamp = <900000>;
+               gpios = <&expander0 4 GPIO_ACTIVE_HIGH>;
+               states = <500000 0x0
+                         900000 0x1>;
+               enable-active-high;
+               gpios-states = <0>;
+       };
+
+       cp0_exp_usb3_1_current_regulator: gpio-regulator {
+               compatible = "regulator-gpio";
+               regulator-name = "cp0-usb3-1-current-regulator";
+               regulator-type = "current";
+               regulator-min-microamp = <500000>;
+               regulator-max-microamp = <900000>;
+               gpios = <&expander0 5 GPIO_ACTIVE_HIGH>;
+               states = <500000 0x0
+                         900000 0x1>;
+               enable-active-high;
+               gpios-states = <0>;
+       };
+
        cp0_reg_usb3_0_vbus: cp0-usb3-0-vbus {
                compatible = "regulator-fixed";
                regulator-name = "usb3h0-vbus";
@@ -35,6 +61,7 @@
                regulator-max-microvolt = <5000000>;
                enable-active-high;
                gpio = <&expander0 0 GPIO_ACTIVE_HIGH>;
+               vin-supply = <&cp0_exp_usb3_0_current_regulator>;
        };
 
        cp0_reg_usb3_1_vbus: cp0-usb3-1-vbus {
@@ -44,6 +71,7 @@
                regulator-max-microvolt = <5000000>;
                enable-active-high;
                gpio = <&expander0 1 GPIO_ACTIVE_HIGH>;
+               vin-supply = <&cp0_exp_usb3_1_current_regulator>;
        };
 
        cp0_usb3_0_phy: cp0-usb3-0-phy {
index 9143aa13ceb1180e8c2563ac186fcfe7216b94a2..f275d9420d5be9c68fb003a37b56f9c8270145bb 100644 (file)
@@ -63,6 +63,7 @@
                tx-disable-gpio = <&cp1_gpio1 29 GPIO_ACTIVE_HIGH>;
                pinctrl-names = "default";
                pinctrl-0 = <&cp0_sfp_present_pins &cp1_sfp_tx_disable_pins>;
+               maximum-power-milliwatt = <2000>;
        };
 
        leds {
index 9f4f939ab65f11f61724c20a14ee922b1578e63f..d6e9c014c2f98a9834fcd93dfc534631e7e39342 100644 (file)
@@ -27,6 +27,8 @@
                ethernet1 = &cp0_eth2;
                ethernet2 = &cp1_eth0;
                ethernet3 = &cp1_eth1;
+               i2c1 = &cp0_i2c0;
+               i2c2 = &cp1_i2c0;
        };
 
        cp0_reg_usb3_0_vbus: cp0-usb3-0-vbus {
        };
 };
 
-&i2c0 {
-       status = "okay";
-       clock-frequency = <100000>;
-};
-
 &spi0 {
        status = "okay";
 
index 329f8ceeebea1427b13c41b45bec8bea4ed22f73..205071b45a324988ed140c44204850d37a9a4843 100644 (file)
        num-lanes = <4>;
        num-viewport = <8>;
        reset-gpios = <&cp0_gpio2 20 GPIO_ACTIVE_LOW>;
+       ranges = <0x81000000 0x0 0xf9010000 0x0 0xf9010000 0x0 0x10000
+                 0x82000000 0x0 0xc0000000 0x0 0xc0000000 0x0 0x20000000>;
        status = "okay";
 };
 
index 861fd21922c430945fb656a307d2b321620ae132..9024a2d9db070d59c0c3fa497b5af5de81b4f6db 100644 (file)
                        compatible = "arm,cortex-a72";
                        reg = <0x000>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
                };
                cpu1: cpu@1 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a72";
                        reg = <0x001>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
                };
        };
 };
index 2baafe12ebd41699c116036ca82082efb539667d..ea13ae78f50d3a3faade97c54825d01d24007794 100644 (file)
                        compatible = "arm,cortex-a72";
                        reg = <0x000>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
                };
                cpu1: cpu@1 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a72";
                        reg = <0x001>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
                };
                cpu2: cpu@100 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a72";
                        reg = <0x100>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
                };
                cpu3: cpu@101 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a72";
                        reg = <0x101>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
                };
        };
+
 };
index 91dad7e4ee59e3bff719fcec28097d064f2e5931..96228f93b2722af71107247c87dd7eefa6958c22 100644 (file)
         *
         * Only one thermal zone per AP/CP may trigger interrupts at a time, the
         * first one that will have a critical trip point will be chosen.
-        *
-        * The cooling maps are always empty as there are no cooling devices.
         */
        thermal-zones {
                ap_thermal_ic: ap-thermal-ic {
                        cooling-maps { };
                };
 
-               ap_thermal_cpu1: ap-thermal-cpu1 {
+               ap_thermal_cpu0: ap-thermal-cpu0 {
                        polling-delay-passive = <1000>;
                        polling-delay = <1000>;
 
                        thermal-sensors = <&ap_thermal 1>;
 
-                       trips { };
-                       cooling-maps { };
+                       trips {
+                               cpu0_hot: cpu0-hot {
+                                       temperature = <85000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                               cpu0_emerg: cpu0-emerg {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                       };
+
+                       cooling-maps {
+                               map0_hot: map0-hot {
+                                       trip = <&cpu0_hot>;
+                                       cooling-device = <&cpu0 1 2>,
+                                               <&cpu1 1 2>;
+                               };
+                               map0_emerg: map0-ermerg {
+                                       trip = <&cpu0_emerg>;
+                                       cooling-device = <&cpu0 3 3>,
+                                               <&cpu1 3 3>;
+                               };
+                       };
                };
 
-               ap_thermal_cpu2: ap-thermal-cpu2 {
+               ap_thermal_cpu1: ap-thermal-cpu1 {
                        polling-delay-passive = <1000>;
                        polling-delay = <1000>;
 
                        thermal-sensors = <&ap_thermal 2>;
 
-                       trips { };
-                       cooling-maps { };
+                       trips {
+                               cpu1_hot: cpu1-hot {
+                                       temperature = <85000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                               cpu1_emerg: cpu1-emerg {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                       };
+
+                       cooling-maps {
+                               map1_hot: map1-hot {
+                                       trip = <&cpu1_hot>;
+                                       cooling-device = <&cpu0 1 2>,
+                                               <&cpu1 1 2>;
+                               };
+                               map1_emerg: map1-emerg {
+                                       trip = <&cpu1_emerg>;
+                                       cooling-device = <&cpu0 3 3>,
+                                               <&cpu1 3 3>;
+                               };
+                       };
                };
 
-               ap_thermal_cpu3: ap-thermal-cpu3 {
+               ap_thermal_cpu2: ap-thermal-cpu2 {
                        polling-delay-passive = <1000>;
                        polling-delay = <1000>;
 
                        thermal-sensors = <&ap_thermal 3>;
 
-                       trips { };
-                       cooling-maps { };
+                       trips {
+                               cpu2_hot: cpu2-hot {
+                                       temperature = <85000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                               cpu2_emerg: cpu2-emerg {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                       };
+
+                       cooling-maps {
+                               map2_hot: map2-hot {
+                                       trip = <&cpu2_hot>;
+                                       cooling-device = <&cpu2 1 2>,
+                                               <&cpu3 1 2>;
+                               };
+                               map2_emerg: map2-emerg {
+                                       trip = <&cpu2_emerg>;
+                                       cooling-device = <&cpu2 3 3>,
+                                               <&cpu3 3 3>;
+                               };
+                       };
                };
 
-               ap_thermal_cpu4: ap-thermal-cpu4 {
+               ap_thermal_cpu3: ap-thermal-cpu3 {
                        polling-delay-passive = <1000>;
                        polling-delay = <1000>;
 
                        thermal-sensors = <&ap_thermal 4>;
 
-                       trips { };
-                       cooling-maps { };
+                       trips {
+                               cpu3_hot: cpu3-hot {
+                                       temperature = <85000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                               cpu3_emerg: cpu3-emerg {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                       };
+
+                       cooling-maps {
+                               map3_hot: map3-bhot {
+                                       trip = <&cpu3_hot>;
+                                       cooling-device = <&cpu2 1 2>,
+                                               <&cpu3 1 2>;
+                               };
+                               map3_emerg: map3-emerg {
+                                       trip = <&cpu3_emerg>;
+                                       cooling-device = <&cpu2 3 3>,
+                                               <&cpu3 3 3>;
+                               };
+                       };
                };
        };
 };
index 4d6e4a097f720e0f7ae39b3f6b79e6501458efc9..f71afb1de18f88a5373756e60c16622a2c825e3f 100644 (file)
                                        <85 IRQ_TYPE_LEVEL_HIGH>,
                                        <84 IRQ_TYPE_LEVEL_HIGH>,
                                        <83 IRQ_TYPE_LEVEL_HIGH>;
+                               #interrupt-cells = <2>;
                                status = "disabled";
                        };
 
                                        <81 IRQ_TYPE_LEVEL_HIGH>,
                                        <80 IRQ_TYPE_LEVEL_HIGH>,
                                        <79 IRQ_TYPE_LEVEL_HIGH>;
+                               #interrupt-cells = <2>;
                                status = "disabled";
                        };
                };
index e8f952fb279b9dddce46d455483e7c94ef0884c2..458bbc422a943ca4229fa72d8dfc45f08098cee7 100644 (file)
@@ -7,3 +7,4 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt6797-x20-dev.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt7622-rfb1.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt7622-bananapi-bpi-r64.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8173-evb.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-evb.dtb
diff --git a/arch/arm64/boot/dts/mediatek/mt8183-evb.dts b/arch/arm64/boot/dts/mediatek/mt8183-evb.dts
new file mode 100644 (file)
index 0000000..d8e555c
--- /dev/null
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ * Author: Ben Ho <ben.ho@mediatek.com>
+ *        Erin Lo <erin.lo@mediatek.com>
+ */
+
+/dts-v1/;
+#include "mt8183.dtsi"
+
+/ {
+       model = "MediaTek MT8183 evaluation board";
+       compatible = "mediatek,mt8183-evb", "mediatek,mt8183";
+
+       aliases {
+               serial0 = &uart0;
+       };
+
+       memory@40000000 {
+               device_type = "memory";
+               reg = <0 0x40000000 0 0x80000000>;
+       };
+
+       chosen {
+               stdout-path = "serial0:921600n8";
+       };
+};
+
+&auxadc {
+       status = "okay";
+};
+
+&pio {
+       spi_pins_0: spi0{
+               pins_spi{
+                       pinmux = <PINMUX_GPIO85__FUNC_SPI0_MI>,
+                                <PINMUX_GPIO86__FUNC_SPI0_CSB>,
+                                <PINMUX_GPIO87__FUNC_SPI0_MO>,
+                                <PINMUX_GPIO88__FUNC_SPI0_CLK>;
+                       bias-disable;
+               };
+       };
+
+       spi_pins_1: spi1{
+               pins_spi{
+                       pinmux = <PINMUX_GPIO161__FUNC_SPI1_A_MI>,
+                                <PINMUX_GPIO162__FUNC_SPI1_A_CSB>,
+                                <PINMUX_GPIO163__FUNC_SPI1_A_MO>,
+                                <PINMUX_GPIO164__FUNC_SPI1_A_CLK>;
+                       bias-disable;
+               };
+       };
+
+       spi_pins_2: spi2{
+               pins_spi{
+                       pinmux = <PINMUX_GPIO0__FUNC_SPI2_CSB>,
+                                <PINMUX_GPIO1__FUNC_SPI2_MO>,
+                                <PINMUX_GPIO2__FUNC_SPI2_CLK>,
+                                <PINMUX_GPIO94__FUNC_SPI2_MI>;
+                       bias-disable;
+               };
+       };
+
+       spi_pins_3: spi3{
+               pins_spi{
+                       pinmux = <PINMUX_GPIO21__FUNC_SPI3_MI>,
+                                <PINMUX_GPIO22__FUNC_SPI3_CSB>,
+                                <PINMUX_GPIO23__FUNC_SPI3_MO>,
+                                <PINMUX_GPIO24__FUNC_SPI3_CLK>;
+                       bias-disable;
+               };
+       };
+
+       spi_pins_4: spi4{
+               pins_spi{
+                       pinmux = <PINMUX_GPIO17__FUNC_SPI4_MI>,
+                                <PINMUX_GPIO18__FUNC_SPI4_CSB>,
+                                <PINMUX_GPIO19__FUNC_SPI4_MO>,
+                                <PINMUX_GPIO20__FUNC_SPI4_CLK>;
+                       bias-disable;
+               };
+       };
+
+       spi_pins_5: spi5{
+               pins_spi{
+                       pinmux = <PINMUX_GPIO13__FUNC_SPI5_MI>,
+                                <PINMUX_GPIO14__FUNC_SPI5_CSB>,
+                                <PINMUX_GPIO15__FUNC_SPI5_MO>,
+                                <PINMUX_GPIO16__FUNC_SPI5_CLK>;
+                       bias-disable;
+               };
+       };
+};
+
+&spi0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi_pins_0>;
+       mediatek,pad-select = <0>;
+       status = "okay";
+};
+
+&spi1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi_pins_1>;
+       mediatek,pad-select = <0>;
+       status = "okay";
+};
+
+&spi2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi_pins_2>;
+       mediatek,pad-select = <0>;
+       status = "okay";
+};
+
+&spi3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi_pins_3>;
+       mediatek,pad-select = <0>;
+       status = "okay";
+};
+
+&spi4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi_pins_4>;
+       mediatek,pad-select = <0>;
+       status = "okay";
+};
+
+&spi5 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi_pins_5>;
+       mediatek,pad-select = <0>;
+       status = "okay";
+
+};
+
+&uart0 {
+       status = "okay";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi
new file mode 100644 (file)
index 0000000..c2749c4
--- /dev/null
@@ -0,0 +1,447 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright (c) 2018 MediaTek Inc.
+ * Author: Ben Ho <ben.ho@mediatek.com>
+ *        Erin Lo <erin.lo@mediatek.com>
+ */
+
+#include <dt-bindings/clock/mt8183-clk.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+#include "mt8183-pinfunc.h"
+
+/ {
+       compatible = "mediatek,mt8183";
+       interrupt-parent = <&sysirq>;
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu-map {
+                       cluster0 {
+                               core0 {
+                                       cpu = <&cpu0>;
+                               };
+                               core1 {
+                                       cpu = <&cpu1>;
+                               };
+                               core2 {
+                                       cpu = <&cpu2>;
+                               };
+                               core3 {
+                                       cpu = <&cpu3>;
+                               };
+                       };
+
+                       cluster1 {
+                               core0 {
+                                       cpu = <&cpu4>;
+                               };
+                               core1 {
+                                       cpu = <&cpu5>;
+                               };
+                               core2 {
+                                       cpu = <&cpu6>;
+                               };
+                               core3 {
+                                       cpu = <&cpu7>;
+                               };
+                       };
+               };
+
+               cpu0: cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a53";
+                       reg = <0x000>;
+                       enable-method = "psci";
+                       capacity-dmips-mhz = <741>;
+               };
+
+               cpu1: cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a53";
+                       reg = <0x001>;
+                       enable-method = "psci";
+                       capacity-dmips-mhz = <741>;
+               };
+
+               cpu2: cpu@2 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a53";
+                       reg = <0x002>;
+                       enable-method = "psci";
+                       capacity-dmips-mhz = <741>;
+               };
+
+               cpu3: cpu@3 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a53";
+                       reg = <0x003>;
+                       enable-method = "psci";
+                       capacity-dmips-mhz = <741>;
+               };
+
+               cpu4: cpu@100 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a73";
+                       reg = <0x100>;
+                       enable-method = "psci";
+                       capacity-dmips-mhz = <1024>;
+               };
+
+               cpu5: cpu@101 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a73";
+                       reg = <0x101>;
+                       enable-method = "psci";
+                       capacity-dmips-mhz = <1024>;
+               };
+
+               cpu6: cpu@102 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a73";
+                       reg = <0x102>;
+                       enable-method = "psci";
+                       capacity-dmips-mhz = <1024>;
+               };
+
+               cpu7: cpu@103 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a73";
+                       reg = <0x103>;
+                       enable-method = "psci";
+                       capacity-dmips-mhz = <1024>;
+               };
+       };
+
+       pmu-a53 {
+               compatible = "arm,cortex-a53-pmu";
+               interrupt-parent = <&gic>;
+               interrupts = <GIC_PPI 7 IRQ_TYPE_LEVEL_LOW &ppi_cluster0>;
+       };
+
+       pmu-a73 {
+               compatible = "arm,cortex-a73-pmu";
+               interrupt-parent = <&gic>;
+               interrupts = <GIC_PPI 7 IRQ_TYPE_LEVEL_LOW &ppi_cluster1>;
+       };
+
+       psci {
+               compatible      = "arm,psci-1.0";
+               method          = "smc";
+       };
+
+       clk26m: oscillator {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <26000000>;
+               clock-output-names = "clk26m";
+       };
+
+       timer {
+               compatible = "arm,armv8-timer";
+               interrupt-parent = <&gic>;
+               interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_LOW 0>,
+                            <GIC_PPI 14 IRQ_TYPE_LEVEL_LOW 0>,
+                            <GIC_PPI 11 IRQ_TYPE_LEVEL_LOW 0>,
+                            <GIC_PPI 10 IRQ_TYPE_LEVEL_LOW 0>;
+       };
+
+       soc {
+               #address-cells = <2>;
+               #size-cells = <2>;
+               compatible = "simple-bus";
+               ranges;
+
+               soc_data: soc_data@8000000 {
+                       compatible = "mediatek,mt8183-efuse",
+                                    "mediatek,efuse";
+                       reg = <0 0x08000000 0 0x0010>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       status = "disabled";
+               };
+
+               gic: interrupt-controller@c000000 {
+                       compatible = "arm,gic-v3";
+                       #interrupt-cells = <4>;
+                       interrupt-parent = <&gic>;
+                       interrupt-controller;
+                       reg = <0 0x0c000000 0 0x40000>,  /* GICD */
+                             <0 0x0c100000 0 0x200000>, /* GICR */
+                             <0 0x0c400000 0 0x2000>,   /* GICC */
+                             <0 0x0c410000 0 0x1000>,   /* GICH */
+                             <0 0x0c420000 0 0x2000>;   /* GICV */
+
+                       interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH 0>;
+                       ppi-partitions {
+                               ppi_cluster0: interrupt-partition-0 {
+                                       affinity = <&cpu0 &cpu1 &cpu2 &cpu3>;
+                               };
+                               ppi_cluster1: interrupt-partition-1 {
+                                       affinity = <&cpu4 &cpu5 &cpu6 &cpu7>;
+                               };
+                       };
+               };
+
+               mcucfg: syscon@c530000 {
+                       compatible = "mediatek,mt8183-mcucfg", "syscon";
+                       reg = <0 0x0c530000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               sysirq: interrupt-controller@c530a80 {
+                       compatible = "mediatek,mt8183-sysirq",
+                                    "mediatek,mt6577-sysirq";
+                       interrupt-controller;
+                       #interrupt-cells = <3>;
+                       interrupt-parent = <&gic>;
+                       reg = <0 0x0c530a80 0 0x50>;
+               };
+
+               topckgen: syscon@10000000 {
+                       compatible = "mediatek,mt8183-topckgen", "syscon";
+                       reg = <0 0x10000000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               infracfg: syscon@10001000 {
+                       compatible = "mediatek,mt8183-infracfg", "syscon";
+                       reg = <0 0x10001000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               pio: pinctrl@10005000 {
+                       compatible = "mediatek,mt8183-pinctrl";
+                       reg = <0 0x10005000 0 0x1000>,
+                             <0 0x11f20000 0 0x1000>,
+                             <0 0x11e80000 0 0x1000>,
+                             <0 0x11e70000 0 0x1000>,
+                             <0 0x11e90000 0 0x1000>,
+                             <0 0x11d30000 0 0x1000>,
+                             <0 0x11d20000 0 0x1000>,
+                             <0 0x11c50000 0 0x1000>,
+                             <0 0x11f30000 0 0x1000>,
+                             <0 0x1000b000 0 0x1000>;
+                       reg-names = "iocfg0", "iocfg1", "iocfg2",
+                                   "iocfg3", "iocfg4", "iocfg5",
+                                   "iocfg6", "iocfg7", "iocfg8",
+                                   "eint";
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       gpio-ranges = <&pio 0 0 192>;
+                       interrupt-controller;
+                       interrupts = <GIC_SPI 177 IRQ_TYPE_LEVEL_HIGH>;
+                       #interrupt-cells = <2>;
+               };
+
+               apmixedsys: syscon@1000c000 {
+                       compatible = "mediatek,mt8183-apmixedsys", "syscon";
+                       reg = <0 0x1000c000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               pwrap: pwrap@1000d000 {
+                       compatible = "mediatek,mt8183-pwrap";
+                       reg = <0 0x1000d000 0 0x1000>;
+                       reg-names = "pwrap";
+                       interrupts = <GIC_SPI 209 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&topckgen CLK_TOP_MUX_PMICSPI>,
+                                <&infracfg CLK_INFRA_PMIC_AP>;
+                       clock-names = "spi", "wrap";
+               };
+
+               auxadc: auxadc@11001000 {
+                       compatible = "mediatek,mt8183-auxadc",
+                                    "mediatek,mt8173-auxadc";
+                       reg = <0 0x11001000 0 0x1000>;
+                       clocks = <&infracfg CLK_INFRA_AUXADC>;
+                       clock-names = "main";
+                       #io-channel-cells = <1>;
+                       status = "disabled";
+               };
+
+               uart0: serial@11002000 {
+                       compatible = "mediatek,mt8183-uart",
+                                    "mediatek,mt6577-uart";
+                       reg = <0 0x11002000 0 0x1000>;
+                       interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_LOW>;
+                       clocks = <&clk26m>, <&infracfg CLK_INFRA_UART0>;
+                       clock-names = "baud", "bus";
+                       status = "disabled";
+               };
+
+               uart1: serial@11003000 {
+                       compatible = "mediatek,mt8183-uart",
+                                    "mediatek,mt6577-uart";
+                       reg = <0 0x11003000 0 0x1000>;
+                       interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_LOW>;
+                       clocks = <&clk26m>, <&infracfg CLK_INFRA_UART1>;
+                       clock-names = "baud", "bus";
+                       status = "disabled";
+               };
+
+               uart2: serial@11004000 {
+                       compatible = "mediatek,mt8183-uart",
+                                    "mediatek,mt6577-uart";
+                       reg = <0 0x11004000 0 0x1000>;
+                       interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_LOW>;
+                       clocks = <&clk26m>, <&infracfg CLK_INFRA_UART2>;
+                       clock-names = "baud", "bus";
+                       status = "disabled";
+               };
+
+               spi0: spi@1100a000 {
+                       compatible = "mediatek,mt8183-spi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0 0x1100a000 0 0x1000>;
+                       interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_LOW>;
+                       clocks = <&topckgen CLK_TOP_SYSPLL_D5_D2>,
+                                <&topckgen CLK_TOP_MUX_SPI>,
+                                <&infracfg CLK_INFRA_SPI0>;
+                       clock-names = "parent-clk", "sel-clk", "spi-clk";
+                       status = "disabled";
+               };
+
+               spi1: spi@11010000 {
+                       compatible = "mediatek,mt8183-spi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0 0x11010000 0 0x1000>;
+                       interrupts = <GIC_SPI 124 IRQ_TYPE_LEVEL_LOW>;
+                       clocks = <&topckgen CLK_TOP_SYSPLL_D5_D2>,
+                                <&topckgen CLK_TOP_MUX_SPI>,
+                                <&infracfg CLK_INFRA_SPI1>;
+                       clock-names = "parent-clk", "sel-clk", "spi-clk";
+                       status = "disabled";
+               };
+
+               spi2: spi@11012000 {
+                       compatible = "mediatek,mt8183-spi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0 0x11012000 0 0x1000>;
+                       interrupts = <GIC_SPI 129 IRQ_TYPE_LEVEL_LOW>;
+                       clocks = <&topckgen CLK_TOP_SYSPLL_D5_D2>,
+                                <&topckgen CLK_TOP_MUX_SPI>,
+                                <&infracfg CLK_INFRA_SPI2>;
+                       clock-names = "parent-clk", "sel-clk", "spi-clk";
+                       status = "disabled";
+               };
+
+               spi3: spi@11013000 {
+                       compatible = "mediatek,mt8183-spi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0 0x11013000 0 0x1000>;
+                       interrupts = <GIC_SPI 130 IRQ_TYPE_LEVEL_LOW>;
+                       clocks = <&topckgen CLK_TOP_SYSPLL_D5_D2>,
+                                <&topckgen CLK_TOP_MUX_SPI>,
+                                <&infracfg CLK_INFRA_SPI3>;
+                       clock-names = "parent-clk", "sel-clk", "spi-clk";
+                       status = "disabled";
+               };
+
+               spi4: spi@11018000 {
+                       compatible = "mediatek,mt8183-spi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0 0x11018000 0 0x1000>;
+                       interrupts = <GIC_SPI 134 IRQ_TYPE_LEVEL_LOW>;
+                       clocks = <&topckgen CLK_TOP_SYSPLL_D5_D2>,
+                                <&topckgen CLK_TOP_MUX_SPI>,
+                                <&infracfg CLK_INFRA_SPI4>;
+                       clock-names = "parent-clk", "sel-clk", "spi-clk";
+                       status = "disabled";
+               };
+
+               spi5: spi@11019000 {
+                       compatible = "mediatek,mt8183-spi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0 0x11019000 0 0x1000>;
+                       interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_LOW>;
+                       clocks = <&topckgen CLK_TOP_SYSPLL_D5_D2>,
+                                <&topckgen CLK_TOP_MUX_SPI>,
+                                <&infracfg CLK_INFRA_SPI5>;
+                       clock-names = "parent-clk", "sel-clk", "spi-clk";
+                       status = "disabled";
+               };
+
+               audiosys: syscon@11220000 {
+                       compatible = "mediatek,mt8183-audiosys", "syscon";
+                       reg = <0 0x11220000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               efuse: efuse@11f10000 {
+                       compatible = "mediatek,mt8183-efuse",
+                                    "mediatek,efuse";
+                       reg = <0 0x11f10000 0 0x1000>;
+               };
+
+               mfgcfg: syscon@13000000 {
+                       compatible = "mediatek,mt8183-mfgcfg", "syscon";
+                       reg = <0 0x13000000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               mmsys: syscon@14000000 {
+                       compatible = "mediatek,mt8183-mmsys", "syscon";
+                       reg = <0 0x14000000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               imgsys: syscon@15020000 {
+                       compatible = "mediatek,mt8183-imgsys", "syscon";
+                       reg = <0 0x15020000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               vdecsys: syscon@16000000 {
+                       compatible = "mediatek,mt8183-vdecsys", "syscon";
+                       reg = <0 0x16000000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               vencsys: syscon@17000000 {
+                       compatible = "mediatek,mt8183-vencsys", "syscon";
+                       reg = <0 0x17000000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               ipu_conn: syscon@19000000 {
+                       compatible = "mediatek,mt8183-ipu_conn", "syscon";
+                       reg = <0 0x19000000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               ipu_adl: syscon@19010000 {
+                       compatible = "mediatek,mt8183-ipu_adl", "syscon";
+                       reg = <0 0x19010000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               ipu_core0: syscon@19180000 {
+                       compatible = "mediatek,mt8183-ipu_core0", "syscon";
+                       reg = <0 0x19180000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               ipu_core1: syscon@19280000 {
+                       compatible = "mediatek,mt8183-ipu_core1", "syscon";
+                       reg = <0 0x19280000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               camsys: syscon@1a000000 {
+                       compatible = "mediatek,mt8183-camsys", "syscon";
+                       reg = <0 0x1a000000 0 0x1000>;
+                       #clock-cells = <1>;
+               };
+       };
+};
index 14d7fea82daf75d60a7aae908e96d906aa34e539..bdace01561babadbf9cb5e8dc46fb829e5c98b88 100644 (file)
@@ -7,18 +7,70 @@
 #include "tegra186-p3310.dtsi"
 
 / {
-       model = "NVIDIA Tegra186 P2771-0000 Development Board";
+       model = "NVIDIA Jetson TX2 Developer Kit";
        compatible = "nvidia,p2771-0000", "nvidia,tegra186";
 
+       aconnect {
+               status = "okay";
+
+               dma-controller@2930000 {
+                       status = "okay";
+               };
+
+               interrupt-controller@2a40000 {
+                       status = "okay";
+               };
+       };
+
        i2c@3160000 {
                power-monitor@42 {
                        compatible = "ti,ina3221";
                        reg = <0x42>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       channel@0 {
+                               reg = <0x0>;
+                               label = "VDD_MUX";
+                               shunt-resistor-micro-ohms = <20000>;
+                       };
+
+                       channel@1 {
+                               reg = <0x1>;
+                               label = "VDD_5V0_IO_SYS";
+                               shunt-resistor-micro-ohms = <5000>;
+                       };
+
+                       channel@2 {
+                               reg = <0x2>;
+                               label = "VDD_3V3_SYS";
+                               shunt-resistor-micro-ohms = <10000>;
+                       };
                };
 
                power-monitor@43 {
                        compatible = "ti,ina3221";
                        reg = <0x43>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       channel@0 {
+                               reg = <0x0>;
+                               label = "VDD_3V3_IO_SLP";
+                               shunt-resistor-micro-ohms = <10000>;
+                       };
+
+                       channel@1 {
+                               reg = <0x1>;
+                               label = "VDD_1V8_IO";
+                               shunt-resistor-micro-ohms = <10000>;
+                       };
+
+                       channel@2 {
+                               reg = <0x2>;
+                               label = "VDD_M2_IN";
+                               shunt-resistor-micro-ohms = <10000>;
+                       };
                };
 
                exp1: gpio@74 {
@@ -31,6 +83,8 @@
 
                        #gpio-cells = <2>;
                        gpio-controller;
+
+                       vcc-supply = <&vdd_3v3_sys>;
                };
 
                exp2: gpio@77 {
@@ -43,6 +97,8 @@
 
                        #gpio-cells = <2>;
                        gpio-controller;
+
+                       vcc-supply = <&vdd_1v8>;
                };
        };
 
                phy-names = "usb2-0", "usb2-1", "usb3-0";
        };
 
+       i2c@c250000 {
+               /* carrier board ID EEPROM */
+               eeprom@57 {
+                       compatible = "atmel,24c02";
+                       reg = <0x57>;
+
+                       address-bits = <8>;
+                       page-size = <8>;
+                       size = <256>;
+                       read-only;
+               };
+       };
+
        pcie@10003000 {
                status = "okay";
 
                        regulator-min-microvolt = <5000000>;
                        regulator-max-microvolt = <5000000>;
 
-                       gpio = <&gpio TEGRA_MAIN_GPIO(L, 4) GPIO_ACTIVE_HIGH>;
+                       gpio = <&gpio TEGRA186_MAIN_GPIO(L, 4) GPIO_ACTIVE_HIGH>;
                        enable-active-high;
 
                        vin-supply = <&vdd_5v0_sys>;
                        regulator-min-microvolt = <5000000>;
                        regulator-max-microvolt = <5000000>;
 
-                       gpio = <&gpio TEGRA_MAIN_GPIO(L, 5) GPIO_ACTIVE_HIGH>;
+                       gpio = <&gpio TEGRA186_MAIN_GPIO(L, 5) GPIO_ACTIVE_HIGH>;
                        enable-active-high;
 
                        vin-supply = <&vdd_5v0_sys>;
index 64686b033c3885902b2cc3d0ce5e61a459ce2fb1..5e18acf5cfad872bd5323f4c452bb3b4acdfc55a 100644 (file)
@@ -4,7 +4,7 @@
 #include <dt-bindings/mfd/max77620.h>
 
 / {
-       model = "NVIDIA Tegra186 P3310 Processor Module";
+       model = "NVIDIA Jetson TX2";
        compatible = "nvidia,p3310", "nvidia,tegra186";
 
        aliases {
                power-monitor@40 {
                        compatible = "ti,ina3221";
                        reg = <0x40>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       channel@0 {
+                               reg = <0x0>;
+                               label = "VDD_SYS_GPU";
+                               shunt-resistor-micro-ohms = <10000>;
+                       };
+
+                       channel@1 {
+                               reg = <0x1>;
+                               label = "VDD_SYS_SOC";
+                               shunt-resistor-micro-ohms = <10000>;
+                       };
+
+                       channel@2 {
+                               reg = <0x2>;
+                               label = "VDD_3V8_WIFI";
+                               shunt-resistor-micro-ohms = <10000>;
+                       };
                };
 
                power-monitor@41 {
                        compatible = "ti,ina3221";
                        reg = <0x41>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       channel@0 {
+                               reg = <0x0>;
+                               label = "VDD_IN";
+                               shunt-resistor-micro-ohms = <5000>;
+                       };
+
+                       channel@1 {
+                               reg = <0x1>;
+                               label = "VDD_SYS_CPU";
+                               shunt-resistor-micro-ohms = <10000>;
+                       };
+
+                       channel@2 {
+                               reg = <0x2>;
+                               label = "VDD_5V0_DDR";
+                               shunt-resistor-micro-ohms = <10000>;
+                       };
                };
        };
 
 
        i2c@c250000 {
                status = "okay";
+
+               /* module ID EEPROM */
+               eeprom@50 {
+                       compatible = "atmel,24c02";
+                       reg = <0x50>;
+
+                       address-bits = <8>;
+                       page-size = <8>;
+                       size = <256>;
+                       read-only;
+               };
        };
 
        rtc@c2a0000 {
index 426ac0bdf6a6f7789f9a3b8874d0c00089b159e1..47cd831fcf4456f3537f84eeee0490917eca514c 100644 (file)
                snps,rxpbl = <8>;
        };
 
+       aconnect {
+               compatible = "nvidia,tegra186-aconnect",
+                            "nvidia,tegra210-aconnect";
+               clocks = <&bpmp TEGRA186_CLK_APE>,
+                        <&bpmp TEGRA186_CLK_APB2APE>;
+               clock-names = "ape", "apb2ape";
+               power-domains = <&bpmp TEGRA186_POWER_DOMAIN_AUD>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x02900000 0x0 0x02900000 0x200000>;
+               status = "disabled";
+
+               dma-controller@2930000 {
+                       compatible = "nvidia,tegra186-adma";
+                       reg = <0x02930000 0x20000>;
+                       interrupt-parent = <&agic>;
+                       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 4 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>,
+                                     <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 26 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
+                                     <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+                       #dma-cells = <1>;
+                       clocks = <&bpmp TEGRA186_CLK_AHUB>;
+                       clock-names = "d_audio";
+                       status = "disabled";
+               };
+
+               agic: interrupt-controller@2a40000 {
+                       compatible = "nvidia,tegra186-agic",
+                                    "nvidia,tegra210-agic";
+                       #interrupt-cells = <3>;
+                       interrupt-controller;
+                       reg = <0x02a41000 0x1000>,
+                             <0x02a42000 0x2000>;
+                       interrupts = <GIC_SPI 145
+                               (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
+                       clocks = <&bpmp TEGRA186_CLK_APE>;
+                       clock-names = "clk";
+                       status = "disabled";
+               };
+       };
+
        memory-controller@2c00000 {
                compatible = "nvidia,tegra186-mc";
                reg = <0x0 0x02c00000 0x0 0xb0000>;
                clock-names = "div-clk";
                resets = <&bpmp TEGRA186_RESET_I2C4>;
                reset-names = "i2c";
+               pinctrl-names = "default", "idle";
+               pinctrl-0 = <&state_dpaux1_i2c>;
+               pinctrl-1 = <&state_dpaux1_off>;
                status = "disabled";
        };
 
                clock-names = "div-clk";
                resets = <&bpmp TEGRA186_RESET_I2C6>;
                reset-names = "i2c";
+               pinctrl-names = "default", "idle";
+               pinctrl-0 = <&state_dpaux_i2c>;
+               pinctrl-1 = <&state_dpaux_off>;
                status = "disabled";
        };
 
                };
        };
 
+       bpmp: bpmp {
+               compatible = "nvidia,tegra186-bpmp";
+               iommus = <&smmu TEGRA186_SID_BPMP>;
+               mboxes = <&hsp_top0 TEGRA_HSP_MBOX_TYPE_DB
+                                   TEGRA_HSP_DB_MASTER_BPMP>;
+               shmem = <&cpu_bpmp_tx &cpu_bpmp_rx>;
+               #clock-cells = <1>;
+               #reset-cells = <1>;
+               #power-domain-cells = <1>;
+
+               bpmp_i2c: i2c {
+                       compatible = "nvidia,tegra186-bpmp-i2c";
+                       nvidia,bpmp-bus-id = <5>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               bpmp_thermal: thermal {
+                       compatible = "nvidia,tegra186-bpmp-thermal";
+                       #thermal-sensor-cells = <1>;
+               };
+       };
+
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
                cpu@0 {
                        compatible = "nvidia,tegra186-denver";
                        device_type = "cpu";
+                       i-cache-size = <0x20000>;
+                       i-cache-line-size = <64>;
+                       i-cache-sets = <512>;
+                       d-cache-size = <0x10000>;
+                       d-cache-line-size = <64>;
+                       d-cache-sets = <256>;
+                       next-level-cache = <&L2_DENVER>;
                        reg = <0x000>;
                };
 
                cpu@1 {
                        compatible = "nvidia,tegra186-denver";
                        device_type = "cpu";
+                       i-cache-size = <0x20000>;
+                       i-cache-line-size = <64>;
+                       i-cache-sets = <512>;
+                       d-cache-size = <0x10000>;
+                       d-cache-line-size = <64>;
+                       d-cache-sets = <256>;
+                       next-level-cache = <&L2_DENVER>;
                        reg = <0x001>;
                };
 
                cpu@2 {
                        compatible = "arm,cortex-a57";
                        device_type = "cpu";
+                       i-cache-size = <0xC000>;
+                       i-cache-line-size = <64>;
+                       i-cache-sets = <256>;
+                       d-cache-size = <0x8000>;
+                       d-cache-line-size = <64>;
+                       d-cache-sets = <256>;
+                       next-level-cache = <&L2_A57>;
                        reg = <0x100>;
                };
 
                cpu@3 {
                        compatible = "arm,cortex-a57";
                        device_type = "cpu";
+                       i-cache-size = <0xC000>;
+                       i-cache-line-size = <64>;
+                       i-cache-sets = <256>;
+                       d-cache-size = <0x8000>;
+                       d-cache-line-size = <64>;
+                       d-cache-sets = <256>;
+                       next-level-cache = <&L2_A57>;
                        reg = <0x101>;
                };
 
                cpu@4 {
                        compatible = "arm,cortex-a57";
                        device_type = "cpu";
+                       i-cache-size = <0xC000>;
+                       i-cache-line-size = <64>;
+                       i-cache-sets = <256>;
+                       d-cache-size = <0x8000>;
+                       d-cache-line-size = <64>;
+                       d-cache-sets = <256>;
+                       next-level-cache = <&L2_A57>;
                        reg = <0x102>;
                };
 
                cpu@5 {
                        compatible = "arm,cortex-a57";
                        device_type = "cpu";
+                       i-cache-size = <0xC000>;
+                       i-cache-line-size = <64>;
+                       i-cache-sets = <256>;
+                       d-cache-size = <0x8000>;
+                       d-cache-line-size = <64>;
+                       d-cache-sets = <256>;
+                       next-level-cache = <&L2_A57>;
                        reg = <0x103>;
                };
-       };
 
-       bpmp: bpmp {
-               compatible = "nvidia,tegra186-bpmp";
-               iommus = <&smmu TEGRA186_SID_BPMP>;
-               mboxes = <&hsp_top0 TEGRA_HSP_MBOX_TYPE_DB
-                                   TEGRA_HSP_DB_MASTER_BPMP>;
-               shmem = <&cpu_bpmp_tx &cpu_bpmp_rx>;
-               #clock-cells = <1>;
-               #reset-cells = <1>;
-               #power-domain-cells = <1>;
-
-               bpmp_i2c: i2c {
-                       compatible = "nvidia,tegra186-bpmp-i2c";
-                       nvidia,bpmp-bus-id = <5>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       status = "disabled";
+               L2_DENVER: l2-cache0 {
+                       compatible = "cache";
+                       cache-unified;
+                       cache-level = <2>;
+                       cache-size = <0x200000>;
+                       cache-line-size = <64>;
+                       cache-sets = <2048>;
                };
 
-               bpmp_thermal: thermal {
-                       compatible = "nvidia,tegra186-bpmp-thermal";
-                       #thermal-sensor-cells = <1>;
+               L2_A57: l2-cache1 {
+                       compatible = "cache";
+                       cache-unified;
+                       cache-level = <2>;
+                       cache-size = <0x200000>;
+                       cache-line-size = <64>;
+                       cache-sets = <2048>;
                };
        };
 
                             <GIC_PPI 10
                                (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
                interrupt-parent = <&gic>;
+               always-on;
        };
 };
index 0fd5bd29fbf938295301d17b678e77759b89fb61..62e07e1197cc772b979c75dccb32dffd4b65d60a 100644 (file)
@@ -4,7 +4,7 @@
 #include <dt-bindings/mfd/max77620.h>
 
 / {
-       model = "NVIDIA Tegra194 P2888 Processor Module";
+       model = "NVIDIA Jetson AGX Xavier";
        compatible = "nvidia,p2888", "nvidia,tegra194";
 
        aliases {
                                                regulator-boot-on;
                                        };
 
-                                       sd3 {
+                                       vdd_1v8ao: sd3 {
                                                regulator-name = "VDD_1V8AO";
                                                regulator-min-microvolt = <1800000>;
                                                regulator-max-microvolt = <1800000>;
index 73801b48d1d8b79209b0d7d924befebb3be6b7fc..23597d53c9c9694357d79cbbd8f628ff744c5b86 100644 (file)
@@ -7,10 +7,22 @@
 #include "tegra194-p2888.dtsi"
 
 / {
-       model = "NVIDIA Jetson AGX Xavier Development Kit";
+       model = "NVIDIA Jetson AGX Xavier Developer Kit";
        compatible = "nvidia,p2972-0000", "nvidia,tegra194";
 
        cbb {
+               aconnect {
+                       status = "okay";
+
+                       dma-controller@2930000 {
+                               status = "okay";
+                       };
+
+                       interrupt-controller@2a40000 {
+                               status = "okay";
+                       };
+               };
+
                ddc: i2c@31c0000 {
                        status = "okay";
                };
                };
        };
 
+       pcie@14100000 {
+               status = "okay";
+
+               vddio-pex-ctl-supply = <&vdd_1v8ao>;
+
+               phys = <&p2u_hsio_0>;
+               phy-names = "p2u-0";
+       };
+
+       pcie@14140000 {
+               status = "okay";
+
+               vddio-pex-ctl-supply = <&vdd_1v8ao>;
+
+               phys = <&p2u_hsio_7>;
+               phy-names = "p2u-0";
+       };
+
+       pcie@14180000 {
+               status = "okay";
+
+               vddio-pex-ctl-supply = <&vdd_1v8ao>;
+
+               phys = <&p2u_hsio_2>, <&p2u_hsio_3>, <&p2u_hsio_4>,
+                      <&p2u_hsio_5>;
+               phy-names = "p2u-0", "p2u-1", "p2u-2", "p2u-3";
+       };
+
+       pcie@141a0000 {
+               status = "disabled";
+
+               vddio-pex-ctl-supply = <&vdd_1v8ao>;
+
+               phys = <&p2u_nvhs_0>, <&p2u_nvhs_1>, <&p2u_nvhs_2>,
+                      <&p2u_nvhs_3>, <&p2u_nvhs_4>, <&p2u_nvhs_5>,
+                      <&p2u_nvhs_6>, <&p2u_nvhs_7>;
+
+               phy-names = "p2u-0", "p2u-1", "p2u-2", "p2u-3", "p2u-4",
+                           "p2u-5", "p2u-6", "p2u-7";
+       };
+
        fan: fan {
                compatible = "pwm-fan";
                pwms = <&pwm4 0 45334>;
index c77ca211fa8fa27f0dde6a441176f9dbc91a79bd..adebbbf36bd00f3a8fdb86184f08aa72eae71efa 100644 (file)
                        snps,rxpbl = <8>;
                };
 
+               aconnect {
+                       compatible = "nvidia,tegra194-aconnect",
+                                    "nvidia,tegra210-aconnect";
+                       clocks = <&bpmp TEGRA194_CLK_APE>,
+                                <&bpmp TEGRA194_CLK_APB2APE>;
+                       clock-names = "ape", "apb2ape";
+                       power-domains = <&bpmp TEGRA194_POWER_DOMAIN_AUD>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0x02900000 0x02900000 0x200000>;
+                       status = "disabled";
+
+                       dma-controller@2930000 {
+                               compatible = "nvidia,tegra194-adma",
+                                            "nvidia,tegra186-adma";
+                               reg = <0x02930000 0x20000>;
+                               interrupt-parent = <&agic>;
+                               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 4 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>,
+                                             <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 26 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
+                                             <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+                               #dma-cells = <1>;
+                               clocks = <&bpmp TEGRA194_CLK_AHUB>;
+                               clock-names = "d_audio";
+                               status = "disabled";
+                       };
+
+                       agic: interrupt-controller@2a40000 {
+                               compatible = "nvidia,tegra194-agic",
+                                            "nvidia,tegra210-agic";
+                               #interrupt-cells = <3>;
+                               interrupt-controller;
+                               reg = <0x02a41000 0x1000>,
+                                     <0x02a42000 0x2000>;
+                               interrupts = <GIC_SPI 145
+                                             (GIC_CPU_MASK_SIMPLE(4) |
+                                              IRQ_TYPE_LEVEL_HIGH)>;
+                               clocks = <&bpmp TEGRA194_CLK_APE>;
+                               clock-names = "clk";
+                               status = "disabled";
+                       };
+               };
+
                uarta: serial@3100000 {
                        compatible = "nvidia,tegra194-uart", "nvidia,tegra20-uart";
                        reg = <0x03100000 0x40>;
                        #mbox-cells = <2>;
                };
 
+               p2u_hsio_0: phy@3e10000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03e10000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_hsio_1: phy@3e20000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03e20000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_hsio_2: phy@3e30000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03e30000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_hsio_3: phy@3e40000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03e40000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_hsio_4: phy@3e50000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03e50000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_hsio_5: phy@3e60000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03e60000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_hsio_6: phy@3e70000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03e70000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_hsio_7: phy@3e80000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03e80000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_hsio_8: phy@3e90000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03e90000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_hsio_9: phy@3ea0000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03ea0000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_nvhs_0: phy@3eb0000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03eb0000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_nvhs_1: phy@3ec0000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03ec0000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_nvhs_2: phy@3ed0000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03ed0000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_nvhs_3: phy@3ee0000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03ee0000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_nvhs_4: phy@3ef0000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03ef0000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_nvhs_5: phy@3f00000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03f00000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_nvhs_6: phy@3f10000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03f10000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_nvhs_7: phy@3f20000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03f20000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_hsio_10: phy@3f30000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03f30000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
+               p2u_hsio_11: phy@3f40000 {
+                       compatible = "nvidia,tegra194-p2u";
+                       reg = <0x03f40000 0x10000>;
+                       reg-names = "ctl";
+
+                       #phy-cells = <0>;
+               };
+
                hsp_aon: hsp@c150000 {
                        compatible = "nvidia,tegra194-hsp", "nvidia,tegra186-hsp";
                        reg = <0x0c150000 0xa0000>;
                };
        };
 
+       pcie@14100000 {
+               compatible = "nvidia,tegra194-pcie", "snps,dw-pcie";
+               power-domains = <&bpmp TEGRA194_POWER_DOMAIN_PCIEX1A>;
+               reg = <0x00 0x14100000 0x0 0x00020000   /* appl registers (128K)      */
+                      0x00 0x30000000 0x0 0x00040000   /* configuration space (256K) */
+                      0x00 0x30040000 0x0 0x00040000   /* iATU_DMA reg space (256K)  */
+                      0x00 0x30080000 0x0 0x00040000>; /* DBI reg space (256K)       */
+               reg-names = "appl", "config", "atu_dma", "dbi";
+
+               status = "disabled";
+
+               #address-cells = <3>;
+               #size-cells = <2>;
+               device_type = "pci";
+               num-lanes = <1>;
+               num-viewport = <8>;
+               linux,pci-domain = <1>;
+
+               clocks = <&bpmp TEGRA194_CLK_PEX0_CORE_1>;
+               clock-names = "core";
+
+               resets = <&bpmp TEGRA194_RESET_PEX0_CORE_1_APB>,
+                        <&bpmp TEGRA194_RESET_PEX0_CORE_1>;
+               reset-names = "apb", "core";
+
+               interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>,  /* controller interrupt */
+                            <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;  /* MSI interrupt */
+               interrupt-names = "intr", "msi";
+
+               #interrupt-cells = <1>;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &gic GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+
+               nvidia,bpmp = <&bpmp 1>;
+
+               supports-clkreq;
+               nvidia,aspm-cmrt-us = <60>;
+               nvidia,aspm-pwr-on-t-us = <20>;
+               nvidia,aspm-l0s-entrance-latency-us = <3>;
+
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0  0x30100000 0x0  0x30100000 0x0 0x00100000   /* downstream I/O (1MB) */
+                         0xc2000000 0x12 0x00000000 0x12 0x00000000 0x0 0x30000000   /* prefetchable memory (768MB) */
+                         0x82000000 0x0  0x40000000 0x12 0x30000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */
+       };
+
+       pcie@14120000 {
+               compatible = "nvidia,tegra194-pcie", "snps,dw-pcie";
+               power-domains = <&bpmp TEGRA194_POWER_DOMAIN_PCIEX1A>;
+               reg = <0x00 0x14120000 0x0 0x00020000   /* appl registers (128K)      */
+                      0x00 0x32000000 0x0 0x00040000   /* configuration space (256K) */
+                      0x00 0x32040000 0x0 0x00040000   /* iATU_DMA reg space (256K)  */
+                      0x00 0x32080000 0x0 0x00040000>; /* DBI reg space (256K)       */
+               reg-names = "appl", "config", "atu_dma", "dbi";
+
+               status = "disabled";
+
+               #address-cells = <3>;
+               #size-cells = <2>;
+               device_type = "pci";
+               num-lanes = <1>;
+               num-viewport = <8>;
+               linux,pci-domain = <2>;
+
+               clocks = <&bpmp TEGRA194_CLK_PEX0_CORE_2>;
+               clock-names = "core";
+
+               resets = <&bpmp TEGRA194_RESET_PEX0_CORE_2_APB>,
+                        <&bpmp TEGRA194_RESET_PEX0_CORE_2>;
+               reset-names = "apb", "core";
+
+               interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>,  /* controller interrupt */
+                            <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;  /* MSI interrupt */
+               interrupt-names = "intr", "msi";
+
+               #interrupt-cells = <1>;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &gic GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
+
+               nvidia,bpmp = <&bpmp 2>;
+
+               supports-clkreq;
+               nvidia,aspm-cmrt-us = <60>;
+               nvidia,aspm-pwr-on-t-us = <20>;
+               nvidia,aspm-l0s-entrance-latency-us = <3>;
+
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0  0x32100000 0x0  0x32100000 0x0 0x00100000   /* downstream I/O (1MB) */
+                         0xc2000000 0x12 0x40000000 0x12 0x40000000 0x0 0x30000000   /* prefetchable memory (768MB) */
+                         0x82000000 0x0  0x40000000 0x12 0x70000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */
+       };
+
+       pcie@14140000 {
+               compatible = "nvidia,tegra194-pcie", "snps,dw-pcie";
+               power-domains = <&bpmp TEGRA194_POWER_DOMAIN_PCIEX1A>;
+               reg = <0x00 0x14140000 0x0 0x00020000   /* appl registers (128K)      */
+                      0x00 0x34000000 0x0 0x00040000   /* configuration space (256K) */
+                      0x00 0x34040000 0x0 0x00040000   /* iATU_DMA reg space (256K)  */
+                      0x00 0x34080000 0x0 0x00040000>; /* DBI reg space (256K)       */
+               reg-names = "appl", "config", "atu_dma", "dbi";
+
+               status = "disabled";
+
+               #address-cells = <3>;
+               #size-cells = <2>;
+               device_type = "pci";
+               num-lanes = <1>;
+               num-viewport = <8>;
+               linux,pci-domain = <3>;
+
+               clocks = <&bpmp TEGRA194_CLK_PEX0_CORE_3>;
+               clock-names = "core";
+
+               resets = <&bpmp TEGRA194_RESET_PEX0_CORE_3_APB>,
+                        <&bpmp TEGRA194_RESET_PEX0_CORE_3>;
+               reset-names = "apb", "core";
+
+               interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>,  /* controller interrupt */
+                            <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>;  /* MSI interrupt */
+               interrupt-names = "intr", "msi";
+
+               #interrupt-cells = <1>;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &gic GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
+
+               nvidia,bpmp = <&bpmp 3>;
+
+               supports-clkreq;
+               nvidia,aspm-cmrt-us = <60>;
+               nvidia,aspm-pwr-on-t-us = <20>;
+               nvidia,aspm-l0s-entrance-latency-us = <3>;
+
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0  0x34100000 0x0  0x34100000 0x0 0x00100000   /* downstream I/O (1MB) */
+                         0xc2000000 0x12 0x80000000 0x12 0x80000000 0x0 0x30000000   /* prefetchable memory (768MB) */
+                         0x82000000 0x0  0x40000000 0x12 0xb0000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */
+       };
+
+       pcie@14160000 {
+               compatible = "nvidia,tegra194-pcie", "snps,dw-pcie";
+               power-domains = <&bpmp TEGRA194_POWER_DOMAIN_PCIEX4A>;
+               reg = <0x00 0x14160000 0x0 0x00020000   /* appl registers (128K)      */
+                      0x00 0x36000000 0x0 0x00040000   /* configuration space (256K) */
+                      0x00 0x36040000 0x0 0x00040000   /* iATU_DMA reg space (256K)  */
+                      0x00 0x36080000 0x0 0x00040000>; /* DBI reg space (256K)       */
+               reg-names = "appl", "config", "atu_dma", "dbi";
+
+               status = "disabled";
+
+               #address-cells = <3>;
+               #size-cells = <2>;
+               device_type = "pci";
+               num-lanes = <4>;
+               num-viewport = <8>;
+               linux,pci-domain = <4>;
+
+               clocks = <&bpmp TEGRA194_CLK_PEX0_CORE_4>;
+               clock-names = "core";
+
+               resets = <&bpmp TEGRA194_RESET_PEX0_CORE_4_APB>,
+                        <&bpmp TEGRA194_RESET_PEX0_CORE_4>;
+               reset-names = "apb", "core";
+
+               interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>,  /* controller interrupt */
+                            <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;  /* MSI interrupt */
+               interrupt-names = "intr", "msi";
+
+               #interrupt-cells = <1>;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &gic GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
+
+               nvidia,bpmp = <&bpmp 4>;
+
+               supports-clkreq;
+               nvidia,aspm-cmrt-us = <60>;
+               nvidia,aspm-pwr-on-t-us = <20>;
+               nvidia,aspm-l0s-entrance-latency-us = <3>;
+
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0  0x36100000 0x0  0x36100000 0x0 0x00100000   /* downstream I/O (1MB) */
+                         0xc2000000 0x14 0x00000000 0x14 0x00000000 0x3 0x40000000   /* prefetchable memory (13GB) */
+                         0x82000000 0x0  0x40000000 0x17 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */
+       };
+
+       pcie@14180000 {
+               compatible = "nvidia,tegra194-pcie", "snps,dw-pcie";
+               power-domains = <&bpmp TEGRA194_POWER_DOMAIN_PCIEX8B>;
+               reg = <0x00 0x14180000 0x0 0x00020000   /* appl registers (128K)      */
+                      0x00 0x38000000 0x0 0x00040000   /* configuration space (256K) */
+                      0x00 0x38040000 0x0 0x00040000   /* iATU_DMA reg space (256K)  */
+                      0x00 0x38080000 0x0 0x00040000>; /* DBI reg space (256K)       */
+               reg-names = "appl", "config", "atu_dma", "dbi";
+
+               status = "disabled";
+
+               #address-cells = <3>;
+               #size-cells = <2>;
+               device_type = "pci";
+               num-lanes = <8>;
+               num-viewport = <8>;
+               linux,pci-domain = <0>;
+
+               clocks = <&bpmp TEGRA194_CLK_PEX0_CORE_0>;
+               clock-names = "core";
+
+               resets = <&bpmp TEGRA194_RESET_PEX0_CORE_0_APB>,
+                        <&bpmp TEGRA194_RESET_PEX0_CORE_0>;
+               reset-names = "apb", "core";
+
+               interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>,  /* controller interrupt */
+                            <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;  /* MSI interrupt */
+               interrupt-names = "intr", "msi";
+
+               #interrupt-cells = <1>;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &gic GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
+
+               nvidia,bpmp = <&bpmp 0>;
+
+               supports-clkreq;
+               nvidia,aspm-cmrt-us = <60>;
+               nvidia,aspm-pwr-on-t-us = <20>;
+               nvidia,aspm-l0s-entrance-latency-us = <3>;
+
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0  0x38100000 0x0  0x38100000 0x0 0x00100000   /* downstream I/O (1MB) */
+                         0xc2000000 0x18 0x00000000 0x18 0x00000000 0x3 0x40000000   /* prefetchable memory (13GB) */
+                         0x82000000 0x0  0x40000000 0x1b 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */
+       };
+
+       pcie@141a0000 {
+               compatible = "nvidia,tegra194-pcie", "snps,dw-pcie";
+               power-domains = <&bpmp TEGRA194_POWER_DOMAIN_PCIEX8A>;
+               reg = <0x00 0x141a0000 0x0 0x00020000   /* appl registers (128K)      */
+                      0x00 0x3a000000 0x0 0x00040000   /* configuration space (256K) */
+                      0x00 0x3a040000 0x0 0x00040000   /* iATU_DMA reg space (256K)  */
+                      0x00 0x3a080000 0x0 0x00040000>; /* DBI reg space (256K)       */
+               reg-names = "appl", "config", "atu_dma", "dbi";
+
+               status = "disabled";
+
+               #address-cells = <3>;
+               #size-cells = <2>;
+               device_type = "pci";
+               num-lanes = <8>;
+               num-viewport = <8>;
+               linux,pci-domain = <5>;
+
+               clocks = <&bpmp TEGRA194_CLK_PEX1_CORE_5>,
+                       <&bpmp TEGRA194_CLK_PEX1_CORE_5M>;
+               clock-names = "core", "core_m";
+
+               resets = <&bpmp TEGRA194_RESET_PEX1_CORE_5_APB>,
+                        <&bpmp TEGRA194_RESET_PEX1_CORE_5>;
+               reset-names = "apb", "core";
+
+               interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>,  /* controller interrupt */
+                            <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;  /* MSI interrupt */
+               interrupt-names = "intr", "msi";
+
+               nvidia,bpmp = <&bpmp 5>;
+
+               #interrupt-cells = <1>;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &gic GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
+
+               supports-clkreq;
+               nvidia,aspm-cmrt-us = <60>;
+               nvidia,aspm-pwr-on-t-us = <20>;
+               nvidia,aspm-l0s-entrance-latency-us = <3>;
+
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0  0x3a100000 0x0  0x3a100000 0x0 0x00100000   /* downstream I/O (1MB) */
+                         0xc2000000 0x1c 0x00000000 0x1c 0x00000000 0x3 0x40000000   /* prefetchable memory (13GB) */
+                         0x82000000 0x0  0x40000000 0x1f 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */
+       };
+
        sysram@40000000 {
                compatible = "nvidia,tegra194-sysram", "mmio-sram";
                reg = <0x0 0x40000000 0x0 0x50000>;
                             <GIC_PPI 10
                                (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
                interrupt-parent = <&gic>;
+               always-on;
        };
 };
index 4dcd0d36189a46d4239c77807595cf8c7e150d16..27723829d03308c01684ada37bf2a9116db95e76 100644 (file)
                };
        };
 
+       i2c@7000c500 {
+               /* module ID EEPROM */
+               eeprom@50 {
+                       compatible = "atmel,24c02";
+                       reg = <0x50>;
+
+                       address-bits = <8>;
+                       page-size = <8>;
+                       size = <256>;
+                       read-only;
+               };
+       };
+
        pmc@7000e400 {
                nvidia,invert-interrupt;
        };
                        regulator-max-microvolt = <1320000>;
                        enable-gpios = <&pmic 6 GPIO_ACTIVE_HIGH>;
                        regulator-ramp-delay = <80>;
-                       regulator-enable-ramp-delay = <1000>;
+                       regulator-enable-ramp-delay = <2000>;
+                       regulator-settling-time-us = <160>;
                };
        };
 };
index 5a57396b5948924c2364e1ac2be542e1f04348c2..a3cafe39ba4c46f0b031db210d0bf9e7a3ab278b 100644 (file)
                };
        };
 
+       i2c@7000c500 {
+               /* carrier board ID EEPROM */
+               eeprom@57 {
+                       compatible = "atmel,24c02";
+                       reg = <0x57>;
+
+                       address-bits = <8>;
+                       page-size = <8>;
+                       size = <256>;
+                       read-only;
+               };
+       };
+
        clock@70110000 {
                status = "okay";
 
index 5d0181908f452cc163ec1edcd264d460e53e5849..9d17ec707bcefdf205cf3f4695655d515fa70be1 100644 (file)
                status = "okay";
        };
 
+       pwm@7000a000 {
+               status = "okay";
+       };
+
+       i2c@7000c500 {
+               status = "okay";
+               clock-frequency = <100000>;
+
+               eeprom@50 {
+                       compatible = "atmel,24c02";
+                       reg = <0x50>;
+
+                       address-bits = <8>;
+                       page-size = <8>;
+                       size = <256>;
+                       read-only;
+               };
+
+               eeprom@57 {
+                       compatible = "atmel,24c02";
+                       reg = <0x57>;
+
+                       address-bits = <8>;
+                       page-size = <8>;
+                       size = <256>;
+                       read-only;
+               };
+       };
+
        hdmi_ddc: i2c@7000c700 {
                status = "okay";
                clock-frequency = <100000>;
                cpu@3 {
                        enable-method = "psci";
                };
+
+               idle-states {
+                       cpu-sleep {
+                               status = "okay";
+                       };
+               };
        };
 
        gpio-keys {
                };
 
                vdd_gpu: regulator@6 {
-                       compatible = "regulator-fixed";
+                       compatible = "pwm-regulator";
                        reg = <6>;
-
+                       pwms = <&pwm 1 4880>;
                        regulator-name = "VDD_GPU";
-                       regulator-min-microvolt = <5000000>;
-                       regulator-max-microvolt = <5000000>;
-                       regulator-enable-ramp-delay = <250>;
-
-                       gpio = <&pmic 6 GPIO_ACTIVE_HIGH>;
-                       enable-active-high;
-
+                       regulator-min-microvolt = <710000>;
+                       regulator-max-microvolt = <1320000>;
+                       regulator-ramp-delay = <80>;
+                       regulator-enable-ramp-delay = <2000>;
+                       regulator-settling-time-us = <160>;
+                       enable-gpios = <&pmic 6 GPIO_ACTIVE_HIGH>;
                        vin-supply = <&vdd_5v0_sys>;
                };
        };
index a550c0a4d572fd7360e33c1bb64518c2939965e8..659753118e96f33f46ba20ea8d9424bbe1d00c6c 100644 (file)
                         <&tegra_car 72>,
                         <&tegra_car 74>;
                reset-names = "pex", "afi", "pcie_x";
+
+               pinctrl-names = "default", "idle";
+               pinctrl-0 = <&pex_dpd_disable>;
+               pinctrl-1 = <&pex_dpd_enable>;
+
                status = "disabled";
 
                pci@1,0 {
                        pins = "sdmmc3";
                        power-source = <TEGRA_IO_PAD_VOLTAGE_1V8>;
                };
+
+               pex_dpd_disable: pex_en {
+                       pex-dpd-disable {
+                               pins = "pex-bias", "pex-clk1", "pex-clk2";
+                               low-power-disable;
+                       };
+               };
+
+               pex_dpd_enable: pex_dis {
+                       pex-dpd-enable {
+                               pins = "pex-bias", "pex-clk1", "pex-clk2";
+                               low-power-enable;
+                       };
+               };
        };
 
        fuse@7000f800 {
                        compatible = "nvidia,tegra210-agic";
                        #interrupt-cells = <3>;
                        interrupt-controller;
-                       reg = <0x702f9000 0x2000>,
+                       reg = <0x702f9000 0x1000>,
                              <0x702fa000 0x2000>;
                        interrupts = <GIC_SPI 102 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
                        clocks = <&tegra_car TEGRA210_CLK_APE>;
                             <GIC_PPI 10
                                (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
                interrupt-parent = <&gic>;
+               arm,no-tick-in-suspend;
        };
 
        soctherm: thermal-sensor@700e2000 {
index 21d548f02d394271a739de2e0cc6e713cbc15fae..0a7e5dfce6f793a7c9c6665dcac5245588a0c672 100644 (file)
@@ -7,6 +7,10 @@ dtb-$(CONFIG_ARCH_QCOM)        += msm8992-bullhead-rev-101.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += msm8994-angler-rev-101.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += msm8996-mtp.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += msm8998-mtp.dtb
+dtb-$(CONFIG_ARCH_QCOM)        += sdm845-cheza-r1.dtb
+dtb-$(CONFIG_ARCH_QCOM)        += sdm845-cheza-r2.dtb
+dtb-$(CONFIG_ARCH_QCOM)        += sdm845-cheza-r3.dtb
+dtb-$(CONFIG_ARCH_QCOM)        += sdm845-db845c.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += sdm845-mtp.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += qcs404-evb-1000.dtb
 dtb-$(CONFIG_ARCH_QCOM)        += qcs404-evb-4000.dtb
index dacd465fc62e4952848cde527dc5c3bdccef0351..5ea9fb8f2f87dfc9fcdc2876094579e1f7b5a254 100644 (file)
                        reg = <0x0>;
                        next-level-cache = <&L2_0>;
                        enable-method = "psci";
-                       cpu-idle-states = <&CPU_SPC>;
+                       cpu-idle-states = <&CPU_SLEEP_0>;
                        clocks = <&apcs>;
                        operating-points-v2 = <&cpu_opp_table>;
                        #cooling-cells = <2>;
                        reg = <0x1>;
                        next-level-cache = <&L2_0>;
                        enable-method = "psci";
-                       cpu-idle-states = <&CPU_SPC>;
+                       cpu-idle-states = <&CPU_SLEEP_0>;
                        clocks = <&apcs>;
                        operating-points-v2 = <&cpu_opp_table>;
                        #cooling-cells = <2>;
                        reg = <0x2>;
                        next-level-cache = <&L2_0>;
                        enable-method = "psci";
-                       cpu-idle-states = <&CPU_SPC>;
+                       cpu-idle-states = <&CPU_SLEEP_0>;
                        clocks = <&apcs>;
                        operating-points-v2 = <&cpu_opp_table>;
                        #cooling-cells = <2>;
                        reg = <0x3>;
                        next-level-cache = <&L2_0>;
                        enable-method = "psci";
-                       cpu-idle-states = <&CPU_SPC>;
+                       cpu-idle-states = <&CPU_SLEEP_0>;
                        clocks = <&apcs>;
                        operating-points-v2 = <&cpu_opp_table>;
                        #cooling-cells = <2>;
                };
 
                idle-states {
-                       CPU_SPC: spc {
+                       entry-method = "psci";
+
+                       CPU_SLEEP_0: cpu-sleep-0 {
                                compatible = "arm,idle-state";
+                               idle-state-name = "standalone-power-collapse";
                                arm,psci-suspend-param = <0x40000002>;
                                entry-latency-us = <130>;
                                exit-latency-us = <150>;
                };
 
                funnel@821000 {
-                       compatible = "arm,coresight-funnel", "arm,primecell";
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                        reg = <0x821000 0x1000>;
 
                        clocks = <&rpmcc RPM_QDSS_CLK>, <&rpmcc RPM_QDSS_A_CLK>;
                };
 
                funnel@841000 { /* APSS funnel only 4 inputs are used */
-                       compatible = "arm,coresight-funnel", "arm,primecell";
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                        reg = <0x841000 0x1000>;
 
                        clocks = <&rpmcc RPM_QDSS_CLK>, <&rpmcc RPM_QDSS_A_CLK>;
index 942465d8aeb7c35d8de085a870bbe75f24a7b2e3..96c0a481f454eaeea74536dccec9f65f7aa73c03 100644 (file)
@@ -94,6 +94,8 @@
                        compatible = "qcom,kryo";
                        reg = <0x0 0x0>;
                        enable-method = "psci";
+                       cpu-idle-states = <&CPU_SLEEP_0>;
+                       capacity-dmips-mhz = <1024>;
                        next-level-cache = <&L2_0>;
                        L2_0: l2-cache {
                              compatible = "cache";
                        compatible = "qcom,kryo";
                        reg = <0x0 0x1>;
                        enable-method = "psci";
+                       cpu-idle-states = <&CPU_SLEEP_0>;
+                       capacity-dmips-mhz = <1024>;
                        next-level-cache = <&L2_0>;
                };
 
                        compatible = "qcom,kryo";
                        reg = <0x0 0x100>;
                        enable-method = "psci";
+                       cpu-idle-states = <&CPU_SLEEP_0>;
+                       capacity-dmips-mhz = <1024>;
                        next-level-cache = <&L2_1>;
                        L2_1: l2-cache {
                              compatible = "cache";
                        compatible = "qcom,kryo";
                        reg = <0x0 0x101>;
                        enable-method = "psci";
+                       cpu-idle-states = <&CPU_SLEEP_0>;
+                       capacity-dmips-mhz = <1024>;
                        next-level-cache = <&L2_1>;
                };
 
                                };
                        };
                };
+
+               idle-states {
+                       entry-method = "psci";
+
+                       CPU_SLEEP_0: cpu-sleep-0 {
+                               compatible = "arm,idle-state";
+                               idle-state-name = "standalone-power-collapse";
+                               arm,psci-suspend-param = <0x00000004>;
+                               entry-latency-us = <130>;
+                               exit-latency-us = <80>;
+                               min-residency-us = <300>;
+                       };
+               };
        };
 
        thermal-zones {
                        clock-names = "ref_clk_src", "ref_clk";
                        clocks = <&rpmcc RPM_SMD_LN_BB_CLK>,
                                 <&gcc GCC_UFS_CLKREF_CLK>;
+                       resets = <&ufshc 0>;
                        status = "disabled";
                };
 
-               ufshc@624000 {
+               ufshc: ufshc@624000 {
                        compatible = "qcom,ufshc";
                        reg = <0x624000 0x2500>;
                        interrupts = <GIC_SPI 265 IRQ_TYPE_LEVEL_HIGH>;
                                <0 0>;
 
                        lanes-per-direction = <1>;
+                       #reset-cells = <1>;
                        status = "disabled";
 
                        ufs_variant {
                        clock-names = "iface",
                                      "bus";
                        #iommu-cells = <1>;
-                       status = "disabled";
                };
 
                camss: camss@a00000 {
                        clock-names = "iface", "bus";
 
                        power-domains = <&mmcc GPU_GDSC>;
-
-                       status = "disabled";
                };
 
                mdp_smmu: arm,smmu@d00000 {
                        clock-names = "iface", "bus";
 
                        power-domains = <&mmcc MDSS_GDSC>;
-
-                       status = "disabled";
                };
 
                lpass_q6_smmu: arm,smmu-lpass_q6@1600000 {
                        clocks = <&gcc GCC_HLOS1_VOTE_LPASS_CORE_SMMU_CLK>,
                                 <&gcc GCC_HLOS1_VOTE_LPASS_ADSP_SMMU_CLK>;
                        clock-names = "iface", "bus";
-                       status = "disabled";
                };
 
                agnoc@0 {
                        #interrupt-cells = <1>;
 
                        clocks = <&mmcc MDSS_AHB_CLK>;
-                       clock-names = "iface_clk";
+                       clock-names = "iface";
 
                        #address-cells = <1>;
                        #size-cells = <1>;
                                         <&mmcc MDSS_MDP_CLK>,
                                         <&mmcc SMMU_MDP_AXI_CLK>,
                                         <&mmcc MDSS_VSYNC_CLK>;
-                               clock-names = "iface_clk",
-                                             "bus_clk",
-                                             "core_clk",
-                                             "iommu_clk",
-                                             "vsync_clk";
+                               clock-names = "iface",
+                                             "bus",
+                                             "core",
+                                             "iommu",
+                                             "vsync";
 
                                iommus = <&mdp_smmu 0>;
 
                                         <&mmcc MDSS_HDMI_AHB_CLK>,
                                         <&mmcc MDSS_EXTPCLK_CLK>;
                                clock-names =
-                                       "mdp_core_clk",
-                                       "iface_clk",
-                                       "core_clk",
-                                       "alt_iface_clk",
-                                       "extp_clk";
+                                       "mdp_core",
+                                       "iface",
+                                       "core",
+                                       "alt_iface",
+                                       "extp";
 
                                phys = <&hdmi_phy>;
                                phy-names = "hdmi_phy";
 
                                clocks = <&mmcc MDSS_AHB_CLK>,
                                         <&gcc GCC_HDMI_CLKREF_CLK>;
-                               clock-names = "iface_clk",
-                                             "ref_clk";
+                               clock-names = "iface",
+                                             "ref";
                        };
                };
        };
                                power-domains = <&gcc HLOS1_VOTE_LPASS_ADSP_GDSC>;
                                compatible = "qcom,apr-v2";
                                qcom,smd-channels = "apr_audio_svc";
-                               reg = <APR_DOMAIN_ADSP>;
+                               qcom,apr-domain = <APR_DOMAIN_ADSP>;
                                #address-cells = <1>;
                                #size-cells = <0>;
 
index 574be78a936e223f13bb6329b6699ad7a0623b53..c13ed7aeb1e0cfd313773c81ffd8b8d34fdea5e1 100644 (file)
@@ -4,6 +4,7 @@
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/clock/qcom,gcc-msm8998.h>
 #include <dt-bindings/clock/qcom,rpmcc.h>
+#include <dt-bindings/power/qcom-rpmpd.h>
 #include <dt-bindings/gpio/gpio.h>
 
 / {
@@ -78,6 +79,7 @@
                        compatible = "arm,armv8";
                        reg = <0x0 0x0>;
                        enable-method = "psci";
+                       cpu-idle-states = <&LITTLE_CPU_SLEEP_0 &LITTLE_CPU_SLEEP_1>;
                        next-level-cache = <&L2_0>;
                        L2_0: l2-cache {
                                compatible = "arm,arch-cache";
@@ -96,6 +98,7 @@
                        compatible = "arm,armv8";
                        reg = <0x0 0x1>;
                        enable-method = "psci";
+                       cpu-idle-states = <&LITTLE_CPU_SLEEP_0 &LITTLE_CPU_SLEEP_1>;
                        next-level-cache = <&L2_0>;
                        L1_I_1: l1-icache {
                                compatible = "arm,arch-cache";
                        compatible = "arm,armv8";
                        reg = <0x0 0x2>;
                        enable-method = "psci";
+                       cpu-idle-states = <&LITTLE_CPU_SLEEP_0 &LITTLE_CPU_SLEEP_1>;
                        next-level-cache = <&L2_0>;
                        L1_I_2: l1-icache {
                                compatible = "arm,arch-cache";
                        compatible = "arm,armv8";
                        reg = <0x0 0x3>;
                        enable-method = "psci";
+                       cpu-idle-states = <&LITTLE_CPU_SLEEP_0 &LITTLE_CPU_SLEEP_1>;
                        next-level-cache = <&L2_0>;
                        L1_I_3: l1-icache {
                                compatible = "arm,arch-cache";
                        compatible = "arm,armv8";
                        reg = <0x0 0x100>;
                        enable-method = "psci";
+                       cpu-idle-states = <&BIG_CPU_SLEEP_0 &BIG_CPU_SLEEP_1>;
                        next-level-cache = <&L2_1>;
                        L2_1: l2-cache {
                                compatible = "arm,arch-cache";
                        compatible = "arm,armv8";
                        reg = <0x0 0x101>;
                        enable-method = "psci";
+                       cpu-idle-states = <&BIG_CPU_SLEEP_0 &BIG_CPU_SLEEP_1>;
                        next-level-cache = <&L2_1>;
                        L1_I_101: l1-icache {
                                compatible = "arm,arch-cache";
                        compatible = "arm,armv8";
                        reg = <0x0 0x102>;
                        enable-method = "psci";
+                       cpu-idle-states = <&BIG_CPU_SLEEP_0 &BIG_CPU_SLEEP_1>;
                        next-level-cache = <&L2_1>;
                        L1_I_102: l1-icache {
                                compatible = "arm,arch-cache";
                        compatible = "arm,armv8";
                        reg = <0x0 0x103>;
                        enable-method = "psci";
+                       cpu-idle-states = <&BIG_CPU_SLEEP_0 &BIG_CPU_SLEEP_1>;
                        next-level-cache = <&L2_1>;
                        L1_I_103: l1-icache {
                                compatible = "arm,arch-cache";
                                };
                        };
                };
+
+               idle-states {
+                       entry-method = "psci";
+
+                       LITTLE_CPU_SLEEP_0: cpu-sleep-0-0 {
+                               compatible = "arm,idle-state";
+                               idle-state-name = "little-retention";
+                               arm,psci-suspend-param = <0x00000002>;
+                               entry-latency-us = <81>;
+                               exit-latency-us = <86>;
+                               min-residency-us = <200>;
+                       };
+
+                       LITTLE_CPU_SLEEP_1: cpu-sleep-0-1 {
+                               compatible = "arm,idle-state";
+                               idle-state-name = "little-power-collapse";
+                               arm,psci-suspend-param = <0x40000003>;
+                               entry-latency-us = <273>;
+                               exit-latency-us = <612>;
+                               min-residency-us = <1000>;
+                               local-timer-stop;
+                       };
+
+                       BIG_CPU_SLEEP_0: cpu-sleep-1-0 {
+                               compatible = "arm,idle-state";
+                               idle-state-name = "big-retention";
+                               arm,psci-suspend-param = <0x00000002>;
+                               entry-latency-us = <79>;
+                               exit-latency-us = <82>;
+                               min-residency-us = <200>;
+                       };
+
+                       BIG_CPU_SLEEP_1: cpu-sleep-1-1 {
+                               compatible = "arm,idle-state";
+                               idle-state-name = "big-power-collapse";
+                               arm,psci-suspend-param = <0x40000003>;
+                               entry-latency-us = <336>;
+                               exit-latency-us = <525>;
+                               min-residency-us = <1000>;
+                               local-timer-stop;
+                       };
+               };
        };
 
        firmware {
                                compatible = "qcom,rpmcc-msm8998", "qcom,rpmcc";
                                #clock-cells = <1>;
                        };
+
+                       rpmpd: power-controller {
+                               compatible = "qcom,msm8998-rpmpd";
+                               #power-domain-cells = <1>;
+                               operating-points-v2 = <&rpmpd_opp_table>;
+
+                               rpmpd_opp_table: opp-table {
+                                       compatible = "operating-points-v2";
+
+                                       rpmpd_opp_ret: opp1 {
+                                               opp-level = <16>;
+                                       };
+
+                                       rpmpd_opp_ret_plus: opp2 {
+                                               opp-level = <32>;
+                                       };
+
+                                       rpmpd_opp_min_svs: opp3 {
+                                               opp-level = <48>;
+                                       };
+
+                                       rpmpd_opp_low_svs: opp4 {
+                                               opp-level = <64>;
+                                       };
+
+                                       rpmpd_opp_svs: opp5 {
+                                               opp-level = <128>;
+                                       };
+
+                                       rpmpd_opp_svs_plus: opp6 {
+                                               opp-level = <192>;
+                                       };
+
+                                       rpmpd_opp_nom: opp7 {
+                                               opp-level = <256>;
+                                       };
+
+                                       rpmpd_opp_nom_plus: opp8 {
+                                               opp-level = <320>;
+                                       };
+
+                                       rpmpd_opp_turbo: opp9 {
+                                               opp-level = <384>;
+                                       };
+
+                                       rpmpd_opp_turbo_plus: opp10 {
+                                               opp-level = <512>;
+                                       };
+                               };
+                       };
                };
        };
 
                        #thermal-sensor-cells = <1>;
                };
 
+               anoc1_smmu: iommu@1680000 {
+                       compatible = "qcom,msm8998-smmu-v2", "qcom,smmu-v2";
+                       reg = <0x01680000 0x10000>;
+                       #iommu-cells = <1>;
+
+                       #global-interrupts = <0>;
+                       interrupts =
+                               <GIC_SPI 364 IRQ_TYPE_EDGE_RISING>,
+                               <GIC_SPI 365 IRQ_TYPE_EDGE_RISING>,
+                               <GIC_SPI 366 IRQ_TYPE_EDGE_RISING>,
+                               <GIC_SPI 367 IRQ_TYPE_EDGE_RISING>,
+                               <GIC_SPI 368 IRQ_TYPE_EDGE_RISING>,
+                               <GIC_SPI 369 IRQ_TYPE_EDGE_RISING>;
+               };
+
+               pcie0: pci@1c00000 {
+                       compatible = "qcom,pcie-msm8996";
+                       reg =   <0x01c00000 0x2000>,
+                               <0x1b000000 0xf1d>,
+                               <0x1b000f20 0xa8>,
+                               <0x1b100000 0x100000>;
+                       reg-names = "parf", "dbi", "elbi", "config";
+                       device_type = "pci";
+                       linux,pci-domain = <0>;
+                       bus-range = <0x00 0xff>;
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       num-lanes = <1>;
+                       phys = <&pciephy>;
+                       phy-names = "pciephy";
+
+                       ranges = <0x01000000 0x0 0x1b200000 0x1b200000 0x0 0x100000>,
+                                <0x02000000 0x0 0x1b300000 0x1b300000 0x0 0xd00000>;
+
+                       #interrupt-cells = <1>;
+                       interrupts = <GIC_SPI 405 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "msi";
+                       interrupt-map-mask = <0 0 0 0x7>;
+                       interrupt-map = <0 0 0 1 &intc 0 135 IRQ_TYPE_LEVEL_HIGH>,
+                                       <0 0 0 2 &intc 0 136 IRQ_TYPE_LEVEL_HIGH>,
+                                       <0 0 0 3 &intc 0 138 IRQ_TYPE_LEVEL_HIGH>,
+                                       <0 0 0 4 &intc 0 139 IRQ_TYPE_LEVEL_HIGH>;
+
+                       clocks = <&gcc GCC_PCIE_0_PIPE_CLK>,
+                                <&gcc GCC_PCIE_0_MSTR_AXI_CLK>,
+                                <&gcc GCC_PCIE_0_SLV_AXI_CLK>,
+                                <&gcc GCC_PCIE_0_CFG_AHB_CLK>,
+                                <&gcc GCC_PCIE_0_AUX_CLK>;
+                       clock-names = "pipe", "bus_master", "bus_slave", "cfg", "aux";
+
+                       power-domains = <&gcc PCIE_0_GDSC>;
+                       iommu-map = <0x100 &anoc1_smmu 0x1480 1>;
+                       perst-gpios = <&tlmm 35 GPIO_ACTIVE_LOW>;
+               };
+
+               phy@1c06000 {
+                       compatible = "qcom,msm8998-qmp-pcie-phy";
+                       reg = <0x01c06000 0x18c>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+
+                       clocks = <&gcc GCC_PCIE_PHY_AUX_CLK>,
+                                <&gcc GCC_PCIE_0_CFG_AHB_CLK>,
+                                <&gcc GCC_PCIE_CLKREF_CLK>;
+                       clock-names = "aux", "cfg_ahb", "ref";
+
+                       resets = <&gcc GCC_PCIE_0_PHY_BCR>, <&gcc GCC_PCIE_PHY_BCR>;
+                       reset-names = "phy", "common";
+
+                       vdda-phy-supply = <&vreg_l1a_0p875>;
+                       vdda-pll-supply = <&vreg_l2a_1p2>;
+
+                       pciephy: lane@1c06800 {
+                               reg = <0x01c06200 0x128>, <0x01c06400 0x1fc>, <0x01c06800 0x20c>;
+                               #phy-cells = <0>;
+
+                               clocks = <&gcc GCC_PCIE_0_PIPE_CLK>;
+                               clock-names = "pipe0";
+                               clock-output-names = "pcie_0_pipe_clk_src";
+                               #clock-cells = <0>;
+                       };
+               };
+
                tcsr_mutex_regs: syscon@1f40000 {
                        compatible = "syscon";
                        reg = <0x1f40000 0x20000>;
index d3ca35a940fb68a7c254533f9cf96db36be8e408..051a52df80f9eb2e0e0bedfc9e62b38fba557cb9 100644 (file)
@@ -39,7 +39,7 @@
                #size-cells = <0>;
 
                pm8998_pon: pon@800 {
-                       compatible = "qcom,pm8916-pon";
+                       compatible = "qcom,pm8998-pon";
 
                        reg = <0x800>;
                        mode-bootloader = <0x2>;
index e8e186bc1ea790e066a5351746356574c75e6a93..14240fedd916c7a000f2c08cbf366d96a719c5ec 100644 (file)
@@ -98,7 +98,7 @@
                                qcom,pre-scaling = <1 1>;
                        };
 
-                       vph_pwr {
+                       pon_1: vph_pwr {
                                reg = <ADC5_VPH_PWR>;
                                qcom,pre-scaling = <1 3>;
                        };
                                qcom,pre-scaling = <1 1>;
                        };
 
-                       xo_therm_100k_pu {
-                               reg = <ADC5_XO_THERM_100K_PU>;
+                       pa_therm1: thermistor1 {
+                               reg = <ADC5_AMUX_THM1_100K_PU>;
+                               qcom,ratiometric;
+                               qcom,hw-settle-time = <200>;
                                qcom,pre-scaling = <1 1>;
                        };
 
-                       amux_thm1_100k_pu {
-                               reg = <ADC5_AMUX_THM1_100K_PU>;
+                       pa_therm3: thermistor3 {
+                               reg = <ADC5_AMUX_THM3_100K_PU>;
+                               qcom,ratiometric;
+                               qcom,hw-settle-time = <200>;
                                qcom,pre-scaling = <1 1>;
                        };
 
-                       amux_thm3_100k_pu {
-                               reg = <ADC5_AMUX_THM3_100K_PU>;
+                       xo_therm: xo_temp {
+                               reg = <ADC5_XO_THERM_100K_PU>;
+                               qcom,ratiometric;
+                               qcom,hw-settle-time = <200>;
                                qcom,pre-scaling = <1 1>;
                        };
                };
index 2c3127167e3c247d51ce3f52f96b314672ede8d3..11c0a7137823dab9257d8d90841a25851dee8b44 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 // Copyright (c) 2018, Linaro Limited
 
+#include <dt-bindings/gpio/gpio.h>
 #include "qcs404.dtsi"
 #include "pms405.dtsi"
 
        qcom,controlled-remotely;
 };
 
+&gcc {
+       protected-clocks = <GCC_BIMC_CDSP_CLK>,
+                          <GCC_CDSP_CFG_AHB_CLK>,
+                          <GCC_CDSP_BIMC_CLK_SRC>,
+                          <GCC_CDSP_TBU_CLK>;
+};
+
 &pms405_spmi_regulators {
-       vdd_s3-supply = <&pms405_s3>;
+       vdd_s3-supply = <&vph_pwr>;
 
        pms405_s3: s3 {
                regulator-always-on;
                regulator-boot-on;
                regulator-name = "vdd_apc";
                regulator-min-microvolt = <1048000>;
-               regulator-max-microvolt = <1352000>;
+               regulator-max-microvolt = <1384000>;
        };
 };
 
+&pcie {
+       status = "ok";
+
+       perst-gpio = <&tlmm 43 GPIO_ACTIVE_LOW>;
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&perst_state>;
+};
+
+&pcie_phy {
+       status = "ok";
+
+       vdda-vp-supply = <&vreg_l3_1p05>;
+       vdda-vph-supply = <&vreg_l5_1p8>;
+};
+
 &remoteproc_adsp {
        status = "ok";
 };
                };
 
                vreg_l3_1p05: l3 {
-                       regulator-min-microvolt = <1050000>;
+                       regulator-min-microvolt = <1048000>;
                        regulator-max-microvolt = <1160000>;
                };
 
 };
 
 &tlmm {
+       perst_state: perst {
+               pins = "gpio43";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+               output-low;
+       };
+
        sdc1_on: sdc1-on {
                clk {
                        pins = "sdc1_clk";
                data {
                        pins = "sdc1_data";
                        bias-pull-up;
-                       dreive-strength = <10>;
+                       drive-strength = <10>;
                };
 
                rclk {
                data {
                        pins = "sdc1_data";
                        bias-pull-up;
-                       dreive-strength = <2>;
+                       drive-strength = <2>;
                };
 
                rclk {
index ffedf9640af7dd081e307a36e3e01db09f81116d..3d0789775009c1d88ea639fe0cbca26d7d2cfa1d 100644 (file)
@@ -3,7 +3,10 @@
 
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/clock/qcom,gcc-qcs404.h>
+#include <dt-bindings/clock/qcom,turingcc-qcs404.h>
 #include <dt-bindings/clock/qcom,rpmcc.h>
+#include <dt-bindings/power/qcom-rpmpd.h>
+#include <dt-bindings/thermal/thermal.h>
 
 / {
        interrupt-parent = <&intc>;
@@ -30,7 +33,9 @@
                        compatible = "arm,cortex-a53";
                        reg = <0x100>;
                        enable-method = "psci";
+                       cpu-idle-states = <&CPU_SLEEP_0>;
                        next-level-cache = <&L2_0>;
+                       #cooling-cells = <2>;
                };
 
                CPU1: cpu@101 {
@@ -38,7 +43,9 @@
                        compatible = "arm,cortex-a53";
                        reg = <0x101>;
                        enable-method = "psci";
+                       cpu-idle-states = <&CPU_SLEEP_0>;
                        next-level-cache = <&L2_0>;
+                       #cooling-cells = <2>;
                };
 
                CPU2: cpu@102 {
@@ -46,7 +53,9 @@
                        compatible = "arm,cortex-a53";
                        reg = <0x102>;
                        enable-method = "psci";
+                       cpu-idle-states = <&CPU_SLEEP_0>;
                        next-level-cache = <&L2_0>;
+                       #cooling-cells = <2>;
                };
 
                CPU3: cpu@103 {
                        compatible = "arm,cortex-a53";
                        reg = <0x103>;
                        enable-method = "psci";
+                       cpu-idle-states = <&CPU_SLEEP_0>;
                        next-level-cache = <&L2_0>;
+                       #cooling-cells = <2>;
                };
 
                L2_0: l2-cache {
                        compatible = "cache";
                        cache-level = <2>;
                };
+
+               idle-states {
+                       entry-method = "psci";
+
+                       CPU_SLEEP_0: cpu-sleep-0 {
+                               compatible = "arm,idle-state";
+                               idle-state-name = "standalone-power-collapse";
+                               arm,psci-suspend-param = <0x40000003>;
+                               entry-latency-us = <125>;
+                               exit-latency-us = <180>;
+                               min-residency-us = <595>;
+                               local-timer-stop;
+                       };
+               };
        };
 
        firmware {
                method = "smc";
        };
 
-       remoteproc_adsp: remoteproc-adsp {
-               compatible = "qcom,qcs404-adsp-pas";
-
-               interrupts-extended = <&intc GIC_SPI 293 IRQ_TYPE_EDGE_RISING>,
-                                     <&adsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
-                                     <&adsp_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
-                                     <&adsp_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
-                                     <&adsp_smp2p_in 3 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "wdog", "fatal", "ready",
-                                 "handover", "stop-ack";
-
-               clocks = <&xo_board>;
-               clock-names = "xo";
-
-               memory-region = <&adsp_fw_mem>;
-
-               qcom,smem-states = <&adsp_smp2p_out 0>;
-               qcom,smem-state-names = "stop";
-
-               status = "disabled";
-
-               glink-edge {
-                       interrupts = <GIC_SPI 289 IRQ_TYPE_EDGE_RISING>;
-
-                       qcom,remote-pid = <2>;
-                       mboxes = <&apcs_glb 8>;
-
-                       label = "adsp";
-               };
-       };
-
-       remoteproc_cdsp: remoteproc-cdsp {
-               compatible = "qcom,qcs404-cdsp-pas";
-
-               interrupts-extended = <&intc GIC_SPI 229 IRQ_TYPE_EDGE_RISING>,
-                                     <&cdsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
-                                     <&cdsp_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
-                                     <&cdsp_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
-                                     <&cdsp_smp2p_in 3 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "wdog", "fatal", "ready",
-                                 "handover", "stop-ack";
-
-               clocks = <&xo_board>;
-               clock-names = "xo";
-
-               memory-region = <&cdsp_fw_mem>;
-
-               qcom,smem-states = <&cdsp_smp2p_out 0>;
-               qcom,smem-state-names = "stop";
-
-               status = "disabled";
-
-               glink-edge {
-                       interrupts = <GIC_SPI 141 IRQ_TYPE_EDGE_RISING>;
-
-                       qcom,remote-pid = <5>;
-                       mboxes = <&apcs_glb 12>;
-
-                       label = "cdsp";
-               };
-       };
-
-       remoteproc_wcss: remoteproc-wcss {
-               compatible = "qcom,qcs404-wcss-pas";
-
-               interrupts-extended = <&intc GIC_SPI 153 IRQ_TYPE_EDGE_RISING>,
-                                     <&wcss_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
-                                     <&wcss_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
-                                     <&wcss_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
-                                     <&wcss_smp2p_in 3 IRQ_TYPE_EDGE_RISING>;
-               interrupt-names = "wdog", "fatal", "ready",
-                                 "handover", "stop-ack";
-
-               clocks = <&xo_board>;
-               clock-names = "xo";
-
-               memory-region = <&wlan_fw_mem>;
-
-               qcom,smem-states = <&wcss_smp2p_out 0>;
-               qcom,smem-state-names = "stop";
-
-               status = "disabled";
-
-               glink-edge {
-                       interrupts = <GIC_SPI 156 IRQ_TYPE_EDGE_RISING>;
-
-                       qcom,remote-pid = <1>;
-                       mboxes = <&apcs_glb 16>;
-
-                       label = "wcss";
-               };
-       };
-
        reserved-memory {
                #address-cells = <2>;
                #size-cells = <2>;
                                compatible = "qcom,rpmcc-qcs404";
                                #clock-cells = <1>;
                        };
+
+                       rpmpd: power-controller {
+                               compatible = "qcom,qcs404-rpmpd";
+                               #power-domain-cells = <1>;
+                               operating-points-v2 = <&rpmpd_opp_table>;
+
+                               rpmpd_opp_table: opp-table {
+                                       compatible = "operating-points-v2";
+
+                                       rpmpd_opp_ret: opp1 {
+                                               opp-level = <16>;
+                                       };
+
+                                       rpmpd_opp_ret_plus: opp2 {
+                                               opp-level = <32>;
+                                       };
+
+                                       rpmpd_opp_min_svs: opp3 {
+                                               opp-level = <48>;
+                                       };
+
+                                       rpmpd_opp_low_svs: opp4 {
+                                               opp-level = <64>;
+                                       };
+
+                                       rpmpd_opp_svs: opp5 {
+                                               opp-level = <128>;
+                                       };
+
+                                       rpmpd_opp_svs_plus: opp6 {
+                                               opp-level = <192>;
+                                       };
+
+                                       rpmpd_opp_nom: opp7 {
+                                               opp-level = <256>;
+                                       };
+
+                                       rpmpd_opp_nom_plus: opp8 {
+                                               opp-level = <320>;
+                                       };
+
+                                       rpmpd_opp_turbo: opp9 {
+                                               opp-level = <384>;
+                                       };
+
+                                       rpmpd_opp_turbo_no_cpr: opp10 {
+                                               opp-level = <416>;
+                                       };
+
+                                       rpmpd_opp_turbo_plus: opp11 {
+                                               opp-level = <512>;
+                                       };
+                               };
+                       };
                };
        };
 
                ranges = <0 0 0 0xffffffff>;
                compatible = "simple-bus";
 
+               turingcc: clock-controller@800000 {
+                       compatible = "qcom,qcs404-turingcc";
+                       reg = <0x00800000 0x30000>;
+                       clocks = <&gcc GCC_CDSP_CFG_AHB_CLK>;
+
+                       #clock-cells = <1>;
+                       #reset-cells = <1>;
+
+                       status = "disabled";
+               };
+
                rpm_msg_ram: memory@60000 {
                        compatible = "qcom,rpm-msg-ram";
                        reg = <0x00060000 0x6000>;
                };
 
+               qfprom: qfprom@a4000 {
+                       compatible = "qcom,qfprom";
+                       reg = <0x000a4000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       tsens_caldata: caldata@d0 {
+                               reg = <0x1f8 0x14>;
+                       };
+               };
+
                rng: rng@e3000 {
                        compatible = "qcom,prng-ee";
                        reg = <0x000e3000 0x1000>;
                        clock-names = "core";
                };
 
+               tsens: thermal-sensor@4a9000 {
+                       compatible = "qcom,qcs404-tsens", "qcom,tsens-v1";
+                       reg = <0x004a9000 0x1000>, /* TM */
+                             <0x004a8000 0x1000>; /* SROT */
+                       nvmem-cells = <&tsens_caldata>;
+                       nvmem-cell-names = "calib";
+                       #qcom,sensors = <10>;
+                       #thermal-sensor-cells = <1>;
+               };
+
+               remoteproc_cdsp: remoteproc@b00000 {
+                       compatible = "qcom,qcs404-cdsp-pas";
+                       reg = <0x00b00000 0x4040>;
+
+                       interrupts-extended = <&intc GIC_SPI 229 IRQ_TYPE_EDGE_RISING>,
+                                             <&cdsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
+                                             <&cdsp_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
+                                             <&cdsp_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
+                                             <&cdsp_smp2p_in 3 IRQ_TYPE_EDGE_RISING>;
+                       interrupt-names = "wdog", "fatal", "ready",
+                                         "handover", "stop-ack";
+
+                       clocks = <&xo_board>,
+                                <&gcc GCC_CDSP_CFG_AHB_CLK>,
+                                <&gcc GCC_CDSP_TBU_CLK>,
+                                <&gcc GCC_BIMC_CDSP_CLK>,
+                                <&turingcc TURING_WRAPPER_AON_CLK>,
+                                <&turingcc TURING_Q6SS_AHBS_AON_CLK>,
+                                <&turingcc TURING_Q6SS_AHBM_AON_CLK>,
+                                <&turingcc TURING_Q6SS_Q6_AXIM_CLK>;
+                       clock-names = "xo",
+                                     "sway",
+                                     "tbu",
+                                     "bimc",
+                                     "ahb_aon",
+                                     "q6ss_slave",
+                                     "q6ss_master",
+                                     "q6_axim";
+
+                       resets = <&gcc GCC_CDSP_RESTART>;
+                       reset-names = "restart";
+
+                       qcom,halt-regs = <&tcsr 0x19004>;
+
+                       memory-region = <&cdsp_fw_mem>;
+
+                       qcom,smem-states = <&cdsp_smp2p_out 0>;
+                       qcom,smem-state-names = "stop";
+
+                       status = "disabled";
+
+                       glink-edge {
+                               interrupts = <GIC_SPI 141 IRQ_TYPE_EDGE_RISING>;
+
+                               qcom,remote-pid = <5>;
+                               mboxes = <&apcs_glb 12>;
+
+                               label = "cdsp";
+                       };
+               };
+
                tlmm: pinctrl@1000000 {
                        compatible = "qcom,qcs404-pinctrl";
                        reg = <0x01000000 0x200000>,
                        compatible = "qcom,gcc-qcs404";
                        reg = <0x01800000 0x80000>;
                        #clock-cells = <1>;
+                       #reset-cells = <1>;
 
                        assigned-clocks = <&gcc GCC_APSS_AHB_CLK_SRC>;
                        assigned-clock-rates = <19200000>;
                        reg = <0x01905000 0x20000>;
                };
 
+               tcsr: syscon@1937000 {
+                       compatible = "syscon";
+                       reg = <0x01937000 0x25000>;
+               };
+
                spmi_bus: spmi@200f000 {
                        compatible = "qcom,spmi-pmic-arb";
                        reg = <0x0200f000 0x001000>,
                        #interrupt-cells = <4>;
                };
 
+               remoteproc_wcss: remoteproc@7400000 {
+                       compatible = "qcom,qcs404-wcss-pas";
+                       reg = <0x07400000 0x4040>;
+
+                       interrupts-extended = <&intc GIC_SPI 153 IRQ_TYPE_EDGE_RISING>,
+                                             <&wcss_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
+                                             <&wcss_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
+                                             <&wcss_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
+                                             <&wcss_smp2p_in 3 IRQ_TYPE_EDGE_RISING>;
+                       interrupt-names = "wdog", "fatal", "ready",
+                                         "handover", "stop-ack";
+
+                       clocks = <&xo_board>;
+                       clock-names = "xo";
+
+                       memory-region = <&wlan_fw_mem>;
+
+                       qcom,smem-states = <&wcss_smp2p_out 0>;
+                       qcom,smem-state-names = "stop";
+
+                       status = "disabled";
+
+                       glink-edge {
+                               interrupts = <GIC_SPI 156 IRQ_TYPE_EDGE_RISING>;
+
+                               qcom,remote-pid = <1>;
+                               mboxes = <&apcs_glb 16>;
+
+                               label = "wcss";
+                       };
+               };
+
+               pcie_phy: phy@7786000 {
+                       compatible = "qcom,qcs404-pcie2-phy", "qcom,pcie2-phy";
+                       reg = <0x07786000 0xb8>;
+
+                       clocks = <&gcc GCC_PCIE_0_PIPE_CLK>;
+                       resets = <&gcc GCC_PCIEPHY_0_PHY_BCR>,
+                                <&gcc 21>;
+                       reset-names = "phy", "pipe";
+
+                       clock-output-names = "pcie_0_pipe_clk";
+                       #phy-cells = <0>;
+
+                       status = "disabled";
+               };
+
                sdcc1: sdcc@7804000 {
                        compatible = "qcom,sdhci-msm-v5";
                        reg = <0x07804000 0x1000>, <0x7805000 0x1000>;
                                status = "disabled";
                        };
                };
+
+               remoteproc_adsp: remoteproc@c700000 {
+                       compatible = "qcom,qcs404-adsp-pas";
+                       reg = <0x0c700000 0x4040>;
+
+                       interrupts-extended = <&intc GIC_SPI 293 IRQ_TYPE_EDGE_RISING>,
+                                             <&adsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
+                                             <&adsp_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
+                                             <&adsp_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
+                                             <&adsp_smp2p_in 3 IRQ_TYPE_EDGE_RISING>;
+                       interrupt-names = "wdog", "fatal", "ready",
+                                         "handover", "stop-ack";
+
+                       clocks = <&xo_board>;
+                       clock-names = "xo";
+
+                       memory-region = <&adsp_fw_mem>;
+
+                       qcom,smem-states = <&adsp_smp2p_out 0>;
+                       qcom,smem-state-names = "stop";
+
+                       status = "disabled";
+
+                       glink-edge {
+                               interrupts = <GIC_SPI 289 IRQ_TYPE_EDGE_RISING>;
+
+                               qcom,remote-pid = <2>;
+                               mboxes = <&apcs_glb 8>;
+
+                               label = "adsp";
+                       };
+               };
+
+               pcie: pci@10000000 {
+                       compatible = "qcom,pcie-qcs404", "snps,dw-pcie";
+                       reg =  <0x10000000 0xf1d>,
+                              <0x10000f20 0xa8>,
+                              <0x07780000 0x2000>,
+                              <0x10001000 0x2000>;
+                       reg-names = "dbi", "elbi", "parf", "config";
+                       device_type = "pci";
+                       linux,pci-domain = <0>;
+                       bus-range = <0x00 0xff>;
+                       num-lanes = <1>;
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+
+                       ranges = <0x81000000 0 0          0x10003000 0 0x00010000>, /* I/O */
+                                <0x82000000 0 0x10013000 0x10013000 0 0x007ed000>; /* memory */
+
+                       interrupts = <GIC_SPI 266 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "msi";
+                       #interrupt-cells = <1>;
+                       interrupt-map-mask = <0 0 0 0x7>;
+                       interrupt-map = <0 0 0 1 &intc GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>, /* int_a */
+                                       <0 0 0 2 &intc GIC_SPI 224 IRQ_TYPE_LEVEL_HIGH>, /* int_b */
+                                       <0 0 0 3 &intc GIC_SPI 267 IRQ_TYPE_LEVEL_HIGH>, /* int_c */
+                                       <0 0 0 4 &intc GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>; /* int_d */
+                       clocks = <&gcc GCC_PCIE_0_CFG_AHB_CLK>,
+                                <&gcc GCC_PCIE_0_AUX_CLK>,
+                                <&gcc GCC_PCIE_0_MSTR_AXI_CLK>,
+                                <&gcc GCC_PCIE_0_SLV_AXI_CLK>;
+                       clock-names = "iface", "aux", "master_bus", "slave_bus";
+
+                       resets = <&gcc 18>,
+                                <&gcc 17>,
+                                <&gcc 15>,
+                                <&gcc 19>,
+                                <&gcc GCC_PCIE_0_BCR>,
+                                <&gcc 16>;
+                       reset-names = "axi_m",
+                                     "axi_s",
+                                     "axi_m_sticky",
+                                     "pipe_sticky",
+                                     "pwr",
+                                     "ahb";
+
+                       phys = <&pcie_phy>;
+                       phy-names = "pciephy";
+
+                       status = "disabled";
+               };
        };
 
        timer {
                        #interrupt-cells = <2>;
                };
        };
+
+       thermal-zones {
+               aoss-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <1000>;
+
+                       thermal-sensors = <&tsens 0>;
+
+                       trips {
+                               aoss_alert0: trip-point@0 {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+
+               q6-hvx-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <1000>;
+
+                       thermal-sensors = <&tsens 1>;
+
+                       trips {
+                               q6_hvx_alert0: trip-point@0 {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+
+               lpass-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <1000>;
+
+                       thermal-sensors = <&tsens 2>;
+
+                       trips {
+                               lpass_alert0: trip-point@0 {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+
+               wlan-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <1000>;
+
+                       thermal-sensors = <&tsens 3>;
+
+                       trips {
+                               wlan_alert0: trip-point@0 {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+
+               cluster-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <1000>;
+
+                       thermal-sensors = <&tsens 4>;
+
+                       trips {
+                               cluster_alert0: trip-point@0 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                               cluster_alert1: trip-point@1 {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                               cluster_crit: cluster_crit {
+                                       temperature = <120000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+                       };
+                       cooling-maps {
+                               map0 {
+                                       trip = <&cluster_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>;
+                               };
+                       };
+               };
+
+               cpu0-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <1000>;
+
+                       thermal-sensors = <&tsens 5>;
+
+                       trips {
+                               cpu0_alert0: trip-point@0 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                               cpu0_alert1: trip-point@1 {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                               cpu0_crit: cpu_crit {
+                                       temperature = <120000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+                       };
+                       cooling-maps {
+                               map0 {
+                                       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 = <1000>;
+
+                       thermal-sensors = <&tsens 6>;
+
+                       trips {
+                               cpu1_alert0: trip-point@0 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                               cpu1_alert1: trip-point@1 {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                               cpu1_crit: cpu_crit {
+                                       temperature = <120000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+                       };
+                       cooling-maps {
+                               map0 {
+                                       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 = <1000>;
+
+                       thermal-sensors = <&tsens 7>;
+
+                       trips {
+                               cpu2_alert0: trip-point@0 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                               cpu2_alert1: trip-point@1 {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                               cpu2_crit: cpu_crit {
+                                       temperature = <120000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+                       };
+                       cooling-maps {
+                               map0 {
+                                       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 = <1000>;
+
+                       thermal-sensors = <&tsens 8>;
+
+                       trips {
+                               cpu3_alert0: trip-point@0 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                               cpu3_alert1: trip-point@1 {
+                                       temperature = <105000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+                               cpu3_crit: cpu_crit {
+                                       temperature = <120000>;
+                                       hysteresis = <2000>;
+                                       type = "critical";
+                               };
+                       };
+                       cooling-maps {
+                               map0 {
+                                       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>;
+                               };
+                       };
+               };
+
+               gpu-thermal {
+                       polling-delay-passive = <250>;
+                       polling-delay = <1000>;
+
+                       thermal-sensors = <&tsens 9>;
+
+                       trips {
+                               gpu_alert0: trip-point@0 {
+                                       temperature = <95000>;
+                                       hysteresis = <2000>;
+                                       type = "hot";
+                               };
+                       };
+               };
+       };
 };
diff --git a/arch/arm64/boot/dts/qcom/sdm845-cheza-r1.dts b/arch/arm64/boot/dts/qcom/sdm845-cheza-r1.dts
new file mode 100644 (file)
index 0000000..bd7c25b
--- /dev/null
@@ -0,0 +1,238 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Google Cheza board device tree source
+ *
+ * Copyright 2018 Google LLC.
+ */
+
+/dts-v1/;
+
+#include "sdm845-cheza.dtsi"
+
+/ {
+       model = "Google Cheza (rev1)";
+       compatible = "google,cheza-rev1", "qcom,sdm845";
+
+       /*
+        * FIXED REGULATORS (not in sdm845-cheza.dtsi) - parents above children
+        */
+
+       /*
+        * NOTE: Technically pp3500_a is not the exact same signal as
+        * pp3500_a_vbob (there's a load switch between them and the EC can
+        * control pp3500_a via "en_pp3300_a"), but from the AP's point of
+        * view they are the same.
+        */
+       pp3500_a:
+       pp3500_a_vbob: pp3500-a-vbob-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "vreg_bob";
+
+               /*
+                * Comes on automatically when pp5000_ldo comes on, which
+                * comes on automatically when ppvar_sys comes on
+                */
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <3500000>;
+               regulator-max-microvolt = <3500000>;
+
+               vin-supply = <&ppvar_sys>;
+       };
+
+       pp3300_dx_edp: pp3300-dx-edp-regulator {
+               /* Yes, it's really 3.5 despite the name of the signal */
+               regulator-min-microvolt = <3500000>;
+               regulator-max-microvolt = <3500000>;
+
+               vin-supply = <&pp3500_a>;
+       };
+};
+
+/* FIXED REGULATOR OVERRIDES (modifications to sdm845-cheza.dtsi) */
+
+/*
+ * L19 and L28 technically go to 3.3V, but most boards have old AOP firmware
+ * that limits them to 3.0, and trying to run at 3.3V with that old firmware
+ * prevents the system from booting.
+ */
+&src_pp3000_l19a {
+       regulator-min-microvolt = <3008000>;
+       regulator-max-microvolt = <3008000>;
+};
+
+&src_pp3300_l22a {
+       /delete-property/regulator-boot-on;
+       /delete-property/regulator-always-on;
+};
+
+&src_pp3300_l28a {
+       regulator-min-microvolt = <3008000>;
+       regulator-max-microvolt = <3008000>;
+};
+
+&src_vreg_bob {
+       regulator-min-microvolt = <3500000>;
+       regulator-max-microvolt = <3500000>;
+       vin-supply = <&pp3500_a_vbob>;
+};
+
+/*
+ * NON-REGULATOR OVERRIDES
+ * (modifications to sdm845-cheza.dtsi) - alphabetized by dtsi label
+ */
+
+/* PINCTRL - board-specific pinctrl */
+
+&tlmm {
+       gpio-line-names = "AP_SPI_FP_MISO",
+                         "AP_SPI_FP_MOSI",
+                         "AP_SPI_FP_CLK",
+                         "AP_SPI_FP_CS_L",
+                         "UART_AP_TX_DBG_RX",
+                         "UART_DBG_TX_AP_RX",
+                         "",
+                         "FP_RST_L",
+                         "FCAM_EN",
+                         "",
+                         "EDP_BRIJ_IRQ",
+                         "EC_IN_RW_ODL",
+                         "",
+                         "RCAM_MCLK",
+                         "FCAM_MCLK",
+                         "",
+                         "RCAM_EN",
+                         "CCI0_SDA",
+                         "CCI0_SCL",
+                         "CCI1_SDA",
+                         "CCI1_SCL",
+                         "FCAM_RST_L",
+                         "",
+                         "PEN_RST_L",
+                         "PEN_IRQ_L",
+                         "",
+                         "RCAM_VSYNC",
+                         "ESIM_MISO",
+                         "ESIM_MOSI",
+                         "ESIM_CLK",
+                         "ESIM_CS_L",
+                         "AP_PEN_1V8_SDA",
+                         "AP_PEN_1V8_SCL",
+                         "AP_TS_I2C_SDA",
+                         "AP_TS_I2C_SCL",
+                         "RCAM_RST_L",
+                         "",
+                         "AP_EDP_BKLTEN",
+                         "AP_BRD_ID1",
+                         "BOOT_CONFIG_4",
+                         "AMP_IRQ_L",
+                         "EDP_BRIJ_I2C_SDA",
+                         "EDP_BRIJ_I2C_SCL",
+                         "EN_PP3300_DX_EDP",
+                         "SD_CD_ODL",
+                         "BT_UART_RTS",
+                         "BT_UART_CTS",
+                         "BT_UART_RXD",
+                         "BT_UART_TXD",
+                         "AMP_I2C_SDA",
+                         "AMP_I2C_SCL",
+                         "AP_BRD_ID3",
+                         "",
+                         "AP_EC_SPI_CLK",
+                         "AP_EC_SPI_CS_L",
+                         "AP_EC_SPI_MISO",
+                         "AP_EC_SPI_MOSI",
+                         "FORCED_USB_BOOT",
+                         "AMP_BCLK",
+                         "AMP_LRCLK",
+                         "AMP_DOUT",
+                         "AMP_DIN",
+                         "AP_BRD_ID2",
+                         "PEN_PDCT_L",
+                         "HP_MCLK",
+                         "HP_BCLK",
+                         "HP_LRCLK",
+                         "HP_DOUT",
+                         "HP_DIN",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "BT_SLIMBUS_DATA",
+                         "BT_SLIMBUS_CLK",
+                         "AMP_RESET_L",
+                         "",
+                         "FCAM_VSYNC",
+                         "",
+                         "AP_SKU_ID1",
+                         "EC_WOV_BCLK",
+                         "EC_WOV_LRCLK",
+                         "EC_WOV_DOUT",
+                         "",
+                         "",
+                         "AP_H1_SPI_MISO",
+                         "AP_H1_SPI_MOSI",
+                         "AP_H1_SPI_CLK",
+                         "AP_H1_SPI_CS_L",
+                         "",
+                         "AP_SPI_CS0_L",
+                         "AP_SPI_MOSI",
+                         "AP_SPI_MISO",
+                         "",
+                         "",
+                         "AP_SPI_CLK",
+                         "",
+                         "RFFE6_CLK",
+                         "RFFE6_DATA",
+                         "BOOT_CONFIG_1",
+                         "BOOT_CONFIG_2",
+                         "BOOT_CONFIG_0",
+                         "EDP_BRIJ_EN",
+                         "",
+                         "USB_HS_TX_EN",
+                         "UIM2_DATA",
+                         "UIM2_CLK",
+                         "UIM2_RST",
+                         "UIM2_PRESENT",
+                         "UIM1_DATA",
+                         "UIM1_CLK",
+                         "UIM1_RST",
+                         "",
+                         "AP_SKU_ID2",
+                         "SDM_GRFC_8",
+                         "SDM_GRFC_9",
+                         "AP_RST_REQ",
+                         "HP_IRQ",
+                         "TS_RESET_L",
+                         "PEN_EJECT_ODL",
+                         "HUB_RST_L",
+                         "FP_TO_AP_IRQ",
+                         "AP_EC_INT_L",
+                         "",
+                         "",
+                         "TS_INT_L",
+                         "AP_SUSPEND_L",
+                         "SDM_GRFC_3",
+                         "",
+                         "H1_AP_INT_ODL",
+                         "QLINK_REQ",
+                         "QLINK_EN",
+                         "SDM_GRFC_2",
+                         "BOOT_CONFIG_3",
+                         "WMSS_RESET_L",
+                         "SDM_GRFC_0",
+                         "SDM_GRFC_1",
+                         "RFFE3_DATA",
+                         "RFFE3_CLK",
+                         "RFFE4_DATA",
+                         "RFFE4_CLK",
+                         "RFFE5_DATA",
+                         "RFFE5_CLK",
+                         "GNSS_EN",
+                         "WCI2_LTE_COEX_RXD",
+                         "WCI2_LTE_COEX_TXD",
+                         "AP_RAM_ID1",
+                         "AP_RAM_ID2",
+                         "RFFE1_DATA",
+                         "RFFE1_CLK";
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm845-cheza-r2.dts b/arch/arm64/boot/dts/qcom/sdm845-cheza-r2.dts
new file mode 100644 (file)
index 0000000..2b72305
--- /dev/null
@@ -0,0 +1,238 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Google Cheza board device tree source
+ *
+ * Copyright 2018 Google LLC.
+ */
+
+/dts-v1/;
+
+#include "sdm845-cheza.dtsi"
+
+/ {
+       model = "Google Cheza (rev2)";
+       compatible = "google,cheza-rev2", "qcom,sdm845";
+
+       /*
+        * FIXED REGULATORS (not in sdm845-cheza.dtsi) - parents above children
+        */
+
+       /*
+        * NOTE: Technically pp3500_a is not the exact same signal as
+        * pp3500_a_vbob (there's a load switch between them and the EC can
+        * control pp3500_a via "en_pp3300_a"), but from the AP's point of
+        * view they are the same.
+        */
+       pp3500_a:
+       pp3500_a_vbob: pp3500-a-vbob-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "vreg_bob";
+
+               /*
+                * Comes on automatically when pp5000_ldo comes on, which
+                * comes on automatically when ppvar_sys comes on
+                */
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <3500000>;
+               regulator-max-microvolt = <3500000>;
+
+               vin-supply = <&ppvar_sys>;
+       };
+
+       pp3300_dx_edp: pp3300-dx-edp-regulator {
+               /* Yes, it's really 3.5 despite the name of the signal */
+               regulator-min-microvolt = <3500000>;
+               regulator-max-microvolt = <3500000>;
+
+               vin-supply = <&pp3500_a>;
+       };
+};
+
+/* FIXED REGULATOR OVERRIDES (modifications to sdm845-cheza.dtsi) */
+
+/*
+ * L19 and L28 technically go to 3.3V, but most boards have old AOP firmware
+ * that limits them to 3.0, and trying to run at 3.3V with that old firmware
+ * prevents the system from booting.
+ */
+&src_pp3000_l19a {
+       regulator-min-microvolt = <3008000>;
+       regulator-max-microvolt = <3008000>;
+};
+
+&src_pp3300_l22a {
+       /delete-property/regulator-boot-on;
+       /delete-property/regulator-always-on;
+};
+
+&src_pp3300_l28a {
+       regulator-min-microvolt = <3008000>;
+       regulator-max-microvolt = <3008000>;
+};
+
+&src_vreg_bob {
+       regulator-min-microvolt = <3500000>;
+       regulator-max-microvolt = <3500000>;
+       vin-supply = <&pp3500_a_vbob>;
+};
+
+/*
+ * NON-REGULATOR OVERRIDES
+ * (modifications to sdm845-cheza.dtsi) - alphabetized by dtsi label
+ */
+
+/* PINCTRL - board-specific pinctrl */
+
+&tlmm {
+       gpio-line-names = "AP_SPI_FP_MISO",
+                         "AP_SPI_FP_MOSI",
+                         "AP_SPI_FP_CLK",
+                         "AP_SPI_FP_CS_L",
+                         "UART_AP_TX_DBG_RX",
+                         "UART_DBG_TX_AP_RX",
+                         "BRIJ_SUSPEND",
+                         "FP_RST_L",
+                         "FCAM_EN",
+                         "",
+                         "EDP_BRIJ_IRQ",
+                         "EC_IN_RW_ODL",
+                         "",
+                         "RCAM_MCLK",
+                         "FCAM_MCLK",
+                         "",
+                         "RCAM_EN",
+                         "CCI0_SDA",
+                         "CCI0_SCL",
+                         "CCI1_SDA",
+                         "CCI1_SCL",
+                         "FCAM_RST_L",
+                         "FPMCU_BOOT0",
+                         "PEN_RST_L",
+                         "PEN_IRQ_L",
+                         "FPMCU_SEL_OD",
+                         "RCAM_VSYNC",
+                         "ESIM_MISO",
+                         "ESIM_MOSI",
+                         "ESIM_CLK",
+                         "ESIM_CS_L",
+                         "AP_PEN_1V8_SDA",
+                         "AP_PEN_1V8_SCL",
+                         "AP_TS_I2C_SDA",
+                         "AP_TS_I2C_SCL",
+                         "RCAM_RST_L",
+                         "",
+                         "AP_EDP_BKLTEN",
+                         "AP_BRD_ID1",
+                         "BOOT_CONFIG_4",
+                         "AMP_IRQ_L",
+                         "EDP_BRIJ_I2C_SDA",
+                         "EDP_BRIJ_I2C_SCL",
+                         "EN_PP3300_DX_EDP",
+                         "SD_CD_ODL",
+                         "BT_UART_RTS",
+                         "BT_UART_CTS",
+                         "BT_UART_RXD",
+                         "BT_UART_TXD",
+                         "AMP_I2C_SDA",
+                         "AMP_I2C_SCL",
+                         "AP_BRD_ID3",
+                         "",
+                         "AP_EC_SPI_CLK",
+                         "AP_EC_SPI_CS_L",
+                         "AP_EC_SPI_MISO",
+                         "AP_EC_SPI_MOSI",
+                         "FORCED_USB_BOOT",
+                         "AMP_BCLK",
+                         "AMP_LRCLK",
+                         "AMP_DOUT",
+                         "AMP_DIN",
+                         "AP_BRD_ID2",
+                         "PEN_PDCT_L",
+                         "HP_MCLK",
+                         "HP_BCLK",
+                         "HP_LRCLK",
+                         "HP_DOUT",
+                         "HP_DIN",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "BT_SLIMBUS_DATA",
+                         "BT_SLIMBUS_CLK",
+                         "AMP_RESET_L",
+                         "",
+                         "FCAM_VSYNC",
+                         "",
+                         "AP_SKU_ID1",
+                         "EC_WOV_BCLK",
+                         "EC_WOV_LRCLK",
+                         "EC_WOV_DOUT",
+                         "",
+                         "",
+                         "AP_H1_SPI_MISO",
+                         "AP_H1_SPI_MOSI",
+                         "AP_H1_SPI_CLK",
+                         "AP_H1_SPI_CS_L",
+                         "",
+                         "AP_SPI_CS0_L",
+                         "AP_SPI_MOSI",
+                         "AP_SPI_MISO",
+                         "",
+                         "",
+                         "AP_SPI_CLK",
+                         "",
+                         "RFFE6_CLK",
+                         "RFFE6_DATA",
+                         "BOOT_CONFIG_1",
+                         "BOOT_CONFIG_2",
+                         "BOOT_CONFIG_0",
+                         "EDP_BRIJ_EN",
+                         "",
+                         "USB_HS_TX_EN",
+                         "UIM2_DATA",
+                         "UIM2_CLK",
+                         "UIM2_RST",
+                         "UIM2_PRESENT",
+                         "UIM1_DATA",
+                         "UIM1_CLK",
+                         "UIM1_RST",
+                         "",
+                         "AP_SKU_ID2",
+                         "SDM_GRFC_8",
+                         "SDM_GRFC_9",
+                         "AP_RST_REQ",
+                         "HP_IRQ",
+                         "TS_RESET_L",
+                         "PEN_EJECT_ODL",
+                         "HUB_RST_L",
+                         "FP_TO_AP_IRQ",
+                         "AP_EC_INT_L",
+                         "",
+                         "",
+                         "TS_INT_L",
+                         "AP_SUSPEND_L",
+                         "SDM_GRFC_3",
+                         "",
+                         "H1_AP_INT_ODL",
+                         "QLINK_REQ",
+                         "QLINK_EN",
+                         "SDM_GRFC_2",
+                         "BOOT_CONFIG_3",
+                         "WMSS_RESET_L",
+                         "SDM_GRFC_0",
+                         "SDM_GRFC_1",
+                         "RFFE3_DATA",
+                         "RFFE3_CLK",
+                         "RFFE4_DATA",
+                         "RFFE4_CLK",
+                         "RFFE5_DATA",
+                         "RFFE5_CLK",
+                         "GNSS_EN",
+                         "WCI2_LTE_COEX_RXD",
+                         "WCI2_LTE_COEX_TXD",
+                         "AP_RAM_ID1",
+                         "AP_RAM_ID2",
+                         "RFFE1_DATA",
+                         "RFFE1_CLK";
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm845-cheza-r3.dts b/arch/arm64/boot/dts/qcom/sdm845-cheza-r3.dts
new file mode 100644 (file)
index 0000000..1ba67be
--- /dev/null
@@ -0,0 +1,174 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Google Cheza board device tree source
+ *
+ * Copyright 2018 Google LLC.
+ */
+
+/dts-v1/;
+
+#include "sdm845-cheza.dtsi"
+
+/ {
+       model = "Google Cheza (rev3+)";
+       compatible = "google,cheza", "qcom,sdm845";
+};
+
+/* PINCTRL - board-specific pinctrl */
+
+&tlmm {
+       gpio-line-names = "AP_SPI_FP_MISO",
+                         "AP_SPI_FP_MOSI",
+                         "AP_SPI_FP_CLK",
+                         "AP_SPI_FP_CS_L",
+                         "UART_AP_TX_DBG_RX",
+                         "UART_DBG_TX_AP_RX",
+                         "BRIJ_SUSPEND",
+                         "FP_RST_L",
+                         "FCAM_EN",
+                         "",
+                         "EDP_BRIJ_IRQ",
+                         "EC_IN_RW_ODL",
+                         "",
+                         "RCAM_MCLK",
+                         "FCAM_MCLK",
+                         "",
+                         "RCAM_EN",
+                         "CCI0_SDA",
+                         "CCI0_SCL",
+                         "CCI1_SDA",
+                         "CCI1_SCL",
+                         "FCAM_RST_L",
+                         "FPMCU_BOOT0",
+                         "PEN_RST_L",
+                         "PEN_IRQ_L",
+                         "FPMCU_SEL_OD",
+                         "RCAM_VSYNC",
+                         "ESIM_MISO",
+                         "ESIM_MOSI",
+                         "ESIM_CLK",
+                         "ESIM_CS_L",
+                         "AP_PEN_1V8_SDA",
+                         "AP_PEN_1V8_SCL",
+                         "AP_TS_I2C_SDA",
+                         "AP_TS_I2C_SCL",
+                         "RCAM_RST_L",
+                         "",
+                         "AP_EDP_BKLTEN",
+                         "AP_BRD_ID0",
+                         "BOOT_CONFIG_4",
+                         "AMP_IRQ_L",
+                         "EDP_BRIJ_I2C_SDA",
+                         "EDP_BRIJ_I2C_SCL",
+                         "EN_PP3300_DX_EDP",
+                         "SD_CD_ODL",
+                         "BT_UART_RTS",
+                         "BT_UART_CTS",
+                         "BT_UART_RXD",
+                         "BT_UART_TXD",
+                         "AMP_I2C_SDA",
+                         "AMP_I2C_SCL",
+                         "AP_BRD_ID2",
+                         "",
+                         "AP_EC_SPI_CLK",
+                         "AP_EC_SPI_CS_L",
+                         "AP_EC_SPI_MISO",
+                         "AP_EC_SPI_MOSI",
+                         "FORCED_USB_BOOT",
+                         "AMP_BCLK",
+                         "AMP_LRCLK",
+                         "AMP_DOUT",
+                         "AMP_DIN",
+                         "AP_BRD_ID1",
+                         "PEN_PDCT_L",
+                         "HP_MCLK",
+                         "HP_BCLK",
+                         "HP_LRCLK",
+                         "HP_DOUT",
+                         "HP_DIN",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "BT_SLIMBUS_DATA",
+                         "BT_SLIMBUS_CLK",
+                         "AMP_RESET_L",
+                         "",
+                         "FCAM_VSYNC",
+                         "",
+                         "AP_SKU_ID0",
+                         "EC_WOV_BCLK",
+                         "EC_WOV_LRCLK",
+                         "EC_WOV_DOUT",
+                         "",
+                         "",
+                         "AP_H1_SPI_MISO",
+                         "AP_H1_SPI_MOSI",
+                         "AP_H1_SPI_CLK",
+                         "AP_H1_SPI_CS_L",
+                         "",
+                         "AP_SPI_CS0_L",
+                         "AP_SPI_MOSI",
+                         "AP_SPI_MISO",
+                         "",
+                         "",
+                         "AP_SPI_CLK",
+                         "",
+                         "RFFE6_CLK",
+                         "RFFE6_DATA",
+                         "BOOT_CONFIG_1",
+                         "BOOT_CONFIG_2",
+                         "BOOT_CONFIG_0",
+                         "EDP_BRIJ_EN",
+                         "",
+                         "USB_HS_TX_EN",
+                         "UIM2_DATA",
+                         "UIM2_CLK",
+                         "UIM2_RST",
+                         "UIM2_PRESENT",
+                         "UIM1_DATA",
+                         "UIM1_CLK",
+                         "UIM1_RST",
+                         "",
+                         "AP_SKU_ID1",
+                         "SDM_GRFC_8",
+                         "SDM_GRFC_9",
+                         "AP_RST_REQ",
+                         "HP_IRQ",
+                         "TS_RESET_L",
+                         "PEN_EJECT_ODL",
+                         "HUB_RST_L",
+                         "FP_TO_AP_IRQ",
+                         "AP_EC_INT_L",
+                         "",
+                         "",
+                         "TS_INT_L",
+                         "AP_SUSPEND_L",
+                         "SDM_GRFC_3",
+                         /*
+                          * AP_FLASH_WP_L is crossystem ABI. Rev3 schematics
+                          * call it BIOS_FLASH_WP_R_L.
+                          */
+                         "AP_FLASH_WP_L",
+                         "H1_AP_INT_ODL",
+                         "QLINK_REQ",
+                         "QLINK_EN",
+                         "SDM_GRFC_2",
+                         "BOOT_CONFIG_3",
+                         "WMSS_RESET_L",
+                         "SDM_GRFC_0",
+                         "SDM_GRFC_1",
+                         "RFFE3_DATA",
+                         "RFFE3_CLK",
+                         "RFFE4_DATA",
+                         "RFFE4_CLK",
+                         "RFFE5_DATA",
+                         "RFFE5_CLK",
+                         "GNSS_EN",
+                         "WCI2_LTE_COEX_RXD",
+                         "WCI2_LTE_COEX_TXD",
+                         "AP_RAM_ID0",
+                         "AP_RAM_ID1",
+                         "RFFE1_DATA",
+                         "RFFE1_CLK";
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi b/arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi
new file mode 100644 (file)
index 0000000..1ebbd56
--- /dev/null
@@ -0,0 +1,1326 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Google Cheza device tree source (common between revisions)
+ *
+ * Copyright 2018 Google LLC.
+ */
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/regulator/qcom,rpmh-regulator.h>
+#include "sdm845.dtsi"
+
+/* PMICs depend on spmi_bus label and so must come after SoC */
+#include "pm8005.dtsi"
+#include "pm8998.dtsi"
+
+/ {
+       aliases {
+               bluetooth0 = &bluetooth;
+               hsuart0 = &uart6;
+               serial0 = &uart9;
+               wifi0 = &wifi;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       backlight: backlight {
+               compatible = "pwm-backlight";
+               pwms = <&cros_ec_pwm 0>;
+               enable-gpios = <&tlmm 37 GPIO_ACTIVE_HIGH>;
+               power-supply = <&ppvar_sys>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&ap_edp_bklten>;
+       };
+
+       /* FIXED REGULATORS - parents above children */
+
+       /* This is the top level supply and variable voltage */
+       ppvar_sys: ppvar-sys-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "ppvar_sys";
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
+       /* This divides ppvar_sys by 2, so voltage is variable */
+       src_vph_pwr: src-vph-pwr-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "src_vph_pwr";
+
+               /* EC turns on with switchcap_on_l; always on for AP */
+               regulator-always-on;
+               regulator-boot-on;
+
+               vin-supply = <&ppvar_sys>;
+       };
+
+       pp5000_a: pp5000-a-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "pp5000_a";
+
+               /* EC turns on with en_pp5000_a; always on for AP */
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+
+               vin-supply = <&ppvar_sys>;
+       };
+
+       src_vreg_bob: src-vreg-bob-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "src_vreg_bob";
+
+               /* EC turns on with vbob_en; always on for AP */
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <3600000>;
+               regulator-max-microvolt = <3600000>;
+
+               vin-supply = <&ppvar_sys>;
+       };
+
+       pp3300_dx_edp: pp3300-dx-edp-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "pp3300_dx_edp";
+
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpio = <&tlmm 43 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               pinctrl-names = "default";
+               pinctrl-0 = <&en_pp3300_dx_edp>;
+       };
+
+       /*
+        * Apparently RPMh does not provide support for PM8998 S4 because it
+        * is always-on; model it as a fixed regulator.
+        */
+       src_pp1800_s4a: pm8998-smps4 {
+               compatible = "regulator-fixed";
+               regulator-name = "src_pp1800_s4a";
+
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+
+               regulator-always-on;
+               regulator-boot-on;
+
+               vin-supply = <&src_vph_pwr>;
+       };
+
+       /* BOARD-SPECIFIC TOP LEVEL NODES */
+
+       gpio-keys {
+               compatible = "gpio-keys";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pen_eject_odl>;
+
+               pen-insert {
+                       label = "Pen Insert";
+                       /* Insert = low, eject = high */
+                       gpios = <&tlmm 119 GPIO_ACTIVE_LOW>;
+                       linux,code = <SW_PEN_INSERTED>;
+                       linux,input-type = <EV_SW>;
+                       wakeup-source;
+               };
+       };
+
+       panel: panel {
+               compatible ="innolux,p120zdg-bf1";
+               power-supply = <&pp3300_dx_edp>;
+               backlight = <&backlight>;
+               no-hpd;
+
+               ports {
+                       panel_in: port {
+                               panel_in_edp: endpoint {
+                                       remote-endpoint = <&sn65dsi86_out>;
+                               };
+                       };
+               };
+       };
+};
+
+/*
+ * Reserved memory changes
+ *
+ * Putting this all together (out of order with the rest of the file) to keep
+ * all modifications to the memory map (from sdm845.dtsi) in one place.
+ */
+
+/*
+ * Our mpss_region is 8MB bigger than the default one and that conflicts
+ * with venus_mem and cdsp_mem.
+ *
+ * For venus_mem we'll delete and re-create at a different address.
+ *
+ * cdsp_mem isn't used on cheza right now so we won't bother re-creating it; but
+ * that also means we need to delete cdsp_pas.
+ */
+/delete-node/ &venus_mem;
+/delete-node/ &cdsp_mem;
+/delete-node/ &cdsp_pas;
+
+/* Increase the size from 120 MB to 128 MB */
+&mpss_region {
+       reg = <0 0x8e000000 0 0x8000000>;
+};
+
+/* Increase the size from 2MB to 8MB */
+&rmtfs_mem {
+       reg = <0 0x88f00000 0 0x800000>;
+};
+
+/ {
+       reserved-memory {
+               venus_mem: memory@96000000 {
+                       reg = <0 0x96000000 0 0x500000>;
+                       no-map;
+               };
+       };
+};
+
+&qspi {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&qspi_clk &qspi_cs0 &qspi_data01>;
+
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               reg = <0>;
+
+               /*
+                * In theory chip supports up to 104 MHz and controller up
+                * to 80 MHz, but above 25 MHz wasn't reliable so we'll use
+                * that for now.  b:117440651
+                */
+               spi-max-frequency = <25000000>;
+               spi-tx-bus-width = <2>;
+               spi-rx-bus-width = <2>;
+       };
+};
+
+
+&apps_rsc {
+       pm8998-rpmh-regulators {
+               compatible = "qcom,pm8998-rpmh-regulators";
+               qcom,pmic-id = "a";
+
+               vdd-s1-supply = <&src_vph_pwr>;
+               vdd-s2-supply = <&src_vph_pwr>;
+               vdd-s3-supply = <&src_vph_pwr>;
+               vdd-s4-supply = <&src_vph_pwr>;
+               vdd-s5-supply = <&src_vph_pwr>;
+               vdd-s6-supply = <&src_vph_pwr>;
+               vdd-s7-supply = <&src_vph_pwr>;
+               vdd-s8-supply = <&src_vph_pwr>;
+               vdd-s9-supply = <&src_vph_pwr>;
+               vdd-s10-supply = <&src_vph_pwr>;
+               vdd-s11-supply = <&src_vph_pwr>;
+               vdd-s12-supply = <&src_vph_pwr>;
+               vdd-s13-supply = <&src_vph_pwr>;
+               vdd-l1-l27-supply = <&src_pp1025_s7a>;
+               vdd-l2-l8-l17-supply = <&src_pp1350_s3a>;
+               vdd-l3-l11-supply = <&src_pp1025_s7a>;
+               vdd-l4-l5-supply = <&src_pp1025_s7a>;
+               vdd-l6-supply = <&src_vph_pwr>;
+               vdd-l7-l12-l14-l15-supply = <&src_pp2040_s5a>;
+               vdd-l9-supply = <&src_pp2040_s5a>;
+               vdd-l10-l23-l25-supply = <&src_vreg_bob>;
+               vdd-l13-l19-l21-supply = <&src_vreg_bob>;
+               vdd-l16-l28-supply = <&src_vreg_bob>;
+               vdd-l18-l22-supply = <&src_vreg_bob>;
+               vdd-l20-l24-supply = <&src_vreg_bob>;
+               vdd-l26-supply = <&src_pp1350_s3a>;
+               vin-lvs-1-2-supply = <&src_pp1800_s4a>;
+
+               src_pp1125_s2a: smps2 {
+                       regulator-min-microvolt = <1100000>;
+                       regulator-max-microvolt = <1100000>;
+               };
+
+               src_pp1350_s3a: smps3 {
+                       regulator-min-microvolt = <1352000>;
+                       regulator-max-microvolt = <1352000>;
+               };
+
+               src_pp2040_s5a: smps5 {
+                       regulator-min-microvolt = <1904000>;
+                       regulator-max-microvolt = <2040000>;
+               };
+
+               src_pp1025_s7a: smps7 {
+                       regulator-min-microvolt = <900000>;
+                       regulator-max-microvolt = <1028000>;
+               };
+
+               vdd_qusb_hs0:
+               vdda_hp_pcie_core:
+               vdda_mipi_csi0_0p9:
+               vdda_mipi_csi1_0p9:
+               vdda_mipi_csi2_0p9:
+               vdda_mipi_dsi0_pll:
+               vdda_mipi_dsi1_pll:
+               vdda_qlink_lv:
+               vdda_qlink_lv_ck:
+               vdda_qrefs_0p875:
+               vdda_pcie_core:
+               vdda_pll_cc_ebi01:
+               vdda_pll_cc_ebi23:
+               vdda_sp_sensor:
+               vdda_ufs1_core:
+               vdda_ufs2_core:
+               vdda_usb1_ss_core:
+               vdda_usb2_ss_core:
+               src_pp875_l1a: ldo1 {
+                       regulator-min-microvolt = <880000>;
+                       regulator-max-microvolt = <880000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vddpx_10:
+               src_pp1200_l2a: ldo2 {
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+
+                       /* TODO: why??? */
+                       regulator-always-on;
+               };
+
+               pp1000_l3a_sdr845: ldo3 {
+                       regulator-min-microvolt = <1000000>;
+                       regulator-max-microvolt = <1000000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vdd_wcss_cx:
+               vdd_wcss_mx:
+               vdda_wcss_pll:
+               src_pp800_l5a: ldo5 {
+                       regulator-min-microvolt = <800000>;
+                       regulator-max-microvolt = <800000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vddpx_13:
+               src_pp1800_l6a: ldo6 {
+                       regulator-min-microvolt = <1856000>;
+                       regulator-max-microvolt = <1856000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               pp1800_l7a_wcn3990: ldo7 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               src_pp1200_l8a: ldo8 {
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1248000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               pp1800_dx_pen:
+               src_pp1800_l9a: ldo9 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               src_pp1800_l10a: ldo10 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               pp1000_l11a_sdr845: ldo11 {
+                       regulator-min-microvolt = <1000000>;
+                       regulator-max-microvolt = <1048000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vdd_qfprom:
+               vdd_qfprom_sp:
+               vdda_apc1_cs_1p8:
+               vdda_gfx_cs_1p8:
+               vdda_qrefs_1p8:
+               vdda_qusb_hs0_1p8:
+               vddpx_11:
+               src_pp1800_l12a: ldo12 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vddpx_2:
+               src_pp2950_l13a: ldo13 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <2960000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               src_pp1800_l14a: ldo14 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               src_pp1800_l15a: ldo15 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               pp2700_l16a: ldo16 {
+                       regulator-min-microvolt = <2704000>;
+                       regulator-max-microvolt = <2704000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               src_pp1300_l17a: ldo17 {
+                       regulator-min-microvolt = <1304000>;
+                       regulator-max-microvolt = <1304000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               pp2700_l18a: ldo18 {
+                       regulator-min-microvolt = <2704000>;
+                       regulator-max-microvolt = <2960000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               /*
+                * NOTE: this rail should have been called
+                * src_pp3300_l19a in the schematic
+                */
+               src_pp3000_l19a: ldo19 {
+                       regulator-min-microvolt = <3304000>;
+                       regulator-max-microvolt = <3304000>;
+
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               src_pp2950_l20a: ldo20 {
+                       regulator-min-microvolt = <2704000>;
+                       regulator-max-microvolt = <2960000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               src_pp2950_l21a: ldo21 {
+                       regulator-min-microvolt = <2704000>;
+                       regulator-max-microvolt = <2960000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               pp3300_hub:
+               src_pp3300_l22a: ldo22 {
+                       regulator-min-microvolt = <3304000>;
+                       regulator-max-microvolt = <3304000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+                       /*
+                        * HACK: Should add a usb hub node and driver
+                        * to turn this on and off at suspend/resume time
+                        */
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               pp3300_l23a_ch1_wcn3990: ldo23 {
+                       regulator-min-microvolt = <3000000>;
+                       regulator-max-microvolt = <3312000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vdda_qusb_hs0_3p1:
+               src_pp3075_l24a: ldo24 {
+                       regulator-min-microvolt = <3088000>;
+                       regulator-max-microvolt = <3088000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               pp3300_l25a_ch0_wcn3990: ldo25 {
+                       regulator-min-microvolt = <3304000>;
+                       regulator-max-microvolt = <3304000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               pp1200_hub:
+               vdda_hp_pcie_1p2:
+               vdda_hv_ebi0:
+               vdda_hv_ebi1:
+               vdda_hv_ebi2:
+               vdda_hv_ebi3:
+               vdda_mipi_csi_1p25:
+               vdda_mipi_dsi0_1p2:
+               vdda_mipi_dsi1_1p2:
+               vdda_pcie_1p2:
+               vdda_ufs1_1p2:
+               vdda_ufs2_1p2:
+               vdda_usb1_ss_1p2:
+               vdda_usb2_ss_1p2:
+               src_pp1200_l26a: ldo26 {
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               pp3300_dx_pen:
+               src_pp3300_l28a: ldo28 {
+                       regulator-min-microvolt = <3304000>;
+                       regulator-max-microvolt = <3304000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               src_pp1800_lvs1: lvs1 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+               };
+
+               src_pp1800_lvs2: lvs2 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+               };
+       };
+
+       pm8005-rpmh-regulators {
+               compatible = "qcom,pm8005-rpmh-regulators";
+               qcom,pmic-id = "c";
+
+               vdd-s1-supply = <&src_vph_pwr>;
+               vdd-s2-supply = <&src_vph_pwr>;
+               vdd-s3-supply = <&src_vph_pwr>;
+               vdd-s4-supply = <&src_vph_pwr>;
+
+               src_pp600_s3c: smps3 {
+                       regulator-min-microvolt = <600000>;
+                       regulator-max-microvolt = <600000>;
+               };
+       };
+};
+
+&dsi0 {
+       status = "okay";
+       vdda-supply = <&vdda_mipi_dsi0_1p2>;
+
+       ports {
+               port@1 {
+                       endpoint {
+                               remote-endpoint = <&sn65dsi86_in>;
+                               data-lanes = <0 1 2 3>;
+                       };
+               };
+       };
+};
+
+&dsi0_phy {
+       status = "okay";
+       vdds-supply = <&vdda_mipi_dsi0_pll>;
+};
+
+edp_brij_i2c: &i2c3 {
+       status = "okay";
+       clock-frequency = <400000>;
+
+       sn65dsi86_bridge: bridge@2d {
+               compatible = "ti,sn65dsi86";
+               reg = <0x2d>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&edp_brij_en &edp_brij_irq>;
+
+               interrupt-parent = <&tlmm>;
+               interrupts = <10 IRQ_TYPE_LEVEL_HIGH>;
+
+               enable-gpios = <&tlmm 102 GPIO_ACTIVE_HIGH>;
+
+               vpll-supply = <&src_pp1800_s4a>;
+               vccio-supply = <&src_pp1800_s4a>;
+               vcca-supply = <&src_pp1200_l2a>;
+               vcc-supply = <&src_pp1200_l2a>;
+
+               clocks = <&rpmhcc RPMH_LN_BB_CLK2>;
+               clock-names = "refclk";
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       port@0 {
+                               reg = <0>;
+                               sn65dsi86_in: endpoint {
+                                       remote-endpoint = <&dsi0_out>;
+                               };
+                       };
+
+                       port@1 {
+                               reg = <1>;
+                               sn65dsi86_out: endpoint {
+                                       remote-endpoint = <&panel_in_edp>;
+                               };
+                       };
+               };
+       };
+};
+
+ap_pen_1v8: &i2c11 {
+       status = "okay";
+       clock-frequency = <400000>;
+
+       digitizer@9 {
+               compatible = "wacom,w9013", "hid-over-i2c";
+               reg = <0x9>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pen_irq_l>, <&pen_pdct_l>, <&pen_rst_l>;
+
+               vdd-supply = <&pp3300_dx_pen>;
+               vddl-supply = <&pp1800_dx_pen>;
+               post-power-on-delay-ms = <100>;
+
+               interrupt-parent = <&tlmm>;
+               interrupts = <24 IRQ_TYPE_LEVEL_LOW>;
+
+               hid-descr-addr = <0x1>;
+       };
+};
+
+amp_i2c: &i2c12 {
+       status = "okay";
+       clock-frequency = <400000>;
+};
+
+ap_ts_i2c: &i2c14 {
+       status = "okay";
+       clock-frequency = <400000>;
+
+       touchscreen@10 {
+               compatible = "elan,ekth3500";
+               reg = <0x10>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&ts_int_l &ts_reset_l>;
+
+               interrupt-parent = <&tlmm>;
+               interrupts = <125 IRQ_TYPE_LEVEL_LOW>;
+
+               vcc33-supply = <&src_pp3300_l28a>;
+
+               reset-gpios = <&tlmm 118 GPIO_ACTIVE_LOW>;
+       };
+};
+
+&lpasscc {
+       status = "okay";
+};
+
+&mdss {
+       status = "okay";
+};
+
+&mdss_mdp {
+       status = "okay";
+};
+
+&qupv3_id_0 {
+       status = "okay";
+};
+
+&qupv3_id_1 {
+       status = "okay";
+};
+
+&sdhc_2 {
+       status = "okay";
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&sdc2_clk &sdc2_cmd &sdc2_data &sd_cd_odl>;
+
+       vmmc-supply = <&src_pp2950_l21a>;
+       vqmmc-supply = <&vddpx_2>;
+
+       cd-gpios = <&tlmm 44 GPIO_ACTIVE_LOW>;
+};
+
+&spi0 {
+       status = "okay";
+};
+
+&spi10 {
+       status = "okay";
+
+       cros_ec: ec@0 {
+               compatible = "google,cros-ec-spi";
+               reg = <0>;
+               interrupt-parent = <&tlmm>;
+               interrupts = <122 IRQ_TYPE_LEVEL_LOW>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&ec_ap_int_l>;
+               spi-max-frequency = <3000000>;
+
+               cros_ec_pwm: ec-pwm {
+                       compatible = "google,cros-ec-pwm";
+                       #pwm-cells = <1>;
+               };
+
+               i2c_tunnel: i2c-tunnel {
+                       compatible = "google,cros-ec-i2c-tunnel";
+                       google,remote-bus = <0>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               pdupdate {
+                       compatible = "google,cros-ec-pd-update";
+               };
+       };
+};
+
+#include <arm/cros-ec-keyboard.dtsi>
+#include <arm/cros-ec-sbs.dtsi>
+
+&uart6 {
+       status = "okay";
+
+       bluetooth: wcn3990-bt {
+               compatible = "qcom,wcn3990-bt";
+               vddio-supply = <&src_pp1800_s4a>;
+               vddxo-supply = <&pp1800_l7a_wcn3990>;
+               vddrf-supply = <&src_pp1300_l17a>;
+               vddch0-supply = <&pp3300_l25a_ch0_wcn3990>;
+               max-speed = <3200000>;
+       };
+};
+
+&uart9 {
+       status = "okay";
+};
+
+&ufs_mem_hc {
+       status = "okay";
+       pinctrl-names = "init", "default";
+       pinctrl-0 = <&ufs_dev_reset_assert>;
+       pinctrl-1 = <&ufs_dev_reset_deassert>;
+
+       vcc-supply = <&src_pp2950_l20a>;
+       vcc-max-microamp = <600000>;
+};
+
+&ufs_mem_phy {
+       status = "okay";
+
+       vdda-phy-supply = <&vdda_ufs1_core>;
+       vdda-pll-supply = <&vdda_ufs1_1p2>;
+};
+
+&usb_1 {
+       status = "okay";
+
+       /* We'll use this as USB 2.0 only */
+       qcom,select-utmi-as-pipe-clk;
+};
+
+&usb_1_dwc3 {
+       /*
+        * The hardware design intends this port to be hooked up in peripheral
+        * mode, so we'll hardcode it here.  Some details:
+        * - SDM845 expects only a single Type C connector so it has only one
+        *   native Type C port but cheza has two Type C connectors.
+        * - The only source of DP is the single native Type C port.
+        * - On cheza we want to be able to hook DP up to _either_ of the
+        *   two Type C connectors and want to be able to achieve 4 lanes of DP.
+        * - When you configure a Type C port for 4 lanes of DP you lose USB3.
+        * - In order to make everything work, the native Type C port is always
+        *   configured as 4-lanes DP so it's always available.
+        * - The extra USB3 port on SDM845 goes to a USB 3 hub which is then
+        *   sent to the two Type C connectors.
+        * - The extra USB2 lines from the native Type C port are always
+        *   setup as "peripheral" so that we can mux them over to one connector
+        *   or the other if someone needs the connector configured as a gadget
+        *   (but they only get USB2 speeds).
+        *
+        * All the hardware muxes would allow us to hook things up in different
+        * ways to some potential benefit for static configurations (you could
+        * achieve extra USB2 bandwidth by using two different ports for the
+        * two conenctors or possibly even get USB3 peripheral mode), but in
+        * each case you end up forcing to disconnect/reconnect an in-use
+        * USB session in some cases depending on what you hotplug into the
+        * other connector.  Thus hardcoding this as peripheral makes sense.
+        */
+       dr_mode = "peripheral";
+
+       /*
+        * We always need the high speed pins as 4-lanes DP in case someone
+        * hotplugs a DP peripheral.  Thus limit this port to a max of high
+        * speed.
+        */
+       maximum-speed = "high-speed";
+
+       /*
+        * We don't need the usb3-phy since we run in highspeed mode always, so
+        * re-define these properties removing the superspeed USB PHY reference.
+        */
+       phys = <&usb_1_hsphy>;
+       phy-names = "usb2-phy";
+};
+
+&usb_1_hsphy {
+       status = "okay";
+
+       vdd-supply = <&vdda_usb1_ss_core>;
+       vdda-pll-supply = <&vdda_qusb_hs0_1p8>;
+       vdda-phy-dpdm-supply = <&vdda_qusb_hs0_3p1>;
+
+       qcom,imp-res-offset-value = <8>;
+       qcom,hstx-trim-value = <QUSB2_V2_HSTX_TRIM_21_6_MA>;
+       qcom,preemphasis-level = <QUSB2_V2_PREEMPHASIS_5_PERCENT>;
+       qcom,preemphasis-width = <QUSB2_V2_PREEMPHASIS_WIDTH_HALF_BIT>;
+};
+
+&usb_2 {
+       status = "okay";
+};
+
+&usb_2_dwc3 {
+       /* We have this hooked up to a hub and we always use in host mode */
+       dr_mode = "host";
+};
+
+&usb_2_hsphy {
+       status = "okay";
+
+       vdd-supply = <&vdda_usb2_ss_core>;
+       vdda-pll-supply = <&vdda_qusb_hs0_1p8>;
+       vdda-phy-dpdm-supply = <&vdda_qusb_hs0_3p1>;
+
+       qcom,imp-res-offset-value = <8>;
+       qcom,hstx-trim-value = <QUSB2_V2_HSTX_TRIM_22_8_MA>;
+};
+
+&usb_2_qmpphy {
+       status = "okay";
+
+       vdda-phy-supply = <&vdda_usb2_ss_1p2>;
+       vdda-pll-supply = <&vdda_usb2_ss_core>;
+};
+
+&wifi {
+       status = "okay";
+
+       vdd-0.8-cx-mx-supply = <&src_pp800_l5a >;
+       vdd-1.8-xo-supply = <&pp1800_l7a_wcn3990>;
+       vdd-1.3-rfa-supply = <&src_pp1300_l17a>;
+       vdd-3.3-ch0-supply = <&pp3300_l25a_ch0_wcn3990>;
+};
+
+/* PINCTRL - additions to nodes defined in sdm845.dtsi */
+
+&qspi_cs0 {
+       pinconf {
+               pins = "gpio90";
+               bias-disable;
+       };
+};
+
+&qspi_clk {
+       pinconf {
+               pins = "gpio95";
+               bias-disable;
+       };
+};
+
+&qspi_data01 {
+       pinconf {
+               pins = "gpio91", "gpio92";
+
+               /* High-Z when no transfers; nice to park the lines */
+               bias-pull-up;
+       };
+};
+
+&qup_i2c3_default {
+       pinconf {
+               pins = "gpio41", "gpio42";
+               drive-strength = <2>;
+
+               /* Has external pullup */
+               bias-disable;
+       };
+};
+
+&qup_i2c11_default {
+       pinconf {
+               pins = "gpio31", "gpio32";
+               drive-strength = <2>;
+
+               /* Has external pullup */
+               bias-disable;
+       };
+};
+
+&qup_i2c12_default {
+       pinconf {
+               pins = "gpio49", "gpio50";
+               drive-strength = <2>;
+
+               /* Has external pullup */
+               bias-disable;
+       };
+};
+
+&qup_i2c14_default {
+       pinconf {
+               pins = "gpio33", "gpio34";
+               drive-strength = <2>;
+
+               /* Has external pullup */
+               bias-disable;
+       };
+};
+
+&qup_spi0_default {
+       pinconf {
+               pins = "gpio0", "gpio1", "gpio2", "gpio3";
+               drive-strength = <2>;
+               bias-disable;
+       };
+};
+
+&qup_spi5_default {
+       pinconf {
+               pins = "gpio85", "gpio86", "gpio87", "gpio88";
+               drive-strength = <2>;
+               bias-disable;
+       };
+};
+
+&qup_spi10_default {
+       pinconf {
+               pins = "gpio53", "gpio54", "gpio55", "gpio56";
+               drive-strength = <2>;
+               bias-disable;
+       };
+};
+
+&qup_uart6_default {
+       /* Change pinmux to all 4 pins since CTS and RTS are connected */
+       pinmux {
+               pins = "gpio45", "gpio46",
+                      "gpio47", "gpio48";
+       };
+
+       pinconf-cts {
+               /*
+                * Configure a pull-down on 45 (CTS) to match the pull of
+                * the Bluetooth module.
+                */
+               pins = "gpio45";
+               bias-pull-down;
+       };
+
+       pinconf-rts-tx {
+               /* We'll drive 46 (RTS) and 47 (TX), so no pull */
+               pins = "gpio46", "gpio47";
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       pinconf-rx {
+               /*
+                * Configure a pull-up on 48 (RX). This is needed to avoid
+                * garbage data when the TX pin of the Bluetooth module is
+                * in tri-state (module powered off or not driving the
+                * signal yet).
+                */
+               pins = "gpio48";
+               bias-pull-up;
+       };
+};
+
+&qup_uart9_default {
+       pinconf-tx {
+               pins = "gpio4";
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       pinconf-rx {
+               pins = "gpio5";
+               drive-strength = <2>;
+               bias-pull-up;
+       };
+};
+
+/* PINCTRL - board-specific pinctrl */
+&pm8005_gpio {
+       gpio-line-names = "",
+                         "",
+                         "SLB",
+                         "";
+};
+
+&pm8998_adc {
+       adc-chan@ADC5_AMUX_THM1_100K_PU {
+               reg = <ADC5_AMUX_THM1_100K_PU>;
+               label = "sdm_temp";
+       };
+
+       adc-chan@ADC5_AMUX_THM2_100K_PU {
+               reg = <ADC5_AMUX_THM2_100K_PU>;
+               label = "quiet_temp";
+       };
+
+       adc-chan@ADC5_AMUX_THM3_100K_PU {
+               reg = <ADC5_AMUX_THM3_100K_PU>;
+               label = "lte_temp_1";
+       };
+
+       adc-chan@ADC5_AMUX_THM4_100K_PU {
+               reg = <ADC5_AMUX_THM4_100K_PU>;
+               label = "lte_temp_2";
+       };
+
+       adc-chan@ADC5_AMUX_THM5_100K_PU {
+               reg = <ADC5_AMUX_THM5_100K_PU>;
+               label = "charger_temp";
+       };
+};
+
+&pm8998_gpio {
+       gpio-line-names = "",
+                         "",
+                         "SW_CTRL",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "",
+                         "CFG_OPT1",
+                         "WCSS_PWR_REQ",
+                         "",
+                         "CFG_OPT2",
+                         "SLB";
+};
+
+&tlmm {
+       /*
+        * pinctrl settings for pins that have no real owners.
+        */
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&bios_flash_wp_r_l>,
+                   <&ap_suspend_l_deassert>;
+
+       pinctrl-1 = <&bios_flash_wp_r_l>,
+                   <&ap_suspend_l_assert>;
+
+       /*
+        * Hogs prevent usermode from changing the value. A GPIO can be both
+        * here and in the pinctrl section.
+        */
+       ap-suspend-l-hog {
+               gpio-hog;
+               gpios = <126 GPIO_ACTIVE_LOW>;
+               output-low;
+       };
+
+       ap_edp_bklten: ap-edp-bklten {
+               pinmux {
+                       pins = "gpio37";
+                       function = "gpio";
+               };
+
+               pinconf {
+                       pins = "gpio37";
+                       drive-strength = <2>;
+                       bias-disable;
+               };
+       };
+
+       bios_flash_wp_r_l: bios-flash-wp-r-l {
+               pinmux {
+                       pins = "gpio128";
+                       function = "gpio";
+                       input-enable;
+               };
+
+               pinconf {
+                       pins = "gpio128";
+                       bias-disable;
+               };
+       };
+
+       ec_ap_int_l: ec-ap-int-l {
+               pinmux {
+                      pins = "gpio122";
+                      function = "gpio";
+                      input-enable;
+               };
+
+               pinconf {
+                      pins = "gpio122";
+                      bias-pull-up;
+               };
+       };
+
+       edp_brij_en: edp-brij-en {
+               pinmux {
+                       pins = "gpio102";
+                       function = "gpio";
+               };
+
+               pinconf {
+                       pins = "gpio102";
+                       drive-strength = <2>;
+                       bias-disable;
+               };
+       };
+
+       edp_brij_irq: edp-brij-irq {
+               pinmux {
+                       pins = "gpio10";
+                       function = "gpio";
+               };
+
+               pinconf {
+                       pins = "gpio10";
+                       drive-strength = <2>;
+                       bias-pull-down;
+               };
+       };
+
+       en_pp3300_dx_edp: en-pp3300-dx-edp {
+               pinmux {
+                       pins = "gpio43";
+                       function = "gpio";
+               };
+
+               pinconf {
+                       pins = "gpio43";
+                       drive-strength = <2>;
+                       bias-disable;
+               };
+       };
+
+       h1_ap_int_odl: h1-ap-int-odl {
+               pinmux {
+                       pins = "gpio129";
+                       function = "gpio";
+                       input-enable;
+               };
+
+               pinconf {
+                       pins = "gpio129";
+                       bias-pull-up;
+               };
+       };
+
+       pen_eject_odl: pen-eject-odl {
+               pinmux {
+                       pins = "gpio119";
+                       function = "gpio";
+                       bias-pull-up;
+               };
+       };
+
+       pen_irq_l: pen-irq-l {
+               pinmux {
+                       pins = "gpio24";
+                       function = "gpio";
+               };
+
+               pinconf {
+                       pins = "gpio24";
+
+                       /* Has external pullup */
+                       bias-disable;
+               };
+       };
+
+       pen_pdct_l: pen-pdct-l {
+               pinmux {
+                       pins = "gpio63";
+                       function = "gpio";
+               };
+
+               pinconf {
+                       pins = "gpio63";
+
+                       /* Has external pullup */
+                       bias-disable;
+               };
+       };
+
+       pen_rst_l: pen-rst-l {
+               pinmux  {
+                       pins = "gpio23";
+                       function = "gpio";
+               };
+
+               pinconf {
+                       pins = "gpio23";
+                       bias-disable;
+                       drive-strength = <2>;
+
+                       /*
+                        * The pen driver doesn't currently support
+                        * driving this reset line.  By specifying
+                        * output-high here we're relying on the fact
+                        * that this pin has a default pulldown at boot
+                        * (which makes sure the pen was in reset if it
+                        * was powered) and then we set it high here to
+                        * take it out of reset.  Better would be if the
+                        * pen driver could control this and we could
+                        * remove "output-high" here.
+                        */
+                       output-high;
+               };
+       };
+
+       sdc2_clk: sdc2-clk {
+               pinconf {
+                       pins = "sdc2_clk";
+                       bias-disable;
+
+                       /*
+                        * It seems that mmc_test reports errors if drive
+                        * strength is not 16.
+                        */
+                       drive-strength = <16>;
+               };
+       };
+
+       sdc2_cmd: sdc2-cmd {
+               pinconf {
+                       pins = "sdc2_cmd";
+                       bias-pull-up;
+                       drive-strength = <16>;
+               };
+       };
+
+       sdc2_data: sdc2-data {
+               pinconf {
+                       pins = "sdc2_data";
+                       bias-pull-up;
+                       drive-strength = <16>;
+               };
+       };
+
+       sd_cd_odl: sd-cd-odl {
+               pinmux {
+                       pins = "gpio44";
+                       function = "gpio";
+               };
+
+               pinconf {
+                       pins = "gpio44";
+                       bias-pull-up;
+               };
+       };
+
+       ts_int_l: ts-int-l {
+               pinmux  {
+                       pins = "gpio125";
+                       function = "gpio";
+               };
+
+               pinconf {
+                       pins = "gpio125";
+                       bias-pull-up;
+               };
+       };
+
+       ts_reset_l: ts-reset-l {
+               pinmux  {
+                       pins = "gpio118";
+                       function = "gpio";
+               };
+
+               pinconf {
+                       pins = "gpio118";
+                       bias-disable;
+                       drive-strength = <2>;
+               };
+       };
+
+       ufs_dev_reset_assert: ufs_dev_reset_assert {
+               config {
+                       pins = "ufs_reset";
+                       bias-pull-down;         /* default: pull down */
+                       /*
+                        * UFS_RESET driver strengths are having
+                        * different values/steps compared to typical
+                        * GPIO drive strengths.
+                        *
+                        * Following table clarifies:
+                        *
+                        * HDRV value | UFS_RESET | Typical GPIO
+                        *   (dec)    |   (mA)    |    (mA)
+                        *     0      |   0.8     |    2
+                        *     1      |   1.55    |    4
+                        *     2      |   2.35    |    6
+                        *     3      |   3.1     |    8
+                        *     4      |   3.9     |    10
+                        *     5      |   4.65    |    12
+                        *     6      |   5.4     |    14
+                        *     7      |   6.15    |    16
+                        *
+                        * POR value for UFS_RESET HDRV is 3 which means
+                        * 3.1mA and we want to use that. Hence just
+                        * specify 8mA to "drive-strength" binding and
+                        * that should result into writing 3 to HDRV
+                        * field.
+                        */
+                       drive-strength = <8>;   /* default: 3.1 mA */
+                       output-low; /* active low reset */
+               };
+       };
+
+       ufs_dev_reset_deassert: ufs_dev_reset_deassert {
+               config {
+                       pins = "ufs_reset";
+                       bias-pull-down;         /* default: pull down */
+                       /*
+                        * default: 3.1 mA
+                        * check comments under ufs_dev_reset_assert
+                        */
+                       drive-strength = <8>;
+                       output-high; /* active low reset */
+               };
+       };
+
+       ap_suspend_l_assert: ap_suspend_l_assert {
+               config {
+                       pins = "gpio126";
+                       function = "gpio";
+                       bias-no-pull;
+                       drive-strength = <2>;
+                       output-low;
+               };
+       };
+
+       ap_suspend_l_deassert: ap_suspend_l_deassert {
+               config {
+                       pins = "gpio126";
+                       function = "gpio";
+                       bias-no-pull;
+                       drive-strength = <2>;
+                       output-high;
+               };
+       };
+};
diff --git a/arch/arm64/boot/dts/qcom/sdm845-db845c.dts b/arch/arm64/boot/dts/qcom/sdm845-db845c.dts
new file mode 100644 (file)
index 0000000..71bd717
--- /dev/null
@@ -0,0 +1,557 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019, Linaro Ltd.
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
+#include <dt-bindings/regulator/qcom,rpmh-regulator.h>
+#include "sdm845.dtsi"
+#include "pm8998.dtsi"
+#include "pmi8998.dtsi"
+
+/ {
+       model = "Thundercomm Dragonboard 845c";
+       compatible = "thundercomm,db845c", "qcom,sdm845";
+
+       aliases {
+               serial0 = &uart9;
+               hsuart0 = &uart6;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       dc12v: dc12v-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "DC12V";
+               regulator-min-microvolt = <12000000>;
+               regulator-max-microvolt = <12000000>;
+               regulator-always-on;
+       };
+
+       gpio_keys {
+               compatible = "gpio-keys";
+               autorepeat;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&vol_up_pin_a>;
+
+               vol-up {
+                       label = "Volume Up";
+                       linux,code = <KEY_VOLUMEUP>;
+                       gpios = <&pm8998_gpio 6 GPIO_ACTIVE_LOW>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               user4 {
+                       label = "green:user4";
+                       gpios = <&pm8998_gpio 13 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "panic-indicator";
+                       default-state = "off";
+               };
+
+               wlan {
+                       label = "yellow:wlan";
+                       gpios = <&pm8998_gpio 9 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "phy0tx";
+                       default-state = "off";
+               };
+
+               bt {
+                       label = "blue:bt";
+                       gpios = <&pm8998_gpio 5 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "bluetooth-power";
+                       default-state = "off";
+               };
+       };
+
+       lt9611_1v8: lt9611-vdd18-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "LT9611_1V8";
+
+               vin-supply = <&vdc_5v>;
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+
+               gpio = <&tlmm 89 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       lt9611_3v3: lt9611-3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "LT9611_3V3";
+
+               vin-supply = <&vdc_3v3>;
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+
+               // TODO: make it possible to drive same GPIO from two clients
+               // gpio = <&tlmm 89 GPIO_ACTIVE_HIGH>;
+               // enable-active-high;
+       };
+
+       pcie0_1p05v: pcie-0-1p05v-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "PCIE0_1.05V";
+
+               vin-supply = <&vbat>;
+               regulator-min-microvolt = <1050000>;
+               regulator-max-microvolt = <1050000>;
+
+               // TODO: make it possible to drive same GPIO from two clients
+               // gpio = <&tlmm 90 GPIO_ACTIVE_HIGH>;
+               // enable-active-high;
+       };
+
+       pcie0_3p3v_dual: vldo-3v3-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "VLDO_3V3";
+
+               vin-supply = <&vbat>;
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpio = <&tlmm 90 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&pcie0_pwren_state>;
+       };
+
+       v5p0_hdmiout: v5p0-hdmiout-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "V5P0_HDMIOUT";
+
+               vin-supply = <&vdc_5v>;
+               regulator-min-microvolt = <500000>;
+               regulator-max-microvolt = <500000>;
+
+               // TODO: make it possible to drive same GPIO from two clients
+               // gpio = <&tlmm 89 GPIO_ACTIVE_HIGH>;
+               // enable-active-high;
+       };
+
+       vbat: vbat-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "VBAT";
+
+               vin-supply = <&dc12v>;
+               regulator-min-microvolt = <4200000>;
+               regulator-max-microvolt = <4200000>;
+               regulator-always-on;
+       };
+
+       vbat_som: vbat-som-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "VBAT_SOM";
+
+               vin-supply = <&dc12v>;
+               regulator-min-microvolt = <4200000>;
+               regulator-max-microvolt = <4200000>;
+               regulator-always-on;
+       };
+
+       vdc_3v3: vdc-3v3-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "VDC_3V3";
+               vin-supply = <&dc12v>;
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+       };
+
+       vdc_5v: vdc-5v-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "VDC_5V";
+
+               vin-supply = <&dc12v>;
+               regulator-min-microvolt = <500000>;
+               regulator-max-microvolt = <500000>;
+               regulator-always-on;
+       };
+
+       vreg_s4a_1p8: vreg-s4a-1p8 {
+               compatible = "regulator-fixed";
+               regulator-name = "vreg_s4a_1p8";
+
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               regulator-always-on;
+       };
+
+       vph_pwr: vph-pwr-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "vph_pwr";
+
+               vin-supply = <&vbat_som>;
+       };
+};
+
+&adsp_pas {
+       status = "okay";
+
+       firmware-name = "qcom/db845c/adsp.mdt";
+};
+
+&apps_rsc {
+       pm8998-rpmh-regulators {
+               compatible = "qcom,pm8998-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-s11-supply = <&vph_pwr>;
+               vdd-s12-supply = <&vph_pwr>;
+               vdd-s13-supply = <&vph_pwr>;
+               vdd-l1-l27-supply = <&vreg_s7a_1p025>;
+               vdd-l2-l8-l17-supply = <&vreg_s3a_1p35>;
+               vdd-l3-l11-supply = <&vreg_s7a_1p025>;
+               vdd-l4-l5-supply = <&vreg_s7a_1p025>;
+               vdd-l6-supply = <&vph_pwr>;
+               vdd-l7-l12-l14-l15-supply = <&vreg_s5a_2p04>;
+               vdd-l9-supply = <&vreg_bob>;
+               vdd-l10-l23-l25-supply = <&vreg_bob>;
+               vdd-l13-l19-l21-supply = <&vreg_bob>;
+               vdd-l16-l28-supply = <&vreg_bob>;
+               vdd-l18-l22-supply = <&vreg_bob>;
+               vdd-l20-l24-supply = <&vreg_bob>;
+               vdd-l26-supply = <&vreg_s3a_1p35>;
+               vin-lvs-1-2-supply = <&vreg_s4a_1p8>;
+
+               vreg_s3a_1p35: smps3 {
+                       regulator-min-microvolt = <1352000>;
+                       regulator-max-microvolt = <1352000>;
+               };
+
+               vreg_s5a_2p04: smps5 {
+                       regulator-min-microvolt = <1904000>;
+                       regulator-max-microvolt = <2040000>;
+               };
+
+               vreg_s7a_1p025: smps7 {
+                       regulator-min-microvolt = <900000>;
+                       regulator-max-microvolt = <1028000>;
+               };
+
+               vreg_l1a_0p875: ldo1 {
+                       regulator-min-microvolt = <880000>;
+                       regulator-max-microvolt = <880000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l5a_0p8: ldo5 {
+                       regulator-min-microvolt = <800000>;
+                       regulator-max-microvolt = <800000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l12a_1p8: ldo12 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       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>;
+               };
+
+               vreg_l13a_2p95: ldo13 {
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <2960000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l17a_1p3: ldo17 {
+                       regulator-min-microvolt = <1304000>;
+                       regulator-max-microvolt = <1304000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l20a_2p95: ldo20 {
+                       regulator-min-microvolt = <2960000>;
+                       regulator-max-microvolt = <2968000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l21a_2p95: ldo21 {
+                       regulator-min-microvolt = <2960000>;
+                       regulator-max-microvolt = <2968000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l24a_3p075: ldo24 {
+                       regulator-min-microvolt = <3088000>;
+                       regulator-max-microvolt = <3088000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l25a_3p3: ldo25 {
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3312000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+
+               vreg_l26a_1p2: ldo26 {
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
+               };
+       };
+
+       pmi8998-rpmh-regulators {
+               compatible = "qcom,pmi8998-rpmh-regulators";
+               qcom,pmic-id = "b";
+
+               vdd-bob-supply = <&vph_pwr>;
+
+               vreg_bob: bob {
+                       regulator-min-microvolt = <3312000>;
+                       regulator-max-microvolt = <3600000>;
+                       regulator-initial-mode = <RPMH_REGULATOR_MODE_AUTO>;
+                       regulator-allow-bypass;
+               };
+       };
+};
+
+&cdsp_pas {
+       status = "okay";
+       firmware-name = "qcom/db845c/cdsp.mdt";
+};
+
+&gcc {
+       protected-clocks = <GCC_QSPI_CORE_CLK>,
+                          <GCC_QSPI_CORE_CLK_SRC>,
+                          <GCC_QSPI_CNOC_PERIPH_AHB_CLK>;
+};
+
+&pm8998_gpio {
+       vol_up_pin_a: vol-up-active {
+               pins = "gpio6";
+               function = "normal";
+               input-enable;
+               bias-pull-up;
+               qcom,drive-strength = <PMIC_GPIO_STRENGTH_NO>;
+       };
+};
+
+&pm8998_pon {
+       resin {
+               compatible = "qcom,pm8941-resin";
+               interrupts = <0x0 0x8 1 IRQ_TYPE_EDGE_BOTH>;
+               debounce = <15625>;
+               bias-pull-up;
+               linux,code = <KEY_VOLUMEDOWN>;
+       };
+};
+
+&qupv3_id_0 {
+       status = "okay";
+};
+
+&qupv3_id_1 {
+       status = "okay";
+};
+
+&sdhc_2 {
+       status = "okay";
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&sdc2_default_state &sdc2_card_det_n>;
+
+       vmmc-supply = <&vreg_l21a_2p95>;
+       vqmmc-supply = <&vreg_l13a_2p95>;
+
+       bus-width = <4>;
+       cd-gpios = <&tlmm 126 GPIO_ACTIVE_LOW>;
+};
+
+&tlmm {
+       pcie0_pwren_state: pcie0-pwren {
+               pins = "gpio90";
+               function = "gpio";
+
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       sdc2_default_state: sdc2-default {
+               clk {
+                       pins = "sdc2_clk";
+                       bias-disable;
+
+                       /*
+                        * It seems that mmc_test reports errors if drive
+                        * strength is not 16 on clk, cmd, and data pins.
+                        */
+                       drive-strength = <16>;
+               };
+
+               cmd {
+                       pins = "sdc2_cmd";
+                       bias-pull-up;
+                       drive-strength = <10>;
+               };
+
+               data {
+                       pins = "sdc2_data";
+                       bias-pull-up;
+                       drive-strength = <10>;
+               };
+       };
+
+       sdc2_card_det_n: sd-card-det-n {
+               pins = "gpio126";
+               function = "gpio";
+               bias-pull-up;
+       };
+};
+
+&uart6 {
+       status = "okay";
+
+       bluetooth {
+               compatible = "qcom,wcn3990-bt";
+
+               vddio-supply = <&vreg_s4a_1p8>;
+               vddxo-supply = <&vreg_l7a_1p8>;
+               vddrf-supply = <&vreg_l17a_1p3>;
+               vddch0-supply = <&vreg_l25a_3p3>;
+               max-speed = <3200000>;
+       };
+};
+
+&uart9 {
+       status = "okay";
+};
+
+&usb_1 {
+       status = "okay";
+};
+
+&usb_1_dwc3 {
+       dr_mode = "peripheral";
+};
+
+&usb_1_hsphy {
+       status = "okay";
+
+       vdd-supply = <&vreg_l1a_0p875>;
+       vdda-pll-supply = <&vreg_l12a_1p8>;
+       vdda-phy-dpdm-supply = <&vreg_l24a_3p075>;
+
+       qcom,imp-res-offset-value = <8>;
+       qcom,hstx-trim-value = <QUSB2_V2_HSTX_TRIM_21_6_MA>;
+       qcom,preemphasis-level = <QUSB2_V2_PREEMPHASIS_5_PERCENT>;
+       qcom,preemphasis-width = <QUSB2_V2_PREEMPHASIS_WIDTH_HALF_BIT>;
+};
+
+&usb_1_qmpphy {
+       status = "okay";
+
+       vdda-phy-supply = <&vreg_l26a_1p2>;
+       vdda-pll-supply = <&vreg_l1a_0p875>;
+};
+
+&usb_2 {
+       status = "okay";
+};
+
+&usb_2_dwc3 {
+       dr_mode = "host";
+};
+
+&usb_2_hsphy {
+       status = "okay";
+
+       vdd-supply = <&vreg_l1a_0p875>;
+       vdda-pll-supply = <&vreg_l12a_1p8>;
+       vdda-phy-dpdm-supply = <&vreg_l24a_3p075>;
+
+       qcom,imp-res-offset-value = <8>;
+       qcom,hstx-trim-value = <QUSB2_V2_HSTX_TRIM_22_8_MA>;
+};
+
+&usb_2_qmpphy {
+       status = "okay";
+
+       vdda-phy-supply = <&vreg_l26a_1p2>;
+       vdda-pll-supply = <&vreg_l1a_0p875>;
+};
+
+&ufs_mem_hc {
+       status = "okay";
+
+       vcc-supply = <&vreg_l20a_2p95>;
+       vcc-max-microamp = <800000>;
+};
+
+&ufs_mem_phy {
+       status = "okay";
+
+       vdda-phy-supply = <&vreg_l1a_0p875>;
+       vdda-pll-supply = <&vreg_l26a_1p2>;
+};
+
+&wifi {
+       status = "okay";
+
+       vdd-0.8-cx-mx-supply = <&vreg_l5a_0p8>;
+       vdd-1.8-xo-supply = <&vreg_l7a_1p8>;
+       vdd-1.3-rfa-supply = <&vreg_l17a_1p3>;
+       vdd-3.3-ch0-supply = <&vreg_l25a_3p3>;
+};
+
+/* PINCTRL - additions to nodes defined in sdm845.dtsi */
+
+&qup_uart6_default {
+       pinmux {
+               pins = "gpio45", "gpio46", "gpio47", "gpio48";
+               function = "qup6";
+       };
+
+       cts {
+               pins = "gpio45";
+               bias-disable;
+       };
+
+       rts-tx {
+               pins = "gpio46", "gpio47";
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       rx {
+               pins = "gpio48";
+               bias-pull-up;
+       };
+};
+
+&qup_uart9_default {
+       pinconf-tx {
+               pins = "gpio4";
+               drive-strength = <2>;
+               bias-disable;
+       };
+
+       pinconf-rx {
+               pins = "gpio5";
+               drive-strength = <2>;
+               bias-pull-up;
+       };
+};
index 02b8357c8ce81ed7290eb2c25e80e13de2dd48cb..2e78638eb73bb4dbf1e119a662611b64e8792fc6 100644 (file)
 };
 
 &usb_1_dwc3 {
-       /* Until we have Type C hooked up we'll force this as host. */
-       dr_mode = "host";
+       /* Until we have Type C hooked up we'll force this as peripheral. */
+       dr_mode = "peripheral";
 };
 
 &usb_1_hsphy {
index fcb93300ca628067f87e2a011dfc070fcc28d867..4babff5f19b5c35b3a6ad8a85adbc2dc4345ce66 100644 (file)
                        compatible = "qcom,kryo385";
                        reg = <0x0 0x0>;
                        enable-method = "psci";
+                       cpu-idle-states = <&LITTLE_CPU_SLEEP_0
+                                          &LITTLE_CPU_SLEEP_1
+                                          &CLUSTER_SLEEP_0>;
                        capacity-dmips-mhz = <607>;
                        qcom,freq-domain = <&cpufreq_hw 0>;
                        #cooling-cells = <2>;
                        compatible = "qcom,kryo385";
                        reg = <0x0 0x100>;
                        enable-method = "psci";
+                       cpu-idle-states = <&LITTLE_CPU_SLEEP_0
+                                          &LITTLE_CPU_SLEEP_1
+                                          &CLUSTER_SLEEP_0>;
                        capacity-dmips-mhz = <607>;
                        qcom,freq-domain = <&cpufreq_hw 0>;
                        #cooling-cells = <2>;
                        compatible = "qcom,kryo385";
                        reg = <0x0 0x200>;
                        enable-method = "psci";
+                       cpu-idle-states = <&LITTLE_CPU_SLEEP_0
+                                          &LITTLE_CPU_SLEEP_1
+                                          &CLUSTER_SLEEP_0>;
                        capacity-dmips-mhz = <607>;
                        qcom,freq-domain = <&cpufreq_hw 0>;
                        #cooling-cells = <2>;
                        compatible = "qcom,kryo385";
                        reg = <0x0 0x300>;
                        enable-method = "psci";
+                       cpu-idle-states = <&LITTLE_CPU_SLEEP_0
+                                          &LITTLE_CPU_SLEEP_1
+                                          &CLUSTER_SLEEP_0>;
                        capacity-dmips-mhz = <607>;
                        qcom,freq-domain = <&cpufreq_hw 0>;
                        #cooling-cells = <2>;
                        reg = <0x0 0x400>;
                        enable-method = "psci";
                        capacity-dmips-mhz = <1024>;
+                       cpu-idle-states = <&BIG_CPU_SLEEP_0
+                                          &BIG_CPU_SLEEP_1
+                                          &CLUSTER_SLEEP_0>;
                        qcom,freq-domain = <&cpufreq_hw 1>;
                        #cooling-cells = <2>;
                        next-level-cache = <&L2_400>;
                        reg = <0x0 0x500>;
                        enable-method = "psci";
                        capacity-dmips-mhz = <1024>;
+                       cpu-idle-states = <&BIG_CPU_SLEEP_0
+                                          &BIG_CPU_SLEEP_1
+                                          &CLUSTER_SLEEP_0>;
                        qcom,freq-domain = <&cpufreq_hw 1>;
                        #cooling-cells = <2>;
                        next-level-cache = <&L2_500>;
                        reg = <0x0 0x600>;
                        enable-method = "psci";
                        capacity-dmips-mhz = <1024>;
+                       cpu-idle-states = <&BIG_CPU_SLEEP_0
+                                          &BIG_CPU_SLEEP_1
+                                          &CLUSTER_SLEEP_0>;
                        qcom,freq-domain = <&cpufreq_hw 1>;
                        #cooling-cells = <2>;
                        next-level-cache = <&L2_600>;
                        reg = <0x0 0x700>;
                        enable-method = "psci";
                        capacity-dmips-mhz = <1024>;
+                       cpu-idle-states = <&BIG_CPU_SLEEP_0
+                                          &BIG_CPU_SLEEP_1
+                                          &CLUSTER_SLEEP_0>;
                        qcom,freq-domain = <&cpufreq_hw 1>;
                        #cooling-cells = <2>;
                        next-level-cache = <&L2_700>;
                                core3 {
                                        cpu = <&CPU3>;
                                };
-                       };
 
-                       cluster1 {
-                               core0 {
+                               core4 {
                                        cpu = <&CPU4>;
                                };
 
-                               core1 {
+                               core5 {
                                        cpu = <&CPU5>;
                                };
 
-                               core2 {
+                               core6 {
                                        cpu = <&CPU6>;
                                };
 
-                               core3 {
+                               core7 {
                                        cpu = <&CPU7>;
                                };
                        };
                };
+
+               idle-states {
+                       entry-method = "psci";
+
+                       LITTLE_CPU_SLEEP_0: cpu-sleep-0-0 {
+                               compatible = "arm,idle-state";
+                               idle-state-name = "little-power-down";
+                               arm,psci-suspend-param = <0x40000003>;
+                               entry-latency-us = <350>;
+                               exit-latency-us = <461>;
+                               min-residency-us = <1890>;
+                               local-timer-stop;
+                       };
+
+                       LITTLE_CPU_SLEEP_1: cpu-sleep-0-1 {
+                               compatible = "arm,idle-state";
+                               idle-state-name = "little-rail-power-down";
+                               arm,psci-suspend-param = <0x40000004>;
+                               entry-latency-us = <360>;
+                               exit-latency-us = <531>;
+                               min-residency-us = <3934>;
+                               local-timer-stop;
+                       };
+
+                       BIG_CPU_SLEEP_0: cpu-sleep-1-0 {
+                               compatible = "arm,idle-state";
+                               idle-state-name = "big-power-down";
+                               arm,psci-suspend-param = <0x40000003>;
+                               entry-latency-us = <264>;
+                               exit-latency-us = <621>;
+                               min-residency-us = <952>;
+                               local-timer-stop;
+                       };
+
+                       BIG_CPU_SLEEP_1: cpu-sleep-1-1 {
+                               compatible = "arm,idle-state";
+                               idle-state-name = "big-rail-power-down";
+                               arm,psci-suspend-param = <0x40000004>;
+                               entry-latency-us = <702>;
+                               exit-latency-us = <1061>;
+                               min-residency-us = <4488>;
+                               local-timer-stop;
+                       };
+
+                       CLUSTER_SLEEP_0: cluster-sleep-0 {
+                               compatible = "arm,idle-state";
+                               idle-state-name = "cluster-power-down";
+                               arm,psci-suspend-param = <0x400000F4>;
+                               entry-latency-us = <3263>;
+                               exit-latency-us = <6562>;
+                               min-residency-us = <9987>;
+                               local-timer-stop;
+                       };
+               };
        };
 
        pmu {
                        };
                };
 
+               mss_pil: remoteproc@4080000 {
+                       compatible = "qcom,sdm845-mss-pil";
+                       reg = <0 0x04080000 0 0x408>, <0 0x04180000 0 0x48>;
+                       reg-names = "qdsp6", "rmb";
+
+                       interrupts-extended =
+                               <&intc GIC_SPI 266 IRQ_TYPE_EDGE_RISING>,
+                               <&modem_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
+                               <&modem_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
+                               <&modem_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
+                               <&modem_smp2p_in 3 IRQ_TYPE_EDGE_RISING>,
+                               <&modem_smp2p_in 7 IRQ_TYPE_EDGE_RISING>;
+                       interrupt-names = "wdog", "fatal", "ready",
+                                         "handover", "stop-ack",
+                                         "shutdown-ack";
+
+                       clocks = <&gcc GCC_MSS_CFG_AHB_CLK>,
+                                <&gcc GCC_MSS_Q6_MEMNOC_AXI_CLK>,
+                                <&gcc GCC_BOOT_ROM_AHB_CLK>,
+                                <&gcc GCC_MSS_GPLL0_DIV_CLK_SRC>,
+                                <&gcc GCC_MSS_SNOC_AXI_CLK>,
+                                <&gcc GCC_MSS_MFAB_AXIS_CLK>,
+                                <&gcc GCC_PRNG_AHB_CLK>,
+                                <&rpmhcc RPMH_CXO_CLK>;
+                       clock-names = "iface", "bus", "mem", "gpll0_mss",
+                                     "snoc_axi", "mnoc_axi", "prng", "xo";
+
+                       qcom,smem-states = <&modem_smp2p_out 0>;
+                       qcom,smem-state-names = "stop";
+
+                       resets = <&aoss_reset AOSS_CC_MSS_RESTART>,
+                                <&pdc_reset PDC_MODEM_SYNC_RESET>;
+                       reset-names = "mss_restart", "pdc_reset";
+
+                       qcom,halt-regs = <&tcsr_mutex_regs 0x23000 0x25000 0x24000>;
+
+                       power-domains = <&aoss_qmp 2>,
+                                       <&rpmhpd SDM845_CX>,
+                                       <&rpmhpd SDM845_MX>,
+                                       <&rpmhpd SDM845_MSS>;
+                       power-domain-names = "load_state", "cx", "mx", "mss";
+
+                       mba {
+                               memory-region = <&mba_region>;
+                       };
+
+                       mpss {
+                               memory-region = <&mpss_region>;
+                       };
+
+                       glink-edge {
+                               interrupts = <GIC_SPI 449 IRQ_TYPE_EDGE_RISING>;
+                               label = "modem";
+                               qcom,remote-pid = <1>;
+                               mboxes = <&apss_shared 12>;
+                       };
+               };
+
                gpucc: clock-controller@5090000 {
                        compatible = "qcom,sdm845-gpucc";
                        reg = <0 0x05090000 0 0x9000>;
                        };
                };
 
+               gpu@5000000 {
+                       compatible = "qcom,adreno-630.2", "qcom,adreno";
+                       #stream-id-cells = <16>;
+
+                       reg = <0 0x5000000 0 0x40000>, <0 0x509e000 0 0x10>;
+                       reg-names = "kgsl_3d0_reg_memory", "cx_mem";
+
+                       /*
+                        * Look ma, no clocks! The GPU clocks and power are
+                        * controlled entirely by the GMU
+                        */
+
+                       interrupts = <GIC_SPI 300 IRQ_TYPE_LEVEL_HIGH>;
+
+                       iommus = <&adreno_smmu 0>;
+
+                       operating-points-v2 = <&gpu_opp_table>;
+
+                       qcom,gmu = <&gmu>;
+
+                       zap-shader {
+                               memory-region = <&gpu_mem>;
+                       };
+
+                       gpu_opp_table: opp-table {
+                               compatible = "operating-points-v2";
+
+                               opp-710000000 {
+                                       opp-hz = /bits/ 64 <710000000>;
+                                       opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L1>;
+                               };
+
+                               opp-675000000 {
+                                       opp-hz = /bits/ 64 <675000000>;
+                                       opp-level = <RPMH_REGULATOR_LEVEL_TURBO>;
+                               };
+
+                               opp-596000000 {
+                                       opp-hz = /bits/ 64 <596000000>;
+                                       opp-level = <RPMH_REGULATOR_LEVEL_NOM_L1>;
+                               };
+
+                               opp-520000000 {
+                                       opp-hz = /bits/ 64 <520000000>;
+                                       opp-level = <RPMH_REGULATOR_LEVEL_NOM>;
+                               };
+
+                               opp-414000000 {
+                                       opp-hz = /bits/ 64 <414000000>;
+                                       opp-level = <RPMH_REGULATOR_LEVEL_SVS_L1>;
+                               };
+
+                               opp-342000000 {
+                                       opp-hz = /bits/ 64 <342000000>;
+                                       opp-level = <RPMH_REGULATOR_LEVEL_SVS>;
+                               };
+
+                               opp-257000000 {
+                                       opp-hz = /bits/ 64 <257000000>;
+                                       opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS>;
+                               };
+                       };
+               };
+
+               adreno_smmu: iommu@5040000 {
+                       compatible = "qcom,sdm845-smmu-v2", "qcom,smmu-v2";
+                       reg = <0 0x5040000 0 0x10000>;
+                       #iommu-cells = <1>;
+                       #global-interrupts = <2>;
+                       interrupts = <GIC_SPI 229 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 231 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 364 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 365 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 366 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 367 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 368 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 369 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 370 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 371 IRQ_TYPE_EDGE_RISING>;
+                       clocks = <&gcc GCC_GPU_MEMNOC_GFX_CLK>,
+                                <&gcc GCC_GPU_CFG_AHB_CLK>;
+                       clock-names = "bus", "iface";
+
+                       power-domains = <&gpucc GPU_CX_GDSC>;
+               };
+
+               gmu: gmu@506a000 {
+                       compatible="qcom,adreno-gmu-630.2", "qcom,adreno-gmu";
+
+                       reg = <0 0x506a000 0 0x30000>,
+                             <0 0xb280000 0 0x10000>,
+                             <0 0xb480000 0 0x10000>;
+                       reg-names = "gmu", "gmu_pdc", "gmu_pdc_seq";
+
+                       interrupts = <GIC_SPI 304 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 305 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "hfi", "gmu";
+
+                       clocks = <&gpucc GPU_CC_CX_GMU_CLK>,
+                                <&gpucc GPU_CC_CXO_CLK>,
+                                <&gcc GCC_DDRSS_GPU_AXI_CLK>,
+                                <&gcc GCC_GPU_MEMNOC_GFX_CLK>;
+                       clock-names = "gmu", "cxo", "axi", "memnoc";
+
+                       power-domains = <&gpucc GPU_CX_GDSC>,
+                                       <&gpucc GPU_GX_GDSC>;
+                       power-domain-names = "cx", "gx";
+
+                       iommus = <&adreno_smmu 5>;
+
+                       operating-points-v2 = <&gmu_opp_table>;
+
+                       gmu_opp_table: opp-table {
+                               compatible = "operating-points-v2";
+
+                               opp-400000000 {
+                                       opp-hz = /bits/ 64 <400000000>;
+                                       opp-level = <RPMH_REGULATOR_LEVEL_SVS>;
+                               };
+
+                               opp-200000000 {
+                                       opp-hz = /bits/ 64 <200000000>;
+                                       opp-level = <RPMH_REGULATOR_LEVEL_MIN_SVS>;
+                               };
+                       };
+               };
+
                dispcc: clock-controller@af00000 {
                        compatible = "qcom,sdm845-dispcc";
                        reg = <0 0x0af00000 0 0x10000>;
                        #reset-cells = <1>;
                };
 
+               aoss_qmp: qmp@c300000 {
+                       compatible = "qcom,sdm845-aoss-qmp";
+                       reg = <0 0x0c300000 0 0x100000>;
+                       interrupts = <GIC_SPI 389 IRQ_TYPE_EDGE_RISING>;
+                       mboxes = <&apss_shared 0>;
+
+                       #clock-cells = <0>;
+                       #power-domain-cells = <1>;
+               };
+
                spmi_bus: spmi@c440000 {
                        compatible = "qcom,spmi-pmic-arb";
                        reg = <0 0x0c440000 0 0x1100>,
index 6cde526547e4ebf29410e8b72d8175744c04fb6a..42b74c283289d0f007607281b45457e015ca23f7 100644 (file)
@@ -1,4 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
+dtb-$(CONFIG_ARCH_R8A774A1) += r8a774a1-hihope-rzg2m.dtb
+dtb-$(CONFIG_ARCH_R8A774A1) += r8a774a1-hihope-rzg2m-ex.dtb
 dtb-$(CONFIG_ARCH_R8A774C0) += r8a774c0-cat874.dtb r8a774c0-ek874.dtb
 dtb-$(CONFIG_ARCH_R8A7795) += r8a7795-salvator-x.dtb r8a7795-h3ulcb.dtb
 dtb-$(CONFIG_ARCH_R8A7795) += r8a7795-h3ulcb-kf.dtb
diff --git a/arch/arm64/boot/dts/renesas/hihope-common.dtsi b/arch/arm64/boot/dts/renesas/hihope-common.dtsi
new file mode 100644 (file)
index 0000000..3311a98
--- /dev/null
@@ -0,0 +1,325 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Device Tree Source for the HiHope RZ/G2[MN] main board common parts
+ *
+ * Copyright (C) 2019 Renesas Electronics Corp.
+ */
+
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+       aliases {
+               serial0 = &scif2;
+       };
+
+       chosen {
+               bootargs = "ignore_loglevel";
+               stdout-path = "serial0:115200n8";
+       };
+
+       hdmi0-out {
+               compatible = "hdmi-connector";
+               type = "a";
+
+               port {
+                       hdmi0_con: endpoint {
+                               remote-endpoint = <&rcar_dw_hdmi0_out>;
+                       };
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               led0 {
+                       gpios = <&gpio6 11 GPIO_ACTIVE_HIGH>;
+               };
+
+               led1 {
+                       gpios = <&gpio6 12 GPIO_ACTIVE_HIGH>;
+               };
+
+               led2 {
+                       gpios = <&gpio6 13 GPIO_ACTIVE_HIGH>;
+               };
+
+               led3 {
+                       gpios = <&gpio0  0 GPIO_ACTIVE_HIGH>;
+               };
+       };
+
+       reg_1p8v: regulator0 {
+               compatible = "regulator-fixed";
+               regulator-name = "fixed-1.8V";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               regulator-boot-on;
+               regulator-always-on;
+       };
+
+       reg_3p3v: regulator1 {
+               compatible = "regulator-fixed";
+               regulator-name = "fixed-3.3V";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-boot-on;
+               regulator-always-on;
+       };
+
+       vbus0_usb2: regulator-vbus0-usb2 {
+               compatible = "regulator-fixed";
+
+               regulator-name = "USB20_VBUS0";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+
+               gpio = <&gpio6 16 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       vccq_sdhi0: regulator-vccq-sdhi0 {
+               compatible = "regulator-gpio";
+
+               regulator-name = "SDHI0 VccQ";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpios = <&gpio6 30 GPIO_ACTIVE_HIGH>;
+               gpios-states = <1>;
+               states = <3300000 1
+                         1800000 0>;
+       };
+
+       x302_clk: x302-clock {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <33000000>;
+       };
+
+       x304_clk: x304-clock {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <25000000>;
+       };
+};
+
+&du {
+       clocks = <&cpg CPG_MOD 724>,
+                <&cpg CPG_MOD 723>,
+                <&cpg CPG_MOD 722>,
+                <&versaclock5 1>,
+                <&x302_clk>,
+                <&versaclock5 2>;
+       clock-names = "du.0", "du.1", "du.2",
+                     "dclkin.0", "dclkin.1", "dclkin.2";
+       status = "okay";
+};
+
+&ehci0 {
+       status = "okay";
+};
+
+&ehci1 {
+       status = "okay";
+};
+
+&extal_clk {
+       clock-frequency = <16666666>;
+};
+
+&extalr_clk {
+       clock-frequency = <32768>;
+};
+
+&gpio6 {
+       usb1-reset {
+               gpio-hog;
+               gpios = <10 GPIO_ACTIVE_LOW>;
+               output-low;
+               line-name = "usb1-reset";
+       };
+};
+
+&hdmi0 {
+       status = "okay";
+
+       ports {
+               port@1 {
+                       reg = <1>;
+                       rcar_dw_hdmi0_out: endpoint {
+                               remote-endpoint = <&hdmi0_con>;
+                       };
+               };
+       };
+};
+
+&hsusb {
+       dr_mode = "otg";
+       status = "okay";
+};
+
+&i2c4 {
+       clock-frequency = <400000>;
+       status = "okay";
+
+       versaclock5: clock-generator@6a {
+               compatible = "idt,5p49v5923";
+               reg = <0x6a>;
+               #clock-cells = <1>;
+               clocks = <&x304_clk>;
+               clock-names = "xin";
+       };
+};
+
+&ohci0 {
+       status = "okay";
+};
+
+&ohci1 {
+       status = "okay";
+};
+
+&pcie_bus_clk {
+       clock-frequency = <100000000>;
+};
+
+&pfc {
+       pinctrl-0 = <&scif_clk_pins>;
+       pinctrl-names = "default";
+
+       scif2_pins: scif2 {
+               groups = "scif2_data_a";
+               function = "scif2";
+       };
+
+       scif_clk_pins: scif_clk {
+               groups = "scif_clk_a";
+               function = "scif_clk";
+       };
+
+       sdhi0_pins: sd0 {
+               groups = "sdhi0_data4", "sdhi0_ctrl";
+               function = "sdhi0";
+               power-source = <3300>;
+       };
+
+       sdhi0_pins_uhs: sd0_uhs {
+               groups = "sdhi0_data4", "sdhi0_ctrl";
+               function = "sdhi0";
+               power-source = <1800>;
+       };
+
+       sdhi3_pins: sd3 {
+               groups = "sdhi3_data8", "sdhi3_ctrl", "sdhi3_ds";
+               function = "sdhi3";
+               power-source = <1800>;
+       };
+
+       usb0_pins: usb0 {
+               groups = "usb0";
+               function = "usb0";
+       };
+
+       usb1_pins: usb1 {
+               mux {
+                       groups = "usb1";
+                       function = "usb1";
+               };
+
+               ovc {
+                       pins = "GP_6_27";
+                       bias-pull-up;
+               };
+       };
+
+       usb30_pins: usb30 {
+               groups = "usb30";
+               function = "usb30";
+       };
+};
+
+&rwdt {
+       timeout-sec = <60>;
+       status = "okay";
+};
+
+&scif2 {
+       pinctrl-0 = <&scif2_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+};
+
+&scif_clk {
+       clock-frequency = <14745600>;
+};
+
+&sdhi0 {
+       pinctrl-0 = <&sdhi0_pins>;
+       pinctrl-1 = <&sdhi0_pins_uhs>;
+       pinctrl-names = "default", "state_uhs";
+
+       vmmc-supply = <&reg_3p3v>;
+       vqmmc-supply = <&vccq_sdhi0>;
+       cd-gpios = <&gpio3 12 GPIO_ACTIVE_LOW>;
+       bus-width = <4>;
+       sd-uhs-sdr50;
+       sd-uhs-sdr104;
+       status = "okay";
+};
+
+&sdhi3 {
+       pinctrl-0 = <&sdhi3_pins>;
+       pinctrl-1 = <&sdhi3_pins>;
+       pinctrl-names = "default", "state_uhs";
+
+       vmmc-supply = <&reg_3p3v>;
+       vqmmc-supply = <&reg_1p8v>;
+       bus-width = <8>;
+       mmc-hs200-1_8v;
+       non-removable;
+       fixed-emmc-driver-type = <1>;
+};
+
+&usb_extal_clk {
+       clock-frequency = <50000000>;
+};
+
+&usb2_phy0 {
+       pinctrl-0 = <&usb0_pins>;
+       pinctrl-names = "default";
+
+       vbus-supply = <&vbus0_usb2>;
+       status = "okay";
+};
+
+&usb2_phy1 {
+       pinctrl-0 = <&usb1_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+};
+
+&usb3_peri0 {
+       phys = <&usb3_phy0>;
+       phy-names = "usb";
+
+       companion = <&xhci0>;
+
+       status = "okay";
+};
+
+&usb3_phy0 {
+       status = "okay";
+};
+
+&usb3s0_clk {
+       clock-frequency = <100000000>;
+};
+
+&xhci0 {
+       pinctrl-0 = <&usb30_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+};
diff --git a/arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi b/arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi
new file mode 100644 (file)
index 0000000..07a6eea
--- /dev/null
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Device Tree Source for the RZ/G2[MN] HiHope sub board common parts
+ *
+ * Copyright (C) 2019 Renesas Electronics Corp.
+ */
+
+/ {
+       aliases {
+               ethernet0 = &avb;
+       };
+
+       chosen {
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
+       };
+};
+
+&avb {
+       pinctrl-0 = <&avb_pins>;
+       pinctrl-names = "default";
+       phy-handle = <&phy0>;
+       phy-mode = "rgmii-txid";
+       status = "okay";
+
+       phy0: ethernet-phy@0 {
+               rxc-skew-ps = <1500>;
+               reg = <0>;
+               interrupt-parent = <&gpio2>;
+               interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
+               reset-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>;
+       };
+};
+
+&pciec0 {
+       status = "okay";
+};
+
+&pciec1 {
+       status = "okay";
+};
+
+&pfc {
+       pinctrl-0 = <&scif_clk_pins>;
+       pinctrl-names = "default";
+
+       avb_pins: avb {
+               mux {
+                       groups = "avb_link", "avb_mdio", "avb_mii";
+                       function = "avb";
+               };
+
+               pins_mdio {
+                       groups = "avb_mdio";
+                       drive-strength = <24>;
+               };
+
+               pins_mii_tx {
+                       pins = "PIN_AVB_TX_CTL", "PIN_AVB_TXC", "PIN_AVB_TD0",
+                              "PIN_AVB_TD1", "PIN_AVB_TD2", "PIN_AVB_TD3";
+                       drive-strength = <12>;
+               };
+       };
+};
diff --git a/arch/arm64/boot/dts/renesas/r8a774a1-hihope-rzg2m-ex.dts b/arch/arm64/boot/dts/renesas/r8a774a1-hihope-rzg2m-ex.dts
new file mode 100644 (file)
index 0000000..6e33a3b
--- /dev/null
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Device Tree Source for the HiHope RZ/G2M sub board
+ *
+ * Copyright (C) 2019 Renesas Electronics Corp.
+ */
+
+#include "r8a774a1-hihope-rzg2m.dts"
+#include "hihope-rzg2-ex.dtsi"
+
+/ {
+       model = "HopeRun HiHope RZ/G2M with sub board";
+       compatible = "hoperun,hihope-rzg2-ex", "hoperun,hihope-rzg2m",
+                    "renesas,r8a774a1";
+};
diff --git a/arch/arm64/boot/dts/renesas/r8a774a1-hihope-rzg2m.dts b/arch/arm64/boot/dts/renesas/r8a774a1-hihope-rzg2m.dts
new file mode 100644 (file)
index 0000000..93ca973
--- /dev/null
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Device Tree Source for the HiHope RZ/G2M main board
+ *
+ * Copyright (C) 2019 Renesas Electronics Corp.
+ */
+
+/dts-v1/;
+#include "r8a774a1.dtsi"
+#include "hihope-common.dtsi"
+
+/ {
+       model = "HopeRun HiHope RZ/G2M main board based on r8a774a1";
+       compatible = "hoperun,hihope-rzg2m", "renesas,r8a774a1";
+
+       memory@48000000 {
+               device_type = "memory";
+               /* first 128MB is reserved for secure area. */
+               reg = <0x0 0x48000000 0x0 0x78000000>;
+       };
+
+       memory@600000000 {
+               device_type = "memory";
+               reg = <0x6 0x00000000 0x0 0x80000000>;
+       };
+};
index de282c4794ed93cf505d642e51f965e0de316049..f209457c7807b06301eecb86845717fb9a6c0963 100644 (file)
                clock-frequency = <0>;
        };
 
+       cluster0_opp: opp_table0 {
+               compatible = "operating-points-v2";
+               opp-shared;
+
+               opp-500000000 {
+                       opp-hz = /bits/ 64 <500000000>;
+                       opp-microvolt = <820000>;
+                       clock-latency-ns = <300000>;
+               };
+               opp-1000000000 {
+                       opp-hz = /bits/ 64 <1000000000>;
+                       opp-microvolt = <820000>;
+                       clock-latency-ns = <300000>;
+               };
+               opp-1500000000 {
+                       opp-hz = /bits/ 64 <1500000000>;
+                       opp-microvolt = <820000>;
+                       clock-latency-ns = <300000>;
+               };
+       };
+
+       cluster1_opp: opp_table1 {
+               compatible = "operating-points-v2";
+               opp-shared;
+
+               opp-800000000 {
+                       opp-hz = /bits/ 64 <800000000>;
+                       opp-microvolt = <820000>;
+                       clock-latency-ns = <300000>;
+               };
+               opp-1000000000 {
+                       opp-hz = /bits/ 64 <1000000000>;
+                       opp-microvolt = <820000>;
+                       clock-latency-ns = <300000>;
+               };
+               opp-1200000000 {
+                       opp-hz = /bits/ 64 <1200000000>;
+                       opp-microvolt = <820000>;
+                       clock-latency-ns = <300000>;
+               };
+       };
+
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
 
+               cpu-map {
+                       cluster0 {
+                               core0 {
+                                       cpu = <&a57_0>;
+                               };
+                               core1 {
+                                       cpu = <&a57_1>;
+                               };
+                       };
+
+                       cluster1 {
+                               core0 {
+                                       cpu = <&a53_0>;
+                               };
+                               core1 {
+                                       cpu = <&a53_1>;
+                               };
+                               core2 {
+                                       cpu = <&a53_2>;
+                               };
+                               core3 {
+                                       cpu = <&a53_3>;
+                               };
+                       };
+               };
+
                a57_0: cpu@0 {
                        compatible = "arm,cortex-a57";
                        reg = <0x0>;
                        power-domains = <&sysc R8A774A1_PD_CA57_CPU0>;
                        next-level-cache = <&L2_CA57>;
                        enable-method = "psci";
+                       dynamic-power-coefficient = <854>;
                        clocks = <&cpg CPG_CORE R8A774A1_CLK_Z>;
+                       operating-points-v2 = <&cluster0_opp>;
+                       capacity-dmips-mhz = <1024>;
+                       #cooling-cells = <2>;
                };
 
                a57_1: cpu@1 {
                        next-level-cache = <&L2_CA57>;
                        enable-method = "psci";
                        clocks = <&cpg CPG_CORE R8A774A1_CLK_Z>;
+                       operating-points-v2 = <&cluster0_opp>;
+                       capacity-dmips-mhz = <1024>;
+                       #cooling-cells = <2>;
                };
 
                a53_0: cpu@100 {
                        power-domains = <&sysc R8A774A1_PD_CA53_CPU0>;
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
+                       dynamic-power-coefficient = <277>;
                        clocks = <&cpg CPG_CORE R8A774A1_CLK_Z2>;
+                       operating-points-v2 = <&cluster1_opp>;
+                       capacity-dmips-mhz = <560>;
                };
 
                a53_1: cpu@101 {
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
                        clocks = <&cpg CPG_CORE R8A774A1_CLK_Z2>;
+                       operating-points-v2 = <&cluster1_opp>;
+                       capacity-dmips-mhz = <560>;
                };
 
                a53_2: cpu@102 {
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
                        clocks = <&cpg CPG_CORE R8A774A1_CLK_Z2>;
+                       operating-points-v2 = <&cluster1_opp>;
+                       capacity-dmips-mhz = <560>;
                };
 
                a53_3: cpu@103 {
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
                        clocks = <&cpg CPG_CORE R8A774A1_CLK_Z2>;
+                       operating-points-v2 = <&cluster1_opp>;
+                       capacity-dmips-mhz = <560>;
                };
 
                L2_CA57: cache-controller-0 {
                        reg = <0 0xe6060000 0 0x50c>;
                };
 
+               cmt0: timer@e60f0000 {
+                       compatible = "renesas,r8a774a1-cmt0",
+                                    "renesas,rcar-gen3-cmt0";
+                       reg = <0 0xe60f0000 0 0x1004>;
+                       interrupts = <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 303>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 303>;
+                       status = "disabled";
+               };
+
+               cmt1: timer@e6130000 {
+                       compatible = "renesas,r8a774a1-cmt1",
+                                    "renesas,rcar-gen3-cmt1";
+                       reg = <0 0xe6130000 0 0x1004>;
+                       interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 302>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 302>;
+                       status = "disabled";
+               };
+
+               cmt2: timer@e6140000 {
+                       compatible = "renesas,r8a774a1-cmt1",
+                                    "renesas,rcar-gen3-cmt1";
+                       reg = <0 0xe6140000 0 0x1004>;
+                       interrupts = <GIC_SPI 398 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 399 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 400 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 401 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 402 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 403 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 404 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 405 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 301>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 301>;
+                       status = "disabled";
+               };
+
+               cmt3: timer@e6148000 {
+                       compatible = "renesas,r8a774a1-cmt1",
+                                    "renesas,rcar-gen3-cmt1";
+                       reg = <0 0xe6148000 0 0x1004>;
+                       interrupts = <GIC_SPI 470 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 471 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 472 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 473 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 474 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 475 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 476 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 477 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 300>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 300>;
+                       status = "disabled";
+               };
+
                cpg: clock-controller@e6150000 {
                        compatible = "renesas,r8a774a1-cpg-mssr";
                        reg = <0 0xe6150000 0 0x0bb0>;
                        resets = <&cpg 407>;
                };
 
+               tmu0: timer@e61e0000 {
+                       compatible = "renesas,tmu-r8a774a1", "renesas,tmu";
+                       reg = <0 0xe61e0000 0 0x30>;
+                       interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 125>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 125>;
+                       status = "disabled";
+               };
+
+               tmu1: timer@e6fc0000 {
+                       compatible = "renesas,tmu-r8a774a1", "renesas,tmu";
+                       reg = <0 0xe6fc0000 0 0x30>;
+                       interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 124>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 124>;
+                       status = "disabled";
+               };
+
+               tmu2: timer@e6fd0000 {
+                       compatible = "renesas,tmu-r8a774a1", "renesas,tmu";
+                       reg = <0 0xe6fd0000 0 0x30>;
+                       interrupts = <GIC_SPI 303 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 304 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 305 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 123>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 123>;
+                       status = "disabled";
+               };
+
+               tmu3: timer@e6fe0000 {
+                       compatible = "renesas,tmu-r8a774a1", "renesas,tmu";
+                       reg = <0 0xe6fe0000 0 0x30>;
+                       interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 122>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 122>;
+                       status = "disabled";
+               };
+
+               tmu4: timer@ffc00000 {
+                       compatible = "renesas,tmu-r8a774a1", "renesas,tmu";
+                       reg = <0 0xffc00000 0 0x30>;
+                       interrupts = <GIC_SPI 406 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 407 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 408 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 121>;
+                       clock-names = "fck";
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 121>;
+                       status = "disabled";
+               };
+
                i2c0: i2c@e6500000 {
                        #address-cells = <1>;
                        #size-cells = <0>;
                                     "renesas,rcar-gen3-usbhs";
                        reg = <0 0xe6590000 0 0x200>;
                        interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 704>;
+                       clocks = <&cpg CPG_MOD 704>, <&cpg CPG_MOD 703>;
                        dmas = <&usb_dmac0 0>, <&usb_dmac0 1>,
                               <&usb_dmac1 0>, <&usb_dmac1 1>;
                        dma-names = "ch0", "ch1", "ch2", "ch3";
                        renesas,buswait = <11>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 3>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
-                       resets = <&cpg 704>;
+                       resets = <&cpg 704>, <&cpg 703>;
                        status = "disabled";
                };
 
                        resets = <&cpg 219>;
                        #dma-cells = <1>;
                        dma-channels = <16>;
+                       iommus = <&ipmmu_ds0 0>, <&ipmmu_ds0 1>,
+                              <&ipmmu_ds0 2>, <&ipmmu_ds0 3>,
+                              <&ipmmu_ds0 4>, <&ipmmu_ds0 5>,
+                              <&ipmmu_ds0 6>, <&ipmmu_ds0 7>,
+                              <&ipmmu_ds0 8>, <&ipmmu_ds0 9>,
+                              <&ipmmu_ds0 10>, <&ipmmu_ds0 11>,
+                              <&ipmmu_ds0 12>, <&ipmmu_ds0 13>,
+                              <&ipmmu_ds0 14>, <&ipmmu_ds0 15>;
                };
 
                dmac1: dma-controller@e7300000 {
                        resets = <&cpg 218>;
                        #dma-cells = <1>;
                        dma-channels = <16>;
+                       iommus = <&ipmmu_ds1 0>, <&ipmmu_ds1 1>,
+                              <&ipmmu_ds1 2>, <&ipmmu_ds1 3>,
+                              <&ipmmu_ds1 4>, <&ipmmu_ds1 5>,
+                              <&ipmmu_ds1 6>, <&ipmmu_ds1 7>,
+                              <&ipmmu_ds1 8>, <&ipmmu_ds1 9>,
+                              <&ipmmu_ds1 10>, <&ipmmu_ds1 11>,
+                              <&ipmmu_ds1 12>, <&ipmmu_ds1 13>,
+                              <&ipmmu_ds1 14>, <&ipmmu_ds1 15>;
                };
 
                dmac2: dma-controller@e7310000 {
                        resets = <&cpg 217>;
                        #dma-cells = <1>;
                        dma-channels = <16>;
+                       iommus = <&ipmmu_ds1 16>, <&ipmmu_ds1 17>,
+                              <&ipmmu_ds1 18>, <&ipmmu_ds1 19>,
+                              <&ipmmu_ds1 20>, <&ipmmu_ds1 21>,
+                              <&ipmmu_ds1 22>, <&ipmmu_ds1 23>,
+                              <&ipmmu_ds1 24>, <&ipmmu_ds1 25>,
+                              <&ipmmu_ds1 26>, <&ipmmu_ds1 27>,
+                              <&ipmmu_ds1 28>, <&ipmmu_ds1 29>,
+                              <&ipmmu_ds1 30>, <&ipmmu_ds1 31>;
                };
 
                ipmmu_ds0: mmu@e6740000 {
                        power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
                        resets = <&cpg 812>;
                        phy-mode = "rgmii";
+                       iommus = <&ipmmu_ds0 16>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                        resets = <&cpg 502>;
                        #dma-cells = <1>;
                        dma-channels = <16>;
+                       iommus = <&ipmmu_mp 0>, <&ipmmu_mp 1>,
+                              <&ipmmu_mp 2>, <&ipmmu_mp 3>,
+                              <&ipmmu_mp 4>, <&ipmmu_mp 5>,
+                              <&ipmmu_mp 6>, <&ipmmu_mp 7>,
+                              <&ipmmu_mp 8>, <&ipmmu_mp 9>,
+                              <&ipmmu_mp 10>, <&ipmmu_mp 11>,
+                              <&ipmmu_mp 12>, <&ipmmu_mp 13>,
+                              <&ipmmu_mp 14>, <&ipmmu_mp 15>;
                };
 
                audma1: dma-controller@ec720000 {
                        resets = <&cpg 501>;
                        #dma-cells = <1>;
                        dma-channels = <16>;
+                       iommus = <&ipmmu_mp 16>, <&ipmmu_mp 17>,
+                              <&ipmmu_mp 18>, <&ipmmu_mp 19>,
+                              <&ipmmu_mp 20>, <&ipmmu_mp 21>,
+                              <&ipmmu_mp 22>, <&ipmmu_mp 23>,
+                              <&ipmmu_mp 24>, <&ipmmu_mp 25>,
+                              <&ipmmu_mp 26>, <&ipmmu_mp 27>,
+                              <&ipmmu_mp 28>, <&ipmmu_mp 29>,
+                              <&ipmmu_mp 30>, <&ipmmu_mp 31>;
                };
 
                xhci0: usb@ee000000 {
                        compatible = "generic-ohci";
                        reg = <0 0xee080000 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
-                       phys = <&usb2_phy0>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
+                       phys = <&usb2_phy0 1>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        status = "disabled";
                };
 
                        reg = <0 0xee0a0000 0 0x100>;
                        interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 702>;
-                       phys = <&usb2_phy1>;
+                       phys = <&usb2_phy1 1>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
                        resets = <&cpg 702>;
                        compatible = "generic-ehci";
                        reg = <0 0xee080100 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
-                       phys = <&usb2_phy0>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
+                       phys = <&usb2_phy0 2>;
                        phy-names = "usb";
                        companion = <&ohci0>;
                        power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
+                       resets = <&cpg 703>, <&cpg 704>;
                        status = "disabled";
                };
 
                        reg = <0 0xee0a0100 0 0x100>;
                        interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 702>;
-                       phys = <&usb2_phy1>;
+                       phys = <&usb2_phy1 2>;
                        phy-names = "usb";
                        companion = <&ohci1>;
                        power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
                                     "renesas,rcar-gen3-usb2-phy";
                        reg = <0 0xee080200 0 0x700>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&cpg CPG_MOD 703>;
+                       clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
-                       resets = <&cpg 703>;
-                       #phy-cells = <0>;
+                       resets = <&cpg 703>, <&cpg 704>;
+                       #phy-cells = <1>;
                        status = "disabled";
                };
 
                        clocks = <&cpg CPG_MOD 702>;
                        power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
                        resets = <&cpg 702>;
-                       #phy-cells = <0>;
+                       #phy-cells = <1>;
                        status = "disabled";
                };
 
                        resets = <&cpg 408>;
                };
 
+               pciec0: pcie@fe000000 {
+                       compatible = "renesas,pcie-r8a774a1",
+                                    "renesas,pcie-rcar-gen3";
+                       reg = <0 0xfe000000 0 0x80000>;
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       bus-range = <0x00 0xff>;
+                       device_type = "pci";
+                       ranges = <0x01000000 0 0x00000000 0 0xfe100000 0 0x00100000
+                               0x02000000 0 0xfe200000 0 0xfe200000 0 0x00200000
+                               0x02000000 0 0x30000000 0 0x30000000 0 0x08000000
+                               0x42000000 0 0x38000000 0 0x38000000 0 0x08000000>;
+                       /* Map all possible DDR as inbound ranges */
+                       dma-ranges = <0x42000000 0 0x40000000 0 0x40000000 0 0x80000000>;
+                       interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>,
+                               <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>,
+                               <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>;
+                       #interrupt-cells = <1>;
+                       interrupt-map-mask = <0 0 0 0>;
+                       interrupt-map = <0 0 0 0 &gic GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 319>, <&pcie_bus_clk>;
+                       clock-names = "pcie", "pcie_bus";
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 319>;
+                       status = "disabled";
+               };
+
+               pciec1: pcie@ee800000 {
+                       compatible = "renesas,pcie-r8a774a1",
+                                    "renesas,pcie-rcar-gen3";
+                       reg = <0 0xee800000 0 0x80000>;
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       bus-range = <0x00 0xff>;
+                       device_type = "pci";
+                       ranges = <0x01000000 0 0x00000000 0 0xee900000 0 0x00100000
+                               0x02000000 0 0xeea00000 0 0xeea00000 0 0x00200000
+                               0x02000000 0 0xc0000000 0 0xc0000000 0 0x08000000
+                               0x42000000 0 0xc8000000 0 0xc8000000 0 0x08000000>;
+                       /* Map all possible DDR as inbound ranges */
+                       dma-ranges = <0x42000000 0 0x40000000 0 0x40000000 0 0x80000000>;
+                       interrupts = <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>,
+                               <GIC_SPI 149 IRQ_TYPE_LEVEL_HIGH>,
+                               <GIC_SPI 150 IRQ_TYPE_LEVEL_HIGH>;
+                       #interrupt-cells = <1>;
+                       interrupt-map-mask = <0 0 0 0>;
+                       interrupt-map = <0 0 0 0 &gic GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 318>, <&pcie_bus_clk>;
+                       clock-names = "pcie", "pcie_bus";
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 318>;
+                       status = "disabled";
+               };
+
+               fdp1@fe940000 {
+                       compatible = "renesas,fdp1";
+                       reg = <0 0xfe940000 0 0x2400>;
+                       interrupts = <GIC_SPI 262 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 119>;
+                       power-domains = <&sysc R8A774A1_PD_A3VC>;
+                       resets = <&cpg 119>;
+                       renesas,fcp = <&fcpf0>;
+               };
+
                fcpf0: fcp@fe950000 {
                        compatible = "renesas,fcpf";
                        reg = <0 0xfe950000 0 0x200>;
                        iommus = <&ipmmu_vc0 19>;
                };
 
+               vspb: vsp@fe960000 {
+                       compatible = "renesas,vsp2";
+                       reg = <0 0xfe960000 0 0x8000>;
+                       interrupts = <GIC_SPI 266 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 626>;
+                       power-domains = <&sysc R8A774A1_PD_A3VC>;
+                       resets = <&cpg 626>;
+
+                       renesas,fcp = <&fcpvb0>;
+               };
+
+               vspd0: vsp@fea20000 {
+                       compatible = "renesas,vsp2";
+                       reg = <0 0xfea20000 0 0x5000>;
+                       interrupts = <GIC_SPI 466 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 623>;
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 623>;
+
+                       renesas,fcp = <&fcpvd0>;
+               };
+
+               vspd1: vsp@fea28000 {
+                       compatible = "renesas,vsp2";
+                       reg = <0 0xfea28000 0 0x5000>;
+                       interrupts = <GIC_SPI 467 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 622>;
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 622>;
+
+                       renesas,fcp = <&fcpvd1>;
+               };
+
+               vspd2: vsp@fea30000 {
+                       compatible = "renesas,vsp2";
+                       reg = <0 0xfea30000 0 0x5000>;
+                       interrupts = <GIC_SPI 468 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 621>;
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 621>;
+
+                       renesas,fcp = <&fcpvd2>;
+               };
+
+               vspi0: vsp@fe9a0000 {
+                       compatible = "renesas,vsp2";
+                       reg = <0 0xfe9a0000 0 0x8000>;
+                       interrupts = <GIC_SPI 444 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 631>;
+                       power-domains = <&sysc R8A774A1_PD_A3VC>;
+                       resets = <&cpg 631>;
+
+                       renesas,fcp = <&fcpvi0>;
+               };
+
                csi20: csi2@fea80000 {
                        compatible = "renesas,r8a774a1-csi2";
                        reg = <0 0xfea80000 0 0x10000>;
                        };
                };
 
+               hdmi0: hdmi@fead0000 {
+                       compatible = "renesas,r8a774a1-hdmi",
+                                    "renesas,rcar-gen3-hdmi";
+                       reg = <0 0xfead0000 0 0x10000>;
+                       interrupts = <GIC_SPI 389 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 729>,
+                                <&cpg CPG_CORE R8A774A1_CLK_HDMI>;
+                       clock-names = "iahb", "isfr";
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 729>;
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               port@0 {
+                                       reg = <0>;
+                                       dw_hdmi0_in: endpoint {
+                                               remote-endpoint = <&du_out_hdmi0>;
+                                       };
+                               };
+                               port@1 {
+                                       reg = <1>;
+                               };
+                               port@2 {
+                                       /* HDMI sound */
+                                       reg = <2>;
+                               };
+                       };
+               };
+
+               du: display@feb00000 {
+                       compatible = "renesas,du-r8a774a1";
+                       reg = <0 0xfeb00000 0 0x70000>;
+                       interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 269 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 724>,
+                                <&cpg CPG_MOD 723>,
+                                <&cpg CPG_MOD 722>;
+                       clock-names = "du.0", "du.1", "du.2";
+                       status = "disabled";
+
+                       vsps = <&vspd0 &vspd1 &vspd2>;
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       du_out_rgb: endpoint {
+                                       };
+                               };
+                               port@1 {
+                                       reg = <1>;
+                                       du_out_hdmi0: endpoint {
+                                               remote-endpoint = <&dw_hdmi0_in>;
+                                       };
+                               };
+                               port@2 {
+                                       reg = <2>;
+                                       du_out_lvds0: endpoint {
+                                               remote-endpoint = <&lvds0_in>;
+                                       };
+                               };
+                       };
+               };
+
+               lvds0: lvds@feb90000 {
+                       compatible = "renesas,r8a774a1-lvds";
+                       reg = <0 0xfeb90000 0 0x14>;
+                       clocks = <&cpg CPG_MOD 727>;
+                       power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
+                       resets = <&cpg 727>;
+                       status = "disabled";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+                                       lvds0_in: endpoint {
+                                               remote-endpoint = <&du_out_lvds0>;
+                                       };
+                               };
+                               port@1 {
+                                       reg = <1>;
+                                       lvds0_out: endpoint {
+                                       };
+                               };
+                       };
+               };
+
                prr: chipid@fff00044 {
                        compatible = "renesas,prr";
                        reg = <0 0xfff00044 0 4>;
                        polling-delay-passive = <250>;
                        polling-delay = <1000>;
                        thermal-sensors = <&tsc 0>;
+                       sustainable-power = <3874>;
 
                        trips {
                                sensor1_crit: sensor1-crit {
                        polling-delay-passive = <250>;
                        polling-delay = <1000>;
                        thermal-sensors = <&tsc 1>;
+                       sustainable-power = <3874>;
 
                        trips {
                                sensor2_crit: sensor2-crit {
                                        type = "critical";
                                };
                        };
-
                };
 
                sensor_thermal3: sensor-thermal3 {
                        polling-delay-passive = <250>;
                        polling-delay = <1000>;
                        thermal-sensors = <&tsc 2>;
+                       sustainable-power = <3874>;
 
                        trips {
+                               target: trip-point1 {
+                                       temperature = <100000>;
+                                       hysteresis = <1000>;
+                                       type = "passive";
+                               };
+
                                sensor3_crit: sensor3-crit {
                                        temperature = <120000>;
                                        hysteresis = <1000>;
                                        type = "critical";
                                };
                        };
+                       cooling-maps {
+                               map0 {
+                                       trip = <&target>;
+                                       cooling-device = <&a57_0 0 2>;
+                                       contribution = <1024>;
+                               };
+                               map1 {
+                                       trip = <&target>;
+                                       cooling-device = <&a53_0 0 2>;
+                                       contribution = <1024>;
+                               };
+                       };
                };
        };
 
index 013a48c012113b15c9eea443f784e2792839a49f..46a77eefa53614054cdd9ec5f219caf25ff4d920 100644 (file)
@@ -8,6 +8,7 @@
 /dts-v1/;
 #include "r8a774c0.dtsi"
 #include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/display/tda998x.h>
 
 / {
        model = "Silicon Linux RZ/G2E 96board platform (CAT874)";
 
        aliases {
                serial0 = &scif2;
+               serial1 = &hscif2;
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
+       hdmi-out {
+               compatible = "hdmi-connector";
+               type = "a";
+
+               port {
+                       hdmi_con_out: endpoint {
+                               remote-endpoint = <&tda19988_out>;
+                       };
+               };
+       };
+
        leds {
                compatible = "gpio-leds";
 
                reg = <0x0 0x48000000 0x0 0x78000000>;
        };
 
+       sound: sound {
+               compatible = "simple-audio-card";
+
+               simple-audio-card,name = "CAT874 HDMI sound";
+               simple-audio-card,format = "i2s";
+               simple-audio-card,bitclock-master = <&sndcpu>;
+               simple-audio-card,frame-master = <&sndcpu>;
+
+               sndcpu: simple-audio-card,cpu {
+                       sound-dai = <&rcar_sound>;
+               };
+
+               sndcodec: simple-audio-card,codec {
+                       sound-dai = <&tda19988>;
+               };
+       };
+
        vcc_sdhi0: regulator-vcc-sdhi0 {
                compatible = "regulator-fixed";
 
                states = <3300000 1
                          1800000 0>;
        };
+
+       wlan_en_reg: fixedregulator {
+               compatible = "regulator-fixed";
+               regulator-name = "wlan-en-regulator";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               startup-delay-us = <70000>;
+
+               gpio = <&gpio2 25 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       x13_clk: x13 {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <74250000>;
+       };
+};
+
+&audio_clk_a {
+       clock-frequency = <22579200>;
+};
+
+&du {
+       pinctrl-0 = <&du_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+
+       clocks = <&cpg CPG_MOD 724>,
+                <&cpg CPG_MOD 723>,
+                <&x13_clk>;
+       clock-names = "du.0", "du.1", "dclkin.0";
+
+       ports {
+               port@0 {
+                       endpoint {
+                               remote-endpoint = <&tda19988_in>;
+                       };
+               };
+       };
 };
 
 &ehci0 {
        clock-frequency = <48000000>;
 };
 
+&hscif2 {
+       pinctrl-0 = <&hscif2_pins>;
+       pinctrl-names = "default";
+
+       uart-has-rtscts;
+       status = "okay";
+
+       bluetooth {
+               compatible = "ti,wl1837-st";
+               enable-gpios = <&gpio4 6 GPIO_ACTIVE_HIGH>;
+       };
+};
+
+&i2c0 {
+       status = "okay";
+       clock-frequency = <100000>;
+
+       hd3ss3220@47 {
+               compatible = "ti,hd3ss3220";
+               reg = <0x47>;
+               interrupt-parent = <&gpio6>;
+               interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
+
+               connector {
+                       compatible = "usb-c-connector";
+                       label = "USB-C";
+                       data-role = "dual";
+
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@1 {
+                                       reg = <1>;
+                                       hd3ss3220_ep: endpoint {
+                                               remote-endpoint = <&usb3_role_switch>;
+                                       };
+                               };
+                       };
+               };
+       };
+
+       tda19988: tda19988@70 {
+               compatible = "nxp,tda998x";
+               reg = <0x70>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <1 IRQ_TYPE_LEVEL_LOW>;
+
+               video-ports = <0x234501>;
+
+               #sound-dai-cells = <0>;
+               audio-ports = <TDA998x_I2S 0x03>;
+               clocks = <&rcar_sound 1>;
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       port@0 {
+                               reg = <0>;
+                               tda19988_in: endpoint {
+                                       remote-endpoint = <&du_out_rgb>;
+                               };
+                       };
+
+                       port@1 {
+                               reg = <1>;
+                               tda19988_out: endpoint {
+                                       remote-endpoint = <&hdmi_con_out>;
+                               };
+                       };
+               };
+       };
+};
+
 &i2c1 {
        pinctrl-0 = <&i2c1_pins>;
        pinctrl-names = "default";
        };
 };
 
+&lvds0 {
+       status = "okay";
+
+       clocks = <&cpg CPG_MOD 727>, <&x13_clk>, <&extal_clk>;
+       clock-names = "fck", "dclkin.0", "extal";
+};
+
 &ohci0 {
        dr_mode = "host";
        status = "okay";
 };
 
 &pfc {
+       du_pins: du {
+               groups = "du_rgb888", "du_clk_out_0", "du_sync", "du_disp",
+                        "du_clk_in_0";
+               function = "du";
+       };
+
        i2c1_pins: i2c1 {
                groups = "i2c1_b";
                function = "i2c1";
        };
 
+       hscif2_pins: hscif2 {
+               groups = "hscif2_data_a", "hscif2_ctrl_a";
+               function = "hscif2";
+       };
+
        scif2_pins: scif2 {
                groups = "scif2_data_a";
                function = "scif2";
                function = "sdhi0";
                power-source = <1800>;
        };
+
+       sdhi3_pins: sd3 {
+               groups = "sdhi3_data4", "sdhi3_ctrl";
+               function = "sdhi3";
+               power-source = <1800>;
+       };
+
+       sound_pins: sound {
+               groups = "ssi01239_ctrl", "ssi0_data";
+               function = "ssi";
+       };
+
+       sound_clk_pins: sound_clk {
+               groups = "audio_clkout1_a";
+               function = "audio_clk";
+       };
+
+       usb30_pins: usb30 {
+               groups = "usb30", "usb30_id";
+               function = "usb30";
+       };
+};
+
+&rcar_sound {
+       pinctrl-0 = <&sound_pins &sound_clk_pins>;
+       pinctrl-names = "default";
+
+       /* Single DAI */
+       #sound-dai-cells = <0>;
+
+       /* audio_clkout0/1/2/3 */
+       #clock-cells = <1>;
+       clock-frequency = <11289600>;
+
+       status = "okay";
+
+       rcar_sound,dai {
+               dai0 {
+                       playback = <&ssi0 &src0 &dvc0>;
+               };
+       };
 };
 
 &rwdt {
        status = "okay";
 };
 
+&sdhi3 {
+       status = "okay";
+       pinctrl-0 = <&sdhi3_pins>;
+       pinctrl-names = "default";
+
+       vmmc-supply = <&wlan_en_reg>;
+       bus-width = <4>;
+       non-removable;
+       cap-power-off-card;
+       keep-power-in-suspend;
+
+       #address-cells = <1>;
+       #size-cells = <0>;
+       wlcore: wlcore@2 {
+               compatible = "ti,wl1837";
+               reg = <2>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <0 IRQ_TYPE_LEVEL_HIGH>;
+       };
+};
+
 &usb2_phy0 {
        renesas,no-otg-pins;
        status = "okay";
 };
+
+&usb3_peri0 {
+       companion = <&xhci0>;
+       status = "okay";
+       usb-role-switch;
+
+       port {
+               usb3_role_switch: endpoint {
+                       remote-endpoint = <&hd3ss3220_ep>;
+               };
+       };
+};
+
+&xhci0 {
+       pinctrl-0 = <&usb30_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+};
index 3f86db199dbf9fc3889b8eb58c0d12dc86c33024..e7b5bf23f978b846b5cacffb5da2b9cb18f1c285 100644 (file)
@@ -70,7 +70,7 @@
                #size-cells = <0>;
 
                a53_0: cpu@0 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A774C0_PD_CA53_CPU0>;
@@ -81,7 +81,7 @@
                };
 
                a53_1: cpu@1 {
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <1>;
                        device_type = "cpu";
                        power-domains = <&sysc R8A774C0_PD_CA53_CPU1>;
                               <&usb_dmac1 0>, <&usb_dmac1 1>;
                        dma-names = "ch0", "ch1", "ch2", "ch3";
                        renesas,buswait = <11>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 3>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>;
                        resets = <&cpg 704>, <&cpg 703>;
                        reg = <0 0xee080000 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 1>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>;
                        resets = <&cpg 703>, <&cpg 704>;
                        reg = <0 0xee080100 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 2>;
                        phy-names = "usb";
                        companion = <&ohci0>;
                        power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>;
                        resets = <&cpg 703>, <&cpg 704>;
-                       #phy-cells = <0>;
+                       #phy-cells = <1>;
                        status = "disabled";
                };
 
index 097538cc4b1f179afaafd20b9e04504e46ed1f63..1745ac4b307eb0eee9240edbad08e52a8b6861ea 100644 (file)
                        power-domains = <&sysc R8A7795_PD_CA57_CPU0>;
                        next-level-cache = <&L2_CA57>;
                        enable-method = "psci";
+                       dynamic-power-coefficient = <854>;
                        clocks = <&cpg CPG_CORE R8A7795_CLK_Z>;
                        operating-points-v2 = <&cluster0_opp>;
                        capacity-dmips-mhz = <1024>;
                        power-domains = <&sysc R8A7795_PD_CA53_CPU0>;
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
+                       dynamic-power-coefficient = <277>;
                        clocks = <&cpg CPG_CORE R8A7795_CLK_Z2>;
                        operating-points-v2 = <&cluster1_opp>;
                        capacity-dmips-mhz = <535>;
                               <&usb_dmac1 0>, <&usb_dmac1 1>;
                        dma-names = "ch0", "ch1", "ch2", "ch3";
                        renesas,buswait = <11>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 3>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        resets = <&cpg 704>, <&cpg 703>;
                               <&usb_dmac3 0>, <&usb_dmac3 1>;
                        dma-names = "ch0", "ch1", "ch2", "ch3";
                        renesas,buswait = <11>;
-                       phys = <&usb2_phy3>;
+                       phys = <&usb2_phy3 3>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        resets = <&cpg 705>, <&cpg 700>;
                        status = "disabled";
                };
 
+               tpu: pwm@e6e80000 {
+                       compatible = "renesas,tpu-r8a7795", "renesas,tpu";
+                       reg = <0 0xe6e80000 0 0x148>;
+                       interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 304>;
+                       power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
+                       resets = <&cpg 304>;
+                       #pwm-cells = <3>;
+                       status = "disabled";
+               };
+
                msiof0: spi@e6e90000 {
                        compatible = "renesas,msiof-r8a7795",
                                     "renesas,rcar-gen3-msiof";
                        reg = <0 0xee080000 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 1>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        resets = <&cpg 703>, <&cpg 704>;
                        reg = <0 0xee0a0000 0 0x100>;
                        interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 702>;
-                       phys = <&usb2_phy1>;
+                       phys = <&usb2_phy1 1>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        resets = <&cpg 702>;
                        reg = <0 0xee0c0000 0 0x100>;
                        interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 701>;
-                       phys = <&usb2_phy2>;
+                       phys = <&usb2_phy2 1>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        resets = <&cpg 701>;
                        reg = <0 0xee0e0000 0 0x100>;
                        interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 700>, <&cpg CPG_MOD 705>;
-                       phys = <&usb2_phy3>;
+                       phys = <&usb2_phy3 1>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        resets = <&cpg 700>, <&cpg 705>;
                        reg = <0 0xee080100 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 2>;
                        phy-names = "usb";
                        companion = <&ohci0>;
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        reg = <0 0xee0a0100 0 0x100>;
                        interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 702>;
-                       phys = <&usb2_phy1>;
+                       phys = <&usb2_phy1 2>;
                        phy-names = "usb";
                        companion = <&ohci1>;
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        reg = <0 0xee0c0100 0 0x100>;
                        interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 701>;
-                       phys = <&usb2_phy2>;
+                       phys = <&usb2_phy2 2>;
                        phy-names = "usb";
                        companion = <&ohci2>;
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        reg = <0 0xee0e0100 0 0x100>;
                        interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 700>, <&cpg CPG_MOD 705>;
-                       phys = <&usb2_phy3>;
+                       phys = <&usb2_phy3 2>;
                        phy-names = "usb";
                        companion = <&ohci3>;
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        resets = <&cpg 703>, <&cpg 704>;
-                       #phy-cells = <0>;
+                       #phy-cells = <1>;
                        status = "disabled";
                };
 
                        clocks = <&cpg CPG_MOD 702>;
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        resets = <&cpg 702>;
-                       #phy-cells = <0>;
+                       #phy-cells = <1>;
                        status = "disabled";
                };
 
                        clocks = <&cpg CPG_MOD 701>;
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        resets = <&cpg 701>;
-                       #phy-cells = <0>;
+                       #phy-cells = <1>;
                        status = "disabled";
                };
 
                        clocks = <&cpg CPG_MOD 700>, <&cpg CPG_MOD 705>;
                        power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
                        resets = <&cpg 700>, <&cpg 705>;
-                       #phy-cells = <0>;
+                       #phy-cells = <1>;
                        status = "disabled";
                };
 
                        polling-delay-passive = <250>;
                        polling-delay = <1000>;
                        thermal-sensors = <&tsc 0>;
+                       sustainable-power = <6313>;
 
                        trips {
-                               sensor1_passive: sensor1-passive {
-                                       temperature = <95000>;
-                                       hysteresis = <1000>;
-                                       type = "passive";
-                               };
                                sensor1_crit: sensor1-crit {
                                        temperature = <120000>;
                                        hysteresis = <1000>;
                                        type = "critical";
                                };
                        };
-
-                       cooling-maps {
-                               map0 {
-                                       trip = <&sensor1_passive>;
-                                       cooling-device = <&a57_0 4 4>,
-                                                        <&a57_1 4 4>,
-                                                        <&a57_2 4 4>,
-                                                        <&a57_3 4 4>;
-                               };
-                       };
                };
 
                sensor_thermal2: sensor-thermal2 {
                        polling-delay-passive = <250>;
                        polling-delay = <1000>;
                        thermal-sensors = <&tsc 1>;
+                       sustainable-power = <6313>;
 
                        trips {
-                               sensor2_passive: sensor2-passive {
-                                       temperature = <95000>;
-                                       hysteresis = <1000>;
-                                       type = "passive";
-                               };
                                sensor2_crit: sensor2-crit {
                                        temperature = <120000>;
                                        hysteresis = <1000>;
                                        type = "critical";
                                };
                        };
-
-                       cooling-maps {
-                               map0 {
-                                       trip = <&sensor2_passive>;
-                                       cooling-device = <&a57_0 4 4>,
-                                                        <&a57_1 4 4>,
-                                                        <&a57_2 4 4>,
-                                                        <&a57_3 4 4>;
-                               };
-                       };
                };
 
                sensor_thermal3: sensor-thermal3 {
                        thermal-sensors = <&tsc 2>;
 
                        trips {
-                               sensor3_passive: sensor3-passive {
-                                       temperature = <95000>;
+                               target: trip-point1 {
+                                       temperature = <100000>;
                                        hysteresis = <1000>;
                                        type = "passive";
                                };
+
                                sensor3_crit: sensor3-crit {
                                        temperature = <120000>;
                                        hysteresis = <1000>;
 
                        cooling-maps {
                                map0 {
-                                       trip = <&sensor3_passive>;
-                                       cooling-device = <&a57_0 4 4>,
-                                                        <&a57_1 4 4>,
-                                                        <&a57_2 4 4>,
-                                                        <&a57_3 4 4>;
+                                       trip = <&target>;
+                                       cooling-device = <&a57_0 2 4>;
+                                       contribution = <1024>;
+                               };
+
+                               map1 {
+                                       trip = <&target>;
+                                       cooling-device = <&a53_0 0 2>;
+                                       contribution = <1024>;
                                };
                        };
                };
index d5e2f4af83a49a2ab5db4765cee5646fff617ac5..26df5b88efd761e41f6ff006557a580baccf54a8 100644 (file)
                        power-domains = <&sysc R8A7796_PD_CA57_CPU0>;
                        next-level-cache = <&L2_CA57>;
                        enable-method = "psci";
+                       dynamic-power-coefficient = <854>;
                        clocks = <&cpg CPG_CORE R8A7796_CLK_Z>;
                        operating-points-v2 = <&cluster0_opp>;
                        capacity-dmips-mhz = <1024>;
                        power-domains = <&sysc R8A7796_PD_CA53_CPU0>;
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
+                       dynamic-power-coefficient = <277>;
                        clocks = <&cpg CPG_CORE R8A7796_CLK_Z2>;
                        operating-points-v2 = <&cluster1_opp>;
                        capacity-dmips-mhz = <535>;
                               <&usb_dmac1 0>, <&usb_dmac1 1>;
                        dma-names = "ch0", "ch1", "ch2", "ch3";
                        renesas,buswait = <11>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 3>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
                        resets = <&cpg 704>, <&cpg 703>;
                        status = "disabled";
                };
 
+               tpu: pwm@e6e80000 {
+                       compatible = "renesas,tpu-r8a7796", "renesas,tpu";
+                       reg = <0 0xe6e80000 0 0x148>;
+                       interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 304>;
+                       power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
+                       resets = <&cpg 304>;
+                       #pwm-cells = <3>;
+                       status = "disabled";
+               };
+
                msiof0: spi@e6e90000 {
                        compatible = "renesas,msiof-r8a7796",
                                     "renesas,rcar-gen3-msiof";
                        reg = <0 0xee080000 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 1>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
                        resets = <&cpg 703>, <&cpg 704>;
                        reg = <0 0xee0a0000 0 0x100>;
                        interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 702>;
-                       phys = <&usb2_phy1>;
+                       phys = <&usb2_phy1 1>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
                        resets = <&cpg 702>;
                        reg = <0 0xee080100 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 2>;
                        phy-names = "usb";
                        companion = <&ohci0>;
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
                        reg = <0 0xee0a0100 0 0x100>;
                        interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 702>;
-                       phys = <&usb2_phy1>;
+                       phys = <&usb2_phy1 2>;
                        phy-names = "usb";
                        companion = <&ohci1>;
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
                        resets = <&cpg 703>, <&cpg 704>;
-                       #phy-cells = <0>;
+                       #phy-cells = <1>;
                        status = "disabled";
                };
 
                        clocks = <&cpg CPG_MOD 702>;
                        power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
                        resets = <&cpg 702>;
-                       #phy-cells = <0>;
+                       #phy-cells = <1>;
                        status = "disabled";
                };
 
                        polling-delay-passive = <250>;
                        polling-delay = <1000>;
                        thermal-sensors = <&tsc 0>;
+                       sustainable-power = <3874>;
 
                        trips {
-                               sensor1_passive: sensor1-passive {
-                                       temperature = <95000>;
-                                       hysteresis = <1000>;
-                                       type = "passive";
-                               };
                                sensor1_crit: sensor1-crit {
                                        temperature = <120000>;
                                        hysteresis = <1000>;
                                        type = "critical";
                                };
                        };
-
-                       cooling-maps {
-                               map0 {
-                                       trip = <&sensor1_passive>;
-                                       cooling-device = <&a57_0 5 5>, <&a57_1 5 5>;
-                               };
-                       };
                };
 
                sensor_thermal2: sensor-thermal2 {
                        polling-delay-passive = <250>;
                        polling-delay = <1000>;
                        thermal-sensors = <&tsc 1>;
+                       sustainable-power = <3874>;
 
                        trips {
-                               sensor2_passive: sensor2-passive {
-                                       temperature = <95000>;
-                                       hysteresis = <1000>;
-                                       type = "passive";
-                               };
                                sensor2_crit: sensor2-crit {
                                        temperature = <120000>;
                                        hysteresis = <1000>;
                                        type = "critical";
                                };
                        };
-
-                       cooling-maps {
-                               map0 {
-                                       trip = <&sensor2_passive>;
-                                       cooling-device = <&a57_0 5 5>, <&a57_1 5 5>;
-                               };
-                       };
                };
 
                sensor_thermal3: sensor-thermal3 {
                        polling-delay-passive = <250>;
                        polling-delay = <1000>;
                        thermal-sensors = <&tsc 2>;
+                       sustainable-power = <3874>;
 
                        trips {
-                               sensor3_passive: sensor3-passive {
-                                       temperature = <95000>;
+                               target: trip-point1 {
+                                       temperature = <100000>;
                                        hysteresis = <1000>;
                                        type = "passive";
                                };
+
                                sensor3_crit: sensor3-crit {
                                        temperature = <120000>;
                                        hysteresis = <1000>;
                                        type = "critical";
                                };
                        };
-
                        cooling-maps {
                                map0 {
-                                       trip = <&sensor3_passive>;
-                                       cooling-device = <&a57_0 5 5>, <&a57_1 5 5>;
+                                       trip = <&target>;
+                                       cooling-device = <&a57_0 2 4>;
+                                       contribution = <1024>;
+                               };
+                               map1 {
+                                       trip = <&target>;
+                                       cooling-device = <&a53_0 0 2>;
+                                       contribution = <1024>;
                                };
                        };
                };
index 2554b1742dbf2316c126cf3e3cf54a218c099fda..131f895ab778c9042c2f98366f5867b22de24841 100644 (file)
                        power-domains = <&sysc R8A77965_PD_CA57_CPU0>;
                        next-level-cache = <&L2_CA57>;
                        enable-method = "psci";
+                       #cooling-cells = <2>;
+                       dynamic-power-coefficient = <854>;
                        clocks = <&cpg CPG_CORE R8A77965_CLK_Z>;
                        operating-points-v2 = <&cluster0_opp>;
                };
                               <&usb_dmac1 0>, <&usb_dmac1 1>;
                        dma-names = "ch0", "ch1", "ch2", "ch3";
                        renesas,buswait = <11>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 3>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
                        resets = <&cpg 704>, <&cpg 703>;
                        status = "disabled";
                };
 
+               tpu: pwm@e6e80000 {
+                       compatible = "renesas,tpu-r8a77965", "renesas,tpu";
+                       reg = <0 0xe6e80000 0 0x148>;
+                       interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&cpg CPG_MOD 304>;
+                       power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
+                       resets = <&cpg 304>;
+                       #pwm-cells = <3>;
+                       status = "disabled";
+               };
+
                msiof0: spi@e6e90000 {
                        compatible = "renesas,msiof-r8a77965",
                                     "renesas,rcar-gen3-msiof";
                        reg = <0 0xee080000 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 1>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
                        resets = <&cpg 703>, <&cpg 704>;
                        reg = <0 0xee0a0000 0 0x100>;
                        interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 702>;
-                       phys = <&usb2_phy1>;
+                       phys = <&usb2_phy1 1>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
                        resets = <&cpg 702>;
                        reg = <0 0xee080100 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 2>;
                        phy-names = "usb";
                        companion = <&ohci0>;
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
                        reg = <0 0xee0a0100 0 0x100>;
                        interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 702>;
-                       phys = <&usb2_phy1>;
+                       phys = <&usb2_phy1 2>;
                        phy-names = "usb";
                        companion = <&ohci1>;
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
                        resets = <&cpg 703>, <&cpg 704>;
-                       #phy-cells = <0>;
+                       #phy-cells = <1>;
                        status = "disabled";
                };
 
                        clocks = <&cpg CPG_MOD 702>;
                        power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
                        resets = <&cpg 702>;
-                       #phy-cells = <0>;
+                       #phy-cells = <1>;
                        status = "disabled";
                };
 
                        polling-delay-passive = <250>;
                        polling-delay = <1000>;
                        thermal-sensors = <&tsc 0>;
+                       sustainable-power = <2439>;
 
                        trips {
                                sensor1_crit: sensor1-crit {
                        polling-delay-passive = <250>;
                        polling-delay = <1000>;
                        thermal-sensors = <&tsc 1>;
+                       sustainable-power = <2439>;
 
                        trips {
                                sensor2_crit: sensor2-crit {
                        polling-delay-passive = <250>;
                        polling-delay = <1000>;
                        thermal-sensors = <&tsc 2>;
+                       sustainable-power = <2439>;
 
                        trips {
+                               target: trip-point1 {
+                                       /* miliCelsius  */
+                                       temperature = <100000>;
+                                       hysteresis = <1000>;
+                                       type = "passive";
+                               };
+
                                sensor3_crit: sensor3-crit {
                                        temperature = <120000>;
                                        hysteresis = <1000>;
                                        type = "critical";
                                };
                        };
+
+                       cooling-maps {
+                               map0 {
+                                       trip = <&target>;
+                                       cooling-device = <&a57_0 2 4>;
+                                       contribution = <1024>;
+                               };
+                       };
                };
        };
 
index b6d53321576b602d2ca371433b4fadeb17818393..233f26fbec17c35c1ad4c60d585e142356dee48e 100644 (file)
@@ -19,7 +19,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
index c72772589953d04732207639c2cf24ded3a72a6b..83fc13ac3fa1098c8ad8fe4f9512836c0ffa7f82 100644 (file)
@@ -19,7 +19,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
 &avb {
        pinctrl-0 = <&avb_pins>;
        pinctrl-names = "default";
-       renesas,no-ether-link;
        phy-handle = <&phy0>;
        status = "okay";
 
index 56cb566ffa097d24d980f1b7e989c61963882d40..b4318661f35e43ebc24159044e4c3ee5a64de2c7 100644 (file)
                        compatible = "arm,cortex-a53";
                        reg = <0>;
                        device_type = "cpu";
+                       #cooling-cells = <2>;
                        power-domains = <&sysc R8A77990_PD_CA53_CPU0>;
                        next-level-cache = <&L2_CA53>;
                        enable-method = "psci";
+                       dynamic-power-coefficient = <277>;
                        clocks =<&cpg CPG_CORE R8A77990_CLK_Z2>;
                        operating-points-v2 = <&cluster1_opp>;
                };
                               <&usb_dmac1 0>, <&usb_dmac1 1>;
                        dma-names = "ch0", "ch1", "ch2", "ch3";
                        renesas,buswait = <11>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 3>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 704>, <&cpg 703>;
                        reg = <0 0xee080000 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 1>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 703>, <&cpg 704>;
                        reg = <0 0xee080100 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 2>;
                        phy-names = "usb";
                        companion = <&ohci0>;
                        power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
                        resets = <&cpg 703>, <&cpg 704>;
-                       #phy-cells = <0>;
+                       #phy-cells = <1>;
                        status = "disabled";
                };
 
 
                du: display@feb00000 {
                        compatible = "renesas,du-r8a77990";
-                       reg = <0 0xfeb00000 0 0x80000>;
+                       reg = <0 0xfeb00000 0 0x40000>;
                        interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 724>,
                        resets = <&cpg 727>;
                        status = "disabled";
 
+                       renesas,companion = <&lvds1>;
+
                        ports {
                                #address-cells = <1>;
                                #size-cells = <0>;
        thermal-zones {
                cpu-thermal {
                        polling-delay-passive = <250>;
-                       polling-delay = <1000>;
-                       thermal-sensors = <&thermal>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&thermal 0>;
+                       sustainable-power = <717>;
 
                        trips {
-                               cpu-crit {
+                               target: trip-point1 {
+                                       temperature = <100000>;
+                                       hysteresis = <2000>;
+                                       type = "passive";
+                               };
+
+                               sensor1_crit: sensor1-crit {
                                        temperature = <120000>;
                                        hysteresis = <2000>;
                                        type = "critical";
                        };
 
                        cooling-maps {
+                               map0 {
+                                       trip = <&target>;
+                                       cooling-device = <&a53_0 0 2>;
+                                       contribution = <1024>;
+                               };
                        };
                };
        };
index a7dc11e36fd9d0cf9093f378d28c104486ac9b99..0711170b26b1fe1c6ab4d230cc9acb2fb10a0398 100644 (file)
@@ -20,7 +20,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
        status = "okay";
 
        ports {
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               port@0 {
-                       reg = <0>;
-
+               port {
                        vin4_in: endpoint {
                                remote-endpoint = <&adv7180_out>;
                        };
index 5bf3af246e14c29f313899df7d75c02dc7799010..0a344eb55094d2c9183bb7665580b72bf875eb94 100644 (file)
                               <&usb_dmac1 0>, <&usb_dmac1 1>;
                        dma-names = "ch0", "ch1", "ch2", "ch3";
                        renesas,buswait = <11>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 3>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A77995_PD_ALWAYS_ON>;
                        resets = <&cpg 704>, <&cpg 703>;
                        reg = <0 0xee080000 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 1>;
                        phy-names = "usb";
                        power-domains = <&sysc R8A77995_PD_ALWAYS_ON>;
                        resets = <&cpg 703>, <&cpg 704>;
                        reg = <0 0xee080100 0 0x100>;
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
-                       phys = <&usb2_phy0>;
+                       phys = <&usb2_phy0 2>;
                        phy-names = "usb";
                        companion = <&ohci0>;
                        power-domains = <&sysc R8A77995_PD_ALWAYS_ON>;
                        clocks = <&cpg CPG_MOD 703>, <&cpg CPG_MOD 704>;
                        power-domains = <&sysc R8A77995_PD_ALWAYS_ON>;
                        resets = <&cpg 703>, <&cpg 704>;
-                       #phy-cells = <0>;
+                       #phy-cells = <1>;
                        status = "disabled";
                };
 
                        resets = <&cpg 727>;
                        status = "disabled";
 
+                       renesas,companion = <&lvds1>;
+
                        ports {
                                #address-cells = <1>;
                                #size-cells = <0>;
index 2dba1328acfaa9dd997f57f87a28cb59b8ce9bb9..5c2c84723ec5b672beb106bb244ac98097d9cf0d 100644 (file)
@@ -39,7 +39,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
index 7a09576b311231943ded2158112d43eabb732d95..27851a77f5381547f90e28e46467d96b94f4aa3c 100644 (file)
                regulator-min-microvolt = <5000000>;
                regulator-max-microvolt = <5000000>;
        };
+
+       wlan_en: regulator-wlan_en {
+               compatible = "regulator-fixed";
+               regulator-name = "wlan-en-regulator";
+
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpio = <&gpio_exp_74 4 GPIO_ACTIVE_HIGH>;
+               startup-delay-us = <70000>;
+               enable-active-high;
+       };
 };
 
 &can0 {
                        line-name = "Audio_Out_OFF";
                };
 
+               sd-wifi-mux {
+                       gpio-hog;
+                       gpios = <5 GPIO_ACTIVE_HIGH>;
+                       output-low;     /* Connect WL1837 */
+                       line-name = "SD WiFi mux";
+               };
+
                hub_pwen {
                        gpio-hog;
                        gpios = <6 GPIO_ACTIVE_HIGH>;
                function = "scif1";
        };
 
+       sdhi3_pins: sdhi3 {
+               groups = "sdhi3_data4", "sdhi3_ctrl";
+               function = "sdhi3";
+               power-source = <3300>;
+       };
+
        usb0_pins: usb0 {
                groups = "usb0";
                function = "usb0";
        status = "okay";
 };
 
+&sdhi3 {
+       pinctrl-0 = <&sdhi3_pins>;
+       pinctrl-names = "default";
+
+       vmmc-supply = <&wlan_en>;
+       vqmmc-supply = <&wlan_en>;
+       bus-width = <4>;
+       no-1-8-v;
+       non-removable;
+       cap-power-off-card;
+       keep-power-in-suspend;
+       max-frequency = <26000000>;
+       status = "okay";
+
+       #address-cells = <1>;
+       #size-cells = <0>;
+       wlcore: wlcore@2 {
+               compatible = "ti,wl1837";
+               reg = <2>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <25 IRQ_TYPE_EDGE_FALLING>;
+       };
+};
+
 &usb2_phy0 {
        pinctrl-0 = <&usb0_pins>;
        pinctrl-names = "default";
index e70e1bac2be408d2df1434adf609e65a29807816..7e498b46e9aee1ba0da98e9e701f28ed5b7c455b 100644 (file)
@@ -26,7 +26,7 @@
        };
 
        chosen {
-               bootargs = "ignore_loglevel rw root=/dev/nfs ip=dhcp";
+               bootargs = "ignore_loglevel rw root=/dev/nfs ip=on";
                stdout-path = "serial0:115200n8";
        };
 
index 5f2687acbf9433b4f291987f814ede0634f5d314..daa2c78e22c3019d9274c9239837f762f6eb8ed6 100644 (file)
@@ -16,6 +16,10 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-bob.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-kevin.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-scarlet-inx.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-scarlet-kd.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-hugsun-x99.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-khadas-edge.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-khadas-edge-captain.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-khadas-edge-v.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopc-t4.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-m4.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-neo4.dtb
index 5d499c9086fbddc79bf763d839d05fa8855d4706..bb40c163b05dc61e41c1d3e71d186dc53da70cb3 100644 (file)
        phy-mode = "rgmii";
        pinctrl-names = "default";
        pinctrl-0 = <&rgmiim1_pins>;
-       snps,force_thresh_dma_mode;
+       snps,aal;
        snps,reset-gpio = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>;
        snps,reset-active-low;
        snps,reset-delays-us = <0 10000 50000>;
+       snps,rxpbl = <0x4>;
+       snps,txpbl = <0x4>;
        tx_delay = <0x24>;
        rx_delay = <0x18>;
        status = "okay";
index 994468671b19dd3c3895f20734c1308874888a90..e9fefd8a7e02d3a81054b304f1986018a9069478 100644 (file)
                compatible = "snps,dw-wdt";
                reg = <0x0 0xff1a0000 0x0 0x100>;
                interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cru PCLK_WDT>;
        };
 
        pwm0: pwm@ff1b0000 {
index 6b059bd7a04fe2ee2acbb7c67507064ad64c0155..ebe2ee77ba1f60aaeec9914b7158c83a90cb23e7 100644 (file)
        };
 };
 
+&spi1 {
+       /* On both Low speed and High speed expansion */
+       cs-gpios = <0>, <&gpio4 RK_PA6 0>, <&gpio4 RK_PA7 0>;
+       status = "okay";
+};
+
 &usbdrd_dwc3_0 {
        dr_mode = "host";
 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-hugsun-x99.dts b/arch/arm64/boot/dts/rockchip/rk3399-hugsun-x99.dts
new file mode 100644 (file)
index 0000000..0d1f5f9
--- /dev/null
@@ -0,0 +1,733 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/dts-v1/;
+#include <dt-bindings/pwm/pwm.h>
+#include <dt-bindings/input/input.h>
+#include "rk3399.dtsi"
+#include "rk3399-opp.dtsi"
+
+/ {
+       model = "Hugsun X99 TV BOX";
+       compatible = "hugsun,x99", "rockchip,rk3399";
+
+       chosen {
+               stdout-path = "serial2:1500000n8";
+       };
+
+       clkin_gmac: external-gmac-clock {
+               compatible = "fixed-clock";
+               clock-frequency = <125000000>;
+               clock-output-names = "clkin_gmac";
+               #clock-cells = <0>;
+       };
+
+       dc_5v: dc-5v {
+               compatible = "regulator-fixed";
+               regulator-name = "dc_5v";
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+       };
+
+       vcc_sys: vcc-sys {
+               compatible = "regulator-fixed";
+               regulator-name = "vcc_sys";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               regulator-always-on;
+               vin-supply = <&dc_5v>;
+       };
+
+       vcc_phy: vcc-phy-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "vcc_phy";
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
+       vcc1v8_s0: vcc1v8-s0 {
+               compatible = "regulator-fixed";
+               regulator-name = "vcc1v8_s0";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               regulator-always-on;
+       };
+
+       vcc3v3_sys: vcc3v3-sys {
+               compatible = "regulator-fixed";
+               regulator-name = "vcc3v3_sys";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+               vin-supply = <&vcc_sys>;
+       };
+
+       vcc5v0_host: vcc5v0-host-regulator {
+               compatible = "regulator-fixed";
+               enable-active-high;
+               gpio = <&gpio4 RK_PD2 GPIO_ACTIVE_HIGH>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&host_vbus_drv>;
+               regulator-name = "vcc5v0_host";
+               regulator-always-on;
+       };
+
+       vcc5v0_typec: vcc5v0-typec-regulator {
+               compatible = "regulator-fixed";
+               enable-active-high;
+               gpio = <&gpio1 RK_PA3 GPIO_ACTIVE_HIGH>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&vcc5v0_typec_en>;
+               regulator-name = "vcc5v0_typec";
+               regulator-always-on;
+               vin-supply = <&vcc5v0_usb>;
+       };
+
+       vcc5v0_usb: vcc5v0-usb {
+               compatible = "regulator-fixed";
+               regulator-name = "vcc5v0_usb";
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&dc_5v>;
+       };
+
+       vdd_log: vdd-log {
+               compatible = "pwm-regulator";
+               pwms = <&pwm2 0 25000 1>;
+               pwm-supply = <&vcc_sys>;
+               regulator-name = "vdd_log";
+               regulator-min-microvolt = <800000>;
+               regulator-max-microvolt = <1400000>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
+       sdio_pwrseq: sdio-pwrseq {
+               compatible = "mmc-pwrseq-simple";
+               clocks = <&rk808 1>;
+               clock-names = "ext_clock";
+               pinctrl-names = "default";
+               pinctrl-0 = <&wifi_reg_on_h>;
+               reset-gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_LOW>;
+       };
+
+};
+
+&cpu_l0 {
+       cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_l1 {
+       cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_l2 {
+       cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_l3 {
+       cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_b0 {
+       cpu-supply = <&vdd_cpu_b>;
+};
+
+&cpu_b1 {
+       cpu-supply = <&vdd_cpu_b>;
+};
+
+&emmc_phy {
+       status = "okay";
+};
+
+&gmac {
+       assigned-clocks = <&cru SCLK_RMII_SRC>;
+       assigned-clock-parents = <&clkin_gmac>;
+       clock_in_out = "input";
+       phy-supply = <&vcc_phy>;
+       phy-mode = "rgmii";
+       pinctrl-names = "default";
+       pinctrl-0 = <&rgmii_pins>;
+       snps,reset-gpio = <&gpio3 RK_PB7 GPIO_ACTIVE_LOW>;
+       snps,reset-active-low;
+       snps,reset-delays-us = <0 10000 50000>;
+       tx_delay = <0x28>;
+       rx_delay = <0x11>;
+       status = "okay";
+};
+
+&gpu {
+       status = "okay";
+       mali-supply = <&vdd_gpu>;
+};
+
+&hdmi {
+       ddc-i2c-bus = <&i2c3>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&hdmi_cec>;
+       status = "okay";
+};
+
+&hdmi_sound {
+       status = "okay";
+};
+
+&i2c0 {
+       status = "okay";
+       i2c-scl-rising-time-ns = <180>;
+       i2c-scl-falling-time-ns = <30>;
+       clock-frequency = <400000>;
+
+       vdd_cpu_b: syr827@40 {
+               compatible = "silergy,syr827";
+               reg = <0x40>;
+               regulator-compatible = "fan53555-reg";
+               pinctrl-0 = <&vsel1_gpio>;
+               regulator-name = "vdd_cpu_b";
+               regulator-min-microvolt = <712500>;
+               regulator-max-microvolt = <1500000>;
+               regulator-ramp-delay = <1000>;
+               fcs,suspend-voltage-selector = <1>;
+               regulator-always-on;
+               regulator-boot-on;
+               vin-supply = <&vcc_sys>;
+               regulator-state-mem {
+                       regulator-off-in-suspend;
+               };
+       };
+
+       vdd_gpu: syr828@41 {
+               compatible = "silergy,syr828";
+               reg = <0x41>;
+               regulator-compatible = "fan53555-reg";
+               pinctrl-0 = <&vsel2_gpio>;
+               regulator-name = "vdd_gpu";
+               regulator-min-microvolt = <712500>;
+               regulator-max-microvolt = <1500000>;
+               regulator-ramp-delay = <1000>;
+               fcs,suspend-voltage-selector = <1>;
+               regulator-always-on;
+               regulator-boot-on;
+               vin-supply = <&vcc_sys>;
+               regulator-initial-mode = <1>;
+               regulator-state-mem {
+                       regulator-off-in-suspend;
+               };
+       };
+
+       rk808: pmic@1b {
+               compatible = "rockchip,rk808";
+               reg = <0x1b>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <21 IRQ_TYPE_LEVEL_LOW>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pmic_int_l>;
+               rockchip,system-power-controller;
+               wakeup-source;
+               #clock-cells = <1>;
+               clock-output-names = "xin32k", "rtc_clko_wifi";
+
+               vcc1-supply = <&vcc_sys>;
+               vcc2-supply = <&vcc_sys>;
+               vcc3-supply = <&vcc_sys>;
+               vcc4-supply = <&vcc_sys>;
+               vcc6-supply = <&vcc_sys>;
+               vcc7-supply = <&vcc_sys>;
+               vcc8-supply = <&vcc3v3_sys>;
+               vcc9-supply = <&vcc_sys>;
+               vcc10-supply = <&vcc_sys>;
+               vcc11-supply = <&vcc_sys>;
+               vcc12-supply = <&vcc3v3_sys>;
+               vddio-supply = <&vcc_1v8>;
+
+               regulators {
+                       vdd_center: DCDC_REG1 {
+                               regulator-name = "vdd_center";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <900000>;
+                               regulator-ramp-delay = <6001>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
+                       };
+
+                       vdd_cpu_l: DCDC_REG2 {
+                               regulator-name = "vdd_cpu_l";
+                               regulator-min-microvolt = <750000>;
+                               regulator-max-microvolt = <1350000>;
+                               regulator-ramp-delay = <6001>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
+                       };
+
+                       vcc_ddr: DCDC_REG3 {
+                               regulator-name = "vcc_ddr";
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                               };
+                       };
+
+                       vcc_1v8: DCDC_REG4 {
+                               regulator-name = "vcc_1v8";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <1800000>;
+                               };
+                       };
+
+                       vcc1v8_dvp: LDO_REG1 {
+                               regulator-name = "vcc1v8_dvp";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <1800000>;
+                               };
+                       };
+
+                       vcca1v8_hdmi: LDO_REG2 {
+                               regulator-name = "vcca1v8_hdmi";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <1800000>;
+                               };
+                       };
+
+                       vcca_1v8: LDO_REG3 {
+                               regulator-name = "vcca_1v8";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <1800000>;
+                               };
+                       };
+
+                       vcc_sd: LDO_REG4 {
+                               regulator-name = "vcc_sd";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <3300000>;
+                               };
+                       };
+
+                       vcc3v0_sd: LDO_REG5 {
+                               regulator-name = "vcc3v0_sd";
+                               regulator-min-microvolt = <3000000>;
+                               regulator-max-microvolt = <3000000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <3000000>;
+                               };
+                       };
+
+                       vcc_1v5: LDO_REG6 {
+                               regulator-name = "vcc_1v5";
+                               regulator-min-microvolt = <1500000>;
+                               regulator-max-microvolt = <1500000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <1500000>;
+                               };
+                       };
+
+                       vcca0v9_hdmi: LDO_REG7 {
+                               regulator-name = "vcca0v9_hdmi";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <900000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <900000>;
+                               };
+                       };
+
+                       vcc_3v0: LDO_REG8 {
+                               regulator-name = "vcc_3v0";
+                               regulator-min-microvolt = <3000000>;
+                               regulator-max-microvolt = <3000000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <3000000>;
+                               };
+                       };
+
+                       vcc3v3_s3: SWITCH_REG1 {
+                               regulator-name = "vcc3v3_s3";
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                               };
+                       };
+
+                       vcc3v3_s0: SWITCH_REG2 {
+                               regulator-name = "vcc3v3_s0";
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                               };
+                       };
+               };
+       };
+};
+
+&i2c1 {
+       i2c-scl-rising-time-ns = <300>;
+       i2c-scl-falling-time-ns = <15>;
+       status = "okay";
+};
+
+&i2c3 {
+       i2c-scl-rising-time-ns = <450>;
+       i2c-scl-falling-time-ns = <15>;
+       status = "okay";
+};
+
+&i2c4 {
+       i2c-scl-rising-time-ns = <600>;
+       i2c-scl-falling-time-ns = <40>;
+       status = "okay";
+
+       fusb0: typec-portc@22 {
+               compatible = "fcs,fusb302";
+               reg = <0x22>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <RK_PA2 IRQ_TYPE_LEVEL_LOW>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&fusb0_int>;
+               vbus-supply = <&vcc5v0_typec>;
+               status = "okay";
+       };
+};
+
+&i2c7 {
+       status = "okay";
+};
+
+&i2s0 {
+       rockchip,playback-channels = <8>;
+       rockchip,capture-channels = <8>;
+       status = "okay";
+};
+
+&i2s1 {
+       rockchip,playback-channels = <2>;
+       rockchip,capture-channels = <2>;
+       status = "okay";
+};
+
+&i2s2 {
+       status = "okay";
+};
+
+&io_domains {
+       status = "okay";
+       audio-supply = <&vcc1v8_s0>;
+       bt656-supply = <&vcc1v8_s0>;
+       gpio1830-supply = <&vcc_3v0>;
+       sdmmc-supply = <&vcc_sd>;
+};
+
+&pmu_io_domains {
+       status = "okay";
+       pmu1830-supply = <&vcc_1v8>;
+};
+
+&pinctrl {
+       fusb30x {
+               fusb0_int: fusb0-int {
+                       rockchip,pins =
+                               <1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>;
+               };
+       };
+
+       gmac {
+               rgmii_sleep_pins: rgmii-sleep-pins {
+                       rockchip,pins =
+                               <3 RK_PB7 RK_FUNC_GPIO &pcfg_output_low>;
+               };
+       };
+
+       pmic {
+               pmic_int_l: pmic-int-l {
+                       rockchip,pins =
+                               <1 RK_PC5 RK_FUNC_GPIO &pcfg_pull_up>;
+               };
+
+               vsel1_gpio: vsel1-gpio {
+                       rockchip,pins =
+                               <1 RK_PC1 RK_FUNC_GPIO &pcfg_pull_down>;
+               };
+
+               vsel2_gpio: vsel2-gpio {
+                       rockchip,pins =
+                               <1 RK_PB6 RK_FUNC_GPIO &pcfg_pull_down>;
+               };
+       };
+
+       sdio {
+               bt_host_wake_l: bt-host-wake-l {
+                       rockchip,pins = <0 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+
+               bt_reg_on_h: bt-reg-on-h {
+                       /* external pullup to VCC1V8_PMUPLL */
+                       rockchip,pins = <0 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+
+               bt_wake_l: bt-wake-l {
+                       rockchip,pins = <2 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+
+               wifi_reg_on_h: wifi-reg_on-h {
+                       rockchip,pins = <0 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+
+       wifi {
+               wifi_host_wake_l: wifi-host-wake-l {
+                       rockchip,pins = <0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+
+       usb-typec {
+               vcc5v0_typec_en: vcc5v0_typec_en {
+                       rockchip,pins = <1 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>;
+               };
+       };
+
+       usb2 {
+               host_vbus_drv: host-vbus-drv {
+                       rockchip,pins =
+                               <4 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+};
+
+&pwm0 {
+       status = "okay";
+};
+
+&pwm2 {
+       status = "okay";
+       pinctrl-0 = <&pwm2_pin_pull_down>;
+};
+
+&saradc {
+       vref-supply = <&vcc1v8_s0>;
+       status = "okay";
+};
+
+&sdmmc {
+       clock-frequency = <150000000>;
+       clock-freq-min-max = <200000 150000000>;
+       supports-sd;
+       bus-width = <4>;
+       cap-mmc-highspeed;
+       cap-sd-highspeed;
+       disable-wp;
+       vqmmc-supply = <&vcc_sd>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
+       card-detect-delay = <800>;
+       status = "okay";
+};
+
+&sdhci {
+       bus-width = <8>;
+       mmc-hs400-1_8v;
+       mmc-hs400-enhanced-strobe;
+       supports-emmc;
+       non-removable;
+       keep-power-in-suspend;
+       status = "okay";
+};
+
+&sdio0 {
+       bus-width = <4>;
+       clock-frequency = <50000000>;
+       cap-sdio-irq;
+       cap-sd-highspeed;
+       keep-power-in-suspend;
+       mmc-pwrseq = <&sdio_pwrseq>;
+       non-removable;
+       pinctrl-names = "default";
+       pinctrl-0 = <&sdio0_bus4 &sdio0_cmd &sdio0_clk>;
+       sd-uhs-sdr104;
+       #address-cells = <1>;
+       #size-cells = <0>;
+       status = "okay";
+
+       brcmf: wifi@1 {
+               compatible = "brcm,bcm4329-fmac";
+               reg = <1>;
+               interrupt-parent = <&gpio0>;
+               interrupts = <RK_PA3 GPIO_ACTIVE_HIGH>;
+               interrupt-names = "host-wake";
+               pinctrl-names = "default";
+               pinctrl-0 = <&wifi_host_wake_l>;
+       };
+};
+
+&spdif {
+       status = "okay";
+       pinctrl-0 = <&spdif_bus_1>;
+       #sound-dai-cells = <0>;
+};
+
+&spi1 {
+       status = "okay";
+       max-freq = <10000000>;
+
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               spi-max-frequency = <10000000>;
+       };
+};
+
+&tcphy0 {
+       status = "okay";
+};
+
+&tcphy1 {
+       status = "okay";
+};
+
+&tsadc {
+       /* tshut mode 0:CRU 1:GPIO */
+       rockchip,hw-tshut-mode = <1>;
+       /* tshut polarity 0:LOW 1:HIGH */
+       rockchip,hw-tshut-polarity = <1>;
+       rockchip,hw-tshut-temp = <110000>;
+       status = "okay";
+};
+
+&u2phy0 {
+       status = "okay";
+
+       u2phy0_host: host-port {
+               phy-supply = <&vcc5v0_host>;
+               status = "okay";
+       };
+
+       u2phy0_otg: otg-port {
+               status = "okay";
+       };
+};
+
+&u2phy1 {
+       status = "okay";
+
+       u2phy1_host: host-port {
+               phy-supply = <&vcc5v0_host>;
+               status = "okay";
+       };
+
+       u2phy1_otg: otg-port {
+               status = "okay";
+       };
+};
+
+&uart0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_xfer &uart0_rts &uart0_cts>;
+       status = "okay";
+
+       bluetooth {
+               compatible = "brcm,bcm43438-bt";
+               clocks = <&rk808 1>;
+               clock-names = "ext_clock";
+               device-wakeup-gpios = <&gpio2 RK_PD2 GPIO_ACTIVE_HIGH>;
+               host-wakeup-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>;
+               shutdown-gpios = <&gpio0 RK_PB1 GPIO_ACTIVE_HIGH>;
+               max-speed = <4000000>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&bt_reg_on_h &bt_host_wake_l &bt_wake_l>;
+               vbat-supply = <&vcc3v3_sys>;
+               vddio-supply = <&vcc_1v8>;
+       };
+};
+
+&uart2 {
+       status = "okay";
+};
+
+&usb_host0_ehci {
+       status = "okay";
+};
+
+&usb_host0_ohci {
+       status = "okay";
+};
+
+&usb_host1_ehci {
+       status = "okay";
+};
+
+&usb_host1_ohci {
+       status = "okay";
+};
+
+&usbdrd3_0 {
+       status = "okay";
+};
+
+&usbdrd_dwc3_0 {
+       status = "okay";
+       dr_mode = "otg";
+};
+
+&usbdrd3_1 {
+       status = "okay";
+};
+
+&usbdrd_dwc3_1 {
+       status = "okay";
+       dr_mode = "host";
+};
+
+&vopb {
+       status = "okay";
+};
+
+&vopb_mmu {
+       status = "okay";
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-khadas-edge-captain.dts b/arch/arm64/boot/dts/rockchip/rk3399-khadas-edge-captain.dts
new file mode 100644 (file)
index 0000000..8302e51
--- /dev/null
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2019 Shenzhen Wesion Technology Co., Ltd.
+ * (https://www.khadas.com)
+ */
+
+/dts-v1/;
+#include "rk3399-khadas-edge.dtsi"
+
+/ {
+       model = "Khadas Edge-Captain";
+       compatible = "khadas,edge-captain", "rockchip,rk3399";
+};
+
+&gmac {
+       status = "okay";
+};
+
+&pcie_phy {
+       status = "okay";
+};
+
+&pcie0 {
+       ep-gpios = <&gpio1 RK_PA3 GPIO_ACTIVE_HIGH>;
+       num-lanes = <4>;
+       status = "okay";
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-khadas-edge-v.dts b/arch/arm64/boot/dts/rockchip/rk3399-khadas-edge-v.dts
new file mode 100644 (file)
index 0000000..f5dcb99
--- /dev/null
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2019 Shenzhen Wesion Technology Co., Ltd.
+ * (https://www.khadas.com)
+ */
+
+/dts-v1/;
+#include "rk3399-khadas-edge.dtsi"
+
+/ {
+       model = "Khadas Edge-V";
+       compatible = "khadas,edge-v", "rockchip,rk3399";
+};
+
+&gmac {
+       status = "okay";
+};
+
+&pcie_phy {
+       status = "okay";
+};
+
+&pcie0 {
+       ep-gpios = <&gpio1 RK_PA3 GPIO_ACTIVE_HIGH>;
+       num-lanes = <4>;
+       status = "okay";
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-khadas-edge.dts b/arch/arm64/boot/dts/rockchip/rk3399-khadas-edge.dts
new file mode 100644 (file)
index 0000000..31616e7
--- /dev/null
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2019 Shenzhen Wesion Technology Co., Ltd.
+ * (https://www.khadas.com)
+ */
+
+/dts-v1/;
+#include "rk3399-khadas-edge.dtsi"
+
+/ {
+       model = "Khadas Edge";
+       compatible = "khadas,edge", "rockchip,rk3399";
+};
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-khadas-edge.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-khadas-edge.dtsi
new file mode 100644 (file)
index 0000000..4944d78
--- /dev/null
@@ -0,0 +1,804 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2019 Shenzhen Wesion Technology Co., Ltd.
+ * (https://www.khadas.com)
+ */
+
+/dts-v1/;
+#include <dt-bindings/input/linux-event-codes.h>
+#include <dt-bindings/pwm/pwm.h>
+#include "rk3399.dtsi"
+#include "rk3399-opp.dtsi"
+
+/ {
+       chosen {
+               stdout-path = "serial2:1500000n8";
+       };
+
+       clkin_gmac: external-gmac-clock {
+               compatible = "fixed-clock";
+               clock-frequency = <125000000>;
+               clock-output-names = "clkin_gmac";
+               #clock-cells = <0>;
+       };
+
+       sdio_pwrseq: sdio-pwrseq {
+               compatible = "mmc-pwrseq-simple";
+               clocks = <&rk808 1>;
+               clock-names = "ext_clock";
+               pinctrl-names = "default";
+               pinctrl-0 = <&wifi_enable_h>;
+
+               /*
+                * On the module itself this is one of these (depending
+                * on the actual card populated):
+                * - SDIO_RESET_L_WL_REG_ON
+                * - PDN (power down when low)
+                */
+               reset-gpios = <&gpio2 RK_PD4 GPIO_ACTIVE_LOW>;
+       };
+
+       /* switched by pmic_sleep */
+       vcc1v8_s3: vcca1v8_s3: vcc1v8-s3 {
+               compatible = "regulator-fixed";
+               regulator-name = "vcc1v8_s3";
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&vcc_1v8>;
+       };
+
+       vcc3v3_pcie: vcc3v3-pcie-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "vcc3v3_pcie";
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&vsys_3v3>;
+       };
+
+       /* Actually 3 regulators (host0, 1, 2) controlled by the same gpio */
+       vcc5v0_host: vcc5v0-host-regulator {
+               compatible = "regulator-fixed";
+               enable-active-high;
+               gpio = <&gpio4 RK_PD1 GPIO_ACTIVE_HIGH>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&vcc5v0_host_en>;
+               regulator-name = "vcc5v0_host";
+               regulator-always-on;
+               vin-supply = <&vsys_5v0>;
+       };
+
+       vdd_log: vdd-log {
+               compatible = "pwm-regulator";
+               pwms = <&pwm2 0 25000 1>;
+               regulator-name = "vdd_log";
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <800000>;
+               regulator-max-microvolt = <1400000>;
+               vin-supply = <&vsys_3v3>;
+       };
+
+       vsys: vsys {
+               compatible = "regulator-fixed";
+               regulator-name = "vsys";
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
+       vsys_3v3: vsys-3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "vsys_3v3";
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&vsys>;
+       };
+
+       vsys_5v0: vsys-5v0 {
+               compatible = "regulator-fixed";
+               regulator-name = "vsys_5v0";
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&vsys>;
+       };
+
+       adc-keys {
+               compatible = "adc-keys";
+               io-channels = <&saradc 1>;
+               io-channel-names = "buttons";
+               keyup-threshold-microvolt = <1800000>;
+               poll-interval = <100>;
+
+               recovery {
+                       label = "Recovery";
+                       linux,code = <KEY_VENDOR>;
+                       press-threshold-microvolt = <18000>;
+               };
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+               autorepeat;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pwrbtn>;
+
+               power {
+                       debounce-interval = <100>;
+                       gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>;
+                       label = "GPIO Key Power";
+                       linux,code = <KEY_POWER>;
+                       wakeup-source;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               pinctrl-names = "default";
+               pinctrl-0 = <&sys_led_gpio>, <&user_led_gpio>;
+
+               sys-led {
+                       label = "sys_led";
+                       linux,default-trigger = "heartbeat";
+                       gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
+               };
+
+               user-led {
+                       label = "user_led";
+                       default-state = "off";
+                       gpios = <&gpio4 RK_PD0 GPIO_ACTIVE_HIGH>;
+               };
+       };
+
+       fan: pwm-fan {
+               compatible = "pwm-fan";
+               cooling-levels = <0 150 200 255>;
+               #cooling-cells = <2>;
+               fan-supply = <&vsys_5v0>;
+               pwms = <&pwm0 0 40000 0>;
+       };
+};
+
+&cpu_l0 {
+       cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_l1 {
+       cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_l2 {
+       cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_l3 {
+       cpu-supply = <&vdd_cpu_l>;
+};
+
+&cpu_b0 {
+       cpu-supply = <&vdd_cpu_b>;
+};
+
+&cpu_b1 {
+       cpu-supply = <&vdd_cpu_b>;
+};
+
+&cpu_thermal {
+       trips {
+               cpu_warm: cpu_warm {
+                       temperature = <55000>;
+                       hysteresis = <2000>;
+                       type = "active";
+               };
+
+               cpu_hot: cpu_hot {
+                       temperature = <65000>;
+                       hysteresis = <2000>;
+                       type = "active";
+               };
+       };
+
+       cooling-maps {
+               map2 {
+                       trip = <&cpu_warm>;
+                       cooling-device = <&fan THERMAL_NO_LIMIT 1>;
+               };
+
+               map3 {
+                       trip = <&cpu_hot>;
+                       cooling-device = <&fan 2 THERMAL_NO_LIMIT>;
+               };
+       };
+};
+
+&emmc_phy {
+       status = "okay";
+};
+
+&gmac {
+       assigned-clocks = <&cru SCLK_RMII_SRC>;
+       assigned-clock-parents = <&clkin_gmac>;
+       clock_in_out = "input";
+       phy-supply = <&vcc_lan>;
+       phy-mode = "rgmii";
+       pinctrl-names = "default";
+       pinctrl-0 = <&rgmii_pins>;
+       snps,reset-gpio = <&gpio3 RK_PB7 GPIO_ACTIVE_LOW>;
+       snps,reset-active-low;
+       snps,reset-delays-us = <0 10000 50000>;
+       tx_delay = <0x28>;
+       rx_delay = <0x11>;
+};
+
+&gpu {
+       mali-supply = <&vdd_gpu>;
+       status = "okay";
+};
+
+&gpu_thermal {
+       trips {
+               gpu_warm: gpu_warm {
+                       temperature = <55000>;
+                       hysteresis = <2000>;
+                       type = "active";
+               };
+
+               gpu_hot: gpu_hot {
+                       temperature = <65000>;
+                       hysteresis = <2000>;
+                       type = "active";
+               };
+       };
+
+       cooling-maps {
+               map1 {
+                       trip = <&gpu_warm>;
+                       cooling-device = <&fan THERMAL_NO_LIMIT 1>;
+               };
+
+               map2 {
+                       trip = <&gpu_hot>;
+                       cooling-device = <&fan 2 THERMAL_NO_LIMIT>;
+               };
+       };
+};
+
+&hdmi {
+       ddc-i2c-bus = <&i2c3>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&hdmi_cec>;
+       status = "okay";
+};
+
+&hdmi_sound {
+       status = "okay";
+};
+
+&i2c3 {
+       i2c-scl-rising-time-ns = <450>;
+       i2c-scl-falling-time-ns = <15>;
+       status = "okay";
+};
+
+&i2c4 {
+       clock-frequency = <400000>;
+       i2c-scl-rising-time-ns = <168>;
+       i2c-scl-falling-time-ns = <4>;
+       status = "okay";
+
+       rk808: pmic@1b {
+               compatible = "rockchip,rk808";
+               reg = <0x1b>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <RK_PC6 IRQ_TYPE_LEVEL_LOW>;
+               #clock-cells = <1>;
+               clock-output-names = "xin32k", "rk808-clkout2";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pmic_int_l>;
+               rockchip,system-power-controller;
+               wakeup-source;
+
+               vcc1-supply = <&vsys_3v3>;
+               vcc2-supply = <&vsys_3v3>;
+               vcc3-supply = <&vsys_3v3>;
+               vcc4-supply = <&vsys_3v3>;
+               vcc6-supply = <&vsys_3v3>;
+               vcc7-supply = <&vsys_3v3>;
+               vcc8-supply = <&vsys_3v3>;
+               vcc9-supply = <&vsys_3v3>;
+               vcc10-supply = <&vsys_3v3>;
+               vcc11-supply = <&vsys_3v3>;
+               vcc12-supply = <&vsys_3v3>;
+               vddio-supply = <&vcc_1v8>;
+
+               regulators {
+                       vdd_center: DCDC_REG1 {
+                               regulator-name = "vdd_center";
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <750000>;
+                               regulator-max-microvolt = <1350000>;
+                               regulator-ramp-delay = <6001>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
+                       };
+
+                       vdd_cpu_l: DCDC_REG2 {
+                               regulator-name = "vdd_cpu_l";
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <750000>;
+                               regulator-max-microvolt = <1350000>;
+                               regulator-ramp-delay = <6001>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
+                       };
+
+                       vcc_ddr: DCDC_REG3 {
+                               regulator-name = "vcc_ddr";
+                               regulator-always-on;
+                               regulator-boot-on;
+
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                               };
+                       };
+
+                       vcc_1v8: DCDC_REG4 {
+                               regulator-name = "vcc_1v8";
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <1800000>;
+                               };
+                       };
+
+                       vcc1v8_apio2: LDO_REG1 {
+                               regulator-name = "vcc1v8_apio2";
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
+                       };
+
+                       vcc_vldo2: LDO_REG2 {
+                               regulator-name = "vcc_vldo2";
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <3000000>;
+                               regulator-max-microvolt = <3000000>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
+                       };
+
+                       vcc1v8_pmupll: LDO_REG3 {
+                               regulator-name = "vcc1v8_pmupll";
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <1800000>;
+                               };
+                       };
+
+                       vccio_sd: LDO_REG4 {
+                               regulator-name = "vccio_sd";
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3000000>;
+
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <3000000>;
+                               };
+                       };
+
+                       vcc_vldo5: LDO_REG5 {
+                               regulator-name = "vcc_vldo5";
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <3000000>;
+                               regulator-max-microvolt = <3000000>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
+                       };
+
+                       vcc_1v5: LDO_REG6 {
+                               regulator-name = "vcc_1v5";
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <1500000>;
+                               regulator-max-microvolt = <1500000>;
+
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <1500000>;
+                               };
+                       };
+
+                       vcc1v8_codec: LDO_REG7 {
+                               regulator-name = "vcc1v8_codec";
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
+                       };
+
+                       vcc_3v0: LDO_REG8 {
+                               regulator-name = "vcc_3v0";
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <3000000>;
+                               regulator-max-microvolt = <3000000>;
+
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <3000000>;
+                               };
+                       };
+
+                       vcc3v3_s3: vcc_lan: SWITCH_REG1 {
+                               regulator-name = "vcc3v3_s3";
+                               regulator-always-on;
+                               regulator-boot-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
+                       };
+
+                       vcc3v3_s0: SWITCH_REG2 {
+                               regulator-name = "vcc3v3_s0";
+                               regulator-always-on;
+                               regulator-boot-on;
+
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
+                       };
+               };
+       };
+
+       vdd_cpu_b: regulator@40 {
+               compatible = "silergy,syr827";
+               reg = <0x40>;
+               fcs,suspend-voltage-selector = <1>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&cpu_b_sleep>;
+               regulator-name = "vdd_cpu_b";
+               regulator-min-microvolt = <712500>;
+               regulator-max-microvolt = <1500000>;
+               regulator-ramp-delay = <1000>;
+               regulator-always-on;
+               regulator-boot-on;
+               vin-supply = <&vsys_3v3>;
+
+               regulator-state-mem {
+                       regulator-off-in-suspend;
+               };
+       };
+
+       vdd_gpu: regulator@41 {
+               compatible = "silergy,syr828";
+               reg = <0x41>;
+               fcs,suspend-voltage-selector = <1>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&gpu_sleep>;
+               regulator-name = "vdd_gpu";
+               regulator-min-microvolt = <712500>;
+               regulator-max-microvolt = <1500000>;
+               regulator-ramp-delay = <1000>;
+               regulator-always-on;
+               regulator-boot-on;
+               vin-supply = <&vsys_3v3>;
+
+               regulator-state-mem {
+                       regulator-off-in-suspend;
+               };
+       };
+};
+
+&i2c8 {
+       clock-frequency = <400000>;
+       i2c-scl-rising-time-ns = <160>;
+       i2c-scl-falling-time-ns = <30>;
+       status = "okay";
+};
+
+&i2s0 {
+       rockchip,playback-channels = <8>;
+       rockchip,capture-channels = <8>;
+       status = "okay";
+};
+
+&i2s1 {
+       rockchip,playback-channels = <2>;
+       rockchip,capture-channels = <2>;
+       status = "okay";
+};
+
+&i2s2 {
+       status = "okay";
+};
+
+&io_domains {
+       bt656-supply = <&vcc1v8_apio2>;
+       audio-supply = <&vcc1v8_codec>;
+       sdmmc-supply = <&vccio_sd>;
+       gpio1830-supply = <&vcc_3v0>;
+       status = "okay";
+};
+
+&pmu_io_domains {
+       pmu1830-supply = <&vcc_1v8>;
+       status = "okay";
+};
+
+&pinctrl {
+       bt {
+               bt_host_wake_l: bt-host-wake-l {
+                       rockchip,pins = <0 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+
+               bt_reg_on_h: bt-reg-on-h {
+                       rockchip,pins = <2 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+
+               bt_wake_l: bt-wake-l {
+                       rockchip,pins = <2 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+
+       buttons {
+               pwrbtn: pwrbtn {
+                       rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up>;
+               };
+       };
+
+       leds {
+               sys_led_gpio: sys_led-gpio {
+                       rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+
+               user_led_gpio: user_led-gpio {
+                       rockchip,pins = <4 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+
+       pmic {
+               pmic_int_l: pmic-int-l {
+                       rockchip,pins = <1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;
+               };
+
+               cpu_b_sleep: cpu-b-sleep {
+                       rockchip,pins = <1 RK_PB5 RK_FUNC_GPIO &pcfg_pull_down>;
+               };
+
+               gpu_sleep: gpu-sleep {
+                       rockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_down>;
+               };
+       };
+
+       sdio-pwrseq {
+               wifi_enable_h: wifi-enable-h {
+                       rockchip,pins = <2 RK_PD4 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+
+       usb2 {
+               vcc5v0_host_en: vcc5v0-host-en {
+                       rockchip,pins = <4 RK_PD1 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+
+       wifi {
+               wifi_host_wake_l: wifi-host-wake-l {
+                       rockchip,pins = <0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+};
+
+&pwm0 {
+       status = "okay";
+};
+
+&pwm2 {
+       status = "okay";
+};
+
+&saradc {
+       vref-supply = <&vcca1v8_s3>;
+       status = "okay";
+};
+
+&sdio0 {
+       /* WiFi & BT combo module Ampak AP6356S */
+       bus-width = <4>;
+       cap-sdio-irq;
+       cap-sd-highspeed;
+       keep-power-in-suspend;
+       mmc-pwrseq = <&sdio_pwrseq>;
+       non-removable;
+       pinctrl-names = "default";
+       pinctrl-0 = <&sdio0_bus4 &sdio0_cmd &sdio0_clk>;
+       sd-uhs-sdr104;
+       vqmmc-supply = <&vcc1v8_s3>;
+       vmmc-supply = <&vccio_sd>;
+       status = "okay";
+
+       brcmf: wifi@1 {
+               compatible = "brcm,bcm4329-fmac";
+               interrupt-parent = <&gpio0>;
+               interrupts = <RK_PA3 GPIO_ACTIVE_HIGH>;
+               interrupt-names = "host-wake";
+               brcm,drive-strength = <5>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&wifi_host_wake_l>;
+       };
+};
+
+&sdmmc {
+       bus-width = <4>;
+       cap-mmc-highspeed;
+       cap-sd-highspeed;
+       cd-gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_LOW>;
+       disable-wp;
+       max-frequency = <150000000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_bus4>;
+       status = "okay";
+};
+
+&sdhci {
+       bus-width = <8>;
+       mmc-hs400-1_8v;
+       mmc-hs400-enhanced-strobe;
+       non-removable;
+       status = "okay";
+};
+
+&tcphy0 {
+       status = "okay";
+};
+
+&tcphy1 {
+       status = "okay";
+};
+
+&tsadc {
+       /* tshut mode 0:CRU 1:GPIO */
+       rockchip,hw-tshut-mode = <1>;
+       /* tshut polarity 0:LOW 1:HIGH */
+       rockchip,hw-tshut-polarity = <1>;
+       status = "okay";
+};
+
+&u2phy0 {
+       status = "okay";
+
+       u2phy0_otg: otg-port {
+               status = "okay";
+       };
+
+       u2phy0_host: host-port {
+               phy-supply = <&vcc5v0_host>;
+               status = "okay";
+       };
+};
+
+&u2phy1 {
+       status = "okay";
+
+       u2phy1_otg: otg-port {
+               status = "okay";
+       };
+
+       u2phy1_host: host-port {
+               phy-supply = <&vcc5v0_host>;
+               status = "okay";
+       };
+};
+
+&uart0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_xfer &uart0_rts &uart0_cts>;
+       status = "okay";
+
+       bluetooth {
+               compatible = "brcm,bcm43438-bt";
+               clocks = <&rk808 1>;
+               clock-names = "lpo";
+               device-wakeup-gpios = <&gpio2 RK_PD2 GPIO_ACTIVE_HIGH>;
+               host-wakeup-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>;
+               shutdown-gpios = <&gpio2 RK_PD3 GPIO_ACTIVE_HIGH>;
+               max-speed = <4000000>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&bt_reg_on_h &bt_host_wake_l &bt_wake_l>;
+               vbat-supply = <&vsys_3v3>;
+               vddio-supply = <&vcc_1v8>;
+       };
+};
+
+&uart2 {
+       status = "okay";
+};
+
+&usb_host0_ehci {
+       status = "okay";
+};
+
+&usb_host0_ohci {
+       status = "okay";
+};
+
+&usb_host1_ehci {
+       status = "okay";
+};
+
+&usb_host1_ohci {
+       status = "okay";
+};
+
+&usbdrd3_0 {
+       status = "okay";
+};
+
+&usbdrd_dwc3_0 {
+       status = "okay";
+       dr_mode = "otg";
+};
+
+&usbdrd3_1 {
+       status = "okay";
+};
+
+&usbdrd_dwc3_1 {
+       status = "okay";
+       dr_mode = "host";
+};
+
+&vopb {
+       status = "okay";
+};
+
+&vopb_mmu {
+       status = "okay";
+};
+
+&vopl {
+       status = "okay";
+};
+
+&vopl_mmu {
+       status = "okay";
+};
index e030627159c6bc012b44f80180033f0a5a516929..1ae1ebd4efdd077d8b184b56d4dc503d6cfc27a8 100644 (file)
                #clock-cells = <0>;
        };
 
+       sdio_pwrseq: sdio-pwrseq {
+               compatible = "mmc-pwrseq-simple";
+               clocks = <&rk808 1>;
+               clock-names = "ext_clock";
+               pinctrl-names = "default";
+               pinctrl-0 = <&wifi_enable_h>;
+               reset-gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_LOW>;
+       };
+
        vcc12v_dcin: dc-12v {
                compatible = "regulator-fixed";
                regulator-name = "vcc12v_dcin";
        status = "okay";
 };
 
+&hdmi_sound {
+       status = "okay";
+};
+
 &i2c0 {
        clock-frequency = <400000>;
        i2c-scl-rising-time-ns = <168>;
 };
 
 &pinctrl {
+       bt {
+               bt_enable_h: bt-enable-h {
+                       rockchip,pins = <0 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+
+               bt_host_wake_l: bt-host-wake-l {
+                       rockchip,pins = <0 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+
+               bt_wake_l: bt-wake-l {
+                       rockchip,pins = <2 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+
        pcie {
                pcie_pwr_en: pcie-pwr-en {
                        rockchip,pins = <2 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>;
                };
        };
 
+       sdio0 {
+               sdio0_bus4: sdio0-bus4 {
+                       rockchip,pins =
+                               <2 20 RK_FUNC_1 &pcfg_pull_up_20ma>,
+                               <2 21 RK_FUNC_1 &pcfg_pull_up_20ma>,
+                               <2 22 RK_FUNC_1 &pcfg_pull_up_20ma>,
+                               <2 23 RK_FUNC_1 &pcfg_pull_up_20ma>;
+               };
+
+               sdio0_cmd: sdio0-cmd {
+                       rockchip,pins =
+                               <2 24 RK_FUNC_1 &pcfg_pull_up_20ma>;
+               };
+
+               sdio0_clk: sdio0-clk {
+                       rockchip,pins =
+                               <2 25 RK_FUNC_1 &pcfg_pull_none_20ma>;
+               };
+       };
+
        pmic {
                pmic_int_l: pmic-int-l {
                        rockchip,pins = <1 RK_PC5 RK_FUNC_GPIO &pcfg_pull_up>;
                        rockchip,pins = <4 RK_PD1 RK_FUNC_GPIO &pcfg_pull_none>;
                };
        };
+
+       wifi {
+               wifi_enable_h: wifi-enable-h {
+                       rockchip,pins =
+                               <0 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+
+               wifi_host_wake_l: wifi-host-wake-l {
+                       rockchip,pins = <0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
 };
 
 &pwm2 {
        vref-supply = <&vcc_1v8>;
 };
 
+&sdio0 {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       bus-width = <4>;
+       clock-frequency = <50000000>;
+       cap-sdio-irq;
+       cap-sd-highspeed;
+       keep-power-in-suspend;
+       mmc-pwrseq = <&sdio_pwrseq>;
+       non-removable;
+       pinctrl-names = "default";
+       pinctrl-0 = <&sdio0_bus4 &sdio0_cmd &sdio0_clk>;
+       sd-uhs-sdr104;
+       status = "okay";
+
+       brcmf: wifi@1 {
+               compatible = "brcm,bcm4329-fmac";
+               reg = <1>;
+               interrupt-parent = <&gpio0>;
+               interrupts = <RK_PA3 GPIO_ACTIVE_HIGH>;
+               interrupt-names = "host-wake";
+               pinctrl-names = "default";
+               pinctrl-0 = <&wifi_host_wake_l>;
+       };
+};
+
 &sdmmc {
        bus-width = <4>;
        cap-mmc-highspeed;
        };
 };
 
+&uart0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_xfer &uart0_cts &uart0_rts>;
+       status = "okay";
+
+       bluetooth {
+               compatible = "brcm,bcm43438-bt";
+               clocks = <&rk808 1>;
+               clock-names = "ext_clock";
+               device-wakeup-gpios = <&gpio2 RK_PD3 GPIO_ACTIVE_HIGH>;
+               host-wakeup-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>;
+               shutdown-gpios = <&gpio0 RK_PB1 GPIO_ACTIVE_HIGH>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&bt_host_wake_l &bt_wake_l &bt_enable_h>;
+       };
+};
+
 &uart2 {
        status = "okay";
 };
index 12285c51cceb6efaac4f43f80d8e3b4525154979..437a75f31ad4db29e5b021aeb84944741bb1494a 100644 (file)
        };
 };
 
+&spi0 {
+       /* On Low speed expansion (LS-SPI0) */
+       status = "okay";
+};
+
+&spi4 {
+       /* On High speed expansion (HS-SPI1) */
+       status = "okay";
+};
+
+&thermal_zones {
+       cpu_thermal: cpu {
+               polling-delay-passive = <100>;
+               polling-delay = <1000>;
+               thermal-sensors = <&tsadc 0>;
+               sustainable-power = <1550>;
+
+               trips {
+                       cpu_alert0: cpu_alert0 {
+                                   temperature = <65000>;
+                                   hysteresis = <2000>;
+                                   type = "passive";
+                       };
+
+                       cpu_alert1: cpu_alert1 {
+                                   temperature = <75000>;
+                                   hysteresis = <2000>;
+                                   type = "passive";
+                       };
+
+                       cpu_crit: cpu_crit {
+                                 temperature = <95000>;
+                                 hysteresis = <2000>;
+                                 type = "critical";
+                       };
+               };
+
+               cooling-maps {
+                            map0 {
+
+                            trip = <&cpu_alert1>;
+                            cooling-device =
+                                       <&cpu_b0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                       <&cpu_b1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                       };
+               };
+       };
+};
+
 &usbdrd_dwc3_0 {
        dr_mode = "otg";
 };
index 20ec7d1c25d71cf53198f58e94faa877339a3884..eb55940620060679b488582e9812029f16e55e0d 100644 (file)
        gpio1830-supply = <&vcc_3v0>;
 };
 
+&pcie0 {
+       ep-gpios = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>;
+       num-lanes = <4>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pcie_perst>;
+       vpcie12v-supply = <&vcc12v_dcin>;
+       vpcie3v3-supply = <&vcc3v3_pcie>;
+       status = "okay";
+};
+
+&pcie_phy {
+       status = "okay";
+};
+
 &pmu_io_domains {
        pmu1830-supply = <&vcc_3v0>;
        status = "okay";
        };
 
        pcie {
+               pcie_perst: pcie-perst {
+                       rockchip,pins = <2 RK_PD4 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+
                pcie_pwr_en: pcie-pwr-en {
                        rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none>;
                };
index 04623e52ac5db568adfdeefaacd132ac1b7d026c..1bc1579674e5753e81f20ea5d2542da3f6e28b75 100644 (file)
        status = "okay";
 
        u2phy0_otg: otg-port {
-               phy-supply = <&vcc5v0_typec0>;
                status = "okay";
        };
 
        u2phy0_host: host-port {
-               phy-supply = <&vcc5v0_host>;
+               phy-supply = <&vcc5v0_typec0>;
                status = "okay";
        };
 };
 
 &usbdrd_dwc3_0 {
        status = "okay";
-       dr_mode = "otg";
+       dr_mode = "host";
 };
 
 &usbdrd3_1 {
index 196ac9b780768b53f25f832452cfe30a8fd11f80..cede1ad81be23857ae4e55c6d7df23a468a7a374 100644 (file)
                        compatible = "snps,dwc3";
                        reg = <0x0 0xfe800000 0x0 0x100000>;
                        interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH 0>;
+                       clocks = <&cru SCLK_USB3OTG0_REF>, <&cru ACLK_USB3OTG0>,
+                                <&cru SCLK_USB3OTG0_SUSPEND>;
+                       clock-names = "ref", "bus_early", "suspend";
                        dr_mode = "otg";
                        phys = <&u2phy0_otg>, <&tcphy0_usb3>;
                        phy-names = "usb2-phy", "usb3-phy";
                        compatible = "snps,dwc3";
                        reg = <0x0 0xfe900000 0x0 0x100000>;
                        interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH 0>;
+                       clocks = <&cru SCLK_USB3OTG1_REF>, <&cru ACLK_USB3OTG1>,
+                                <&cru SCLK_USB3OTG1_SUSPEND>;
+                       clock-names = "ref", "bus_early", "suspend";
                        dr_mode = "otg";
                        phys = <&u2phy1_otg>, <&tcphy1_usb3>;
                        phy-names = "usb2-phy", "usb3-phy";
                                        type = "critical";
                                };
                        };
-
-                       cooling-maps {
-                               map0 {
-                                       trip = <&gpu_alert0>;
-                                       cooling-device =
-                                               <&cpu_b0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
-                                               <&cpu_b1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
-                               };
-                       };
                };
        };
 
                reg = <0x0 0xff914000 0x0 0x100>, <0x0 0xff915000 0x0 0x100>;
                interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH 0>;
                interrupt-names = "isp0_mmu";
-               clocks = <&cru ACLK_ISP0_NOC>, <&cru HCLK_ISP0_NOC>;
+               clocks = <&cru ACLK_ISP0_WRAPPER>, <&cru HCLK_ISP0_WRAPPER>;
                clock-names = "aclk", "iface";
                #iommu-cells = <0>;
+               power-domains = <&power RK3399_PD_ISP0>;
                rockchip,disable-mmu-reset;
-               status = "disabled";
        };
 
        isp1_mmu: iommu@ff924000 {
                reg = <0x0 0xff924000 0x0 0x100>, <0x0 0xff925000 0x0 0x100>;
                interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH 0>;
                interrupt-names = "isp1_mmu";
-               clocks = <&cru ACLK_ISP1_NOC>, <&cru HCLK_ISP1_NOC>;
+               clocks = <&cru ACLK_ISP1_WRAPPER>, <&cru HCLK_ISP1_WRAPPER>;
                clock-names = "aclk", "iface";
                #iommu-cells = <0>;
+               power-domains = <&power RK3399_PD_ISP1>;
                rockchip,disable-mmu-reset;
-               status = "disabled";
        };
 
        hdmi_sound: hdmi-sound {
diff --git a/arch/arm64/boot/dts/rockchip/rk3399pro.dtsi b/arch/arm64/boot/dts/rockchip/rk3399pro.dtsi
new file mode 100644 (file)
index 0000000..bb5ebf6
--- /dev/null
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd.
+
+#include "rk3399.dtsi"
+
+/ {
+       compatible = "rockchip,rk3399pro";
+};
+
+/* Default to enabled since AP talk to NPU part over pcie */
+&pcie_phy {
+       status = "okay";
+};
+
+/* Default to enabled since AP talk to NPU part over pcie */
+&pcie0 {
+       ep-gpios = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>;
+       num-lanes = <4>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pcie_clkreqn_cpm>;
+       status = "okay";
+};
index 7968d524351b3e83ce227784164cf690f5daa158..f72f048a0c9d056cf714f0ef2b1f7c18e9051467 100644 (file)
 
 &nand {
        status = "okay";
+
+       nand@0 {
+               reg = <0>;
+       };
 };
index a3cd475b48d2bace6ee45bb78fcbe63955b2a923..8ec40a0b8b1ef05e1b4dc4ba142ecbfd0564c3fd 100644 (file)
@@ -8,8 +8,6 @@
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/gpio/uniphier-gpio.h>
 
-/memreserve/ 0x80000000 0x02000000;
-
 / {
        compatible = "socionext,uniphier-ld11";
        #address-cells = <2>;
                             <1 10 4>;
        };
 
+       reserved-memory {
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+
+               secure-memory@81000000 {
+                       reg = <0x0 0x81000000 0x0 0x01000000>;
+                       no-map;
+               };
+       };
+
        soc@0 {
                compatible = "simple-bus";
                #address-cells = <1>;
                        status = "disabled";
                        reg-names = "nand_data", "denali_reg";
                        reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
                        interrupts = <0 65 4>;
                        pinctrl-names = "default";
                        pinctrl-0 = <&pinctrl_nand>;
index 017f6328c191dcd00187ff73d7c6a14a0b790116..b658f2b641e2933abb35ae19d5d8220b8b481371 100644 (file)
@@ -9,8 +9,6 @@
 #include <dt-bindings/gpio/uniphier-gpio.h>
 #include <dt-bindings/thermal/thermal.h>
 
-/memreserve/ 0x80000000 0x02000000;
-
 / {
        compatible = "socionext,uniphier-ld20";
        #address-cells = <2>;
                };
        };
 
+       reserved-memory {
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+
+               secure-memory@81000000 {
+                       reg = <0x0 0x81000000 0x0 0x01000000>;
+                       no-map;
+               };
+       };
+
        soc@0 {
                compatible = "simple-bus";
                #address-cells = <1>;
                        status = "disabled";
                        reg-names = "nand_data", "denali_reg";
                        reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
                        interrupts = <0 65 4>;
                        pinctrl-names = "default";
                        pinctrl-0 = <&pinctrl_nand>;
index 1965e4dfe4a4778de7b914605d8c78f96560f0d0..754315bbd1c88096dd9ed21af4af606db2d09062 100644 (file)
 
 &nand {
        status = "okay";
+
+       nand@0 {
+               reg = <0>;
+       };
 };
index bb97abe1a55f5b14e982b464b783b54ea0dbe745..d6f6cee4d549199481c6d030fc0f9e1db012c2c7 100644 (file)
@@ -8,8 +8,6 @@
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/gpio/uniphier-gpio.h>
 
-/memreserve/ 0x80000000 0x02000000;
-
 / {
        compatible = "socionext,uniphier-pxs3";
        #address-cells = <2>;
                             <1 10 4>;
        };
 
+       reserved-memory {
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+
+               secure-memory@81000000 {
+                       reg = <0x0 0x81000000 0x0 0x01000000>;
+                       no-map;
+               };
+       };
+
        soc@0 {
                compatible = "simple-bus";
                #address-cells = <1>;
                        status = "disabled";
                        reg-names = "nand_data", "denali_reg";
                        reg = <0x68000000 0x20>, <0x68100000 0x1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
                        interrupts = <0 65 4>;
                        pinctrl-names = "default";
                        pinctrl-0 = <&pinctrl_nand>;
index 286d7173f94f91d937a1d26e8177d26c66391175..231436be0e3f6895c57f398350729682affafd6e 100644 (file)
@@ -60,7 +60,7 @@
        };
 
        funnel@10001000 {
-               compatible = "arm,coresight-funnel", "arm,primecell";
+               compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                reg = <0 0x10001000 0 0x1000>;
                clocks = <&clk26mhz>;
                clock-names = "apb_pclk";
index b25d19977170759908e5b05e84c1b83b22355372..e27eb3ed1d47991be7573d320eb6b5cae2f6a608 100644 (file)
                };
 
                funnel@10001000 { /* SoC Funnel */
-                       compatible = "arm,coresight-funnel", "arm,primecell";
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                        reg = <0 0x10001000 0 0x1000>;
                        clocks = <&ext_26m>;
                        clock-names = "apb_pclk";
                };
 
                funnel@11001000 { /* Cluster0 Funnel */
-                       compatible = "arm,coresight-funnel", "arm,primecell";
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                        reg = <0 0x11001000 0 0x1000>;
                        clocks = <&ext_26m>;
                        clock-names = "apb_pclk";
                };
 
                funnel@11002000 { /* Cluster1 Funnel */
-                       compatible = "arm,coresight-funnel", "arm,primecell";
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                        reg = <0 0x11002000 0 0x1000>;
                        clocks = <&ext_26m>;
                        clock-names = "apb_pclk";
                };
 
                funnel@11005000 { /* Main Funnel */
-                       compatible = "arm,coresight-funnel", "arm,primecell";
+                       compatible = "arm,coresight-dynamic-funnel", "arm,primecell";
                        reg = <0 0x11005000 0 0x1000>;
                        clocks = <&ext_26m>;
                        clock-names = "apb_pclk";
index 4bb862c6b08312451bce50087fb2fe9a3b70cd86..79b9591c37aab97ae04a7f3df4244e75069dde33 100644 (file)
                                clock-names = "enable";
                                clocks = <&apahb_gate CLK_DMA_EB>;
                        };
+
+                       sdio3: sdio@50430000 {
+                               compatible  = "sprd,sdhci-r11";
+                               reg = <0 0x50430000 0 0x1000>;
+                               interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
+
+                               clock-names = "sdio", "enable", "2x_enable";
+                               clocks = <&aon_prediv CLK_EMMC_2X>,
+                                      <&apahb_gate CLK_EMMC_EB>,
+                                      <&aon_gate CLK_EMMC_2X_EN>;
+                               assigned-clocks = <&aon_prediv CLK_EMMC_2X>;
+                               assigned-clock-parents = <&clk_l0_409m6>;
+
+                               sprd,phy-delay-mmc-hs400 = <0x44 0x7f 0x2e 0x2e>;
+                               sprd,phy-delay-mmc-hs200 = <0x0 0x8c 0x8c 0x8c>;
+                               sprd,phy-delay-mmc-ddr52 = <0x3f 0x75 0x14 0x14>;
+                               sprd,phy-delay-mmc-hs400es = <0x3f 0x3f 0x2e 0x2e>;
+                               vmmc-supply = <&vddemmccore>;
+                               bus-width = <8>;
+                               non-removable;
+                               no-sdio;
+                               no-sd;
+                               cap-mmc-hw-reset;
+                               mmc-hs400-enhanced-strobe;
+                               mmc-hs400-1_8v;
+                               mmc-hs200-1_8v;
+                               mmc-ddr-1_8v;
+                       };
                };
 
                aon {
                clock-frequency = <100000000>;
                clock-output-names = "ext-rco-100m";
        };
+
+       clk_l0_409m6: clk_l0_409m6 {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <409600000>;
+               clock-output-names = "ext-409m6";
+       };
 };
index 63e619d0b5b81eeac7681dc93450216e3d5791f4..b397945fdf730ca3f68741dd7d1fe5e2d6e58b53 100644 (file)
@@ -7,3 +7,5 @@
 #
 
 dtb-$(CONFIG_ARCH_K3_AM6_SOC) += k3-am654-base-board.dtb
+
+dtb-$(CONFIG_ARCH_K3_J721E_SOC) += k3-j721e-common-proc-board.dtb
index 752455269fab830da778cd8fda157674687517bc..ca70ff73f171d9b0600b597deb77f8d86fd46941 100644 (file)
@@ -4,6 +4,7 @@
  *
  * Copyright (C) 2016-2018 Texas Instruments Incorporated - http://www.ti.com/
  */
+#include <dt-bindings/phy/phy-am654-serdes.h>
 
 &cbass_main {
        msmc_ram: sram@70000000 {
@@ -44,6 +45,7 @@
                gic_its: gic-its@18200000 {
                        compatible = "arm,gic-v3-its";
                        reg = <0x00 0x01820000 0x00 0x10000>;
+                       socionext,synquacer-pre-its = <0x1000000 0x400000>;
                        msi-controller;
                        #msi-cells = <1>;
                };
                interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
        };
 
+       serdes0: serdes@900000 {
+               compatible = "ti,phy-am654-serdes";
+               reg = <0x0 0x900000 0x0 0x2000>;
+               reg-names = "serdes";
+               #phy-cells = <2>;
+               power-domains = <&k3_pds 153>;
+               clocks = <&k3_clks 153 4>, <&k3_clks 153 1>, <&serdes1 AM654_SERDES_LO_REFCLK>;
+               clock-output-names = "serdes0_cmu_refclk", "serdes0_lo_refclk", "serdes0_ro_refclk";
+               assigned-clocks = <&k3_clks 153 4>, <&serdes0 AM654_SERDES_CMU_REFCLK>;
+               assigned-clock-parents = <&k3_clks 153 8>, <&k3_clks 153 4>;
+               ti,serdes-clk = <&serdes0_clk>;
+               #clock-cells = <1>;
+               mux-controls = <&serdes_mux 0>;
+       };
+
+       serdes1: serdes@910000 {
+               compatible = "ti,phy-am654-serdes";
+               reg = <0x0 0x910000 0x0 0x2000>;
+               reg-names = "serdes";
+               #phy-cells = <2>;
+               power-domains = <&k3_pds 154>;
+               clocks = <&serdes0 AM654_SERDES_RO_REFCLK>, <&k3_clks 154 1>, <&k3_clks 154 5>;
+               clock-output-names = "serdes1_cmu_refclk", "serdes1_lo_refclk", "serdes1_ro_refclk";
+               assigned-clocks = <&k3_clks 154 5>, <&serdes1 AM654_SERDES_CMU_REFCLK>;
+               assigned-clock-parents = <&k3_clks 154 9>, <&k3_clks 154 5>;
+               ti,serdes-clk = <&serdes1_clk>;
+               #clock-cells = <1>;
+               mux-controls = <&serdes_mux 1>;
+       };
+
        main_uart0: serial@2800000 {
                compatible = "ti,am654-uart";
                reg = <0x00 0x02800000 0x00 0x100>;
                #address-cells = <1>;
                #size-cells = <1>;
                ranges = <0x0 0x0 0x00100000 0x1c000>;
+
+               pcie0_mode: pcie-mode@4060 {
+                       compatible = "syscon";
+                       reg = <0x00004060 0x4>;
+               };
+
+               pcie1_mode: pcie-mode@4070 {
+                       compatible = "syscon";
+                       reg = <0x00004070 0x4>;
+               };
+
+               pcie_devid: pcie-devid@210 {
+                       compatible = "syscon";
+                       reg = <0x00000210 0x4>;
+               };
+
+               serdes0_clk: serdes_clk@4080 {
+                       compatible = "syscon";
+                       reg = <0x00004080 0x4>;
+               };
+
+               serdes1_clk: serdes_clk@4090 {
+                       compatible = "syscon";
+                       reg = <0x00004090 0x4>;
+               };
+
+               serdes_mux: mux-controller {
+                       compatible = "mmio-mux";
+                       #mux-control-cells = <1>;
+                       mux-reg-masks = <0x4080 0x3>, /* SERDES0 lane select */
+                                       <0x4090 0x3>; /* SERDES1 lane select */
+               };
        };
 
        dwc3_0: dwc3@4000000 {
                clock-names = "wkupclk", "refclk";
                #phy-cells = <0>;
        };
+
+       intr_main_gpio: interrupt-controller0 {
+               compatible = "ti,sci-intr";
+               ti,intr-trigger-type = <1>;
+               interrupt-controller;
+               interrupt-parent = <&gic500>;
+               #interrupt-cells = <2>;
+               ti,sci = <&dmsc>;
+               ti,sci-dst-id = <56>;
+               ti,sci-rm-range-girq = <0x1>;
+       };
+
+       cbass_main_navss: interconnect0 {
+               compatible = "simple-bus";
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+
+               intr_main_navss: interrupt-controller1 {
+                       compatible = "ti,sci-intr";
+                       ti,intr-trigger-type = <4>;
+                       interrupt-controller;
+                       interrupt-parent = <&gic500>;
+                       #interrupt-cells = <2>;
+                       ti,sci = <&dmsc>;
+                       ti,sci-dst-id = <56>;
+                       ti,sci-rm-range-girq = <0x0>, <0x2>;
+               };
+
+               inta_main_udmass: interrupt-controller@33d00000 {
+                       compatible = "ti,sci-inta";
+                       reg = <0x0 0x33d00000 0x0 0x100000>;
+                       interrupt-controller;
+                       interrupt-parent = <&intr_main_navss>;
+                       msi-controller;
+                       ti,sci = <&dmsc>;
+                       ti,sci-dev-id = <179>;
+                       ti,sci-rm-range-vint = <0x0>;
+                       ti,sci-rm-range-global-event = <0x1>;
+               };
+       };
+
+       main_gpio0:  main_gpio0@600000 {
+               compatible = "ti,am654-gpio", "ti,keystone-gpio";
+               reg = <0x0 0x600000 0x0 0x100>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               interrupt-parent = <&intr_main_gpio>;
+               interrupts = <57 256>, <57 257>, <57 258>, <57 259>, <57 260>,
+                               <57 261>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+               ti,ngpio = <96>;
+               ti,davinci-gpio-unbanked = <0>;
+               clocks = <&k3_clks 57 0>;
+               clock-names = "gpio";
+       };
+
+       main_gpio1:  main_gpio1@601000 {
+               compatible = "ti,am654-gpio", "ti,keystone-gpio";
+               reg = <0x0 0x601000 0x0 0x100>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               interrupt-parent = <&intr_main_gpio>;
+               interrupts = <58 256>, <58 257>, <58 258>, <58 259>, <58 260>,
+                               <58 261>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+               ti,ngpio = <90>;
+               ti,davinci-gpio-unbanked = <0>;
+               clocks = <&k3_clks 58 0>;
+               clock-names = "gpio";
+       };
+
+       pcie0_rc: pcie@5500000 {
+               compatible = "ti,am654-pcie-rc";
+               reg =  <0x0 0x5500000 0x0 0x1000>, <0x0 0x5501000 0x0 0x1000>, <0x0 0x10000000 0x0 0x2000>, <0x0 0x5506000 0x0 0x1000>;
+               reg-names = "app", "dbics", "config", "atu";
+               power-domains = <&k3_pds 120>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               ranges = <0x81000000 0 0          0x0 0x10020000 0 0x00010000
+                         0x82000000 0 0x10030000 0x0 0x10030000 0 0x07FD0000>;
+               ti,syscon-pcie-id = <&pcie_devid>;
+               ti,syscon-pcie-mode = <&pcie0_mode>;
+               bus-range = <0x0 0xff>;
+               num-viewport = <16>;
+               max-link-speed = <3>;
+               dma-coherent;
+               interrupts = <GIC_SPI 340 IRQ_TYPE_EDGE_RISING>;
+               msi-map = <0x0 &gic_its 0x0 0x10000>;
+       };
+
+       pcie0_ep: pcie-ep@5500000 {
+               compatible = "ti,am654-pcie-ep";
+               reg =  <0x0 0x5500000 0x0 0x1000>, <0x0 0x5501000 0x0 0x1000>, <0x0 0x10000000 0x0 0x8000000>, <0x0 0x5506000 0x0 0x1000>;
+               reg-names = "app", "dbics", "addr_space", "atu";
+               power-domains = <&k3_pds 120>;
+               ti,syscon-pcie-mode = <&pcie0_mode>;
+               num-ib-windows = <16>;
+               num-ob-windows = <16>;
+               max-link-speed = <3>;
+               dma-coherent;
+               interrupts = <GIC_SPI 340 IRQ_TYPE_EDGE_RISING>;
+       };
+
+       pcie1_rc: pcie@5600000 {
+               compatible = "ti,am654-pcie-rc";
+               reg =  <0x0 0x5600000 0x0 0x1000>, <0x0 0x5601000 0x0 0x1000>, <0x0 0x18000000 0x0 0x2000>, <0x0 0x5606000 0x0 0x1000>;
+               reg-names = "app", "dbics", "config", "atu";
+               power-domains = <&k3_pds 121>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               ranges = <0x81000000 0 0          0x0   0x18020000 0 0x00010000
+                         0x82000000 0 0x18030000 0x0   0x18030000 0 0x07FD0000>;
+               ti,syscon-pcie-id = <&pcie_devid>;
+               ti,syscon-pcie-mode = <&pcie1_mode>;
+               bus-range = <0x0 0xff>;
+               num-viewport = <16>;
+               max-link-speed = <3>;
+               dma-coherent;
+               interrupts = <GIC_SPI 355 IRQ_TYPE_EDGE_RISING>;
+               msi-map = <0x0 &gic_its 0x10000 0x10000>;
+       };
+
+       pcie1_ep: pcie-ep@5600000 {
+               compatible = "ti,am654-pcie-ep";
+               reg =  <0x0 0x5600000 0x0 0x1000>, <0x0 0x5601000 0x0 0x1000>, <0x0 0x18000000 0x0 0x4000000>, <0x0 0x5606000 0x0 0x1000>;
+               reg-names = "app", "dbics", "addr_space", "atu";
+               power-domains = <&k3_pds 121>;
+               ti,syscon-pcie-mode = <&pcie1_mode>;
+               num-ib-windows = <16>;
+               num-ob-windows = <16>;
+               max-link-speed = <3>;
+               dma-coherent;
+               interrupts = <GIC_SPI 355 IRQ_TYPE_EDGE_RISING>;
+       };
 };
index 6f7d2b316dedd2eecc278e63b47e0e4572db8bff..afc29eaa263839e72e27e357a00c1d930c0d984e 100644 (file)
                        power-domains = <&k3_pds 149>;
        };
 
+       mcu_ram: sram@41c00000 {
+               compatible = "mmio-sram";
+               reg = <0x00 0x41c00000 0x00 0x80000>;
+               ranges = <0x0 0x00 0x41c00000 0x80000>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+       };
+
        mcu_i2c0: i2c@40b00000 {
                compatible = "ti,am654-i2c", "ti,omap4-i2c";
                reg = <0x0 0x40b00000 0x0 0x100>;
index 7cbdc0912ab706985d00563b85aca98b6e0543f7..9cf2c0849a24c6ce9fc2cf565a40f0247bb3d750 100644 (file)
@@ -7,7 +7,7 @@
 
 &cbass_wakeup {
        dmsc: dmsc {
-               compatible = "ti,k2g-sci";
+               compatible = "ti,am654-sci";
                ti,host-id = <12>;
                #address-cells = <1>;
                #size-cells = <1>;
                clocks = <&k3_clks 115 1>;
                power-domains = <&k3_pds 115>;
        };
+
+       intr_wkup_gpio: interrupt-controller2 {
+               compatible = "ti,sci-intr";
+               ti,intr-trigger-type = <1>;
+               interrupt-controller;
+               interrupt-parent = <&gic500>;
+               #interrupt-cells = <2>;
+               ti,sci = <&dmsc>;
+               ti,sci-dst-id = <56>;
+               ti,sci-rm-range-girq = <0x4>;
+       };
+
+       wkup_gpio0: wkup_gpio0@42110000 {
+               compatible = "ti,am654-gpio", "ti,keystone-gpio";
+               reg = <0x42110000 0x100>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               interrupt-parent = <&intr_wkup_gpio>;
+               interrupts = <59 128>, <59 129>, <59 130>, <59 131>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+               ti,ngpio = <56>;
+               ti,davinci-gpio-unbanked = <0>;
+               clocks = <&k3_clks 59 0>;
+               clock-names = "gpio";
+       };
 };
index 50f4be2047a99fcc1b89e2cc1fc085afd66d06a4..82edf10b2378107a87fd1804eb9e1a8dd3b6e010 100644 (file)
                         <0x00 0x00900000 0x00 0x00900000 0x00 0x00012000>, /* serdes */
                         <0x00 0x01000000 0x00 0x01000000 0x00 0x0af02400>, /* Most peripherals */
                         <0x00 0x30800000 0x00 0x30800000 0x00 0x0bc00000>, /* MAIN NAVSS */
+                        <0x00 0x70000000 0x00 0x70000000 0x00 0x00200000>, /* MSMC SRAM */
+                        <0x00 0x10000000 0x00 0x10000000 0x00 0x10000000>, /* PCIe DAT */
                         /* MCUSS Range */
                         <0x00 0x28380000 0x00 0x28380000 0x00 0x03880000>,
                         <0x00 0x40200000 0x00 0x40200000 0x00 0x00900100>,
+                        <0x00 0x41000000 0x00 0x41000000 0x00 0x00020000>,
+                        <0x00 0x41400000 0x00 0x41400000 0x00 0x00020000>,
+                        <0x00 0x41c00000 0x00 0x41c00000 0x00 0x00080000>,
                         <0x00 0x42040000 0x00 0x42040000 0x00 0x03ac2400>,
                         <0x00 0x45100000 0x00 0x45100000 0x00 0x00c24000>,
                         <0x00 0x46000000 0x00 0x46000000 0x00 0x00200000>,
@@ -82,6 +87,9 @@
                        #size-cells = <2>;
                        ranges = <0x00 0x28380000 0x00 0x28380000 0x00 0x03880000>, /* MCU NAVSS*/
                                 <0x00 0x40200000 0x00 0x40200000 0x00 0x00900100>, /* First peripheral window */
+                                <0x00 0x41000000 0x00 0x41000000 0x00 0x00020000>, /* MCU R5F Core0 */
+                                <0x00 0x41400000 0x00 0x41400000 0x00 0x00020000>, /* MCU R5F Core1 */
+                                <0x00 0x41c00000 0x00 0x41c00000 0x00 0x00080000>, /* MCU SRAM */
                                 <0x00 0x42040000 0x00 0x42040000 0x00 0x03ac2400>, /* WKUP */
                                 <0x00 0x45100000 0x00 0x45100000 0x00 0x00c24000>, /* MMRs, remaining NAVSS */
                                 <0x00 0x46000000 0x00 0x46000000 0x00 0x00200000>, /* CPSW */
index cf1aa276a1ea582f35b86790458865d05da08c54..52c245d36db921a7ee163596c387540eca40994a 100644 (file)
@@ -6,6 +6,7 @@
 /dts-v1/;
 
 #include "k3-am654.dtsi"
+#include <dt-bindings/input/input.h>
 
 / {
        compatible =  "ti,am654-evm", "ti,am654";
                        no-map;
                };
        };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+               autorepeat;
+               pinctrl-names = "default";
+               pinctrl-0 = <&push_button_pins_default>;
+
+               sw5 {
+                       label = "GPIO Key USER1";
+                       linux,code = <BTN_0>;
+                       gpios = <&wkup_gpio0 24 GPIO_ACTIVE_LOW>;
+               };
+
+               sw6 {
+                       label = "GPIO Key USER2";
+                       linux,code = <BTN_1>;
+                       gpios = <&wkup_gpio0 27 GPIO_ACTIVE_LOW>;
+               };
+       };
 };
 
 &wkup_pmx0 {
                        AM65X_WKUP_IOPAD(0x00e4, PIN_INPUT, 0) /* (AD6) WKUP_I2C0_SDA */
                >;
        };
+
+       push_button_pins_default: push_button__pins_default {
+               pinctrl-single,pins = <
+                       AM65X_WKUP_IOPAD(0x0030, PIN_INPUT, 7) /* (R5) WKUP_GPIO0_24 */
+                       AM65X_WKUP_IOPAD(0x003c, PIN_INPUT, 7) /* (P2) WKUP_GPIO0_27 */
+               >;
+       };
 };
 
 &main_pmx0 {
                ti,adc-channels = <0 1 2 3 4 5 6 7>;
        };
 };
+
+&serdes0 {
+       status = "disabled";
+};
+
+&serdes1 {
+       status = "disabled";
+};
+
+&pcie0_rc {
+       status = "disabled";
+};
+
+&pcie0_ep {
+       status = "disabled";
+};
+
+&pcie1_rc {
+       status = "disabled";
+};
+
+&pcie1_ep {
+       status = "disabled";
+};
diff --git a/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts b/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts
new file mode 100644 (file)
index 0000000..c680123
--- /dev/null
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
+ */
+
+/dts-v1/;
+
+#include "k3-j721e-som-p0.dtsi"
+
+/ {
+       chosen {
+               stdout-path = "serial2:115200n8";
+               bootargs = "console=ttyS2,115200n8 earlycon=ns16550a,mmio32,0x02800000";
+       };
+};
+
+&wkup_uart0 {
+       /* Wakeup UART is used by System firmware */
+       status = "disabled";
+};
+
+&main_uart3 {
+       /* UART not brought out */
+       status = "disabled";
+};
+
+&main_uart5 {
+       /* UART not brought out */
+       status = "disabled";
+};
+
+&main_uart6 {
+       /* UART not brought out */
+       status = "disabled";
+};
+
+&main_uart7 {
+       /* UART not brought out */
+       status = "disabled";
+};
+
+&main_uart8 {
+       /* UART not brought out */
+       status = "disabled";
+};
+
+&main_uart9 {
+       /* UART not brought out */
+       status = "disabled";
+};
diff --git a/arch/arm64/boot/dts/ti/k3-j721e-main.dtsi b/arch/arm64/boot/dts/ti/k3-j721e-main.dtsi
new file mode 100644 (file)
index 0000000..a013081
--- /dev/null
@@ -0,0 +1,243 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Device Tree Source for J721E SoC Family Main Domain peripherals
+ *
+ * Copyright (C) 2016-2019 Texas Instruments Incorporated - http://www.ti.com/
+ */
+
+&cbass_main {
+       msmc_ram: sram@70000000 {
+               compatible = "mmio-sram";
+               reg = <0x0 0x70000000 0x0 0x800000>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x0 0x0 0x70000000 0x800000>;
+
+               atf-sram@0 {
+                       reg = <0x0 0x20000>;
+               };
+       };
+
+       gic500: interrupt-controller@1800000 {
+               compatible = "arm,gic-v3";
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+               #interrupt-cells = <3>;
+               interrupt-controller;
+               reg = <0x00 0x01800000 0x00 0x10000>,   /* GICD */
+                     <0x00 0x01900000 0x00 0x100000>;  /* GICR */
+
+               /* vcpumntirq: virtual CPU interface maintenance interrupt */
+               interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
+
+               gic_its: gic-its@18200000 {
+                       compatible = "arm,gic-v3-its";
+                       reg = <0x00 0x01820000 0x00 0x10000>;
+                       socionext,synquacer-pre-its = <0x1000000 0x400000>;
+                       msi-controller;
+                       #msi-cells = <1>;
+               };
+       };
+
+       smmu0: smmu@36600000 {
+               compatible = "arm,smmu-v3";
+               reg = <0x0 0x36600000 0x0 0x100000>;
+               interrupt-parent = <&gic500>;
+               interrupts = <GIC_SPI 772 IRQ_TYPE_EDGE_RISING>,
+                            <GIC_SPI 768 IRQ_TYPE_EDGE_RISING>;
+               interrupt-names = "eventq", "gerror";
+               #iommu-cells = <1>;
+       };
+
+       main_gpio_intr: interrupt-controller0 {
+               compatible = "ti,sci-intr";
+               ti,intr-trigger-type = <1>;
+               interrupt-controller;
+               interrupt-parent = <&gic500>;
+               #interrupt-cells = <2>;
+               ti,sci = <&dmsc>;
+               ti,sci-dst-id = <14>;
+               ti,sci-rm-range-girq = <0x1>;
+       };
+
+       cbass_main_navss: interconnect0 {
+               compatible = "simple-bus";
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+
+               main_navss_intr: interrupt-controller1 {
+                       compatible = "ti,sci-intr";
+                       ti,intr-trigger-type = <4>;
+                       interrupt-controller;
+                       interrupt-parent = <&gic500>;
+                       #interrupt-cells = <2>;
+                       ti,sci = <&dmsc>;
+                       ti,sci-dst-id = <14>;
+                       ti,sci-rm-range-girq = <0>, <2>;
+               };
+
+               main_udmass_inta: interrupt-controller@33d00000 {
+                       compatible = "ti,sci-inta";
+                       reg = <0x0 0x33d00000 0x0 0x100000>;
+                       interrupt-controller;
+                       interrupt-parent = <&main_navss_intr>;
+                       msi-controller;
+                       ti,sci = <&dmsc>;
+                       ti,sci-dev-id = <209>;
+                       ti,sci-rm-range-vint = <0xa>;
+                       ti,sci-rm-range-global-event = <0xd>;
+               };
+       };
+
+       secure_proxy_main: mailbox@32c00000 {
+               compatible = "ti,am654-secure-proxy";
+               #mbox-cells = <1>;
+               reg-names = "target_data", "rt", "scfg";
+               reg = <0x00 0x32c00000 0x00 0x100000>,
+                     <0x00 0x32400000 0x00 0x100000>,
+                     <0x00 0x32800000 0x00 0x100000>;
+               interrupt-names = "rx_011";
+               interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
+       };
+
+       main_pmx0: pinmux@11c000 {
+               compatible = "pinctrl-single";
+               /* Proxy 0 addressing */
+               reg = <0x0 0x11c000 0x0 0x2b4>;
+               #pinctrl-cells = <1>;
+               pinctrl-single,register-width = <32>;
+               pinctrl-single,function-mask = <0xffffffff>;
+       };
+
+       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>;
+               power-domains = <&k3_pds 146>;
+               clocks = <&k3_clks 146 0>;
+               clock-names = "fclk";
+       };
+
+       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>;
+               power-domains = <&k3_pds 278>;
+               clocks = <&k3_clks 278 0>;
+               clock-names = "fclk";
+       };
+
+       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>;
+               power-domains = <&k3_pds 279>;
+               clocks = <&k3_clks 279 0>;
+               clock-names = "fclk";
+       };
+
+       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>;
+               power-domains = <&k3_pds 280>;
+               clocks = <&k3_clks 280 0>;
+               clock-names = "fclk";
+       };
+
+       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>;
+               power-domains = <&k3_pds 281>;
+               clocks = <&k3_clks 281 0>;
+               clock-names = "fclk";
+       };
+
+       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>;
+               power-domains = <&k3_pds 282>;
+               clocks = <&k3_clks 282 0>;
+               clock-names = "fclk";
+       };
+
+       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>;
+               power-domains = <&k3_pds 283>;
+               clocks = <&k3_clks 283 0>;
+               clock-names = "fclk";
+       };
+
+       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>;
+               power-domains = <&k3_pds 284>;
+               clocks = <&k3_clks 284 0>;
+               clock-names = "fclk";
+       };
+
+       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>;
+               power-domains = <&k3_pds 285>;
+               clocks = <&k3_clks 285 0>;
+               clock-names = "fclk";
+       };
+
+       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>;
+               power-domains = <&k3_pds 286>;
+               clocks = <&k3_clks 286 0>;
+               clock-names = "fclk";
+       };
+};
diff --git a/arch/arm64/boot/dts/ti/k3-j721e-mcu-wakeup.dtsi b/arch/arm64/boot/dts/ti/k3-j721e-mcu-wakeup.dtsi
new file mode 100644 (file)
index 0000000..07b58ee
--- /dev/null
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Device Tree Source for J721E SoC Family MCU/WAKEUP Domain peripherals
+ *
+ * Copyright (C) 2016-2019 Texas Instruments Incorporated - http://www.ti.com/
+ */
+
+&cbass_mcu_wakeup {
+       dmsc: dmsc@44083000 {
+               compatible = "ti,k2g-sci";
+               ti,host-id = <12>;
+
+               mbox-names = "rx", "tx";
+
+               mboxes= <&secure_proxy_main 11>,
+                       <&secure_proxy_main 13>;
+
+               reg-names = "debug_messages";
+               reg = <0x00 0x44083000 0x0 0x1000>;
+
+               k3_pds: power-controller {
+                       compatible = "ti,sci-pm-domain";
+                       #power-domain-cells = <1>;
+               };
+
+               k3_clks: clocks {
+                       compatible = "ti,k2g-sci-clk";
+                       #clock-cells = <2>;
+               };
+
+               k3_reset: reset-controller {
+                       compatible = "ti,sci-reset";
+                       #reset-cells = <2>;
+               };
+       };
+
+       wkup_pmx0: pinmux@4301c000 {
+               compatible = "pinctrl-single";
+               /* Proxy 0 addressing */
+               reg = <0x00 0x4301c000 0x00 0x178>;
+               #pinctrl-cells = <1>;
+               pinctrl-single,register-width = <32>;
+               pinctrl-single,function-mask = <0xffffffff>;
+       };
+
+       mcu_ram: sram@41c00000 {
+               compatible = "mmio-sram";
+               reg = <0x00 0x41c00000 0x00 0x100000>;
+               ranges = <0x0 0x00 0x41c00000 0x100000>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+       };
+
+       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>;
+               power-domains = <&k3_pds 287>;
+               clocks = <&k3_clks 287 0>;
+               clock-names = "fclk";
+       };
+
+       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>;
+               power-domains = <&k3_pds 149>;
+               clocks = <&k3_clks 149 0>;
+               clock-names = "fclk";
+       };
+
+       wkup_gpio_intr: interrupt-controller2 {
+               compatible = "ti,sci-intr";
+               ti,intr-trigger-type = <1>;
+               interrupt-controller;
+               interrupt-parent = <&gic500>;
+               #interrupt-cells = <2>;
+               ti,sci = <&dmsc>;
+               ti,sci-dst-id = <14>;
+               ti,sci-rm-range-girq = <0x5>;
+       };
+};
diff --git a/arch/arm64/boot/dts/ti/k3-j721e-som-p0.dtsi b/arch/arm64/boot/dts/ti/k3-j721e-som-p0.dtsi
new file mode 100644 (file)
index 0000000..1884fc7
--- /dev/null
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
+ */
+
+/dts-v1/;
+
+#include "k3-j721e.dtsi"
+
+/ {
+       memory@80000000 {
+               device_type = "memory";
+               /* 4G RAM */
+               reg = <0x00000000 0x80000000 0x00000000 0x80000000>,
+                     <0x00000008 0x80000000 0x00000000 0x80000000>;
+       };
+
+       reserved_memory: reserved-memory {
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+
+               secure_ddr: optee@9e800000 {
+                       reg = <0x00 0x9e800000 0x00 0x01800000>;
+                       alignment = <0x1000>;
+                       no-map;
+               };
+       };
+};
diff --git a/arch/arm64/boot/dts/ti/k3-j721e.dtsi b/arch/arm64/boot/dts/ti/k3-j721e.dtsi
new file mode 100644 (file)
index 0000000..f8dd74b
--- /dev/null
@@ -0,0 +1,177 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Device Tree Source for J721E SoC Family
+ *
+ * Copyright (C) 2016-2019 Texas Instruments Incorporated - http://www.ti.com/
+ */
+
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/pinctrl/k3.h>
+
+/ {
+       model = "Texas Instruments K3 J721E SoC";
+       compatible = "ti,j721e";
+       interrupt-parent = <&gic500>;
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       aliases {
+               serial0 = &wkup_uart0;
+               serial1 = &mcu_uart0;
+               serial2 = &main_uart0;
+               serial3 = &main_uart1;
+               serial4 = &main_uart2;
+               serial5 = &main_uart3;
+               serial6 = &main_uart4;
+               serial7 = &main_uart5;
+               serial8 = &main_uart6;
+               serial9 = &main_uart7;
+               serial10 = &main_uart8;
+               serial11 = &main_uart9;
+       };
+
+       chosen { };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               cpu-map {
+                       cluster0: cluster0 {
+                               core0 {
+                                       cpu = <&cpu0>;
+                               };
+
+                               core1 {
+                                       cpu = <&cpu1>;
+                               };
+                       };
+
+               };
+
+               cpu0: cpu@0 {
+                       compatible = "arm,cortex-a72";
+                       reg = <0x000>;
+                       device_type = "cpu";
+                       enable-method = "psci";
+                       i-cache-size = <0xC000>;
+                       i-cache-line-size = <64>;
+                       i-cache-sets = <256>;
+                       d-cache-size = <0x8000>;
+                       d-cache-line-size = <64>;
+                       d-cache-sets = <128>;
+                       next-level-cache = <&L2_0>;
+               };
+
+               cpu1: cpu@1 {
+                       compatible = "arm,cortex-a72";
+                       reg = <0x001>;
+                       device_type = "cpu";
+                       enable-method = "psci";
+                       i-cache-size = <0xC000>;
+                       i-cache-line-size = <64>;
+                       i-cache-sets = <256>;
+                       d-cache-size = <0x8000>;
+                       d-cache-line-size = <64>;
+                       d-cache-sets = <128>;
+                       next-level-cache = <&L2_0>;
+               };
+       };
+
+       L2_0: l2-cache0 {
+               compatible = "cache";
+               cache-level = <2>;
+               cache-size = <0x100000>;
+               cache-line-size = <64>;
+               cache-sets = <2048>;
+               next-level-cache = <&msmc_l3>;
+       };
+
+       msmc_l3: l3-cache0 {
+               compatible = "cache";
+               cache-level = <3>;
+       };
+
+       firmware {
+               optee {
+                       compatible = "linaro,optee-tz";
+                       method = "smc";
+               };
+
+               psci: psci {
+                       compatible = "arm,psci-1.0";
+                       method = "smc";
+               };
+       };
+
+       a72_timer0: timer-cl0-cpu0 {
+               compatible = "arm,armv8-timer";
+               interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_LOW>, /* cntpsirq */
+                            <GIC_PPI 14 IRQ_TYPE_LEVEL_LOW>, /* cntpnsirq */
+                            <GIC_PPI 11 IRQ_TYPE_LEVEL_LOW>, /* cntvirq */
+                            <GIC_PPI 10 IRQ_TYPE_LEVEL_LOW>; /* cnthpirq */
+       };
+
+       pmu: pmu {
+               compatible = "arm,armv8-pmuv3";
+               /* Recommendation from GIC500 TRM Table A.3 */
+               interrupts = <GIC_PPI 7 IRQ_TYPE_LEVEL_HIGH>;
+       };
+
+       cbass_main: interconnect@100000 {
+               compatible = "simple-bus";
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges = <0x00 0x00100000 0x00 0x00100000 0x00 0x00020000>, /* ctrl mmr */
+                        <0x00 0x00600000 0x00 0x00600000 0x00 0x00031100>, /* GPIO */
+                        <0x00 0x00900000 0x00 0x00900000 0x00 0x00012000>, /* serdes */
+                        <0x00 0x00A40000 0x00 0x00A40000 0x00 0x00000800>, /* timesync router */
+                        <0x00 0x01000000 0x00 0x01000000 0x00 0x0af02400>, /* Most peripherals */
+                        <0x00 0x30800000 0x00 0x30800000 0x00 0x0bc00000>, /* MAIN NAVSS */
+                        <0x00 0x0d000000 0x00 0x0d000000 0x00 0x01000000>, /* PCIe Core*/
+                        <0x00 0x10000000 0x00 0x10000000 0x00 0x10000000>, /* PCIe DAT */
+                        <0x00 0x64800000 0x00 0x64800000 0x00 0x00800000>, /* C71 */
+                        <0x4d 0x80800000 0x4d 0x80800000 0x00 0x00800000>, /* C66_0 */
+                        <0x4d 0x81800000 0x4d 0x81800000 0x00 0x00800000>, /* C66_1 */
+                        <0x4e 0x20000000 0x4e 0x20000000 0x00 0x00080000>, /* GPU */
+                        <0x00 0x70000000 0x00 0x70000000 0x00 0x00800000>, /* MSMC RAM */
+
+                        /* MCUSS_WKUP Range */
+                        <0x00 0x28380000 0x00 0x28380000 0x00 0x03880000>,
+                        <0x00 0x40200000 0x00 0x40200000 0x00 0x00998400>,
+                        <0x00 0x40f00000 0x00 0x40f00000 0x00 0x00020000>,
+                        <0x00 0x41000000 0x00 0x41000000 0x00 0x00020000>,
+                        <0x00 0x41400000 0x00 0x41400000 0x00 0x00020000>,
+                        <0x00 0x41c00000 0x00 0x41c00000 0x00 0x00100000>,
+                        <0x00 0x42040000 0x00 0x42040000 0x00 0x03ac2400>,
+                        <0x00 0x45100000 0x00 0x45100000 0x00 0x00c24000>,
+                        <0x00 0x46000000 0x00 0x46000000 0x00 0x00200000>,
+                        <0x00 0x47000000 0x00 0x47000000 0x00 0x00068400>,
+                        <0x00 0x50000000 0x00 0x50000000 0x00 0x10000000>,
+                        <0x05 0x00000000 0x05 0x00000000 0x01 0x00000000>,
+                        <0x07 0x00000000 0x07 0x00000000 0x01 0x00000000>;
+
+               cbass_mcu_wakeup: interconnect@28380000 {
+                       compatible = "simple-bus";
+                       #address-cells = <2>;
+                       #size-cells = <2>;
+                       ranges = <0x00 0x28380000 0x00 0x28380000 0x00 0x03880000>, /* MCU NAVSS*/
+                                <0x00 0x40200000 0x00 0x40200000 0x00 0x00998400>, /* First peripheral window */
+                                <0x00 0x40f00000 0x00 0x40f00000 0x00 0x00020000>, /* CTRL_MMR0 */
+                                <0x00 0x41000000 0x00 0x41000000 0x00 0x00020000>, /* MCU R5F Core0 */
+                                <0x00 0x41400000 0x00 0x41400000 0x00 0x00020000>, /* MCU R5F Core1 */
+                                <0x00 0x41c00000 0x00 0x41c00000 0x00 0x00100000>, /* MCU SRAM */
+                                <0x00 0x42040000 0x00 0x42040000 0x00 0x03ac2400>, /* WKUP peripheral window */
+                                <0x00 0x45100000 0x00 0x45100000 0x00 0x00c24000>, /* MMRs, remaining NAVSS */
+                                <0x00 0x46000000 0x00 0x46000000 0x00 0x00200000>, /* CPSW */
+                                <0x00 0x47000000 0x00 0x47000000 0x00 0x00068400>, /* OSPI register space */
+                                <0x00 0x50000000 0x00 0x50000000 0x00 0x10000000>, /* FSS OSPI0/1 data region 0 */
+                                <0x05 0x00000000 0x05 0x00000000 0x01 0x00000000>, /* FSS OSPI0 data region 3 */
+                                <0x07 0x00000000 0x07 0x00000000 0x01 0x00000000>; /* FSS OSPI1 data region 3*/
+               };
+       };
+};
+
+/* Now include the peripherals for each bus segments */
+#include "k3-j721e-main.dtsi"
+#include "k3-j721e-mcu-wakeup.dtsi"
index dd827e64e5fe620b1e4fbdc712adc405ccb9ccc1..0e58ef02880c1df01061019aac6dd5f4711db9c6 100644 (file)
@@ -83,6 +83,7 @@ CONFIG_CPUFREQ_DT=y
 CONFIG_ACPI_CPPC_CPUFREQ=m
 CONFIG_ARM_ARMADA_37XX_CPUFREQ=y
 CONFIG_ARM_SCPI_CPUFREQ=y
+CONFIG_ARM_IMX_CPUFREQ_DT=m
 CONFIG_ARM_TEGRA186_CPUFREQ=y
 CONFIG_ARM_SCPI_PROTOCOL=y
 CONFIG_RASPBERRYPI_FIRMWARE=y
@@ -192,7 +193,7 @@ CONFIG_PCIE_QCOM=y
 CONFIG_PCIE_ARMADA_8K=y
 CONFIG_PCIE_KIRIN=y
 CONFIG_PCIE_HISI_STB=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_PCIE_TEGRA194=m
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_HISILICON_LPC=y
@@ -216,6 +217,7 @@ CONFIG_BLK_DEV_SD=y
 CONFIG_SCSI_SAS_ATA=y
 CONFIG_SCSI_HISI_SAS=y
 CONFIG_SCSI_HISI_SAS_PCI=y
+CONFIG_SCSI_MPT3SAS=m
 CONFIG_SCSI_UFSHCD=y
 CONFIG_SCSI_UFSHCD_PLATFORM=y
 CONFIG_SCSI_UFS_QCOM=m
@@ -231,6 +233,11 @@ CONFIG_SATA_SIL24=y
 CONFIG_SATA_RCAR=y
 CONFIG_PATA_PLATFORM=y
 CONFIG_PATA_OF_PLATFORM=y
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=m
+CONFIG_BLK_DEV_DM=m
+CONFIG_DM_MIRROR=m
+CONFIG_DM_ZERO=m
 CONFIG_NETDEVICES=y
 CONFIG_MACVLAN=m
 CONFIG_MACVTAP=m
@@ -240,6 +247,7 @@ CONFIG_VIRTIO_NET=y
 CONFIG_AMD_XGBE=y
 CONFIG_NET_XGENE=y
 CONFIG_ATL1C=m
+CONFIG_BNX2X=m
 CONFIG_MACB=y
 CONFIG_THUNDER_NIC_PF=y
 CONFIG_FEC=y
@@ -252,6 +260,15 @@ CONFIG_HNS3_ENET=y
 CONFIG_E1000E=y
 CONFIG_IGB=y
 CONFIG_IGBVF=y
+CONFIG_MLX4_EN=m
+CONFIG_MLX4_CORE=m
+CONFIG_MLX4_DEBUG=y
+CONFIG_MLX4_CORE_GEN2=y
+CONFIG_MLX5_CORE=m
+CONFIG_MLX5_CORE_EN=y
+CONFIG_MLX5_EN_ARFS=y
+CONFIG_MLX5_EN_RXNFC=y
+CONFIG_MLX5_MPFS=y
 CONFIG_MVNETA=y
 CONFIG_MVPP2=y
 CONFIG_SKY2=y
@@ -291,6 +308,7 @@ CONFIG_WLCORE_SDIO=m
 CONFIG_INPUT_EVDEV=y
 CONFIG_KEYBOARD_ADC=m
 CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_SNVS_PWRKEY=m
 CONFIG_KEYBOARD_CROS_EC=y
 CONFIG_INPUT_TOUCHSCREEN=y
 CONFIG_TOUCHSCREEN_ATMEL_MXT=m
@@ -344,6 +362,7 @@ CONFIG_I2C_BCM2835=m
 CONFIG_I2C_DESIGNWARE_PLATFORM=y
 CONFIG_I2C_GPIO=m
 CONFIG_I2C_IMX=y
+CONFIG_I2C_IMX_LPI2C=y
 CONFIG_I2C_MESON=y
 CONFIG_I2C_MV64XXX=y
 CONFIG_I2C_PXA=y
@@ -359,6 +378,7 @@ CONFIG_SPI_ARMADA_3700=y
 CONFIG_SPI_BCM2835=m
 CONFIG_SPI_BCM2835AUX=m
 CONFIG_SPI_NXP_FLEXSPI=y
+CONFIG_SPI_IMX=m
 CONFIG_SPI_MESON_SPICC=m
 CONFIG_SPI_MESON_SPIFC=m
 CONFIG_SPI_ORION=y
@@ -371,6 +391,7 @@ CONFIG_SPI_SUN6I=y
 CONFIG_SPMI=y
 CONFIG_PINCTRL_SINGLE=y
 CONFIG_PINCTRL_MAX77620=y
+CONFIG_PINCTRL_IMX8MM=y
 CONFIG_PINCTRL_IMX8MQ=y
 CONFIG_PINCTRL_IMX8QXP=y
 CONFIG_PINCTRL_IPQ8074=y
@@ -389,6 +410,7 @@ CONFIG_GPIO_RCAR=y
 CONFIG_GPIO_UNIPHIER=y
 CONFIG_GPIO_XGENE=y
 CONFIG_GPIO_XGENE_SB=y
+CONFIG_GPIO_MAX732X=y
 CONFIG_GPIO_PCA953X=y
 CONFIG_GPIO_PCA953X_IRQ=y
 CONFIG_GPIO_MAX77620=y
@@ -405,9 +427,11 @@ CONFIG_SENSORS_LM90=m
 CONFIG_SENSORS_PWM_FAN=m
 CONFIG_SENSORS_RASPBERRYPI_HWMON=m
 CONFIG_SENSORS_INA2XX=m
+CONFIG_SENSORS_INA3221=m
 CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y
 CONFIG_CPU_THERMAL=y
 CONFIG_THERMAL_EMULATION=y
+CONFIG_QORIQ_THERMAL=m
 CONFIG_ROCKCHIP_THERMAL=m
 CONFIG_RCAR_THERMAL=y
 CONFIG_RCAR_GEN3_THERMAL=y
@@ -421,7 +445,9 @@ CONFIG_UNIPHIER_THERMAL=y
 CONFIG_WATCHDOG=y
 CONFIG_ARM_SP805_WATCHDOG=y
 CONFIG_S3C2410_WATCHDOG=y
+CONFIG_SUNXI_WATCHDOG=m
 CONFIG_IMX2_WDT=y
+CONFIG_IMX_SC_WDT=m
 CONFIG_MESON_GXBB_WATCHDOG=m
 CONFIG_MESON_WATCHDOG=m
 CONFIG_RENESAS_WDT=y
@@ -440,8 +466,10 @@ CONFIG_MFD_MAX77620=y
 CONFIG_MFD_SPMI_PMIC=y
 CONFIG_MFD_RK808=y
 CONFIG_MFD_SEC_CORE=y
+CONFIG_MFD_ROHM_BD718XX=y
 CONFIG_REGULATOR_FIXED_VOLTAGE=y
 CONFIG_REGULATOR_AXP20X=y
+CONFIG_REGULATOR_BD718XX=y
 CONFIG_REGULATOR_BD9571MWV=y
 CONFIG_REGULATOR_FAN53555=y
 CONFIG_REGULATOR_GPIO=y
@@ -479,6 +507,7 @@ CONFIG_VIDEO_SAMSUNG_EXYNOS_GSC=m
 CONFIG_VIDEO_RENESAS_FCP=m
 CONFIG_VIDEO_RENESAS_VSP1=m
 CONFIG_DRM=m
+CONFIG_DRM_I2C_NXP_TDA998X=m
 CONFIG_DRM_NOUVEAU=m
 CONFIG_DRM_EXYNOS=m
 CONFIG_DRM_EXYNOS5433_DECON=y
@@ -506,6 +535,8 @@ CONFIG_DRM_HISI_HIBMC=m
 CONFIG_DRM_HISI_KIRIN=m
 CONFIG_DRM_MESON=m
 CONFIG_DRM_PL111=m
+CONFIG_DRM_LIMA=m
+CONFIG_DRM_PANFROST=m
 CONFIG_FB=y
 CONFIG_FB_MODE_HELPERS=y
 CONFIG_BACKLIGHT_GENERIC=m
@@ -561,6 +592,8 @@ CONFIG_USB_ULPI=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_RENESAS_USBHS_UDC=m
 CONFIG_USB_RENESAS_USB3=m
+CONFIG_TYPEC=m
+CONFIG_TYPEC_HD3SS3220=m
 CONFIG_MMC=y
 CONFIG_MMC_BLOCK_MINORS=32
 CONFIG_MMC_ARMMMCI=y
@@ -611,11 +644,13 @@ CONFIG_RTC_DRV_PL031=y
 CONFIG_RTC_DRV_SUN6I=y
 CONFIG_RTC_DRV_ARMADA38X=y
 CONFIG_RTC_DRV_TEGRA=y
+CONFIG_RTC_DRV_SNVS=m
 CONFIG_RTC_DRV_IMX_SC=m
 CONFIG_RTC_DRV_XGENE=y
 CONFIG_DMADEVICES=y
 CONFIG_FSL_EDMA=y
 CONFIG_DMA_BCM2835=m
+CONFIG_DMA_SUN6I=m
 CONFIG_K3_DMA=y
 CONFIG_MV_XOR=y
 CONFIG_MV_XOR_V2=y
@@ -641,6 +676,7 @@ CONFIG_COMMON_CLK_CS2000_CP=y
 CONFIG_COMMON_CLK_S2MPS11=y
 CONFIG_CLK_QORIQ=y
 CONFIG_COMMON_CLK_PWM=y
+CONFIG_CLK_IMX8MM=y
 CONFIG_CLK_IMX8MQ=y
 CONFIG_CLK_IMX8QXP=y
 CONFIG_TI_SCI_CLK=y
@@ -675,6 +711,7 @@ CONFIG_RPMSG_QCOM_GLINK_RPM=y
 CONFIG_RPMSG_QCOM_GLINK_SMEM=m
 CONFIG_RPMSG_QCOM_SMD=y
 CONFIG_RASPBERRYPI_POWER=y
+CONFIG_IMX_SCU_SOC=y
 CONFIG_QCOM_COMMAND_DB=y
 CONFIG_QCOM_GENI_SE=y
 CONFIG_QCOM_GLINK_SSR=m
@@ -698,6 +735,7 @@ CONFIG_ARCH_TEGRA_210_SOC=y
 CONFIG_ARCH_TEGRA_186_SOC=y
 CONFIG_ARCH_TEGRA_194_SOC=y
 CONFIG_ARCH_K3_AM6_SOC=y
+CONFIG_ARCH_K3_J721E_SOC=y
 CONFIG_SOC_TI=y
 CONFIG_TI_SCI_PM_DOMAINS=y
 CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
@@ -710,7 +748,9 @@ CONFIG_ROCKCHIP_SARADC=m
 CONFIG_IIO_CROS_EC_SENSORS_CORE=m
 CONFIG_IIO_CROS_EC_SENSORS=m
 CONFIG_IIO_CROS_EC_LIGHT_PROX=m
+CONFIG_SENSORS_ISL29018=m
 CONFIG_IIO_CROS_EC_BARO=m
+CONFIG_MPL3115=m
 CONFIG_PWM=y
 CONFIG_PWM_BCM2835=m
 CONFIG_PWM_CROS_EC=m
@@ -743,6 +783,9 @@ CONFIG_PHY_TEGRA_XUSB=y
 CONFIG_HISI_PMU=y
 CONFIG_QCOM_L2_PMU=y
 CONFIG_QCOM_L3_PMU=y
+CONFIG_NVMEM_SUNXI_SID=y
+CONFIG_NVMEM_IMX_OCOTP=y
+CONFIG_NVMEM_IMX_OCOTP_SCU=y
 CONFIG_QCOM_QFPROM=y
 CONFIG_ROCKCHIP_EFUSE=y
 CONFIG_UNIPHIER_EFUSE=y
index 288c14d30b45ce9a62ee27bd7b1fcd0e206970cc..60a4c6239712522bf5f13350e8a7facb41f5e319 100644 (file)
@@ -96,8 +96,8 @@ VDSO_LDFLAGS := $(VDSO_CPPFLAGS)
 VDSO_LDFLAGS += -Wl,-Bsymbolic -Wl,--no-undefined -Wl,-soname=linux-vdso.so.1
 VDSO_LDFLAGS += -Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096
 VDSO_LDFLAGS += -nostdlib -shared -mfloat-abi=soft
-VDSO_LDFLAGS += $(call cc32-ldoption,-Wl$(comma)--hash-style=sysv)
-VDSO_LDFLAGS += $(call cc32-ldoption,-Wl$(comma)--build-id)
+VDSO_LDFLAGS += -Wl,--hash-style=sysv
+VDSO_LDFLAGS += -Wl,--build-id
 VDSO_LDFLAGS += $(call cc32-ldoption,-fuse-ld=bfd)
 
 
index 3c9e1bd9a3e97e07d56d5428b2d282e0f6f0e8f8..d6544dc712587eef6e857a5405ac6b237d81ac8e 100644 (file)
@@ -11,6 +11,8 @@
 #include <asm/mem-layout.h>
 #include <asm/atomic.h>
 
+#include <asm-generic/pgalloc.h>       /* for pte_{alloc,free}_one */
+
 #define check_pgt_cache() do {} while (0)
 
 extern unsigned long long kmap_generation;
@@ -46,38 +48,6 @@ static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
        free_page((unsigned long) pgd);
 }
 
-static inline struct page *pte_alloc_one(struct mm_struct *mm)
-{
-       struct page *pte;
-
-       pte = alloc_page(GFP_KERNEL | __GFP_ZERO);
-       if (!pte)
-               return NULL;
-       if (!pgtable_page_ctor(pte)) {
-               __free_page(pte);
-               return NULL;
-       }
-       return pte;
-}
-
-/* _kernel variant gets to use a different allocator */
-static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
-{
-       gfp_t flags =  GFP_KERNEL | __GFP_ZERO;
-       return (pte_t *) __get_free_page(flags);
-}
-
-static inline void pte_free(struct mm_struct *mm, struct page *pte)
-{
-       pgtable_page_dtor(pte);
-       __free_page(pte);
-}
-
-static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
-{
-       free_page((unsigned long)pte);
-}
-
 static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
                                pgtable_t pte)
 {
index f8b3b07e42474ea02ff44a5471fa6073838a9a35..7a117be8297c89253fbe0ce07397a10a25181238 100644 (file)
@@ -34,8 +34,6 @@ else
        KBUILD_LDFLAGS += -melf32lriscv
 endif
 
-KBUILD_CFLAGS += -Wall
-
 # ISA string setting
 riscv-march-$(CONFIG_ARCH_RV32I)       := rv32ima
 riscv-march-$(CONFIG_ARCH_RV64I)       := rv64ima
index 5d8570ed6cabdfa18c4058355306bf292f871672..a4ad2733eedf652d7f215b3091341f1e1d938571 100644 (file)
@@ -189,6 +189,7 @@ config S390
        select VIRT_CPU_ACCOUNTING
        select ARCH_HAS_SCALED_CPUTIME
        select HAVE_NMI
+       select ARCH_HAS_FORCE_DMA_UNENCRYPTED
        select SWIOTLB
        select GENERIC_ALLOCATOR
 
index 9dde4d7d870455d5fc36bdb07257b05af1dd75dc..b5fd6e85657c2fb1fabf796f29deba382307400d 100644 (file)
@@ -1224,28 +1224,11 @@ no_timer:
 
 void kvm_s390_vcpu_wakeup(struct kvm_vcpu *vcpu)
 {
-       /*
-        * We cannot move this into the if, as the CPU might be already
-        * in kvm_vcpu_block without having the waitqueue set (polling)
-        */
        vcpu->valid_wakeup = true;
+       kvm_vcpu_wake_up(vcpu);
+
        /*
-        * This is mostly to document, that the read in swait_active could
-        * be moved before other stores, leading to subtle races.
-        * All current users do not store or use an atomic like update
-        */
-       smp_mb__after_atomic();
-       if (swait_active(&vcpu->wq)) {
-               /*
-                * The vcpu gave up the cpu voluntarily, mark it as a good
-                * yield-candidate.
-                */
-               vcpu->preempted = true;
-               swake_up_one(&vcpu->wq);
-               vcpu->stat.halt_wakeup++;
-       }
-       /*
-        * The VCPU might not be sleeping but is executing the VSIE. Let's
+        * The VCPU might not be sleeping but rather executing VSIE. Let's
         * kick it, so it leaves the SIE to process the request.
         */
        kvm_s390_vsie_kick(vcpu);
index 4e5bbe328594dcfaa5beecffea1a308fd48d1baa..20340a03ad90c5d7c21d4dbb1588db30abc1c129 100644 (file)
@@ -30,7 +30,7 @@
 #include <linux/export.h>
 #include <linux/cma.h>
 #include <linux/gfp.h>
-#include <linux/dma-mapping.h>
+#include <linux/dma-direct.h>
 #include <asm/processor.h>
 #include <linux/uaccess.h>
 #include <asm/pgtable.h>
@@ -161,6 +161,11 @@ bool sev_active(void)
        return is_prot_virt_guest();
 }
 
+bool force_dma_unencrypted(struct device *dev)
+{
+       return sev_active();
+}
+
 /* protected virtualization */
 static void pv_init(void)
 {
index 5a9e4e1f9f81090e1cd78acdf9bb40ec981e513c..324a23947585e42f785c871939a09876c1c8db3d 100644 (file)
@@ -115,8 +115,7 @@ quiet_cmd_vdso = VDSO    $@
                       -T $(filter %.lds,$^) $(filter %.o,$^) && \
                sh $(srctree)/$(src)/checkundef.sh '$(OBJDUMP)' '$@'
 
-VDSO_LDFLAGS = -shared $(call ld-option, --hash-style=both) \
-       $(call ld-option, --build-id) -Bsymbolic
+VDSO_LDFLAGS = -shared --hash-style=both --build-id -Bsymbolic
 GCOV_PROFILE := n
 
 #
index 78772870facdc86486048801602cb17283726479..222855cc0158422f1d6dddc2d9307cb606433a37 100644 (file)
@@ -1526,6 +1526,7 @@ config AMD_MEM_ENCRYPT
        depends on X86_64 && CPU_SUP_AMD
        select DYNAMIC_PHYSICAL_MASK
        select ARCH_USE_MEMREMAP_PROT
+       select ARCH_HAS_FORCE_DMA_UNENCRYPTED
        ---help---
          Say yes to enable support for the encryption of system memory.
          This requires an AMD processor that supports Secure Memory
index 220d1279d0e244af5df22a0690383951cab4f90a..d6662fdef3001da7465dda8df8aed58a48fe6f58 100644 (file)
@@ -384,14 +384,11 @@ struct boot_params *make_boot_params(struct efi_config *c)
        struct apm_bios_info *bi;
        struct setup_header *hdr;
        efi_loaded_image_t *image;
-       void *options, *handle;
+       void *handle;
        efi_guid_t proto = LOADED_IMAGE_PROTOCOL_GUID;
        int options_size = 0;
        efi_status_t status;
        char *cmdline_ptr;
-       u16 *s2;
-       u8 *s1;
-       int i;
        unsigned long ramdisk_addr;
        unsigned long ramdisk_size;
 
@@ -494,8 +491,6 @@ static void add_e820ext(struct boot_params *params,
                        struct setup_data *e820ext, u32 nr_entries)
 {
        struct setup_data *data;
-       efi_status_t status;
-       unsigned long size;
 
        e820ext->type = SETUP_E820_EXT;
        e820ext->len  = nr_entries * sizeof(struct boot_e820_entry);
@@ -677,8 +672,6 @@ static efi_status_t exit_boot_func(efi_system_table_t *sys_table_arg,
                                   void *priv)
 {
        const char *signature;
-       __u32 nr_desc;
-       efi_status_t status;
        struct exit_boot_struct *p = priv;
 
        signature = efi_is_64bit() ? EFI64_LOADER_SIGNATURE
@@ -747,7 +740,6 @@ struct boot_params *
 efi_main(struct efi_config *c, struct boot_params *boot_params)
 {
        struct desc_ptr *gdt = NULL;
-       efi_loaded_image_t *image;
        struct setup_header *hdr = &boot_params->hdr;
        efi_status_t status;
        struct desc_struct *desc;
index 24e65a0f756d631f1b84f4b1e4c779ae9fca264c..53ac0cb2396da1b336bdb6b4375fe8bd977bbb32 100644 (file)
@@ -17,6 +17,7 @@
 #include "pgtable.h"
 #include "../string.h"
 #include "../voffset.h"
+#include <asm/bootparam_utils.h>
 
 /*
  * WARNING!!
index d2f184165934c95a403faf489ec3b652850e74ff..c8181392f70d7d19b8f806c667ea8770a1090664 100644 (file)
@@ -23,7 +23,6 @@
 #include <asm/page.h>
 #include <asm/boot.h>
 #include <asm/bootparam.h>
-#include <asm/bootparam_utils.h>
 
 #define BOOT_CTYPE_H
 #include <linux/acpi.h>
index f8debf7aeb4c144b286c8a12570cad23d46decc8..5f2d03067ae57cdb95555fe423bdafc52bbec200 100644 (file)
@@ -40,7 +40,6 @@ int cmdline_find_option_bool(const char *option);
 static unsigned long find_trampoline_placement(void)
 {
        unsigned long bios_start = 0, ebda_start = 0;
-       unsigned long trampoline_start;
        struct boot_e820_entry *entry;
        char *signature;
        int i;
index 9f1f9e3b82307160b39cc143f286ba14d2849bc0..830bd984182b6bc05c09b868a9100d0917691381 100644 (file)
@@ -343,3 +343,9 @@ For 32-bit we have the following conventions - kernel is built with
 .Lafter_call_\@:
 #endif
 .endm
+
+#ifdef CONFIG_PARAVIRT_XXL
+#define GET_CR2_INTO(reg) GET_CR2_INTO_AX ; _ASM_MOV %_ASM_AX, reg
+#else
+#define GET_CR2_INTO(reg) _ASM_MOV %cr2, reg
+#endif
index 90b4732972991f21da264bc9c1a9344514c6cea1..2bb986f305ace7fdf4de68ee2c32d776c30221e8 100644 (file)
 .Lfinished_frame_\@:
 .endm
 
-.macro SAVE_ALL pt_regs_ax=%eax switch_stacks=0
+.macro SAVE_ALL pt_regs_ax=%eax switch_stacks=0 skip_gs=0
        cld
+.if \skip_gs == 0
        PUSH_GS
+.endif
        FIXUP_FRAME
        pushl   %fs
        pushl   %es
        movl    %edx, %es
        movl    $(__KERNEL_PERCPU), %edx
        movl    %edx, %fs
+.if \skip_gs == 0
        SET_KERNEL_GS %edx
-
+.endif
        /* Switch to kernel stack if necessary */
 .if \switch_stacks > 0
        SWITCH_TO_KERNEL_STACK
 .endif
-
 .endm
 
 .macro SAVE_ALL_NMI cr3_reg:req
@@ -1441,39 +1443,46 @@ BUILD_INTERRUPT3(hv_stimer0_callback_vector, HYPERV_STIMER0_VECTOR,
 
 ENTRY(page_fault)
        ASM_CLAC
-       pushl   $do_page_fault
-       ALIGN
-       jmp common_exception
+       pushl   $0; /* %gs's slot on the stack */
+
+       SAVE_ALL switch_stacks=1 skip_gs=1
+
+       ENCODE_FRAME_POINTER
+       UNWIND_ESPFIX_STACK
+
+       /* fixup %gs */
+       GS_TO_REG %ecx
+       REG_TO_PTGS %ecx
+       SET_KERNEL_GS %ecx
+
+       GET_CR2_INTO(%ecx)                      # might clobber %eax
+
+       /* fixup orig %eax */
+       movl    PT_ORIG_EAX(%esp), %edx         # get the error code
+       movl    $-1, PT_ORIG_EAX(%esp)          # no syscall to restart
+
+       TRACE_IRQS_OFF
+       movl    %esp, %eax                      # pt_regs pointer
+       call    do_page_fault
+       jmp     ret_from_exception
 END(page_fault)
 
 common_exception:
        /* the function address is in %gs's slot on the stack */
-       FIXUP_FRAME
-       pushl   %fs
-       pushl   %es
-       pushl   %ds
-       pushl   %eax
-       movl    $(__USER_DS), %eax
-       movl    %eax, %ds
-       movl    %eax, %es
-       movl    $(__KERNEL_PERCPU), %eax
-       movl    %eax, %fs
-       pushl   %ebp
-       pushl   %edi
-       pushl   %esi
-       pushl   %edx
-       pushl   %ecx
-       pushl   %ebx
-       SWITCH_TO_KERNEL_STACK
+       SAVE_ALL switch_stacks=1 skip_gs=1
        ENCODE_FRAME_POINTER
-       cld
        UNWIND_ESPFIX_STACK
+
+       /* fixup %gs */
        GS_TO_REG %ecx
        movl    PT_GS(%esp), %edi               # get the function address
-       movl    PT_ORIG_EAX(%esp), %edx         # get the error code
-       movl    $-1, PT_ORIG_EAX(%esp)          # no syscall to restart
        REG_TO_PTGS %ecx
        SET_KERNEL_GS %ecx
+
+       /* fixup orig %eax */
+       movl    PT_ORIG_EAX(%esp), %edx         # get the error code
+       movl    $-1, PT_ORIG_EAX(%esp)          # no syscall to restart
+
        TRACE_IRQS_OFF
        movl    %esp, %eax                      # pt_regs pointer
        CALL_NOSPEC %edi
index 35a66fcfcb91bed1a5a4315cb6204bae76c6aa98..3f5a978a02a7d0906237e517580b6d5440a7fcba 100644 (file)
@@ -864,18 +864,84 @@ apicinterrupt IRQ_WORK_VECTOR                     irq_work_interrupt              smp_irq_work_interrupt
  */
 #define CPU_TSS_IST(x) PER_CPU_VAR(cpu_tss_rw) + (TSS_ist + (x) * 8)
 
+.macro idtentry_part do_sym, has_error_code:req, read_cr2:req, paranoid:req, shift_ist=-1, ist_offset=0
+
+       .if \paranoid
+       call    paranoid_entry
+       /* returned flag: ebx=0: need swapgs on exit, ebx=1: don't need it */
+       .else
+       call    error_entry
+       .endif
+       UNWIND_HINT_REGS
+
+       .if \read_cr2
+       /*
+        * Store CR2 early so subsequent faults cannot clobber it. Use R12 as
+        * intermediate storage as RDX can be clobbered in enter_from_user_mode().
+        * GET_CR2_INTO can clobber RAX.
+        */
+       GET_CR2_INTO(%r12);
+       .endif
+
+       .if \shift_ist != -1
+       TRACE_IRQS_OFF_DEBUG                    /* reload IDT in case of recursion */
+       .else
+       TRACE_IRQS_OFF
+       .endif
+
+       .if \paranoid == 0
+       testb   $3, CS(%rsp)
+       jz      .Lfrom_kernel_no_context_tracking_\@
+       CALL_enter_from_user_mode
+.Lfrom_kernel_no_context_tracking_\@:
+       .endif
+
+       movq    %rsp, %rdi                      /* pt_regs pointer */
+
+       .if \has_error_code
+       movq    ORIG_RAX(%rsp), %rsi            /* get error code */
+       movq    $-1, ORIG_RAX(%rsp)             /* no syscall to restart */
+       .else
+       xorl    %esi, %esi                      /* no error code */
+       .endif
+
+       .if \shift_ist != -1
+       subq    $\ist_offset, CPU_TSS_IST(\shift_ist)
+       .endif
+
+       .if \read_cr2
+       movq    %r12, %rdx                      /* Move CR2 into 3rd argument */
+       .endif
+
+       call    \do_sym
+
+       .if \shift_ist != -1
+       addq    $\ist_offset, CPU_TSS_IST(\shift_ist)
+       .endif
+
+       .if \paranoid
+       /* this procedure expect "no swapgs" flag in ebx */
+       jmp     paranoid_exit
+       .else
+       jmp     error_exit
+       .endif
+
+.endm
+
 /**
  * idtentry - Generate an IDT entry stub
  * @sym:               Name of the generated entry point
- * @do_sym:            C function to be called
- * @has_error_code:    True if this IDT vector has an error code on the stack
- * @paranoid:          non-zero means that this vector may be invoked from
+ * @do_sym:            C function to be called
+ * @has_error_code:    True if this IDT vector has an error code on the stack
+ * @paranoid:          non-zero means that this vector may be invoked from
  *                     kernel mode with user GSBASE and/or user CR3.
  *                     2 is special -- see below.
  * @shift_ist:         Set to an IST index if entries from kernel mode should
- *                             decrement the IST stack so that nested entries get a
+ *                     decrement the IST stack so that nested entries get a
  *                     fresh stack.  (This is for #DB, which has a nasty habit
- *                             of recursing.)
+ *                     of recursing.)
+ * @create_gap:                create a 6-word stack gap when coming from kernel mode.
+ * @read_cr2:          load CR2 into the 3rd argument; done before calling any C code
  *
  * idtentry generates an IDT stub that sets up a usable kernel context,
  * creates struct pt_regs, and calls @do_sym.  The stub has the following
@@ -900,15 +966,19 @@ apicinterrupt IRQ_WORK_VECTOR                     irq_work_interrupt              smp_irq_work_interrupt
  * @paranoid == 2 is special: the stub will never switch stacks.  This is for
  * #DF: if the thread stack is somehow unusable, we'll still get a useful OOPS.
  */
-.macro idtentry sym do_sym has_error_code:req paranoid=0 shift_ist=-1 ist_offset=0 create_gap=0
+.macro idtentry sym do_sym has_error_code:req paranoid=0 shift_ist=-1 ist_offset=0 create_gap=0 read_cr2=0
 ENTRY(\sym)
        UNWIND_HINT_IRET_REGS offset=\has_error_code*8
 
        /* Sanity check */
-       .if \shift_ist != -1 && \paranoid == 0
+       .if \shift_ist != -1 && \paranoid != 1
        .error "using shift_ist requires paranoid=1"
        .endif
 
+       .if \create_gap && \paranoid
+       .error "using create_gap requires paranoid=0"
+       .endif
+
        ASM_CLAC
 
        .if \has_error_code == 0
@@ -934,47 +1004,7 @@ ENTRY(\sym)
 .Lfrom_usermode_no_gap_\@:
        .endif
 
-       .if \paranoid
-       call    paranoid_entry
-       .else
-       call    error_entry
-       .endif
-       UNWIND_HINT_REGS
-       /* returned flag: ebx=0: need swapgs on exit, ebx=1: don't need it */
-
-       .if \paranoid
-       .if \shift_ist != -1
-       TRACE_IRQS_OFF_DEBUG                    /* reload IDT in case of recursion */
-       .else
-       TRACE_IRQS_OFF
-       .endif
-       .endif
-
-       movq    %rsp, %rdi                      /* pt_regs pointer */
-
-       .if \has_error_code
-       movq    ORIG_RAX(%rsp), %rsi            /* get error code */
-       movq    $-1, ORIG_RAX(%rsp)             /* no syscall to restart */
-       .else
-       xorl    %esi, %esi                      /* no error code */
-       .endif
-
-       .if \shift_ist != -1
-       subq    $\ist_offset, CPU_TSS_IST(\shift_ist)
-       .endif
-
-       call    \do_sym
-
-       .if \shift_ist != -1
-       addq    $\ist_offset, CPU_TSS_IST(\shift_ist)
-       .endif
-
-       /* these procedures expect "no swapgs" flag in ebx */
-       .if \paranoid
-       jmp     paranoid_exit
-       .else
-       jmp     error_exit
-       .endif
+       idtentry_part \do_sym, \has_error_code, \read_cr2, \paranoid, \shift_ist, \ist_offset
 
        .if \paranoid == 1
        /*
@@ -983,21 +1013,9 @@ ENTRY(\sym)
         * run in real process context if user_mode(regs).
         */
 .Lfrom_usermode_switch_stack_\@:
-       call    error_entry
-
-       movq    %rsp, %rdi                      /* pt_regs pointer */
-
-       .if \has_error_code
-       movq    ORIG_RAX(%rsp), %rsi            /* get error code */
-       movq    $-1, ORIG_RAX(%rsp)             /* no syscall to restart */
-       .else
-       xorl    %esi, %esi                      /* no error code */
+       idtentry_part \do_sym, \has_error_code, \read_cr2, paranoid=0
        .endif
 
-       call    \do_sym
-
-       jmp     error_exit
-       .endif
 _ASM_NOKPROBE(\sym)
 END(\sym)
 .endm
@@ -1007,7 +1025,7 @@ idtentry overflow                 do_overflow                     has_error_code=0
 idtentry bounds                                do_bounds                       has_error_code=0
 idtentry invalid_op                    do_invalid_op                   has_error_code=0
 idtentry device_not_available          do_device_not_available         has_error_code=0
-idtentry double_fault                  do_double_fault                 has_error_code=1 paranoid=2
+idtentry double_fault                  do_double_fault                 has_error_code=1 paranoid=2 read_cr2=1
 idtentry coprocessor_segment_overrun   do_coprocessor_segment_overrun  has_error_code=0
 idtentry invalid_TSS                   do_invalid_TSS                  has_error_code=1
 idtentry segment_not_present           do_segment_not_present          has_error_code=1
@@ -1179,10 +1197,10 @@ idtentry xendebug               do_debug                has_error_code=0
 #endif
 
 idtentry general_protection    do_general_protection   has_error_code=1
-idtentry page_fault            do_page_fault           has_error_code=1
+idtentry page_fault            do_page_fault           has_error_code=1        read_cr2=1
 
 #ifdef CONFIG_KVM_GUEST
-idtentry async_page_fault      do_async_page_fault     has_error_code=1
+idtentry async_page_fault      do_async_page_fault     has_error_code=1        read_cr2=1
 #endif
 
 #ifdef CONFIG_X86_MCE
@@ -1281,18 +1299,9 @@ ENTRY(error_entry)
        movq    %rax, %rsp                      /* switch stack */
        ENCODE_FRAME_POINTER
        pushq   %r12
-
-       /*
-        * We need to tell lockdep that IRQs are off.  We can't do this until
-        * we fix gsbase, and we should do it before enter_from_user_mode
-        * (which can take locks).
-        */
-       TRACE_IRQS_OFF
-       CALL_enter_from_user_mode
        ret
 
 .Lerror_entry_done:
-       TRACE_IRQS_OFF
        ret
 
        /*
index cfdca8b42c707de3c07e3363250ef9ba260574f2..cc20465b28672d3f8beb10a62cf9fc6fb86c196a 100644 (file)
@@ -12,9 +12,7 @@
 
        /* rdi: arg1 ... normal C conventions. rax is saved/restored. */
        .macro THUNK name, func, put_ret_addr_in_rdi=0
-       .globl \name
-       .type \name, @function
-\name:
+       ENTRY(\name)
        pushq %rbp
        movq %rsp, %rbp
 
@@ -35,6 +33,7 @@
 
        call \func
        jmp  .L_restore
+       ENDPROC(\name)
        _ASM_NOKPROBE(\name)
        .endm
 
index 34773395139a8452889fd806eb1576617e6aaff3..8df549138193801b996b950cbd0f97746fd7abbd 100644 (file)
@@ -176,9 +176,8 @@ quiet_cmd_vdso = VDSO    $@
                       -T $(filter %.lds,$^) $(filter %.o,$^) && \
                 sh $(srctree)/$(src)/checkundef.sh '$(NM)' '$@'
 
-VDSO_LDFLAGS = -shared $(call ld-option, --hash-style=both) \
-       $(call ld-option, --build-id) $(call ld-option, --eh-frame-hdr) \
-       -Bsymbolic
+VDSO_LDFLAGS = -shared --hash-style=both --build-id \
+       $(call ld-option, --eh-frame-hdr) -Bsymbolic
 GCOV_PROFILE := n
 
 quiet_cmd_vdso_and_check = VDSO    $@
index 0e033ef11a9f73c6ae0ecf2c4a077bbb5e4fcc44..0d258688c8cf2ad7c12f1db3b63fc158b55e5f14 100644 (file)
@@ -60,8 +60,17 @@ static int hv_cpu_init(unsigned int cpu)
        if (!hv_vp_assist_page)
                return 0;
 
-       if (!*hvp)
-               *hvp = __vmalloc(PAGE_SIZE, GFP_KERNEL, PAGE_KERNEL);
+       /*
+        * The VP ASSIST PAGE is an "overlay" page (see Hyper-V TLFS's Section
+        * 5.2.1 "GPA Overlay Pages"). Here it must be zeroed out to make sure
+        * we always write the EOI MSR in hv_apic_eoi_write() *after* the
+        * EOI optimization is disabled in hv_cpu_die(), otherwise a CPU may
+        * not be stopped in the case of CPU offlining and the VM will hang.
+        */
+       if (!*hvp) {
+               *hvp = __vmalloc(PAGE_SIZE, GFP_KERNEL | __GFP_ZERO,
+                                PAGE_KERNEL);
+       }
 
        if (*hvp) {
                u64 val;
index 050e5f9ebf81c198f3d9b0aabae23d65be471e76..e647aa095867f292bdeb53a446ece659aa717157 100644 (file)
@@ -49,7 +49,7 @@ static inline void generic_apic_probe(void)
 
 #ifdef CONFIG_X86_LOCAL_APIC
 
-extern unsigned int apic_verbosity;
+extern int apic_verbosity;
 extern int local_apic_timer_c2_ok;
 
 extern int disable_apic;
index 0cc5b611a113fe9f1942a36a5c96a192155471b3..8282b8d41209898937c6effa51ce7fcfa13365d5 100644 (file)
@@ -1496,25 +1496,29 @@ enum {
 #define kvm_arch_vcpu_memslots_id(vcpu) ((vcpu)->arch.hflags & HF_SMM_MASK ? 1 : 0)
 #define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, (role).smm)
 
+asmlinkage void __noreturn kvm_spurious_fault(void);
+
 /*
  * Hardware virtualization extension instructions may fault if a
  * reboot turns off virtualization while processes are running.
- * Trap the fault and ignore the instruction if that happens.
+ * Usually after catching the fault we just panic; during reboot
+ * instead the instruction is ignored.
  */
-asmlinkage void kvm_spurious_fault(void);
-
-#define ____kvm_handle_fault_on_reboot(insn, cleanup_insn)     \
-       "666: " insn "\n\t" \
-       "668: \n\t"                           \
-       ".pushsection .fixup, \"ax\" \n" \
-       "667: \n\t" \
-       cleanup_insn "\n\t"                   \
-       "cmpb $0, kvm_rebooting \n\t"         \
-       "jne 668b \n\t"                       \
-       __ASM_SIZE(push) " $666b \n\t"        \
-       "jmp kvm_spurious_fault \n\t"         \
-       ".popsection \n\t" \
-       _ASM_EXTABLE(666b, 667b)
+#define ____kvm_handle_fault_on_reboot(insn, cleanup_insn)             \
+       "666: \n\t"                                                     \
+       insn "\n\t"                                                     \
+       "jmp    668f \n\t"                                              \
+       "667: \n\t"                                                     \
+       "call   kvm_spurious_fault \n\t"                                \
+       "668: \n\t"                                                     \
+       ".pushsection .fixup, \"ax\" \n\t"                              \
+       "700: \n\t"                                                     \
+       cleanup_insn "\n\t"                                             \
+       "cmpb   $0, kvm_rebooting\n\t"                                  \
+       "je     667b \n\t"                                              \
+       "jmp    668b \n\t"                                              \
+       ".popsection \n\t"                                              \
+       _ASM_EXTABLE(666b, 700b)
 
 #define __kvm_handle_fault_on_reboot(insn)             \
        ____kvm_handle_fault_on_reboot(insn, "")
index 5ed3cf1c393427c43584851eccc6ff25fb5f9f5e..9b4df6eaa11a6c9f9e6f74b45b8006f1ad71cce3 100644 (file)
@@ -92,7 +92,7 @@ void kvm_async_pf_task_wait(u32 token, int interrupt_kernel);
 void kvm_async_pf_task_wake(u32 token);
 u32 kvm_read_and_reset_pf_reason(void);
 extern void kvm_disable_steal_time(void);
-void do_async_page_fault(struct pt_regs *regs, unsigned long error_code);
+void do_async_page_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address);
 
 #ifdef CONFIG_PARAVIRT_SPINLOCKS
 void __init kvm_spinlock_init(void);
index c25c38a05c1c944f7e7c7c51509bee0499705573..dce26f1d13e1a5e5a63d5feb2e2f30edecef97e3 100644 (file)
@@ -116,7 +116,7 @@ static inline void write_cr0(unsigned long x)
 
 static inline unsigned long read_cr2(void)
 {
-       return PVOP_CALL0(unsigned long, mmu.read_cr2);
+       return PVOP_CALLEE0(unsigned long, mmu.read_cr2);
 }
 
 static inline void write_cr2(unsigned long x)
@@ -746,6 +746,7 @@ bool __raw_callee_save___native_vcpu_is_preempted(long cpu);
            PV_RESTORE_ALL_CALLER_REGS                                  \
            FRAME_END                                                   \
            "ret;"                                                      \
+           ".size " PV_THUNK_NAME(func) ", .-" PV_THUNK_NAME(func) ";" \
            ".popsection")
 
 /* Get a reference to a callee-save function */
@@ -909,13 +910,7 @@ extern void default_banner(void);
                  ANNOTATE_RETPOLINE_SAFE;                              \
                  call PARA_INDIRECT(pv_ops+PV_CPU_swapgs);             \
                 )
-#endif
-
-#define GET_CR2_INTO_RAX                               \
-       ANNOTATE_RETPOLINE_SAFE;                                \
-       call PARA_INDIRECT(pv_ops+PV_MMU_read_cr2);
 
-#ifdef CONFIG_PARAVIRT_XXL
 #define USERGS_SYSRET64                                                        \
        PARA_SITE(PARA_PATCH(PV_CPU_usergs_sysret64),                   \
                  ANNOTATE_RETPOLINE_SAFE;                              \
@@ -929,9 +924,19 @@ extern void default_banner(void);
                  call PARA_INDIRECT(pv_ops+PV_IRQ_save_fl);        \
                  PV_RESTORE_REGS(clobbers | CLBR_CALLEE_SAVE);)
 #endif
-#endif
+#endif /* CONFIG_PARAVIRT_XXL */
+#endif /* CONFIG_X86_64 */
+
+#ifdef CONFIG_PARAVIRT_XXL
+
+#define GET_CR2_INTO_AX                                                        \
+       PARA_SITE(PARA_PATCH(PV_MMU_read_cr2),                          \
+                 ANNOTATE_RETPOLINE_SAFE;                              \
+                 call PARA_INDIRECT(pv_ops+PV_MMU_read_cr2);           \
+                )
+
+#endif /* CONFIG_PARAVIRT_XXL */
 
-#endif /* CONFIG_X86_32 */
 
 #endif /* __ASSEMBLY__ */
 #else  /* CONFIG_PARAVIRT */
index 946f8f1f1efc54edf59112e7231a8ba498ab69a5..639b2df445ee6caff6b980cac0e106306e3f0329 100644 (file)
@@ -220,7 +220,7 @@ struct pv_mmu_ops {
        void (*exit_mmap)(struct mm_struct *mm);
 
 #ifdef CONFIG_PARAVIRT_XXL
-       unsigned long (*read_cr2)(void);
+       struct paravirt_callee_save read_cr2;
        void (*write_cr2)(unsigned long);
 
        unsigned long (*read_cr3)(void);
index f2bd284abc16d848165b10221a7e28b1038d693c..b25e633033c3a853ae383ce7063a3133f3dac657 100644 (file)
@@ -74,14 +74,14 @@ dotraplinkage void do_invalid_TSS(struct pt_regs *regs, long error_code);
 dotraplinkage void do_segment_not_present(struct pt_regs *regs, long error_code);
 dotraplinkage void do_stack_segment(struct pt_regs *regs, long error_code);
 #ifdef CONFIG_X86_64
-dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code);
+dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code, unsigned long address);
 asmlinkage __visible notrace struct pt_regs *sync_regs(struct pt_regs *eregs);
 asmlinkage __visible notrace
 struct bad_iret_stack *fixup_bad_iret(struct bad_iret_stack *s);
 void __init trap_init(void);
 #endif
 dotraplinkage void do_general_protection(struct pt_regs *regs, long error_code);
-dotraplinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code);
+dotraplinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address);
 dotraplinkage void do_spurious_interrupt_bug(struct pt_regs *regs, long error_code);
 dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code);
 dotraplinkage void do_alignment_check(struct pt_regs *regs, long error_code);
index e901b0ab116ff81dc8a77237f68afb9fe5948d35..503d3f42da1676791d2c4f4a70bfad35743daf4c 100644 (file)
@@ -435,9 +435,12 @@ struct kvm_nested_state {
 
 /* for KVM_CAP_PMU_EVENT_FILTER */
 struct kvm_pmu_event_filter {
-       __u32 action;
-       __u32 nevents;
-       __u64 events[0];
+       __u32 action;
+       __u32 nevents;
+       __u32 fixed_counter_bitmap;
+       __u32 flags;
+       __u32 pad[4];
+       __u64 events[0];
 };
 
 #define KVM_PMU_EVENT_ALLOW 0
index 1bd91cb7b320a2363097374cd9264005e39b04a7..f5291362da1ad72877aa8d9f7bcf621a83e5c1f4 100644 (file)
@@ -183,7 +183,7 @@ EXPORT_SYMBOL_GPL(local_apic_timer_c2_ok);
 /*
  * Debug level, exported for io_apic.c
  */
-unsigned int apic_verbosity;
+int apic_verbosity;
 
 int pic_mode;
 
index da64452584b0a1f68c290ad4eaa7266c61347510..5c7ee3df4d0b04518386595bb78e8d7445aa0858 100644 (file)
@@ -76,6 +76,7 @@ static void __used common(void)
        BLANK();
        OFFSET(XEN_vcpu_info_mask, vcpu_info, evtchn_upcall_mask);
        OFFSET(XEN_vcpu_info_pending, vcpu_info, evtchn_upcall_pending);
+       OFFSET(XEN_vcpu_info_arch_cr2, vcpu_info, arch.cr2);
 #endif
 
        BLANK();
index e69408bf664b68153609daccd1516c1276d52e68..7da2bcd2b8eb019ebffbf3325fc45cf896981c82 100644 (file)
@@ -86,9 +86,9 @@ static bool _e820__mapped_any(struct e820_table *table,
                        continue;
                if (entry->addr >= end || entry->addr + entry->size <= start)
                        continue;
-               return 1;
+               return true;
        }
-       return 0;
+       return false;
 }
 
 bool e820__mapped_raw_any(u64 start, u64 end, enum e820_type type)
index bcd206c8ac90064e9e702bc4bc1f2aa967a38065..a6342c899be596cccd6eff9663369e98c7eaafd0 100644 (file)
@@ -29,9 +29,7 @@
 #ifdef CONFIG_PARAVIRT_XXL
 #include <asm/asm-offsets.h>
 #include <asm/paravirt.h>
-#define GET_CR2_INTO(reg) GET_CR2_INTO_RAX ; movq %rax, reg
 #else
-#define GET_CR2_INTO(reg) movq %cr2, reg
 #define INTERRUPT_RETURN iretq
 #endif
 
@@ -253,10 +251,10 @@ END(secondary_startup_64)
  * start_secondary() via .Ljump_to_C_code.
  */
 ENTRY(start_cpu0)
-       movq    initial_stack(%rip), %rsp
        UNWIND_HINT_EMPTY
+       movq    initial_stack(%rip), %rsp
        jmp     .Ljump_to_C_code
-ENDPROC(start_cpu0)
+END(start_cpu0)
 #endif
 
        /* Both SMP bootup and ACPI suspend change these variables */
@@ -323,7 +321,7 @@ early_idt_handler_common:
 
        cmpq $14,%rsi           /* Page fault? */
        jnz 10f
-       GET_CR2_INTO(%rdi)      /* Can clobber any volatile register if pv */
+       GET_CR2_INTO(%rdi)      /* can clobber %rax if pv */
        call early_make_pgtable
        andl %eax,%eax
        jz 20f                  /* All good */
index 82caf01b63dd964148bbef9c8a5e2d920b802d4c..b7f34fe2171e472f7f64bf7f93c9bdfcaefba710 100644 (file)
@@ -242,23 +242,23 @@ EXPORT_SYMBOL_GPL(kvm_read_and_reset_pf_reason);
 NOKPROBE_SYMBOL(kvm_read_and_reset_pf_reason);
 
 dotraplinkage void
-do_async_page_fault(struct pt_regs *regs, unsigned long error_code)
+do_async_page_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address)
 {
        enum ctx_state prev_state;
 
        switch (kvm_read_and_reset_pf_reason()) {
        default:
-               do_page_fault(regs, error_code);
+               do_page_fault(regs, error_code, address);
                break;
        case KVM_PV_REASON_PAGE_NOT_PRESENT:
                /* page is swapped out by the host. */
                prev_state = exception_enter();
-               kvm_async_pf_task_wait((u32)read_cr2(), !user_mode(regs));
+               kvm_async_pf_task_wait((u32)address, !user_mode(regs));
                exception_exit(prev_state);
                break;
        case KVM_PV_REASON_PAGE_READY:
                rcu_irq_enter();
-               kvm_async_pf_task_wake((u32)read_cr2());
+               kvm_async_pf_task_wake((u32)address);
                rcu_irq_exit();
                break;
        }
@@ -838,6 +838,7 @@ asm(
 "cmpb  $0, " __stringify(KVM_STEAL_TIME_preempted) "+steal_time(%rax);"
 "setne %al;"
 "ret;"
+".size __raw_callee_save___kvm_vcpu_is_preempted, .-__raw_callee_save___kvm_vcpu_is_preempted;"
 ".popsection");
 
 #endif
index 1bfe5c6e6cfe1a1e414b20dc4c92bce29ef9fbf7..afac7ccce72f43da8b3048f0fcb8d357676e9575 100644 (file)
@@ -546,17 +546,15 @@ void __init default_get_smp_config(unsigned int early)
                         * local APIC has default address
                         */
                        mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
-                       return;
+                       goto out;
                }
 
                pr_info("Default MP configuration #%d\n", mpf->feature1);
                construct_default_ISA_mptable(mpf->feature1);
 
        } else if (mpf->physptr) {
-               if (check_physptr(mpf, early)) {
-                       early_memunmap(mpf, sizeof(*mpf));
-                       return;
-               }
+               if (check_physptr(mpf, early))
+                       goto out;
        } else
                BUG();
 
@@ -565,7 +563,7 @@ void __init default_get_smp_config(unsigned int early)
        /*
         * Only use the first configuration found.
         */
-
+out:
        early_memunmap(mpf, sizeof(*mpf));
 }
 
index 98039d7fb998c96152854d5488de834dc3537b3b..0aa6256eedd83e15b57090e33d6b501481757efd 100644 (file)
@@ -370,7 +370,7 @@ struct paravirt_patch_template pv_ops = {
        .mmu.exit_mmap          = paravirt_nop,
 
 #ifdef CONFIG_PARAVIRT_XXL
-       .mmu.read_cr2           = native_read_cr2,
+       .mmu.read_cr2           = __PV_IS_CALLEE_SAVE(native_read_cr2),
        .mmu.write_cr2          = native_write_cr2,
        .mmu.read_cr3           = __native_read_cr3,
        .mmu.write_cr3          = native_write_cr3,
index 250e4c4ac6d93ae7c1d6b5e07ffacf8363306883..af64519b2695712567ad16ab4d075bddc008fb7f 100644 (file)
@@ -143,17 +143,7 @@ void __show_regs(struct pt_regs *regs, enum show_regs_mode mode)
 
 void release_thread(struct task_struct *dead_task)
 {
-       if (dead_task->mm) {
-#ifdef CONFIG_MODIFY_LDT_SYSCALL
-               if (dead_task->mm->context.ldt) {
-                       pr_warn("WARNING: dead process %s still has LDT? <%p/%d>\n",
-                               dead_task->comm,
-                               dead_task->mm->context.ldt->entries,
-                               dead_task->mm->context.ldt->nr_entries);
-                       BUG();
-               }
-#endif
-       }
+       WARN_ON(dead_task->mm);
 }
 
 enum which_selector {
index 71691a8310e77eac2f8061f1bda1e0ece14bc949..0fdbe89d0754058c6d61be12e42134b1a4359045 100644 (file)
@@ -369,12 +369,22 @@ static int putreg(struct task_struct *child,
        case offsetof(struct user_regs_struct,fs_base):
                if (value >= TASK_SIZE_MAX)
                        return -EIO;
-               x86_fsbase_write_task(child, value);
+               /*
+                * When changing the FS base, use do_arch_prctl_64()
+                * to set the index to zero and to set the base
+                * as requested.
+                */
+               if (child->thread.fsbase != value)
+                       return do_arch_prctl_64(child, ARCH_SET_FS, value);
                return 0;
        case offsetof(struct user_regs_struct,gs_base):
+               /*
+                * Exactly the same here as the %fs handling above.
+                */
                if (value >= TASK_SIZE_MAX)
                        return -EIO;
-               x86_gsbase_write_task(child, value);
+               if (child->thread.gsbase != value)
+                       return do_arch_prctl_64(child, ARCH_SET_GS, value);
                return 0;
 #endif
        }
index 87095a477154350c4695bb1a292e4f55f533507c..4bb0f844711297a33e954b8204ecd824d6c2e35d 100644 (file)
@@ -313,13 +313,10 @@ __visible void __noreturn handle_stack_overflow(const char *message,
 
 #ifdef CONFIG_X86_64
 /* Runs on IST stack */
-dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code)
+dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code, unsigned long cr2)
 {
        static const char str[] = "double fault";
        struct task_struct *tsk = current;
-#ifdef CONFIG_VMAP_STACK
-       unsigned long cr2;
-#endif
 
 #ifdef CONFIG_X86_ESPFIX64
        extern unsigned char native_irq_return_iret[];
@@ -415,7 +412,6 @@ dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code)
         * stack even if the actual trigger for the double fault was
         * something else.
         */
-       cr2 = read_cr2();
        if ((unsigned long)task_stack_page(tsk) - 1 - cr2 < PAGE_SIZE)
                handle_stack_overflow("kernel stack overflow (double-fault)", regs, cr2);
 #endif
index ead6812103063a4433aaacd201912c2c62395d1d..22c2720cd948e321d3f0021670c1dce1e0b5799f 100644 (file)
@@ -368,9 +368,13 @@ static inline void do_cpuid_7_mask(struct kvm_cpuid_entry2 *entry, int index)
                F(SPEC_CTRL_SSBD) | F(ARCH_CAPABILITIES) | F(INTEL_STIBP) |
                F(MD_CLEAR);
 
+       /* cpuid 7.1.eax */
+       const u32 kvm_cpuid_7_1_eax_x86_features =
+               F(AVX512_BF16);
+
        switch (index) {
        case 0:
-               entry->eax = 0;
+               entry->eax = min(entry->eax, 1u);
                entry->ebx &= kvm_cpuid_7_0_ebx_x86_features;
                cpuid_mask(&entry->ebx, CPUID_7_0_EBX);
                /* TSC_ADJUST is emulated */
@@ -394,6 +398,12 @@ static inline void do_cpuid_7_mask(struct kvm_cpuid_entry2 *entry, int index)
                 */
                entry->edx |= F(ARCH_CAPABILITIES);
                break;
+       case 1:
+               entry->eax &= kvm_cpuid_7_1_eax_x86_features;
+               entry->ebx = 0;
+               entry->ecx = 0;
+               entry->edx = 0;
+               break;
        default:
                WARN_ON_ONCE(1);
                entry->eax = 0;
index 8e409ad448f90aaccb2da83467b37ebc7a2c45a5..718f7d9afedc498747bf538cde8469a17469cef6 100644 (file)
@@ -312,29 +312,42 @@ static void invalidate_registers(struct x86_emulate_ctxt *ctxt)
 
 static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *));
 
-#define FOP_FUNC(name) \
+#define __FOP_FUNC(name) \
        ".align " __stringify(FASTOP_SIZE) " \n\t" \
        ".type " name ", @function \n\t" \
        name ":\n\t"
 
-#define FOP_RET   "ret \n\t"
+#define FOP_FUNC(name) \
+       __FOP_FUNC(#name)
+
+#define __FOP_RET(name) \
+       "ret \n\t" \
+       ".size " name ", .-" name "\n\t"
+
+#define FOP_RET(name) \
+       __FOP_RET(#name)
 
 #define FOP_START(op) \
        extern void em_##op(struct fastop *fake); \
        asm(".pushsection .text, \"ax\" \n\t" \
            ".global em_" #op " \n\t" \
-           FOP_FUNC("em_" #op)
+           ".align " __stringify(FASTOP_SIZE) " \n\t" \
+           "em_" #op ":\n\t"
 
 #define FOP_END \
            ".popsection")
 
+#define __FOPNOP(name) \
+       __FOP_FUNC(name) \
+       __FOP_RET(name)
+
 #define FOPNOP() \
-       FOP_FUNC(__stringify(__UNIQUE_ID(nop))) \
-       FOP_RET
+       __FOPNOP(__stringify(__UNIQUE_ID(nop)))
 
 #define FOP1E(op,  dst) \
-       FOP_FUNC(#op "_" #dst) \
-       "10: " #op " %" #dst " \n\t" FOP_RET
+       __FOP_FUNC(#op "_" #dst) \
+       "10: " #op " %" #dst " \n\t" \
+       __FOP_RET(#op "_" #dst)
 
 #define FOP1EEX(op,  dst) \
        FOP1E(op, dst) _ASM_EXTABLE(10b, kvm_fastop_exception)
@@ -366,8 +379,9 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *));
        FOP_END
 
 #define FOP2E(op,  dst, src)      \
-       FOP_FUNC(#op "_" #dst "_" #src) \
-       #op " %" #src ", %" #dst " \n\t" FOP_RET
+       __FOP_FUNC(#op "_" #dst "_" #src) \
+       #op " %" #src ", %" #dst " \n\t" \
+       __FOP_RET(#op "_" #dst "_" #src)
 
 #define FASTOP2(op) \
        FOP_START(op) \
@@ -405,8 +419,9 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *));
        FOP_END
 
 #define FOP3E(op,  dst, src, src2) \
-       FOP_FUNC(#op "_" #dst "_" #src "_" #src2) \
-       #op " %" #src2 ", %" #src ", %" #dst " \n\t" FOP_RET
+       __FOP_FUNC(#op "_" #dst "_" #src "_" #src2) \
+       #op " %" #src2 ", %" #src ", %" #dst " \n\t"\
+       __FOP_RET(#op "_" #dst "_" #src "_" #src2)
 
 /* 3-operand, word-only, src2=cl */
 #define FASTOP3WCL(op) \
@@ -423,7 +438,7 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *));
        ".type " #op ", @function \n\t" \
        #op ": \n\t" \
        #op " %al \n\t" \
-       FOP_RET
+       __FOP_RET(#op)
 
 asm(".pushsection .fixup, \"ax\"\n"
     ".global kvm_fastop_exception \n"
@@ -449,7 +464,10 @@ FOP_SETCC(setle)
 FOP_SETCC(setnle)
 FOP_END;
 
-FOP_START(salc) "pushf; sbb %al, %al; popf \n\t" FOP_RET
+FOP_START(salc)
+FOP_FUNC(salc)
+"pushf; sbb %al, %al; popf \n\t"
+FOP_RET(salc)
 FOP_END;
 
 /*
index a39e38f13029164246f5b4a9136dd6cb6e2a6229..c10a8b10b203b706ce2b84b28e45fa0042bb1d77 100644 (file)
@@ -1594,7 +1594,7 @@ int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
 {
        u64 param, ingpa, outgpa, ret = HV_STATUS_SUCCESS;
        uint16_t code, rep_idx, rep_cnt;
-       bool fast, longmode, rep;
+       bool fast, rep;
 
        /*
         * hypercall generates UD from non zero cpl and real mode
@@ -1605,9 +1605,14 @@ int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
                return 1;
        }
 
-       longmode = is_64_bit_mode(vcpu);
-
-       if (!longmode) {
+#ifdef CONFIG_X86_64
+       if (is_64_bit_mode(vcpu)) {
+               param = kvm_rcx_read(vcpu);
+               ingpa = kvm_rdx_read(vcpu);
+               outgpa = kvm_r8_read(vcpu);
+       } else
+#endif
+       {
                param = ((u64)kvm_rdx_read(vcpu) << 32) |
                        (kvm_rax_read(vcpu) & 0xffffffff);
                ingpa = ((u64)kvm_rbx_read(vcpu) << 32) |
@@ -1615,13 +1620,6 @@ int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
                outgpa = ((u64)kvm_rdi_read(vcpu) << 32) |
                        (kvm_rsi_read(vcpu) & 0xffffffff);
        }
-#ifdef CONFIG_X86_64
-       else {
-               param = kvm_rcx_read(vcpu);
-               ingpa = kvm_rdx_read(vcpu);
-               outgpa = kvm_r8_read(vcpu);
-       }
-#endif
 
        code = param & 0xffff;
        fast = !!(param & HV_HYPERCALL_FAST_BIT);
index 1add1bc881e22418ff06e4c375aaca1a4a8b274c..d859ae8890d0a6d144427cff8e36fa18078c715a 100644 (file)
 #include "lapic.h"
 #include "irq.h"
 
-#if 0
-#define ioapic_debug(fmt,arg...) printk(KERN_WARNING fmt,##arg)
-#else
-#define ioapic_debug(fmt, arg...)
-#endif
 static int ioapic_service(struct kvm_ioapic *vioapic, int irq,
                bool line_status);
 
@@ -294,7 +289,6 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val)
        default:
                index = (ioapic->ioregsel - 0x10) >> 1;
 
-               ioapic_debug("change redir index %x val %x\n", index, val);
                if (index >= IOAPIC_NUM_PINS)
                        return;
                e = &ioapic->redirtbl[index];
@@ -343,12 +337,6 @@ static int ioapic_service(struct kvm_ioapic *ioapic, int irq, bool line_status)
            entry->fields.remote_irr))
                return -1;
 
-       ioapic_debug("dest=%x dest_mode=%x delivery_mode=%x "
-                    "vector=%x trig_mode=%x\n",
-                    entry->fields.dest_id, entry->fields.dest_mode,
-                    entry->fields.delivery_mode, entry->fields.vector,
-                    entry->fields.trig_mode);
-
        irqe.dest_id = entry->fields.dest_id;
        irqe.vector = entry->fields.vector;
        irqe.dest_mode = entry->fields.dest_mode;
@@ -515,7 +503,6 @@ static int ioapic_mmio_read(struct kvm_vcpu *vcpu, struct kvm_io_device *this,
        if (!ioapic_in_range(ioapic, addr))
                return -EOPNOTSUPP;
 
-       ioapic_debug("addr %lx\n", (unsigned long)addr);
        ASSERT(!(addr & 0xf));  /* check alignment */
 
        addr &= 0xff;
@@ -558,8 +545,6 @@ static int ioapic_mmio_write(struct kvm_vcpu *vcpu, struct kvm_io_device *this,
        if (!ioapic_in_range(ioapic, addr))
                return -EOPNOTSUPP;
 
-       ioapic_debug("ioapic_mmio_write addr=%p len=%d val=%p\n",
-                    (void*)addr, len, val);
        ASSERT(!(addr & 0xf));  /* check alignment */
 
        switch (len) {
index a232e76d8f23ffef9b74bd9d6e7e4ce0da565bd2..0aa158657f20cff83270f4251d1294030076c1bb 100644 (file)
@@ -52,9 +52,6 @@
 #define PRIu64 "u"
 #define PRIo64 "o"
 
-/* #define apic_debug(fmt,arg...) printk(KERN_WARNING fmt,##arg) */
-#define apic_debug(fmt, arg...) do {} while (0)
-
 /* 14 is the version for Xeon and Pentium 8.4.8*/
 #define APIC_VERSION                   (0x14UL | ((KVM_APIC_LVT_NUM - 1) << 16))
 #define LAPIC_MMIO_LENGTH              (1 << 12)
@@ -121,6 +118,17 @@ static inline u32 kvm_x2apic_id(struct kvm_lapic *apic)
        return apic->vcpu->vcpu_id;
 }
 
+bool kvm_can_post_timer_interrupt(struct kvm_vcpu *vcpu)
+{
+       return pi_inject_timer && kvm_vcpu_apicv_active(vcpu);
+}
+EXPORT_SYMBOL_GPL(kvm_can_post_timer_interrupt);
+
+static bool kvm_use_posted_timer_interrupt(struct kvm_vcpu *vcpu)
+{
+       return kvm_can_post_timer_interrupt(vcpu) && vcpu->mode == IN_GUEST_MODE;
+}
+
 static inline bool kvm_apic_map_get_logical_dest(struct kvm_apic_map *map,
                u32 dest_id, struct kvm_lapic ***cluster, u16 *mask) {
        switch (map->mode) {
@@ -627,7 +635,7 @@ static bool pv_eoi_get_pending(struct kvm_vcpu *vcpu)
 {
        u8 val;
        if (pv_eoi_get_user(vcpu, &val) < 0)
-               apic_debug("Can't read EOI MSR value: 0x%llx\n",
+               printk(KERN_WARNING "Can't read EOI MSR value: 0x%llx\n",
                           (unsigned long long)vcpu->arch.pv_eoi.msr_val);
        return val & 0x1;
 }
@@ -635,7 +643,7 @@ static bool pv_eoi_get_pending(struct kvm_vcpu *vcpu)
 static void pv_eoi_set_pending(struct kvm_vcpu *vcpu)
 {
        if (pv_eoi_put_user(vcpu, KVM_PV_EOI_ENABLED) < 0) {
-               apic_debug("Can't set EOI MSR value: 0x%llx\n",
+               printk(KERN_WARNING "Can't set EOI MSR value: 0x%llx\n",
                           (unsigned long long)vcpu->arch.pv_eoi.msr_val);
                return;
        }
@@ -645,7 +653,7 @@ static void pv_eoi_set_pending(struct kvm_vcpu *vcpu)
 static void pv_eoi_clr_pending(struct kvm_vcpu *vcpu)
 {
        if (pv_eoi_put_user(vcpu, KVM_PV_EOI_DISABLED) < 0) {
-               apic_debug("Can't clear EOI MSR value: 0x%llx\n",
+               printk(KERN_WARNING "Can't clear EOI MSR value: 0x%llx\n",
                           (unsigned long long)vcpu->arch.pv_eoi.msr_val);
                return;
        }
@@ -679,9 +687,6 @@ static bool __apic_update_ppr(struct kvm_lapic *apic, u32 *new_ppr)
        else
                ppr = isrv & 0xf0;
 
-       apic_debug("vlapic %p, ppr 0x%x, isr 0x%x, isrv 0x%x",
-                  apic, ppr, isr, isrv);
-
        *new_ppr = ppr;
        if (old_ppr != ppr)
                kvm_lapic_set_reg(apic, APIC_PROCPRI, ppr);
@@ -758,8 +763,6 @@ static bool kvm_apic_match_logical_addr(struct kvm_lapic *apic, u32 mda)
                return ((logical_id >> 4) == (mda >> 4))
                       && (logical_id & mda & 0xf) != 0;
        default:
-               apic_debug("Bad DFR vcpu %d: %08x\n",
-                          apic->vcpu->vcpu_id, kvm_lapic_get_reg(apic, APIC_DFR));
                return false;
        }
 }
@@ -798,10 +801,6 @@ bool kvm_apic_match_dest(struct kvm_vcpu *vcpu, struct kvm_lapic *source,
        struct kvm_lapic *target = vcpu->arch.apic;
        u32 mda = kvm_apic_mda(vcpu, dest, source, target);
 
-       apic_debug("target %p, source %p, dest 0x%x, "
-                  "dest_mode 0x%x, short_hand 0x%x\n",
-                  target, source, dest, dest_mode, short_hand);
-
        ASSERT(target);
        switch (short_hand) {
        case APIC_DEST_NOSHORT:
@@ -816,8 +815,6 @@ bool kvm_apic_match_dest(struct kvm_vcpu *vcpu, struct kvm_lapic *source,
        case APIC_DEST_ALLBUT:
                return target != source;
        default:
-               apic_debug("kvm: apic: Bad dest shorthand value %x\n",
-                          short_hand);
                return false;
        }
 }
@@ -1095,15 +1092,10 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
                        smp_wmb();
                        kvm_make_request(KVM_REQ_EVENT, vcpu);
                        kvm_vcpu_kick(vcpu);
-               } else {
-                       apic_debug("Ignoring de-assert INIT to vcpu %d\n",
-                                  vcpu->vcpu_id);
                }
                break;
 
        case APIC_DM_STARTUP:
-               apic_debug("SIPI to vcpu %d vector 0x%02x\n",
-                          vcpu->vcpu_id, vector);
                result = 1;
                apic->sipi_vector = vector;
                /* make sure sipi_vector is visible for the receiver */
@@ -1221,14 +1213,6 @@ static void apic_send_ipi(struct kvm_lapic *apic)
 
        trace_kvm_apic_ipi(icr_low, irq.dest_id);
 
-       apic_debug("icr_high 0x%x, icr_low 0x%x, "
-                  "short_hand 0x%x, dest 0x%x, trig_mode 0x%x, level 0x%x, "
-                  "dest_mode 0x%x, delivery_mode 0x%x, vector 0x%x, "
-                  "msi_redir_hint 0x%x\n",
-                  icr_high, icr_low, irq.shorthand, irq.dest_id,
-                  irq.trig_mode, irq.level, irq.dest_mode, irq.delivery_mode,
-                  irq.vector, irq.msi_redir_hint);
-
        kvm_irq_delivery_to_apic(apic->vcpu->kvm, apic, &irq, NULL);
 }
 
@@ -1282,7 +1266,6 @@ static u32 __apic_read(struct kvm_lapic *apic, unsigned int offset)
 
        switch (offset) {
        case APIC_ARBPRI:
-               apic_debug("Access APIC ARBPRI register which is for P6\n");
                break;
 
        case APIC_TMCCT:        /* Timer CCR */
@@ -1349,11 +1332,8 @@ int kvm_lapic_reg_read(struct kvm_lapic *apic, u32 offset, int len,
        if (!apic_x2apic_mode(apic))
                valid_reg_mask |= APIC_REG_MASK(APIC_ARBPRI);
 
-       if (offset > 0x3f0 || !(valid_reg_mask & APIC_REG_MASK(offset))) {
-               apic_debug("KVM_APIC_READ: read reserved register %x\n",
-                          offset);
+       if (offset > 0x3f0 || !(valid_reg_mask & APIC_REG_MASK(offset)))
                return 1;
-       }
 
        result = __apic_read(apic, offset & ~0xf);
 
@@ -1411,9 +1391,6 @@ static void update_divide_count(struct kvm_lapic *apic)
        tmp1 = tdcr & 0xf;
        tmp2 = ((tmp1 & 0x3) | ((tmp1 & 0x8) >> 1)) + 1;
        apic->divide_count = 0x1 << (tmp2 & 0x7);
-
-       apic_debug("timer divide count is 0x%x\n",
-                                  apic->divide_count);
 }
 
 static void limit_periodic_timer_frequency(struct kvm_lapic *apic)
@@ -1455,29 +1432,6 @@ static void apic_update_lvtt(struct kvm_lapic *apic)
        }
 }
 
-static void apic_timer_expired(struct kvm_lapic *apic)
-{
-       struct kvm_vcpu *vcpu = apic->vcpu;
-       struct swait_queue_head *q = &vcpu->wq;
-       struct kvm_timer *ktimer = &apic->lapic_timer;
-
-       if (atomic_read(&apic->lapic_timer.pending))
-               return;
-
-       atomic_inc(&apic->lapic_timer.pending);
-       kvm_set_pending_timer(vcpu);
-
-       /*
-        * For x86, the atomic_inc() is serialized, thus
-        * using swait_active() is safe.
-        */
-       if (swait_active(q))
-               swake_up_one(q);
-
-       if (apic_lvtt_tscdeadline(apic) || ktimer->hv_timer_in_use)
-               ktimer->expired_tscdeadline = ktimer->tscdeadline;
-}
-
 /*
  * On APICv, this test will cause a busy wait
  * during a higher-priority task.
@@ -1551,7 +1505,7 @@ static inline void adjust_lapic_timer_advance(struct kvm_vcpu *vcpu,
        apic->lapic_timer.timer_advance_ns = timer_advance_ns;
 }
 
-void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu)
+static void __kvm_wait_lapic_expire(struct kvm_vcpu *vcpu)
 {
        struct kvm_lapic *apic = vcpu->arch.apic;
        u64 guest_tsc, tsc_deadline;
@@ -1559,9 +1513,6 @@ void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu)
        if (apic->lapic_timer.expired_tscdeadline == 0)
                return;
 
-       if (!lapic_timer_int_injected(vcpu))
-               return;
-
        tsc_deadline = apic->lapic_timer.expired_tscdeadline;
        apic->lapic_timer.expired_tscdeadline = 0;
        guest_tsc = kvm_read_l1_tsc(vcpu, rdtsc());
@@ -1573,8 +1524,57 @@ void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu)
        if (unlikely(!apic->lapic_timer.timer_advance_adjust_done))
                adjust_lapic_timer_advance(vcpu, apic->lapic_timer.advance_expire_delta);
 }
+
+void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu)
+{
+       if (lapic_timer_int_injected(vcpu))
+               __kvm_wait_lapic_expire(vcpu);
+}
 EXPORT_SYMBOL_GPL(kvm_wait_lapic_expire);
 
+static void kvm_apic_inject_pending_timer_irqs(struct kvm_lapic *apic)
+{
+       struct kvm_timer *ktimer = &apic->lapic_timer;
+
+       kvm_apic_local_deliver(apic, APIC_LVTT);
+       if (apic_lvtt_tscdeadline(apic))
+               ktimer->tscdeadline = 0;
+       if (apic_lvtt_oneshot(apic)) {
+               ktimer->tscdeadline = 0;
+               ktimer->target_expiration = 0;
+       }
+}
+
+static void apic_timer_expired(struct kvm_lapic *apic)
+{
+       struct kvm_vcpu *vcpu = apic->vcpu;
+       struct swait_queue_head *q = &vcpu->wq;
+       struct kvm_timer *ktimer = &apic->lapic_timer;
+
+       if (atomic_read(&apic->lapic_timer.pending))
+               return;
+
+       if (apic_lvtt_tscdeadline(apic) || ktimer->hv_timer_in_use)
+               ktimer->expired_tscdeadline = ktimer->tscdeadline;
+
+       if (kvm_use_posted_timer_interrupt(apic->vcpu)) {
+               if (apic->lapic_timer.timer_advance_ns)
+                       __kvm_wait_lapic_expire(vcpu);
+               kvm_apic_inject_pending_timer_irqs(apic);
+               return;
+       }
+
+       atomic_inc(&apic->lapic_timer.pending);
+       kvm_set_pending_timer(vcpu);
+
+       /*
+        * For x86, the atomic_inc() is serialized, thus
+        * using swait_active() is safe.
+        */
+       if (swait_active(q))
+               swake_up_one(q);
+}
+
 static void start_sw_tscdeadline(struct kvm_lapic *apic)
 {
        struct kvm_timer *ktimer = &apic->lapic_timer;
@@ -1601,7 +1601,7 @@ static void start_sw_tscdeadline(struct kvm_lapic *apic)
            likely(ns > apic->lapic_timer.timer_advance_ns)) {
                expire = ktime_add_ns(now, ns);
                expire = ktime_sub_ns(expire, ktimer->timer_advance_ns);
-               hrtimer_start(&ktimer->timer, expire, HRTIMER_MODE_ABS_PINNED);
+               hrtimer_start(&ktimer->timer, expire, HRTIMER_MODE_ABS);
        } else
                apic_timer_expired(apic);
 
@@ -1648,16 +1648,6 @@ static bool set_target_expiration(struct kvm_lapic *apic)
 
        limit_periodic_timer_frequency(apic);
 
-       apic_debug("%s: bus cycle is %" PRId64 "ns, now 0x%016"
-                  PRIx64 ", "
-                  "timer initial count 0x%x, period %lldns, "
-                  "expire @ 0x%016" PRIx64 ".\n", __func__,
-                  APIC_BUS_CYCLE_NS, ktime_to_ns(now),
-                  kvm_lapic_get_reg(apic, APIC_TMICT),
-                  apic->lapic_timer.period,
-                  ktime_to_ns(ktime_add_ns(now,
-                               apic->lapic_timer.period)));
-
        apic->lapic_timer.tscdeadline = kvm_read_l1_tsc(apic->vcpu, tscl) +
                nsec_to_cycles(apic->vcpu, apic->lapic_timer.period);
        apic->lapic_timer.target_expiration = ktime_add_ns(now, apic->lapic_timer.period);
@@ -1703,7 +1693,7 @@ static void start_sw_period(struct kvm_lapic *apic)
 
        hrtimer_start(&apic->lapic_timer.timer,
                apic->lapic_timer.target_expiration,
-               HRTIMER_MODE_ABS_PINNED);
+               HRTIMER_MODE_ABS);
 }
 
 bool kvm_lapic_hv_timer_in_use(struct kvm_vcpu *vcpu)
@@ -1860,8 +1850,6 @@ static void apic_manage_nmi_watchdog(struct kvm_lapic *apic, u32 lvt0_val)
        if (apic->lvt0_in_nmi_mode != lvt0_in_nmi_mode) {
                apic->lvt0_in_nmi_mode = lvt0_in_nmi_mode;
                if (lvt0_in_nmi_mode) {
-                       apic_debug("Receive NMI setting on APIC_LVT0 "
-                                  "for cpu %d\n", apic->vcpu->vcpu_id);
                        atomic_inc(&apic->vcpu->kvm->arch.vapics_in_nmi_mode);
                } else
                        atomic_dec(&apic->vcpu->kvm->arch.vapics_in_nmi_mode);
@@ -1975,8 +1963,6 @@ int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
        case APIC_TDCR: {
                uint32_t old_divisor = apic->divide_count;
 
-               if (val & 4)
-                       apic_debug("KVM_WRITE:TDCR %x\n", val);
                kvm_lapic_set_reg(apic, APIC_TDCR, val);
                update_divide_count(apic);
                if (apic->divide_count != old_divisor &&
@@ -1988,10 +1974,8 @@ int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
                break;
        }
        case APIC_ESR:
-               if (apic_x2apic_mode(apic) && val != 0) {
-                       apic_debug("KVM_WRITE:ESR not zero %x\n", val);
+               if (apic_x2apic_mode(apic) && val != 0)
                        ret = 1;
-               }
                break;
 
        case APIC_SELF_IPI:
@@ -2004,8 +1988,7 @@ int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
                ret = 1;
                break;
        }
-       if (ret)
-               apic_debug("Local APIC Write to read-only register %x\n", reg);
+
        return ret;
 }
 EXPORT_SYMBOL_GPL(kvm_lapic_reg_write);
@@ -2033,20 +2016,12 @@ static int apic_mmio_write(struct kvm_vcpu *vcpu, struct kvm_io_device *this,
         * 32/64/128 bits registers must be accessed thru 32 bits.
         * Refer SDM 8.4.1
         */
-       if (len != 4 || (offset & 0xf)) {
-               /* Don't shout loud, $infamous_os would cause only noise. */
-               apic_debug("apic write: bad size=%d %lx\n", len, (long)address);
+       if (len != 4 || (offset & 0xf))
                return 0;
-       }
 
        val = *(u32*)data;
 
-       /* too common printing */
-       if (offset != APIC_EOI)
-               apic_debug("%s: offset 0x%x with length 0x%x, and value is "
-                          "0x%x\n", __func__, offset, len, val);
-
-       kvm_lapic_reg_write(apic, offset, val);
+       kvm_lapic_reg_write(apic, offset & 0xff0, val);
 
        return 0;
 }
@@ -2178,11 +2153,6 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
        if ((value & MSR_IA32_APICBASE_ENABLE) &&
             apic->base_address != APIC_DEFAULT_PHYS_BASE)
                pr_warn_once("APIC base relocation is unsupported by KVM");
-
-       /* with FSB delivery interrupt, we can restart APIC functionality */
-       apic_debug("apic base msr is 0x%016" PRIx64 ", and base address is "
-                  "0x%lx.\n", apic->vcpu->arch.apic_base, apic->base_address);
-
 }
 
 void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event)
@@ -2193,8 +2163,6 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event)
        if (!apic)
                return;
 
-       apic_debug("%s\n", __func__);
-
        /* Stop the timer in case it's a reset to an active apic */
        hrtimer_cancel(&apic->lapic_timer.timer);
 
@@ -2247,11 +2215,6 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event)
 
        vcpu->arch.apic_arb_prio = 0;
        vcpu->arch.apic_attention = 0;
-
-       apic_debug("%s: vcpu=%p, id=0x%x, base_msr="
-                  "0x%016" PRIx64 ", base_address=0x%0lx.\n", __func__,
-                  vcpu, kvm_lapic_get_reg(apic, APIC_ID),
-                  vcpu->arch.apic_base, apic->base_address);
 }
 
 /*
@@ -2323,7 +2286,6 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu, int timer_advance_ns)
        struct kvm_lapic *apic;
 
        ASSERT(vcpu != NULL);
-       apic_debug("apic_init %d\n", vcpu->vcpu_id);
 
        apic = kzalloc(sizeof(*apic), GFP_KERNEL_ACCOUNT);
        if (!apic)
@@ -2340,7 +2302,7 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu, int timer_advance_ns)
        apic->vcpu = vcpu;
 
        hrtimer_init(&apic->lapic_timer.timer, CLOCK_MONOTONIC,
-                    HRTIMER_MODE_ABS_PINNED);
+                    HRTIMER_MODE_ABS);
        apic->lapic_timer.timer.function = apic_timer_fn;
        if (timer_advance_ns == -1) {
                apic->lapic_timer.timer_advance_ns = LAPIC_TIMER_ADVANCE_ADJUST_INIT;
@@ -2397,13 +2359,7 @@ void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu)
        struct kvm_lapic *apic = vcpu->arch.apic;
 
        if (atomic_read(&apic->lapic_timer.pending) > 0) {
-               kvm_apic_local_deliver(apic, APIC_LVTT);
-               if (apic_lvtt_tscdeadline(apic))
-                       apic->lapic_timer.tscdeadline = 0;
-               if (apic_lvtt_oneshot(apic)) {
-                       apic->lapic_timer.tscdeadline = 0;
-                       apic->lapic_timer.target_expiration = 0;
-               }
+               kvm_apic_inject_pending_timer_irqs(apic);
                atomic_set(&apic->lapic_timer.pending, 0);
        }
 }
@@ -2525,12 +2481,13 @@ void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu)
 {
        struct hrtimer *timer;
 
-       if (!lapic_in_kernel(vcpu))
+       if (!lapic_in_kernel(vcpu) ||
+               kvm_can_post_timer_interrupt(vcpu))
                return;
 
        timer = &vcpu->arch.apic->lapic_timer.timer;
        if (hrtimer_cancel(timer))
-               hrtimer_start_expires(timer, HRTIMER_MODE_ABS_PINNED);
+               hrtimer_start_expires(timer, HRTIMER_MODE_ABS);
 }
 
 /*
@@ -2678,11 +2635,8 @@ int kvm_x2apic_msr_read(struct kvm_vcpu *vcpu, u32 msr, u64 *data)
        if (!lapic_in_kernel(vcpu) || !apic_x2apic_mode(apic))
                return 1;
 
-       if (reg == APIC_DFR || reg == APIC_ICR2) {
-               apic_debug("KVM_APIC_READ: read x2apic reserved register %x\n",
-                          reg);
+       if (reg == APIC_DFR || reg == APIC_ICR2)
                return 1;
-       }
 
        if (kvm_lapic_reg_read(apic, reg, 4, &low))
                return 1;
@@ -2780,8 +2734,6 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu)
                /* evaluate pending_events before reading the vector */
                smp_rmb();
                sipi_vector = apic->sipi_vector;
-               apic_debug("vcpu %d received sipi with vector # %x\n",
-                        vcpu->vcpu_id, sipi_vector);
                kvm_vcpu_deliver_sipi_vector(vcpu, sipi_vector);
                vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
        }
index 36747174e4a8ba7b19d5fb58ccfae2974f8e4795..50053d2b8b7bc849b7057406376f874b774c24cd 100644 (file)
@@ -236,6 +236,7 @@ void kvm_lapic_switch_to_hv_timer(struct kvm_vcpu *vcpu);
 void kvm_lapic_expired_hv_timer(struct kvm_vcpu *vcpu);
 bool kvm_lapic_hv_timer_in_use(struct kvm_vcpu *vcpu);
 void kvm_lapic_restart_hv_timer(struct kvm_vcpu *vcpu);
+bool kvm_can_post_timer_interrupt(struct kvm_vcpu *vcpu);
 
 static inline enum lapic_mode kvm_apic_mode(u64 apic_base)
 {
index 9a5814d8d1942ee008457aa4d6cdeef09a33880c..8f72526e2f68140b49f0e122aba18eaef3bbf335 100644 (file)
@@ -4597,11 +4597,11 @@ static void update_permission_bitmask(struct kvm_vcpu *vcpu,
                 */
 
                /* Faults from writes to non-writable pages */
-               u8 wf = (pfec & PFERR_WRITE_MASK) ? ~w : 0;
+               u8 wf = (pfec & PFERR_WRITE_MASK) ? (u8)~w : 0;
                /* Faults from user mode accesses to supervisor pages */
-               u8 uf = (pfec & PFERR_USER_MASK) ? ~u : 0;
+               u8 uf = (pfec & PFERR_USER_MASK) ? (u8)~u : 0;
                /* Faults from fetches of non-executable pages*/
-               u8 ff = (pfec & PFERR_FETCH_MASK) ? ~x : 0;
+               u8 ff = (pfec & PFERR_FETCH_MASK) ? (u8)~x : 0;
                /* Faults from kernel mode fetches of user pages */
                u8 smepf = 0;
                /* Faults from kernel mode accesses of user pages */
index aa5a2597305ae82ada262121df14c6e3aafd2348..46875bbd04198a1cbed9771765c6fa3db68dbcd1 100644 (file)
@@ -19,8 +19,8 @@
 #include "lapic.h"
 #include "pmu.h"
 
-/* This keeps the total size of the filter under 4k. */
-#define KVM_PMU_EVENT_FILTER_MAX_EVENTS 63
+/* This is enough to filter the vast majority of currently defined events. */
+#define KVM_PMU_EVENT_FILTER_MAX_EVENTS 300
 
 /* NOTE:
  * - Each perf counter is defined as "struct kvm_pmc";
@@ -131,8 +131,8 @@ static void pmc_reprogram_counter(struct kvm_pmc *pmc, u32 type,
                                                 intr ? kvm_perf_overflow_intr :
                                                 kvm_perf_overflow, pmc);
        if (IS_ERR(event)) {
-               printk_once("kvm_pmu: event creation failed %ld\n",
-                           PTR_ERR(event));
+               pr_debug_ratelimited("kvm_pmu: event creation failed %ld for pmc->idx = %d\n",
+                           PTR_ERR(event), pmc->idx);
                return;
        }
 
@@ -206,12 +206,24 @@ void reprogram_fixed_counter(struct kvm_pmc *pmc, u8 ctrl, int idx)
 {
        unsigned en_field = ctrl & 0x3;
        bool pmi = ctrl & 0x8;
+       struct kvm_pmu_event_filter *filter;
+       struct kvm *kvm = pmc->vcpu->kvm;
 
        pmc_stop_counter(pmc);
 
        if (!en_field || !pmc_is_enabled(pmc))
                return;
 
+       filter = srcu_dereference(kvm->arch.pmu_event_filter, &kvm->srcu);
+       if (filter) {
+               if (filter->action == KVM_PMU_EVENT_DENY &&
+                   test_bit(idx, (ulong *)&filter->fixed_counter_bitmap))
+                       return;
+               if (filter->action == KVM_PMU_EVENT_ALLOW &&
+                   !test_bit(idx, (ulong *)&filter->fixed_counter_bitmap))
+                       return;
+       }
+
        pmc_reprogram_counter(pmc, PERF_TYPE_HARDWARE,
                              kvm_x86_ops->pmu_ops->find_fixed_event(idx),
                              !(en_field & 0x2), /* exclude user */
@@ -385,6 +397,9 @@ int kvm_vm_ioctl_set_pmu_event_filter(struct kvm *kvm, void __user *argp)
            tmp.action != KVM_PMU_EVENT_DENY)
                return -EINVAL;
 
+       if (tmp.flags != 0)
+               return -EINVAL;
+
        if (tmp.nevents > KVM_PMU_EVENT_FILTER_MAX_EVENTS)
                return -E2BIG;
 
@@ -406,8 +421,8 @@ int kvm_vm_ioctl_set_pmu_event_filter(struct kvm *kvm, void __user *argp)
        mutex_unlock(&kvm->lock);
 
        synchronize_srcu_expedited(&kvm->srcu);
-       r = 0;
+       r = 0;
 cleanup:
        kfree(filter);
-       return r;
+       return r;
 }
index 583b9fa656f3f8594165cc44e96c8b2741079cb1..19f69df9675869295764ae3a04bc1c0a5df0ff00 100644 (file)
@@ -7128,13 +7128,41 @@ static int nested_enable_evmcs(struct kvm_vcpu *vcpu,
 
 static bool svm_need_emulation_on_page_fault(struct kvm_vcpu *vcpu)
 {
-       bool is_user, smap;
-
-       is_user = svm_get_cpl(vcpu) == 3;
-       smap = !kvm_read_cr4_bits(vcpu, X86_CR4_SMAP);
+       unsigned long cr4 = kvm_read_cr4(vcpu);
+       bool smep = cr4 & X86_CR4_SMEP;
+       bool smap = cr4 & X86_CR4_SMAP;
+       bool is_user = svm_get_cpl(vcpu) == 3;
 
        /*
-        * Detect and workaround Errata 1096 Fam_17h_00_0Fh
+        * Detect and workaround Errata 1096 Fam_17h_00_0Fh.
+        *
+        * Errata:
+        * When CPU raise #NPF on guest data access and vCPU CR4.SMAP=1, it is
+        * possible that CPU microcode implementing DecodeAssist will fail
+        * to read bytes of instruction which caused #NPF. In this case,
+        * GuestIntrBytes field of the VMCB on a VMEXIT will incorrectly
+        * return 0 instead of the correct guest instruction bytes.
+        *
+        * This happens because CPU microcode reading instruction bytes
+        * uses a special opcode which attempts to read data using CPL=0
+        * priviledges. The microcode reads CS:RIP and if it hits a SMAP
+        * fault, it gives up and returns no instruction bytes.
+        *
+        * Detection:
+        * We reach here in case CPU supports DecodeAssist, raised #NPF and
+        * returned 0 in GuestIntrBytes field of the VMCB.
+        * First, errata can only be triggered in case vCPU CR4.SMAP=1.
+        * Second, if vCPU CR4.SMEP=1, errata could only be triggered
+        * in case vCPU CPL==3 (Because otherwise guest would have triggered
+        * a SMEP fault instead of #NPF).
+        * Otherwise, vCPU CR4.SMEP=0, errata could be triggered by any vCPU CPL.
+        * As most guests enable SMAP if they have also enabled SMEP, use above
+        * logic in order to attempt minimize false-positive of detecting errata
+        * while still preserving all cases semantic correctness.
+        *
+        * Workaround:
+        * To determine what instruction the guest was executing, the hypervisor
+        * will have to decode the instruction at the instruction pointer.
         *
         * In non SEV guest, hypervisor will be able to read the guest
         * memory to decode the instruction pointer when insn_len is zero
@@ -7145,11 +7173,11 @@ static bool svm_need_emulation_on_page_fault(struct kvm_vcpu *vcpu)
         * instruction pointer so we will not able to workaround it. Lets
         * print the error and request to kill the guest.
         */
-       if (is_user && smap) {
+       if (smap && (!smep || is_user)) {
                if (!sev_guest(vcpu->kvm))
                        return true;
 
-               pr_err_ratelimited("KVM: Guest triggered AMD Erratum 1096\n");
+               pr_err_ratelimited("KVM: SEV Guest triggered AMD Erratum 1096\n");
                kvm_make_request(KVM_REQ_TRIPLE_FAULT, vcpu);
        }
 
index bb509c2549397b29f03a75a1e542074eadf64702..0f1378789bd0381e95c703ad658376efa3484d8d 100644 (file)
@@ -194,6 +194,7 @@ static void vmx_disable_shadow_vmcs(struct vcpu_vmx *vmx)
 {
        secondary_exec_controls_clearbit(vmx, SECONDARY_EXEC_SHADOW_VMCS);
        vmcs_write64(VMCS_LINK_POINTER, -1ull);
+       vmx->nested.need_vmcs12_to_shadow_sync = false;
 }
 
 static inline void nested_release_evmcs(struct kvm_vcpu *vcpu)
@@ -1341,6 +1342,9 @@ static void copy_shadow_to_vmcs12(struct vcpu_vmx *vmx)
        unsigned long val;
        int i;
 
+       if (WARN_ON(!shadow_vmcs))
+               return;
+
        preempt_disable();
 
        vmcs_load(shadow_vmcs);
@@ -1373,6 +1377,9 @@ static void copy_vmcs12_to_shadow(struct vcpu_vmx *vmx)
        unsigned long val;
        int i, q;
 
+       if (WARN_ON(!shadow_vmcs))
+               return;
+
        vmcs_load(shadow_vmcs);
 
        for (q = 0; q < ARRAY_SIZE(fields); q++) {
@@ -4194,7 +4201,10 @@ int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification,
                 * mode, e.g. a 32-bit address size can yield a 64-bit virtual
                 * address when using FS/GS with a non-zero base.
                 */
-               *ret = s.base + off;
+               if (seg_reg == VCPU_SREG_FS || seg_reg == VCPU_SREG_GS)
+                       *ret = s.base + off;
+               else
+                       *ret = off;
 
                /* Long mode: #GP(0)/#SS(0) if the memory address is in a
                 * non-canonical form. This is the only check on the memory
@@ -4433,7 +4443,6 @@ static inline void nested_release_vmcs12(struct kvm_vcpu *vcpu)
                /* copy to memory all shadowed fields in case
                   they were modified */
                copy_shadow_to_vmcs12(vmx);
-               vmx->nested.need_vmcs12_to_shadow_sync = false;
                vmx_disable_shadow_vmcs(vmx);
        }
        vmx->nested.posted_intr_nv = -1;
index 68d231d49c7acf0f916791226bb1908048f8957f..4dea0e0e7e392cb9de5771347604d99c126d24b4 100644 (file)
@@ -337,17 +337,22 @@ static void intel_pmu_init(struct kvm_vcpu *vcpu)
 static void intel_pmu_reset(struct kvm_vcpu *vcpu)
 {
        struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
+       struct kvm_pmc *pmc = NULL;
        int i;
 
        for (i = 0; i < INTEL_PMC_MAX_GENERIC; i++) {
-               struct kvm_pmc *pmc = &pmu->gp_counters[i];
+               pmc = &pmu->gp_counters[i];
 
                pmc_stop_counter(pmc);
                pmc->counter = pmc->eventsel = 0;
        }
 
-       for (i = 0; i < INTEL_PMC_MAX_FIXED; i++)
-               pmc_stop_counter(&pmu->fixed_counters[i]);
+       for (i = 0; i < INTEL_PMC_MAX_FIXED; i++) {
+               pmc = &pmu->fixed_counters[i];
+
+               pmc_stop_counter(pmc);
+               pmc->counter = 0;
+       }
 
        pmu->fixed_ctr_ctrl = pmu->global_ctrl = pmu->global_status =
                pmu->global_ovf_ctrl = 0;
index d4cb1945b2e3b925210c4edb57c36ab683be0489..4010d519eb8c2d98f80f02b2c19259ea4a8bd967 100644 (file)
@@ -54,9 +54,9 @@ ENTRY(vmx_vmenter)
        ret
 
 3:     cmpb $0, kvm_rebooting
-       jne 4f
-       call kvm_spurious_fault
-4:     ret
+       je 4f
+       ret
+4:     ud2
 
        .pushsection .fixup, "ax"
 5:     jmp 3b
index 69536553446dbcb54be8e69176fc95c73c20a575..a279447eb75b6172ac470cd95e84b3e56f92ac90 100644 (file)
@@ -5829,6 +5829,7 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu)
        }
 
        if (unlikely(vmx->fail)) {
+               dump_vmcs();
                vcpu->run->exit_reason = KVM_EXIT_FAIL_ENTRY;
                vcpu->run->fail_entry.hardware_entry_failure_reason
                        = vmcs_read32(VM_INSTRUCTION_ERROR);
@@ -7064,7 +7065,8 @@ static int vmx_set_hv_timer(struct kvm_vcpu *vcpu, u64 guest_deadline_tsc,
        u64 tscl, guest_tscl, delta_tsc, lapic_timer_advance_cycles;
        struct kvm_timer *ktimer = &vcpu->arch.apic->lapic_timer;
 
-       if (kvm_mwait_in_guest(vcpu->kvm))
+       if (kvm_mwait_in_guest(vcpu->kvm) ||
+               kvm_can_post_timer_interrupt(vcpu))
                return -EOPNOTSUPP;
 
        vmx = to_vmx(vcpu);
@@ -7453,7 +7455,7 @@ static int enable_smi_window(struct kvm_vcpu *vcpu)
 
 static bool vmx_need_emulation_on_page_fault(struct kvm_vcpu *vcpu)
 {
-       return 0;
+       return false;
 }
 
 static __init int hardware_setup(void)
index 4a0b74ecd1deebd90c163f8e440c379921d11e31..58305cf81182dab02a0a45f5efa85990d2e239b4 100644 (file)
@@ -51,6 +51,7 @@
 #include <linux/kvm_irqfd.h>
 #include <linux/irqbypass.h>
 #include <linux/sched/stat.h>
+#include <linux/sched/isolation.h>
 #include <linux/mem_encrypt.h>
 
 #include <trace/events/kvm.h>
@@ -153,6 +154,9 @@ EXPORT_SYMBOL_GPL(enable_vmware_backdoor);
 static bool __read_mostly force_emulation_prefix = false;
 module_param(force_emulation_prefix, bool, S_IRUGO);
 
+int __read_mostly pi_inject_timer = -1;
+module_param(pi_inject_timer, bint, S_IRUGO | S_IWUSR);
+
 #define KVM_NR_SHARED_MSRS 16
 
 struct kvm_shared_msrs_global {
@@ -1456,12 +1460,8 @@ static void update_pvclock_gtod(struct timekeeper *tk)
 
 void kvm_set_pending_timer(struct kvm_vcpu *vcpu)
 {
-       /*
-        * Note: KVM_REQ_PENDING_TIMER is implicitly checked in
-        * vcpu_enter_guest.  This function is only called from
-        * the physical CPU that is running vcpu.
-        */
        kvm_make_request(KVM_REQ_PENDING_TIMER, vcpu);
+       kvm_vcpu_kick(vcpu);
 }
 
 static void kvm_write_wall_clock(struct kvm *kvm, gpa_t wall_clock)
@@ -1540,9 +1540,6 @@ static void kvm_get_time_scale(uint64_t scaled_hz, uint64_t base_hz,
 
        *pshift = shift;
        *pmultiplier = div_frac(scaled64, tps32);
-
-       pr_debug("%s: base_hz %llu => %llu, shift %d, mul %u\n",
-                __func__, base_hz, scaled_hz, shift, *pmultiplier);
 }
 
 #ifdef CONFIG_X86_64
@@ -1785,12 +1782,10 @@ void kvm_write_tsc(struct kvm_vcpu *vcpu, struct msr_data *msr)
            vcpu->arch.virtual_tsc_khz == kvm->arch.last_tsc_khz) {
                if (!kvm_check_tsc_unstable()) {
                        offset = kvm->arch.cur_tsc_offset;
-                       pr_debug("kvm: matched tsc offset for %llu\n", data);
                } else {
                        u64 delta = nsec_to_cycles(vcpu, elapsed);
                        data += delta;
                        offset = kvm_compute_tsc_offset(vcpu, data);
-                       pr_debug("kvm: adjusted tsc offset by %llu\n", delta);
                }
                matched = true;
                already_matched = (vcpu->arch.this_tsc_generation == kvm->arch.cur_tsc_generation);
@@ -1809,8 +1804,6 @@ void kvm_write_tsc(struct kvm_vcpu *vcpu, struct msr_data *msr)
                kvm->arch.cur_tsc_write = data;
                kvm->arch.cur_tsc_offset = offset;
                matched = false;
-               pr_debug("kvm: new tsc generation %llu, clock %llu\n",
-                        kvm->arch.cur_tsc_generation, data);
        }
 
        /*
@@ -6911,7 +6904,6 @@ static void kvm_timer_init(void)
                cpufreq_register_notifier(&kvmclock_cpufreq_notifier_block,
                                          CPUFREQ_TRANSITION_NOTIFIER);
        }
-       pr_debug("kvm: max_tsc_khz = %ld\n", max_tsc_khz);
 
        cpuhp_setup_state(CPUHP_AP_X86_KVM_CLK_ONLINE, "x86/kvm/clk:online",
                          kvmclock_cpu_online, kvmclock_cpu_down_prep);
@@ -7070,6 +7062,8 @@ int kvm_arch_init(void *opaque)
                host_xcr0 = xgetbv(XCR_XFEATURE_ENABLED_MASK);
 
        kvm_lapic_init();
+       if (pi_inject_timer == -1)
+               pi_inject_timer = housekeeping_enabled(HK_FLAG_TIMER);
 #ifdef CONFIG_X86_64
        pvclock_gtod_register_notifier(&pvclock_gtod_notifier);
 
index e08a12892e8ba8275addbc9f9d8c98f4fa8051df..6594020c069167f4f889570960698b2d61ba6379 100644 (file)
@@ -301,6 +301,8 @@ extern unsigned int min_timer_period_us;
 
 extern bool enable_vmware_backdoor;
 
+extern int pi_inject_timer;
+
 extern struct static_key kvm_no_apic_vcpu;
 
 static inline u64 nsec_to_cycles(struct kvm_vcpu *vcpu, u64 nsec)
index 378a1f70ae7da5732e7181d593288cc20df71fd3..4fe1601dbc5d857dfb3639600629584fd8f9c15b 100644 (file)
@@ -239,7 +239,7 @@ copy_user_handle_tail:
        ret
 
        _ASM_EXTABLE_UA(1b, 2b)
-ENDPROC(copy_user_handle_tail)
+END(copy_user_handle_tail)
 
 /*
  * copy_user_nocache - Uncached memory copy with exception handling
index 74fdff968ea3b14ce05db05f65fe59dc6ae89154..304f958c27b29cd54aed4f736e5e4601bce5ae94 100644 (file)
@@ -115,29 +115,29 @@ ENDPROC(__get_user_8)
 EXPORT_SYMBOL(__get_user_8)
 
 
+bad_get_user_clac:
+       ASM_CLAC
 bad_get_user:
        xor %edx,%edx
        mov $(-EFAULT),%_ASM_AX
-       ASM_CLAC
        ret
-END(bad_get_user)
 
 #ifdef CONFIG_X86_32
+bad_get_user_8_clac:
+       ASM_CLAC
 bad_get_user_8:
        xor %edx,%edx
        xor %ecx,%ecx
        mov $(-EFAULT),%_ASM_AX
-       ASM_CLAC
        ret
-END(bad_get_user_8)
 #endif
 
-       _ASM_EXTABLE_UA(1b, bad_get_user)
-       _ASM_EXTABLE_UA(2b, bad_get_user)
-       _ASM_EXTABLE_UA(3b, bad_get_user)
+       _ASM_EXTABLE_UA(1b, bad_get_user_clac)
+       _ASM_EXTABLE_UA(2b, bad_get_user_clac)
+       _ASM_EXTABLE_UA(3b, bad_get_user_clac)
 #ifdef CONFIG_X86_64
-       _ASM_EXTABLE_UA(4b, bad_get_user)
+       _ASM_EXTABLE_UA(4b, bad_get_user_clac)
 #else
-       _ASM_EXTABLE_UA(4b, bad_get_user_8)
-       _ASM_EXTABLE_UA(5b, bad_get_user_8)
+       _ASM_EXTABLE_UA(4b, bad_get_user_8_clac)
+       _ASM_EXTABLE_UA(5b, bad_get_user_8_clac)
 #endif
index d2e5c9c396018e7e255ad0cdbfc5d5a1552d6e8c..14bf78341d3c731ab3d3e242003c21dbd8c33a50 100644 (file)
@@ -32,8 +32,6 @@
  */
 
 #define ENTER  mov PER_CPU_VAR(current_task), %_ASM_BX
-#define EXIT   ASM_CLAC ;      \
-               ret
 
 .text
 ENTRY(__put_user_1)
@@ -43,7 +41,8 @@ ENTRY(__put_user_1)
        ASM_STAC
 1:     movb %al,(%_ASM_CX)
        xor %eax,%eax
-       EXIT
+       ASM_CLAC
+       ret
 ENDPROC(__put_user_1)
 EXPORT_SYMBOL(__put_user_1)
 
@@ -56,7 +55,8 @@ ENTRY(__put_user_2)
        ASM_STAC
 2:     movw %ax,(%_ASM_CX)
        xor %eax,%eax
-       EXIT
+       ASM_CLAC
+       ret
 ENDPROC(__put_user_2)
 EXPORT_SYMBOL(__put_user_2)
 
@@ -69,7 +69,8 @@ ENTRY(__put_user_4)
        ASM_STAC
 3:     movl %eax,(%_ASM_CX)
        xor %eax,%eax
-       EXIT
+       ASM_CLAC
+       ret
 ENDPROC(__put_user_4)
 EXPORT_SYMBOL(__put_user_4)
 
@@ -85,19 +86,21 @@ ENTRY(__put_user_8)
 5:     movl %edx,4(%_ASM_CX)
 #endif
        xor %eax,%eax
-       EXIT
+       ASM_CLAC
+       RET
 ENDPROC(__put_user_8)
 EXPORT_SYMBOL(__put_user_8)
 
+bad_put_user_clac:
+       ASM_CLAC
 bad_put_user:
        movl $-EFAULT,%eax
-       EXIT
-END(bad_put_user)
+       RET
 
-       _ASM_EXTABLE_UA(1b, bad_put_user)
-       _ASM_EXTABLE_UA(2b, bad_put_user)
-       _ASM_EXTABLE_UA(3b, bad_put_user)
-       _ASM_EXTABLE_UA(4b, bad_put_user)
+       _ASM_EXTABLE_UA(1b, bad_put_user_clac)
+       _ASM_EXTABLE_UA(2b, bad_put_user_clac)
+       _ASM_EXTABLE_UA(3b, bad_put_user_clac)
+       _ASM_EXTABLE_UA(4b, bad_put_user_clac)
 #ifdef CONFIG_X86_32
-       _ASM_EXTABLE_UA(5b, bad_put_user)
+       _ASM_EXTABLE_UA(5b, bad_put_user_clac)
 #endif
index e0e006f1624e2cb71e73cbbda1433e45dda2169d..fff28c6f73a212716c5d623c2810b2779ee899f0 100644 (file)
@@ -60,7 +60,7 @@ EXPORT_SYMBOL(clear_user);
  * but reuse __memcpy_mcsafe in case a new read error is encountered.
  * clac() is handled in _copy_to_iter_mcsafe().
  */
-__visible unsigned long
+__visible notrace unsigned long
 mcsafe_handle_tail(char *to, char *from, unsigned len)
 {
        for (; len; --len, to++, from++) {
index a5a41ec5807211d8cb634f2ef009a9ad867da4a4..0c122226ca56f5b2e98549868939ea2457ef5adf 100644 (file)
@@ -177,7 +177,7 @@ static inline void reg_copy(FPU_REG const *x, FPU_REG *y)
 #define setexponentpos(x,y) { (*(short *)&((x)->exp)) = \
   ((y) + EXTENDED_Ebias) & 0x7fff; }
 #define exponent16(x)         (*(short *)&((x)->exp))
-#define setexponent16(x,y)  { (*(short *)&((x)->exp)) = (y); }
+#define setexponent16(x,y)  { (*(short *)&((x)->exp)) = (u16)(y); }
 #define addexponent(x,y)    { (*(short *)&((x)->exp)) += (y); }
 #define stdexp(x)           { (*(short *)&((x)->exp)) += EXTENDED_Ebias; }
 
index 8dc9095bab224daab73338b7551d26b71319b9a2..742619e94bdf281a0dc19a36b1fe2b5a63a19a7b 100644 (file)
@@ -18,7 +18,7 @@
 #include "control_w.h"
 
 #define MAKE_REG(s, e, l, h) { l, h, \
-               ((EXTENDED_Ebias+(e)) | ((SIGN_##s != 0)*0x8000)) }
+               (u16)((EXTENDED_Ebias+(e)) | ((SIGN_##s != 0)*0x8000)) }
 
 FPU_REG const CONST_1 = MAKE_REG(POS, 0, 0x00000000, 0x80000000);
 #if 0
index d1634c59ed561cea4b58c8bd8bd3e2b795a74594..6c46095cd0d95297bb6e894a06b837ada471f320 100644 (file)
@@ -1490,9 +1490,8 @@ good_area:
 NOKPROBE_SYMBOL(do_user_addr_fault);
 
 /*
- * This routine handles page faults.  It determines the address,
- * and the problem, and then passes it off to one of the appropriate
- * routines.
+ * Explicitly marked noinline such that the function tracer sees this as the
+ * page_fault entry point.
  */
 static noinline void
 __do_page_fault(struct pt_regs *regs, unsigned long hw_error_code,
@@ -1511,33 +1510,26 @@ __do_page_fault(struct pt_regs *regs, unsigned long hw_error_code,
 }
 NOKPROBE_SYMBOL(__do_page_fault);
 
-static nokprobe_inline void
-trace_page_fault_entries(unsigned long address, struct pt_regs *regs,
-                        unsigned long error_code)
+static __always_inline void
+trace_page_fault_entries(struct pt_regs *regs, unsigned long error_code,
+                        unsigned long address)
 {
+       if (!trace_pagefault_enabled())
+               return;
+
        if (user_mode(regs))
                trace_page_fault_user(address, regs, error_code);
        else
                trace_page_fault_kernel(address, regs, error_code);
 }
 
-/*
- * We must have this function blacklisted from kprobes, tagged with notrace
- * and call read_cr2() before calling anything else. To avoid calling any
- * kind of tracing machinery before we've observed the CR2 value.
- *
- * exception_{enter,exit}() contains all sorts of tracepoints.
- */
-dotraplinkage void notrace
-do_page_fault(struct pt_regs *regs, unsigned long error_code)
+dotraplinkage void
+do_page_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address)
 {
-       unsigned long address = read_cr2(); /* Get the faulting address */
        enum ctx_state prev_state;
 
        prev_state = exception_enter();
-       if (trace_pagefault_enabled())
-               trace_page_fault_entries(address, regs, error_code);
-
+       trace_page_fault_entries(regs, error_code, address);
        __do_page_fault(regs, error_code, address);
        exception_exit(prev_state);
 }
index e0df96fdfe46c70e1a83e78b4d7056cd0f61ad34..fece30ca8b0cb9fc58d6bb65f2c5a2bc5f4b2b03 100644 (file)
 #include <linux/dma-direct.h>
 #include <linux/swiotlb.h>
 #include <linux/mem_encrypt.h>
+#include <linux/device.h>
+#include <linux/kernel.h>
+#include <linux/bitops.h>
+#include <linux/dma-mapping.h>
 
 #include <asm/tlbflush.h>
 #include <asm/fixmap.h>
@@ -41,7 +45,7 @@ EXPORT_SYMBOL_GPL(sev_enable_key);
 bool sev_enabled __section(.data);
 
 /* Buffer used for early in-place encryption by BSP, no locking needed */
-static char sme_early_buffer[PAGE_SIZE] __aligned(PAGE_SIZE);
+static char sme_early_buffer[PAGE_SIZE] __initdata __aligned(PAGE_SIZE);
 
 /*
  * This routine does not change the underlying encryption setting of the
@@ -348,6 +352,32 @@ bool sev_active(void)
 }
 EXPORT_SYMBOL(sev_active);
 
+/* Override for DMA direct allocation check - ARCH_HAS_FORCE_DMA_UNENCRYPTED */
+bool force_dma_unencrypted(struct device *dev)
+{
+       /*
+        * For SEV, all DMA must be to unencrypted addresses.
+        */
+       if (sev_active())
+               return true;
+
+       /*
+        * For SME, all DMA must be to unencrypted addresses if the
+        * device does not support DMA to addresses that include the
+        * encryption mask.
+        */
+       if (sme_active()) {
+               u64 dma_enc_mask = DMA_BIT_MASK(__ffs64(sme_me_mask));
+               u64 dma_dev_mask = min_not_zero(dev->coherent_dma_mask,
+                                               dev->bus_dma_mask);
+
+               if (dma_dev_mask <= dma_enc_mask)
+                       return true;
+       }
+
+       return false;
+}
+
 /* Architecture __weak replacement functions */
 void __init mem_encrypt_free_decrypted_mem(void)
 {
index bed6bb93c9652cfdc2bc9dbad64ad89ed2f72d2e..7ceb32821093a226995a86e9832c59b9b9d586ae 100644 (file)
@@ -998,7 +998,8 @@ void __init xen_setup_vcpu_info_placement(void)
                        __PV_IS_CALLEE_SAVE(xen_irq_disable_direct);
                pv_ops.irq.irq_enable =
                        __PV_IS_CALLEE_SAVE(xen_irq_enable_direct);
-               pv_ops.mmu.read_cr2 = xen_read_cr2_direct;
+               pv_ops.mmu.read_cr2 =
+                       __PV_IS_CALLEE_SAVE(xen_read_cr2_direct);
        }
 }
 
index f6e5eeecfc69cd2d3bb8644f2c5de4ae7ff8f6fc..26e8b326966dff88a59d03ae26da296aa594ad93 100644 (file)
@@ -1307,16 +1307,6 @@ static void xen_write_cr2(unsigned long cr2)
        this_cpu_read(xen_vcpu)->arch.cr2 = cr2;
 }
 
-static unsigned long xen_read_cr2(void)
-{
-       return this_cpu_read(xen_vcpu)->arch.cr2;
-}
-
-unsigned long xen_read_cr2_direct(void)
-{
-       return this_cpu_read(xen_vcpu_info.arch.cr2);
-}
-
 static noinline void xen_flush_tlb(void)
 {
        struct mmuext_op *op;
@@ -2397,7 +2387,7 @@ static void xen_leave_lazy_mmu(void)
 }
 
 static const struct pv_mmu_ops xen_mmu_ops __initconst = {
-       .read_cr2 = xen_read_cr2,
+       .read_cr2 = __PV_IS_CALLEE_SAVE(xen_read_cr2),
        .write_cr2 = xen_write_cr2,
 
        .read_cr3 = xen_read_cr3,
index 8019edd0125c93d1310c187cf74e6520852c1ef7..be104eef80be61118bbe80fb18bf03aef8db62a8 100644 (file)
@@ -10,6 +10,7 @@
 #include <asm/percpu.h>
 #include <asm/processor-flags.h>
 #include <asm/frame.h>
+#include <asm/asm.h>
 
 #include <linux/linkage.h>
 
@@ -135,3 +136,18 @@ ENTRY(check_events)
        FRAME_END
        ret
 ENDPROC(check_events)
+
+ENTRY(xen_read_cr2)
+       FRAME_BEGIN
+       _ASM_MOV PER_CPU_VAR(xen_vcpu), %_ASM_AX
+       _ASM_MOV XEN_vcpu_info_arch_cr2(%_ASM_AX), %_ASM_AX
+       FRAME_END
+       ret
+       ENDPROC(xen_read_cr2);
+
+ENTRY(xen_read_cr2_direct)
+       FRAME_BEGIN
+       _ASM_MOV PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_arch_cr2, %_ASM_AX
+       FRAME_END
+       ret
+       ENDPROC(xen_read_cr2_direct);
index 2f111f47ba98c961396bab7ba1f209717c280ecf..45a441c33d6dc4213ade35508bf0891ad01600f2 100644 (file)
@@ -134,6 +134,9 @@ __visible void xen_irq_disable_direct(void);
 __visible unsigned long xen_save_fl_direct(void);
 __visible void xen_restore_fl_direct(unsigned long);
 
+__visible unsigned long xen_read_cr2(void);
+__visible unsigned long xen_read_cr2_direct(void);
+
 /* These are not functions, and cannot be called normally */
 __visible void xen_iret(void);
 __visible void xen_sysret32(void);
index 972854ca1d9a32d3faedc02fccfb24d63b3ab9d0..ec1004c858b881d263c15bc6a07e853f769d0332 100644 (file)
@@ -399,8 +399,8 @@ static int __init brcmstb_gisb_arb_probe(struct platform_device *pdev)
                                               &gisb_panic_notifier);
        }
 
-       dev_info(&pdev->dev, "registered mem: %p, irqs: %d, %d\n",
-                       gdev->base, timeout_irq, tea_irq);
+       dev_info(&pdev->dev, "registered irqs: %d, %d\n",
+                timeout_irq, tea_irq);
 
        return 0;
 }
index 1c3f62182266cb020a916f3516b8678374ef20bd..0fe3f52ae0de8fe3dc6799d51d8ce598ab9b740a 100644 (file)
@@ -443,11 +443,31 @@ int dprc_get_obj_region(struct fsl_mc_io *mc_io,
        struct fsl_mc_command cmd = { 0 };
        struct dprc_cmd_get_obj_region *cmd_params;
        struct dprc_rsp_get_obj_region *rsp_params;
+       u16 major_ver, minor_ver;
        int err;
 
        /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_REG,
-                                         cmd_flags, token);
+       err = dprc_get_api_version(mc_io, 0,
+                                    &major_ver,
+                                    &minor_ver);
+       if (err)
+               return err;
+
+       /**
+        * MC API version 6.3 introduced a new field to the region
+        * descriptor: base_address. If the older API is in use then the base
+        * address is set to zero to indicate it needs to be obtained elsewhere
+        * (typically the device tree).
+        */
+       if (major_ver > 6 || (major_ver == 6 && minor_ver >= 3))
+               cmd.header =
+                       mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_REG_V2,
+                                            cmd_flags, token);
+       else
+               cmd.header =
+                       mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_REG,
+                                            cmd_flags, token);
+
        cmd_params = (struct dprc_cmd_get_obj_region *)cmd.params;
        cmd_params->obj_id = cpu_to_le32(obj_id);
        cmd_params->region_index = region_index;
@@ -461,8 +481,12 @@ int dprc_get_obj_region(struct fsl_mc_io *mc_io,
 
        /* retrieve response parameters */
        rsp_params = (struct dprc_rsp_get_obj_region *)cmd.params;
-       region_desc->base_offset = le64_to_cpu(rsp_params->base_addr);
+       region_desc->base_offset = le64_to_cpu(rsp_params->base_offset);
        region_desc->size = le32_to_cpu(rsp_params->size);
+       if (major_ver > 6 || (major_ver == 6 && minor_ver >= 3))
+               region_desc->base_address = le64_to_cpu(rsp_params->base_addr);
+       else
+               region_desc->base_address = 0;
 
        return 0;
 }
index f0404c6d1ff46bd2b5387624156b17cd2cbba598..5c9bf2e0655203b882e4ab563aedf31d1597c6bb 100644 (file)
@@ -487,10 +487,19 @@ static int fsl_mc_device_get_mmio_regions(struct fsl_mc_device *mc_dev,
                                "dprc_get_obj_region() failed: %d\n", error);
                        goto error_cleanup_regions;
                }
-
-               error = translate_mc_addr(mc_dev, mc_region_type,
+               /*
+                * Older MC only returned region offset and no base address
+                * If base address is in the region_desc use it otherwise
+                * revert to old mechanism
+                */
+               if (region_desc.base_address)
+                       regions[i].start = region_desc.base_address +
+                                               region_desc.base_offset;
+               else
+                       error = translate_mc_addr(mc_dev, mc_region_type,
                                          region_desc.base_offset,
                                          &regions[i].start);
+
                if (error < 0) {
                        dev_err(parent_dev,
                                "Invalid MC offset: %#x (for %s.%d\'s region %d)\n",
@@ -504,6 +513,8 @@ static int fsl_mc_device_get_mmio_regions(struct fsl_mc_device *mc_dev,
                regions[i].flags = IORESOURCE_IO;
                if (region_desc.flags & DPRC_REGION_CACHEABLE)
                        regions[i].flags |= IORESOURCE_CACHEABLE;
+               if (region_desc.flags & DPRC_REGION_SHAREABLE)
+                       regions[i].flags |= IORESOURCE_MEM;
        }
 
        mc_dev->regions = regions;
index ea11b4fe59f79559d573a889cde52df123b36ae1..020fcc04ec8bcb16d321d8a7f194b0947050d674 100644 (file)
@@ -79,9 +79,11 @@ int dpmcp_reset(struct fsl_mc_io *mc_io,
 
 /* DPRC command versioning */
 #define DPRC_CMD_BASE_VERSION                  1
+#define DPRC_CMD_2ND_VERSION                   2
 #define DPRC_CMD_ID_OFFSET                     4
 
 #define DPRC_CMD(id)   (((id) << DPRC_CMD_ID_OFFSET) | DPRC_CMD_BASE_VERSION)
+#define DPRC_CMD_V2(id)        (((id) << DPRC_CMD_ID_OFFSET) | DPRC_CMD_2ND_VERSION)
 
 /* DPRC command IDs */
 #define DPRC_CMDID_CLOSE                        DPRC_CMD(0x800)
@@ -100,6 +102,7 @@ int dpmcp_reset(struct fsl_mc_io *mc_io,
 #define DPRC_CMDID_GET_OBJ_COUNT                DPRC_CMD(0x159)
 #define DPRC_CMDID_GET_OBJ                      DPRC_CMD(0x15A)
 #define DPRC_CMDID_GET_OBJ_REG                  DPRC_CMD(0x15E)
+#define DPRC_CMDID_GET_OBJ_REG_V2               DPRC_CMD_V2(0x15E)
 #define DPRC_CMDID_SET_OBJ_IRQ                  DPRC_CMD(0x15F)
 
 struct dprc_cmd_open {
@@ -199,9 +202,16 @@ struct dprc_rsp_get_obj_region {
        /* response word 0 */
        __le64 pad;
        /* response word 1 */
-       __le64 base_addr;
+       __le64 base_offset;
        /* response word 2 */
        __le32 size;
+       __le32 pad2;
+       /* response word 3 */
+       __le32 flags;
+       __le32 pad3;
+       /* response word 4 */
+       /* base_addr may be zero if older MC firmware is used */
+       __le64 base_addr;
 };
 
 struct dprc_cmd_set_obj_irq {
@@ -334,6 +344,7 @@ int dprc_set_obj_irq(struct fsl_mc_io *mc_io,
 /* Region flags */
 /* Cacheable - Indicates that region should be mapped as cacheable */
 #define DPRC_REGION_CACHEABLE  0x00000001
+#define DPRC_REGION_SHAREABLE  0x00000002
 
 /**
  * enum dprc_region_type - Region type
@@ -342,7 +353,8 @@ int dprc_set_obj_irq(struct fsl_mc_io *mc_io,
  */
 enum dprc_region_type {
        DPRC_REGION_TYPE_MC_PORTAL,
-       DPRC_REGION_TYPE_QBMAN_PORTAL
+       DPRC_REGION_TYPE_QBMAN_PORTAL,
+       DPRC_REGION_TYPE_QBMAN_MEM_BACKED_PORTAL
 };
 
 /**
@@ -360,6 +372,7 @@ struct dprc_region_desc {
        u32 size;
        u32 flags;
        enum dprc_region_type type;
+       u64 base_address;
 };
 
 int dprc_get_obj_region(struct fsl_mc_io *mc_io,
index b72741668c927680493369ae2678f12805dca2d4..e6deabd8305d789a9942988f26b6aa584cae2e46 100644 (file)
@@ -71,6 +71,9 @@ static const char * const clock_names[SYSC_MAX_CLOCKS] = {
  * @name: name if available
  * @revision: interconnect target module revision
  * @needs_resume: runtime resume needed on resume from suspend
+ * @clk_enable_quirk: module specific clock enable quirk
+ * @clk_disable_quirk: module specific clock disable quirk
+ * @reset_done_quirk: module specific reset done quirk
  */
 struct sysc {
        struct device *dev;
@@ -89,10 +92,14 @@ struct sysc {
        struct ti_sysc_cookie cookie;
        const char *name;
        u32 revision;
-       bool enabled;
-       bool needs_resume;
-       bool child_needs_resume;
+       unsigned int enabled:1;
+       unsigned int needs_resume:1;
+       unsigned int child_needs_resume:1;
+       unsigned int disable_on_idle:1;
        struct delayed_work idle_work;
+       void (*clk_enable_quirk)(struct sysc *sysc);
+       void (*clk_disable_quirk)(struct sysc *sysc);
+       void (*reset_done_quirk)(struct sysc *sysc);
 };
 
 static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np,
@@ -100,6 +107,20 @@ static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np,
 
 static void sysc_write(struct sysc *ddata, int offset, u32 value)
 {
+       if (ddata->cfg.quirks & SYSC_QUIRK_16BIT) {
+               writew_relaxed(value & 0xffff, ddata->module_va + offset);
+
+               /* Only i2c revision has LO and HI register with stride of 4 */
+               if (ddata->offsets[SYSC_REVISION] >= 0 &&
+                   offset == ddata->offsets[SYSC_REVISION]) {
+                       u16 hi = value >> 16;
+
+                       writew_relaxed(hi, ddata->module_va + offset + 4);
+               }
+
+               return;
+       }
+
        writel_relaxed(value, ddata->module_va + offset);
 }
 
@@ -109,7 +130,14 @@ static u32 sysc_read(struct sysc *ddata, int offset)
                u32 val;
 
                val = readw_relaxed(ddata->module_va + offset);
-               val |= (readw_relaxed(ddata->module_va + offset + 4) << 16);
+
+               /* Only i2c revision has LO and HI register with stride of 4 */
+               if (ddata->offsets[SYSC_REVISION] >= 0 &&
+                   offset == ddata->offsets[SYSC_REVISION]) {
+                       u16 tmp = readw_relaxed(ddata->module_va + offset + 4);
+
+                       val |= tmp << 16;
+               }
 
                return val;
        }
@@ -132,6 +160,26 @@ static u32 sysc_read_revision(struct sysc *ddata)
        return sysc_read(ddata, offset);
 }
 
+static u32 sysc_read_sysconfig(struct sysc *ddata)
+{
+       int offset = ddata->offsets[SYSC_SYSCONFIG];
+
+       if (offset < 0)
+               return 0;
+
+       return sysc_read(ddata, offset);
+}
+
+static u32 sysc_read_sysstatus(struct sysc *ddata)
+{
+       int offset = ddata->offsets[SYSC_SYSSTATUS];
+
+       if (offset < 0)
+               return 0;
+
+       return sysc_read(ddata, offset);
+}
+
 static int sysc_add_named_clock_from_child(struct sysc *ddata,
                                           const char *name,
                                           const char *optfck_name)
@@ -422,6 +470,30 @@ static void sysc_disable_opt_clocks(struct sysc *ddata)
        }
 }
 
+static void sysc_clkdm_deny_idle(struct sysc *ddata)
+{
+       struct ti_sysc_platform_data *pdata;
+
+       if (ddata->legacy_mode)
+               return;
+
+       pdata = dev_get_platdata(ddata->dev);
+       if (pdata && pdata->clkdm_deny_idle)
+               pdata->clkdm_deny_idle(ddata->dev, &ddata->cookie);
+}
+
+static void sysc_clkdm_allow_idle(struct sysc *ddata)
+{
+       struct ti_sysc_platform_data *pdata;
+
+       if (ddata->legacy_mode)
+               return;
+
+       pdata = dev_get_platdata(ddata->dev);
+       if (pdata && pdata->clkdm_allow_idle)
+               pdata->clkdm_allow_idle(ddata->dev, &ddata->cookie);
+}
+
 /**
  * sysc_init_resets - init rstctrl reset line if configured
  * @ddata: device driver data
@@ -431,7 +503,7 @@ static void sysc_disable_opt_clocks(struct sysc *ddata)
 static int sysc_init_resets(struct sysc *ddata)
 {
        ddata->rsts =
-               devm_reset_control_array_get_optional_exclusive(ddata->dev);
+               devm_reset_control_get_optional(ddata->dev, "rstctrl");
        if (IS_ERR(ddata->rsts))
                return PTR_ERR(ddata->rsts);
 
@@ -694,8 +766,11 @@ static int sysc_ioremap(struct sysc *ddata)
                            ddata->offsets[SYSC_SYSCONFIG],
                            ddata->offsets[SYSC_SYSSTATUS]);
 
+               if (size < SZ_1K)
+                       size = SZ_1K;
+
                if ((size + sizeof(u32)) > ddata->module_size)
-                       return -EINVAL;
+                       size = ddata->module_size;
        }
 
        ddata->module_va = devm_ioremap(ddata->dev,
@@ -794,7 +869,9 @@ static void sysc_show_registers(struct sysc *ddata)
 }
 
 #define SYSC_IDLE_MASK (SYSC_NR_IDLEMODES - 1)
+#define SYSC_CLOCACT_ICK       2
 
+/* Caller needs to manage sysc_clkdm_deny_idle() and sysc_clkdm_allow_idle() */
 static int sysc_enable_module(struct device *dev)
 {
        struct sysc *ddata;
@@ -805,23 +882,34 @@ static int sysc_enable_module(struct device *dev)
        if (ddata->offsets[SYSC_SYSCONFIG] == -ENODEV)
                return 0;
 
-       /*
-        * TODO: Need to prevent clockdomain autoidle?
-        * See clkdm_deny_idle() in arch/mach-omap2/omap_hwmod.c
-        */
-
        regbits = ddata->cap->regbits;
        reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);
 
+       /* Set CLOCKACTIVITY, we only use it for ick */
+       if (regbits->clkact_shift >= 0 &&
+           (ddata->cfg.quirks & SYSC_QUIRK_USE_CLOCKACT ||
+            ddata->cfg.sysc_val & BIT(regbits->clkact_shift)))
+               reg |= SYSC_CLOCACT_ICK << regbits->clkact_shift;
+
        /* Set SIDLE mode */
        idlemodes = ddata->cfg.sidlemodes;
        if (!idlemodes || regbits->sidle_shift < 0)
                goto set_midle;
 
-       best_mode = fls(ddata->cfg.sidlemodes) - 1;
-       if (best_mode > SYSC_IDLE_MASK) {
-               dev_err(dev, "%s: invalid sidlemode\n", __func__);
-               return -EINVAL;
+       if (ddata->cfg.quirks & (SYSC_QUIRK_SWSUP_SIDLE |
+                                SYSC_QUIRK_SWSUP_SIDLE_ACT)) {
+               best_mode = SYSC_IDLE_NO;
+       } else {
+               best_mode = fls(ddata->cfg.sidlemodes) - 1;
+               if (best_mode > SYSC_IDLE_MASK) {
+                       dev_err(dev, "%s: invalid sidlemode\n", __func__);
+                       return -EINVAL;
+               }
+
+               /* Set WAKEUP */
+               if (regbits->enwkup_shift >= 0 &&
+                   ddata->cfg.sysc_val & BIT(regbits->enwkup_shift))
+                       reg |= BIT(regbits->enwkup_shift);
        }
 
        reg &= ~(SYSC_IDLE_MASK << regbits->sidle_shift);
@@ -832,7 +920,7 @@ set_midle:
        /* Set MIDLE mode */
        idlemodes = ddata->cfg.midlemodes;
        if (!idlemodes || regbits->midle_shift < 0)
-               return 0;
+               goto set_autoidle;
 
        best_mode = fls(ddata->cfg.midlemodes) - 1;
        if (best_mode > SYSC_IDLE_MASK) {
@@ -844,6 +932,14 @@ set_midle:
        reg |= best_mode << regbits->midle_shift;
        sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg);
 
+set_autoidle:
+       /* Autoidle bit must enabled separately if available */
+       if (regbits->autoidle_shift >= 0 &&
+           ddata->cfg.sysc_val & BIT(regbits->autoidle_shift)) {
+               reg |= 1 << regbits->autoidle_shift;
+               sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg);
+       }
+
        return 0;
 }
 
@@ -861,6 +957,7 @@ static int sysc_best_idle_mode(u32 idlemodes, u32 *best_mode)
        return 0;
 }
 
+/* Caller needs to manage sysc_clkdm_deny_idle() and sysc_clkdm_allow_idle() */
 static int sysc_disable_module(struct device *dev)
 {
        struct sysc *ddata;
@@ -872,11 +969,6 @@ static int sysc_disable_module(struct device *dev)
        if (ddata->offsets[SYSC_SYSCONFIG] == -ENODEV)
                return 0;
 
-       /*
-        * TODO: Need to prevent clockdomain autoidle?
-        * See clkdm_deny_idle() in arch/mach-omap2/omap_hwmod.c
-        */
-
        regbits = ddata->cap->regbits;
        reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);
 
@@ -901,14 +993,21 @@ set_sidle:
        if (!idlemodes || regbits->sidle_shift < 0)
                return 0;
 
-       ret = sysc_best_idle_mode(idlemodes, &best_mode);
-       if (ret) {
-               dev_err(dev, "%s: invalid sidlemode\n", __func__);
-               return ret;
+       if (ddata->cfg.quirks & SYSC_QUIRK_SWSUP_SIDLE) {
+               best_mode = SYSC_IDLE_FORCE;
+       } else {
+               ret = sysc_best_idle_mode(idlemodes, &best_mode);
+               if (ret) {
+                       dev_err(dev, "%s: invalid sidlemode\n", __func__);
+                       return ret;
+               }
        }
 
        reg &= ~(SYSC_IDLE_MASK << regbits->sidle_shift);
        reg |= best_mode << regbits->sidle_shift;
+       if (regbits->autoidle_shift >= 0 &&
+           ddata->cfg.sysc_val & BIT(regbits->autoidle_shift))
+               reg |= 1 << regbits->autoidle_shift;
        sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg);
 
        return 0;
@@ -932,6 +1031,9 @@ static int __maybe_unused sysc_runtime_suspend_legacy(struct device *dev,
                dev_err(dev, "%s: could not idle: %i\n",
                        __func__, error);
 
+       if (ddata->disable_on_idle)
+               reset_control_assert(ddata->rsts);
+
        return 0;
 }
 
@@ -941,6 +1043,9 @@ static int __maybe_unused sysc_runtime_resume_legacy(struct device *dev,
        struct ti_sysc_platform_data *pdata;
        int error;
 
+       if (ddata->disable_on_idle)
+               reset_control_deassert(ddata->rsts);
+
        pdata = dev_get_platdata(ddata->dev);
        if (!pdata)
                return 0;
@@ -966,14 +1071,16 @@ static int __maybe_unused sysc_runtime_suspend(struct device *dev)
        if (!ddata->enabled)
                return 0;
 
+       sysc_clkdm_deny_idle(ddata);
+
        if (ddata->legacy_mode) {
                error = sysc_runtime_suspend_legacy(dev, ddata);
                if (error)
-                       return error;
+                       goto err_allow_idle;
        } else {
                error = sysc_disable_module(dev);
                if (error)
-                       return error;
+                       goto err_allow_idle;
        }
 
        sysc_disable_main_clocks(ddata);
@@ -983,6 +1090,12 @@ static int __maybe_unused sysc_runtime_suspend(struct device *dev)
 
        ddata->enabled = false;
 
+err_allow_idle:
+       sysc_clkdm_allow_idle(ddata);
+
+       if (ddata->disable_on_idle)
+               reset_control_assert(ddata->rsts);
+
        return error;
 }
 
@@ -996,10 +1109,15 @@ static int __maybe_unused sysc_runtime_resume(struct device *dev)
        if (ddata->enabled)
                return 0;
 
+       if (ddata->disable_on_idle)
+               reset_control_deassert(ddata->rsts);
+
+       sysc_clkdm_deny_idle(ddata);
+
        if (sysc_opt_clks_needed(ddata)) {
                error = sysc_enable_opt_clocks(ddata);
                if (error)
-                       return error;
+                       goto err_allow_idle;
        }
 
        error = sysc_enable_main_clocks(ddata);
@@ -1018,6 +1136,8 @@ static int __maybe_unused sysc_runtime_resume(struct device *dev)
 
        ddata->enabled = true;
 
+       sysc_clkdm_allow_idle(ddata);
+
        return 0;
 
 err_main_clocks:
@@ -1025,6 +1145,8 @@ err_main_clocks:
 err_opt_clocks:
        if (sysc_opt_clks_needed(ddata))
                sysc_disable_opt_clocks(ddata);
+err_allow_idle:
+       sysc_clkdm_allow_idle(ddata);
 
        return error;
 }
@@ -1106,8 +1228,10 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
                   0),
        SYSC_QUIRK("timer", 0, 0, 0x10, -1, 0x4fff1301, 0xffff00ff,
                   0),
+       SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000046, 0xffffffff,
+                  SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
        SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000052, 0xffffffff,
-                  SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE),
+                  SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_LEGACY_IDLE),
        /* Uarts on omap4 and later */
        SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x50411e03, 0xffff00ff,
                   SYSC_QUIRK_SWSUP_SIDLE_ACT | SYSC_QUIRK_LEGACY_IDLE),
@@ -1119,6 +1243,22 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
                   SYSC_QUIRK_EXT_OPT_CLOCK | SYSC_QUIRK_NO_RESET_ON_INIT |
                   SYSC_QUIRK_SWSUP_SIDLE),
 
+       /* Quirks that need to be set based on detected module */
+       SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x00000006, 0xffffffff,
+                  SYSC_MODULE_QUIRK_HDQ1W),
+       SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x0000000a, 0xffffffff,
+                  SYSC_MODULE_QUIRK_HDQ1W),
+       SYSC_QUIRK("i2c", 0, 0, 0x20, 0x10, 0x00000036, 0x000000ff,
+                  SYSC_MODULE_QUIRK_I2C),
+       SYSC_QUIRK("i2c", 0, 0, 0x20, 0x10, 0x0000003c, 0x000000ff,
+                  SYSC_MODULE_QUIRK_I2C),
+       SYSC_QUIRK("i2c", 0, 0, 0x20, 0x10, 0x00000040, 0x000000ff,
+                  SYSC_MODULE_QUIRK_I2C),
+       SYSC_QUIRK("i2c", 0, 0, 0x10, 0x90, 0x5040000a, 0xfffff0f0,
+                  SYSC_MODULE_QUIRK_I2C),
+       SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0,
+                  SYSC_MODULE_QUIRK_WDT),
+
 #ifdef DEBUG
        SYSC_QUIRK("adc", 0, 0, 0x10, -1, 0x47300001, 0xffffffff, 0),
        SYSC_QUIRK("atl", 0, 0, -1, -1, 0x0a070100, 0xffffffff, 0),
@@ -1132,11 +1272,8 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
        SYSC_QUIRK("dwc3", 0, 0, 0x10, -1, 0x500a0200, 0xffffffff, 0),
        SYSC_QUIRK("epwmss", 0, 0, 0x4, -1, 0x47400001, 0xffffffff, 0),
        SYSC_QUIRK("gpu", 0, 0x1fc00, 0x1fc10, -1, 0, 0, 0),
-       SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x00000006, 0xffffffff, 0),
-       SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x0000000a, 0xffffffff, 0),
        SYSC_QUIRK("hsi", 0, 0, 0x10, 0x14, 0x50043101, 0xffffffff, 0),
        SYSC_QUIRK("iss", 0, 0, 0x10, -1, 0x40000101, 0xffffffff, 0),
-       SYSC_QUIRK("i2c", 0, 0, 0x10, 0x90, 0x5040000a, 0xfffff0f0, 0),
        SYSC_QUIRK("lcdc", 0, 0, 0x54, -1, 0x4f201000, 0xffffffff, 0),
        SYSC_QUIRK("mcasp", 0, 0, 0x4, -1, 0x44306302, 0xffffffff, 0),
        SYSC_QUIRK("mcasp", 0, 0, 0x4, -1, 0x44307b02, 0xffffffff, 0),
@@ -1172,7 +1309,6 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
        SYSC_QUIRK("usb_host_hs", 0, 0, 0x10, -1, 0x50700101, 0xffffffff, 0),
        SYSC_QUIRK("usb_otg_hs", 0, 0x400, 0x404, 0x408, 0x00000050,
                   0xffffffff, 0),
-       SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0, 0),
        SYSC_QUIRK("vfpe", 0, 0, 0x104, -1, 0x4d001200, 0xffffffff, 0),
 #endif
 };
@@ -1245,6 +1381,121 @@ static void sysc_init_revision_quirks(struct sysc *ddata)
        }
 }
 
+/* 1-wire needs module's internal clocks enabled for reset */
+static void sysc_clk_enable_quirk_hdq1w(struct sysc *ddata)
+{
+       int offset = 0x0c;      /* HDQ_CTRL_STATUS */
+       u16 val;
+
+       val = sysc_read(ddata, offset);
+       val |= BIT(5);
+       sysc_write(ddata, offset, val);
+}
+
+/* I2C needs extra enable bit toggling for reset */
+static void sysc_clk_quirk_i2c(struct sysc *ddata, bool enable)
+{
+       int offset;
+       u16 val;
+
+       /* I2C_CON, omap2/3 is different from omap4 and later */
+       if ((ddata->revision & 0xffffff00) == 0x001f0000)
+               offset = 0x24;
+       else
+               offset = 0xa4;
+
+       /* I2C_EN */
+       val = sysc_read(ddata, offset);
+       if (enable)
+               val |= BIT(15);
+       else
+               val &= ~BIT(15);
+       sysc_write(ddata, offset, val);
+}
+
+static void sysc_clk_enable_quirk_i2c(struct sysc *ddata)
+{
+       sysc_clk_quirk_i2c(ddata, true);
+}
+
+static void sysc_clk_disable_quirk_i2c(struct sysc *ddata)
+{
+       sysc_clk_quirk_i2c(ddata, false);
+}
+
+/* Watchdog timer needs a disable sequence after reset */
+static void sysc_reset_done_quirk_wdt(struct sysc *ddata)
+{
+       int wps, spr, error;
+       u32 val;
+
+       wps = 0x34;
+       spr = 0x48;
+
+       sysc_write(ddata, spr, 0xaaaa);
+       error = readl_poll_timeout(ddata->module_va + wps, val,
+                                  !(val & 0x10), 100,
+                                  MAX_MODULE_SOFTRESET_WAIT);
+       if (error)
+               dev_warn(ddata->dev, "wdt disable spr failed\n");
+
+       sysc_write(ddata, wps, 0x5555);
+       error = readl_poll_timeout(ddata->module_va + wps, val,
+                                  !(val & 0x10), 100,
+                                  MAX_MODULE_SOFTRESET_WAIT);
+       if (error)
+               dev_warn(ddata->dev, "wdt disable wps failed\n");
+}
+
+static void sysc_init_module_quirks(struct sysc *ddata)
+{
+       if (ddata->legacy_mode || !ddata->name)
+               return;
+
+       if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_HDQ1W) {
+               ddata->clk_enable_quirk = sysc_clk_enable_quirk_hdq1w;
+
+               return;
+       }
+
+       if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_I2C) {
+               ddata->clk_enable_quirk = sysc_clk_enable_quirk_i2c;
+               ddata->clk_disable_quirk = sysc_clk_disable_quirk_i2c;
+
+               return;
+       }
+
+       if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_WDT)
+               ddata->reset_done_quirk = sysc_reset_done_quirk_wdt;
+}
+
+static int sysc_clockdomain_init(struct sysc *ddata)
+{
+       struct ti_sysc_platform_data *pdata = dev_get_platdata(ddata->dev);
+       struct clk *fck = NULL, *ick = NULL;
+       int error;
+
+       if (!pdata || !pdata->init_clockdomain)
+               return 0;
+
+       switch (ddata->nr_clocks) {
+       case 2:
+               ick = ddata->clocks[SYSC_ICK];
+               /* fallthrough */
+       case 1:
+               fck = ddata->clocks[SYSC_FCK];
+               break;
+       case 0:
+               return 0;
+       }
+
+       error = pdata->init_clockdomain(ddata->dev, fck, ick, &ddata->cookie);
+       if (!error || error == -ENODEV)
+               return 0;
+
+       return error;
+}
+
 /*
  * Note that pdata->init_module() typically does a reset first. After
  * pdata->init_module() is done, PM runtime can be used for the interconnect
@@ -1255,7 +1506,7 @@ static int sysc_legacy_init(struct sysc *ddata)
        struct ti_sysc_platform_data *pdata = dev_get_platdata(ddata->dev);
        int error;
 
-       if (!ddata->legacy_mode || !pdata || !pdata->init_module)
+       if (!pdata || !pdata->init_module)
                return 0;
 
        error = pdata->init_module(ddata->dev, ddata->mdata, &ddata->cookie);
@@ -1280,7 +1531,7 @@ static int sysc_legacy_init(struct sysc *ddata)
  */
 static int sysc_rstctrl_reset_deassert(struct sysc *ddata, bool reset)
 {
-       int error;
+       int error, val;
 
        if (!ddata->rsts)
                return 0;
@@ -1291,37 +1542,68 @@ static int sysc_rstctrl_reset_deassert(struct sysc *ddata, bool reset)
                        return error;
        }
 
-       return reset_control_deassert(ddata->rsts);
+       error = reset_control_deassert(ddata->rsts);
+       if (error == -EEXIST)
+               return 0;
+
+       error = readx_poll_timeout(reset_control_status, ddata->rsts, val,
+                                  val == 0, 100, MAX_MODULE_SOFTRESET_WAIT);
+
+       return error;
 }
 
+/*
+ * Note that the caller must ensure the interconnect target module is enabled
+ * before calling reset. Otherwise reset will not complete.
+ */
 static int sysc_reset(struct sysc *ddata)
 {
-       int offset = ddata->offsets[SYSC_SYSCONFIG];
-       int val;
+       int sysc_offset, syss_offset, sysc_val, rstval, quirks, error = 0;
+       u32 sysc_mask, syss_done;
+
+       sysc_offset = ddata->offsets[SYSC_SYSCONFIG];
+       syss_offset = ddata->offsets[SYSC_SYSSTATUS];
+       quirks = ddata->cfg.quirks;
 
-       if (ddata->legacy_mode || offset < 0 ||
+       if (ddata->legacy_mode || sysc_offset < 0 ||
+           ddata->cap->regbits->srst_shift < 0 ||
            ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT)
                return 0;
 
-       /*
-        * Currently only support reset status in sysstatus.
-        * Warn and return error in all other cases
-        */
-       if (!ddata->cfg.syss_mask) {
-               dev_err(ddata->dev, "No ti,syss-mask. Reset failed\n");
-               return -EINVAL;
-       }
+       sysc_mask = BIT(ddata->cap->regbits->srst_shift);
 
-       val = sysc_read(ddata, offset);
-       val |= (0x1 << ddata->cap->regbits->srst_shift);
-       sysc_write(ddata, offset, val);
+       if (ddata->cfg.quirks & SYSS_QUIRK_RESETDONE_INVERTED)
+               syss_done = 0;
+       else
+               syss_done = ddata->cfg.syss_mask;
+
+       if (ddata->clk_disable_quirk)
+               ddata->clk_disable_quirk(ddata);
+
+       sysc_val = sysc_read_sysconfig(ddata);
+       sysc_val |= sysc_mask;
+       sysc_write(ddata, sysc_offset, sysc_val);
+
+       if (ddata->clk_enable_quirk)
+               ddata->clk_enable_quirk(ddata);
 
        /* Poll on reset status */
-       offset = ddata->offsets[SYSC_SYSSTATUS];
+       if (syss_offset >= 0) {
+               error = readx_poll_timeout(sysc_read_sysstatus, ddata, rstval,
+                                          (rstval & ddata->cfg.syss_mask) ==
+                                          syss_done,
+                                          100, MAX_MODULE_SOFTRESET_WAIT);
+
+       } else if (ddata->cfg.quirks & SYSC_QUIRK_RESET_STATUS) {
+               error = readx_poll_timeout(sysc_read_sysconfig, ddata, rstval,
+                                          !(rstval & sysc_mask),
+                                          100, MAX_MODULE_SOFTRESET_WAIT);
+       }
+
+       if (ddata->reset_done_quirk)
+               ddata->reset_done_quirk(ddata);
 
-       return readl_poll_timeout(ddata->module_va + offset, val,
-                                 (val & ddata->cfg.syss_mask) == 0x0,
-                                 100, MAX_MODULE_SOFTRESET_WAIT);
+       return error;
 }
 
 /*
@@ -1334,12 +1616,8 @@ static int sysc_init_module(struct sysc *ddata)
 {
        int error = 0;
        bool manage_clocks = true;
-       bool reset = true;
-
-       if (ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT)
-               reset = false;
 
-       error = sysc_rstctrl_reset_deassert(ddata, reset);
+       error = sysc_rstctrl_reset_deassert(ddata, false);
        if (error)
                return error;
 
@@ -1347,7 +1625,13 @@ static int sysc_init_module(struct sysc *ddata)
            (SYSC_QUIRK_NO_IDLE | SYSC_QUIRK_NO_IDLE_ON_INIT))
                manage_clocks = false;
 
+       error = sysc_clockdomain_init(ddata);
+       if (error)
+               return error;
+
        if (manage_clocks) {
+               sysc_clkdm_deny_idle(ddata);
+
                error = sysc_enable_opt_clocks(ddata);
                if (error)
                        return error;
@@ -1357,23 +1641,43 @@ static int sysc_init_module(struct sysc *ddata)
                        goto err_opt_clocks;
        }
 
+       if (!(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT)) {
+               error = sysc_rstctrl_reset_deassert(ddata, true);
+               if (error)
+                       goto err_main_clocks;
+       }
+
        ddata->revision = sysc_read_revision(ddata);
        sysc_init_revision_quirks(ddata);
+       sysc_init_module_quirks(ddata);
 
-       error = sysc_legacy_init(ddata);
-       if (error)
-               goto err_main_clocks;
+       if (ddata->legacy_mode) {
+               error = sysc_legacy_init(ddata);
+               if (error)
+                       goto err_main_clocks;
+       }
+
+       if (!ddata->legacy_mode && manage_clocks) {
+               error = sysc_enable_module(ddata->dev);
+               if (error)
+                       goto err_main_clocks;
+       }
 
        error = sysc_reset(ddata);
        if (error)
                dev_err(ddata->dev, "Reset failed with %d\n", error);
 
+       if (!ddata->legacy_mode && manage_clocks)
+               sysc_disable_module(ddata->dev);
+
 err_main_clocks:
        if (manage_clocks)
                sysc_disable_main_clocks(ddata);
 err_opt_clocks:
-       if (manage_clocks)
+       if (manage_clocks) {
                sysc_disable_opt_clocks(ddata);
+               sysc_clkdm_allow_idle(ddata);
+       }
 
        return error;
 }
@@ -1663,9 +1967,6 @@ static struct dev_pm_domain sysc_child_pm_domain = {
  */
 static void sysc_legacy_idle_quirk(struct sysc *ddata, struct device *child)
 {
-       if (!ddata->legacy_mode)
-               return;
-
        if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE)
                dev_pm_domain_set(child, &sysc_child_pm_domain);
 }
@@ -2005,6 +2306,7 @@ static const struct sysc_capabilities sysc_dra7_mcan = {
        .type = TI_SYSC_DRA7_MCAN,
        .sysc_mask = SYSC_DRA7_MCAN_ENAWAKEUP | SYSC_OMAP4_SOFTRESET,
        .regbits = &sysc_regbits_dra7_mcan,
+       .mod_quirks = SYSS_QUIRK_RESETDONE_INVERTED,
 };
 
 static int sysc_init_pdata(struct sysc *ddata)
@@ -2012,20 +2314,22 @@ static int sysc_init_pdata(struct sysc *ddata)
        struct ti_sysc_platform_data *pdata = dev_get_platdata(ddata->dev);
        struct ti_sysc_module_data *mdata;
 
-       if (!pdata || !ddata->legacy_mode)
+       if (!pdata)
                return 0;
 
        mdata = devm_kzalloc(ddata->dev, sizeof(*mdata), GFP_KERNEL);
        if (!mdata)
                return -ENOMEM;
 
-       mdata->name = ddata->legacy_mode;
-       mdata->module_pa = ddata->module_pa;
-       mdata->module_size = ddata->module_size;
-       mdata->offsets = ddata->offsets;
-       mdata->nr_offsets = SYSC_MAX_REGS;
-       mdata->cap = ddata->cap;
-       mdata->cfg = &ddata->cfg;
+       if (ddata->legacy_mode) {
+               mdata->name = ddata->legacy_mode;
+               mdata->module_pa = ddata->module_pa;
+               mdata->module_size = ddata->module_size;
+               mdata->offsets = ddata->offsets;
+               mdata->nr_offsets = SYSC_MAX_REGS;
+               mdata->cap = ddata->cap;
+               mdata->cfg = &ddata->cfg;
+       }
 
        ddata->mdata = mdata;
 
@@ -2145,7 +2449,7 @@ static int sysc_probe(struct platform_device *pdev)
        }
 
        if (!of_get_available_child_count(ddata->dev->of_node))
-               reset_control_assert(ddata->rsts);
+               ddata->disable_on_idle = true;
 
        return 0;
 
index 23553ed6b548063df3a39139994b0eaf722cbd8d..2d22d6bf52f25a074728d1650541f2c39b1f3383 100644 (file)
@@ -248,16 +248,12 @@ static int __maybe_unused cn_proc_show(struct seq_file *m, void *v)
        return 0;
 }
 
-static struct cn_dev cdev = {
-       .input   = cn_rx_skb,
-};
-
 static int cn_init(void)
 {
        struct cn_dev *dev = &cdev;
        struct netlink_kernel_cfg cfg = {
                .groups = CN_NETLINK_USERS + 0xf,
-               .input  = dev->input,
+               .input  = cn_rx_skb,
        };
 
        dev->nls = netlink_kernel_create(&init_net, NETLINK_CONNECTOR, &cfg);
index 30fc04e284312e9f19c165994dad1170966304b8..0a194af924385bac2019bf976d7e6e8263db9eeb 100644 (file)
@@ -185,6 +185,8 @@ scmi_clock_describe_rates_get(const struct scmi_handle *handle, u32 clk_id,
        if (rate_discrete)
                clk->list.num_rates = tot_rate_cnt;
 
+       clk->rate_discrete = rate_discrete;
+
 err:
        scmi_xfer_put(handle, t);
        return ret;
index b53d5cc9c9f6c57ebae04f6a43e42fb814fc27d9..0e94ab56f679834ca0fb89b772c01861a6a8768c 100644 (file)
@@ -30,10 +30,12 @@ struct scmi_msg_resp_sensor_description {
                __le32 id;
                __le32 attributes_low;
 #define SUPPORTS_ASYNC_READ(x) ((x) & BIT(31))
-#define NUM_TRIP_POINTS(x)     (((x) >> 4) & 0xff)
+#define NUM_TRIP_POINTS(x)     ((x) & 0xff)
                __le32 attributes_high;
 #define SENSOR_TYPE(x)         ((x) & 0xff)
-#define SENSOR_SCALE(x)                (((x) >> 11) & 0x3f)
+#define SENSOR_SCALE(x)                (((x) >> 11) & 0x1f)
+#define SENSOR_SCALE_SIGN      BIT(4)
+#define SENSOR_SCALE_EXTEND    GENMASK(7, 5)
 #define SENSOR_UPDATE_SCALE(x) (((x) >> 22) & 0x1f)
 #define SENSOR_UPDATE_BASE(x)  (((x) >> 27) & 0x1f)
                    u8 name[SCMI_MAX_STR_SIZE];
@@ -140,6 +142,10 @@ static int scmi_sensor_description_get(const struct scmi_handle *handle,
                        s = &si->sensors[desc_index + cnt];
                        s->id = le32_to_cpu(buf->desc[cnt].id);
                        s->type = SENSOR_TYPE(attrh);
+                       s->scale = SENSOR_SCALE(attrh);
+                       /* Sign extend to a full s8 */
+                       if (s->scale & SENSOR_SCALE_SIGN)
+                               s->scale |= SENSOR_SCALE_EXTEND;
                        strlcpy(s->name, buf->desc[cnt].name, SCMI_MAX_STR_SIZE);
                }
 
index 08c85099d4d0cf8d1d9ebcd074d5d501497484b2..f3659443f8c2cc14ee46cc878f977eb8f9434685 100644 (file)
@@ -359,16 +359,16 @@ static int suspend_test_thread(void *arg)
        for (;;) {
                /* Needs to be set first to avoid missing a wakeup. */
                set_current_state(TASK_INTERRUPTIBLE);
-               if (kthread_should_stop()) {
-                       __set_current_state(TASK_RUNNING);
+               if (kthread_should_park())
                        break;
-               }
                schedule();
        }
 
        pr_info("CPU %d suspend test results: success %d, shallow states %d, errors %d\n",
                cpu, nb_suspend, nb_shallow_sleep, nb_err);
 
+       kthread_parkme();
+
        return nb_err;
 }
 
@@ -433,8 +433,10 @@ static int suspend_tests(void)
 
 
        /* Stop and destroy all threads, get return status. */
-       for (i = 0; i < nb_threads; ++i)
+       for (i = 0; i < nb_threads; ++i) {
+               err += kthread_park(threads[i]);
                err += kthread_stop(threads[i]);
+       }
  out:
        cpuidle_resume_and_unlock();
        kfree(threads);
index 2418abfe1fb6d6b1c18befc1a402b3162b9d3ba8..19c56133234b335e42982ac7bdea6d9f74d57efb 100644 (file)
@@ -803,7 +803,9 @@ static int __maybe_unused tegra_bpmp_resume(struct device *dev)
                return 0;
 }
 
-static SIMPLE_DEV_PM_OPS(tegra_bpmp_pm_ops, NULL, tegra_bpmp_resume);
+static const struct dev_pm_ops tegra_bpmp_pm_ops = {
+       .resume_early = tegra_bpmp_resume,
+};
 
 #if IS_ENABLED(CONFIG_ARCH_TEGRA_186_SOC) || \
     IS_ENABLED(CONFIG_ARCH_TEGRA_194_SOC)
index 7696c692ad5a557848767450d02d070e7d9507f5..cdee0b45943d2bfb3103736b9a80b66d878c4e97 100644 (file)
@@ -466,9 +466,9 @@ static int ti_sci_cmd_get_revision(struct ti_sci_info *info)
        struct ti_sci_xfer *xfer;
        int ret;
 
-       /* No need to setup flags since it is expected to respond */
        xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_VERSION,
-                                  0x0, sizeof(struct ti_sci_msg_hdr),
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(struct ti_sci_msg_hdr),
                                   sizeof(*rev_info));
        if (IS_ERR(xfer)) {
                ret = PTR_ERR(xfer);
@@ -596,9 +596,9 @@ static int ti_sci_get_device_state(const struct ti_sci_handle *handle,
        info = handle_to_ti_sci_info(handle);
        dev = info->dev;
 
-       /* Response is expected, so need of any flags */
        xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_GET_DEVICE_STATE,
-                                  0, sizeof(*req), sizeof(*resp));
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(*req), sizeof(*resp));
        if (IS_ERR(xfer)) {
                ret = PTR_ERR(xfer);
                dev_err(dev, "Message alloc failed(%d)\n", ret);
@@ -2057,122 +2057,175 @@ static int ti_sci_cmd_free_event_map(const struct ti_sci_handle *handle,
                               ia_id, vint, global_event, vint_status_bit, 0);
 }
 
-/*
- * ti_sci_setup_ops() - Setup the operations structures
- * @info:      pointer to TISCI pointer
+/**
+ * ti_sci_cmd_ring_config() - configure RA ring
+ * @handle:            Pointer to TI SCI handle.
+ * @valid_params:      Bitfield defining validity of ring configuration
+ *                     parameters
+ * @nav_id:            Device ID of Navigator Subsystem from which the ring is
+ *                     allocated
+ * @index:             Ring index
+ * @addr_lo:           The ring base address lo 32 bits
+ * @addr_hi:           The ring base address hi 32 bits
+ * @count:             Number of ring elements
+ * @mode:              The mode of the ring
+ * @size:              The ring element size.
+ * @order_id:          Specifies the ring's bus order ID
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ *
+ * See @ti_sci_msg_rm_ring_cfg_req for more info.
  */
-static void ti_sci_setup_ops(struct ti_sci_info *info)
+static int ti_sci_cmd_ring_config(const struct ti_sci_handle *handle,
+                                 u32 valid_params, u16 nav_id, u16 index,
+                                 u32 addr_lo, u32 addr_hi, u32 count,
+                                 u8 mode, u8 size, u8 order_id)
 {
-       struct ti_sci_ops *ops = &info->handle.ops;
-       struct ti_sci_core_ops *core_ops = &ops->core_ops;
-       struct ti_sci_dev_ops *dops = &ops->dev_ops;
-       struct ti_sci_clk_ops *cops = &ops->clk_ops;
-       struct ti_sci_rm_core_ops *rm_core_ops = &ops->rm_core_ops;
-       struct ti_sci_rm_irq_ops *iops = &ops->rm_irq_ops;
-
-       core_ops->reboot_device = ti_sci_cmd_core_reboot;
-
-       dops->get_device = ti_sci_cmd_get_device;
-       dops->idle_device = ti_sci_cmd_idle_device;
-       dops->put_device = ti_sci_cmd_put_device;
+       struct ti_sci_msg_rm_ring_cfg_req *req;
+       struct ti_sci_msg_hdr *resp;
+       struct ti_sci_xfer *xfer;
+       struct ti_sci_info *info;
+       struct device *dev;
+       int ret = 0;
 
-       dops->is_valid = ti_sci_cmd_dev_is_valid;
-       dops->get_context_loss_count = ti_sci_cmd_dev_get_clcnt;
-       dops->is_idle = ti_sci_cmd_dev_is_idle;
-       dops->is_stop = ti_sci_cmd_dev_is_stop;
-       dops->is_on = ti_sci_cmd_dev_is_on;
-       dops->is_transitioning = ti_sci_cmd_dev_is_trans;
-       dops->set_device_resets = ti_sci_cmd_set_device_resets;
-       dops->get_device_resets = ti_sci_cmd_get_device_resets;
+       if (IS_ERR_OR_NULL(handle))
+               return -EINVAL;
 
-       cops->get_clock = ti_sci_cmd_get_clock;
-       cops->idle_clock = ti_sci_cmd_idle_clock;
-       cops->put_clock = ti_sci_cmd_put_clock;
-       cops->is_auto = ti_sci_cmd_clk_is_auto;
-       cops->is_on = ti_sci_cmd_clk_is_on;
-       cops->is_off = ti_sci_cmd_clk_is_off;
+       info = handle_to_ti_sci_info(handle);
+       dev = info->dev;
 
-       cops->set_parent = ti_sci_cmd_clk_set_parent;
-       cops->get_parent = ti_sci_cmd_clk_get_parent;
-       cops->get_num_parents = ti_sci_cmd_clk_get_num_parents;
+       xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_RM_RING_CFG,
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(*req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev, "RM_RA:Message config failed(%d)\n", ret);
+               return ret;
+       }
+       req = (struct ti_sci_msg_rm_ring_cfg_req *)xfer->xfer_buf;
+       req->valid_params = valid_params;
+       req->nav_id = nav_id;
+       req->index = index;
+       req->addr_lo = addr_lo;
+       req->addr_hi = addr_hi;
+       req->count = count;
+       req->mode = mode;
+       req->size = size;
+       req->order_id = order_id;
 
-       cops->get_best_match_freq = ti_sci_cmd_clk_get_match_freq;
-       cops->set_freq = ti_sci_cmd_clk_set_freq;
-       cops->get_freq = ti_sci_cmd_clk_get_freq;
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "RM_RA:Mbox config send fail %d\n", ret);
+               goto fail;
+       }
 
-       rm_core_ops->get_range = ti_sci_cmd_get_resource_range;
-       rm_core_ops->get_range_from_shost =
-                               ti_sci_cmd_get_resource_range_from_shost;
+       resp = (struct ti_sci_msg_hdr *)xfer->xfer_buf;
+       ret = ti_sci_is_response_ack(resp) ? 0 : -ENODEV;
 
-       iops->set_irq = ti_sci_cmd_set_irq;
-       iops->set_event_map = ti_sci_cmd_set_event_map;
-       iops->free_irq = ti_sci_cmd_free_irq;
-       iops->free_event_map = ti_sci_cmd_free_event_map;
+fail:
+       ti_sci_put_one_xfer(&info->minfo, xfer);
+       dev_dbg(dev, "RM_RA:config ring %u ret:%d\n", index, ret);
+       return ret;
 }
 
 /**
- * ti_sci_get_handle() - Get the TI SCI handle for a device
- * @dev:       Pointer to device for which we want SCI handle
+ * ti_sci_cmd_ring_get_config() - get RA ring configuration
+ * @handle:    Pointer to TI SCI handle.
+ * @nav_id:    Device ID of Navigator Subsystem from which the ring is
+ *             allocated
+ * @index:     Ring index
+ * @addr_lo:   Returns ring's base address lo 32 bits
+ * @addr_hi:   Returns ring's base address hi 32 bits
+ * @count:     Returns number of ring elements
+ * @mode:      Returns mode of the ring
+ * @size:      Returns ring element size
+ * @order_id:  Returns ring's bus order ID
  *
- * NOTE: The function does not track individual clients of the framework
- * and is expected to be maintained by caller of TI SCI protocol library.
- * ti_sci_put_handle must be balanced with successful ti_sci_get_handle
- * Return: pointer to handle if successful, else:
- * -EPROBE_DEFER if the instance is not ready
- * -ENODEV if the required node handler is missing
- * -EINVAL if invalid conditions are encountered.
+ * Return: 0 if all went well, else returns appropriate error value.
+ *
+ * See @ti_sci_msg_rm_ring_get_cfg_req for more info.
  */
-const struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
+static int ti_sci_cmd_ring_get_config(const struct ti_sci_handle *handle,
+                                     u32 nav_id, u32 index, u8 *mode,
+                                     u32 *addr_lo, u32 *addr_hi,
+                                     u32 *count, u8 *size, u8 *order_id)
 {
-       struct device_node *ti_sci_np;
-       struct list_head *p;
-       struct ti_sci_handle *handle = NULL;
+       struct ti_sci_msg_rm_ring_get_cfg_resp *resp;
+       struct ti_sci_msg_rm_ring_get_cfg_req *req;
+       struct ti_sci_xfer *xfer;
        struct ti_sci_info *info;
+       struct device *dev;
+       int ret = 0;
 
-       if (!dev) {
-               pr_err("I need a device pointer\n");
-               return ERR_PTR(-EINVAL);
-       }
-       ti_sci_np = of_get_parent(dev->of_node);
-       if (!ti_sci_np) {
-               dev_err(dev, "No OF information\n");
-               return ERR_PTR(-EINVAL);
+       if (IS_ERR_OR_NULL(handle))
+               return -EINVAL;
+
+       info = handle_to_ti_sci_info(handle);
+       dev = info->dev;
+
+       xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_RM_RING_GET_CFG,
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(*req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev,
+                       "RM_RA:Message get config failed(%d)\n", ret);
+               return ret;
        }
+       req = (struct ti_sci_msg_rm_ring_get_cfg_req *)xfer->xfer_buf;
+       req->nav_id = nav_id;
+       req->index = index;
 
-       mutex_lock(&ti_sci_list_mutex);
-       list_for_each(p, &ti_sci_list) {
-               info = list_entry(p, struct ti_sci_info, node);
-               if (ti_sci_np == info->dev->of_node) {
-                       handle = &info->handle;
-                       info->users++;
-                       break;
-               }
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "RM_RA:Mbox get config send fail %d\n", ret);
+               goto fail;
        }
-       mutex_unlock(&ti_sci_list_mutex);
-       of_node_put(ti_sci_np);
 
-       if (!handle)
-               return ERR_PTR(-EPROBE_DEFER);
+       resp = (struct ti_sci_msg_rm_ring_get_cfg_resp *)xfer->xfer_buf;
 
-       return handle;
+       if (!ti_sci_is_response_ack(resp)) {
+               ret = -ENODEV;
+       } else {
+               if (mode)
+                       *mode = resp->mode;
+               if (addr_lo)
+                       *addr_lo = resp->addr_lo;
+               if (addr_hi)
+                       *addr_hi = resp->addr_hi;
+               if (count)
+                       *count = resp->count;
+               if (size)
+                       *size = resp->size;
+               if (order_id)
+                       *order_id = resp->order_id;
+       };
+
+fail:
+       ti_sci_put_one_xfer(&info->minfo, xfer);
+       dev_dbg(dev, "RM_RA:get config ring %u ret:%d\n", index, ret);
+       return ret;
 }
-EXPORT_SYMBOL_GPL(ti_sci_get_handle);
 
 /**
- * ti_sci_put_handle() - Release the handle acquired by ti_sci_get_handle
- * @handle:    Handle acquired by ti_sci_get_handle
- *
- * NOTE: The function does not track individual clients of the framework
- * and is expected to be maintained by caller of TI SCI protocol library.
- * ti_sci_put_handle must be balanced with successful ti_sci_get_handle
+ * ti_sci_cmd_rm_psil_pair() - Pair PSI-L source to destination thread
+ * @handle:    Pointer to TI SCI handle.
+ * @nav_id:    Device ID of Navigator Subsystem which should be used for
+ *             pairing
+ * @src_thread:        Source PSI-L thread ID
+ * @dst_thread: Destination PSI-L thread ID
  *
- * Return: 0 is successfully released
- * if an error pointer was passed, it returns the error value back,
- * if null was passed, it returns -EINVAL;
+ * Return: 0 if all went well, else returns appropriate error value.
  */
-int ti_sci_put_handle(const struct ti_sci_handle *handle)
+static int ti_sci_cmd_rm_psil_pair(const struct ti_sci_handle *handle,
+                                  u32 nav_id, u32 src_thread, u32 dst_thread)
 {
+       struct ti_sci_msg_psil_pair *req;
+       struct ti_sci_msg_hdr *resp;
+       struct ti_sci_xfer *xfer;
        struct ti_sci_info *info;
+       struct device *dev;
+       int ret = 0;
 
        if (IS_ERR(handle))
                return PTR_ERR(handle);
@@ -2180,81 +2233,866 @@ int ti_sci_put_handle(const struct ti_sci_handle *handle)
                return -EINVAL;
 
        info = handle_to_ti_sci_info(handle);
-       mutex_lock(&ti_sci_list_mutex);
-       if (!WARN_ON(!info->users))
-               info->users--;
-       mutex_unlock(&ti_sci_list_mutex);
+       dev = info->dev;
 
-       return 0;
-}
-EXPORT_SYMBOL_GPL(ti_sci_put_handle);
+       xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_RM_PSIL_PAIR,
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(*req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev, "RM_PSIL:Message reconfig failed(%d)\n", ret);
+               return ret;
+       }
+       req = (struct ti_sci_msg_psil_pair *)xfer->xfer_buf;
+       req->nav_id = nav_id;
+       req->src_thread = src_thread;
+       req->dst_thread = dst_thread;
 
-static void devm_ti_sci_release(struct device *dev, void *res)
-{
-       const struct ti_sci_handle **ptr = res;
-       const struct ti_sci_handle *handle = *ptr;
-       int ret;
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "RM_PSIL:Mbox send fail %d\n", ret);
+               goto fail;
+       }
 
-       ret = ti_sci_put_handle(handle);
-       if (ret)
-               dev_err(dev, "failed to put handle %d\n", ret);
+       resp = (struct ti_sci_msg_hdr *)xfer->xfer_buf;
+       ret = ti_sci_is_response_ack(resp) ? 0 : -EINVAL;
+
+fail:
+       ti_sci_put_one_xfer(&info->minfo, xfer);
+
+       return ret;
 }
 
 /**
- * devm_ti_sci_get_handle() - Managed get handle
- * @dev:       device for which we want SCI handle for.
+ * ti_sci_cmd_rm_psil_unpair() - Unpair PSI-L source from destination thread
+ * @handle:    Pointer to TI SCI handle.
+ * @nav_id:    Device ID of Navigator Subsystem which should be used for
+ *             unpairing
+ * @src_thread:        Source PSI-L thread ID
+ * @dst_thread:        Destination PSI-L thread ID
  *
- * NOTE: This releases the handle once the device resources are
- * no longer needed. MUST NOT BE released with ti_sci_put_handle.
- * The function does not track individual clients of the framework
- * and is expected to be maintained by caller of TI SCI protocol library.
- *
- * Return: 0 if all went fine, else corresponding error.
+ * Return: 0 if all went well, else returns appropriate error value.
  */
-const struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
+static int ti_sci_cmd_rm_psil_unpair(const struct ti_sci_handle *handle,
+                                    u32 nav_id, u32 src_thread, u32 dst_thread)
 {
-       const struct ti_sci_handle **ptr;
-       const struct ti_sci_handle *handle;
+       struct ti_sci_msg_psil_unpair *req;
+       struct ti_sci_msg_hdr *resp;
+       struct ti_sci_xfer *xfer;
+       struct ti_sci_info *info;
+       struct device *dev;
+       int ret = 0;
 
-       ptr = devres_alloc(devm_ti_sci_release, sizeof(*ptr), GFP_KERNEL);
-       if (!ptr)
-               return ERR_PTR(-ENOMEM);
-       handle = ti_sci_get_handle(dev);
+       if (IS_ERR(handle))
+               return PTR_ERR(handle);
+       if (!handle)
+               return -EINVAL;
 
-       if (!IS_ERR(handle)) {
-               *ptr = handle;
-               devres_add(dev, ptr);
-       } else {
-               devres_free(ptr);
+       info = handle_to_ti_sci_info(handle);
+       dev = info->dev;
+
+       xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_RM_PSIL_UNPAIR,
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(*req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev, "RM_PSIL:Message reconfig failed(%d)\n", ret);
+               return ret;
        }
+       req = (struct ti_sci_msg_psil_unpair *)xfer->xfer_buf;
+       req->nav_id = nav_id;
+       req->src_thread = src_thread;
+       req->dst_thread = dst_thread;
 
-       return handle;
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "RM_PSIL:Mbox send fail %d\n", ret);
+               goto fail;
+       }
+
+       resp = (struct ti_sci_msg_hdr *)xfer->xfer_buf;
+       ret = ti_sci_is_response_ack(resp) ? 0 : -EINVAL;
+
+fail:
+       ti_sci_put_one_xfer(&info->minfo, xfer);
+
+       return ret;
 }
-EXPORT_SYMBOL_GPL(devm_ti_sci_get_handle);
 
 /**
- * ti_sci_get_by_phandle() - Get the TI SCI handle using DT phandle
- * @np:                device node
- * @property:  property name containing phandle on TISCI node
+ * ti_sci_cmd_rm_udmap_tx_ch_cfg() - Configure a UDMAP TX channel
+ * @handle:    Pointer to TI SCI handle.
+ * @params:    Pointer to ti_sci_msg_rm_udmap_tx_ch_cfg TX channel config
+ *             structure
  *
- * NOTE: The function does not track individual clients of the framework
- * and is expected to be maintained by caller of TI SCI protocol library.
- * ti_sci_put_handle must be balanced with successful ti_sci_get_by_phandle
- * Return: pointer to handle if successful, else:
- * -EPROBE_DEFER if the instance is not ready
- * -ENODEV if the required node handler is missing
- * -EINVAL if invalid conditions are encountered.
+ * Return: 0 if all went well, else returns appropriate error value.
+ *
+ * See @ti_sci_msg_rm_udmap_tx_ch_cfg and @ti_sci_msg_rm_udmap_tx_ch_cfg_req for
+ * more info.
  */
-const struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
-                                                 const char *property)
+static int ti_sci_cmd_rm_udmap_tx_ch_cfg(const struct ti_sci_handle *handle,
+                       const struct ti_sci_msg_rm_udmap_tx_ch_cfg *params)
 {
-       struct ti_sci_handle *handle = NULL;
-       struct device_node *ti_sci_np;
+       struct ti_sci_msg_rm_udmap_tx_ch_cfg_req *req;
+       struct ti_sci_msg_hdr *resp;
+       struct ti_sci_xfer *xfer;
        struct ti_sci_info *info;
-       struct list_head *p;
+       struct device *dev;
+       int ret = 0;
 
-       if (!np) {
-               pr_err("I need a device pointer\n");
+       if (IS_ERR_OR_NULL(handle))
+               return -EINVAL;
+
+       info = handle_to_ti_sci_info(handle);
+       dev = info->dev;
+
+       xfer = ti_sci_get_one_xfer(info, TISCI_MSG_RM_UDMAP_TX_CH_CFG,
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(*req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev, "Message TX_CH_CFG alloc failed(%d)\n", ret);
+               return ret;
+       }
+       req = (struct ti_sci_msg_rm_udmap_tx_ch_cfg_req *)xfer->xfer_buf;
+       req->valid_params = params->valid_params;
+       req->nav_id = params->nav_id;
+       req->index = params->index;
+       req->tx_pause_on_err = params->tx_pause_on_err;
+       req->tx_filt_einfo = params->tx_filt_einfo;
+       req->tx_filt_pswords = params->tx_filt_pswords;
+       req->tx_atype = params->tx_atype;
+       req->tx_chan_type = params->tx_chan_type;
+       req->tx_supr_tdpkt = params->tx_supr_tdpkt;
+       req->tx_fetch_size = params->tx_fetch_size;
+       req->tx_credit_count = params->tx_credit_count;
+       req->txcq_qnum = params->txcq_qnum;
+       req->tx_priority = params->tx_priority;
+       req->tx_qos = params->tx_qos;
+       req->tx_orderid = params->tx_orderid;
+       req->fdepth = params->fdepth;
+       req->tx_sched_priority = params->tx_sched_priority;
+       req->tx_burst_size = params->tx_burst_size;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "Mbox send TX_CH_CFG fail %d\n", ret);
+               goto fail;
+       }
+
+       resp = (struct ti_sci_msg_hdr *)xfer->xfer_buf;
+       ret = ti_sci_is_response_ack(resp) ? 0 : -EINVAL;
+
+fail:
+       ti_sci_put_one_xfer(&info->minfo, xfer);
+       dev_dbg(dev, "TX_CH_CFG: chn %u ret:%u\n", params->index, ret);
+       return ret;
+}
+
+/**
+ * ti_sci_cmd_rm_udmap_rx_ch_cfg() - Configure a UDMAP RX channel
+ * @handle:    Pointer to TI SCI handle.
+ * @params:    Pointer to ti_sci_msg_rm_udmap_rx_ch_cfg RX channel config
+ *             structure
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ *
+ * See @ti_sci_msg_rm_udmap_rx_ch_cfg and @ti_sci_msg_rm_udmap_rx_ch_cfg_req for
+ * more info.
+ */
+static int ti_sci_cmd_rm_udmap_rx_ch_cfg(const struct ti_sci_handle *handle,
+                       const struct ti_sci_msg_rm_udmap_rx_ch_cfg *params)
+{
+       struct ti_sci_msg_rm_udmap_rx_ch_cfg_req *req;
+       struct ti_sci_msg_hdr *resp;
+       struct ti_sci_xfer *xfer;
+       struct ti_sci_info *info;
+       struct device *dev;
+       int ret = 0;
+
+       if (IS_ERR_OR_NULL(handle))
+               return -EINVAL;
+
+       info = handle_to_ti_sci_info(handle);
+       dev = info->dev;
+
+       xfer = ti_sci_get_one_xfer(info, TISCI_MSG_RM_UDMAP_RX_CH_CFG,
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(*req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev, "Message RX_CH_CFG alloc failed(%d)\n", ret);
+               return ret;
+       }
+       req = (struct ti_sci_msg_rm_udmap_rx_ch_cfg_req *)xfer->xfer_buf;
+       req->valid_params = params->valid_params;
+       req->nav_id = params->nav_id;
+       req->index = params->index;
+       req->rx_fetch_size = params->rx_fetch_size;
+       req->rxcq_qnum = params->rxcq_qnum;
+       req->rx_priority = params->rx_priority;
+       req->rx_qos = params->rx_qos;
+       req->rx_orderid = params->rx_orderid;
+       req->rx_sched_priority = params->rx_sched_priority;
+       req->flowid_start = params->flowid_start;
+       req->flowid_cnt = params->flowid_cnt;
+       req->rx_pause_on_err = params->rx_pause_on_err;
+       req->rx_atype = params->rx_atype;
+       req->rx_chan_type = params->rx_chan_type;
+       req->rx_ignore_short = params->rx_ignore_short;
+       req->rx_ignore_long = params->rx_ignore_long;
+       req->rx_burst_size = params->rx_burst_size;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "Mbox send RX_CH_CFG fail %d\n", ret);
+               goto fail;
+       }
+
+       resp = (struct ti_sci_msg_hdr *)xfer->xfer_buf;
+       ret = ti_sci_is_response_ack(resp) ? 0 : -EINVAL;
+
+fail:
+       ti_sci_put_one_xfer(&info->minfo, xfer);
+       dev_dbg(dev, "RX_CH_CFG: chn %u ret:%d\n", params->index, ret);
+       return ret;
+}
+
+/**
+ * ti_sci_cmd_rm_udmap_rx_flow_cfg() - Configure UDMAP RX FLOW
+ * @handle:    Pointer to TI SCI handle.
+ * @params:    Pointer to ti_sci_msg_rm_udmap_flow_cfg RX FLOW config
+ *             structure
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ *
+ * See @ti_sci_msg_rm_udmap_flow_cfg and @ti_sci_msg_rm_udmap_flow_cfg_req for
+ * more info.
+ */
+static int ti_sci_cmd_rm_udmap_rx_flow_cfg(const struct ti_sci_handle *handle,
+                       const struct ti_sci_msg_rm_udmap_flow_cfg *params)
+{
+       struct ti_sci_msg_rm_udmap_flow_cfg_req *req;
+       struct ti_sci_msg_hdr *resp;
+       struct ti_sci_xfer *xfer;
+       struct ti_sci_info *info;
+       struct device *dev;
+       int ret = 0;
+
+       if (IS_ERR_OR_NULL(handle))
+               return -EINVAL;
+
+       info = handle_to_ti_sci_info(handle);
+       dev = info->dev;
+
+       xfer = ti_sci_get_one_xfer(info, TISCI_MSG_RM_UDMAP_FLOW_CFG,
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(*req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev, "RX_FL_CFG: Message alloc failed(%d)\n", ret);
+               return ret;
+       }
+       req = (struct ti_sci_msg_rm_udmap_flow_cfg_req *)xfer->xfer_buf;
+       req->valid_params = params->valid_params;
+       req->nav_id = params->nav_id;
+       req->flow_index = params->flow_index;
+       req->rx_einfo_present = params->rx_einfo_present;
+       req->rx_psinfo_present = params->rx_psinfo_present;
+       req->rx_error_handling = params->rx_error_handling;
+       req->rx_desc_type = params->rx_desc_type;
+       req->rx_sop_offset = params->rx_sop_offset;
+       req->rx_dest_qnum = params->rx_dest_qnum;
+       req->rx_src_tag_hi = params->rx_src_tag_hi;
+       req->rx_src_tag_lo = params->rx_src_tag_lo;
+       req->rx_dest_tag_hi = params->rx_dest_tag_hi;
+       req->rx_dest_tag_lo = params->rx_dest_tag_lo;
+       req->rx_src_tag_hi_sel = params->rx_src_tag_hi_sel;
+       req->rx_src_tag_lo_sel = params->rx_src_tag_lo_sel;
+       req->rx_dest_tag_hi_sel = params->rx_dest_tag_hi_sel;
+       req->rx_dest_tag_lo_sel = params->rx_dest_tag_lo_sel;
+       req->rx_fdq0_sz0_qnum = params->rx_fdq0_sz0_qnum;
+       req->rx_fdq1_qnum = params->rx_fdq1_qnum;
+       req->rx_fdq2_qnum = params->rx_fdq2_qnum;
+       req->rx_fdq3_qnum = params->rx_fdq3_qnum;
+       req->rx_ps_location = params->rx_ps_location;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "RX_FL_CFG: Mbox send fail %d\n", ret);
+               goto fail;
+       }
+
+       resp = (struct ti_sci_msg_hdr *)xfer->xfer_buf;
+       ret = ti_sci_is_response_ack(resp) ? 0 : -EINVAL;
+
+fail:
+       ti_sci_put_one_xfer(&info->minfo, xfer);
+       dev_dbg(info->dev, "RX_FL_CFG: %u ret:%d\n", params->flow_index, ret);
+       return ret;
+}
+
+/**
+ * ti_sci_cmd_proc_request() - Command to request a physical processor control
+ * @handle:    Pointer to TI SCI handle
+ * @proc_id:   Processor ID this request is for
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ */
+static int ti_sci_cmd_proc_request(const struct ti_sci_handle *handle,
+                                  u8 proc_id)
+{
+       struct ti_sci_msg_req_proc_request *req;
+       struct ti_sci_msg_hdr *resp;
+       struct ti_sci_info *info;
+       struct ti_sci_xfer *xfer;
+       struct device *dev;
+       int ret = 0;
+
+       if (!handle)
+               return -EINVAL;
+       if (IS_ERR(handle))
+               return PTR_ERR(handle);
+
+       info = handle_to_ti_sci_info(handle);
+       dev = info->dev;
+
+       xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_PROC_REQUEST,
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(*req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev, "Message alloc failed(%d)\n", ret);
+               return ret;
+       }
+       req = (struct ti_sci_msg_req_proc_request *)xfer->xfer_buf;
+       req->processor_id = proc_id;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "Mbox send fail %d\n", ret);
+               goto fail;
+       }
+
+       resp = (struct ti_sci_msg_hdr *)xfer->tx_message.buf;
+
+       ret = ti_sci_is_response_ack(resp) ? 0 : -ENODEV;
+
+fail:
+       ti_sci_put_one_xfer(&info->minfo, xfer);
+
+       return ret;
+}
+
+/**
+ * ti_sci_cmd_proc_release() - Command to release a physical processor control
+ * @handle:    Pointer to TI SCI handle
+ * @proc_id:   Processor ID this request is for
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ */
+static int ti_sci_cmd_proc_release(const struct ti_sci_handle *handle,
+                                  u8 proc_id)
+{
+       struct ti_sci_msg_req_proc_release *req;
+       struct ti_sci_msg_hdr *resp;
+       struct ti_sci_info *info;
+       struct ti_sci_xfer *xfer;
+       struct device *dev;
+       int ret = 0;
+
+       if (!handle)
+               return -EINVAL;
+       if (IS_ERR(handle))
+               return PTR_ERR(handle);
+
+       info = handle_to_ti_sci_info(handle);
+       dev = info->dev;
+
+       xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_PROC_RELEASE,
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(*req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev, "Message alloc failed(%d)\n", ret);
+               return ret;
+       }
+       req = (struct ti_sci_msg_req_proc_release *)xfer->xfer_buf;
+       req->processor_id = proc_id;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "Mbox send fail %d\n", ret);
+               goto fail;
+       }
+
+       resp = (struct ti_sci_msg_hdr *)xfer->tx_message.buf;
+
+       ret = ti_sci_is_response_ack(resp) ? 0 : -ENODEV;
+
+fail:
+       ti_sci_put_one_xfer(&info->minfo, xfer);
+
+       return ret;
+}
+
+/**
+ * ti_sci_cmd_proc_handover() - Command to handover a physical processor
+ *                             control to a host in the processor's access
+ *                             control list.
+ * @handle:    Pointer to TI SCI handle
+ * @proc_id:   Processor ID this request is for
+ * @host_id:   Host ID to get the control of the processor
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ */
+static int ti_sci_cmd_proc_handover(const struct ti_sci_handle *handle,
+                                   u8 proc_id, u8 host_id)
+{
+       struct ti_sci_msg_req_proc_handover *req;
+       struct ti_sci_msg_hdr *resp;
+       struct ti_sci_info *info;
+       struct ti_sci_xfer *xfer;
+       struct device *dev;
+       int ret = 0;
+
+       if (!handle)
+               return -EINVAL;
+       if (IS_ERR(handle))
+               return PTR_ERR(handle);
+
+       info = handle_to_ti_sci_info(handle);
+       dev = info->dev;
+
+       xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_PROC_HANDOVER,
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(*req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev, "Message alloc failed(%d)\n", ret);
+               return ret;
+       }
+       req = (struct ti_sci_msg_req_proc_handover *)xfer->xfer_buf;
+       req->processor_id = proc_id;
+       req->host_id = host_id;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "Mbox send fail %d\n", ret);
+               goto fail;
+       }
+
+       resp = (struct ti_sci_msg_hdr *)xfer->tx_message.buf;
+
+       ret = ti_sci_is_response_ack(resp) ? 0 : -ENODEV;
+
+fail:
+       ti_sci_put_one_xfer(&info->minfo, xfer);
+
+       return ret;
+}
+
+/**
+ * ti_sci_cmd_proc_set_config() - Command to set the processor boot
+ *                                 configuration flags
+ * @handle:            Pointer to TI SCI handle
+ * @proc_id:           Processor ID this request is for
+ * @config_flags_set:  Configuration flags to be set
+ * @config_flags_clear:        Configuration flags to be cleared.
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ */
+static int ti_sci_cmd_proc_set_config(const struct ti_sci_handle *handle,
+                                     u8 proc_id, u64 bootvector,
+                                     u32 config_flags_set,
+                                     u32 config_flags_clear)
+{
+       struct ti_sci_msg_req_set_config *req;
+       struct ti_sci_msg_hdr *resp;
+       struct ti_sci_info *info;
+       struct ti_sci_xfer *xfer;
+       struct device *dev;
+       int ret = 0;
+
+       if (!handle)
+               return -EINVAL;
+       if (IS_ERR(handle))
+               return PTR_ERR(handle);
+
+       info = handle_to_ti_sci_info(handle);
+       dev = info->dev;
+
+       xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_SET_CONFIG,
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(*req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev, "Message alloc failed(%d)\n", ret);
+               return ret;
+       }
+       req = (struct ti_sci_msg_req_set_config *)xfer->xfer_buf;
+       req->processor_id = proc_id;
+       req->bootvector_low = bootvector & TI_SCI_ADDR_LOW_MASK;
+       req->bootvector_high = (bootvector & TI_SCI_ADDR_HIGH_MASK) >>
+                               TI_SCI_ADDR_HIGH_SHIFT;
+       req->config_flags_set = config_flags_set;
+       req->config_flags_clear = config_flags_clear;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "Mbox send fail %d\n", ret);
+               goto fail;
+       }
+
+       resp = (struct ti_sci_msg_hdr *)xfer->tx_message.buf;
+
+       ret = ti_sci_is_response_ack(resp) ? 0 : -ENODEV;
+
+fail:
+       ti_sci_put_one_xfer(&info->minfo, xfer);
+
+       return ret;
+}
+
+/**
+ * ti_sci_cmd_proc_set_control() - Command to set the processor boot
+ *                                  control flags
+ * @handle:                    Pointer to TI SCI handle
+ * @proc_id:                   Processor ID this request is for
+ * @control_flags_set:         Control flags to be set
+ * @control_flags_clear:       Control flags to be cleared
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ */
+static int ti_sci_cmd_proc_set_control(const struct ti_sci_handle *handle,
+                                      u8 proc_id, u32 control_flags_set,
+                                      u32 control_flags_clear)
+{
+       struct ti_sci_msg_req_set_ctrl *req;
+       struct ti_sci_msg_hdr *resp;
+       struct ti_sci_info *info;
+       struct ti_sci_xfer *xfer;
+       struct device *dev;
+       int ret = 0;
+
+       if (!handle)
+               return -EINVAL;
+       if (IS_ERR(handle))
+               return PTR_ERR(handle);
+
+       info = handle_to_ti_sci_info(handle);
+       dev = info->dev;
+
+       xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_SET_CTRL,
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(*req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev, "Message alloc failed(%d)\n", ret);
+               return ret;
+       }
+       req = (struct ti_sci_msg_req_set_ctrl *)xfer->xfer_buf;
+       req->processor_id = proc_id;
+       req->control_flags_set = control_flags_set;
+       req->control_flags_clear = control_flags_clear;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "Mbox send fail %d\n", ret);
+               goto fail;
+       }
+
+       resp = (struct ti_sci_msg_hdr *)xfer->tx_message.buf;
+
+       ret = ti_sci_is_response_ack(resp) ? 0 : -ENODEV;
+
+fail:
+       ti_sci_put_one_xfer(&info->minfo, xfer);
+
+       return ret;
+}
+
+/**
+ * ti_sci_cmd_get_boot_status() - Command to get the processor boot status
+ * @handle:    Pointer to TI SCI handle
+ * @proc_id:   Processor ID this request is for
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ */
+static int ti_sci_cmd_proc_get_status(const struct ti_sci_handle *handle,
+                                     u8 proc_id, u64 *bv, u32 *cfg_flags,
+                                     u32 *ctrl_flags, u32 *sts_flags)
+{
+       struct ti_sci_msg_resp_get_status *resp;
+       struct ti_sci_msg_req_get_status *req;
+       struct ti_sci_info *info;
+       struct ti_sci_xfer *xfer;
+       struct device *dev;
+       int ret = 0;
+
+       if (!handle)
+               return -EINVAL;
+       if (IS_ERR(handle))
+               return PTR_ERR(handle);
+
+       info = handle_to_ti_sci_info(handle);
+       dev = info->dev;
+
+       xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_GET_STATUS,
+                                  TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                  sizeof(*req), sizeof(*resp));
+       if (IS_ERR(xfer)) {
+               ret = PTR_ERR(xfer);
+               dev_err(dev, "Message alloc failed(%d)\n", ret);
+               return ret;
+       }
+       req = (struct ti_sci_msg_req_get_status *)xfer->xfer_buf;
+       req->processor_id = proc_id;
+
+       ret = ti_sci_do_xfer(info, xfer);
+       if (ret) {
+               dev_err(dev, "Mbox send fail %d\n", ret);
+               goto fail;
+       }
+
+       resp = (struct ti_sci_msg_resp_get_status *)xfer->tx_message.buf;
+
+       if (!ti_sci_is_response_ack(resp)) {
+               ret = -ENODEV;
+       } else {
+               *bv = (resp->bootvector_low & TI_SCI_ADDR_LOW_MASK) |
+                     (((u64)resp->bootvector_high << TI_SCI_ADDR_HIGH_SHIFT) &
+                      TI_SCI_ADDR_HIGH_MASK);
+               *cfg_flags = resp->config_flags;
+               *ctrl_flags = resp->control_flags;
+               *sts_flags = resp->status_flags;
+       }
+
+fail:
+       ti_sci_put_one_xfer(&info->minfo, xfer);
+
+       return ret;
+}
+
+/*
+ * ti_sci_setup_ops() - Setup the operations structures
+ * @info:      pointer to TISCI pointer
+ */
+static void ti_sci_setup_ops(struct ti_sci_info *info)
+{
+       struct ti_sci_ops *ops = &info->handle.ops;
+       struct ti_sci_core_ops *core_ops = &ops->core_ops;
+       struct ti_sci_dev_ops *dops = &ops->dev_ops;
+       struct ti_sci_clk_ops *cops = &ops->clk_ops;
+       struct ti_sci_rm_core_ops *rm_core_ops = &ops->rm_core_ops;
+       struct ti_sci_rm_irq_ops *iops = &ops->rm_irq_ops;
+       struct ti_sci_rm_ringacc_ops *rops = &ops->rm_ring_ops;
+       struct ti_sci_rm_psil_ops *psilops = &ops->rm_psil_ops;
+       struct ti_sci_rm_udmap_ops *udmap_ops = &ops->rm_udmap_ops;
+       struct ti_sci_proc_ops *pops = &ops->proc_ops;
+
+       core_ops->reboot_device = ti_sci_cmd_core_reboot;
+
+       dops->get_device = ti_sci_cmd_get_device;
+       dops->idle_device = ti_sci_cmd_idle_device;
+       dops->put_device = ti_sci_cmd_put_device;
+
+       dops->is_valid = ti_sci_cmd_dev_is_valid;
+       dops->get_context_loss_count = ti_sci_cmd_dev_get_clcnt;
+       dops->is_idle = ti_sci_cmd_dev_is_idle;
+       dops->is_stop = ti_sci_cmd_dev_is_stop;
+       dops->is_on = ti_sci_cmd_dev_is_on;
+       dops->is_transitioning = ti_sci_cmd_dev_is_trans;
+       dops->set_device_resets = ti_sci_cmd_set_device_resets;
+       dops->get_device_resets = ti_sci_cmd_get_device_resets;
+
+       cops->get_clock = ti_sci_cmd_get_clock;
+       cops->idle_clock = ti_sci_cmd_idle_clock;
+       cops->put_clock = ti_sci_cmd_put_clock;
+       cops->is_auto = ti_sci_cmd_clk_is_auto;
+       cops->is_on = ti_sci_cmd_clk_is_on;
+       cops->is_off = ti_sci_cmd_clk_is_off;
+
+       cops->set_parent = ti_sci_cmd_clk_set_parent;
+       cops->get_parent = ti_sci_cmd_clk_get_parent;
+       cops->get_num_parents = ti_sci_cmd_clk_get_num_parents;
+
+       cops->get_best_match_freq = ti_sci_cmd_clk_get_match_freq;
+       cops->set_freq = ti_sci_cmd_clk_set_freq;
+       cops->get_freq = ti_sci_cmd_clk_get_freq;
+
+       rm_core_ops->get_range = ti_sci_cmd_get_resource_range;
+       rm_core_ops->get_range_from_shost =
+                               ti_sci_cmd_get_resource_range_from_shost;
+
+       iops->set_irq = ti_sci_cmd_set_irq;
+       iops->set_event_map = ti_sci_cmd_set_event_map;
+       iops->free_irq = ti_sci_cmd_free_irq;
+       iops->free_event_map = ti_sci_cmd_free_event_map;
+
+       rops->config = ti_sci_cmd_ring_config;
+       rops->get_config = ti_sci_cmd_ring_get_config;
+
+       psilops->pair = ti_sci_cmd_rm_psil_pair;
+       psilops->unpair = ti_sci_cmd_rm_psil_unpair;
+
+       udmap_ops->tx_ch_cfg = ti_sci_cmd_rm_udmap_tx_ch_cfg;
+       udmap_ops->rx_ch_cfg = ti_sci_cmd_rm_udmap_rx_ch_cfg;
+       udmap_ops->rx_flow_cfg = ti_sci_cmd_rm_udmap_rx_flow_cfg;
+
+       pops->request = ti_sci_cmd_proc_request;
+       pops->release = ti_sci_cmd_proc_release;
+       pops->handover = ti_sci_cmd_proc_handover;
+       pops->set_config = ti_sci_cmd_proc_set_config;
+       pops->set_control = ti_sci_cmd_proc_set_control;
+       pops->get_status = ti_sci_cmd_proc_get_status;
+}
+
+/**
+ * ti_sci_get_handle() - Get the TI SCI handle for a device
+ * @dev:       Pointer to device for which we want SCI handle
+ *
+ * NOTE: The function does not track individual clients of the framework
+ * and is expected to be maintained by caller of TI SCI protocol library.
+ * ti_sci_put_handle must be balanced with successful ti_sci_get_handle
+ * Return: pointer to handle if successful, else:
+ * -EPROBE_DEFER if the instance is not ready
+ * -ENODEV if the required node handler is missing
+ * -EINVAL if invalid conditions are encountered.
+ */
+const struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
+{
+       struct device_node *ti_sci_np;
+       struct list_head *p;
+       struct ti_sci_handle *handle = NULL;
+       struct ti_sci_info *info;
+
+       if (!dev) {
+               pr_err("I need a device pointer\n");
+               return ERR_PTR(-EINVAL);
+       }
+       ti_sci_np = of_get_parent(dev->of_node);
+       if (!ti_sci_np) {
+               dev_err(dev, "No OF information\n");
+               return ERR_PTR(-EINVAL);
+       }
+
+       mutex_lock(&ti_sci_list_mutex);
+       list_for_each(p, &ti_sci_list) {
+               info = list_entry(p, struct ti_sci_info, node);
+               if (ti_sci_np == info->dev->of_node) {
+                       handle = &info->handle;
+                       info->users++;
+                       break;
+               }
+       }
+       mutex_unlock(&ti_sci_list_mutex);
+       of_node_put(ti_sci_np);
+
+       if (!handle)
+               return ERR_PTR(-EPROBE_DEFER);
+
+       return handle;
+}
+EXPORT_SYMBOL_GPL(ti_sci_get_handle);
+
+/**
+ * ti_sci_put_handle() - Release the handle acquired by ti_sci_get_handle
+ * @handle:    Handle acquired by ti_sci_get_handle
+ *
+ * NOTE: The function does not track individual clients of the framework
+ * and is expected to be maintained by caller of TI SCI protocol library.
+ * ti_sci_put_handle must be balanced with successful ti_sci_get_handle
+ *
+ * Return: 0 is successfully released
+ * if an error pointer was passed, it returns the error value back,
+ * if null was passed, it returns -EINVAL;
+ */
+int ti_sci_put_handle(const struct ti_sci_handle *handle)
+{
+       struct ti_sci_info *info;
+
+       if (IS_ERR(handle))
+               return PTR_ERR(handle);
+       if (!handle)
+               return -EINVAL;
+
+       info = handle_to_ti_sci_info(handle);
+       mutex_lock(&ti_sci_list_mutex);
+       if (!WARN_ON(!info->users))
+               info->users--;
+       mutex_unlock(&ti_sci_list_mutex);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ti_sci_put_handle);
+
+static void devm_ti_sci_release(struct device *dev, void *res)
+{
+       const struct ti_sci_handle **ptr = res;
+       const struct ti_sci_handle *handle = *ptr;
+       int ret;
+
+       ret = ti_sci_put_handle(handle);
+       if (ret)
+               dev_err(dev, "failed to put handle %d\n", ret);
+}
+
+/**
+ * devm_ti_sci_get_handle() - Managed get handle
+ * @dev:       device for which we want SCI handle for.
+ *
+ * NOTE: This releases the handle once the device resources are
+ * no longer needed. MUST NOT BE released with ti_sci_put_handle.
+ * The function does not track individual clients of the framework
+ * and is expected to be maintained by caller of TI SCI protocol library.
+ *
+ * Return: 0 if all went fine, else corresponding error.
+ */
+const struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
+{
+       const struct ti_sci_handle **ptr;
+       const struct ti_sci_handle *handle;
+
+       ptr = devres_alloc(devm_ti_sci_release, sizeof(*ptr), GFP_KERNEL);
+       if (!ptr)
+               return ERR_PTR(-ENOMEM);
+       handle = ti_sci_get_handle(dev);
+
+       if (!IS_ERR(handle)) {
+               *ptr = handle;
+               devres_add(dev, ptr);
+       } else {
+               devres_free(ptr);
+       }
+
+       return handle;
+}
+EXPORT_SYMBOL_GPL(devm_ti_sci_get_handle);
+
+/**
+ * ti_sci_get_by_phandle() - Get the TI SCI handle using DT phandle
+ * @np:                device node
+ * @property:  property name containing phandle on TISCI node
+ *
+ * NOTE: The function does not track individual clients of the framework
+ * and is expected to be maintained by caller of TI SCI protocol library.
+ * ti_sci_put_handle must be balanced with successful ti_sci_get_by_phandle
+ * Return: pointer to handle if successful, else:
+ * -EPROBE_DEFER if the instance is not ready
+ * -ENODEV if the required node handler is missing
+ * -EINVAL if invalid conditions are encountered.
+ */
+const struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
+                                                 const char *property)
+{
+       struct ti_sci_handle *handle = NULL;
+       struct device_node *ti_sci_np;
+       struct ti_sci_info *info;
+       struct list_head *p;
+
+       if (!np) {
+               pr_err("I need a device pointer\n");
                return ERR_PTR(-EINVAL);
        }
 
@@ -2395,6 +3233,7 @@ devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
                            struct device *dev, u32 dev_id, char *of_prop)
 {
        struct ti_sci_resource *res;
+       bool valid_set = false;
        u32 resource_subtype;
        int i, ret;
 
@@ -2426,15 +3265,18 @@ devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
                                                        &res->desc[i].start,
                                                        &res->desc[i].num);
                if (ret) {
-                       dev_err(dev, "dev = %d subtype %d not allocated for this host\n",
+                       dev_dbg(dev, "dev = %d subtype %d not allocated for this host\n",
                                dev_id, resource_subtype);
-                       return ERR_PTR(ret);
+                       res->desc[i].start = 0;
+                       res->desc[i].num = 0;
+                       continue;
                }
 
                dev_dbg(dev, "dev = %d, subtype = %d, start = %d, num = %d\n",
                        dev_id, resource_subtype, res->desc[i].start,
                        res->desc[i].num);
 
+               valid_set = true;
                res->desc[i].res_map =
                        devm_kzalloc(dev, BITS_TO_LONGS(res->desc[i].num) *
                                     sizeof(*res->desc[i].res_map), GFP_KERNEL);
@@ -2443,7 +3285,10 @@ devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
        }
        raw_spin_lock_init(&res->lock);
 
-       return res;
+       if (valid_set)
+               return res;
+
+       return ERR_PTR(-EINVAL);
 }
 
 static int tisci_reboot_handler(struct notifier_block *nb, unsigned long mode,
index 414e0ced5409e4ca0b34a3de27070aa5d0bbe241..f0d068c039444a7290dd80e5ecb4476f029f78b0 100644 (file)
 #define TI_SCI_MSG_SET_IRQ             0x1000
 #define TI_SCI_MSG_FREE_IRQ            0x1001
 
+/* NAVSS resource management */
+/* Ringacc requests */
+#define TI_SCI_MSG_RM_RING_ALLOCATE            0x1100
+#define TI_SCI_MSG_RM_RING_FREE                        0x1101
+#define TI_SCI_MSG_RM_RING_RECONFIG            0x1102
+#define TI_SCI_MSG_RM_RING_RESET               0x1103
+#define TI_SCI_MSG_RM_RING_CFG                 0x1110
+#define TI_SCI_MSG_RM_RING_GET_CFG             0x1111
+
+/* PSI-L requests */
+#define TI_SCI_MSG_RM_PSIL_PAIR                        0x1280
+#define TI_SCI_MSG_RM_PSIL_UNPAIR              0x1281
+
+#define TI_SCI_MSG_RM_UDMAP_TX_ALLOC           0x1200
+#define TI_SCI_MSG_RM_UDMAP_TX_FREE            0x1201
+#define TI_SCI_MSG_RM_UDMAP_RX_ALLOC           0x1210
+#define TI_SCI_MSG_RM_UDMAP_RX_FREE            0x1211
+#define TI_SCI_MSG_RM_UDMAP_FLOW_CFG           0x1220
+#define TI_SCI_MSG_RM_UDMAP_OPT_FLOW_CFG       0x1221
+
+#define TISCI_MSG_RM_UDMAP_TX_CH_CFG           0x1205
+#define TISCI_MSG_RM_UDMAP_TX_CH_GET_CFG       0x1206
+#define TISCI_MSG_RM_UDMAP_RX_CH_CFG           0x1215
+#define TISCI_MSG_RM_UDMAP_RX_CH_GET_CFG       0x1216
+#define TISCI_MSG_RM_UDMAP_FLOW_CFG            0x1230
+#define TISCI_MSG_RM_UDMAP_FLOW_SIZE_THRESH_CFG        0x1231
+#define TISCI_MSG_RM_UDMAP_FLOW_GET_CFG                0x1232
+#define TISCI_MSG_RM_UDMAP_FLOW_SIZE_THRESH_GET_CFG    0x1233
+
+/* Processor Control requests */
+#define TI_SCI_MSG_PROC_REQUEST                0xc000
+#define TI_SCI_MSG_PROC_RELEASE                0xc001
+#define TI_SCI_MSG_PROC_HANDOVER       0xc005
+#define TI_SCI_MSG_SET_CONFIG          0xc100
+#define TI_SCI_MSG_SET_CTRL            0xc101
+#define TI_SCI_MSG_GET_STATUS          0xc400
+
 /**
  * struct ti_sci_msg_hdr - Generic Message Header for All messages and responses
  * @type:      Type of messages: One of TI_SCI_MSG* values
@@ -604,4 +641,777 @@ struct ti_sci_msg_req_manage_irq {
        u8 secondary_host;
 } __packed;
 
+/**
+ * struct ti_sci_msg_rm_ring_cfg_req - Configure a Navigator Subsystem ring
+ *
+ * Configures the non-real-time registers of a Navigator Subsystem ring.
+ * @hdr:       Generic Header
+ * @valid_params: Bitfield defining validity of ring configuration parameters.
+ *     The ring configuration fields are not valid, and will not be used for
+ *     ring configuration, if their corresponding valid bit is zero.
+ *     Valid bit usage:
+ *     0 - Valid bit for @tisci_msg_rm_ring_cfg_req addr_lo
+ *     1 - Valid bit for @tisci_msg_rm_ring_cfg_req addr_hi
+ *     2 - Valid bit for @tisci_msg_rm_ring_cfg_req count
+ *     3 - Valid bit for @tisci_msg_rm_ring_cfg_req mode
+ *     4 - Valid bit for @tisci_msg_rm_ring_cfg_req size
+ *     5 - Valid bit for @tisci_msg_rm_ring_cfg_req order_id
+ * @nav_id: Device ID of Navigator Subsystem from which the ring is allocated
+ * @index: ring index to be configured.
+ * @addr_lo: 32 LSBs of ring base address to be programmed into the ring's
+ *     RING_BA_LO register
+ * @addr_hi: 16 MSBs of ring base address to be programmed into the ring's
+ *     RING_BA_HI register.
+ * @count: Number of ring elements. Must be even if mode is CREDENTIALS or QM
+ *     modes.
+ * @mode: Specifies the mode the ring is to be configured.
+ * @size: Specifies encoded ring element size. To calculate the encoded size use
+ *     the formula (log2(size_bytes) - 2), where size_bytes cannot be
+ *     greater than 256.
+ * @order_id: Specifies the ring's bus order ID.
+ */
+struct ti_sci_msg_rm_ring_cfg_req {
+       struct ti_sci_msg_hdr hdr;
+       u32 valid_params;
+       u16 nav_id;
+       u16 index;
+       u32 addr_lo;
+       u32 addr_hi;
+       u32 count;
+       u8 mode;
+       u8 size;
+       u8 order_id;
+} __packed;
+
+/**
+ * struct ti_sci_msg_rm_ring_get_cfg_req - Get RA ring's configuration
+ *
+ * Gets the configuration of the non-real-time register fields of a ring.  The
+ * host, or a supervisor of the host, who owns the ring must be the requesting
+ * host.  The values of the non-real-time registers are returned in
+ * @ti_sci_msg_rm_ring_get_cfg_resp.
+ *
+ * @hdr: Generic Header
+ * @nav_id: Device ID of Navigator Subsystem from which the ring is allocated
+ * @index: ring index.
+ */
+struct ti_sci_msg_rm_ring_get_cfg_req {
+       struct ti_sci_msg_hdr hdr;
+       u16 nav_id;
+       u16 index;
+} __packed;
+
+/**
+ * struct ti_sci_msg_rm_ring_get_cfg_resp -  Ring get configuration response
+ *
+ * Response received by host processor after RM has handled
+ * @ti_sci_msg_rm_ring_get_cfg_req. The response contains the ring's
+ * non-real-time register values.
+ *
+ * @hdr: Generic Header
+ * @addr_lo: Ring 32 LSBs of base address
+ * @addr_hi: Ring 16 MSBs of base address.
+ * @count: Ring number of elements.
+ * @mode: Ring mode.
+ * @size: encoded Ring element size
+ * @order_id: ing order ID.
+ */
+struct ti_sci_msg_rm_ring_get_cfg_resp {
+       struct ti_sci_msg_hdr hdr;
+       u32 addr_lo;
+       u32 addr_hi;
+       u32 count;
+       u8 mode;
+       u8 size;
+       u8 order_id;
+} __packed;
+
+/**
+ * struct ti_sci_msg_psil_pair - Pairs a PSI-L source thread to a destination
+ *                              thread
+ * @hdr:       Generic Header
+ * @nav_id:    SoC Navigator Subsystem device ID whose PSI-L config proxy is
+ *             used to pair the source and destination threads.
+ * @src_thread:        PSI-L source thread ID within the PSI-L System thread map.
+ *
+ * UDMAP transmit channels mapped to source threads will have their
+ * TCHAN_THRD_ID register programmed with the destination thread if the pairing
+ * is successful.
+
+ * @dst_thread: PSI-L destination thread ID within the PSI-L System thread map.
+ * PSI-L destination threads start at index 0x8000.  The request is NACK'd if
+ * the destination thread is not greater than or equal to 0x8000.
+ *
+ * UDMAP receive channels mapped to destination threads will have their
+ * RCHAN_THRD_ID register programmed with the source thread if the pairing
+ * is successful.
+ *
+ * Request type is TI_SCI_MSG_RM_PSIL_PAIR, response is a generic ACK or NACK
+ * message.
+ */
+struct ti_sci_msg_psil_pair {
+       struct ti_sci_msg_hdr hdr;
+       u32 nav_id;
+       u32 src_thread;
+       u32 dst_thread;
+} __packed;
+
+/**
+ * struct ti_sci_msg_psil_unpair - Unpairs a PSI-L source thread from a
+ *                                destination thread
+ * @hdr:       Generic Header
+ * @nav_id:    SoC Navigator Subsystem device ID whose PSI-L config proxy is
+ *             used to unpair the source and destination threads.
+ * @src_thread:        PSI-L source thread ID within the PSI-L System thread map.
+ *
+ * UDMAP transmit channels mapped to source threads will have their
+ * TCHAN_THRD_ID register cleared if the unpairing is successful.
+ *
+ * @dst_thread: PSI-L destination thread ID within the PSI-L System thread map.
+ * PSI-L destination threads start at index 0x8000.  The request is NACK'd if
+ * the destination thread is not greater than or equal to 0x8000.
+ *
+ * UDMAP receive channels mapped to destination threads will have their
+ * RCHAN_THRD_ID register cleared if the unpairing is successful.
+ *
+ * Request type is TI_SCI_MSG_RM_PSIL_UNPAIR, response is a generic ACK or NACK
+ * message.
+ */
+struct ti_sci_msg_psil_unpair {
+       struct ti_sci_msg_hdr hdr;
+       u32 nav_id;
+       u32 src_thread;
+       u32 dst_thread;
+} __packed;
+
+/**
+ * struct ti_sci_msg_udmap_rx_flow_cfg -  UDMAP receive flow configuration
+ *                                       message
+ * @hdr: Generic Header
+ * @nav_id: SoC Navigator Subsystem device ID from which the receive flow is
+ *     allocated
+ * @flow_index: UDMAP receive flow index for non-optional configuration.
+ * @rx_ch_index: Specifies the index of the receive channel using the flow_index
+ * @rx_einfo_present: UDMAP receive flow extended packet info present.
+ * @rx_psinfo_present: UDMAP receive flow PS words present.
+ * @rx_error_handling: UDMAP receive flow error handling configuration. Valid
+ *     values are TI_SCI_RM_UDMAP_RX_FLOW_ERR_DROP/RETRY.
+ * @rx_desc_type: UDMAP receive flow descriptor type. It can be one of
+ *     TI_SCI_RM_UDMAP_RX_FLOW_DESC_HOST/MONO.
+ * @rx_sop_offset: UDMAP receive flow start of packet offset.
+ * @rx_dest_qnum: UDMAP receive flow destination queue number.
+ * @rx_ps_location: UDMAP receive flow PS words location.
+ *     0 - end of packet descriptor
+ *     1 - Beginning of the data buffer
+ * @rx_src_tag_hi: UDMAP receive flow source tag high byte constant
+ * @rx_src_tag_lo: UDMAP receive flow source tag low byte constant
+ * @rx_dest_tag_hi: UDMAP receive flow destination tag high byte constant
+ * @rx_dest_tag_lo: UDMAP receive flow destination tag low byte constant
+ * @rx_src_tag_hi_sel: UDMAP receive flow source tag high byte selector
+ * @rx_src_tag_lo_sel: UDMAP receive flow source tag low byte selector
+ * @rx_dest_tag_hi_sel: UDMAP receive flow destination tag high byte selector
+ * @rx_dest_tag_lo_sel: UDMAP receive flow destination tag low byte selector
+ * @rx_size_thresh_en: UDMAP receive flow packet size based free buffer queue
+ *     enable. If enabled, the ti_sci_rm_udmap_rx_flow_opt_cfg also need to be
+ *     configured and sent.
+ * @rx_fdq0_sz0_qnum: UDMAP receive flow free descriptor queue 0.
+ * @rx_fdq1_qnum: UDMAP receive flow free descriptor queue 1.
+ * @rx_fdq2_qnum: UDMAP receive flow free descriptor queue 2.
+ * @rx_fdq3_qnum: UDMAP receive flow free descriptor queue 3.
+ *
+ * For detailed information on the settings, see the UDMAP section of the TRM.
+ */
+struct ti_sci_msg_udmap_rx_flow_cfg {
+       struct ti_sci_msg_hdr hdr;
+       u32 nav_id;
+       u32 flow_index;
+       u32 rx_ch_index;
+       u8 rx_einfo_present;
+       u8 rx_psinfo_present;
+       u8 rx_error_handling;
+       u8 rx_desc_type;
+       u16 rx_sop_offset;
+       u16 rx_dest_qnum;
+       u8 rx_ps_location;
+       u8 rx_src_tag_hi;
+       u8 rx_src_tag_lo;
+       u8 rx_dest_tag_hi;
+       u8 rx_dest_tag_lo;
+       u8 rx_src_tag_hi_sel;
+       u8 rx_src_tag_lo_sel;
+       u8 rx_dest_tag_hi_sel;
+       u8 rx_dest_tag_lo_sel;
+       u8 rx_size_thresh_en;
+       u16 rx_fdq0_sz0_qnum;
+       u16 rx_fdq1_qnum;
+       u16 rx_fdq2_qnum;
+       u16 rx_fdq3_qnum;
+} __packed;
+
+/**
+ * struct rm_ti_sci_msg_udmap_rx_flow_opt_cfg - parameters for UDMAP receive
+ *                                             flow optional configuration
+ * @hdr: Generic Header
+ * @nav_id: SoC Navigator Subsystem device ID from which the receive flow is
+ *     allocated
+ * @flow_index: UDMAP receive flow index for optional configuration.
+ * @rx_ch_index: Specifies the index of the receive channel using the flow_index
+ * @rx_size_thresh0: UDMAP receive flow packet size threshold 0.
+ * @rx_size_thresh1: UDMAP receive flow packet size threshold 1.
+ * @rx_size_thresh2: UDMAP receive flow packet size threshold 2.
+ * @rx_fdq0_sz1_qnum: UDMAP receive flow free descriptor queue for size
+ *     threshold 1.
+ * @rx_fdq0_sz2_qnum: UDMAP receive flow free descriptor queue for size
+ *     threshold 2.
+ * @rx_fdq0_sz3_qnum: UDMAP receive flow free descriptor queue for size
+ *     threshold 3.
+ *
+ * For detailed information on the settings, see the UDMAP section of the TRM.
+ */
+struct rm_ti_sci_msg_udmap_rx_flow_opt_cfg {
+       struct ti_sci_msg_hdr hdr;
+       u32 nav_id;
+       u32 flow_index;
+       u32 rx_ch_index;
+       u16 rx_size_thresh0;
+       u16 rx_size_thresh1;
+       u16 rx_size_thresh2;
+       u16 rx_fdq0_sz1_qnum;
+       u16 rx_fdq0_sz2_qnum;
+       u16 rx_fdq0_sz3_qnum;
+} __packed;
+
+/**
+ * Configures a Navigator Subsystem UDMAP transmit channel
+ *
+ * Configures the non-real-time registers of a Navigator Subsystem UDMAP
+ * transmit channel.  The channel index must be assigned to the host defined
+ * in the TISCI header via the RM board configuration resource assignment
+ * range list.
+ *
+ * @hdr: Generic Header
+ *
+ * @valid_params: Bitfield defining validity of tx channel configuration
+ * parameters. The tx channel configuration fields are not valid, and will not
+ * be used for ch configuration, if their corresponding valid bit is zero.
+ * Valid bit usage:
+ *    0 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_pause_on_err
+ *    1 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_atype
+ *    2 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_chan_type
+ *    3 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_fetch_size
+ *    4 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::txcq_qnum
+ *    5 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_priority
+ *    6 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_qos
+ *    7 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_orderid
+ *    8 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_sched_priority
+ *    9 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_filt_einfo
+ *   10 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_filt_pswords
+ *   11 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_supr_tdpkt
+ *   12 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_credit_count
+ *   13 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::fdepth
+ *   14 - Valid bit for @ref ti_sci_msg_rm_udmap_tx_ch_cfg::tx_burst_size
+ *
+ * @nav_id: SoC device ID of Navigator Subsystem where tx channel is located
+ *
+ * @index: UDMAP transmit channel index.
+ *
+ * @tx_pause_on_err: UDMAP transmit channel pause on error configuration to
+ * be programmed into the tx_pause_on_err field of the channel's TCHAN_TCFG
+ * register.
+ *
+ * @tx_filt_einfo: UDMAP transmit channel extended packet information passing
+ * configuration to be programmed into the tx_filt_einfo field of the
+ * channel's TCHAN_TCFG register.
+ *
+ * @tx_filt_pswords: UDMAP transmit channel protocol specific word passing
+ * configuration to be programmed into the tx_filt_pswords field of the
+ * channel's TCHAN_TCFG register.
+ *
+ * @tx_atype: UDMAP transmit channel non Ring Accelerator access pointer
+ * interpretation configuration to be programmed into the tx_atype field of
+ * the channel's TCHAN_TCFG register.
+ *
+ * @tx_chan_type: UDMAP transmit channel functional channel type and work
+ * passing mechanism configuration to be programmed into the tx_chan_type
+ * field of the channel's TCHAN_TCFG register.
+ *
+ * @tx_supr_tdpkt: UDMAP transmit channel teardown packet generation suppression
+ * configuration to be programmed into the tx_supr_tdpkt field of the channel's
+ * TCHAN_TCFG register.
+ *
+ * @tx_fetch_size: UDMAP transmit channel number of 32-bit descriptor words to
+ * fetch configuration to be programmed into the tx_fetch_size field of the
+ * channel's TCHAN_TCFG register.  The user must make sure to set the maximum
+ * word count that can pass through the channel for any allowed descriptor type.
+ *
+ * @tx_credit_count: UDMAP transmit channel transfer request credit count
+ * configuration to be programmed into the count field of the TCHAN_TCREDIT
+ * register.  Specifies how many credits for complete TRs are available.
+ *
+ * @txcq_qnum: UDMAP transmit channel completion queue configuration to be
+ * programmed into the txcq_qnum field of the TCHAN_TCQ register. The specified
+ * completion queue must be assigned to the host, or a subordinate of the host,
+ * requesting configuration of the transmit channel.
+ *
+ * @tx_priority: UDMAP transmit channel transmit priority value to be programmed
+ * into the priority field of the channel's TCHAN_TPRI_CTRL register.
+ *
+ * @tx_qos: UDMAP transmit channel transmit qos value to be programmed into the
+ * qos field of the channel's TCHAN_TPRI_CTRL register.
+ *
+ * @tx_orderid: UDMAP transmit channel bus order id value to be programmed into
+ * the orderid field of the channel's TCHAN_TPRI_CTRL register.
+ *
+ * @fdepth: UDMAP transmit channel FIFO depth configuration to be programmed
+ * into the fdepth field of the TCHAN_TFIFO_DEPTH register. Sets the number of
+ * Tx FIFO bytes which are allowed to be stored for the channel. Check the UDMAP
+ * section of the TRM for restrictions regarding this parameter.
+ *
+ * @tx_sched_priority: UDMAP transmit channel tx scheduling priority
+ * configuration to be programmed into the priority field of the channel's
+ * TCHAN_TST_SCHED register.
+ *
+ * @tx_burst_size: UDMAP transmit channel burst size configuration to be
+ * programmed into the tx_burst_size field of the TCHAN_TCFG register.
+ */
+struct ti_sci_msg_rm_udmap_tx_ch_cfg_req {
+       struct ti_sci_msg_hdr hdr;
+       u32 valid_params;
+       u16 nav_id;
+       u16 index;
+       u8 tx_pause_on_err;
+       u8 tx_filt_einfo;
+       u8 tx_filt_pswords;
+       u8 tx_atype;
+       u8 tx_chan_type;
+       u8 tx_supr_tdpkt;
+       u16 tx_fetch_size;
+       u8 tx_credit_count;
+       u16 txcq_qnum;
+       u8 tx_priority;
+       u8 tx_qos;
+       u8 tx_orderid;
+       u16 fdepth;
+       u8 tx_sched_priority;
+       u8 tx_burst_size;
+} __packed;
+
+/**
+ * Configures a Navigator Subsystem UDMAP receive channel
+ *
+ * Configures the non-real-time registers of a Navigator Subsystem UDMAP
+ * receive channel.  The channel index must be assigned to the host defined
+ * in the TISCI header via the RM board configuration resource assignment
+ * range list.
+ *
+ * @hdr: Generic Header
+ *
+ * @valid_params: Bitfield defining validity of rx channel configuration
+ * parameters.
+ * The rx channel configuration fields are not valid, and will not be used for
+ * ch configuration, if their corresponding valid bit is zero.
+ * Valid bit usage:
+ *    0 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_pause_on_err
+ *    1 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_atype
+ *    2 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_chan_type
+ *    3 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_fetch_size
+ *    4 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rxcq_qnum
+ *    5 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_priority
+ *    6 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_qos
+ *    7 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_orderid
+ *    8 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_sched_priority
+ *    9 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::flowid_start
+ *   10 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::flowid_cnt
+ *   11 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_ignore_short
+ *   12 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_ignore_long
+ *   14 - Valid bit for @ti_sci_msg_rm_udmap_rx_ch_cfg_req::rx_burst_size
+ *
+ * @nav_id: SoC device ID of Navigator Subsystem where rx channel is located
+ *
+ * @index: UDMAP receive channel index.
+ *
+ * @rx_fetch_size: UDMAP receive channel number of 32-bit descriptor words to
+ * fetch configuration to be programmed into the rx_fetch_size field of the
+ * channel's RCHAN_RCFG register.
+ *
+ * @rxcq_qnum: UDMAP receive channel completion queue configuration to be
+ * programmed into the rxcq_qnum field of the RCHAN_RCQ register.
+ * The specified completion queue must be assigned to the host, or a subordinate
+ * of the host, requesting configuration of the receive channel.
+ *
+ * @rx_priority: UDMAP receive channel receive priority value to be programmed
+ * into the priority field of the channel's RCHAN_RPRI_CTRL register.
+ *
+ * @rx_qos: UDMAP receive channel receive qos value to be programmed into the
+ * qos field of the channel's RCHAN_RPRI_CTRL register.
+ *
+ * @rx_orderid: UDMAP receive channel bus order id value to be programmed into
+ * the orderid field of the channel's RCHAN_RPRI_CTRL register.
+ *
+ * @rx_sched_priority: UDMAP receive channel rx scheduling priority
+ * configuration to be programmed into the priority field of the channel's
+ * RCHAN_RST_SCHED register.
+ *
+ * @flowid_start: UDMAP receive channel additional flows starting index
+ * configuration to program into the flow_start field of the RCHAN_RFLOW_RNG
+ * register. Specifies the starting index for flow IDs the receive channel is to
+ * make use of beyond the default flow. flowid_start and @ref flowid_cnt must be
+ * set as valid and configured together. The starting flow ID set by
+ * @ref flowid_cnt must be a flow index within the Navigator Subsystem's subset
+ * of flows beyond the default flows statically mapped to receive channels.
+ * The additional flows must be assigned to the host, or a subordinate of the
+ * host, requesting configuration of the receive channel.
+ *
+ * @flowid_cnt: UDMAP receive channel additional flows count configuration to
+ * program into the flowid_cnt field of the RCHAN_RFLOW_RNG register.
+ * This field specifies how many flow IDs are in the additional contiguous range
+ * of legal flow IDs for the channel.  @ref flowid_start and flowid_cnt must be
+ * set as valid and configured together. Disabling the valid_params field bit
+ * for flowid_cnt indicates no flow IDs other than the default are to be
+ * allocated and used by the receive channel. @ref flowid_start plus flowid_cnt
+ * cannot be greater than the number of receive flows in the receive channel's
+ * Navigator Subsystem.  The additional flows must be assigned to the host, or a
+ * subordinate of the host, requesting configuration of the receive channel.
+ *
+ * @rx_pause_on_err: UDMAP receive channel pause on error configuration to be
+ * programmed into the rx_pause_on_err field of the channel's RCHAN_RCFG
+ * register.
+ *
+ * @rx_atype: UDMAP receive channel non Ring Accelerator access pointer
+ * interpretation configuration to be programmed into the rx_atype field of the
+ * channel's RCHAN_RCFG register.
+ *
+ * @rx_chan_type: UDMAP receive channel functional channel type and work passing
+ * mechanism configuration to be programmed into the rx_chan_type field of the
+ * channel's RCHAN_RCFG register.
+ *
+ * @rx_ignore_short: UDMAP receive channel short packet treatment configuration
+ * to be programmed into the rx_ignore_short field of the RCHAN_RCFG register.
+ *
+ * @rx_ignore_long: UDMAP receive channel long packet treatment configuration to
+ * be programmed into the rx_ignore_long field of the RCHAN_RCFG register.
+ *
+ * @rx_burst_size: UDMAP receive channel burst size configuration to be
+ * programmed into the rx_burst_size field of the RCHAN_RCFG register.
+ */
+struct ti_sci_msg_rm_udmap_rx_ch_cfg_req {
+       struct ti_sci_msg_hdr hdr;
+       u32 valid_params;
+       u16 nav_id;
+       u16 index;
+       u16 rx_fetch_size;
+       u16 rxcq_qnum;
+       u8 rx_priority;
+       u8 rx_qos;
+       u8 rx_orderid;
+       u8 rx_sched_priority;
+       u16 flowid_start;
+       u16 flowid_cnt;
+       u8 rx_pause_on_err;
+       u8 rx_atype;
+       u8 rx_chan_type;
+       u8 rx_ignore_short;
+       u8 rx_ignore_long;
+       u8 rx_burst_size;
+} __packed;
+
+/**
+ * Configures a Navigator Subsystem UDMAP receive flow
+ *
+ * Configures a Navigator Subsystem UDMAP receive flow's registers.
+ * Configuration does not include the flow registers which handle size-based
+ * free descriptor queue routing.
+ *
+ * The flow index must be assigned to the host defined in the TISCI header via
+ * the RM board configuration resource assignment range list.
+ *
+ * @hdr: Standard TISCI header
+ *
+ * @valid_params
+ * Bitfield defining validity of rx flow configuration parameters.  The
+ * rx flow configuration fields are not valid, and will not be used for flow
+ * configuration, if their corresponding valid bit is zero.  Valid bit usage:
+ *     0 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_einfo_present
+ *     1 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_psinfo_present
+ *     2 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_error_handling
+ *     3 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_desc_type
+ *     4 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_sop_offset
+ *     5 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_qnum
+ *     6 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_src_tag_hi
+ *     7 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_src_tag_lo
+ *     8 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_tag_hi
+ *     9 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_tag_lo
+ *    10 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_src_tag_hi_sel
+ *    11 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_src_tag_lo_sel
+ *    12 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_tag_hi_sel
+ *    13 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_dest_tag_lo_sel
+ *    14 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_fdq0_sz0_qnum
+ *    15 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_fdq1_sz0_qnum
+ *    16 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_fdq2_sz0_qnum
+ *    17 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_fdq3_sz0_qnum
+ *    18 - Valid bit for @tisci_msg_rm_udmap_flow_cfg_req::rx_ps_location
+ *
+ * @nav_id: SoC device ID of Navigator Subsystem from which the receive flow is
+ * allocated
+ *
+ * @flow_index: UDMAP receive flow index for non-optional configuration.
+ *
+ * @rx_einfo_present:
+ * UDMAP receive flow extended packet info present configuration to be
+ * programmed into the rx_einfo_present field of the flow's RFLOW_RFA register.
+ *
+ * @rx_psinfo_present:
+ * UDMAP receive flow PS words present configuration to be programmed into the
+ * rx_psinfo_present field of the flow's RFLOW_RFA register.
+ *
+ * @rx_error_handling:
+ * UDMAP receive flow error handling configuration to be programmed into the
+ * rx_error_handling field of the flow's RFLOW_RFA register.
+ *
+ * @rx_desc_type:
+ * UDMAP receive flow descriptor type configuration to be programmed into the
+ * rx_desc_type field field of the flow's RFLOW_RFA register.
+ *
+ * @rx_sop_offset:
+ * UDMAP receive flow start of packet offset configuration to be programmed
+ * into the rx_sop_offset field of the RFLOW_RFA register.  See the UDMAP
+ * section of the TRM for more information on this setting.  Valid values for
+ * this field are 0-255 bytes.
+ *
+ * @rx_dest_qnum:
+ * UDMAP receive flow destination queue configuration to be programmed into the
+ * rx_dest_qnum field of the flow's RFLOW_RFA register.  The specified
+ * destination queue must be valid within the Navigator Subsystem and must be
+ * owned by the host, or a subordinate of the host, requesting allocation and
+ * configuration of the receive flow.
+ *
+ * @rx_src_tag_hi:
+ * UDMAP receive flow source tag high byte constant configuration to be
+ * programmed into the rx_src_tag_hi field of the flow's RFLOW_RFB register.
+ * See the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_src_tag_lo:
+ * UDMAP receive flow source tag low byte constant configuration to be
+ * programmed into the rx_src_tag_lo field of the flow's RFLOW_RFB register.
+ * See the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_dest_tag_hi:
+ * UDMAP receive flow destination tag high byte constant configuration to be
+ * programmed into the rx_dest_tag_hi field of the flow's RFLOW_RFB register.
+ * See the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_dest_tag_lo:
+ * UDMAP receive flow destination tag low byte constant configuration to be
+ * programmed into the rx_dest_tag_lo field of the flow's RFLOW_RFB register.
+ * See the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_src_tag_hi_sel:
+ * UDMAP receive flow source tag high byte selector configuration to be
+ * programmed into the rx_src_tag_hi_sel field of the RFLOW_RFC register.  See
+ * the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_src_tag_lo_sel:
+ * UDMAP receive flow source tag low byte selector configuration to be
+ * programmed into the rx_src_tag_lo_sel field of the RFLOW_RFC register.  See
+ * the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_dest_tag_hi_sel:
+ * UDMAP receive flow destination tag high byte selector configuration to be
+ * programmed into the rx_dest_tag_hi_sel field of the RFLOW_RFC register.  See
+ * the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_dest_tag_lo_sel:
+ * UDMAP receive flow destination tag low byte selector configuration to be
+ * programmed into the rx_dest_tag_lo_sel field of the RFLOW_RFC register.  See
+ * the UDMAP section of the TRM for more information on this setting.
+ *
+ * @rx_fdq0_sz0_qnum:
+ * UDMAP receive flow free descriptor queue 0 configuration to be programmed
+ * into the rx_fdq0_sz0_qnum field of the flow's RFLOW_RFD register.  See the
+ * UDMAP section of the TRM for more information on this setting. The specified
+ * free queue must be valid within the Navigator Subsystem and must be owned
+ * by the host, or a subordinate of the host, requesting allocation and
+ * configuration of the receive flow.
+ *
+ * @rx_fdq1_qnum:
+ * UDMAP receive flow free descriptor queue 1 configuration to be programmed
+ * into the rx_fdq1_qnum field of the flow's RFLOW_RFD register.  See the
+ * UDMAP section of the TRM for more information on this setting.  The specified
+ * free queue must be valid within the Navigator Subsystem and must be owned
+ * by the host, or a subordinate of the host, requesting allocation and
+ * configuration of the receive flow.
+ *
+ * @rx_fdq2_qnum:
+ * UDMAP receive flow free descriptor queue 2 configuration to be programmed
+ * into the rx_fdq2_qnum field of the flow's RFLOW_RFE register.  See the
+ * UDMAP section of the TRM for more information on this setting.  The specified
+ * free queue must be valid within the Navigator Subsystem and must be owned
+ * by the host, or a subordinate of the host, requesting allocation and
+ * configuration of the receive flow.
+ *
+ * @rx_fdq3_qnum:
+ * UDMAP receive flow free descriptor queue 3 configuration to be programmed
+ * into the rx_fdq3_qnum field of the flow's RFLOW_RFE register.  See the
+ * UDMAP section of the TRM for more information on this setting.  The specified
+ * free queue must be valid within the Navigator Subsystem and must be owned
+ * by the host, or a subordinate of the host, requesting allocation and
+ * configuration of the receive flow.
+ *
+ * @rx_ps_location:
+ * UDMAP receive flow PS words location configuration to be programmed into the
+ * rx_ps_location field of the flow's RFLOW_RFA register.
+ */
+struct ti_sci_msg_rm_udmap_flow_cfg_req {
+       struct ti_sci_msg_hdr hdr;
+       u32 valid_params;
+       u16 nav_id;
+       u16 flow_index;
+       u8 rx_einfo_present;
+       u8 rx_psinfo_present;
+       u8 rx_error_handling;
+       u8 rx_desc_type;
+       u16 rx_sop_offset;
+       u16 rx_dest_qnum;
+       u8 rx_src_tag_hi;
+       u8 rx_src_tag_lo;
+       u8 rx_dest_tag_hi;
+       u8 rx_dest_tag_lo;
+       u8 rx_src_tag_hi_sel;
+       u8 rx_src_tag_lo_sel;
+       u8 rx_dest_tag_hi_sel;
+       u8 rx_dest_tag_lo_sel;
+       u16 rx_fdq0_sz0_qnum;
+       u16 rx_fdq1_qnum;
+       u16 rx_fdq2_qnum;
+       u16 rx_fdq3_qnum;
+       u8 rx_ps_location;
+} __packed;
+
+/**
+ * struct ti_sci_msg_req_proc_request - Request a processor
+ * @hdr:               Generic Header
+ * @processor_id:      ID of processor being requested
+ *
+ * Request type is TI_SCI_MSG_PROC_REQUEST, response is a generic ACK/NACK
+ * message.
+ */
+struct ti_sci_msg_req_proc_request {
+       struct ti_sci_msg_hdr hdr;
+       u8 processor_id;
+} __packed;
+
+/**
+ * struct ti_sci_msg_req_proc_release - Release a processor
+ * @hdr:               Generic Header
+ * @processor_id:      ID of processor being released
+ *
+ * Request type is TI_SCI_MSG_PROC_RELEASE, response is a generic ACK/NACK
+ * message.
+ */
+struct ti_sci_msg_req_proc_release {
+       struct ti_sci_msg_hdr hdr;
+       u8 processor_id;
+} __packed;
+
+/**
+ * struct ti_sci_msg_req_proc_handover - Handover a processor to a host
+ * @hdr:               Generic Header
+ * @processor_id:      ID of processor being handed over
+ * @host_id:           Host ID the control needs to be transferred to
+ *
+ * Request type is TI_SCI_MSG_PROC_HANDOVER, response is a generic ACK/NACK
+ * message.
+ */
+struct ti_sci_msg_req_proc_handover {
+       struct ti_sci_msg_hdr hdr;
+       u8 processor_id;
+       u8 host_id;
+} __packed;
+
+/* Boot Vector masks */
+#define TI_SCI_ADDR_LOW_MASK                   GENMASK_ULL(31, 0)
+#define TI_SCI_ADDR_HIGH_MASK                  GENMASK_ULL(63, 32)
+#define TI_SCI_ADDR_HIGH_SHIFT                 32
+
+/**
+ * struct ti_sci_msg_req_set_config - Set Processor boot configuration
+ * @hdr:               Generic Header
+ * @processor_id:      ID of processor being configured
+ * @bootvector_low:    Lower 32 bit address (Little Endian) of boot vector
+ * @bootvector_high:   Higher 32 bit address (Little Endian) of boot vector
+ * @config_flags_set:  Optional Processor specific Config Flags to set.
+ *                     Setting a bit here implies the corresponding mode
+ *                     will be set
+ * @config_flags_clear:        Optional Processor specific Config Flags to clear.
+ *                     Setting a bit here implies the corresponding mode
+ *                     will be cleared
+ *
+ * Request type is TI_SCI_MSG_PROC_HANDOVER, response is a generic ACK/NACK
+ * message.
+ */
+struct ti_sci_msg_req_set_config {
+       struct ti_sci_msg_hdr hdr;
+       u8 processor_id;
+       u32 bootvector_low;
+       u32 bootvector_high;
+       u32 config_flags_set;
+       u32 config_flags_clear;
+} __packed;
+
+/**
+ * struct ti_sci_msg_req_set_ctrl - Set Processor boot control flags
+ * @hdr:               Generic Header
+ * @processor_id:      ID of processor being configured
+ * @control_flags_set: Optional Processor specific Control Flags to set.
+ *                     Setting a bit here implies the corresponding mode
+ *                     will be set
+ * @control_flags_clear:Optional Processor specific Control Flags to clear.
+ *                     Setting a bit here implies the corresponding mode
+ *                     will be cleared
+ *
+ * Request type is TI_SCI_MSG_SET_CTRL, response is a generic ACK/NACK
+ * message.
+ */
+struct ti_sci_msg_req_set_ctrl {
+       struct ti_sci_msg_hdr hdr;
+       u8 processor_id;
+       u32 control_flags_set;
+       u32 control_flags_clear;
+} __packed;
+
+/**
+ * struct ti_sci_msg_req_get_status - Processor boot status request
+ * @hdr:               Generic Header
+ * @processor_id:      ID of processor whose status is being requested
+ *
+ * Request type is TI_SCI_MSG_GET_STATUS, response is an appropriate
+ * message, or NACK in case of inability to satisfy request.
+ */
+struct ti_sci_msg_req_get_status {
+       struct ti_sci_msg_hdr hdr;
+       u8 processor_id;
+} __packed;
+
+/**
+ * struct ti_sci_msg_resp_get_status - Processor boot status response
+ * @hdr:               Generic Header
+ * @processor_id:      ID of processor whose status is returned
+ * @bootvector_low:    Lower 32 bit address (Little Endian) of boot vector
+ * @bootvector_high:   Higher 32 bit address (Little Endian) of boot vector
+ * @config_flags:      Optional Processor specific Config Flags set currently
+ * @control_flags:     Optional Processor specific Control Flags set currently
+ * @status_flags:      Optional Processor specific Status Flags set currently
+ *
+ * Response structure to a TI_SCI_MSG_GET_STATUS request.
+ */
+struct ti_sci_msg_resp_get_status {
+       struct ti_sci_msg_hdr hdr;
+       u8 processor_id;
+       u32 bootvector_low;
+       u32 bootvector_high;
+       u32 config_flags;
+       u32 control_flags;
+       u32 status_flags;
+} __packed;
+
 #endif /* __TI_SCI_H */
index a80183a488c5146bc8362a5a23060ff46b1b7587..0c93fc5ca762ecfe7690fe482f9ff4f9a9a77b4d 100644 (file)
@@ -18,6 +18,50 @@ struct scmi_sensors {
        const struct scmi_sensor_info **info[hwmon_max];
 };
 
+static inline u64 __pow10(u8 x)
+{
+       u64 r = 1;
+
+       while (x--)
+               r *= 10;
+
+       return r;
+}
+
+static int scmi_hwmon_scale(const struct scmi_sensor_info *sensor, u64 *value)
+{
+       s8 scale = sensor->scale;
+       u64 f;
+
+       switch (sensor->type) {
+       case TEMPERATURE_C:
+       case VOLTAGE:
+       case CURRENT:
+               scale += 3;
+               break;
+       case POWER:
+       case ENERGY:
+               scale += 6;
+               break;
+       default:
+               break;
+       }
+
+       if (scale == 0)
+               return 0;
+
+       if (abs(scale) > 19)
+               return -E2BIG;
+
+       f = __pow10(abs(scale));
+       if (scale > 0)
+               *value *= f;
+       else
+               *value = div64_u64(*value, f);
+
+       return 0;
+}
+
 static int scmi_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
                           u32 attr, int channel, long *val)
 {
@@ -29,6 +73,10 @@ static int scmi_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
 
        sensor = *(scmi_sensors->info[type] + channel);
        ret = h->sensor_ops->reading_get(h, sensor->id, false, &value);
+       if (ret)
+               return ret;
+
+       ret = scmi_hwmon_scale(sensor, &value);
        if (!ret)
                *val = value;
 
index c7a3d75fb30806c2f6fe6fa5d38bcfb8a4d3e1db..2e72fc5af15732db4f349917ffe6ad4fad946190 100644 (file)
@@ -611,6 +611,7 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
        struct Scsi_Host *shost;
        struct iser_conn *iser_conn = NULL;
        struct ib_conn *ib_conn;
+       struct ib_device *ib_dev;
        u32 max_fr_sectors;
 
        shost = iscsi_host_alloc(&iscsi_iser_sht, 0, 0);
@@ -641,16 +642,19 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
                }
 
                ib_conn = &iser_conn->ib_conn;
+               ib_dev = ib_conn->device->ib_device;
                if (ib_conn->pi_support) {
-                       u32 sig_caps = ib_conn->device->ib_device->attrs.sig_prot_cap;
+                       u32 sig_caps = ib_dev->attrs.sig_prot_cap;
 
                        scsi_host_set_prot(shost, iser_dif_prot_caps(sig_caps));
                        scsi_host_set_guard(shost, SHOST_DIX_GUARD_IP |
                                                   SHOST_DIX_GUARD_CRC);
                }
 
-               if (iscsi_host_add(shost,
-                                  ib_conn->device->ib_device->dev.parent)) {
+               if (!(ib_dev->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG))
+                       shost->virt_boundary_mask = ~MASK_4K;
+
+               if (iscsi_host_add(shost, ib_dev->dev.parent)) {
                        mutex_unlock(&iser_conn->state_mutex);
                        goto free_host;
                }
@@ -956,30 +960,6 @@ static umode_t iser_attr_is_visible(int param_type, int param)
        return 0;
 }
 
-static int iscsi_iser_slave_alloc(struct scsi_device *sdev)
-{
-       struct iscsi_session *session;
-       struct iser_conn *iser_conn;
-       struct ib_device *ib_dev;
-
-       mutex_lock(&unbind_iser_conn_mutex);
-
-       session = starget_to_session(scsi_target(sdev))->dd_data;
-       iser_conn = session->leadconn->dd_data;
-       if (!iser_conn) {
-               mutex_unlock(&unbind_iser_conn_mutex);
-               return -ENOTCONN;
-       }
-       ib_dev = iser_conn->ib_conn.device->ib_device;
-
-       if (!(ib_dev->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG))
-               blk_queue_virt_boundary(sdev->request_queue, ~MASK_4K);
-
-       mutex_unlock(&unbind_iser_conn_mutex);
-
-       return 0;
-}
-
 static struct scsi_host_template iscsi_iser_sht = {
        .module                 = THIS_MODULE,
        .name                   = "iSCSI Initiator over iSER",
@@ -992,7 +972,6 @@ static struct scsi_host_template iscsi_iser_sht = {
        .eh_device_reset_handler= iscsi_eh_device_reset,
        .eh_target_reset_handler = iscsi_eh_recover_target,
        .target_alloc           = iscsi_target_alloc,
-       .slave_alloc            = iscsi_iser_slave_alloc,
        .proc_name              = "iscsi_iser",
        .this_id                = -1,
        .track_queue_depth      = 1,
index c7bd96edce80ea3a65c1f79cbfcc2b226ccb96fd..b5960351bec088739d45d933bf9bd6b3e7f244cb 100644 (file)
@@ -3046,20 +3046,6 @@ static int srp_target_alloc(struct scsi_target *starget)
        return 0;
 }
 
-static int srp_slave_alloc(struct scsi_device *sdev)
-{
-       struct Scsi_Host *shost = sdev->host;
-       struct srp_target_port *target = host_to_target(shost);
-       struct srp_device *srp_dev = target->srp_host->srp_dev;
-       struct ib_device *ibdev = srp_dev->dev;
-
-       if (!(ibdev->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG))
-               blk_queue_virt_boundary(sdev->request_queue,
-                                       ~srp_dev->mr_page_mask);
-
-       return 0;
-}
-
 static int srp_slave_configure(struct scsi_device *sdev)
 {
        struct Scsi_Host *shost = sdev->host;
@@ -3262,7 +3248,6 @@ static struct scsi_host_template srp_template = {
        .name                           = "InfiniBand SRP initiator",
        .proc_name                      = DRV_NAME,
        .target_alloc                   = srp_target_alloc,
-       .slave_alloc                    = srp_slave_alloc,
        .slave_configure                = srp_slave_configure,
        .info                           = srp_target_info,
        .queuecommand                   = srp_queuecommand,
@@ -3806,6 +3791,9 @@ static ssize_t srp_create_target(struct device *dev,
        target_host->max_cmd_len = sizeof ((struct srp_cmd *) (void *) 0L)->cdb;
        target_host->max_segment_size = ib_dma_max_seg_size(ibdev);
 
+       if (!(ibdev->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG))
+               target_host->virt_boundary_mask = ~srp_dev->mr_page_mask;
+
        target = host_to_target(target_host);
 
        target->net             = kobj_ns_grab_current(KOBJ_NS_TYPE_NET);
index 4cadebd8b9c46df56dc386a425b7755b5195edf2..95c0348843e6b40ae35498f14c3c33872467365a 100644 (file)
@@ -6,9 +6,6 @@
  *  USB/RS232 I-Force joysticks and wheels.
  */
 
-/*
- */
-
 #include "iforce.h"
 
 /*
index 9a5f90da06ec0b2ae943cfab181acdb4d4dde4fd..b2a68bc9f0b4d6b77a439d35c57e7038c2e3ea8f 100644 (file)
@@ -6,9 +6,6 @@
  *  USB/RS232 I-Force joysticks and wheels.
  */
 
-/*
- */
-
 #include <asm/unaligned.h>
 #include "iforce.h"
 
index b313e38b2c3a83436a514a7a241ec84d174e1052..763642c8cee9f538415524e48411c7da33a91f65 100644 (file)
@@ -6,9 +6,6 @@
  *  USB/RS232 I-Force joysticks and wheels.
  */
 
-/*
- */
-
 #include <asm/unaligned.h>
 #include "iforce.h"
 
index bbe31e0b759fcfd032bf195eba6c7f8b7605f03f..f95a81b9fac72ce2050cac3c27df2b65166c6f13 100644 (file)
@@ -6,9 +6,6 @@
  *  USB/RS232 I-Force joysticks and wheels.
  */
 
-/*
- */
-
 #include <linux/serio.h>
 #include "iforce.h"
 
index ade376bfb79f5b5430db68741c6fd9068a0007c1..29abfeeef9a5f58e9e3840f42ee7a10ab78df210 100644 (file)
@@ -6,9 +6,6 @@
  *  USB/RS232 I-Force joysticks and wheels.
  */
 
-/*
- */
-
 #include <linux/usb.h>
 #include "iforce.h"
 
index 9cfa460466aa783fb11f76e1b3838fd9a5fa6eb4..6aa761ebbdf7725e639ccd7cb974fb36bcd3ad45 100644 (file)
@@ -6,9 +6,6 @@
  *  USB/RS232 I-Force joysticks and wheels.
  */
 
-/*
- */
-
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/input.h>
index 7c4f19dab34fd89382eeb5757b5c223b81da1ee8..8e9c3ea9d5e799c2873d165db109a850cff7e868 100644 (file)
@@ -71,6 +71,22 @@ config KEYBOARD_AMIGA
 config ATARI_KBD_CORE
        bool
 
+config KEYBOARD_APPLESPI
+       tristate "Apple SPI keyboard and trackpad"
+       depends on ACPI && EFI
+       depends on SPI
+       depends on X86 || COMPILE_TEST
+       help
+         Say Y here if you are running Linux on any Apple MacBook8,1 or later,
+         or any MacBookPro13,* or MacBookPro14,*.
+
+         You will also need to enable appropriate SPI master controllers:
+         spi_pxa2xx_platform and spi_pxa2xx_pci for MacBook8,1, and
+         spi_pxa2xx_platform and intel_lpss_pci for the rest.
+
+         To compile this driver as a module, choose M here: the
+         module will be called applespi.
+
 config KEYBOARD_ATARI
        tristate "Atari keyboard"
        depends on ATARI
index f0291ca39f624270fd4f1396e361a05d7008546d..06a0af6efeaea91fb2c9d112ff35885d9e4ff78f 100644 (file)
@@ -10,6 +10,7 @@ obj-$(CONFIG_KEYBOARD_ADP5520)                += adp5520-keys.o
 obj-$(CONFIG_KEYBOARD_ADP5588)         += adp5588-keys.o
 obj-$(CONFIG_KEYBOARD_ADP5589)         += adp5589-keys.o
 obj-$(CONFIG_KEYBOARD_AMIGA)           += amikbd.o
+obj-$(CONFIG_KEYBOARD_APPLESPI)                += applespi.o
 obj-$(CONFIG_KEYBOARD_ATARI)           += atakbd.o
 obj-$(CONFIG_KEYBOARD_ATKBD)           += atkbd.o
 obj-$(CONFIG_KEYBOARD_BCM)             += bcm-keypad.o
index 4c05c70a8cf3f840f604f7423850eebb0d3e6b3a..4f96a4a99e5b867be06c10a80234166f2451f927 100644 (file)
@@ -505,6 +505,7 @@ static int adp5589_gpio_add(struct adp5589_kpad *kpad)
        if (!gpio_data)
                return 0;
 
+       kpad->gc.parent = dev;
        kpad->gc.ngpio = adp5589_build_gpiomap(kpad, pdata);
        if (kpad->gc.ngpio == 0) {
                dev_info(dev, "No unused gpios left to export\n");
diff --git a/drivers/input/keyboard/applespi.c b/drivers/input/keyboard/applespi.c
new file mode 100644 (file)
index 0000000..548737e
--- /dev/null
@@ -0,0 +1,1977 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * MacBook (Pro) SPI keyboard and touchpad driver
+ *
+ * Copyright (c) 2015-2018 Federico Lorenzi
+ * Copyright (c) 2017-2018 Ronald Tschalär
+ */
+
+/*
+ * The keyboard and touchpad controller on the MacBookAir6, MacBookPro12,
+ * MacBook8 and newer can be driven either by USB or SPI. However the USB
+ * pins are only connected on the MacBookAir6 and 7 and the MacBookPro12.
+ * All others need this driver. The interface is selected using ACPI methods:
+ *
+ * * UIEN ("USB Interface Enable"): If invoked with argument 1, disables SPI
+ *   and enables USB. If invoked with argument 0, disables USB.
+ * * UIST ("USB Interface Status"): Returns 1 if USB is enabled, 0 otherwise.
+ * * SIEN ("SPI Interface Enable"): If invoked with argument 1, disables USB
+ *   and enables SPI. If invoked with argument 0, disables SPI.
+ * * SIST ("SPI Interface Status"): Returns 1 if SPI is enabled, 0 otherwise.
+ * * ISOL: Resets the four GPIO pins used for SPI. Intended to be invoked with
+ *   argument 1, then once more with argument 0.
+ *
+ * UIEN and UIST are only provided on models where the USB pins are connected.
+ *
+ * SPI-based Protocol
+ * ------------------
+ *
+ * The device and driver exchange messages (struct message); each message is
+ * encapsulated in one or more packets (struct spi_packet). There are two types
+ * of exchanges: reads, and writes. A read is signaled by a GPE, upon which one
+ * message can be read from the device. A write exchange consists of writing a
+ * command message, immediately reading a short status packet, and then, upon
+ * receiving a GPE, reading the response message. Write exchanges cannot be
+ * interleaved, i.e. a new write exchange must not be started till the previous
+ * write exchange is complete. Whether a received message is part of a read or
+ * write exchange is indicated in the encapsulating packet's flags field.
+ *
+ * A single message may be too large to fit in a single packet (which has a
+ * fixed, 256-byte size). In that case it will be split over multiple,
+ * consecutive packets.
+ */
+
+#include <linux/acpi.h>
+#include <linux/crc16.h>
+#include <linux/debugfs.h>
+#include <linux/delay.h>
+#include <linux/efi.h>
+#include <linux/input.h>
+#include <linux/input/mt.h>
+#include <linux/leds.h>
+#include <linux/module.h>
+#include <linux/spinlock.h>
+#include <linux/spi/spi.h>
+#include <linux/wait.h>
+#include <linux/workqueue.h>
+
+#include <asm/barrier.h>
+#include <asm/unaligned.h>
+
+#define CREATE_TRACE_POINTS
+#include "applespi.h"
+#include "applespi_trace.h"
+
+#define APPLESPI_PACKET_SIZE   256
+#define APPLESPI_STATUS_SIZE   4
+
+#define PACKET_TYPE_READ       0x20
+#define PACKET_TYPE_WRITE      0x40
+#define PACKET_DEV_KEYB                0x01
+#define PACKET_DEV_TPAD                0x02
+#define PACKET_DEV_INFO                0xd0
+
+#define MAX_ROLLOVER           6
+
+#define MAX_FINGERS            11
+#define MAX_FINGER_ORIENTATION 16384
+#define MAX_PKTS_PER_MSG       2
+
+#define KBD_BL_LEVEL_MIN       32U
+#define KBD_BL_LEVEL_MAX       255U
+#define KBD_BL_LEVEL_SCALE     1000000U
+#define KBD_BL_LEVEL_ADJ       \
+       ((KBD_BL_LEVEL_MAX - KBD_BL_LEVEL_MIN) * KBD_BL_LEVEL_SCALE / 255U)
+
+#define EFI_BL_LEVEL_NAME      L"KeyboardBacklightLevel"
+#define EFI_BL_LEVEL_GUID      EFI_GUID(0xa076d2af, 0x9678, 0x4386, 0x8b, 0x58, 0x1f, 0xc8, 0xef, 0x04, 0x16, 0x19)
+
+#define APPLE_FLAG_FKEY                0x01
+
+#define SPI_RW_CHG_DELAY_US    100     /* from experimentation, in Âµs */
+
+#define SYNAPTICS_VENDOR_ID    0x06cb
+
+static unsigned int fnmode = 1;
+module_param(fnmode, uint, 0644);
+MODULE_PARM_DESC(fnmode, "Mode of Fn key on Apple keyboards (0 = disabled, [1] = fkeyslast, 2 = fkeysfirst)");
+
+static unsigned int fnremap;
+module_param(fnremap, uint, 0644);
+MODULE_PARM_DESC(fnremap, "Remap Fn key ([0] = no-remap; 1 = left-ctrl, 2 = left-shift, 3 = left-alt, 4 = left-meta, 6 = right-shift, 7 = right-alt, 8 = right-meta)");
+
+static bool iso_layout;
+module_param(iso_layout, bool, 0644);
+MODULE_PARM_DESC(iso_layout, "Enable/Disable hardcoded ISO-layout of the keyboard. ([0] = disabled, 1 = enabled)");
+
+static char touchpad_dimensions[40];
+module_param_string(touchpad_dimensions, touchpad_dimensions,
+                   sizeof(touchpad_dimensions), 0444);
+MODULE_PARM_DESC(touchpad_dimensions, "The pixel dimensions of the touchpad, as XxY+W+H .");
+
+/**
+ * struct keyboard_protocol - keyboard message.
+ * message.type = 0x0110, message.length = 0x000a
+ *
+ * @unknown1:          unknown
+ * @modifiers:         bit-set of modifier/control keys pressed
+ * @unknown2:          unknown
+ * @keys_pressed:      the (non-modifier) keys currently pressed
+ * @fn_pressed:                whether the fn key is currently pressed
+ * @crc16:             crc over the whole message struct (message header +
+ *                     this struct) minus this @crc16 field
+ */
+struct keyboard_protocol {
+       u8                      unknown1;
+       u8                      modifiers;
+       u8                      unknown2;
+       u8                      keys_pressed[MAX_ROLLOVER];
+       u8                      fn_pressed;
+       __le16                  crc16;
+};
+
+/**
+ * struct tp_finger - single trackpad finger structure, le16-aligned
+ *
+ * @origin:            zero when switching track finger
+ * @abs_x:             absolute x coodinate
+ * @abs_y:             absolute y coodinate
+ * @rel_x:             relative x coodinate
+ * @rel_y:             relative y coodinate
+ * @tool_major:                tool area, major axis
+ * @tool_minor:                tool area, minor axis
+ * @orientation:       16384 when point, else 15 bit angle
+ * @touch_major:       touch area, major axis
+ * @touch_minor:       touch area, minor axis
+ * @unused:            zeros
+ * @pressure:          pressure on forcetouch touchpad
+ * @multi:             one finger: varies, more fingers: constant
+ * @crc16:             on last finger: crc over the whole message struct
+ *                     (i.e. message header + this struct) minus the last
+ *                     @crc16 field; unknown on all other fingers.
+ */
+struct tp_finger {
+       __le16 origin;
+       __le16 abs_x;
+       __le16 abs_y;
+       __le16 rel_x;
+       __le16 rel_y;
+       __le16 tool_major;
+       __le16 tool_minor;
+       __le16 orientation;
+       __le16 touch_major;
+       __le16 touch_minor;
+       __le16 unused[2];
+       __le16 pressure;
+       __le16 multi;
+       __le16 crc16;
+};
+
+/**
+ * struct touchpad_protocol - touchpad message.
+ * message.type = 0x0210
+ *
+ * @unknown1:          unknown
+ * @clicked:           1 if a button-click was detected, 0 otherwise
+ * @unknown2:          unknown
+ * @number_of_fingers: the number of fingers being reported in @fingers
+ * @clicked2:          same as @clicked
+ * @unknown3:          unknown
+ * @fingers:           the data for each finger
+ */
+struct touchpad_protocol {
+       u8                      unknown1[1];
+       u8                      clicked;
+       u8                      unknown2[28];
+       u8                      number_of_fingers;
+       u8                      clicked2;
+       u8                      unknown3[16];
+       struct tp_finger        fingers[0];
+};
+
+/**
+ * struct command_protocol_tp_info - get touchpad info.
+ * message.type = 0x1020, message.length = 0x0000
+ *
+ * @crc16:             crc over the whole message struct (message header +
+ *                     this struct) minus this @crc16 field
+ */
+struct command_protocol_tp_info {
+       __le16                  crc16;
+};
+
+/**
+ * struct touchpad_info - touchpad info response.
+ * message.type = 0x1020, message.length = 0x006e
+ *
+ * @unknown1:          unknown
+ * @model_flags:       flags (vary by model number, but significance otherwise
+ *                     unknown)
+ * @model_no:          the touchpad model number
+ * @unknown2:          unknown
+ * @crc16:             crc over the whole message struct (message header +
+ *                     this struct) minus this @crc16 field
+ */
+struct touchpad_info_protocol {
+       u8                      unknown1[105];
+       u8                      model_flags;
+       u8                      model_no;
+       u8                      unknown2[3];
+       __le16                  crc16;
+};
+
+/**
+ * struct command_protocol_mt_init - initialize multitouch.
+ * message.type = 0x0252, message.length = 0x0002
+ *
+ * @cmd:               value: 0x0102
+ * @crc16:             crc over the whole message struct (message header +
+ *                     this struct) minus this @crc16 field
+ */
+struct command_protocol_mt_init {
+       __le16                  cmd;
+       __le16                  crc16;
+};
+
+/**
+ * struct command_protocol_capsl - toggle caps-lock led
+ * message.type = 0x0151, message.length = 0x0002
+ *
+ * @unknown:           value: 0x01 (length?)
+ * @led:               0 off, 2 on
+ * @crc16:             crc over the whole message struct (message header +
+ *                     this struct) minus this @crc16 field
+ */
+struct command_protocol_capsl {
+       u8                      unknown;
+       u8                      led;
+       __le16                  crc16;
+};
+
+/**
+ * struct command_protocol_bl - set keyboard backlight brightness
+ * message.type = 0xB051, message.length = 0x0006
+ *
+ * @const1:            value: 0x01B0
+ * @level:             the brightness level to set
+ * @const2:            value: 0x0001 (backlight off), 0x01F4 (backlight on)
+ * @crc16:             crc over the whole message struct (message header +
+ *                     this struct) minus this @crc16 field
+ */
+struct command_protocol_bl {
+       __le16                  const1;
+       __le16                  level;
+       __le16                  const2;
+       __le16                  crc16;
+};
+
+/**
+ * struct message - a complete spi message.
+ *
+ * Each message begins with fixed header, followed by a message-type specific
+ * payload, and ends with a 16-bit crc. Because of the varying lengths of the
+ * payload, the crc is defined at the end of each payload struct, rather than
+ * in this struct.
+ *
+ * @type:      the message type
+ * @zero:      always 0
+ * @counter:   incremented on each message, rolls over after 255; there is a
+ *             separate counter for each message type.
+ * @rsp_buf_len:response buffer length (the exact nature of this field is quite
+ *             speculative). On a request/write this is often the same as
+ *             @length, though in some cases it has been seen to be much larger
+ *             (e.g. 0x400); on a response/read this the same as on the
+ *             request; for reads that are not responses it is 0.
+ * @length:    length of the remainder of the data in the whole message
+ *             structure (after re-assembly in case of being split over
+ *             multiple spi-packets), minus the trailing crc. The total size
+ *             of the message struct is therefore @length + 10.
+ */
+struct message {
+       __le16          type;
+       u8              zero;
+       u8              counter;
+       __le16          rsp_buf_len;
+       __le16          length;
+       union {
+               struct keyboard_protocol        keyboard;
+               struct touchpad_protocol        touchpad;
+               struct touchpad_info_protocol   tp_info;
+               struct command_protocol_tp_info tp_info_command;
+               struct command_protocol_mt_init init_mt_command;
+               struct command_protocol_capsl   capsl_command;
+               struct command_protocol_bl      bl_command;
+               u8                              data[0];
+       };
+};
+
+/* type + zero + counter + rsp_buf_len + length */
+#define MSG_HEADER_SIZE                8
+
+/**
+ * struct spi_packet - a complete spi packet; always 256 bytes. This carries
+ * the (parts of the) message in the data. But note that this does not
+ * necessarily contain a complete message, as in some cases (e.g. many
+ * fingers pressed) the message is split over multiple packets (see the
+ * @offset, @remaining, and @length fields). In general the data parts in
+ * spi_packet's are concatenated until @remaining is 0, and the result is an
+ * message.
+ *
+ * @flags:     0x40 = write (to device), 0x20 = read (from device); note that
+ *             the response to a write still has 0x40.
+ * @device:    1 = keyboard, 2 = touchpad
+ * @offset:    specifies the offset of this packet's data in the complete
+ *             message; i.e. > 0 indicates this is a continuation packet (in
+ *             the second packet for a message split over multiple packets
+ *             this would then be the same as the @length in the first packet)
+ * @remaining: number of message bytes remaining in subsequents packets (in
+ *             the first packet of a message split over two packets this would
+ *             then be the same as the @length in the second packet)
+ * @length:    length of the valid data in the @data in this packet
+ * @data:      all or part of a message
+ * @crc16:     crc over this whole structure minus this @crc16 field. This
+ *             covers just this packet, even on multi-packet messages (in
+ *             contrast to the crc in the message).
+ */
+struct spi_packet {
+       u8                      flags;
+       u8                      device;
+       __le16                  offset;
+       __le16                  remaining;
+       __le16                  length;
+       u8                      data[246];
+       __le16                  crc16;
+};
+
+struct spi_settings {
+       u64     spi_cs_delay;           /* cs-to-clk delay in us */
+       u64     reset_a2r_usec;         /* active-to-receive delay? */
+       u64     reset_rec_usec;         /* ? (cur val: 10) */
+};
+
+/* this mimics struct drm_rect */
+struct applespi_tp_info {
+       int     x_min;
+       int     y_min;
+       int     x_max;
+       int     y_max;
+};
+
+struct applespi_data {
+       struct spi_device               *spi;
+       struct spi_settings             spi_settings;
+       struct input_dev                *keyboard_input_dev;
+       struct input_dev                *touchpad_input_dev;
+
+       u8                              *tx_buffer;
+       u8                              *tx_status;
+       u8                              *rx_buffer;
+
+       u8                              *msg_buf;
+       unsigned int                    saved_msg_len;
+
+       struct applespi_tp_info         tp_info;
+
+       u8                              last_keys_pressed[MAX_ROLLOVER];
+       u8                              last_keys_fn_pressed[MAX_ROLLOVER];
+       u8                              last_fn_pressed;
+       struct input_mt_pos             pos[MAX_FINGERS];
+       int                             slots[MAX_FINGERS];
+       int                             gpe;
+       acpi_handle                     sien;
+       acpi_handle                     sist;
+
+       struct spi_transfer             dl_t;
+       struct spi_transfer             rd_t;
+       struct spi_message              rd_m;
+
+       struct spi_transfer             ww_t;
+       struct spi_transfer             wd_t;
+       struct spi_transfer             wr_t;
+       struct spi_transfer             st_t;
+       struct spi_message              wr_m;
+
+       bool                            want_tp_info_cmd;
+       bool                            want_mt_init_cmd;
+       bool                            want_cl_led_on;
+       bool                            have_cl_led_on;
+       unsigned int                    want_bl_level;
+       unsigned int                    have_bl_level;
+       unsigned int                    cmd_msg_cntr;
+       /* lock to protect the above parameters and flags below */
+       spinlock_t                      cmd_msg_lock;
+       bool                            cmd_msg_queued;
+       enum applespi_evt_type          cmd_evt_type;
+
+       struct led_classdev             backlight_info;
+
+       bool                            suspended;
+       bool                            drain;
+       wait_queue_head_t               drain_complete;
+       bool                            read_active;
+       bool                            write_active;
+
+       struct work_struct              work;
+       struct touchpad_info_protocol   rcvd_tp_info;
+
+       struct dentry                   *debugfs_root;
+       bool                            debug_tp_dim;
+       char                            tp_dim_val[40];
+       int                             tp_dim_min_x;
+       int                             tp_dim_max_x;
+       int                             tp_dim_min_y;
+       int                             tp_dim_max_y;
+};
+
+static const unsigned char applespi_scancodes[] = {
+       0, 0, 0, 0,
+       KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J,
+       KEY_K, KEY_L, KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T,
+       KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z,
+       KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0,
+       KEY_ENTER, KEY_ESC, KEY_BACKSPACE, KEY_TAB, KEY_SPACE, KEY_MINUS,
+       KEY_EQUAL, KEY_LEFTBRACE, KEY_RIGHTBRACE, KEY_BACKSLASH, 0,
+       KEY_SEMICOLON, KEY_APOSTROPHE, KEY_GRAVE, KEY_COMMA, KEY_DOT, KEY_SLASH,
+       KEY_CAPSLOCK,
+       KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9,
+       KEY_F10, KEY_F11, KEY_F12, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       KEY_RIGHT, KEY_LEFT, KEY_DOWN, KEY_UP,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_102ND,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_RO, 0, KEY_YEN, 0, 0, 0, 0, 0,
+       0, KEY_KATAKANAHIRAGANA, KEY_MUHENKAN
+};
+
+/*
+ * This must have exactly as many entries as there are bits in
+ * struct keyboard_protocol.modifiers .
+ */
+static const unsigned char applespi_controlcodes[] = {
+       KEY_LEFTCTRL,
+       KEY_LEFTSHIFT,
+       KEY_LEFTALT,
+       KEY_LEFTMETA,
+       0,
+       KEY_RIGHTSHIFT,
+       KEY_RIGHTALT,
+       KEY_RIGHTMETA
+};
+
+struct applespi_key_translation {
+       u16 from;
+       u16 to;
+       u8 flags;
+};
+
+static const struct applespi_key_translation applespi_fn_codes[] = {
+       { KEY_BACKSPACE, KEY_DELETE },
+       { KEY_ENTER,    KEY_INSERT },
+       { KEY_F1,       KEY_BRIGHTNESSDOWN,     APPLE_FLAG_FKEY },
+       { KEY_F2,       KEY_BRIGHTNESSUP,       APPLE_FLAG_FKEY },
+       { KEY_F3,       KEY_SCALE,              APPLE_FLAG_FKEY },
+       { KEY_F4,       KEY_DASHBOARD,          APPLE_FLAG_FKEY },
+       { KEY_F5,       KEY_KBDILLUMDOWN,       APPLE_FLAG_FKEY },
+       { KEY_F6,       KEY_KBDILLUMUP,         APPLE_FLAG_FKEY },
+       { KEY_F7,       KEY_PREVIOUSSONG,       APPLE_FLAG_FKEY },
+       { KEY_F8,       KEY_PLAYPAUSE,          APPLE_FLAG_FKEY },
+       { KEY_F9,       KEY_NEXTSONG,           APPLE_FLAG_FKEY },
+       { KEY_F10,      KEY_MUTE,               APPLE_FLAG_FKEY },
+       { KEY_F11,      KEY_VOLUMEDOWN,         APPLE_FLAG_FKEY },
+       { KEY_F12,      KEY_VOLUMEUP,           APPLE_FLAG_FKEY },
+       { KEY_RIGHT,    KEY_END },
+       { KEY_LEFT,     KEY_HOME },
+       { KEY_DOWN,     KEY_PAGEDOWN },
+       { KEY_UP,       KEY_PAGEUP },
+       { }
+};
+
+static const struct applespi_key_translation apple_iso_keyboard[] = {
+       { KEY_GRAVE,    KEY_102ND },
+       { KEY_102ND,    KEY_GRAVE },
+       { }
+};
+
+struct applespi_tp_model_info {
+       u16                     model;
+       struct applespi_tp_info tp_info;
+};
+
+static const struct applespi_tp_model_info applespi_tp_models[] = {
+       {
+               .model = 0x04,  /* MB8 MB9 MB10 */
+               .tp_info = { -5087, -182, 5579, 6089 },
+       },
+       {
+               .model = 0x05,  /* MBP13,1 MBP13,2 MBP14,1 MBP14,2 */
+               .tp_info = { -6243, -170, 6749, 7685 },
+       },
+       {
+               .model = 0x06,  /* MBP13,3 MBP14,3 */
+               .tp_info = { -7456, -163, 7976, 9283 },
+       },
+       {}
+};
+
+typedef void (*applespi_trace_fun)(enum applespi_evt_type,
+                                  enum applespi_pkt_type, u8 *, size_t);
+
+static applespi_trace_fun applespi_get_trace_fun(enum applespi_evt_type type)
+{
+       switch (type) {
+       case ET_CMD_TP_INI:
+               return trace_applespi_tp_ini_cmd;
+       case ET_CMD_BL:
+               return trace_applespi_backlight_cmd;
+       case ET_CMD_CL:
+               return trace_applespi_caps_lock_cmd;
+       case ET_RD_KEYB:
+               return trace_applespi_keyboard_data;
+       case ET_RD_TPAD:
+               return trace_applespi_touchpad_data;
+       case ET_RD_UNKN:
+               return trace_applespi_unknown_data;
+       default:
+               WARN_ONCE(1, "Unknown msg type %d", type);
+               return trace_applespi_unknown_data;
+       }
+}
+
+static void applespi_setup_read_txfrs(struct applespi_data *applespi)
+{
+       struct spi_message *msg = &applespi->rd_m;
+       struct spi_transfer *dl_t = &applespi->dl_t;
+       struct spi_transfer *rd_t = &applespi->rd_t;
+
+       memset(dl_t, 0, sizeof(*dl_t));
+       memset(rd_t, 0, sizeof(*rd_t));
+
+       dl_t->delay_usecs = applespi->spi_settings.spi_cs_delay;
+
+       rd_t->rx_buf = applespi->rx_buffer;
+       rd_t->len = APPLESPI_PACKET_SIZE;
+
+       spi_message_init(msg);
+       spi_message_add_tail(dl_t, msg);
+       spi_message_add_tail(rd_t, msg);
+}
+
+static void applespi_setup_write_txfrs(struct applespi_data *applespi)
+{
+       struct spi_message *msg = &applespi->wr_m;
+       struct spi_transfer *wt_t = &applespi->ww_t;
+       struct spi_transfer *dl_t = &applespi->wd_t;
+       struct spi_transfer *wr_t = &applespi->wr_t;
+       struct spi_transfer *st_t = &applespi->st_t;
+
+       memset(wt_t, 0, sizeof(*wt_t));
+       memset(dl_t, 0, sizeof(*dl_t));
+       memset(wr_t, 0, sizeof(*wr_t));
+       memset(st_t, 0, sizeof(*st_t));
+
+       /*
+        * All we need here is a delay at the beginning of the message before
+        * asserting cs. But the current spi API doesn't support this, so we
+        * end up with an extra unnecessary (but harmless) cs assertion and
+        * deassertion.
+        */
+       wt_t->delay_usecs = SPI_RW_CHG_DELAY_US;
+       wt_t->cs_change = 1;
+
+       dl_t->delay_usecs = applespi->spi_settings.spi_cs_delay;
+
+       wr_t->tx_buf = applespi->tx_buffer;
+       wr_t->len = APPLESPI_PACKET_SIZE;
+       wr_t->delay_usecs = SPI_RW_CHG_DELAY_US;
+
+       st_t->rx_buf = applespi->tx_status;
+       st_t->len = APPLESPI_STATUS_SIZE;
+
+       spi_message_init(msg);
+       spi_message_add_tail(wt_t, msg);
+       spi_message_add_tail(dl_t, msg);
+       spi_message_add_tail(wr_t, msg);
+       spi_message_add_tail(st_t, msg);
+}
+
+static int applespi_async(struct applespi_data *applespi,
+                         struct spi_message *message, void (*complete)(void *))
+{
+       message->complete = complete;
+       message->context = applespi;
+
+       return spi_async(applespi->spi, message);
+}
+
+static inline bool applespi_check_write_status(struct applespi_data *applespi,
+                                              int sts)
+{
+       static u8 status_ok[] = { 0xac, 0x27, 0x68, 0xd5 };
+
+       if (sts < 0) {
+               dev_warn(&applespi->spi->dev, "Error writing to device: %d\n",
+                        sts);
+               return false;
+       }
+
+       if (memcmp(applespi->tx_status, status_ok, APPLESPI_STATUS_SIZE)) {
+               dev_warn(&applespi->spi->dev, "Error writing to device: %*ph\n",
+                        APPLESPI_STATUS_SIZE, applespi->tx_status);
+               return false;
+       }
+
+       return true;
+}
+
+static int applespi_get_spi_settings(struct applespi_data *applespi)
+{
+       struct acpi_device *adev = ACPI_COMPANION(&applespi->spi->dev);
+       const union acpi_object *o;
+       struct spi_settings *settings = &applespi->spi_settings;
+
+       if (!acpi_dev_get_property(adev, "spiCSDelay", ACPI_TYPE_BUFFER, &o))
+               settings->spi_cs_delay = *(u64 *)o->buffer.pointer;
+       else
+               dev_warn(&applespi->spi->dev,
+                        "Property spiCSDelay not found\n");
+
+       if (!acpi_dev_get_property(adev, "resetA2RUsec", ACPI_TYPE_BUFFER, &o))
+               settings->reset_a2r_usec = *(u64 *)o->buffer.pointer;
+       else
+               dev_warn(&applespi->spi->dev,
+                        "Property resetA2RUsec not found\n");
+
+       if (!acpi_dev_get_property(adev, "resetRecUsec", ACPI_TYPE_BUFFER, &o))
+               settings->reset_rec_usec = *(u64 *)o->buffer.pointer;
+       else
+               dev_warn(&applespi->spi->dev,
+                        "Property resetRecUsec not found\n");
+
+       dev_dbg(&applespi->spi->dev,
+               "SPI settings: spi_cs_delay=%llu reset_a2r_usec=%llu reset_rec_usec=%llu\n",
+               settings->spi_cs_delay, settings->reset_a2r_usec,
+               settings->reset_rec_usec);
+
+       return 0;
+}
+
+static int applespi_setup_spi(struct applespi_data *applespi)
+{
+       int sts;
+
+       sts = applespi_get_spi_settings(applespi);
+       if (sts)
+               return sts;
+
+       spin_lock_init(&applespi->cmd_msg_lock);
+       init_waitqueue_head(&applespi->drain_complete);
+
+       return 0;
+}
+
+static int applespi_enable_spi(struct applespi_data *applespi)
+{
+       acpi_status acpi_sts;
+       unsigned long long spi_status;
+
+       /* check if SPI is already enabled, so we can skip the delay below */
+       acpi_sts = acpi_evaluate_integer(applespi->sist, NULL, NULL,
+                                        &spi_status);
+       if (ACPI_SUCCESS(acpi_sts) && spi_status)
+               return 0;
+
+       /* SIEN(1) will enable SPI communication */
+       acpi_sts = acpi_execute_simple_method(applespi->sien, NULL, 1);
+       if (ACPI_FAILURE(acpi_sts)) {
+               dev_err(&applespi->spi->dev, "SIEN failed: %s\n",
+                       acpi_format_exception(acpi_sts));
+               return -ENODEV;
+       }
+
+       /*
+        * Allow the SPI interface to come up before returning. Without this
+        * delay, the SPI commands to enable multitouch mode may not reach
+        * the trackpad controller, causing pointer movement to break upon
+        * resume from sleep.
+        */
+       msleep(50);
+
+       return 0;
+}
+
+static int applespi_send_cmd_msg(struct applespi_data *applespi);
+
+static void applespi_msg_complete(struct applespi_data *applespi,
+                                 bool is_write_msg, bool is_read_compl)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
+
+       if (is_read_compl)
+               applespi->read_active = false;
+       if (is_write_msg)
+               applespi->write_active = false;
+
+       if (applespi->drain && !applespi->write_active)
+               wake_up_all(&applespi->drain_complete);
+
+       if (is_write_msg) {
+               applespi->cmd_msg_queued = false;
+               applespi_send_cmd_msg(applespi);
+       }
+
+       spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
+}
+
+static void applespi_async_write_complete(void *context)
+{
+       struct applespi_data *applespi = context;
+       enum applespi_evt_type evt_type = applespi->cmd_evt_type;
+
+       applespi_get_trace_fun(evt_type)(evt_type, PT_WRITE,
+                                        applespi->tx_buffer,
+                                        APPLESPI_PACKET_SIZE);
+       applespi_get_trace_fun(evt_type)(evt_type, PT_STATUS,
+                                        applespi->tx_status,
+                                        APPLESPI_STATUS_SIZE);
+
+       if (!applespi_check_write_status(applespi, applespi->wr_m.status)) {
+               /*
+                * If we got an error, we presumably won't get the expected
+                * response message either.
+                */
+               applespi_msg_complete(applespi, true, false);
+       }
+}
+
+static int applespi_send_cmd_msg(struct applespi_data *applespi)
+{
+       u16 crc;
+       int sts;
+       struct spi_packet *packet = (struct spi_packet *)applespi->tx_buffer;
+       struct message *message = (struct message *)packet->data;
+       u16 msg_len;
+       u8 device;
+
+       /* check if draining */
+       if (applespi->drain)
+               return 0;
+
+       /* check whether send is in progress */
+       if (applespi->cmd_msg_queued)
+               return 0;
+
+       /* set up packet */
+       memset(packet, 0, APPLESPI_PACKET_SIZE);
+
+       /* are we processing init commands? */
+       if (applespi->want_tp_info_cmd) {
+               applespi->want_tp_info_cmd = false;
+               applespi->want_mt_init_cmd = true;
+               applespi->cmd_evt_type = ET_CMD_TP_INI;
+
+               /* build init command */
+               device = PACKET_DEV_INFO;
+
+               message->type = cpu_to_le16(0x1020);
+               msg_len = sizeof(message->tp_info_command);
+
+               message->zero = 0x02;
+               message->rsp_buf_len = cpu_to_le16(0x0200);
+
+       } else if (applespi->want_mt_init_cmd) {
+               applespi->want_mt_init_cmd = false;
+               applespi->cmd_evt_type = ET_CMD_TP_INI;
+
+               /* build init command */
+               device = PACKET_DEV_TPAD;
+
+               message->type = cpu_to_le16(0x0252);
+               msg_len = sizeof(message->init_mt_command);
+
+               message->init_mt_command.cmd = cpu_to_le16(0x0102);
+
+       /* do we need caps-lock command? */
+       } else if (applespi->want_cl_led_on != applespi->have_cl_led_on) {
+               applespi->have_cl_led_on = applespi->want_cl_led_on;
+               applespi->cmd_evt_type = ET_CMD_CL;
+
+               /* build led command */
+               device = PACKET_DEV_KEYB;
+
+               message->type = cpu_to_le16(0x0151);
+               msg_len = sizeof(message->capsl_command);
+
+               message->capsl_command.unknown = 0x01;
+               message->capsl_command.led = applespi->have_cl_led_on ? 2 : 0;
+
+       /* do we need backlight command? */
+       } else if (applespi->want_bl_level != applespi->have_bl_level) {
+               applespi->have_bl_level = applespi->want_bl_level;
+               applespi->cmd_evt_type = ET_CMD_BL;
+
+               /* build command buffer */
+               device = PACKET_DEV_KEYB;
+
+               message->type = cpu_to_le16(0xB051);
+               msg_len = sizeof(message->bl_command);
+
+               message->bl_command.const1 = cpu_to_le16(0x01B0);
+               message->bl_command.level =
+                               cpu_to_le16(applespi->have_bl_level);
+
+               if (applespi->have_bl_level > 0)
+                       message->bl_command.const2 = cpu_to_le16(0x01F4);
+               else
+                       message->bl_command.const2 = cpu_to_le16(0x0001);
+
+       /* everything's up-to-date */
+       } else {
+               return 0;
+       }
+
+       /* finalize packet */
+       packet->flags = PACKET_TYPE_WRITE;
+       packet->device = device;
+       packet->length = cpu_to_le16(MSG_HEADER_SIZE + msg_len);
+
+       message->counter = applespi->cmd_msg_cntr++ % (U8_MAX + 1);
+
+       message->length = cpu_to_le16(msg_len - 2);
+       if (!message->rsp_buf_len)
+               message->rsp_buf_len = message->length;
+
+       crc = crc16(0, (u8 *)message, le16_to_cpu(packet->length) - 2);
+       put_unaligned_le16(crc, &message->data[msg_len - 2]);
+
+       crc = crc16(0, (u8 *)packet, sizeof(*packet) - 2);
+       packet->crc16 = cpu_to_le16(crc);
+
+       /* send command */
+       sts = applespi_async(applespi, &applespi->wr_m,
+                            applespi_async_write_complete);
+       if (sts) {
+               dev_warn(&applespi->spi->dev,
+                        "Error queueing async write to device: %d\n", sts);
+               return sts;
+       }
+
+       applespi->cmd_msg_queued = true;
+       applespi->write_active = true;
+
+       return 0;
+}
+
+static void applespi_init(struct applespi_data *applespi, bool is_resume)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
+
+       if (is_resume)
+               applespi->want_mt_init_cmd = true;
+       else
+               applespi->want_tp_info_cmd = true;
+       applespi_send_cmd_msg(applespi);
+
+       spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
+}
+
+static int applespi_set_capsl_led(struct applespi_data *applespi,
+                                 bool capslock_on)
+{
+       unsigned long flags;
+       int sts;
+
+       spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
+
+       applespi->want_cl_led_on = capslock_on;
+       sts = applespi_send_cmd_msg(applespi);
+
+       spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
+
+       return sts;
+}
+
+static void applespi_set_bl_level(struct led_classdev *led_cdev,
+                                 enum led_brightness value)
+{
+       struct applespi_data *applespi =
+               container_of(led_cdev, struct applespi_data, backlight_info);
+       unsigned long flags;
+
+       spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
+
+       if (value == 0) {
+               applespi->want_bl_level = value;
+       } else {
+               /*
+                * The backlight does not turn on till level 32, so we scale
+                * the range here so that from a user's perspective it turns
+                * on at 1.
+                */
+               applespi->want_bl_level =
+                       ((value * KBD_BL_LEVEL_ADJ) / KBD_BL_LEVEL_SCALE +
+                        KBD_BL_LEVEL_MIN);
+       }
+
+       applespi_send_cmd_msg(applespi);
+
+       spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
+}
+
+static int applespi_event(struct input_dev *dev, unsigned int type,
+                         unsigned int code, int value)
+{
+       struct applespi_data *applespi = input_get_drvdata(dev);
+
+       switch (type) {
+       case EV_LED:
+               applespi_set_capsl_led(applespi, !!test_bit(LED_CAPSL, dev->led));
+               return 0;
+       }
+
+       return -EINVAL;
+}
+
+/* lifted from the BCM5974 driver and renamed from raw2int */
+/* convert 16-bit little endian to signed integer */
+static inline int le16_to_int(__le16 x)
+{
+       return (signed short)le16_to_cpu(x);
+}
+
+static void applespi_debug_update_dimensions(struct applespi_data *applespi,
+                                            const struct tp_finger *f)
+{
+       applespi->tp_dim_min_x = min_t(int, applespi->tp_dim_min_x, f->abs_x);
+       applespi->tp_dim_max_x = max_t(int, applespi->tp_dim_max_x, f->abs_x);
+       applespi->tp_dim_min_y = min_t(int, applespi->tp_dim_min_y, f->abs_y);
+       applespi->tp_dim_max_y = max_t(int, applespi->tp_dim_max_y, f->abs_y);
+}
+
+static int applespi_tp_dim_open(struct inode *inode, struct file *file)
+{
+       struct applespi_data *applespi = inode->i_private;
+
+       file->private_data = applespi;
+
+       snprintf(applespi->tp_dim_val, sizeof(applespi->tp_dim_val),
+                "0x%.4x %dx%d+%u+%u\n",
+                applespi->touchpad_input_dev->id.product,
+                applespi->tp_dim_min_x, applespi->tp_dim_min_y,
+                applespi->tp_dim_max_x - applespi->tp_dim_min_x,
+                applespi->tp_dim_max_y - applespi->tp_dim_min_y);
+
+       return nonseekable_open(inode, file);
+}
+
+static ssize_t applespi_tp_dim_read(struct file *file, char __user *buf,
+                                   size_t len, loff_t *off)
+{
+       struct applespi_data *applespi = file->private_data;
+
+       return simple_read_from_buffer(buf, len, off, applespi->tp_dim_val,
+                                      strlen(applespi->tp_dim_val));
+}
+
+static const struct file_operations applespi_tp_dim_fops = {
+       .owner = THIS_MODULE,
+       .open = applespi_tp_dim_open,
+       .read = applespi_tp_dim_read,
+       .llseek = no_llseek,
+};
+
+static void report_finger_data(struct input_dev *input, int slot,
+                              const struct input_mt_pos *pos,
+                              const struct tp_finger *f)
+{
+       input_mt_slot(input, slot);
+       input_mt_report_slot_state(input, MT_TOOL_FINGER, true);
+
+       input_report_abs(input, ABS_MT_TOUCH_MAJOR,
+                        le16_to_int(f->touch_major) << 1);
+       input_report_abs(input, ABS_MT_TOUCH_MINOR,
+                        le16_to_int(f->touch_minor) << 1);
+       input_report_abs(input, ABS_MT_WIDTH_MAJOR,
+                        le16_to_int(f->tool_major) << 1);
+       input_report_abs(input, ABS_MT_WIDTH_MINOR,
+                        le16_to_int(f->tool_minor) << 1);
+       input_report_abs(input, ABS_MT_ORIENTATION,
+                        MAX_FINGER_ORIENTATION - le16_to_int(f->orientation));
+       input_report_abs(input, ABS_MT_POSITION_X, pos->x);
+       input_report_abs(input, ABS_MT_POSITION_Y, pos->y);
+}
+
+static void report_tp_state(struct applespi_data *applespi,
+                           struct touchpad_protocol *t)
+{
+       const struct tp_finger *f;
+       struct input_dev *input;
+       const struct applespi_tp_info *tp_info = &applespi->tp_info;
+       int i, n;
+
+       /* touchpad_input_dev is set async in worker */
+       input = smp_load_acquire(&applespi->touchpad_input_dev);
+       if (!input)
+               return; /* touchpad isn't initialized yet */
+
+       n = 0;
+
+       for (i = 0; i < t->number_of_fingers; i++) {
+               f = &t->fingers[i];
+               if (le16_to_int(f->touch_major) == 0)
+                       continue;
+               applespi->pos[n].x = le16_to_int(f->abs_x);
+               applespi->pos[n].y = tp_info->y_min + tp_info->y_max -
+                                    le16_to_int(f->abs_y);
+               n++;
+
+               if (applespi->debug_tp_dim)
+                       applespi_debug_update_dimensions(applespi, f);
+       }
+
+       input_mt_assign_slots(input, applespi->slots, applespi->pos, n, 0);
+
+       for (i = 0; i < n; i++)
+               report_finger_data(input, applespi->slots[i],
+                                  &applespi->pos[i], &t->fingers[i]);
+
+       input_mt_sync_frame(input);
+       input_report_key(input, BTN_LEFT, t->clicked);
+
+       input_sync(input);
+}
+
+static const struct applespi_key_translation *
+applespi_find_translation(const struct applespi_key_translation *table, u16 key)
+{
+       const struct applespi_key_translation *trans;
+
+       for (trans = table; trans->from; trans++)
+               if (trans->from == key)
+                       return trans;
+
+       return NULL;
+}
+
+static unsigned int applespi_translate_fn_key(unsigned int key, int fn_pressed)
+{
+       const struct applespi_key_translation *trans;
+       int do_translate;
+
+       trans = applespi_find_translation(applespi_fn_codes, key);
+       if (trans) {
+               if (trans->flags & APPLE_FLAG_FKEY)
+                       do_translate = (fnmode == 2 && fn_pressed) ||
+                                      (fnmode == 1 && !fn_pressed);
+               else
+                       do_translate = fn_pressed;
+
+               if (do_translate)
+                       key = trans->to;
+       }
+
+       return key;
+}
+
+static unsigned int applespi_translate_iso_layout(unsigned int key)
+{
+       const struct applespi_key_translation *trans;
+
+       trans = applespi_find_translation(apple_iso_keyboard, key);
+       if (trans)
+               key = trans->to;
+
+       return key;
+}
+
+static unsigned int applespi_code_to_key(u8 code, int fn_pressed)
+{
+       unsigned int key = applespi_scancodes[code];
+
+       if (fnmode)
+               key = applespi_translate_fn_key(key, fn_pressed);
+       if (iso_layout)
+               key = applespi_translate_iso_layout(key);
+       return key;
+}
+
+static void
+applespi_remap_fn_key(struct keyboard_protocol *keyboard_protocol)
+{
+       unsigned char tmp;
+       u8 bit = BIT((fnremap - 1) & 0x07);
+
+       if (!fnremap || fnremap > ARRAY_SIZE(applespi_controlcodes) ||
+           !applespi_controlcodes[fnremap - 1])
+               return;
+
+       tmp = keyboard_protocol->fn_pressed;
+       keyboard_protocol->fn_pressed = !!(keyboard_protocol->modifiers & bit);
+       if (tmp)
+               keyboard_protocol->modifiers |= bit;
+       else
+               keyboard_protocol->modifiers &= ~bit;
+}
+
+static void
+applespi_handle_keyboard_event(struct applespi_data *applespi,
+                              struct keyboard_protocol *keyboard_protocol)
+{
+       unsigned int key;
+       int i;
+
+       compiletime_assert(ARRAY_SIZE(applespi_controlcodes) ==
+                          sizeof_field(struct keyboard_protocol, modifiers) * 8,
+                          "applespi_controlcodes has wrong number of entries");
+
+       /* check for rollover overflow, which is signalled by all keys == 1 */
+       if (!memchr_inv(keyboard_protocol->keys_pressed, 1, MAX_ROLLOVER))
+               return;
+
+       /* remap fn key if desired */
+       applespi_remap_fn_key(keyboard_protocol);
+
+       /* check released keys */
+       for (i = 0; i < MAX_ROLLOVER; i++) {
+               if (memchr(keyboard_protocol->keys_pressed,
+                          applespi->last_keys_pressed[i], MAX_ROLLOVER))
+                       continue;       /* key is still pressed */
+
+               key = applespi_code_to_key(applespi->last_keys_pressed[i],
+                                          applespi->last_keys_fn_pressed[i]);
+               input_report_key(applespi->keyboard_input_dev, key, 0);
+               applespi->last_keys_fn_pressed[i] = 0;
+       }
+
+       /* check pressed keys */
+       for (i = 0; i < MAX_ROLLOVER; i++) {
+               if (keyboard_protocol->keys_pressed[i] <
+                               ARRAY_SIZE(applespi_scancodes) &&
+                   keyboard_protocol->keys_pressed[i] > 0) {
+                       key = applespi_code_to_key(
+                                       keyboard_protocol->keys_pressed[i],
+                                       keyboard_protocol->fn_pressed);
+                       input_report_key(applespi->keyboard_input_dev, key, 1);
+                       applespi->last_keys_fn_pressed[i] =
+                                       keyboard_protocol->fn_pressed;
+               }
+       }
+
+       /* check control keys */
+       for (i = 0; i < ARRAY_SIZE(applespi_controlcodes); i++) {
+               if (keyboard_protocol->modifiers & BIT(i))
+                       input_report_key(applespi->keyboard_input_dev,
+                                        applespi_controlcodes[i], 1);
+               else
+                       input_report_key(applespi->keyboard_input_dev,
+                                        applespi_controlcodes[i], 0);
+       }
+
+       /* check function key */
+       if (keyboard_protocol->fn_pressed && !applespi->last_fn_pressed)
+               input_report_key(applespi->keyboard_input_dev, KEY_FN, 1);
+       else if (!keyboard_protocol->fn_pressed && applespi->last_fn_pressed)
+               input_report_key(applespi->keyboard_input_dev, KEY_FN, 0);
+       applespi->last_fn_pressed = keyboard_protocol->fn_pressed;
+
+       /* done */
+       input_sync(applespi->keyboard_input_dev);
+       memcpy(&applespi->last_keys_pressed, keyboard_protocol->keys_pressed,
+              sizeof(applespi->last_keys_pressed));
+}
+
+static const struct applespi_tp_info *applespi_find_touchpad_info(u8 model)
+{
+       const struct applespi_tp_model_info *info;
+
+       for (info = applespi_tp_models; info->model; info++) {
+               if (info->model == model)
+                       return &info->tp_info;
+       }
+
+       return NULL;
+}
+
+static int
+applespi_register_touchpad_device(struct applespi_data *applespi,
+                                 struct touchpad_info_protocol *rcvd_tp_info)
+{
+       const struct applespi_tp_info *tp_info;
+       struct input_dev *touchpad_input_dev;
+       int sts;
+
+       /* set up touchpad dimensions */
+       tp_info = applespi_find_touchpad_info(rcvd_tp_info->model_no);
+       if (!tp_info) {
+               dev_warn(&applespi->spi->dev,
+                        "Unknown touchpad model %x - falling back to MB8 touchpad\n",
+                        rcvd_tp_info->model_no);
+               tp_info = &applespi_tp_models[0].tp_info;
+       }
+
+       applespi->tp_info = *tp_info;
+
+       if (touchpad_dimensions[0]) {
+               int x, y, w, h;
+
+               sts = sscanf(touchpad_dimensions, "%dx%d+%u+%u", &x, &y, &w, &h);
+               if (sts == 4) {
+                       dev_info(&applespi->spi->dev,
+                                "Overriding touchpad dimensions from module param\n");
+                       applespi->tp_info.x_min = x;
+                       applespi->tp_info.y_min = y;
+                       applespi->tp_info.x_max = x + w;
+                       applespi->tp_info.y_max = y + h;
+               } else {
+                       dev_warn(&applespi->spi->dev,
+                                "Invalid touchpad dimensions '%s': must be in the form XxY+W+H\n",
+                                touchpad_dimensions);
+                       touchpad_dimensions[0] = '\0';
+               }
+       }
+       if (!touchpad_dimensions[0]) {
+               snprintf(touchpad_dimensions, sizeof(touchpad_dimensions),
+                        "%dx%d+%u+%u",
+                        applespi->tp_info.x_min,
+                        applespi->tp_info.y_min,
+                        applespi->tp_info.x_max - applespi->tp_info.x_min,
+                        applespi->tp_info.y_max - applespi->tp_info.y_min);
+       }
+
+       /* create touchpad input device */
+       touchpad_input_dev = devm_input_allocate_device(&applespi->spi->dev);
+       if (!touchpad_input_dev) {
+               dev_err(&applespi->spi->dev,
+                       "Failed to allocate touchpad input device\n");
+               return -ENOMEM;
+       }
+
+       touchpad_input_dev->name = "Apple SPI Touchpad";
+       touchpad_input_dev->phys = "applespi/input1";
+       touchpad_input_dev->dev.parent = &applespi->spi->dev;
+       touchpad_input_dev->id.bustype = BUS_SPI;
+       touchpad_input_dev->id.vendor = SYNAPTICS_VENDOR_ID;
+       touchpad_input_dev->id.product =
+                       rcvd_tp_info->model_no << 8 | rcvd_tp_info->model_flags;
+
+       /* basic properties */
+       input_set_capability(touchpad_input_dev, EV_REL, REL_X);
+       input_set_capability(touchpad_input_dev, EV_REL, REL_Y);
+
+       __set_bit(INPUT_PROP_POINTER, touchpad_input_dev->propbit);
+       __set_bit(INPUT_PROP_BUTTONPAD, touchpad_input_dev->propbit);
+
+       /* finger touch area */
+       input_set_abs_params(touchpad_input_dev, ABS_MT_TOUCH_MAJOR,
+                            0, 5000, 0, 0);
+       input_set_abs_params(touchpad_input_dev, ABS_MT_TOUCH_MINOR,
+                            0, 5000, 0, 0);
+
+       /* finger approach area */
+       input_set_abs_params(touchpad_input_dev, ABS_MT_WIDTH_MAJOR,
+                            0, 5000, 0, 0);
+       input_set_abs_params(touchpad_input_dev, ABS_MT_WIDTH_MINOR,
+                            0, 5000, 0, 0);
+
+       /* finger orientation */
+       input_set_abs_params(touchpad_input_dev, ABS_MT_ORIENTATION,
+                            -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION,
+                            0, 0);
+
+       /* finger position */
+       input_set_abs_params(touchpad_input_dev, ABS_MT_POSITION_X,
+                            applespi->tp_info.x_min, applespi->tp_info.x_max,
+                            0, 0);
+       input_set_abs_params(touchpad_input_dev, ABS_MT_POSITION_Y,
+                            applespi->tp_info.y_min, applespi->tp_info.y_max,
+                            0, 0);
+
+       /* touchpad button */
+       input_set_capability(touchpad_input_dev, EV_KEY, BTN_LEFT);
+
+       /* multitouch */
+       sts = input_mt_init_slots(touchpad_input_dev, MAX_FINGERS,
+                                 INPUT_MT_POINTER | INPUT_MT_DROP_UNUSED |
+                                       INPUT_MT_TRACK);
+       if (sts) {
+               dev_err(&applespi->spi->dev,
+                       "failed to initialize slots: %d", sts);
+               return sts;
+       }
+
+       /* register input device */
+       sts = input_register_device(touchpad_input_dev);
+       if (sts) {
+               dev_err(&applespi->spi->dev,
+                       "Unable to register touchpad input device (%d)\n", sts);
+               return sts;
+       }
+
+       /* touchpad_input_dev is read async in spi callback */
+       smp_store_release(&applespi->touchpad_input_dev, touchpad_input_dev);
+
+       return 0;
+}
+
+static void applespi_worker(struct work_struct *work)
+{
+       struct applespi_data *applespi =
+               container_of(work, struct applespi_data, work);
+
+       applespi_register_touchpad_device(applespi, &applespi->rcvd_tp_info);
+}
+
+static void applespi_handle_cmd_response(struct applespi_data *applespi,
+                                        struct spi_packet *packet,
+                                        struct message *message)
+{
+       if (packet->device == PACKET_DEV_INFO &&
+           le16_to_cpu(message->type) == 0x1020) {
+               /*
+                * We're not allowed to sleep here, but registering an input
+                * device can sleep.
+                */
+               applespi->rcvd_tp_info = message->tp_info;
+               schedule_work(&applespi->work);
+               return;
+       }
+
+       if (le16_to_cpu(message->length) != 0x0000) {
+               dev_warn_ratelimited(&applespi->spi->dev,
+                                    "Received unexpected write response: length=%x\n",
+                                    le16_to_cpu(message->length));
+               return;
+       }
+
+       if (packet->device == PACKET_DEV_TPAD &&
+           le16_to_cpu(message->type) == 0x0252 &&
+           le16_to_cpu(message->rsp_buf_len) == 0x0002)
+               dev_info(&applespi->spi->dev, "modeswitch done.\n");
+}
+
+static bool applespi_verify_crc(struct applespi_data *applespi, u8 *buffer,
+                               size_t buflen)
+{
+       u16 crc;
+
+       crc = crc16(0, buffer, buflen);
+       if (crc) {
+               dev_warn_ratelimited(&applespi->spi->dev,
+                                    "Received corrupted packet (crc mismatch)\n");
+               trace_applespi_bad_crc(ET_RD_CRC, READ, buffer, buflen);
+
+               return false;
+       }
+
+       return true;
+}
+
+static void applespi_debug_print_read_packet(struct applespi_data *applespi,
+                                            struct spi_packet *packet)
+{
+       unsigned int evt_type;
+
+       if (packet->flags == PACKET_TYPE_READ &&
+           packet->device == PACKET_DEV_KEYB)
+               evt_type = ET_RD_KEYB;
+       else if (packet->flags == PACKET_TYPE_READ &&
+                packet->device == PACKET_DEV_TPAD)
+               evt_type = ET_RD_TPAD;
+       else if (packet->flags == PACKET_TYPE_WRITE)
+               evt_type = applespi->cmd_evt_type;
+       else
+               evt_type = ET_RD_UNKN;
+
+       applespi_get_trace_fun(evt_type)(evt_type, PT_READ, applespi->rx_buffer,
+                                        APPLESPI_PACKET_SIZE);
+}
+
+static void applespi_got_data(struct applespi_data *applespi)
+{
+       struct spi_packet *packet;
+       struct message *message;
+       unsigned int msg_len;
+       unsigned int off;
+       unsigned int rem;
+       unsigned int len;
+
+       /* process packet header */
+       if (!applespi_verify_crc(applespi, applespi->rx_buffer,
+                                APPLESPI_PACKET_SIZE)) {
+               unsigned long flags;
+
+               spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
+
+               if (applespi->drain) {
+                       applespi->read_active = false;
+                       applespi->write_active = false;
+
+                       wake_up_all(&applespi->drain_complete);
+               }
+
+               spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
+
+               return;
+       }
+
+       packet = (struct spi_packet *)applespi->rx_buffer;
+
+       applespi_debug_print_read_packet(applespi, packet);
+
+       off = le16_to_cpu(packet->offset);
+       rem = le16_to_cpu(packet->remaining);
+       len = le16_to_cpu(packet->length);
+
+       if (len > sizeof(packet->data)) {
+               dev_warn_ratelimited(&applespi->spi->dev,
+                                    "Received corrupted packet (invalid packet length %u)\n",
+                                    len);
+               goto msg_complete;
+       }
+
+       /* handle multi-packet messages */
+       if (rem > 0 || off > 0) {
+               if (off != applespi->saved_msg_len) {
+                       dev_warn_ratelimited(&applespi->spi->dev,
+                                            "Received unexpected offset (got %u, expected %u)\n",
+                                            off, applespi->saved_msg_len);
+                       goto msg_complete;
+               }
+
+               if (off + rem > MAX_PKTS_PER_MSG * APPLESPI_PACKET_SIZE) {
+                       dev_warn_ratelimited(&applespi->spi->dev,
+                                            "Received message too large (size %u)\n",
+                                            off + rem);
+                       goto msg_complete;
+               }
+
+               if (off + len > MAX_PKTS_PER_MSG * APPLESPI_PACKET_SIZE) {
+                       dev_warn_ratelimited(&applespi->spi->dev,
+                                            "Received message too large (size %u)\n",
+                                            off + len);
+                       goto msg_complete;
+               }
+
+               memcpy(applespi->msg_buf + off, &packet->data, len);
+               applespi->saved_msg_len += len;
+
+               if (rem > 0)
+                       return;
+
+               message = (struct message *)applespi->msg_buf;
+               msg_len = applespi->saved_msg_len;
+       } else {
+               message = (struct message *)&packet->data;
+               msg_len = len;
+       }
+
+       /* got complete message - verify */
+       if (!applespi_verify_crc(applespi, (u8 *)message, msg_len))
+               goto msg_complete;
+
+       if (le16_to_cpu(message->length) != msg_len - MSG_HEADER_SIZE - 2) {
+               dev_warn_ratelimited(&applespi->spi->dev,
+                                    "Received corrupted packet (invalid message length %u - expected %u)\n",
+                                    le16_to_cpu(message->length),
+                                    msg_len - MSG_HEADER_SIZE - 2);
+               goto msg_complete;
+       }
+
+       /* handle message */
+       if (packet->flags == PACKET_TYPE_READ &&
+           packet->device == PACKET_DEV_KEYB) {
+               applespi_handle_keyboard_event(applespi, &message->keyboard);
+
+       } else if (packet->flags == PACKET_TYPE_READ &&
+                  packet->device == PACKET_DEV_TPAD) {
+               struct touchpad_protocol *tp;
+               size_t tp_len;
+
+               tp = &message->touchpad;
+               tp_len = sizeof(*tp) +
+                        tp->number_of_fingers * sizeof(tp->fingers[0]);
+
+               if (le16_to_cpu(message->length) + 2 != tp_len) {
+                       dev_warn_ratelimited(&applespi->spi->dev,
+                                            "Received corrupted packet (invalid message length %u - num-fingers %u, tp-len %zu)\n",
+                                            le16_to_cpu(message->length),
+                                            tp->number_of_fingers, tp_len);
+                       goto msg_complete;
+               }
+
+               if (tp->number_of_fingers > MAX_FINGERS) {
+                       dev_warn_ratelimited(&applespi->spi->dev,
+                                            "Number of reported fingers (%u) exceeds max (%u))\n",
+                                            tp->number_of_fingers,
+                                            MAX_FINGERS);
+                       tp->number_of_fingers = MAX_FINGERS;
+               }
+
+               report_tp_state(applespi, tp);
+
+       } else if (packet->flags == PACKET_TYPE_WRITE) {
+               applespi_handle_cmd_response(applespi, packet, message);
+       }
+
+msg_complete:
+       applespi->saved_msg_len = 0;
+
+       applespi_msg_complete(applespi, packet->flags == PACKET_TYPE_WRITE,
+                             true);
+}
+
+static void applespi_async_read_complete(void *context)
+{
+       struct applespi_data *applespi = context;
+
+       if (applespi->rd_m.status < 0) {
+               dev_warn(&applespi->spi->dev, "Error reading from device: %d\n",
+                        applespi->rd_m.status);
+               /*
+                * We don't actually know if this was a pure read, or a response
+                * to a write. But this is a rare error condition that should
+                * never occur, so clearing both flags to avoid deadlock.
+                */
+               applespi_msg_complete(applespi, true, true);
+       } else {
+               applespi_got_data(applespi);
+       }
+
+       acpi_finish_gpe(NULL, applespi->gpe);
+}
+
+static u32 applespi_notify(acpi_handle gpe_device, u32 gpe, void *context)
+{
+       struct applespi_data *applespi = context;
+       int sts;
+       unsigned long flags;
+
+       trace_applespi_irq_received(ET_RD_IRQ, PT_READ);
+
+       spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
+
+       if (!applespi->suspended) {
+               sts = applespi_async(applespi, &applespi->rd_m,
+                                    applespi_async_read_complete);
+               if (sts)
+                       dev_warn(&applespi->spi->dev,
+                                "Error queueing async read to device: %d\n",
+                                sts);
+               else
+                       applespi->read_active = true;
+       }
+
+       spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
+
+       return ACPI_INTERRUPT_HANDLED;
+}
+
+static int applespi_get_saved_bl_level(struct applespi_data *applespi)
+{
+       struct efivar_entry *efivar_entry;
+       u16 efi_data = 0;
+       unsigned long efi_data_len;
+       int sts;
+
+       efivar_entry = kmalloc(sizeof(*efivar_entry), GFP_KERNEL);
+       if (!efivar_entry)
+               return -ENOMEM;
+
+       memcpy(efivar_entry->var.VariableName, EFI_BL_LEVEL_NAME,
+              sizeof(EFI_BL_LEVEL_NAME));
+       efivar_entry->var.VendorGuid = EFI_BL_LEVEL_GUID;
+       efi_data_len = sizeof(efi_data);
+
+       sts = efivar_entry_get(efivar_entry, NULL, &efi_data_len, &efi_data);
+       if (sts && sts != -ENOENT)
+               dev_warn(&applespi->spi->dev,
+                        "Error getting backlight level from EFI vars: %d\n",
+                        sts);
+
+       kfree(efivar_entry);
+
+       return sts ? sts : efi_data;
+}
+
+static void applespi_save_bl_level(struct applespi_data *applespi,
+                                  unsigned int level)
+{
+       efi_guid_t efi_guid;
+       u32 efi_attr;
+       unsigned long efi_data_len;
+       u16 efi_data;
+       int sts;
+
+       /* Save keyboard backlight level */
+       efi_guid = EFI_BL_LEVEL_GUID;
+       efi_data = (u16)level;
+       efi_data_len = sizeof(efi_data);
+       efi_attr = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS |
+                  EFI_VARIABLE_RUNTIME_ACCESS;
+
+       sts = efivar_entry_set_safe(EFI_BL_LEVEL_NAME, efi_guid, efi_attr, true,
+                                   efi_data_len, &efi_data);
+       if (sts)
+               dev_warn(&applespi->spi->dev,
+                        "Error saving backlight level to EFI vars: %d\n", sts);
+}
+
+static int applespi_probe(struct spi_device *spi)
+{
+       struct applespi_data *applespi;
+       acpi_handle spi_handle = ACPI_HANDLE(&spi->dev);
+       acpi_status acpi_sts;
+       int sts, i;
+       unsigned long long gpe, usb_status;
+
+       /* check if the USB interface is present and enabled already */
+       acpi_sts = acpi_evaluate_integer(spi_handle, "UIST", NULL, &usb_status);
+       if (ACPI_SUCCESS(acpi_sts) && usb_status) {
+               /* let the USB driver take over instead */
+               dev_info(&spi->dev, "USB interface already enabled\n");
+               return -ENODEV;
+       }
+
+       /* allocate driver data */
+       applespi = devm_kzalloc(&spi->dev, sizeof(*applespi), GFP_KERNEL);
+       if (!applespi)
+               return -ENOMEM;
+
+       applespi->spi = spi;
+
+       INIT_WORK(&applespi->work, applespi_worker);
+
+       /* store the driver data */
+       spi_set_drvdata(spi, applespi);
+
+       /* create our buffers */
+       applespi->tx_buffer = devm_kmalloc(&spi->dev, APPLESPI_PACKET_SIZE,
+                                          GFP_KERNEL);
+       applespi->tx_status = devm_kmalloc(&spi->dev, APPLESPI_STATUS_SIZE,
+                                          GFP_KERNEL);
+       applespi->rx_buffer = devm_kmalloc(&spi->dev, APPLESPI_PACKET_SIZE,
+                                          GFP_KERNEL);
+       applespi->msg_buf = devm_kmalloc_array(&spi->dev, MAX_PKTS_PER_MSG,
+                                              APPLESPI_PACKET_SIZE,
+                                              GFP_KERNEL);
+
+       if (!applespi->tx_buffer || !applespi->tx_status ||
+           !applespi->rx_buffer || !applespi->msg_buf)
+               return -ENOMEM;
+
+       /* set up our spi messages */
+       applespi_setup_read_txfrs(applespi);
+       applespi_setup_write_txfrs(applespi);
+
+       /* cache ACPI method handles */
+       acpi_sts = acpi_get_handle(spi_handle, "SIEN", &applespi->sien);
+       if (ACPI_FAILURE(acpi_sts)) {
+               dev_err(&applespi->spi->dev,
+                       "Failed to get SIEN ACPI method handle: %s\n",
+                       acpi_format_exception(acpi_sts));
+               return -ENODEV;
+       }
+
+       acpi_sts = acpi_get_handle(spi_handle, "SIST", &applespi->sist);
+       if (ACPI_FAILURE(acpi_sts)) {
+               dev_err(&applespi->spi->dev,
+                       "Failed to get SIST ACPI method handle: %s\n",
+                       acpi_format_exception(acpi_sts));
+               return -ENODEV;
+       }
+
+       /* switch on the SPI interface */
+       sts = applespi_setup_spi(applespi);
+       if (sts)
+               return sts;
+
+       sts = applespi_enable_spi(applespi);
+       if (sts)
+               return sts;
+
+       /* setup the keyboard input dev */
+       applespi->keyboard_input_dev = devm_input_allocate_device(&spi->dev);
+
+       if (!applespi->keyboard_input_dev)
+               return -ENOMEM;
+
+       applespi->keyboard_input_dev->name = "Apple SPI Keyboard";
+       applespi->keyboard_input_dev->phys = "applespi/input0";
+       applespi->keyboard_input_dev->dev.parent = &spi->dev;
+       applespi->keyboard_input_dev->id.bustype = BUS_SPI;
+
+       applespi->keyboard_input_dev->evbit[0] =
+                       BIT_MASK(EV_KEY) | BIT_MASK(EV_LED) | BIT_MASK(EV_REP);
+       applespi->keyboard_input_dev->ledbit[0] = BIT_MASK(LED_CAPSL);
+
+       input_set_drvdata(applespi->keyboard_input_dev, applespi);
+       applespi->keyboard_input_dev->event = applespi_event;
+
+       for (i = 0; i < ARRAY_SIZE(applespi_scancodes); i++)
+               if (applespi_scancodes[i])
+                       input_set_capability(applespi->keyboard_input_dev,
+                                            EV_KEY, applespi_scancodes[i]);
+
+       for (i = 0; i < ARRAY_SIZE(applespi_controlcodes); i++)
+               if (applespi_controlcodes[i])
+                       input_set_capability(applespi->keyboard_input_dev,
+                                            EV_KEY, applespi_controlcodes[i]);
+
+       for (i = 0; i < ARRAY_SIZE(applespi_fn_codes); i++)
+               if (applespi_fn_codes[i].to)
+                       input_set_capability(applespi->keyboard_input_dev,
+                                            EV_KEY, applespi_fn_codes[i].to);
+
+       input_set_capability(applespi->keyboard_input_dev, EV_KEY, KEY_FN);
+
+       sts = input_register_device(applespi->keyboard_input_dev);
+       if (sts) {
+               dev_err(&applespi->spi->dev,
+                       "Unable to register keyboard input device (%d)\n", sts);
+               return -ENODEV;
+       }
+
+       /*
+        * The applespi device doesn't send interrupts normally (as is described
+        * in its DSDT), but rather seems to use ACPI GPEs.
+        */
+       acpi_sts = acpi_evaluate_integer(spi_handle, "_GPE", NULL, &gpe);
+       if (ACPI_FAILURE(acpi_sts)) {
+               dev_err(&applespi->spi->dev,
+                       "Failed to obtain GPE for SPI slave device: %s\n",
+                       acpi_format_exception(acpi_sts));
+               return -ENODEV;
+       }
+       applespi->gpe = (int)gpe;
+
+       acpi_sts = acpi_install_gpe_handler(NULL, applespi->gpe,
+                                           ACPI_GPE_LEVEL_TRIGGERED,
+                                           applespi_notify, applespi);
+       if (ACPI_FAILURE(acpi_sts)) {
+               dev_err(&applespi->spi->dev,
+                       "Failed to install GPE handler for GPE %d: %s\n",
+                       applespi->gpe, acpi_format_exception(acpi_sts));
+               return -ENODEV;
+       }
+
+       applespi->suspended = false;
+
+       acpi_sts = acpi_enable_gpe(NULL, applespi->gpe);
+       if (ACPI_FAILURE(acpi_sts)) {
+               dev_err(&applespi->spi->dev,
+                       "Failed to enable GPE handler for GPE %d: %s\n",
+                       applespi->gpe, acpi_format_exception(acpi_sts));
+               acpi_remove_gpe_handler(NULL, applespi->gpe, applespi_notify);
+               return -ENODEV;
+       }
+
+       /* trigger touchpad setup */
+       applespi_init(applespi, false);
+
+       /*
+        * By default this device is not enabled for wakeup; but USB keyboards
+        * generally are, so the expectation is that by default the keyboard
+        * will wake the system.
+        */
+       device_wakeup_enable(&spi->dev);
+
+       /* set up keyboard-backlight */
+       sts = applespi_get_saved_bl_level(applespi);
+       if (sts >= 0)
+               applespi_set_bl_level(&applespi->backlight_info, sts);
+
+       applespi->backlight_info.name            = "spi::kbd_backlight";
+       applespi->backlight_info.default_trigger = "kbd-backlight";
+       applespi->backlight_info.brightness_set  = applespi_set_bl_level;
+
+       sts = devm_led_classdev_register(&spi->dev, &applespi->backlight_info);
+       if (sts)
+               dev_warn(&applespi->spi->dev,
+                        "Unable to register keyboard backlight class dev (%d)\n",
+                        sts);
+
+       /* set up debugfs entries for touchpad dimensions logging */
+       applespi->debugfs_root = debugfs_create_dir("applespi", NULL);
+       if (IS_ERR(applespi->debugfs_root)) {
+               if (PTR_ERR(applespi->debugfs_root) != -ENODEV)
+                       dev_warn(&applespi->spi->dev,
+                                "Error creating debugfs root entry (%ld)\n",
+                                PTR_ERR(applespi->debugfs_root));
+       } else {
+               struct dentry *ret;
+
+               ret = debugfs_create_bool("enable_tp_dim", 0600,
+                                         applespi->debugfs_root,
+                                         &applespi->debug_tp_dim);
+               if (IS_ERR(ret))
+                       dev_dbg(&applespi->spi->dev,
+                               "Error creating debugfs entry enable_tp_dim (%ld)\n",
+                               PTR_ERR(ret));
+
+               ret = debugfs_create_file("tp_dim", 0400,
+                                         applespi->debugfs_root, applespi,
+                                         &applespi_tp_dim_fops);
+               if (IS_ERR(ret))
+                       dev_dbg(&applespi->spi->dev,
+                               "Error creating debugfs entry tp_dim (%ld)\n",
+                               PTR_ERR(ret));
+       }
+
+       return 0;
+}
+
+static void applespi_drain_writes(struct applespi_data *applespi)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
+
+       applespi->drain = true;
+       wait_event_lock_irq(applespi->drain_complete, !applespi->write_active,
+                           applespi->cmd_msg_lock);
+
+       spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
+}
+
+static void applespi_drain_reads(struct applespi_data *applespi)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
+
+       wait_event_lock_irq(applespi->drain_complete, !applespi->read_active,
+                           applespi->cmd_msg_lock);
+
+       applespi->suspended = true;
+
+       spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
+}
+
+static int applespi_remove(struct spi_device *spi)
+{
+       struct applespi_data *applespi = spi_get_drvdata(spi);
+
+       applespi_drain_writes(applespi);
+
+       acpi_disable_gpe(NULL, applespi->gpe);
+       acpi_remove_gpe_handler(NULL, applespi->gpe, applespi_notify);
+       device_wakeup_disable(&spi->dev);
+
+       applespi_drain_reads(applespi);
+
+       debugfs_remove_recursive(applespi->debugfs_root);
+
+       return 0;
+}
+
+static void applespi_shutdown(struct spi_device *spi)
+{
+       struct applespi_data *applespi = spi_get_drvdata(spi);
+
+       applespi_save_bl_level(applespi, applespi->have_bl_level);
+}
+
+static int applespi_poweroff_late(struct device *dev)
+{
+       struct spi_device *spi = to_spi_device(dev);
+       struct applespi_data *applespi = spi_get_drvdata(spi);
+
+       applespi_save_bl_level(applespi, applespi->have_bl_level);
+
+       return 0;
+}
+
+static int __maybe_unused applespi_suspend(struct device *dev)
+{
+       struct spi_device *spi = to_spi_device(dev);
+       struct applespi_data *applespi = spi_get_drvdata(spi);
+       acpi_status acpi_sts;
+       int sts;
+
+       /* turn off caps-lock - it'll stay on otherwise */
+       sts = applespi_set_capsl_led(applespi, false);
+       if (sts)
+               dev_warn(&applespi->spi->dev,
+                        "Failed to turn off caps-lock led (%d)\n", sts);
+
+       applespi_drain_writes(applespi);
+
+       /* disable the interrupt */
+       acpi_sts = acpi_disable_gpe(NULL, applespi->gpe);
+       if (ACPI_FAILURE(acpi_sts))
+               dev_err(&applespi->spi->dev,
+                       "Failed to disable GPE handler for GPE %d: %s\n",
+                       applespi->gpe, acpi_format_exception(acpi_sts));
+
+       applespi_drain_reads(applespi);
+
+       return 0;
+}
+
+static int __maybe_unused applespi_resume(struct device *dev)
+{
+       struct spi_device *spi = to_spi_device(dev);
+       struct applespi_data *applespi = spi_get_drvdata(spi);
+       acpi_status acpi_sts;
+       unsigned long flags;
+
+       /* ensure our flags and state reflect a newly resumed device */
+       spin_lock_irqsave(&applespi->cmd_msg_lock, flags);
+
+       applespi->drain = false;
+       applespi->have_cl_led_on = false;
+       applespi->have_bl_level = 0;
+       applespi->cmd_msg_queued = false;
+       applespi->read_active = false;
+       applespi->write_active = false;
+
+       applespi->suspended = false;
+
+       spin_unlock_irqrestore(&applespi->cmd_msg_lock, flags);
+
+       /* switch on the SPI interface */
+       applespi_enable_spi(applespi);
+
+       /* re-enable the interrupt */
+       acpi_sts = acpi_enable_gpe(NULL, applespi->gpe);
+       if (ACPI_FAILURE(acpi_sts))
+               dev_err(&applespi->spi->dev,
+                       "Failed to re-enable GPE handler for GPE %d: %s\n",
+                       applespi->gpe, acpi_format_exception(acpi_sts));
+
+       /* switch the touchpad into multitouch mode */
+       applespi_init(applespi, true);
+
+       return 0;
+}
+
+static const struct acpi_device_id applespi_acpi_match[] = {
+       { "APP000D", 0 },
+       { }
+};
+MODULE_DEVICE_TABLE(acpi, applespi_acpi_match);
+
+const struct dev_pm_ops applespi_pm_ops = {
+       SET_SYSTEM_SLEEP_PM_OPS(applespi_suspend, applespi_resume)
+       .poweroff_late  = applespi_poweroff_late,
+};
+
+static struct spi_driver applespi_driver = {
+       .driver         = {
+               .name                   = "applespi",
+               .acpi_match_table       = applespi_acpi_match,
+               .pm                     = &applespi_pm_ops,
+       },
+       .probe          = applespi_probe,
+       .remove         = applespi_remove,
+       .shutdown       = applespi_shutdown,
+};
+
+module_spi_driver(applespi_driver)
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("MacBook(Pro) SPI Keyboard/Touchpad driver");
+MODULE_AUTHOR("Federico Lorenzi");
+MODULE_AUTHOR("Ronald Tschalär");
diff --git a/drivers/input/keyboard/applespi.h b/drivers/input/keyboard/applespi.h
new file mode 100644 (file)
index 0000000..7f5ab10
--- /dev/null
@@ -0,0 +1,29 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * MacBook (Pro) SPI keyboard and touchpad driver
+ *
+ * Copyright (c) 2015-2019 Federico Lorenzi
+ * Copyright (c) 2017-2019 Ronald Tschalär
+ */
+
+#ifndef _APPLESPI_H_
+#define _APPLESPI_H_
+
+enum applespi_evt_type {
+       ET_CMD_TP_INI = BIT(0),
+       ET_CMD_BL = BIT(1),
+       ET_CMD_CL = BIT(2),
+       ET_RD_KEYB = BIT(8),
+       ET_RD_TPAD = BIT(9),
+       ET_RD_UNKN = BIT(10),
+       ET_RD_IRQ = BIT(11),
+       ET_RD_CRC = BIT(12),
+};
+
+enum applespi_pkt_type {
+       PT_READ,
+       PT_WRITE,
+       PT_STATUS,
+};
+
+#endif /* _APPLESPI_H_ */
diff --git a/drivers/input/keyboard/applespi_trace.h b/drivers/input/keyboard/applespi_trace.h
new file mode 100644 (file)
index 0000000..0ad1a3d
--- /dev/null
@@ -0,0 +1,93 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * MacBook (Pro) SPI keyboard and touchpad driver
+ *
+ * Copyright (c) 2015-2019 Federico Lorenzi
+ * Copyright (c) 2017-2019 Ronald Tschalär
+ */
+
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM applespi
+
+#if !defined(_APPLESPI_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
+#define _APPLESPI_TRACE_H_
+
+#include <linux/types.h>
+#include <linux/tracepoint.h>
+
+#include "applespi.h"
+
+DECLARE_EVENT_CLASS(dump_message_template,
+       TP_PROTO(enum applespi_evt_type evt_type,
+                enum applespi_pkt_type pkt_type,
+                u8 *buf,
+                size_t len),
+
+       TP_ARGS(evt_type, pkt_type, buf, len),
+
+       TP_STRUCT__entry(
+               __field(enum applespi_evt_type, evt_type)
+               __field(enum applespi_pkt_type, pkt_type)
+               __field(size_t, len)
+               __dynamic_array(u8, buf, len)
+       ),
+
+       TP_fast_assign(
+               __entry->evt_type = evt_type;
+               __entry->pkt_type = pkt_type;
+               __entry->len = len;
+               memcpy(__get_dynamic_array(buf), buf, len);
+       ),
+
+       TP_printk("%-6s: %s",
+                 __print_symbolic(__entry->pkt_type,
+                                  { PT_READ, "read" },
+                                  { PT_WRITE, "write" },
+                                  { PT_STATUS, "status" }
+                 ),
+                 __print_hex(__get_dynamic_array(buf), __entry->len))
+);
+
+#define DEFINE_DUMP_MESSAGE_EVENT(name)                        \
+DEFINE_EVENT(dump_message_template, name,              \
+       TP_PROTO(enum applespi_evt_type evt_type,       \
+                enum applespi_pkt_type pkt_type,       \
+                u8 *buf,                               \
+                size_t len),                           \
+       TP_ARGS(evt_type, pkt_type, buf, len)           \
+)
+
+DEFINE_DUMP_MESSAGE_EVENT(applespi_tp_ini_cmd);
+DEFINE_DUMP_MESSAGE_EVENT(applespi_backlight_cmd);
+DEFINE_DUMP_MESSAGE_EVENT(applespi_caps_lock_cmd);
+DEFINE_DUMP_MESSAGE_EVENT(applespi_keyboard_data);
+DEFINE_DUMP_MESSAGE_EVENT(applespi_touchpad_data);
+DEFINE_DUMP_MESSAGE_EVENT(applespi_unknown_data);
+DEFINE_DUMP_MESSAGE_EVENT(applespi_bad_crc);
+
+TRACE_EVENT(applespi_irq_received,
+       TP_PROTO(enum applespi_evt_type evt_type,
+                enum applespi_pkt_type pkt_type),
+
+       TP_ARGS(evt_type, pkt_type),
+
+       TP_STRUCT__entry(
+               __field(enum applespi_evt_type, evt_type)
+               __field(enum applespi_pkt_type, pkt_type)
+       ),
+
+       TP_fast_assign(
+               __entry->evt_type = evt_type;
+               __entry->pkt_type = pkt_type;
+       ),
+
+       "\n"
+);
+
+#endif /* _APPLESPI_TRACE_H_ */
+
+/* This part must be outside protection */
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH ../../drivers/input/keyboard
+#define TRACE_INCLUDE_FILE applespi_trace
+#include <trace/define_trace.h>
index 746ff06eaf8d76bdf5bdf5c5f2c839a3f44c6619..62391d6c7da6f9b4e0f6bc9198d9b5547a68a5df 100644 (file)
@@ -277,8 +277,10 @@ static int mtk_pmic_keys_probe(struct platform_device *pdev)
                keys->keys[index].regs = &mtk_pmic_regs->keys_regs[index];
 
                keys->keys[index].irq = platform_get_irq(pdev, index);
-               if (keys->keys[index].irq < 0)
+               if (keys->keys[index].irq < 0) {
+                       of_node_put(child);
                        return keys->keys[index].irq;
+               }
 
                error = of_property_read_u32(child,
                        "linux,keycodes", &keys->keys[index].keycode);
@@ -286,6 +288,7 @@ static int mtk_pmic_keys_probe(struct platform_device *pdev)
                        dev_err(keys->dev,
                                "failed to read key:%d linux,keycode property: %d\n",
                                index, error);
+                       of_node_put(child);
                        return error;
                }
 
@@ -293,8 +296,10 @@ static int mtk_pmic_keys_probe(struct platform_device *pdev)
                        keys->keys[index].wakeup = true;
 
                error = mtk_pmic_key_setup(keys, &keys->keys[index]);
-               if (error)
+               if (error) {
+                       of_node_put(child);
                        return error;
+               }
 
                index++;
        }
index 6ffdc26b9c89a897fee7fcfc7dd2e8f252e60fe4..4a796bed48acc10b13cc235d4871ce82e6ed7368 100644 (file)
@@ -198,18 +198,21 @@ static int sun4i_lradc_load_dt_keymap(struct device *dev,
                error = of_property_read_u32(pp, "channel", &channel);
                if (error || channel != 0) {
                        dev_err(dev, "%pOFn: Inval channel prop\n", pp);
+                       of_node_put(pp);
                        return -EINVAL;
                }
 
                error = of_property_read_u32(pp, "voltage", &map->voltage);
                if (error) {
                        dev_err(dev, "%pOFn: Inval voltage prop\n", pp);
+                       of_node_put(pp);
                        return -EINVAL;
                }
 
                error = of_property_read_u32(pp, "linux,code", &map->keycode);
                if (error) {
                        dev_err(dev, "%pOFn: Inval linux,code prop\n", pp);
+                       of_node_put(pp);
                        return -EINVAL;
                }
 
index 8996323ce8d94ca5ee6ff03f5e4ecaeb34bddd0c..34700eda04290402b1280a619e7917b1bbece407 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "psmouse.h"
 #include "alps.h"
+#include "trackpoint.h"
 
 /*
  * Definitions for ALPS version 3 and 4 command mode protocol
@@ -2861,6 +2862,23 @@ static const struct alps_protocol_info *alps_match_table(unsigned char *e7,
        return NULL;
 }
 
+static bool alps_is_cs19_trackpoint(struct psmouse *psmouse)
+{
+       u8 param[2] = { 0 };
+
+       if (ps2_command(&psmouse->ps2dev,
+                       param, MAKE_PS2_CMD(0, 2, TP_READ_ID)))
+               return false;
+
+       /*
+        * param[0] contains the trackpoint device variant_id while
+        * param[1] contains the firmware_id. So far all alps
+        * trackpoint-only devices have their variant_ids equal
+        * TP_VARIANT_ALPS and their firmware_ids are in 0x20~0x2f range.
+        */
+       return param[0] == TP_VARIANT_ALPS && ((param[1] & 0xf0) == 0x20);
+}
+
 static int alps_identify(struct psmouse *psmouse, struct alps_data *priv)
 {
        const struct alps_protocol_info *protocol;
@@ -3161,6 +3179,20 @@ int alps_detect(struct psmouse *psmouse, bool set_properties)
        if (error)
                return error;
 
+       /*
+        * ALPS cs19 is a trackpoint-only device, and uses different
+        * protocol than DualPoint ones, so we return -EINVAL here and let
+        * trackpoint.c drive this device. If the trackpoint driver is not
+        * enabled, the device will fall back to a bare PS/2 mouse.
+        * If ps2_command() fails here, we depend on the immediately
+        * followed psmouse_reset() to reset the device to normal state.
+        */
+       if (alps_is_cs19_trackpoint(psmouse)) {
+               psmouse_dbg(psmouse,
+                           "ALPS CS19 trackpoint-only device detected, ignoring\n");
+               return -EINVAL;
+       }
+
        /*
         * Reset the device to make sure it is fully operational:
         * on some laptops, like certain Dell Latitudes, we may
index 1080c0c498154a789f89c42e4854c1307eb0d4b1..b1956ed4c0ddeaf35b1f3cf65c0773e851a7c07d 100644 (file)
@@ -176,6 +176,7 @@ static const char * const smbus_pnp_ids[] = {
        "LEN0093", /* T480 */
        "LEN0096", /* X280 */
        "LEN0097", /* X280 -> ALPS trackpoint */
+       "LEN009b", /* T580 */
        "LEN200f", /* T450s */
        "LEN2054", /* E480 */
        "LEN2055", /* E580 */
@@ -705,7 +706,7 @@ static void synaptics_pt_create(struct psmouse *psmouse)
 
        serio->id.type = SERIO_PS_PSTHRU;
        strlcpy(serio->name, "Synaptics pass-through", sizeof(serio->name));
-       strlcpy(serio->phys, "synaptics-pt/serio0", sizeof(serio->name));
+       strlcpy(serio->phys, "synaptics-pt/serio0", sizeof(serio->phys));
        serio->write = synaptics_pt_write;
        serio->start = synaptics_pt_start;
        serio->stop = synaptics_pt_stop;
index 0afffe8d824faceee66814ce3e2a5c5635b3d930..77110f3ec21dab55ace28674f6e77eaec1b62306 100644 (file)
@@ -158,7 +158,8 @@ struct trackpoint_data {
 #ifdef CONFIG_MOUSE_PS2_TRACKPOINT
 int trackpoint_detect(struct psmouse *psmouse, bool set_properties);
 #else
-inline int trackpoint_detect(struct psmouse *psmouse, bool set_properties)
+static inline int trackpoint_detect(struct psmouse *psmouse,
+                                   bool set_properties)
 {
        return -ENOSYS;
 }
index 8e457e50f837e02d00029eaa24b3dfc7dfd19690..88ae7c2ac3c817ce983b9fc801a8cacd2aa7b52f 100644 (file)
@@ -75,8 +75,8 @@ struct synth_kbd_keystroke {
 
 #define HK_MAXIMUM_MESSAGE_SIZE 256
 
-#define KBD_VSC_SEND_RING_BUFFER_SIZE          (10 * PAGE_SIZE)
-#define KBD_VSC_RECV_RING_BUFFER_SIZE          (10 * PAGE_SIZE)
+#define KBD_VSC_SEND_RING_BUFFER_SIZE          (40 * 1024)
+#define KBD_VSC_RECV_RING_BUFFER_SIZE          (40 * 1024)
 
 #define XTKBD_EMUL0     0xe0
 #define XTKBD_EMUL1     0xe1
index 4b8b9d7aa75e2785991fc5838bf55728c715e6fe..35031228a6d076cf0dd91dab411f049ec679df6b 100644 (file)
@@ -78,6 +78,7 @@ Scott Hill shill@gtcocalcomp.com
 
 /* Max size of a single report */
 #define REPORT_MAX_SIZE       10
+#define MAX_COLLECTION_LEVELS  10
 
 
 /* Bitmask whether pen is in range */
@@ -223,8 +224,7 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
        char  maintype = 'x';
        char  globtype[12];
        int   indent = 0;
-       char  indentstr[10] = "";
-
+       char  indentstr[MAX_COLLECTION_LEVELS + 1] = { 0 };
 
        dev_dbg(ddev, "======>>>>>>PARSE<<<<<<======\n");
 
@@ -350,6 +350,13 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
                        case TAG_MAIN_COL_START:
                                maintype = 'S';
 
+                               if (indent == MAX_COLLECTION_LEVELS) {
+                                       dev_err(ddev, "Collection level %d would exceed limit of %d\n",
+                                               indent + 1,
+                                               MAX_COLLECTION_LEVELS);
+                                       break;
+                               }
+
                                if (data == 0) {
                                        dev_dbg(ddev, "======>>>>>> Physical\n");
                                        strcpy(globtype, "Physical");
@@ -369,8 +376,15 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report,
                                break;
 
                        case TAG_MAIN_COL_END:
-                               dev_dbg(ddev, "<<<<<<======\n");
                                maintype = 'E';
+
+                               if (indent == 0) {
+                                       dev_err(ddev, "Collection level already at zero\n");
+                                       break;
+                               }
+
+                               dev_dbg(ddev, "<<<<<<======\n");
+
                                indent--;
                                for (x = 0; x < indent; x++)
                                        indentstr[x] = '-';
index 8e48fbda487a3c3beae5f4513444e34e693da198..8e9f3b7b81805bf3605462e9ef3241647d0c1b4c 100644 (file)
@@ -602,9 +602,8 @@ static int auo_pixcir_probe(struct i2c_client *client,
                return error;
        }
 
-       error = devm_add_action(&client->dev, auo_pixcir_reset, ts);
+       error = devm_add_action_or_reset(&client->dev, auo_pixcir_reset, ts);
        if (error) {
-               auo_pixcir_reset(ts);
                dev_err(&client->dev, "failed to register reset action, %d\n",
                        error);
                return error;
index 73740b969e62461d5f2b73204899225a048e3a94..b607a92791d3f8b48a9c1caeaea48986753ead64 100644 (file)
@@ -2533,7 +2533,7 @@ static int map_sg(struct device *dev, struct scatterlist *sglist,
        npages = sg_num_pages(dev, sglist, nelems);
 
        address = dma_ops_alloc_iova(dev, dma_dom, npages, dma_mask);
-       if (address == DMA_MAPPING_ERROR)
+       if (!address)
                goto out_err;
 
        prot = dir2prot(direction);
index 0e224232f74644e1a1b620ca9c3d1067891e34d9..8fb7c5dea07fc1c648293e0966cac508eb421b6e 100644 (file)
@@ -1394,6 +1394,7 @@ start_isoc_chain(struct usb_fifo *fifo, int num_packets_per_urb,
                                printk(KERN_DEBUG
                                       "%s: %s: alloc urb for fifo %i failed",
                                       hw->name, __func__, fifo->fifonum);
+                               continue;
                        }
                        fifo->iso[i].owner_fifo = (struct usb_fifo *) fifo;
                        fifo->iso[i].indx = i;
index 21fb90d66bfc319b4e27ad073f3126fe496a98b8..25c73c13cc7ef830b72b70de39015bd8e48190d7 100644 (file)
@@ -124,7 +124,7 @@ static inline int check_which(__u32 which)
 static inline int check_pad(struct v4l2_subdev *sd, __u32 pad)
 {
 #if defined(CONFIG_MEDIA_CONTROLLER)
-       if (sd->entity.graph_obj.mdev) {
+       if (sd->entity.num_pads) {
                if (pad >= sd->entity.num_pads)
                        return -EINVAL;
                return 0;
diff --git a/drivers/memory/.gitignore b/drivers/memory/.gitignore
new file mode 100644 (file)
index 0000000..cbca8b0
--- /dev/null
@@ -0,0 +1 @@
+ti-emif-asm-offsets.h
index dbdee02bb5921cd6638582c46062700360912963..9bddca292330104a92f7c697ac2d81cfb06f2801 100644 (file)
@@ -8,6 +8,14 @@ menuconfig MEMORY
 
 if MEMORY
 
+config DDR
+       bool
+       help
+         Data from JEDEC specs for DDR SDRAM memories,
+         particularly the AC timing parameters and addressing
+         information. This data is useful for drivers handling
+         DDR SDRAM controllers.
+
 config ARM_PL172_MPMC
        tristate "ARM PL172 MPMC driver"
        depends on ARM_AMBA && OF
index 91ae4eb0e9137423bf75183b4790eb69bd426374..27b493435e61ce8b2135d278e7a8e07e2f3f3eb2 100644 (file)
@@ -3,6 +3,7 @@
 # Makefile for memory devices
 #
 
+obj-$(CONFIG_DDR)              += jedec_ddr_data.o
 ifeq ($(CONFIG_DDR),y)
 obj-$(CONFIG_OF)               += of_memory.o
 endif
@@ -28,9 +29,10 @@ ti-emif-sram-objs            := ti-emif-pm.o ti-emif-sram-pm.o
 
 AFLAGS_ti-emif-sram-pm.o       :=-Wa,-march=armv7-a
 
-drivers/memory/ti-emif-sram-pm.o: include/generated/ti-emif-asm-offsets.h
+$(obj)/ti-emif-sram-pm.o: $(obj)/ti-emif-asm-offsets.h
 
-include/generated/ti-emif-asm-offsets.h: drivers/memory/emif-asm-offsets.s FORCE
+$(obj)/ti-emif-asm-offsets.h: $(obj)/emif-asm-offsets.s FORCE
        $(call filechk,offsets,__TI_EMIF_ASM_OFFSETS_H__)
 
 targets += emif-asm-offsets.s
+clean-files += ti-emif-asm-offsets.h
index 3065a8bc8fd6ba2026acb71265eef8d6f7a8cb9a..6827ed48475075b6b2569d8ed41c630e80350623 100644 (file)
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/of_address.h>
+#include <linux/of_device.h>
 #include <linux/platform_device.h>
 
 #define DRVNAME                        "brcmstb-dpfe"
-#define FIRMWARE_NAME          "dpfe.bin"
 
 /* DCPU register offsets */
 #define REG_DCPU_RESET         0x0
@@ -59,6 +59,7 @@
 #define DRAM_INFO_MR4          0x4
 #define DRAM_INFO_ERROR                0x8
 #define DRAM_INFO_MR4_MASK     0xff
+#define DRAM_INFO_MR4_SHIFT    24      /* We need to look at byte 3 */
 
 /* DRAM MR4 Offsets & Masks */
 #define DRAM_MR4_REFRESH       0x0     /* Refresh rate */
 #define DRAM_MR4_TH_OFFS_MASK  0x3
 #define DRAM_MR4_TUF_MASK      0x1
 
-/* DRAM Vendor Offsets & Masks */
+/* DRAM Vendor Offsets & Masks (API v2) */
 #define DRAM_VENDOR_MR5                0x0
 #define DRAM_VENDOR_MR6                0x4
 #define DRAM_VENDOR_MR7                0x8
 #define DRAM_VENDOR_MR8                0xc
 #define DRAM_VENDOR_ERROR      0x10
 #define DRAM_VENDOR_MASK       0xff
+#define DRAM_VENDOR_SHIFT      24      /* We need to look at byte 3 */
+
+/* DRAM Information Offsets & Masks (API v3) */
+#define DRAM_DDR_INFO_MR4      0x0
+#define DRAM_DDR_INFO_MR5      0x4
+#define DRAM_DDR_INFO_MR6      0x8
+#define DRAM_DDR_INFO_MR7      0xc
+#define DRAM_DDR_INFO_MR8      0x10
+#define DRAM_DDR_INFO_ERROR    0x14
+#define DRAM_DDR_INFO_MASK     0xff
 
 /* Reset register bits & masks */
 #define DCPU_RESET_SHIFT       0x0
 #define DPFE_MSG_TYPE_COMMAND  1
 #define DPFE_MSG_TYPE_RESPONSE 2
 
-#define DELAY_LOOP_MAX         200000
+#define DELAY_LOOP_MAX         1000
 
 enum dpfe_msg_fields {
        MSG_HEADER,
@@ -117,7 +128,7 @@ enum dpfe_msg_fields {
        MSG_ARG_COUNT,
        MSG_ARG0,
        MSG_CHKSUM,
-       MSG_FIELD_MAX /* Last entry */
+       MSG_FIELD_MAX   = 16 /* Max number of arguments */
 };
 
 enum dpfe_commands {
@@ -127,14 +138,6 @@ enum dpfe_commands {
        DPFE_CMD_MAX /* Last entry */
 };
 
-struct dpfe_msg {
-       u32 header;
-       u32 command;
-       u32 arg_count;
-       u32 arg0;
-       u32 chksum; /* This is the sum of all other entries. */
-};
-
 /*
  * Format of the binary firmware file:
  *
@@ -168,12 +171,21 @@ struct init_data {
        bool is_big_endian;
 };
 
+/* API version and corresponding commands */
+struct dpfe_api {
+       int version;
+       const char *fw_name;
+       const struct attribute_group **sysfs_attrs;
+       u32 command[DPFE_CMD_MAX][MSG_FIELD_MAX];
+};
+
 /* Things we need for as long as we are active. */
 struct private_data {
        void __iomem *regs;
        void __iomem *dmem;
        void __iomem *imem;
        struct device *dev;
+       const struct dpfe_api *dpfe_api;
        struct mutex lock;
 };
 
@@ -182,28 +194,99 @@ static const char *error_text[] = {
        "Incorrect checksum", "Malformed command", "Timed out",
 };
 
-/* List of supported firmware commands */
-static const u32 dpfe_commands[DPFE_CMD_MAX][MSG_FIELD_MAX] = {
-       [DPFE_CMD_GET_INFO] = {
-               [MSG_HEADER] = DPFE_MSG_TYPE_COMMAND,
-               [MSG_COMMAND] = 1,
-               [MSG_ARG_COUNT] = 1,
-               [MSG_ARG0] = 1,
-               [MSG_CHKSUM] = 4,
-       },
-       [DPFE_CMD_GET_REFRESH] = {
-               [MSG_HEADER] = DPFE_MSG_TYPE_COMMAND,
-               [MSG_COMMAND] = 2,
-               [MSG_ARG_COUNT] = 1,
-               [MSG_ARG0] = 1,
-               [MSG_CHKSUM] = 5,
-       },
-       [DPFE_CMD_GET_VENDOR] = {
-               [MSG_HEADER] = DPFE_MSG_TYPE_COMMAND,
-               [MSG_COMMAND] = 2,
-               [MSG_ARG_COUNT] = 1,
-               [MSG_ARG0] = 2,
-               [MSG_CHKSUM] = 6,
+/*
+ * Forward declaration of our sysfs attribute functions, so we can declare the
+ * attribute data structures early.
+ */
+static ssize_t show_info(struct device *, struct device_attribute *, char *);
+static ssize_t show_refresh(struct device *, struct device_attribute *, char *);
+static ssize_t store_refresh(struct device *, struct device_attribute *,
+                         const char *, size_t);
+static ssize_t show_vendor(struct device *, struct device_attribute *, char *);
+static ssize_t show_dram(struct device *, struct device_attribute *, char *);
+
+/*
+ * Declare our attributes early, so they can be referenced in the API data
+ * structure. We need to do this, because the attributes depend on the API
+ * version.
+ */
+static DEVICE_ATTR(dpfe_info, 0444, show_info, NULL);
+static DEVICE_ATTR(dpfe_refresh, 0644, show_refresh, store_refresh);
+static DEVICE_ATTR(dpfe_vendor, 0444, show_vendor, NULL);
+static DEVICE_ATTR(dpfe_dram, 0444, show_dram, NULL);
+
+/* API v2 sysfs attributes */
+static struct attribute *dpfe_v2_attrs[] = {
+       &dev_attr_dpfe_info.attr,
+       &dev_attr_dpfe_refresh.attr,
+       &dev_attr_dpfe_vendor.attr,
+       NULL
+};
+ATTRIBUTE_GROUPS(dpfe_v2);
+
+/* API v3 sysfs attributes */
+static struct attribute *dpfe_v3_attrs[] = {
+       &dev_attr_dpfe_info.attr,
+       &dev_attr_dpfe_dram.attr,
+       NULL
+};
+ATTRIBUTE_GROUPS(dpfe_v3);
+
+/* API v2 firmware commands */
+static const struct dpfe_api dpfe_api_v2 = {
+       .version = 2,
+       .fw_name = "dpfe.bin",
+       .sysfs_attrs = dpfe_v2_groups,
+       .command = {
+               [DPFE_CMD_GET_INFO] = {
+                       [MSG_HEADER] = DPFE_MSG_TYPE_COMMAND,
+                       [MSG_COMMAND] = 1,
+                       [MSG_ARG_COUNT] = 1,
+                       [MSG_ARG0] = 1,
+                       [MSG_CHKSUM] = 4,
+               },
+               [DPFE_CMD_GET_REFRESH] = {
+                       [MSG_HEADER] = DPFE_MSG_TYPE_COMMAND,
+                       [MSG_COMMAND] = 2,
+                       [MSG_ARG_COUNT] = 1,
+                       [MSG_ARG0] = 1,
+                       [MSG_CHKSUM] = 5,
+               },
+               [DPFE_CMD_GET_VENDOR] = {
+                       [MSG_HEADER] = DPFE_MSG_TYPE_COMMAND,
+                       [MSG_COMMAND] = 2,
+                       [MSG_ARG_COUNT] = 1,
+                       [MSG_ARG0] = 2,
+                       [MSG_CHKSUM] = 6,
+               },
+       }
+};
+
+/* API v3 firmware commands */
+static const struct dpfe_api dpfe_api_v3 = {
+       .version = 3,
+       .fw_name = NULL, /* We expect the firmware to have been downloaded! */
+       .sysfs_attrs = dpfe_v3_groups,
+       .command = {
+               [DPFE_CMD_GET_INFO] = {
+                       [MSG_HEADER] = DPFE_MSG_TYPE_COMMAND,
+                       [MSG_COMMAND] = 0x0101,
+                       [MSG_ARG_COUNT] = 1,
+                       [MSG_ARG0] = 1,
+                       [MSG_CHKSUM] = 0x104,
+               },
+               [DPFE_CMD_GET_REFRESH] = {
+                       [MSG_HEADER] = DPFE_MSG_TYPE_COMMAND,
+                       [MSG_COMMAND] = 0x0202,
+                       [MSG_ARG_COUNT] = 0,
+                       /*
+                        * This is a bit ugly. Without arguments, the checksum
+                        * follows right after the argument count and not at
+                        * offset MSG_CHKSUM.
+                        */
+                       [MSG_ARG0] = 0x203,
+               },
+               /* There's no GET_VENDOR command in API v3. */
        },
 };
 
@@ -248,13 +331,13 @@ static void __enable_dcpu(void __iomem *regs)
        writel_relaxed(val, regs + REG_DCPU_RESET);
 }
 
-static unsigned int get_msg_chksum(const u32 msg[])
+static unsigned int get_msg_chksum(const u32 msg[], unsigned int max)
 {
        unsigned int sum = 0;
        unsigned int i;
 
        /* Don't include the last field in the checksum. */
-       for (i = 0; i < MSG_FIELD_MAX - 1; i++)
+       for (i = 0; i < max; i++)
                sum += msg[i];
 
        return sum;
@@ -267,6 +350,11 @@ static void __iomem *get_msg_ptr(struct private_data *priv, u32 response,
        unsigned int offset;
        void __iomem *ptr = NULL;
 
+       /* There is no need to use this function for API v3 or later. */
+       if (unlikely(priv->dpfe_api->version >= 3)) {
+               return NULL;
+       }
+
        msg_type = (response >> DRAM_MSG_TYPE_OFFSET) & DRAM_MSG_TYPE_MASK;
        offset = (response >> DRAM_MSG_ADDR_OFFSET) & DRAM_MSG_ADDR_MASK;
 
@@ -294,12 +382,25 @@ static void __iomem *get_msg_ptr(struct private_data *priv, u32 response,
        return ptr;
 }
 
+static void __finalize_command(struct private_data *priv)
+{
+       unsigned int release_mbox;
+
+       /*
+        * It depends on the API version which MBOX register we have to write to
+        * to signal we are done.
+        */
+       release_mbox = (priv->dpfe_api->version < 3)
+                       ? REG_TO_HOST_MBOX : REG_TO_DCPU_MBOX;
+       writel_relaxed(0, priv->regs + release_mbox);
+}
+
 static int __send_command(struct private_data *priv, unsigned int cmd,
                          u32 result[])
 {
-       const u32 *msg = dpfe_commands[cmd];
+       const u32 *msg = priv->dpfe_api->command[cmd];
        void __iomem *regs = priv->regs;
-       unsigned int i, chksum;
+       unsigned int i, chksum, chksum_idx;
        int ret = 0;
        u32 resp;
 
@@ -308,6 +409,18 @@ static int __send_command(struct private_data *priv, unsigned int cmd,
 
        mutex_lock(&priv->lock);
 
+       /* Wait for DCPU to become ready */
+       for (i = 0; i < DELAY_LOOP_MAX; i++) {
+               resp = readl_relaxed(regs + REG_TO_HOST_MBOX);
+               if (resp == 0)
+                       break;
+               msleep(1);
+       }
+       if (resp != 0) {
+               mutex_unlock(&priv->lock);
+               return -ETIMEDOUT;
+       }
+
        /* Write command and arguments to message area */
        for (i = 0; i < MSG_FIELD_MAX; i++)
                writel_relaxed(msg[i], regs + DCPU_MSG_RAM(i));
@@ -321,7 +434,7 @@ static int __send_command(struct private_data *priv, unsigned int cmd,
                resp = readl_relaxed(regs + REG_TO_HOST_MBOX);
                if (resp > 0)
                        break;
-               udelay(5);
+               msleep(1);
        }
 
        if (i == DELAY_LOOP_MAX) {
@@ -331,10 +444,11 @@ static int __send_command(struct private_data *priv, unsigned int cmd,
                /* Read response data */
                for (i = 0; i < MSG_FIELD_MAX; i++)
                        result[i] = readl_relaxed(regs + DCPU_MSG_RAM(i));
+               chksum_idx = result[MSG_ARG_COUNT] + MSG_ARG_COUNT + 1;
        }
 
        /* Tell DCPU we are done */
-       writel_relaxed(0, regs + REG_TO_HOST_MBOX);
+       __finalize_command(priv);
 
        mutex_unlock(&priv->lock);
 
@@ -342,8 +456,8 @@ static int __send_command(struct private_data *priv, unsigned int cmd,
                return ret;
 
        /* Verify response */
-       chksum = get_msg_chksum(result);
-       if (chksum != result[MSG_CHKSUM])
+       chksum = get_msg_chksum(result, chksum_idx);
+       if (chksum != result[chksum_idx])
                resp = DCPU_RET_ERR_CHKSUM;
 
        if (resp != DCPU_RET_SUCCESS) {
@@ -484,7 +598,15 @@ static int brcmstb_dpfe_download_firmware(struct platform_device *pdev,
                        return 0;
        }
 
-       ret = request_firmware(&fw, FIRMWARE_NAME, dev);
+       /*
+        * If the firmware filename is NULL it means the boot firmware has to
+        * download the DCPU firmware for us. If that didn't work, we have to
+        * bail, since downloading it ourselves wouldn't work either.
+        */
+       if (!priv->dpfe_api->fw_name)
+               return -ENODEV;
+
+       ret = request_firmware(&fw, priv->dpfe_api->fw_name, dev);
        /* request_firmware() prints its own error messages. */
        if (ret)
                return ret;
@@ -525,12 +647,10 @@ static int brcmstb_dpfe_download_firmware(struct platform_device *pdev,
 }
 
 static ssize_t generic_show(unsigned int command, u32 response[],
-                           struct device *dev, char *buf)
+                           struct private_data *priv, char *buf)
 {
-       struct private_data *priv;
        int ret;
 
-       priv = dev_get_drvdata(dev);
        if (!priv)
                return sprintf(buf, "ERROR: driver private data not set\n");
 
@@ -545,10 +665,12 @@ static ssize_t show_info(struct device *dev, struct device_attribute *devattr,
                         char *buf)
 {
        u32 response[MSG_FIELD_MAX];
+       struct private_data *priv;
        unsigned int info;
        ssize_t ret;
 
-       ret = generic_show(DPFE_CMD_GET_INFO, response, dev, buf);
+       priv = dev_get_drvdata(dev);
+       ret = generic_show(DPFE_CMD_GET_INFO, response, priv, buf);
        if (ret)
                return ret;
 
@@ -571,17 +693,17 @@ static ssize_t show_refresh(struct device *dev,
        u32 mr4;
        ssize_t ret;
 
-       ret = generic_show(DPFE_CMD_GET_REFRESH, response, dev, buf);
+       priv = dev_get_drvdata(dev);
+       ret = generic_show(DPFE_CMD_GET_REFRESH, response, priv, buf);
        if (ret)
                return ret;
 
-       priv = dev_get_drvdata(dev);
-
        info = get_msg_ptr(priv, response[MSG_ARG0], buf, &ret);
        if (!info)
                return ret;
 
-       mr4 = readl_relaxed(info + DRAM_INFO_MR4) & DRAM_INFO_MR4_MASK;
+       mr4 = (readl_relaxed(info + DRAM_INFO_MR4) >> DRAM_INFO_MR4_SHIFT) &
+              DRAM_INFO_MR4_MASK;
 
        refresh = (mr4 >> DRAM_MR4_REFRESH) & DRAM_MR4_REFRESH_MASK;
        sr_abort = (mr4 >> DRAM_MR4_SR_ABORT) & DRAM_MR4_SR_ABORT_MASK;
@@ -608,7 +730,6 @@ static ssize_t store_refresh(struct device *dev, struct device_attribute *attr,
                return -EINVAL;
 
        priv = dev_get_drvdata(dev);
-
        ret = __send_command(priv, DPFE_CMD_GET_REFRESH, response);
        if (ret)
                return ret;
@@ -623,30 +744,58 @@ static ssize_t store_refresh(struct device *dev, struct device_attribute *attr,
 }
 
 static ssize_t show_vendor(struct device *dev, struct device_attribute *devattr,
-                        char *buf)
+                          char *buf)
 {
        u32 response[MSG_FIELD_MAX];
        struct private_data *priv;
        void __iomem *info;
        ssize_t ret;
+       u32 mr5, mr6, mr7, mr8, err;
 
-       ret = generic_show(DPFE_CMD_GET_VENDOR, response, dev, buf);
+       priv = dev_get_drvdata(dev);
+       ret = generic_show(DPFE_CMD_GET_VENDOR, response, priv, buf);
        if (ret)
                return ret;
 
-       priv = dev_get_drvdata(dev);
-
        info = get_msg_ptr(priv, response[MSG_ARG0], buf, &ret);
        if (!info)
                return ret;
 
-       return sprintf(buf, "%#x %#x %#x %#x %#x\n",
-                      readl_relaxed(info + DRAM_VENDOR_MR5) & DRAM_VENDOR_MASK,
-                      readl_relaxed(info + DRAM_VENDOR_MR6) & DRAM_VENDOR_MASK,
-                      readl_relaxed(info + DRAM_VENDOR_MR7) & DRAM_VENDOR_MASK,
-                      readl_relaxed(info + DRAM_VENDOR_MR8) & DRAM_VENDOR_MASK,
-                      readl_relaxed(info + DRAM_VENDOR_ERROR) &
-                                    DRAM_VENDOR_MASK);
+       mr5 = (readl_relaxed(info + DRAM_VENDOR_MR5) >> DRAM_VENDOR_SHIFT) &
+               DRAM_VENDOR_MASK;
+       mr6 = (readl_relaxed(info + DRAM_VENDOR_MR6) >> DRAM_VENDOR_SHIFT) &
+               DRAM_VENDOR_MASK;
+       mr7 = (readl_relaxed(info + DRAM_VENDOR_MR7) >> DRAM_VENDOR_SHIFT) &
+               DRAM_VENDOR_MASK;
+       mr8 = (readl_relaxed(info + DRAM_VENDOR_MR8) >> DRAM_VENDOR_SHIFT) &
+               DRAM_VENDOR_MASK;
+       err = readl_relaxed(info + DRAM_VENDOR_ERROR) & DRAM_VENDOR_MASK;
+
+       return sprintf(buf, "%#x %#x %#x %#x %#x\n", mr5, mr6, mr7, mr8, err);
+}
+
+static ssize_t show_dram(struct device *dev, struct device_attribute *devattr,
+                        char *buf)
+{
+       u32 response[MSG_FIELD_MAX];
+       struct private_data *priv;
+       ssize_t ret;
+       u32 mr4, mr5, mr6, mr7, mr8, err;
+
+       priv = dev_get_drvdata(dev);
+       ret = generic_show(DPFE_CMD_GET_REFRESH, response, priv, buf);
+       if (ret)
+               return ret;
+
+       mr4 = response[MSG_ARG0 + 0] & DRAM_INFO_MR4_MASK;
+       mr5 = response[MSG_ARG0 + 1] & DRAM_DDR_INFO_MASK;
+       mr6 = response[MSG_ARG0 + 2] & DRAM_DDR_INFO_MASK;
+       mr7 = response[MSG_ARG0 + 3] & DRAM_DDR_INFO_MASK;
+       mr8 = response[MSG_ARG0 + 4] & DRAM_DDR_INFO_MASK;
+       err = response[MSG_ARG0 + 5] & DRAM_DDR_INFO_MASK;
+
+       return sprintf(buf, "%#x %#x %#x %#x %#x %#x\n", mr4, mr5, mr6, mr7,
+                       mr8, err);
 }
 
 static int brcmstb_dpfe_resume(struct platform_device *pdev)
@@ -656,17 +805,6 @@ static int brcmstb_dpfe_resume(struct platform_device *pdev)
        return brcmstb_dpfe_download_firmware(pdev, &init);
 }
 
-static DEVICE_ATTR(dpfe_info, 0444, show_info, NULL);
-static DEVICE_ATTR(dpfe_refresh, 0644, show_refresh, store_refresh);
-static DEVICE_ATTR(dpfe_vendor, 0444, show_vendor, NULL);
-static struct attribute *dpfe_attrs[] = {
-       &dev_attr_dpfe_info.attr,
-       &dev_attr_dpfe_refresh.attr,
-       &dev_attr_dpfe_vendor.attr,
-       NULL
-};
-ATTRIBUTE_GROUPS(dpfe);
-
 static int brcmstb_dpfe_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
@@ -703,26 +841,47 @@ static int brcmstb_dpfe_probe(struct platform_device *pdev)
                return -ENOENT;
        }
 
+       priv->dpfe_api = of_device_get_match_data(dev);
+       if (unlikely(!priv->dpfe_api)) {
+               /*
+                * It should be impossible to end up here, but to be safe we
+                * check anyway.
+                */
+               dev_err(dev, "Couldn't determine API\n");
+               return -ENOENT;
+       }
+
        ret = brcmstb_dpfe_download_firmware(pdev, &init);
-       if (ret)
+       if (ret) {
+               dev_err(dev, "Couldn't download firmware -- %d\n", ret);
                return ret;
+       }
 
-       ret = sysfs_create_groups(&pdev->dev.kobj, dpfe_groups);
+       ret = sysfs_create_groups(&pdev->dev.kobj, priv->dpfe_api->sysfs_attrs);
        if (!ret)
-               dev_info(dev, "registered.\n");
+               dev_info(dev, "registered with API v%d.\n",
+                        priv->dpfe_api->version);
 
        return ret;
 }
 
 static int brcmstb_dpfe_remove(struct platform_device *pdev)
 {
-       sysfs_remove_groups(&pdev->dev.kobj, dpfe_groups);
+       struct private_data *priv = dev_get_drvdata(&pdev->dev);
+
+       sysfs_remove_groups(&pdev->dev.kobj, priv->dpfe_api->sysfs_attrs);
 
        return 0;
 }
 
 static const struct of_device_id brcmstb_dpfe_of_match[] = {
-       { .compatible = "brcm,dpfe-cpu", },
+       /* Use legacy API v2 for a select number of chips */
+       { .compatible = "brcm,bcm7268-dpfe-cpu", .data = &dpfe_api_v2 },
+       { .compatible = "brcm,bcm7271-dpfe-cpu", .data = &dpfe_api_v2 },
+       { .compatible = "brcm,bcm7278-dpfe-cpu", .data = &dpfe_api_v2 },
+       { .compatible = "brcm,bcm7211-dpfe-cpu", .data = &dpfe_api_v2 },
+       /* API v3 is the default going forward */
+       { .compatible = "brcm,dpfe-cpu", .data = &dpfe_api_v3 },
        {}
 };
 MODULE_DEVICE_TABLE(of, brcmstb_dpfe_of_match);
index ee67a9a5d775acd8501da6276ea9c6a3c661caec..402c6bc8e621d02ff69c924fe66bfb8d717c759e 100644 (file)
@@ -23,8 +23,9 @@
 #include <linux/list.h>
 #include <linux/spinlock.h>
 #include <linux/pm.h>
-#include <memory/jedec_ddr.h>
+
 #include "emif.h"
+#include "jedec_ddr.h"
 #include "of_memory.h"
 
 /**
similarity index 97%
rename from include/memory/jedec_ddr.h
rename to drivers/memory/jedec_ddr.h
index 90a9dabbe606f38eb1c436c514980b97ab630fbf..4a21b5044ff88898169b8201bddfa7b7bb126b6d 100644 (file)
@@ -6,8 +6,8 @@
  *
  * Aneesh V <aneesh@ti.com>
  */
-#ifndef __LINUX_JEDEC_DDR_H
-#define __LINUX_JEDEC_DDR_H
+#ifndef __JEDEC_DDR_H
+#define __JEDEC_DDR_H
 
 #include <linux/types.h>
 
@@ -169,4 +169,4 @@ extern const struct lpddr2_timings
        lpddr2_jedec_timings[NUM_DDR_TIMING_TABLE_ENTRIES];
 extern const struct lpddr2_min_tck lpddr2_jedec_min_tck;
 
-#endif /* __LINUX_JEDEC_DDR_H */
+#endif /* __JEDEC_DDR_H */
similarity index 98%
rename from lib/jedec_ddr_data.c
rename to drivers/memory/jedec_ddr_data.c
index d0b312e28d36eb90b5f8a62f26828ef681b06590..ed601d813175e7c723c2022932cc9431b13907ec 100644 (file)
@@ -7,8 +7,9 @@
  * Aneesh V <aneesh@ti.com>
  */
 
-#include <memory/jedec_ddr.h>
-#include <linux/module.h>
+#include <linux/export.h>
+
+#include "jedec_ddr.h"
 
 /* LPDDR2 addressing details from JESD209-2 section 2.4 */
 const struct lpddr2_addressing
index 12a61f55864444d8eadc3c329496bccacb61e9c9..46539b27a3fb9291a920cdfa81d558bf1857a0ba 100644 (file)
@@ -10,8 +10,9 @@
 #include <linux/list.h>
 #include <linux/of.h>
 #include <linux/gfp.h>
-#include <memory/jedec_ddr.h>
 #include <linux/export.h>
+
+#include "jedec_ddr.h"
 #include "of_memory.h"
 
 /**
index 41f08b2effd2a4fdcb0224afed0c44a2ee9c23bd..5d0ccb2be20634b574be5366c8e766af4a93b63f 100644 (file)
 #define MC_EMEM_ARB_MISC1                      0xdc
 #define MC_EMEM_ARB_RING1_THROTTLE             0xe0
 
-static const unsigned long tegra124_mc_emem_regs[] = {
-       MC_EMEM_ARB_CFG,
-       MC_EMEM_ARB_OUTSTANDING_REQ,
-       MC_EMEM_ARB_TIMING_RCD,
-       MC_EMEM_ARB_TIMING_RP,
-       MC_EMEM_ARB_TIMING_RC,
-       MC_EMEM_ARB_TIMING_RAS,
-       MC_EMEM_ARB_TIMING_FAW,
-       MC_EMEM_ARB_TIMING_RRD,
-       MC_EMEM_ARB_TIMING_RAP2PRE,
-       MC_EMEM_ARB_TIMING_WAP2PRE,
-       MC_EMEM_ARB_TIMING_R2R,
-       MC_EMEM_ARB_TIMING_W2W,
-       MC_EMEM_ARB_TIMING_R2W,
-       MC_EMEM_ARB_TIMING_W2R,
-       MC_EMEM_ARB_DA_TURNS,
-       MC_EMEM_ARB_DA_COVERS,
-       MC_EMEM_ARB_MISC0,
-       MC_EMEM_ARB_MISC1,
-       MC_EMEM_ARB_RING1_THROTTLE
-};
-
 static const struct tegra_mc_client tegra124_mc_clients[] = {
        {
                .id = 0x00,
@@ -1046,6 +1024,28 @@ static const struct tegra_mc_reset tegra124_mc_resets[] = {
 };
 
 #ifdef CONFIG_ARCH_TEGRA_124_SOC
+static const unsigned long tegra124_mc_emem_regs[] = {
+       MC_EMEM_ARB_CFG,
+       MC_EMEM_ARB_OUTSTANDING_REQ,
+       MC_EMEM_ARB_TIMING_RCD,
+       MC_EMEM_ARB_TIMING_RP,
+       MC_EMEM_ARB_TIMING_RC,
+       MC_EMEM_ARB_TIMING_RAS,
+       MC_EMEM_ARB_TIMING_FAW,
+       MC_EMEM_ARB_TIMING_RRD,
+       MC_EMEM_ARB_TIMING_RAP2PRE,
+       MC_EMEM_ARB_TIMING_WAP2PRE,
+       MC_EMEM_ARB_TIMING_R2R,
+       MC_EMEM_ARB_TIMING_W2W,
+       MC_EMEM_ARB_TIMING_R2W,
+       MC_EMEM_ARB_TIMING_W2R,
+       MC_EMEM_ARB_DA_TURNS,
+       MC_EMEM_ARB_DA_COVERS,
+       MC_EMEM_ARB_MISC0,
+       MC_EMEM_ARB_MISC1,
+       MC_EMEM_ARB_RING1_THROTTLE
+};
+
 static const struct tegra_smmu_soc tegra124_smmu_soc = {
        .clients = tegra124_mc_clients,
        .num_clients = ARRAY_SIZE(tegra124_mc_clients),
index d75ae18efa7dda079da080183f4662af1877dc47..d1c83bd5b98e7abd33b44ecb6632fa71714de91d 100644 (file)
  * GNU General Public License for more details.
  */
 
-#include <generated/ti-emif-asm-offsets.h>
 #include <linux/linkage.h>
 #include <asm/assembler.h>
 #include <asm/memory.h>
 
 #include "emif.h"
+#include "ti-emif-asm-offsets.h"
 
 #define EMIF_POWER_MGMT_WAIT_SELF_REFRESH_8192_CYCLES  0x00a0
 #define EMIF_POWER_MGMT_SR_TIMER_MASK                  0x00f0
index 11c5bad95226698ab2888f2ad971220a2c5df8e4..14a5fb3781453526914bdab493c9b68beaa596b3 100644 (file)
@@ -363,10 +363,13 @@ static int __init arcrimi_setup(char *s)
        switch (ints[0]) {
        default:                /* ERROR */
                pr_err("Too many arguments\n");
+               /* Fall through */
        case 3:         /* Node ID */
                node = ints[3];
+               /* Fall through */
        case 2:         /* IRQ */
                irq = ints[2];
+               /* Fall through */
        case 1:         /* IO address */
                io = ints[1];
        }
index 28510e33924fbd7099f232a869c7715656eccc4e..cd27fdc1059b908900fe72d7e23503750dface0a 100644 (file)
@@ -197,16 +197,22 @@ static int __init com20020isa_setup(char *s)
        switch (ints[0]) {
        default:                /* ERROR */
                pr_info("Too many arguments\n");
+               /* Fall through */
        case 6:         /* Timeout */
                timeout = ints[6];
+               /* Fall through */
        case 5:         /* CKP value */
                clockp = ints[5];
+               /* Fall through */
        case 4:         /* Backplane flag */
                backplane = ints[4];
+               /* Fall through */
        case 3:         /* Node ID */
                node = ints[3];
+               /* Fall through */
        case 2:         /* IRQ */
                irq = ints[2];
+               /* Fall through */
        case 1:         /* IO address */
                io = ints[1];
        }
index 2c546013a98014b4c83b759d293ed24f91b3c940..186bbf87bc849f1e3e80180068412de2a5ff1606 100644 (file)
@@ -363,8 +363,10 @@ static int __init com90io_setup(char *s)
        switch (ints[0]) {
        default:                /* ERROR */
                pr_err("Too many arguments\n");
+               /* Fall through */
        case 2:         /* IRQ */
                irq = ints[2];
+               /* Fall through */
        case 1:         /* IO address */
                io = ints[1];
        }
index ca4a57c30bf89ed8d565d228aca9953153a3adf4..bd75d06ad7dfc98c982a3c7f033508a8e398d3ae 100644 (file)
@@ -693,10 +693,13 @@ static int __init com90xx_setup(char *s)
        switch (ints[0]) {
        default:                /* ERROR */
                pr_err("Too many arguments\n");
+               /* Fall through */
        case 3:         /* Mem address */
                shmem = ints[3];
+               /* Fall through */
        case 2:         /* IRQ */
                irq = ints[2];
+               /* Fall through */
        case 1:         /* IO address */
                io = ints[1];
        }
index 9b7016abca2f6c4a89185fb23b0bd719e18c08e4..02fd7822c14a4286f1b5ec6379bd22fcd4d21330 100644 (file)
@@ -2196,6 +2196,15 @@ static void bond_miimon_commit(struct bonding *bond)
        bond_for_each_slave(bond, slave, iter) {
                switch (slave->new_link) {
                case BOND_LINK_NOCHANGE:
+                       /* For 802.3ad mode, check current slave speed and
+                        * duplex again in case its port was disabled after
+                        * invalid speed/duplex reporting but recovered before
+                        * link monitoring could make a decision on the actual
+                        * link status
+                        */
+                       if (BOND_MODE(bond) == BOND_MODE_8023AD &&
+                           slave->link == BOND_LINK_UP)
+                               bond_3ad_adapter_speed_duplex_changed(slave);
                        continue;
 
                case BOND_LINK_UP:
index b6b93a2d93a59293dccbfe00158857aae5a21965..483d270664cc87efd828993641406e24818db334 100644 (file)
@@ -1249,6 +1249,8 @@ int register_candev(struct net_device *dev)
                return -EINVAL;
 
        dev->rtnl_link_ops = &can_link_ops;
+       netif_carrier_off(dev);
+
        return register_netdev(dev);
 }
 EXPORT_SYMBOL_GPL(register_candev);
index f2fe344593d58ce66697515326efae700dab22ce..fcec8bcb53d64cd246b1e003de157432ec32bd41 100644 (file)
@@ -400,9 +400,10 @@ static void flexcan_enable_wakeup_irq(struct flexcan_priv *priv, bool enable)
        priv->write(reg_mcr, &regs->mcr);
 }
 
-static inline void flexcan_enter_stop_mode(struct flexcan_priv *priv)
+static inline int flexcan_enter_stop_mode(struct flexcan_priv *priv)
 {
        struct flexcan_regs __iomem *regs = priv->regs;
+       unsigned int ackval;
        u32 reg_mcr;
 
        reg_mcr = priv->read(&regs->mcr);
@@ -412,20 +413,37 @@ static inline void flexcan_enter_stop_mode(struct flexcan_priv *priv)
        /* enable stop request */
        regmap_update_bits(priv->stm.gpr, priv->stm.req_gpr,
                           1 << priv->stm.req_bit, 1 << priv->stm.req_bit);
+
+       /* get stop acknowledgment */
+       if (regmap_read_poll_timeout(priv->stm.gpr, priv->stm.ack_gpr,
+                                    ackval, ackval & (1 << priv->stm.ack_bit),
+                                    0, FLEXCAN_TIMEOUT_US))
+               return -ETIMEDOUT;
+
+       return 0;
 }
 
-static inline void flexcan_exit_stop_mode(struct flexcan_priv *priv)
+static inline int flexcan_exit_stop_mode(struct flexcan_priv *priv)
 {
        struct flexcan_regs __iomem *regs = priv->regs;
+       unsigned int ackval;
        u32 reg_mcr;
 
        /* remove stop request */
        regmap_update_bits(priv->stm.gpr, priv->stm.req_gpr,
                           1 << priv->stm.req_bit, 0);
 
+       /* get stop acknowledgment */
+       if (regmap_read_poll_timeout(priv->stm.gpr, priv->stm.ack_gpr,
+                                    ackval, !(ackval & (1 << priv->stm.ack_bit)),
+                                    0, FLEXCAN_TIMEOUT_US))
+               return -ETIMEDOUT;
+
        reg_mcr = priv->read(&regs->mcr);
        reg_mcr &= ~FLEXCAN_MCR_SLF_WAK;
        priv->write(reg_mcr, &regs->mcr);
+
+       return 0;
 }
 
 static inline void flexcan_error_irq_enable(const struct flexcan_priv *priv)
@@ -1437,10 +1455,10 @@ static int flexcan_setup_stop_mode(struct platform_device *pdev)
 
        priv = netdev_priv(dev);
        priv->stm.gpr = syscon_node_to_regmap(gpr_np);
-       of_node_put(gpr_np);
        if (IS_ERR(priv->stm.gpr)) {
                dev_dbg(&pdev->dev, "could not find gpr regmap\n");
-               return PTR_ERR(priv->stm.gpr);
+               ret = PTR_ERR(priv->stm.gpr);
+               goto out_put_node;
        }
 
        priv->stm.req_gpr = out_val[1];
@@ -1455,7 +1473,9 @@ static int flexcan_setup_stop_mode(struct platform_device *pdev)
 
        device_set_wakeup_capable(&pdev->dev, true);
 
-       return 0;
+out_put_node:
+       of_node_put(gpr_np);
+       return ret;
 }
 
 static const struct of_device_id flexcan_of_match[] = {
@@ -1612,7 +1632,9 @@ static int __maybe_unused flexcan_suspend(struct device *device)
                 */
                if (device_may_wakeup(device)) {
                        enable_irq_wake(dev->irq);
-                       flexcan_enter_stop_mode(priv);
+                       err = flexcan_enter_stop_mode(priv);
+                       if (err)
+                               return err;
                } else {
                        err = flexcan_chip_disable(priv);
                        if (err)
@@ -1662,10 +1684,13 @@ static int __maybe_unused flexcan_noirq_resume(struct device *device)
 {
        struct net_device *dev = dev_get_drvdata(device);
        struct flexcan_priv *priv = netdev_priv(dev);
+       int err;
 
        if (netif_running(dev) && device_may_wakeup(device)) {
                flexcan_enable_wakeup_irq(priv, false);
-               flexcan_exit_stop_mode(priv);
+               err = flexcan_exit_stop_mode(priv);
+               if (err)
+                       return err;
        }
 
        return 0;
index 05410008aa6b6ee2ac1a6a957c2b0b838f9ee2fc..de34a4b82d4ad474ff2ba253ba29f52d5347d8f3 100644 (file)
@@ -1508,10 +1508,11 @@ static int rcar_canfd_rx_poll(struct napi_struct *napi, int quota)
 
        /* All packets processed */
        if (num_pkts < quota) {
-               napi_complete_done(napi, num_pkts);
-               /* Enable Rx FIFO interrupts */
-               rcar_canfd_set_bit(priv->base, RCANFD_RFCC(ridx),
-                                  RCANFD_RFCC_RFIE);
+               if (napi_complete_done(napi, num_pkts)) {
+                       /* Enable Rx FIFO interrupts */
+                       rcar_canfd_set_bit(priv->base, RCANFD_RFCC(ridx),
+                                          RCANFD_RFCC_RFIE);
+               }
        }
        return num_pkts;
 }
index 44e99e3d713487ff8b9cbc5c15046276274d6c04..2aec934fab0cdd5e6991e195f2c19e5ee88283f3 100644 (file)
@@ -664,17 +664,6 @@ static int mcp251x_power_enable(struct regulator *reg, int enable)
                return regulator_disable(reg);
 }
 
-static void mcp251x_open_clean(struct net_device *net)
-{
-       struct mcp251x_priv *priv = netdev_priv(net);
-       struct spi_device *spi = priv->spi;
-
-       free_irq(spi->irq, priv);
-       mcp251x_hw_sleep(spi);
-       mcp251x_power_enable(priv->transceiver, 0);
-       close_candev(net);
-}
-
 static int mcp251x_stop(struct net_device *net)
 {
        struct mcp251x_priv *priv = netdev_priv(net);
@@ -940,37 +929,43 @@ static int mcp251x_open(struct net_device *net)
                                   flags | IRQF_ONESHOT, DEVICE_NAME, priv);
        if (ret) {
                dev_err(&spi->dev, "failed to acquire irq %d\n", spi->irq);
-               mcp251x_power_enable(priv->transceiver, 0);
-               close_candev(net);
-               goto open_unlock;
+               goto out_close;
        }
 
        priv->wq = alloc_workqueue("mcp251x_wq", WQ_FREEZABLE | WQ_MEM_RECLAIM,
                                   0);
+       if (!priv->wq) {
+               ret = -ENOMEM;
+               goto out_clean;
+       }
        INIT_WORK(&priv->tx_work, mcp251x_tx_work_handler);
        INIT_WORK(&priv->restart_work, mcp251x_restart_work_handler);
 
        ret = mcp251x_hw_reset(spi);
-       if (ret) {
-               mcp251x_open_clean(net);
-               goto open_unlock;
-       }
+       if (ret)
+               goto out_free_wq;
        ret = mcp251x_setup(net, spi);
-       if (ret) {
-               mcp251x_open_clean(net);
-               goto open_unlock;
-       }
+       if (ret)
+               goto out_free_wq;
        ret = mcp251x_set_normal_mode(spi);
-       if (ret) {
-               mcp251x_open_clean(net);
-               goto open_unlock;
-       }
+       if (ret)
+               goto out_free_wq;
 
        can_led_event(net, CAN_LED_EVENT_OPEN);
 
        netif_wake_queue(net);
+       mutex_unlock(&priv->mcp_lock);
 
-open_unlock:
+       return 0;
+
+out_free_wq:
+       destroy_workqueue(priv->wq);
+out_clean:
+       free_irq(spi->irq, priv);
+       mcp251x_hw_sleep(spi);
+out_close:
+       mcp251x_power_enable(priv->transceiver, 0);
+       close_candev(net);
        mutex_unlock(&priv->mcp_lock);
        return ret;
 }
index 458154c9b48298b45c1e93a83fc98afe47eb1caa..22b9c8e6d040aebd2a5333c61e3338fc0f41ed15 100644 (file)
@@ -568,16 +568,16 @@ static int peak_usb_ndo_stop(struct net_device *netdev)
        dev->state &= ~PCAN_USB_STATE_STARTED;
        netif_stop_queue(netdev);
 
+       close_candev(netdev);
+
+       dev->can.state = CAN_STATE_STOPPED;
+
        /* unlink all pending urbs and free used memory */
        peak_usb_unlink_all_urbs(dev);
 
        if (dev->adapter->dev_stop)
                dev->adapter->dev_stop(dev);
 
-       close_candev(netdev);
-
-       dev->can.state = CAN_STATE_STOPPED;
-
        /* can set bus off now */
        if (dev->adapter->dev_set_bus) {
                int err = dev->adapter->dev_set_bus(dev, 0);
index 6b17cd961d061285b7f3c258ab37445559e8b04f..a0f288efcc12454809519bc81dcf017ca03ef0d9 100644 (file)
@@ -430,7 +430,7 @@ int mv88e6xxx_port_setup_mac(struct mv88e6xxx_chip *chip, int port, int link,
                return 0;
 
        /* Port's MAC control must not be changed unless the link is down */
-       err = chip->info->ops->port_set_link(chip, port, 0);
+       err = chip->info->ops->port_set_link(chip, port, LINK_FORCED_DOWN);
        if (err)
                return err;
 
@@ -2721,6 +2721,7 @@ static int mv88e6xxx_mdios_register(struct mv88e6xxx_chip *chip,
                        err = mv88e6xxx_mdio_register(chip, child, true);
                        if (err) {
                                mv88e6xxx_mdios_unregister(chip);
+                               of_node_put(child);
                                return err;
                        }
                }
index 232e8cc96f6dee10ecfba315cc9fc9eb7a9975fb..e429e92dedf47607a7f1b7175b779af78f831675 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * Copyright (C) 2009 Felix Fietkau <nbd@nbd.name>
  * Copyright (C) 2011-2012 Gabor Juhos <juhosg@openwrt.org>
- * Copyright (c) 2015, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015, 2019, The Linux Foundation. All rights reserved.
  * Copyright (c) 2016 John Crispin <john@phrozen.org>
  */
 
@@ -935,6 +935,8 @@ qca8k_port_enable(struct dsa_switch *ds, int port,
        qca8k_port_set_status(priv, port, 1);
        priv->port_sts[port].enabled = 1;
 
+       phy_support_asym_pause(phy);
+
        return 0;
 }
 
index 32bf3a7cc3b6db9961ec7df11cc0e9bb127de4a8..6ed5f1e357890452b463d2a38e93c1bd0b82e057 100644 (file)
@@ -625,6 +625,7 @@ static int sja1105_parse_ports_node(struct sja1105_private *priv,
                if (of_property_read_u32(child, "reg", &index) < 0) {
                        dev_err(dev, "Port number not defined in device tree "
                                "(property \"reg\")\n");
+                       of_node_put(child);
                        return -ENODEV;
                }
 
@@ -634,6 +635,7 @@ static int sja1105_parse_ports_node(struct sja1105_private *priv,
                        dev_err(dev, "Failed to read phy-mode or "
                                "phy-interface-type property for port %d\n",
                                index);
+                       of_node_put(child);
                        return -ENODEV;
                }
                ports[index].phy_mode = phy_mode;
@@ -643,6 +645,7 @@ static int sja1105_parse_ports_node(struct sja1105_private *priv,
                        if (!of_phy_is_fixed_link(child)) {
                                dev_err(dev, "phy-handle or fixed-link "
                                        "properties missing!\n");
+                               of_node_put(child);
                                return -ENODEV;
                        }
                        /* phy-handle is missing, but fixed-link isn't.
index ea34bcb868b57fba300df2d9d393aaa2ad82a926..edbb4b3604c751e9b02e4c4643b0406021514ed9 100644 (file)
@@ -2362,7 +2362,7 @@ static int et131x_tx_dma_memory_alloc(struct et131x_adapter *adapter)
 
        /* Allocate memory for the TCB's (Transmit Control Block) */
        tx_ring->tcb_ring = kcalloc(NUM_TCB, sizeof(struct tcb),
-                                   GFP_ATOMIC | GFP_DMA);
+                                   GFP_KERNEL | GFP_DMA);
        if (!tx_ring->tcb_ring)
                return -ENOMEM;
 
index 8b69d0d7e7269e0b8d6c92f942ad5b0df535a55a..6703960c7cf5035a6af2fd8af53fa39e9a026d96 100644 (file)
@@ -1141,7 +1141,7 @@ static int ag71xx_rings_init(struct ag71xx *ag)
 
        tx->descs_cpu = dma_alloc_coherent(&ag->pdev->dev,
                                           ring_size * AG71XX_DESC_SIZE,
-                                          &tx->descs_dma, GFP_ATOMIC);
+                                          &tx->descs_dma, GFP_KERNEL);
        if (!tx->descs_cpu) {
                kfree(tx->buf);
                tx->buf = NULL;
index b9c5cea8db168c2284846cd8b9e1f980ae78189e..9483553ce44452e6b742b278f18c277691568ed6 100644 (file)
@@ -992,7 +992,7 @@ static int bcm_sysport_poll(struct napi_struct *napi, int budget)
 {
        struct bcm_sysport_priv *priv =
                container_of(napi, struct bcm_sysport_priv, napi);
-       struct dim_sample dim_sample;
+       struct dim_sample dim_sample = {};
        unsigned int work_done = 0;
 
        work_done = bcm_sysport_desc_rx(priv, budget);
index 656ed80647f0275ce813ac51792bcb0d11586690..e47ea92e2ae3a320d2b02d51865ade6eccdfcb90 100644 (file)
@@ -285,6 +285,9 @@ int bnx2x_tx_int(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata)
        hw_cons = le16_to_cpu(*txdata->tx_cons_sb);
        sw_cons = txdata->tx_pkt_cons;
 
+       /* Ensure subsequent loads occur after hw_cons */
+       smp_rmb();
+
        while (sw_cons != hw_cons) {
                u16 pkt_cons;
 
@@ -1931,8 +1934,7 @@ u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb,
        }
 
        /* select a non-FCoE queue */
-       return netdev_pick_tx(dev, skb, NULL) %
-              (BNX2X_NUM_ETH_QUEUES(bp) * bp->max_cos);
+       return netdev_pick_tx(dev, skb, NULL) % (BNX2X_NUM_ETH_QUEUES(bp));
 }
 
 void bnx2x_set_num_queues(struct bnx2x *bp)
index 7134d2c3eb1c4ccdcdd9cdd97497adedddefa159..7070349915bc5412a52e556de427fb8ed6174480 100644 (file)
@@ -2136,7 +2136,7 @@ static int bnxt_poll(struct napi_struct *napi, int budget)
                }
        }
        if (bp->flags & BNXT_FLAG_DIM) {
-               struct dim_sample dim_sample;
+               struct dim_sample dim_sample = {};
 
                dim_update_sample(cpr->event_ctr,
                                  cpr->rx_packets,
index a2b57807453b6f4c57fc53c408e488d10b217b66..d3a0b614dbfa2148d4243238bf18495bf36c456f 100644 (file)
@@ -1895,7 +1895,7 @@ static int bcmgenet_rx_poll(struct napi_struct *napi, int budget)
 {
        struct bcmgenet_rx_ring *ring = container_of(napi,
                        struct bcmgenet_rx_ring, napi);
-       struct dim_sample dim_sample;
+       struct dim_sample dim_sample = {};
        unsigned int work_done;
 
        work_done = bcmgenet_desc_rx(ring, budget);
index ad22554857bf35df096408cea9184e5d786f7dc3..acb016834f0470ffbb9f0f79a57ef8809d2e567e 100644 (file)
@@ -1381,24 +1381,18 @@ static int acpi_get_mac_address(struct device *dev, struct acpi_device *adev,
                                u8 *dst)
 {
        u8 mac[ETH_ALEN];
-       int ret;
+       u8 *addr;
 
-       ret = fwnode_property_read_u8_array(acpi_fwnode_handle(adev),
-                                           "mac-address", mac, ETH_ALEN);
-       if (ret)
-               goto out;
-
-       if (!is_valid_ether_addr(mac)) {
+       addr = fwnode_get_mac_address(acpi_fwnode_handle(adev), mac, ETH_ALEN);
+       if (!addr) {
                dev_err(dev, "MAC address invalid: %pM\n", mac);
-               ret = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
 
        dev_info(dev, "MAC address set to: %pM\n", mac);
 
-       memcpy(dst, mac, ETH_ALEN);
-out:
-       return ret;
+       ether_addr_copy(dst, mac);
+       return 0;
 }
 
 /* Currently only sets the MAC address. */
index 67202b6f352e59858fe56156baba43506578b319..4311ad9c84b29f8643166f083ac9ddf97f3a1069 100644 (file)
@@ -5561,7 +5561,6 @@ static int cxgb4_iov_configure(struct pci_dev *pdev, int num_vfs)
                char name[IFNAMSIZ];
                u32 devcap2;
                u16 flags;
-               int pos;
 
                /* If we want to instantiate Virtual Functions, then our
                 * parent bridge's PCI-E needs to support Alternative Routing
@@ -5569,9 +5568,8 @@ static int cxgb4_iov_configure(struct pci_dev *pdev, int num_vfs)
                 * and above.
                 */
                pbridge = pdev->bus->self;
-               pos = pci_find_capability(pbridge, PCI_CAP_ID_EXP);
-               pci_read_config_word(pbridge, pos + PCI_EXP_FLAGS, &flags);
-               pci_read_config_dword(pbridge, pos + PCI_EXP_DEVCAP2, &devcap2);
+               pcie_capability_read_word(pbridge, PCI_EXP_FLAGS, &flags);
+               pcie_capability_read_dword(pbridge, PCI_EXP_DEVCAP2, &devcap2);
 
                if ((flags & PCI_EXP_FLAGS_VERS) < 2 ||
                    !(devcap2 & PCI_EXP_DEVCAP2_ARI)) {
index 9dd5ed9a29654b03e371321f6b6ca4cc11c0bea8..f7fc553356f231dd7321431f11656a64bed6832b 100644 (file)
@@ -7309,7 +7309,6 @@ int t4_fixup_host_params(struct adapter *adap, unsigned int page_size,
        } else {
                unsigned int pack_align;
                unsigned int ingpad, ingpack;
-               unsigned int pcie_cap;
 
                /* T5 introduced the separation of the Free List Padding and
                 * Packing Boundaries.  Thus, we can select a smaller Padding
@@ -7334,8 +7333,7 @@ int t4_fixup_host_params(struct adapter *adap, unsigned int page_size,
                 * multiple of the Maximum Payload Size.
                 */
                pack_align = fl_align;
-               pcie_cap = pci_find_capability(adap->pdev, PCI_CAP_ID_EXP);
-               if (pcie_cap) {
+               if (pci_is_pcie(adap->pdev)) {
                        unsigned int mps, mps_log;
                        u16 devctl;
 
@@ -7343,9 +7341,8 @@ int t4_fixup_host_params(struct adapter *adap, unsigned int page_size,
                         * [bits 7:5] encodes sizes as powers of 2 starting at
                         * 128 bytes.
                         */
-                       pci_read_config_word(adap->pdev,
-                                            pcie_cap + PCI_EXP_DEVCTL,
-                                            &devctl);
+                       pcie_capability_read_word(adap->pdev, PCI_EXP_DEVCTL,
+                                                 &devctl);
                        mps_log = ((devctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5) + 7;
                        mps = 1 << mps_log;
                        if (mps > pack_align)
index b7a246b335990ac4cc2b6dc47d80bc7424e54a20..2edb86ec9fe9ec5945c0de54706eb79dd187d967 100644 (file)
@@ -4698,8 +4698,13 @@ int be_update_queues(struct be_adapter *adapter)
        int status;
 
        if (netif_running(netdev)) {
+               /* be_tx_timeout() must not run concurrently with this
+                * function, synchronize with an already-running dev_watchdog
+                */
+               netif_tx_lock_bh(netdev);
                /* device cannot transmit now, avoid dev_watchdog timeouts */
                netif_carrier_off(netdev);
+               netif_tx_unlock_bh(netdev);
 
                be_close(netdev);
        }
index ed0d010c7cf260f0e8cfb98f8935207bfdbc9114..46fdf36bfece8780766c7beb6f77accb33d8522a 100644 (file)
@@ -2,6 +2,7 @@
 config FSL_ENETC
        tristate "ENETC PF driver"
        depends on PCI && PCI_MSI && (ARCH_LAYERSCAPE || COMPILE_TEST)
+       select PHYLIB
        help
          This driver supports NXP ENETC gigabit ethernet controller PCIe
          physical function (PF) devices, managing ENETC Ports at a privileged
index e80fedb27cee81411019914f483590c7ec6c1871..210749bf1eac11537376244a7bd7b68740a5bba8 100644 (file)
@@ -2439,9 +2439,6 @@ MODULE_PARM_DESC(fsl_fm_rx_extra_headroom, "Extra headroom for Rx buffers");
  * buffers when not using jumbo frames.
  * Must be large enough to accommodate the network MTU, but small enough
  * to avoid wasting skb memory.
- *
- * Could be overridden once, at boot-time, via the
- * fm_set_max_frm() callback.
  */
 static int fsl_fm_max_frm = FSL_FM_MAX_FRAME_SIZE;
 module_param(fsl_fm_max_frm, int, 0);
index 4138a84803478a5b0b3ad9c7adce1e0e51f28cb3..cca71ba7a74a02b72d3c188368d6197278864243 100644 (file)
@@ -3251,7 +3251,7 @@ static int ehea_mem_notifier(struct notifier_block *nb,
        switch (action) {
        case MEM_CANCEL_OFFLINE:
                pr_info("memory offlining canceled");
-               /* Fall through: re-add canceled memory block */
+               /* Fall through - re-add canceled memory block */
 
        case MEM_ONLINE:
                pr_info("memory is going online");
index 93f3b4e6185b7e87626dfb6f1e4f86b6811f1789..aa9323e55406e323367dc1777fbd51ea6221678a 100644 (file)
@@ -3912,13 +3912,11 @@ void igc_write_pci_cfg(struct igc_hw *hw, u32 reg, u16 *value)
 s32 igc_read_pcie_cap_reg(struct igc_hw *hw, u32 reg, u16 *value)
 {
        struct igc_adapter *adapter = hw->back;
-       u16 cap_offset;
 
-       cap_offset = pci_find_capability(adapter->pdev, PCI_CAP_ID_EXP);
-       if (!cap_offset)
+       if (!pci_is_pcie(adapter->pdev))
                return -IGC_ERR_CONFIG;
 
-       pci_read_config_word(adapter->pdev, cap_offset + reg, value);
+       pcie_capability_read_word(adapter->pdev, reg, value);
 
        return IGC_SUCCESS;
 }
@@ -3926,13 +3924,11 @@ s32 igc_read_pcie_cap_reg(struct igc_hw *hw, u32 reg, u16 *value)
 s32 igc_write_pcie_cap_reg(struct igc_hw *hw, u32 reg, u16 *value)
 {
        struct igc_adapter *adapter = hw->back;
-       u16 cap_offset;
 
-       cap_offset = pci_find_capability(adapter->pdev, PCI_CAP_ID_EXP);
-       if (!cap_offset)
+       if (!pci_is_pcie(adapter->pdev))
                return -IGC_ERR_CONFIG;
 
-       pci_write_config_word(adapter->pdev, cap_offset + reg, *value);
+       pcie_capability_write_word(adapter->pdev, reg, *value);
 
        return IGC_SUCCESS;
 }
index c51f1d5b550b1131d18fc7240e5503d461c43f4f..e2e61a4a9000bc777d4495768afed08fe3c6cddb 100644 (file)
@@ -811,6 +811,26 @@ static int mvpp2_swf_bm_pool_init(struct mvpp2_port *port)
        return 0;
 }
 
+static void mvpp2_set_hw_csum(struct mvpp2_port *port,
+                             enum mvpp2_bm_pool_log_num new_long_pool)
+{
+       const netdev_features_t csums = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
+
+       /* Update L4 checksum when jumbo enable/disable on port.
+        * Only port 0 supports hardware checksum offload due to
+        * the Tx FIFO size limitation.
+        * Also, don't set NETIF_F_HW_CSUM because L3_offset in TX descriptor
+        * has 7 bits, so the maximum L3 offset is 128.
+        */
+       if (new_long_pool == MVPP2_BM_JUMBO && port->id != 0) {
+               port->dev->features &= ~csums;
+               port->dev->hw_features &= ~csums;
+       } else {
+               port->dev->features |= csums;
+               port->dev->hw_features |= csums;
+       }
+}
+
 static int mvpp2_bm_update_mtu(struct net_device *dev, int mtu)
 {
        struct mvpp2_port *port = netdev_priv(dev);
@@ -843,15 +863,7 @@ static int mvpp2_bm_update_mtu(struct net_device *dev, int mtu)
                /* Add port to new short & long pool */
                mvpp2_swf_bm_pool_init(port);
 
-               /* Update L4 checksum when jumbo enable/disable on port */
-               if (new_long_pool == MVPP2_BM_JUMBO && port->id != 0) {
-                       dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
-                       dev->hw_features &= ~(NETIF_F_IP_CSUM |
-                                             NETIF_F_IPV6_CSUM);
-               } else {
-                       dev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
-                       dev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
-               }
+               mvpp2_set_hw_csum(port, new_long_pool);
        }
 
        dev->mtu = mtu;
@@ -3700,6 +3712,7 @@ static int mvpp2_set_mac_address(struct net_device *dev, void *p)
 static int mvpp2_change_mtu(struct net_device *dev, int mtu)
 {
        struct mvpp2_port *port = netdev_priv(dev);
+       bool running = netif_running(dev);
        int err;
 
        if (!IS_ALIGNED(MVPP2_RX_PKT_SIZE(mtu), 8)) {
@@ -3708,40 +3721,24 @@ static int mvpp2_change_mtu(struct net_device *dev, int mtu)
                mtu = ALIGN(MVPP2_RX_PKT_SIZE(mtu), 8);
        }
 
-       if (!netif_running(dev)) {
-               err = mvpp2_bm_update_mtu(dev, mtu);
-               if (!err) {
-                       port->pkt_size =  MVPP2_RX_PKT_SIZE(mtu);
-                       return 0;
-               }
-
-               /* Reconfigure BM to the original MTU */
-               err = mvpp2_bm_update_mtu(dev, dev->mtu);
-               if (err)
-                       goto log_error;
-       }
-
-       mvpp2_stop_dev(port);
+       if (running)
+               mvpp2_stop_dev(port);
 
        err = mvpp2_bm_update_mtu(dev, mtu);
-       if (!err) {
+       if (err) {
+               netdev_err(dev, "failed to change MTU\n");
+               /* Reconfigure BM to the original MTU */
+               mvpp2_bm_update_mtu(dev, dev->mtu);
+       } else {
                port->pkt_size =  MVPP2_RX_PKT_SIZE(mtu);
-               goto out_start;
        }
 
-       /* Reconfigure BM to the original MTU */
-       err = mvpp2_bm_update_mtu(dev, dev->mtu);
-       if (err)
-               goto log_error;
-
-out_start:
-       mvpp2_start_dev(port);
-       mvpp2_egress_enable(port);
-       mvpp2_ingress_enable(port);
+       if (running) {
+               mvpp2_start_dev(port);
+               mvpp2_egress_enable(port);
+               mvpp2_ingress_enable(port);
+       }
 
-       return 0;
-log_error:
-       netdev_err(dev, "failed to change MTU\n");
        return err;
 }
 
@@ -4739,9 +4736,9 @@ static void mvpp2_xlg_config(struct mvpp2_port *port, unsigned int mode,
        else
                ctrl0 &= ~MVPP22_XLG_CTRL0_RX_FLOW_CTRL_EN;
 
-       ctrl4 &= ~MVPP22_XLG_CTRL4_MACMODSELECT_GMAC;
-       ctrl4 |= MVPP22_XLG_CTRL4_FWD_FC | MVPP22_XLG_CTRL4_FWD_PFC |
-                MVPP22_XLG_CTRL4_EN_IDLE_CHECK;
+       ctrl4 &= ~(MVPP22_XLG_CTRL4_MACMODSELECT_GMAC |
+                  MVPP22_XLG_CTRL4_EN_IDLE_CHECK);
+       ctrl4 |= MVPP22_XLG_CTRL4_FWD_FC | MVPP22_XLG_CTRL4_FWD_PFC;
 
        if (old_ctrl0 != ctrl0)
                writel(ctrl0, port->base + MVPP22_XLG_CTRL0_REG);
@@ -5208,10 +5205,7 @@ static int mvpp2_port_probe(struct platform_device *pdev,
                dev->features |= NETIF_F_NTUPLE;
        }
 
-       if (port->pool_long->id == MVPP2_BM_JUMBO && port->id != 0) {
-               dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
-               dev->hw_features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
-       }
+       mvpp2_set_hw_csum(port, port->pool_long->id);
 
        dev->vlan_features |= features;
        dev->gso_max_segs = MVPP2_MAX_TSO_SEGS;
index f518312ffe695470bf1dd4239d9e2b1b08e5ea54..a01c75ede871a378ac6e32e7b939c4bdd1d112a6 100644 (file)
@@ -4924,6 +4924,13 @@ static const struct dmi_system_id msi_blacklist[] = {
                        DMI_MATCH(DMI_PRODUCT_NAME, "P5W DH Deluxe"),
                },
        },
+       {
+               .ident = "ASUS P6T",
+               .matches = {
+                       DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
+                       DMI_MATCH(DMI_BOARD_NAME, "P6T"),
+               },
+       },
        {}
 };
 
index 5bb6a26ea2672ea3ce25a8ddd6750be2ecb7733a..50862275544e52cd0610831694f8c415e1da8ed0 100644 (file)
@@ -213,7 +213,7 @@ void mlx5_unregister_device(struct mlx5_core_dev *dev)
        struct mlx5_interface *intf;
 
        mutex_lock(&mlx5_intf_mutex);
-       list_for_each_entry(intf, &intf_list, list)
+       list_for_each_entry_reverse(intf, &intf_list, list)
                mlx5_remove_device(intf, priv);
        list_del(&priv->dev_list);
        mutex_unlock(&mlx5_intf_mutex);
index 79d93d6c7d7a7fc2175d53052108a411bd3960c6..ce1be2a84231a775c1f6496b07b94ec10b684f97 100644 (file)
@@ -159,7 +159,7 @@ do {                                                            \
 enum mlx5e_rq_group {
        MLX5E_RQ_GROUP_REGULAR,
        MLX5E_RQ_GROUP_XSK,
-       MLX5E_NUM_RQ_GROUPS /* Keep last. */
+#define MLX5E_NUM_RQ_GROUPS(g) (1 + MLX5E_RQ_GROUP_##g)
 };
 
 static inline u16 mlx5_min_rx_wqes(int wq_type, u32 wq_size)
@@ -182,14 +182,6 @@ static inline int mlx5e_get_max_num_channels(struct mlx5_core_dev *mdev)
                min_t(int, mlx5_comp_vectors_count(mdev), MLX5E_MAX_NUM_CHANNELS);
 }
 
-/* Use this function to get max num channels after netdev was created */
-static inline int mlx5e_get_netdev_max_channels(struct net_device *netdev)
-{
-       return min_t(unsigned int,
-                    netdev->num_rx_queues / MLX5E_NUM_RQ_GROUPS,
-                    netdev->num_tx_queues);
-}
-
 struct mlx5e_tx_wqe {
        struct mlx5_wqe_ctrl_seg ctrl;
        struct mlx5_wqe_eth_seg  eth;
@@ -830,6 +822,7 @@ struct mlx5e_priv {
        struct net_device         *netdev;
        struct mlx5e_stats         stats;
        struct mlx5e_channel_stats channel_stats[MLX5E_MAX_NUM_CHANNELS];
+       u16                        max_nch;
        u8                         max_opened_tc;
        struct hwtstamp_config     tstamp;
        u16                        q_counter;
@@ -871,6 +864,7 @@ struct mlx5e_profile {
                mlx5e_fp_handle_rx_cqe handle_rx_cqe_mpwqe;
        } rx_handlers;
        int     max_tc;
+       u8      rq_groups;
 };
 
 void mlx5e_build_ptys2ethtool_map(void);
index bd882b5ee9a746f7a6ccca891835b167a19d1ccb..3a615d663d84ec51c2142514bdbfde897cb18f2d 100644 (file)
@@ -66,9 +66,10 @@ static inline void mlx5e_qid_get_ch_and_group(struct mlx5e_params *params,
        *group = qid / nch;
 }
 
-static inline bool mlx5e_qid_validate(struct mlx5e_params *params, u64 qid)
+static inline bool mlx5e_qid_validate(const struct mlx5e_profile *profile,
+                                     struct mlx5e_params *params, u64 qid)
 {
-       return qid < params->num_channels * MLX5E_NUM_RQ_GROUPS;
+       return qid < params->num_channels * profile->rq_groups;
 }
 
 /* Parameter calculations */
index d5e5afbdca6dcbacb776571c97eef74e033cf356..f777994f3005ea2b68b707bbadb0440ecb9c51e9 100644 (file)
@@ -78,9 +78,10 @@ static const u32 mlx5e_ext_link_speed[MLX5E_EXT_LINK_MODES_NUMBER] = {
 };
 
 static void mlx5e_port_get_speed_arr(struct mlx5_core_dev *mdev,
-                                    const u32 **arr, u32 *size)
+                                    const u32 **arr, u32 *size,
+                                    bool force_legacy)
 {
-       bool ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
+       bool ext = force_legacy ? false : MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
 
        *size = ext ? ARRAY_SIZE(mlx5e_ext_link_speed) :
                      ARRAY_SIZE(mlx5e_link_speed);
@@ -152,7 +153,8 @@ int mlx5_port_set_eth_ptys(struct mlx5_core_dev *dev, bool an_disable,
                            sizeof(out), MLX5_REG_PTYS, 0, 1);
 }
 
-u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper)
+u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper,
+                         bool force_legacy)
 {
        unsigned long temp = eth_proto_oper;
        const u32 *table;
@@ -160,7 +162,7 @@ u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper)
        u32 max_size;
        int i;
 
-       mlx5e_port_get_speed_arr(mdev, &table, &max_size);
+       mlx5e_port_get_speed_arr(mdev, &table, &max_size, force_legacy);
        i = find_first_bit(&temp, max_size);
        if (i < max_size)
                speed = table[i];
@@ -170,6 +172,7 @@ u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper)
 int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed)
 {
        struct mlx5e_port_eth_proto eproto;
+       bool force_legacy = false;
        bool ext;
        int err;
 
@@ -177,8 +180,13 @@ int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed)
        err = mlx5_port_query_eth_proto(mdev, 1, ext, &eproto);
        if (err)
                goto out;
-
-       *speed = mlx5e_port_ptys2speed(mdev, eproto.oper);
+       if (ext && !eproto.admin) {
+               force_legacy = true;
+               err = mlx5_port_query_eth_proto(mdev, 1, false, &eproto);
+               if (err)
+                       goto out;
+       }
+       *speed = mlx5e_port_ptys2speed(mdev, eproto.oper, force_legacy);
        if (!(*speed))
                err = -EINVAL;
 
@@ -201,7 +209,7 @@ int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed)
        if (err)
                return err;
 
-       mlx5e_port_get_speed_arr(mdev, &table, &max_size);
+       mlx5e_port_get_speed_arr(mdev, &table, &max_size, false);
        for (i = 0; i < max_size; ++i)
                if (eproto.cap & MLX5E_PROT_MASK(i))
                        max_speed = max(max_speed, table[i]);
@@ -210,14 +218,15 @@ int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed)
        return 0;
 }
 
-u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed)
+u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed,
+                              bool force_legacy)
 {
        u32 link_modes = 0;
        const u32 *table;
        u32 max_size;
        int i;
 
-       mlx5e_port_get_speed_arr(mdev, &table, &max_size);
+       mlx5e_port_get_speed_arr(mdev, &table, &max_size, force_legacy);
        for (i = 0; i < max_size; ++i) {
                if (table[i] == speed)
                        link_modes |= MLX5E_PROT_MASK(i);
index 70f536ec51c47523b76070a1f0971de668698b1d..4a7f4497692bc7655ce6852cc497807a935e6a59 100644 (file)
@@ -48,10 +48,12 @@ void mlx5_port_query_eth_autoneg(struct mlx5_core_dev *dev, u8 *an_status,
                                 u8 *an_disable_cap, u8 *an_disable_admin);
 int mlx5_port_set_eth_ptys(struct mlx5_core_dev *dev, bool an_disable,
                           u32 proto_admin, bool ext);
-u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper);
+u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper,
+                         bool force_legacy);
 int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed);
 int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed);
-u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed);
+u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed,
+                              bool force_legacy);
 
 int mlx5e_port_query_pbmc(struct mlx5_core_dev *mdev, void *out);
 int mlx5e_port_set_pbmc(struct mlx5_core_dev *mdev, void *in);
index ea032f54197e17a8b829d4b6b37a24573fe7237e..3766545ce2599699a59deb89d2d59de6e8335e0b 100644 (file)
@@ -412,7 +412,7 @@ struct sk_buff *mlx5e_ktls_handle_tx_skb(struct net_device *netdev,
                goto out;
 
        tls_ctx = tls_get_ctx(skb->sk);
-       if (unlikely(tls_ctx->netdev != netdev))
+       if (unlikely(WARN_ON_ONCE(tls_ctx->netdev != netdev)))
                goto err_out;
 
        priv_tx = mlx5e_get_ktls_tx_priv_ctx(tls_ctx);
index 126ec41812865d99b8d32ea0ca9c2908d68763ca..03bed714bac3f919675517b5bb759a1c7e9e2d6a 100644 (file)
@@ -391,7 +391,7 @@ void mlx5e_ethtool_get_channels(struct mlx5e_priv *priv,
 {
        mutex_lock(&priv->state_lock);
 
-       ch->max_combined   = mlx5e_get_netdev_max_channels(priv->netdev);
+       ch->max_combined   = priv->max_nch;
        ch->combined_count = priv->channels.params.num_channels;
        if (priv->xsk.refcnt) {
                /* The upper half are XSK queues. */
@@ -785,7 +785,7 @@ static void ptys2ethtool_supported_advertised_port(struct ethtool_link_ksettings
 }
 
 static void get_speed_duplex(struct net_device *netdev,
-                            u32 eth_proto_oper,
+                            u32 eth_proto_oper, bool force_legacy,
                             struct ethtool_link_ksettings *link_ksettings)
 {
        struct mlx5e_priv *priv = netdev_priv(netdev);
@@ -795,7 +795,7 @@ static void get_speed_duplex(struct net_device *netdev,
        if (!netif_carrier_ok(netdev))
                goto out;
 
-       speed = mlx5e_port_ptys2speed(priv->mdev, eth_proto_oper);
+       speed = mlx5e_port_ptys2speed(priv->mdev, eth_proto_oper, force_legacy);
        if (!speed) {
                speed = SPEED_UNKNOWN;
                goto out;
@@ -914,8 +914,8 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
        /* Fields: eth_proto_admin and ext_eth_proto_admin  are
         * mutually exclusive. Hence try reading legacy advertising
         * when extended advertising is zero.
-        * admin_ext indicates how eth_proto_admin should be
-        * interpreted
+        * admin_ext indicates which proto_admin (ext vs. legacy)
+        * should be read and interpreted
         */
        admin_ext = ext;
        if (ext && !eth_proto_admin) {
@@ -924,7 +924,7 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
                admin_ext = false;
        }
 
-       eth_proto_oper   = MLX5_GET_ETH_PROTO(ptys_reg, out, ext,
+       eth_proto_oper   = MLX5_GET_ETH_PROTO(ptys_reg, out, admin_ext,
                                              eth_proto_oper);
        eth_proto_lp        = MLX5_GET(ptys_reg, out, eth_proto_lp_advertise);
        an_disable_admin    = MLX5_GET(ptys_reg, out, an_disable_admin);
@@ -939,7 +939,8 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv,
        get_supported(mdev, eth_proto_cap, link_ksettings);
        get_advertising(eth_proto_admin, tx_pause, rx_pause, link_ksettings,
                        admin_ext);
-       get_speed_duplex(priv->netdev, eth_proto_oper, link_ksettings);
+       get_speed_duplex(priv->netdev, eth_proto_oper, !admin_ext,
+                        link_ksettings);
 
        eth_proto_oper = eth_proto_oper ? eth_proto_oper : eth_proto_cap;
 
@@ -1016,45 +1017,69 @@ static u32 mlx5e_ethtool2ptys_ext_adver_link(const unsigned long *link_modes)
        return ptys_modes;
 }
 
+static bool ext_link_mode_requested(const unsigned long *adver)
+{
+#define MLX5E_MIN_PTYS_EXT_LINK_MODE_BIT ETHTOOL_LINK_MODE_50000baseKR_Full_BIT
+       int size = __ETHTOOL_LINK_MODE_MASK_NBITS - MLX5E_MIN_PTYS_EXT_LINK_MODE_BIT;
+       __ETHTOOL_DECLARE_LINK_MODE_MASK(modes);
+
+       bitmap_set(modes, MLX5E_MIN_PTYS_EXT_LINK_MODE_BIT, size);
+       return bitmap_intersects(modes, adver, __ETHTOOL_LINK_MODE_MASK_NBITS);
+}
+
+static bool ext_speed_requested(u32 speed)
+{
+#define MLX5E_MAX_PTYS_LEGACY_SPEED 100000
+       return !!(speed > MLX5E_MAX_PTYS_LEGACY_SPEED);
+}
+
+static bool ext_requested(u8 autoneg, const unsigned long *adver, u32 speed)
+{
+       bool ext_link_mode = ext_link_mode_requested(adver);
+       bool ext_speed = ext_speed_requested(speed);
+
+       return  autoneg == AUTONEG_ENABLE ? ext_link_mode : ext_speed;
+}
+
 int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv,
                                     const struct ethtool_link_ksettings *link_ksettings)
 {
        struct mlx5_core_dev *mdev = priv->mdev;
        struct mlx5e_port_eth_proto eproto;
+       const unsigned long *adver;
        bool an_changes = false;
        u8 an_disable_admin;
        bool ext_supported;
-       bool ext_requested;
        u8 an_disable_cap;
        bool an_disable;
        u32 link_modes;
        u8 an_status;
+       u8 autoneg;
        u32 speed;
+       bool ext;
        int err;
 
        u32 (*ethtool2ptys_adver_func)(const unsigned long *adver);
 
-#define MLX5E_PTYS_EXT ((1ULL << ETHTOOL_LINK_MODE_50000baseKR_Full_BIT) - 1)
+       adver = link_ksettings->link_modes.advertising;
+       autoneg = link_ksettings->base.autoneg;
+       speed = link_ksettings->base.speed;
 
-       ext_requested = !!(link_ksettings->link_modes.advertising[0] >
-                       MLX5E_PTYS_EXT ||
-                       link_ksettings->link_modes.advertising[1]);
+       ext = ext_requested(autoneg, adver, speed),
        ext_supported = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet);
-       ext_requested &= ext_supported;
+       if (!ext_supported && ext)
+               return -EOPNOTSUPP;
 
-       speed = link_ksettings->base.speed;
-       ethtool2ptys_adver_func = ext_requested ?
-                                 mlx5e_ethtool2ptys_ext_adver_link :
+       ethtool2ptys_adver_func = ext ? mlx5e_ethtool2ptys_ext_adver_link :
                                  mlx5e_ethtool2ptys_adver_link;
-       err = mlx5_port_query_eth_proto(mdev, 1, ext_requested, &eproto);
+       err = mlx5_port_query_eth_proto(mdev, 1, ext, &eproto);
        if (err) {
                netdev_err(priv->netdev, "%s: query port eth proto failed: %d\n",
                           __func__, err);
                goto out;
        }
-       link_modes = link_ksettings->base.autoneg == AUTONEG_ENABLE ?
-               ethtool2ptys_adver_func(link_ksettings->link_modes.advertising) :
-               mlx5e_port_speed2linkmodes(mdev, speed);
+       link_modes = autoneg == AUTONEG_ENABLE ? ethtool2ptys_adver_func(adver) :
+               mlx5e_port_speed2linkmodes(mdev, speed, !ext);
 
        link_modes = link_modes & eproto.cap;
        if (!link_modes) {
@@ -1067,14 +1092,14 @@ int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv,
        mlx5_port_query_eth_autoneg(mdev, &an_status, &an_disable_cap,
                                    &an_disable_admin);
 
-       an_disable = link_ksettings->base.autoneg == AUTONEG_DISABLE;
+       an_disable = autoneg == AUTONEG_DISABLE;
        an_changes = ((!an_disable && an_disable_admin) ||
                      (an_disable && !an_disable_admin));
 
        if (!an_changes && link_modes == eproto.admin)
                goto out;
 
-       mlx5_port_set_eth_ptys(mdev, an_disable, link_modes, ext_requested);
+       mlx5_port_set_eth_ptys(mdev, an_disable, link_modes, ext);
        mlx5_toggle_port_link(mdev);
 
 out:
index ea3a490b569a58c46b49196b3637bec4923b7843..94304abc49e98102c50a6a1fcb63ca468335af96 100644 (file)
@@ -611,7 +611,8 @@ static int validate_flow(struct mlx5e_priv *priv,
                return -ENOSPC;
 
        if (fs->ring_cookie != RX_CLS_FLOW_DISC)
-               if (!mlx5e_qid_validate(&priv->channels.params, fs->ring_cookie))
+               if (!mlx5e_qid_validate(priv->profile, &priv->channels.params,
+                                       fs->ring_cookie))
                        return -EINVAL;
 
        switch (fs->flow_type & ~(FLOW_EXT | FLOW_MAC_EXT)) {
index 47eea6b3a1c385dc97339f671a1d56b49dc3c92b..570c42b7eeeaa73ffbae0f595b0cca2d9557f04c 100644 (file)
@@ -1677,10 +1677,10 @@ static int mlx5e_open_sqs(struct mlx5e_channel *c,
                          struct mlx5e_channel_param *cparam)
 {
        struct mlx5e_priv *priv = c->priv;
-       int err, tc, max_nch = mlx5e_get_netdev_max_channels(priv->netdev);
+       int err, tc;
 
        for (tc = 0; tc < params->num_tc; tc++) {
-               int txq_ix = c->ix + tc * max_nch;
+               int txq_ix = c->ix + tc * priv->max_nch;
 
                err = mlx5e_open_txqsq(c, c->priv->tisn[tc], txq_ix,
                                       params, &cparam->sq, &c->sq[tc], tc);
@@ -2438,11 +2438,10 @@ int mlx5e_create_indirect_rqt(struct mlx5e_priv *priv)
 
 int mlx5e_create_direct_rqts(struct mlx5e_priv *priv, struct mlx5e_tir *tirs)
 {
-       const int max_nch = mlx5e_get_netdev_max_channels(priv->netdev);
        int err;
        int ix;
 
-       for (ix = 0; ix < max_nch; ix++) {
+       for (ix = 0; ix < priv->max_nch; ix++) {
                err = mlx5e_create_rqt(priv, 1 /*size */, &tirs[ix].rqt);
                if (unlikely(err))
                        goto err_destroy_rqts;
@@ -2460,10 +2459,9 @@ err_destroy_rqts:
 
 void mlx5e_destroy_direct_rqts(struct mlx5e_priv *priv, struct mlx5e_tir *tirs)
 {
-       const int max_nch = mlx5e_get_netdev_max_channels(priv->netdev);
        int i;
 
-       for (i = 0; i < max_nch; i++)
+       for (i = 0; i < priv->max_nch; i++)
                mlx5e_destroy_rqt(priv, &tirs[i].rqt);
 }
 
@@ -2557,7 +2555,7 @@ static void mlx5e_redirect_rqts(struct mlx5e_priv *priv,
                mlx5e_redirect_rqt(priv, rqtn, MLX5E_INDIR_RQT_SIZE, rrp);
        }
 
-       for (ix = 0; ix < mlx5e_get_netdev_max_channels(priv->netdev); ix++) {
+       for (ix = 0; ix < priv->max_nch; ix++) {
                struct mlx5e_redirect_rqt_param direct_rrp = {
                        .is_rss = false,
                        {
@@ -2758,7 +2756,7 @@ static int mlx5e_modify_tirs_lro(struct mlx5e_priv *priv)
                        goto free_in;
        }
 
-       for (ix = 0; ix < mlx5e_get_netdev_max_channels(priv->netdev); ix++) {
+       for (ix = 0; ix < priv->max_nch; ix++) {
                err = mlx5_core_modify_tir(mdev, priv->direct_tir[ix].tirn,
                                           in, inlen);
                if (err)
@@ -2858,12 +2856,11 @@ static void mlx5e_netdev_set_tcs(struct net_device *netdev)
 
 static void mlx5e_build_tc2txq_maps(struct mlx5e_priv *priv)
 {
-       int max_nch = mlx5e_get_netdev_max_channels(priv->netdev);
        int i, tc;
 
-       for (i = 0; i < max_nch; i++)
+       for (i = 0; i < priv->max_nch; i++)
                for (tc = 0; tc < priv->profile->max_tc; tc++)
-                       priv->channel_tc2txq[i][tc] = i + tc * max_nch;
+                       priv->channel_tc2txq[i][tc] = i + tc * priv->max_nch;
 }
 
 static void mlx5e_build_tx2sq_maps(struct mlx5e_priv *priv)
@@ -2884,7 +2881,7 @@ static void mlx5e_build_tx2sq_maps(struct mlx5e_priv *priv)
 void mlx5e_activate_priv_channels(struct mlx5e_priv *priv)
 {
        int num_txqs = priv->channels.num * priv->channels.params.num_tc;
-       int num_rxqs = priv->channels.num * MLX5E_NUM_RQ_GROUPS;
+       int num_rxqs = priv->channels.num * priv->profile->rq_groups;
        struct net_device *netdev = priv->netdev;
 
        mlx5e_netdev_set_tcs(netdev);
@@ -3306,7 +3303,6 @@ err_destroy_inner_tirs:
 
 int mlx5e_create_direct_tirs(struct mlx5e_priv *priv, struct mlx5e_tir *tirs)
 {
-       const int max_nch = mlx5e_get_netdev_max_channels(priv->netdev);
        struct mlx5e_tir *tir;
        void *tirc;
        int inlen;
@@ -3319,7 +3315,7 @@ int mlx5e_create_direct_tirs(struct mlx5e_priv *priv, struct mlx5e_tir *tirs)
        if (!in)
                return -ENOMEM;
 
-       for (ix = 0; ix < max_nch; ix++) {
+       for (ix = 0; ix < priv->max_nch; ix++) {
                memset(in, 0, inlen);
                tir = &tirs[ix];
                tirc = MLX5_ADDR_OF(create_tir_in, in, ctx);
@@ -3358,10 +3354,9 @@ void mlx5e_destroy_indirect_tirs(struct mlx5e_priv *priv, bool inner_ttc)
 
 void mlx5e_destroy_direct_tirs(struct mlx5e_priv *priv, struct mlx5e_tir *tirs)
 {
-       const int max_nch = mlx5e_get_netdev_max_channels(priv->netdev);
        int i;
 
-       for (i = 0; i < max_nch; i++)
+       for (i = 0; i < priv->max_nch; i++)
                mlx5e_destroy_tir(priv->mdev, &tirs[i]);
 }
 
@@ -3487,7 +3482,7 @@ void mlx5e_fold_sw_stats64(struct mlx5e_priv *priv, struct rtnl_link_stats64 *s)
 {
        int i;
 
-       for (i = 0; i < mlx5e_get_netdev_max_channels(priv->netdev); i++) {
+       for (i = 0; i < priv->max_nch; i++) {
                struct mlx5e_channel_stats *channel_stats = &priv->channel_stats[i];
                struct mlx5e_rq_stats *xskrq_stats = &channel_stats->xskrq;
                struct mlx5e_rq_stats *rq_stats = &channel_stats->rq;
@@ -4960,8 +4955,7 @@ static int mlx5e_nic_init(struct mlx5_core_dev *mdev,
                return err;
 
        mlx5e_build_nic_params(mdev, &priv->xsk, rss, &priv->channels.params,
-                              mlx5e_get_netdev_max_channels(netdev),
-                              netdev->mtu);
+                              priv->max_nch, netdev->mtu);
 
        mlx5e_timestamp_init(priv);
 
@@ -5164,6 +5158,7 @@ static const struct mlx5e_profile mlx5e_nic_profile = {
        .rx_handlers.handle_rx_cqe       = mlx5e_handle_rx_cqe,
        .rx_handlers.handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq,
        .max_tc            = MLX5E_MAX_NUM_TC,
+       .rq_groups         = MLX5E_NUM_RQ_GROUPS(XSK),
 };
 
 /* mlx5e generic netdev management API (move to en_common.c) */
@@ -5181,6 +5176,7 @@ int mlx5e_netdev_init(struct net_device *netdev,
        priv->profile     = profile;
        priv->ppriv       = ppriv;
        priv->msglevel    = MLX5E_MSG_LEVEL;
+       priv->max_nch     = netdev->num_rx_queues / max_t(u8, profile->rq_groups, 1);
        priv->max_opened_tc = 1;
 
        mutex_init(&priv->state_lock);
@@ -5218,7 +5214,7 @@ struct net_device *mlx5e_create_netdev(struct mlx5_core_dev *mdev,
 
        netdev = alloc_etherdev_mqs(sizeof(struct mlx5e_priv),
                                    nch * profile->max_tc,
-                                   nch * MLX5E_NUM_RQ_GROUPS);
+                                   nch * profile->rq_groups);
        if (!netdev) {
                mlx5_core_err(mdev, "alloc_etherdev_mqs() failed\n");
                return NULL;
index 7f747cb1a4f4b6ba072cd75596cf042ae7380da7..d0684fdb69e1424cee0e17d147755d20fa938e85 100644 (file)
@@ -1701,6 +1701,7 @@ static const struct mlx5e_profile mlx5e_rep_profile = {
        .rx_handlers.handle_rx_cqe       = mlx5e_handle_rx_cqe_rep,
        .rx_handlers.handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq,
        .max_tc                 = 1,
+       .rq_groups              = MLX5E_NUM_RQ_GROUPS(REGULAR),
 };
 
 static const struct mlx5e_profile mlx5e_uplink_rep_profile = {
@@ -1718,6 +1719,7 @@ static const struct mlx5e_profile mlx5e_uplink_rep_profile = {
        .rx_handlers.handle_rx_cqe       = mlx5e_handle_rx_cqe_rep,
        .rx_handlers.handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq,
        .max_tc                 = MLX5E_MAX_NUM_TC,
+       .rq_groups              = MLX5E_NUM_RQ_GROUPS(REGULAR),
 };
 
 static bool
index 539b4d3656da1e3af54a2977024d4a0346c584f2..57f9f346d213b0ba9be9449c2947c06442d6c6c5 100644 (file)
@@ -172,7 +172,7 @@ static void mlx5e_grp_sw_update_stats(struct mlx5e_priv *priv)
 
        memset(s, 0, sizeof(*s));
 
-       for (i = 0; i < mlx5e_get_netdev_max_channels(priv->netdev); i++) {
+       for (i = 0; i < priv->max_nch; i++) {
                struct mlx5e_channel_stats *channel_stats =
                        &priv->channel_stats[i];
                struct mlx5e_xdpsq_stats *xdpsq_red_stats = &channel_stats->xdpsq;
@@ -1395,7 +1395,7 @@ static const struct counter_desc ch_stats_desc[] = {
 
 static int mlx5e_grp_channels_get_num_stats(struct mlx5e_priv *priv)
 {
-       int max_nch = mlx5e_get_netdev_max_channels(priv->netdev);
+       int max_nch = priv->max_nch;
 
        return (NUM_RQ_STATS * max_nch) +
               (NUM_CH_STATS * max_nch) +
@@ -1409,8 +1409,8 @@ static int mlx5e_grp_channels_get_num_stats(struct mlx5e_priv *priv)
 static int mlx5e_grp_channels_fill_strings(struct mlx5e_priv *priv, u8 *data,
                                           int idx)
 {
-       int max_nch = mlx5e_get_netdev_max_channels(priv->netdev);
        bool is_xsk = priv->xsk.ever_used;
+       int max_nch = priv->max_nch;
        int i, j, tc;
 
        for (i = 0; i < max_nch; i++)
@@ -1452,8 +1452,8 @@ static int mlx5e_grp_channels_fill_strings(struct mlx5e_priv *priv, u8 *data,
 static int mlx5e_grp_channels_fill_stats(struct mlx5e_priv *priv, u64 *data,
                                         int idx)
 {
-       int max_nch = mlx5e_get_netdev_max_channels(priv->netdev);
        bool is_xsk = priv->xsk.ever_used;
+       int max_nch = priv->max_nch;
        int i, j, tc;
 
        for (i = 0; i < max_nch; i++)
index cc096f6011d964051405dd5fa3514b428086cc5a..7ecfc53cf5f6503df89dfc1983ed0b2290470247 100644 (file)
@@ -1230,13 +1230,13 @@ static struct mlx5_fc *mlx5e_tc_get_counter(struct mlx5e_tc_flow *flow)
 void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe)
 {
        struct mlx5e_neigh *m_neigh = &nhe->m_neigh;
-       u64 bytes, packets, lastuse = 0;
        struct mlx5e_tc_flow *flow;
        struct mlx5e_encap_entry *e;
        struct mlx5_fc *counter;
        struct neigh_table *tbl;
        bool neigh_used = false;
        struct neighbour *n;
+       u64 lastuse;
 
        if (m_neigh->family == AF_INET)
                tbl = &arp_tbl;
@@ -1256,7 +1256,7 @@ void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe)
                                            encaps[efi->index]);
                        if (flow->flags & MLX5E_TC_FLOW_OFFLOADED) {
                                counter = mlx5e_tc_get_counter(flow);
-                               mlx5_fc_query_cached(counter, &bytes, &packets, &lastuse);
+                               lastuse = mlx5_fc_query_lastuse(counter);
                                if (time_after((unsigned long)lastuse, nhe->reported_lastuse)) {
                                        neigh_used = true;
                                        break;
index c50b6f0769c8c5086946fb8618ca42fdc4f2079c..49b06b256c92955d8b0054ade614b2d33ee41c1e 100644 (file)
@@ -49,7 +49,7 @@ static inline bool mlx5e_channel_no_affinity_change(struct mlx5e_channel *c)
 static void mlx5e_handle_tx_dim(struct mlx5e_txqsq *sq)
 {
        struct mlx5e_sq_stats *stats = sq->stats;
-       struct dim_sample dim_sample;
+       struct dim_sample dim_sample = {};
 
        if (unlikely(!test_bit(MLX5E_SQ_STATE_AM, &sq->state)))
                return;
@@ -61,7 +61,7 @@ static void mlx5e_handle_tx_dim(struct mlx5e_txqsq *sq)
 static void mlx5e_handle_rx_dim(struct mlx5e_rq *rq)
 {
        struct mlx5e_rq_stats *stats = rq->stats;
-       struct dim_sample dim_sample;
+       struct dim_sample dim_sample = {};
 
        if (unlikely(!test_bit(MLX5E_RQ_STATE_AM, &rq->state)))
                return;
index c48c382f926f33b5747c5f5603c18713a03e6bd0..c1252d6be0ef13f38fbe573e724b0a814f319230 100644 (file)
@@ -68,7 +68,7 @@ enum fs_flow_table_type {
        FS_FT_SNIFFER_RX        = 0X5,
        FS_FT_SNIFFER_TX        = 0X6,
        FS_FT_RDMA_RX           = 0X7,
-       FS_FT_MAX_TYPE = FS_FT_SNIFFER_TX,
+       FS_FT_MAX_TYPE = FS_FT_RDMA_RX,
 };
 
 enum fs_flow_table_op_mod {
@@ -275,7 +275,8 @@ void mlx5_cleanup_fs(struct mlx5_core_dev *dev);
        (type == FS_FT_FDB) ? MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, cap) :           \
        (type == FS_FT_SNIFFER_RX) ? MLX5_CAP_FLOWTABLE_SNIFFER_RX(mdev, cap) :         \
        (type == FS_FT_SNIFFER_TX) ? MLX5_CAP_FLOWTABLE_SNIFFER_TX(mdev, cap) :         \
-       (BUILD_BUG_ON_ZERO(FS_FT_SNIFFER_TX != FS_FT_MAX_TYPE))\
+       (type == FS_FT_RDMA_RX) ? MLX5_CAP_FLOWTABLE_RDMA_RX(mdev, cap) :               \
+       (BUILD_BUG_ON_ZERO(FS_FT_RDMA_RX != FS_FT_MAX_TYPE))\
        )
 
 #endif
index b3762123a69c2188f1745965aaeeb80ca8d80bf6..1834d9f3aa1c019ee9057b141bfe86068ac757c2 100644 (file)
@@ -369,6 +369,11 @@ int mlx5_fc_query(struct mlx5_core_dev *dev, struct mlx5_fc *counter,
 }
 EXPORT_SYMBOL(mlx5_fc_query);
 
+u64 mlx5_fc_query_lastuse(struct mlx5_fc *counter)
+{
+       return counter->cache.lastuse;
+}
+
 void mlx5_fc_query_cached(struct mlx5_fc *counter,
                          u64 *bytes, u64 *packets, u64 *lastuse)
 {
index 6bfaaab362dc48dac5f5e76d91eb41578585b2fb..1a2560e3bf7c54d85390b1f8a93600ad5a84ead9 100644 (file)
@@ -88,8 +88,7 @@ int mlx5i_init(struct mlx5_core_dev *mdev,
        netdev->mtu = netdev->max_mtu;
 
        mlx5e_build_nic_params(mdev, NULL, &priv->rss_params, &priv->channels.params,
-                              mlx5e_get_netdev_max_channels(netdev),
-                              netdev->mtu);
+                              priv->max_nch, netdev->mtu);
        mlx5i_build_nic_params(mdev, &priv->channels.params);
 
        mlx5e_timestamp_init(priv);
@@ -118,11 +117,10 @@ void mlx5i_cleanup(struct mlx5e_priv *priv)
 
 static void mlx5i_grp_sw_update_stats(struct mlx5e_priv *priv)
 {
-       int max_nch = mlx5e_get_netdev_max_channels(priv->netdev);
        struct mlx5e_sw_stats s = { 0 };
        int i, j;
 
-       for (i = 0; i < max_nch; i++) {
+       for (i = 0; i < priv->max_nch; i++) {
                struct mlx5e_channel_stats *channel_stats;
                struct mlx5e_rq_stats *rq_stats;
 
@@ -436,6 +434,7 @@ static const struct mlx5e_profile mlx5i_nic_profile = {
        .rx_handlers.handle_rx_cqe       = mlx5i_handle_rx_cqe,
        .rx_handlers.handle_rx_cqe_mpwqe = NULL, /* Not supported */
        .max_tc            = MLX5I_MAX_NUM_TC,
+       .rq_groups         = MLX5E_NUM_RQ_GROUPS(REGULAR),
 };
 
 /* mlx5i netdev NDos */
index 6e56fa769d2eb97b593b2c3da4c5aa5c40c1afdc..c5a491e22e55547def2706fa6b28c8c08fa858d1 100644 (file)
@@ -355,6 +355,7 @@ static const struct mlx5e_profile mlx5i_pkey_nic_profile = {
        .rx_handlers.handle_rx_cqe       = mlx5i_handle_rx_cqe,
        .rx_handlers.handle_rx_cqe_mpwqe = NULL, /* Not supported */
        .max_tc            = MLX5I_MAX_NUM_TC,
+       .rq_groups         = MLX5E_NUM_RQ_GROUPS(REGULAR),
 };
 
 const struct mlx5e_profile *mlx5i_pkey_get_profile(void)
index 650638152bbc5d6bd5d06949c6920f175fb4f9ee..eda9c23e87b28fcca50b8935e006fb9c94e990c3 100644 (file)
@@ -6330,7 +6330,7 @@ static int __init mlxsw_sp_module_init(void)
        return 0;
 
 err_sp2_pci_driver_register:
-       mlxsw_pci_driver_unregister(&mlxsw_sp2_pci_driver);
+       mlxsw_pci_driver_unregister(&mlxsw_sp1_pci_driver);
 err_sp1_pci_driver_register:
        mlxsw_core_driver_unregister(&mlxsw_sp2_driver);
 err_sp2_core_driver_register:
index 131f62ce9297a05e0ba5406995beb1a16c14bdfa..6664119fb0c8cfc39ffd24c8963657de2e47c98b 100644 (file)
@@ -951,4 +951,8 @@ void mlxsw_sp_port_nve_fini(struct mlxsw_sp_port *mlxsw_sp_port);
 int mlxsw_sp_nve_init(struct mlxsw_sp *mlxsw_sp);
 void mlxsw_sp_nve_fini(struct mlxsw_sp *mlxsw_sp);
 
+/* spectrum_nve_vxlan.c */
+int mlxsw_sp_nve_inc_parsing_depth_get(struct mlxsw_sp *mlxsw_sp);
+void mlxsw_sp_nve_inc_parsing_depth_put(struct mlxsw_sp *mlxsw_sp);
+
 #endif
index 1537f70bc26d0fbef771b91e4c92f6d9dae1ac4f..888ba4300bcc3b5d1888e7d3c87b28d51200e7f7 100644 (file)
@@ -437,8 +437,8 @@ static const struct mlxsw_sp_sb_pr mlxsw_sp1_sb_prs[] = {
                           MLXSW_SP1_SB_PR_CPU_SIZE, true, false),
 };
 
-#define MLXSW_SP2_SB_PR_INGRESS_SIZE   38128752
-#define MLXSW_SP2_SB_PR_EGRESS_SIZE    38128752
+#define MLXSW_SP2_SB_PR_INGRESS_SIZE   35297568
+#define MLXSW_SP2_SB_PR_EGRESS_SIZE    35297568
 #define MLXSW_SP2_SB_PR_CPU_SIZE       (256 * 1000)
 
 /* Order according to mlxsw_sp2_sb_pool_dess */
index 1df164a4b06d3516b45dd034b8dbd71cb7988ab1..17f334b46c4056c6689d41d8288d3812a263a406 100644 (file)
@@ -775,6 +775,7 @@ static void mlxsw_sp_nve_tunnel_fini(struct mlxsw_sp *mlxsw_sp)
                ops->fini(nve);
                mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, 1,
                                   nve->tunnel_index);
+               memset(&nve->config, 0, sizeof(nve->config));
        }
        nve->num_nve_tunnels--;
 }
index 0035640156a16ebbee0391f8c105b4bbd455dfb0..12f664f42f2108abfc85b381959905713d8971cf 100644 (file)
@@ -29,6 +29,7 @@ struct mlxsw_sp_nve {
        unsigned int num_max_mc_entries[MLXSW_SP_L3_PROTO_MAX];
        u32 tunnel_index;
        u16 ul_rif_index;       /* Reserved for Spectrum */
+       unsigned int inc_parsing_depth_refs;
 };
 
 struct mlxsw_sp_nve_ops {
index 93ccd9fc22662d78ea91f12de0d9a2ea01ab4d30..05517c7feaa563fe0b8d1a365ce26980ea93b4a4 100644 (file)
@@ -103,9 +103,9 @@ static void mlxsw_sp_nve_vxlan_config(const struct mlxsw_sp_nve *nve,
        config->udp_dport = cfg->dst_port;
 }
 
-static int mlxsw_sp_nve_parsing_set(struct mlxsw_sp *mlxsw_sp,
-                                   unsigned int parsing_depth,
-                                   __be16 udp_dport)
+static int __mlxsw_sp_nve_parsing_set(struct mlxsw_sp *mlxsw_sp,
+                                     unsigned int parsing_depth,
+                                     __be16 udp_dport)
 {
        char mprs_pl[MLXSW_REG_MPRS_LEN];
 
@@ -113,6 +113,56 @@ static int mlxsw_sp_nve_parsing_set(struct mlxsw_sp *mlxsw_sp,
        return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(mprs), mprs_pl);
 }
 
+static int mlxsw_sp_nve_parsing_set(struct mlxsw_sp *mlxsw_sp,
+                                   __be16 udp_dport)
+{
+       int parsing_depth = mlxsw_sp->nve->inc_parsing_depth_refs ?
+                               MLXSW_SP_NVE_VXLAN_PARSING_DEPTH :
+                               MLXSW_SP_NVE_DEFAULT_PARSING_DEPTH;
+
+       return __mlxsw_sp_nve_parsing_set(mlxsw_sp, parsing_depth, udp_dport);
+}
+
+static int
+__mlxsw_sp_nve_inc_parsing_depth_get(struct mlxsw_sp *mlxsw_sp,
+                                    __be16 udp_dport)
+{
+       int err;
+
+       mlxsw_sp->nve->inc_parsing_depth_refs++;
+
+       err = mlxsw_sp_nve_parsing_set(mlxsw_sp, udp_dport);
+       if (err)
+               goto err_nve_parsing_set;
+       return 0;
+
+err_nve_parsing_set:
+       mlxsw_sp->nve->inc_parsing_depth_refs--;
+       return err;
+}
+
+static void
+__mlxsw_sp_nve_inc_parsing_depth_put(struct mlxsw_sp *mlxsw_sp,
+                                    __be16 udp_dport)
+{
+       mlxsw_sp->nve->inc_parsing_depth_refs--;
+       mlxsw_sp_nve_parsing_set(mlxsw_sp, udp_dport);
+}
+
+int mlxsw_sp_nve_inc_parsing_depth_get(struct mlxsw_sp *mlxsw_sp)
+{
+       __be16 udp_dport = mlxsw_sp->nve->config.udp_dport;
+
+       return __mlxsw_sp_nve_inc_parsing_depth_get(mlxsw_sp, udp_dport);
+}
+
+void mlxsw_sp_nve_inc_parsing_depth_put(struct mlxsw_sp *mlxsw_sp)
+{
+       __be16 udp_dport = mlxsw_sp->nve->config.udp_dport;
+
+       __mlxsw_sp_nve_inc_parsing_depth_put(mlxsw_sp, udp_dport);
+}
+
 static void
 mlxsw_sp_nve_vxlan_config_prepare(char *tngcr_pl,
                                  const struct mlxsw_sp_nve_config *config)
@@ -176,9 +226,7 @@ static int mlxsw_sp1_nve_vxlan_init(struct mlxsw_sp_nve *nve,
        struct mlxsw_sp *mlxsw_sp = nve->mlxsw_sp;
        int err;
 
-       err = mlxsw_sp_nve_parsing_set(mlxsw_sp,
-                                      MLXSW_SP_NVE_VXLAN_PARSING_DEPTH,
-                                      config->udp_dport);
+       err = __mlxsw_sp_nve_inc_parsing_depth_get(mlxsw_sp, config->udp_dport);
        if (err)
                return err;
 
@@ -203,8 +251,7 @@ err_promote_decap:
 err_rtdp_set:
        mlxsw_sp1_nve_vxlan_config_clear(mlxsw_sp);
 err_config_set:
-       mlxsw_sp_nve_parsing_set(mlxsw_sp, MLXSW_SP_NVE_DEFAULT_PARSING_DEPTH,
-                                config->udp_dport);
+       __mlxsw_sp_nve_inc_parsing_depth_put(mlxsw_sp, 0);
        return err;
 }
 
@@ -216,8 +263,7 @@ static void mlxsw_sp1_nve_vxlan_fini(struct mlxsw_sp_nve *nve)
        mlxsw_sp_router_nve_demote_decap(mlxsw_sp, config->ul_tb_id,
                                         config->ul_proto, &config->ul_sip);
        mlxsw_sp1_nve_vxlan_config_clear(mlxsw_sp);
-       mlxsw_sp_nve_parsing_set(mlxsw_sp, MLXSW_SP_NVE_DEFAULT_PARSING_DEPTH,
-                                config->udp_dport);
+       __mlxsw_sp_nve_inc_parsing_depth_put(mlxsw_sp, 0);
 }
 
 static int
@@ -320,9 +366,7 @@ static int mlxsw_sp2_nve_vxlan_init(struct mlxsw_sp_nve *nve,
        struct mlxsw_sp *mlxsw_sp = nve->mlxsw_sp;
        int err;
 
-       err = mlxsw_sp_nve_parsing_set(mlxsw_sp,
-                                      MLXSW_SP_NVE_VXLAN_PARSING_DEPTH,
-                                      config->udp_dport);
+       err = __mlxsw_sp_nve_inc_parsing_depth_get(mlxsw_sp, config->udp_dport);
        if (err)
                return err;
 
@@ -348,8 +392,7 @@ err_promote_decap:
 err_rtdp_set:
        mlxsw_sp2_nve_vxlan_config_clear(mlxsw_sp);
 err_config_set:
-       mlxsw_sp_nve_parsing_set(mlxsw_sp, MLXSW_SP_NVE_DEFAULT_PARSING_DEPTH,
-                                config->udp_dport);
+       __mlxsw_sp_nve_inc_parsing_depth_put(mlxsw_sp, 0);
        return err;
 }
 
@@ -361,8 +404,7 @@ static void mlxsw_sp2_nve_vxlan_fini(struct mlxsw_sp_nve *nve)
        mlxsw_sp_router_nve_demote_decap(mlxsw_sp, config->ul_tb_id,
                                         config->ul_proto, &config->ul_sip);
        mlxsw_sp2_nve_vxlan_config_clear(mlxsw_sp);
-       mlxsw_sp_nve_parsing_set(mlxsw_sp, MLXSW_SP_NVE_DEFAULT_PARSING_DEPTH,
-                                config->udp_dport);
+       __mlxsw_sp_nve_inc_parsing_depth_put(mlxsw_sp, 0);
 }
 
 const struct mlxsw_sp_nve_ops mlxsw_sp2_nve_vxlan_ops = {
index bd9c2bc2d5d6e0569935ad77aedf56f1db198594..63b07edd9d8161304793e7321b5c3ea726416a1e 100644 (file)
@@ -979,6 +979,9 @@ static int mlxsw_sp1_ptp_mtpppc_update(struct mlxsw_sp_port *mlxsw_sp_port,
 {
        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
        struct mlxsw_sp_port *tmp;
+       u16 orig_ing_types = 0;
+       u16 orig_egr_types = 0;
+       int err;
        int i;
 
        /* MTPPPC configures timestamping globally, not per port. Find the
@@ -986,12 +989,26 @@ static int mlxsw_sp1_ptp_mtpppc_update(struct mlxsw_sp_port *mlxsw_sp_port,
         */
        for (i = 1; i < mlxsw_core_max_ports(mlxsw_sp->core); i++) {
                tmp = mlxsw_sp->ports[i];
+               if (tmp) {
+                       orig_ing_types |= tmp->ptp.ing_types;
+                       orig_egr_types |= tmp->ptp.egr_types;
+               }
                if (tmp && tmp != mlxsw_sp_port) {
                        ing_types |= tmp->ptp.ing_types;
                        egr_types |= tmp->ptp.egr_types;
                }
        }
 
+       if ((ing_types || egr_types) && !(orig_ing_types || orig_egr_types)) {
+               err = mlxsw_sp_nve_inc_parsing_depth_get(mlxsw_sp);
+               if (err) {
+                       netdev_err(mlxsw_sp_port->dev, "Failed to increase parsing depth");
+                       return err;
+               }
+       }
+       if (!(ing_types || egr_types) && (orig_ing_types || orig_egr_types))
+               mlxsw_sp_nve_inc_parsing_depth_put(mlxsw_sp);
+
        return mlxsw_sp1_ptp_mtpppc_set(mlxsw_sp_port->mlxsw_sp,
                                       ing_types, egr_types);
 }
index b71e4ecbe469a5ec19699ed740ab0a9e63abdd45..6932e615d4b089c68b4d847649bd3adb0f70d543 100644 (file)
@@ -1818,6 +1818,7 @@ EXPORT_SYMBOL(ocelot_init);
 
 void ocelot_deinit(struct ocelot *ocelot)
 {
+       cancel_delayed_work(&ocelot->stats_work);
        destroy_workqueue(ocelot->stats_queue);
        mutex_destroy(&ocelot->stats_lock);
        ocelot_ace_deinit();
index d9cbe84ac6ade4105af2e9c93a2f847f944cf8f6..1b840ee4733969a4b61e74e98bf2bfcd3ad2aecb 100644 (file)
@@ -444,12 +444,12 @@ static u8 *nfp_vnic_get_sw_stats_strings(struct net_device *netdev, u8 *data)
        data = nfp_pr_et(data, "hw_rx_csum_complete");
        data = nfp_pr_et(data, "hw_rx_csum_err");
        data = nfp_pr_et(data, "rx_replace_buf_alloc_fail");
-       data = nfp_pr_et(data, "rx_tls_decrypted");
+       data = nfp_pr_et(data, "rx_tls_decrypted_packets");
        data = nfp_pr_et(data, "hw_tx_csum");
        data = nfp_pr_et(data, "hw_tx_inner_csum");
        data = nfp_pr_et(data, "tx_gather");
        data = nfp_pr_et(data, "tx_lso");
-       data = nfp_pr_et(data, "tx_tls_encrypted");
+       data = nfp_pr_et(data, "tx_tls_encrypted_packets");
        data = nfp_pr_et(data, "tx_tls_ooo");
        data = nfp_pr_et(data, "tx_tls_drop_no_sync_data");
 
index f900fde448dba7f993842704db60f9cff19f263a..158ac07389118278766ae3c9836a13d8f5307981 100644 (file)
@@ -442,7 +442,7 @@ static void qed_rdma_init_devinfo(struct qed_hwfn *p_hwfn,
        /* Vendor specific information */
        dev->vendor_id = cdev->vendor_id;
        dev->vendor_part_id = cdev->device_id;
-       dev->hw_ver = 0;
+       dev->hw_ver = cdev->chip_rev;
        dev->fw_ver = (FW_MAJOR_VERSION << 24) | (FW_MINOR_VERSION << 16) |
                      (FW_REVISION_VERSION << 8) | (FW_ENGINEERING_VERSION);
 
@@ -530,9 +530,8 @@ static void qed_rdma_init_devinfo(struct qed_hwfn *p_hwfn,
        SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_LOCAL_INV_FENCE, 1);
 
        /* Check atomic operations support in PCI configuration space. */
-       pci_read_config_dword(cdev->pdev,
-                             cdev->pdev->pcie_cap + PCI_EXP_DEVCTL2,
-                             &pci_status_control);
+       pcie_capability_read_dword(cdev->pdev, PCI_EXP_DEVCTL2,
+                                  &pci_status_control);
 
        if (pci_status_control & PCI_EXP_DEVCTL2_LTR_EN)
                SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_ATOMIC_OP, 1);
index 60189923737a79f0735ffec15b96c3c110b579d6..21d38167f96180718fdcda68ed2433d73271b1bf 100644 (file)
@@ -206,9 +206,9 @@ rmnet_map_ipv4_ul_csum_header(void *iphdr,
        ul_header->csum_insert_offset = skb->csum_offset;
        ul_header->csum_enabled = 1;
        if (ip4h->protocol == IPPROTO_UDP)
-               ul_header->udp_ip4_ind = 1;
+               ul_header->udp_ind = 1;
        else
-               ul_header->udp_ip4_ind = 0;
+               ul_header->udp_ind = 0;
 
        /* Changing remaining fields to network order */
        hdr++;
@@ -239,6 +239,7 @@ rmnet_map_ipv6_ul_csum_header(void *ip6hdr,
                              struct rmnet_map_ul_csum_header *ul_header,
                              struct sk_buff *skb)
 {
+       struct ipv6hdr *ip6h = (struct ipv6hdr *)ip6hdr;
        __be16 *hdr = (__be16 *)ul_header, offset;
 
        offset = htons((__force u16)(skb_transport_header(skb) -
@@ -246,7 +247,11 @@ rmnet_map_ipv6_ul_csum_header(void *ip6hdr,
        ul_header->csum_start_offset = offset;
        ul_header->csum_insert_offset = skb->csum_offset;
        ul_header->csum_enabled = 1;
-       ul_header->udp_ip4_ind = 0;
+
+       if (ip6h->nexthdr == IPPROTO_UDP)
+               ul_header->udp_ind = 1;
+       else
+               ul_header->udp_ind = 0;
 
        /* Changing remaining fields to network order */
        hdr++;
@@ -419,7 +424,7 @@ sw_csum:
        ul_header->csum_start_offset = 0;
        ul_header->csum_insert_offset = 0;
        ul_header->csum_enabled = 0;
-       ul_header->udp_ip4_ind = 0;
+       ul_header->udp_ind = 0;
 
        priv->stats.csum_sw++;
 }
index 6272115b28480a55b081bd2c52ec051791835786..e1dd6ea60d67050f2784a08d2ec2589eef040a35 100644 (file)
@@ -6136,10 +6136,7 @@ static int r8169_phy_connect(struct rtl8169_private *tp)
        if (ret)
                return ret;
 
-       if (tp->supports_gmii)
-               phy_remove_link_mode(phydev,
-                                    ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
-       else
+       if (!tp->supports_gmii)
                phy_set_max_speed(phydev, SPEED_100);
 
        phy_support_asym_pause(phydev);
@@ -6589,13 +6586,18 @@ static int rtl_alloc_irq(struct rtl8169_private *tp)
 {
        unsigned int flags;
 
-       if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
+       switch (tp->mac_version) {
+       case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
                rtl_unlock_config_regs(tp);
                RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~MSIEnable);
                rtl_lock_config_regs(tp);
+               /* fall through */
+       case RTL_GIGA_MAC_VER_07 ... RTL_GIGA_MAC_VER_24:
                flags = PCI_IRQ_LEGACY;
-       } else {
+               break;
+       default:
                flags = PCI_IRQ_ALL_TYPES;
+               break;
        }
 
        return pci_alloc_irq_vectors(tp->pci_dev, 1, 1, flags);
index 079f459c73a5d45a9802da81caf403c1c4e43d35..2c5d3f5b84dd6ef1096f3289b8c86ebc49b0348b 100644 (file)
@@ -2208,10 +2208,12 @@ static int rocker_router_fib_event(struct notifier_block *nb,
 
                        if (fen_info->fi->fib_nh_is_v6) {
                                NL_SET_ERR_MSG_MOD(info->extack, "IPv6 gateway with IPv4 route is not supported");
+                               kfree(fib_work);
                                return notifier_from_errno(-EINVAL);
                        }
                        if (fen_info->fi->nh) {
                                NL_SET_ERR_MSG_MOD(info->extack, "IPv4 route with nexthop objects is not supported");
+                               kfree(fib_work);
                                return notifier_from_errno(-EINVAL);
                        }
                }
index bd14803545de30b7fb7c7a7ff0201227cdd39bdb..8d88e40834567fc23797515f55dbe0e08543622d 100644 (file)
@@ -712,6 +712,7 @@ static void smc911x_phy_detect(struct net_device *dev)
                                        /* Found an external PHY */
                                        break;
                        }
+                       /* Else, fall through */
                default:
                        /* Internal media only */
                        SMC_GET_PHY_ID1(lp, 1, id1);
index c7c9e5f162e6de73f2534dc5f8d5b5a38222e743..9a4a56ad35cd3a403e5283ad12f50a65c538d0bd 100644 (file)
@@ -814,20 +814,15 @@ static void stmmac_validate(struct phylink_config *config,
        phylink_set(mac_supported, 10baseT_Full);
        phylink_set(mac_supported, 100baseT_Half);
        phylink_set(mac_supported, 100baseT_Full);
+       phylink_set(mac_supported, 1000baseT_Half);
+       phylink_set(mac_supported, 1000baseT_Full);
+       phylink_set(mac_supported, 1000baseKX_Full);
 
        phylink_set(mac_supported, Autoneg);
        phylink_set(mac_supported, Pause);
        phylink_set(mac_supported, Asym_Pause);
        phylink_set_port_modes(mac_supported);
 
-       if (priv->plat->has_gmac ||
-           priv->plat->has_gmac4 ||
-           priv->plat->has_xgmac) {
-               phylink_set(mac_supported, 1000baseT_Half);
-               phylink_set(mac_supported, 1000baseT_Full);
-               phylink_set(mac_supported, 1000baseKX_Full);
-       }
-
        /* Cut down 1G if asked to */
        if ((max_speed > 0) && (max_speed < 1000)) {
                phylink_set(mask, 1000baseT_Full);
@@ -1295,6 +1290,8 @@ static int init_dma_rx_desc_rings(struct net_device *dev, gfp_t flags)
                          "(%s) dma_rx_phy=0x%08x\n", __func__,
                          (u32)rx_q->dma_rx_phy);
 
+               stmmac_clear_rx_descriptors(priv, queue);
+
                for (i = 0; i < DMA_RX_SIZE; i++) {
                        struct dma_desc *p;
 
@@ -1312,8 +1309,6 @@ static int init_dma_rx_desc_rings(struct net_device *dev, gfp_t flags)
                rx_q->cur_rx = 0;
                rx_q->dirty_rx = (unsigned int)(i - DMA_RX_SIZE);
 
-               stmmac_clear_rx_descriptors(priv, queue);
-
                /* Setup the chained descriptor addresses */
                if (priv->mode == STMMAC_CHAIN_MODE) {
                        if (priv->extend_desc)
@@ -1555,9 +1550,8 @@ static int alloc_dma_rx_desc_resources(struct stmmac_priv *priv)
                        goto err_dma;
                }
 
-               rx_q->buf_pool = kmalloc_array(DMA_RX_SIZE,
-                                              sizeof(*rx_q->buf_pool),
-                                              GFP_KERNEL);
+               rx_q->buf_pool = kcalloc(DMA_RX_SIZE, sizeof(*rx_q->buf_pool),
+                                        GFP_KERNEL);
                if (!rx_q->buf_pool)
                        goto err_dma;
 
@@ -1608,15 +1602,15 @@ static int alloc_dma_tx_desc_resources(struct stmmac_priv *priv)
                tx_q->queue_index = queue;
                tx_q->priv_data = priv;
 
-               tx_q->tx_skbuff_dma = kmalloc_array(DMA_TX_SIZE,
-                                                   sizeof(*tx_q->tx_skbuff_dma),
-                                                   GFP_KERNEL);
+               tx_q->tx_skbuff_dma = kcalloc(DMA_TX_SIZE,
+                                             sizeof(*tx_q->tx_skbuff_dma),
+                                             GFP_KERNEL);
                if (!tx_q->tx_skbuff_dma)
                        goto err_dma;
 
-               tx_q->tx_skbuff = kmalloc_array(DMA_TX_SIZE,
-                                               sizeof(struct sk_buff *),
-                                               GFP_KERNEL);
+               tx_q->tx_skbuff = kcalloc(DMA_TX_SIZE,
+                                         sizeof(struct sk_buff *),
+                                         GFP_KERNEL);
                if (!tx_q->tx_skbuff)
                        goto err_dma;
 
@@ -3277,9 +3271,11 @@ static inline int stmmac_rx_threshold_count(struct stmmac_rx_queue *rx_q)
 static inline void stmmac_rx_refill(struct stmmac_priv *priv, u32 queue)
 {
        struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue];
-       int dirty = stmmac_rx_dirty(priv, queue);
+       int len, dirty = stmmac_rx_dirty(priv, queue);
        unsigned int entry = rx_q->dirty_rx;
 
+       len = DIV_ROUND_UP(priv->dma_buf_sz, PAGE_SIZE) * PAGE_SIZE;
+
        while (dirty-- > 0) {
                struct stmmac_rx_buffer *buf = &rx_q->buf_pool[entry];
                struct dma_desc *p;
@@ -3297,6 +3293,13 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv, u32 queue)
                }
 
                buf->addr = page_pool_get_dma_addr(buf->page);
+
+               /* Sync whole allocation to device. This will invalidate old
+                * data.
+                */
+               dma_sync_single_for_device(priv->device, buf->addr, len,
+                                          DMA_FROM_DEVICE);
+
                stmmac_set_desc_addr(priv, p, buf->addr);
                stmmac_refill_desc3(priv, rx_q, p);
 
@@ -3431,8 +3434,6 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue)
                        skb_copy_to_linear_data(skb, page_address(buf->page),
                                                frame_len);
                        skb_put(skb, frame_len);
-                       dma_sync_single_for_device(priv->device, buf->addr,
-                                                  frame_len, DMA_FROM_DEVICE);
 
                        if (netif_msg_pktdata(priv)) {
                                netdev_dbg(priv->dev, "frame received (%dbytes)",
index 73fc2524372e25269a3f4e39987ae65270054ef3..154daf4d10724e9928770319167c16fadc5a476a 100644 (file)
@@ -370,6 +370,13 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
                return ERR_PTR(-ENOMEM);
 
        *mac = of_get_mac_address(np);
+       if (IS_ERR(*mac)) {
+               if (PTR_ERR(*mac) == -EPROBE_DEFER)
+                       return ERR_CAST(*mac);
+
+               *mac = NULL;
+       }
+
        plat->interface = of_get_phy_mode(np);
 
        /* Some wrapper drivers still rely on phy_node. Let's save it while
index 5b196ebfed492e44b381f46b5eaa1d5d0d2e8f3e..0f346761a2b294ecd519a3e7ed8f5d389dcc91f3 100644 (file)
@@ -788,6 +788,7 @@ spider_net_release_tx_chain(struct spider_net_card *card, int brutal)
                        /* fallthrough, if we release the descriptors
                         * brutally (then we don't care about
                         * SPIDER_NET_DESCR_CARDOWNED) */
+                       /* Fall through */
 
                case SPIDER_NET_DESCR_RESPONSE_ERROR:
                case SPIDER_NET_DESCR_PROTECTION_ERROR:
index daab2c07d891dc3d718c7122708e695ea553507b..9303aeb2595f412cefa9ddcaca09ff93f9a4ecd8 100644 (file)
@@ -500,8 +500,9 @@ static int transmit(struct baycom_state *bc, int cnt, unsigned char stat)
                                }
                                break;
                        }
+                       /* fall through */
 
-               default:  /* fall through */
+               default:
                        if (bc->hdlctx.calibrate <= 0)
                                return 0;
                        i = min_t(int, cnt, bc->hdlctx.calibrate);
index afdcc5664ea6a0c69cadd71034aaf3d15ceaf9b5..3544e19915792df3e162b83983bdbf4647a42ab7 100644 (file)
@@ -836,7 +836,6 @@ int netvsc_recv_callback(struct net_device *net,
 
        if (unlikely(!skb)) {
                ++net_device_ctx->eth_stats.rx_no_memory;
-               rcu_read_unlock();
                return NVSP_STAT_FAIL;
        }
 
index 3ffe46df249ee2a482b748ac66a79ff31141690a..7c5265fd2b94d31f03ce61ce0f9505310d434f7b 100644 (file)
@@ -216,8 +216,10 @@ static struct gpio_desc *fixed_phy_get_gpiod(struct device_node *np)
        if (IS_ERR(gpiod)) {
                if (PTR_ERR(gpiod) == -EPROBE_DEFER)
                        return gpiod;
-               pr_err("error getting GPIO for fixed link %pOF, proceed without\n",
-                      fixed_link_node);
+
+               if (PTR_ERR(gpiod) != -ENOENT)
+                       pr_err("error getting GPIO for fixed link %pOF, proceed without\n",
+                              fixed_link_node);
                gpiod = NULL;
        }
 
index 28676af97b42c275f6d2df4a285d3d6d391ec7f6..645d354ffb4852605f19782ff60815f517d72e40 100644 (file)
@@ -2226,8 +2226,8 @@ static int vsc8514_probe(struct phy_device *phydev)
        vsc8531->supp_led_modes = VSC85XX_SUPP_LED_MODES;
        vsc8531->hw_stats = vsc85xx_hw_stats;
        vsc8531->nstats = ARRAY_SIZE(vsc85xx_hw_stats);
-       vsc8531->stats = devm_kmalloc_array(&phydev->mdio.dev, vsc8531->nstats,
-                                           sizeof(u64), GFP_KERNEL);
+       vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats,
+                                     sizeof(u64), GFP_KERNEL);
        if (!vsc8531->stats)
                return -ENOMEM;
 
@@ -2251,8 +2251,8 @@ static int vsc8574_probe(struct phy_device *phydev)
        vsc8531->supp_led_modes = VSC8584_SUPP_LED_MODES;
        vsc8531->hw_stats = vsc8584_hw_stats;
        vsc8531->nstats = ARRAY_SIZE(vsc8584_hw_stats);
-       vsc8531->stats = devm_kmalloc_array(&phydev->mdio.dev, vsc8531->nstats,
-                                           sizeof(u64), GFP_KERNEL);
+       vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats,
+                                     sizeof(u64), GFP_KERNEL);
        if (!vsc8531->stats)
                return -ENOMEM;
 
@@ -2281,8 +2281,8 @@ static int vsc8584_probe(struct phy_device *phydev)
        vsc8531->supp_led_modes = VSC8584_SUPP_LED_MODES;
        vsc8531->hw_stats = vsc8584_hw_stats;
        vsc8531->nstats = ARRAY_SIZE(vsc8584_hw_stats);
-       vsc8531->stats = devm_kmalloc_array(&phydev->mdio.dev, vsc8531->nstats,
-                                           sizeof(u64), GFP_KERNEL);
+       vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats,
+                                     sizeof(u64), GFP_KERNEL);
        if (!vsc8531->stats)
                return -ENOMEM;
 
@@ -2311,8 +2311,8 @@ static int vsc85xx_probe(struct phy_device *phydev)
        vsc8531->supp_led_modes = VSC85XX_SUPP_LED_MODES;
        vsc8531->hw_stats = vsc85xx_hw_stats;
        vsc8531->nstats = ARRAY_SIZE(vsc85xx_hw_stats);
-       vsc8531->stats = devm_kmalloc_array(&phydev->mdio.dev, vsc8531->nstats,
-                                           sizeof(u64), GFP_KERNEL);
+       vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats,
+                                     sizeof(u64), GFP_KERNEL);
        if (!vsc8531->stats)
                return -ENOMEM;
 
index 5d0af041b8f9f662d957d19353b05a8cb4bf4157..a45c5de96ab1c9688c0ed1eaa99f60fef3294230 100644 (file)
@@ -216,6 +216,8 @@ static int phylink_parse_fixedlink(struct phylink *pl,
                               pl->supported, true);
        linkmode_zero(pl->supported);
        phylink_set(pl->supported, MII);
+       phylink_set(pl->supported, Pause);
+       phylink_set(pl->supported, Asym_Pause);
        if (s) {
                __set_bit(s->bit, pl->supported);
        } else {
@@ -990,10 +992,10 @@ void phylink_start(struct phylink *pl)
        }
        if (pl->link_an_mode == MLO_AN_FIXED && pl->get_fixed_state)
                mod_timer(&pl->link_poll, jiffies + HZ);
-       if (pl->sfp_bus)
-               sfp_upstream_start(pl->sfp_bus);
        if (pl->phydev)
                phy_start(pl->phydev);
+       if (pl->sfp_bus)
+               sfp_upstream_start(pl->sfp_bus);
 }
 EXPORT_SYMBOL_GPL(phylink_start);
 
@@ -1010,10 +1012,10 @@ void phylink_stop(struct phylink *pl)
 {
        ASSERT_RTNL();
 
-       if (pl->phydev)
-               phy_stop(pl->phydev);
        if (pl->sfp_bus)
                sfp_upstream_stop(pl->sfp_bus);
+       if (pl->phydev)
+               phy_stop(pl->phydev);
        del_timer_sync(&pl->link_poll);
        if (pl->link_irq) {
                free_irq(pl->link_irq, pl);
index 1d902ecb4aa8b76dc14147841cf51ce12ae02127..a44dd3c8af632565043be1639efb99910e9afc25 100644 (file)
@@ -1115,6 +1115,9 @@ static const struct proto_ops pppoe_ops = {
        .recvmsg        = pppoe_recvmsg,
        .mmap           = sock_no_mmap,
        .ioctl          = pppox_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = pppox_compat_ioctl,
+#endif
 };
 
 static const struct pppox_proto pppoe_proto = {
index 5ef422a43d70b479e44991062cbdc03de9aa8951..08364f10a43fae46642f57225121bec00b70a0e0 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/string.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
+#include <linux/compat.h>
 #include <linux/errno.h>
 #include <linux/netdevice.h>
 #include <linux/net.h>
@@ -98,6 +99,18 @@ int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 
 EXPORT_SYMBOL(pppox_ioctl);
 
+#ifdef CONFIG_COMPAT
+int pppox_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
+{
+       if (cmd == PPPOEIOCSFWD32)
+               cmd = PPPOEIOCSFWD;
+
+       return pppox_ioctl(sock, cmd, (unsigned long)compat_ptr(arg));
+}
+
+EXPORT_SYMBOL(pppox_compat_ioctl);
+#endif
+
 static int pppox_create(struct net *net, struct socket *sock, int protocol,
                        int kern)
 {
index a8e52c8e4128370ca5bc3f44e5be55881846f02f..734de7de03f7893158e1370056f5193f82b7bd54 100644 (file)
@@ -623,6 +623,9 @@ static const struct proto_ops pptp_ops = {
        .recvmsg    = sock_no_recvmsg,
        .mmap       = sock_no_mmap,
        .ioctl      = pppox_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = pppox_compat_ioctl,
+#endif
 };
 
 static const struct pppox_proto pppox_pptp_proto = {
index 3d443597bd0496fc99e181f1df29a7ca70191125..db16d7a13e00c197574b1f9f70044775648bbd72 100644 (file)
@@ -1599,7 +1599,8 @@ static bool tun_can_build_skb(struct tun_struct *tun, struct tun_file *tfile,
        return true;
 }
 
-static struct sk_buff *__tun_build_skb(struct page_frag *alloc_frag, char *buf,
+static struct sk_buff *__tun_build_skb(struct tun_file *tfile,
+                                      struct page_frag *alloc_frag, char *buf,
                                       int buflen, int len, int pad)
 {
        struct sk_buff *skb = build_skb(buf, buflen);
@@ -1609,6 +1610,7 @@ static struct sk_buff *__tun_build_skb(struct page_frag *alloc_frag, char *buf,
 
        skb_reserve(skb, pad);
        skb_put(skb, len);
+       skb_set_owner_w(skb, tfile->socket.sk);
 
        get_page(alloc_frag->page);
        alloc_frag->offset += buflen;
@@ -1686,7 +1688,8 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun,
         */
        if (hdr->gso_type || !xdp_prog) {
                *skb_xdp = 1;
-               return __tun_build_skb(alloc_frag, buf, buflen, len, pad);
+               return __tun_build_skb(tfile, alloc_frag, buf, buflen, len,
+                                      pad);
        }
 
        *skb_xdp = 0;
@@ -1723,7 +1726,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun,
        rcu_read_unlock();
        local_bh_enable();
 
-       return __tun_build_skb(alloc_frag, buf, buflen, len, pad);
+       return __tun_build_skb(tfile, alloc_frag, buf, buflen, len, pad);
 
 err_xdp:
        put_page(alloc_frag->page);
index 69e0a2acfcb05b140d5f953e7e4b8f663e9321dc..b6dc5d714b5e636c5b39fa199eb7fd64c1c125bd 100644 (file)
@@ -1295,6 +1295,7 @@ static const struct usb_device_id products[] = {
        {QMI_FIXED_INTF(0x2001, 0x7e3d, 4)},    /* D-Link DWM-222 A2 */
        {QMI_FIXED_INTF(0x2020, 0x2031, 4)},    /* Olicard 600 */
        {QMI_FIXED_INTF(0x2020, 0x2033, 4)},    /* BroadMobi BM806U */
+       {QMI_FIXED_INTF(0x2020, 0x2060, 4)},    /* BroadMobi BM818 */
        {QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)},    /* Sierra Wireless MC7700 */
        {QMI_FIXED_INTF(0x114f, 0x68a2, 8)},    /* Sierra Wireless MC7750 */
        {QMI_FIXED_INTF(0x1199, 0x68a2, 8)},    /* Sierra Wireless MC7710 in QMI mode */
index 54edf8956a254cd718b4329e57ed2c8884e5ff1e..6e84328bdd402f0b66b71a92e7f894765e20dc1b 100644 (file)
@@ -165,23 +165,29 @@ static int vrf_ip6_local_out(struct net *net, struct sock *sk,
 static netdev_tx_t vrf_process_v6_outbound(struct sk_buff *skb,
                                           struct net_device *dev)
 {
-       const struct ipv6hdr *iph = ipv6_hdr(skb);
+       const struct ipv6hdr *iph;
        struct net *net = dev_net(skb->dev);
-       struct flowi6 fl6 = {
-               /* needed to match OIF rule */
-               .flowi6_oif = dev->ifindex,
-               .flowi6_iif = LOOPBACK_IFINDEX,
-               .daddr = iph->daddr,
-               .saddr = iph->saddr,
-               .flowlabel = ip6_flowinfo(iph),
-               .flowi6_mark = skb->mark,
-               .flowi6_proto = iph->nexthdr,
-               .flowi6_flags = FLOWI_FLAG_SKIP_NH_OIF,
-       };
+       struct flowi6 fl6;
        int ret = NET_XMIT_DROP;
        struct dst_entry *dst;
        struct dst_entry *dst_null = &net->ipv6.ip6_null_entry->dst;
 
+       if (!pskb_may_pull(skb, ETH_HLEN + sizeof(struct ipv6hdr)))
+               goto err;
+
+       iph = ipv6_hdr(skb);
+
+       memset(&fl6, 0, sizeof(fl6));
+       /* needed to match OIF rule */
+       fl6.flowi6_oif = dev->ifindex;
+       fl6.flowi6_iif = LOOPBACK_IFINDEX;
+       fl6.daddr = iph->daddr;
+       fl6.saddr = iph->saddr;
+       fl6.flowlabel = ip6_flowinfo(iph);
+       fl6.flowi6_mark = skb->mark;
+       fl6.flowi6_proto = iph->nexthdr;
+       fl6.flowi6_flags = FLOWI_FLAG_SKIP_NH_OIF;
+
        dst = ip6_route_output(net, NULL, &fl6);
        if (dst == dst_null)
                goto err;
@@ -237,21 +243,27 @@ static int vrf_ip_local_out(struct net *net, struct sock *sk,
 static netdev_tx_t vrf_process_v4_outbound(struct sk_buff *skb,
                                           struct net_device *vrf_dev)
 {
-       struct iphdr *ip4h = ip_hdr(skb);
+       struct iphdr *ip4h;
        int ret = NET_XMIT_DROP;
-       struct flowi4 fl4 = {
-               /* needed to match OIF rule */
-               .flowi4_oif = vrf_dev->ifindex,
-               .flowi4_iif = LOOPBACK_IFINDEX,
-               .flowi4_tos = RT_TOS(ip4h->tos),
-               .flowi4_flags = FLOWI_FLAG_ANYSRC | FLOWI_FLAG_SKIP_NH_OIF,
-               .flowi4_proto = ip4h->protocol,
-               .daddr = ip4h->daddr,
-               .saddr = ip4h->saddr,
-       };
+       struct flowi4 fl4;
        struct net *net = dev_net(vrf_dev);
        struct rtable *rt;
 
+       if (!pskb_may_pull(skb, ETH_HLEN + sizeof(struct iphdr)))
+               goto err;
+
+       ip4h = ip_hdr(skb);
+
+       memset(&fl4, 0, sizeof(fl4));
+       /* needed to match OIF rule */
+       fl4.flowi4_oif = vrf_dev->ifindex;
+       fl4.flowi4_iif = LOOPBACK_IFINDEX;
+       fl4.flowi4_tos = RT_TOS(ip4h->tos);
+       fl4.flowi4_flags = FLOWI_FLAG_ANYSRC | FLOWI_FLAG_SKIP_NH_OIF;
+       fl4.flowi4_proto = ip4h->protocol;
+       fl4.daddr = ip4h->daddr;
+       fl4.saddr = ip4h->saddr;
+
        rt = ip_route_output_flow(net, &fl4, NULL);
        if (IS_ERR(rt))
                goto err;
index a9ac3f37b904f00fdadbcf3ba077fe818475bc7a..e2e679a01b65a2570f8bcd88870929622f3b7264 100644 (file)
@@ -413,6 +413,7 @@ static void sdla_errors(struct net_device *dev, int cmd, int dlci, int ret, int
                case SDLA_RET_NO_BUFS:
                        if (cmd == SDLA_INFORMATION_WRITE)
                                break;
+                       /* Else, fall through */
 
                default: 
                        netdev_dbg(dev, "Cmd 0x%02X generated return code 0x%02X\n",
index c3e10b6ab3a4d45203a67e36af1cf2d193a39028..f25f1ec5f9e97a10aebc1b308180cb84beb4133e 100644 (file)
@@ -333,6 +333,8 @@ static int st_nci_hci_connectivity_event_received(struct nci_dev *ndev,
 
                transaction = (struct nfc_evt_transaction *)devm_kzalloc(dev,
                                            skb->len - 2, GFP_KERNEL);
+               if (!transaction)
+                       return -ENOMEM;
 
                transaction->aid_len = skb->data[1];
                memcpy(transaction->aid, &skb->data[2], transaction->aid_len);
index 06fc542fd19876d16c0a6e8e39de654340cc2b5a..6586378cacb05ed6b80bcc8c9c350010f7e88905 100644 (file)
@@ -317,6 +317,8 @@ int st21nfca_connectivity_event_received(struct nfc_hci_dev *hdev, u8 host,
 
                transaction = (struct nfc_evt_transaction *)devm_kzalloc(dev,
                                                   skb->len - 2, GFP_KERNEL);
+               if (!transaction)
+                       return -ENOMEM;
 
                transaction->aid_len = skb->data[1];
                memcpy(transaction->aid, &skb->data[2],
index c99eed87382abc6255aece68fd8c4e1d1984b22a..df16c755b4dafeb915d7c6ab4fb7535b5a38d83d 100644 (file)
@@ -13,6 +13,17 @@ menuconfig NTB
 
 if NTB
 
+config NTB_MSI
+       bool "MSI Interrupt Support"
+       depends on PCI_MSI
+       help
+        Support using MSI interrupt forwarding instead of (or in addition to)
+        hardware doorbells. MSI interrupts typically offer lower latency
+        than doorbells and more MSI interrupts can be made available to
+        clients. However this requires an extra memory window and support
+        in the hardware driver for creating the MSI interrupts.
+
+        If unsure, say N.
 source "drivers/ntb/hw/Kconfig"
 
 source "drivers/ntb/test/Kconfig"
index 5c64438d5b3f5ba137cbaefaa5f3fb5f2a0665c6..3a6fa181ff9974c77e806fc9c9862e8e4e2be32e 100644 (file)
@@ -1,3 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0-only
 obj-$(CONFIG_NTB) += ntb.o hw/ test/
 obj-$(CONFIG_NTB_TRANSPORT) += ntb_transport.o
+
+ntb-y                  := core.o
+ntb-$(CONFIG_NTB_MSI)  += msi.o
similarity index 100%
rename from drivers/ntb/ntb.c
rename to drivers/ntb/core.c
index efb214fc545a231514ac1309033beb9579c6014a..2859cc99b73e65beaecc45e620cbda7898fd0daa 100644 (file)
@@ -160,8 +160,8 @@ static int amd_ntb_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx,
                }
 
                /* set and verify setting the limit */
-               write64(limit, mmio + limit_reg);
-               reg_val = read64(mmio + limit_reg);
+               write64(limit, peer_mmio + limit_reg);
+               reg_val = read64(peer_mmio + limit_reg);
                if (reg_val != limit) {
                        write64(base_addr, mmio + limit_reg);
                        write64(0, peer_mmio + xlat_reg);
@@ -183,8 +183,8 @@ static int amd_ntb_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx,
                }
 
                /* set and verify setting the limit */
-               writel(limit, mmio + limit_reg);
-               reg_val = readl(mmio + limit_reg);
+               writel(limit, peer_mmio + limit_reg);
+               reg_val = readl(peer_mmio + limit_reg);
                if (reg_val != limit) {
                        writel(base_addr, mmio + limit_reg);
                        writel(0, peer_mmio + xlat_reg);
@@ -333,7 +333,7 @@ static u64 amd_ntb_db_vector_mask(struct ntb_dev *ntb, int db_vector)
        if (db_vector < 0 || db_vector > ndev->db_count)
                return 0;
 
-       return ntb_ndev(ntb)->db_valid_mask & (1 << db_vector);
+       return ntb_ndev(ntb)->db_valid_mask & (1ULL << db_vector);
 }
 
 static u64 amd_ntb_db_read(struct ntb_dev *ntb)
index f475b56a3f4926e56e95913717ac9f73c27e0570..c3397160db7f7c8bf411e2da30f472a0ce75b270 100644 (file)
@@ -532,9 +532,9 @@ static int intel_ntb3_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx,
        return 0;
 }
 
-int intel_ntb3_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr,
-                               resource_size_t *db_size,
-                               u64 *db_data, int db_bit)
+static int intel_ntb3_peer_db_addr(struct ntb_dev *ntb, phys_addr_t *db_addr,
+                                  resource_size_t *db_size,
+                                  u64 *db_data, int db_bit)
 {
        phys_addr_t db_addr_base;
        struct intel_ntb_dev *ndev = ntb_ndev(ntb);
index db4967748e4d1fe4de8e52da14b843826ff02077..f4959458d90967621919b6274814ef3c1befc244 100644 (file)
@@ -86,7 +86,8 @@ struct switchtec_ntb {
        bool link_is_up;
        enum ntb_speed link_speed;
        enum ntb_width link_width;
-       struct work_struct link_reinit_work;
+       struct work_struct check_link_status_work;
+       bool link_force_down;
 };
 
 static struct switchtec_ntb *ntb_sndev(struct ntb_dev *ntb)
@@ -485,33 +486,11 @@ enum switchtec_msg {
 
 static int switchtec_ntb_reinit_peer(struct switchtec_ntb *sndev);
 
-static void link_reinit_work(struct work_struct *work)
-{
-       struct switchtec_ntb *sndev;
-
-       sndev = container_of(work, struct switchtec_ntb, link_reinit_work);
-
-       switchtec_ntb_reinit_peer(sndev);
-}
-
-static void switchtec_ntb_check_link(struct switchtec_ntb *sndev,
-                                    enum switchtec_msg msg)
+static void switchtec_ntb_link_status_update(struct switchtec_ntb *sndev)
 {
        int link_sta;
        int old = sndev->link_is_up;
 
-       if (msg == MSG_LINK_FORCE_DOWN) {
-               schedule_work(&sndev->link_reinit_work);
-
-               if (sndev->link_is_up) {
-                       sndev->link_is_up = 0;
-                       ntb_link_event(&sndev->ntb);
-                       dev_info(&sndev->stdev->dev, "ntb link forced down\n");
-               }
-
-               return;
-       }
-
        link_sta = sndev->self_shared->link_sta;
        if (link_sta) {
                u64 peer = ioread64(&sndev->peer_shared->magic);
@@ -536,6 +515,38 @@ static void switchtec_ntb_check_link(struct switchtec_ntb *sndev,
        }
 }
 
+static void check_link_status_work(struct work_struct *work)
+{
+       struct switchtec_ntb *sndev;
+
+       sndev = container_of(work, struct switchtec_ntb,
+                            check_link_status_work);
+
+       if (sndev->link_force_down) {
+               sndev->link_force_down = false;
+               switchtec_ntb_reinit_peer(sndev);
+
+               if (sndev->link_is_up) {
+                       sndev->link_is_up = 0;
+                       ntb_link_event(&sndev->ntb);
+                       dev_info(&sndev->stdev->dev, "ntb link forced down\n");
+               }
+
+               return;
+       }
+
+       switchtec_ntb_link_status_update(sndev);
+}
+
+static void switchtec_ntb_check_link(struct switchtec_ntb *sndev,
+                                     enum switchtec_msg msg)
+{
+       if (msg == MSG_LINK_FORCE_DOWN)
+               sndev->link_force_down = true;
+
+       schedule_work(&sndev->check_link_status_work);
+}
+
 static void switchtec_ntb_link_notification(struct switchtec_dev *stdev)
 {
        struct switchtec_ntb *sndev = stdev->sndev;
@@ -568,7 +579,7 @@ static int switchtec_ntb_link_enable(struct ntb_dev *ntb,
        sndev->self_shared->link_sta = 1;
        switchtec_ntb_send_msg(sndev, LINK_MESSAGE, MSG_LINK_UP);
 
-       switchtec_ntb_check_link(sndev, MSG_CHECK_LINK);
+       switchtec_ntb_link_status_update(sndev);
 
        return 0;
 }
@@ -582,7 +593,7 @@ static int switchtec_ntb_link_disable(struct ntb_dev *ntb)
        sndev->self_shared->link_sta = 0;
        switchtec_ntb_send_msg(sndev, LINK_MESSAGE, MSG_LINK_DOWN);
 
-       switchtec_ntb_check_link(sndev, MSG_CHECK_LINK);
+       switchtec_ntb_link_status_update(sndev);
 
        return 0;
 }
@@ -835,7 +846,8 @@ static int switchtec_ntb_init_sndev(struct switchtec_ntb *sndev)
        sndev->ntb.topo = NTB_TOPO_SWITCH;
        sndev->ntb.ops = &switchtec_ntb_ops;
 
-       INIT_WORK(&sndev->link_reinit_work, link_reinit_work);
+       INIT_WORK(&sndev->check_link_status_work, check_link_status_work);
+       sndev->link_force_down = false;
 
        sndev->self_partition = sndev->stdev->partition;
 
@@ -872,7 +884,7 @@ static int switchtec_ntb_init_sndev(struct switchtec_ntb *sndev)
                }
 
                sndev->peer_partition = ffs(tpart_vec) - 1;
-               if (!(part_map & (1 << sndev->peer_partition))) {
+               if (!(part_map & (1ULL << sndev->peer_partition))) {
                        dev_err(&sndev->stdev->dev,
                                "ntb target partition is not NT partition\n");
                        return -ENODEV;
@@ -1448,10 +1460,16 @@ static void switchtec_ntb_deinit_db_msg_irq(struct switchtec_ntb *sndev)
 
 static int switchtec_ntb_reinit_peer(struct switchtec_ntb *sndev)
 {
-       dev_info(&sndev->stdev->dev, "peer reinitialized\n");
-       switchtec_ntb_deinit_shared_mw(sndev);
-       switchtec_ntb_init_mw(sndev);
-       return switchtec_ntb_init_shared_mw(sndev);
+       int rc;
+
+       if (crosslink_is_enabled(sndev))
+               return 0;
+
+       dev_info(&sndev->stdev->dev, "reinitialize shared memory window\n");
+       rc = config_rsvd_lut_win(sndev, sndev->mmio_peer_ctrl, 0,
+                                sndev->self_partition,
+                                sndev->self_shared_dma);
+       return rc;
 }
 
 static int switchtec_ntb_add(struct device *dev,
diff --git a/drivers/ntb/msi.c b/drivers/ntb/msi.c
new file mode 100644 (file)
index 0000000..9dddf13
--- /dev/null
@@ -0,0 +1,415 @@
+// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
+
+#include <linux/irq.h>
+#include <linux/module.h>
+#include <linux/ntb.h>
+#include <linux/msi.h>
+#include <linux/pci.h>
+
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_VERSION("0.1");
+MODULE_AUTHOR("Logan Gunthorpe <logang@deltatee.com>");
+MODULE_DESCRIPTION("NTB MSI Interrupt Library");
+
+struct ntb_msi {
+       u64 base_addr;
+       u64 end_addr;
+
+       void (*desc_changed)(void *ctx);
+
+       u32 __iomem *peer_mws[];
+};
+
+/**
+ * ntb_msi_init() - Initialize the MSI context
+ * @ntb:       NTB device context
+ *
+ * This function must be called before any other ntb_msi function.
+ * It initializes the context for MSI operations and maps
+ * the peer memory windows.
+ *
+ * This function reserves the last N outbound memory windows (where N
+ * is the number of peers).
+ *
+ * Return: Zero on success, otherwise a negative error number.
+ */
+int ntb_msi_init(struct ntb_dev *ntb,
+                void (*desc_changed)(void *ctx))
+{
+       phys_addr_t mw_phys_addr;
+       resource_size_t mw_size;
+       size_t struct_size;
+       int peer_widx;
+       int peers;
+       int ret;
+       int i;
+
+       peers = ntb_peer_port_count(ntb);
+       if (peers <= 0)
+               return -EINVAL;
+
+       struct_size = sizeof(*ntb->msi) + sizeof(*ntb->msi->peer_mws) * peers;
+
+       ntb->msi = devm_kzalloc(&ntb->dev, struct_size, GFP_KERNEL);
+       if (!ntb->msi)
+               return -ENOMEM;
+
+       ntb->msi->desc_changed = desc_changed;
+
+       for (i = 0; i < peers; i++) {
+               peer_widx = ntb_peer_mw_count(ntb) - 1 - i;
+
+               ret = ntb_peer_mw_get_addr(ntb, peer_widx, &mw_phys_addr,
+                                          &mw_size);
+               if (ret)
+                       goto unroll;
+
+               ntb->msi->peer_mws[i] = devm_ioremap(&ntb->dev, mw_phys_addr,
+                                                    mw_size);
+               if (!ntb->msi->peer_mws[i]) {
+                       ret = -EFAULT;
+                       goto unroll;
+               }
+       }
+
+       return 0;
+
+unroll:
+       for (i = 0; i < peers; i++)
+               if (ntb->msi->peer_mws[i])
+                       devm_iounmap(&ntb->dev, ntb->msi->peer_mws[i]);
+
+       devm_kfree(&ntb->dev, ntb->msi);
+       ntb->msi = NULL;
+       return ret;
+}
+EXPORT_SYMBOL(ntb_msi_init);
+
+/**
+ * ntb_msi_setup_mws() - Initialize the MSI inbound memory windows
+ * @ntb:       NTB device context
+ *
+ * This function sets up the required inbound memory windows. It should be
+ * called from a work function after a link up event.
+ *
+ * Over the entire network, this function will reserves the last N
+ * inbound memory windows for each peer (where N is the number of peers).
+ *
+ * ntb_msi_init() must be called before this function.
+ *
+ * Return: Zero on success, otherwise a negative error number.
+ */
+int ntb_msi_setup_mws(struct ntb_dev *ntb)
+{
+       struct msi_desc *desc;
+       u64 addr;
+       int peer, peer_widx;
+       resource_size_t addr_align, size_align, size_max;
+       resource_size_t mw_size = SZ_32K;
+       resource_size_t mw_min_size = mw_size;
+       int i;
+       int ret;
+
+       if (!ntb->msi)
+               return -EINVAL;
+
+       desc = first_msi_entry(&ntb->pdev->dev);
+       addr = desc->msg.address_lo + ((uint64_t)desc->msg.address_hi << 32);
+
+       for (peer = 0; peer < ntb_peer_port_count(ntb); peer++) {
+               peer_widx = ntb_peer_highest_mw_idx(ntb, peer);
+               if (peer_widx < 0)
+                       return peer_widx;
+
+               ret = ntb_mw_get_align(ntb, peer, peer_widx, &addr_align,
+                                      NULL, NULL);
+               if (ret)
+                       return ret;
+
+               addr &= ~(addr_align - 1);
+       }
+
+       for (peer = 0; peer < ntb_peer_port_count(ntb); peer++) {
+               peer_widx = ntb_peer_highest_mw_idx(ntb, peer);
+               if (peer_widx < 0) {
+                       ret = peer_widx;
+                       goto error_out;
+               }
+
+               ret = ntb_mw_get_align(ntb, peer, peer_widx, NULL,
+                                      &size_align, &size_max);
+               if (ret)
+                       goto error_out;
+
+               mw_size = round_up(mw_size, size_align);
+               mw_size = max(mw_size, size_max);
+               if (mw_size < mw_min_size)
+                       mw_min_size = mw_size;
+
+               ret = ntb_mw_set_trans(ntb, peer, peer_widx,
+                                      addr, mw_size);
+               if (ret)
+                       goto error_out;
+       }
+
+       ntb->msi->base_addr = addr;
+       ntb->msi->end_addr = addr + mw_min_size;
+
+       return 0;
+
+error_out:
+       for (i = 0; i < peer; i++) {
+               peer_widx = ntb_peer_highest_mw_idx(ntb, peer);
+               if (peer_widx < 0)
+                       continue;
+
+               ntb_mw_clear_trans(ntb, i, peer_widx);
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL(ntb_msi_setup_mws);
+
+/**
+ * ntb_msi_clear_mws() - Clear all inbound memory windows
+ * @ntb:       NTB device context
+ *
+ * This function tears down the resources used by ntb_msi_setup_mws().
+ */
+void ntb_msi_clear_mws(struct ntb_dev *ntb)
+{
+       int peer;
+       int peer_widx;
+
+       for (peer = 0; peer < ntb_peer_port_count(ntb); peer++) {
+               peer_widx = ntb_peer_highest_mw_idx(ntb, peer);
+               if (peer_widx < 0)
+                       continue;
+
+               ntb_mw_clear_trans(ntb, peer, peer_widx);
+       }
+}
+EXPORT_SYMBOL(ntb_msi_clear_mws);
+
+struct ntb_msi_devres {
+       struct ntb_dev *ntb;
+       struct msi_desc *entry;
+       struct ntb_msi_desc *msi_desc;
+};
+
+static int ntb_msi_set_desc(struct ntb_dev *ntb, struct msi_desc *entry,
+                           struct ntb_msi_desc *msi_desc)
+{
+       u64 addr;
+
+       addr = entry->msg.address_lo +
+               ((uint64_t)entry->msg.address_hi << 32);
+
+       if (addr < ntb->msi->base_addr || addr >= ntb->msi->end_addr) {
+               dev_warn_once(&ntb->dev,
+                             "IRQ %d: MSI Address not within the memory window (%llx, [%llx %llx])\n",
+                             entry->irq, addr, ntb->msi->base_addr,
+                             ntb->msi->end_addr);
+               return -EFAULT;
+       }
+
+       msi_desc->addr_offset = addr - ntb->msi->base_addr;
+       msi_desc->data = entry->msg.data;
+
+       return 0;
+}
+
+static void ntb_msi_write_msg(struct msi_desc *entry, void *data)
+{
+       struct ntb_msi_devres *dr = data;
+
+       WARN_ON(ntb_msi_set_desc(dr->ntb, entry, dr->msi_desc));
+
+       if (dr->ntb->msi->desc_changed)
+               dr->ntb->msi->desc_changed(dr->ntb->ctx);
+}
+
+static void ntbm_msi_callback_release(struct device *dev, void *res)
+{
+       struct ntb_msi_devres *dr = res;
+
+       dr->entry->write_msi_msg = NULL;
+       dr->entry->write_msi_msg_data = NULL;
+}
+
+static int ntbm_msi_setup_callback(struct ntb_dev *ntb, struct msi_desc *entry,
+                                  struct ntb_msi_desc *msi_desc)
+{
+       struct ntb_msi_devres *dr;
+
+       dr = devres_alloc(ntbm_msi_callback_release,
+                         sizeof(struct ntb_msi_devres), GFP_KERNEL);
+       if (!dr)
+               return -ENOMEM;
+
+       dr->ntb = ntb;
+       dr->entry = entry;
+       dr->msi_desc = msi_desc;
+
+       devres_add(&ntb->dev, dr);
+
+       dr->entry->write_msi_msg = ntb_msi_write_msg;
+       dr->entry->write_msi_msg_data = dr;
+
+       return 0;
+}
+
+/**
+ * ntbm_msi_request_threaded_irq() - allocate an MSI interrupt
+ * @ntb:       NTB device context
+ * @handler:   Function to be called when the IRQ occurs
+ * @thread_fn:  Function to be called in a threaded interrupt context. NULL
+ *              for clients which handle everything in @handler
+ * @devname:    An ascii name for the claiming device, dev_name(dev) if NULL
+ * @dev_id:     A cookie passed back to the handler function
+ *
+ * This function assigns an interrupt handler to an unused
+ * MSI interrupt and returns the descriptor used to trigger
+ * it. The descriptor can then be sent to a peer to trigger
+ * the interrupt.
+ *
+ * The interrupt resource is managed with devres so it will
+ * be automatically freed when the NTB device is torn down.
+ *
+ * If an IRQ allocated with this function needs to be freed
+ * separately, ntbm_free_irq() must be used.
+ *
+ * Return: IRQ number assigned on success, otherwise a negative error number.
+ */
+int ntbm_msi_request_threaded_irq(struct ntb_dev *ntb, irq_handler_t handler,
+                                 irq_handler_t thread_fn,
+                                 const char *name, void *dev_id,
+                                 struct ntb_msi_desc *msi_desc)
+{
+       struct msi_desc *entry;
+       struct irq_desc *desc;
+       int ret;
+
+       if (!ntb->msi)
+               return -EINVAL;
+
+       for_each_pci_msi_entry(entry, ntb->pdev) {
+               desc = irq_to_desc(entry->irq);
+               if (desc->action)
+                       continue;
+
+               ret = devm_request_threaded_irq(&ntb->dev, entry->irq, handler,
+                                               thread_fn, 0, name, dev_id);
+               if (ret)
+                       continue;
+
+               if (ntb_msi_set_desc(ntb, entry, msi_desc)) {
+                       devm_free_irq(&ntb->dev, entry->irq, dev_id);
+                       continue;
+               }
+
+               ret = ntbm_msi_setup_callback(ntb, entry, msi_desc);
+               if (ret) {
+                       devm_free_irq(&ntb->dev, entry->irq, dev_id);
+                       return ret;
+               }
+
+
+               return entry->irq;
+       }
+
+       return -ENODEV;
+}
+EXPORT_SYMBOL(ntbm_msi_request_threaded_irq);
+
+static int ntbm_msi_callback_match(struct device *dev, void *res, void *data)
+{
+       struct ntb_dev *ntb = dev_ntb(dev);
+       struct ntb_msi_devres *dr = res;
+
+       return dr->ntb == ntb && dr->entry == data;
+}
+
+/**
+ * ntbm_msi_free_irq() - free an interrupt
+ * @ntb:       NTB device context
+ * @irq:       Interrupt line to free
+ * @dev_id:    Device identity to free
+ *
+ * This function should be used to manually free IRQs allocated with
+ * ntbm_request_[threaded_]irq().
+ */
+void ntbm_msi_free_irq(struct ntb_dev *ntb, unsigned int irq, void *dev_id)
+{
+       struct msi_desc *entry = irq_get_msi_desc(irq);
+
+       entry->write_msi_msg = NULL;
+       entry->write_msi_msg_data = NULL;
+
+       WARN_ON(devres_destroy(&ntb->dev, ntbm_msi_callback_release,
+                              ntbm_msi_callback_match, entry));
+
+       devm_free_irq(&ntb->dev, irq, dev_id);
+}
+EXPORT_SYMBOL(ntbm_msi_free_irq);
+
+/**
+ * ntb_msi_peer_trigger() - Trigger an interrupt handler on a peer
+ * @ntb:       NTB device context
+ * @peer:      Peer index
+ * @desc:      MSI descriptor data which triggers the interrupt
+ *
+ * This function triggers an interrupt on a peer. It requires
+ * the descriptor structure to have been passed from that peer
+ * by some other means.
+ *
+ * Return: Zero on success, otherwise a negative error number.
+ */
+int ntb_msi_peer_trigger(struct ntb_dev *ntb, int peer,
+                        struct ntb_msi_desc *desc)
+{
+       int idx;
+
+       if (!ntb->msi)
+               return -EINVAL;
+
+       idx = desc->addr_offset / sizeof(*ntb->msi->peer_mws[peer]);
+
+       iowrite32(desc->data, &ntb->msi->peer_mws[peer][idx]);
+
+       return 0;
+}
+EXPORT_SYMBOL(ntb_msi_peer_trigger);
+
+/**
+ * ntb_msi_peer_addr() - Get the DMA address to trigger a peer's MSI interrupt
+ * @ntb:       NTB device context
+ * @peer:      Peer index
+ * @desc:      MSI descriptor data which triggers the interrupt
+ * @msi_addr:   Physical address to trigger the interrupt
+ *
+ * This function allows using DMA engines to trigger an interrupt
+ * (for example, trigger an interrupt to process the data after
+ * sending it). To trigger the interrupt, write @desc.data to the address
+ * returned in @msi_addr
+ *
+ * Return: Zero on success, otherwise a negative error number.
+ */
+int ntb_msi_peer_addr(struct ntb_dev *ntb, int peer,
+                     struct ntb_msi_desc *desc,
+                     phys_addr_t *msi_addr)
+{
+       int peer_widx = ntb_peer_mw_count(ntb) - 1 - peer;
+       phys_addr_t mw_phys_addr;
+       int ret;
+
+       ret = ntb_peer_mw_get_addr(ntb, peer_widx, &mw_phys_addr, NULL);
+       if (ret)
+               return ret;
+
+       if (msi_addr)
+               *msi_addr = mw_phys_addr + desc->addr_offset;
+
+       return 0;
+}
+EXPORT_SYMBOL(ntb_msi_peer_addr);
index d4f39ba1d9769c911fc6aaed4d42f7d54410e9bb..40c90ca10729675069c576a31f6a86a0f4e6b9ac 100644 (file)
@@ -93,6 +93,12 @@ static bool use_dma;
 module_param(use_dma, bool, 0644);
 MODULE_PARM_DESC(use_dma, "Use DMA engine to perform large data copy");
 
+static bool use_msi;
+#ifdef CONFIG_NTB_MSI
+module_param(use_msi, bool, 0644);
+MODULE_PARM_DESC(use_msi, "Use MSI interrupts instead of doorbells");
+#endif
+
 static struct dentry *nt_debugfs_dir;
 
 /* Only two-ports NTB devices are supported */
@@ -188,6 +194,11 @@ struct ntb_transport_qp {
        u64 tx_err_no_buf;
        u64 tx_memcpy;
        u64 tx_async;
+
+       bool use_msi;
+       int msi_irq;
+       struct ntb_msi_desc msi_desc;
+       struct ntb_msi_desc peer_msi_desc;
 };
 
 struct ntb_transport_mw {
@@ -221,6 +232,10 @@ struct ntb_transport_ctx {
        u64 qp_bitmap;
        u64 qp_bitmap_free;
 
+       bool use_msi;
+       unsigned int msi_spad_offset;
+       u64 msi_db_mask;
+
        bool link_is_up;
        struct delayed_work link_work;
        struct work_struct link_cleanup;
@@ -667,6 +682,114 @@ static int ntb_transport_setup_qp_mw(struct ntb_transport_ctx *nt,
        return 0;
 }
 
+static irqreturn_t ntb_transport_isr(int irq, void *dev)
+{
+       struct ntb_transport_qp *qp = dev;
+
+       tasklet_schedule(&qp->rxc_db_work);
+
+       return IRQ_HANDLED;
+}
+
+static void ntb_transport_setup_qp_peer_msi(struct ntb_transport_ctx *nt,
+                                           unsigned int qp_num)
+{
+       struct ntb_transport_qp *qp = &nt->qp_vec[qp_num];
+       int spad = qp_num * 2 + nt->msi_spad_offset;
+
+       if (!nt->use_msi)
+               return;
+
+       if (spad >= ntb_spad_count(nt->ndev))
+               return;
+
+       qp->peer_msi_desc.addr_offset =
+               ntb_peer_spad_read(qp->ndev, PIDX, spad);
+       qp->peer_msi_desc.data =
+               ntb_peer_spad_read(qp->ndev, PIDX, spad + 1);
+
+       dev_dbg(&qp->ndev->pdev->dev, "QP%d Peer MSI addr=%x data=%x\n",
+               qp_num, qp->peer_msi_desc.addr_offset, qp->peer_msi_desc.data);
+
+       if (qp->peer_msi_desc.addr_offset) {
+               qp->use_msi = true;
+               dev_info(&qp->ndev->pdev->dev,
+                        "Using MSI interrupts for QP%d\n", qp_num);
+       }
+}
+
+static void ntb_transport_setup_qp_msi(struct ntb_transport_ctx *nt,
+                                      unsigned int qp_num)
+{
+       struct ntb_transport_qp *qp = &nt->qp_vec[qp_num];
+       int spad = qp_num * 2 + nt->msi_spad_offset;
+       int rc;
+
+       if (!nt->use_msi)
+               return;
+
+       if (spad >= ntb_spad_count(nt->ndev)) {
+               dev_warn_once(&qp->ndev->pdev->dev,
+                             "Not enough SPADS to use MSI interrupts\n");
+               return;
+       }
+
+       ntb_spad_write(qp->ndev, spad, 0);
+       ntb_spad_write(qp->ndev, spad + 1, 0);
+
+       if (!qp->msi_irq) {
+               qp->msi_irq = ntbm_msi_request_irq(qp->ndev, ntb_transport_isr,
+                                                  KBUILD_MODNAME, qp,
+                                                  &qp->msi_desc);
+               if (qp->msi_irq < 0) {
+                       dev_warn(&qp->ndev->pdev->dev,
+                                "Unable to allocate MSI interrupt for qp%d\n",
+                                qp_num);
+                       return;
+               }
+       }
+
+       rc = ntb_spad_write(qp->ndev, spad, qp->msi_desc.addr_offset);
+       if (rc)
+               goto err_free_interrupt;
+
+       rc = ntb_spad_write(qp->ndev, spad + 1, qp->msi_desc.data);
+       if (rc)
+               goto err_free_interrupt;
+
+       dev_dbg(&qp->ndev->pdev->dev, "QP%d MSI %d addr=%x data=%x\n",
+               qp_num, qp->msi_irq, qp->msi_desc.addr_offset,
+               qp->msi_desc.data);
+
+       return;
+
+err_free_interrupt:
+       devm_free_irq(&nt->ndev->dev, qp->msi_irq, qp);
+}
+
+static void ntb_transport_msi_peer_desc_changed(struct ntb_transport_ctx *nt)
+{
+       int i;
+
+       dev_dbg(&nt->ndev->pdev->dev, "Peer MSI descriptors changed");
+
+       for (i = 0; i < nt->qp_count; i++)
+               ntb_transport_setup_qp_peer_msi(nt, i);
+}
+
+static void ntb_transport_msi_desc_changed(void *data)
+{
+       struct ntb_transport_ctx *nt = data;
+       int i;
+
+       dev_dbg(&nt->ndev->pdev->dev, "MSI descriptors changed");
+
+       for (i = 0; i < nt->qp_count; i++)
+               ntb_transport_setup_qp_msi(nt, i);
+
+       ntb_peer_db_set(nt->ndev, nt->msi_db_mask);
+}
+
 static void ntb_free_mw(struct ntb_transport_ctx *nt, int num_mw)
 {
        struct ntb_transport_mw *mw = &nt->mw_vec[num_mw];
@@ -905,6 +1028,20 @@ static void ntb_transport_link_work(struct work_struct *work)
        int rc = 0, i, spad;
 
        /* send the local info, in the opposite order of the way we read it */
+
+       if (nt->use_msi) {
+               rc = ntb_msi_setup_mws(ndev);
+               if (rc) {
+                       dev_warn(&pdev->dev,
+                                "Failed to register MSI memory window: %d\n",
+                                rc);
+                       nt->use_msi = false;
+               }
+       }
+
+       for (i = 0; i < nt->qp_count; i++)
+               ntb_transport_setup_qp_msi(nt, i);
+
        for (i = 0; i < nt->mw_count; i++) {
                size = nt->mw_vec[i].phys_size;
 
@@ -962,6 +1099,7 @@ static void ntb_transport_link_work(struct work_struct *work)
                struct ntb_transport_qp *qp = &nt->qp_vec[i];
 
                ntb_transport_setup_qp_mw(nt, i);
+               ntb_transport_setup_qp_peer_msi(nt, i);
 
                if (qp->client_ready)
                        schedule_delayed_work(&qp->link_work, 0);
@@ -1135,6 +1273,19 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
                return -ENOMEM;
 
        nt->ndev = ndev;
+
+       /*
+        * If we are using MSI, and have at least one extra memory window,
+        * we will reserve the last MW for the MSI window.
+        */
+       if (use_msi && mw_count > 1) {
+               rc = ntb_msi_init(ndev, ntb_transport_msi_desc_changed);
+               if (!rc) {
+                       mw_count -= 1;
+                       nt->use_msi = true;
+               }
+       }
+
        spad_count = ntb_spad_count(ndev);
 
        /* Limit the MW's based on the availability of scratchpads */
@@ -1148,6 +1299,8 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
        max_mw_count_for_spads = (spad_count - MW0_SZ_HIGH) / 2;
        nt->mw_count = min(mw_count, max_mw_count_for_spads);
 
+       nt->msi_spad_offset = nt->mw_count * 2 + MW0_SZ_HIGH;
+
        nt->mw_vec = kcalloc_node(mw_count, sizeof(*nt->mw_vec),
                                  GFP_KERNEL, node);
        if (!nt->mw_vec) {
@@ -1178,6 +1331,12 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
        qp_bitmap = ntb_db_valid_mask(ndev);
 
        qp_count = ilog2(qp_bitmap);
+       if (nt->use_msi) {
+               qp_count -= 1;
+               nt->msi_db_mask = 1 << qp_count;
+               ntb_db_clear_mask(ndev, nt->msi_db_mask);
+       }
+
        if (max_num_clients && max_num_clients < qp_count)
                qp_count = max_num_clients;
        else if (nt->mw_count < qp_count)
@@ -1601,7 +1760,10 @@ static void ntb_tx_copy_callback(void *data,
 
        iowrite32(entry->flags | DESC_DONE_FLAG, &hdr->flags);
 
-       ntb_peer_db_set(qp->ndev, BIT_ULL(qp->qp_num));
+       if (qp->use_msi)
+               ntb_msi_peer_trigger(qp->ndev, PIDX, &qp->peer_msi_desc);
+       else
+               ntb_peer_db_set(qp->ndev, BIT_ULL(qp->qp_num));
 
        /* The entry length can only be zero if the packet is intended to be a
         * "link down" or similar.  Since no payload is being sent in these
@@ -1869,6 +2031,7 @@ ntb_transport_create_queue(void *data, struct device *client_dev,
                qp->rx_dma_chan = NULL;
        }
 
+       qp->tx_mw_dma_addr = 0;
        if (qp->tx_dma_chan) {
                qp->tx_mw_dma_addr =
                        dma_map_resource(qp->tx_dma_chan->device->dev,
@@ -2268,6 +2431,11 @@ static void ntb_transport_doorbell_callback(void *data, int vector)
        u64 db_bits;
        unsigned int qp_num;
 
+       if (ntb_db_read(nt->ndev) & nt->msi_db_mask) {
+               ntb_transport_msi_peer_desc_changed(nt);
+               ntb_db_clear(nt->ndev, nt->msi_db_mask);
+       }
+
        db_bits = (nt->qp_bitmap & ~nt->qp_bitmap_free &
                   ntb_db_vector_mask(nt->ndev, vector));
 
index a8db00a7e087cec43e1f171c7c957897f346c65c..516b991f33b96f27f7f17c07eda6df61807c5808 100644 (file)
@@ -26,3 +26,12 @@ config NTB_PERF
         to and from the window without additional software interaction.
 
         If unsure, say N.
+
+config NTB_MSI_TEST
+       tristate "NTB MSI Test Client"
+       depends on NTB_MSI
+       help
+         This tool demonstrates the use of the NTB MSI library to
+         send MSI interrupts between peers.
+
+         If unsure, say N.
index cbfd67622ef7782da2f878dd37a232c70b8f8742..19ed91d8a3b1d916a65bd80aeb7ec1f8ac470b03 100644 (file)
@@ -2,3 +2,4 @@
 obj-$(CONFIG_NTB_PINGPONG) += ntb_pingpong.o
 obj-$(CONFIG_NTB_TOOL) += ntb_tool.o
 obj-$(CONFIG_NTB_PERF) += ntb_perf.o
+obj-$(CONFIG_NTB_MSI_TEST) += ntb_msi_test.o
diff --git a/drivers/ntb/test/ntb_msi_test.c b/drivers/ntb/test/ntb_msi_test.c
new file mode 100644 (file)
index 0000000..99d826e
--- /dev/null
@@ -0,0 +1,433 @@
+// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
+
+#include <linux/module.h>
+#include <linux/debugfs.h>
+#include <linux/ntb.h>
+#include <linux/pci.h>
+#include <linux/radix-tree.h>
+#include <linux/workqueue.h>
+
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_VERSION("0.1");
+MODULE_AUTHOR("Logan Gunthorpe <logang@deltatee.com>");
+MODULE_DESCRIPTION("Test for sending MSI interrupts over an NTB memory window");
+
+static int num_irqs = 4;
+module_param(num_irqs, int, 0644);
+MODULE_PARM_DESC(num_irqs, "number of irqs to use");
+
+struct ntb_msit_ctx {
+       struct ntb_dev *ntb;
+       struct dentry *dbgfs_dir;
+       struct work_struct setup_work;
+
+       struct ntb_msit_isr_ctx {
+               int irq_idx;
+               int irq_num;
+               int occurrences;
+               struct ntb_msit_ctx *nm;
+               struct ntb_msi_desc desc;
+       } *isr_ctx;
+
+       struct ntb_msit_peer {
+               struct ntb_msit_ctx *nm;
+               int pidx;
+               int num_irqs;
+               struct completion init_comp;
+               struct ntb_msi_desc *msi_desc;
+       } peers[];
+};
+
+static struct dentry *ntb_msit_dbgfs_topdir;
+
+static irqreturn_t ntb_msit_isr(int irq, void *dev)
+{
+       struct ntb_msit_isr_ctx *isr_ctx = dev;
+       struct ntb_msit_ctx *nm = isr_ctx->nm;
+
+       dev_dbg(&nm->ntb->dev, "Interrupt Occurred: %d",
+               isr_ctx->irq_idx);
+
+       isr_ctx->occurrences++;
+
+       return IRQ_HANDLED;
+}
+
+static void ntb_msit_setup_work(struct work_struct *work)
+{
+       struct ntb_msit_ctx *nm = container_of(work, struct ntb_msit_ctx,
+                                              setup_work);
+       int irq_count = 0;
+       int irq;
+       int ret;
+       uintptr_t i;
+
+       ret = ntb_msi_setup_mws(nm->ntb);
+       if (ret) {
+               dev_err(&nm->ntb->dev, "Unable to setup MSI windows: %d\n",
+                       ret);
+               return;
+       }
+
+       for (i = 0; i < num_irqs; i++) {
+               nm->isr_ctx[i].irq_idx = i;
+               nm->isr_ctx[i].nm = nm;
+
+               if (!nm->isr_ctx[i].irq_num) {
+                       irq = ntbm_msi_request_irq(nm->ntb, ntb_msit_isr,
+                                                  KBUILD_MODNAME,
+                                                  &nm->isr_ctx[i],
+                                                  &nm->isr_ctx[i].desc);
+                       if (irq < 0)
+                               break;
+
+                       nm->isr_ctx[i].irq_num = irq;
+               }
+
+               ret = ntb_spad_write(nm->ntb, 2 * i + 1,
+                                    nm->isr_ctx[i].desc.addr_offset);
+               if (ret)
+                       break;
+
+               ret = ntb_spad_write(nm->ntb, 2 * i + 2,
+                                    nm->isr_ctx[i].desc.data);
+               if (ret)
+                       break;
+
+               irq_count++;
+       }
+
+       ntb_spad_write(nm->ntb, 0, irq_count);
+       ntb_peer_db_set(nm->ntb, BIT(ntb_port_number(nm->ntb)));
+}
+
+static void ntb_msit_desc_changed(void *ctx)
+{
+       struct ntb_msit_ctx *nm = ctx;
+       int i;
+
+       dev_dbg(&nm->ntb->dev, "MSI Descriptors Changed\n");
+
+       for (i = 0; i < num_irqs; i++) {
+               ntb_spad_write(nm->ntb, 2 * i + 1,
+                              nm->isr_ctx[i].desc.addr_offset);
+               ntb_spad_write(nm->ntb, 2 * i + 2,
+                              nm->isr_ctx[i].desc.data);
+       }
+
+       ntb_peer_db_set(nm->ntb, BIT(ntb_port_number(nm->ntb)));
+}
+
+static void ntb_msit_link_event(void *ctx)
+{
+       struct ntb_msit_ctx *nm = ctx;
+
+       if (!ntb_link_is_up(nm->ntb, NULL, NULL))
+               return;
+
+       schedule_work(&nm->setup_work);
+}
+
+static void ntb_msit_copy_peer_desc(struct ntb_msit_ctx *nm, int peer)
+{
+       int i;
+       struct ntb_msi_desc *desc = nm->peers[peer].msi_desc;
+       int irq_count = nm->peers[peer].num_irqs;
+
+       for (i = 0; i < irq_count; i++) {
+               desc[i].addr_offset = ntb_peer_spad_read(nm->ntb, peer,
+                                                        2 * i + 1);
+               desc[i].data = ntb_peer_spad_read(nm->ntb, peer, 2 * i + 2);
+       }
+
+       dev_info(&nm->ntb->dev, "Found %d interrupts on peer %d\n",
+                irq_count, peer);
+
+       complete_all(&nm->peers[peer].init_comp);
+}
+
+static void ntb_msit_db_event(void *ctx, int vec)
+{
+       struct ntb_msit_ctx *nm = ctx;
+       struct ntb_msi_desc *desc;
+       u64 peer_mask = ntb_db_read(nm->ntb);
+       u32 irq_count;
+       int peer;
+
+       ntb_db_clear(nm->ntb, peer_mask);
+
+       for (peer = 0; peer < sizeof(peer_mask) * 8; peer++) {
+               if (!(peer_mask & BIT(peer)))
+                       continue;
+
+               irq_count = ntb_peer_spad_read(nm->ntb, peer, 0);
+               if (irq_count == -1)
+                       continue;
+
+               desc = kcalloc(irq_count, sizeof(*desc), GFP_ATOMIC);
+               if (!desc)
+                       continue;
+
+               kfree(nm->peers[peer].msi_desc);
+               nm->peers[peer].msi_desc = desc;
+               nm->peers[peer].num_irqs = irq_count;
+
+               ntb_msit_copy_peer_desc(nm, peer);
+       }
+}
+
+static const struct ntb_ctx_ops ntb_msit_ops = {
+       .link_event = ntb_msit_link_event,
+       .db_event = ntb_msit_db_event,
+};
+
+static int ntb_msit_dbgfs_trigger(void *data, u64 idx)
+{
+       struct ntb_msit_peer *peer = data;
+
+       if (idx >= peer->num_irqs)
+               return -EINVAL;
+
+       dev_dbg(&peer->nm->ntb->dev, "trigger irq %llu on peer %u\n",
+               idx, peer->pidx);
+
+       return ntb_msi_peer_trigger(peer->nm->ntb, peer->pidx,
+                                   &peer->msi_desc[idx]);
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(ntb_msit_trigger_fops, NULL,
+                        ntb_msit_dbgfs_trigger, "%llu\n");
+
+static int ntb_msit_dbgfs_port_get(void *data, u64 *port)
+{
+       struct ntb_msit_peer *peer = data;
+
+       *port = ntb_peer_port_number(peer->nm->ntb, peer->pidx);
+
+       return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(ntb_msit_port_fops, ntb_msit_dbgfs_port_get,
+                        NULL, "%llu\n");
+
+static int ntb_msit_dbgfs_count_get(void *data, u64 *count)
+{
+       struct ntb_msit_peer *peer = data;
+
+       *count = peer->num_irqs;
+
+       return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(ntb_msit_count_fops, ntb_msit_dbgfs_count_get,
+                        NULL, "%llu\n");
+
+static int ntb_msit_dbgfs_ready_get(void *data, u64 *ready)
+{
+       struct ntb_msit_peer *peer = data;
+
+       *ready = try_wait_for_completion(&peer->init_comp);
+
+       return 0;
+}
+
+static int ntb_msit_dbgfs_ready_set(void *data, u64 ready)
+{
+       struct ntb_msit_peer *peer = data;
+
+       return wait_for_completion_interruptible(&peer->init_comp);
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(ntb_msit_ready_fops, ntb_msit_dbgfs_ready_get,
+                        ntb_msit_dbgfs_ready_set, "%llu\n");
+
+static int ntb_msit_dbgfs_occurrences_get(void *data, u64 *occurrences)
+{
+       struct ntb_msit_isr_ctx *isr_ctx = data;
+
+       *occurrences = isr_ctx->occurrences;
+
+       return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(ntb_msit_occurrences_fops,
+                        ntb_msit_dbgfs_occurrences_get,
+                        NULL, "%llu\n");
+
+static int ntb_msit_dbgfs_local_port_get(void *data, u64 *port)
+{
+       struct ntb_msit_ctx *nm = data;
+
+       *port = ntb_port_number(nm->ntb);
+
+       return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(ntb_msit_local_port_fops,
+                        ntb_msit_dbgfs_local_port_get,
+                        NULL, "%llu\n");
+
+static void ntb_msit_create_dbgfs(struct ntb_msit_ctx *nm)
+{
+       struct pci_dev *pdev = nm->ntb->pdev;
+       char buf[32];
+       int i;
+       struct dentry *peer_dir;
+
+       nm->dbgfs_dir = debugfs_create_dir(pci_name(pdev),
+                                          ntb_msit_dbgfs_topdir);
+       debugfs_create_file("port", 0400, nm->dbgfs_dir, nm,
+                           &ntb_msit_local_port_fops);
+
+       for (i = 0; i < ntb_peer_port_count(nm->ntb); i++) {
+               nm->peers[i].pidx = i;
+               nm->peers[i].nm = nm;
+               init_completion(&nm->peers[i].init_comp);
+
+               snprintf(buf, sizeof(buf), "peer%d", i);
+               peer_dir = debugfs_create_dir(buf, nm->dbgfs_dir);
+
+               debugfs_create_file_unsafe("trigger", 0200, peer_dir,
+                                          &nm->peers[i],
+                                          &ntb_msit_trigger_fops);
+
+               debugfs_create_file_unsafe("port", 0400, peer_dir,
+                                          &nm->peers[i], &ntb_msit_port_fops);
+
+               debugfs_create_file_unsafe("count", 0400, peer_dir,
+                                          &nm->peers[i],
+                                          &ntb_msit_count_fops);
+
+               debugfs_create_file_unsafe("ready", 0600, peer_dir,
+                                          &nm->peers[i],
+                                          &ntb_msit_ready_fops);
+       }
+
+       for (i = 0; i < num_irqs; i++) {
+               snprintf(buf, sizeof(buf), "irq%d_occurrences", i);
+               debugfs_create_file_unsafe(buf, 0400, nm->dbgfs_dir,
+                                          &nm->isr_ctx[i],
+                                          &ntb_msit_occurrences_fops);
+       }
+}
+
+static void ntb_msit_remove_dbgfs(struct ntb_msit_ctx *nm)
+{
+       debugfs_remove_recursive(nm->dbgfs_dir);
+}
+
+static int ntb_msit_probe(struct ntb_client *client, struct ntb_dev *ntb)
+{
+       struct ntb_msit_ctx *nm;
+       size_t struct_size;
+       int peers;
+       int ret;
+
+       peers = ntb_peer_port_count(ntb);
+       if (peers <= 0)
+               return -EINVAL;
+
+       if (ntb_spad_is_unsafe(ntb) || ntb_spad_count(ntb) < 2 * num_irqs + 1) {
+               dev_err(&ntb->dev, "NTB MSI test requires at least %d spads for %d irqs\n",
+                       2 * num_irqs + 1, num_irqs);
+               return -EFAULT;
+       }
+
+       ret = ntb_spad_write(ntb, 0, -1);
+       if (ret) {
+               dev_err(&ntb->dev, "Unable to write spads: %d\n", ret);
+               return ret;
+       }
+
+       ret = ntb_db_clear_mask(ntb, GENMASK(peers - 1, 0));
+       if (ret) {
+               dev_err(&ntb->dev, "Unable to clear doorbell mask: %d\n", ret);
+               return ret;
+       }
+
+       ret = ntb_msi_init(ntb, ntb_msit_desc_changed);
+       if (ret) {
+               dev_err(&ntb->dev, "Unable to initialize MSI library: %d\n",
+                       ret);
+               return ret;
+       }
+
+       struct_size = sizeof(*nm) + sizeof(*nm->peers) * peers;
+
+       nm = devm_kzalloc(&ntb->dev, struct_size, GFP_KERNEL);
+       if (!nm)
+               return -ENOMEM;
+
+       nm->isr_ctx = devm_kcalloc(&ntb->dev, num_irqs, sizeof(*nm->isr_ctx),
+                                  GFP_KERNEL);
+       if (!nm->isr_ctx)
+               return -ENOMEM;
+
+       INIT_WORK(&nm->setup_work, ntb_msit_setup_work);
+       nm->ntb = ntb;
+
+       ntb_msit_create_dbgfs(nm);
+
+       ret = ntb_set_ctx(ntb, nm, &ntb_msit_ops);
+       if (ret)
+               goto remove_dbgfs;
+
+       if (!nm->isr_ctx)
+               goto remove_dbgfs;
+
+       ntb_link_enable(ntb, NTB_SPEED_AUTO, NTB_WIDTH_AUTO);
+
+       return 0;
+
+remove_dbgfs:
+       ntb_msit_remove_dbgfs(nm);
+       devm_kfree(&ntb->dev, nm->isr_ctx);
+       devm_kfree(&ntb->dev, nm);
+       return ret;
+}
+
+static void ntb_msit_remove(struct ntb_client *client, struct ntb_dev *ntb)
+{
+       struct ntb_msit_ctx *nm = ntb->ctx;
+       int i;
+
+       ntb_link_disable(ntb);
+       ntb_db_set_mask(ntb, ntb_db_valid_mask(ntb));
+       ntb_msi_clear_mws(ntb);
+
+       for (i = 0; i < ntb_peer_port_count(ntb); i++)
+               kfree(nm->peers[i].msi_desc);
+
+       ntb_clear_ctx(ntb);
+       ntb_msit_remove_dbgfs(nm);
+}
+
+static struct ntb_client ntb_msit_client = {
+       .ops = {
+               .probe = ntb_msit_probe,
+               .remove = ntb_msit_remove
+       }
+};
+
+static int __init ntb_msit_init(void)
+{
+       int ret;
+
+       if (debugfs_initialized())
+               ntb_msit_dbgfs_topdir = debugfs_create_dir(KBUILD_MODNAME,
+                                                          NULL);
+
+       ret = ntb_register_client(&ntb_msit_client);
+       if (ret)
+               debugfs_remove_recursive(ntb_msit_dbgfs_topdir);
+
+       return ret;
+}
+module_init(ntb_msit_init);
+
+static void __exit ntb_msit_exit(void)
+{
+       ntb_unregister_client(&ntb_msit_client);
+       debugfs_remove_recursive(ntb_msit_dbgfs_topdir);
+}
+module_exit(ntb_msit_exit);
index 11a6cd3740049fed6eade61b4c6e6af0f32b7e3d..d028331558ea7ae49a79bc3c501e6af71f69996b 100644 (file)
@@ -100,7 +100,7 @@ MODULE_DESCRIPTION("PCIe NTB Performance Measurement Tool");
 #define DMA_TRIES              100
 #define DMA_MDELAY             10
 
-#define MSG_TRIES              500
+#define MSG_TRIES              1000
 #define MSG_UDELAY_LOW         1000
 #define MSG_UDELAY_HIGH                2000
 
@@ -734,8 +734,6 @@ static void perf_disable_service(struct perf_ctx *perf)
 {
        int pidx;
 
-       ntb_link_disable(perf->ntb);
-
        if (perf->cmd_send == perf_msg_cmd_send) {
                u64 inbits;
 
@@ -752,6 +750,16 @@ static void perf_disable_service(struct perf_ctx *perf)
 
        for (pidx = 0; pidx < perf->pcnt; pidx++)
                flush_work(&perf->peers[pidx].service);
+
+       for (pidx = 0; pidx < perf->pcnt; pidx++) {
+               struct perf_peer *peer = &perf->peers[pidx];
+
+               ntb_spad_write(perf->ntb, PERF_SPAD_CMD(peer->gidx), 0);
+       }
+
+       ntb_db_clear(perf->ntb, PERF_SPAD_NOTIFY(perf->gidx));
+
+       ntb_link_disable(perf->ntb);
 }
 
 /*==============================================================================
index 59a6d232f77a73eae1bfe9e9b3ca020ca4a26a04..0884bedcfc7a6f92c308a643bde43d88c0ad2339 100644 (file)
@@ -192,6 +192,9 @@ static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
 
 static void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
 {
+       if (desc->msi_attrib.is_virtual)
+               return NULL;
+
        return desc->mask_base +
                desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE;
 }
@@ -206,14 +209,19 @@ static void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
 u32 __pci_msix_desc_mask_irq(struct msi_desc *desc, u32 flag)
 {
        u32 mask_bits = desc->masked;
+       void __iomem *desc_addr;
 
        if (pci_msi_ignore_mask)
                return 0;
+       desc_addr = pci_msix_desc_addr(desc);
+       if (!desc_addr)
+               return 0;
 
        mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
        if (flag)
                mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
-       writel(mask_bits, pci_msix_desc_addr(desc) + PCI_MSIX_ENTRY_VECTOR_CTRL);
+
+       writel(mask_bits, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
 
        return mask_bits;
 }
@@ -273,6 +281,11 @@ void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
        if (entry->msi_attrib.is_msix) {
                void __iomem *base = pci_msix_desc_addr(entry);
 
+               if (!base) {
+                       WARN_ON(1);
+                       return;
+               }
+
                msg->address_lo = readl(base + PCI_MSIX_ENTRY_LOWER_ADDR);
                msg->address_hi = readl(base + PCI_MSIX_ENTRY_UPPER_ADDR);
                msg->data = readl(base + PCI_MSIX_ENTRY_DATA);
@@ -303,6 +316,9 @@ void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
        } else if (entry->msi_attrib.is_msix) {
                void __iomem *base = pci_msix_desc_addr(entry);
 
+               if (!base)
+                       goto skip;
+
                writel(msg->address_lo, base + PCI_MSIX_ENTRY_LOWER_ADDR);
                writel(msg->address_hi, base + PCI_MSIX_ENTRY_UPPER_ADDR);
                writel(msg->data, base + PCI_MSIX_ENTRY_DATA);
@@ -327,7 +343,13 @@ void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
                                              msg->data);
                }
        }
+
+skip:
        entry->msg = *msg;
+
+       if (entry->write_msi_msg)
+               entry->write_msi_msg(entry, entry->write_msi_msg_data);
+
 }
 
 void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
@@ -550,6 +572,7 @@ msi_setup_entry(struct pci_dev *dev, int nvec, struct irq_affinity *affd)
 
        entry->msi_attrib.is_msix       = 0;
        entry->msi_attrib.is_64         = !!(control & PCI_MSI_FLAGS_64BIT);
+       entry->msi_attrib.is_virtual    = 0;
        entry->msi_attrib.entry_nr      = 0;
        entry->msi_attrib.maskbit       = !!(control & PCI_MSI_FLAGS_MASKBIT);
        entry->msi_attrib.default_irq   = dev->irq;     /* Save IOAPIC IRQ */
@@ -674,6 +697,7 @@ static int msix_setup_entries(struct pci_dev *dev, void __iomem *base,
        struct irq_affinity_desc *curmsk, *masks = NULL;
        struct msi_desc *entry;
        int ret, i;
+       int vec_count = pci_msix_vec_count(dev);
 
        if (affd)
                masks = irq_create_affinity_masks(nvec, affd);
@@ -696,6 +720,10 @@ static int msix_setup_entries(struct pci_dev *dev, void __iomem *base,
                        entry->msi_attrib.entry_nr = entries[i].entry;
                else
                        entry->msi_attrib.entry_nr = i;
+
+               entry->msi_attrib.is_virtual =
+                       entry->msi_attrib.entry_nr >= vec_count;
+
                entry->msi_attrib.default_irq   = dev->irq;
                entry->mask_base                = base;
 
@@ -714,12 +742,19 @@ static void msix_program_entries(struct pci_dev *dev,
 {
        struct msi_desc *entry;
        int i = 0;
+       void __iomem *desc_addr;
 
        for_each_pci_msi_entry(entry, dev) {
                if (entries)
                        entries[i++].vector = entry->irq;
-               entry->masked = readl(pci_msix_desc_addr(entry) +
-                               PCI_MSIX_ENTRY_VECTOR_CTRL);
+
+               desc_addr = pci_msix_desc_addr(entry);
+               if (desc_addr)
+                       entry->masked = readl(desc_addr +
+                                             PCI_MSIX_ENTRY_VECTOR_CTRL);
+               else
+                       entry->masked = 0;
+
                msix_mask_irq(entry, 1);
        }
 }
@@ -932,7 +967,7 @@ int pci_msix_vec_count(struct pci_dev *dev)
 EXPORT_SYMBOL(pci_msix_vec_count);
 
 static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
-                            int nvec, struct irq_affinity *affd)
+                            int nvec, struct irq_affinity *affd, int flags)
 {
        int nr_entries;
        int i, j;
@@ -943,7 +978,7 @@ static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries,
        nr_entries = pci_msix_vec_count(dev);
        if (nr_entries < 0)
                return nr_entries;
-       if (nvec > nr_entries)
+       if (nvec > nr_entries && !(flags & PCI_IRQ_VIRTUAL))
                return nr_entries;
 
        if (entries) {
@@ -1079,7 +1114,8 @@ EXPORT_SYMBOL(pci_enable_msi);
 
 static int __pci_enable_msix_range(struct pci_dev *dev,
                                   struct msix_entry *entries, int minvec,
-                                  int maxvec, struct irq_affinity *affd)
+                                  int maxvec, struct irq_affinity *affd,
+                                  int flags)
 {
        int rc, nvec = maxvec;
 
@@ -1096,7 +1132,7 @@ static int __pci_enable_msix_range(struct pci_dev *dev,
                                return -ENOSPC;
                }
 
-               rc = __pci_enable_msix(dev, entries, nvec, affd);
+               rc = __pci_enable_msix(dev, entries, nvec, affd, flags);
                if (rc == 0)
                        return nvec;
 
@@ -1127,7 +1163,7 @@ static int __pci_enable_msix_range(struct pci_dev *dev,
 int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
                int minvec, int maxvec)
 {
-       return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL);
+       return __pci_enable_msix_range(dev, entries, minvec, maxvec, NULL, 0);
 }
 EXPORT_SYMBOL(pci_enable_msix_range);
 
@@ -1167,7 +1203,7 @@ int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
 
        if (flags & PCI_IRQ_MSIX) {
                msix_vecs = __pci_enable_msix_range(dev, NULL, min_vecs,
-                                                   max_vecs, affd);
+                                                   max_vecs, affd, flags);
                if (msix_vecs > 0)
                        return msix_vecs;
        }
index bebbde4ebec08883243b47583b8bde2dee865159..8c94cd3fd1f2148cf39f48c540db87122f3f11fb 100644 (file)
@@ -30,6 +30,10 @@ module_param(use_dma_mrpc, bool, 0644);
 MODULE_PARM_DESC(use_dma_mrpc,
                 "Enable the use of the DMA MRPC feature");
 
+static int nirqs = 32;
+module_param(nirqs, int, 0644);
+MODULE_PARM_DESC(nirqs, "number of interrupts to allocate (more may be useful for NTB applications)");
+
 static dev_t switchtec_devt;
 static DEFINE_IDA(switchtec_minor_ida);
 
@@ -1263,8 +1267,12 @@ static int switchtec_init_isr(struct switchtec_dev *stdev)
        int dma_mrpc_irq;
        int rc;
 
-       nvecs = pci_alloc_irq_vectors(stdev->pdev, 1, 4,
-                                     PCI_IRQ_MSIX | PCI_IRQ_MSI);
+       if (nirqs < 4)
+               nirqs = 4;
+
+       nvecs = pci_alloc_irq_vectors(stdev->pdev, 1, nirqs,
+                                     PCI_IRQ_MSIX | PCI_IRQ_MSI |
+                                     PCI_IRQ_VIRTUAL);
        if (nvecs < 0)
                return nvecs;
 
index d506d32385fcddb6eb88cf8628ce788d36a3b8e1..21efb7d39d627b07907b49d3156419a70eca2d34 100644 (file)
@@ -118,7 +118,7 @@ config RESET_QCOM_PDC
 
 config RESET_SIMPLE
        bool "Simple Reset Controller Driver" if COMPILE_TEST
-       default ARCH_STM32 || ARCH_STRATIX10 || ARCH_SUNXI || ARCH_ZX || ARCH_ASPEED
+       default ARCH_STM32 || ARCH_STRATIX10 || ARCH_SUNXI || ARCH_ZX || ARCH_ASPEED || ARCH_BITMAIN
        help
          This enables a simple reset controller driver for reset lines that
          that can be asserted and deasserted by toggling bits in a contiguous,
@@ -130,6 +130,7 @@ config RESET_SIMPLE
           - RCC reset controller in STM32 MCUs
           - Allwinner SoCs
           - ZTE's zx2967 family
+          - Bitmain BM1880 SoC
 
 config RESET_STM32MP157
        bool "STM32MP157 Reset Driver" if COMPILE_TEST
index 21b9bd5692e1ff46251e8c4ce81efc8030c25cda..213ff40dda110e42a641dedd01d79bec80b56b95 100644 (file)
@@ -690,9 +690,6 @@ __reset_control_get_from_lookup(struct device *dev, const char *con_id,
        const char *dev_id = dev_name(dev);
        struct reset_control *rstc = NULL;
 
-       if (!dev)
-               return ERR_PTR(-EINVAL);
-
        mutex_lock(&reset_lookup_mutex);
 
        list_for_each_entry(lookup, &reset_lookup_list, list) {
index 7e48b9c05ecdd15cf3d059f0f531c52f0dc73852..1154f7b1f4ddbd1ef2cc1f8a5f8a165e2724f2ad 100644 (file)
@@ -125,6 +125,8 @@ static const struct of_device_id reset_simple_dt_ids[] = {
                .data = &reset_simple_active_low },
        { .compatible = "aspeed,ast2400-lpc-reset" },
        { .compatible = "aspeed,ast2500-lpc-reset" },
+       { .compatible = "bitmain,bm1880-reset",
+               .data = &reset_simple_active_low },
        { /* sentinel */ },
 };
 
index e8fc28dba8dfc3521532c3c87d26d199b8ed9b6c..96f0d34e94593c2a4e442c91d8f72d4a887590ec 100644 (file)
@@ -11,6 +11,7 @@
 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
 
 #include <linux/kthread.h>
+#include <linux/bug.h>
 #include "zfcp_ext.h"
 #include "zfcp_reqlist.h"
 
@@ -217,6 +218,12 @@ static struct zfcp_erp_action *zfcp_erp_setup_act(enum zfcp_erp_act_type need,
        struct zfcp_erp_action *erp_action;
        struct zfcp_scsi_dev *zfcp_sdev;
 
+       if (WARN_ON_ONCE(need != ZFCP_ERP_ACTION_REOPEN_LUN &&
+                        need != ZFCP_ERP_ACTION_REOPEN_PORT &&
+                        need != ZFCP_ERP_ACTION_REOPEN_PORT_FORCED &&
+                        need != ZFCP_ERP_ACTION_REOPEN_ADAPTER))
+               return NULL;
+
        switch (need) {
        case ZFCP_ERP_ACTION_REOPEN_LUN:
                zfcp_sdev = sdev_to_zfcp(sdev);
index d94496ee68832a84252691557726eaf6625adcd1..296bbc3c4606c178f7b1192edd99e70b9998acc2 100644 (file)
@@ -11,6 +11,7 @@
 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
 
 #include <linux/blktrace_api.h>
+#include <linux/types.h>
 #include <linux/slab.h>
 #include <scsi/fc/fc_els.h>
 #include "zfcp_ext.h"
@@ -741,6 +742,7 @@ static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_qdio *qdio,
 
 static int zfcp_fsf_req_send(struct zfcp_fsf_req *req)
 {
+       const bool is_srb = zfcp_fsf_req_is_status_read_buffer(req);
        struct zfcp_adapter *adapter = req->adapter;
        struct zfcp_qdio *qdio = adapter->qdio;
        int req_id = req->req_id;
@@ -757,8 +759,20 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *req)
                return -EIO;
        }
 
+       /*
+        * NOTE: DO NOT TOUCH ASYNC req PAST THIS POINT.
+        *       ONLY TOUCH SYNC req AGAIN ON req->completion.
+        *
+        * The request might complete and be freed concurrently at any point
+        * now. This is not protected by the QDIO-lock (req_q_lock). So any
+        * uncontrolled access after this might result in an use-after-free bug.
+        * Only if the request doesn't have ZFCP_STATUS_FSFREQ_CLEANUP set, and
+        * when it is completed via req->completion, is it safe to use req
+        * again.
+        */
+
        /* Don't increase for unsolicited status */
-       if (!zfcp_fsf_req_is_status_read_buffer(req))
+       if (!is_srb)
                adapter->fsf_req_seq_no++;
        adapter->req_no++;
 
@@ -805,6 +819,7 @@ int zfcp_fsf_status_read(struct zfcp_qdio *qdio)
        retval = zfcp_fsf_req_send(req);
        if (retval)
                goto failed_req_send;
+       /* NOTE: DO NOT TOUCH req PAST THIS POINT! */
 
        goto out;
 
@@ -914,8 +929,10 @@ struct zfcp_fsf_req *zfcp_fsf_abort_fcp_cmnd(struct scsi_cmnd *scmnd)
        req->qtcb->bottom.support.req_handle = (u64) old_req_id;
 
        zfcp_fsf_start_timer(req, ZFCP_FSF_SCSI_ER_TIMEOUT);
-       if (!zfcp_fsf_req_send(req))
+       if (!zfcp_fsf_req_send(req)) {
+               /* NOTE: DO NOT TOUCH req, UNTIL IT COMPLETES! */
                goto out;
+       }
 
 out_error_free:
        zfcp_fsf_req_free(req);
@@ -1098,6 +1115,7 @@ int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port,
        ret = zfcp_fsf_req_send(req);
        if (ret)
                goto failed_send;
+       /* NOTE: DO NOT TOUCH req PAST THIS POINT! */
 
        goto out;
 
@@ -1198,6 +1216,7 @@ int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id,
        ret = zfcp_fsf_req_send(req);
        if (ret)
                goto failed_send;
+       /* NOTE: DO NOT TOUCH req PAST THIS POINT! */
 
        goto out;
 
@@ -1243,6 +1262,7 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action)
                zfcp_fsf_req_free(req);
                erp_action->fsf_req_id = 0;
        }
+       /* NOTE: DO NOT TOUCH req PAST THIS POINT! */
 out:
        spin_unlock_irq(&qdio->req_q_lock);
        return retval;
@@ -1279,8 +1299,10 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_qdio *qdio,
        zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
        retval = zfcp_fsf_req_send(req);
        spin_unlock_irq(&qdio->req_q_lock);
-       if (!retval)
+       if (!retval) {
+               /* NOTE: ONLY TOUCH SYNC req AGAIN ON req->completion. */
                wait_for_completion(&req->completion);
+       }
 
        zfcp_fsf_req_free(req);
        return retval;
@@ -1330,6 +1352,7 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action)
                zfcp_fsf_req_free(req);
                erp_action->fsf_req_id = 0;
        }
+       /* NOTE: DO NOT TOUCH req PAST THIS POINT! */
 out:
        spin_unlock_irq(&qdio->req_q_lock);
        return retval;
@@ -1372,8 +1395,10 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_qdio *qdio,
        retval = zfcp_fsf_req_send(req);
        spin_unlock_irq(&qdio->req_q_lock);
 
-       if (!retval)
+       if (!retval) {
+               /* NOTE: ONLY TOUCH SYNC req AGAIN ON req->completion. */
                wait_for_completion(&req->completion);
+       }
 
        zfcp_fsf_req_free(req);
 
@@ -1493,6 +1518,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action)
                erp_action->fsf_req_id = 0;
                put_device(&port->dev);
        }
+       /* NOTE: DO NOT TOUCH req PAST THIS POINT! */
 out:
        spin_unlock_irq(&qdio->req_q_lock);
        return retval;
@@ -1557,6 +1583,7 @@ int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action)
                zfcp_fsf_req_free(req);
                erp_action->fsf_req_id = 0;
        }
+       /* NOTE: DO NOT TOUCH req PAST THIS POINT! */
 out:
        spin_unlock_irq(&qdio->req_q_lock);
        return retval;
@@ -1600,6 +1627,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port)
 {
        struct zfcp_qdio *qdio = wka_port->adapter->qdio;
        struct zfcp_fsf_req *req;
+       unsigned long req_id = 0;
        int retval = -EIO;
 
        spin_lock_irq(&qdio->req_q_lock);
@@ -1622,14 +1650,17 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port)
        hton24(req->qtcb->bottom.support.d_id, wka_port->d_id);
        req->data = wka_port;
 
+       req_id = req->req_id;
+
        zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
        retval = zfcp_fsf_req_send(req);
        if (retval)
                zfcp_fsf_req_free(req);
+       /* NOTE: DO NOT TOUCH req PAST THIS POINT! */
 out:
        spin_unlock_irq(&qdio->req_q_lock);
        if (!retval)
-               zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req->req_id);
+               zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req_id);
        return retval;
 }
 
@@ -1655,6 +1686,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port)
 {
        struct zfcp_qdio *qdio = wka_port->adapter->qdio;
        struct zfcp_fsf_req *req;
+       unsigned long req_id = 0;
        int retval = -EIO;
 
        spin_lock_irq(&qdio->req_q_lock);
@@ -1677,14 +1709,17 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port)
        req->data = wka_port;
        req->qtcb->header.port_handle = wka_port->handle;
 
+       req_id = req->req_id;
+
        zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
        retval = zfcp_fsf_req_send(req);
        if (retval)
                zfcp_fsf_req_free(req);
+       /* NOTE: DO NOT TOUCH req PAST THIS POINT! */
 out:
        spin_unlock_irq(&qdio->req_q_lock);
        if (!retval)
-               zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req->req_id);
+               zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req_id);
        return retval;
 }
 
@@ -1776,6 +1811,7 @@ int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action)
                zfcp_fsf_req_free(req);
                erp_action->fsf_req_id = 0;
        }
+       /* NOTE: DO NOT TOUCH req PAST THIS POINT! */
 out:
        spin_unlock_irq(&qdio->req_q_lock);
        return retval;
@@ -1899,6 +1935,7 @@ int zfcp_fsf_open_lun(struct zfcp_erp_action *erp_action)
                zfcp_fsf_req_free(req);
                erp_action->fsf_req_id = 0;
        }
+       /* NOTE: DO NOT TOUCH req PAST THIS POINT! */
 out:
        spin_unlock_irq(&qdio->req_q_lock);
        return retval;
@@ -1987,6 +2024,7 @@ int zfcp_fsf_close_lun(struct zfcp_erp_action *erp_action)
                zfcp_fsf_req_free(req);
                erp_action->fsf_req_id = 0;
        }
+       /* NOTE: DO NOT TOUCH req PAST THIS POINT! */
 out:
        spin_unlock_irq(&qdio->req_q_lock);
        return retval;
@@ -2299,6 +2337,7 @@ int zfcp_fsf_fcp_cmnd(struct scsi_cmnd *scsi_cmnd)
        retval = zfcp_fsf_req_send(req);
        if (unlikely(retval))
                goto failed_scsi_cmnd;
+       /* NOTE: DO NOT TOUCH req PAST THIS POINT! */
 
        goto out;
 
@@ -2373,8 +2412,10 @@ struct zfcp_fsf_req *zfcp_fsf_fcp_task_mgmt(struct scsi_device *sdev,
        zfcp_fc_fcp_tm(fcp_cmnd, sdev, tm_flags);
 
        zfcp_fsf_start_timer(req, ZFCP_FSF_SCSI_ER_TIMEOUT);
-       if (!zfcp_fsf_req_send(req))
+       if (!zfcp_fsf_req_send(req)) {
+               /* NOTE: DO NOT TOUCH req, UNTIL IT COMPLETES! */
                goto out;
+       }
 
        zfcp_fsf_req_free(req);
        req = NULL;
index aeda5390106415fe81516316b4fa8216207affb6..c00e3dd57990cd297401c8332c22054d86cca88b 100644 (file)
@@ -185,7 +185,7 @@ zalon7xx-objs       := zalon.o ncr53c8xx.o
 # Files generated that shall be removed upon make clean
 clean-files := 53c700_d.h 53c700_u.h scsi_devinfo_tbl.c
 
-$(obj)/53c700.o $(MODVERDIR)/$(obj)/53c700.ver: $(obj)/53c700_d.h
+$(obj)/53c700.o: $(obj)/53c700_d.h
 
 $(obj)/scsi_sysfs.o: $(obj)/scsi_devinfo_tbl.c
 
index ff0d8c6a8d0c3471f31ec6a7941ec0563ce94cbb..55522b7162d3b92368a84ff0a2a3cc3dbd3e7655 100644 (file)
@@ -462,6 +462,9 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
        else
                shost->dma_boundary = 0xffffffff;
 
+       if (sht->virt_boundary_mask)
+               shost->virt_boundary_mask = sht->virt_boundary_mask;
+
        device_initialize(&shost->shost_gendev);
        dev_set_name(&shost->shost_gendev, "host%d", shost->host_no);
        shost->shost_gendev.bus = &scsi_bus_type;
index 8e1053bdd84357faa8f88b5a07d1c490b6b30ac8..52e86665985314571878ae22b3964f2bf8e14bd7 100644 (file)
@@ -2591,7 +2591,7 @@ void fc_exch_recv(struct fc_lport *lport, struct fc_frame *fp)
 
        /* lport lock ? */
        if (!lport || lport->state == LPORT_ST_DISABLED) {
-               FC_LPORT_DBG(lport, "Receiving frames for an lport that "
+               FC_LIBFC_DBG("Receiving frames for an lport that "
                             "has not been initialized correctly\n");
                fc_frame_free(fp);
                return;
index 4f339f939a5133245dd6f64fd2831efcfb29f5e3..bec83eb8ab87474a8fd08bc200d9ff5a2ade85dc 100644 (file)
@@ -414,7 +414,6 @@ static void sas_wait_eh(struct domain_device *dev)
                goto retry;
        }
 }
-EXPORT_SYMBOL(sas_wait_eh);
 
 static int sas_queue_reset(struct domain_device *dev, int reset_type,
                           u64 lun, int wait)
index 2322ddb085c015d08c8dd65be607259cc8a539e3..34070874616d0cc7535b4844f1838506e97dc55b 100644 (file)
@@ -330,7 +330,7 @@ enum {
  * This function dumps an entry indexed by @idx from a queue specified by the
  * queue descriptor @q.
  **/
-static inline void
+static void
 lpfc_debug_dump_qe(struct lpfc_queue *q, uint32_t idx)
 {
        char line_buf[LPFC_LBUF_SZ];
index ca724fe91b8d4df15a24ab681631db11082598a0..a14e8344822bae5b129f753037e9e0870c7cbeb7 100644 (file)
@@ -21,8 +21,8 @@
 /*
  * MegaRAID SAS Driver meta data
  */
-#define MEGASAS_VERSION                                "07.710.06.00-rc1"
-#define MEGASAS_RELDATE                                "June 18, 2019"
+#define MEGASAS_VERSION                                "07.710.50.00-rc1"
+#define MEGASAS_RELDATE                                "June 28, 2019"
 
 /*
  * Device IDs
index 80ab9700f1debf4f59984486dc6ef3e336e2848a..b2339d04a700263d1164931505c19bf1c2f45bf5 100644 (file)
@@ -105,6 +105,10 @@ MODULE_PARM_DESC(perf_mode, "Performance mode (only for Aero adapters), options:
                "default mode is 'balanced'"
                );
 
+int event_log_level = MFI_EVT_CLASS_CRITICAL;
+module_param(event_log_level, int, 0644);
+MODULE_PARM_DESC(event_log_level, "Asynchronous event logging level- range is: -2(CLASS_DEBUG) to 4(CLASS_DEAD), Default: 2(CLASS_CRITICAL)");
+
 MODULE_LICENSE("GPL");
 MODULE_VERSION(MEGASAS_VERSION);
 MODULE_AUTHOR("megaraidlinux.pdl@broadcom.com");
@@ -280,7 +284,7 @@ void megasas_set_dma_settings(struct megasas_instance *instance,
        }
 }
 
-void
+static void
 megasas_issue_dcmd(struct megasas_instance *instance, struct megasas_cmd *cmd)
 {
        instance->instancet->fire_cmd(instance,
@@ -404,7 +408,13 @@ megasas_decode_evt(struct megasas_instance *instance)
        union megasas_evt_class_locale class_locale;
        class_locale.word = le32_to_cpu(evt_detail->cl.word);
 
-       if (class_locale.members.class >= MFI_EVT_CLASS_CRITICAL)
+       if ((event_log_level < MFI_EVT_CLASS_DEBUG) ||
+           (event_log_level > MFI_EVT_CLASS_DEAD)) {
+               printk(KERN_WARNING "megaraid_sas: provided event log level is out of range, setting it to default 2(CLASS_CRITICAL), permissible range is: -2 to 4\n");
+               event_log_level = MFI_EVT_CLASS_CRITICAL;
+       }
+
+       if (class_locale.members.class >= event_log_level)
                dev_info(&instance->pdev->dev, "%d (%s/0x%04x/%s) - %s\n",
                        le32_to_cpu(evt_detail->seq_num),
                        format_timestamp(le32_to_cpu(evt_detail->time_stamp)),
@@ -2237,7 +2247,7 @@ megasas_internal_reset_defer_cmds(struct megasas_instance *instance);
 static void
 process_fw_state_change_wq(struct work_struct *work);
 
-void megasas_do_ocr(struct megasas_instance *instance)
+static void megasas_do_ocr(struct megasas_instance *instance)
 {
        if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS1064R) ||
        (instance->pdev->device == PCI_DEVICE_ID_DELL_PERC5) ||
@@ -3303,7 +3313,7 @@ static DEVICE_ATTR_RO(fw_cmds_outstanding);
 static DEVICE_ATTR_RO(dump_system_regs);
 static DEVICE_ATTR_RO(raid_map_id);
 
-struct device_attribute *megaraid_host_attrs[] = {
+static struct device_attribute *megaraid_host_attrs[] = {
        &dev_attr_fw_crash_buffer_size,
        &dev_attr_fw_crash_buffer,
        &dev_attr_fw_crash_state,
@@ -3334,6 +3344,7 @@ static struct scsi_host_template megasas_template = {
        .shost_attrs = megaraid_host_attrs,
        .bios_param = megasas_bios_param,
        .change_queue_depth = scsi_change_queue_depth,
+       .max_segment_size = 0xffffffff,
        .no_write_same = 1,
 };
 
@@ -5933,7 +5944,8 @@ static int megasas_init_fw(struct megasas_instance *instance)
                                        instance->is_rdpq = (scratch_pad_1 & MR_RDPQ_MODE_OFFSET) ?
                                                                1 : 0;
 
-                               if (!instance->msix_combined) {
+                               if (instance->adapter_type >= INVADER_SERIES &&
+                                   !instance->msix_combined) {
                                        instance->msix_load_balance = true;
                                        instance->smp_affinity_enable = false;
                                }
@@ -6546,7 +6558,8 @@ megasas_get_target_prop(struct megasas_instance *instance,
        int ret;
        struct megasas_cmd *cmd;
        struct megasas_dcmd_frame *dcmd;
-       u16 targetId = (sdev->channel % 2) + sdev->id;
+       u16 targetId = ((sdev->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) +
+                       sdev->id;
 
        cmd = megasas_get_cmd(instance);
 
@@ -8748,6 +8761,12 @@ static int __init megasas_init(void)
                goto err_pcidrv;
        }
 
+       if ((event_log_level < MFI_EVT_CLASS_DEBUG) ||
+           (event_log_level > MFI_EVT_CLASS_DEAD)) {
+               printk(KERN_WARNING "megarid_sas: provided event log level is out of range, setting it to default 2(CLASS_CRITICAL), permissible range is: -2 to 4\n");
+               event_log_level = MFI_EVT_CLASS_CRITICAL;
+       }
+
        rval = driver_create_file(&megasas_pci_driver.driver,
                                  &driver_attr_version);
        if (rval)
index 27c731a3fb4905fc3ba16cf01267cdc8c6b18190..717ba0845a2afc379bed1ea07646f07702e39773 100644 (file)
@@ -10238,6 +10238,7 @@ static struct scsi_host_template mpt3sas_driver_template = {
        .this_id                        = -1,
        .sg_tablesize                   = MPT3SAS_SG_DEPTH,
        .max_sectors                    = 32767,
+       .max_segment_size               = 0xffffffff,
        .cmd_per_lun                    = 7,
        .shost_attrs                    = mpt3sas_host_attrs,
        .sdev_attrs                     = mpt3sas_dev_attrs,
index dd38c356a1a4b0e405bb15aa9cfa56bec31512d8..9453705f643a110c99ef403ee95d96c1a8fcdcdd 100644 (file)
@@ -888,6 +888,8 @@ static void pm8001_dev_gone_notify(struct domain_device *dev)
                        spin_unlock_irqrestore(&pm8001_ha->lock, flags);
                        pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev ,
                                dev, 1, 0);
+                       while (pm8001_dev->running_req)
+                               msleep(20);
                        spin_lock_irqsave(&pm8001_ha->lock, flags);
                }
                PM8001_CHIP_DISP->dereg_dev_req(pm8001_ha, device_id);
@@ -1256,8 +1258,10 @@ int pm8001_abort_task(struct sas_task *task)
                        PM8001_MSG_DBG(pm8001_ha,
                                pm8001_printk("Waiting for Port reset\n"));
                        wait_for_completion(&completion_reset);
-                       if (phy->port_reset_status)
+                       if (phy->port_reset_status) {
+                               pm8001_dev_gone_notify(dev);
                                goto out;
+                       }
 
                        /*
                         * 4. SATA Abort ALL
index 1128d86d241a6a8d170ccfc5911b890deea6726f..73261902d75d56bc1b7622c5cf334f00cd942738 100644 (file)
@@ -604,7 +604,7 @@ static void update_main_config_table(struct pm8001_hba_info *pm8001_ha)
                pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer &=
                                        0x0000ffff;
                pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer |=
-                                       0x140000;
+                                       CHIP_8006_PORT_RECOVERY_TIMEOUT;
        }
        pm8001_mw32(address, MAIN_PORT_RECOVERY_TIMER,
                        pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer);
index 84d7426441bf36d879c518731c29c2ea255b9a48..dc9ab7689060b9decde1fb0d1e615b8e01d94423 100644 (file)
 #define SAS_MAX_AIP                     0x200000
 #define IT_NEXUS_TIMEOUT       0x7D0
 #define PORT_RECOVERY_TIMEOUT  ((IT_NEXUS_TIMEOUT/100) + 30)
+/* Port recovery timeout, 10000 ms for PM8006 controller */
+#define CHIP_8006_PORT_RECOVERY_TIMEOUT 0x640000
 
 #ifdef __LITTLE_ENDIAN_BITFIELD
 struct sas_identify_frame_local {
index a08ff3bd63105141840e774fc0af3081aa78178a..df14597752ec8729e328dff98cfc664451a96a7f 100644 (file)
@@ -239,6 +239,8 @@ static struct {
        {"LSI", "Universal Xport", "*", BLIST_NO_ULD_ATTACH},
        {"ENGENIO", "Universal Xport", "*", BLIST_NO_ULD_ATTACH},
        {"LENOVO", "Universal Xport", "*", BLIST_NO_ULD_ATTACH},
+       {"SanDisk", "Cruzer Blade", NULL, BLIST_TRY_VPD_PAGES |
+               BLIST_INQUIRY_36},
        {"SMSC", "USB 2 HS-CF", NULL, BLIST_SPARSELUN | BLIST_INQUIRY_36},
        {"SONY", "CD-ROM CDU-8001", NULL, BLIST_BORKEN},
        {"SONY", "TSL", NULL, BLIST_FORCELUN},          /* DDS3 & DDS4 autoloaders */
index e1da8c70a266df24d1ae89181328007f33f4d711..9381171c2fc02741df68aa59b9e8a024f608356a 100644 (file)
@@ -84,11 +84,11 @@ int scsi_init_sense_cache(struct Scsi_Host *shost)
        struct kmem_cache *cache;
        int ret = 0;
 
+       mutex_lock(&scsi_sense_cache_mutex);
        cache = scsi_select_sense_cache(shost->unchecked_isa_dma);
        if (cache)
-               return 0;
+               goto exit;
 
-       mutex_lock(&scsi_sense_cache_mutex);
        if (shost->unchecked_isa_dma) {
                scsi_sense_isadma_cache =
                        kmem_cache_create("scsi_sense_cache(DMA)",
@@ -104,7 +104,7 @@ int scsi_init_sense_cache(struct Scsi_Host *shost)
                if (!scsi_sense_cache)
                        ret = -ENOMEM;
        }
-
+ exit:
        mutex_unlock(&scsi_sense_cache_mutex);
        return ret;
 }
@@ -1452,7 +1452,7 @@ static void scsi_softirq_done(struct request *rq)
        disposition = scsi_decide_disposition(cmd);
        if (disposition != SUCCESS &&
            time_before(cmd->jiffies_at_alloc + wait_for, jiffies)) {
-               sdev_printk(KERN_ERR, cmd->device,
+               scmd_printk(KERN_ERR, cmd,
                            "timing out command, waited %lus\n",
                            wait_for/HZ);
                disposition = SUCCESS;
@@ -1784,6 +1784,8 @@ void __scsi_init_queue(struct Scsi_Host *shost, struct request_queue *q)
                blk_queue_max_integrity_segments(q, shost->sg_prot_tablesize);
        }
 
+       shost->max_sectors = min_t(unsigned int, shost->max_sectors,
+                       dma_max_mapping_size(dev) << SECTOR_SHIFT);
        blk_queue_max_hw_sectors(q, shost->max_sectors);
        if (shost->unchecked_isa_dma)
                blk_queue_bounce_limit(q, BLK_BOUNCE_ISA);
@@ -1791,7 +1793,8 @@ void __scsi_init_queue(struct Scsi_Host *shost, struct request_queue *q)
        dma_set_seg_boundary(dev, shost->dma_boundary);
 
        blk_queue_max_segment_size(q, shost->max_segment_size);
-       dma_set_max_seg_size(dev, shost->max_segment_size);
+       blk_queue_virt_boundary(q, shost->virt_boundary_mask);
+       dma_set_max_seg_size(dev, queue_max_segment_size(q));
 
        /*
         * Set a reasonable default alignment:  The larger of 32-byte (dword),
index db16c19e05c4e4001944a4094fb43a486ba5b250..5d6ff3931632fdbd5aa0f5735d9a53a9a5fa1c91 100644 (file)
@@ -461,7 +461,7 @@ int sd_zbc_read_zones(struct scsi_disk *sdkp, unsigned char *buf)
 {
        struct gendisk *disk = sdkp->disk;
        unsigned int nr_zones;
-       u32 zone_blocks;
+       u32 zone_blocks = 0;
        int ret;
 
        if (!sd_is_zoned(sdkp))
index c2b6a0ca693335b8c7a2cc38356073ead148917d..ed8b9ac805e6211ecb2c80570fb21e9531ece438 100644 (file)
@@ -1423,9 +1423,6 @@ static int storvsc_device_configure(struct scsi_device *sdevice)
 {
        blk_queue_rq_timeout(sdevice->request_queue, (storvsc_timeout * HZ));
 
-       /* Ensure there are no gaps in presented sgls */
-       blk_queue_virt_boundary(sdevice->request_queue, PAGE_SIZE - 1);
-
        sdevice->no_write_same = 1;
 
        /*
@@ -1698,6 +1695,8 @@ static struct scsi_host_template scsi_driver = {
        .this_id =              -1,
        /* Make sure we dont get a sg segment crosses a page boundary */
        .dma_boundary =         PAGE_SIZE-1,
+       /* Ensure there are no gaps in presented sgls */
+       .virt_boundary_mask =   PAGE_SIZE-1,
        .no_write_same =        1,
        .track_queue_depth =    1,
        .change_queue_depth =   storvsc_change_queue_depth,
index 04d3686511c87ce7886e4338ba3f523a4d877077..e274053109d073ae636b43834cbeb7371fb39256 100644 (file)
@@ -4587,8 +4587,6 @@ static int ufshcd_slave_configure(struct scsi_device *sdev)
        struct request_queue *q = sdev->request_queue;
 
        blk_queue_update_dma_pad(q, PRDT_DATA_BYTE_COUNT_PAD - 1);
-       blk_queue_max_segment_size(q, PRDT_DATA_BYTE_COUNT_MAX);
-
        return 0;
 }
 
@@ -7022,6 +7020,7 @@ static struct scsi_host_template ufshcd_driver_template = {
        .sg_tablesize           = SG_ALL,
        .cmd_per_lun            = UFSHCD_CMD_PER_LUN,
        .can_queue              = UFSHCD_CAN_QUEUE,
+       .max_segment_size       = PRDT_DATA_BYTE_COUNT_MAX,
        .max_host_blocked       = 1,
        .track_queue_depth      = 1,
        .sdev_groups            = ufshcd_driver_groups,
index be95a37c3fece881af20d4a42b5f066f6a2db756..c655f5f92b1241910a409512d831af81d169921d 100644 (file)
@@ -35,6 +35,7 @@ struct meson_canvas {
        void __iomem *reg_base;
        spinlock_t lock; /* canvas device lock */
        u8 used[NUM_CANVAS];
+       bool supports_endianness;
 };
 
 static void canvas_write(struct meson_canvas *canvas, u32 reg, u32 val)
@@ -86,6 +87,12 @@ int meson_canvas_config(struct meson_canvas *canvas, u8 canvas_index,
 {
        unsigned long flags;
 
+       if (endian && !canvas->supports_endianness) {
+               dev_err(canvas->dev,
+                       "Endianness is not supported on this SoC\n");
+               return -EINVAL;
+       }
+
        spin_lock_irqsave(&canvas->lock, flags);
        if (!canvas->used[canvas_index]) {
                dev_err(canvas->dev,
@@ -172,6 +179,8 @@ static int meson_canvas_probe(struct platform_device *pdev)
        if (IS_ERR(canvas->reg_base))
                return PTR_ERR(canvas->reg_base);
 
+       canvas->supports_endianness = of_device_get_match_data(dev);
+
        canvas->dev = dev;
        spin_lock_init(&canvas->lock);
        dev_set_drvdata(dev, canvas);
@@ -180,7 +189,10 @@ static int meson_canvas_probe(struct platform_device *pdev)
 }
 
 static const struct of_device_id canvas_dt_match[] = {
-       { .compatible = "amlogic,canvas" },
+       { .compatible = "amlogic,meson8-canvas", .data = (void *)false, },
+       { .compatible = "amlogic,meson8b-canvas", .data = (void *)false, },
+       { .compatible = "amlogic,meson8m2-canvas", .data = (void *)false, },
+       { .compatible = "amlogic,canvas", .data = (void *)true, },
        {}
 };
 MODULE_DEVICE_TABLE(of, canvas_dt_match);
index 61276ec692f8a702f74d36bb13b4fe30d8dfb326..01ed21e8bfee545965e47d8e8b84c340156c7f18 100644 (file)
@@ -64,6 +64,7 @@ static long aspeed_lpc_ctrl_ioctl(struct file *file, unsigned int cmd,
                unsigned long param)
 {
        struct aspeed_lpc_ctrl *lpc_ctrl = file_aspeed_lpc_ctrl(file);
+       struct device *dev = file->private_data;
        void __user *p = (void __user *)param;
        struct aspeed_lpc_ctrl_mapping map;
        u32 addr;
@@ -86,6 +87,12 @@ static long aspeed_lpc_ctrl_ioctl(struct file *file, unsigned int cmd,
                if (map.window_id != 0)
                        return -EINVAL;
 
+               /* If memory-region is not described in device tree */
+               if (!lpc_ctrl->mem_size) {
+                       dev_dbg(dev, "Didn't find reserved memory\n");
+                       return -ENXIO;
+               }
+
                map.size = lpc_ctrl->mem_size;
 
                return copy_to_user(p, &map, sizeof(map)) ? -EFAULT : 0;
@@ -122,9 +129,18 @@ static long aspeed_lpc_ctrl_ioctl(struct file *file, unsigned int cmd,
                        return -EINVAL;
 
                if (map.window_type == ASPEED_LPC_CTRL_WINDOW_FLASH) {
+                       if (!lpc_ctrl->pnor_size) {
+                               dev_dbg(dev, "Didn't find host pnor flash\n");
+                               return -ENXIO;
+                       }
                        addr = lpc_ctrl->pnor_base;
                        size = lpc_ctrl->pnor_size;
                } else if (map.window_type == ASPEED_LPC_CTRL_WINDOW_MEMORY) {
+                       /* If memory-region is not described in device tree */
+                       if (!lpc_ctrl->mem_size) {
+                               dev_dbg(dev, "Didn't find reserved memory\n");
+                               return -ENXIO;
+                       }
                        addr = lpc_ctrl->mem_base;
                        size = lpc_ctrl->mem_size;
                } else {
@@ -192,40 +208,41 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev)
        if (!lpc_ctrl)
                return -ENOMEM;
 
+       /* If flash is described in device tree then store */
        node = of_parse_phandle(dev->of_node, "flash", 0);
        if (!node) {
-               dev_err(dev, "Didn't find host pnor flash node\n");
-               return -ENODEV;
-       }
+               dev_dbg(dev, "Didn't find host pnor flash node\n");
+       } else {
+               rc = of_address_to_resource(node, 1, &resm);
+               of_node_put(node);
+               if (rc) {
+                       dev_err(dev, "Couldn't address to resource for flash\n");
+                       return rc;
+               }
 
-       rc = of_address_to_resource(node, 1, &resm);
-       of_node_put(node);
-       if (rc) {
-               dev_err(dev, "Couldn't address to resource for flash\n");
-               return rc;
+               lpc_ctrl->pnor_size = resource_size(&resm);
+               lpc_ctrl->pnor_base = resm.start;
        }
 
-       lpc_ctrl->pnor_size = resource_size(&resm);
-       lpc_ctrl->pnor_base = resm.start;
 
        dev_set_drvdata(&pdev->dev, lpc_ctrl);
 
+       /* If memory-region is described in device tree then store */
        node = of_parse_phandle(dev->of_node, "memory-region", 0);
        if (!node) {
-               dev_err(dev, "Didn't find reserved memory\n");
-               return -EINVAL;
-       }
+               dev_dbg(dev, "Didn't find reserved memory\n");
+       } else {
+               rc = of_address_to_resource(node, 0, &resm);
+               of_node_put(node);
+               if (rc) {
+                       dev_err(dev, "Couldn't address to resource for reserved memory\n");
+                       return -ENXIO;
+               }
 
-       rc = of_address_to_resource(node, 0, &resm);
-       of_node_put(node);
-       if (rc) {
-               dev_err(dev, "Couldn't address to resource for reserved memory\n");
-               return -ENOMEM;
+               lpc_ctrl->mem_size = resource_size(&resm);
+               lpc_ctrl->mem_base = resm.start;
        }
 
-       lpc_ctrl->mem_size = resource_size(&resm);
-       lpc_ctrl->mem_base = resm.start;
-
        lpc_ctrl->regmap = syscon_node_to_regmap(
                        pdev->dev.parent->of_node);
        if (IS_ERR(lpc_ctrl->regmap)) {
@@ -254,8 +271,6 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev)
                goto err;
        }
 
-       dev_info(dev, "Loaded at %pr\n", &resm);
-
        return 0;
 
 err:
index 217f7752cf2c6a95a0463034a9e47d22d1d658a1..f9ad8ad54a7d652e73c58690041bdad8710c72d9 100644 (file)
@@ -30,4 +30,14 @@ config FSL_MC_DPIO
          other DPAA2 objects. This driver does not expose the DPIO
          objects individually, but groups them under a service layer
          API.
+
+config DPAA2_CONSOLE
+       tristate "QorIQ DPAA2 console driver"
+       depends on OF && (ARCH_LAYERSCAPE || COMPILE_TEST)
+       default y
+       help
+         Console driver for DPAA2 platforms. Exports 2 char devices,
+         /dev/dpaa2_mc_console and /dev/dpaa2_aiop_console,
+         which can be used to dump the Management Complex and AIOP
+         firmware logs.
 endmenu
index 158541a83d26c247d529c1eb1de73054ba1ee223..71dee8d0d1f0c8830d7c7f197c4b0d9b62c2e268 100644 (file)
@@ -8,3 +8,4 @@ obj-$(CONFIG_QUICC_ENGINE)              += qe/
 obj-$(CONFIG_CPM)                      += qe/
 obj-$(CONFIG_FSL_GUTS)                 += guts.o
 obj-$(CONFIG_FSL_MC_DPIO)              += dpio/
+obj-$(CONFIG_DPAA2_CONSOLE)            += dpaa2-console.o
diff --git a/drivers/soc/fsl/dpaa2-console.c b/drivers/soc/fsl/dpaa2-console.c
new file mode 100644 (file)
index 0000000..9168d8d
--- /dev/null
@@ -0,0 +1,329 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Freescale DPAA2 Platforms Console Driver
+ *
+ * Copyright 2015-2016 Freescale Semiconductor Inc.
+ * Copyright 2018 NXP
+ */
+
+#define pr_fmt(fmt) "dpaa2-console: " fmt
+
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/of_address.h>
+#include <linux/miscdevice.h>
+#include <linux/uaccess.h>
+#include <linux/slab.h>
+#include <linux/fs.h>
+#include <linux/io.h>
+
+/* MC firmware base low/high registers indexes */
+#define MCFBALR_OFFSET 0
+#define MCFBAHR_OFFSET 1
+
+/* Bit masks used to get the most/least significant part of the MC base addr */
+#define MC_FW_ADDR_MASK_HIGH 0x1FFFF
+#define MC_FW_ADDR_MASK_LOW  0xE0000000
+
+#define MC_BUFFER_OFFSET 0x01000000
+#define MC_BUFFER_SIZE   (1024 * 1024 * 16)
+#define MC_OFFSET_DELTA  MC_BUFFER_OFFSET
+
+#define AIOP_BUFFER_OFFSET 0x06000000
+#define AIOP_BUFFER_SIZE   (1024 * 1024 * 16)
+#define AIOP_OFFSET_DELTA  0
+
+#define LOG_HEADER_FLAG_BUFFER_WRAPAROUND 0x80000000
+#define LAST_BYTE(a) ((a) & ~(LOG_HEADER_FLAG_BUFFER_WRAPAROUND))
+
+/* MC and AIOP Magic words */
+#define MAGIC_MC   0x4d430100
+#define MAGIC_AIOP 0x41494F50
+
+struct log_header {
+       __le32 magic_word;
+       char reserved[4];
+       __le32 buf_start;
+       __le32 buf_length;
+       __le32 last_byte;
+};
+
+struct console_data {
+       void __iomem *map_addr;
+       struct log_header __iomem *hdr;
+       void __iomem *start_addr;
+       void __iomem *end_addr;
+       void __iomem *end_of_data;
+       void __iomem *cur_ptr;
+};
+
+static struct resource mc_base_addr;
+
+static inline void adjust_end(struct console_data *cd)
+{
+       u32 last_byte = readl(&cd->hdr->last_byte);
+
+       cd->end_of_data = cd->start_addr + LAST_BYTE(last_byte);
+}
+
+static u64 get_mc_fw_base_address(void)
+{
+       u64 mcfwbase = 0ULL;
+       u32 __iomem *mcfbaregs;
+
+       mcfbaregs = ioremap(mc_base_addr.start, resource_size(&mc_base_addr));
+       if (!mcfbaregs) {
+               pr_err("could not map MC Firmaware Base registers\n");
+               return 0;
+       }
+
+       mcfwbase  = readl(mcfbaregs + MCFBAHR_OFFSET) &
+                         MC_FW_ADDR_MASK_HIGH;
+       mcfwbase <<= 32;
+       mcfwbase |= readl(mcfbaregs + MCFBALR_OFFSET) & MC_FW_ADDR_MASK_LOW;
+       iounmap(mcfbaregs);
+
+       pr_debug("MC base address at 0x%016llx\n", mcfwbase);
+       return mcfwbase;
+}
+
+static ssize_t dpaa2_console_size(struct console_data *cd)
+{
+       ssize_t size;
+
+       if (cd->cur_ptr <= cd->end_of_data)
+               size = cd->end_of_data - cd->cur_ptr;
+       else
+               size = (cd->end_addr - cd->cur_ptr) +
+                       (cd->end_of_data - cd->start_addr);
+
+       return size;
+}
+
+static int dpaa2_generic_console_open(struct inode *node, struct file *fp,
+                                     u64 offset, u64 size,
+                                     u32 expected_magic,
+                                     u32 offset_delta)
+{
+       u32 read_magic, wrapped, last_byte, buf_start, buf_length;
+       struct console_data *cd;
+       u64 base_addr;
+       int err;
+
+       cd = kmalloc(sizeof(*cd), GFP_KERNEL);
+       if (!cd)
+               return -ENOMEM;
+
+       base_addr = get_mc_fw_base_address();
+       if (!base_addr) {
+               err = -EIO;
+               goto err_fwba;
+       }
+
+       cd->map_addr = ioremap(base_addr + offset, size);
+       if (!cd->map_addr) {
+               pr_err("cannot map console log memory\n");
+               err = -EIO;
+               goto err_ioremap;
+       }
+
+       cd->hdr = (struct log_header __iomem *)cd->map_addr;
+       read_magic = readl(&cd->hdr->magic_word);
+       last_byte =  readl(&cd->hdr->last_byte);
+       buf_start =  readl(&cd->hdr->buf_start);
+       buf_length = readl(&cd->hdr->buf_length);
+
+       if (read_magic != expected_magic) {
+               pr_warn("expected = %08x, read = %08x\n",
+                       expected_magic, read_magic);
+               err = -EIO;
+               goto err_magic;
+       }
+
+       cd->start_addr = cd->map_addr + buf_start - offset_delta;
+       cd->end_addr = cd->start_addr + buf_length;
+
+       wrapped = last_byte & LOG_HEADER_FLAG_BUFFER_WRAPAROUND;
+
+       adjust_end(cd);
+       if (wrapped && cd->end_of_data != cd->end_addr)
+               cd->cur_ptr = cd->end_of_data + 1;
+       else
+               cd->cur_ptr = cd->start_addr;
+
+       fp->private_data = cd;
+
+       return 0;
+
+err_magic:
+       iounmap(cd->map_addr);
+
+err_ioremap:
+err_fwba:
+       kfree(cd);
+
+       return err;
+}
+
+static int dpaa2_mc_console_open(struct inode *node, struct file *fp)
+{
+       return dpaa2_generic_console_open(node, fp,
+                                         MC_BUFFER_OFFSET, MC_BUFFER_SIZE,
+                                         MAGIC_MC, MC_OFFSET_DELTA);
+}
+
+static int dpaa2_aiop_console_open(struct inode *node, struct file *fp)
+{
+       return dpaa2_generic_console_open(node, fp,
+                                         AIOP_BUFFER_OFFSET, AIOP_BUFFER_SIZE,
+                                         MAGIC_AIOP, AIOP_OFFSET_DELTA);
+}
+
+static int dpaa2_console_close(struct inode *node, struct file *fp)
+{
+       struct console_data *cd = fp->private_data;
+
+       iounmap(cd->map_addr);
+       kfree(cd);
+       return 0;
+}
+
+static ssize_t dpaa2_console_read(struct file *fp, char __user *buf,
+                                 size_t count, loff_t *f_pos)
+{
+       struct console_data *cd = fp->private_data;
+       size_t bytes = dpaa2_console_size(cd);
+       size_t bytes_end = cd->end_addr - cd->cur_ptr;
+       size_t written = 0;
+       void *kbuf;
+       int err;
+
+       /* Check if we need to adjust the end of data addr */
+       adjust_end(cd);
+
+       if (cd->end_of_data == cd->cur_ptr)
+               return 0;
+
+       if (count < bytes)
+               bytes = count;
+
+       kbuf = kmalloc(bytes, GFP_KERNEL);
+       if (!kbuf)
+               return -ENOMEM;
+
+       if (bytes > bytes_end) {
+               memcpy_fromio(kbuf, cd->cur_ptr, bytes_end);
+               if (copy_to_user(buf, kbuf, bytes_end)) {
+                       err = -EFAULT;
+                       goto err_free_buf;
+               }
+               buf += bytes_end;
+               cd->cur_ptr = cd->start_addr;
+               bytes -= bytes_end;
+               written += bytes_end;
+       }
+
+       memcpy_fromio(kbuf, cd->cur_ptr, bytes);
+       if (copy_to_user(buf, kbuf, bytes)) {
+               err = -EFAULT;
+               goto err_free_buf;
+       }
+       cd->cur_ptr += bytes;
+       written += bytes;
+
+       return written;
+
+err_free_buf:
+       kfree(kbuf);
+
+       return err;
+}
+
+static const struct file_operations dpaa2_mc_console_fops = {
+       .owner          = THIS_MODULE,
+       .open           = dpaa2_mc_console_open,
+       .release        = dpaa2_console_close,
+       .read           = dpaa2_console_read,
+};
+
+static struct miscdevice dpaa2_mc_console_dev = {
+       .minor = MISC_DYNAMIC_MINOR,
+       .name = "dpaa2_mc_console",
+       .fops = &dpaa2_mc_console_fops
+};
+
+static const struct file_operations dpaa2_aiop_console_fops = {
+       .owner          = THIS_MODULE,
+       .open           = dpaa2_aiop_console_open,
+       .release        = dpaa2_console_close,
+       .read           = dpaa2_console_read,
+};
+
+static struct miscdevice dpaa2_aiop_console_dev = {
+       .minor = MISC_DYNAMIC_MINOR,
+       .name = "dpaa2_aiop_console",
+       .fops = &dpaa2_aiop_console_fops
+};
+
+static int dpaa2_console_probe(struct platform_device *pdev)
+{
+       int error;
+
+       error = of_address_to_resource(pdev->dev.of_node, 0, &mc_base_addr);
+       if (error < 0) {
+               pr_err("of_address_to_resource() failed for %pOF with %d\n",
+                      pdev->dev.of_node, error);
+               return error;
+       }
+
+       error = misc_register(&dpaa2_mc_console_dev);
+       if (error) {
+               pr_err("cannot register device %s\n",
+                      dpaa2_mc_console_dev.name);
+               goto err_register_mc;
+       }
+
+       error = misc_register(&dpaa2_aiop_console_dev);
+       if (error) {
+               pr_err("cannot register device %s\n",
+                      dpaa2_aiop_console_dev.name);
+               goto err_register_aiop;
+       }
+
+       return 0;
+
+err_register_aiop:
+       misc_deregister(&dpaa2_mc_console_dev);
+err_register_mc:
+       return error;
+}
+
+static int dpaa2_console_remove(struct platform_device *pdev)
+{
+       misc_deregister(&dpaa2_mc_console_dev);
+       misc_deregister(&dpaa2_aiop_console_dev);
+
+       return 0;
+}
+
+static const struct of_device_id dpaa2_console_match_table[] = {
+       { .compatible = "fsl,dpaa2-console",},
+       {},
+};
+
+MODULE_DEVICE_TABLE(of, dpaa2_console_match_table);
+
+static struct platform_driver dpaa2_console_driver = {
+       .driver = {
+                  .name = "dpaa2-console",
+                  .pm = NULL,
+                  .of_match_table = dpaa2_console_match_table,
+                  },
+       .probe = dpaa2_console_probe,
+       .remove = dpaa2_console_remove,
+};
+module_platform_driver(dpaa2_console_driver);
+
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_AUTHOR("Roy Pledge <roy.pledge@nxp.com>");
+MODULE_DESCRIPTION("DPAA2 console driver");
index c0cdc8946031f9bf3daab5c6fe5ee00abd11c50f..70014ecce2a7e3805dc85e7c40c114c520346b25 100644 (file)
@@ -197,13 +197,22 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)
                                desc.cpu);
        }
 
-       /*
-        * Set the CENA regs to be the cache inhibited area of the portal to
-        * avoid coherency issues if a user migrates to another core.
-        */
-       desc.regs_cena = devm_memremap(dev, dpio_dev->regions[1].start,
-                                      resource_size(&dpio_dev->regions[1]),
-                                      MEMREMAP_WC);
+       if (dpio_dev->obj_desc.region_count < 3) {
+               /* No support for DDR backed portals, use classic mapping */
+               /*
+                * Set the CENA regs to be the cache inhibited area of the
+                * portal to avoid coherency issues if a user migrates to
+                * another core.
+                */
+               desc.regs_cena = devm_memremap(dev, dpio_dev->regions[1].start,
+                                       resource_size(&dpio_dev->regions[1]),
+                                       MEMREMAP_WC);
+       } else {
+               desc.regs_cena = devm_memremap(dev, dpio_dev->regions[2].start,
+                                       resource_size(&dpio_dev->regions[2]),
+                                       MEMREMAP_WB);
+       }
+
        if (IS_ERR(desc.regs_cena)) {
                dev_err(dev, "devm_memremap failed\n");
                err = PTR_ERR(desc.regs_cena);
index d02013556a1b4ce497ed34618f524683e9bed73d..c66f5b73777c15870df350286a8d7ec6b4c7bb47 100644 (file)
@@ -15,6 +15,8 @@
 #define QMAN_REV_4000   0x04000000
 #define QMAN_REV_4100   0x04010000
 #define QMAN_REV_4101   0x04010001
+#define QMAN_REV_5000   0x05000000
+
 #define QMAN_REV_MASK   0xffff0000
 
 /* All QBMan command and result structures use this "valid bit" encoding */
 #define QBMAN_WQCHAN_CONFIGURE 0x46
 
 /* CINH register offsets */
+#define QBMAN_CINH_SWP_EQCR_PI      0x800
 #define QBMAN_CINH_SWP_EQAR    0x8c0
+#define QBMAN_CINH_SWP_CR_RT        0x900
+#define QBMAN_CINH_SWP_VDQCR_RT     0x940
+#define QBMAN_CINH_SWP_EQCR_AM_RT   0x980
+#define QBMAN_CINH_SWP_RCR_AM_RT    0x9c0
 #define QBMAN_CINH_SWP_DQPI    0xa00
 #define QBMAN_CINH_SWP_DCAP    0xac0
 #define QBMAN_CINH_SWP_SDQCR   0xb00
+#define QBMAN_CINH_SWP_EQCR_AM_RT2  0xb40
+#define QBMAN_CINH_SWP_RCR_PI       0xc00
 #define QBMAN_CINH_SWP_RAR     0xcc0
 #define QBMAN_CINH_SWP_ISR     0xe00
 #define QBMAN_CINH_SWP_IER     0xe40
 #define QBMAN_CENA_SWP_RR(vb)  (0x700 + ((u32)(vb) >> 1))
 #define QBMAN_CENA_SWP_VDQCR   0x780
 
+/* CENA register offsets in memory-backed mode */
+#define QBMAN_CENA_SWP_DQRR_MEM(n)  (0x800 + ((u32)(n) << 6))
+#define QBMAN_CENA_SWP_RCR_MEM(n)   (0x1400 + ((u32)(n) << 6))
+#define QBMAN_CENA_SWP_CR_MEM       0x1600
+#define QBMAN_CENA_SWP_RR_MEM       0x1680
+#define QBMAN_CENA_SWP_VDQCR_MEM    0x1780
+
 /* Reverse mapping of QBMAN_CENA_SWP_DQRR() */
 #define QBMAN_IDX_FROM_DQRR(p) (((unsigned long)(p) & 0x1ff) >> 6)
 
@@ -96,10 +112,13 @@ static inline void *qbman_get_cmd(struct qbman_swp *p, u32 offset)
 
 #define SWP_CFG_DQRR_MF_SHIFT 20
 #define SWP_CFG_EST_SHIFT     16
+#define SWP_CFG_CPBS_SHIFT    15
 #define SWP_CFG_WN_SHIFT      14
 #define SWP_CFG_RPM_SHIFT     12
 #define SWP_CFG_DCM_SHIFT     10
 #define SWP_CFG_EPM_SHIFT     8
+#define SWP_CFG_VPM_SHIFT     7
+#define SWP_CFG_CPM_SHIFT     6
 #define SWP_CFG_SD_SHIFT      5
 #define SWP_CFG_SP_SHIFT      4
 #define SWP_CFG_SE_SHIFT      3
@@ -125,6 +144,8 @@ static inline u32 qbman_set_swp_cfg(u8 max_fill, u8 wn,     u8 est, u8 rpm, u8 dcm,
                ep << SWP_CFG_EP_SHIFT);
 }
 
+#define QMAN_RT_MODE      0x00000100
+
 /**
  * qbman_swp_init() - Create a functional object representing the given
  *                    QBMan portal descriptor.
@@ -146,6 +167,8 @@ struct qbman_swp *qbman_swp_init(const struct qbman_swp_desc *d)
        p->sdq |= qbman_sdqcr_dct_prio_ics << QB_SDQCR_DCT_SHIFT;
        p->sdq |= qbman_sdqcr_fc_up_to_3 << QB_SDQCR_FC_SHIFT;
        p->sdq |= QMAN_SDQCR_TOKEN << QB_SDQCR_TOK_SHIFT;
+       if ((p->desc->qman_version & QMAN_REV_MASK) >= QMAN_REV_5000)
+               p->mr.valid_bit = QB_VALID_BIT;
 
        atomic_set(&p->vdq.available, 1);
        p->vdq.valid_bit = QB_VALID_BIT;
@@ -163,6 +186,9 @@ struct qbman_swp *qbman_swp_init(const struct qbman_swp_desc *d)
        p->addr_cena = d->cena_bar;
        p->addr_cinh = d->cinh_bar;
 
+       if ((p->desc->qman_version & QMAN_REV_MASK) >= QMAN_REV_5000)
+               memset(p->addr_cena, 0, 64 * 1024);
+
        reg = qbman_set_swp_cfg(p->dqrr.dqrr_size,
                                1, /* Writes Non-cacheable */
                                0, /* EQCR_CI stashing threshold */
@@ -175,6 +201,10 @@ struct qbman_swp *qbman_swp_init(const struct qbman_swp_desc *d)
                                1, /* dequeue stashing priority == TRUE */
                                0, /* dequeue stashing enable == FALSE */
                                0); /* EQCR_CI stashing priority == FALSE */
+       if ((p->desc->qman_version & QMAN_REV_MASK) >= QMAN_REV_5000)
+               reg |= 1 << SWP_CFG_CPBS_SHIFT | /* memory-backed mode */
+                      1 << SWP_CFG_VPM_SHIFT |  /* VDQCR read triggered mode */
+                      1 << SWP_CFG_CPM_SHIFT;   /* CR read triggered mode */
 
        qbman_write_register(p, QBMAN_CINH_SWP_CFG, reg);
        reg = qbman_read_register(p, QBMAN_CINH_SWP_CFG);
@@ -184,6 +214,10 @@ struct qbman_swp *qbman_swp_init(const struct qbman_swp_desc *d)
                return NULL;
        }
 
+       if ((p->desc->qman_version & QMAN_REV_MASK) >= QMAN_REV_5000) {
+               qbman_write_register(p, QBMAN_CINH_SWP_EQCR_PI, QMAN_RT_MODE);
+               qbman_write_register(p, QBMAN_CINH_SWP_RCR_PI, QMAN_RT_MODE);
+       }
        /*
         * SDQCR needs to be initialized to 0 when no channels are
         * being dequeued from or else the QMan HW will indicate an
@@ -278,7 +312,10 @@ void qbman_swp_interrupt_set_inhibit(struct qbman_swp *p, int inhibit)
  */
 void *qbman_swp_mc_start(struct qbman_swp *p)
 {
-       return qbman_get_cmd(p, QBMAN_CENA_SWP_CR);
+       if ((p->desc->qman_version & QMAN_REV_MASK) < QMAN_REV_5000)
+               return qbman_get_cmd(p, QBMAN_CENA_SWP_CR);
+       else
+               return qbman_get_cmd(p, QBMAN_CENA_SWP_CR_MEM);
 }
 
 /*
@@ -289,8 +326,14 @@ void qbman_swp_mc_submit(struct qbman_swp *p, void *cmd, u8 cmd_verb)
 {
        u8 *v = cmd;
 
-       dma_wmb();
-       *v = cmd_verb | p->mc.valid_bit;
+       if ((p->desc->qman_version & QMAN_REV_MASK) < QMAN_REV_5000) {
+               dma_wmb();
+               *v = cmd_verb | p->mc.valid_bit;
+       } else {
+               *v = cmd_verb | p->mc.valid_bit;
+               dma_wmb();
+               qbman_write_register(p, QBMAN_CINH_SWP_CR_RT, QMAN_RT_MODE);
+       }
 }
 
 /*
@@ -301,13 +344,27 @@ void *qbman_swp_mc_result(struct qbman_swp *p)
 {
        u32 *ret, verb;
 
-       ret = qbman_get_cmd(p, QBMAN_CENA_SWP_RR(p->mc.valid_bit));
+       if ((p->desc->qman_version & QMAN_REV_MASK) < QMAN_REV_5000) {
+               ret = qbman_get_cmd(p, QBMAN_CENA_SWP_RR(p->mc.valid_bit));
+               /* Remove the valid-bit - command completed if the rest
+                * is non-zero.
+                */
+               verb = ret[0] & ~QB_VALID_BIT;
+               if (!verb)
+                       return NULL;
+               p->mc.valid_bit ^= QB_VALID_BIT;
+       } else {
+               ret = qbman_get_cmd(p, QBMAN_CENA_SWP_RR_MEM);
+               /* Command completed if the valid bit is toggled */
+               if (p->mr.valid_bit != (ret[0] & QB_VALID_BIT))
+                       return NULL;
+               /* Command completed if the rest is non-zero */
+               verb = ret[0] & ~QB_VALID_BIT;
+               if (!verb)
+                       return NULL;
+               p->mr.valid_bit ^= QB_VALID_BIT;
+       }
 
-       /* Remove the valid-bit - command completed if the rest is non-zero */
-       verb = ret[0] & ~QB_VALID_BIT;
-       if (!verb)
-               return NULL;
-       p->mc.valid_bit ^= QB_VALID_BIT;
        return ret;
 }
 
@@ -384,6 +441,18 @@ void qbman_eq_desc_set_qd(struct qbman_eq_desc *d, u32 qdid,
 #define EQAR_VB(eqar)      ((eqar) & 0x80)
 #define EQAR_SUCCESS(eqar) ((eqar) & 0x100)
 
+static inline void qbman_write_eqcr_am_rt_register(struct qbman_swp *p,
+                                                  u8 idx)
+{
+       if (idx < 16)
+               qbman_write_register(p, QBMAN_CINH_SWP_EQCR_AM_RT + idx * 4,
+                                    QMAN_RT_MODE);
+       else
+               qbman_write_register(p, QBMAN_CINH_SWP_EQCR_AM_RT2 +
+                                    (idx - 16) * 4,
+                                    QMAN_RT_MODE);
+}
+
 /**
  * qbman_swp_enqueue() - Issue an enqueue command
  * @s:  the software portal used for enqueue
@@ -408,9 +477,15 @@ int qbman_swp_enqueue(struct qbman_swp *s, const struct qbman_eq_desc *d,
        memcpy(&p->dca, &d->dca, 31);
        memcpy(&p->fd, fd, sizeof(*fd));
 
-       /* Set the verb byte, have to substitute in the valid-bit */
-       dma_wmb();
-       p->verb = d->verb | EQAR_VB(eqar);
+       if ((s->desc->qman_version & QMAN_REV_MASK) < QMAN_REV_5000) {
+               /* Set the verb byte, have to substitute in the valid-bit */
+               dma_wmb();
+               p->verb = d->verb | EQAR_VB(eqar);
+       } else {
+               p->verb = d->verb | EQAR_VB(eqar);
+               dma_wmb();
+               qbman_write_eqcr_am_rt_register(s, EQAR_IDX(eqar));
+       }
 
        return 0;
 }
@@ -587,17 +662,27 @@ int qbman_swp_pull(struct qbman_swp *s, struct qbman_pull_desc *d)
                return -EBUSY;
        }
        s->vdq.storage = (void *)(uintptr_t)d->rsp_addr_virt;
-       p = qbman_get_cmd(s, QBMAN_CENA_SWP_VDQCR);
+       if ((s->desc->qman_version & QMAN_REV_MASK) < QMAN_REV_5000)
+               p = qbman_get_cmd(s, QBMAN_CENA_SWP_VDQCR);
+       else
+               p = qbman_get_cmd(s, QBMAN_CENA_SWP_VDQCR_MEM);
        p->numf = d->numf;
        p->tok = QMAN_DQ_TOKEN_VALID;
        p->dq_src = d->dq_src;
        p->rsp_addr = d->rsp_addr;
        p->rsp_addr_virt = d->rsp_addr_virt;
-       dma_wmb();
 
-       /* Set the verb byte, have to substitute in the valid-bit */
-       p->verb = d->verb | s->vdq.valid_bit;
-       s->vdq.valid_bit ^= QB_VALID_BIT;
+       if ((s->desc->qman_version & QMAN_REV_MASK) < QMAN_REV_5000) {
+               dma_wmb();
+               /* Set the verb byte, have to substitute in the valid-bit */
+               p->verb = d->verb | s->vdq.valid_bit;
+               s->vdq.valid_bit ^= QB_VALID_BIT;
+       } else {
+               p->verb = d->verb | s->vdq.valid_bit;
+               s->vdq.valid_bit ^= QB_VALID_BIT;
+               dma_wmb();
+               qbman_write_register(s, QBMAN_CINH_SWP_VDQCR_RT, QMAN_RT_MODE);
+       }
 
        return 0;
 }
@@ -655,7 +740,10 @@ const struct dpaa2_dq *qbman_swp_dqrr_next(struct qbman_swp *s)
                                       QBMAN_CENA_SWP_DQRR(s->dqrr.next_idx)));
        }
 
-       p = qbman_get_cmd(s, QBMAN_CENA_SWP_DQRR(s->dqrr.next_idx));
+       if ((s->desc->qman_version & QMAN_REV_MASK) < QMAN_REV_5000)
+               p = qbman_get_cmd(s, QBMAN_CENA_SWP_DQRR(s->dqrr.next_idx));
+       else
+               p = qbman_get_cmd(s, QBMAN_CENA_SWP_DQRR_MEM(s->dqrr.next_idx));
        verb = p->dq.verb;
 
        /*
@@ -807,18 +895,28 @@ int qbman_swp_release(struct qbman_swp *s, const struct qbman_release_desc *d,
                return -EBUSY;
 
        /* Start the release command */
-       p = qbman_get_cmd(s, QBMAN_CENA_SWP_RCR(RAR_IDX(rar)));
+       if ((s->desc->qman_version & QMAN_REV_MASK) < QMAN_REV_5000)
+               p = qbman_get_cmd(s, QBMAN_CENA_SWP_RCR(RAR_IDX(rar)));
+       else
+               p = qbman_get_cmd(s, QBMAN_CENA_SWP_RCR_MEM(RAR_IDX(rar)));
        /* Copy the caller's buffer pointers to the command */
        for (i = 0; i < num_buffers; i++)
                p->buf[i] = cpu_to_le64(buffers[i]);
        p->bpid = d->bpid;
 
-       /*
-        * Set the verb byte, have to substitute in the valid-bit and the number
-        * of buffers.
-        */
-       dma_wmb();
-       p->verb = d->verb | RAR_VB(rar) | num_buffers;
+       if ((s->desc->qman_version & QMAN_REV_MASK) < QMAN_REV_5000) {
+               /*
+                * Set the verb byte, have to substitute in the valid-bit
+                * and the number of buffers.
+                */
+               dma_wmb();
+               p->verb = d->verb | RAR_VB(rar) | num_buffers;
+       } else {
+               p->verb = d->verb | RAR_VB(rar) | num_buffers;
+               dma_wmb();
+               qbman_write_register(s, QBMAN_CINH_SWP_RCR_AM_RT +
+                                    RAR_IDX(rar)  * 4, QMAN_RT_MODE);
+       }
 
        return 0;
 }
index fa35fc1afeaa281432eed5ac686447a3fee17ac8..f3ec5d2044fb0fa9529e6e11137f3c6552092a70 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
 /*
  * Copyright (C) 2014-2016 Freescale Semiconductor, Inc.
- * Copyright 2016 NXP
+ * Copyright 2016-2019 NXP
  *
  */
 #ifndef __FSL_QBMAN_PORTAL_H
@@ -110,6 +110,11 @@ struct qbman_swp {
                u32 valid_bit; /* 0x00 or 0x80 */
        } mc;
 
+       /* Management response */
+       struct {
+               u32 valid_bit; /* 0x00 or 0x80 */
+       } mr;
+
        /* Push dequeues */
        u32 sdq;
 
@@ -428,7 +433,7 @@ static inline int qbman_swp_CDAN_set_context_enable(struct qbman_swp *s,
 static inline void *qbman_swp_mc_complete(struct qbman_swp *swp, void *cmd,
                                          u8 cmd_verb)
 {
-       int loopvar = 1000;
+       int loopvar = 2000;
 
        qbman_swp_mc_submit(swp, cmd, cmd_verb);
 
index 78607da7320e1176f64dd002c3f779a04c1b08aa..1ef8068c8dd3583aa0fcf5e94db77a6a4087d7a7 100644 (file)
@@ -97,6 +97,11 @@ static const struct fsl_soc_die_attr fsl_soc_die[] = {
          .svr          = 0x87000000,
          .mask         = 0xfff70000,
        },
+       /* Die: LX2160A, SoC: LX2160A/LX2120A/LX2080A */
+       { .die          = "LX2160A",
+         .svr          = 0x87360000,
+         .mask         = 0xff3f0000,
+       },
        { },
 };
 
@@ -218,6 +223,7 @@ static const struct of_device_id fsl_guts_of_match[] = {
        { .compatible = "fsl,ls1088a-dcfg", },
        { .compatible = "fsl,ls1012a-dcfg", },
        { .compatible = "fsl,ls1046a-dcfg", },
+       { .compatible = "fsl,lx2160a-dcfg", },
        {}
 };
 MODULE_DEVICE_TABLE(of, fsl_guts_of_match);
index 2c95cf59f3e7c55372cf4d57de0bb3480a61326b..cf4f10d6f590082eee2ca43ce8611760ccb00034 100644 (file)
@@ -32,6 +32,7 @@
 
 static struct bman_portal *affine_bportals[NR_CPUS];
 static struct cpumask portal_cpus;
+static int __bman_portals_probed;
 /* protect bman global registers and global data shared among portals */
 static DEFINE_SPINLOCK(bman_lock);
 
@@ -87,6 +88,12 @@ static int bman_online_cpu(unsigned int cpu)
        return 0;
 }
 
+int bman_portals_probed(void)
+{
+       return __bman_portals_probed;
+}
+EXPORT_SYMBOL_GPL(bman_portals_probed);
+
 static int bman_portal_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
@@ -104,8 +111,10 @@ static int bman_portal_probe(struct platform_device *pdev)
        }
 
        pcfg = devm_kmalloc(dev, sizeof(*pcfg), GFP_KERNEL);
-       if (!pcfg)
+       if (!pcfg) {
+               __bman_portals_probed = -1;
                return -ENOMEM;
+       }
 
        pcfg->dev = dev;
 
@@ -113,14 +122,14 @@ static int bman_portal_probe(struct platform_device *pdev)
                                             DPAA_PORTAL_CE);
        if (!addr_phys[0]) {
                dev_err(dev, "Can't get %pOF property 'reg::CE'\n", node);
-               return -ENXIO;
+               goto err_ioremap1;
        }
 
        addr_phys[1] = platform_get_resource(pdev, IORESOURCE_MEM,
                                             DPAA_PORTAL_CI);
        if (!addr_phys[1]) {
                dev_err(dev, "Can't get %pOF property 'reg::CI'\n", node);
-               return -ENXIO;
+               goto err_ioremap1;
        }
 
        pcfg->cpu = -1;
@@ -128,7 +137,7 @@ static int bman_portal_probe(struct platform_device *pdev)
        irq = platform_get_irq(pdev, 0);
        if (irq <= 0) {
                dev_err(dev, "Can't get %pOF IRQ'\n", node);
-               return -ENXIO;
+               goto err_ioremap1;
        }
        pcfg->irq = irq;
 
@@ -150,6 +159,7 @@ static int bman_portal_probe(struct platform_device *pdev)
        spin_lock(&bman_lock);
        cpu = cpumask_next_zero(-1, &portal_cpus);
        if (cpu >= nr_cpu_ids) {
+               __bman_portals_probed = 1;
                /* unassigned portal, skip init */
                spin_unlock(&bman_lock);
                return 0;
@@ -175,6 +185,8 @@ err_portal_init:
 err_ioremap2:
        memunmap(pcfg->addr_virt_ce);
 err_ioremap1:
+        __bman_portals_probed = -1;
+
        return -ENXIO;
 }
 
index 109b38de3176e6db12bf377b73a0e5c9bb94b1ff..a6bb43007d03ff42ae5a1e21715ed4eb3ddcd2af 100644 (file)
@@ -596,7 +596,7 @@ static int qman_init_ccsr(struct device *dev)
 }
 
 #define LIO_CFG_LIODN_MASK 0x0fff0000
-void qman_liodn_fixup(u16 channel)
+void __qman_liodn_fixup(u16 channel)
 {
        static int done;
        static u32 liodn_offset;
index 661c9b234d32bc04da676e54e5568c0a10e3a0b4..e2186b681d87a5abf013622979a72610dae1ea54 100644 (file)
@@ -38,6 +38,7 @@ EXPORT_SYMBOL(qman_dma_portal);
 #define CONFIG_FSL_DPA_PIRQ_FAST  1
 
 static struct cpumask portal_cpus;
+static int __qman_portals_probed;
 /* protect qman global registers and global data shared among portals */
 static DEFINE_SPINLOCK(qman_lock);
 
@@ -220,6 +221,12 @@ static int qman_online_cpu(unsigned int cpu)
        return 0;
 }
 
+int qman_portals_probed(void)
+{
+       return __qman_portals_probed;
+}
+EXPORT_SYMBOL_GPL(qman_portals_probed);
+
 static int qman_portal_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
@@ -238,8 +245,10 @@ static int qman_portal_probe(struct platform_device *pdev)
        }
 
        pcfg = devm_kmalloc(dev, sizeof(*pcfg), GFP_KERNEL);
-       if (!pcfg)
+       if (!pcfg) {
+               __qman_portals_probed = -1;
                return -ENOMEM;
+       }
 
        pcfg->dev = dev;
 
@@ -247,19 +256,20 @@ static int qman_portal_probe(struct platform_device *pdev)
                                             DPAA_PORTAL_CE);
        if (!addr_phys[0]) {
                dev_err(dev, "Can't get %pOF property 'reg::CE'\n", node);
-               return -ENXIO;
+               goto err_ioremap1;
        }
 
        addr_phys[1] = platform_get_resource(pdev, IORESOURCE_MEM,
                                             DPAA_PORTAL_CI);
        if (!addr_phys[1]) {
                dev_err(dev, "Can't get %pOF property 'reg::CI'\n", node);
-               return -ENXIO;
+               goto err_ioremap1;
        }
 
        err = of_property_read_u32(node, "cell-index", &val);
        if (err) {
                dev_err(dev, "Can't get %pOF property 'cell-index'\n", node);
+               __qman_portals_probed = -1;
                return err;
        }
        pcfg->channel = val;
@@ -267,7 +277,7 @@ static int qman_portal_probe(struct platform_device *pdev)
        irq = platform_get_irq(pdev, 0);
        if (irq <= 0) {
                dev_err(dev, "Can't get %pOF IRQ\n", node);
-               return -ENXIO;
+               goto err_ioremap1;
        }
        pcfg->irq = irq;
 
@@ -291,6 +301,7 @@ static int qman_portal_probe(struct platform_device *pdev)
        spin_lock(&qman_lock);
        cpu = cpumask_next_zero(-1, &portal_cpus);
        if (cpu >= nr_cpu_ids) {
+               __qman_portals_probed = 1;
                /* unassigned portal, skip init */
                spin_unlock(&qman_lock);
                return 0;
@@ -321,6 +332,8 @@ err_portal_init:
 err_ioremap2:
        memunmap(pcfg->addr_virt_ce);
 err_ioremap1:
+       __qman_portals_probed = -1;
+
        return -ENXIO;
 }
 
index 75a8f905f8f7c3cf787e76812497c6888030b378..04515718cfd937e53c84fb2ca87410996494981a 100644 (file)
@@ -193,7 +193,14 @@ extern struct gen_pool *qm_cgralloc; /* CGR ID allocator */
 u32 qm_get_pools_sdqcr(void);
 
 int qman_wq_alloc(void);
-void qman_liodn_fixup(u16 channel);
+#ifdef CONFIG_FSL_PAMU
+#define qman_liodn_fixup __qman_liodn_fixup
+#else
+static inline void qman_liodn_fixup(u16 channel)
+{
+}
+#endif
+void __qman_liodn_fixup(u16 channel);
 void qman_set_sdest(u16 channel, unsigned int cpu_idx);
 
 struct qman_portal *qman_create_affine_portal(
index ade1b46d669c1f645000a4dc8f000ef9d6342ef1..8aaebf13e2e6a2d096c691202832996ce87be63a 100644 (file)
@@ -8,4 +8,13 @@ config IMX_GPCV2_PM_DOMAINS
        select PM_GENERIC_DOMAINS
        default y if SOC_IMX7D
 
+config IMX_SCU_SOC
+       bool "i.MX System Controller Unit SoC info support"
+       depends on IMX_SCU
+       select SOC_BUS
+       help
+         If you say yes here you get support for the NXP i.MX System
+         Controller Unit SoC info module, it will provide the SoC info
+         like SoC family, ID and revision etc.
+
 endmenu
index caa8653600f26f966c71f174e288c9c04608a864..cf9ca42ff7394ec68713e40fc7d4be1f58a0c3bf 100644 (file)
@@ -2,3 +2,4 @@
 obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o
 obj-$(CONFIG_IMX_GPCV2_PM_DOMAINS) += gpcv2.o
 obj-$(CONFIG_ARCH_MXC) += soc-imx8.o
+obj-$(CONFIG_IMX_SCU_SOC) += soc-imx-scu.o
diff --git a/drivers/soc/imx/soc-imx-scu.c b/drivers/soc/imx/soc-imx-scu.c
new file mode 100644 (file)
index 0000000..676f612
--- /dev/null
@@ -0,0 +1,144 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2019 NXP.
+ */
+
+#include <dt-bindings/firmware/imx/rsrc.h>
+#include <linux/firmware/imx/sci.h>
+#include <linux/slab.h>
+#include <linux/sys_soc.h>
+#include <linux/platform_device.h>
+#include <linux/of.h>
+
+#define IMX_SCU_SOC_DRIVER_NAME                "imx-scu-soc"
+
+static struct imx_sc_ipc *soc_ipc_handle;
+
+struct imx_sc_msg_misc_get_soc_id {
+       struct imx_sc_rpc_msg hdr;
+       union {
+               struct {
+                       u32 control;
+                       u16 resource;
+               } __packed req;
+               struct {
+                       u32 id;
+               } resp;
+       } data;
+} __packed;
+
+static int imx_scu_soc_id(void)
+{
+       struct imx_sc_msg_misc_get_soc_id msg;
+       struct imx_sc_rpc_msg *hdr = &msg.hdr;
+       int ret;
+
+       hdr->ver = IMX_SC_RPC_VERSION;
+       hdr->svc = IMX_SC_RPC_SVC_MISC;
+       hdr->func = IMX_SC_MISC_FUNC_GET_CONTROL;
+       hdr->size = 3;
+
+       msg.data.req.control = IMX_SC_C_ID;
+       msg.data.req.resource = IMX_SC_R_SYSTEM;
+
+       ret = imx_scu_call_rpc(soc_ipc_handle, &msg, true);
+       if (ret) {
+               pr_err("%s: get soc info failed, ret %d\n", __func__, ret);
+               return ret;
+       }
+
+       return msg.data.resp.id;
+}
+
+static int imx_scu_soc_probe(struct platform_device *pdev)
+{
+       struct soc_device_attribute *soc_dev_attr;
+       struct soc_device *soc_dev;
+       int id, ret;
+       u32 val;
+
+       ret = imx_scu_get_handle(&soc_ipc_handle);
+       if (ret)
+               return ret;
+
+       soc_dev_attr = devm_kzalloc(&pdev->dev, sizeof(*soc_dev_attr),
+                                   GFP_KERNEL);
+       if (!soc_dev_attr)
+               return -ENOMEM;
+
+       soc_dev_attr->family = "Freescale i.MX";
+
+       ret = of_property_read_string(of_root,
+                                     "model",
+                                     &soc_dev_attr->machine);
+       if (ret)
+               return ret;
+
+       id = imx_scu_soc_id();
+       if (id < 0)
+               return -EINVAL;
+
+       /* format soc_id value passed from SCU firmware */
+       val = id & 0x1f;
+       soc_dev_attr->soc_id = kasprintf(GFP_KERNEL, "0x%x", val);
+       if (!soc_dev_attr->soc_id)
+               return -ENOMEM;
+
+       /* format revision value passed from SCU firmware */
+       val = (id >> 5) & 0xf;
+       val = (((val >> 2) + 1) << 4) | (val & 0x3);
+       soc_dev_attr->revision = kasprintf(GFP_KERNEL,
+                                          "%d.%d",
+                                          (val >> 4) & 0xf,
+                                          val & 0xf);
+       if (!soc_dev_attr->revision) {
+               ret = -ENOMEM;
+               goto free_soc_id;
+       }
+
+       soc_dev = soc_device_register(soc_dev_attr);
+       if (IS_ERR(soc_dev)) {
+               ret = PTR_ERR(soc_dev);
+               goto free_revision;
+       }
+
+       return 0;
+
+free_revision:
+       kfree(soc_dev_attr->revision);
+free_soc_id:
+       kfree(soc_dev_attr->soc_id);
+       return ret;
+}
+
+static struct platform_driver imx_scu_soc_driver = {
+       .driver = {
+               .name = IMX_SCU_SOC_DRIVER_NAME,
+       },
+       .probe = imx_scu_soc_probe,
+};
+
+static int __init imx_scu_soc_init(void)
+{
+       struct platform_device *pdev;
+       struct device_node *np;
+       int ret;
+
+       np = of_find_compatible_node(NULL, NULL, "fsl,imx-scu");
+       if (!np)
+               return -ENODEV;
+
+       of_node_put(np);
+
+       ret = platform_driver_register(&imx_scu_soc_driver);
+       if (ret)
+               return ret;
+
+       pdev = platform_device_register_simple(IMX_SCU_SOC_DRIVER_NAME,
+                                              -1, NULL, 0);
+       if (IS_ERR(pdev))
+               platform_driver_unregister(&imx_scu_soc_driver);
+
+       return PTR_ERR_OR_ZERO(pdev);
+}
+device_initcall(imx_scu_soc_init);
index b1bd8e2543ac529b1c581c4617e192bf89bca1a0..f924ae8c65141a6d968e200b075123380a72a256 100644 (file)
@@ -16,6 +16,9 @@
 #define IMX8MQ_SW_INFO_B1              0x40
 #define IMX8MQ_SW_MAGIC_B1             0xff0055aa
 
+/* Same as ANADIG_DIGPROG_IMX7D */
+#define ANADIG_DIGPROG_IMX8MM  0x800
+
 struct imx8_soc_data {
        char *name;
        u32 (*soc_revision)(void);
@@ -46,13 +49,45 @@ out:
        return rev;
 }
 
+static u32 __init imx8mm_soc_revision(void)
+{
+       struct device_node *np;
+       void __iomem *anatop_base;
+       u32 rev;
+
+       np = of_find_compatible_node(NULL, NULL, "fsl,imx8mm-anatop");
+       if (!np)
+               return 0;
+
+       anatop_base = of_iomap(np, 0);
+       WARN_ON(!anatop_base);
+
+       rev = readl_relaxed(anatop_base + ANADIG_DIGPROG_IMX8MM);
+
+       iounmap(anatop_base);
+       of_node_put(np);
+       return rev;
+}
+
 static const struct imx8_soc_data imx8mq_soc_data = {
        .name = "i.MX8MQ",
        .soc_revision = imx8mq_soc_revision,
 };
 
+static const struct imx8_soc_data imx8mm_soc_data = {
+       .name = "i.MX8MM",
+       .soc_revision = imx8mm_soc_revision,
+};
+
+static const struct imx8_soc_data imx8mn_soc_data = {
+       .name = "i.MX8MN",
+       .soc_revision = imx8mm_soc_revision,
+};
+
 static const struct of_device_id imx8_soc_match[] = {
        { .compatible = "fsl,imx8mq", .data = &imx8mq_soc_data, },
+       { .compatible = "fsl,imx8mm", .data = &imx8mm_soc_data, },
+       { .compatible = "fsl,imx8mn", .data = &imx8mn_soc_data, },
        { }
 };
 
@@ -65,7 +100,6 @@ static int __init imx8_soc_init(void)
 {
        struct soc_device_attribute *soc_dev_attr;
        struct soc_device *soc_dev;
-       struct device_node *root;
        const struct of_device_id *id;
        u32 soc_rev = 0;
        const struct imx8_soc_data *data;
@@ -73,20 +107,19 @@ static int __init imx8_soc_init(void)
 
        soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
        if (!soc_dev_attr)
-               return -ENODEV;
+               return -ENOMEM;
 
        soc_dev_attr->family = "Freescale i.MX";
 
-       root = of_find_node_by_path("/");
-       ret = of_property_read_string(root, "model", &soc_dev_attr->machine);
+       ret = of_property_read_string(of_root, "model", &soc_dev_attr->machine);
        if (ret)
                goto free_soc;
 
-       id = of_match_node(imx8_soc_match, root);
-       if (!id)
+       id = of_match_node(imx8_soc_match, of_root);
+       if (!id) {
+               ret = -ENODEV;
                goto free_soc;
-
-       of_node_put(root);
+       }
 
        data = id->data;
        if (data) {
@@ -96,12 +129,16 @@ static int __init imx8_soc_init(void)
        }
 
        soc_dev_attr->revision = imx8_revision(soc_rev);
-       if (!soc_dev_attr->revision)
+       if (!soc_dev_attr->revision) {
+               ret = -ENOMEM;
                goto free_soc;
+       }
 
        soc_dev = soc_device_register(soc_dev_attr);
-       if (IS_ERR(soc_dev))
+       if (IS_ERR(soc_dev)) {
+               ret = PTR_ERR(soc_dev);
                goto free_rev;
+       }
 
        if (IS_ENABLED(CONFIG_ARM_IMX_CPUFREQ_DT))
                platform_device_register_simple("imx-cpufreq-dt", -1, NULL, 0);
@@ -109,10 +146,10 @@ static int __init imx8_soc_init(void)
        return 0;
 
 free_rev:
-       kfree(soc_dev_attr->revision);
+       if (strcmp(soc_dev_attr->revision, "unknown"))
+               kfree(soc_dev_attr->revision);
 free_soc:
        kfree(soc_dev_attr);
-       of_node_put(root);
-       return -ENODEV;
+       return ret;
 }
 device_initcall(imx8_soc_init);
index 880cf029096252e65caa6d7b1d13a7c039602ade..a6d1bfb17279eb4e1af50956c75cb51ffdc70294 100644 (file)
@@ -4,6 +4,18 @@
 #
 menu "Qualcomm SoC drivers"
 
+config QCOM_AOSS_QMP
+       tristate "Qualcomm AOSS Driver"
+       depends on ARCH_QCOM || COMPILE_TEST
+       depends on MAILBOX
+       depends on COMMON_CLK && PM
+       select PM_GENERIC_DOMAINS
+       help
+         This driver provides the means of communicating with and controlling
+         the low-power state for resources related to the remoteproc
+         subsystems as well as controlling the debug clocks exposed by the Always On
+         Subsystem (AOSS) using Qualcomm Messaging Protocol (QMP).
+
 config QCOM_COMMAND_DB
        bool "Qualcomm Command DB"
        depends on ARCH_QCOM || COMPILE_TEST
index ffe519b0cb6694f7db627d03a820f40dbaff66d5..eeb088beb15f6c8cbe72ea50d52ef99d901cb1ca 100644 (file)
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 CFLAGS_rpmh-rsc.o := -I$(src)
+obj-$(CONFIG_QCOM_AOSS_QMP) += qcom_aoss.o
 obj-$(CONFIG_QCOM_GENI_SE) +=  qcom-geni-se.o
 obj-$(CONFIG_QCOM_COMMAND_DB) += cmd-db.o
 obj-$(CONFIG_QCOM_GLINK_SSR) +=        glink_ssr.o
index 74f8b9607daa16fc3e7bbd6e26e6fcd67244dcde..4fcc32420c4740d3988339f83dcf923db4cfb709 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/spinlock.h>
 #include <linux/idr.h>
 #include <linux/slab.h>
+#include <linux/workqueue.h>
 #include <linux/of_device.h>
 #include <linux/soc/qcom/apr.h>
 #include <linux/rpmsg.h>
@@ -17,8 +18,18 @@ struct apr {
        struct rpmsg_endpoint *ch;
        struct device *dev;
        spinlock_t svcs_lock;
+       spinlock_t rx_lock;
        struct idr svcs_idr;
        int dest_domain_id;
+       struct workqueue_struct *rxwq;
+       struct work_struct rx_work;
+       struct list_head rx_list;
+};
+
+struct apr_rx_buf {
+       struct list_head node;
+       int len;
+       uint8_t buf[];
 };
 
 /**
@@ -62,11 +73,7 @@ static int apr_callback(struct rpmsg_device *rpdev, void *buf,
                                  int len, void *priv, u32 addr)
 {
        struct apr *apr = dev_get_drvdata(&rpdev->dev);
-       uint16_t hdr_size, msg_type, ver, svc_id;
-       struct apr_device *svc = NULL;
-       struct apr_driver *adrv = NULL;
-       struct apr_resp_pkt resp;
-       struct apr_hdr *hdr;
+       struct apr_rx_buf *abuf;
        unsigned long flags;
 
        if (len <= APR_HDR_SIZE) {
@@ -75,6 +82,34 @@ static int apr_callback(struct rpmsg_device *rpdev, void *buf,
                return -EINVAL;
        }
 
+       abuf = kzalloc(sizeof(*abuf) + len, GFP_ATOMIC);
+       if (!abuf)
+               return -ENOMEM;
+
+       abuf->len = len;
+       memcpy(abuf->buf, buf, len);
+
+       spin_lock_irqsave(&apr->rx_lock, flags);
+       list_add_tail(&abuf->node, &apr->rx_list);
+       spin_unlock_irqrestore(&apr->rx_lock, flags);
+
+       queue_work(apr->rxwq, &apr->rx_work);
+
+       return 0;
+}
+
+
+static int apr_do_rx_callback(struct apr *apr, struct apr_rx_buf *abuf)
+{
+       uint16_t hdr_size, msg_type, ver, svc_id;
+       struct apr_device *svc = NULL;
+       struct apr_driver *adrv = NULL;
+       struct apr_resp_pkt resp;
+       struct apr_hdr *hdr;
+       unsigned long flags;
+       void *buf = abuf->buf;
+       int len = abuf->len;
+
        hdr = buf;
        ver = APR_HDR_FIELD_VER(hdr->hdr_field);
        if (ver > APR_PKT_VER + 1)
@@ -132,6 +167,23 @@ static int apr_callback(struct rpmsg_device *rpdev, void *buf,
        return 0;
 }
 
+static void apr_rxwq(struct work_struct *work)
+{
+       struct apr *apr = container_of(work, struct apr, rx_work);
+       struct apr_rx_buf *abuf, *b;
+       unsigned long flags;
+
+       if (!list_empty(&apr->rx_list)) {
+               list_for_each_entry_safe(abuf, b, &apr->rx_list, node) {
+                       apr_do_rx_callback(apr, abuf);
+                       spin_lock_irqsave(&apr->rx_lock, flags);
+                       list_del(&abuf->node);
+                       spin_unlock_irqrestore(&apr->rx_lock, flags);
+                       kfree(abuf);
+               }
+       }
+}
+
 static int apr_device_match(struct device *dev, struct device_driver *drv)
 {
        struct apr_device *adev = to_apr_device(dev);
@@ -276,7 +328,7 @@ static int apr_probe(struct rpmsg_device *rpdev)
        if (!apr)
                return -ENOMEM;
 
-       ret = of_property_read_u32(dev->of_node, "reg", &apr->dest_domain_id);
+       ret = of_property_read_u32(dev->of_node, "qcom,apr-domain", &apr->dest_domain_id);
        if (ret) {
                dev_err(dev, "APR Domain ID not specified in DT\n");
                return ret;
@@ -285,6 +337,14 @@ static int apr_probe(struct rpmsg_device *rpdev)
        dev_set_drvdata(dev, apr);
        apr->ch = rpdev->ept;
        apr->dev = dev;
+       apr->rxwq = create_singlethread_workqueue("qcom_apr_rx");
+       if (!apr->rxwq) {
+               dev_err(apr->dev, "Failed to start Rx WQ\n");
+               return -ENOMEM;
+       }
+       INIT_WORK(&apr->rx_work, apr_rxwq);
+       INIT_LIST_HEAD(&apr->rx_list);
+       spin_lock_init(&apr->rx_lock);
        spin_lock_init(&apr->svcs_lock);
        idr_init(&apr->svcs_idr);
        of_register_apr_devices(dev);
@@ -303,7 +363,11 @@ static int apr_remove_device(struct device *dev, void *null)
 
 static void apr_remove(struct rpmsg_device *rpdev)
 {
+       struct apr *apr = dev_get_drvdata(&rpdev->dev);
+
        device_for_each_child(&rpdev->dev, NULL, apr_remove_device);
+       flush_workqueue(apr->rxwq);
+       destroy_workqueue(apr->rxwq);
 }
 
 /*
diff --git a/drivers/soc/qcom/qcom_aoss.c b/drivers/soc/qcom/qcom_aoss.c
new file mode 100644 (file)
index 0000000..5f88519
--- /dev/null
@@ -0,0 +1,480 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019, Linaro Ltd
+ */
+#include <dt-bindings/power/qcom-aoss-qmp.h>
+#include <linux/clk-provider.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/mailbox_client.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/pm_domain.h>
+
+#define QMP_DESC_MAGIC                 0x0
+#define QMP_DESC_VERSION               0x4
+#define QMP_DESC_FEATURES              0x8
+
+/* AOP-side offsets */
+#define QMP_DESC_UCORE_LINK_STATE      0xc
+#define QMP_DESC_UCORE_LINK_STATE_ACK  0x10
+#define QMP_DESC_UCORE_CH_STATE                0x14
+#define QMP_DESC_UCORE_CH_STATE_ACK    0x18
+#define QMP_DESC_UCORE_MBOX_SIZE       0x1c
+#define QMP_DESC_UCORE_MBOX_OFFSET     0x20
+
+/* Linux-side offsets */
+#define QMP_DESC_MCORE_LINK_STATE      0x24
+#define QMP_DESC_MCORE_LINK_STATE_ACK  0x28
+#define QMP_DESC_MCORE_CH_STATE                0x2c
+#define QMP_DESC_MCORE_CH_STATE_ACK    0x30
+#define QMP_DESC_MCORE_MBOX_SIZE       0x34
+#define QMP_DESC_MCORE_MBOX_OFFSET     0x38
+
+#define QMP_STATE_UP                   GENMASK(15, 0)
+#define QMP_STATE_DOWN                 GENMASK(31, 16)
+
+#define QMP_MAGIC                      0x4d41494c /* mail */
+#define QMP_VERSION                    1
+
+/* 64 bytes is enough to store the requests and provides padding to 4 bytes */
+#define QMP_MSG_LEN                    64
+
+/**
+ * struct qmp - driver state for QMP implementation
+ * @msgram: iomem referencing the message RAM used for communication
+ * @dev: reference to QMP device
+ * @mbox_client: mailbox client used to ring the doorbell on transmit
+ * @mbox_chan: mailbox channel used to ring the doorbell on transmit
+ * @offset: offset within @msgram where messages should be written
+ * @size: maximum size of the messages to be transmitted
+ * @event: wait_queue for synchronization with the IRQ
+ * @tx_lock: provides synchronization between multiple callers of qmp_send()
+ * @qdss_clk: QDSS clock hw struct
+ * @pd_data: genpd data
+ */
+struct qmp {
+       void __iomem *msgram;
+       struct device *dev;
+
+       struct mbox_client mbox_client;
+       struct mbox_chan *mbox_chan;
+
+       size_t offset;
+       size_t size;
+
+       wait_queue_head_t event;
+
+       struct mutex tx_lock;
+
+       struct clk_hw qdss_clk;
+       struct genpd_onecell_data pd_data;
+};
+
+struct qmp_pd {
+       struct qmp *qmp;
+       struct generic_pm_domain pd;
+};
+
+#define to_qmp_pd_resource(res) container_of(res, struct qmp_pd, pd)
+
+static void qmp_kick(struct qmp *qmp)
+{
+       mbox_send_message(qmp->mbox_chan, NULL);
+       mbox_client_txdone(qmp->mbox_chan, 0);
+}
+
+static bool qmp_magic_valid(struct qmp *qmp)
+{
+       return readl(qmp->msgram + QMP_DESC_MAGIC) == QMP_MAGIC;
+}
+
+static bool qmp_link_acked(struct qmp *qmp)
+{
+       return readl(qmp->msgram + QMP_DESC_MCORE_LINK_STATE_ACK) == QMP_STATE_UP;
+}
+
+static bool qmp_mcore_channel_acked(struct qmp *qmp)
+{
+       return readl(qmp->msgram + QMP_DESC_MCORE_CH_STATE_ACK) == QMP_STATE_UP;
+}
+
+static bool qmp_ucore_channel_up(struct qmp *qmp)
+{
+       return readl(qmp->msgram + QMP_DESC_UCORE_CH_STATE) == QMP_STATE_UP;
+}
+
+static int qmp_open(struct qmp *qmp)
+{
+       int ret;
+       u32 val;
+
+       if (!qmp_magic_valid(qmp)) {
+               dev_err(qmp->dev, "QMP magic doesn't match\n");
+               return -EINVAL;
+       }
+
+       val = readl(qmp->msgram + QMP_DESC_VERSION);
+       if (val != QMP_VERSION) {
+               dev_err(qmp->dev, "unsupported QMP version %d\n", val);
+               return -EINVAL;
+       }
+
+       qmp->offset = readl(qmp->msgram + QMP_DESC_MCORE_MBOX_OFFSET);
+       qmp->size = readl(qmp->msgram + QMP_DESC_MCORE_MBOX_SIZE);
+       if (!qmp->size) {
+               dev_err(qmp->dev, "invalid mailbox size\n");
+               return -EINVAL;
+       }
+
+       /* Ack remote core's link state */
+       val = readl(qmp->msgram + QMP_DESC_UCORE_LINK_STATE);
+       writel(val, qmp->msgram + QMP_DESC_UCORE_LINK_STATE_ACK);
+
+       /* Set local core's link state to up */
+       writel(QMP_STATE_UP, qmp->msgram + QMP_DESC_MCORE_LINK_STATE);
+
+       qmp_kick(qmp);
+
+       ret = wait_event_timeout(qmp->event, qmp_link_acked(qmp), HZ);
+       if (!ret) {
+               dev_err(qmp->dev, "ucore didn't ack link\n");
+               goto timeout_close_link;
+       }
+
+       writel(QMP_STATE_UP, qmp->msgram + QMP_DESC_MCORE_CH_STATE);
+
+       qmp_kick(qmp);
+
+       ret = wait_event_timeout(qmp->event, qmp_ucore_channel_up(qmp), HZ);
+       if (!ret) {
+               dev_err(qmp->dev, "ucore didn't open channel\n");
+               goto timeout_close_channel;
+       }
+
+       /* Ack remote core's channel state */
+       writel(QMP_STATE_UP, qmp->msgram + QMP_DESC_UCORE_CH_STATE_ACK);
+
+       qmp_kick(qmp);
+
+       ret = wait_event_timeout(qmp->event, qmp_mcore_channel_acked(qmp), HZ);
+       if (!ret) {
+               dev_err(qmp->dev, "ucore didn't ack channel\n");
+               goto timeout_close_channel;
+       }
+
+       return 0;
+
+timeout_close_channel:
+       writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_CH_STATE);
+
+timeout_close_link:
+       writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_LINK_STATE);
+       qmp_kick(qmp);
+
+       return -ETIMEDOUT;
+}
+
+static void qmp_close(struct qmp *qmp)
+{
+       writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_CH_STATE);
+       writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_LINK_STATE);
+       qmp_kick(qmp);
+}
+
+static irqreturn_t qmp_intr(int irq, void *data)
+{
+       struct qmp *qmp = data;
+
+       wake_up_interruptible_all(&qmp->event);
+
+       return IRQ_HANDLED;
+}
+
+static bool qmp_message_empty(struct qmp *qmp)
+{
+       return readl(qmp->msgram + qmp->offset) == 0;
+}
+
+/**
+ * qmp_send() - send a message to the AOSS
+ * @qmp: qmp context
+ * @data: message to be sent
+ * @len: length of the message
+ *
+ * Transmit @data to AOSS and wait for the AOSS to acknowledge the message.
+ * @len must be a multiple of 4 and not longer than the mailbox size. Access is
+ * synchronized by this implementation.
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+static int qmp_send(struct qmp *qmp, const void *data, size_t len)
+{
+       long time_left;
+       int ret;
+
+       if (WARN_ON(len + sizeof(u32) > qmp->size))
+               return -EINVAL;
+
+       if (WARN_ON(len % sizeof(u32)))
+               return -EINVAL;
+
+       mutex_lock(&qmp->tx_lock);
+
+       /* The message RAM only implements 32-bit accesses */
+       __iowrite32_copy(qmp->msgram + qmp->offset + sizeof(u32),
+                        data, len / sizeof(u32));
+       writel(len, qmp->msgram + qmp->offset);
+       qmp_kick(qmp);
+
+       time_left = wait_event_interruptible_timeout(qmp->event,
+                                                    qmp_message_empty(qmp), HZ);
+       if (!time_left) {
+               dev_err(qmp->dev, "ucore did not ack channel\n");
+               ret = -ETIMEDOUT;
+
+               /* Clear message from buffer */
+               writel(0, qmp->msgram + qmp->offset);
+       } else {
+               ret = 0;
+       }
+
+       mutex_unlock(&qmp->tx_lock);
+
+       return ret;
+}
+
+static int qmp_qdss_clk_prepare(struct clk_hw *hw)
+{
+       static const char buf[QMP_MSG_LEN] = "{class: clock, res: qdss, val: 1}";
+       struct qmp *qmp = container_of(hw, struct qmp, qdss_clk);
+
+       return qmp_send(qmp, buf, sizeof(buf));
+}
+
+static void qmp_qdss_clk_unprepare(struct clk_hw *hw)
+{
+       static const char buf[QMP_MSG_LEN] = "{class: clock, res: qdss, val: 0}";
+       struct qmp *qmp = container_of(hw, struct qmp, qdss_clk);
+
+       qmp_send(qmp, buf, sizeof(buf));
+}
+
+static const struct clk_ops qmp_qdss_clk_ops = {
+       .prepare = qmp_qdss_clk_prepare,
+       .unprepare = qmp_qdss_clk_unprepare,
+};
+
+static int qmp_qdss_clk_add(struct qmp *qmp)
+{
+       static const struct clk_init_data qdss_init = {
+               .ops = &qmp_qdss_clk_ops,
+               .name = "qdss",
+       };
+       int ret;
+
+       qmp->qdss_clk.init = &qdss_init;
+       ret = clk_hw_register(qmp->dev, &qmp->qdss_clk);
+       if (ret < 0) {
+               dev_err(qmp->dev, "failed to register qdss clock\n");
+               return ret;
+       }
+
+       ret = of_clk_add_hw_provider(qmp->dev->of_node, of_clk_hw_simple_get,
+                                    &qmp->qdss_clk);
+       if (ret < 0) {
+               dev_err(qmp->dev, "unable to register of clk hw provider\n");
+               clk_hw_unregister(&qmp->qdss_clk);
+       }
+
+       return ret;
+}
+
+static void qmp_qdss_clk_remove(struct qmp *qmp)
+{
+       of_clk_del_provider(qmp->dev->of_node);
+       clk_hw_unregister(&qmp->qdss_clk);
+}
+
+static int qmp_pd_power_toggle(struct qmp_pd *res, bool enable)
+{
+       char buf[QMP_MSG_LEN] = {};
+
+       snprintf(buf, sizeof(buf),
+                "{class: image, res: load_state, name: %s, val: %s}",
+                res->pd.name, enable ? "on" : "off");
+       return qmp_send(res->qmp, buf, sizeof(buf));
+}
+
+static int qmp_pd_power_on(struct generic_pm_domain *domain)
+{
+       return qmp_pd_power_toggle(to_qmp_pd_resource(domain), true);
+}
+
+static int qmp_pd_power_off(struct generic_pm_domain *domain)
+{
+       return qmp_pd_power_toggle(to_qmp_pd_resource(domain), false);
+}
+
+static const char * const sdm845_resources[] = {
+       [AOSS_QMP_LS_CDSP] = "cdsp",
+       [AOSS_QMP_LS_LPASS] = "adsp",
+       [AOSS_QMP_LS_MODEM] = "modem",
+       [AOSS_QMP_LS_SLPI] = "slpi",
+       [AOSS_QMP_LS_SPSS] = "spss",
+       [AOSS_QMP_LS_VENUS] = "venus",
+};
+
+static int qmp_pd_add(struct qmp *qmp)
+{
+       struct genpd_onecell_data *data = &qmp->pd_data;
+       struct device *dev = qmp->dev;
+       struct qmp_pd *res;
+       size_t num = ARRAY_SIZE(sdm845_resources);
+       int ret;
+       int i;
+
+       res = devm_kcalloc(dev, num, sizeof(*res), GFP_KERNEL);
+       if (!res)
+               return -ENOMEM;
+
+       data->domains = devm_kcalloc(dev, num, sizeof(*data->domains),
+                                    GFP_KERNEL);
+       if (!data->domains)
+               return -ENOMEM;
+
+       for (i = 0; i < num; i++) {
+               res[i].qmp = qmp;
+               res[i].pd.name = sdm845_resources[i];
+               res[i].pd.power_on = qmp_pd_power_on;
+               res[i].pd.power_off = qmp_pd_power_off;
+
+               ret = pm_genpd_init(&res[i].pd, NULL, true);
+               if (ret < 0) {
+                       dev_err(dev, "failed to init genpd\n");
+                       goto unroll_genpds;
+               }
+
+               data->domains[i] = &res[i].pd;
+       }
+
+       data->num_domains = i;
+
+       ret = of_genpd_add_provider_onecell(dev->of_node, data);
+       if (ret < 0)
+               goto unroll_genpds;
+
+       return 0;
+
+unroll_genpds:
+       for (i--; i >= 0; i--)
+               pm_genpd_remove(data->domains[i]);
+
+       return ret;
+}
+
+static void qmp_pd_remove(struct qmp *qmp)
+{
+       struct genpd_onecell_data *data = &qmp->pd_data;
+       struct device *dev = qmp->dev;
+       int i;
+
+       of_genpd_del_provider(dev->of_node);
+
+       for (i = 0; i < data->num_domains; i++)
+               pm_genpd_remove(data->domains[i]);
+}
+
+static int qmp_probe(struct platform_device *pdev)
+{
+       struct resource *res;
+       struct qmp *qmp;
+       int irq;
+       int ret;
+
+       qmp = devm_kzalloc(&pdev->dev, sizeof(*qmp), GFP_KERNEL);
+       if (!qmp)
+               return -ENOMEM;
+
+       qmp->dev = &pdev->dev;
+       init_waitqueue_head(&qmp->event);
+       mutex_init(&qmp->tx_lock);
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       qmp->msgram = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(qmp->msgram))
+               return PTR_ERR(qmp->msgram);
+
+       qmp->mbox_client.dev = &pdev->dev;
+       qmp->mbox_client.knows_txdone = true;
+       qmp->mbox_chan = mbox_request_channel(&qmp->mbox_client, 0);
+       if (IS_ERR(qmp->mbox_chan)) {
+               dev_err(&pdev->dev, "failed to acquire ipc mailbox\n");
+               return PTR_ERR(qmp->mbox_chan);
+       }
+
+       irq = platform_get_irq(pdev, 0);
+       ret = devm_request_irq(&pdev->dev, irq, qmp_intr, IRQF_ONESHOT,
+                              "aoss-qmp", qmp);
+       if (ret < 0) {
+               dev_err(&pdev->dev, "failed to request interrupt\n");
+               goto err_free_mbox;
+       }
+
+       ret = qmp_open(qmp);
+       if (ret < 0)
+               goto err_free_mbox;
+
+       ret = qmp_qdss_clk_add(qmp);
+       if (ret)
+               goto err_close_qmp;
+
+       ret = qmp_pd_add(qmp);
+       if (ret)
+               goto err_remove_qdss_clk;
+
+       platform_set_drvdata(pdev, qmp);
+
+       return 0;
+
+err_remove_qdss_clk:
+       qmp_qdss_clk_remove(qmp);
+err_close_qmp:
+       qmp_close(qmp);
+err_free_mbox:
+       mbox_free_channel(qmp->mbox_chan);
+
+       return ret;
+}
+
+static int qmp_remove(struct platform_device *pdev)
+{
+       struct qmp *qmp = platform_get_drvdata(pdev);
+
+       qmp_qdss_clk_remove(qmp);
+       qmp_pd_remove(qmp);
+
+       qmp_close(qmp);
+       mbox_free_channel(qmp->mbox_chan);
+
+       return 0;
+}
+
+static const struct of_device_id qmp_dt_match[] = {
+       { .compatible = "qcom,sdm845-aoss-qmp", },
+       {}
+};
+MODULE_DEVICE_TABLE(of, qmp_dt_match);
+
+static struct platform_driver qmp_driver = {
+       .driver = {
+               .name           = "qcom_aoss_qmp",
+               .of_match_table = qmp_dt_match,
+       },
+       .probe = qmp_probe,
+       .remove = qmp_remove,
+};
+module_platform_driver(qmp_driver);
+
+MODULE_DESCRIPTION("Qualcomm AOSS QMP driver");
+MODULE_LICENSE("GPL v2");
index 005326050c2368e0a9cdfdaba0c74d359c793e1e..3c1a55cf25d620258dacded8a1c69a17518d141b 100644 (file)
 
 #define domain_to_rpmpd(domain) container_of(domain, struct rpmpd, pd)
 
-/* Resource types */
+/* Resource types:
+ * RPMPD_X is X encoded as a little-endian, lower-case, ASCII string */
 #define RPMPD_SMPA 0x61706d73
 #define RPMPD_LDOA 0x616f646c
+#define RPMPD_RWCX 0x78637772
+#define RPMPD_RWMX 0x786d7772
+#define RPMPD_RWLC 0x636c7772
+#define RPMPD_RWLM 0x6d6c7772
+#define RPMPD_RWSC 0x63737772
+#define RPMPD_RWSM 0x6d737772
 
 /* Operation Keys */
 #define KEY_CORNER             0x6e726f63 /* corn */
 #define KEY_ENABLE             0x6e657773 /* swen */
 #define KEY_FLOOR_CORNER       0x636676   /* vfc */
+#define KEY_FLOOR_LEVEL                0x6c6676   /* vfl */
+#define KEY_LEVEL              0x6c766c76 /* vlvl */
 
-#define MAX_RPMPD_STATE                6
+#define MAX_8996_RPMPD_STATE   6
 
-#define DEFINE_RPMPD_CORNER_SMPA(_platform, _name, _active, r_id)              \
+#define DEFINE_RPMPD_PAIR(_platform, _name, _active, r_type, r_key,    \
+                         r_id)                                         \
        static struct rpmpd _platform##_##_active;                      \
        static struct rpmpd _platform##_##_name = {                     \
                .pd = { .name = #_name, },                              \
                .peer = &_platform##_##_active,                         \
-               .res_type = RPMPD_SMPA,                                 \
+               .res_type = RPMPD_##r_type,                             \
                .res_id = r_id,                                         \
-               .key = KEY_CORNER,                                      \
+               .key = KEY_##r_key,                                     \
        };                                                              \
        static struct rpmpd _platform##_##_active = {                   \
                .pd = { .name = #_active, },                            \
                .peer = &_platform##_##_name,                           \
                .active_only = true,                                    \
-               .res_type = RPMPD_SMPA,                                 \
+               .res_type = RPMPD_##r_type,                             \
                .res_id = r_id,                                         \
-               .key = KEY_CORNER,                                      \
+               .key = KEY_##r_key,                                     \
        }
 
-#define DEFINE_RPMPD_CORNER_LDOA(_platform, _name, r_id)                       \
+#define DEFINE_RPMPD_CORNER(_platform, _name, r_type, r_id)            \
        static struct rpmpd _platform##_##_name = {                     \
                .pd = { .name = #_name, },                              \
-               .res_type = RPMPD_LDOA,                                 \
+               .res_type = RPMPD_##r_type,                             \
                .res_id = r_id,                                         \
                .key = KEY_CORNER,                                      \
        }
 
-#define DEFINE_RPMPD_VFC(_platform, _name, r_id, r_type)               \
+#define DEFINE_RPMPD_LEVEL(_platform, _name, r_type, r_id)             \
        static struct rpmpd _platform##_##_name = {                     \
                .pd = { .name = #_name, },                              \
-               .res_type = r_type,                                     \
+               .res_type = RPMPD_##r_type,                             \
                .res_id = r_id,                                         \
-               .key = KEY_FLOOR_CORNER,                                \
+               .key = KEY_LEVEL,                                       \
        }
 
-#define DEFINE_RPMPD_VFC_SMPA(_platform, _name, r_id)                  \
-       DEFINE_RPMPD_VFC(_platform, _name, r_id, RPMPD_SMPA)
+#define DEFINE_RPMPD_VFC(_platform, _name, r_type, r_id)               \
+       static struct rpmpd _platform##_##_name = {                     \
+               .pd = { .name = #_name, },                              \
+               .res_type = RPMPD_##r_type,                             \
+               .res_id = r_id,                                         \
+               .key = KEY_FLOOR_CORNER,                                \
+       }
 
-#define DEFINE_RPMPD_VFC_LDOA(_platform, _name, r_id)                  \
-       DEFINE_RPMPD_VFC(_platform, _name, r_id, RPMPD_LDOA)
+#define DEFINE_RPMPD_VFL(_platform, _name, r_type, r_id)               \
+       static struct rpmpd _platform##_##_name = {                     \
+               .pd = { .name = #_name, },                              \
+               .res_type = RPMPD_##r_type,                             \
+               .res_id = r_id,                                         \
+               .key = KEY_FLOOR_LEVEL,                                 \
+       }
 
 struct rpmpd_req {
        __le32 key;
@@ -83,23 +103,25 @@ struct rpmpd {
        const int res_type;
        const int res_id;
        struct qcom_smd_rpm *rpm;
+       unsigned int max_state;
        __le32 key;
 };
 
 struct rpmpd_desc {
        struct rpmpd **rpmpds;
        size_t num_pds;
+       unsigned int max_state;
 };
 
 static DEFINE_MUTEX(rpmpd_lock);
 
 /* msm8996 RPM Power domains */
-DEFINE_RPMPD_CORNER_SMPA(msm8996, vddcx, vddcx_ao, 1);
-DEFINE_RPMPD_CORNER_SMPA(msm8996, vddmx, vddmx_ao, 2);
-DEFINE_RPMPD_CORNER_LDOA(msm8996, vddsscx, 26);
+DEFINE_RPMPD_PAIR(msm8996, vddcx, vddcx_ao, SMPA, CORNER, 1);
+DEFINE_RPMPD_PAIR(msm8996, vddmx, vddmx_ao, SMPA, CORNER, 2);
+DEFINE_RPMPD_CORNER(msm8996, vddsscx, LDOA, 26);
 
-DEFINE_RPMPD_VFC_SMPA(msm8996, vddcx_vfc, 1);
-DEFINE_RPMPD_VFC_LDOA(msm8996, vddsscx_vfc, 26);
+DEFINE_RPMPD_VFC(msm8996, vddcx_vfc, SMPA, 1);
+DEFINE_RPMPD_VFC(msm8996, vddsscx_vfc, LDOA, 26);
 
 static struct rpmpd *msm8996_rpmpds[] = {
        [MSM8996_VDDCX] =       &msm8996_vddcx,
@@ -114,10 +136,71 @@ static struct rpmpd *msm8996_rpmpds[] = {
 static const struct rpmpd_desc msm8996_desc = {
        .rpmpds = msm8996_rpmpds,
        .num_pds = ARRAY_SIZE(msm8996_rpmpds),
+       .max_state = MAX_8996_RPMPD_STATE,
+};
+
+/* msm8998 RPM Power domains */
+DEFINE_RPMPD_PAIR(msm8998, vddcx, vddcx_ao, RWCX, LEVEL, 0);
+DEFINE_RPMPD_VFL(msm8998, vddcx_vfl, RWCX, 0);
+
+DEFINE_RPMPD_PAIR(msm8998, vddmx, vddmx_ao, RWMX, LEVEL, 0);
+DEFINE_RPMPD_VFL(msm8998, vddmx_vfl, RWMX, 0);
+
+DEFINE_RPMPD_LEVEL(msm8998, vdd_ssccx, RWSC, 0);
+DEFINE_RPMPD_VFL(msm8998, vdd_ssccx_vfl, RWSC, 0);
+
+DEFINE_RPMPD_LEVEL(msm8998, vdd_sscmx, RWSM, 0);
+DEFINE_RPMPD_VFL(msm8998, vdd_sscmx_vfl, RWSM, 0);
+
+static struct rpmpd *msm8998_rpmpds[] = {
+       [MSM8998_VDDCX] =               &msm8998_vddcx,
+       [MSM8998_VDDCX_AO] =            &msm8998_vddcx_ao,
+       [MSM8998_VDDCX_VFL] =           &msm8998_vddcx_vfl,
+       [MSM8998_VDDMX] =               &msm8998_vddmx,
+       [MSM8998_VDDMX_AO] =            &msm8998_vddmx_ao,
+       [MSM8998_VDDMX_VFL] =           &msm8998_vddmx_vfl,
+       [MSM8998_SSCCX] =               &msm8998_vdd_ssccx,
+       [MSM8998_SSCCX_VFL] =           &msm8998_vdd_ssccx_vfl,
+       [MSM8998_SSCMX] =               &msm8998_vdd_sscmx,
+       [MSM8998_SSCMX_VFL] =           &msm8998_vdd_sscmx_vfl,
+};
+
+static const struct rpmpd_desc msm8998_desc = {
+       .rpmpds = msm8998_rpmpds,
+       .num_pds = ARRAY_SIZE(msm8998_rpmpds),
+       .max_state = RPM_SMD_LEVEL_BINNING,
+};
+
+/* qcs404 RPM Power domains */
+DEFINE_RPMPD_PAIR(qcs404, vddmx, vddmx_ao, RWMX, LEVEL, 0);
+DEFINE_RPMPD_VFL(qcs404, vddmx_vfl, RWMX, 0);
+
+DEFINE_RPMPD_LEVEL(qcs404, vdd_lpicx, RWLC, 0);
+DEFINE_RPMPD_VFL(qcs404, vdd_lpicx_vfl, RWLC, 0);
+
+DEFINE_RPMPD_LEVEL(qcs404, vdd_lpimx, RWLM, 0);
+DEFINE_RPMPD_VFL(qcs404, vdd_lpimx_vfl, RWLM, 0);
+
+static struct rpmpd *qcs404_rpmpds[] = {
+       [QCS404_VDDMX] = &qcs404_vddmx,
+       [QCS404_VDDMX_AO] = &qcs404_vddmx_ao,
+       [QCS404_VDDMX_VFL] = &qcs404_vddmx_vfl,
+       [QCS404_LPICX] = &qcs404_vdd_lpicx,
+       [QCS404_LPICX_VFL] = &qcs404_vdd_lpicx_vfl,
+       [QCS404_LPIMX] = &qcs404_vdd_lpimx,
+       [QCS404_LPIMX_VFL] = &qcs404_vdd_lpimx_vfl,
+};
+
+static const struct rpmpd_desc qcs404_desc = {
+       .rpmpds = qcs404_rpmpds,
+       .num_pds = ARRAY_SIZE(qcs404_rpmpds),
+       .max_state = RPM_SMD_LEVEL_BINNING,
 };
 
 static const struct of_device_id rpmpd_match_table[] = {
        { .compatible = "qcom,msm8996-rpmpd", .data = &msm8996_desc },
+       { .compatible = "qcom,msm8998-rpmpd", .data = &msm8998_desc },
+       { .compatible = "qcom,qcs404-rpmpd", .data = &qcs404_desc },
        { }
 };
 
@@ -225,14 +308,16 @@ static int rpmpd_set_performance(struct generic_pm_domain *domain,
        int ret = 0;
        struct rpmpd *pd = domain_to_rpmpd(domain);
 
-       if (state > MAX_RPMPD_STATE)
-               goto out;
+       if (state > pd->max_state)
+               state = pd->max_state;
 
        mutex_lock(&rpmpd_lock);
 
        pd->corner = state;
 
-       if (!pd->enabled && pd->key != KEY_FLOOR_CORNER)
+       /* Always send updates for vfc and vfl */
+       if (!pd->enabled && pd->key != KEY_FLOOR_CORNER &&
+           pd->key != KEY_FLOOR_LEVEL)
                goto out;
 
        ret = rpmpd_aggregate_corner(pd);
@@ -287,6 +372,7 @@ static int rpmpd_probe(struct platform_device *pdev)
                }
 
                rpmpds[i]->rpm = rpm;
+               rpmpds[i]->max_state = desc->max_state;
                rpmpds[i]->pd.power_off = rpmpd_power_off;
                rpmpds[i]->pd.power_on = rpmpd_power_on;
                rpmpds[i]->pd.set_performance_state = rpmpd_set_performance;
index 68bfca6f20ddf8a7a07aa36dc447044b86722f09..2bbf49e5d441808bda02c86dcc1f8a368972ffbf 100644 (file)
@@ -57,14 +57,16 @@ config ARCH_R7S72100
        bool "RZ/A1H (R7S72100)"
        select PM
        select PM_GENERIC_DOMAINS
-       select SYS_SUPPORTS_SH_MTU2
        select RENESAS_OSTM
+       select RENESAS_RZA1_IRQC
+       select SYS_SUPPORTS_SH_MTU2
 
 config ARCH_R7S9210
        bool "RZ/A2 (R7S9210)"
        select PM
        select PM_GENERIC_DOMAINS
        select RENESAS_OSTM
+       select RENESAS_RZA1_IRQC
 
 config ARCH_R8A73A4
        bool "R-Mobile APE6 (R8A73A40)"
index 3342332cc0075b37d6394f0597e8e36bf0ffbb1c..54eb6cfc5d5b1b96bee2232f16abfbe39f19f23c 100644 (file)
@@ -86,47 +86,47 @@ struct rockchip_pmu {
 #define to_rockchip_pd(gpd) container_of(gpd, struct rockchip_pm_domain, genpd)
 
 #define DOMAIN(pwr, status, req, idle, ack, wakeup)    \
-{                                              \
-       .pwr_mask = (pwr >= 0) ? BIT(pwr) : 0,          \
-       .status_mask = (status >= 0) ? BIT(status) : 0, \
-       .req_mask = (req >= 0) ? BIT(req) : 0,          \
-       .idle_mask = (idle >= 0) ? BIT(idle) : 0,       \
-       .ack_mask = (ack >= 0) ? BIT(ack) : 0,          \
-       .active_wakeup = wakeup,                        \
+{                                                      \
+       .pwr_mask = (pwr),                              \
+       .status_mask = (status),                        \
+       .req_mask = (req),                              \
+       .idle_mask = (idle),                            \
+       .ack_mask = (ack),                              \
+       .active_wakeup = (wakeup),                      \
 }
 
 #define DOMAIN_M(pwr, status, req, idle, ack, wakeup)  \
 {                                                      \
-       .pwr_w_mask = (pwr >= 0) ? BIT(pwr + 16) : 0,   \
-       .pwr_mask = (pwr >= 0) ? BIT(pwr) : 0,          \
-       .status_mask = (status >= 0) ? BIT(status) : 0, \
-       .req_w_mask = (req >= 0) ?  BIT(req + 16) : 0,  \
-       .req_mask = (req >= 0) ?  BIT(req) : 0,         \
-       .idle_mask = (idle >= 0) ? BIT(idle) : 0,       \
-       .ack_mask = (ack >= 0) ? BIT(ack) : 0,          \
+       .pwr_w_mask = (pwr) << 16,                      \
+       .pwr_mask = (pwr),                              \
+       .status_mask = (status),                        \
+       .req_w_mask = (req) << 16,                      \
+       .req_mask = (req),                              \
+       .idle_mask = (idle),                            \
+       .ack_mask = (ack),                              \
        .active_wakeup = wakeup,                        \
 }
 
 #define DOMAIN_RK3036(req, ack, idle, wakeup)          \
 {                                                      \
-       .req_mask = (req >= 0) ? BIT(req) : 0,          \
-       .req_w_mask = (req >= 0) ?  BIT(req + 16) : 0,  \
-       .ack_mask = (ack >= 0) ? BIT(ack) : 0,          \
-       .idle_mask = (idle >= 0) ? BIT(idle) : 0,       \
+       .req_mask = (req),                              \
+       .req_w_mask = (req) << 16,                      \
+       .ack_mask = (ack),                              \
+       .idle_mask = (idle),                            \
        .active_wakeup = wakeup,                        \
 }
 
 #define DOMAIN_PX30(pwr, status, req, wakeup)          \
-       DOMAIN_M(pwr, status, req, (req) + 16, req, wakeup)
+       DOMAIN_M(pwr, status, req, (req) << 16, req, wakeup)
 
 #define DOMAIN_RK3288(pwr, status, req, wakeup)                \
-       DOMAIN(pwr, status, req, req, (req) + 16, wakeup)
+       DOMAIN(pwr, status, req, req, (req) << 16, wakeup)
 
 #define DOMAIN_RK3328(pwr, status, req, wakeup)                \
-       DOMAIN_M(pwr, pwr, req, (req) + 10, req, wakeup)
+       DOMAIN_M(pwr, pwr, req, (req) << 10, req, wakeup)
 
 #define DOMAIN_RK3368(pwr, status, req, wakeup)                \
-       DOMAIN(pwr, status, req, (req) + 16, req, wakeup)
+       DOMAIN(pwr, status, req, (req) << 16, req, wakeup)
 
 #define DOMAIN_RK3399(pwr, status, req, wakeup)                \
        DOMAIN(pwr, status, req, req, req, wakeup)
@@ -716,129 +716,129 @@ err_out:
 }
 
 static const struct rockchip_domain_info px30_pm_domains[] = {
-       [PX30_PD_USB]           = DOMAIN_PX30(5, 5, 10, false),
-       [PX30_PD_SDCARD]        = DOMAIN_PX30(8, 8, 9, false),
-       [PX30_PD_GMAC]          = DOMAIN_PX30(10, 10, 6, false),
-       [PX30_PD_MMC_NAND]      = DOMAIN_PX30(11, 11, 5, false),
-       [PX30_PD_VPU]           = DOMAIN_PX30(12, 12, 14, false),
-       [PX30_PD_VO]            = DOMAIN_PX30(13, 13, 7, false),
-       [PX30_PD_VI]            = DOMAIN_PX30(14, 14, 8, false),
-       [PX30_PD_GPU]           = DOMAIN_PX30(15, 15, 2, false),
+       [PX30_PD_USB]           = DOMAIN_PX30(BIT(5),  BIT(5),  BIT(10), false),
+       [PX30_PD_SDCARD]        = DOMAIN_PX30(BIT(8),  BIT(8),  BIT(9),  false),
+       [PX30_PD_GMAC]          = DOMAIN_PX30(BIT(10), BIT(10), BIT(6),  false),
+       [PX30_PD_MMC_NAND]      = DOMAIN_PX30(BIT(11), BIT(11), BIT(5),  false),
+       [PX30_PD_VPU]           = DOMAIN_PX30(BIT(12), BIT(12), BIT(14), false),
+       [PX30_PD_VO]            = DOMAIN_PX30(BIT(13), BIT(13), BIT(7),  false),
+       [PX30_PD_VI]            = DOMAIN_PX30(BIT(14), BIT(14), BIT(8),  false),
+       [PX30_PD_GPU]           = DOMAIN_PX30(BIT(15), BIT(15), BIT(2),  false),
 };
 
 static const struct rockchip_domain_info rk3036_pm_domains[] = {
-       [RK3036_PD_MSCH]        = DOMAIN_RK3036(14, 23, 30, true),
-       [RK3036_PD_CORE]        = DOMAIN_RK3036(13, 17, 24, false),
-       [RK3036_PD_PERI]        = DOMAIN_RK3036(12, 18, 25, false),
-       [RK3036_PD_VIO]         = DOMAIN_RK3036(11, 19, 26, false),
-       [RK3036_PD_VPU]         = DOMAIN_RK3036(10, 20, 27, false),
-       [RK3036_PD_GPU]         = DOMAIN_RK3036(9, 21, 28, false),
-       [RK3036_PD_SYS]         = DOMAIN_RK3036(8, 22, 29, false),
+       [RK3036_PD_MSCH]        = DOMAIN_RK3036(BIT(14), BIT(23), BIT(30), true),
+       [RK3036_PD_CORE]        = DOMAIN_RK3036(BIT(13), BIT(17), BIT(24), false),
+       [RK3036_PD_PERI]        = DOMAIN_RK3036(BIT(12), BIT(18), BIT(25), false),
+       [RK3036_PD_VIO]         = DOMAIN_RK3036(BIT(11), BIT(19), BIT(26), false),
+       [RK3036_PD_VPU]         = DOMAIN_RK3036(BIT(10), BIT(20), BIT(27), false),
+       [RK3036_PD_GPU]         = DOMAIN_RK3036(BIT(9),  BIT(21), BIT(28), false),
+       [RK3036_PD_SYS]         = DOMAIN_RK3036(BIT(8),  BIT(22), BIT(29), false),
 };
 
 static const struct rockchip_domain_info rk3066_pm_domains[] = {
-       [RK3066_PD_GPU]         = DOMAIN(9, 9, 3, 24, 29, false),
-       [RK3066_PD_VIDEO]       = DOMAIN(8, 8, 4, 23, 28, false),
-       [RK3066_PD_VIO]         = DOMAIN(7, 7, 5, 22, 27, false),
-       [RK3066_PD_PERI]        = DOMAIN(6, 6, 2, 25, 30, false),
-       [RK3066_PD_CPU]         = DOMAIN(-1, 5, 1, 26, 31, false),
+       [RK3066_PD_GPU]         = DOMAIN(BIT(9), BIT(9), BIT(3), BIT(24), BIT(29), false),
+       [RK3066_PD_VIDEO]       = DOMAIN(BIT(8), BIT(8), BIT(4), BIT(23), BIT(28), false),
+       [RK3066_PD_VIO]         = DOMAIN(BIT(7), BIT(7), BIT(5), BIT(22), BIT(27), false),
+       [RK3066_PD_PERI]        = DOMAIN(BIT(6), BIT(6), BIT(2), BIT(25), BIT(30), false),
+       [RK3066_PD_CPU]         = DOMAIN(0,      BIT(5), BIT(1), BIT(26), BIT(31), false),
 };
 
 static const struct rockchip_domain_info rk3128_pm_domains[] = {
-       [RK3128_PD_CORE]        = DOMAIN_RK3288(0, 0, 4, false),
-       [RK3128_PD_MSCH]        = DOMAIN_RK3288(-1, -1, 6, true),
-       [RK3128_PD_VIO]         = DOMAIN_RK3288(3, 3, 2, false),
-       [RK3128_PD_VIDEO]       = DOMAIN_RK3288(2, 2, 1, false),
-       [RK3128_PD_GPU]         = DOMAIN_RK3288(1, 1, 3, false),
+       [RK3128_PD_CORE]        = DOMAIN_RK3288(BIT(0), BIT(0), BIT(4), false),
+       [RK3128_PD_MSCH]        = DOMAIN_RK3288(0,      0,      BIT(6), true),
+       [RK3128_PD_VIO]         = DOMAIN_RK3288(BIT(3), BIT(3), BIT(2), false),
+       [RK3128_PD_VIDEO]       = DOMAIN_RK3288(BIT(2), BIT(2), BIT(1), false),
+       [RK3128_PD_GPU]         = DOMAIN_RK3288(BIT(1), BIT(1), BIT(3), false),
 };
 
 static const struct rockchip_domain_info rk3188_pm_domains[] = {
-       [RK3188_PD_GPU]         = DOMAIN(9, 9, 3, 24, 29, false),
-       [RK3188_PD_VIDEO]       = DOMAIN(8, 8, 4, 23, 28, false),
-       [RK3188_PD_VIO]         = DOMAIN(7, 7, 5, 22, 27, false),
-       [RK3188_PD_PERI]        = DOMAIN(6, 6, 2, 25, 30, false),
-       [RK3188_PD_CPU]         = DOMAIN(5, 5, 1, 26, 31, false),
+       [RK3188_PD_GPU]         = DOMAIN(BIT(9), BIT(9), BIT(3), BIT(24), BIT(29), false),
+       [RK3188_PD_VIDEO]       = DOMAIN(BIT(8), BIT(8), BIT(4), BIT(23), BIT(28), false),
+       [RK3188_PD_VIO]         = DOMAIN(BIT(7), BIT(7), BIT(5), BIT(22), BIT(27), false),
+       [RK3188_PD_PERI]        = DOMAIN(BIT(6), BIT(6), BIT(2), BIT(25), BIT(30), false),
+       [RK3188_PD_CPU]         = DOMAIN(BIT(5), BIT(5), BIT(1), BIT(26), BIT(31), false),
 };
 
 static const struct rockchip_domain_info rk3228_pm_domains[] = {
-       [RK3228_PD_CORE]        = DOMAIN_RK3036(0, 0, 16, true),
-       [RK3228_PD_MSCH]        = DOMAIN_RK3036(1, 1, 17, true),
-       [RK3228_PD_BUS]         = DOMAIN_RK3036(2, 2, 18, true),
-       [RK3228_PD_SYS]         = DOMAIN_RK3036(3, 3, 19, true),
-       [RK3228_PD_VIO]         = DOMAIN_RK3036(4, 4, 20, false),
-       [RK3228_PD_VOP]         = DOMAIN_RK3036(5, 5, 21, false),
-       [RK3228_PD_VPU]         = DOMAIN_RK3036(6, 6, 22, false),
-       [RK3228_PD_RKVDEC]      = DOMAIN_RK3036(7, 7, 23, false),
-       [RK3228_PD_GPU]         = DOMAIN_RK3036(8, 8, 24, false),
-       [RK3228_PD_PERI]        = DOMAIN_RK3036(9, 9, 25, true),
-       [RK3228_PD_GMAC]        = DOMAIN_RK3036(10, 10, 26, false),
+       [RK3228_PD_CORE]        = DOMAIN_RK3036(BIT(0),  BIT(0),  BIT(16), true),
+       [RK3228_PD_MSCH]        = DOMAIN_RK3036(BIT(1),  BIT(1),  BIT(17), true),
+       [RK3228_PD_BUS]         = DOMAIN_RK3036(BIT(2),  BIT(2),  BIT(18), true),
+       [RK3228_PD_SYS]         = DOMAIN_RK3036(BIT(3),  BIT(3),  BIT(19), true),
+       [RK3228_PD_VIO]         = DOMAIN_RK3036(BIT(4),  BIT(4),  BIT(20), false),
+       [RK3228_PD_VOP]         = DOMAIN_RK3036(BIT(5),  BIT(5),  BIT(21), false),
+       [RK3228_PD_VPU]         = DOMAIN_RK3036(BIT(6),  BIT(6),  BIT(22), false),
+       [RK3228_PD_RKVDEC]      = DOMAIN_RK3036(BIT(7),  BIT(7),  BIT(23), false),
+       [RK3228_PD_GPU]         = DOMAIN_RK3036(BIT(8),  BIT(8),  BIT(24), false),
+       [RK3228_PD_PERI]        = DOMAIN_RK3036(BIT(9),  BIT(9),  BIT(25), true),
+       [RK3228_PD_GMAC]        = DOMAIN_RK3036(BIT(10), BIT(10), BIT(26), false),
 };
 
 static const struct rockchip_domain_info rk3288_pm_domains[] = {
-       [RK3288_PD_VIO]         = DOMAIN_RK3288(7, 7, 4, false),
-       [RK3288_PD_HEVC]        = DOMAIN_RK3288(14, 10, 9, false),
-       [RK3288_PD_VIDEO]       = DOMAIN_RK3288(8, 8, 3, false),
-       [RK3288_PD_GPU]         = DOMAIN_RK3288(9, 9, 2, false),
+       [RK3288_PD_VIO]         = DOMAIN_RK3288(BIT(7),  BIT(7),  BIT(4), false),
+       [RK3288_PD_HEVC]        = DOMAIN_RK3288(BIT(14), BIT(10), BIT(9), false),
+       [RK3288_PD_VIDEO]       = DOMAIN_RK3288(BIT(8),  BIT(8),  BIT(3), false),
+       [RK3288_PD_GPU]         = DOMAIN_RK3288(BIT(9),  BIT(9),  BIT(2), false),
 };
 
 static const struct rockchip_domain_info rk3328_pm_domains[] = {
-       [RK3328_PD_CORE]        = DOMAIN_RK3328(-1, 0, 0, false),
-       [RK3328_PD_GPU]         = DOMAIN_RK3328(-1, 1, 1, false),
-       [RK3328_PD_BUS]         = DOMAIN_RK3328(-1, 2, 2, true),
-       [RK3328_PD_MSCH]        = DOMAIN_RK3328(-1, 3, 3, true),
-       [RK3328_PD_PERI]        = DOMAIN_RK3328(-1, 4, 4, true),
-       [RK3328_PD_VIDEO]       = DOMAIN_RK3328(-1, 5, 5, false),
-       [RK3328_PD_HEVC]        = DOMAIN_RK3328(-1, 6, 6, false),
-       [RK3328_PD_VIO]         = DOMAIN_RK3328(-1, 8, 8, false),
-       [RK3328_PD_VPU]         = DOMAIN_RK3328(-1, 9, 9, false),
+       [RK3328_PD_CORE]        = DOMAIN_RK3328(0, BIT(0), BIT(0), false),
+       [RK3328_PD_GPU]         = DOMAIN_RK3328(0, BIT(1), BIT(1), false),
+       [RK3328_PD_BUS]         = DOMAIN_RK3328(0, BIT(2), BIT(2), true),
+       [RK3328_PD_MSCH]        = DOMAIN_RK3328(0, BIT(3), BIT(3), true),
+       [RK3328_PD_PERI]        = DOMAIN_RK3328(0, BIT(4), BIT(4), true),
+       [RK3328_PD_VIDEO]       = DOMAIN_RK3328(0, BIT(5), BIT(5), false),
+       [RK3328_PD_HEVC]        = DOMAIN_RK3328(0, BIT(6), BIT(6), false),
+       [RK3328_PD_VIO]         = DOMAIN_RK3328(0, BIT(8), BIT(8), false),
+       [RK3328_PD_VPU]         = DOMAIN_RK3328(0, BIT(9), BIT(9), false),
 };
 
 static const struct rockchip_domain_info rk3366_pm_domains[] = {
-       [RK3366_PD_PERI]        = DOMAIN_RK3368(10, 10, 6, true),
-       [RK3366_PD_VIO]         = DOMAIN_RK3368(14, 14, 8, false),
-       [RK3366_PD_VIDEO]       = DOMAIN_RK3368(13, 13, 7, false),
-       [RK3366_PD_RKVDEC]      = DOMAIN_RK3368(11, 11, 7, false),
-       [RK3366_PD_WIFIBT]      = DOMAIN_RK3368(8, 8, 9, false),
-       [RK3366_PD_VPU]         = DOMAIN_RK3368(12, 12, 7, false),
-       [RK3366_PD_GPU]         = DOMAIN_RK3368(15, 15, 2, false),
+       [RK3366_PD_PERI]        = DOMAIN_RK3368(BIT(10), BIT(10), BIT(6), true),
+       [RK3366_PD_VIO]         = DOMAIN_RK3368(BIT(14), BIT(14), BIT(8), false),
+       [RK3366_PD_VIDEO]       = DOMAIN_RK3368(BIT(13), BIT(13), BIT(7), false),
+       [RK3366_PD_RKVDEC]      = DOMAIN_RK3368(BIT(11), BIT(11), BIT(7), false),
+       [RK3366_PD_WIFIBT]      = DOMAIN_RK3368(BIT(8),  BIT(8),  BIT(9), false),
+       [RK3366_PD_VPU]         = DOMAIN_RK3368(BIT(12), BIT(12), BIT(7), false),
+       [RK3366_PD_GPU]         = DOMAIN_RK3368(BIT(15), BIT(15), BIT(2), false),
 };
 
 static const struct rockchip_domain_info rk3368_pm_domains[] = {
-       [RK3368_PD_PERI]        = DOMAIN_RK3368(13, 12, 6, true),
-       [RK3368_PD_VIO]         = DOMAIN_RK3368(15, 14, 8, false),
-       [RK3368_PD_VIDEO]       = DOMAIN_RK3368(14, 13, 7, false),
-       [RK3368_PD_GPU_0]       = DOMAIN_RK3368(16, 15, 2, false),
-       [RK3368_PD_GPU_1]       = DOMAIN_RK3368(17, 16, 2, false),
+       [RK3368_PD_PERI]        = DOMAIN_RK3368(BIT(13), BIT(12), BIT(6), true),
+       [RK3368_PD_VIO]         = DOMAIN_RK3368(BIT(15), BIT(14), BIT(8), false),
+       [RK3368_PD_VIDEO]       = DOMAIN_RK3368(BIT(14), BIT(13), BIT(7), false),
+       [RK3368_PD_GPU_0]       = DOMAIN_RK3368(BIT(16), BIT(15), BIT(2), false),
+       [RK3368_PD_GPU_1]       = DOMAIN_RK3368(BIT(17), BIT(16), BIT(2), false),
 };
 
 static const struct rockchip_domain_info rk3399_pm_domains[] = {
-       [RK3399_PD_TCPD0]       = DOMAIN_RK3399(8, 8, -1, false),
-       [RK3399_PD_TCPD1]       = DOMAIN_RK3399(9, 9, -1, false),
-       [RK3399_PD_CCI]         = DOMAIN_RK3399(10, 10, -1, true),
-       [RK3399_PD_CCI0]        = DOMAIN_RK3399(-1, -1, 15, true),
-       [RK3399_PD_CCI1]        = DOMAIN_RK3399(-1, -1, 16, true),
-       [RK3399_PD_PERILP]      = DOMAIN_RK3399(11, 11, 1, true),
-       [RK3399_PD_PERIHP]      = DOMAIN_RK3399(12, 12, 2, true),
-       [RK3399_PD_CENTER]      = DOMAIN_RK3399(13, 13, 14, true),
-       [RK3399_PD_VIO]         = DOMAIN_RK3399(14, 14, 17, false),
-       [RK3399_PD_GPU]         = DOMAIN_RK3399(15, 15, 0, false),
-       [RK3399_PD_VCODEC]      = DOMAIN_RK3399(16, 16, 3, false),
-       [RK3399_PD_VDU]         = DOMAIN_RK3399(17, 17, 4, false),
-       [RK3399_PD_RGA]         = DOMAIN_RK3399(18, 18, 5, false),
-       [RK3399_PD_IEP]         = DOMAIN_RK3399(19, 19, 6, false),
-       [RK3399_PD_VO]          = DOMAIN_RK3399(20, 20, -1, false),
-       [RK3399_PD_VOPB]        = DOMAIN_RK3399(-1, -1, 7, false),
-       [RK3399_PD_VOPL]        = DOMAIN_RK3399(-1, -1, 8, false),
-       [RK3399_PD_ISP0]        = DOMAIN_RK3399(22, 22, 9, false),
-       [RK3399_PD_ISP1]        = DOMAIN_RK3399(23, 23, 10, false),
-       [RK3399_PD_HDCP]        = DOMAIN_RK3399(24, 24, 11, false),
-       [RK3399_PD_GMAC]        = DOMAIN_RK3399(25, 25, 23, true),
-       [RK3399_PD_EMMC]        = DOMAIN_RK3399(26, 26, 24, true),
-       [RK3399_PD_USB3]        = DOMAIN_RK3399(27, 27, 12, true),
-       [RK3399_PD_EDP]         = DOMAIN_RK3399(28, 28, 22, false),
-       [RK3399_PD_GIC]         = DOMAIN_RK3399(29, 29, 27, true),
-       [RK3399_PD_SD]          = DOMAIN_RK3399(30, 30, 28, true),
-       [RK3399_PD_SDIOAUDIO]   = DOMAIN_RK3399(31, 31, 29, true),
+       [RK3399_PD_TCPD0]       = DOMAIN_RK3399(BIT(8),  BIT(8),  0,       false),
+       [RK3399_PD_TCPD1]       = DOMAIN_RK3399(BIT(9),  BIT(9),  0,       false),
+       [RK3399_PD_CCI]         = DOMAIN_RK3399(BIT(10), BIT(10), 0,       true),
+       [RK3399_PD_CCI0]        = DOMAIN_RK3399(0,       0,       BIT(15), true),
+       [RK3399_PD_CCI1]        = DOMAIN_RK3399(0,       0,       BIT(16), true),
+       [RK3399_PD_PERILP]      = DOMAIN_RK3399(BIT(11), BIT(11), BIT(1),  true),
+       [RK3399_PD_PERIHP]      = DOMAIN_RK3399(BIT(12), BIT(12), BIT(2),  true),
+       [RK3399_PD_CENTER]      = DOMAIN_RK3399(BIT(13), BIT(13), BIT(14), true),
+       [RK3399_PD_VIO]         = DOMAIN_RK3399(BIT(14), BIT(14), BIT(17), false),
+       [RK3399_PD_GPU]         = DOMAIN_RK3399(BIT(15), BIT(15), BIT(0),  false),
+       [RK3399_PD_VCODEC]      = DOMAIN_RK3399(BIT(16), BIT(16), BIT(3),  false),
+       [RK3399_PD_VDU]         = DOMAIN_RK3399(BIT(17), BIT(17), BIT(4),  false),
+       [RK3399_PD_RGA]         = DOMAIN_RK3399(BIT(18), BIT(18), BIT(5),  false),
+       [RK3399_PD_IEP]         = DOMAIN_RK3399(BIT(19), BIT(19), BIT(6),  false),
+       [RK3399_PD_VO]          = DOMAIN_RK3399(BIT(20), BIT(20), 0,       false),
+       [RK3399_PD_VOPB]        = DOMAIN_RK3399(0,       0,       BIT(7),  false),
+       [RK3399_PD_VOPL]        = DOMAIN_RK3399(0,       0,       BIT(8),  false),
+       [RK3399_PD_ISP0]        = DOMAIN_RK3399(BIT(22), BIT(22), BIT(9),  false),
+       [RK3399_PD_ISP1]        = DOMAIN_RK3399(BIT(23), BIT(23), BIT(10), false),
+       [RK3399_PD_HDCP]        = DOMAIN_RK3399(BIT(24), BIT(24), BIT(11), false),
+       [RK3399_PD_GMAC]        = DOMAIN_RK3399(BIT(25), BIT(25), BIT(23), true),
+       [RK3399_PD_EMMC]        = DOMAIN_RK3399(BIT(26), BIT(26), BIT(24), true),
+       [RK3399_PD_USB3]        = DOMAIN_RK3399(BIT(27), BIT(27), BIT(12), true),
+       [RK3399_PD_EDP]         = DOMAIN_RK3399(BIT(28), BIT(28), BIT(22), false),
+       [RK3399_PD_GIC]         = DOMAIN_RK3399(BIT(29), BIT(29), BIT(27), true),
+       [RK3399_PD_SD]          = DOMAIN_RK3399(BIT(30), BIT(30), BIT(28), true),
+       [RK3399_PD_SDIOAUDIO]   = DOMAIN_RK3399(BIT(31), BIT(31), BIT(29), true),
 };
 
 static const struct rockchip_pmu_info px30_pmu = {
index fbfce48ffb0d4526ea5bdb469563e7d47c8995a1..c8ef05d6b8c7e0003049e8e8cc0e462724f657d2 100644 (file)
@@ -109,6 +109,7 @@ config ARCH_TEGRA_186_SOC
 config ARCH_TEGRA_194_SOC
        bool "NVIDIA Tegra194 SoC"
        select MAILBOX
+       select PINCTRL_TEGRA194
        select TEGRA_BPMP
        select TEGRA_HSP_MBOX
        select TEGRA_IVC
index 9b84bcc356d060b33e2e2adbd7746e45a9c1a174..3eb44e65b3261ee366e0ade55f99013839cf4819 100644 (file)
@@ -133,8 +133,10 @@ static int tegra_fuse_probe(struct platform_device *pdev)
 
        fuse->clk = devm_clk_get(&pdev->dev, "fuse");
        if (IS_ERR(fuse->clk)) {
-               dev_err(&pdev->dev, "failed to get FUSE clock: %ld",
-                       PTR_ERR(fuse->clk));
+               if (PTR_ERR(fuse->clk) != -EPROBE_DEFER)
+                       dev_err(&pdev->dev, "failed to get FUSE clock: %ld",
+                               PTR_ERR(fuse->clk));
+
                fuse->base = base;
                return PTR_ERR(fuse->clk);
        }
index 17e7796a832bb1ddf3d1e035e8837c9b79bf8ca8..9f9c1c677cf4200336e6876c467e669c2abc93ea 100644 (file)
@@ -232,6 +232,11 @@ struct tegra_pmc_soc {
        const char * const *reset_levels;
        unsigned int num_reset_levels;
 
+       /*
+        * These describe events that can wake the system from sleep (i.e.
+        * LP0 or SC7). Wakeup from other sleep states (such as LP1 or LP2)
+        * are dealt with in the LIC.
+        */
        const struct tegra_wake_event *wake_events;
        unsigned int num_wake_events;
 };
@@ -1855,6 +1860,9 @@ static int tegra_pmc_irq_alloc(struct irq_domain *domain, unsigned int virq,
        unsigned int i;
        int err = 0;
 
+       if (WARN_ON(num_irqs > 1))
+               return -EINVAL;
+
        for (i = 0; i < soc->num_wake_events; i++) {
                const struct tegra_wake_event *event = &soc->wake_events[i];
 
@@ -1895,6 +1903,11 @@ static int tegra_pmc_irq_alloc(struct irq_domain *domain, unsigned int virq,
                }
        }
 
+       /*
+        * For interrupts that don't have associated wake events, assign a
+        * dummy hardware IRQ number. This is used in the ->irq_set_type()
+        * and ->irq_set_wake() callbacks to return early for these IRQs.
+        */
        if (i == soc->num_wake_events)
                err = irq_domain_set_hwirq_and_chip(domain, virq, ULONG_MAX,
                                                    &pmc->irq, pmc);
@@ -1913,6 +1926,10 @@ static int tegra_pmc_irq_set_wake(struct irq_data *data, unsigned int on)
        unsigned int offset, bit;
        u32 value;
 
+       /* nothing to do if there's no associated wake event */
+       if (WARN_ON(data->hwirq == ULONG_MAX))
+               return 0;
+
        offset = data->hwirq / 32;
        bit = data->hwirq % 32;
 
@@ -1940,6 +1957,7 @@ static int tegra_pmc_irq_set_type(struct irq_data *data, unsigned int type)
        struct tegra_pmc *pmc = irq_data_get_irq_chip_data(data);
        u32 value;
 
+       /* nothing to do if there's no associated wake event */
        if (data->hwirq == ULONG_MAX)
                return 0;
 
index d7d50d48d05d4ab02fec2367e1098bdeddfd6081..cf545f428d03b3b7649dda60417179f0fa88b69e 100644 (file)
@@ -9,6 +9,11 @@ config ARCH_K3_AM6_SOC
        help
          Enable support for TI's AM6 SoC Family support
 
+config ARCH_K3_J721E_SOC
+       bool "K3 J721E SoC"
+       help
+         Enable support for TI's J721E SoC Family support
+
 endif
 
 endif
index fc5802ccb1c00da9e0d209e7d3dd949bd8f6583c..bb77c220b6f82b34c81cdf9f2e43bef82bef10b3 100644 (file)
@@ -178,6 +178,7 @@ static int am33xx_pm_suspend(suspend_state_t suspend_state)
                                          suspend_wfi_flags);
 
                suspend_wfi_flags &= ~WFI_FLAG_RTC_ONLY;
+               dev_info(pm33xx_dev, "Entering RTC Only mode with DDR in self-refresh\n");
 
                if (!ret) {
                        clk_restore_context();
index 04c23951b831d78dd5a1e4ab8360123ac9dd65c8..fd385c8c53a52192d9141ad57270c87be10fed62 100644 (file)
@@ -497,6 +497,7 @@ config SERIAL_SA1100
        bool "SA1100 serial port support"
        depends on ARCH_SA1100
        select SERIAL_CORE
+       select SERIAL_MCTRL_GPIO if GPIOLIB
        help
          If you have a machine based on a SA1100/SA1110 StrongARM(R) CPU you
          can enable its onboard serial port by enabling this option.
index a399772be3fc5342de88d3d202a05b32758c1d0c..8e618129e65c9e4e275fc0603bdf85c24d7fb266 100644 (file)
@@ -28,6 +28,8 @@
 #include <mach/hardware.h>
 #include <mach/irqs.h>
 
+#include "serial_mctrl_gpio.h"
+
 /* We've been assigned a range on the "Low-density serial ports" major */
 #define SERIAL_SA1100_MAJOR    204
 #define MINOR_START            5
@@ -77,6 +79,7 @@ struct sa1100_port {
        struct uart_port        port;
        struct timer_list       timer;
        unsigned int            old_status;
+       struct mctrl_gpios      *gpios;
 };
 
 /*
@@ -174,6 +177,8 @@ static void sa1100_enable_ms(struct uart_port *port)
                container_of(port, struct sa1100_port, port);
 
        mod_timer(&sport->timer, jiffies);
+
+       mctrl_gpio_enable_ms(sport->gpios);
 }
 
 static void
@@ -322,11 +327,21 @@ static unsigned int sa1100_tx_empty(struct uart_port *port)
 
 static unsigned int sa1100_get_mctrl(struct uart_port *port)
 {
-       return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
+       struct sa1100_port *sport =
+               container_of(port, struct sa1100_port, port);
+       int ret = TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
+
+       mctrl_gpio_get(sport->gpios, &ret);
+
+       return ret;
 }
 
 static void sa1100_set_mctrl(struct uart_port *port, unsigned int mctrl)
 {
+       struct sa1100_port *sport =
+               container_of(port, struct sa1100_port, port);
+
+       mctrl_gpio_set(sport->gpios, mctrl);
 }
 
 /*
@@ -842,6 +857,31 @@ static int sa1100_serial_resume(struct platform_device *dev)
        return 0;
 }
 
+static int sa1100_serial_add_one_port(struct sa1100_port *sport, struct platform_device *dev)
+{
+       sport->port.dev = &dev->dev;
+
+       // mctrl_gpio_init() requires that the GPIO driver supports interrupts,
+       // but we need to support GPIO drivers for hardware that has no such
+       // interrupts.  Use mctrl_gpio_init_noauto() instead.
+       sport->gpios = mctrl_gpio_init_noauto(sport->port.dev, 0);
+       if (IS_ERR(sport->gpios)) {
+               int err = PTR_ERR(sport->gpios);
+
+               dev_err(sport->port.dev, "failed to get mctrl gpios: %d\n",
+                       err);
+
+               if (err == -EPROBE_DEFER)
+                       return err;
+
+               sport->gpios = NULL;
+       }
+
+       platform_set_drvdata(dev, sport);
+
+       return uart_add_one_port(&sa1100_reg, &sport->port);
+}
+
 static int sa1100_serial_probe(struct platform_device *dev)
 {
        struct resource *res = dev->resource;
@@ -856,9 +896,7 @@ static int sa1100_serial_probe(struct platform_device *dev)
                        if (sa1100_ports[i].port.mapbase != res->start)
                                continue;
 
-                       sa1100_ports[i].port.dev = &dev->dev;
-                       uart_add_one_port(&sa1100_reg, &sa1100_ports[i].port);
-                       platform_set_drvdata(dev, &sa1100_ports[i]);
+                       sa1100_serial_add_one_port(&sa1100_ports[i], dev);
                        break;
                }
        }
index 212b4a854f2c624359b7eeca9b1ae71e71324d1f..38651fae7f21aef15fd40f187d915144c9d3f952 100644 (file)
@@ -4,6 +4,7 @@ config BTRFS_FS
        tristate "Btrfs filesystem support"
        select CRYPTO
        select CRYPTO_CRC32C
+       select LIBCRC32C
        select ZLIB_INFLATE
        select ZLIB_DEFLATE
        select LZO_COMPRESS
index 41a2bd2e0c56d333bcc5f2792b9ca6cb277a184f..5f7ee70b3d1a0fd26f620901b62d1d12b468ec3a 100644 (file)
@@ -4106,6 +4106,7 @@ void close_ctree(struct btrfs_fs_info *fs_info)
        percpu_counter_destroy(&fs_info->dev_replace.bio_counter);
        cleanup_srcu_struct(&fs_info->subvol_srcu);
 
+       btrfs_free_csum_hash(fs_info);
        btrfs_free_stripe_hash_table(fs_info);
        btrfs_free_ref_cache(fs_info);
 }
index 1af069a9a0c7205b4ba7649463dcba5288f9c36f..ee582a36653d30ee1f833153f9bc00225f7978ae 100644 (file)
@@ -395,10 +395,31 @@ static noinline int add_async_extent(struct async_chunk *cow,
        return 0;
 }
 
+/*
+ * Check if the inode has flags compatible with compression
+ */
+static inline bool inode_can_compress(struct inode *inode)
+{
+       if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATACOW ||
+           BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)
+               return false;
+       return true;
+}
+
+/*
+ * Check if the inode needs to be submitted to compression, based on mount
+ * options, defragmentation, properties or heuristics.
+ */
 static inline int inode_need_compress(struct inode *inode, u64 start, u64 end)
 {
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
 
+       if (!inode_can_compress(inode)) {
+               WARN(IS_ENABLED(CONFIG_BTRFS_DEBUG),
+                       KERN_ERR "BTRFS: unexpected compression for ino %llu\n",
+                       btrfs_ino(BTRFS_I(inode)));
+               return 0;
+       }
        /* force compress */
        if (btrfs_test_opt(fs_info, FORCE_COMPRESS))
                return 1;
@@ -1631,7 +1652,8 @@ int btrfs_run_delalloc_range(struct inode *inode, struct page *locked_page,
        } else if (BTRFS_I(inode)->flags & BTRFS_INODE_PREALLOC && !force_cow) {
                ret = run_delalloc_nocow(inode, locked_page, start, end,
                                         page_started, 0, nr_written);
-       } else if (!inode_need_compress(inode, start, end)) {
+       } else if (!inode_can_compress(inode) ||
+                  !inode_need_compress(inode, start, end)) {
                ret = cow_file_range(inode, locked_page, start, end, end,
                                      page_started, nr_written, 1, NULL);
        } else {
index a13ddba1ebc3b75f9fc0f301036d0d7979a74c1d..d74b74ca07afd00d9302954408a8b87b04c0b09f 100644 (file)
@@ -5941,6 +5941,7 @@ int btrfs_get_io_geometry(struct btrfs_fs_info *fs_info, enum btrfs_map_op op,
        u64 stripe_len;
        u64 raid56_full_stripe_start = (u64)-1;
        int data_stripes;
+       int ret = 0;
 
        ASSERT(op != BTRFS_MAP_DISCARD);
 
@@ -5961,8 +5962,8 @@ int btrfs_get_io_geometry(struct btrfs_fs_info *fs_info, enum btrfs_map_op op,
                btrfs_crit(fs_info,
 "stripe math has gone wrong, stripe_offset=%llu offset=%llu start=%llu logical=%llu stripe_len=%llu",
                        stripe_offset, offset, em->start, logical, stripe_len);
-               free_extent_map(em);
-               return -EINVAL;
+               ret = -EINVAL;
+               goto out;
        }
 
        /* stripe_offset is the offset of this block in its stripe */
@@ -6009,7 +6010,10 @@ int btrfs_get_io_geometry(struct btrfs_fs_info *fs_info, enum btrfs_map_op op,
        io_geom->stripe_offset = stripe_offset;
        io_geom->raid56_stripe_offset = raid56_full_stripe_start;
 
-       return 0;
+out:
+       /* once for us */
+       free_extent_map(em);
+       return ret;
 }
 
 static int __btrfs_map_block(struct btrfs_fs_info *fs_info,
index aab29f48c62da2fbef1a6cf803cc6b753dfdc762..4ca0b8ff9a7270c7479fa13920cce5570df8e1ee 100644 (file)
@@ -1267,7 +1267,7 @@ __dentry_leases_walk(struct ceph_mds_client *mdsc,
                if (!spin_trylock(&dentry->d_lock))
                        continue;
 
-               if (dentry->d_lockref.count < 0) {
+               if (__lockref_is_dead(&dentry->d_lockref)) {
                        list_del_init(&di->lease_list);
                        goto next;
                }
index 270d3c58fb3b2ac0917d3d40f6083d2d8558b6a0..3289b566463f91cc913d886f7db3c41189746d90 100644 (file)
@@ -1104,6 +1104,10 @@ ssize_t cifs_file_copychunk_range(unsigned int xid,
                goto out;
        }
 
+       rc = -EOPNOTSUPP;
+       if (!target_tcon->ses->server->ops->copychunk_range)
+               goto out;
+
        /*
         * Note: cifs case is easier than btrfs since server responsible for
         * checks for proper open modes and file type and if it wants
@@ -1115,11 +1119,12 @@ ssize_t cifs_file_copychunk_range(unsigned int xid,
        /* should we flush first and last page first */
        truncate_inode_pages(&target_inode->i_data, 0);
 
-       if (target_tcon->ses->server->ops->copychunk_range)
+       rc = file_modified(dst_file);
+       if (!rc)
                rc = target_tcon->ses->server->ops->copychunk_range(xid,
                        smb_file_src, smb_file_target, off, len, destoff);
-       else
-               rc = -EOPNOTSUPP;
+
+       file_accessed(src_file);
 
        /* force revalidate of size and timestamps of target file now
         * that target is updated on the server
index aea005703785524d0360f5a0c3b764599a407980..4b21a90015a96e647de60b99dc20cd1f7ccce5a7 100644 (file)
@@ -152,5 +152,5 @@ extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg);
 extern const struct export_operations cifs_export_ops;
 #endif /* CONFIG_CIFS_NFSD_EXPORT */
 
-#define CIFS_VERSION   "2.20"
+#define CIFS_VERSION   "2.21"
 #endif                         /* _CIFSFS_H */
index 1bffe029fb6633c1443484fae69214c8efc64222..56ca4b8ccabac909abc312602506020363b52948 100644 (file)
@@ -2406,6 +2406,8 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
        struct inode *inode = d_inode(direntry);
        struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
        struct cifsInodeInfo *cifsInode = CIFS_I(inode);
+       struct cifsFileInfo *wfile;
+       struct cifs_tcon *tcon;
        char *full_path = NULL;
        int rc = -EACCES;
        __u32 dosattr = 0;
@@ -2452,6 +2454,20 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
        mapping_set_error(inode->i_mapping, rc);
        rc = 0;
 
+       if (attrs->ia_valid & ATTR_MTIME) {
+               rc = cifs_get_writable_file(cifsInode, false, &wfile);
+               if (!rc) {
+                       tcon = tlink_tcon(wfile->tlink);
+                       rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid);
+                       cifsFileInfo_put(wfile);
+                       if (rc)
+                               return rc;
+               } else if (rc != -EBADF)
+                       return rc;
+               else
+                       rc = 0;
+       }
+
        if (attrs->ia_valid & ATTR_SIZE) {
                rc = cifs_set_file_size(inode, attrs, xid, full_path);
                if (rc != 0)
index 54bffb2a1786d00c5becdb9c2c275c0aa5f87c99..e6a1fc72018fd1821f8499a70eebe6edd7400bdc 100644 (file)
@@ -88,14 +88,20 @@ smb2_open_file(const unsigned int xid, struct cifs_open_parms *oparms,
        }
 
        if (buf) {
-               /* open response does not have IndexNumber field - get it */
-               rc = SMB2_get_srv_num(xid, oparms->tcon, fid->persistent_fid,
+               /* if open response does not have IndexNumber field - get it */
+               if (smb2_data->IndexNumber == 0) {
+                       rc = SMB2_get_srv_num(xid, oparms->tcon,
+                                     fid->persistent_fid,
                                      fid->volatile_fid,
                                      &smb2_data->IndexNumber);
-               if (rc) {
-                       /* let get_inode_info disable server inode numbers */
-                       smb2_data->IndexNumber = 0;
-                       rc = 0;
+                       if (rc) {
+                               /*
+                                * let get_inode_info disable server inode
+                                * numbers
+                                */
+                               smb2_data->IndexNumber = 0;
+                               rc = 0;
+                       }
                }
                move_smb2_info_to_cifs(buf, smb2_data);
        }
index 0cdc4e47ca875fc7f9bd4f3fb2af2b64e897362c..a5bc1b671c126579a7161853ad0ef352e01f8c39 100644 (file)
@@ -694,8 +694,51 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid)
 
        smb2_set_related(&rqst[1]);
 
+       /*
+        * We do not hold the lock for the open because in case
+        * SMB2_open needs to reconnect, it will end up calling
+        * cifs_mark_open_files_invalid() which takes the lock again
+        * thus causing a deadlock
+        */
+
+       mutex_unlock(&tcon->crfid.fid_mutex);
        rc = compound_send_recv(xid, ses, flags, 2, rqst,
                                resp_buftype, rsp_iov);
+       mutex_lock(&tcon->crfid.fid_mutex);
+
+       /*
+        * Now we need to check again as the cached root might have
+        * been successfully re-opened from a concurrent process
+        */
+
+       if (tcon->crfid.is_valid) {
+               /* work was already done */
+
+               /* stash fids for close() later */
+               struct cifs_fid fid = {
+                       .persistent_fid = pfid->persistent_fid,
+                       .volatile_fid = pfid->volatile_fid,
+               };
+
+               /*
+                * caller expects this func to set pfid to a valid
+                * cached root, so we copy the existing one and get a
+                * reference.
+                */
+               memcpy(pfid, tcon->crfid.fid, sizeof(*pfid));
+               kref_get(&tcon->crfid.refcount);
+
+               mutex_unlock(&tcon->crfid.fid_mutex);
+
+               if (rc == 0) {
+                       /* close extra handle outside of crit sec */
+                       SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
+               }
+               goto oshr_free;
+       }
+
+       /* Cached root is still invalid, continue normaly */
+
        if (rc)
                goto oshr_exit;
 
@@ -711,11 +754,12 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid)
        tcon->crfid.is_valid = true;
        kref_init(&tcon->crfid.refcount);
 
+       /* BB TBD check to see if oplock level check can be removed below */
        if (o_rsp->OplockLevel == SMB2_OPLOCK_LEVEL_LEASE) {
                kref_get(&tcon->crfid.refcount);
-               oplock = smb2_parse_lease_state(server, o_rsp,
-                                               &oparms.fid->epoch,
-                                               oparms.fid->lease_key);
+               smb2_parse_contexts(server, o_rsp,
+                               &oparms.fid->epoch,
+                               oparms.fid->lease_key, &oplock, NULL);
        } else
                goto oshr_exit;
 
@@ -729,8 +773,9 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid)
                                (char *)&tcon->crfid.file_all_info))
                tcon->crfid.file_all_info_is_valid = 1;
 
- oshr_exit:
+oshr_exit:
        mutex_unlock(&tcon->crfid.fid_mutex);
+oshr_free:
        SMB2_open_free(&rqst[0]);
        SMB2_query_info_free(&rqst[1]);
        free_rsp_buf(resp_buftype[0], rsp_iov[0].iov_base);
index f58e4dc3987b3fe0cd942cbb8e94c24d4f173478..c8cd7b6cdda2a5c93b0c6a5cf374d6b29291726e 100644 (file)
@@ -1873,10 +1873,21 @@ create_reconnect_durable_buf(struct cifs_fid *fid)
        return buf;
 }
 
-__u8
-smb2_parse_lease_state(struct TCP_Server_Info *server,
+static void
+parse_query_id_ctxt(struct create_context *cc, struct smb2_file_all_info *buf)
+{
+       struct create_on_disk_id *pdisk_id = (struct create_on_disk_id *)cc;
+
+       cifs_dbg(FYI, "parse query id context 0x%llx 0x%llx\n",
+               pdisk_id->DiskFileId, pdisk_id->VolumeId);
+       buf->IndexNumber = pdisk_id->DiskFileId;
+}
+
+void
+smb2_parse_contexts(struct TCP_Server_Info *server,
                       struct smb2_create_rsp *rsp,
-                      unsigned int *epoch, char *lease_key)
+                      unsigned int *epoch, char *lease_key, __u8 *oplock,
+                      struct smb2_file_all_info *buf)
 {
        char *data_offset;
        struct create_context *cc;
@@ -1884,15 +1895,24 @@ smb2_parse_lease_state(struct TCP_Server_Info *server,
        unsigned int remaining;
        char *name;
 
+       *oplock = 0;
        data_offset = (char *)rsp + le32_to_cpu(rsp->CreateContextsOffset);
        remaining = le32_to_cpu(rsp->CreateContextsLength);
        cc = (struct create_context *)data_offset;
+
+       /* Initialize inode number to 0 in case no valid data in qfid context */
+       if (buf)
+               buf->IndexNumber = 0;
+
        while (remaining >= sizeof(struct create_context)) {
                name = le16_to_cpu(cc->NameOffset) + (char *)cc;
                if (le16_to_cpu(cc->NameLength) == 4 &&
-                   strncmp(name, "RqLs", 4) == 0)
-                       return server->ops->parse_lease_buf(cc, epoch,
-                                                           lease_key);
+                   strncmp(name, SMB2_CREATE_REQUEST_LEASE, 4) == 0)
+                       *oplock = server->ops->parse_lease_buf(cc, epoch,
+                                                          lease_key);
+               else if (buf && (le16_to_cpu(cc->NameLength) == 4) &&
+                   strncmp(name, SMB2_CREATE_QUERY_ON_DISK_ID, 4) == 0)
+                       parse_query_id_ctxt(cc, buf);
 
                next = le32_to_cpu(cc->Next);
                if (!next)
@@ -1901,7 +1921,10 @@ smb2_parse_lease_state(struct TCP_Server_Info *server,
                cc = (struct create_context *)((char *)cc + next);
        }
 
-       return 0;
+       if (rsp->OplockLevel != SMB2_OPLOCK_LEVEL_LEASE)
+               *oplock = rsp->OplockLevel;
+
+       return;
 }
 
 static int
@@ -2588,12 +2611,9 @@ SMB2_open(const unsigned int xid, struct cifs_open_parms *oparms, __le16 *path,
                buf->DeletePending = 0;
        }
 
-       if (rsp->OplockLevel == SMB2_OPLOCK_LEVEL_LEASE)
-               *oplock = smb2_parse_lease_state(server, rsp,
-                                                &oparms->fid->epoch,
-                                                oparms->fid->lease_key);
-       else
-               *oplock = rsp->OplockLevel;
+
+       smb2_parse_contexts(server, rsp, &oparms->fid->epoch,
+                           oparms->fid->lease_key, oplock, buf);
 creat_exit:
        SMB2_open_free(&rqst);
        free_rsp_buf(resp_buftype, rsp);
index 7e2e782f8eddd52aebc7fd156bc62b366316b726..747de9317659198b923b1a850da47bb6641d195c 100644 (file)
@@ -818,7 +818,9 @@ struct durable_reconnect_context_v2 {
 } __packed;
 
 /* See MS-SMB2 2.2.14.2.9 */
-struct on_disk_id {
+struct create_on_disk_id {
+       struct create_context ccontext;
+       __u8   Name[8];
        __le64 DiskFileId;
        __le64 VolumeId;
        __u32  Reserved[4];
index 52df125e918984139b176a5f4101ae6da11c7e0f..07ca72486cfac50f7207487085f68036c4e635c6 100644 (file)
@@ -228,9 +228,10 @@ extern int smb3_validate_negotiate(const unsigned int, struct cifs_tcon *);
 
 extern enum securityEnum smb2_select_sectype(struct TCP_Server_Info *,
                                        enum securityEnum);
-extern __u8 smb2_parse_lease_state(struct TCP_Server_Info *server,
-                                  struct smb2_create_rsp *rsp,
-                                  unsigned int *epoch, char *lease_key);
+extern void smb2_parse_contexts(struct TCP_Server_Info *server,
+                               struct smb2_create_rsp *rsp,
+                               unsigned int *epoch, char *lease_key,
+                               __u8 *oplock, struct smb2_file_all_info *buf);
 extern int smb3_encryption_required(const struct cifs_tcon *tcon);
 extern int smb2_validate_iov(unsigned int offset, unsigned int buffer_length,
                             struct kvec *iov, unsigned int min_buf_size);
index 6e30949d9f7794a584c1503fe8dbf7a51d0e83b7..a7ec2d3dff9282bf6e8fbc2c29e2f8e0301efb39 100644 (file)
@@ -638,9 +638,6 @@ COMPATIBLE_IOCTL(PPPIOCDISCONN)
 COMPATIBLE_IOCTL(PPPIOCATTCHAN)
 COMPATIBLE_IOCTL(PPPIOCGCHAN)
 COMPATIBLE_IOCTL(PPPIOCGL2TPSTATS)
-/* PPPOX */
-COMPATIBLE_IOCTL(PPPOEIOCSFWD)
-COMPATIBLE_IOCTL(PPPOEIOCDFWD)
 /* Big A */
 /* sparc only */
 /* Big Q for sound/OSS */
index f41121e5d1ec09462b425a7bbff004e788e26fd3..e88cf0554e65907d0136595a4521fc06fd521da4 100644 (file)
@@ -861,6 +861,32 @@ void dput(struct dentry *dentry)
 }
 EXPORT_SYMBOL(dput);
 
+static void __dput_to_list(struct dentry *dentry, struct list_head *list)
+__must_hold(&dentry->d_lock)
+{
+       if (dentry->d_flags & DCACHE_SHRINK_LIST) {
+               /* let the owner of the list it's on deal with it */
+               --dentry->d_lockref.count;
+       } else {
+               if (dentry->d_flags & DCACHE_LRU_LIST)
+                       d_lru_del(dentry);
+               if (!--dentry->d_lockref.count)
+                       d_shrink_add(dentry, list);
+       }
+}
+
+void dput_to_list(struct dentry *dentry, struct list_head *list)
+{
+       rcu_read_lock();
+       if (likely(fast_dput(dentry))) {
+               rcu_read_unlock();
+               return;
+       }
+       rcu_read_unlock();
+       if (!retain_dentry(dentry))
+               __dput_to_list(dentry, list);
+       spin_unlock(&dentry->d_lock);
+}
 
 /* This must be called with d_lock held */
 static inline void __dget_dlock(struct dentry *dentry)
@@ -1067,7 +1093,7 @@ out:
        return false;
 }
 
-static void shrink_dentry_list(struct list_head *list)
+void shrink_dentry_list(struct list_head *list)
 {
        while (!list_empty(list)) {
                struct dentry *dentry, *parent;
@@ -1089,18 +1115,9 @@ static void shrink_dentry_list(struct list_head *list)
                rcu_read_unlock();
                d_shrink_del(dentry);
                parent = dentry->d_parent;
+               if (parent != dentry)
+                       __dput_to_list(parent, list);
                __dentry_kill(dentry);
-               if (parent == dentry)
-                       continue;
-               /*
-                * We need to prune ancestors too. This is necessary to prevent
-                * quadratic behavior of shrink_dcache_parent(), but is also
-                * expected to be beneficial in reducing dentry cache
-                * fragmentation.
-                */
-               dentry = parent;
-               while (dentry && !lockref_put_or_lock(&dentry->d_lockref))
-                       dentry = dentry_kill(dentry);
        }
 }
 
@@ -1445,8 +1462,11 @@ out:
 
 struct select_data {
        struct dentry *start;
+       union {
+               long found;
+               struct dentry *victim;
+       };
        struct list_head dispose;
-       int found;
 };
 
 static enum d_walk_ret select_collect(void *_data, struct dentry *dentry)
@@ -1478,6 +1498,37 @@ out:
        return ret;
 }
 
+static enum d_walk_ret select_collect2(void *_data, struct dentry *dentry)
+{
+       struct select_data *data = _data;
+       enum d_walk_ret ret = D_WALK_CONTINUE;
+
+       if (data->start == dentry)
+               goto out;
+
+       if (dentry->d_flags & DCACHE_SHRINK_LIST) {
+               if (!dentry->d_lockref.count) {
+                       rcu_read_lock();
+                       data->victim = dentry;
+                       return D_WALK_QUIT;
+               }
+       } else {
+               if (dentry->d_flags & DCACHE_LRU_LIST)
+                       d_lru_del(dentry);
+               if (!dentry->d_lockref.count)
+                       d_shrink_add(dentry, &data->dispose);
+       }
+       /*
+        * We can return to the caller if we have found some (this
+        * ensures forward progress). We'll be coming back to find
+        * the rest.
+        */
+       if (!list_empty(&data->dispose))
+               ret = need_resched() ? D_WALK_QUIT : D_WALK_NORETRY;
+out:
+       return ret;
+}
+
 /**
  * shrink_dcache_parent - prune dcache
  * @parent: parent of entries to prune
@@ -1487,12 +1538,9 @@ out:
 void shrink_dcache_parent(struct dentry *parent)
 {
        for (;;) {
-               struct select_data data;
+               struct select_data data = {.start = parent};
 
                INIT_LIST_HEAD(&data.dispose);
-               data.start = parent;
-               data.found = 0;
-
                d_walk(parent, &data, select_collect);
 
                if (!list_empty(&data.dispose)) {
@@ -1503,6 +1551,24 @@ void shrink_dcache_parent(struct dentry *parent)
                cond_resched();
                if (!data.found)
                        break;
+               data.victim = NULL;
+               d_walk(parent, &data, select_collect2);
+               if (data.victim) {
+                       struct dentry *parent;
+                       spin_lock(&data.victim->d_lock);
+                       if (!shrink_lock_dentry(data.victim)) {
+                               spin_unlock(&data.victim->d_lock);
+                               rcu_read_unlock();
+                       } else {
+                               rcu_read_unlock();
+                               parent = data.victim->d_parent;
+                               if (parent != data.victim)
+                                       __dput_to_list(parent, &data.dispose);
+                               __dentry_kill(data.victim);
+                       }
+               }
+               if (!list_empty(&data.dispose))
+                       shrink_dentry_list(&data.dispose);
        }
 }
 EXPORT_SYMBOL(shrink_dcache_parent);
index a6497cf8ae53aa2bc7dcc2996887fcb92f1e9820..47ef3c71ce907789994f73e49b2d6b072022463e 100644 (file)
@@ -19,20 +19,14 @@ void pin_remove(struct fs_pin *pin)
        spin_unlock_irq(&pin->wait.lock);
 }
 
-void pin_insert_group(struct fs_pin *pin, struct vfsmount *m, struct hlist_head *p)
+void pin_insert(struct fs_pin *pin, struct vfsmount *m)
 {
        spin_lock(&pin_lock);
-       if (p)
-               hlist_add_head(&pin->s_list, p);
+       hlist_add_head(&pin->s_list, &m->mnt_sb->s_pins);
        hlist_add_head(&pin->m_list, &real_mount(m)->mnt_pins);
        spin_unlock(&pin_lock);
 }
 
-void pin_insert(struct fs_pin *pin, struct vfsmount *m)
-{
-       pin_insert_group(pin, m, &m->mnt_sb->s_pins);
-}
-
 void pin_kill(struct fs_pin *p)
 {
        wait_queue_entry_t wait;
index ff5173212803b2e6a57335e2e2216e422af746e6..315fcd8d237ccb7264aa06f15e7d6c977ab52bf5 100644 (file)
@@ -157,6 +157,8 @@ extern long prune_dcache_sb(struct super_block *sb, struct shrink_control *sc);
 extern struct dentry *d_alloc_cursor(struct dentry *);
 extern struct dentry * d_alloc_pseudo(struct super_block *, const struct qstr *);
 extern char *simple_dname(struct dentry *, char *, int);
+extern void dput_to_list(struct dentry *, struct list_head *);
+extern void shrink_dentry_list(struct list_head *);
 
 /*
  * read_write.c
index 6250de544760e1ed28bd1e91df35f45ad29d9e8c..711a4093e475e9fdf9fb8df1d81ab289ee33a498 100644 (file)
@@ -58,7 +58,10 @@ struct mount {
        struct mount *mnt_master;       /* slave is on master->mnt_slave_list */
        struct mnt_namespace *mnt_ns;   /* containing namespace */
        struct mountpoint *mnt_mp;      /* where is it mounted */
-       struct hlist_node mnt_mp_list;  /* list mounts with the same mountpoint */
+       union {
+               struct hlist_node mnt_mp_list;  /* list mounts with the same mountpoint */
+               struct hlist_node mnt_umount;
+       };
        struct list_head mnt_umounting; /* list entry for umount propagation */
 #ifdef CONFIG_FSNOTIFY
        struct fsnotify_mark_connector __rcu *mnt_fsnotify_marks;
@@ -68,8 +71,7 @@ struct mount {
        int mnt_group_id;               /* peer group identifier */
        int mnt_expiry_mark;            /* true if marked for expiry */
        struct hlist_head mnt_pins;
-       struct fs_pin mnt_umount;
-       struct dentry *mnt_ex_mountpoint;
+       struct hlist_head mnt_stuck_children;
 } __randomize_layout;
 
 #define MNT_NS_INTERNAL ERR_PTR(-EINVAL) /* distinct from any mnt_namespace */
index f0d664adb9ba731abcfff90f886b3f03a923381f..6464ea4acba9418f489fe8d5f867f55ef232b4e3 100644 (file)
@@ -70,6 +70,8 @@ static struct hlist_head *mount_hashtable __read_mostly;
 static struct hlist_head *mountpoint_hashtable __read_mostly;
 static struct kmem_cache *mnt_cache __read_mostly;
 static DECLARE_RWSEM(namespace_sem);
+static HLIST_HEAD(unmounted);  /* protected by namespace_sem */
+static LIST_HEAD(ex_mountpoints); /* protected by namespace_sem */
 
 /* /sys/fs */
 struct kobject *fs_kobj;
@@ -170,14 +172,6 @@ unsigned int mnt_get_count(struct mount *mnt)
 #endif
 }
 
-static void drop_mountpoint(struct fs_pin *p)
-{
-       struct mount *m = container_of(p, struct mount, mnt_umount);
-       dput(m->mnt_ex_mountpoint);
-       pin_remove(p);
-       mntput(&m->mnt);
-}
-
 static struct mount *alloc_vfsmnt(const char *name)
 {
        struct mount *mnt = kmem_cache_zalloc(mnt_cache, GFP_KERNEL);
@@ -215,7 +209,7 @@ static struct mount *alloc_vfsmnt(const char *name)
                INIT_LIST_HEAD(&mnt->mnt_slave);
                INIT_HLIST_NODE(&mnt->mnt_mp_list);
                INIT_LIST_HEAD(&mnt->mnt_umounting);
-               init_fs_pin(&mnt->mnt_umount, drop_mountpoint);
+               INIT_HLIST_HEAD(&mnt->mnt_stuck_children);
        }
        return mnt;
 
@@ -740,7 +734,7 @@ mountpoint:
 
        /* Add the new mountpoint to the hash table */
        read_seqlock_excl(&mount_lock);
-       new->m_dentry = dentry;
+       new->m_dentry = dget(dentry);
        new->m_count = 1;
        hlist_add_head(&new->m_hash, mp_hash(dentry));
        INIT_HLIST_HEAD(&new->m_list);
@@ -753,7 +747,11 @@ done:
        return mp;
 }
 
-static void put_mountpoint(struct mountpoint *mp)
+/*
+ * vfsmount lock must be held.  Additionally, the caller is responsible
+ * for serializing calls for given disposal list.
+ */
+static void __put_mountpoint(struct mountpoint *mp, struct list_head *list)
 {
        if (!--mp->m_count) {
                struct dentry *dentry = mp->m_dentry;
@@ -761,11 +759,18 @@ static void put_mountpoint(struct mountpoint *mp)
                spin_lock(&dentry->d_lock);
                dentry->d_flags &= ~DCACHE_MOUNTED;
                spin_unlock(&dentry->d_lock);
+               dput_to_list(dentry, list);
                hlist_del(&mp->m_hash);
                kfree(mp);
        }
 }
 
+/* called with namespace_lock and vfsmount lock */
+static void put_mountpoint(struct mountpoint *mp)
+{
+       __put_mountpoint(mp, &ex_mountpoints);
+}
+
 static inline int check_mnt(struct mount *mnt)
 {
        return mnt->mnt_ns == current->nsproxy->mnt_ns;
@@ -796,25 +801,17 @@ static void __touch_mnt_namespace(struct mnt_namespace *ns)
 /*
  * vfsmount lock must be held for write
  */
-static void unhash_mnt(struct mount *mnt)
+static struct mountpoint *unhash_mnt(struct mount *mnt)
 {
+       struct mountpoint *mp;
        mnt->mnt_parent = mnt;
        mnt->mnt_mountpoint = mnt->mnt.mnt_root;
        list_del_init(&mnt->mnt_child);
        hlist_del_init_rcu(&mnt->mnt_hash);
        hlist_del_init(&mnt->mnt_mp_list);
-       put_mountpoint(mnt->mnt_mp);
+       mp = mnt->mnt_mp;
        mnt->mnt_mp = NULL;
-}
-
-/*
- * vfsmount lock must be held for write
- */
-static void detach_mnt(struct mount *mnt, struct path *old_path)
-{
-       old_path->dentry = mnt->mnt_mountpoint;
-       old_path->mnt = &mnt->mnt_parent->mnt;
-       unhash_mnt(mnt);
+       return mp;
 }
 
 /*
@@ -822,9 +819,7 @@ static void detach_mnt(struct mount *mnt, struct path *old_path)
  */
 static void umount_mnt(struct mount *mnt)
 {
-       /* old mountpoint will be dropped when we can do that */
-       mnt->mnt_ex_mountpoint = mnt->mnt_mountpoint;
-       unhash_mnt(mnt);
+       put_mountpoint(unhash_mnt(mnt));
 }
 
 /*
@@ -836,7 +831,7 @@ void mnt_set_mountpoint(struct mount *mnt,
 {
        mp->m_count++;
        mnt_add_count(mnt, 1);  /* essentially, that's mntget */
-       child_mnt->mnt_mountpoint = dget(mp->m_dentry);
+       child_mnt->mnt_mountpoint = mp->m_dentry;
        child_mnt->mnt_parent = mnt;
        child_mnt->mnt_mp = mp;
        hlist_add_head(&child_mnt->mnt_mp_list, &mp->m_list);
@@ -863,7 +858,6 @@ static void attach_mnt(struct mount *mnt,
 void mnt_change_mountpoint(struct mount *parent, struct mountpoint *mp, struct mount *mnt)
 {
        struct mountpoint *old_mp = mnt->mnt_mp;
-       struct dentry *old_mountpoint = mnt->mnt_mountpoint;
        struct mount *old_parent = mnt->mnt_parent;
 
        list_del_init(&mnt->mnt_child);
@@ -873,22 +867,6 @@ void mnt_change_mountpoint(struct mount *parent, struct mountpoint *mp, struct m
        attach_mnt(mnt, parent, mp);
 
        put_mountpoint(old_mp);
-
-       /*
-        * Safely avoid even the suggestion this code might sleep or
-        * lock the mount hash by taking advantage of the knowledge that
-        * mnt_change_mountpoint will not release the final reference
-        * to a mountpoint.
-        *
-        * During mounting, the mount passed in as the parent mount will
-        * continue to use the old mountpoint and during unmounting, the
-        * old mountpoint will continue to exist until namespace_unlock,
-        * which happens well after mnt_change_mountpoint.
-        */
-       spin_lock(&old_mountpoint->d_lock);
-       old_mountpoint->d_lockref.count--;
-       spin_unlock(&old_mountpoint->d_lock);
-
        mnt_add_count(old_parent, -1);
 }
 
@@ -1103,19 +1081,22 @@ static struct mount *clone_mnt(struct mount *old, struct dentry *root,
 
 static void cleanup_mnt(struct mount *mnt)
 {
+       struct hlist_node *p;
+       struct mount *m;
        /*
-        * This probably indicates that somebody messed
-        * up a mnt_want/drop_write() pair.  If this
-        * happens, the filesystem was probably unable
-        * to make r/w->r/o transitions.
-        */
-       /*
+        * The warning here probably indicates that somebody messed
+        * up a mnt_want/drop_write() pair.  If this happens, the
+        * filesystem was probably unable to make r/w->r/o transitions.
         * The locking used to deal with mnt_count decrement provides barriers,
         * so mnt_get_writers() below is safe.
         */
        WARN_ON(mnt_get_writers(mnt));
        if (unlikely(mnt->mnt_pins.first))
                mnt_pin_kill(mnt);
+       hlist_for_each_entry_safe(m, p, &mnt->mnt_stuck_children, mnt_umount) {
+               hlist_del(&m->mnt_umount);
+               mntput(&m->mnt);
+       }
        fsnotify_vfsmount_delete(&mnt->mnt);
        dput(mnt->mnt.mnt_root);
        deactivate_super(mnt->mnt.mnt_sb);
@@ -1141,6 +1122,8 @@ static DECLARE_DELAYED_WORK(delayed_mntput_work, delayed_mntput);
 
 static void mntput_no_expire(struct mount *mnt)
 {
+       LIST_HEAD(list);
+
        rcu_read_lock();
        if (likely(READ_ONCE(mnt->mnt_ns))) {
                /*
@@ -1181,10 +1164,12 @@ static void mntput_no_expire(struct mount *mnt)
        if (unlikely(!list_empty(&mnt->mnt_mounts))) {
                struct mount *p, *tmp;
                list_for_each_entry_safe(p, tmp, &mnt->mnt_mounts,  mnt_child) {
-                       umount_mnt(p);
+                       __put_mountpoint(unhash_mnt(p), &list);
+                       hlist_add_head(&p->mnt_umount, &mnt->mnt_stuck_children);
                }
        }
        unlock_mount_hash();
+       shrink_dentry_list(&list);
 
        if (likely(!(mnt->mnt.mnt_flags & MNT_INTERNAL))) {
                struct task_struct *task = current;
@@ -1370,22 +1355,29 @@ int may_umount(struct vfsmount *mnt)
 
 EXPORT_SYMBOL(may_umount);
 
-static HLIST_HEAD(unmounted);  /* protected by namespace_sem */
-
 static void namespace_unlock(void)
 {
        struct hlist_head head;
+       struct hlist_node *p;
+       struct mount *m;
+       LIST_HEAD(list);
 
        hlist_move_list(&unmounted, &head);
+       list_splice_init(&ex_mountpoints, &list);
 
        up_write(&namespace_sem);
 
+       shrink_dentry_list(&list);
+
        if (likely(hlist_empty(&head)))
                return;
 
        synchronize_rcu_expedited();
 
-       group_pin_kill(&head);
+       hlist_for_each_entry_safe(m, p, &head, mnt_umount) {
+               hlist_del(&m->mnt_umount);
+               mntput(&m->mnt);
+       }
 }
 
 static inline void namespace_lock(void)
@@ -1472,8 +1464,6 @@ static void umount_tree(struct mount *mnt, enum umount_tree_flags how)
 
                disconnect = disconnect_mount(p, how);
 
-               pin_insert_group(&p->mnt_umount, &p->mnt_parent->mnt,
-                                disconnect ? &unmounted : NULL);
                if (mnt_has_parent(p)) {
                        mnt_add_count(p->mnt_parent, -1);
                        if (!disconnect) {
@@ -1481,6 +1471,7 @@ static void umount_tree(struct mount *mnt, enum umount_tree_flags how)
                                list_add_tail(&p->mnt_child, &p->mnt_parent->mnt_mounts);
                        } else {
                                umount_mnt(p);
+                               hlist_add_head(&p->mnt_umount, &unmounted);
                        }
                }
                change_mnt_propagation(p, MS_PRIVATE);
@@ -1626,15 +1617,15 @@ void __detach_mounts(struct dentry *dentry)
        namespace_lock();
        lock_mount_hash();
        mp = lookup_mountpoint(dentry);
-       if (IS_ERR_OR_NULL(mp))
+       if (!mp)
                goto out_unlock;
 
        event++;
        while (!hlist_empty(&mp->m_list)) {
                mnt = hlist_entry(mp->m_list.first, struct mount, mnt_mp_list);
                if (mnt->mnt.mnt_flags & MNT_UMOUNT) {
-                       hlist_add_head(&mnt->mnt_umount.s_list, &unmounted);
                        umount_mnt(mnt);
+                       hlist_add_head(&mnt->mnt_umount, &unmounted);
                }
                else umount_tree(mnt, UMOUNT_CONNECTED);
        }
@@ -2046,7 +2037,7 @@ int count_mounts(struct mnt_namespace *ns, struct mount *mnt)
 static int attach_recursive_mnt(struct mount *source_mnt,
                        struct mount *dest_mnt,
                        struct mountpoint *dest_mp,
-                       struct path *parent_path)
+                       bool moving)
 {
        struct user_namespace *user_ns = current->nsproxy->mnt_ns->user_ns;
        HLIST_HEAD(tree_list);
@@ -2064,7 +2055,7 @@ static int attach_recursive_mnt(struct mount *source_mnt,
                return PTR_ERR(smp);
 
        /* Is there space to add these mounts to the mount namespace? */
-       if (!parent_path) {
+       if (!moving) {
                err = count_mounts(ns, source_mnt);
                if (err)
                        goto out;
@@ -2083,8 +2074,8 @@ static int attach_recursive_mnt(struct mount *source_mnt,
        } else {
                lock_mount_hash();
        }
-       if (parent_path) {
-               detach_mnt(source_mnt, parent_path);
+       if (moving) {
+               unhash_mnt(source_mnt);
                attach_mnt(source_mnt, dest_mnt, dest_mp);
                touch_mnt_namespace(source_mnt->mnt_ns);
        } else {
@@ -2182,7 +2173,7 @@ static int graft_tree(struct mount *mnt, struct mount *p, struct mountpoint *mp)
              d_is_dir(mnt->mnt.mnt_root))
                return -ENOTDIR;
 
-       return attach_recursive_mnt(mnt, p, mp, NULL);
+       return attach_recursive_mnt(mnt, p, mp, false);
 }
 
 /*
@@ -2575,11 +2566,11 @@ out:
 
 static int do_move_mount(struct path *old_path, struct path *new_path)
 {
-       struct path parent_path = {.mnt = NULL, .dentry = NULL};
        struct mnt_namespace *ns;
        struct mount *p;
        struct mount *old;
-       struct mountpoint *mp;
+       struct mount *parent;
+       struct mountpoint *mp, *old_mp;
        int err;
        bool attached;
 
@@ -2589,7 +2580,9 @@ static int do_move_mount(struct path *old_path, struct path *new_path)
 
        old = real_mount(old_path->mnt);
        p = real_mount(new_path->mnt);
+       parent = old->mnt_parent;
        attached = mnt_has_parent(old);
+       old_mp = old->mnt_mp;
        ns = old->mnt_ns;
 
        err = -EINVAL;
@@ -2617,7 +2610,7 @@ static int do_move_mount(struct path *old_path, struct path *new_path)
        /*
         * Don't move a mount residing in a shared parent.
         */
-       if (attached && IS_MNT_SHARED(old->mnt_parent))
+       if (attached && IS_MNT_SHARED(parent))
                goto out;
        /*
         * Don't move a mount tree containing unbindable mounts to a destination
@@ -2633,18 +2626,21 @@ static int do_move_mount(struct path *old_path, struct path *new_path)
                        goto out;
 
        err = attach_recursive_mnt(old, real_mount(new_path->mnt), mp,
-                                  attached ? &parent_path : NULL);
+                                  attached);
        if (err)
                goto out;
 
        /* if the mount is moved, it should no longer be expire
         * automatically */
        list_del_init(&old->mnt_expire);
+       if (attached)
+               put_mountpoint(old_mp);
 out:
        unlock_mount(mp);
        if (!err) {
-               path_put(&parent_path);
-               if (!attached)
+               if (attached)
+                       mntput_no_expire(parent);
+               else
                        free_mnt_ns(ns);
        }
        return err;
@@ -3589,8 +3585,8 @@ EXPORT_SYMBOL(path_is_under);
 SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
                const char __user *, put_old)
 {
-       struct path new, old, parent_path, root_parent, root;
-       struct mount *new_mnt, *root_mnt, *old_mnt;
+       struct path new, old, root;
+       struct mount *new_mnt, *root_mnt, *old_mnt, *root_parent, *ex_parent;
        struct mountpoint *old_mp, *root_mp;
        int error;
 
@@ -3619,9 +3615,11 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
        new_mnt = real_mount(new.mnt);
        root_mnt = real_mount(root.mnt);
        old_mnt = real_mount(old.mnt);
+       ex_parent = new_mnt->mnt_parent;
+       root_parent = root_mnt->mnt_parent;
        if (IS_MNT_SHARED(old_mnt) ||
-               IS_MNT_SHARED(new_mnt->mnt_parent) ||
-               IS_MNT_SHARED(root_mnt->mnt_parent))
+               IS_MNT_SHARED(ex_parent) ||
+               IS_MNT_SHARED(root_parent))
                goto out4;
        if (!check_mnt(root_mnt) || !check_mnt(new_mnt))
                goto out4;
@@ -3638,7 +3636,6 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
                goto out4; /* not a mountpoint */
        if (!mnt_has_parent(root_mnt))
                goto out4; /* not attached */
-       root_mp = root_mnt->mnt_mp;
        if (new.mnt->mnt_root != new.dentry)
                goto out4; /* not a mountpoint */
        if (!mnt_has_parent(new_mnt))
@@ -3649,10 +3646,9 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
        /* make certain new is below the root */
        if (!is_path_reachable(new_mnt, new.dentry, &root))
                goto out4;
-       root_mp->m_count++; /* pin it so it won't go away */
        lock_mount_hash();
-       detach_mnt(new_mnt, &parent_path);
-       detach_mnt(root_mnt, &root_parent);
+       umount_mnt(new_mnt);
+       root_mp = unhash_mnt(root_mnt);  /* we'll need its mountpoint */
        if (root_mnt->mnt.mnt_flags & MNT_LOCKED) {
                new_mnt->mnt.mnt_flags |= MNT_LOCKED;
                root_mnt->mnt.mnt_flags &= ~MNT_LOCKED;
@@ -3660,7 +3656,8 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
        /* mount old root on put_old */
        attach_mnt(root_mnt, old_mnt, old_mp);
        /* mount new_root on / */
-       attach_mnt(new_mnt, real_mount(root_parent.mnt), root_mp);
+       attach_mnt(new_mnt, root_parent, root_mp);
+       mnt_add_count(root_parent, -1);
        touch_mnt_namespace(current->nsproxy->mnt_ns);
        /* A moved mount should not expire automatically */
        list_del_init(&new_mnt->mnt_expire);
@@ -3670,10 +3667,8 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
        error = 0;
 out4:
        unlock_mount(old_mp);
-       if (!error) {
-               path_put(&root_parent);
-               path_put(&parent_path);
-       }
+       if (!error)
+               mntput_no_expire(ex_parent);
 out3:
        path_put(&root);
 out2:
index 3683d2b1cc8e3d331174c4918c4ae052211ab405..628631e2e34fe630f6e24a814f43551d93484135 100644 (file)
@@ -457,10 +457,8 @@ int nfs_statfs(struct dentry *dentry, struct kstatfs *buf)
                struct dentry *pd_dentry;
 
                pd_dentry = dget_parent(dentry);
-               if (pd_dentry != NULL) {
-                       nfs_zap_caches(d_inode(pd_dentry));
-                       dput(pd_dentry);
-               }
+               nfs_zap_caches(d_inode(pd_dentry));
+               dput(pd_dentry);
        }
        nfs_free_fattr(res.fattr);
        if (error < 0)
index 8de846a83d8fc4e37a32e449c700d16a32cc9061..c38f0d46b267cb2d747eb9d26bf2599d03947be5 100644 (file)
@@ -31,7 +31,7 @@ header-test-                  += acpi/platform/acintel.h
 header-test-                   += acpi/platform/aclinux.h
 header-test-                   += acpi/platform/aclinuxex.h
 header-test-                   += acpi/processor.h
-header-test-                   += clocksource/hyperv_timer.h
+header-test-$(CONFIG_X86)      += clocksource/hyperv_timer.h
 header-test-                   += clocksource/timer-sp804.h
 header-test-                   += crypto/cast_common.h
 header-test-                   += crypto/internal/cryptouser.h
@@ -246,6 +246,7 @@ header-test-                        += linux/intel-pti.h
 header-test-                   += linux/intel-svm.h
 header-test-                   += linux/interconnect-provider.h
 header-test-                   += linux/ioc3.h
+header-test-$(CONFIG_BLOCK)    += linux/iomap.h
 header-test-                   += linux/ipack.h
 header-test-                   += linux/irq_cpustat.h
 header-test-                   += linux/irq_poll.h
@@ -454,9 +455,6 @@ header-test-                        += linux/phy/omap_control_phy.h
 header-test-                   += linux/phy/tegra/xusb.h
 header-test-                   += linux/phy/ulpi_phy.h
 header-test-                   += linux/phy_fixed.h
-header-test-                   += linux/pinctrl/pinconf-generic.h
-header-test-                   += linux/pinctrl/pinconf.h
-header-test-                   += linux/pinctrl/pinctrl.h
 header-test-                   += linux/pipe_fs_i.h
 header-test-                   += linux/pktcdvd.h
 header-test-                   += linux/pl320-ipc.h
@@ -905,11 +903,11 @@ header-test-                      += net/netfilter/nf_nat_redirect.h
 header-test-                   += net/netfilter/nf_queue.h
 header-test-                   += net/netfilter/nf_reject.h
 header-test-                   += net/netfilter/nf_synproxy.h
-header-test-                   += net/netfilter/nf_tables.h
-header-test-                   += net/netfilter/nf_tables_core.h
-header-test-                   += net/netfilter/nf_tables_ipv4.h
+header-test-$(CONFIG_NF_TABLES)        += net/netfilter/nf_tables.h
+header-test-$(CONFIG_NF_TABLES)        += net/netfilter/nf_tables_core.h
+header-test-$(CONFIG_NF_TABLES)        += net/netfilter/nf_tables_ipv4.h
 header-test-                   += net/netfilter/nf_tables_ipv6.h
-header-test-                   += net/netfilter/nf_tables_offload.h
+header-test-$(CONFIG_NF_TABLES)        += net/netfilter/nf_tables_offload.h
 header-test-                   += net/netfilter/nft_fib.h
 header-test-                   += net/netfilter/nft_meta.h
 header-test-                   += net/netfilter/nft_reject.h
@@ -950,7 +948,6 @@ header-test-                        += pcmcia/ds.h
 header-test-                   += rdma/ib.h
 header-test-                   += rdma/iw_portmap.h
 header-test-                   += rdma/opa_port_info.h
-header-test-                   += rdma/rdma_counter.h
 header-test-                   += rdma/rdmavt_cq.h
 header-test-                   += rdma/restrack.h
 header-test-                   += rdma/signature.h
index cabc5712e74501dda35d19f1aaa2fc4a40e5ab88..0782b05e27750911b7b42a8a91d6ee74751e04ab 100644 (file)
 #define TEGRA186_MAIN_GPIO(port, offset) \
        ((TEGRA186_MAIN_GPIO_PORT_##port * 8) + offset)
 
-/* need to keep these for backwards-compatibility */
-#define TEGRA_MAIN_GPIO_PORT_A 0
-#define TEGRA_MAIN_GPIO_PORT_B 1
-#define TEGRA_MAIN_GPIO_PORT_C 2
-#define TEGRA_MAIN_GPIO_PORT_D 3
-#define TEGRA_MAIN_GPIO_PORT_E 4
-#define TEGRA_MAIN_GPIO_PORT_F 5
-#define TEGRA_MAIN_GPIO_PORT_G 6
-#define TEGRA_MAIN_GPIO_PORT_H 7
-#define TEGRA_MAIN_GPIO_PORT_I 8
-#define TEGRA_MAIN_GPIO_PORT_J 9
-#define TEGRA_MAIN_GPIO_PORT_K 10
-#define TEGRA_MAIN_GPIO_PORT_L 11
-#define TEGRA_MAIN_GPIO_PORT_M 12
-#define TEGRA_MAIN_GPIO_PORT_N 13
-#define TEGRA_MAIN_GPIO_PORT_O 14
-#define TEGRA_MAIN_GPIO_PORT_P 15
-#define TEGRA_MAIN_GPIO_PORT_Q 16
-#define TEGRA_MAIN_GPIO_PORT_R 17
-#define TEGRA_MAIN_GPIO_PORT_T 18
-#define TEGRA_MAIN_GPIO_PORT_X 19
-#define TEGRA_MAIN_GPIO_PORT_Y 20
-#define TEGRA_MAIN_GPIO_PORT_BB 21
-#define TEGRA_MAIN_GPIO_PORT_CC 22
-
-#define TEGRA_MAIN_GPIO(port, offset) \
-       ((TEGRA_MAIN_GPIO_PORT_##port * 8) + offset)
-
 /* GPIOs implemented by AON GPIO controller */
 #define TEGRA186_AON_GPIO_PORT_S 0
 #define TEGRA186_AON_GPIO_PORT_U 1
 #define TEGRA186_AON_GPIO(port, offset) \
        ((TEGRA186_AON_GPIO_PORT_##port * 8) + offset)
 
-/* need to keep these for backwards-compatibility */
-#define TEGRA_AON_GPIO_PORT_S 0
-#define TEGRA_AON_GPIO_PORT_U 1
-#define TEGRA_AON_GPIO_PORT_V 2
-#define TEGRA_AON_GPIO_PORT_W 3
-#define TEGRA_AON_GPIO_PORT_Z 4
-#define TEGRA_AON_GPIO_PORT_AA 5
-#define TEGRA_AON_GPIO_PORT_EE 6
-#define TEGRA_AON_GPIO_PORT_FF 7
-
-#define TEGRA_AON_GPIO(port, offset) \
-       ((TEGRA_AON_GPIO_PORT_##port * 8) + offset)
-
 #endif
diff --git a/include/dt-bindings/power/qcom-aoss-qmp.h b/include/dt-bindings/power/qcom-aoss-qmp.h
new file mode 100644 (file)
index 0000000..ec336d3
--- /dev/null
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (c) 2018, Linaro Ltd. */
+
+#ifndef __DT_BINDINGS_POWER_QCOM_AOSS_QMP_H
+#define __DT_BINDINGS_POWER_QCOM_AOSS_QMP_H
+
+#define AOSS_QMP_LS_CDSP               0
+#define AOSS_QMP_LS_LPASS      1
+#define AOSS_QMP_LS_MODEM      2
+#define AOSS_QMP_LS_SLPI               3
+#define AOSS_QMP_LS_SPSS               4
+#define AOSS_QMP_LS_VENUS      5
+
+#endif
index 87d9c66116825c58e095e98c18a91ce62f054969..93e36d01152769eb968f7e81c0da94eca809133d 100644 (file)
 #define MSM8996_VDDSSCX                5
 #define MSM8996_VDDSSCX_VFC    6
 
+/* MSM8998 Power Domain Indexes */
+#define MSM8998_VDDCX          0
+#define MSM8998_VDDCX_AO       1
+#define MSM8998_VDDCX_VFL      2
+#define MSM8998_VDDMX          3
+#define MSM8998_VDDMX_AO       4
+#define MSM8998_VDDMX_VFL      5
+#define MSM8998_SSCCX          6
+#define MSM8998_SSCCX_VFL      7
+#define MSM8998_SSCMX          8
+#define MSM8998_SSCMX_VFL      9
+
+/* QCS404 Power Domains */
+#define QCS404_VDDMX           0
+#define QCS404_VDDMX_AO                1
+#define QCS404_VDDMX_VFL       2
+#define QCS404_LPICX           3
+#define QCS404_LPICX_VFL       4
+#define QCS404_LPIMX           5
+#define QCS404_LPIMX_VFL       6
+
+/* RPM SMD Power Domain performance levels */
+#define RPM_SMD_LEVEL_RETENTION       16
+#define RPM_SMD_LEVEL_RETENTION_PLUS  32
+#define RPM_SMD_LEVEL_MIN_SVS         48
+#define RPM_SMD_LEVEL_LOW_SVS         64
+#define RPM_SMD_LEVEL_SVS             128
+#define RPM_SMD_LEVEL_SVS_PLUS        192
+#define RPM_SMD_LEVEL_NOM             256
+#define RPM_SMD_LEVEL_NOM_PLUS        320
+#define RPM_SMD_LEVEL_TURBO           384
+#define RPM_SMD_LEVEL_TURBO_NO_CPR    416
+#define RPM_SMD_LEVEL_BINNING         512
+
 #endif
diff --git a/include/dt-bindings/reset/bitmain,bm1880-reset.h b/include/dt-bindings/reset/bitmain,bm1880-reset.h
new file mode 100644 (file)
index 0000000..4c0de52
--- /dev/null
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (c) 2018 Bitmain Ltd.
+ * Copyright (c) 2019 Linaro Ltd.
+ */
+
+#ifndef _DT_BINDINGS_BM1880_RESET_H
+#define _DT_BINDINGS_BM1880_RESET_H
+
+#define BM1880_RST_MAIN_AP             0
+#define BM1880_RST_SECOND_AP           1
+#define BM1880_RST_DDR                 2
+#define BM1880_RST_VIDEO               3
+#define BM1880_RST_JPEG                        4
+#define BM1880_RST_VPP                 5
+#define BM1880_RST_GDMA                        6
+#define BM1880_RST_AXI_SRAM            7
+#define BM1880_RST_TPU                 8
+#define BM1880_RST_USB                 9
+#define BM1880_RST_ETH0                        10
+#define BM1880_RST_ETH1                        11
+#define BM1880_RST_NAND                        12
+#define BM1880_RST_EMMC                        13
+#define BM1880_RST_SD                  14
+#define BM1880_RST_SDMA                        15
+#define BM1880_RST_I2S0                        16
+#define BM1880_RST_I2S1                        17
+#define BM1880_RST_UART0_1_CLK         18
+#define BM1880_RST_UART0_1_ACLK                19
+#define BM1880_RST_UART2_3_CLK         20
+#define BM1880_RST_UART2_3_ACLK                21
+#define BM1880_RST_MINER               22
+#define BM1880_RST_I2C0                        23
+#define BM1880_RST_I2C1                        24
+#define BM1880_RST_I2C2                        25
+#define BM1880_RST_I2C3                        26
+#define BM1880_RST_I2C4                        27
+#define BM1880_RST_PWM0                        28
+#define BM1880_RST_PWM1                        29
+#define BM1880_RST_PWM2                        30
+#define BM1880_RST_PWM3                        31
+#define BM1880_RST_SPI                 32
+#define BM1880_RST_GPIO0               33
+#define BM1880_RST_GPIO1               34
+#define BM1880_RST_GPIO2               35
+#define BM1880_RST_EFUSE               36
+#define BM1880_RST_WDT                 37
+#define BM1880_RST_AHB_ROM             38
+#define BM1880_RST_SPIC                        39
+
+#endif /* _DT_BINDINGS_BM1880_RESET_H */
index e8579412ad214cbfc28124bc5ce1078981d391d9..d7ee4c6bad482a39898725ec64566cb04714b5d5 100644 (file)
 #else
 #define __diag_GCC_8(s)
 #endif
+
+#define __no_fgcse __attribute__((optimize("-fno-gcse")))
index 8aaf7cd026b06a2a12fa09aebc3b2685d6584fe2..f0fd5636fddbebd8a55d235dbd3cc8a41e398ae0 100644 (file)
@@ -116,9 +116,14 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,
        ".pushsection .discard.unreachable\n\t"                         \
        ".long 999b - .\n\t"                                            \
        ".popsection\n\t"
+
+/* Annotate a C jump table to allow objtool to follow the code flow */
+#define __annotate_jump_table __section(".rodata..c_jump_table")
+
 #else
 #define annotate_reachable()
 #define annotate_unreachable()
+#define __annotate_jump_table
 #endif
 
 #ifndef ASM_UNREACHABLE
index 095d55c3834db622487efac2bbfb15ed0f0417d4..599c27b56c29a9674bc8b189c4200c3c0fbed58c 100644 (file)
@@ -189,6 +189,10 @@ struct ftrace_likely_data {
 #define asm_volatile_goto(x...) asm goto(x)
 #endif
 
+#ifndef __no_fgcse
+# define __no_fgcse
+#endif
+
 /* Are two types/vars the same type (ignoring qualifiers)? */
 #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
 
index 6b6c7396a584521aba86bcf2dd1ed0344f98ed76..cb732643471b118f188427ee06338ae0571830ac 100644 (file)
@@ -50,7 +50,6 @@ struct cn_dev {
 
        u32 seq, groups;
        struct sock *nls;
-       void (*input) (struct sk_buff *skb);
 
        struct cn_queue_dev *cbdev;
 };
index d3a0fbfff2bb0931dddd8fd0d65ab544bc8f76b0..9fa4b3f88c397a790ce3d0d8a7042d5cea3107bd 100644 (file)
@@ -272,62 +272,6 @@ dim_update_sample_with_comps(u16 event_ctr, u64 packets, u64 bytes, u64 comps,
 
 /* Net DIM */
 
-/*
- * Net DIM profiles:
- *        There are different set of profiles for each CQ period mode.
- *        There are different set of profiles for RX/TX CQs.
- *        Each profile size must be of NET_DIM_PARAMS_NUM_PROFILES
- */
-#define NET_DIM_PARAMS_NUM_PROFILES 5
-#define NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE 256
-#define NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE 128
-#define NET_DIM_DEF_PROFILE_CQE 1
-#define NET_DIM_DEF_PROFILE_EQE 1
-
-#define NET_DIM_RX_EQE_PROFILES { \
-       {1,   NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
-       {8,   NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
-       {64,  NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
-       {128, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
-       {256, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
-}
-
-#define NET_DIM_RX_CQE_PROFILES { \
-       {2,  256},             \
-       {8,  128},             \
-       {16, 64},              \
-       {32, 64},              \
-       {64, 64}               \
-}
-
-#define NET_DIM_TX_EQE_PROFILES { \
-       {1,   NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
-       {8,   NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
-       {32,  NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
-       {64,  NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
-       {128, NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE}   \
-}
-
-#define NET_DIM_TX_CQE_PROFILES { \
-       {5,  128},  \
-       {8,  64},  \
-       {16, 32},  \
-       {32, 32},  \
-       {64, 32}   \
-}
-
-static const struct dim_cq_moder
-rx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
-       NET_DIM_RX_EQE_PROFILES,
-       NET_DIM_RX_CQE_PROFILES,
-};
-
-static const struct dim_cq_moder
-tx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
-       NET_DIM_TX_EQE_PROFILES,
-       NET_DIM_TX_CQE_PROFILES,
-};
-
 /**
  *     net_dim_get_rx_moderation - provide a CQ moderation object for the given RX profile
  *     @cq_period_mode: CQ period mode
index b7338702592a68638d46d5ba905b33c7b9caa800..adf993a3bd58010de6db1c6e39c85ea2f085818d 100644 (file)
@@ -32,6 +32,15 @@ static inline bool dma_capable(struct device *dev, dma_addr_t addr, size_t size)
 }
 #endif /* !CONFIG_ARCH_HAS_PHYS_TO_DMA */
 
+#ifdef CONFIG_ARCH_HAS_FORCE_DMA_UNENCRYPTED
+bool force_dma_unencrypted(struct device *dev);
+#else
+static inline bool force_dma_unencrypted(struct device *dev)
+{
+       return false;
+}
+#endif /* CONFIG_ARCH_HAS_FORCE_DMA_UNENCRYPTED */
+
 /*
  * If memory encryption is supported, phys_to_dma will set the memory encryption
  * bit in the DMA address, and dma_to_phys will clear it.  The raw __phys_to_dma
index 8d13e28a8e0751fb34b49e2c21af5db04600e2da..e11b115dd0e44b32d0ffbbc3cc20181a8452526c 100644 (file)
@@ -679,6 +679,20 @@ static inline int dma_coerce_mask_and_coherent(struct device *dev, u64 mask)
        return dma_set_mask_and_coherent(dev, mask);
 }
 
+/**
+ * dma_addressing_limited - return if the device is addressing limited
+ * @dev:       device to check
+ *
+ * Return %true if the devices DMA mask is too small to address all memory in
+ * the system, else %false.  Lack of addressing bits is the prime reason for
+ * bounce buffering, but might not be the only one.
+ */
+static inline bool dma_addressing_limited(struct device *dev)
+{
+       return min_not_zero(*dev->dma_mask, dev->bus_dma_mask) <
+               dma_get_required_mask(dev);
+}
+
 #ifdef CONFIG_ARCH_HAS_SETUP_DMA_OPS
 void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
                const struct iommu_ops *iommu, bool coherent);
index ff65d22cf336935c9406930496dc8a8f57a0cbd0..92c6e31fb008ee80073e310797e27d0e72d428c2 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <net/sch_generic.h>
 
+#include <asm/byteorder.h>
 #include <uapi/linux/filter.h>
 #include <uapi/linux/bpf.h>
 
@@ -747,6 +748,18 @@ bpf_ctx_narrow_access_ok(u32 off, u32 size, u32 size_default)
        return size <= size_default && (size & (size - 1)) == 0;
 }
 
+static inline u8
+bpf_ctx_narrow_load_shift(u32 off, u32 size, u32 size_default)
+{
+       u8 load_off = off & (size_default - 1);
+
+#ifdef __LITTLE_ENDIAN
+       return load_off * 8;
+#else
+       return (size_default - (load_off + size)) * 8;
+#endif
+}
+
 #define bpf_ctx_wide_access_ok(off, size, type, field)                 \
        (size == sizeof(__u64) &&                                       \
        off >= offsetof(type, field) &&                                 \
index 7cab74d66f85476ff20c0445edc1164115091ca2..bdd09fd2520c00f9e4ca977a25d6da934f285ece 100644 (file)
@@ -20,6 +20,5 @@ static inline void init_fs_pin(struct fs_pin *p, void (*kill)(struct fs_pin *))
 }
 
 void pin_remove(struct fs_pin *);
-void pin_insert_group(struct fs_pin *, struct vfsmount *, struct hlist_head *);
 void pin_insert(struct fs_pin *, struct vfsmount *);
 void pin_kill(struct fs_pin *);
index 8b728750a62580c6ed05fe93fc5aada94e145ac1..69e813bcb947ef59c1fc23e541a938d5c179d197 100644 (file)
@@ -80,6 +80,9 @@ extern int register_pppox_proto(int proto_num, const struct pppox_proto *pp);
 extern void unregister_pppox_proto(int proto_num);
 extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */
 extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
+extern int pppox_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
+
+#define PPPOEIOCSFWD32    _IOW(0xB1 ,0, compat_size_t)
 
 /* PPPoX socket states */
 enum {
index b4f5403383fc9be106fad4cde572909df920c00c..9661416a9bb473da8bb329477b548a22fce4eaae 100644 (file)
@@ -41,11 +41,11 @@ struct rmnet_map_ul_csum_header {
        __be16 csum_start_offset;
 #if defined(__LITTLE_ENDIAN_BITFIELD)
        u16 csum_insert_offset:14;
-       u16 udp_ip4_ind:1;
+       u16 udp_ind:1;
        u16 csum_enabled:1;
 #elif defined (__BIG_ENDIAN_BITFIELD)
        u16 csum_enabled:1;
-       u16 udp_ip4_ind:1;
+       u16 udp_ind:1;
        u16 csum_insert_offset:14;
 #else
 #error "Please fix <asm/byteorder.h>"
index c5da875f19e372b9a577fc7d6741f1dbd00a5a3c..5c5b5867024cd80b69b96f29721faa6871c64dc5 100644 (file)
@@ -318,6 +318,7 @@ struct kvm_vcpu {
        } spin_loop;
 #endif
        bool preempted;
+       bool ready;
        struct kvm_vcpu_arch arch;
        struct dentry *debugfs_dentry;
 };
index 04a569568eacb738bcc52a9389f96eb4fcafdd7f..f049af3f3cd838c85d87e02d5e13f5a39d1ffec0 100644 (file)
@@ -220,6 +220,7 @@ int mlx5_modify_rule_destination(struct mlx5_flow_handle *handler,
 
 struct mlx5_fc *mlx5_fc_create(struct mlx5_core_dev *dev, bool aging);
 void mlx5_fc_destroy(struct mlx5_core_dev *dev, struct mlx5_fc *counter);
+u64 mlx5_fc_query_lastuse(struct mlx5_fc *counter);
 void mlx5_fc_query_cached(struct mlx5_fc *counter,
                          u64 *bytes, u64 *packets, u64 *lastuse);
 int mlx5_fc_query(struct mlx5_core_dev *dev, struct mlx5_fc *counter,
index b3d5752657d9893fbc83bdaf577d872ed9bde5a4..ec571fd7fcf89299e4ef17b17142fce13059de6e 100644 (file)
@@ -5975,10 +5975,12 @@ struct mlx5_ifc_modify_cq_in_bits {
 
        struct mlx5_ifc_cqc_bits cq_context;
 
-       u8         reserved_at_280[0x40];
+       u8         reserved_at_280[0x60];
 
        u8         cq_umem_valid[0x1];
-       u8         reserved_at_2c1[0x5bf];
+       u8         reserved_at_2e1[0x1f];
+
+       u8         reserved_at_300[0x580];
 
        u8         pas[0][0x40];
 };
index d48e919d55ae71970eb53459ddc1bb580a2fcd44..8ad679e9d9c04a79d0231c92bcc68582ade57cfd 100644 (file)
@@ -64,6 +64,10 @@ struct ti_sci_inta_msi_desc {
  * @msg:       The last set MSI message cached for reuse
  * @affinity:  Optional pointer to a cpu affinity mask for this descriptor
  *
+ * @write_msi_msg:     Callback that may be called when the MSI message
+ *                     address or data changes
+ * @write_msi_msg_data:        Data parameter for the callback.
+ *
  * @masked:    [PCI MSI/X] Mask bits
  * @is_msix:   [PCI MSI/X] True if MSI-X
  * @multiple:  [PCI MSI/X] log2 num of messages allocated
@@ -90,6 +94,9 @@ struct msi_desc {
        const void                      *iommu_cookie;
 #endif
 
+       void (*write_msi_msg)(struct msi_desc *entry, void *data);
+       void *write_msi_msg_data;
+
        union {
                /* PCI MSI/X specific data */
                struct {
@@ -100,6 +107,7 @@ struct msi_desc {
                                u8      multi_cap       : 3;
                                u8      maskbit         : 1;
                                u8      is_64           : 1;
+                               u8      is_virtual      : 1;
                                u16     entry_nr;
                                unsigned default_irq;
                        } msi_attrib;
index 56a92e3ae3ae5f0785c74eabcb56ae90a4a10b93..8c13538aeffea34614b1ac5f32e5837ce6ef2c03 100644 (file)
 
 #include <linux/completion.h>
 #include <linux/device.h>
+#include <linux/interrupt.h>
 
 struct ntb_client;
 struct ntb_dev;
+struct ntb_msi;
 struct pci_dev;
 
 /**
@@ -205,7 +207,7 @@ static inline int ntb_ctx_ops_is_valid(const struct ntb_ctx_ops *ops)
 }
 
 /**
- * struct ntb_ctx_ops - ntb device operations
+ * struct ntb_dev_ops - ntb device operations
  * @port_number:       See ntb_port_number().
  * @peer_port_count:   See ntb_peer_port_count().
  * @peer_port_number:  See ntb_peer_port_number().
@@ -404,7 +406,7 @@ struct ntb_client {
 #define drv_ntb_client(__drv) container_of((__drv), struct ntb_client, drv)
 
 /**
- * struct ntb_device - ntb device
+ * struct ntb_dev - ntb device
  * @dev:               Linux device object.
  * @pdev:              PCI device entry of the ntb.
  * @topo:              Detected topology of the ntb.
@@ -426,6 +428,10 @@ struct ntb_dev {
        spinlock_t                      ctx_lock;
        /* block unregister until device is fully released */
        struct completion               released;
+
+#ifdef CONFIG_NTB_MSI
+       struct ntb_msi *msi;
+#endif
 };
 #define dev_ntb(__dev) container_of((__dev), struct ntb_dev, dev)
 
@@ -616,7 +622,6 @@ static inline int ntb_port_number(struct ntb_dev *ntb)
 
        return ntb->ops->port_number(ntb);
 }
-
 /**
  * ntb_peer_port_count() - get the number of peer device ports
  * @ntb:       NTB device context.
@@ -653,6 +658,58 @@ static inline int ntb_peer_port_number(struct ntb_dev *ntb, int pidx)
        return ntb->ops->peer_port_number(ntb, pidx);
 }
 
+/**
+ * ntb_logical_port_number() - get the logical port number of the local port
+ * @ntb:       NTB device context.
+ *
+ * The Logical Port Number is defined to be a unique number for each
+ * port starting from zero through to the number of ports minus one.
+ * This is in contrast to the Port Number where each port can be assigned
+ * any unique physical number by the hardware.
+ *
+ * The logical port number is useful for calculating the resource indexes
+ * used by peers.
+ *
+ * Return: the logical port number or negative value indicating an error
+ */
+static inline int ntb_logical_port_number(struct ntb_dev *ntb)
+{
+       int lport = ntb_port_number(ntb);
+       int pidx;
+
+       if (lport < 0)
+               return lport;
+
+       for (pidx = 0; pidx < ntb_peer_port_count(ntb); pidx++)
+               if (lport <= ntb_peer_port_number(ntb, pidx))
+                       return pidx;
+
+       return pidx;
+}
+
+/**
+ * ntb_peer_logical_port_number() - get the logical peer port by given index
+ * @ntb:       NTB device context.
+ * @pidx:      Peer port index.
+ *
+ * The Logical Port Number is defined to be a unique number for each
+ * port starting from zero through to the number of ports minus one.
+ * This is in contrast to the Port Number where each port can be assigned
+ * any unique physical number by the hardware.
+ *
+ * The logical port number is useful for calculating the resource indexes
+ * used by peers.
+ *
+ * Return: the peer's logical port number or negative value indicating an error
+ */
+static inline int ntb_peer_logical_port_number(struct ntb_dev *ntb, int pidx)
+{
+       if (ntb_peer_port_number(ntb, pidx) < ntb_port_number(ntb))
+               return pidx;
+       else
+               return pidx + 1;
+}
+
 /**
  * ntb_peer_port_idx() - get the peer device port index by given port number
  * @ntb:       NTB device context.
@@ -1506,4 +1563,141 @@ static inline int ntb_peer_msg_write(struct ntb_dev *ntb, int pidx, int midx,
        return ntb->ops->peer_msg_write(ntb, pidx, midx, msg);
 }
 
+/**
+ * ntb_peer_resource_idx() - get a resource index for a given peer idx
+ * @ntb:       NTB device context.
+ * @pidx:      Peer port index.
+ *
+ * When constructing a graph of peers, each remote peer must use a different
+ * resource index (mw, doorbell, etc) to communicate with each other
+ * peer.
+ *
+ * In a two peer system, this function should always return 0 such that
+ * resource 0 points to the remote peer on both ports.
+ *
+ * In a 5 peer system, this function will return the following matrix
+ *
+ * pidx \ port    0    1    2    3    4
+ * 0              0    0    1    2    3
+ * 1              0    1    1    2    3
+ * 2              0    1    2    2    3
+ * 3              0    1    2    3    3
+ *
+ * For example, if this function is used to program peer's memory
+ * windows, port 0 will program MW 0 on all it's peers to point to itself.
+ * port 1 will program MW 0 in port 0 to point to itself and MW 1 on all
+ * other ports. etc.
+ *
+ * For the legacy two host case, ntb_port_number() and ntb_peer_port_number()
+ * both return zero and therefore this function will always return zero.
+ * So MW 0 on each host would be programmed to point to the other host.
+ *
+ * Return: the resource index to use for that peer.
+ */
+static inline int ntb_peer_resource_idx(struct ntb_dev *ntb, int pidx)
+{
+       int local_port, peer_port;
+
+       if (pidx >= ntb_peer_port_count(ntb))
+               return -EINVAL;
+
+       local_port = ntb_logical_port_number(ntb);
+       peer_port = ntb_peer_logical_port_number(ntb, pidx);
+
+       if (peer_port < local_port)
+               return local_port - 1;
+       else
+               return local_port;
+}
+
+/**
+ * ntb_peer_highest_mw_idx() - get a memory window index for a given peer idx
+ *     using the highest index memory windows first
+ *
+ * @ntb:       NTB device context.
+ * @pidx:      Peer port index.
+ *
+ * Like ntb_peer_resource_idx(), except it returns indexes starting with
+ * last memory window index.
+ *
+ * Return: the resource index to use for that peer.
+ */
+static inline int ntb_peer_highest_mw_idx(struct ntb_dev *ntb, int pidx)
+{
+       int ret;
+
+       ret = ntb_peer_resource_idx(ntb, pidx);
+       if (ret < 0)
+               return ret;
+
+       return ntb_mw_count(ntb, pidx) - ret - 1;
+}
+
+struct ntb_msi_desc {
+       u32 addr_offset;
+       u32 data;
+};
+
+#ifdef CONFIG_NTB_MSI
+
+int ntb_msi_init(struct ntb_dev *ntb, void (*desc_changed)(void *ctx));
+int ntb_msi_setup_mws(struct ntb_dev *ntb);
+void ntb_msi_clear_mws(struct ntb_dev *ntb);
+int ntbm_msi_request_threaded_irq(struct ntb_dev *ntb, irq_handler_t handler,
+                                 irq_handler_t thread_fn,
+                                 const char *name, void *dev_id,
+                                 struct ntb_msi_desc *msi_desc);
+void ntbm_msi_free_irq(struct ntb_dev *ntb, unsigned int irq, void *dev_id);
+int ntb_msi_peer_trigger(struct ntb_dev *ntb, int peer,
+                        struct ntb_msi_desc *desc);
+int ntb_msi_peer_addr(struct ntb_dev *ntb, int peer,
+                     struct ntb_msi_desc *desc,
+                     phys_addr_t *msi_addr);
+
+#else /* not CONFIG_NTB_MSI */
+
+static inline int ntb_msi_init(struct ntb_dev *ntb,
+                              void (*desc_changed)(void *ctx))
+{
+       return -EOPNOTSUPP;
+}
+static inline int ntb_msi_setup_mws(struct ntb_dev *ntb)
+{
+       return -EOPNOTSUPP;
+}
+static inline void ntb_msi_clear_mws(struct ntb_dev *ntb) {}
+static inline int ntbm_msi_request_threaded_irq(struct ntb_dev *ntb,
+                                               irq_handler_t handler,
+                                               irq_handler_t thread_fn,
+                                               const char *name, void *dev_id,
+                                               struct ntb_msi_desc *msi_desc)
+{
+       return -EOPNOTSUPP;
+}
+static inline void ntbm_msi_free_irq(struct ntb_dev *ntb, unsigned int irq,
+                                    void *dev_id) {}
+static inline int ntb_msi_peer_trigger(struct ntb_dev *ntb, int peer,
+                                      struct ntb_msi_desc *desc)
+{
+       return -EOPNOTSUPP;
+}
+static inline int ntb_msi_peer_addr(struct ntb_dev *ntb, int peer,
+                                   struct ntb_msi_desc *desc,
+                                   phys_addr_t *msi_addr)
+{
+       return -EOPNOTSUPP;
+
+}
+
+#endif /* CONFIG_NTB_MSI */
+
+static inline int ntbm_msi_request_irq(struct ntb_dev *ntb,
+                                      irq_handler_t handler,
+                                      const char *name, void *dev_id,
+                                      struct ntb_msi_desc *msi_desc)
+{
+       return ntbm_msi_request_threaded_irq(ntb, handler, NULL, name,
+                                            dev_id, msi_desc);
+}
+
 #endif
index 2972793e3028c816715bfeb08d827ba42285d568..9e700d9f9f287d0db0bf770cd5c4ee2a564db94c 100644 (file)
@@ -1412,6 +1412,15 @@ int pci_set_vga_state(struct pci_dev *pdev, bool decode,
 #define PCI_IRQ_MSI            (1 << 1) /* Allow MSI interrupts */
 #define PCI_IRQ_MSIX           (1 << 2) /* Allow MSI-X interrupts */
 #define PCI_IRQ_AFFINITY       (1 << 3) /* Auto-assign affinity */
+
+/*
+ * Virtual interrupts allow for more interrupts to be allocated
+ * than the device has interrupts for. These are not programmed
+ * into the device's MSI-X table and must be handled by some
+ * other driver means.
+ */
+#define PCI_IRQ_VIRTUAL                (1 << 4)
+
 #define PCI_IRQ_ALL_TYPES \
        (PCI_IRQ_LEGACY | PCI_IRQ_MSI | PCI_IRQ_MSIX)
 
index 9256c03059684ee544aa107e29a182c8ef5c5a4a..0c587d4fc718bcdc9852b6f0c3a224343d6d6336 100644 (file)
@@ -19,6 +19,7 @@ enum ti_sysc_module_type {
 
 struct ti_sysc_cookie {
        void *data;
+       void *clkdm;
 };
 
 /**
@@ -46,6 +47,10 @@ struct sysc_regbits {
        s8 emufree_shift;
 };
 
+#define SYSC_MODULE_QUIRK_HDQ1W                BIT(17)
+#define SYSC_MODULE_QUIRK_I2C          BIT(16)
+#define SYSC_MODULE_QUIRK_WDT          BIT(15)
+#define SYSS_QUIRK_RESETDONE_INVERTED  BIT(14)
 #define SYSC_QUIRK_SWSUP_MSTANDBY      BIT(13)
 #define SYSC_QUIRK_SWSUP_SIDLE_ACT     BIT(12)
 #define SYSC_QUIRK_SWSUP_SIDLE         BIT(11)
@@ -125,9 +130,16 @@ struct ti_sysc_module_data {
 };
 
 struct device;
+struct clk;
 
 struct ti_sysc_platform_data {
        struct of_dev_auxdata *auxdata;
+       int (*init_clockdomain)(struct device *dev, struct clk *fck,
+                               struct clk *ick, struct ti_sysc_cookie *cookie);
+       void (*clkdm_deny_idle)(struct device *dev,
+                               const struct ti_sysc_cookie *cookie);
+       void (*clkdm_allow_idle)(struct device *dev,
+                                const struct ti_sysc_cookie *cookie);
        int (*init_module)(struct device *dev,
                           const struct ti_sysc_module_data *data,
                           struct ti_sysc_cookie *cookie);
diff --git a/include/linux/platform_data/video-clcd-versatile.h b/include/linux/platform_data/video-clcd-versatile.h
deleted file mode 100644 (file)
index 305ebae..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef PLAT_CLCD_H
-#define PLAT_CLCD_H
-
-#ifdef CONFIG_PLAT_VERSATILE_CLCD
-struct clcd_panel *versatile_clcd_get_panel(const char *);
-int versatile_clcd_setup_dma(struct clcd_fb *, unsigned long);
-int versatile_clcd_mmap_dma(struct clcd_fb *, struct vm_area_struct *);
-void versatile_clcd_remove_dma(struct clcd_fb *);
-#else
-static inline struct clcd_panel *versatile_clcd_get_panel(const char *s)
-{
-       return NULL;
-}
-static inline int versatile_clcd_setup_dma(struct clcd_fb *fb, unsigned long framesize)
-{
-       return -ENODEV;
-}
-static inline int versatile_clcd_mmap_dma(struct clcd_fb *fb, struct vm_area_struct *vm)
-{
-       return -ENODEV;
-}
-static inline void versatile_clcd_remove_dma(struct clcd_fb *fb)
-{
-}
-#endif
-
-#endif
index b0fb1446fe04d809ab9fa0763e7d7b27ff2a2c6c..6c8512d3be88e4d1d34cbfa861fdbc3094ee925b 100644 (file)
@@ -19,6 +19,7 @@ enum hk_flags {
 DECLARE_STATIC_KEY_FALSE(housekeeping_overridden);
 extern int housekeeping_any_cpu(enum hk_flags flags);
 extern const struct cpumask *housekeeping_cpumask(enum hk_flags flags);
+extern bool housekeeping_enabled(enum hk_flags flags);
 extern void housekeeping_affine(struct task_struct *t, enum hk_flags flags);
 extern bool housekeeping_test_cpu(int cpu, enum hk_flags flags);
 extern void __init housekeeping_init(void);
@@ -35,6 +36,11 @@ static inline const struct cpumask *housekeeping_cpumask(enum hk_flags flags)
        return cpu_possible_mask;
 }
 
+static inline bool housekeeping_enabled(enum hk_flags flags)
+{
+       return false;
+}
+
 static inline void housekeeping_affine(struct task_struct *t,
                                       enum hk_flags flags) { }
 static inline void housekeeping_init(void) { }
index 3105055c00a7ee204adfe750432e5e474897812f..9ff2e9357e9ac60628e724c0a607c7faae5ae090 100644 (file)
@@ -144,6 +144,7 @@ struct scmi_power_ops {
 struct scmi_sensor_info {
        u32 id;
        u8 type;
+       s8 scale;
        char name[SCMI_MAX_STR_SIZE];
 };
 
index 50ced8aba9dbf6c2cd4a0a1ef1598bdd58822821..e4b3fb4bb77c7004d9164c6ba85f3be37eea741f 100644 (file)
@@ -354,7 +354,13 @@ static inline void sk_psock_restore_proto(struct sock *sk,
        sk->sk_write_space = psock->saved_write_space;
 
        if (psock->sk_proto) {
-               sk->sk_prot = psock->sk_proto;
+               struct inet_connection_sock *icsk = inet_csk(sk);
+               bool has_ulp = !!icsk->icsk_ulp_data;
+
+               if (has_ulp)
+                       tcp_update_ulp(sk, psock->sk_proto);
+               else
+                       sk->sk_prot = psock->sk_proto;
                psock->sk_proto = NULL;
        }
 }
index 406e6717d252d1161cad02ba9385a288a2178552..6c610e188a44f0d76679ab2590b6f6df579761ff 100644 (file)
@@ -241,12 +241,254 @@ struct ti_sci_rm_irq_ops {
                              u16 global_event, u8 vint_status_bit);
 };
 
+/* RA config.addr_lo parameter is valid for RM ring configure TI_SCI message */
+#define TI_SCI_MSG_VALUE_RM_RING_ADDR_LO_VALID BIT(0)
+/* RA config.addr_hi parameter is valid for RM ring configure TI_SCI message */
+#define TI_SCI_MSG_VALUE_RM_RING_ADDR_HI_VALID BIT(1)
+ /* RA config.count parameter is valid for RM ring configure TI_SCI message */
+#define TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID   BIT(2)
+/* RA config.mode parameter is valid for RM ring configure TI_SCI message */
+#define TI_SCI_MSG_VALUE_RM_RING_MODE_VALID    BIT(3)
+/* RA config.size parameter is valid for RM ring configure TI_SCI message */
+#define TI_SCI_MSG_VALUE_RM_RING_SIZE_VALID    BIT(4)
+/* RA config.order_id parameter is valid for RM ring configure TISCI message */
+#define TI_SCI_MSG_VALUE_RM_RING_ORDER_ID_VALID        BIT(5)
+
+#define TI_SCI_MSG_VALUE_RM_ALL_NO_ORDER \
+       (TI_SCI_MSG_VALUE_RM_RING_ADDR_LO_VALID | \
+       TI_SCI_MSG_VALUE_RM_RING_ADDR_HI_VALID | \
+       TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID | \
+       TI_SCI_MSG_VALUE_RM_RING_MODE_VALID | \
+       TI_SCI_MSG_VALUE_RM_RING_SIZE_VALID)
+
+/**
+ * struct ti_sci_rm_ringacc_ops - Ring Accelerator Management operations
+ * @config: configure the SoC Navigator Subsystem Ring Accelerator ring
+ * @get_config: get the SoC Navigator Subsystem Ring Accelerator ring
+ *             configuration
+ */
+struct ti_sci_rm_ringacc_ops {
+       int (*config)(const struct ti_sci_handle *handle,
+                     u32 valid_params, u16 nav_id, u16 index,
+                     u32 addr_lo, u32 addr_hi, u32 count, u8 mode,
+                     u8 size, u8 order_id
+       );
+       int (*get_config)(const struct ti_sci_handle *handle,
+                         u32 nav_id, u32 index, u8 *mode,
+                         u32 *addr_lo, u32 *addr_hi, u32 *count,
+                         u8 *size, u8 *order_id);
+};
+
+/**
+ * struct ti_sci_rm_psil_ops - PSI-L thread operations
+ * @pair: pair PSI-L source thread to a destination thread.
+ *     If the src_thread is mapped to UDMA tchan, the corresponding channel's
+ *     TCHAN_THRD_ID register is updated.
+ *     If the dst_thread is mapped to UDMA rchan, the corresponding channel's
+ *     RCHAN_THRD_ID register is updated.
+ * @unpair: unpair PSI-L source thread from a destination thread.
+ *     If the src_thread is mapped to UDMA tchan, the corresponding channel's
+ *     TCHAN_THRD_ID register is cleared.
+ *     If the dst_thread is mapped to UDMA rchan, the corresponding channel's
+ *     RCHAN_THRD_ID register is cleared.
+ */
+struct ti_sci_rm_psil_ops {
+       int (*pair)(const struct ti_sci_handle *handle, u32 nav_id,
+                   u32 src_thread, u32 dst_thread);
+       int (*unpair)(const struct ti_sci_handle *handle, u32 nav_id,
+                     u32 src_thread, u32 dst_thread);
+};
+
+/* UDMAP channel types */
+#define TI_SCI_RM_UDMAP_CHAN_TYPE_PKT_PBRR             2
+#define TI_SCI_RM_UDMAP_CHAN_TYPE_PKT_PBRR_SB          3       /* RX only */
+#define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_PBRR            10
+#define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_PBVR            11
+#define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_BCOPY_PBRR      12
+#define TI_SCI_RM_UDMAP_CHAN_TYPE_3RDP_BCOPY_PBVR      13
+
+#define TI_SCI_RM_UDMAP_RX_FLOW_DESC_HOST              0
+#define TI_SCI_RM_UDMAP_RX_FLOW_DESC_MONO              2
+
+#define TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_64_BYTES       1
+#define TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_128_BYTES      2
+#define TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_256_BYTES      3
+
+/* UDMAP TX/RX channel valid_params common declarations */
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_PAUSE_ON_ERR_VALID                BIT(0)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_ATYPE_VALID                BIT(1)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_CHAN_TYPE_VALID            BIT(2)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_FETCH_SIZE_VALID           BIT(3)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_CQ_QNUM_VALID              BIT(4)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_PRIORITY_VALID             BIT(5)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_QOS_VALID                  BIT(6)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_ORDER_ID_VALID             BIT(7)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_SCHED_PRIORITY_VALID       BIT(8)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_BURST_SIZE_VALID          BIT(14)
+
+/**
+ * Configures a Navigator Subsystem UDMAP transmit channel
+ *
+ * Configures a Navigator Subsystem UDMAP transmit channel registers.
+ * See @ti_sci_msg_rm_udmap_tx_ch_cfg_req
+ */
+struct ti_sci_msg_rm_udmap_tx_ch_cfg {
+       u32 valid_params;
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FILT_EINFO_VALID        BIT(9)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FILT_PSWORDS_VALID      BIT(10)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_SUPR_TDPKT_VALID        BIT(11)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_CREDIT_COUNT_VALID      BIT(12)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_TX_FDEPTH_VALID            BIT(13)
+       u16 nav_id;
+       u16 index;
+       u8 tx_pause_on_err;
+       u8 tx_filt_einfo;
+       u8 tx_filt_pswords;
+       u8 tx_atype;
+       u8 tx_chan_type;
+       u8 tx_supr_tdpkt;
+       u16 tx_fetch_size;
+       u8 tx_credit_count;
+       u16 txcq_qnum;
+       u8 tx_priority;
+       u8 tx_qos;
+       u8 tx_orderid;
+       u16 fdepth;
+       u8 tx_sched_priority;
+       u8 tx_burst_size;
+};
+
+/**
+ * Configures a Navigator Subsystem UDMAP receive channel
+ *
+ * Configures a Navigator Subsystem UDMAP receive channel registers.
+ * See @ti_sci_msg_rm_udmap_rx_ch_cfg_req
+ */
+struct ti_sci_msg_rm_udmap_rx_ch_cfg {
+       u32 valid_params;
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_START_VALID      BIT(9)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_CNT_VALID        BIT(10)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_IGNORE_SHORT_VALID      BIT(11)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_IGNORE_LONG_VALID       BIT(12)
+       u16 nav_id;
+       u16 index;
+       u16 rx_fetch_size;
+       u16 rxcq_qnum;
+       u8 rx_priority;
+       u8 rx_qos;
+       u8 rx_orderid;
+       u8 rx_sched_priority;
+       u16 flowid_start;
+       u16 flowid_cnt;
+       u8 rx_pause_on_err;
+       u8 rx_atype;
+       u8 rx_chan_type;
+       u8 rx_ignore_short;
+       u8 rx_ignore_long;
+       u8 rx_burst_size;
+};
+
+/**
+ * Configures a Navigator Subsystem UDMAP receive flow
+ *
+ * Configures a Navigator Subsystem UDMAP receive flow's registers.
+ * See @tis_ci_msg_rm_udmap_flow_cfg_req
+ */
+struct ti_sci_msg_rm_udmap_flow_cfg {
+       u32 valid_params;
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_EINFO_PRESENT_VALID     BIT(0)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_PSINFO_PRESENT_VALID     BIT(1)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_ERROR_HANDLING_VALID     BIT(2)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DESC_TYPE_VALID          BIT(3)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SOP_OFFSET_VALID         BIT(4)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_QNUM_VALID          BIT(5)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_HI_VALID         BIT(6)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_LO_VALID         BIT(7)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_HI_VALID        BIT(8)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_LO_VALID        BIT(9)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_HI_SEL_VALID     BIT(10)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_SRC_TAG_LO_SEL_VALID     BIT(11)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_HI_SEL_VALID    BIT(12)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_DEST_TAG_LO_SEL_VALID    BIT(13)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ0_SZ0_QNUM_VALID      BIT(14)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ1_QNUM_VALID          BIT(15)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ2_QNUM_VALID          BIT(16)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_FDQ3_QNUM_VALID          BIT(17)
+#define TI_SCI_MSG_VALUE_RM_UDMAP_FLOW_PS_LOCATION_VALID        BIT(18)
+       u16 nav_id;
+       u16 flow_index;
+       u8 rx_einfo_present;
+       u8 rx_psinfo_present;
+       u8 rx_error_handling;
+       u8 rx_desc_type;
+       u16 rx_sop_offset;
+       u16 rx_dest_qnum;
+       u8 rx_src_tag_hi;
+       u8 rx_src_tag_lo;
+       u8 rx_dest_tag_hi;
+       u8 rx_dest_tag_lo;
+       u8 rx_src_tag_hi_sel;
+       u8 rx_src_tag_lo_sel;
+       u8 rx_dest_tag_hi_sel;
+       u8 rx_dest_tag_lo_sel;
+       u16 rx_fdq0_sz0_qnum;
+       u16 rx_fdq1_qnum;
+       u16 rx_fdq2_qnum;
+       u16 rx_fdq3_qnum;
+       u8 rx_ps_location;
+};
+
+/**
+ * struct ti_sci_rm_udmap_ops - UDMA Management operations
+ * @tx_ch_cfg: configure SoC Navigator Subsystem UDMA transmit channel.
+ * @rx_ch_cfg: configure SoC Navigator Subsystem UDMA receive channel.
+ * @rx_flow_cfg1: configure SoC Navigator Subsystem UDMA receive flow.
+ */
+struct ti_sci_rm_udmap_ops {
+       int (*tx_ch_cfg)(const struct ti_sci_handle *handle,
+                        const struct ti_sci_msg_rm_udmap_tx_ch_cfg *params);
+       int (*rx_ch_cfg)(const struct ti_sci_handle *handle,
+                        const struct ti_sci_msg_rm_udmap_rx_ch_cfg *params);
+       int (*rx_flow_cfg)(const struct ti_sci_handle *handle,
+                          const struct ti_sci_msg_rm_udmap_flow_cfg *params);
+};
+
+/**
+ * struct ti_sci_proc_ops - Processor Control operations
+ * @request:   Request to control a physical processor. The requesting host
+ *             should be in the processor access list
+ * @release:   Relinquish a physical processor control
+ * @handover:  Handover a physical processor control to another host
+ *             in the permitted list
+ * @set_config:        Set base configuration of a processor
+ * @set_control: Setup limited control flags in specific cases
+ * @get_status: Get the state of physical processor
+ *
+ * NOTE: The following paramteres are generic in nature for all these ops,
+ * -handle:    Pointer to TI SCI handle as retrieved by *ti_sci_get_handle
+ * -pid:       Processor ID
+ * -hid:       Host ID
+ */
+struct ti_sci_proc_ops {
+       int (*request)(const struct ti_sci_handle *handle, u8 pid);
+       int (*release)(const struct ti_sci_handle *handle, u8 pid);
+       int (*handover)(const struct ti_sci_handle *handle, u8 pid, u8 hid);
+       int (*set_config)(const struct ti_sci_handle *handle, u8 pid,
+                         u64 boot_vector, u32 cfg_set, u32 cfg_clr);
+       int (*set_control)(const struct ti_sci_handle *handle, u8 pid,
+                          u32 ctrl_set, u32 ctrl_clr);
+       int (*get_status)(const struct ti_sci_handle *handle, u8 pid,
+                         u64 *boot_vector, u32 *cfg_flags, u32 *ctrl_flags,
+                         u32 *status_flags);
+};
+
 /**
  * struct ti_sci_ops - Function support for TI SCI
  * @dev_ops:   Device specific operations
  * @clk_ops:   Clock specific operations
  * @rm_core_ops:       Resource management core operations.
  * @rm_irq_ops:                IRQ management specific operations
+ * @proc_ops:  Processor Control specific operations
  */
 struct ti_sci_ops {
        struct ti_sci_core_ops core_ops;
@@ -254,6 +496,10 @@ struct ti_sci_ops {
        struct ti_sci_clk_ops clk_ops;
        struct ti_sci_rm_core_ops rm_core_ops;
        struct ti_sci_rm_irq_ops rm_irq_ops;
+       struct ti_sci_rm_ringacc_ops rm_ring_ops;
+       struct ti_sci_rm_psil_ops rm_psil_ops;
+       struct ti_sci_rm_udmap_ops rm_udmap_ops;
+       struct ti_sci_proc_ops proc_ops;
 };
 
 /**
index f42d300f0cfaa87520320dd287a7b4750adf7d8a..81e8ade1e6e415779e1a18b39bd2695c9b871152 100644 (file)
@@ -1709,6 +1709,11 @@ static inline struct sk_buff *tcp_rtx_queue_head(const struct sock *sk)
        return skb_rb_first(&sk->tcp_rtx_queue);
 }
 
+static inline struct sk_buff *tcp_rtx_queue_tail(const struct sock *sk)
+{
+       return skb_rb_last(&sk->tcp_rtx_queue);
+}
+
 static inline struct sk_buff *tcp_write_queue_head(const struct sock *sk)
 {
        return skb_peek(&sk->sk_write_queue);
@@ -2103,6 +2108,8 @@ struct tcp_ulp_ops {
 
        /* initialize ulp */
        int (*init)(struct sock *sk);
+       /* update ulp */
+       void (*update)(struct sock *sk, struct proto *p);
        /* cleanup ulp */
        void (*release)(struct sock *sk);
 
@@ -2114,6 +2121,7 @@ void tcp_unregister_ulp(struct tcp_ulp_ops *type);
 int tcp_set_ulp(struct sock *sk, const char *name);
 void tcp_get_available_ulp(char *buf, size_t len);
 void tcp_cleanup_ulp(struct sock *sk);
+void tcp_update_ulp(struct sock *sk, struct proto *p);
 
 #define MODULE_ALIAS_TCP_ULP(name)                             \
        __MODULE_INFO(alias, alias_userspace, name);            \
index 584609174fe007fbaea67da225363e2b91047c3b..9e425ac2de45a7197999fe9b7309fb58772e9419 100644 (file)
@@ -107,9 +107,7 @@ struct tls_device {
 enum {
        TLS_BASE,
        TLS_SW,
-#ifdef CONFIG_TLS_DEVICE
        TLS_HW,
-#endif
        TLS_HW_RECORD,
        TLS_NUM_CONFIG,
 };
@@ -162,6 +160,7 @@ struct tls_sw_context_tx {
        int async_capable;
 
 #define BIT_TX_SCHEDULED       0
+#define BIT_TX_CLOSING         1
        unsigned long tx_bitmask;
 };
 
@@ -272,6 +271,8 @@ struct tls_context {
        unsigned long flags;
 
        /* cache cold stuff */
+       struct proto *sk_proto;
+
        void (*sk_destruct)(struct sock *sk);
        void (*sk_proto_close)(struct sock *sk, long timeout);
 
@@ -289,6 +290,8 @@ struct tls_context {
 
        struct list_head list;
        refcount_t refcount;
+
+       struct work_struct gc;
 };
 
 enum tls_offload_ctx_dir {
@@ -355,13 +358,17 @@ int tls_sk_attach(struct sock *sk, int optname, char __user *optval,
                  unsigned int optlen);
 
 int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx);
+void tls_sw_strparser_arm(struct sock *sk, struct tls_context *ctx);
+void tls_sw_strparser_done(struct tls_context *tls_ctx);
 int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
 int tls_sw_sendpage(struct sock *sk, struct page *page,
                    int offset, size_t size, int flags);
-void tls_sw_close(struct sock *sk, long timeout);
-void tls_sw_free_resources_tx(struct sock *sk);
+void tls_sw_cancel_work_tx(struct tls_context *tls_ctx);
+void tls_sw_release_resources_tx(struct sock *sk);
+void tls_sw_free_ctx_tx(struct tls_context *tls_ctx);
 void tls_sw_free_resources_rx(struct sock *sk);
 void tls_sw_release_resources_rx(struct sock *sk);
+void tls_sw_free_ctx_rx(struct tls_context *tls_ctx);
 int tls_sw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
                   int nonblock, int flags, int *addr_len);
 bool tls_sw_stream_read(const struct sock *sk);
index a5fcdad4a03e8757213db6983ae0b221275ae5a1..cc139dbd71e572b28bc3fe1ccdbf66c6128f7fc9 100644 (file)
@@ -369,6 +369,8 @@ struct scsi_host_template {
         */
        unsigned long dma_boundary;
 
+       unsigned long virt_boundary_mask;
+
        /*
         * This specifies "machine infinity" for host templates which don't
         * limit the transfer size.  Note this limit represents an absolute
@@ -587,6 +589,7 @@ struct Scsi_Host {
        unsigned int max_sectors;
        unsigned int max_segment_size;
        unsigned long dma_boundary;
+       unsigned long virt_boundary_mask;
        /*
         * In scsi-mq mode, the number of hardware queues supported by the LLD.
         *
index 5b99cb2ea5ef900b3799c3e9d37474f2788c15d1..173e4049d9638322de042d770af7457565d4492d 100644 (file)
@@ -133,5 +133,13 @@ int bman_acquire(struct bman_pool *pool, struct bm_buffer *bufs, u8 num);
  * failed to probe or 0 if the bman driver did not probed yet.
  */
 int bman_is_probed(void);
+/**
+ * bman_portals_probed - Check if all cpu bound bman portals are probed
+ *
+ * Returns 1 if all the required cpu bound bman portals successfully probed,
+ * -1 if probe errors appeared or 0 if the bman portals did not yet finished
+ * probing.
+ */
+int bman_portals_probed(void);
 
 #endif /* __FSL_BMAN_H */
index 5cc7af06c1baa9eced1d276ebfef272909cc1520..aa31c05a103ad60855dbed904e6ac596a317a711 100644 (file)
@@ -1194,6 +1194,15 @@ int qman_release_cgrid(u32 id);
  */
 int qman_is_probed(void);
 
+/**
+ * qman_portals_probed - Check if all cpu bound qman portals are probed
+ *
+ * Returns 1 if all the required cpu bound qman portals successfully probed,
+ * -1 if probe errors appeared or 0 if the qman portals did not yet finished
+ * probing.
+ */
+int qman_portals_probed(void);
+
 /**
  * qman_dqrr_get_ithresh - Get coalesce interrupt threshold
  * @portal: portal to get the value for
index 9d9705ceda768b3e107ecb92a5837204d3d9c4a1..2427bc4d8eba14862e239296c427c3b43a64b652 100644 (file)
@@ -518,7 +518,13 @@ struct v4l2_pix_format {
 #define V4L2_PIX_FMT_RGBX444 v4l2_fourcc('R', 'X', '1', '2') /* 16  rrrrgggg bbbbxxxx */
 #define V4L2_PIX_FMT_ABGR444 v4l2_fourcc('A', 'B', '1', '2') /* 16  aaaabbbb ggggrrrr */
 #define V4L2_PIX_FMT_XBGR444 v4l2_fourcc('X', 'B', '1', '2') /* 16  xxxxbbbb ggggrrrr */
-#define V4L2_PIX_FMT_BGRA444 v4l2_fourcc('B', 'A', '1', '2') /* 16  bbbbgggg rrrraaaa */
+
+/*
+ * Originally this had 'BA12' as fourcc, but this clashed with the older
+ * V4L2_PIX_FMT_SGRBG12 which inexplicably used that same fourcc.
+ * So use 'GA12' instead for V4L2_PIX_FMT_BGRA444.
+ */
+#define V4L2_PIX_FMT_BGRA444 v4l2_fourcc('G', 'A', '1', '2') /* 16  bbbbgggg rrrraaaa */
 #define V4L2_PIX_FMT_BGRX444 v4l2_fourcc('B', 'X', '1', '2') /* 16  bbbbgggg rrrrxxxx */
 #define V4L2_PIX_FMT_RGB555  v4l2_fourcc('R', 'G', 'B', 'O') /* 16  RGB-5-5-5     */
 #define V4L2_PIX_FMT_ARGB555 v4l2_fourcc('A', 'R', '1', '5') /* 16  ARGB-1-5-5-5  */
index dc0b682ec2d943db62fea50780adda71cf35f24b..deff972174967c55eab3cdaeec5b1e10903e290a 100644 (file)
@@ -38,7 +38,7 @@ config PREEMPT_VOLUNTARY
 config PREEMPT
        bool "Preemptible Kernel (Low-Latency Desktop)"
        depends on !ARCH_NO_PREEMPT
-       select PREEMPT_COUNT
+       select PREEMPTION
        select UNINLINE_SPIN_UNLOCK if !ARCH_INLINE_SPIN_UNLOCK
        help
          This option reduces the latency of the kernel by making
@@ -55,7 +55,28 @@ config PREEMPT
          embedded system with latency requirements in the milliseconds
          range.
 
+config PREEMPT_RT
+       bool "Fully Preemptible Kernel (Real-Time)"
+       depends on EXPERT && ARCH_SUPPORTS_RT
+       select PREEMPTION
+       help
+         This option turns the kernel into a real-time kernel by replacing
+         various locking primitives (spinlocks, rwlocks, etc.) with
+         preemptible priority-inheritance aware variants, enforcing
+         interrupt threading and introducing mechanisms to break up long
+         non-preemptible sections. This makes the kernel, except for very
+         low level and critical code pathes (entry code, scheduler, low
+         level interrupt handling) fully preemptible and brings most
+         execution contexts under scheduler control.
+
+         Select this if you are building a kernel for systems which
+         require real-time guarantees.
+
 endchoice
 
 config PREEMPT_COUNT
        bool
+
+config PREEMPTION
+       bool
+       select PREEMPT_COUNT
index 16079550db6dac1487a43e626b9b1fb62883215c..8191a7db27776d6eb7eade68a0458927c2b82c96 100644 (file)
@@ -1295,11 +1295,11 @@ bool bpf_opcode_in_insntable(u8 code)
  *
  * Decode and execute eBPF instructions.
  */
-static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack)
+static u64 __no_fgcse ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack)
 {
 #define BPF_INSN_2_LBL(x, y)    [BPF_##x | BPF_##y] = &&x##_##y
 #define BPF_INSN_3_LBL(x, y, z) [BPF_##x | BPF_##y | BPF_##z] = &&x##_##y##_##z
-       static const void *jumptable[256] = {
+       static const void * const jumptable[256] __annotate_jump_table = {
                [0 ... 255] = &&default_label,
                /* Now overwrite non-defaults ... */
                BPF_INSN_MAP(BPF_INSN_2_LBL, BPF_INSN_3_LBL),
@@ -1558,7 +1558,6 @@ out:
                BUG_ON(1);
                return 0;
 }
-STACK_FRAME_NON_STANDARD(___bpf_prog_run); /* jump table */
 
 #define PROG_NAME(stack_size) __bpf_prog_run##stack_size
 #define DEFINE_BPF_PROG_RUN(stack_size) \
index 5900cbb966b17adb04538e887b2f2eff658ba823..c84d83f86141f82913bd540be1fcd87bd04613f6 100644 (file)
@@ -8616,8 +8616,8 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)
                }
 
                if (is_narrower_load && size < target_size) {
-                       u8 shift = (off & (size_default - 1)) * 8;
-
+                       u8 shift = bpf_ctx_narrow_load_shift(off, size,
+                                                            size_default);
                        if (ctx_field_size <= 4) {
                                if (shift)
                                        insn_buf[cnt++] = BPF_ALU32_IMM(BPF_RSH,
index 70f8f8d9200ea565c1feff1f51e7cf18f2d07f08..9decbba255fc8e2a6e3ea184cf23ff6c7a96fc9f 100644 (file)
@@ -48,6 +48,9 @@ config ARCH_HAS_DMA_COHERENT_TO_PFN
 config ARCH_HAS_DMA_MMAP_PGPROT
        bool
 
+config ARCH_HAS_FORCE_DMA_UNENCRYPTED
+       bool
+
 config DMA_NONCOHERENT_CACHE_SYNC
        bool
 
index b90e1aede74340942af8ba220a3bf5c7ac51ea27..59bdceea3737a4a095555723f4a7b79fda15c048 100644 (file)
 #define ARCH_ZONE_DMA_BITS 24
 #endif
 
-/*
- * For AMD SEV all DMA must be to unencrypted addresses.
- */
-static inline bool force_dma_unencrypted(void)
-{
-       return sev_active();
-}
-
 static void report_addr(struct device *dev, dma_addr_t dma_addr, size_t size)
 {
        if (!dev->dma_mask) {
@@ -46,7 +38,7 @@ static void report_addr(struct device *dev, dma_addr_t dma_addr, size_t size)
 static inline dma_addr_t phys_to_dma_direct(struct device *dev,
                phys_addr_t phys)
 {
-       if (force_dma_unencrypted())
+       if (force_dma_unencrypted(dev))
                return __phys_to_dma(dev, phys);
        return phys_to_dma(dev, phys);
 }
@@ -67,7 +59,7 @@ static gfp_t __dma_direct_optimal_gfp_mask(struct device *dev, u64 dma_mask,
        if (dev->bus_dma_mask && dev->bus_dma_mask < dma_mask)
                dma_mask = dev->bus_dma_mask;
 
-       if (force_dma_unencrypted())
+       if (force_dma_unencrypted(dev))
                *phys_mask = __dma_to_phys(dev, dma_mask);
        else
                *phys_mask = dma_to_phys(dev, dma_mask);
@@ -159,7 +151,7 @@ void *dma_direct_alloc_pages(struct device *dev, size_t size,
        }
 
        ret = page_address(page);
-       if (force_dma_unencrypted()) {
+       if (force_dma_unencrypted(dev)) {
                set_memory_decrypted((unsigned long)ret, 1 << get_order(size));
                *dma_handle = __phys_to_dma(dev, page_to_phys(page));
        } else {
@@ -192,7 +184,7 @@ void dma_direct_free_pages(struct device *dev, size_t size, void *cpu_addr,
                return;
        }
 
-       if (force_dma_unencrypted())
+       if (force_dma_unencrypted(dev))
                set_memory_encrypted((unsigned long)cpu_addr, 1 << page_order);
 
        if (IS_ENABLED(CONFIG_ARCH_HAS_UNCACHED_SEGMENT) &&
@@ -242,12 +234,14 @@ void dma_direct_sync_sg_for_device(struct device *dev,
        int i;
 
        for_each_sg(sgl, sg, nents, i) {
-               if (unlikely(is_swiotlb_buffer(sg_phys(sg))))
-                       swiotlb_tbl_sync_single(dev, sg_phys(sg), sg->length,
+               phys_addr_t paddr = dma_to_phys(dev, sg_dma_address(sg));
+
+               if (unlikely(is_swiotlb_buffer(paddr)))
+                       swiotlb_tbl_sync_single(dev, paddr, sg->length,
                                        dir, SYNC_FOR_DEVICE);
 
                if (!dev_is_dma_coherent(dev))
-                       arch_sync_dma_for_device(dev, sg_phys(sg), sg->length,
+                       arch_sync_dma_for_device(dev, paddr, sg->length,
                                        dir);
        }
 }
@@ -279,11 +273,13 @@ void dma_direct_sync_sg_for_cpu(struct device *dev,
        int i;
 
        for_each_sg(sgl, sg, nents, i) {
+               phys_addr_t paddr = dma_to_phys(dev, sg_dma_address(sg));
+
                if (!dev_is_dma_coherent(dev))
-                       arch_sync_dma_for_cpu(dev, sg_phys(sg), sg->length, dir);
-       
-               if (unlikely(is_swiotlb_buffer(sg_phys(sg))))
-                       swiotlb_tbl_sync_single(dev, sg_phys(sg), sg->length, dir,
+                       arch_sync_dma_for_cpu(dev, paddr, sg->length, dir);
+
+               if (unlikely(is_swiotlb_buffer(paddr)))
+                       swiotlb_tbl_sync_single(dev, paddr, sg->length, dir,
                                        SYNC_FOR_CPU);
        }
 
@@ -407,11 +403,9 @@ int dma_direct_supported(struct device *dev, u64 mask)
 
 size_t dma_direct_max_mapping_size(struct device *dev)
 {
-       size_t size = SIZE_MAX;
-
        /* If SWIOTLB is active, use its maximum mapping size */
-       if (is_swiotlb_active())
-               size = swiotlb_max_mapping_size(dev);
-
-       return size;
+       if (is_swiotlb_active() &&
+           (dma_addressing_limited(dev) || swiotlb_force == SWIOTLB_FORCE))
+               return swiotlb_max_mapping_size(dev);
+       return SIZE_MAX;
 }
index a75b6a7f458a7287439e40f0ac102fbb8b61e4a4..4436158a6d30bfb3ad7ed968e1257fdc19d76bd4 100644 (file)
@@ -720,6 +720,7 @@ static void exit_notify(struct task_struct *tsk, int group_dead)
        if (group_dead)
                kill_orphaned_pgrp(tsk->group_leader, NULL);
 
+       tsk->exit_state = EXIT_ZOMBIE;
        if (unlikely(tsk->ptrace)) {
                int sig = thread_group_leader(tsk) &&
                                thread_group_empty(tsk) &&
index 123ea07a3f3b048089dc1e3e1c6ad8f422ed50ab..ccb28085b11418f539766b96d32901bf05e0a7f6 100644 (file)
@@ -14,6 +14,12 @@ EXPORT_SYMBOL_GPL(housekeeping_overridden);
 static cpumask_var_t housekeeping_mask;
 static unsigned int housekeeping_flags;
 
+bool housekeeping_enabled(enum hk_flags flags)
+{
+       return !!(housekeeping_flags & flags);
+}
+EXPORT_SYMBOL_GPL(housekeeping_enabled);
+
 int housekeeping_any_cpu(enum hk_flags flags)
 {
        if (static_branch_unlikely(&housekeeping_overridden))
index 616d4d1148475291a16167aee7e48890b13890ec..7dbcb402c2fc0af441d75d13eeaef7a642f4fd57 100644 (file)
@@ -291,6 +291,14 @@ int smp_call_function_single(int cpu, smp_call_func_t func, void *info,
        WARN_ON_ONCE(cpu_online(this_cpu) && irqs_disabled()
                     && !oops_in_progress);
 
+       /*
+        * When @wait we can deadlock when we interrupt between llist_add() and
+        * arch_send_call_function_ipi*(); when !@wait we can deadlock due to
+        * csd_lock() on because the interrupt context uses the same csd
+        * storage.
+        */
+       WARN_ON_ONCE(!in_task());
+
        csd = &csd_stack;
        if (!wait) {
                csd = this_cpu_ptr(&csd_data);
@@ -416,6 +424,14 @@ void smp_call_function_many(const struct cpumask *mask,
        WARN_ON_ONCE(cpu_online(this_cpu) && irqs_disabled()
                     && !oops_in_progress && !early_boot_irqs_disabled);
 
+       /*
+        * When @wait we can deadlock when we interrupt between llist_add() and
+        * arch_send_call_function_ipi*(); when !@wait we can deadlock due to
+        * csd_lock() on because the interrupt context uses the same csd
+        * storage.
+        */
+       WARN_ON_ONCE(!in_task());
+
        /* Try to fastpath.  So, what's a CPU they want? Ignoring this one. */
        cpu = cpumask_first_and(mask, cpu_online_mask);
        if (cpu == this_cpu)
index e6a02b274b737e9d46f6c6816488fef40c72fdb5..f5440abb753291df445a1ce17559fd476d810a15 100644 (file)
@@ -226,12 +226,17 @@ unsigned int stack_trace_save_user(unsigned long *store, unsigned int size)
                .store  = store,
                .size   = size,
        };
+       mm_segment_t fs;
 
        /* Trace user stack if not a kernel thread */
        if (current->flags & PF_KTHREAD)
                return 0;
 
+       fs = get_fs();
+       set_fs(USER_DS);
        arch_stack_walk_user(consume_entry, &c, task_pt_regs(current));
+       set_fs(fs);
+
        return c.len;
 }
 #endif
index 52a7b2e6fb747361d0122cc53d4b8b1a3d230e52..f33d66fc0e86d5741e42b352bcb9e3a94d944412 100644 (file)
@@ -531,14 +531,6 @@ config LRU_CACHE
 config CLZ_TAB
        bool
 
-config DDR
-       bool "JEDEC DDR data"
-       help
-         Data from JEDEC specs for DDR SDRAM memories,
-         particularly the AC timing parameters and addressing
-         information. This data is useful for drivers handling
-         DDR SDRAM controllers.
-
 config IRQ_POLL
        bool "IRQ polling library"
        help
index bc6673ab3a08a0fd583883940f89a63e76962c99..5960e2980a8a00d536a0d8b1b8f50c5325897ed3 100644 (file)
@@ -353,23 +353,13 @@ config DEBUG_SECTION_MISMATCH
          which results in the code/data being placed in specific sections.
          The section mismatch analysis is always performed after a full
          kernel build, and enabling this option causes the following
-         additional steps to occur:
+         additional step to occur:
          - Add the option -fno-inline-functions-called-once to gcc commands.
            When inlining a function annotated with __init in a non-init
            function, we would lose the section information and thus
            the analysis would not catch the illegal reference.
            This option tells gcc to inline less (but it does result in
            a larger kernel).
-         - Run the section mismatch analysis for each module/built-in.a file.
-           When we run the section mismatch analysis on vmlinux.o, we
-           lose valuable information about where the mismatch was
-           introduced.
-           Running the analysis for each module/built-in.a file
-           tells where the mismatch happens much closer to the
-           source. The drawback is that the same mismatch is
-           reported at least twice.
-         - Enable verbose reporting from modpost in order to help resolve
-           the section mismatches that are reported.
 
 config SECTION_MISMATCH_WARN_ONLY
        bool "Make section mismatch errors non-fatal"
index 59067f51f3aba11e4c9587f078c3428e026a792b..095601ce371dabd7a7e5b3501c61ac4b6516d91b 100644 (file)
@@ -209,8 +209,6 @@ obj-$(CONFIG_SIGNATURE) += digsig.o
 
 lib-$(CONFIG_CLZ_TAB) += clz_tab.o
 
-obj-$(CONFIG_DDR) += jedec_ddr_data.o
-
 obj-$(CONFIG_GENERIC_STRNCPY_FROM_USER) += strncpy_from_user.o
 obj-$(CONFIG_GENERIC_STRNLEN_USER) += strnlen_user.o
 
index 439d641ec79648439999bcb9a93a11cece9c4566..38045d6d05381ebb89d73369b0c60766505ef9be 100644 (file)
@@ -74,8 +74,8 @@ void dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
                                        delta_us);
        curr_stats->cpms = DIV_ROUND_UP(ncomps * USEC_PER_MSEC, delta_us);
        if (curr_stats->epms != 0)
-               curr_stats->cpe_ratio =
-                               (curr_stats->cpms * 100) / curr_stats->epms;
+               curr_stats->cpe_ratio = DIV_ROUND_DOWN_ULL(
+                       curr_stats->cpms * 100, curr_stats->epms);
        else
                curr_stats->cpe_ratio = 0;
 
index 5bcc902c53888d8feb90957d0e90e5ad91e562fc..a4db51c2126633c35c3f0ee789022a3562596b80 100644 (file)
@@ -5,6 +5,62 @@
 
 #include <linux/dim.h>
 
+/*
+ * Net DIM profiles:
+ *        There are different set of profiles for each CQ period mode.
+ *        There are different set of profiles for RX/TX CQs.
+ *        Each profile size must be of NET_DIM_PARAMS_NUM_PROFILES
+ */
+#define NET_DIM_PARAMS_NUM_PROFILES 5
+#define NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE 256
+#define NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE 128
+#define NET_DIM_DEF_PROFILE_CQE 1
+#define NET_DIM_DEF_PROFILE_EQE 1
+
+#define NET_DIM_RX_EQE_PROFILES { \
+       {1,   NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+       {8,   NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+       {64,  NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+       {128, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+       {256, NET_DIM_DEFAULT_RX_CQ_MODERATION_PKTS_FROM_EQE}, \
+}
+
+#define NET_DIM_RX_CQE_PROFILES { \
+       {2,  256},             \
+       {8,  128},             \
+       {16, 64},              \
+       {32, 64},              \
+       {64, 64}               \
+}
+
+#define NET_DIM_TX_EQE_PROFILES { \
+       {1,   NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
+       {8,   NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
+       {32,  NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
+       {64,  NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE},  \
+       {128, NET_DIM_DEFAULT_TX_CQ_MODERATION_PKTS_FROM_EQE}   \
+}
+
+#define NET_DIM_TX_CQE_PROFILES { \
+       {5,  128},  \
+       {8,  64},  \
+       {16, 32},  \
+       {32, 32},  \
+       {64, 32}   \
+}
+
+static const struct dim_cq_moder
+rx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
+       NET_DIM_RX_EQE_PROFILES,
+       NET_DIM_RX_CQE_PROFILES,
+};
+
+static const struct dim_cq_moder
+tx_profile[DIM_CQ_PERIOD_NUM_MODES][NET_DIM_PARAMS_NUM_PROFILES] = {
+       NET_DIM_TX_EQE_PROFILES,
+       NET_DIM_TX_CQE_PROFILES,
+};
+
 struct dim_cq_moder
 net_dim_get_rx_moderation(u8 cq_period_mode, int ix)
 {
index 021cc9f66804d6db567d7a139d6e68ab10798665..a544e161c7fa3cc5a08c7b0f8cfa8884e49a6e4e 100644 (file)
@@ -715,6 +715,11 @@ void br_vlan_flush(struct net_bridge *br)
 
        ASSERT_RTNL();
 
+       /* delete auto-added default pvid local fdb before flushing vlans
+        * otherwise it will be leaked on bridge device init failure
+        */
+       br_fdb_delete_by_port(br, NULL, 0, 1);
+
        vg = br_vlan_group(br);
        __vlan_flush(vg);
        RCU_INIT_POINTER(br->vlgrp, NULL);
index 5275ddf580bc7d64139e323eca15e276357bfdd1..72711053ebe66ce8231fbb79d9c37f682071be64 100644 (file)
@@ -1046,32 +1046,50 @@ static __init int cgw_module_init(void)
        pr_info("can: netlink gateway (rev " CAN_GW_VERSION ") max_hops=%d\n",
                max_hops);
 
-       register_pernet_subsys(&cangw_pernet_ops);
+       ret = register_pernet_subsys(&cangw_pernet_ops);
+       if (ret)
+               return ret;
+
+       ret = -ENOMEM;
        cgw_cache = kmem_cache_create("can_gw", sizeof(struct cgw_job),
                                      0, 0, NULL);
-
        if (!cgw_cache)
-               return -ENOMEM;
+               goto out_cache_create;
 
        /* set notifier */
        notifier.notifier_call = cgw_notifier;
-       register_netdevice_notifier(&notifier);
+       ret = register_netdevice_notifier(&notifier);
+       if (ret)
+               goto out_register_notifier;
 
        ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_GETROUTE,
                                   NULL, cgw_dump_jobs, 0);
-       if (ret) {
-               unregister_netdevice_notifier(&notifier);
-               kmem_cache_destroy(cgw_cache);
-               return -ENOBUFS;
-       }
-
-       /* Only the first call to rtnl_register_module can fail */
-       rtnl_register_module(THIS_MODULE, PF_CAN, RTM_NEWROUTE,
-                            cgw_create_job, NULL, 0);
-       rtnl_register_module(THIS_MODULE, PF_CAN, RTM_DELROUTE,
-                            cgw_remove_job, NULL, 0);
+       if (ret)
+               goto out_rtnl_register1;
+
+       ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_NEWROUTE,
+                                  cgw_create_job, NULL, 0);
+       if (ret)
+               goto out_rtnl_register2;
+       ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_DELROUTE,
+                                  cgw_remove_job, NULL, 0);
+       if (ret)
+               goto out_rtnl_register3;
 
        return 0;
+
+out_rtnl_register3:
+       rtnl_unregister(PF_CAN, RTM_NEWROUTE);
+out_rtnl_register2:
+       rtnl_unregister(PF_CAN, RTM_GETROUTE);
+out_rtnl_register1:
+       unregister_netdevice_notifier(&notifier);
+out_register_notifier:
+       kmem_cache_destroy(cgw_cache);
+out_cache_create:
+       unregister_pernet_subsys(&cangw_pernet_ops);
+
+       return ret;
 }
 
 static __exit void cgw_module_exit(void)
index fc676b2610e3c1e7e236b62d4984647bc0e71916..2f341b8508456ecc110302fb1959703735540b96 100644 (file)
@@ -9701,6 +9701,8 @@ static void __net_exit default_device_exit(struct net *net)
 
                /* Push remaining network devices to init_net */
                snprintf(fb_name, IFNAMSIZ, "dev%d", dev->ifindex);
+               if (__dev_get_by_name(&init_net, fb_name))
+                       snprintf(fb_name, IFNAMSIZ, "dev%%d");
                err = dev_change_net_namespace(dev, &init_net, fb_name);
                if (err) {
                        pr_emerg("%s: failed to move %s to init_net: %d\n",
index 4e2a79b2fd77f36ba2a31e9e43af1abc1207766e..7878f918b8c057b7b90ca0afcf2d5773cfb55e15 100644 (file)
@@ -7455,12 +7455,12 @@ static u32 bpf_convert_ctx_access(enum bpf_access_type type,
        case offsetof(struct __sk_buff, gso_segs):
                /* si->dst_reg = skb_shinfo(SKB); */
 #ifdef NET_SKBUFF_DATA_USES_OFFSET
-               *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(struct sk_buff, head),
-                                     si->dst_reg, si->src_reg,
-                                     offsetof(struct sk_buff, head));
                *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(struct sk_buff, end),
                                      BPF_REG_AX, si->src_reg,
                                      offsetof(struct sk_buff, end));
+               *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(struct sk_buff, head),
+                                     si->dst_reg, si->src_reg,
+                                     offsetof(struct sk_buff, head));
                *insn++ = BPF_ALU64_REG(BPF_ADD, si->dst_reg, BPF_REG_AX);
 #else
                *insn++ = BPF_LDX_MEM(BPF_FIELD_SIZEOF(struct sk_buff, end),
index 93bffaad21354d4a255a973d03bc7bcdf9477432..6832eeb4b785464f873d073f5cd3b41fdf956034 100644 (file)
@@ -585,12 +585,12 @@ EXPORT_SYMBOL_GPL(sk_psock_destroy);
 
 void sk_psock_drop(struct sock *sk, struct sk_psock *psock)
 {
-       rcu_assign_sk_user_data(sk, NULL);
        sk_psock_cork_free(psock);
        sk_psock_zap_ingress(psock);
-       sk_psock_restore_proto(sk, psock);
 
        write_lock_bh(&sk->sk_callback_lock);
+       sk_psock_restore_proto(sk, psock);
+       rcu_assign_sk_user_data(sk, NULL);
        if (psock->progs.skb_parser)
                sk_psock_stop_strp(sk, psock);
        write_unlock_bh(&sk->sk_callback_lock);
index 52d4faeee18b0cecc8432ee71db16efb852b8644..1330a7442e5b1e54d80d0b675f7356742bcdfbec 100644 (file)
@@ -247,6 +247,8 @@ static void sock_map_free(struct bpf_map *map)
        raw_spin_unlock_bh(&stab->lock);
        rcu_read_unlock();
 
+       synchronize_rcu();
+
        bpf_map_area_free(stab->sks);
        kfree(stab);
 }
@@ -276,16 +278,20 @@ static int __sock_map_delete(struct bpf_stab *stab, struct sock *sk_test,
                             struct sock **psk)
 {
        struct sock *sk;
+       int err = 0;
 
        raw_spin_lock_bh(&stab->lock);
        sk = *psk;
        if (!sk_test || sk_test == sk)
-               *psk = NULL;
+               sk = xchg(psk, NULL);
+
+       if (likely(sk))
+               sock_map_unref(sk, psk);
+       else
+               err = -EINVAL;
+
        raw_spin_unlock_bh(&stab->lock);
-       if (unlikely(!sk))
-               return -EINVAL;
-       sock_map_unref(sk, psk);
-       return 0;
+       return err;
 }
 
 static void sock_map_delete_from_link(struct bpf_map *map, struct sock *sk,
@@ -328,6 +334,7 @@ static int sock_map_update_common(struct bpf_map *map, u32 idx,
                                  struct sock *sk, u64 flags)
 {
        struct bpf_stab *stab = container_of(map, struct bpf_stab, map);
+       struct inet_connection_sock *icsk = inet_csk(sk);
        struct sk_psock_link *link;
        struct sk_psock *psock;
        struct sock *osk;
@@ -338,6 +345,8 @@ static int sock_map_update_common(struct bpf_map *map, u32 idx,
                return -EINVAL;
        if (unlikely(idx >= map->max_entries))
                return -E2BIG;
+       if (unlikely(icsk->icsk_ulp_data))
+               return -EINVAL;
 
        link = sk_psock_init_link();
        if (!link)
index d666756be5f18404ce8e85a95e9f09636d5f2694..a999451345f9805a195915dc2c55a9db31a51002 100644 (file)
@@ -331,7 +331,7 @@ struct inet_frag_queue *inet_frag_find(struct fqdir *fqdir, void *key)
        prev = rhashtable_lookup(&fqdir->rhashtable, key, fqdir->f->rhash_params);
        if (!prev)
                fq = inet_frag_create(fqdir, key, &prev);
-       if (prev && !IS_ERR(prev)) {
+       if (!IS_ERR_OR_NULL(prev)) {
                fq = prev;
                if (!refcount_inc_not_zero(&fq->refcnt))
                        fq = NULL;
index 43adfc1641bacac2df882970e1eafca318896041..2f01cf6fa0deffb6f86a4db89b0aa8b951d0f352 100644 (file)
@@ -275,6 +275,9 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb,
        const struct iphdr  *tiph = &tunnel->parms.iph;
        u8 ipproto;
 
+       if (!pskb_inet_may_pull(skb))
+               goto tx_error;
+
        switch (skb->protocol) {
        case htons(ETH_P_IP):
                ipproto = IPPROTO_IPIP;
index 4af1f5dae9d3e937ef39685355c9d3f19ff3ee3b..6e4afc48d7bba7cded4d3fe38f32ab02328f9e05 100644 (file)
@@ -1288,6 +1288,7 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue,
        struct tcp_sock *tp = tcp_sk(sk);
        struct sk_buff *buff;
        int nsize, old_factor;
+       long limit;
        int nlen;
        u8 flags;
 
@@ -1298,8 +1299,16 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue,
        if (nsize < 0)
                nsize = 0;
 
-       if (unlikely((sk->sk_wmem_queued >> 1) > sk->sk_sndbuf &&
-                    tcp_queue != TCP_FRAG_IN_WRITE_QUEUE)) {
+       /* tcp_sendmsg() can overshoot sk_wmem_queued by one full size skb.
+        * We need some allowance to not penalize applications setting small
+        * SO_SNDBUF values.
+        * Also allow first and last skb in retransmit queue to be split.
+        */
+       limit = sk->sk_sndbuf + 2 * SKB_TRUESIZE(GSO_MAX_SIZE);
+       if (unlikely((sk->sk_wmem_queued >> 1) > limit &&
+                    tcp_queue != TCP_FRAG_IN_WRITE_QUEUE &&
+                    skb != tcp_rtx_queue_head(sk) &&
+                    skb != tcp_rtx_queue_tail(sk))) {
                NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPWQUEUETOOBIG);
                return -ENOMEM;
        }
index 3d8a1d8354719378ef157e36dbe21c57af9a4b7c..4849edb62d52964c61ef2d0601c16baa662e196d 100644 (file)
@@ -96,6 +96,19 @@ void tcp_get_available_ulp(char *buf, size_t maxlen)
        rcu_read_unlock();
 }
 
+void tcp_update_ulp(struct sock *sk, struct proto *proto)
+{
+       struct inet_connection_sock *icsk = inet_csk(sk);
+
+       if (!icsk->icsk_ulp_ops) {
+               sk->sk_prot = proto;
+               return;
+       }
+
+       if (icsk->icsk_ulp_ops->update)
+               icsk->icsk_ulp_ops->update(sk, proto);
+}
+
 void tcp_cleanup_ulp(struct sock *sk)
 {
        struct inet_connection_sock *icsk = inet_csk(sk);
index c2049c72f3e533a7077674ca6dac43b527eb8b7f..dd2d0b96326074d3255eee91891938dc1d948483 100644 (file)
@@ -660,12 +660,13 @@ static int prepare_ip6gre_xmit_ipv6(struct sk_buff *skb,
                                    struct flowi6 *fl6, __u8 *dsfield,
                                    int *encap_limit)
 {
-       struct ipv6hdr *ipv6h = ipv6_hdr(skb);
+       struct ipv6hdr *ipv6h;
        struct ip6_tnl *t = netdev_priv(dev);
        __u16 offset;
 
        offset = ip6_tnl_parse_tlv_enc_lim(skb, skb_network_header(skb));
        /* ip6_tnl_parse_tlv_enc_lim() might have reallocated skb->head */
+       ipv6h = ipv6_hdr(skb);
 
        if (offset > 0) {
                struct ipv6_tlv_tnl_enc_lim *tel;
index 3134fbb65d7f268d2b8785b3feb622a36c2d15c3..754a484d35df6eb03b82593cbb66a78718e30326 100644 (file)
@@ -1278,12 +1278,11 @@ ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
        }
 
        fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL);
+       dsfield = INET_ECN_encapsulate(dsfield, ipv4_get_dsfield(iph));
 
        if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6))
                return -1;
 
-       dsfield = INET_ECN_encapsulate(dsfield, ipv4_get_dsfield(iph));
-
        skb_set_inner_ipproto(skb, IPPROTO_IPIP);
 
        err = ip6_tnl_xmit(skb, dev, dsfield, &fl6, encap_limit, &mtu,
@@ -1367,12 +1366,11 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
        }
 
        fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL);
+       dsfield = INET_ECN_encapsulate(dsfield, ipv6_get_dsfield(ipv6h));
 
        if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6))
                return -1;
 
-       dsfield = INET_ECN_encapsulate(dsfield, ipv6_get_dsfield(ipv6h));
-
        skb_set_inner_ipproto(skb, IPPROTO_IPV6);
 
        err = ip6_tnl_xmit(skb, dev, dsfield, &fl6, encap_limit, &mtu,
index 09e1694b6d341a5f1cf81e49643f9267ac4033c4..ebb62a4ebe30d3bd6347f72711b23655cddc00c5 100644 (file)
@@ -512,7 +512,9 @@ static void iucv_sock_close(struct sock *sk)
                        sk->sk_state = IUCV_DISCONN;
                        sk->sk_state_change(sk);
                }
-       case IUCV_DISCONN:   /* fall through */
+               /* fall through */
+
+       case IUCV_DISCONN:
                sk->sk_state = IUCV_CLOSING;
                sk->sk_state_change(sk);
 
@@ -525,8 +527,9 @@ static void iucv_sock_close(struct sock *sk)
                                        iucv_sock_in_state(sk, IUCV_CLOSED, 0),
                                        timeo);
                }
+               /* fall through */
 
-       case IUCV_CLOSING:   /* fall through */
+       case IUCV_CLOSING:
                sk->sk_state = IUCV_CLOSED;
                sk->sk_state_change(sk);
 
@@ -535,8 +538,9 @@ static void iucv_sock_close(struct sock *sk)
 
                skb_queue_purge(&iucv->send_skb_q);
                skb_queue_purge(&iucv->backlog_skb_q);
+               /* fall through */
 
-       default:   /* fall through */
+       default:
                iucv_sever_path(sk, 1);
        }
 
@@ -2247,10 +2251,10 @@ static int afiucv_hs_rcv(struct sk_buff *skb, struct net_device *dev,
                        kfree_skb(skb);
                        break;
                }
-               /* fall through and receive non-zero length data */
+               /* fall through and receive non-zero length data */
        case (AF_IUCV_FLAG_SHT):
                /* shutdown request */
-               /* fall through and receive zero length data */
+               /* fall through and receive zero length data */
        case 0:
                /* plain data frame */
                IUCV_SKB_CB(skb)->class = trans_hdr->iucv_hdr.class;
index 1d0e5904dedf0bd180f2cd56400ac0da2038c0dd..c54cb59593ef8133c74bd30b771eb020573a27e2 100644 (file)
@@ -1681,6 +1681,9 @@ static const struct proto_ops pppol2tp_ops = {
        .recvmsg        = pppol2tp_recvmsg,
        .mmap           = sock_no_mmap,
        .ioctl          = pppox_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = pppox_compat_ioctl,
+#endif
 };
 
 static const struct pppox_proto pppol2tp_proto = {
index 96740d389377170b90a5d3d2dba3482bd293eb9a..c4f54ad2b98afb44002415ce1daf2afef646d8c0 100644 (file)
@@ -967,6 +967,7 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
 
        window = skb->data[20];
 
+       sock_hold(make);
        skb->sk             = make;
        skb->destructor     = sock_efree;
        make->sk_state      = TCP_ESTABLISHED;
index 892287d06c1768d3f16b029859f344c560984ff1..d01410e520979dd4a05336568f80dd6e0362bd93 100644 (file)
@@ -1047,7 +1047,7 @@ error:
 }
 
 /* Factor out action copy to avoid "Wframe-larger-than=1024" warning. */
-static struct sw_flow_actions *get_flow_actions(struct net *net,
+static noinline_for_stack struct sw_flow_actions *get_flow_actions(struct net *net,
                                                const struct nlattr *a,
                                                const struct sw_flow_key *key,
                                                const struct sw_flow_mask *mask,
@@ -1081,12 +1081,13 @@ static struct sw_flow_actions *get_flow_actions(struct net *net,
  * we should not to return match object with dangling reference
  * to mask.
  * */
-static int ovs_nla_init_match_and_action(struct net *net,
-                                        struct sw_flow_match *match,
-                                        struct sw_flow_key *key,
-                                        struct nlattr **a,
-                                        struct sw_flow_actions **acts,
-                                        bool log)
+static noinline_for_stack int
+ovs_nla_init_match_and_action(struct net *net,
+                             struct sw_flow_match *match,
+                             struct sw_flow_key *key,
+                             struct nlattr **a,
+                             struct sw_flow_actions **acts,
+                             bool log)
 {
        struct sw_flow_mask mask;
        int error = 0;
index ff74c4bbb9fc883f4107432c11a47f3d6f840137..9986d6065c4d1f357f021700351866d0ebe4f8a2 100644 (file)
@@ -105,7 +105,8 @@ static int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id,
                break;
 
        case RDMA_CM_EVENT_ESTABLISHED:
-               trans->cm_connect_complete(conn, event);
+               if (conn)
+                       trans->cm_connect_complete(conn, event);
                break;
 
        case RDMA_CM_EVENT_REJECTED:
@@ -137,6 +138,8 @@ static int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id,
                break;
 
        case RDMA_CM_EVENT_DISCONNECTED:
+               if (!conn)
+                       break;
                rdsdebug("DISCONNECT event - dropping connection "
                         "%pI6c->%pI6c\n", &conn->c_laddr,
                         &conn->c_faddr);
index 80335b4ee4fd6c2b1ae39bed5b9089e35c292b84..822f45386e31169378157fa09530fa258ec6577d 100644 (file)
@@ -1061,6 +1061,7 @@ void rxrpc_destroy_all_peers(struct rxrpc_net *);
 struct rxrpc_peer *rxrpc_get_peer(struct rxrpc_peer *);
 struct rxrpc_peer *rxrpc_get_peer_maybe(struct rxrpc_peer *);
 void rxrpc_put_peer(struct rxrpc_peer *);
+void rxrpc_put_peer_locked(struct rxrpc_peer *);
 
 /*
  * proc.c
index 9f2f45c09e58353d11e1b8abc9345209a92dc726..7666ec72d37e5e5e8971ca288749738ba324c64a 100644 (file)
@@ -378,7 +378,7 @@ static void rxrpc_peer_keepalive_dispatch(struct rxrpc_net *rxnet,
                spin_lock_bh(&rxnet->peer_hash_lock);
                list_add_tail(&peer->keepalive_link,
                              &rxnet->peer_keepalive[slot & mask]);
-               rxrpc_put_peer(peer);
+               rxrpc_put_peer_locked(peer);
        }
 
        spin_unlock_bh(&rxnet->peer_hash_lock);
index 9d3ce81cf8ae899cd38c92a493b700d4d152f50a..9c3ac96f71cbf8202ccdeca3af388ad8a2ae08b3 100644 (file)
@@ -436,6 +436,24 @@ void rxrpc_put_peer(struct rxrpc_peer *peer)
        }
 }
 
+/*
+ * Drop a ref on a peer record where the caller already holds the
+ * peer_hash_lock.
+ */
+void rxrpc_put_peer_locked(struct rxrpc_peer *peer)
+{
+       const void *here = __builtin_return_address(0);
+       int n;
+
+       n = atomic_dec_return(&peer->usage);
+       trace_rxrpc_peer(peer, rxrpc_peer_put, n, here);
+       if (n == 0) {
+               hash_del_rcu(&peer->hash_link);
+               list_del_init(&peer->keepalive_link);
+               kfree_rcu(peer, rcu);
+       }
+}
+
 /*
  * Make sure all peer records have been discarded.
  */
index 5d3f33ce6d4100070dd348edc2018167fce921d3..bae14438f86918a8ccf1e2df82071d3a9dba7f18 100644 (file)
@@ -226,6 +226,7 @@ static int rxrpc_queue_packet(struct rxrpc_sock *rx, struct rxrpc_call *call,
                        rxrpc_set_call_completion(call,
                                                  RXRPC_CALL_LOCAL_ERROR,
                                                  0, ret);
+                       rxrpc_notify_socket(call);
                        goto out;
                }
                _debug("need instant resend %d", ret);
index 41d5398dd2f2ee79bc9fc203df86846bdce0f3a7..3578196d1600e090c4358cb36bd9899b4ad1642e 100644 (file)
@@ -481,6 +481,11 @@ static int tcf_ife_init(struct net *net, struct nlattr *nla,
        int ret = 0;
        int err;
 
+       if (!nla) {
+               NL_SET_ERR_MSG_MOD(extack, "IFE requires attributes to be passed");
+               return -EINVAL;
+       }
+
        err = nla_parse_nested_deprecated(tb, TCA_IFE_MAX, nla, ife_policy,
                                          NULL);
        if (err < 0)
index 25ef172c23dfa31d05729c76a58ade3bb4967d5e..30169b3adbbb064c51b6006755d56446570f974c 100644 (file)
@@ -71,10 +71,10 @@ static struct sk_buff *dequeue_func(struct codel_vars *vars, void *ctx)
        struct Qdisc *sch = ctx;
        struct sk_buff *skb = __qdisc_dequeue_head(&sch->q);
 
-       if (skb)
+       if (skb) {
                sch->qstats.backlog -= qdisc_pkt_len(skb);
-
-       prefetch(&skb->end); /* we'll need skb_shinfo() */
+               prefetch(&skb->end); /* we'll need skb_shinfo() */
+       }
        return skb;
 }
 
index aa80cda3658116b94081f4700c28b8cb03fd2de6..9d1f83b10c0a6c5ab0ca2736c8a9f8491e44c310 100644 (file)
@@ -985,7 +985,7 @@ static int sctp_setsockopt_bindx(struct sock *sk,
                return -EINVAL;
 
        kaddrs = memdup_user(addrs, addrs_size);
-       if (unlikely(IS_ERR(kaddrs)))
+       if (IS_ERR(kaddrs))
                return PTR_ERR(kaddrs);
 
        /* Walk through the addrs buffer and count the number of addresses. */
@@ -1315,7 +1315,7 @@ static int __sctp_setsockopt_connectx(struct sock *sk,
                return -EINVAL;
 
        kaddrs = memdup_user(addrs, addrs_size);
-       if (unlikely(IS_ERR(kaddrs)))
+       if (IS_ERR(kaddrs))
                return PTR_ERR(kaddrs);
 
        /* Allow security module to validate connectx addresses. */
index dd8537f988c4004a5c50e004f1654db5c4e548b6..83ae41d7e5548077778c805e6c3367cdbf674313 100644 (file)
@@ -485,9 +485,8 @@ static int tipc_sk_create(struct net *net, struct socket *sock,
                tsk_set_unreturnable(tsk, true);
                if (sock->type == SOCK_DGRAM)
                        tsk_set_unreliable(tsk, true);
-               __skb_queue_head_init(&tsk->mc_method.deferredq);
        }
-
+       __skb_queue_head_init(&tsk->mc_method.deferredq);
        trace_tipc_sk_create(sk, NULL, TIPC_DUMP_NONE, " ");
        return 0;
 }
index 4674e57e66b0533fc5faf5ae930c0aad85eb8b77..f208f8455ef2e885935921f9e2238db0b310f549 100644 (file)
@@ -261,24 +261,36 @@ void tls_ctx_free(struct tls_context *ctx)
        kfree(ctx);
 }
 
-static void tls_sk_proto_close(struct sock *sk, long timeout)
+static void tls_ctx_free_deferred(struct work_struct *gc)
 {
-       struct tls_context *ctx = tls_get_ctx(sk);
-       long timeo = sock_sndtimeo(sk, 0);
-       void (*sk_proto_close)(struct sock *sk, long timeout);
-       bool free_ctx = false;
-
-       lock_sock(sk);
-       sk_proto_close = ctx->sk_proto_close;
+       struct tls_context *ctx = container_of(gc, struct tls_context, gc);
 
-       if (ctx->tx_conf == TLS_HW_RECORD && ctx->rx_conf == TLS_HW_RECORD)
-               goto skip_tx_cleanup;
+       /* Ensure any remaining work items are completed. The sk will
+        * already have lost its tls_ctx reference by the time we get
+        * here so no xmit operation will actually be performed.
+        */
+       if (ctx->tx_conf == TLS_SW) {
+               tls_sw_cancel_work_tx(ctx);
+               tls_sw_free_ctx_tx(ctx);
+       }
 
-       if (ctx->tx_conf == TLS_BASE && ctx->rx_conf == TLS_BASE) {
-               free_ctx = true;
-               goto skip_tx_cleanup;
+       if (ctx->rx_conf == TLS_SW) {
+               tls_sw_strparser_done(ctx);
+               tls_sw_free_ctx_rx(ctx);
        }
 
+       tls_ctx_free(ctx);
+}
+
+static void tls_ctx_free_wq(struct tls_context *ctx)
+{
+       INIT_WORK(&ctx->gc, tls_ctx_free_deferred);
+       schedule_work(&ctx->gc);
+}
+
+static void tls_sk_proto_cleanup(struct sock *sk,
+                                struct tls_context *ctx, long timeo)
+{
        if (unlikely(sk->sk_write_pending) &&
            !wait_on_pending_writer(sk, &timeo))
                tls_handle_open_record(sk, 0);
@@ -287,7 +299,7 @@ static void tls_sk_proto_close(struct sock *sk, long timeout)
        if (ctx->tx_conf == TLS_SW) {
                kfree(ctx->tx.rec_seq);
                kfree(ctx->tx.iv);
-               tls_sw_free_resources_tx(sk);
+               tls_sw_release_resources_tx(sk);
 #ifdef CONFIG_TLS_DEVICE
        } else if (ctx->tx_conf == TLS_HW) {
                tls_device_free_resources_tx(sk);
@@ -295,26 +307,67 @@ static void tls_sk_proto_close(struct sock *sk, long timeout)
        }
 
        if (ctx->rx_conf == TLS_SW)
-               tls_sw_free_resources_rx(sk);
+               tls_sw_release_resources_rx(sk);
 
 #ifdef CONFIG_TLS_DEVICE
        if (ctx->rx_conf == TLS_HW)
                tls_device_offload_cleanup_rx(sk);
-
-       if (ctx->tx_conf != TLS_HW && ctx->rx_conf != TLS_HW) {
-#else
-       {
 #endif
-               tls_ctx_free(ctx);
-               ctx = NULL;
+}
+
+static void tls_sk_proto_unhash(struct sock *sk)
+{
+       struct inet_connection_sock *icsk = inet_csk(sk);
+       long timeo = sock_sndtimeo(sk, 0);
+       struct tls_context *ctx;
+
+       if (unlikely(!icsk->icsk_ulp_data)) {
+               if (sk->sk_prot->unhash)
+                       sk->sk_prot->unhash(sk);
        }
 
-skip_tx_cleanup:
+       ctx = tls_get_ctx(sk);
+       tls_sk_proto_cleanup(sk, ctx, timeo);
+       write_lock_bh(&sk->sk_callback_lock);
+       icsk->icsk_ulp_data = NULL;
+       sk->sk_prot = ctx->sk_proto;
+       write_unlock_bh(&sk->sk_callback_lock);
+
+       if (ctx->sk_proto->unhash)
+               ctx->sk_proto->unhash(sk);
+       tls_ctx_free_wq(ctx);
+}
+
+static void tls_sk_proto_close(struct sock *sk, long timeout)
+{
+       struct inet_connection_sock *icsk = inet_csk(sk);
+       struct tls_context *ctx = tls_get_ctx(sk);
+       long timeo = sock_sndtimeo(sk, 0);
+       bool free_ctx;
+
+       if (ctx->tx_conf == TLS_SW)
+               tls_sw_cancel_work_tx(ctx);
+
+       lock_sock(sk);
+       free_ctx = ctx->tx_conf != TLS_HW && ctx->rx_conf != TLS_HW;
+
+       if (ctx->tx_conf != TLS_BASE || ctx->rx_conf != TLS_BASE)
+               tls_sk_proto_cleanup(sk, ctx, timeo);
+
+       write_lock_bh(&sk->sk_callback_lock);
+       if (free_ctx)
+               icsk->icsk_ulp_data = NULL;
+       sk->sk_prot = ctx->sk_proto;
+       write_unlock_bh(&sk->sk_callback_lock);
        release_sock(sk);
-       sk_proto_close(sk, timeout);
-       /* free ctx for TLS_HW_RECORD, used by tcp_set_state
-        * for sk->sk_prot->unhash [tls_hw_unhash]
-        */
+       if (ctx->tx_conf == TLS_SW)
+               tls_sw_free_ctx_tx(ctx);
+       if (ctx->rx_conf == TLS_SW || ctx->rx_conf == TLS_HW)
+               tls_sw_strparser_done(ctx);
+       if (ctx->rx_conf == TLS_SW)
+               tls_sw_free_ctx_rx(ctx);
+       ctx->sk_proto_close(sk, timeout);
+
        if (free_ctx)
                tls_ctx_free(ctx);
 }
@@ -526,6 +579,8 @@ static int do_tls_setsockopt_conf(struct sock *sk, char __user *optval,
                {
 #endif
                        rc = tls_set_sw_offload(sk, ctx, 1);
+                       if (rc)
+                               goto err_crypto_info;
                        conf = TLS_SW;
                }
        } else {
@@ -537,13 +592,13 @@ static int do_tls_setsockopt_conf(struct sock *sk, char __user *optval,
                {
 #endif
                        rc = tls_set_sw_offload(sk, ctx, 0);
+                       if (rc)
+                               goto err_crypto_info;
                        conf = TLS_SW;
                }
+               tls_sw_strparser_arm(sk, ctx);
        }
 
-       if (rc)
-               goto err_crypto_info;
-
        if (tx)
                ctx->tx_conf = conf;
        else
@@ -607,6 +662,7 @@ static struct tls_context *create_ctx(struct sock *sk)
        ctx->setsockopt = sk->sk_prot->setsockopt;
        ctx->getsockopt = sk->sk_prot->getsockopt;
        ctx->sk_proto_close = sk->sk_prot->close;
+       ctx->unhash = sk->sk_prot->unhash;
        return ctx;
 }
 
@@ -730,6 +786,7 @@ static void build_protos(struct proto prot[TLS_NUM_CONFIG][TLS_NUM_CONFIG],
        prot[TLS_BASE][TLS_BASE].setsockopt     = tls_setsockopt;
        prot[TLS_BASE][TLS_BASE].getsockopt     = tls_getsockopt;
        prot[TLS_BASE][TLS_BASE].close          = tls_sk_proto_close;
+       prot[TLS_BASE][TLS_BASE].unhash         = tls_sk_proto_unhash;
 
        prot[TLS_SW][TLS_BASE] = prot[TLS_BASE][TLS_BASE];
        prot[TLS_SW][TLS_BASE].sendmsg          = tls_sw_sendmsg;
@@ -747,16 +804,20 @@ static void build_protos(struct proto prot[TLS_NUM_CONFIG][TLS_NUM_CONFIG],
 
 #ifdef CONFIG_TLS_DEVICE
        prot[TLS_HW][TLS_BASE] = prot[TLS_BASE][TLS_BASE];
+       prot[TLS_HW][TLS_BASE].unhash           = base->unhash;
        prot[TLS_HW][TLS_BASE].sendmsg          = tls_device_sendmsg;
        prot[TLS_HW][TLS_BASE].sendpage         = tls_device_sendpage;
 
        prot[TLS_HW][TLS_SW] = prot[TLS_BASE][TLS_SW];
+       prot[TLS_HW][TLS_SW].unhash             = base->unhash;
        prot[TLS_HW][TLS_SW].sendmsg            = tls_device_sendmsg;
        prot[TLS_HW][TLS_SW].sendpage           = tls_device_sendpage;
 
        prot[TLS_BASE][TLS_HW] = prot[TLS_BASE][TLS_SW];
+       prot[TLS_BASE][TLS_HW].unhash           = base->unhash;
 
        prot[TLS_SW][TLS_HW] = prot[TLS_SW][TLS_SW];
+       prot[TLS_SW][TLS_HW].unhash             = base->unhash;
 
        prot[TLS_HW][TLS_HW] = prot[TLS_HW][TLS_SW];
 #endif
@@ -764,7 +825,6 @@ static void build_protos(struct proto prot[TLS_NUM_CONFIG][TLS_NUM_CONFIG],
        prot[TLS_HW_RECORD][TLS_HW_RECORD] = *base;
        prot[TLS_HW_RECORD][TLS_HW_RECORD].hash         = tls_hw_hash;
        prot[TLS_HW_RECORD][TLS_HW_RECORD].unhash       = tls_hw_unhash;
-       prot[TLS_HW_RECORD][TLS_HW_RECORD].close        = tls_sk_proto_close;
 }
 
 static int tls_init(struct sock *sk)
@@ -773,7 +833,7 @@ static int tls_init(struct sock *sk)
        int rc = 0;
 
        if (tls_hw_prot(sk))
-               goto out;
+               return 0;
 
        /* The TLS ulp is currently supported only for TCP sockets
         * in ESTABLISHED state.
@@ -784,21 +844,38 @@ static int tls_init(struct sock *sk)
        if (sk->sk_state != TCP_ESTABLISHED)
                return -ENOTSUPP;
 
+       tls_build_proto(sk);
+
        /* allocate tls context */
+       write_lock_bh(&sk->sk_callback_lock);
        ctx = create_ctx(sk);
        if (!ctx) {
                rc = -ENOMEM;
                goto out;
        }
 
-       tls_build_proto(sk);
        ctx->tx_conf = TLS_BASE;
        ctx->rx_conf = TLS_BASE;
+       ctx->sk_proto = sk->sk_prot;
        update_sk_prot(sk, ctx);
 out:
+       write_unlock_bh(&sk->sk_callback_lock);
        return rc;
 }
 
+static void tls_update(struct sock *sk, struct proto *p)
+{
+       struct tls_context *ctx;
+
+       ctx = tls_get_ctx(sk);
+       if (likely(ctx)) {
+               ctx->sk_proto_close = p->close;
+               ctx->sk_proto = p;
+       } else {
+               sk->sk_prot = p;
+       }
+}
+
 void tls_register_device(struct tls_device *device)
 {
        spin_lock_bh(&device_spinlock);
@@ -819,6 +896,7 @@ static struct tcp_ulp_ops tcp_tls_ulp_ops __read_mostly = {
        .name                   = "tls",
        .owner                  = THIS_MODULE,
        .init                   = tls_init,
+       .update                 = tls_update,
 };
 
 static int __init tls_register(void)
index 53b4ad94e74ab0aecb964ce0ed482c9277654d47..91d21b048a9b245804ba800d7e9dbc1b5c07a868 100644 (file)
@@ -2054,7 +2054,16 @@ static void tls_data_ready(struct sock *sk)
        }
 }
 
-void tls_sw_free_resources_tx(struct sock *sk)
+void tls_sw_cancel_work_tx(struct tls_context *tls_ctx)
+{
+       struct tls_sw_context_tx *ctx = tls_sw_ctx_tx(tls_ctx);
+
+       set_bit(BIT_TX_CLOSING, &ctx->tx_bitmask);
+       set_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask);
+       cancel_delayed_work_sync(&ctx->tx_work.work);
+}
+
+void tls_sw_release_resources_tx(struct sock *sk)
 {
        struct tls_context *tls_ctx = tls_get_ctx(sk);
        struct tls_sw_context_tx *ctx = tls_sw_ctx_tx(tls_ctx);
@@ -2065,11 +2074,6 @@ void tls_sw_free_resources_tx(struct sock *sk)
        if (atomic_read(&ctx->encrypt_pending))
                crypto_wait_req(-EINPROGRESS, &ctx->async_wait);
 
-       release_sock(sk);
-       cancel_delayed_work_sync(&ctx->tx_work.work);
-       lock_sock(sk);
-
-       /* Tx whatever records we can transmit and abandon the rest */
        tls_tx_records(sk, -1);
 
        /* Free up un-sent records in tx_list. First, free
@@ -2092,6 +2096,11 @@ void tls_sw_free_resources_tx(struct sock *sk)
 
        crypto_free_aead(ctx->aead_send);
        tls_free_open_rec(sk);
+}
+
+void tls_sw_free_ctx_tx(struct tls_context *tls_ctx)
+{
+       struct tls_sw_context_tx *ctx = tls_sw_ctx_tx(tls_ctx);
 
        kfree(ctx);
 }
@@ -2110,25 +2119,40 @@ void tls_sw_release_resources_rx(struct sock *sk)
                skb_queue_purge(&ctx->rx_list);
                crypto_free_aead(ctx->aead_recv);
                strp_stop(&ctx->strp);
-               write_lock_bh(&sk->sk_callback_lock);
-               sk->sk_data_ready = ctx->saved_data_ready;
-               write_unlock_bh(&sk->sk_callback_lock);
-               release_sock(sk);
-               strp_done(&ctx->strp);
-               lock_sock(sk);
+               /* If tls_sw_strparser_arm() was not called (cleanup paths)
+                * we still want to strp_stop(), but sk->sk_data_ready was
+                * never swapped.
+                */
+               if (ctx->saved_data_ready) {
+                       write_lock_bh(&sk->sk_callback_lock);
+                       sk->sk_data_ready = ctx->saved_data_ready;
+                       write_unlock_bh(&sk->sk_callback_lock);
+               }
        }
 }
 
-void tls_sw_free_resources_rx(struct sock *sk)
+void tls_sw_strparser_done(struct tls_context *tls_ctx)
 {
-       struct tls_context *tls_ctx = tls_get_ctx(sk);
        struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx);
 
-       tls_sw_release_resources_rx(sk);
+       strp_done(&ctx->strp);
+}
+
+void tls_sw_free_ctx_rx(struct tls_context *tls_ctx)
+{
+       struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx);
 
        kfree(ctx);
 }
 
+void tls_sw_free_resources_rx(struct sock *sk)
+{
+       struct tls_context *tls_ctx = tls_get_ctx(sk);
+
+       tls_sw_release_resources_rx(sk);
+       tls_sw_free_ctx_rx(tls_ctx);
+}
+
 /* The work handler to transmitt the encrypted records in tx_list */
 static void tx_work_handler(struct work_struct *work)
 {
@@ -2137,11 +2161,17 @@ static void tx_work_handler(struct work_struct *work)
                                               struct tx_work, work);
        struct sock *sk = tx_work->sk;
        struct tls_context *tls_ctx = tls_get_ctx(sk);
-       struct tls_sw_context_tx *ctx = tls_sw_ctx_tx(tls_ctx);
+       struct tls_sw_context_tx *ctx;
 
-       if (!test_and_clear_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask))
+       if (unlikely(!tls_ctx))
                return;
 
+       ctx = tls_sw_ctx_tx(tls_ctx);
+       if (test_bit(BIT_TX_CLOSING, &ctx->tx_bitmask))
+               return;
+
+       if (!test_and_clear_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask))
+               return;
        lock_sock(sk);
        tls_tx_records(sk, -1);
        release_sock(sk);
@@ -2160,6 +2190,18 @@ void tls_sw_write_space(struct sock *sk, struct tls_context *ctx)
        }
 }
 
+void tls_sw_strparser_arm(struct sock *sk, struct tls_context *tls_ctx)
+{
+       struct tls_sw_context_rx *rx_ctx = tls_sw_ctx_rx(tls_ctx);
+
+       write_lock_bh(&sk->sk_callback_lock);
+       rx_ctx->saved_data_ready = sk->sk_data_ready;
+       sk->sk_data_ready = tls_data_ready;
+       write_unlock_bh(&sk->sk_callback_lock);
+
+       strp_check_rcv(&rx_ctx->strp);
+}
+
 int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
 {
        struct tls_context *tls_ctx = tls_get_ctx(sk);
@@ -2357,13 +2399,6 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
                cb.parse_msg = tls_read_size;
 
                strp_init(&sw_ctx_rx->strp, sk, &cb);
-
-               write_lock_bh(&sk->sk_callback_lock);
-               sw_ctx_rx->saved_data_ready = sk->sk_data_ready;
-               sk->sk_data_ready = tls_data_ready;
-               write_unlock_bh(&sk->sk_callback_lock);
-
-               strp_check_rcv(&sw_ctx_rx->strp);
        }
 
        goto out;
index 73e80b917f129faabc11621706c02781cef0cf89..77c742fa4fb1b9c0968d5cbaa5307c89cce5d120 100644 (file)
@@ -125,11 +125,6 @@ CC_OPTION_CFLAGS = $(filter-out $(GCC_PLUGINS_CFLAGS),$(KBUILD_CFLAGS))
 cc-option = $(call __cc-option, $(CC),\
        $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS),$(1),$(2))
 
-# hostcc-option
-# Usage: cflags-y += $(call hostcc-option,-march=winchip-c6,-march=i586)
-hostcc-option = $(call __cc-option, $(HOSTCC),\
-       $(KBUILD_HOSTCFLAGS) $(HOST_EXTRACFLAGS),$(1),$(2))
-
 # cc-option-yn
 # Usage: flag := $(call cc-option-yn,-march=winchip-c6)
 cc-option-yn = $(call try-run,\
index be38198d98b24f31c277e58163b99b93f83d6eaa..0d434d0afc0bc81262afebdd069a1ccb30da9787 100644 (file)
@@ -63,14 +63,14 @@ ifneq ($(strip $(real-obj-y) $(need-builtin)),)
 builtin-target := $(obj)/built-in.a
 endif
 
-ifdef CONFIG_MODULES
+ifeq ($(CONFIG_MODULES)$(need-modorder),y1)
 modorder-target := $(obj)/modules.order
 endif
 
-# We keep a list of all modules in $(MODVERDIR)
+mod-targets := $(patsubst %.o, %.mod, $(obj-m))
 
 __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
-        $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
+        $(if $(KBUILD_MODULES),$(obj-m) $(mod-targets) $(modorder-target)) \
         $(subdir-ym) $(always)
        @:
 
@@ -87,11 +87,6 @@ ifneq ($(KBUILD_ENABLE_EXTRA_GCC_CHECKS),)
   cmd_checkdoc = $(srctree)/scripts/kernel-doc -none $<
 endif
 
-# Do section mismatch analysis for each module/built-in.a
-ifdef CONFIG_DEBUG_SECTION_MISMATCH
-  cmd_secanalysis = ; scripts/mod/modpost $@
-endif
-
 # Compile C sources (.c)
 # ---------------------------------------------------------------------------
 
@@ -268,7 +263,7 @@ endef
 
 # List module undefined symbols (or empty line if not enabled)
 ifdef CONFIG_TRIM_UNUSED_KSYMS
-cmd_undef_syms = $(NM) $@ | sed -n 's/^  *U //p' | xargs echo
+cmd_undef_syms = $(NM) $< | sed -n 's/^  *U //p' | xargs echo
 else
 cmd_undef_syms = echo
 endif
@@ -278,13 +273,15 @@ $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
        $(call cmd,force_checksrc)
        $(call if_changed_rule,cc_o_c)
 
-# Single-part modules are special since we need to mark them in $(MODVERDIR)
+cmd_mod = { \
+       echo $(if $($*-objs)$($*-y)$($*-m), $(addprefix $(obj)/, $($*-objs) $($*-y) $($*-m)), $(@:.mod=.o)); \
+       $(cmd_undef_syms); \
+       } > $@
 
-$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
-       $(call cmd,force_checksrc)
-       $(call if_changed_rule,cc_o_c)
-       @{ echo $(@:.o=.ko); echo $@; \
-          $(cmd_undef_syms); } > $(MODVERDIR)/$(@F:.o=.mod)
+$(obj)/%.mod: $(obj)/%.o FORCE
+       $(call if_changed,mod)
+
+targets += $(mod-targets)
 
 quiet_cmd_cc_lst_c = MKLST   $@
       cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \
@@ -294,7 +291,7 @@ quiet_cmd_cc_lst_c = MKLST   $@
 $(obj)/%.lst: $(src)/%.c FORCE
        $(call if_changed_dep,cc_lst_c)
 
-# header test (header-test-y target)
+# header test (header-test-y, header-test-m target)
 # ---------------------------------------------------------------------------
 
 quiet_cmd_cc_s_h = CC      $@
@@ -423,13 +420,10 @@ endif # builtin-target
 #
 # Create commands to either record .ko file or cat modules.order from
 # a subdirectory
-modorder-cmds =                                                \
-       $(foreach m, $(modorder),                       \
-               $(if $(filter %/modules.order, $m),     \
-                       cat $m;, echo kernel/$m;))
-
 $(modorder-target): $(subdir-ym) FORCE
-       $(Q)(cat /dev/null; $(modorder-cmds)) > $@
+       $(Q){ $(foreach m, $(modorder), \
+       $(if $(filter %/modules.order, $m), cat $m, echo $m);) :; } \
+       | $(AWK) '!x[$$0]++' - > $@
 
 #
 # Rule to compile a set of .o files into one .a file (with symbol table)
@@ -464,12 +458,10 @@ endif
 # module is turned into a multi object module, $^ will contain header file
 # dependencies recorded in the .*.cmd file.
 quiet_cmd_link_multi-m = LD [M]  $@
-cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(filter %.o,$^) $(cmd_secanalysis)
+      cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(filter %.o,$^)
 
 $(multi-used-m): FORCE
        $(call if_changed,link_multi-m)
-       @{ echo $(@:.o=.ko); echo $(filter %.o,$^); \
-          $(cmd_undef_syms); } > $(MODVERDIR)/$(@F:.o=.mod)
 $(call multi_depend, $(multi-used-m), .o, -objs -y -m)
 
 targets += $(multi-used-m)
index 6cb3aa5cbc795438f25168d42e418f761dd6174b..5241d0751eb0d4b0c78ae3e3427ed4ffc7c9821c 100644 (file)
@@ -78,7 +78,7 @@ header-test-y += $(filter-out $(header-test-), \
                $(wildcard $(addprefix $(srctree)/$(src)/, \
                $(header-test-pattern-y)))))
 
-extra-$(CONFIG_HEADER_TEST) += $(addsuffix .s, $(header-test-y))
+extra-$(CONFIG_HEADER_TEST) += $(addsuffix .s, $(header-test-y) $(header-test-m))
 
 # Add subdir path
 
index 50a9990760f30ad14b3817a4d48ac72353ad9b62..7d4711b886568c61b860718abfd22789ee505dc2 100644 (file)
@@ -40,7 +40,7 @@ __modbuiltin: $(modbuiltin-target) $(subdir-ym)
        @:
 
 $(modbuiltin-target): $(subdir-ym) FORCE
-       $(Q)(for m in $(modbuiltin-mods); do echo kernel/$$m; done;     \
+       $(Q)(for m in $(modbuiltin-mods); do echo $$m; done;    \
        cat /dev/null $(modbuiltin-subdirs)) > $@
 
 PHONY += FORCE
index 0dae402661f3b4e924606eb6ff754b15c93784fc..5a4579e76485c111daef39b7731fff1ff24529e6 100644 (file)
@@ -8,10 +8,7 @@ __modinst:
 
 include scripts/Kbuild.include
 
-#
-
-__modules := $(sort $(shell grep -h '\.ko$$' /dev/null $(wildcard $(MODVERDIR)/*.mod)))
-modules := $(patsubst %.o,%.ko,$(wildcard $(__modules:.ko=.o)))
+modules := $(sort $(shell cat $(if $(KBUILD_EXTMOD),$(KBUILD_EXTMOD)/)modules.order))
 
 PHONY += $(modules)
 __modinst: $(modules)
index fec6ec2ffa47dcc3d3b82c82921434bee087dfd6..6b19c1a4eae530e1b00c305575d27173677dada4 100644 (file)
@@ -6,11 +6,12 @@
 # Stage one of module building created the following:
 # a) The individual .o files used for the module
 # b) A <module>.o file which is the .o files above linked together
-# c) A <module>.mod file in $(MODVERDIR)/, listing the name of the
-#    the preliminary <module>.o file, plus all .o files
+# c) A <module>.mod file, listing the name of the preliminary <module>.o file,
+#    plus all .o files
+# d) modules.order, which lists all the modules
 
 # Stage 2 is handled by this file and does the following
-# 1) Find all modules from the files listed in $(MODVERDIR)/
+# 1) Find all modules listed in modules.order
 # 2) modpost is then used to
 # 3)  create one <module>.mod.c file pr. module
 # 4)  create one Module.symvers file with CRC for all exported symbols
@@ -60,10 +61,12 @@ include scripts/Makefile.lib
 kernelsymfile := $(objtree)/Module.symvers
 modulesymfile := $(firstword $(KBUILD_EXTMOD))/Module.symvers
 
-# Step 1), find all modules listed in $(MODVERDIR)/
-MODLISTCMD := find $(MODVERDIR) -name '*.mod' | xargs -r grep -h '\.ko$$' | sort -u
-__modules := $(shell $(MODLISTCMD))
-modules   := $(patsubst %.o,%.ko, $(wildcard $(__modules:.ko=.o)))
+modorder := $(if $(KBUILD_EXTMOD),$(KBUILD_EXTMOD)/)modules.order
+
+# Step 1), find all modules listed in modules.order
+ifdef CONFIG_MODULES
+modules := $(sort $(shell cat $(modorder)))
+endif
 
 # Stop after building .o files if NOFINAL is set. Makes compile tests quicker
 _modpost: $(if $(KBUILD_MODPOST_NOFINAL), $(modules:.ko:.o),$(modules))
@@ -84,7 +87,7 @@ MODPOST_OPT=$(subst -i,-n,$(filter -i,$(MAKEFLAGS)))
 
 # We can go over command line length here, so be careful.
 quiet_cmd_modpost = MODPOST $(words $(filter-out vmlinux FORCE, $^)) modules
-      cmd_modpost = $(MODLISTCMD) | sed 's/\.ko$$/.o/' | $(modpost) $(MODPOST_OPT) -s -T -
+      cmd_modpost = sed 's/ko$$/o/' $(modorder) | $(modpost) $(MODPOST_OPT) -s -T -
 
 PHONY += __modpost
 __modpost: $(modules:.ko=.o) FORCE
index da56aa78d245da2835d7714d6bb81e15cb1cf3f4..d7325cefe709d34960515b2ff1ad3a76e7f48e44 100644 (file)
@@ -8,8 +8,7 @@ __modsign:
 
 include scripts/Kbuild.include
 
-__modules := $(sort $(shell grep -h '\.ko$$' /dev/null $(wildcard $(MODVERDIR)/*.mod)))
-modules := $(patsubst %.o,%.ko,$(wildcard $(__modules:.ko=.o)))
+modules := $(sort $(shell cat modules.order))
 
 PHONY += $(modules)
 __modsign: $(modules)
index aab4e299d7a2b1ae84afbd92603c2b7ba6241f6c..a904bf1f5e67e7e1d7197e5e16c970bf0f211d53 100755 (executable)
@@ -8,8 +8,7 @@
 #
 
 # Create/update the include/generated/autoksyms.h file from the list
-# of all module's needed symbols as recorded on the third line of
-# .tmp_versions/*.mod files.
+# of all module's needed symbols as recorded on the second line of *.mod files.
 #
 # For each symbol being added or removed, the corresponding dependency
 # file's timestamp is updated to force a rebuild of the affected source
@@ -47,13 +46,10 @@ cat > "$new_ksyms_file" << EOT
  */
 
 EOT
-[ "$(ls -A "$MODVERDIR")" ] &&
-for mod in "$MODVERDIR"/*.mod; do
-       sed -n -e '3{s/ /\n/g;/^$/!p;}' "$mod"
-done | sort -u |
-while read sym; do
-       echo "#define __KSYM_${sym} 1"
-done >> "$new_ksyms_file"
+sed 's/ko$/mod/' modules.order |
+xargs -n1 sed -n -e '2{s/ /\n/g;/^$/!p;}' -- |
+sort -u |
+sed -e 's/\(.*\)/#define __KSYM_\1 1/' >> "$new_ksyms_file"
 
 # Special case for modversions (see modpost.c)
 if [ -n "$CONFIG_MODVERSIONS" ]; then
diff --git a/scripts/coccinelle/api/devm_platform_ioremap_resource.cocci b/scripts/coccinelle/api/devm_platform_ioremap_resource.cocci
new file mode 100644 (file)
index 0000000..56a2e26
--- /dev/null
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: GPL-2.0
+/// Use devm_platform_ioremap_resource helper which wraps
+/// platform_get_resource() and devm_ioremap_resource() together.
+///
+// Confidence: High
+// Copyright: (C) 2019 Himanshu Jha GPLv2.
+// Copyright: (C) 2019 Julia Lawall, Inria/LIP6. GPLv2.
+// Keywords: platform_get_resource, devm_ioremap_resource,
+// Keywords: devm_platform_ioremap_resource
+
+virtual patch
+virtual report
+
+@r depends on patch && !report@
+expression e1, e2, arg1, arg2, arg3;
+identifier id;
+@@
+
+(
+- id = platform_get_resource(arg1, IORESOURCE_MEM, arg2);
+|
+- struct resource *id = platform_get_resource(arg1, IORESOURCE_MEM, arg2);
+)
+  ... when != id
+- e1 = devm_ioremap_resource(arg3, id);
++ e1 = devm_platform_ioremap_resource(arg1, arg2);
+  ... when != id
+? id = e2
+
+@r1 depends on patch && !report@
+identifier r.id;
+type T;
+@@
+
+- T *id;
+  ...when != id
+
+@r2 depends on report && !patch@
+identifier id;
+expression e1, e2, arg1, arg2, arg3;
+position j0;
+@@
+
+(
+  id = platform_get_resource(arg1, IORESOURCE_MEM, arg2);
+|
+  struct resource *id = platform_get_resource(arg1, IORESOURCE_MEM, arg2);
+)
+  ... when != id
+  e1@j0 = devm_ioremap_resource(arg3, id);
+  ... when != id
+? id = e2
+
+@script:python depends on report && !patch@
+e1 << r2.e1;
+j0 << r2.j0;
+@@
+
+msg = "WARNING: Use devm_platform_ioremap_resource for %s" % (e1)
+coccilib.report.print_report(j0[0], msg)
index 0f604f62f067e95660a51f0cb1cd37e6a911d1b8..7d3030d03a25272b63d37d820aa1ba07b94d94f9 100755 (executable)
@@ -52,13 +52,12 @@ sub usage {
 
 sub collectcfiles {
     my @file;
-    while (<.tmp_versions/*.mod>) {
-       open my $fh, '<', $_ or die "cannot open $_: $!\n";
-       push (@file,
-             grep s/\.ko/.mod.c/,      # change the suffix
-             grep m/.+\.ko/,           # find the .ko path
-             <$fh>);                   # lines in opened file
+    open my $fh, '< modules.order' or die "cannot open modules.order: $!\n";
+    while (<$fh>) {
+       s/\.ko$/.mod.c/;
+       push (@file, $_)
     }
+    close($fh);
     chomp @file;
     return @file;
 }
index ab30fe724c43c2b1e6e76433ace8466addc4a392..7656e1137b6be59b0e0e93a95e8565c45ef59da9 100644 (file)
@@ -94,7 +94,7 @@ configfiles=$(wildcard $(srctree)/kernel/configs/$@ $(srctree)/arch/$(SRCARCH)/c
 %.config: $(obj)/conf
        $(if $(call configfiles),, $(error No configuration exists for this target on this architecture))
        $(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m .config $(configfiles)
-       +$(Q)yes "" | $(MAKE) -f $(srctree)/Makefile oldconfig
+       $(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig
 
 PHONY += kvmconfig
 kvmconfig: kvm_guest.config
index 501fdcc5e999eb2dada576d10ed70eada7380588..1134892599da98c84be4e69f358363609f940fab 100644 (file)
@@ -895,7 +895,8 @@ int conf_write(const char *name)
                                     "# %s\n"
                                     "#\n", str);
                        need_newline = false;
-               } else if (!(sym->flags & SYMBOL_CHOICE)) {
+               } else if (!(sym->flags & SYMBOL_CHOICE) &&
+                          !(sym->flags & SYMBOL_WRITTEN)) {
                        sym_calc_value(sym);
                        if (!(sym->flags & SYMBOL_WRITE))
                                goto next;
@@ -903,7 +904,7 @@ int conf_write(const char *name)
                                fprintf(out, "\n");
                                need_newline = false;
                        }
-                       sym->flags &= ~SYMBOL_WRITE;
+                       sym->flags |= SYMBOL_WRITTEN;
                        conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
                }
 
@@ -1063,8 +1064,6 @@ int conf_write_autoconf(int overwrite)
        if (!overwrite && is_present(autoconf_name))
                return 0;
 
-       sym_clear_all_valid();
-
        conf_write_dep("include/config/auto.conf.cmd");
 
        if (conf_touch_deps())
index 8dde65bc3165b7d5c38ff92a2a9e18df8abeb469..017843c9a4f42c81b234c8c25838ca514053047d 100644 (file)
@@ -141,6 +141,7 @@ struct symbol {
 #define SYMBOL_OPTIONAL   0x0100  /* choice is optional - values can be 'n' */
 #define SYMBOL_WRITE      0x0200  /* write symbol to file (KCONFIG_CONFIG) */
 #define SYMBOL_CHANGED    0x0400  /* ? */
+#define SYMBOL_WRITTEN    0x0800  /* track info to avoid double-write to .config */
 #define SYMBOL_NO_WRITE   0x1000  /* Symbol for internal use only; it will not be written */
 #define SYMBOL_CHECKED    0x2000  /* used during dependency checking */
 #define SYMBOL_WARNED     0x8000  /* warning has been issued */
index 0f6dcb4011a8566dae009d31a6e7614227994a0b..63062024ce0eba4ebaa94bf5f4b2bcb3c2bf6dd1 100644 (file)
@@ -396,34 +396,19 @@ void get_src_version(const char *modname, char sum[], unsigned sumlen)
        unsigned long len;
        struct md4_ctx md;
        char *sources, *end, *fname;
-       const char *basename;
        char filelist[PATH_MAX + 1];
-       char *modverdir = getenv("MODVERDIR");
 
-       if (!modverdir)
-               modverdir = ".";
-
-       /* Source files for module are in .tmp_versions/modname.mod,
-          after the first line. */
-       if (strrchr(modname, '/'))
-               basename = strrchr(modname, '/') + 1;
-       else
-               basename = modname;
-       snprintf(filelist, sizeof(filelist), "%s/%.*s.mod", modverdir,
-               (int) strlen(basename) - 2, basename);
+       /* objects for a module are listed in the first line of *.mod file. */
+       snprintf(filelist, sizeof(filelist), "%.*smod",
+                (int)strlen(modname) - 1, modname);
 
        file = grab_file(filelist, &len);
        if (!file)
                /* not a module or .mod file missing - ignore */
                return;
 
-       sources = strchr(file, '\n');
-       if (!sources) {
-               warn("malformed versions file for %s\n", modname);
-               goto release;
-       }
+       sources = file;
 
-       sources++;
        end = strchr(sources, '\n');
        if (!end) {
                warn("bad ending versions file for %s\n", modname);
index 39e8cb36ba19c4a919eff479f86b18ca44a16053..f51f446707b82de9462d4a1c47949ecd5468a7d9 100755 (executable)
@@ -9,7 +9,7 @@ check_same_name_modules()
        for m in $(sed 's:.*/::' modules.order | sort | uniq -d)
        do
                echo "warning: same module names found:" >&2
-               sed -n "/\/$m/s:^kernel/:  :p" modules.order >&2
+               sed -n "/\/$m/s:^:  :p" modules.order >&2
        done
 }
 
index e8ca6dc97e963e207017773b6a939b26319e5521..c4c580f547ef52cda43dbb8f92fce96144dbc81e 100755 (executable)
@@ -132,6 +132,11 @@ fi
 if [ "$ARCH" != "um" ]; then
        $MAKE -f $srctree/Makefile headers
        $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr"
+       # move asm headers to /usr/include/<libc-machine>/asm to match the structure
+       # used by Debian-based distros (to support multi-arch)
+       host_arch=$(dpkg-architecture -a$(cat debian/arch) -qDEB_HOST_MULTIARCH)
+       mkdir $libc_headers_dir/usr/include/$host_arch
+       mv $libc_headers_dir/usr/include/asm $libc_headers_dir/usr/include/$host_arch/
 fi
 
 # Install the maintainer scripts
index 8351584cb24e61f3f3c3250b8b94c9b10a223b5f..e0750b70453f2e19e14175b176dc3cb7110844c1 100755 (executable)
@@ -197,6 +197,7 @@ Architecture: $debarch
 Description: Linux support headers for userspace development
  This package provides userspaces headers from the Linux kernel.  These headers
  are used by the installed headers for GNU glibc and other system libraries.
+Multi-Arch: same
 
 Package: $dbg_packagename
 Section: debug
index 2d29df4a0a53c09acdfa7fbe5f7f66bf0bc5f291..8640c278f1aa3a50866e0dd7f29edd8f25108335 100755 (executable)
@@ -29,7 +29,7 @@ fi
 
 PROVIDES="$PROVIDES kernel-$KERNELRELEASE"
 __KERNELRELEASE=$(echo $KERNELRELEASE | sed -e "s/-/_/g")
-EXCLUDES="$RCS_TAR_IGNORE --exclude=.tmp_versions --exclude=*vmlinux* \
+EXCLUDES="$RCS_TAR_IGNORE --exclude=*vmlinux* --exclude=*.mod \
 --exclude=*.o --exclude=*.ko --exclude=*.cmd --exclude=Documentation \
 --exclude=.config.old --exclude=.missing-syscalls.d --exclude=*.s"
 
index 467224feb43b0fa56b5720aa0ff693ad42ce6b32..d821107f55f90ff5c823d4ff1c19432268132a84 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
 /* Copyright (c) 2018 Facebook */
 
+#include <endian.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -419,9 +420,9 @@ done:
 
 static bool btf_check_endianness(const GElf_Ehdr *ehdr)
 {
-#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+#if __BYTE_ORDER == __LITTLE_ENDIAN
        return ehdr->e_ident[EI_DATA] == ELFDATA2LSB;
-#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+#elif __BYTE_ORDER == __BIG_ENDIAN
        return ehdr->e_ident[EI_DATA] == ELFDATA2MSB;
 #else
 # error "Unrecognized __BYTE_ORDER__"
index 794dd5064ae8a01d9628c3baade0605a24fa4f44..2586b6cb8f34f2ce30e382f3ddd60687f9971ecc 100644 (file)
@@ -20,6 +20,7 @@
 #include <inttypes.h>
 #include <string.h>
 #include <unistd.h>
+#include <endian.h>
 #include <fcntl.h>
 #include <errno.h>
 #include <asm/unistd.h>
@@ -612,10 +613,10 @@ errout:
 
 static int bpf_object__check_endianness(struct bpf_object *obj)
 {
-#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+#if __BYTE_ORDER == __LITTLE_ENDIAN
        if (obj->efile.ehdr.e_ident[EI_DATA] == ELFDATA2LSB)
                return 0;
-#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+#elif __BYTE_ORDER == __BIG_ENDIAN
        if (obj->efile.ehdr.e_ident[EI_DATA] == ELFDATA2MSB)
                return 0;
 #else
@@ -1377,8 +1378,13 @@ static void bpf_object__sanitize_btf(struct bpf_object *obj)
                if (!has_datasec && kind == BTF_KIND_VAR) {
                        /* replace VAR with INT */
                        t->info = BTF_INFO_ENC(BTF_KIND_INT, 0, 0);
-                       t->size = sizeof(int);
-                       *(int *)(t+1) = BTF_INT_ENC(0, 0, 32);
+                       /*
+                        * using size = 1 is the safest choice, 4 will be too
+                        * big and cause kernel BTF validation failure if
+                        * original variable took less than 4 bytes
+                        */
+                       t->size = 1;
+                       *(int *)(t+1) = BTF_INT_ENC(0, 0, 8);
                } else if (!has_datasec && kind == BTF_KIND_DATASEC) {
                        /* replace DATASEC with STRUCT */
                        struct btf_var_secinfo *v = (void *)(t + 1);
@@ -1500,6 +1506,12 @@ static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj)
                           BTF_ELF_SEC, err);
                btf__free(obj->btf);
                obj->btf = NULL;
+               /* btf_ext can't exist without btf, so free it as well */
+               if (obj->btf_ext) {
+                       btf_ext__free(obj->btf_ext);
+                       obj->btf_ext = NULL;
+               }
+
                if (bpf_object__is_btf_mandatory(obj))
                        return err;
        }
@@ -4507,13 +4519,13 @@ struct perf_buffer *perf_buffer__new(int map_fd, size_t page_cnt,
                                     const struct perf_buffer_opts *opts)
 {
        struct perf_buffer_params p = {};
-       struct perf_event_attr attr = {
-               .config = PERF_COUNT_SW_BPF_OUTPUT,
-               .type = PERF_TYPE_SOFTWARE,
-               .sample_type = PERF_SAMPLE_RAW,
-               .sample_period = 1,
-               .wakeup_events = 1,
-       };
+       struct perf_event_attr attr = { 0, };
+
+       attr.config = PERF_COUNT_SW_BPF_OUTPUT,
+       attr.type = PERF_TYPE_SOFTWARE;
+       attr.sample_type = PERF_SAMPLE_RAW;
+       attr.sample_period = 1;
+       attr.wakeup_events = 1;
 
        p.attr = &attr;
        p.sample_cb = opts ? opts->sample_cb : NULL;
index 5007b5d4fd2c51186a554fb03893dcabd7bef381..680e63066cf39c7f3bd06cdf645b05065060728e 100644 (file)
@@ -317,17 +317,16 @@ static int xsk_load_xdp_prog(struct xsk_socket *xsk)
 
 static int xsk_get_max_queues(struct xsk_socket *xsk)
 {
-       struct ethtool_channels channels;
-       struct ifreq ifr;
+       struct ethtool_channels channels = { .cmd = ETHTOOL_GCHANNELS };
+       struct ifreq ifr = {};
        int fd, err, ret;
 
        fd = socket(AF_INET, SOCK_DGRAM, 0);
        if (fd < 0)
                return -errno;
 
-       channels.cmd = ETHTOOL_GCHANNELS;
        ifr.ifr_data = (void *)&channels;
-       strncpy(ifr.ifr_name, xsk->ifname, IFNAMSIZ - 1);
+       memcpy(ifr.ifr_name, xsk->ifname, IFNAMSIZ - 1);
        ifr.ifr_name[IFNAMSIZ - 1] = '\0';
        err = ioctl(fd, SIOCETHTOOL, &ifr);
        if (err && errno != EOPNOTSUPP) {
@@ -335,7 +334,7 @@ static int xsk_get_max_queues(struct xsk_socket *xsk)
                goto out;
        }
 
-       if (channels.max_combined == 0 || errno == EOPNOTSUPP)
+       if (err || channels.max_combined == 0)
                /* If the device says it has no channels, then all traffic
                 * is sent to a single stream, so max queues = 1.
                 */
@@ -517,7 +516,7 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname,
                err = -errno;
                goto out_socket;
        }
-       strncpy(xsk->ifname, ifname, IFNAMSIZ - 1);
+       memcpy(xsk->ifname, ifname, IFNAMSIZ - 1);
        xsk->ifname[IFNAMSIZ - 1] = '\0';
 
        err = xsk_set_xdp_socket_config(&xsk->config, usr_config);
index 580e344db3dde6375845e183325b6b0ae0b6c505..ced3765c4f4445daf3d1d8db2851af6955978ca5 100644 (file)
 #include "elf.h"
 #include "cfi.h"
 
-#define INSN_JUMP_CONDITIONAL  1
-#define INSN_JUMP_UNCONDITIONAL        2
-#define INSN_JUMP_DYNAMIC      3
-#define INSN_CALL              4
-#define INSN_CALL_DYNAMIC      5
-#define INSN_RETURN            6
-#define INSN_CONTEXT_SWITCH    7
-#define INSN_STACK             8
-#define INSN_BUG               9
-#define INSN_NOP               10
-#define INSN_STAC              11
-#define INSN_CLAC              12
-#define INSN_STD               13
-#define INSN_CLD               14
-#define INSN_OTHER             15
-#define INSN_LAST              INSN_OTHER
+enum insn_type {
+       INSN_JUMP_CONDITIONAL,
+       INSN_JUMP_UNCONDITIONAL,
+       INSN_JUMP_DYNAMIC,
+       INSN_JUMP_DYNAMIC_CONDITIONAL,
+       INSN_CALL,
+       INSN_CALL_DYNAMIC,
+       INSN_RETURN,
+       INSN_CONTEXT_SWITCH,
+       INSN_STACK,
+       INSN_BUG,
+       INSN_NOP,
+       INSN_STAC,
+       INSN_CLAC,
+       INSN_STD,
+       INSN_CLD,
+       INSN_OTHER,
+};
 
 enum op_dest_type {
        OP_DEST_REG,
@@ -68,7 +70,7 @@ void arch_initial_func_cfi_state(struct cfi_state *state);
 
 int arch_decode_instruction(struct elf *elf, struct section *sec,
                            unsigned long offset, unsigned int maxlen,
-                           unsigned int *len, unsigned char *type,
+                           unsigned int *len, enum insn_type *type,
                            unsigned long *immediate, struct stack_op *op);
 
 bool arch_callee_saved_reg(unsigned char reg);
index 584568f27a83bb75e9895f5275e8bcb483ebf70d..0567c47a91b1024c5171460f30c8100852837f0d 100644 (file)
@@ -68,7 +68,7 @@ bool arch_callee_saved_reg(unsigned char reg)
 
 int arch_decode_instruction(struct elf *elf, struct section *sec,
                            unsigned long offset, unsigned int maxlen,
-                           unsigned int *len, unsigned char *type,
+                           unsigned int *len, enum insn_type *type,
                            unsigned long *immediate, struct stack_op *op)
 {
        struct insn insn;
index 172f991957269f8f1b3c0328d1d6af4098dad901..5f26620f13f56fdb2aec4668e0495a569f0bd049 100644 (file)
@@ -18,6 +18,8 @@
 
 #define FAKE_JUMP_OFFSET -1
 
+#define C_JUMP_TABLE_SECTION ".rodata..c_jump_table"
+
 struct alternative {
        struct list_head list;
        struct instruction *insn;
@@ -95,6 +97,20 @@ static struct instruction *next_insn_same_func(struct objtool_file *file,
        for (insn = next_insn_same_sec(file, insn); insn;               \
             insn = next_insn_same_sec(file, insn))
 
+static bool is_sibling_call(struct instruction *insn)
+{
+       /* An indirect jump is either a sibling call or a jump to a table. */
+       if (insn->type == INSN_JUMP_DYNAMIC)
+               return list_empty(&insn->alts);
+
+       if (insn->type != INSN_JUMP_CONDITIONAL &&
+           insn->type != INSN_JUMP_UNCONDITIONAL)
+               return false;
+
+       /* add_jump_destinations() sets insn->call_dest for sibling calls. */
+       return !!insn->call_dest;
+}
+
 /*
  * This checks to see if the given function is a "noreturn" function.
  *
@@ -103,14 +119,9 @@ static struct instruction *next_insn_same_func(struct objtool_file *file,
  *
  * For local functions, we have to detect them manually by simply looking for
  * the lack of a return instruction.
- *
- * Returns:
- *  -1: error
- *   0: no dead end
- *   1: dead end
  */
-static int __dead_end_function(struct objtool_file *file, struct symbol *func,
-                              int recursion)
+static bool __dead_end_function(struct objtool_file *file, struct symbol *func,
+                               int recursion)
 {
        int i;
        struct instruction *insn;
@@ -136,30 +147,33 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func,
                "rewind_stack_do_exit",
        };
 
+       if (!func)
+               return false;
+
        if (func->bind == STB_WEAK)
-               return 0;
+               return false;
 
        if (func->bind == STB_GLOBAL)
                for (i = 0; i < ARRAY_SIZE(global_noreturns); i++)
                        if (!strcmp(func->name, global_noreturns[i]))
-                               return 1;
+                               return true;
 
        if (!func->len)
-               return 0;
+               return false;
 
        insn = find_insn(file, func->sec, func->offset);
        if (!insn->func)
-               return 0;
+               return false;
 
        func_for_each_insn_all(file, func, insn) {
                empty = false;
 
                if (insn->type == INSN_RETURN)
-                       return 0;
+                       return false;
        }
 
        if (empty)
-               return 0;
+               return false;
 
        /*
         * A function can have a sibling call instead of a return.  In that
@@ -167,40 +181,31 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func,
         * of the sibling call returns.
         */
        func_for_each_insn_all(file, func, insn) {
-               if (insn->type == INSN_JUMP_UNCONDITIONAL) {
+               if (is_sibling_call(insn)) {
                        struct instruction *dest = insn->jump_dest;
 
                        if (!dest)
                                /* sibling call to another file */
-                               return 0;
-
-                       if (dest->func && dest->func->pfunc != insn->func->pfunc) {
+                               return false;
 
-                               /* local sibling call */
-                               if (recursion == 5) {
-                                       /*
-                                        * Infinite recursion: two functions
-                                        * have sibling calls to each other.
-                                        * This is a very rare case.  It means
-                                        * they aren't dead ends.
-                                        */
-                                       return 0;
-                               }
-
-                               return __dead_end_function(file, dest->func,
-                                                          recursion + 1);
+                       /* local sibling call */
+                       if (recursion == 5) {
+                               /*
+                                * Infinite recursion: two functions have
+                                * sibling calls to each other.  This is a very
+                                * rare case.  It means they aren't dead ends.
+                                */
+                               return false;
                        }
-               }
 
-               if (insn->type == INSN_JUMP_DYNAMIC && list_empty(&insn->alts))
-                       /* sibling call */
-                       return 0;
+                       return __dead_end_function(file, dest->func, recursion+1);
+               }
        }
 
-       return 1;
+       return true;
 }
 
-static int dead_end_function(struct objtool_file *file, struct symbol *func)
+static bool dead_end_function(struct objtool_file *file, struct symbol *func)
 {
        return __dead_end_function(file, func, 0);
 }
@@ -262,19 +267,12 @@ static int decode_instructions(struct objtool_file *file)
                        if (ret)
                                goto err;
 
-                       if (!insn->type || insn->type > INSN_LAST) {
-                               WARN_FUNC("invalid instruction type %d",
-                                         insn->sec, insn->offset, insn->type);
-                               ret = -1;
-                               goto err;
-                       }
-
                        hash_add(file->insn_hash, &insn->hash, insn->offset);
                        list_add_tail(&insn->list, &file->insn_list);
                }
 
                list_for_each_entry(func, &sec->symbol_list, list) {
-                       if (func->type != STT_FUNC)
+                       if (func->type != STT_FUNC || func->alias != func)
                                continue;
 
                        if (!find_insn(file, sec, func->offset)) {
@@ -284,8 +282,7 @@ static int decode_instructions(struct objtool_file *file)
                        }
 
                        func_for_each_insn(file, func, insn)
-                               if (!insn->func)
-                                       insn->func = func;
+                               insn->func = func;
                }
        }
 
@@ -488,6 +485,7 @@ static const char *uaccess_safe_builtin[] = {
        /* misc */
        "csum_partial_copy_generic",
        "__memcpy_mcsafe",
+       "mcsafe_handle_tail",
        "ftrace_likely_update", /* CONFIG_TRACE_BRANCH_PROFILING */
        NULL
 };
@@ -505,7 +503,7 @@ static void add_uaccess_safe(struct objtool_file *file)
                if (!func)
                        continue;
 
-               func->alias->uaccess_safe = true;
+               func->uaccess_safe = true;
        }
 }
 
@@ -577,13 +575,16 @@ static int add_jump_destinations(struct objtool_file *file)
                         * Retpoline jumps are really dynamic jumps in
                         * disguise, so convert them accordingly.
                         */
-                       insn->type = INSN_JUMP_DYNAMIC;
+                       if (insn->type == INSN_JUMP_UNCONDITIONAL)
+                               insn->type = INSN_JUMP_DYNAMIC;
+                       else
+                               insn->type = INSN_JUMP_DYNAMIC_CONDITIONAL;
+
                        insn->retpoline_safe = true;
                        continue;
                } else {
-                       /* sibling call */
+                       /* external sibling call */
                        insn->call_dest = rela->sym;
-                       insn->jump_dest = NULL;
                        continue;
                }
 
@@ -623,7 +624,7 @@ static int add_jump_destinations(struct objtool_file *file)
                         * However this code can't completely replace the
                         * read_symbols() code because this doesn't detect the
                         * case where the parent function's only reference to a
-                        * subfunction is through a switch table.
+                        * subfunction is through a jump table.
                         */
                        if (!strstr(insn->func->name, ".cold.") &&
                            strstr(insn->jump_dest->func->name, ".cold.")) {
@@ -633,9 +634,8 @@ static int add_jump_destinations(struct objtool_file *file)
                        } else if (insn->jump_dest->func->pfunc != insn->func->pfunc &&
                                   insn->jump_dest->offset == insn->jump_dest->func->offset) {
 
-                               /* sibling class */
+                               /* internal sibling call */
                                insn->call_dest = insn->jump_dest->func;
-                               insn->jump_dest = NULL;
                        }
                }
        }
@@ -896,20 +896,26 @@ out:
        return ret;
 }
 
-static int add_switch_table(struct objtool_file *file, struct instruction *insn,
-                           struct rela *table, struct rela *next_table)
+static int add_jump_table(struct objtool_file *file, struct instruction *insn,
+                           struct rela *table)
 {
        struct rela *rela = table;
-       struct instruction *alt_insn;
+       struct instruction *dest_insn;
        struct alternative *alt;
        struct symbol *pfunc = insn->func->pfunc;
        unsigned int prev_offset = 0;
 
-       list_for_each_entry_from(rela, &table->rela_sec->rela_list, list) {
-               if (rela == next_table)
+       /*
+        * Each @rela is a switch table relocation which points to the target
+        * instruction.
+        */
+       list_for_each_entry_from(rela, &table->sec->rela_list, list) {
+
+               /* Check for the end of the table: */
+               if (rela != table && rela->jump_table_start)
                        break;
 
-               /* Make sure the switch table entries are consecutive: */
+               /* Make sure the table entries are consecutive: */
                if (prev_offset && rela->offset != prev_offset + 8)
                        break;
 
@@ -918,12 +924,12 @@ static int add_switch_table(struct objtool_file *file, struct instruction *insn,
                    rela->addend == pfunc->offset)
                        break;
 
-               alt_insn = find_insn(file, rela->sym->sec, rela->addend);
-               if (!alt_insn)
+               dest_insn = find_insn(file, rela->sym->sec, rela->addend);
+               if (!dest_insn)
                        break;
 
-               /* Make sure the jmp dest is in the function or subfunction: */
-               if (alt_insn->func->pfunc != pfunc)
+               /* Make sure the destination is in the same function: */
+               if (!dest_insn->func || dest_insn->func->pfunc != pfunc)
                        break;
 
                alt = malloc(sizeof(*alt));
@@ -932,7 +938,7 @@ static int add_switch_table(struct objtool_file *file, struct instruction *insn,
                        return -1;
                }
 
-               alt->insn = alt_insn;
+               alt->insn = dest_insn;
                list_add_tail(&alt->list, &insn->alts);
                prev_offset = rela->offset;
        }
@@ -947,7 +953,7 @@ static int add_switch_table(struct objtool_file *file, struct instruction *insn,
 }
 
 /*
- * find_switch_table() - Given a dynamic jump, find the switch jump table in
+ * find_jump_table() - Given a dynamic jump, find the switch jump table in
  * .rodata associated with it.
  *
  * There are 3 basic patterns:
@@ -989,13 +995,13 @@ static int add_switch_table(struct objtool_file *file, struct instruction *insn,
  *
  *    NOTE: RETPOLINE made it harder still to decode dynamic jumps.
  */
-static struct rela *find_switch_table(struct objtool_file *file,
+static struct rela *find_jump_table(struct objtool_file *file,
                                      struct symbol *func,
                                      struct instruction *insn)
 {
-       struct rela *text_rela, *rodata_rela;
+       struct rela *text_rela, *table_rela;
        struct instruction *orig_insn = insn;
-       struct section *rodata_sec;
+       struct section *table_sec;
        unsigned long table_offset;
 
        /*
@@ -1028,42 +1034,52 @@ static struct rela *find_switch_table(struct objtool_file *file,
                        continue;
 
                table_offset = text_rela->addend;
-               rodata_sec = text_rela->sym->sec;
+               table_sec = text_rela->sym->sec;
 
                if (text_rela->type == R_X86_64_PC32)
                        table_offset += 4;
 
                /*
                 * Make sure the .rodata address isn't associated with a
-                * symbol.  gcc jump tables are anonymous data.
+                * symbol.  GCC jump tables are anonymous data.
+                *
+                * Also support C jump tables which are in the same format as
+                * switch jump tables.  For objtool to recognize them, they
+                * need to be placed in the C_JUMP_TABLE_SECTION section.  They
+                * have symbols associated with them.
                 */
-               if (find_symbol_containing(rodata_sec, table_offset))
+               if (find_symbol_containing(table_sec, table_offset) &&
+                   strcmp(table_sec->name, C_JUMP_TABLE_SECTION))
                        continue;
 
-               rodata_rela = find_rela_by_dest(rodata_sec, table_offset);
-               if (rodata_rela) {
-                       /*
-                        * Use of RIP-relative switch jumps is quite rare, and
-                        * indicates a rare GCC quirk/bug which can leave dead
-                        * code behind.
-                        */
-                       if (text_rela->type == R_X86_64_PC32)
-                               file->ignore_unreachables = true;
+               /* Each table entry has a rela associated with it. */
+               table_rela = find_rela_by_dest(table_sec, table_offset);
+               if (!table_rela)
+                       continue;
 
-                       return rodata_rela;
-               }
+               /*
+                * Use of RIP-relative switch jumps is quite rare, and
+                * indicates a rare GCC quirk/bug which can leave dead code
+                * behind.
+                */
+               if (text_rela->type == R_X86_64_PC32)
+                       file->ignore_unreachables = true;
+
+               return table_rela;
        }
 
        return NULL;
 }
 
-
-static int add_func_switch_tables(struct objtool_file *file,
-                                 struct symbol *func)
+/*
+ * First pass: Mark the head of each jump table so that in the next pass,
+ * we know when a given jump table ends and the next one starts.
+ */
+static void mark_func_jump_tables(struct objtool_file *file,
+                                   struct symbol *func)
 {
-       struct instruction *insn, *last = NULL, *prev_jump = NULL;
-       struct rela *rela, *prev_rela = NULL;
-       int ret;
+       struct instruction *insn, *last = NULL;
+       struct rela *rela;
 
        func_for_each_insn_all(file, func, insn) {
                if (!last)
@@ -1071,7 +1087,7 @@ static int add_func_switch_tables(struct objtool_file *file,
 
                /*
                 * Store back-pointers for unconditional forward jumps such
-                * that find_switch_table() can back-track using those and
+                * that find_jump_table() can back-track using those and
                 * avoid some potentially confusing code.
                 */
                if (insn->type == INSN_JUMP_UNCONDITIONAL && insn->jump_dest &&
@@ -1086,27 +1102,25 @@ static int add_func_switch_tables(struct objtool_file *file,
                if (insn->type != INSN_JUMP_DYNAMIC)
                        continue;
 
-               rela = find_switch_table(file, func, insn);
-               if (!rela)
-                       continue;
-
-               /*
-                * We found a switch table, but we don't know yet how big it
-                * is.  Don't add it until we reach the end of the function or
-                * the beginning of another switch table in the same function.
-                */
-               if (prev_jump) {
-                       ret = add_switch_table(file, prev_jump, prev_rela, rela);
-                       if (ret)
-                               return ret;
+               rela = find_jump_table(file, func, insn);
+               if (rela) {
+                       rela->jump_table_start = true;
+                       insn->jump_table = rela;
                }
-
-               prev_jump = insn;
-               prev_rela = rela;
        }
+}
+
+static int add_func_jump_tables(struct objtool_file *file,
+                                 struct symbol *func)
+{
+       struct instruction *insn;
+       int ret;
 
-       if (prev_jump) {
-               ret = add_switch_table(file, prev_jump, prev_rela, NULL);
+       func_for_each_insn_all(file, func, insn) {
+               if (!insn->jump_table)
+                       continue;
+
+               ret = add_jump_table(file, insn, insn->jump_table);
                if (ret)
                        return ret;
        }
@@ -1119,7 +1133,7 @@ static int add_func_switch_tables(struct objtool_file *file,
  * section which contains a list of addresses within the function to jump to.
  * This finds these jump tables and adds them to the insn->alts lists.
  */
-static int add_switch_table_alts(struct objtool_file *file)
+static int add_jump_table_alts(struct objtool_file *file)
 {
        struct section *sec;
        struct symbol *func;
@@ -1133,7 +1147,8 @@ static int add_switch_table_alts(struct objtool_file *file)
                        if (func->type != STT_FUNC)
                                continue;
 
-                       ret = add_func_switch_tables(file, func);
+                       mark_func_jump_tables(file, func);
+                       ret = add_func_jump_tables(file, func);
                        if (ret)
                                return ret;
                }
@@ -1277,13 +1292,18 @@ static void mark_rodata(struct objtool_file *file)
        bool found = false;
 
        /*
-        * This searches for the .rodata section or multiple .rodata.func_name
-        * sections if -fdata-sections is being used. The .str.1.1 and .str.1.8
-        * rodata sections are ignored as they don't contain jump tables.
+        * Search for the following rodata sections, each of which can
+        * potentially contain jump tables:
+        *
+        * - .rodata: can contain GCC switch tables
+        * - .rodata.<func>: same, if -fdata-sections is being used
+        * - .rodata..c_jump_table: contains C annotated jump tables
+        *
+        * .rodata.str1.* sections are ignored; they don't contain jump tables.
         */
        for_each_sec(file, sec) {
-               if (!strncmp(sec->name, ".rodata", 7) &&
-                   !strstr(sec->name, ".str1.")) {
+               if ((!strncmp(sec->name, ".rodata", 7) && !strstr(sec->name, ".str1.")) ||
+                   !strcmp(sec->name, C_JUMP_TABLE_SECTION)) {
                        sec->rodata = true;
                        found = true;
                }
@@ -1325,7 +1345,7 @@ static int decode_sections(struct objtool_file *file)
        if (ret)
                return ret;
 
-       ret = add_switch_table_alts(file);
+       ret = add_jump_table_alts(file);
        if (ret)
                return ret;
 
@@ -1873,12 +1893,12 @@ static bool insn_state_match(struct instruction *insn, struct insn_state *state)
 static inline bool func_uaccess_safe(struct symbol *func)
 {
        if (func)
-               return func->alias->uaccess_safe;
+               return func->uaccess_safe;
 
        return false;
 }
 
-static inline const char *insn_dest_name(struct instruction *insn)
+static inline const char *call_dest_name(struct instruction *insn)
 {
        if (insn->call_dest)
                return insn->call_dest->name;
@@ -1890,13 +1910,13 @@ static int validate_call(struct instruction *insn, struct insn_state *state)
 {
        if (state->uaccess && !func_uaccess_safe(insn->call_dest)) {
                WARN_FUNC("call to %s() with UACCESS enabled",
-                               insn->sec, insn->offset, insn_dest_name(insn));
+                               insn->sec, insn->offset, call_dest_name(insn));
                return 1;
        }
 
        if (state->df) {
                WARN_FUNC("call to %s() with DF set",
-                               insn->sec, insn->offset, insn_dest_name(insn));
+                               insn->sec, insn->offset, call_dest_name(insn));
                return 1;
        }
 
@@ -1920,13 +1940,12 @@ static int validate_sibling_call(struct instruction *insn, struct insn_state *st
  * each instruction and validate all the rules described in
  * tools/objtool/Documentation/stack-validation.txt.
  */
-static int validate_branch(struct objtool_file *file, struct instruction *first,
-                          struct insn_state state)
+static int validate_branch(struct objtool_file *file, struct symbol *func,
+                          struct instruction *first, struct insn_state state)
 {
        struct alternative *alt;
        struct instruction *insn, *next_insn;
        struct section *sec;
-       struct symbol *func = NULL;
        int ret;
 
        insn = first;
@@ -1947,9 +1966,6 @@ static int validate_branch(struct objtool_file *file, struct instruction *first,
                        return 1;
                }
 
-               if (insn->func)
-                       func = insn->func->pfunc;
-
                if (func && insn->ignore) {
                        WARN_FUNC("BUG: why am I validating an ignored function?",
                                  sec, insn->offset);
@@ -1971,7 +1987,7 @@ static int validate_branch(struct objtool_file *file, struct instruction *first,
 
                                i = insn;
                                save_insn = NULL;
-                               func_for_each_insn_continue_reverse(file, insn->func, i) {
+                               func_for_each_insn_continue_reverse(file, func, i) {
                                        if (i->save) {
                                                save_insn = i;
                                                break;
@@ -2017,7 +2033,7 @@ static int validate_branch(struct objtool_file *file, struct instruction *first,
                                if (alt->skip_orig)
                                        skip_orig = true;
 
-                               ret = validate_branch(file, alt->insn, state);
+                               ret = validate_branch(file, func, alt->insn, state);
                                if (ret) {
                                        if (backtrace)
                                                BT_FUNC("(alt)", insn);
@@ -2055,7 +2071,7 @@ static int validate_branch(struct objtool_file *file, struct instruction *first,
 
                        if (state.bp_scratch) {
                                WARN("%s uses BP as a scratch register",
-                                    insn->func->name);
+                                    func->name);
                                return 1;
                        }
 
@@ -2067,36 +2083,28 @@ static int validate_branch(struct objtool_file *file, struct instruction *first,
                        if (ret)
                                return ret;
 
-                       if (insn->type == INSN_CALL) {
-                               if (is_fentry_call(insn))
-                                       break;
-
-                               ret = dead_end_function(file, insn->call_dest);
-                               if (ret == 1)
-                                       return 0;
-                               if (ret == -1)
-                                       return 1;
-                       }
-
-                       if (!no_fp && func && !has_valid_stack_frame(&state)) {
+                       if (!no_fp && func && !is_fentry_call(insn) &&
+                           !has_valid_stack_frame(&state)) {
                                WARN_FUNC("call without frame pointer save/setup",
                                          sec, insn->offset);
                                return 1;
                        }
+
+                       if (dead_end_function(file, insn->call_dest))
+                               return 0;
+
                        break;
 
                case INSN_JUMP_CONDITIONAL:
                case INSN_JUMP_UNCONDITIONAL:
-                       if (func && !insn->jump_dest) {
+                       if (func && is_sibling_call(insn)) {
                                ret = validate_sibling_call(insn, &state);
                                if (ret)
                                        return ret;
 
-                       } else if (insn->jump_dest &&
-                                  (!func || !insn->jump_dest->func ||
-                                   insn->jump_dest->func->pfunc == func)) {
-                               ret = validate_branch(file, insn->jump_dest,
-                                                     state);
+                       } else if (insn->jump_dest) {
+                               ret = validate_branch(file, func,
+                                                     insn->jump_dest, state);
                                if (ret) {
                                        if (backtrace)
                                                BT_FUNC("(branch)", insn);
@@ -2110,13 +2118,17 @@ static int validate_branch(struct objtool_file *file, struct instruction *first,
                        break;
 
                case INSN_JUMP_DYNAMIC:
-                       if (func && list_empty(&insn->alts)) {
+               case INSN_JUMP_DYNAMIC_CONDITIONAL:
+                       if (func && is_sibling_call(insn)) {
                                ret = validate_sibling_call(insn, &state);
                                if (ret)
                                        return ret;
                        }
 
-                       return 0;
+                       if (insn->type == INSN_JUMP_DYNAMIC)
+                               return 0;
+
+                       break;
 
                case INSN_CONTEXT_SWITCH:
                        if (func && (!next_insn || !next_insn->hint)) {
@@ -2162,7 +2174,7 @@ static int validate_branch(struct objtool_file *file, struct instruction *first,
                        break;
 
                case INSN_CLAC:
-                       if (!state.uaccess && insn->func) {
+                       if (!state.uaccess && func) {
                                WARN_FUNC("redundant UACCESS disable", sec, insn->offset);
                                return 1;
                        }
@@ -2183,7 +2195,7 @@ static int validate_branch(struct objtool_file *file, struct instruction *first,
                        break;
 
                case INSN_CLD:
-                       if (!state.df && insn->func)
+                       if (!state.df && func)
                                WARN_FUNC("redundant CLD", sec, insn->offset);
 
                        state.df = false;
@@ -2222,7 +2234,7 @@ static int validate_unwind_hints(struct objtool_file *file)
 
        for_each_insn(file, insn) {
                if (insn->hint && !insn->visited) {
-                       ret = validate_branch(file, insn, state);
+                       ret = validate_branch(file, insn->func, insn, state);
                        if (ret && backtrace)
                                BT_FUNC("<=== (hint)", insn);
                        warnings += ret;
@@ -2345,16 +2357,25 @@ static int validate_functions(struct objtool_file *file)
 
        for_each_sec(file, sec) {
                list_for_each_entry(func, &sec->symbol_list, list) {
-                       if (func->type != STT_FUNC || func->pfunc != func)
+                       if (func->type != STT_FUNC)
+                               continue;
+
+                       if (!func->len) {
+                               WARN("%s() is missing an ELF size annotation",
+                                    func->name);
+                               warnings++;
+                       }
+
+                       if (func->pfunc != func || func->alias != func)
                                continue;
 
                        insn = find_insn(file, sec, func->offset);
-                       if (!insn || insn->ignore)
+                       if (!insn || insn->ignore || insn->visited)
                                continue;
 
-                       state.uaccess = func->alias->uaccess_safe;
+                       state.uaccess = func->uaccess_safe;
 
-                       ret = validate_branch(file, insn, state);
+                       ret = validate_branch(file, func, insn, state);
                        if (ret && backtrace)
                                BT_FUNC("<=== (func)", insn);
                        warnings += ret;
@@ -2407,7 +2428,7 @@ int check(const char *_objname, bool orc)
 
        objname = _objname;
 
-       file.elf = elf_open(objname, orc ? O_RDWR : O_RDONLY);
+       file.elf = elf_read(objname, orc ? O_RDWR : O_RDONLY);
        if (!file.elf)
                return 1;
 
index cb60b9acf5cfaf125a9afbca9bfd21ecbfe808b5..b881fafcf55d6011438287d172abb4429dd79b11 100644 (file)
@@ -31,13 +31,14 @@ struct instruction {
        struct section *sec;
        unsigned long offset;
        unsigned int len;
-       unsigned char type;
+       enum insn_type type;
        unsigned long immediate;
        bool alt_group, visited, dead_end, ignore, hint, save, restore, ignore_alts;
        bool retpoline_safe;
        struct symbol *call_dest;
        struct instruction *jump_dest;
        struct instruction *first_jump_src;
+       struct rela *jump_table;
        struct list_head alts;
        struct symbol *func;
        struct stack_op stack_op;
index e99e1be19ad9b54c86fc7c561231ea081e3c33ee..edba4745f25a95ab1d886c8dc1171d02521e01d4 100644 (file)
@@ -278,7 +278,7 @@ static int read_symbols(struct elf *elf)
                        }
 
                        if (sym->offset == s->offset) {
-                               if (sym->len == s->len && alias == sym)
+                               if (sym->len && sym->len == s->len && alias == sym)
                                        alias = s;
 
                                if (sym->len >= s->len) {
@@ -385,7 +385,7 @@ static int read_relas(struct elf *elf)
                        rela->offset = rela->rela.r_offset;
                        symndx = GELF_R_SYM(rela->rela.r_info);
                        rela->sym = find_symbol_by_index(elf, symndx);
-                       rela->rela_sec = sec;
+                       rela->sec = sec;
                        if (!rela->sym) {
                                WARN("can't find rela entry symbol %d for %s",
                                     symndx, sec->name);
@@ -401,7 +401,7 @@ static int read_relas(struct elf *elf)
        return 0;
 }
 
-struct elf *elf_open(const char *name, int flags)
+struct elf *elf_read(const char *name, int flags)
 {
        struct elf *elf;
        Elf_Cmd cmd;
@@ -463,7 +463,7 @@ struct section *elf_create_section(struct elf *elf, const char *name,
 {
        struct section *sec, *shstrtab;
        size_t size = entsize * nr;
-       struct Elf_Scn *s;
+       Elf_Scn *s;
        Elf_Data *data;
 
        sec = malloc(sizeof(*sec));
index e44ca5d51871f6c96549bcea852f2da594c20208..44150204db4d1e1e3ed73218ee2bd37906379621 100644 (file)
@@ -57,11 +57,12 @@ struct rela {
        struct list_head list;
        struct hlist_node hash;
        GElf_Rela rela;
-       struct section *rela_sec;
+       struct section *sec;
        struct symbol *sym;
        unsigned int type;
        unsigned long offset;
        int addend;
+       bool jump_table_start;
 };
 
 struct elf {
@@ -74,7 +75,7 @@ struct elf {
 };
 
 
-struct elf *elf_open(const char *name, int flags);
+struct elf *elf_read(const char *name, int flags);
 struct section *find_section_by_name(struct elf *elf, const char *name);
 struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset);
 struct symbol *find_symbol_by_name(struct elf *elf, const char *name);
index 79367087bd18d5d818963021f50de65206b94caa..8f24865596af2fd5a6334f9c5fa10b726bc22956 100644 (file)
@@ -2289,6 +2289,12 @@ static int process_switch_event(struct perf_tool *tool,
        if (perf_event__process_switch(tool, event, sample, machine) < 0)
                return -1;
 
+       if (scripting_ops && scripting_ops->process_switch)
+               scripting_ops->process_switch(event, sample, machine);
+
+       if (!script->show_switch_events)
+               return 0;
+
        thread = machine__findnew_thread(machine, sample->pid,
                                         sample->tid);
        if (thread == NULL) {
@@ -2467,7 +2473,7 @@ static int __cmd_script(struct perf_script *script)
                script->tool.mmap = process_mmap_event;
                script->tool.mmap2 = process_mmap2_event;
        }
-       if (script->show_switch_events)
+       if (script->show_switch_events || (scripting_ops && scripting_ops->process_switch))
                script->tool.context_switch = process_switch_event;
        if (script->show_namespace_events)
                script->tool.namespaces = process_namespaces_event;
index 1aa2ed096f65ed9330d38003a4536af40d1e3269..4f0bbffee05f28e190cb6ff4498458a2138a8349 100644 (file)
@@ -19,6 +19,7 @@
 #include <api/fs/tracing_path.h>
 #include <bpf/bpf.h>
 #include "util/bpf_map.h"
+#include "util/rlimit.h"
 #include "builtin.h"
 #include "util/cgroup.h"
 #include "util/color.h"
@@ -3864,6 +3865,15 @@ int cmd_trace(int argc, const char **argv)
                goto out;
        }
 
+       /*
+        * Parsing .perfconfig may entail creating a BPF event, that may need
+        * to create BPF maps, so bump RLIM_MEMLOCK as the default 64K setting
+        * is too small. This affects just this process, not touching the
+        * global setting. If it fails we'll get something in 'perf trace -v'
+        * to help diagnose the problem.
+        */
+       rlimit__bump_memlock();
+
        err = perf_config(trace__config, &trace);
        if (err)
                goto out;
index f470144d1a7043ecf9fbcc3467d15c6df148b3d1..bf114ca9ca870ba27bdc8a29d88faecf42895015 100644 (file)
@@ -19,6 +19,7 @@ static struct version version;
 static struct option version_options[] = {
        OPT_BOOLEAN(0, "build-options", &version.build_options,
                    "display the build options"),
+       OPT_END(),
 };
 
 static const char * const version_usage[] = {
diff --git a/tools/perf/pmu-events/arch/s390/cf_m8561/basic.json b/tools/perf/pmu-events/arch/s390/cf_m8561/basic.json
new file mode 100644 (file)
index 0000000..17fb524
--- /dev/null
@@ -0,0 +1,58 @@
+[
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "0",
+               "EventName": "CPU_CYCLES",
+               "BriefDescription": "CPU Cycles",
+               "PublicDescription": "Cycle Count"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "1",
+               "EventName": "INSTRUCTIONS",
+               "BriefDescription": "Instructions",
+               "PublicDescription": "Instruction Count"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "2",
+               "EventName": "L1I_DIR_WRITES",
+               "BriefDescription": "L1I Directory Writes",
+               "PublicDescription": "Level-1 I-Cache Directory Write Count"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "3",
+               "EventName": "L1I_PENALTY_CYCLES",
+               "BriefDescription": "L1I Penalty Cycles",
+               "PublicDescription": "Level-1 I-Cache Penalty Cycle Count"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "4",
+               "EventName": "L1D_DIR_WRITES",
+               "BriefDescription": "L1D Directory Writes",
+               "PublicDescription": "Level-1 D-Cache Directory Write Count"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "5",
+               "EventName": "L1D_PENALTY_CYCLES",
+               "BriefDescription": "L1D Penalty Cycles",
+               "PublicDescription": "Level-1 D-Cache Penalty Cycle Count"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "32",
+               "EventName": "PROBLEM_STATE_CPU_CYCLES",
+               "BriefDescription": "Problem-State CPU Cycles",
+               "PublicDescription": "Problem-State Cycle Count"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "33",
+               "EventName": "PROBLEM_STATE_INSTRUCTIONS",
+               "BriefDescription": "Problem-State Instructions",
+               "PublicDescription": "Problem-State Instruction Count"
+       },
+]
diff --git a/tools/perf/pmu-events/arch/s390/cf_m8561/crypto.json b/tools/perf/pmu-events/arch/s390/cf_m8561/crypto.json
new file mode 100644 (file)
index 0000000..db286f1
--- /dev/null
@@ -0,0 +1,114 @@
+[
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "64",
+               "EventName": "PRNG_FUNCTIONS",
+               "BriefDescription": "PRNG Functions",
+               "PublicDescription": "Total number of the PRNG functions issued by the CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "65",
+               "EventName": "PRNG_CYCLES",
+               "BriefDescription": "PRNG Cycles",
+               "PublicDescription": "Total number of CPU cycles when the DEA/AES coprocessor is busy performing PRNG functions issued by the CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "66",
+               "EventName": "PRNG_BLOCKED_FUNCTIONS",
+               "BriefDescription": "PRNG Blocked Functions",
+               "PublicDescription": "Total number of the PRNG functions that are issued by the CPU and are blocked because the DEA/AES coprocessor is busy performing a function issued by another CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "67",
+               "EventName": "PRNG_BLOCKED_CYCLES",
+               "BriefDescription": "PRNG Blocked Cycles",
+               "PublicDescription": "Total number of CPU cycles blocked for the PRNG functions issued by the CPU because the DEA/AES coprocessor is busy performing a function issued by another CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "68",
+               "EventName": "SHA_FUNCTIONS",
+               "BriefDescription": "SHA Functions",
+               "PublicDescription": "Total number of SHA functions issued by the CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "69",
+               "EventName": "SHA_CYCLES",
+               "BriefDescription": "SHA Cycles",
+               "PublicDescription": "Total number of CPU cycles when the SHA coprocessor is busy performing the SHA functions issued by the CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "70",
+               "EventName": "SHA_BLOCKED_FUNCTIONS",
+               "BriefDescription": "SHA Blocked Functions",
+               "PublicDescription": "Total number of the SHA functions that are issued by the CPU and are blocked because the SHA coprocessor is busy performing a function issued by another CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "71",
+               "EventName": "SHA_BLOCKED_CYCLES",
+               "BriefDescription": "SHA Bloced Cycles",
+               "PublicDescription": "Total number of CPU cycles blocked for the SHA functions issued by the CPU because the SHA coprocessor is busy performing a function issued by another CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "72",
+               "EventName": "DEA_FUNCTIONS",
+               "BriefDescription": "DEA Functions",
+               "PublicDescription": "Total number of the DEA functions issued by the CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "73",
+               "EventName": "DEA_CYCLES",
+               "BriefDescription": "DEA Cycles",
+               "PublicDescription": "Total number of CPU cycles when the DEA/AES coprocessor is busy performing the DEA functions issued by the CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "74",
+               "EventName": "DEA_BLOCKED_FUNCTIONS",
+               "BriefDescription": "DEA Blocked Functions",
+               "PublicDescription": "Total number of the DEA functions that are issued by the CPU and are blocked because the DEA/AES coprocessor is busy performing a function issued by another CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "75",
+               "EventName": "DEA_BLOCKED_CYCLES",
+               "BriefDescription": "DEA Blocked Cycles",
+               "PublicDescription": "Total number of CPU cycles blocked for the DEA functions issued by the CPU because the DEA/AES coprocessor is busy performing a function issued by another CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "76",
+               "EventName": "AES_FUNCTIONS",
+               "BriefDescription": "AES Functions",
+               "PublicDescription": "Total number of AES functions issued by the CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "77",
+               "EventName": "AES_CYCLES",
+               "BriefDescription": "AES Cycles",
+               "PublicDescription": "Total number of CPU cycles when the DEA/AES coprocessor is busy performing the AES functions issued by the CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "78",
+               "EventName": "AES_BLOCKED_FUNCTIONS",
+               "BriefDescription": "AES Blocked Functions",
+               "PublicDescription": "Total number of AES functions that are issued by the CPU and are blocked because the DEA/AES coprocessor is busy performing a function issued by another CPU"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "79",
+               "EventName": "AES_BLOCKED_CYCLES",
+               "BriefDescription": "AES Blocked Cycles",
+               "PublicDescription": "Total number of CPU cycles blocked for the AES functions issued by the CPU because the DEA/AES coprocessor is busy performing a function issued by another CPU"
+       },
+]
diff --git a/tools/perf/pmu-events/arch/s390/cf_m8561/crypto6.json b/tools/perf/pmu-events/arch/s390/cf_m8561/crypto6.json
new file mode 100644 (file)
index 0000000..5e36bc2
--- /dev/null
@@ -0,0 +1,30 @@
+[
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "80",
+               "EventName": "ECC_FUNCTION_COUNT",
+               "BriefDescription": "ECC Function Count",
+               "PublicDescription": "Long ECC function Count"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "81",
+               "EventName": "ECC_CYCLES_COUNT",
+               "BriefDescription": "ECC Cycles Count",
+               "PublicDescription": "Long ECC Function cycles count"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "82",
+               "EventName": "ECC_BLOCKED_FUNCTION_COUNT",
+               "BriefDescription": "Ecc Blocked Function Count",
+               "PublicDescription": "Long ECC blocked function count"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "83",
+               "EventName": "ECC_BLOCKED_CYCLES_COUNT",
+               "BriefDescription": "ECC Blocked Cycles Count",
+               "PublicDescription": "Long ECC blocked cycles count"
+       },
+]
diff --git a/tools/perf/pmu-events/arch/s390/cf_m8561/extended.json b/tools/perf/pmu-events/arch/s390/cf_m8561/extended.json
new file mode 100644 (file)
index 0000000..89e0707
--- /dev/null
@@ -0,0 +1,373 @@
+[
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "128",
+               "EventName": "L1D_RO_EXCL_WRITES",
+               "BriefDescription": "L1D Read-only Exclusive Writes",
+               "PublicDescription": "A directory write to the Level-1 Data cache where the line was originally in a Read-Only state in the cache but has been updated to be in the Exclusive state that allows stores to the cache line"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "129",
+               "EventName": "DTLB2_WRITES",
+               "BriefDescription": "DTLB2 Writes",
+               "PublicDescription": "A translation has been written into The Translation Lookaside Buffer 2 (TLB2) and the request was made by the data cache"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "130",
+               "EventName": "DTLB2_MISSES",
+               "BriefDescription": "DTLB2 Misses",
+               "PublicDescription": "A TLB2 miss is in progress for a request made by the data cache. Incremented by one for every TLB2 miss in progress for the Level-1 Data cache on this cycle"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "131",
+               "EventName": "DTLB2_HPAGE_WRITES",
+               "BriefDescription": "DTLB2 One-Megabyte Page Writes",
+               "PublicDescription": "A translation entry was written into the Combined Region and Segment Table Entry array in the Level-2 TLB for a one-megabyte page or a Last Host Translation was done"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "132",
+               "EventName": "DTLB2_GPAGE_WRITES",
+               "BriefDescription": "DTLB2 Two-Gigabyte Page Writes",
+               "PublicDescription": "A translation entry for a two-gigabyte page was written into the Level-2 TLB"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "133",
+               "EventName": "L1D_L2D_SOURCED_WRITES",
+               "BriefDescription": "L1D L2D Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from the Level-2 Data cache"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "134",
+               "EventName": "ITLB2_WRITES",
+               "BriefDescription": "ITLB2 Writes",
+               "PublicDescription": "A translation entry has been written into the Translation Lookaside Buffer 2 (TLB2) and the request was made by the instruction cache"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "135",
+               "EventName": "ITLB2_MISSES",
+               "BriefDescription": "ITLB2 Misses",
+               "PublicDescription": "A TLB2 miss is in progress for a request made by the instruction cache. Incremented by one for every TLB2 miss in progress for the Level-1 Instruction cache in a cycle"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "136",
+               "EventName": "L1I_L2I_SOURCED_WRITES",
+               "BriefDescription": "L1I L2I Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache line was sourced from the Level-2 Instruction cache"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "137",
+               "EventName": "TLB2_PTE_WRITES",
+               "BriefDescription": "TLB2 PTE Writes",
+               "PublicDescription": "A translation entry was written into the Page Table Entry array in the Level-2 TLB"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "138",
+               "EventName": "TLB2_CRSTE_WRITES",
+               "BriefDescription": "TLB2 CRSTE Writes",
+               "PublicDescription": "Translation entries were written into the Combined Region and Segment Table Entry array and the Page Table Entry array in the Level-2 TLB"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "139",
+               "EventName": "TLB2_ENGINES_BUSY",
+               "BriefDescription": "TLB2 Engines Busy",
+               "PublicDescription": "The number of Level-2 TLB translation engines busy in a cycle"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "140",
+               "EventName": "TX_C_TEND",
+               "BriefDescription": "Completed TEND instructions in constrained TX mode",
+               "PublicDescription": "A TEND instruction has completed in a constrained transactional-execution mode"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "141",
+               "EventName": "TX_NC_TEND",
+               "BriefDescription": "Completed TEND instructions in non-constrained TX mode",
+               "PublicDescription": "A TEND instruction has completed in a non-constrained transactional-execution mode"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "143",
+               "EventName": "L1C_TLB2_MISSES",
+               "BriefDescription": "L1C TLB2 Misses",
+               "PublicDescription": "Increments by one for any cycle where a level-1 cache or level-2 TLB miss is in progress"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "144",
+               "EventName": "L1D_ONCHIP_L3_SOURCED_WRITES",
+               "BriefDescription": "L1D On-Chip L3 Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from an On-Chip Level-3 cache without intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "145",
+               "EventName": "L1D_ONCHIP_MEMORY_SOURCED_WRITES",
+               "BriefDescription": "L1D On-Chip Memory Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from On-Chip memory"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "146",
+               "EventName": "L1D_ONCHIP_L3_SOURCED_WRITES_IV",
+               "BriefDescription": "L1D On-Chip L3 Sourced Writes with Intervention",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from an On-Chip Level-3 cache with intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "147",
+               "EventName": "L1D_ONCLUSTER_L3_SOURCED_WRITES",
+               "BriefDescription": "L1D On-Cluster L3 Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from On-Cluster Level-3 cache withountervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "148",
+               "EventName": "L1D_ONCLUSTER_MEMORY_SOURCED_WRITES",
+               "BriefDescription": "L1D On-Cluster Memory Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from an On-Cluster memory"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "149",
+               "EventName": "L1D_ONCLUSTER_L3_SOURCED_WRITES_IV",
+               "BriefDescription": "L1D On-Cluster L3 Sourced Writes with Intervention",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from an On-Cluster Level-3 cache with intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "150",
+               "EventName": "L1D_OFFCLUSTER_L3_SOURCED_WRITES",
+               "BriefDescription": "L1D Off-Cluster L3 Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from an Off-Cluster Level-3 cache without intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "151",
+               "EventName": "L1D_OFFCLUSTER_MEMORY_SOURCED_WRITES",
+               "BriefDescription": "L1D Off-Cluster Memory Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from Off-Cluster memory"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "152",
+               "EventName": "L1D_OFFCLUSTER_L3_SOURCED_WRITES_IV",
+               "BriefDescription": "L1D Off-Cluster L3 Sourced Writes with Intervention",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from an Off-Cluster Level-3 cache with intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "153",
+               "EventName": "L1D_OFFDRAWER_L3_SOURCED_WRITES",
+               "BriefDescription": "L1D Off-Drawer L3 Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from an Off-Drawer Level-3 cache without intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "154",
+               "EventName": "L1D_OFFDRAWER_MEMORY_SOURCED_WRITES",
+               "BriefDescription": "L1D Off-Drawer Memory Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from Off-Drawer memory"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "155",
+               "EventName": "L1D_OFFDRAWER_L3_SOURCED_WRITES_IV",
+               "BriefDescription": "L1D Off-Drawer L3 Sourced Writes with Intervention",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from an Off-Drawer Level-3 cache with intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "156",
+               "EventName": "L1D_ONDRAWER_L4_SOURCED_WRITES",
+               "BriefDescription": "L1D On-Drawer L4 Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from On-Drawer Level-4 cache"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "157",
+               "EventName": "L1D_OFFDRAWER_L4_SOURCED_WRITES",
+               "BriefDescription": "L1D Off-Drawer L4 Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from Off-Drawer Level-4 cache"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "158",
+               "EventName": "L1D_ONCHIP_L3_SOURCED_WRITES_RO",
+               "BriefDescription": "L1D On-Chip L3 Sourced Writes read-only",
+               "PublicDescription": "A directory write to the Level-1 Data cache directory where the returned cache line was sourced from On-Chip L3 but a read-only invalidate was done to remove other copies of the cache line"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "162",
+               "EventName": "L1I_ONCHIP_L3_SOURCED_WRITES",
+               "BriefDescription": "L1I On-Chip L3 Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache ine was sourced from an On-Chip Level-3 cache without intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "163",
+               "EventName": "L1I_ONCHIP_MEMORY_SOURCED_WRITES",
+               "BriefDescription": "L1I On-Chip Memory Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache ine was sourced from On-Chip memory"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "164",
+               "EventName": "L1I_ONCHIP_L3_SOURCED_WRITES_IV",
+               "BriefDescription": "L1I On-Chip L3 Sourced Writes with Intervention",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache ine was sourced from an On-Chip Level-3 cache with intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "165",
+               "EventName": "L1I_ONCLUSTER_L3_SOURCED_WRITES",
+               "BriefDescription": "L1I On-Cluster L3 Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache line was sourced from an On-Cluster Level-3 cache without intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "166",
+               "EventName": "L1I_ONCLUSTER_MEMORY_SOURCED_WRITES",
+               "BriefDescription": "L1I On-Cluster Memory Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache line was sourced from an On-Cluster memory"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "167",
+               "EventName": "L1I_ONCLUSTER_L3_SOURCED_WRITES_IV",
+               "BriefDescription": "L1I On-Cluster L3 Sourced Writes with Intervention",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache line was sourced from On-Cluster Level-3 cache with intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "168",
+               "EventName": "L1I_OFFCLUSTER_L3_SOURCED_WRITES",
+               "BriefDescription": "L1I Off-Cluster L3 Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache line was sourced from an Off-Cluster Level-3 cache without intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "169",
+               "EventName": "L1I_OFFCLUSTER_MEMORY_SOURCED_WRITES",
+               "BriefDescription": "L1I Off-Cluster Memory Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache line was sourced from Off-Cluster memory"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "170",
+               "EventName": "L1I_OFFCLUSTER_L3_SOURCED_WRITES_IV",
+               "BriefDescription": "L1I Off-Cluster L3 Sourced Writes with Intervention",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache line was sourced from an Off-Cluster Level-3 cache with intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "171",
+               "EventName": "L1I_OFFDRAWER_L3_SOURCED_WRITES",
+               "BriefDescription": "L1I Off-Drawer L3 Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache line was sourced from an Off-Drawer Level-3 cache without intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "172",
+               "EventName": "L1I_OFFDRAWER_MEMORY_SOURCED_WRITES",
+               "BriefDescription": "L1I Off-Drawer Memory Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache line was sourced from Off-Drawer memory"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "173",
+               "EventName": "L1I_OFFDRAWER_L3_SOURCED_WRITES_IV",
+               "BriefDescription": "L1I Off-Drawer L3 Sourced Writes with Intervention",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache line was sourced from an Off-Drawer Level-3 cache with intervention"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "174",
+               "EventName": "L1I_ONDRAWER_L4_SOURCED_WRITES",
+               "BriefDescription": "L1I On-Drawer L4 Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache line was sourced from On-Drawer Level-4 cache"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "175",
+               "EventName": "L1I_OFFDRAWER_L4_SOURCED_WRITES",
+               "BriefDescription": "L1I Off-Drawer L4 Sourced Writes",
+               "PublicDescription": "A directory write to the Level-1 Instruction cache directory where the returned cache line was sourced from Off-Drawer Level-4 cache"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "224",
+               "EventName": "BCD_DFP_EXECUTION_SLOTS",
+               "BriefDescription": "BCD DFP Execution Slots",
+               "PublicDescription": "Count of floating point execution slots used for finished Binary Coded Decimal to Decimal Floating Point conversions. Instructions: CDZT, CXZT, CZDT, CZXT"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "225",
+               "EventName": "VX_BCD_EXECUTION_SLOTS",
+               "BriefDescription": "VX BCD Execution Slots",
+               "PublicDescription": "Count of floating point execution slots used for finished vector arithmetic Binary Coded Decimal instructions. Instructions: VAP, VSP, VMPVMSP, VDP, VSDP, VRP, VLIP, VSRP, VPSOPVCP, VTP, VPKZ, VUPKZ, VCVB, VCVBG, VCVDVCVDG"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "226",
+               "EventName": "DECIMAL_INSTRUCTIONS",
+               "BriefDescription": "Decimal Instructions",
+               "PublicDescription": "Decimal instructions dispatched. Instructions: CVB, CVD, AP, CP, DP, ED, EDMK, MP, SRP, SP, ZAP"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "232",
+               "EventName": "LAST_HOST_TRANSLATIONS",
+               "BriefDescription": "Last host translation done",
+               "PublicDescription": "Last Host Translation done"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "243",
+               "EventName": "TX_NC_TABORT",
+               "BriefDescription": "Aborted transactions in non-constrained TX mode",
+               "PublicDescription": "A transaction abort has occurred in a non-constrained transactional-execution mode"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "244",
+               "EventName": "TX_C_TABORT_NO_SPECIAL",
+               "BriefDescription": "Aborted transactions in constrained TX mode not using special completion logic",
+               "PublicDescription": "A transaction abort has occurred in a constrained transactional-execution mode and the CPU is not using any special logic to allow the transaction to complete"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "245",
+               "EventName": "TX_C_TABORT_SPECIAL",
+               "BriefDescription": "Aborted transactions in constrained TX mode using special completion logic",
+               "PublicDescription": "A transaction abort has occurred in a constrained transactional-execution mode and the CPU is using special logic to allow the transaction to complete"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "448",
+               "EventName": "MT_DIAG_CYCLES_ONE_THR_ACTIVE",
+               "BriefDescription": "Cycle count with one thread active",
+               "PublicDescription": "Cycle count with one thread active"
+       },
+       {
+               "Unit": "CPU-M-CF",
+               "EventCode": "449",
+               "EventName": "MT_DIAG_CYCLES_TWO_THR_ACTIVE",
+               "BriefDescription": "Cycle count with two threads active",
+               "PublicDescription": "Cycle count with two threads active"
+       },
+]
index 78bcf7f8e2066e470e5868c976aaa2a1b305d207..bd3fc577139cc76b527d10aed9d3d2e5c9b2a325 100644 (file)
@@ -4,3 +4,4 @@ Family-model,Version,Filename,EventType
 ^IBM.282[78].*[13]\.[1-5].[[:xdigit:]]+$,1,cf_zec12,core
 ^IBM.296[45].*[13]\.[1-5].[[:xdigit:]]+$,1,cf_z13,core
 ^IBM.390[67].*[13]\.[1-5].[[:xdigit:]]+$,3,cf_z14,core
+^IBM.856[12].*3\.6.[[:xdigit:]]+$,3,cf_m8561,core
index 92713d93e95647235acee8998641f021020f3b19..7bd73a904b4ee103a8ad8aa92fc2253517cb5109 100644 (file)
@@ -353,7 +353,10 @@ do_query(query, 'CREATE TABLE threads ('
                'tid            integer)')
 do_query(query, 'CREATE TABLE comms ('
                'id             bigint          NOT NULL,'
-               'comm           varchar(16))')
+               'comm           varchar(16),'
+               'c_thread_id    bigint,'
+               'c_time         bigint,'
+               'exec_flag      boolean)')
 do_query(query, 'CREATE TABLE comm_threads ('
                'id             bigint          NOT NULL,'
                'comm_id        bigint,'
@@ -479,6 +482,17 @@ do_query(query, 'CREATE TABLE pwrx ('
        'last_cstate    integer,'
        'wake_reason    integer)')
 
+do_query(query, 'CREATE TABLE context_switches ('
+               'id             bigint          NOT NULL,'
+               'machine_id     bigint,'
+               'time           bigint,'
+               'cpu            integer,'
+               'thread_out_id  bigint,'
+               'comm_out_id    bigint,'
+               'thread_in_id   bigint,'
+               'comm_in_id     bigint,'
+               'flags          integer)')
+
 do_query(query, 'CREATE VIEW machines_view AS '
        'SELECT '
                'id,'
@@ -692,6 +706,29 @@ do_query(query, 'CREATE VIEW power_events_view AS '
        ' INNER JOIN selected_events ON selected_events.id = samples.evsel_id'
        ' ORDER BY samples.id')
 
+do_query(query, 'CREATE VIEW context_switches_view AS '
+       'SELECT '
+               'context_switches.id,'
+               'context_switches.machine_id,'
+               'context_switches.time,'
+               'context_switches.cpu,'
+               'th_out.pid AS pid_out,'
+               'th_out.tid AS tid_out,'
+               'comm_out.comm AS comm_out,'
+               'th_in.pid AS pid_in,'
+               'th_in.tid AS tid_in,'
+               'comm_in.comm AS comm_in,'
+               'CASE     WHEN context_switches.flags = 0 THEN \'in\''
+                       ' WHEN context_switches.flags = 1 THEN \'out\''
+                       ' WHEN context_switches.flags = 3 THEN \'out preempt\''
+                       ' ELSE CAST ( context_switches.flags AS VARCHAR(11) )'
+               'END AS flags'
+       ' FROM context_switches'
+       ' INNER JOIN threads AS th_out ON th_out.id   = context_switches.thread_out_id'
+       ' INNER JOIN threads AS th_in  ON th_in.id    = context_switches.thread_in_id'
+       ' INNER JOIN comms AS comm_out ON comm_out.id = context_switches.comm_out_id'
+       ' INNER JOIN comms AS comm_in  ON comm_in.id  = context_switches.comm_in_id')
+
 file_header = struct.pack("!11sii", b"PGCOPY\n\377\r\n\0", 0, 0)
 file_trailer = b"\377\377"
 
@@ -756,6 +793,7 @@ mwait_file          = open_output_file("mwait_table.bin")
 pwre_file              = open_output_file("pwre_table.bin")
 exstop_file            = open_output_file("exstop_table.bin")
 pwrx_file              = open_output_file("pwrx_table.bin")
+context_switches_file  = open_output_file("context_switches_table.bin")
 
 def trace_begin():
        printdate("Writing to intermediate files...")
@@ -763,7 +801,7 @@ def trace_begin():
        evsel_table(0, "unknown")
        machine_table(0, 0, "unknown")
        thread_table(0, 0, 0, -1, -1)
-       comm_table(0, "unknown")
+       comm_table(0, "unknown", 0, 0, 0)
        dso_table(0, 0, "unknown", "unknown", "")
        symbol_table(0, 0, 0, 0, 0, "unknown")
        sample_table(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
@@ -804,6 +842,7 @@ def trace_end():
        copy_output_file(pwre_file,             "pwre")
        copy_output_file(exstop_file,           "exstop")
        copy_output_file(pwrx_file,             "pwrx")
+       copy_output_file(context_switches_file, "context_switches")
 
        printdate("Removing intermediate files...")
        remove_output_file(evsel_file)
@@ -825,6 +864,7 @@ def trace_end():
        remove_output_file(pwre_file)
        remove_output_file(exstop_file)
        remove_output_file(pwrx_file)
+       remove_output_file(context_switches_file)
        os.rmdir(output_dir_name)
        printdate("Adding primary keys")
        do_query(query, 'ALTER TABLE selected_events ADD PRIMARY KEY (id)')
@@ -846,11 +886,14 @@ def trace_end():
        do_query(query, 'ALTER TABLE pwre            ADD PRIMARY KEY (id)')
        do_query(query, 'ALTER TABLE exstop          ADD PRIMARY KEY (id)')
        do_query(query, 'ALTER TABLE pwrx            ADD PRIMARY KEY (id)')
+       do_query(query, 'ALTER TABLE context_switches ADD PRIMARY KEY (id)')
 
        printdate("Adding foreign keys")
        do_query(query, 'ALTER TABLE threads '
                                        'ADD CONSTRAINT machinefk  FOREIGN KEY (machine_id)   REFERENCES machines   (id),'
                                        'ADD CONSTRAINT processfk  FOREIGN KEY (process_id)   REFERENCES threads    (id)')
+       do_query(query, 'ALTER TABLE comms '
+                                       'ADD CONSTRAINT threadfk   FOREIGN KEY (c_thread_id)  REFERENCES threads    (id)')
        do_query(query, 'ALTER TABLE comm_threads '
                                        'ADD CONSTRAINT commfk     FOREIGN KEY (comm_id)      REFERENCES comms      (id),'
                                        'ADD CONSTRAINT threadfk   FOREIGN KEY (thread_id)    REFERENCES threads    (id)')
@@ -881,6 +924,8 @@ def trace_end():
                                        'ADD CONSTRAINT parent_call_pathfk FOREIGN KEY (parent_call_path_id) REFERENCES call_paths (id)')
                do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)')
                do_query(query, 'CREATE INDEX pid_idx ON calls (parent_id)')
+               do_query(query, 'ALTER TABLE comms ADD has_calls boolean')
+               do_query(query, 'UPDATE comms SET has_calls = TRUE WHERE comms.id IN (SELECT DISTINCT comm_id FROM calls)')
        do_query(query, 'ALTER TABLE ptwrite '
                                        'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')
        do_query(query, 'ALTER TABLE  cbr '
@@ -893,6 +938,12 @@ def trace_end():
                                        'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')
        do_query(query, 'ALTER TABLE  pwrx '
                                        'ADD CONSTRAINT idfk        FOREIGN KEY (id)           REFERENCES samples   (id)')
+       do_query(query, 'ALTER TABLE  context_switches '
+                                       'ADD CONSTRAINT machinefk   FOREIGN KEY (machine_id)    REFERENCES machines (id),'
+                                       'ADD CONSTRAINT toutfk      FOREIGN KEY (thread_out_id) REFERENCES threads  (id),'
+                                       'ADD CONSTRAINT tinfk       FOREIGN KEY (thread_in_id)  REFERENCES threads  (id),'
+                                       'ADD CONSTRAINT coutfk      FOREIGN KEY (comm_out_id)   REFERENCES comms    (id),'
+                                       'ADD CONSTRAINT cinfk       FOREIGN KEY (comm_in_id)    REFERENCES comms    (id)')
 
        printdate("Dropping unused tables")
        if is_table_empty("ptwrite"):
@@ -905,6 +956,8 @@ def trace_end():
                drop("pwrx")
                if is_table_empty("cbr"):
                        drop("cbr")
+       if is_table_empty("context_switches"):
+               drop("context_switches")
 
        if (unhandled_count):
                printdate("Warning: ", unhandled_count, " unhandled events")
@@ -935,11 +988,11 @@ def thread_table(thread_id, machine_id, process_id, pid, tid, *x):
        value = struct.pack("!hiqiqiqiiii", 5, 8, thread_id, 8, machine_id, 8, process_id, 4, pid, 4, tid)
        thread_file.write(value)
 
-def comm_table(comm_id, comm_str, *x):
+def comm_table(comm_id, comm_str, thread_id, time, exec_flag, *x):
        comm_str = toserverstr(comm_str)
        n = len(comm_str)
-       fmt = "!hiqi" + str(n) + "s"
-       value = struct.pack(fmt, 2, 8, comm_id, n, comm_str)
+       fmt = "!hiqi" + str(n) + "s" + "iqiqiB"
+       value = struct.pack(fmt, 5, 8, comm_id, n, comm_str, 8, thread_id, 8, time, 1, exec_flag)
        comm_file.write(value)
 
 def comm_thread_table(comm_thread_id, comm_id, thread_id, *x):
@@ -1051,3 +1104,8 @@ def synth_data(id, config, raw_buf, *x):
                pwrx(id, raw_buf)
        elif config == 5:
                cbr(id, raw_buf)
+
+def context_switch_table(id, machine_id, time, cpu, thread_out_id, comm_out_id, thread_in_id, comm_in_id, flags, *x):
+       fmt = "!hiqiqiqiiiqiqiqiqii"
+       value = struct.pack(fmt, 9, 8, id, 8, machine_id, 8, time, 4, cpu, 8, thread_out_id, 8, comm_out_id, 8, thread_in_id, 8, comm_in_id, 4, flags)
+       context_switches_file.write(value)
index 021326c46285d6b7936822b76d66fefde2cf8ef2..8043a7272a56dcacc8ea3924cfd7a94b8d517adc 100644 (file)
@@ -177,7 +177,10 @@ do_query(query, 'CREATE TABLE threads ('
                'tid            integer)')
 do_query(query, 'CREATE TABLE comms ('
                'id             integer         NOT NULL        PRIMARY KEY,'
-               'comm           varchar(16))')
+               'comm           varchar(16),'
+               'c_thread_id    bigint,'
+               'c_time         bigint,'
+               'exec_flag      boolean)')
 do_query(query, 'CREATE TABLE comm_threads ('
                'id             integer         NOT NULL        PRIMARY KEY,'
                'comm_id        bigint,'
@@ -303,6 +306,17 @@ do_query(query, 'CREATE TABLE pwrx ('
                'last_cstate    integer,'
                'wake_reason    integer)')
 
+do_query(query, 'CREATE TABLE context_switches ('
+               'id             integer         NOT NULL        PRIMARY KEY,'
+               'machine_id     bigint,'
+               'time           bigint,'
+               'cpu            integer,'
+               'thread_out_id  bigint,'
+               'comm_out_id    bigint,'
+               'thread_in_id   bigint,'
+               'comm_in_id     bigint,'
+               'flags          integer)')
+
 # printf was added to sqlite in version 3.8.3
 sqlite_has_printf = False
 try:
@@ -527,6 +541,29 @@ do_query(query, 'CREATE VIEW power_events_view AS '
        ' INNER JOIN selected_events ON selected_events.id = evsel_id'
        ' WHERE selected_events.name IN (\'cbr\',\'mwait\',\'exstop\',\'pwre\',\'pwrx\')')
 
+do_query(query, 'CREATE VIEW context_switches_view AS '
+       'SELECT '
+               'context_switches.id,'
+               'context_switches.machine_id,'
+               'context_switches.time,'
+               'context_switches.cpu,'
+               'th_out.pid AS pid_out,'
+               'th_out.tid AS tid_out,'
+               'comm_out.comm AS comm_out,'
+               'th_in.pid AS pid_in,'
+               'th_in.tid AS tid_in,'
+               'comm_in.comm AS comm_in,'
+               'CASE     WHEN context_switches.flags = 0 THEN \'in\''
+                       ' WHEN context_switches.flags = 1 THEN \'out\''
+                       ' WHEN context_switches.flags = 3 THEN \'out preempt\''
+                       ' ELSE context_switches.flags '
+               'END AS flags'
+       ' FROM context_switches'
+       ' INNER JOIN threads AS th_out ON th_out.id   = context_switches.thread_out_id'
+       ' INNER JOIN threads AS th_in  ON th_in.id    = context_switches.thread_in_id'
+       ' INNER JOIN comms AS comm_out ON comm_out.id = context_switches.comm_out_id'
+       ' INNER JOIN comms AS comm_in  ON comm_in.id  = context_switches.comm_in_id')
+
 do_query(query, 'END TRANSACTION')
 
 evsel_query = QSqlQuery(db)
@@ -536,7 +573,7 @@ machine_query.prepare("INSERT INTO machines VALUES (?, ?, ?)")
 thread_query = QSqlQuery(db)
 thread_query.prepare("INSERT INTO threads VALUES (?, ?, ?, ?, ?)")
 comm_query = QSqlQuery(db)
-comm_query.prepare("INSERT INTO comms VALUES (?, ?)")
+comm_query.prepare("INSERT INTO comms VALUES (?, ?, ?, ?, ?)")
 comm_thread_query = QSqlQuery(db)
 comm_thread_query.prepare("INSERT INTO comm_threads VALUES (?, ?, ?)")
 dso_query = QSqlQuery(db)
@@ -568,6 +605,8 @@ exstop_query = QSqlQuery(db)
 exstop_query.prepare("INSERT INTO exstop VALUES (?, ?)")
 pwrx_query = QSqlQuery(db)
 pwrx_query.prepare("INSERT INTO pwrx VALUES (?, ?, ?, ?)")
+context_switch_query = QSqlQuery(db)
+context_switch_query.prepare("INSERT INTO context_switches VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)")
 
 def trace_begin():
        printdate("Writing records...")
@@ -576,7 +615,7 @@ def trace_begin():
        evsel_table(0, "unknown")
        machine_table(0, 0, "unknown")
        thread_table(0, 0, 0, -1, -1)
-       comm_table(0, "unknown")
+       comm_table(0, "unknown", 0, 0, 0)
        dso_table(0, 0, "unknown", "unknown", "")
        symbol_table(0, 0, 0, 0, 0, "unknown")
        sample_table(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
@@ -603,6 +642,8 @@ def trace_end():
        if perf_db_export_calls:
                do_query(query, 'CREATE INDEX pcpid_idx ON calls (parent_call_path_id)')
                do_query(query, 'CREATE INDEX pid_idx ON calls (parent_id)')
+               do_query(query, 'ALTER TABLE comms ADD has_calls boolean')
+               do_query(query, 'UPDATE comms SET has_calls = 1 WHERE comms.id IN (SELECT DISTINCT comm_id FROM calls)')
 
        printdate("Dropping unused tables")
        if is_table_empty("ptwrite"):
@@ -615,6 +656,8 @@ def trace_end():
                drop("pwrx")
                if is_table_empty("cbr"):
                        drop("cbr")
+       if is_table_empty("context_switches"):
+               drop("context_switches")
 
        if (unhandled_count):
                printdate("Warning: ", unhandled_count, " unhandled events")
@@ -642,7 +685,7 @@ def thread_table(*x):
        bind_exec(thread_query, 5, x)
 
 def comm_table(*x):
-       bind_exec(comm_query, 2, x)
+       bind_exec(comm_query, 5, x)
 
 def comm_thread_table(*x):
        bind_exec(comm_thread_query, 3, x)
@@ -748,3 +791,6 @@ def synth_data(id, config, raw_buf, *x):
                pwrx(id, raw_buf)
        elif config == 5:
                cbr(id, raw_buf)
+
+def context_switch_table(*x):
+       bind_exec(context_switch_query, 9, x)
index 6e7934f2ac9a31549cddfd1a669e6cc7f61b613e..61b3911d91e6b0342e49a5a69fc5e8ce2d7d73ef 100755 (executable)
@@ -392,7 +392,7 @@ class FindBar():
                self.hbox.addWidget(self.close_button)
 
                self.bar = QWidget()
-               self.bar.setLayout(self.hbox);
+               self.bar.setLayout(self.hbox)
                self.bar.hide()
 
        def Widget(self):
@@ -470,7 +470,7 @@ class CallGraphLevelItemBase(object):
                self.params = params
                self.row = row
                self.parent_item = parent_item
-               self.query_done = False;
+               self.query_done = False
                self.child_count = 0
                self.child_items = []
                if parent_item:
@@ -517,7 +517,7 @@ class CallGraphLevelTwoPlusItemBase(CallGraphLevelItemBase):
                self.time = time
 
        def Select(self):
-               self.query_done = True;
+               self.query_done = True
                query = QSqlQuery(self.glb.db)
                if self.params.have_ipc:
                        ipc_str = ", SUM(insn_count), SUM(cyc_count)"
@@ -604,7 +604,7 @@ class CallGraphLevelOneItem(CallGraphLevelItemBase):
                self.dbid = comm_id
 
        def Select(self):
-               self.query_done = True;
+               self.query_done = True
                query = QSqlQuery(self.glb.db)
                QueryExec(query, "SELECT thread_id, pid, tid"
                                        " FROM comm_threads"
@@ -622,9 +622,12 @@ class CallGraphRootItem(CallGraphLevelItemBase):
        def __init__(self, glb, params):
                super(CallGraphRootItem, self).__init__(glb, params, 0, None)
                self.dbid = 0
-               self.query_done = True;
+               self.query_done = True
+               if_has_calls = ""
+               if IsSelectable(glb.db, "comms", columns = "has_calls"):
+                       if_has_calls = " WHERE has_calls = TRUE"
                query = QSqlQuery(glb.db)
-               QueryExec(query, "SELECT id, comm FROM comms")
+               QueryExec(query, "SELECT id, comm FROM comms" + if_has_calls)
                while query.next():
                        if not query.value(0):
                                continue
@@ -793,7 +796,7 @@ class CallTreeLevelTwoPlusItemBase(CallGraphLevelItemBase):
                self.time = time
 
        def Select(self):
-               self.query_done = True;
+               self.query_done = True
                if self.calls_id == 0:
                        comm_thread = " AND comm_id = " + str(self.comm_id) + " AND thread_id = " + str(self.thread_id)
                else:
@@ -881,7 +884,7 @@ class CallTreeLevelOneItem(CallGraphLevelItemBase):
                self.dbid = comm_id
 
        def Select(self):
-               self.query_done = True;
+               self.query_done = True
                query = QSqlQuery(self.glb.db)
                QueryExec(query, "SELECT thread_id, pid, tid"
                                        " FROM comm_threads"
@@ -899,9 +902,12 @@ class CallTreeRootItem(CallGraphLevelItemBase):
        def __init__(self, glb, params):
                super(CallTreeRootItem, self).__init__(glb, params, 0, None)
                self.dbid = 0
-               self.query_done = True;
+               self.query_done = True
+               if_has_calls = ""
+               if IsSelectable(glb.db, "comms", columns = "has_calls"):
+                       if_has_calls = " WHERE has_calls = TRUE"
                query = QSqlQuery(glb.db)
-               QueryExec(query, "SELECT id, comm FROM comms")
+               QueryExec(query, "SELECT id, comm FROM comms" + if_has_calls)
                while query.next():
                        if not query.value(0):
                                continue
@@ -971,7 +977,7 @@ class VBox():
 
        def __init__(self, w1, w2, w3=None):
                self.vbox = QWidget()
-               self.vbox.setLayout(QVBoxLayout());
+               self.vbox.setLayout(QVBoxLayout())
 
                self.vbox.layout().setContentsMargins(0, 0, 0, 0)
 
@@ -1391,7 +1397,7 @@ class FetchMoreRecordsBar():
                self.hbox.addWidget(self.close_button)
 
                self.bar = QWidget()
-               self.bar.setLayout(self.hbox);
+               self.bar.setLayout(self.hbox)
                self.bar.show()
 
                self.in_progress = False
@@ -2206,7 +2212,7 @@ class ReportDialogBase(QDialog):
                self.vbox.addLayout(self.grid)
                self.vbox.addLayout(self.hbox)
 
-               self.setLayout(self.vbox);
+               self.setLayout(self.vbox)
 
        def Ok(self):
                vars = self.report_vars
@@ -3139,7 +3145,7 @@ class AboutDialog(QDialog):
                self.vbox = QVBoxLayout()
                self.vbox.addWidget(self.text)
 
-               self.setLayout(self.vbox);
+               self.setLayout(self.vbox)
 
 # Font resize
 
index 66a82badc1d10d7500c704f4b3a8201887279e11..c3bec9d2c20101abab7e17d3324141524801e110 100644 (file)
@@ -21,6 +21,7 @@
 #include <subcmd/parse-options.h>
 #include "string2.h"
 #include "symbol.h"
+#include "util/rlimit.h"
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <subcmd/exec-cmd.h>
@@ -727,6 +728,11 @@ int cmd_test(int argc, const char **argv)
 
        if (skip != NULL)
                skiplist = intlist__new(skip);
+       /*
+        * Tests that create BPF maps, for instance, need more than the 64K
+        * default:
+        */
+       rlimit__bump_memlock();
 
        return __cmd_test(argc, argv, skiplist);
 }
index d7e3b008a6133a7e821ab9f1e52d42aef5c5ae8a..14f812bb07a7856b640468ae0ece5c8ec14e3d2b 100644 (file)
@@ -20,6 +20,7 @@ perf-y += parse-events.o
 perf-y += perf_regs.o
 perf-y += path.o
 perf-y += print_binary.o
+perf-y += rlimit.o
 perf-y += argv_split.o
 perf-y += rbtree.o
 perf-y += libstring.o
index 67b88b599a538b7bd4ae1dd248100a66820405b6..3d1c34fc4d68b92c05b1f3cff97d11af9e1ec9b0 100644 (file)
@@ -2460,7 +2460,7 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
 
                /* Something went wrong, no need to continue */
                if (!inode) {
-                       err = PTR_ERR(inode);
+                       err = -ENOMEM;
                        goto err_free_metadata;
                }
 
@@ -2517,8 +2517,10 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
        session->auxtrace = &etm->auxtrace;
 
        etm->unknown_thread = thread__new(999999999, 999999999);
-       if (!etm->unknown_thread)
+       if (!etm->unknown_thread) {
+               err = -ENOMEM;
                goto err_free_queues;
+       }
 
        /*
         * Initialize list node so that at thread__zput() we can avoid
@@ -2530,8 +2532,10 @@ int cs_etm__process_auxtrace_info(union perf_event *event,
        if (err)
                goto err_delete_thread;
 
-       if (thread__init_map_groups(etm->unknown_thread, etm->machine))
+       if (thread__init_map_groups(etm->unknown_thread, etm->machine)) {
+               err = -ENOMEM;
                goto err_delete_thread;
+       }
 
        if (dump_trace) {
                cs_etm__print_auxtrace_info(auxtrace_info->priv, num_cpu);
@@ -2575,5 +2579,5 @@ err_free_traceid_list:
 err_free_hdr:
        zfree(&hdr);
 
-       return -EINVAL;
+       return err;
 }
index 2394c7506abe111ec21bbdea52d946c5a4866b99..ffbb3e7d3288ebad1972084d7cbdc0cee62ca3fb 100644 (file)
 #include "db-export.h"
 #include <linux/zalloc.h>
 
-struct deferred_export {
-       struct list_head node;
-       struct comm *comm;
-};
-
-static int db_export__deferred(struct db_export *dbe)
-{
-       struct deferred_export *de;
-       int err;
-
-       while (!list_empty(&dbe->deferred)) {
-               de = list_entry(dbe->deferred.next, struct deferred_export,
-                               node);
-               err = dbe->export_comm(dbe, de->comm);
-               list_del_init(&de->node);
-               free(de);
-               if (err)
-                       return err;
-       }
-
-       return 0;
-}
-
-static void db_export__free_deferred(struct db_export *dbe)
-{
-       struct deferred_export *de;
-
-       while (!list_empty(&dbe->deferred)) {
-               de = list_entry(dbe->deferred.next, struct deferred_export,
-                               node);
-               list_del_init(&de->node);
-               free(de);
-       }
-}
-
-static int db_export__defer_comm(struct db_export *dbe, struct comm *comm)
-{
-       struct deferred_export *de;
-
-       de = zalloc(sizeof(struct deferred_export));
-       if (!de)
-               return -ENOMEM;
-
-       de->comm = comm;
-       list_add_tail(&de->node, &dbe->deferred);
-
-       return 0;
-}
-
 int db_export__init(struct db_export *dbe)
 {
        memset(dbe, 0, sizeof(struct db_export));
-       INIT_LIST_HEAD(&dbe->deferred);
        return 0;
 }
 
-int db_export__flush(struct db_export *dbe)
-{
-       return db_export__deferred(dbe);
-}
-
 void db_export__exit(struct db_export *dbe)
 {
-       db_export__free_deferred(dbe);
        call_return_processor__free(dbe->crp);
        dbe->crp = NULL;
 }
@@ -115,71 +59,73 @@ int db_export__machine(struct db_export *dbe, struct machine *machine)
 }
 
 int db_export__thread(struct db_export *dbe, struct thread *thread,
-                     struct machine *machine, struct comm *comm)
+                     struct machine *machine, struct thread *main_thread)
 {
-       struct thread *main_thread;
        u64 main_thread_db_id = 0;
-       int err;
 
        if (thread->db_id)
                return 0;
 
        thread->db_id = ++dbe->thread_last_db_id;
 
-       if (thread->pid_ != -1) {
-               if (thread->pid_ == thread->tid) {
-                       main_thread = thread;
-               } else {
-                       main_thread = machine__findnew_thread(machine,
-                                                             thread->pid_,
-                                                             thread->pid_);
-                       if (!main_thread)
-                               return -ENOMEM;
-                       err = db_export__thread(dbe, main_thread, machine,
-                                               comm);
-                       if (err)
-                               goto out_put;
-                       if (comm) {
-                               err = db_export__comm_thread(dbe, comm, thread);
-                               if (err)
-                                       goto out_put;
-                       }
-               }
+       if (main_thread)
                main_thread_db_id = main_thread->db_id;
-               if (main_thread != thread)
-                       thread__put(main_thread);
-       }
 
        if (dbe->export_thread)
                return dbe->export_thread(dbe, thread, main_thread_db_id,
                                          machine);
 
        return 0;
+}
 
-out_put:
-       thread__put(main_thread);
-       return err;
+static int __db_export__comm(struct db_export *dbe, struct comm *comm,
+                            struct thread *thread)
+{
+       comm->db_id = ++dbe->comm_last_db_id;
+
+       if (dbe->export_comm)
+               return dbe->export_comm(dbe, comm, thread);
+
+       return 0;
 }
 
 int db_export__comm(struct db_export *dbe, struct comm *comm,
-                   struct thread *main_thread)
+                   struct thread *thread)
+{
+       if (comm->db_id)
+               return 0;
+
+       return __db_export__comm(dbe, comm, thread);
+}
+
+/*
+ * Export the "exec" comm. The "exec" comm is the program / application command
+ * name at the time it first executes. It is used to group threads for the same
+ * program. Note that the main thread pid (or thread group id tgid) cannot be
+ * used because it does not change when a new program is exec'ed.
+ */
+int db_export__exec_comm(struct db_export *dbe, struct comm *comm,
+                        struct thread *main_thread)
 {
        int err;
 
        if (comm->db_id)
                return 0;
 
-       comm->db_id = ++dbe->comm_last_db_id;
-
-       if (dbe->export_comm) {
-               if (main_thread->comm_set)
-                       err = dbe->export_comm(dbe, comm);
-               else
-                       err = db_export__defer_comm(dbe, comm);
-               if (err)
-                       return err;
-       }
+       err = __db_export__comm(dbe, comm, main_thread);
+       if (err)
+               return err;
 
+       /*
+        * Record the main thread for this comm. Note that the main thread can
+        * have many "exec" comms because there will be a new one every time it
+        * exec's. An "exec" comm however will only ever have 1 main thread.
+        * That is different to any other threads for that same program because
+        * exec() will effectively kill them, so the relationship between the
+        * "exec" comm and non-main threads is 1-to-1. That is why
+        * db_export__comm_thread() is called here for the main thread, but it
+        * is called for non-main threads when they are exported.
+        */
        return db_export__comm_thread(dbe, comm, main_thread);
 }
 
@@ -340,11 +286,65 @@ int db_export__branch_type(struct db_export *dbe, u32 branch_type,
        return 0;
 }
 
+static int db_export__threads(struct db_export *dbe, struct thread *thread,
+                             struct thread *main_thread,
+                             struct machine *machine, struct comm **comm_ptr)
+{
+       struct comm *comm = NULL;
+       struct comm *curr_comm;
+       int err;
+
+       if (main_thread) {
+               /*
+                * A thread has a reference to the main thread, so export the
+                * main thread first.
+                */
+               err = db_export__thread(dbe, main_thread, machine, main_thread);
+               if (err)
+                       return err;
+               /*
+                * Export comm before exporting the non-main thread because
+                * db_export__comm_thread() can be called further below.
+                */
+               comm = machine__thread_exec_comm(machine, main_thread);
+               if (comm) {
+                       err = db_export__exec_comm(dbe, comm, main_thread);
+                       if (err)
+                               return err;
+                       *comm_ptr = comm;
+               }
+       }
+
+       if (thread != main_thread) {
+               /*
+                * For a non-main thread, db_export__comm_thread() must be
+                * called only if thread has not previously been exported.
+                */
+               bool export_comm_thread = comm && !thread->db_id;
+
+               err = db_export__thread(dbe, thread, machine, main_thread);
+               if (err)
+                       return err;
+
+               if (export_comm_thread) {
+                       err = db_export__comm_thread(dbe, comm, thread);
+                       if (err)
+                               return err;
+               }
+       }
+
+       curr_comm = thread__comm(thread);
+       if (curr_comm)
+               return db_export__comm(dbe, curr_comm, thread);
+
+       return 0;
+}
+
 int db_export__sample(struct db_export *dbe, union perf_event *event,
                      struct perf_sample *sample, struct perf_evsel *evsel,
                      struct addr_location *al)
 {
-       struct threadthread = al->thread;
+       struct thread *thread = al->thread;
        struct export_sample es = {
                .event = event,
                .sample = sample,
@@ -364,19 +364,13 @@ int db_export__sample(struct db_export *dbe, union perf_event *event,
                return err;
 
        main_thread = thread__main_thread(al->machine, thread);
-       if (main_thread)
-               comm = machine__thread_exec_comm(al->machine, main_thread);
 
-       err = db_export__thread(dbe, thread, al->machine, comm);
+       err = db_export__threads(dbe, thread, main_thread, al->machine, &comm);
        if (err)
                goto out_put;
 
-       if (comm) {
-               err = db_export__comm(dbe, comm, main_thread);
-               if (err)
-                       goto out_put;
+       if (comm)
                es.comm_db_id = comm->db_id;
-       }
 
        es.db_id = ++dbe->sample_last_db_id;
 
@@ -525,3 +519,92 @@ int db_export__call_return(struct db_export *dbe, struct call_return *cr,
 
        return 0;
 }
+
+static int db_export__pid_tid(struct db_export *dbe, struct machine *machine,
+                             pid_t pid, pid_t tid, u64 *db_id,
+                             struct comm **comm_ptr, bool *is_idle)
+{
+       struct thread *thread = machine__find_thread(machine, pid, tid);
+       struct thread *main_thread;
+       int err = 0;
+
+       if (!thread || !thread->comm_set)
+               goto out_put;
+
+       *is_idle = !thread->pid_ && !thread->tid;
+
+       main_thread = thread__main_thread(machine, thread);
+
+       err = db_export__threads(dbe, thread, main_thread, machine, comm_ptr);
+
+       *db_id = thread->db_id;
+
+       thread__put(main_thread);
+out_put:
+       thread__put(thread);
+
+       return err;
+}
+
+int db_export__switch(struct db_export *dbe, union perf_event *event,
+                     struct perf_sample *sample, struct machine *machine)
+{
+       bool out = event->header.misc & PERF_RECORD_MISC_SWITCH_OUT;
+       bool out_preempt = out &&
+               (event->header.misc & PERF_RECORD_MISC_SWITCH_OUT_PREEMPT);
+       int flags = out | (out_preempt << 1);
+       bool is_idle_a = false, is_idle_b = false;
+       u64 th_a_id = 0, th_b_id = 0;
+       u64 comm_out_id, comm_in_id;
+       struct comm *comm_a = NULL;
+       struct comm *comm_b = NULL;
+       u64 th_out_id, th_in_id;
+       u64 db_id;
+       int err;
+
+       err = db_export__machine(dbe, machine);
+       if (err)
+               return err;
+
+       err = db_export__pid_tid(dbe, machine, sample->pid, sample->tid,
+                                &th_a_id, &comm_a, &is_idle_a);
+       if (err)
+               return err;
+
+       if (event->header.type == PERF_RECORD_SWITCH_CPU_WIDE) {
+               pid_t pid = event->context_switch.next_prev_pid;
+               pid_t tid = event->context_switch.next_prev_tid;
+
+               err = db_export__pid_tid(dbe, machine, pid, tid, &th_b_id,
+                                        &comm_b, &is_idle_b);
+               if (err)
+                       return err;
+       }
+
+       /*
+        * Do not export if both threads are unknown (i.e. not being traced),
+        * or one is unknown and the other is the idle task.
+        */
+       if ((!th_a_id || is_idle_a) && (!th_b_id || is_idle_b))
+               return 0;
+
+       db_id = ++dbe->context_switch_last_db_id;
+
+       if (out) {
+               th_out_id   = th_a_id;
+               th_in_id    = th_b_id;
+               comm_out_id = comm_a ? comm_a->db_id : 0;
+               comm_in_id  = comm_b ? comm_b->db_id : 0;
+       } else {
+               th_out_id   = th_b_id;
+               th_in_id    = th_a_id;
+               comm_out_id = comm_b ? comm_b->db_id : 0;
+               comm_in_id  = comm_a ? comm_a->db_id : 0;
+       }
+
+       if (dbe->export_context_switch)
+               return dbe->export_context_switch(dbe, db_id, machine, sample,
+                                                 th_out_id, comm_out_id,
+                                                 th_in_id, comm_in_id, flags);
+       return 0;
+}
index e8a64028a3861509e063827470d351eb9407d8b8..ba1f62a5fe10b3f9c962e49eb6b63b72b7240504 100644 (file)
@@ -43,7 +43,8 @@ struct db_export {
        int (*export_machine)(struct db_export *dbe, struct machine *machine);
        int (*export_thread)(struct db_export *dbe, struct thread *thread,
                             u64 main_thread_db_id, struct machine *machine);
-       int (*export_comm)(struct db_export *dbe, struct comm *comm);
+       int (*export_comm)(struct db_export *dbe, struct comm *comm,
+                          struct thread *thread);
        int (*export_comm_thread)(struct db_export *dbe, u64 db_id,
                                  struct comm *comm, struct thread *thread);
        int (*export_dso)(struct db_export *dbe, struct dso *dso,
@@ -56,6 +57,11 @@ struct db_export {
        int (*export_call_path)(struct db_export *dbe, struct call_path *cp);
        int (*export_call_return)(struct db_export *dbe,
                                  struct call_return *cr);
+       int (*export_context_switch)(struct db_export *dbe, u64 db_id,
+                                    struct machine *machine,
+                                    struct perf_sample *sample,
+                                    u64 th_out_id, u64 comm_out_id,
+                                    u64 th_in_id, u64 comm_in_id, int flags);
        struct call_return_processor *crp;
        struct call_path_root *cpr;
        u64 evsel_last_db_id;
@@ -68,18 +74,19 @@ struct db_export {
        u64 sample_last_db_id;
        u64 call_path_last_db_id;
        u64 call_return_last_db_id;
-       struct list_head deferred;
+       u64 context_switch_last_db_id;
 };
 
 int db_export__init(struct db_export *dbe);
-int db_export__flush(struct db_export *dbe);
 void db_export__exit(struct db_export *dbe);
 int db_export__evsel(struct db_export *dbe, struct perf_evsel *evsel);
 int db_export__machine(struct db_export *dbe, struct machine *machine);
 int db_export__thread(struct db_export *dbe, struct thread *thread,
-                     struct machine *machine, struct comm *comm);
+                     struct machine *machine, struct thread *main_thread);
 int db_export__comm(struct db_export *dbe, struct comm *comm,
-                   struct thread *main_thread);
+                   struct thread *thread);
+int db_export__exec_comm(struct db_export *dbe, struct comm *comm,
+                        struct thread *main_thread);
 int db_export__comm_thread(struct db_export *dbe, struct comm *comm,
                           struct thread *thread);
 int db_export__dso(struct db_export *dbe, struct dso *dso,
@@ -97,5 +104,7 @@ int db_export__branch_types(struct db_export *dbe);
 int db_export__call_path(struct db_export *dbe, struct call_path *cp);
 int db_export__call_return(struct db_export *dbe, struct call_return *cr,
                           u64 *parent_db_id);
+int db_export__switch(struct db_export *dbe, union perf_event *event,
+                     struct perf_sample *sample, struct machine *machine);
 
 #endif
diff --git a/tools/perf/util/rlimit.c b/tools/perf/util/rlimit.c
new file mode 100644 (file)
index 0000000..13521d3
--- /dev/null
@@ -0,0 +1,29 @@
+/* SPDX-License-Identifier: LGPL-2.1 */
+
+#include "util/debug.h"
+#include "util/rlimit.h"
+#include <sys/time.h>
+#include <sys/resource.h>
+
+/*
+ * Bump the memlock so that we can get bpf maps of a reasonable size,
+ * like the ones used with 'perf trace' and with 'perf test bpf',
+ * improve this to some specific request if needed.
+ */
+void rlimit__bump_memlock(void)
+{
+       struct rlimit rlim;
+
+       if (getrlimit(RLIMIT_MEMLOCK, &rlim) == 0) {
+               rlim.rlim_cur *= 4;
+               rlim.rlim_max *= 4;
+
+               if (setrlimit(RLIMIT_MEMLOCK, &rlim) < 0) {
+                       rlim.rlim_cur /= 2;
+                       rlim.rlim_max /= 2;
+
+                       if (setrlimit(RLIMIT_MEMLOCK, &rlim) < 0)
+                               pr_debug("Couldn't bump rlimit(MEMLOCK), failures may take place when creating BPF maps, etc\n");
+               }
+       }
+}
diff --git a/tools/perf/util/rlimit.h b/tools/perf/util/rlimit.h
new file mode 100644 (file)
index 0000000..9f59d8e
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __PERF_RLIMIT_H_
+#define __PERF_RLIMIT_H_
+/* SPDX-License-Identifier: LGPL-2.1 */
+
+void rlimit__bump_memlock(void);
+#endif // __PERF_RLIMIT_H_
index 112bed65232f6a28891a129fce93e9cc99842bf8..25dc1d765553bede8f33cee4f505777e23020053 100644 (file)
@@ -113,6 +113,7 @@ struct tables {
        PyObject                *call_path_handler;
        PyObject                *call_return_handler;
        PyObject                *synth_handler;
+       PyObject                *context_switch_handler;
        bool                    db_export_mode;
 };
 
@@ -1011,15 +1012,19 @@ static int python_export_thread(struct db_export *dbe, struct thread *thread,
        return 0;
 }
 
-static int python_export_comm(struct db_export *dbe, struct comm *comm)
+static int python_export_comm(struct db_export *dbe, struct comm *comm,
+                             struct thread *thread)
 {
        struct tables *tables = container_of(dbe, struct tables, dbe);
        PyObject *t;
 
-       t = tuple_new(2);
+       t = tuple_new(5);
 
        tuple_set_u64(t, 0, comm->db_id);
        tuple_set_string(t, 1, comm__str(comm));
+       tuple_set_u64(t, 2, thread->db_id);
+       tuple_set_u64(t, 3, comm->start);
+       tuple_set_s32(t, 4, comm->exec);
 
        call_object(tables->comm_handler, t, "comm_table");
 
@@ -1233,6 +1238,34 @@ static int python_export_call_return(struct db_export *dbe,
        return 0;
 }
 
+static int python_export_context_switch(struct db_export *dbe, u64 db_id,
+                                       struct machine *machine,
+                                       struct perf_sample *sample,
+                                       u64 th_out_id, u64 comm_out_id,
+                                       u64 th_in_id, u64 comm_in_id, int flags)
+{
+       struct tables *tables = container_of(dbe, struct tables, dbe);
+       PyObject *t;
+
+       t = tuple_new(9);
+
+       tuple_set_u64(t, 0, db_id);
+       tuple_set_u64(t, 1, machine->db_id);
+       tuple_set_u64(t, 2, sample->time);
+       tuple_set_s32(t, 3, sample->cpu);
+       tuple_set_u64(t, 4, th_out_id);
+       tuple_set_u64(t, 5, comm_out_id);
+       tuple_set_u64(t, 6, th_in_id);
+       tuple_set_u64(t, 7, comm_in_id);
+       tuple_set_s32(t, 8, flags);
+
+       call_object(tables->context_switch_handler, t, "context_switch");
+
+       Py_DECREF(t);
+
+       return 0;
+}
+
 static int python_process_call_return(struct call_return *cr, u64 *parent_db_id,
                                      void *data)
 {
@@ -1296,6 +1329,16 @@ static void python_process_event(union perf_event *event,
        }
 }
 
+static void python_process_switch(union perf_event *event,
+                                 struct perf_sample *sample,
+                                 struct machine *machine)
+{
+       struct tables *tables = &tables_global;
+
+       if (tables->db_export_mode)
+               db_export__switch(&tables->dbe, event, sample, machine);
+}
+
 static void get_handler_name(char *str, size_t size,
                             struct perf_evsel *evsel)
 {
@@ -1511,6 +1554,7 @@ static void set_table_handlers(struct tables *tables)
        SET_TABLE_HANDLER(sample);
        SET_TABLE_HANDLER(call_path);
        SET_TABLE_HANDLER(call_return);
+       SET_TABLE_HANDLER(context_switch);
 
        /*
         * Synthesized events are samples but with architecture-specific data
@@ -1620,9 +1664,7 @@ error:
 
 static int python_flush_script(void)
 {
-       struct tables *tables = &tables_global;
-
-       return db_export__flush(&tables->dbe);
+       return 0;
 }
 
 /*
@@ -1831,6 +1873,7 @@ struct scripting_ops python_scripting_ops = {
        .flush_script           = python_flush_script,
        .stop_script            = python_stop_script,
        .process_event          = python_process_event,
+       .process_switch         = python_process_switch,
        .process_stat           = python_process_stat,
        .process_stat_interval  = python_process_stat_interval,
        .generate_script        = python_generate_script,
index d9b0a942090a74f59f828edb22ec3cc33a7d45ce..c7002fe116733cfd3de5719ff4beeeca15117bc1 100644 (file)
@@ -81,6 +81,9 @@ struct scripting_ops {
                               struct perf_sample *sample,
                               struct perf_evsel *evsel,
                               struct addr_location *al);
+       void (*process_switch)(union perf_event *event,
+                              struct perf_sample *sample,
+                              struct machine *machine);
        void (*process_stat)(struct perf_stat_config *config,
                             struct perf_evsel *evsel, u64 tstamp);
        void (*process_stat_interval)(u64 tstamp);
index c23e5a6ceb7e0f41267c72324e756009ce0fb55d..7b5c43684be1273a90e5cac3715d10fc65fd71d6 100644 (file)
@@ -12,8 +12,8 @@ default:
        $(MAKE) -C $(KDIR) M=$(CURDIR)
 
 clean:
-       - rm -rf *.o *.ko .tmp-versions .*.cmd .*.mod.* *.mod.c
-       - rm -rf .tmp_versions* Module.symvers modules.order
+       - rm -rf *.o *.ko .*.cmd .*.mod.* *.mod.c
+       - rm -rf Module.symvers modules.order
 
 install: default
        install -d $(KMISC)
index 5aeaa284fc47493decf0fc55b31de7c8a734ac6d..a680628204108b41d0c046a5371cec9f2cfedc0b 100644 (file)
@@ -41,8 +41,7 @@ int sendmsg_v6_prog(struct bpf_sock_addr *ctx)
        }
 
        /* Rewrite destination. */
-       if ((ctx->user_ip6[0] & 0xFFFF) == bpf_htons(0xFACE) &&
-            ctx->user_ip6[0] >> 16 == bpf_htons(0xB00C)) {
+       if (ctx->user_ip6[0] == bpf_htonl(0xFACEB00C)) {
                ctx->user_ip6[0] = bpf_htonl(DST_REWRITE_IP6_0);
                ctx->user_ip6[1] = bpf_htonl(DST_REWRITE_IP6_1);
                ctx->user_ip6[2] = bpf_htonl(DST_REWRITE_IP6_2);
index b0fda2877119c4af08277bd0f329f238c193313c..d438193804b212ffa80c94be47e8c1aca392181e 100644 (file)
        .result = ACCEPT,
        .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
 },
+{
+       "read gso_segs from CGROUP_SKB",
+       .insns = {
+       BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
+                   offsetof(struct __sk_buff, gso_segs)),
+       BPF_MOV64_IMM(BPF_REG_0, 0),
+       BPF_EXIT_INSN(),
+       },
+       .result = ACCEPT,
+       .prog_type = BPF_PROG_TYPE_CGROUP_SKB,
+},
 {
        "write gso_segs from CGROUP_SKB",
        .insns = {
index 62afd0b43074fd92d5d083219225741f52a70c48..ba784975198945779f1c7de408128be062d221a8 100644 (file)
@@ -10,11 +10,11 @@ UNAME_M := $(shell uname -m)
 LIBKVM = lib/assert.c lib/elf.c lib/io.c lib/kvm_util.c lib/ucall.c lib/sparsebit.c
 LIBKVM_x86_64 = lib/x86_64/processor.c lib/x86_64/vmx.c
 LIBKVM_aarch64 = lib/aarch64/processor.c
+LIBKVM_s390x = lib/s390x/processor.c
 
 TEST_GEN_PROGS_x86_64 = x86_64/cr4_cpuid_sync_test
 TEST_GEN_PROGS_x86_64 += x86_64/evmcs_test
 TEST_GEN_PROGS_x86_64 += x86_64/hyperv_cpuid
-TEST_GEN_PROGS_x86_64 += x86_64/kvm_create_max_vcpus
 TEST_GEN_PROGS_x86_64 += x86_64/mmio_warning_test
 TEST_GEN_PROGS_x86_64 += x86_64/platform_info_test
 TEST_GEN_PROGS_x86_64 += x86_64/set_sregs_test
@@ -26,9 +26,14 @@ TEST_GEN_PROGS_x86_64 += x86_64/vmx_set_nested_state_test
 TEST_GEN_PROGS_x86_64 += x86_64/vmx_tsc_adjust_test
 TEST_GEN_PROGS_x86_64 += clear_dirty_log_test
 TEST_GEN_PROGS_x86_64 += dirty_log_test
+TEST_GEN_PROGS_x86_64 += kvm_create_max_vcpus
 
 TEST_GEN_PROGS_aarch64 += clear_dirty_log_test
 TEST_GEN_PROGS_aarch64 += dirty_log_test
+TEST_GEN_PROGS_aarch64 += kvm_create_max_vcpus
+
+TEST_GEN_PROGS_s390x += s390x/sync_regs_test
+TEST_GEN_PROGS_s390x += kvm_create_max_vcpus
 
 TEST_GEN_PROGS += $(TEST_GEN_PROGS_$(UNAME_M))
 LIBKVM += $(LIBKVM_$(UNAME_M))
@@ -43,7 +48,12 @@ CFLAGS += -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99 \
 no-pie-option := $(call try-run, echo 'int main() { return 0; }' | \
         $(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -no-pie -x c - -o "$$TMP", -no-pie)
 
-LDFLAGS += -pthread $(no-pie-option)
+# On s390, build the testcases KVM-enabled
+pgste-option = $(call try-run, echo 'int main() { return 0; }' | \
+       $(CC) -Werror -Wl$(comma)--s390-pgste -x c - -o "$$TMP",-Wl$(comma)--s390-pgste)
+
+
+LDFLAGS += -pthread $(no-pie-option) $(pgste-option)
 
 # After inclusion, $(OUTPUT) is defined and
 # $(TEST_GEN_PROGS) starts with $(OUTPUT)/
index 00235f5932f04b5b9a11d396168a4cf8418539e5..e0e66b115ef295a85407507d09c28470e582b0b7 100644 (file)
@@ -41,6 +41,12 @@ enum vm_guest_mode {
        NUM_VM_MODES,
 };
 
+#ifdef __aarch64__
+#define VM_MODE_DEFAULT VM_MODE_P40V48_4K
+#else
+#define VM_MODE_DEFAULT VM_MODE_P52V48_4K
+#endif
+
 #define vm_guest_mode_string(m) vm_guest_mode_string[m]
 extern const char * const vm_guest_mode_string[];
 
@@ -111,10 +117,12 @@ void vcpu_sregs_set(struct kvm_vm *vm, uint32_t vcpuid,
                    struct kvm_sregs *sregs);
 int _vcpu_sregs_set(struct kvm_vm *vm, uint32_t vcpuid,
                    struct kvm_sregs *sregs);
+#ifdef __KVM_HAVE_VCPU_EVENTS
 void vcpu_events_get(struct kvm_vm *vm, uint32_t vcpuid,
                     struct kvm_vcpu_events *events);
 void vcpu_events_set(struct kvm_vm *vm, uint32_t vcpuid,
                     struct kvm_vcpu_events *events);
+#endif
 #ifdef __x86_64__
 void vcpu_nested_state_get(struct kvm_vm *vm, uint32_t vcpuid,
                           struct kvm_nested_state *state);
diff --git a/tools/testing/selftests/kvm/include/s390x/processor.h b/tools/testing/selftests/kvm/include/s390x/processor.h
new file mode 100644 (file)
index 0000000..e0e96a5
--- /dev/null
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * s390x processor specific defines
+ */
+#ifndef SELFTEST_KVM_PROCESSOR_H
+#define SELFTEST_KVM_PROCESSOR_H
+
+/* Bits in the region/segment table entry */
+#define REGION_ENTRY_ORIGIN    ~0xfffUL /* region/segment table origin    */
+#define REGION_ENTRY_PROTECT   0x200    /* region protection bit          */
+#define REGION_ENTRY_NOEXEC    0x100    /* region no-execute bit          */
+#define REGION_ENTRY_OFFSET    0xc0     /* region table offset            */
+#define REGION_ENTRY_INVALID   0x20     /* invalid region table entry     */
+#define REGION_ENTRY_TYPE      0x0c     /* region/segment table type mask */
+#define REGION_ENTRY_LENGTH    0x03     /* region third length            */
+
+/* Bits in the page table entry */
+#define PAGE_INVALID   0x400           /* HW invalid bit    */
+#define PAGE_PROTECT   0x200           /* HW read-only bit  */
+#define PAGE_NOEXEC    0x100           /* HW no-execute bit */
+
+#endif
similarity index 95%
rename from tools/testing/selftests/kvm/x86_64/kvm_create_max_vcpus.c
rename to tools/testing/selftests/kvm/kvm_create_max_vcpus.c
index 429226bc6a928392f043f5aeda3a3ed8c11830aa..231d79e57774e6e3633e7bd2792158ce9f2eac19 100644 (file)
@@ -27,7 +27,7 @@ void test_vcpu_creation(int first_vcpu_id, int num_vcpus)
        printf("Testing creating %d vCPUs, with IDs %d...%d.\n",
               num_vcpus, first_vcpu_id, first_vcpu_id + num_vcpus - 1);
 
-       vm = vm_create(VM_MODE_P52V48_4K, DEFAULT_GUEST_PHY_PAGES, O_RDWR);
+       vm = vm_create(VM_MODE_DEFAULT, DEFAULT_GUEST_PHY_PAGES, O_RDWR);
 
        for (i = 0; i < num_vcpus; i++) {
                int vcpu_id = first_vcpu_id + i;
index af2023d818a5a9dcaee4b08367d2b0557d440048..486400a973744342a9fb28c374308057e0c97246 100644 (file)
@@ -227,7 +227,7 @@ struct kvm_vm *vm_create_default(uint32_t vcpuid, uint64_t extra_mem_pages,
        uint64_t extra_pg_pages = (extra_mem_pages / ptrs_per_4k_pte) * 2;
        struct kvm_vm *vm;
 
-       vm = vm_create(VM_MODE_P40V48_4K, DEFAULT_GUEST_PHY_PAGES + extra_pg_pages, O_RDWR);
+       vm = vm_create(VM_MODE_DEFAULT, DEFAULT_GUEST_PHY_PAGES + extra_pg_pages, O_RDWR);
 
        kvm_vm_elf_load(vm, program_invocation_name, 0, 0);
        vm_vcpu_add_default(vm, vcpuid, guest_code);
index 221e3fa4668024843e183549d1acecabfd2076d9..6e49bb039376146dc822219caced6be83c1878d7 100644 (file)
@@ -556,6 +556,7 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm,
        int ret;
        struct userspace_mem_region *region;
        size_t huge_page_size = KVM_UTIL_PGS_PER_HUGEPG * vm->page_size;
+       size_t alignment;
 
        TEST_ASSERT((guest_paddr % vm->page_size) == 0, "Guest physical "
                "address not on a page boundary.\n"
@@ -605,9 +606,20 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm,
        TEST_ASSERT(region != NULL, "Insufficient Memory");
        region->mmap_size = npages * vm->page_size;
 
-       /* Enough memory to align up to a huge page. */
+#ifdef __s390x__
+       /* On s390x, the host address must be aligned to 1M (due to PGSTEs) */
+       alignment = 0x100000;
+#else
+       alignment = 1;
+#endif
+
        if (src_type == VM_MEM_SRC_ANONYMOUS_THP)
-               region->mmap_size += huge_page_size;
+               alignment = max(huge_page_size, alignment);
+
+       /* Add enough memory to align up if necessary */
+       if (alignment > 1)
+               region->mmap_size += alignment;
+
        region->mmap_start = mmap(NULL, region->mmap_size,
                                  PROT_READ | PROT_WRITE,
                                  MAP_PRIVATE | MAP_ANONYMOUS
@@ -617,9 +629,8 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm,
                    "test_malloc failed, mmap_start: %p errno: %i",
                    region->mmap_start, errno);
 
-       /* Align THP allocation up to start of a huge page. */
-       region->host_mem = align(region->mmap_start,
-                                src_type == VM_MEM_SRC_ANONYMOUS_THP ?  huge_page_size : 1);
+       /* Align host address */
+       region->host_mem = align(region->mmap_start, alignment);
 
        /* As needed perform madvise */
        if (src_type == VM_MEM_SRC_ANONYMOUS || src_type == VM_MEM_SRC_ANONYMOUS_THP) {
@@ -1218,6 +1229,7 @@ void vcpu_regs_set(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_regs *regs)
                ret, errno);
 }
 
+#ifdef __KVM_HAVE_VCPU_EVENTS
 void vcpu_events_get(struct kvm_vm *vm, uint32_t vcpuid,
                     struct kvm_vcpu_events *events)
 {
@@ -1243,6 +1255,7 @@ void vcpu_events_set(struct kvm_vm *vm, uint32_t vcpuid,
        TEST_ASSERT(ret == 0, "KVM_SET_VCPU_EVENTS, failed, rc: %i errno: %i",
                ret, errno);
 }
+#endif
 
 #ifdef __x86_64__
 void vcpu_nested_state_get(struct kvm_vm *vm, uint32_t vcpuid,
diff --git a/tools/testing/selftests/kvm/lib/s390x/processor.c b/tools/testing/selftests/kvm/lib/s390x/processor.c
new file mode 100644 (file)
index 0000000..32a0236
--- /dev/null
@@ -0,0 +1,278 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * KVM selftest s390x library code - CPU-related functions (page tables...)
+ *
+ * Copyright (C) 2019, Red Hat, Inc.
+ */
+
+#define _GNU_SOURCE /* for program_invocation_name */
+
+#include "processor.h"
+#include "kvm_util.h"
+#include "../kvm_util_internal.h"
+
+#define KVM_GUEST_PAGE_TABLE_MIN_PADDR         0x180000
+
+#define PAGES_PER_REGION 4
+
+void virt_pgd_alloc(struct kvm_vm *vm, uint32_t memslot)
+{
+       vm_paddr_t paddr;
+
+       TEST_ASSERT(vm->page_size == 4096, "Unsupported page size: 0x%x",
+                   vm->page_size);
+
+       if (vm->pgd_created)
+               return;
+
+       paddr = vm_phy_pages_alloc(vm, PAGES_PER_REGION,
+                                  KVM_GUEST_PAGE_TABLE_MIN_PADDR, memslot);
+       memset(addr_gpa2hva(vm, paddr), 0xff, PAGES_PER_REGION * vm->page_size);
+
+       vm->pgd = paddr;
+       vm->pgd_created = true;
+}
+
+/*
+ * Allocate 4 pages for a region/segment table (ri < 4), or one page for
+ * a page table (ri == 4). Returns a suitable region/segment table entry
+ * which points to the freshly allocated pages.
+ */
+static uint64_t virt_alloc_region(struct kvm_vm *vm, int ri, uint32_t memslot)
+{
+       uint64_t taddr;
+
+       taddr = vm_phy_pages_alloc(vm,  ri < 4 ? PAGES_PER_REGION : 1,
+                                  KVM_GUEST_PAGE_TABLE_MIN_PADDR, memslot);
+       memset(addr_gpa2hva(vm, taddr), 0xff, PAGES_PER_REGION * vm->page_size);
+
+       return (taddr & REGION_ENTRY_ORIGIN)
+               | (((4 - ri) << 2) & REGION_ENTRY_TYPE)
+               | ((ri < 4 ? (PAGES_PER_REGION - 1) : 0) & REGION_ENTRY_LENGTH);
+}
+
+/*
+ * VM Virtual Page Map
+ *
+ * Input Args:
+ *   vm - Virtual Machine
+ *   gva - VM Virtual Address
+ *   gpa - VM Physical Address
+ *   memslot - Memory region slot for new virtual translation tables
+ *
+ * Output Args: None
+ *
+ * Return: None
+ *
+ * Within the VM given by vm, creates a virtual translation for the page
+ * starting at vaddr to the page starting at paddr.
+ */
+void virt_pg_map(struct kvm_vm *vm, uint64_t gva, uint64_t gpa,
+                uint32_t memslot)
+{
+       int ri, idx;
+       uint64_t *entry;
+
+       TEST_ASSERT((gva % vm->page_size) == 0,
+               "Virtual address not on page boundary,\n"
+               "  vaddr: 0x%lx vm->page_size: 0x%x",
+               gva, vm->page_size);
+       TEST_ASSERT(sparsebit_is_set(vm->vpages_valid,
+               (gva >> vm->page_shift)),
+               "Invalid virtual address, vaddr: 0x%lx",
+               gva);
+       TEST_ASSERT((gpa % vm->page_size) == 0,
+               "Physical address not on page boundary,\n"
+               "  paddr: 0x%lx vm->page_size: 0x%x",
+               gva, vm->page_size);
+       TEST_ASSERT((gpa >> vm->page_shift) <= vm->max_gfn,
+               "Physical address beyond beyond maximum supported,\n"
+               "  paddr: 0x%lx vm->max_gfn: 0x%lx vm->page_size: 0x%x",
+               gva, vm->max_gfn, vm->page_size);
+
+       /* Walk through region and segment tables */
+       entry = addr_gpa2hva(vm, vm->pgd);
+       for (ri = 1; ri <= 4; ri++) {
+               idx = (gva >> (64 - 11 * ri)) & 0x7ffu;
+               if (entry[idx] & REGION_ENTRY_INVALID)
+                       entry[idx] = virt_alloc_region(vm, ri, memslot);
+               entry = addr_gpa2hva(vm, entry[idx] & REGION_ENTRY_ORIGIN);
+       }
+
+       /* Fill in page table entry */
+       idx = (gva >> 12) & 0x0ffu;             /* page index */
+       if (!(entry[idx] & PAGE_INVALID))
+               fprintf(stderr,
+                       "WARNING: PTE for gpa=0x%"PRIx64" already set!\n", gpa);
+       entry[idx] = gpa;
+}
+
+/*
+ * Address Guest Virtual to Guest Physical
+ *
+ * Input Args:
+ *   vm - Virtual Machine
+ *   gpa - VM virtual address
+ *
+ * Output Args: None
+ *
+ * Return:
+ *   Equivalent VM physical address
+ *
+ * Translates the VM virtual address given by gva to a VM physical
+ * address and then locates the memory region containing the VM
+ * physical address, within the VM given by vm.  When found, the host
+ * virtual address providing the memory to the vm physical address is
+ * returned.
+ * A TEST_ASSERT failure occurs if no region containing translated
+ * VM virtual address exists.
+ */
+vm_paddr_t addr_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
+{
+       int ri, idx;
+       uint64_t *entry;
+
+       TEST_ASSERT(vm->page_size == 4096, "Unsupported page size: 0x%x",
+                   vm->page_size);
+
+       entry = addr_gpa2hva(vm, vm->pgd);
+       for (ri = 1; ri <= 4; ri++) {
+               idx = (gva >> (64 - 11 * ri)) & 0x7ffu;
+               TEST_ASSERT(!(entry[idx] & REGION_ENTRY_INVALID),
+                           "No region mapping for vm virtual address 0x%lx",
+                           gva);
+               entry = addr_gpa2hva(vm, entry[idx] & REGION_ENTRY_ORIGIN);
+       }
+
+       idx = (gva >> 12) & 0x0ffu;             /* page index */
+
+       TEST_ASSERT(!(entry[idx] & PAGE_INVALID),
+                   "No page mapping for vm virtual address 0x%lx", gva);
+
+       return (entry[idx] & ~0xffful) + (gva & 0xffful);
+}
+
+static void virt_dump_ptes(FILE *stream, struct kvm_vm *vm, uint8_t indent,
+                          uint64_t ptea_start)
+{
+       uint64_t *pte, ptea;
+
+       for (ptea = ptea_start; ptea < ptea_start + 0x100 * 8; ptea += 8) {
+               pte = addr_gpa2hva(vm, ptea);
+               if (*pte & PAGE_INVALID)
+                       continue;
+               fprintf(stream, "%*spte @ 0x%lx: 0x%016lx\n",
+                       indent, "", ptea, *pte);
+       }
+}
+
+static void virt_dump_region(FILE *stream, struct kvm_vm *vm, uint8_t indent,
+                            uint64_t reg_tab_addr)
+{
+       uint64_t addr, *entry;
+
+       for (addr = reg_tab_addr; addr < reg_tab_addr + 0x400 * 8; addr += 8) {
+               entry = addr_gpa2hva(vm, addr);
+               if (*entry & REGION_ENTRY_INVALID)
+                       continue;
+               fprintf(stream, "%*srt%lde @ 0x%lx: 0x%016lx\n",
+                       indent, "", 4 - ((*entry & REGION_ENTRY_TYPE) >> 2),
+                       addr, *entry);
+               if (*entry & REGION_ENTRY_TYPE) {
+                       virt_dump_region(stream, vm, indent + 2,
+                                        *entry & REGION_ENTRY_ORIGIN);
+               } else {
+                       virt_dump_ptes(stream, vm, indent + 2,
+                                      *entry & REGION_ENTRY_ORIGIN);
+               }
+       }
+}
+
+void virt_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
+{
+       if (!vm->pgd_created)
+               return;
+
+       virt_dump_region(stream, vm, indent, vm->pgd);
+}
+
+/*
+ * Create a VM with reasonable defaults
+ *
+ * Input Args:
+ *   vcpuid - The id of the single VCPU to add to the VM.
+ *   extra_mem_pages - The size of extra memories to add (this will
+ *                     decide how much extra space we will need to
+ *                     setup the page tables using mem slot 0)
+ *   guest_code - The vCPU's entry point
+ *
+ * Output Args: None
+ *
+ * Return:
+ *   Pointer to opaque structure that describes the created VM.
+ */
+struct kvm_vm *vm_create_default(uint32_t vcpuid, uint64_t extra_mem_pages,
+                                void *guest_code)
+{
+       /*
+        * The additional amount of pages required for the page tables is:
+        * 1 * n / 256 + 4 * (n / 256) / 2048 + 4 * (n / 256) / 2048^2 + ...
+        * which is definitely smaller than (n / 256) * 2.
+        */
+       uint64_t extra_pg_pages = extra_mem_pages / 256 * 2;
+       struct kvm_vm *vm;
+
+       vm = vm_create(VM_MODE_DEFAULT,
+                      DEFAULT_GUEST_PHY_PAGES + extra_pg_pages, O_RDWR);
+
+       kvm_vm_elf_load(vm, program_invocation_name, 0, 0);
+       vm_vcpu_add_default(vm, vcpuid, guest_code);
+
+       return vm;
+}
+
+/*
+ * Adds a vCPU with reasonable defaults (i.e. a stack and initial PSW)
+ *
+ * Input Args:
+ *   vcpuid - The id of the VCPU to add to the VM.
+ *   guest_code - The vCPU's entry point
+ */
+void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
+{
+       size_t stack_size =  DEFAULT_STACK_PGS * getpagesize();
+       uint64_t stack_vaddr;
+       struct kvm_regs regs;
+       struct kvm_sregs sregs;
+       struct kvm_run *run;
+
+       TEST_ASSERT(vm->page_size == 4096, "Unsupported page size: 0x%x",
+                   vm->page_size);
+
+       stack_vaddr = vm_vaddr_alloc(vm, stack_size,
+                                    DEFAULT_GUEST_STACK_VADDR_MIN, 0, 0);
+
+       vm_vcpu_add(vm, vcpuid);
+
+       /* Setup guest registers */
+       vcpu_regs_get(vm, vcpuid, &regs);
+       regs.gprs[15] = stack_vaddr + (DEFAULT_STACK_PGS * getpagesize()) - 160;
+       vcpu_regs_set(vm, vcpuid, &regs);
+
+       vcpu_sregs_get(vm, vcpuid, &sregs);
+       sregs.crs[0] |= 0x00040000;             /* Enable floating point regs */
+       sregs.crs[1] = vm->pgd | 0xf;           /* Primary region table */
+       vcpu_sregs_set(vm, vcpuid, &sregs);
+
+       run = vcpu_state(vm, vcpuid);
+       run->psw_mask = 0x0400000180000000ULL;  /* DAT enabled + 64 bit mode */
+       run->psw_addr = (uintptr_t)guest_code;
+}
+
+void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t indent)
+{
+       struct vcpu *vcpu = vm->vcpu_head;
+
+       fprintf(stream, "%*spstate: psw: 0x%.16llx:0x%.16llx\n",
+               indent, "", vcpu->state->psw_mask, vcpu->state->psw_addr);
+}
index b430f962e32367270ab11ff23fa11dd178b8bee5..6cb34a0fa20053f7c37d8603f921fb86c71a6dc5 100644 (file)
@@ -821,7 +821,7 @@ struct kvm_vm *vm_create_default(uint32_t vcpuid, uint64_t extra_mem_pages,
        uint64_t extra_pg_pages = extra_mem_pages / 512 * 2;
 
        /* Create VM */
-       vm = vm_create(VM_MODE_P52V48_4K,
+       vm = vm_create(VM_MODE_DEFAULT,
                       DEFAULT_GUEST_PHY_PAGES + extra_pg_pages,
                       O_RDWR);
 
index fe56d159d65fdce045716a9fc49a0a4b205aa07e..204f847bd065a66b5569c3f209c4fb3725ae5064 100644 (file)
@@ -5,8 +5,6 @@
  * Copyright (C) 2018, Google LLC.
  */
 
-#define _GNU_SOURCE /* for program_invocation_name */
-
 #include "test_util.h"
 #include "kvm_util.h"
 #include "processor.h"
diff --git a/tools/testing/selftests/kvm/s390x/sync_regs_test.c b/tools/testing/selftests/kvm/s390x/sync_regs_test.c
new file mode 100644 (file)
index 0000000..e85ff0d
--- /dev/null
@@ -0,0 +1,151 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Test for s390x KVM_CAP_SYNC_REGS
+ *
+ * Based on the same test for x86:
+ * Copyright (C) 2018, Google LLC.
+ *
+ * Adaptions for s390x:
+ * Copyright (C) 2019, Red Hat, Inc.
+ *
+ * Test expected behavior of the KVM_CAP_SYNC_REGS functionality.
+ */
+
+#define _GNU_SOURCE /* for program_invocation_short_name */
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+
+#include "test_util.h"
+#include "kvm_util.h"
+
+#define VCPU_ID 5
+
+static void guest_code(void)
+{
+       for (;;) {
+               asm volatile ("diag 0,0,0x501");
+               asm volatile ("ahi 11,1");
+       }
+}
+
+#define REG_COMPARE(reg) \
+       TEST_ASSERT(left->reg == right->reg, \
+                   "Register " #reg \
+                   " values did not match: 0x%llx, 0x%llx\n", \
+                   left->reg, right->reg)
+
+static void compare_regs(struct kvm_regs *left, struct kvm_sync_regs *right)
+{
+       int i;
+
+       for (i = 0; i < 16; i++)
+               REG_COMPARE(gprs[i]);
+}
+
+static void compare_sregs(struct kvm_sregs *left, struct kvm_sync_regs *right)
+{
+       int i;
+
+       for (i = 0; i < 16; i++)
+               REG_COMPARE(acrs[i]);
+
+       for (i = 0; i < 16; i++)
+               REG_COMPARE(crs[i]);
+}
+
+#undef REG_COMPARE
+
+#define TEST_SYNC_FIELDS   (KVM_SYNC_GPRS|KVM_SYNC_ACRS|KVM_SYNC_CRS)
+#define INVALID_SYNC_FIELD 0x80000000
+
+int main(int argc, char *argv[])
+{
+       struct kvm_vm *vm;
+       struct kvm_run *run;
+       struct kvm_regs regs;
+       struct kvm_sregs sregs;
+       int rv, cap;
+
+       /* Tell stdout not to buffer its content */
+       setbuf(stdout, NULL);
+
+       cap = kvm_check_cap(KVM_CAP_SYNC_REGS);
+       if (!cap) {
+               fprintf(stderr, "CAP_SYNC_REGS not supported, skipping test\n");
+               exit(KSFT_SKIP);
+       }
+
+       /* Create VM */
+       vm = vm_create_default(VCPU_ID, 0, guest_code);
+
+       run = vcpu_state(vm, VCPU_ID);
+
+       /* Request and verify all valid register sets. */
+       run->kvm_valid_regs = TEST_SYNC_FIELDS;
+       rv = _vcpu_run(vm, VCPU_ID);
+       TEST_ASSERT(rv == 0, "vcpu_run failed: %d\n", rv);
+       TEST_ASSERT(run->exit_reason == KVM_EXIT_S390_SIEIC,
+                   "Unexpected exit reason: %u (%s)\n",
+                   run->exit_reason,
+                   exit_reason_str(run->exit_reason));
+       TEST_ASSERT(run->s390_sieic.icptcode == 4 &&
+                   (run->s390_sieic.ipa >> 8) == 0x83 &&
+                   (run->s390_sieic.ipb >> 16) == 0x501,
+                   "Unexpected interception code: ic=%u, ipa=0x%x, ipb=0x%x\n",
+                   run->s390_sieic.icptcode, run->s390_sieic.ipa,
+                   run->s390_sieic.ipb);
+
+       vcpu_regs_get(vm, VCPU_ID, &regs);
+       compare_regs(&regs, &run->s.regs);
+
+       vcpu_sregs_get(vm, VCPU_ID, &sregs);
+       compare_sregs(&sregs, &run->s.regs);
+
+       /* Set and verify various register values */
+       run->s.regs.gprs[11] = 0xBAD1DEA;
+       run->s.regs.acrs[0] = 1 << 11;
+
+       run->kvm_valid_regs = TEST_SYNC_FIELDS;
+       run->kvm_dirty_regs = KVM_SYNC_GPRS | KVM_SYNC_ACRS;
+       rv = _vcpu_run(vm, VCPU_ID);
+       TEST_ASSERT(rv == 0, "vcpu_run failed: %d\n", rv);
+       TEST_ASSERT(run->exit_reason == KVM_EXIT_S390_SIEIC,
+                   "Unexpected exit reason: %u (%s)\n",
+                   run->exit_reason,
+                   exit_reason_str(run->exit_reason));
+       TEST_ASSERT(run->s.regs.gprs[11] == 0xBAD1DEA + 1,
+                   "r11 sync regs value incorrect 0x%llx.",
+                   run->s.regs.gprs[11]);
+       TEST_ASSERT(run->s.regs.acrs[0]  == 1 << 11,
+                   "acr0 sync regs value incorrect 0x%llx.",
+                   run->s.regs.acrs[0]);
+
+       vcpu_regs_get(vm, VCPU_ID, &regs);
+       compare_regs(&regs, &run->s.regs);
+
+       vcpu_sregs_get(vm, VCPU_ID, &sregs);
+       compare_sregs(&sregs, &run->s.regs);
+
+       /* Clear kvm_dirty_regs bits, verify new s.regs values are
+        * overwritten with existing guest values.
+        */
+       run->kvm_valid_regs = TEST_SYNC_FIELDS;
+       run->kvm_dirty_regs = 0;
+       run->s.regs.gprs[11] = 0xDEADBEEF;
+       rv = _vcpu_run(vm, VCPU_ID);
+       TEST_ASSERT(rv == 0, "vcpu_run failed: %d\n", rv);
+       TEST_ASSERT(run->exit_reason == KVM_EXIT_S390_SIEIC,
+                   "Unexpected exit reason: %u (%s)\n",
+                   run->exit_reason,
+                   exit_reason_str(run->exit_reason));
+       TEST_ASSERT(run->s.regs.gprs[11] != 0xDEADBEEF,
+                   "r11 sync regs value incorrect 0x%llx.",
+                   run->s.regs.gprs[11]);
+
+       kvm_vm_free(vm);
+
+       return 0;
+}
index 4ce0bc1612f5495444d72f678d6368d54e6a10c1..c7cced739c34bcada309cae1ce7607af04637887 100644 (file)
@@ -17,7 +17,7 @@ tcp_inq
 tls
 txring_overwrite
 ip_defrag
+ipv6_flowlabel
+ipv6_flowlabel_mgr
 so_txtime
-flowlabel
-flowlabel_mgr
 tcp_fastopen_backup_key
index cca2baa03fb81b12f393a1df566dbe0494cabe27..a8d8e8b3dc819f3abc90060eaa0d312632c2145f 100755 (executable)
@@ -93,18 +93,10 @@ sw1_create()
        ip route add vrf v$ol1 192.0.2.16/28 \
           nexthop dev g1a \
           nexthop dev g1b
-
-       tc qdisc add dev $ul1 clsact
-       tc filter add dev $ul1 egress pref 111 prot ipv4 \
-          flower dst_ip 192.0.2.66 action pass
-       tc filter add dev $ul1 egress pref 222 prot ipv4 \
-          flower dst_ip 192.0.2.82 action pass
 }
 
 sw1_destroy()
 {
-       tc qdisc del dev $ul1 clsact
-
        ip route del vrf v$ol1 192.0.2.16/28
 
        ip route del vrf v$ol1 192.0.2.82/32 via 192.0.2.146
@@ -139,10 +131,18 @@ sw2_create()
        ip route add vrf v$ol2 192.0.2.0/28 \
           nexthop dev g2a \
           nexthop dev g2b
+
+       tc qdisc add dev $ul2 clsact
+       tc filter add dev $ul2 ingress pref 111 prot 802.1Q \
+          flower vlan_id 111 action pass
+       tc filter add dev $ul2 ingress pref 222 prot 802.1Q \
+          flower vlan_id 222 action pass
 }
 
 sw2_destroy()
 {
+       tc qdisc del dev $ul2 clsact
+
        ip route del vrf v$ol2 192.0.2.0/28
 
        ip route del vrf v$ol2 192.0.2.81/32 via 192.0.2.145
@@ -187,12 +187,16 @@ setup_prepare()
        sw1_create
        sw2_create
        h2_create
+
+       forwarding_enable
 }
 
 cleanup()
 {
        pre_cleanup
 
+       forwarding_restore
+
        h2_destroy
        sw2_destroy
        sw1_destroy
@@ -211,15 +215,15 @@ multipath4_test()
           nexthop dev g1a weight $weight1 \
           nexthop dev g1b weight $weight2
 
-       local t0_111=$(tc_rule_stats_get $ul1 111 egress)
-       local t0_222=$(tc_rule_stats_get $ul1 222 egress)
+       local t0_111=$(tc_rule_stats_get $ul2 111 ingress)
+       local t0_222=$(tc_rule_stats_get $ul2 222 ingress)
 
        ip vrf exec v$h1 \
           $MZ $h1 -q -p 64 -A 192.0.2.1 -B 192.0.2.18 \
               -d 1msec -t udp "sp=1024,dp=0-32768"
 
-       local t1_111=$(tc_rule_stats_get $ul1 111 egress)
-       local t1_222=$(tc_rule_stats_get $ul1 222 egress)
+       local t1_111=$(tc_rule_stats_get $ul2 111 ingress)
+       local t1_222=$(tc_rule_stats_get $ul2 222 ingress)
 
        local d111=$((t1_111 - t0_111))
        local d222=$((t1_222 - t0_222))
index 090fff9dbc48f11a28ccba2444e80a3ac806a683..630c5b884d432aa6fc7a52ee541b88caa284094f 100644 (file)
 #define TLS_PAYLOAD_MAX_LEN 16384
 #define SOL_TLS 282
 
+#ifndef ENOTSUPP
+#define ENOTSUPP 524
+#endif
+
+FIXTURE(tls_basic)
+{
+       int fd, cfd;
+       bool notls;
+};
+
+FIXTURE_SETUP(tls_basic)
+{
+       struct sockaddr_in addr;
+       socklen_t len;
+       int sfd, ret;
+
+       self->notls = false;
+       len = sizeof(addr);
+
+       addr.sin_family = AF_INET;
+       addr.sin_addr.s_addr = htonl(INADDR_ANY);
+       addr.sin_port = 0;
+
+       self->fd = socket(AF_INET, SOCK_STREAM, 0);
+       sfd = socket(AF_INET, SOCK_STREAM, 0);
+
+       ret = bind(sfd, &addr, sizeof(addr));
+       ASSERT_EQ(ret, 0);
+       ret = listen(sfd, 10);
+       ASSERT_EQ(ret, 0);
+
+       ret = getsockname(sfd, &addr, &len);
+       ASSERT_EQ(ret, 0);
+
+       ret = connect(self->fd, &addr, sizeof(addr));
+       ASSERT_EQ(ret, 0);
+
+       self->cfd = accept(sfd, &addr, &len);
+       ASSERT_GE(self->cfd, 0);
+
+       close(sfd);
+
+       ret = setsockopt(self->fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
+       if (ret != 0) {
+               ASSERT_EQ(errno, ENOTSUPP);
+               self->notls = true;
+               printf("Failure setting TCP_ULP, testing without tls\n");
+               return;
+       }
+
+       ret = setsockopt(self->cfd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
+       ASSERT_EQ(ret, 0);
+}
+
+FIXTURE_TEARDOWN(tls_basic)
+{
+       close(self->fd);
+       close(self->cfd);
+}
+
+/* Send some data through with ULP but no keys */
+TEST_F(tls_basic, base_base)
+{
+       char const *test_str = "test_read";
+       int send_len = 10;
+       char buf[10];
+
+       ASSERT_EQ(strlen(test_str) + 1, send_len);
+
+       EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
+       EXPECT_NE(recv(self->cfd, buf, send_len, 0), -1);
+       EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
+};
+
 FIXTURE(tls)
 {
        int fd, cfd;
@@ -165,6 +239,16 @@ TEST_F(tls, msg_more)
        EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
 }
 
+TEST_F(tls, msg_more_unsent)
+{
+       char const *test_str = "test_read";
+       int send_len = 10;
+       char buf[10];
+
+       EXPECT_EQ(send(self->fd, test_str, send_len, MSG_MORE), send_len);
+       EXPECT_EQ(recv(self->cfd, buf, send_len, MSG_DONTWAIT), -1);
+}
+
 TEST_F(tls, sendmsg_single)
 {
        struct msghdr msg;
@@ -610,6 +694,37 @@ TEST_F(tls, recv_lowat)
        EXPECT_EQ(memcmp(send_mem, recv_mem + 10, 5), 0);
 }
 
+TEST_F(tls, bidir)
+{
+       struct tls12_crypto_info_aes_gcm_128 tls12;
+       char const *test_str = "test_read";
+       int send_len = 10;
+       char buf[10];
+       int ret;
+
+       memset(&tls12, 0, sizeof(tls12));
+       tls12.info.version = TLS_1_3_VERSION;
+       tls12.info.cipher_type = TLS_CIPHER_AES_GCM_128;
+
+       ret = setsockopt(self->fd, SOL_TLS, TLS_RX, &tls12, sizeof(tls12));
+       ASSERT_EQ(ret, 0);
+
+       ret = setsockopt(self->cfd, SOL_TLS, TLS_TX, &tls12, sizeof(tls12));
+       ASSERT_EQ(ret, 0);
+
+       ASSERT_EQ(strlen(test_str) + 1, send_len);
+
+       EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
+       EXPECT_NE(recv(self->cfd, buf, send_len, 0), -1);
+       EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
+
+       memset(buf, 0, sizeof(buf));
+
+       EXPECT_EQ(send(self->cfd, test_str, send_len, 0), send_len);
+       EXPECT_NE(recv(self->fd, buf, send_len, 0), -1);
+       EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
+};
+
 TEST_F(tls, pollin)
 {
        char const *test_str = "test_poll";
@@ -837,6 +952,85 @@ TEST_F(tls, control_msg)
        EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
 }
 
+TEST_F(tls, shutdown)
+{
+       char const *test_str = "test_read";
+       int send_len = 10;
+       char buf[10];
+
+       ASSERT_EQ(strlen(test_str) + 1, send_len);
+
+       EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
+       EXPECT_NE(recv(self->cfd, buf, send_len, 0), -1);
+       EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
+
+       shutdown(self->fd, SHUT_RDWR);
+       shutdown(self->cfd, SHUT_RDWR);
+}
+
+TEST_F(tls, shutdown_unsent)
+{
+       char const *test_str = "test_read";
+       int send_len = 10;
+
+       EXPECT_EQ(send(self->fd, test_str, send_len, MSG_MORE), send_len);
+
+       shutdown(self->fd, SHUT_RDWR);
+       shutdown(self->cfd, SHUT_RDWR);
+}
+
+TEST(non_established) {
+       struct tls12_crypto_info_aes_gcm_256 tls12;
+       struct sockaddr_in addr;
+       int sfd, ret, fd;
+       socklen_t len;
+
+       len = sizeof(addr);
+
+       memset(&tls12, 0, sizeof(tls12));
+       tls12.info.version = TLS_1_2_VERSION;
+       tls12.info.cipher_type = TLS_CIPHER_AES_GCM_256;
+
+       addr.sin_family = AF_INET;
+       addr.sin_addr.s_addr = htonl(INADDR_ANY);
+       addr.sin_port = 0;
+
+       fd = socket(AF_INET, SOCK_STREAM, 0);
+       sfd = socket(AF_INET, SOCK_STREAM, 0);
+
+       ret = bind(sfd, &addr, sizeof(addr));
+       ASSERT_EQ(ret, 0);
+       ret = listen(sfd, 10);
+       ASSERT_EQ(ret, 0);
+
+       ret = setsockopt(fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
+       EXPECT_EQ(ret, -1);
+       /* TLS ULP not supported */
+       if (errno == ENOENT)
+               return;
+       EXPECT_EQ(errno, ENOTSUPP);
+
+       ret = setsockopt(sfd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
+       EXPECT_EQ(ret, -1);
+       EXPECT_EQ(errno, ENOTSUPP);
+
+       ret = getsockname(sfd, &addr, &len);
+       ASSERT_EQ(ret, 0);
+
+       ret = connect(fd, &addr, sizeof(addr));
+       ASSERT_EQ(ret, 0);
+
+       ret = setsockopt(fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
+       ASSERT_EQ(ret, 0);
+
+       ret = setsockopt(fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
+       EXPECT_EQ(ret, -1);
+       EXPECT_EQ(errno, EEXIST);
+
+       close(fd);
+       close(sfd);
+}
+
 TEST(keysizes) {
        struct tls12_crypto_info_aes_gcm_256 tls12;
        struct sockaddr_in addr;
index 8a20e03d4cb7fe3daff23722073a45c330dc3c83..9c60337317c6038e97a4031248386f802b41835f 100755 (executable)
@@ -78,10 +78,10 @@ set -e
 
 function _modprobe()
 {
-       modprobe "$@"
+       modprobe "$@" || return 1
 
        if [[ "$REMOTE_HOST" != "" ]]; then
-               ssh "$REMOTE_HOST" modprobe "$@"
+               ssh "$REMOTE_HOST" modprobe "$@" || return 1
        fi
 }
 
@@ -442,6 +442,30 @@ function pingpong_test()
        echo "  Passed"
 }
 
+function msi_test()
+{
+       LOC=$1
+       REM=$2
+
+       write_file 1 $LOC/ready
+
+       echo "Running MSI interrupt tests on: $(subdirname $LOC) / $(subdirname $REM)"
+
+       CNT=$(read_file "$LOC/count")
+       for ((i = 0; i < $CNT; i++)); do
+               START=$(read_file $REM/../irq${i}_occurrences)
+               write_file $i $LOC/trigger
+               END=$(read_file $REM/../irq${i}_occurrences)
+
+               if [[ $(($END - $START)) != 1 ]]; then
+                       echo "MSI did not trigger the interrupt on the remote side!" >&2
+                       exit 1
+               fi
+       done
+
+       echo "  Passed"
+}
+
 function perf_test()
 {
        USE_DMA=$1
@@ -520,6 +544,29 @@ function ntb_pingpong_tests()
        _modprobe -r ntb_pingpong
 }
 
+function ntb_msi_tests()
+{
+       LOCAL_MSI="$DEBUGFS/ntb_msi_test/$LOCAL_DEV"
+       REMOTE_MSI="$REMOTE_HOST:$DEBUGFS/ntb_msi_test/$REMOTE_DEV"
+
+       echo "Starting ntb_msi_test tests..."
+
+       if ! _modprobe ntb_msi_test 2> /dev/null; then
+               echo "  Not doing MSI tests seeing the module is not available."
+               return
+       fi
+
+       port_test $LOCAL_MSI $REMOTE_MSI
+
+       LOCAL_PEER="$LOCAL_MSI/peer$LOCAL_PIDX"
+       REMOTE_PEER="$REMOTE_MSI/peer$REMOTE_PIDX"
+
+       msi_test $LOCAL_PEER $REMOTE_PEER
+       msi_test $REMOTE_PEER $LOCAL_PEER
+
+       _modprobe -r ntb_msi_test
+}
+
 function ntb_perf_tests()
 {
        LOCAL_PERF="$DEBUGFS/ntb_perf/$LOCAL_DEV"
@@ -541,6 +588,7 @@ function cleanup()
        _modprobe -r ntb_perf 2> /dev/null
        _modprobe -r ntb_pingpong 2> /dev/null
        _modprobe -r ntb_transport 2> /dev/null
+       _modprobe -r ntb_msi_test 2> /dev/null
        set -e
 }
 
@@ -577,5 +625,7 @@ ntb_tool_tests
 echo
 ntb_pingpong_tests
 echo
+ntb_msi_tests
+echo
 ntb_perf_tests
 echo
index 5ab4c60c100e3dba810b26eb33dd0813fb1f3ac6..15a329da59fa3086e1e2f93b5055c40c3b75028b 100644 (file)
@@ -489,25 +489,11 @@ static void test_ptrace_write_gsbase(void)
                 * selector value is changed or not by the GSBASE write in
                 * a ptracer.
                 */
-               if (gs != *shared_scratch) {
-                       nerrs++;
-                       printf("[FAIL]\tGS changed to %lx\n", gs);
-
-                       /*
-                        * On older kernels, poking a nonzero value into the
-                        * base would zero the selector.  On newer kernels,
-                        * this behavior has changed -- poking the base
-                        * changes only the base and, if FSGSBASE is not
-                        * available, this may have no effect.
-                        */
-                       if (gs == 0)
-                               printf("\tNote: this is expected behavior on older kernels.\n");
-               } else if (have_fsgsbase && (base != 0xFF)) {
-                       nerrs++;
-                       printf("[FAIL]\tGSBASE changed to %lx\n", base);
+               if (gs == 0 && base == 0xFF) {
+                       printf("[OK]\tGS was reset as expected\n");
                } else {
-                       printf("[OK]\tGS remained 0x%hx%s", *shared_scratch, have_fsgsbase ? " and GSBASE changed to 0xFF" : "");
-                       printf("\n");
+                       nerrs++;
+                       printf("[FAIL]\tGS=0x%lx, GSBASE=0x%lx (should be 0, 0xFF)\n", gs, base);
                }
        }
 
index cd8daa20d487a0bd34f56d7873e3deae1187423d..aa316d99e035f8d7964264e5f85747c5328d9eb4 100644 (file)
@@ -30,8 +30,6 @@ header-test-$(CONFIG_CPU_BIG_ENDIAN) += linux/byteorder/big_endian.h
 header-test-$(CONFIG_CPU_LITTLE_ENDIAN) += linux/byteorder/little_endian.h
 header-test- += linux/coda.h
 header-test- += linux/coda_psdev.h
-header-test- += linux/dvb/audio.h
-header-test- += linux/dvb/osd.h
 header-test- += linux/elfcore.h
 header-test- += linux/errqueue.h
 header-test- += linux/fsmap.h
@@ -44,7 +42,6 @@ header-test- += linux/netfilter_bridge/ebtables.h
 header-test- += linux/netfilter_ipv4/ipt_LOG.h
 header-test- += linux/netfilter_ipv6/ip6t_LOG.h
 header-test- += linux/nfc.h
-header-test- += linux/nilfs2_ondisk.h
 header-test- += linux/omap3isp.h
 header-test- += linux/omapfb.h
 header-test- += linux/patchkey.h
@@ -59,9 +56,6 @@ header-test- += linux/v4l2-mediabus.h
 header-test- += linux/v4l2-subdev.h
 header-test- += linux/videodev2.h
 header-test- += linux/vm_sockets.h
-header-test- += misc/ocxl.h
-header-test- += mtd/mtd-abi.h
-header-test- += mtd/mtd-user.h
 header-test- += scsi/scsi_bsg_fc.h
 header-test- += scsi/scsi_netlink.h
 header-test- += scsi/scsi_netlink_fc.h
@@ -108,7 +102,6 @@ header-test- += linux/bpf_perf_event.h
 endif
 
 ifeq ($(SRCARCH),s390)
-header-test- += asm/runtime_instr.h
 header-test- += asm/zcrypt.h
 endif
 
@@ -116,7 +109,6 @@ ifeq ($(SRCARCH),sparc)
 header-test- += asm/stat.h
 header-test- += asm/uctx.h
 header-test- += asm/fbio.h
-header-test- += asm/openpromio.h
 endif
 
 # asm-generic/*.h is used by asm/*.h, and should not be included directly
index b4ab59dd6846003cd5bfbfa38ca708880af6cdf1..887f3b0c2b602d4cd4f81ebf137b8c04e112077c 100644 (file)
@@ -314,6 +314,7 @@ int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id)
        kvm_vcpu_set_in_spin_loop(vcpu, false);
        kvm_vcpu_set_dy_eligible(vcpu, false);
        vcpu->preempted = false;
+       vcpu->ready = false;
 
        r = kvm_arch_vcpu_init(vcpu);
        if (r < 0)
@@ -2387,6 +2388,7 @@ bool kvm_vcpu_wake_up(struct kvm_vcpu *vcpu)
        wqp = kvm_arch_vcpu_wq(vcpu);
        if (swq_has_sleeper(wqp)) {
                swake_up_one(wqp);
+               WRITE_ONCE(vcpu->ready, true);
                ++vcpu->stat.halt_wakeup;
                return true;
        }
@@ -2500,7 +2502,7 @@ void kvm_vcpu_on_spin(struct kvm_vcpu *me, bool yield_to_kernel_mode)
                                continue;
                        } else if (pass && i > last_boosted_vcpu)
                                break;
-                       if (!READ_ONCE(vcpu->preempted))
+                       if (!READ_ONCE(vcpu->ready))
                                continue;
                        if (vcpu == me)
                                continue;
@@ -4203,8 +4205,8 @@ static void kvm_sched_in(struct preempt_notifier *pn, int cpu)
 {
        struct kvm_vcpu *vcpu = preempt_notifier_to_vcpu(pn);
 
-       if (vcpu->preempted)
-               vcpu->preempted = false;
+       vcpu->preempted = false;
+       WRITE_ONCE(vcpu->ready, false);
 
        kvm_arch_sched_in(vcpu, cpu);
 
@@ -4216,8 +4218,10 @@ static void kvm_sched_out(struct preempt_notifier *pn,
 {
        struct kvm_vcpu *vcpu = preempt_notifier_to_vcpu(pn);
 
-       if (current->state == TASK_RUNNING)
+       if (current->state == TASK_RUNNING) {
                vcpu->preempted = true;
+               WRITE_ONCE(vcpu->ready, true);
+       }
        kvm_arch_vcpu_put(vcpu);
 }