Merge branch 'master' of git://git.denx.de/u-boot-usb
authorTom Rini <trini@konsulko.com>
Mon, 13 Apr 2020 20:06:36 +0000 (16:06 -0400)
committerTom Rini <trini@konsulko.com>
Mon, 13 Apr 2020 20:06:36 +0000 (16:06 -0400)
394 files changed:
.azure-pipelines.yml
.gitlab-ci.yml
.travis.yml
Kconfig
MAINTAINERS
Makefile
arch/arc/config.mk
arch/arm/dts/Makefile
arch/arm/dts/am335x-brppt1-mmc.dts
arch/arm/dts/am335x-brppt1-nand.dts
arch/arm/dts/am335x-brppt1-spi.dts
arch/arm/dts/am335x-brsmarc1.dts
arch/arm/dts/am335x-brxre1.dts
arch/arm/dts/am335x-evm-u-boot.dtsi
arch/arm/dts/am335x-evmsk-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/am335x-guardian-u-boot.dtsi
arch/arm/dts/am335x-pdu001-u-boot.dtsi
arch/arm/dts/am335x-pxm50-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/am335x-rut-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/avnet-ultra96-rev1.dts
arch/arm/dts/da850-evm-u-boot.dtsi
arch/arm/dts/k3-am65-mcu.dtsi
arch/arm/dts/k3-am65.dtsi
arch/arm/dts/k3-am654-base-board-u-boot.dtsi
arch/arm/dts/k3-am654-base-board.dts
arch/arm/dts/k3-am654-r5-base-board.dts
arch/arm/dts/k3-j721e-common-proc-board-u-boot.dtsi
arch/arm/dts/k3-j721e-common-proc-board.dts
arch/arm/dts/k3-j721e-mcu-wakeup.dtsi
arch/arm/dts/k3-j721e-r5-common-proc-board-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/k3-j721e-r5-common-proc-board.dts
arch/arm/dts/k3-j721e-som-p0.dtsi
arch/arm/dts/k3-j721e.dtsi
arch/arm/dts/meson-axg-s400.dts
arch/arm/dts/meson-axg.dtsi
arch/arm/dts/meson-g12-common.dtsi
arch/arm/dts/meson-g12.dtsi [new file with mode: 0644]
arch/arm/dts/meson-g12a-sei510.dts
arch/arm/dts/meson-g12a-u200.dts
arch/arm/dts/meson-g12a.dtsi
arch/arm/dts/meson-g12b-a311d-khadas-vim3.dts
arch/arm/dts/meson-g12b-odroid-n2.dts
arch/arm/dts/meson-g12b.dtsi
arch/arm/dts/meson-gx-libretech-pc.dtsi [new file with mode: 0644]
arch/arm/dts/meson-gx.dtsi
arch/arm/dts/meson-gxbb-nanopi-k2.dts
arch/arm/dts/meson-gxbb-odroidc2.dts
arch/arm/dts/meson-gxbb-p200.dts
arch/arm/dts/meson-gxbb-p201.dts
arch/arm/dts/meson-gxbb-p20x.dtsi
arch/arm/dts/meson-gxbb.dtsi
arch/arm/dts/meson-gxl-s805x-libretech-ac.dts
arch/arm/dts/meson-gxl-s905d-libretech-pc-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/meson-gxl-s905d-libretech-pc.dts [new file with mode: 0644]
arch/arm/dts/meson-gxl-s905d.dtsi [new file with mode: 0644]
arch/arm/dts/meson-gxl-s905x-khadas-vim.dts
arch/arm/dts/meson-gxl-s905x-libretech-cc.dts
arch/arm/dts/meson-gxl-s905x-p212.dtsi
arch/arm/dts/meson-gxl.dtsi
arch/arm/dts/meson-gxm-khadas-vim2.dts
arch/arm/dts/meson-gxm-s912-libretech-pc-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/meson-gxm-s912-libretech-pc.dts [new file with mode: 0644]
arch/arm/dts/meson-gxm.dtsi
arch/arm/dts/meson-khadas-vim3.dtsi
arch/arm/dts/meson-sm1-sei610.dts
arch/arm/dts/meson-sm1.dtsi
arch/arm/dts/stm32mp15-ddr.dtsi
arch/arm/dts/stm32mp15-pinctrl.dtsi [new file with mode: 0644]
arch/arm/dts/stm32mp15-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/stm32mp151.dtsi [new file with mode: 0644]
arch/arm/dts/stm32mp153.dtsi [new file with mode: 0644]
arch/arm/dts/stm32mp157-u-boot.dtsi [deleted file]
arch/arm/dts/stm32mp157.dtsi [new file with mode: 0644]
arch/arm/dts/stm32mp157a-avenger96-u-boot.dtsi
arch/arm/dts/stm32mp157a-avenger96.dts
arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi
arch/arm/dts/stm32mp157a-dk1.dts
arch/arm/dts/stm32mp157c-dk2-u-boot.dtsi
arch/arm/dts/stm32mp157c-dk2.dts
arch/arm/dts/stm32mp157c-ed1-u-boot.dtsi
arch/arm/dts/stm32mp157c-ed1.dts
arch/arm/dts/stm32mp157c-ev1.dts
arch/arm/dts/stm32mp157c.dtsi [deleted file]
arch/arm/dts/stm32mp157xaa-pinctrl.dtsi [deleted file]
arch/arm/dts/stm32mp157xab-pinctrl.dtsi [deleted file]
arch/arm/dts/stm32mp157xac-pinctrl.dtsi [deleted file]
arch/arm/dts/stm32mp157xad-pinctrl.dtsi [deleted file]
arch/arm/dts/stm32mp15xc.dtsi [new file with mode: 0644]
arch/arm/dts/stm32mp15xx-dhcom-u-boot.dtsi
arch/arm/dts/stm32mp15xx-dhcom.dtsi
arch/arm/dts/stm32mp15xx-dkx.dtsi [new file with mode: 0644]
arch/arm/dts/stm32mp15xxaa-pinctrl.dtsi [new file with mode: 0644]
arch/arm/dts/stm32mp15xxab-pinctrl.dtsi [new file with mode: 0644]
arch/arm/dts/stm32mp15xxac-pinctrl.dtsi [new file with mode: 0644]
arch/arm/dts/stm32mp15xxad-pinctrl.dtsi [new file with mode: 0644]
arch/arm/dts/zynq-cse-nor.dts
arch/arm/dts/zynq-cse-qspi.dtsi
arch/arm/dts/zynq-topic-miami.dts
arch/arm/dts/zynq-zc702.dts
arch/arm/dts/zynq-zc770-xm010.dts
arch/arm/dts/zynq-zc770-xm011-x16.dts [changed from symlink to file mode: 0644]
arch/arm/dts/zynq-zc770-xm011.dts
arch/arm/dts/zynq-zc770-xm013.dts
arch/arm/dts/zynq-zturn.dts
arch/arm/dts/zynqmp-clk-ccf.dtsi
arch/arm/dts/zynqmp-clk.dtsi [deleted file]
arch/arm/dts/zynqmp-mini-qspi.dts
arch/arm/dts/zynqmp-zc1232-revA.dts
arch/arm/dts/zynqmp-zc1254-revA.dts
arch/arm/dts/zynqmp-zc1751-xm015-dc1.dts
arch/arm/dts/zynqmp-zc1751-xm016-dc2.dts
arch/arm/dts/zynqmp-zc1751-xm017-dc3.dts
arch/arm/dts/zynqmp-zc1751-xm018-dc4.dts
arch/arm/dts/zynqmp-zc1751-xm019-dc5.dts
arch/arm/dts/zynqmp-zcu100-revC.dts
arch/arm/dts/zynqmp-zcu102-rev1.0.dts
arch/arm/dts/zynqmp-zcu102-rev1.1.dts [new file with mode: 0644]
arch/arm/dts/zynqmp-zcu102-revA.dts
arch/arm/dts/zynqmp-zcu102-revB.dts
arch/arm/dts/zynqmp-zcu104-revA.dts
arch/arm/dts/zynqmp-zcu104-revC.dts
arch/arm/dts/zynqmp-zcu106-revA.dts
arch/arm/dts/zynqmp-zcu111-revA.dts
arch/arm/dts/zynqmp-zcu1275-revA.dts
arch/arm/dts/zynqmp-zcu1275-revB.dts
arch/arm/dts/zynqmp-zcu1285-revA.dts
arch/arm/dts/zynqmp-zcu208-revA.dts
arch/arm/dts/zynqmp-zcu216-revA.dts
arch/arm/dts/zynqmp.dtsi
arch/arm/mach-davinci/Kconfig
arch/arm/mach-imx/imx_bootaux.c
arch/arm/mach-k3/Kconfig
arch/arm/mach-k3/am6_init.c
arch/arm/mach-k3/arm64-mmu.c
arch/arm/mach-k3/common.c
arch/arm/mach-k3/common.h
arch/arm/mach-k3/j721e_init.c
arch/arm/mach-k3/r5_mpu.c
arch/arm/mach-k3/sysfw-loader.c
arch/arm/mach-omap2/am33xx/clock_am33xx.c
arch/arm/mach-orion5x/Kconfig
arch/arm/mach-stm32mp/bsec.c
arch/arm/mach-stm32mp/cpu.c
arch/arm/mach-stm32mp/fdt.c
arch/arm/mach-stm32mp/include/mach/ddr.h
arch/arm/mach-stm32mp/include/mach/stm32.h
arch/arm/mach-stm32mp/include/mach/stm32mp1_smc.h
arch/arm/mach-stm32mp/include/mach/sys_proto.h
arch/arm/mach-stm32mp/psci.c
arch/arm/mach-versal/Kconfig
arch/arm/mach-versal/cpu.c
arch/arm/mach-zynq/spl.c
arch/arm/mach-zynqmp/include/mach/hardware.h
arch/arm/mach-zynqmp/mkimage_fit_atf.sh
arch/arm/mach-zynqmp/spl.c
arch/m68k/Makefile
arch/m68k/config.mk
arch/microblaze/Kconfig
arch/mips/config.mk
arch/powerpc/config.mk
arch/riscv/Kconfig
arch/riscv/config.mk
arch/x86/config.mk
board/BuR/common/br_resetc.c
board/BuR/common/bur_common.h
board/BuR/common/common.c
board/amlogic/q200/MAINTAINERS
board/armadeus/apf27/Kconfig
board/freescale/mx31pdk/Kconfig
board/st/common/cmd_stboard.c
board/st/stm32mp1/board.c
board/st/stm32mp1/stm32mp1.c
board/ti/am65x/README
board/ti/j721e/README
board/ti/j721e/evm.c
board/xilinx/common/board.c
board/xilinx/zynqmp/zynqmp-zcu102-rev1.1/psu_init_gpl.c [new file with mode: 0644]
board/xilinx/zynqmp/zynqmp-zcu111-revA/psu_init_gpl.c [new file with mode: 0644]
board/xilinx/zynqmp/zynqmp.c
cmd/Kconfig
cmd/elf.c
common/Kconfig
common/Makefile
common/image-fit-sig.c [new file with mode: 0644]
common/image-fit.c
common/image-sig.c
common/main.c
common/spl/Kconfig
config.mk
configs/am335x_baltos_defconfig
configs/am335x_evm_defconfig
configs/am65x_evm_a53_defconfig
configs/am65x_evm_r5_defconfig
configs/am65x_hs_evm_a53_defconfig
configs/am65x_hs_evm_r5_defconfig
configs/axm_defconfig
configs/brppt2_defconfig
configs/edminiv2_defconfig
configs/j721e_evm_a72_defconfig
configs/j721e_evm_r5_defconfig
configs/j721e_hs_evm_a72_defconfig
configs/j721e_hs_evm_r5_defconfig
configs/libretech-s905d-pc_defconfig [new file with mode: 0644]
configs/libretech-s912-pc_defconfig [new file with mode: 0644]
configs/mx31pdk_defconfig
configs/sandbox64_defconfig
configs/sandbox_defconfig
configs/sandbox_flattree_defconfig
configs/sandbox_spl_defconfig
configs/taurus_defconfig
configs/xilinx_versal_virt_defconfig
configs/xilinx_zynq_virt_defconfig
configs/xilinx_zynqmp_mini_defconfig
configs/xilinx_zynqmp_virt_defconfig
configs/zynq_cc108_defconfig [deleted file]
configs/zynq_cse_nor_defconfig
configs/zynq_dlc20_rev1_0_defconfig [deleted file]
configs/zynq_microzed_defconfig [deleted file]
configs/zynq_minized_defconfig [deleted file]
configs/zynq_picozed_defconfig [deleted file]
configs/zynq_z_turn_defconfig [deleted file]
configs/zynq_zc702_defconfig [deleted file]
configs/zynq_zc706_defconfig [deleted file]
configs/zynq_zc770_xm010_defconfig [deleted file]
configs/zynq_zc770_xm011_defconfig [deleted file]
configs/zynq_zc770_xm011_x16_defconfig [deleted file]
configs/zynq_zc770_xm012_defconfig [deleted file]
configs/zynq_zc770_xm013_defconfig [deleted file]
configs/zynq_zed_defconfig [deleted file]
configs/zynq_zybo_defconfig [deleted file]
configs/zynq_zybo_z7_defconfig [deleted file]
doc/arch/sandbox.rst
doc/board/st/stm32mp1.rst
doc/board/xilinx/zynq.rst
doc/device-tree-bindings/i2c/i2c-gpio.txt
doc/device-tree-bindings/memory-controllers/st,stm32mp1-ddr.txt
doc/device-tree-bindings/misc/bootcounter.txt [new file with mode: 0644]
doc/device-tree-bindings/misc/esm-k3.txt [new file with mode: 0644]
doc/device-tree-bindings/misc/esm-pmic.txt [new file with mode: 0644]
doc/device-tree-bindings/video/tilcdc/panel.txt [new file with mode: 0644]
doc/device-tree-bindings/video/tilcdc/tilcdc.txt [new file with mode: 0644]
drivers/Makefile
drivers/bootcount/Kconfig
drivers/bootcount/Makefile
drivers/bootcount/bootcount.c
drivers/clk/clk_stm32mp1.c
drivers/clk/meson/axg.c
drivers/clk/meson/g12a.c
drivers/clk/meson/gxbb.c
drivers/ddr/fsl/mpc85xx_ddr_gen3.c
drivers/dma/ti/k3-udma.c
drivers/firmware/firmware-zynqmp.c
drivers/firmware/ti_sci.c
drivers/firmware/ti_sci.h
drivers/i2c/designware_i2c.c
drivers/i2c/designware_i2c.h
drivers/i2c/i2c-gpio.c
drivers/i2c/i2c-uclass.c
drivers/i2c/stm32f7_i2c.c
drivers/misc/Kconfig
drivers/misc/Makefile
drivers/misc/esm_pmic.c [new file with mode: 0644]
drivers/misc/i2c_eeprom.c
drivers/misc/k3_avs.c
drivers/misc/k3_esm.c [new file with mode: 0644]
drivers/mmc/meson_gx_mmc.c
drivers/mtd/nand/raw/zynq_nand.c
drivers/net/zynq_gem.c
drivers/power/pmic/tps65941.c
drivers/ram/stm32mp1/stm32mp1_ddr.c
drivers/ram/stm32mp1/stm32mp1_ddr.h
drivers/ram/stm32mp1/stm32mp1_ddr_regs.h
drivers/ram/stm32mp1/stm32mp1_interactive.c
drivers/ram/stm32mp1/stm32mp1_ram.c
drivers/ram/stm32mp1/stm32mp1_tuning.c
drivers/remoteproc/ti_k3_dsp_rproc.c
drivers/remoteproc/ti_k3_r5f_rproc.c
drivers/serial/serial_zynq.c
drivers/timer/sti-timer.c
drivers/video/Kconfig
drivers/video/am335x-fb.c
drivers/video/am335x-fb.h
drivers/video/sunxi/sunxi_display.c
drivers/watchdog/Kconfig
drivers/watchdog/Makefile
drivers/watchdog/cdns_wdt.c
drivers/watchdog/xilinx_wwdt.c [new file with mode: 0644]
env/Kconfig
examples/standalone/Makefile
include/asm-generic/global_data.h
include/asm-generic/u-boot.h
include/configs/am65x_evm.h
include/configs/brxre1.h
include/configs/j721e_evm.h
include/configs/zynq-common.h
include/debug_uart.h
include/dt-bindings/clock/axg-audio-clkc.h
include/dt-bindings/clock/gxbb-aoclkc.h
include/dt-bindings/clock/gxbb-clkc.h
include/dt-bindings/gpio/meson-gxbb-gpio.h
include/dt-bindings/gpio/meson-gxl-gpio.h
include/dt-bindings/leds/common.h [new file with mode: 0644]
include/dt-bindings/reset/amlogic,meson-axg-audio-arb.h
include/dt-bindings/reset/amlogic,meson-axg-reset.h
include/dt-bindings/reset/amlogic,meson-g12a-audio-reset.h
include/dt-bindings/reset/amlogic,meson-gxbb-reset.h
include/elf.h
include/environment/ti/boot.h
include/i2c.h
include/i2c_eeprom.h
include/image.h
include/linux/soc/ti/ti_sci_protocol.h
include/power/stpmic1.h
include/spl.h
include/u-boot/rsa-mod-exp.h
lib/Kconfig
lib/Makefile
lib/elf.c [new file with mode: 0644]
lib/rsa/Kconfig
lib/rsa/Makefile
lib/rsa/rsa-keyprop.c [new file with mode: 0644]
lib/rsa/rsa-verify.c
lib/strto.c
net/eth-uclass.c
scripts/Kbuild.include
scripts/Makefile.build
scripts/Makefile.clean
scripts/Makefile.extrawarn
scripts/Makefile.host
scripts/Makefile.lib
scripts/Makefile.spl
scripts/basic/fixdep.c
scripts/dtc-version.sh [deleted file]
scripts/dtc/Makefile
scripts/dtc/checks.c
scripts/dtc/dtc-parser.y
scripts/dtc/livetree.c
scripts/dtc/version_gen.h
scripts/kconfig/.gitignore
scripts/kconfig/Makefile
scripts/kconfig/POTFILES.in [deleted file]
scripts/kconfig/check.sh [deleted file]
scripts/kconfig/conf.c
scripts/kconfig/confdata.c
scripts/kconfig/expr.h
scripts/kconfig/gconf-cfg.sh [new file with mode: 0755]
scripts/kconfig/gconf.c
scripts/kconfig/kconf_id.c
scripts/kconfig/kxgettext.c [deleted file]
scripts/kconfig/lkc.h
scripts/kconfig/lkc_proto.h
scripts/kconfig/lxdialog/check-lxdialog.sh [deleted file]
scripts/kconfig/lxdialog/checklist.c
scripts/kconfig/lxdialog/dialog.h
scripts/kconfig/lxdialog/inputbox.c
scripts/kconfig/lxdialog/menubox.c
scripts/kconfig/lxdialog/textbox.c
scripts/kconfig/lxdialog/yesno.c
scripts/kconfig/mconf-cfg.sh [new file with mode: 0755]
scripts/kconfig/mconf.c
scripts/kconfig/menu.c
scripts/kconfig/nconf-cfg.sh [new file with mode: 0644]
scripts/kconfig/nconf.c
scripts/kconfig/nconf.h
scripts/kconfig/preprocess.c [new file with mode: 0644]
scripts/kconfig/qconf-cfg.sh [new file with mode: 0755]
scripts/kconfig/qconf.cc
scripts/kconfig/streamline_config.pl
scripts/kconfig/symbol.c
scripts/kconfig/tests/err_recursive_dep/Kconfig [new file with mode: 0644]
scripts/kconfig/tests/err_recursive_dep/__init__.py [new file with mode: 0644]
scripts/kconfig/tests/err_recursive_dep/expected_stderr [new file with mode: 0644]
scripts/kconfig/tests/no_write_if_dep_unmet/expected_config
scripts/kconfig/tests/warn_recursive_dep/Kconfig [deleted file]
scripts/kconfig/tests/warn_recursive_dep/__init__.py [deleted file]
scripts/kconfig/tests/warn_recursive_dep/expected_stderr [deleted file]
scripts/kconfig/util.c
scripts/kconfig/zconf.l
scripts/kconfig/zconf.y
test/Kconfig
test/lib/Makefile
test/lib/rsa.c [new file with mode: 0644]
test/py/README.md
test/py/conftest.py
test/py/u_boot_utils.py
tools/Makefile
tools/buildman/README
tools/buildman/builder.py
tools/buildman/builderthread.py
tools/buildman/cmdline.py
tools/buildman/control.py
tools/buildman/func_test.py
tools/buildman/test.py
tools/buildman/toolchain.py

index f66d58aa76f9f3dce0006d3e0957b490df5ba9c9..d3e7b4dd0209621d1f4719183fe4beed748e8889 100644 (file)
@@ -1,7 +1,7 @@
 variables:
   windows_vm: vs2017-win2016
   ubuntu_vm: ubuntu-18.04
-  ci_runner_image: trini/u-boot-gitlab-ci-runner:bionic-20200112-21Feb2020
+  ci_runner_image: trini/u-boot-gitlab-ci-runner:bionic-20200311-10Apr2020
   # Add '-u 0' options for Azure pipelines, otherwise we get "permission
   # denied" error when it tries to "useradd -m -u 1001 vsts_azpcontainer",
   # since our $(ci_runner_image) user is not root.
@@ -52,7 +52,7 @@ jobs:
       image: $(ci_runner_image)
       options: $(container_option)
     steps:
-      - script: cppcheck --force --quiet --inline-suppr .
+      - script: cppcheck -j$(nproc) --force --quiet --inline-suppr .
 
   - job: htmldocs
     displayName: 'Build HTML documentation'
@@ -120,7 +120,7 @@ jobs:
           make tools-only_config envtools -j$(nproc)
 
   - job: utils
-    displayName: 'Run binman, buildman, dtoc and patman testsuites'
+    displayName: 'Run binman, buildman, dtoc, Kconfig and patman testsuites'
     pool:
       vmImage: $(ubuntu_vm)
     steps:
@@ -135,15 +135,16 @@ jobs:
           export USER=azure
           virtualenv -p /usr/bin/python3 /tmp/venv
           . /tmp/venv/bin/activate
-          pip install pyelftools
-          export UBOOT_TRAVIS_BUILD_DIR=/tmp/.bm-work/sandbox_spl
+          pip install pyelftools pytest
+          export UBOOT_TRAVIS_BUILD_DIR=/tmp/sandbox_spl
           export PYTHONPATH=${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt
           export PATH=${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}
-          ./tools/buildman/buildman -o /tmp -P sandbox_spl
+          ./tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w sandbox_spl
           ./tools/binman/binman --toolpath ${UBOOT_TRAVIS_BUILD_DIR}/tools test
           ./tools/buildman/buildman -t
           ./tools/dtoc/dtoc -t
           ./tools/patman/patman --test
+          make O=${UBOOT_TRAVIS_BUILD_DIR} testconfig
           EOF
           cat build.sh
           # We cannot use "container" like other jobs above, as buildman
@@ -158,90 +159,78 @@ jobs:
       matrix:
         sandbox:
           TEST_PY_BD: "sandbox"
-          BUILDMAN: "^sandbox$"
         sandbox_clang:
           TEST_PY_BD: "sandbox"
-          BUILDMAN: "^sandbox$"
           OVERRIDE: "-O clang-7"
         sandbox_spl:
           TEST_PY_BD: "sandbox_spl"
-          TEST_PY_TEST_SPEC: "test_ofplatdata"
-          BUILDMAN: "^sandbox_spl$"
+          TEST_PY_TEST_SPEC: "test_ofplatdata or test_handoff"
         sandbox_flattree:
           TEST_PY_BD: "sandbox_flattree"
-          BUILDMAN: "^sandbox_flattree$"
         evb_ast2500:
           TEST_PY_BD: "evb-ast2500"
           TEST_PY_ID: "--id qemu"
-          BUILDMAN: "^evb-ast2500$"
         vexpress_ca15_tc2:
           TEST_PY_BD: "vexpress_ca15_tc2"
           TEST_PY_ID: "--id qemu"
-          BUILDMAN: "^vexpress_ca15_tc2$"
         vexpress_ca9x4:
           TEST_PY_BD: "vexpress_ca9x4"
           TEST_PY_ID: "--id qemu"
-          BUILDMAN: "^vexpress_ca9x4$"
         integratorcp_cm926ejs:
           TEST_PY_BD: "integratorcp_cm926ejs"
           TEST_PY_ID: "--id qemu"
           TEST_PY_TEST_SPEC: "not sleep"
-          BUILDMAN: "^integratorcp_cm926ejs$"
         qemu_arm:
           TEST_PY_BD: "qemu_arm"
           TEST_PY_TEST_SPEC: "not sleep"
-          BUILDMAN: "^qemu_arm$"
         qemu_arm64:
           TEST_PY_BD: "qemu_arm64"
           TEST_PY_TEST_SPEC: "not sleep"
-          BUILDMAN: "^qemu_arm64$"
         qemu_mips:
           TEST_PY_BD: "qemu_mips"
           TEST_PY_TEST_SPEC: "not sleep"
-          BUILDMAN: "^qemu_mips$"
         qemu_mipsel:
           TEST_PY_BD: "qemu_mipsel"
           TEST_PY_TEST_SPEC: "not sleep"
-          BUILDMAN: "^qemu_mipsel$"
         qemu_mips64:
           TEST_PY_BD: "qemu_mips64"
           TEST_PY_TEST_SPEC: "not sleep"
-          BUILDMAN: "^qemu_mips64$"
         qemu_mips64el:
           TEST_PY_BD: "qemu_mips64el"
           TEST_PY_TEST_SPEC: "not sleep"
-          BUILDMAN: "^qemu_mips64el$"
         qemu_ppce500:
           TEST_PY_BD: "qemu-ppce500"
           TEST_PY_TEST_SPEC: "not sleep"
-          BUILDMAN: "^qemu-ppce500$"
+        qemu_riscv32:
+          TEST_PY_BD: "qemu-riscv32"
+          TEST_PY_TEST_SPEC: "not sleep"
         qemu_riscv64:
           TEST_PY_BD: "qemu-riscv64"
           TEST_PY_TEST_SPEC: "not sleep"
-          BUILDMAN: "^qemu-riscv64$"
+        qemu_riscv32_spl:
+          TEST_PY_BD: "qemu-riscv32_spl"
+          TEST_PY_TEST_SPEC: "not sleep"
+        qemu_riscv64_spl:
+          TEST_PY_BD: "qemu-riscv64_spl"
+          TEST_PY_TEST_SPEC: "not sleep"
         qemu_x86:
           TEST_PY_BD: "qemu-x86"
           TEST_PY_TEST_SPEC: "not sleep"
-          BUILDMAN: "^qemu-x86$"
         qemu_x86_64:
           TEST_PY_BD: "qemu-x86_64"
           TEST_PY_TEST_SPEC: "not sleep"
-          BUILDMAN: "^qemu-x86_64$"
-        zynq_zc702:
-          TEST_PY_BD: "zynq_zc702"
+        xilinx_zynq_virt:
+          TEST_PY_BD: "xilinx_zynq_virt"
           TEST_PY_ID: "--id qemu"
           TEST_PY_TEST_SPEC: "not sleep"
-          BUILDMAN: "^zynq_zc702$"
         xilinx_versal_virt:
           TEST_PY_BD: "xilinx_versal_virt"
           TEST_PY_ID: "--id qemu"
           TEST_PY_TEST_SPEC: "not sleep"
-          BUILDMAN: "^xilinx_versal_virt$"
         xtfpga:
           TEST_PY_BD: "xtfpga"
           TEST_PY_ID: "--id qemu"
           TEST_PY_TEST_SPEC: "not sleep"
-          BUILDMAN: "^xtfpga$"
     steps:
       - script: |
           cat << EOF > test.sh
@@ -251,7 +240,6 @@ jobs:
           export TEST_PY_BD="${TEST_PY_BD}"
           export TEST_PY_ID="${TEST_PY_ID}"
           export TEST_PY_TEST_SPEC="${TEST_PY_TEST_SPEC}"
-          export BUILDMAN="${BUILDMAN}"
           export OVERRIDE="${OVERRIDE}"
           EOF
           cat << "EOF" >> test.sh
@@ -263,31 +251,28 @@ jobs:
           grub-mkimage --prefix=\"\" -o ~/grub_x86.efi -O i386-efi normal  echo lsefimmap lsefi lsefisystab efinet tftp minicmd
           grub-mkimage --prefix=\"\" -o ~/grub_x64.efi -O x86_64-efi normal  echo lsefimmap lsefi lsefisystab efinet tftp minicmd
           cp /opt/grub/grubriscv64.efi ~/grub_riscv64.efi
+          cp /opt/grub/grubriscv32.efi ~/grub_riscv32.efi
           cp /opt/grub/grubaa64.efi ~/grub_arm64.efi
           cp /opt/grub/grubarm.efi ~/grub_arm.efi
+          if [[ "${TEST_PY_BD}" == "qemu-riscv32_spl" ]]; then
+              wget -O - https://github.com/riscv/opensbi/releases/download/v0.6/opensbi-0.6-rv32-bin.tar.xz | tar -C /tmp -xJ;
+              export OPENSBI=/tmp/opensbi-0.6-rv32-bin/platform/qemu/virt/firmware/fw_dynamic.bin;
+          fi
+          if [[ "${TEST_PY_BD}" == "qemu-riscv64_spl" ]]; then
+              wget -O - https://github.com/riscv/opensbi/releases/download/v0.6/opensbi-0.6-rv64-bin.tar.xz | tar -C /tmp -xJ;
+              export OPENSBI=/tmp/opensbi-0.6-rv64-bin/platform/qemu/virt/firmware/fw_dynamic.bin;
+          fi
           # the below corresponds to .gitlab-ci.yml "script"
           cd ${WORK_DIR}
-          if [[ "${BUILDMAN}" != "" ]]; then
-              ret=0;
-              tools/buildman/buildman -o /tmp -P -E ${BUILDMAN} ${OVERRIDE} || ret=$?;
-              if [[ $ret -ne 0 && $ret -ne 129 ]]; then
-                  tools/buildman/buildman -o /tmp -sdeP ${BUILDMAN};
-                  exit $ret;
-              fi;
-          fi
+          export UBOOT_TRAVIS_BUILD_DIR=/tmp/${TEST_PY_BD};
+          tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w -E -W -e --board ${TEST_PY_BD} ${OVERRIDE}
           virtualenv -p /usr/bin/python3 /tmp/venv
           . /tmp/venv/bin/activate
           pip install -r test/py/requirements.txt
-          export UBOOT_TRAVIS_BUILD_DIR=/tmp/.bm-work/${TEST_PY_BD};
           export PATH=/opt/qemu/bin:/tmp/uboot-test-hooks/bin:${PATH};
           export PYTHONPATH=/tmp/uboot-test-hooks/py/travis-ci;
-          if [[ "${TEST_PY_BD}" != "" ]]; then
-              ./test/py/test.py --bd ${TEST_PY_BD} ${TEST_PY_ID} -k "${TEST_PY_TEST_SPEC:-not a_test_which_does_not_exist}" --build-dir "$UBOOT_TRAVIS_BUILD_DIR";
-              ret=$?;
-              if [[ $ret -ne 0 ]]; then
-                  exit $ret;
-              fi;
-          fi
+          # "${var:+"-k $var"}" expands to "" if $var is empty, "-k $var" if not
+          ./test/py/test.py --bd ${TEST_PY_BD} ${TEST_PY_ID} ${TEST_PY_TEST_SPEC:+"-k ${TEST_PY_TEST_SPEC}"} --build-dir "$UBOOT_TRAVIS_BUILD_DIR";
           # the below corresponds to .gitlab-ci.yml "after_script"
           rm -rf /tmp/uboot-test-hooks /tmp/venv
           EOF
@@ -421,9 +406,9 @@ jobs:
           cat << "EOF" >> build.sh
           if [[ "${BUILDMAN}" != "" ]]; then
               ret=0;
-              tools/buildman/buildman -o /tmp -P -E ${BUILDMAN} ${OVERRIDE} || ret=$?;
-              if [[ $ret -ne 0 && $ret -ne 129 ]]; then
-                  tools/buildman/buildman -o /tmp -sdeP ${BUILDMAN};
+              tools/buildman/buildman -o /tmp -P -W ${BUILDMAN} ${OVERRIDE} || ret=$?;
+              if [[ $ret -ne 0 ]]; then
+                  tools/buildman/buildman -o /tmp -seP ${BUILDMAN};
                   exit $ret;
               fi;
           fi
index 55943bb3a245f09738cb0bb149895aa078d623fa..08bdf81e74d3c1fe1a4222524969f40d9c943ded 100644 (file)
@@ -2,7 +2,7 @@
 
 # Grab our configured image.  The source for this is found at:
 # https://gitlab.denx.de/u-boot/gitlab-ci-runner
-image: trini/u-boot-gitlab-ci-runner:bionic-20200112-21Feb2020
+image: trini/u-boot-gitlab-ci-runner:bionic-20200311-10Apr2020
 
 # We run some tests in different order, to catch some failures quicker.
 stages:
@@ -21,50 +21,43 @@ stages:
     - grub-mkimage --prefix="" -o ~/grub_x86.efi -O i386-efi normal  echo lsefimmap lsefi lsefisystab efinet tftp minicmd
     - grub-mkimage --prefix="" -o ~/grub_x64.efi -O x86_64-efi normal  echo lsefimmap lsefi lsefisystab efinet tftp minicmd
     - cp /opt/grub/grubriscv64.efi ~/grub_riscv64.efi
+    - cp /opt/grub/grubriscv32.efi ~/grub_riscv32.efi
     - cp /opt/grub/grubaa64.efi ~/grub_arm64.efi
     - cp /opt/grub/grubarm.efi ~/grub_arm.efi
+    - if [[ "${TEST_PY_BD}" == "qemu-riscv32_spl" ]]; then
+        wget -O - https://github.com/riscv/opensbi/releases/download/v0.6/opensbi-0.6-rv32-bin.tar.xz | tar -C /tmp -xJ;
+        export OPENSBI=/tmp/opensbi-0.6-rv32-bin/platform/qemu/virt/firmware/fw_dynamic.bin;
+      fi
+    - if [[ "${TEST_PY_BD}" == "qemu-riscv64_spl" ]]; then
+        wget -O - https://github.com/riscv/opensbi/releases/download/v0.6/opensbi-0.6-rv64-bin.tar.xz | tar -C /tmp -xJ;
+        export OPENSBI=/tmp/opensbi-0.6-rv64-bin/platform/qemu/virt/firmware/fw_dynamic.bin;
+      fi
 
   after_script:
     - rm -rf /tmp/uboot-test-hooks /tmp/venv
   script:
-    # From buildman, exit code 129 means warnings only.  If we've been asked to
-    # use clang only do one configuration.
-    - if [[ "${BUILDMAN}" != "" ]]; then
-        ret=0;
-        tools/buildman/buildman -o /tmp -P -E ${BUILDMAN} ${OVERRIDE}|| ret=$?;
-        if [[ $ret -ne 0 && $ret -ne 129 ]]; then
-          tools/buildman/buildman -o /tmp -sdeP ${BUILDMAN};
-          exit $ret;
-        fi;
-      fi
-    # "not a_test_which_does_not_exist" is a dummy -k parameter which will
-    # never prevent any test from running. That way, we can always pass
-    # "-k something" even when $TEST_PY_TEST_SPEC doesnt need a custom
-    # value.
+    # If we've been asked to use clang only do one configuration.
+    - export UBOOT_TRAVIS_BUILD_DIR=/tmp/${TEST_PY_BD}
+    - tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w -E -W -e
+        --board ${TEST_PY_BD} ${OVERRIDE}
     - virtualenv -p /usr/bin/python3 /tmp/venv
     - . /tmp/venv/bin/activate
     - pip install -r test/py/requirements.txt
-    - export UBOOT_TRAVIS_BUILD_DIR=/tmp/.bm-work/${TEST_PY_BD};
-      export PATH=/opt/qemu/bin:/tmp/uboot-test-hooks/bin:${PATH};
+    # "${var:+"-k $var"}" expands to "" if $var is empty, "-k $var" if not
+    - export PATH=/opt/qemu/bin:/tmp/uboot-test-hooks/bin:${PATH};
       export PYTHONPATH=/tmp/uboot-test-hooks/py/travis-ci;
-      if [[ "${TEST_PY_BD}" != "" ]]; then
-        ./test/py/test.py --bd ${TEST_PY_BD} ${TEST_PY_ID}
-          -k "${TEST_PY_TEST_SPEC:-not a_test_which_does_not_exist}"
-          --build-dir "$UBOOT_TRAVIS_BUILD_DIR";
-        ret=$?;
-        if [[ $ret -ne 0 ]]; then
-          exit $ret;
-        fi;
-      fi;
+      ./test/py/test.py --bd ${TEST_PY_BD} ${TEST_PY_ID}
+        ${TEST_PY_TEST_SPEC:+"-k ${TEST_PY_TEST_SPEC}"}
+        --build-dir "$UBOOT_TRAVIS_BUILD_DIR"
 
 build all 32bit ARM platforms:
   tags: [ 'all' ]
   stage: world build
   script:
     - ret=0;
-      ./tools/buildman/buildman -o /tmp -P -E arm -x aarch64 || ret=$?;
-      if [[ $ret -ne 0 && $ret -ne 129 ]]; then
-        ./tools/buildman/buildman -o /tmp -sdeP;
+      ./tools/buildman/buildman -o /tmp -P -E -W arm -x aarch64 || ret=$?;
+      if [[ $ret -ne 0 ]]; then
+        ./tools/buildman/buildman -o /tmp -seP;
         exit $ret;
       fi;
 
@@ -76,9 +69,9 @@ build all 64bit ARM platforms:
     - . /tmp/venv/bin/activate
     - pip install pyelftools
     - ret=0;
-      ./tools/buildman/buildman -o /tmp -P -E aarch64 || ret=$?;
-      if [[ $ret -ne 0 && $ret -ne 129 ]]; then
-        ./tools/buildman/buildman -o /tmp -sdeP;
+      ./tools/buildman/buildman -o /tmp -P -E -W aarch64 || ret=$?;
+      if [[ $ret -ne 0 ]]; then
+        ./tools/buildman/buildman -o /tmp -seP;
         exit $ret;
       fi;
 
@@ -87,9 +80,9 @@ build all PowerPC platforms:
   stage: world build
   script:
     - ret=0;
-      ./tools/buildman/buildman -o /tmp -P -E powerpc || ret=$?;
-      if [[ $ret -ne 0 && $ret -ne 129 ]]; then
-        ./tools/buildman/buildman -o /tmp -sdeP;
+      ./tools/buildman/buildman -o /tmp -P -E -W powerpc || ret=$?;
+      if [[ $ret -ne 0 ]]; then
+        ./tools/buildman/buildman -o /tmp -seP;
         exit $ret;
       fi;
 
@@ -98,9 +91,9 @@ build all other platforms:
   stage: world build
   script:
     - ret=0;
-      ./tools/buildman/buildman -o /tmp -P -E -x arm,powerpc || ret=$?;
-      if [[ $ret -ne 0 && $ret -ne 129 ]]; then
-        ./tools/buildman/buildman -o /tmp -sdeP;
+      ./tools/buildman/buildman -o /tmp -P -E -W -x arm,powerpc || ret=$?;
+      if [[ $ret -ne 0 ]]; then
+        ./tools/buildman/buildman -o /tmp -seP;
         exit $ret;
       fi;
 
@@ -110,7 +103,7 @@ cppcheck:
   tags: [ 'all' ]
   stage: testsuites
   script:
-    - cppcheck --force --quiet --inline-suppr .
+    - cppcheck -j$(nproc) --force --quiet --inline-suppr .
 
 # search for TODO within source tree
 grep TODO/FIXME/HACK:
@@ -157,7 +150,7 @@ Build envtools:
   script:
     - make tools-only_config envtools -j$(nproc)
 
-Run binman, buildman, dtoc and patman testsuites:
+Run binman, buildman, dtoc, Kconfig and patman testsuites:
   tags: [ 'all' ]
   stage: testsuites
   script:
@@ -166,29 +159,28 @@ Run binman, buildman, dtoc and patman testsuites:
       export USER=gitlab;
       virtualenv -p /usr/bin/python3 /tmp/venv;
       . /tmp/venv/bin/activate;
-      pip install pyelftools;
-      export UBOOT_TRAVIS_BUILD_DIR=/tmp/.bm-work/sandbox_spl;
+      pip install pyelftools pytest;
+      export UBOOT_TRAVIS_BUILD_DIR=/tmp/sandbox_spl;
       export PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt";
       export PATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}";
-      ./tools/buildman/buildman -o /tmp -P sandbox_spl;
+      ./tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w sandbox_spl;
       ./tools/binman/binman --toolpath ${UBOOT_TRAVIS_BUILD_DIR}/tools test;
       ./tools/buildman/buildman -t;
       ./tools/dtoc/dtoc -t;
-      ./tools/patman/patman --test
+      ./tools/patman/patman --test;
+      make testconfig
 
 # Test sandbox with test.py
 sandbox test.py:
   tags: [ 'all' ]
   variables:
     TEST_PY_BD: "sandbox"
-    BUILDMAN: "^sandbox$"
   <<: *buildman_and_testpy_dfn
 
 sandbox with clang test.py:
   tags: [ 'all' ]
   variables:
     TEST_PY_BD: "sandbox"
-    BUILDMAN: "^sandbox$"
     OVERRIDE: "-O clang-7"
   <<: *buildman_and_testpy_dfn
 
@@ -196,8 +188,7 @@ sandbox_spl test.py:
   tags: [ 'all' ]
   variables:
     TEST_PY_BD: "sandbox_spl"
-    BUILDMAN: "^sandbox_spl$"
-    TEST_PY_TEST_SPEC: "test_ofplatdata"
+    TEST_PY_TEST_SPEC: "test_ofplatdata or test_handoff"
   <<: *buildman_and_testpy_dfn
 
 evb-ast2500 test.py:
@@ -205,14 +196,12 @@ evb-ast2500 test.py:
   variables:
     TEST_PY_BD: "evb-ast2500"
     TEST_PY_ID: "--id qemu"
-    BUILDMAN: "^evb-ast2500$"
   <<: *buildman_and_testpy_dfn
 
 sandbox_flattree test.py:
   tags: [ 'all' ]
   variables:
     TEST_PY_BD: "sandbox_flattree"
-    BUILDMAN: "^sandbox_flattree$"
   <<: *buildman_and_testpy_dfn
 
 vexpress_ca15_tc2 test.py:
@@ -220,7 +209,6 @@ vexpress_ca15_tc2 test.py:
   variables:
     TEST_PY_BD: "vexpress_ca15_tc2"
     TEST_PY_ID: "--id qemu"
-    BUILDMAN: "^vexpress_ca15_tc2$"
   <<: *buildman_and_testpy_dfn
 
 vexpress_ca9x4 test.py:
@@ -228,7 +216,6 @@ vexpress_ca9x4 test.py:
   variables:
     TEST_PY_BD: "vexpress_ca9x4"
     TEST_PY_ID: "--id qemu"
-    BUILDMAN: "^vexpress_ca9x4$"
   <<: *buildman_and_testpy_dfn
 
 integratorcp_cm926ejs test.py:
@@ -237,7 +224,6 @@ integratorcp_cm926ejs test.py:
     TEST_PY_BD: "integratorcp_cm926ejs"
     TEST_PY_TEST_SPEC: "not sleep"
     TEST_PY_ID: "--id qemu"
-    BUILDMAN: "^integratorcp_cm926ejs$"
   <<: *buildman_and_testpy_dfn
 
 qemu_arm test.py:
@@ -245,7 +231,6 @@ qemu_arm test.py:
   variables:
     TEST_PY_BD: "qemu_arm"
     TEST_PY_TEST_SPEC: "not sleep"
-    BUILDMAN: "^qemu_arm$"
   <<: *buildman_and_testpy_dfn
 
 qemu_arm64 test.py:
@@ -253,7 +238,6 @@ qemu_arm64 test.py:
   variables:
     TEST_PY_BD: "qemu_arm64"
     TEST_PY_TEST_SPEC: "not sleep"
-    BUILDMAN: "^qemu_arm64$"
   <<: *buildman_and_testpy_dfn
 
 qemu_mips test.py:
@@ -261,7 +245,6 @@ qemu_mips test.py:
   variables:
     TEST_PY_BD: "qemu_mips"
     TEST_PY_TEST_SPEC: "not sleep"
-    BUILDMAN: "^qemu_mips$"
   <<: *buildman_and_testpy_dfn
 
 qemu_mipsel test.py:
@@ -269,7 +252,6 @@ qemu_mipsel test.py:
   variables:
     TEST_PY_BD: "qemu_mipsel"
     TEST_PY_TEST_SPEC: "not sleep"
-    BUILDMAN: "^qemu_mipsel$"
   <<: *buildman_and_testpy_dfn
 
 qemu_mips64 test.py:
@@ -277,7 +259,6 @@ qemu_mips64 test.py:
   variables:
     TEST_PY_BD: "qemu_mips64"
     TEST_PY_TEST_SPEC: "not sleep"
-    BUILDMAN: "^qemu_mips64$"
   <<: *buildman_and_testpy_dfn
 
 qemu_mips64el test.py:
@@ -285,7 +266,6 @@ qemu_mips64el test.py:
   variables:
     TEST_PY_BD: "qemu_mips64el"
     TEST_PY_TEST_SPEC: "not sleep"
-    BUILDMAN: "^qemu_mips64el$"
   <<: *buildman_and_testpy_dfn
 
 qemu-ppce500 test.py:
@@ -293,7 +273,13 @@ qemu-ppce500 test.py:
   variables:
     TEST_PY_BD: "qemu-ppce500"
     TEST_PY_TEST_SPEC: "not sleep"
-    BUILDMAN: "^qemu-ppce500$"
+  <<: *buildman_and_testpy_dfn
+
+qemu-riscv32 test.py:
+  tags: [ 'all' ]
+  variables:
+    TEST_PY_BD: "qemu-riscv32"
+    TEST_PY_TEST_SPEC: "not sleep"
   <<: *buildman_and_testpy_dfn
 
 qemu-riscv64 test.py:
@@ -301,7 +287,20 @@ qemu-riscv64 test.py:
   variables:
     TEST_PY_BD: "qemu-riscv64"
     TEST_PY_TEST_SPEC: "not sleep"
-    BUILDMAN: "^qemu-riscv64$"
+  <<: *buildman_and_testpy_dfn
+
+qemu-riscv32_spl test.py:
+  tags: [ 'all' ]
+  variables:
+    TEST_PY_BD: "qemu-riscv32_spl"
+    TEST_PY_TEST_SPEC: "not sleep"
+  <<: *buildman_and_testpy_dfn
+
+qemu-riscv64_spl test.py:
+  tags: [ 'all' ]
+  variables:
+    TEST_PY_BD: "qemu-riscv64_spl"
+    TEST_PY_TEST_SPEC: "not sleep"
   <<: *buildman_and_testpy_dfn
 
 qemu-x86 test.py:
@@ -309,7 +308,6 @@ qemu-x86 test.py:
   variables:
     TEST_PY_BD: "qemu-x86"
     TEST_PY_TEST_SPEC: "not sleep"
-    BUILDMAN: "^qemu-x86$"
   <<: *buildman_and_testpy_dfn
 
 qemu-x86_64 test.py:
@@ -317,16 +315,14 @@ qemu-x86_64 test.py:
   variables:
     TEST_PY_BD: "qemu-x86_64"
     TEST_PY_TEST_SPEC: "not sleep"
-    BUILDMAN: "^qemu-x86_64$"
   <<: *buildman_and_testpy_dfn
 
-zynq_zc702 test.py:
+xilinx_zynq_virt test.py:
   tags: [ 'all' ]
   variables:
-    TEST_PY_BD: "zynq_zc702"
+    TEST_PY_BD: "xilinx_zynq_virt"
     TEST_PY_TEST_SPEC: "not sleep"
     TEST_PY_ID: "--id qemu"
-    BUILDMAN: "^zynq_zc702$"
   <<: *buildman_and_testpy_dfn
 
 xilinx_versal_virt test.py:
@@ -335,7 +331,6 @@ xilinx_versal_virt test.py:
     TEST_PY_BD: "xilinx_versal_virt"
     TEST_PY_TEST_SPEC: "not sleep"
     TEST_PY_ID: "--id qemu"
-    BUILDMAN: "^xilinx_versal_virt$"
   <<: *buildman_and_testpy_dfn
 
 xtfpga test.py:
@@ -344,5 +339,4 @@ xtfpga test.py:
     TEST_PY_BD: "xtfpga"
     TEST_PY_TEST_SPEC: "not sleep"
     TEST_PY_ID: "--id qemu"
-    BUILDMAN: "^xtfpga$"
   <<: *buildman_and_testpy_dfn
index c59bd7790b6693890e2f87183ead5e491624f8ac..b3253da13c3bcdad8b5f15b65412460ea26a0509 100644 (file)
@@ -14,6 +14,7 @@ addons:
     - ubuntu-toolchain-r-test
     - llvm-toolchain-bionic-7
     packages:
+    - autopoint
     - cppcheck
     - sloccount
     - sparse
@@ -55,10 +56,6 @@ install:
  - cat ~/.buildman
  - grub-mkimage --prefix="" -o ~/grub_x86.efi -O i386-efi normal  echo lsefimmap lsefi lsefisystab efinet tftp minicmd
  - grub-mkimage --prefix="" -o ~/grub_x64.efi -O x86_64-efi normal  echo lsefimmap lsefi lsefisystab efinet tftp minicmd
- - mkdir ~/grub2-arm
- - ( cd ~/grub2-arm; wget -O - http://download.opensuse.org/ports/armv7hl/distribution/leap/42.2/repo/oss/suse/armv7hl/grub2-arm-efi-2.02~beta2-87.1.armv7hl.rpm | rpm2cpio | cpio -di )
- - mkdir ~/grub2-arm64
- - ( cd ~/grub2-arm64; wget -O - http://download.opensuse.org/ports/aarch64/distribution/leap/42.2/repo/oss/suse/aarch64/grub2-arm64-efi-2.02~beta2-87.1.aarch64.rpm | rpm2cpio | cpio -di )
  - wget http://mirrors.kernel.org/ubuntu/pool/main/m/mpfr4/libmpfr4_3.1.4-1_amd64.deb && sudo dpkg -i libmpfr4_3.1.4-1_amd64.deb && rm libmpfr4_3.1.4-1_amd64.deb
 
 env:
@@ -100,6 +97,7 @@ before_script:
     fi
   - if [[ "${TOOLCHAIN}" == "powerpc" ]]; then ./tools/buildman/buildman --fetch-arch powerpc; fi
   - if [[ "${TOOLCHAIN}" == "riscv" ]]; then
+       ./tools/buildman/buildman --fetch-arch riscv32 &&
        ./tools/buildman/buildman --fetch-arch riscv64;
     fi
   - if [[ "${QEMU_TARGET}" != "" ]]; then
@@ -112,47 +110,144 @@ before_script:
        popd;
     fi
 
+  # Build GRUB UEFI targets
+  - if [[ "${QEMU_TARGET}" == "arm-softmmu" ]]; then
+       git clone git://git.savannah.gnu.org/grub.git /tmp/grub &&
+       pushd /tmp/grub &&
+       git checkout grub-2.04 &&
+       ./bootstrap &&
+       ./configure --target=arm --with-platform=efi
+       CC=gcc
+       TARGET_CC=~/.buildman-toolchains/gcc-9.2.0-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc
+       TARGET_OBJCOPY=~/.buildman-toolchains/gcc-9.2.0-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-objcopy
+       TARGET_STRIP=~/.buildman-toolchains/gcc-9.2.0-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-strip
+       TARGET_NM=~/.buildman-toolchains/gcc-9.2.0-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-nm
+       TARGET_RANLIB=~/.buildman-toolchains/gcc-9.2.0-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-ranlib &&
+       make -j4 &&
+       ./grub-mkimage -O arm-efi -o ~/grub_arm.efi --prefix= -d
+       grub-core cat chain configfile echo efinet ext2 fat halt help linux
+       lsefisystab loadenv lvm minicmd normal part_msdos part_gpt reboot
+       search search_fs_file search_fs_uuid search_label serial sleep test
+       true &&
+       popd;
+    fi
+  - if [[ "${QEMU_TARGET}" == "aarch64-softmmu" ]]; then
+       git clone git://git.savannah.gnu.org/grub.git /tmp/grub &&
+       pushd /tmp/grub &&
+       git checkout grub-2.04 &&
+       ./bootstrap &&
+       ./configure --target=aarch64 --with-platform=efi
+       CC=gcc
+       TARGET_CC=~/.buildman-toolchains/gcc-9.2.0-nolibc/aarch64-linux/bin/aarch64-linux-gcc
+       TARGET_OBJCOPY=~/.buildman-toolchains/gcc-9.2.0-nolibc/aarch64-linux/bin/aarch64-linux-objcopy
+       TARGET_STRIP=~/.buildman-toolchains/gcc-9.2.0-nolibc/aarch64-linux/bin/aarch64-linux-strip
+       TARGET_NM=~/.buildman-toolchains/gcc-9.2.0-nolibc/aarch64-linux/bin/aarch64-linux-nm
+       TARGET_RANLIB=~/.buildman-toolchains/gcc-9.2.0-nolibc/aarch64-linux/bin/aarch64-linux-ranlib &&
+       make -j4 &&
+       ./grub-mkimage -O arm64-efi -o ~/grub_arm64.efi --prefix= -d
+       grub-core cat chain configfile echo efinet ext2 fat halt help linux
+       lsefisystab loadenv lvm minicmd normal part_msdos part_gpt reboot
+       search search_fs_file search_fs_uuid search_label serial sleep test
+       true &&
+       popd;
+    fi
+  - if [[ "${QEMU_TARGET}" == "riscv32-softmmu" ]]; then
+       git clone git://git.savannah.gnu.org/grub.git /tmp/grub &&
+       pushd /tmp/grub &&
+       git checkout grub-2.04 &&
+       ./bootstrap &&
+       ./configure --target=riscv32 --with-platform=efi
+       CC=gcc
+       TARGET_CC=~/.buildman-toolchains/gcc-9.2.0-nolibc/riscv32-linux/bin/riscv32-linux-gcc
+       TARGET_OBJCOPY=~/.buildman-toolchains/gcc-9.2.0-nolibc/riscv32-linux/bin/riscv32-linux-objcopy
+       TARGET_STRIP=~/.buildman-toolchains/gcc-9.2.0-nolibc/riscv32-linux/bin/riscv32-linux-strip
+       TARGET_NM=~/.buildman-toolchains/gcc-9.2.0-nolibc/riscv32-linux/bin/riscv32-linux-nm
+       TARGET_RANLIB=~/.buildman-toolchains/gcc-9.2.0-nolibc/riscv32-linux/bin/riscv32-linux-ranlib &&
+       make -j4 &&
+       ./grub-mkimage -O riscv32-efi -o ~/grub_riscv32.efi --prefix= -d
+       grub-core cat chain configfile echo efinet ext2 fat halt help linux
+       lsefisystab loadenv lvm minicmd normal part_msdos part_gpt reboot
+       search search_fs_file search_fs_uuid search_label serial sleep test
+       true &&
+       popd;
+    fi
+  - if [[ "${QEMU_TARGET}" == "riscv64-softmmu" ]]; then
+       git clone git://git.savannah.gnu.org/grub.git /tmp/grub &&
+       pushd /tmp/grub &&
+       git checkout grub-2.04 &&
+       ./bootstrap &&
+       ./configure --target=riscv64 --with-platform=efi
+       CC=gcc
+       TARGET_CC=~/.buildman-toolchains/gcc-9.2.0-nolibc/riscv64-linux/bin/riscv64-linux-gcc
+       TARGET_OBJCOPY=~/.buildman-toolchains/gcc-9.2.0-nolibc/riscv64-linux/bin/riscv64-linux-objcopy
+       TARGET_STRIP=~/.buildman-toolchains/gcc-9.2.0-nolibc/riscv64-linux/bin/riscv64-linux-strip
+       TARGET_NM=~/.buildman-toolchains/gcc-9.2.0-nolibc/riscv64-linux/bin/riscv64-linux-nm
+       TARGET_RANLIB=~/.buildman-toolchains/gcc-9.2.0-nolibc/riscv64-linux/bin/riscv64-linux-ranlib &&
+       make -j4 &&
+       ./grub-mkimage -O riscv64-efi -o ~/grub_riscv64.efi --prefix= -d
+       grub-core cat chain configfile echo efinet ext2 fat halt help linux
+       lsefisystab loadenv lvm minicmd normal part_msdos part_gpt reboot
+       search search_fs_file search_fs_uuid search_label serial sleep test
+       true &&
+       popd;
+    fi
+  - if [[ "${TEST_PY_BD}" == "qemu-riscv32_spl" ]]; then
+       wget -O - https://github.com/riscv/opensbi/releases/download/v0.6/opensbi-0.6-rv32-bin.tar.xz | tar -C /tmp -xJ;
+       export OPENSBI=/tmp/opensbi-0.6-rv32-bin/platform/qemu/virt/firmware/fw_dynamic.bin;
+    fi
+  - if [[ "${TEST_PY_BD}" == "qemu-riscv64_spl" ]]; then
+       wget -O - https://github.com/riscv/opensbi/releases/download/v0.6/opensbi-0.6-rv64-bin.tar.xz | tar -C /tmp -xJ;
+       export OPENSBI=/tmp/opensbi-0.6-rv64-bin/platform/qemu/virt/firmware/fw_dynamic.bin;
+    fi
+
 script:
  # Comments must be outside the command strings below, or the Travis parser
  # will get confused.
  #
- # From buildman, exit code 129 means warnings only.  If we've been asked to
- # use clang only do one configuration.
+ # If we've been asked to use clang only do one configuration.
+ #
+ # Build a selection of boards if TEST_PY_BD is empty
  - if [[ "${BUILDMAN}" != "" ]]; then
-     ret=0;
-     tools/buildman/buildman -P -E ${BUILDMAN} ${OVERRIDE}|| ret=$?;
-     if [[ $ret -ne 0 && $ret -ne 129 ]]; then
-       tools/buildman/buildman -sdeP ${BUILDMAN};
+     tools/buildman/buildman -P -E -W ${BUILDMAN} ${OVERRIDE};
+     if [[ $ret -ne 0 ]]; then
+       tools/buildman/buildman -seP ${BUILDMAN};
        exit $ret;
      fi;
    fi
- # "not a_test_which_does_not_exist" is a dummy -k parameter which will
- # never prevent any test from running. That way, we can always pass
- # "-k something" even when $TEST_PY_TEST_SPEC doesnt need a custom
- # value.
- - export UBOOT_TRAVIS_BUILD_DIR=`cd .. && pwd`/.bm-work/${TEST_PY_BD};
-   cp ~/grub_x86.efi $UBOOT_TRAVIS_BUILD_DIR/;
-   cp ~/grub_x64.efi $UBOOT_TRAVIS_BUILD_DIR/;
-   cp ~/grub2-arm/usr/lib/grub2/arm-efi/grub.efi $UBOOT_TRAVIS_BUILD_DIR/grub_arm.efi;
-   cp ~/grub2-arm64/usr/lib/grub2/arm64-efi/grub.efi $UBOOT_TRAVIS_BUILD_DIR/grub_arm64.efi;
-   if [[ "${TEST_PY_BD}" != "" ]]; then
+ # Build just the one board needed for testing, if TEST_PY_BD is non-empty
+ # Note: "${var:+"-k $var"}" expands to "" if $var is empty, "-k $var" if not
+ - if [[ "${TEST_PY_BD}" != "" ]]; then
+     export UBOOT_TRAVIS_BUILD_DIR=`cd .. && pwd`/${TEST_PY_BD};
+     cp ~/grub_x86.efi $UBOOT_TRAVIS_BUILD_DIR/;
+     cp ~/grub_x64.efi $UBOOT_TRAVIS_BUILD_DIR/;
+     if [[ -e ~/grub_arm.efi ]]; then
+       cp ~/grub_arm.efi $UBOOT_TRAVIS_BUILD_DIR/;
+     fi;
+     if [[ -e ~/grub_arm64.efi ]]; then
+       cp ~/grub_arm64.efi $UBOOT_TRAVIS_BUILD_DIR/;
+     fi;
+     if [[ -e ~/grub_riscv32.efi ]]; then
+       cp ~/grub_riscv32.efi $UBOOT_TRAVIS_BUILD_DIR/;
+     fi;
+     if [[ -e ~/grub_riscv64.efi ]]; then
+       cp ~/grub_riscv64.efi $UBOOT_TRAVIS_BUILD_DIR/;
+     fi;
+     tools/buildman/buildman -o ${UBOOT_TRAVIS_BUILD_DIR} -w -E -W -e
+       --board ${TEST_PY_BD} ${OVERRIDE} || exit;
      virtualenv -p /usr/bin/python3 /tmp/venv;
      . /tmp/venv/bin/activate;
      pip install -r test/py/requirements.txt;
      ./test/py/test.py --bd ${TEST_PY_BD} ${TEST_PY_ID}
-       -k "${TEST_PY_TEST_SPEC:-not a_test_which_does_not_exist}"
-       --build-dir "$UBOOT_TRAVIS_BUILD_DIR";
-     ret=$?;
-     if [[ $ret -ne 0 ]]; then
-       exit $ret;
-     fi;
+       ${TEST_PY_TEST_SPEC:+"-k ${TEST_PY_TEST_SPEC}"}
+       --build-dir "$UBOOT_TRAVIS_BUILD_DIR" || exit;
      if [[ -n "${TEST_PY_TOOLS}" ]]; then
        export PYTHONPATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc/pylibfdt";
        export PATH="${UBOOT_TRAVIS_BUILD_DIR}/scripts/dtc:${PATH}";
        ./tools/binman/binman --toolpath ${UBOOT_TRAVIS_BUILD_DIR}/tools test &&
        ./tools/patman/patman --test &&
        ./tools/buildman/buildman -t &&
-       ./tools/dtoc/dtoc -t;
+       ./tools/dtoc/dtoc -t &&
+       make testconfig;
      fi;
    fi
 
@@ -353,7 +448,7 @@ matrix:
     # static code analysis with cppcheck (we can add --enable=all later)
     - name: "cppcheck"
       script:
-        - cppcheck --force --quiet --inline-suppr .
+        - cppcheck -j$(nproc) --force --quiet --inline-suppr .
     # build HTML documentation
     - name: "htmldocs"
       script:
@@ -390,110 +485,111 @@ matrix:
     - name: "test/py sandbox"
       env:
         - TEST_PY_BD="sandbox"
-          BUILDMAN="^sandbox$"
           TOOLCHAIN="i386"
     - name: "test/py sandbox with clang"
       env:
         - TEST_PY_BD="sandbox"
-          BUILDMAN="^sandbox$"
           OVERRIDE="-O clang-7"
     - name: "test/py sandbox_spl"
       env:
         - TEST_PY_BD="sandbox_spl"
-          TEST_PY_TEST_SPEC="test_ofplatdata"
-          BUILDMAN="^sandbox$"
+          TEST_PY_TEST_SPEC="test_ofplatdata or test_handoff"
           TOOLCHAIN="i386"
           TEST_PY_TOOLS="yes"
     - name: "test/py sandbox_flattree"
       env:
         - TEST_PY_BD="sandbox_flattree"
-          BUILDMAN="^sandbox_flattree$"
           TOOLCHAIN="i386"
     - name: "test/py evb-ast2500"
       env:
         - TEST_PY_BD="evb-ast2500"
           TEST_PY_ID="--id qemu"
           QEMU_TARGET="arm-softmmu"
-          BUILDMAN="^evb-ast2500$"
     - name: "test/py vexpress_ca15_tc2"
       env:
         - TEST_PY_BD="vexpress_ca15_tc2"
           TEST_PY_ID="--id qemu"
           QEMU_TARGET="arm-softmmu"
-          BUILDMAN="^vexpress_ca15_tc2$"
     - name: "test/py vexpress_ca9x4"
       env:
         - TEST_PY_BD="vexpress_ca9x4"
           TEST_PY_ID="--id qemu"
           QEMU_TARGET="arm-softmmu"
-          BUILDMAN="^vexpress_ca9x4$"
     - name: "test/py integratorcp_cm926ejs"
       env:
         - TEST_PY_BD="integratorcp_cm926ejs"
           TEST_PY_TEST_SPEC="not sleep"
           TEST_PY_ID="--id qemu"
           QEMU_TARGET="arm-softmmu"
-          BUILDMAN="^integratorcp_cm926ejs$"
     - name: "test/py qemu_arm"
       env:
         - TEST_PY_BD="qemu_arm"
           TEST_PY_TEST_SPEC="not sleep"
           QEMU_TARGET="arm-softmmu"
-          BUILDMAN="^qemu_arm$"
     - name: "test/py qemu_arm64"
       env:
         - TEST_PY_BD="qemu_arm64"
           TEST_PY_TEST_SPEC="not sleep"
           QEMU_TARGET="aarch64-softmmu"
-          BUILDMAN="^qemu_arm64$"
     - name: "test/py qemu_mips"
       env:
         - TEST_PY_BD="qemu_mips"
           TEST_PY_TEST_SPEC="not sleep"
           QEMU_TARGET="mips-softmmu"
-          BUILDMAN="^qemu_mips$"
           TOOLCHAIN="mips"
     - name: "test/py qemu_mipsel"
       env:
         - TEST_PY_BD="qemu_mipsel"
           TEST_PY_TEST_SPEC="not sleep"
           QEMU_TARGET="mipsel-softmmu"
-          BUILDMAN="^qemu_mipsel$"
           TOOLCHAIN="mips"
     - name: "test/py qemu_mips64"
       env:
         - TEST_PY_BD="qemu_mips64"
           TEST_PY_TEST_SPEC="not sleep"
           QEMU_TARGET="mips64-softmmu"
-          BUILDMAN="^qemu_mips64$"
           TOOLCHAIN="mips"
     - name: "test/py qemu_mips64el"
       env:
         - TEST_PY_BD="qemu_mips64el"
           TEST_PY_TEST_SPEC="not sleep"
           QEMU_TARGET="mips64el-softmmu"
-          BUILDMAN="^qemu_mips64el$"
           TOOLCHAIN="mips"
     - name: "test/py qemu-ppce500"
       env:
         - TEST_PY_BD="qemu-ppce500"
           TEST_PY_TEST_SPEC="not sleep"
           QEMU_TARGET="ppc-softmmu"
-          BUILDMAN="^qemu-ppce500$"
           TOOLCHAIN="powerpc"
+    - name: "test/py qemu-riscv32"
+      env:
+        - TEST_PY_BD="qemu-riscv32"
+          TEST_PY_TEST_SPEC="not sleep"
+          QEMU_TARGET="riscv32-softmmu"
+          TOOLCHAIN="riscv"
     - name: "test/py qemu-riscv64"
       env:
         - TEST_PY_BD="qemu-riscv64"
           TEST_PY_TEST_SPEC="not sleep"
           QEMU_TARGET="riscv64-softmmu"
-          BUILDMAN="^qemu-riscv64$"
+          TOOLCHAIN="riscv"
+    - name: "test/py qemu-riscv32_spl"
+      env:
+        - TEST_PY_BD="qemu-riscv32_spl"
+          TEST_PY_TEST_SPEC="not sleep"
+          QEMU_TARGET="riscv32-softmmu"
+          TOOLCHAIN="riscv"
+    - name: "test/py qemu-riscv64_spl"
+      env:
+        - TEST_PY_BD="qemu-riscv64_spl"
+          TEST_PY_TEST_SPEC="not sleep"
+          QEMU_TARGET="riscv64-softmmu"
           TOOLCHAIN="riscv"
     - name: "test/py qemu-x86"
       env:
         - TEST_PY_BD="qemu-x86"
           TEST_PY_TEST_SPEC="not sleep"
           QEMU_TARGET="i386-softmmu"
-          BUILDMAN="^qemu-x86$"
           TOOLCHAIN="i386"
           BUILD_ROM="yes"
     - name: "test/py qemu-x86_64"
@@ -501,30 +597,26 @@ matrix:
         - TEST_PY_BD="qemu-x86_64"
           TEST_PY_TEST_SPEC="not sleep"
           QEMU_TARGET="x86_64-softmmu"
-          BUILDMAN="^qemu-x86_64$"
           TOOLCHAIN="i386"
           BUILD_ROM="yes"
-    - name: "test/py zynq_zc702"
+    - name: "test/py xilinx_zynq_virt"
       env:
-        - TEST_PY_BD="zynq_zc702"
+        - TEST_PY_BD="xilinx_zynq_virt"
           TEST_PY_TEST_SPEC="not sleep"
           QEMU_TARGET="arm-softmmu"
           TEST_PY_ID="--id qemu"
-          BUILDMAN="^zynq_zc702$"
     - name: "test/py xilinx_versal_virt"
       env:
         - TEST_PY_BD="xilinx_versal_virt"
           TEST_PY_TEST_SPEC="not sleep"
           QEMU_TARGET="aarch64-softmmu"
           TEST_PY_ID="--id qemu"
-          BUILDMAN="^xilinx_versal_virt$"
     - name: "test/py xtfpga"
       env:
         - TEST_PY_BD="xtfpga"
           TEST_PY_TEST_SPEC="not sleep"
           QEMU_TARGET="xtensa-softmmu"
           TEST_PY_ID="--id qemu"
-          BUILDMAN="^xtfpga$"
           TOOLCHAIN="xtensa-dc233c-elf"
 
 # TODO make it perfect ;-r
diff --git a/Kconfig b/Kconfig
index f698e0a94fe868108d0e967d1b80150b44e82b12..1b0b6999d8c08dd53029e0e742df660828b375f6 100644 (file)
--- a/Kconfig
+++ b/Kconfig
@@ -3,11 +3,7 @@
 # see the file Documentation/kbuild/kconfig-language.txt in the
 # Linux kernel source tree.
 #
-mainmenu "U-Boot $UBOOTVERSION Configuration"
-
-config UBOOTVERSION
-       string
-       option env="UBOOTVERSION"
+mainmenu "U-Boot $(UBOOTVERSION) Configuration"
 
 # Allow defaults in arch-specific code to override any given here
 source "arch/Kconfig"
@@ -360,6 +356,8 @@ config FIT_SIGNATURE
        depends on DM
        select HASH
        select RSA
+       select RSA_VERIFY
+       select IMAGE_SIGN_INFO
        help
          This option enables signature verification of FIT uImages,
          using a hash signed and verified using RSA. If
@@ -448,6 +446,8 @@ config SPL_FIT_SIGNATURE
        depends on SPL_DM
        select SPL_FIT
        select SPL_RSA
+       select SPL_RSA_VERIFY
+       select IMAGE_SIGN_INFO
 
 config SPL_LOAD_FIT
        bool "Enable SPL loading U-Boot as a FIT (basic fitImage features)"
index b50652bd85d06adcdb0017b39d3757bc4eb2ad29..d8d420f84f731d0b0dd8f3cd2d4eca3ade269368 100644 (file)
@@ -447,6 +447,7 @@ M:  Michal Simek <michal.simek@xilinx.com>
 S:     Maintained
 T:     git https://gitlab.denx.de/u-boot/custodians/u-boot-microblaze.git
 F:     arch/arm/mach-versal/
+F:     drivers/watchdog/xilinx_wwdt.c
 N:     (?<!uni)versal
 
 ARM VERSATILE EXPRESS DRIVERS
index 8de5ff6d9441b65b14c3c141f76b90f28349b647..26307fd4a65648be2a291056a369efa9f6b7fbd4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
 VERSION = 2020
 PATCHLEVEL = 04
 SUBLEVEL =
-EXTRAVERSION = -rc5
+EXTRAVERSION =
 NAME =
 
 # *DOCUMENTATION*
@@ -271,11 +271,17 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
          else if [ -x /bin/bash ]; then echo /bin/bash; \
          else echo sh; fi ; fi)
 
+HOST_LFS_CFLAGS := $(shell getconf LFS_CFLAGS 2>/dev/null)
+HOST_LFS_LDFLAGS := $(shell getconf LFS_LDFLAGS 2>/dev/null)
+HOST_LFS_LIBS := $(shell getconf LFS_LIBS 2>/dev/null)
+
 HOSTCC       = cc
 HOSTCXX      = c++
-HOSTCFLAGS   = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer \
-               $(if $(CONFIG_TOOLS_DEBUG),-g)
-HOSTCXXFLAGS = -O2
+KBUILD_HOSTCFLAGS   := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer \
+               $(if $(CONFIG_TOOLS_DEBUG),-g) $(HOST_LFS_CFLAGS) $(HOSTCFLAGS)
+KBUILD_HOSTCXXFLAGS := -O2 $(HOST_LFS_CFLAGS) $(HOSTCXXFLAGS)
+KBUILD_HOSTLDFLAGS  := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS)
+KBUILD_HOSTLDLIBS   := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
 
 # With the move to GCC 6, we have implicitly upgraded our language
 # standard to GNU11 (see https://gcc.gnu.org/gcc-5/porting_to.html).
@@ -284,11 +290,11 @@ HOSTCXXFLAGS = -O2
 # these that our host tools are GNU11 (i.e. C11 w/ GNU extensions).
 CSTD_FLAG := -std=gnu11
 ifeq ($(HOSTOS),linux)
-HOSTCFLAGS += $(CSTD_FLAG)
+KBUILD_HOSTCFLAGS += $(CSTD_FLAG)
 endif
 
 ifeq ($(HOSTOS),cygwin)
-HOSTCFLAGS     += -ansi
+KBUILD_HOSTCFLAGS      += -ansi
 endif
 
 # Mac OS X / Darwin's C preprocessor is Apple specific.  It
@@ -315,17 +321,17 @@ os_x_after = $(shell if [ $(DARWIN_MAJOR_VERSION) -ge $(1) -a \
 
 # Snow Leopards build environment has no longer restrictions as described above
 HOSTCC       = $(call os_x_before, 10, 5, "cc", "gcc")
-HOSTCFLAGS  += $(call os_x_before, 10, 4, "-traditional-cpp")
-HOSTLDFLAGS += $(call os_x_before, 10, 5, "-multiply_defined suppress")
+KBUILD_HOSTCFLAGS  += $(call os_x_before, 10, 4, "-traditional-cpp")
+KBUILD_HOSTLDFLAGS += $(call os_x_before, 10, 5, "-multiply_defined suppress")
 
 # since Lion (10.7) ASLR is on by default, but we use linker generated lists
 # in some host tools which is a problem then ... so disable ASLR for these
 # tools
-HOSTLDFLAGS += $(call os_x_before, 10, 7, "", "-Xlinker -no_pie")
+KBUILD_HOSTLDFLAGS += $(call os_x_before, 10, 7, "", "-Xlinker -no_pie")
 
 # macOS Mojave (10.14.X) 
 # Undefined symbols for architecture x86_64: "_PyArg_ParseTuple"
-HOSTLDFLAGS += $(call os_x_after, 10, 14, "-lpython -dynamclib", "")
+KBUILD_HOSTLDFLAGS += $(call os_x_after, 10, 14, "-lpython -dynamclib", "")
 endif
 
 # Decide whether to build built-in, modular, or both.
@@ -417,6 +423,23 @@ KBUILD_CFLAGS   := -Wall -Wstrict-prototypes \
                   -fno-builtin -ffreestanding $(CSTD_FLAG)
 KBUILD_CFLAGS  += -fshort-wchar -fno-strict-aliasing
 KBUILD_AFLAGS   := -D__ASSEMBLY__
+KBUILD_LDFLAGS  :=
+
+ifeq ($(cc-name),clang)
+ifneq ($(CROSS_COMPILE),)
+CLANG_TARGET   := --target=$(notdir $(CROSS_COMPILE:%-=%))
+GCC_TOOLCHAIN_DIR := $(dir $(shell which $(LD)))
+CLANG_PREFIX   := --prefix=$(GCC_TOOLCHAIN_DIR)
+GCC_TOOLCHAIN  := $(realpath $(GCC_TOOLCHAIN_DIR)/..)
+endif
+ifneq ($(GCC_TOOLCHAIN),)
+CLANG_GCC_TC   := --gcc-toolchain=$(GCC_TOOLCHAIN)
+endif
+KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX)
+KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX)
+KBUILD_CFLAGS += $(call cc-option, -no-integrated-as)
+KBUILD_AFLAGS += $(call cc-option, -no-integrated-as)
+endif
 
 # Don't generate position independent code
 KBUILD_CFLAGS  += $(call cc-option,-fno-PIE)
@@ -428,14 +451,16 @@ UBOOTVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SU
 
 export VERSION PATCHLEVEL SUBLEVEL UBOOTRELEASE UBOOTVERSION
 export ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR
-export CONFIG_SHELL HOSTCC HOSTCFLAGS HOSTLDFLAGS CROSS_COMPILE AS LD CC
-export CPP AR NM LDR STRIP OBJCOPY OBJDUMP
+export CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC
+export CPP AR NM LDR STRIP OBJCOPY OBJDUMP KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
 export MAKE LEX YACC AWK PERL PYTHON PYTHON2 PYTHON3
-export HOSTCXX HOSTCXXFLAGS CHECK CHECKFLAGS DTC DTC_FLAGS
+export HOSTCXX KBUILD_HOSTCXXFLAGS CHECK CHECKFLAGS DTC DTC_FLAGS
 
-export KBUILD_CPPFLAGS NOSTDINC_FLAGS UBOOTINCLUDE OBJCOPYFLAGS LDFLAGS
+export KBUILD_CPPFLAGS NOSTDINC_FLAGS UBOOTINCLUDE OBJCOPYFLAGS KBUILD_LDFLAGS
 export KBUILD_CFLAGS KBUILD_AFLAGS
 
+export CC_VERSION_TEXT := $(shell $(CC) --version | head -n 1)
+
 # 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.
@@ -483,6 +508,7 @@ endif
 version_h := include/generated/version_autogenerated.h
 timestamp_h := include/generated/timestamp_autogenerated.h
 defaultenv_h := include/generated/defaultenv_autogenerated.h
+dt_h := include/generated/dt.h
 
 no-dot-config-targets := clean clobber mrproper distclean \
                         help %docs check% coccicheck \
@@ -654,6 +680,9 @@ endif
 KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector)
 KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks)
 
+# disable stringop warnings in gcc 8+
+KBUILD_CFLAGS += $(call cc-disable-warning, stringop-truncation)
+
 # change __FILE__ to the relative path from the srctree
 KBUILD_CFLAGS  += $(call cc-option,-fmacro-prefix-map=$(srctree)/=)
 
@@ -678,7 +707,19 @@ ifeq ($(cc-name),clang)
 KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
 KBUILD_CFLAGS += $(call cc-disable-warning, format-invalid-specifier)
 KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
+KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
+# Quiet clang warning: comparison of unsigned expression < 0 is always false
+KBUILD_CFLAGS += $(call cc-disable-warning, tautological-compare)
+# CLANG uses a _MergedGlobals as optimization, but this breaks modpost, as the
+# source of a reference will be _MergedGlobals and not on of the whitelisted names.
+# See modpost pattern 2
+KBUILD_CFLAGS += $(call cc-option, -mno-global-merge,)
 KBUILD_CFLAGS += $(call cc-option, -fcatch-undefined-behavior)
+else
+
+# These warnings generated too much noise in a regular build.
+# Use make W=1 to enable them (see scripts/Makefile.extrawarn)
+KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
 endif
 
 # turn jbsr into jsr for m68k
@@ -710,7 +751,6 @@ UBOOTINCLUDE    := \
                -include $(srctree)/include/linux/kconfig.h
 
 NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
-CHECKFLAGS     += $(NOSTDINC_FLAGS)
 
 # FIX ME
 cpp_flags := $(KBUILD_CPPFLAGS) $(PLATFORM_CPPFLAGS) $(UBOOTINCLUDE) \
@@ -924,6 +964,12 @@ ifeq ($(CONFIG_ARC)$(CONFIG_NIOS2)$(CONFIG_X86)$(CONFIG_XTENSA),)
 LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE)
 endif
 
+# insure the checker run with the right endianness
+CHECKFLAGS += $(if $(CONFIG_CPU_BIG_ENDIAN),-mbig-endian,-mlittle-endian)
+
+# the checker needs the correct machine size
+CHECKFLAGS += $(if $(CONFIG_64BIT),-m64,-m32)
+
 # Normally we fill empty space with 0xff
 quiet_cmd_objcopy = OBJCOPY $@
 cmd_objcopy = $(OBJCOPY) --gap-fill=0xff $(OBJCOPYFLAGS) \
@@ -1683,7 +1729,7 @@ ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(ARCH)/Makefile.postlink)
 # Rule to link u-boot
 # May be overridden by arch/$(ARCH)/config.mk
 quiet_cmd_u-boot__ ?= LD      $@
-      cmd_u-boot__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_u-boot) -o $@ \
+      cmd_u-boot__ ?= $(LD) $(KBUILD_LDFLAGS) $(LDFLAGS_u-boot) -o $@ \
       -T u-boot.lds $(u-boot-init)                             \
       --start-group $(u-boot-main) --end-group                 \
       $(PLATFORM_LIBS) -Map u-boot.map;                        \
@@ -1767,7 +1813,7 @@ endif
 # prepare2 creates a makefile if using a separate output directory
 prepare2: prepare3 outputmakefile cfg
 
-prepare1: prepare2 $(version_h) $(timestamp_h) \
+prepare1: prepare2 $(version_h) $(timestamp_h) $(dt_h) \
                    include/config/auto.conf
 ifeq ($(wildcard $(LDSCRIPT)),)
        @echo >&2 "  Could not find linker script."
@@ -1833,12 +1879,23 @@ define filechk_defaultenv.h
         xxd -i ; echo ", 0x00" ; )
 endef
 
+define filechk_dt.h
+       (if test -n "$${DEVICE_TREE}"; then \
+               echo \#define DEVICE_TREE \"$(DEVICE_TREE)\"; \
+       else \
+               echo \#define DEVICE_TREE CONFIG_DEFAULT_DEVICE_TREE; \
+       fi)
+endef
+
 $(version_h): include/config/uboot.release FORCE
        $(call filechk,version.h)
 
 $(timestamp_h): $(srctree)/Makefile FORCE
        $(call filechk,timestamp.h)
 
+$(dt_h): $(srctree)/Makefile FORCE
+       $(call filechk,dt.h)
+
 $(defaultenv_h): $(CONFIG_DEFAULT_ENV_FILE:"%"=%) FORCE
        $(call filechk,defaultenv.h)
 
@@ -2195,6 +2252,6 @@ endif     # skip-makefile
 PHONY += FORCE
 FORCE:
 
-# Declare the contents of the .PHONY variable as phony.  We keep that
+# Declare the contents of the PHONY variable as phony.  We keep that
 # information in a variable so we can use it in if_changed and friends.
 .PHONY: $(PHONY)
index 6fa29adae81f77eb6d1afa43143afe91212b96df..118472b2d0ba21e9e5a4a7092f3d6bd5ea979056 100644 (file)
@@ -9,12 +9,12 @@ CONFIG_SYS_BIG_ENDIAN = 1
 endif
 
 ifdef CONFIG_SYS_LITTLE_ENDIAN
-PLATFORM_LDFLAGS += -EL
+KBUILD_LDFLAGS += -EL
 PLATFORM_CPPFLAGS += -mlittle-endian
 endif
 
 ifdef CONFIG_SYS_BIG_ENDIAN
-PLATFORM_LDFLAGS += -EB
+KBUILD_LDFLAGS += -EB
 PLATFORM_CPPFLAGS += -mbig-endian
 endif
 
index 820ee9733a05dcf13997d9a43b771c73a8607048..2a89da2ce9e9013b67deb8da92353344ba77773c 100644 (file)
@@ -147,7 +147,9 @@ dtb-$(CONFIG_ARCH_MESON) += \
        meson-gxl-s805x-libretech-ac.dtb \
        meson-gxl-s905x-libretech-cc.dtb \
        meson-gxl-s905x-khadas-vim.dtb \
+       meson-gxl-s905d-libretech-pc.dtb \
        meson-gxm-khadas-vim2.dtb \
+       meson-gxm-s912-libretech-pc.dtb \
        meson-axg-s400.dtb \
        meson-g12a-u200.dtb \
        meson-g12a-sei510.dtb \
@@ -277,6 +279,7 @@ dtb-$(CONFIG_ARCH_ZYNQMP) += \
        zynqmp-zcu102-revA.dtb                  \
        zynqmp-zcu102-revB.dtb                  \
        zynqmp-zcu102-rev1.0.dtb                \
+       zynqmp-zcu102-rev1.1.dtb                \
        zynqmp-zcu104-revA.dtb                  \
        zynqmp-zcu104-revC.dtb                  \
        zynqmp-zcu106-revA.dtb                  \
index 9be34d9da0c09a5c5e5fd05b4014f7ff68731a14..6f919711f0a0676cfe66cffbd8e4930c74e70958 100644 (file)
@@ -53,6 +53,8 @@
                bkl-pwm = <&pwmbacklight>;
                bkl-tps = <&tps_bl>;
 
+               u-boot,dm-pre-reloc;
+
                panel-info {
                        ac-bias         = <255>;
                        ac-bias-intrpt  = <0>;
index 11bd5c551c2c0f999f87ebd4d6b970233eff203a..9d4340f5914189f1d347dc9a731019887e57e3ab 100644 (file)
@@ -53,6 +53,8 @@
                bkl-pwm = <&pwmbacklight>;
                bkl-tps = <&tps_bl>;
 
+               u-boot,dm-pre-reloc;
+
                panel-info {
                        ac-bias         = <255>;
                        ac-bias-intrpt  = <0>;
index 01ab74be5edb1bb5b0669bd4631c9928a654134c..c078af8fbae97af657b8f367314f69f47df7ccc6 100644 (file)
@@ -54,6 +54,8 @@
                bkl-pwm = <&pwmbacklight>;
                bkl-tps = <&tps_bl>;
 
+               u-boot,dm-pre-reloc;
+
                panel-info {
                        ac-bias         = <255>;
                        ac-bias-intrpt  = <0>;
index a63fc2da22b8d1d089fb93c902aea54e4bcd3135..7e9516e8f885ac9e3a2fea2811cb8edc5aea3b27 100644 (file)
@@ -59,6 +59,7 @@
                /*backlight = <&tps_bl>; */
                compatible = "ti,tilcdc,panel";
                status = "okay";
+               u-boot,dm-pre-reloc;
 
                panel-info {
                        ac-bias         = <255>;
index 33d8ab78d8e7218b789fb1474ccd4cbc323ca8b2..6091a12fb7077d4582c4a7a63842b9efd57f34d2 100644 (file)
@@ -79,6 +79,8 @@
 
                backlight = <&tps_bl>;
 
+               u-boot,dm-pre-reloc;
+
                panel-info {
                        ac-bias         = <255>;
                        ac-bias-intrpt  = <0>;
index b6b97ed16d91d83b95b3593cbc8ef3f6bfc78fb3..d7b049ef20cdf48a176a6ee161ade9be332e8a45 100644 (file)
@@ -3,6 +3,12 @@
  * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
  */
 
+/ {
+       panel {
+               u-boot,dm-pre-reloc;
+       };
+};
+
 
 &mmc3 {
        status = "disabled";
diff --git a/arch/arm/dts/am335x-evmsk-u-boot.dtsi b/arch/arm/dts/am335x-evmsk-u-boot.dtsi
new file mode 100644 (file)
index 0000000..599fb37
--- /dev/null
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * am335x-evmsk U-Boot Additions
+ *
+ * Copyright (C) 2020 Dario Binacchi <dariobin@libero.it>
+ */
+
+/ {
+       panel {
+               u-boot,dm-pre-reloc;
+       };
+};
index 156b9b0e83a7b7e9635d8e11d4276c9bb30ae685..705ef335bf3968453e86e4453423c6ae8a4e7c4c 100644 (file)
@@ -8,6 +8,10 @@
        ocp {
                u-boot,dm-pre-reloc;
        };
+
+       panel {
+               u-boot,dm-pre-reloc;
+       };
 };
 
 &l4_wkup {
index 84a07bdef46db0e43d85c936089ff891c7f52890..a799fe9bc3c600e1a0b993af6d049a6edd679ce0 100644 (file)
@@ -7,6 +7,10 @@
        ocp {
                u-boot,dm-pre-reloc;
        };
+
+       panel {
+               u-boot,dm-pre-reloc;
+       };
 };
 
 &l4_wkup {
diff --git a/arch/arm/dts/am335x-pxm50-u-boot.dtsi b/arch/arm/dts/am335x-pxm50-u-boot.dtsi
new file mode 100644 (file)
index 0000000..77dfe6e
--- /dev/null
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * am335x-pxm50 U-Boot Additions
+ *
+ * Copyright (C) 2020 Dario Binacchi <dariobin@libero.it>
+ */
+
+/ {
+       panel {
+               u-boot,dm-pre-reloc;
+       };
+};
diff --git a/arch/arm/dts/am335x-rut-u-boot.dtsi b/arch/arm/dts/am335x-rut-u-boot.dtsi
new file mode 100644 (file)
index 0000000..b2b4aa5
--- /dev/null
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * am335x-rut U-Boot Additions
+ *
+ * Copyright (C) 2020 Dario Binacchi <dariobin@libero.it>
+ */
+
+/ {
+       panel {
+               u-boot,dm-pre-reloc;
+       };
+};
index 88aa06fa78a8c57315d51495c194cc7be5e1337e..ddb8febaece1afbc58f393058653c80d095cd099 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Avnet Ultra96 rev1
  *
- * (C) Copyright 2018, Xilinx, Inc.
+ * (C) Copyright 2018 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
index aa42d30c720a30695d0a62aeb3b0b95aad81285b..d9afc5edf45a5385b0a107432b2a71dbab89b449 100644 (file)
        nand {
                compatible = "ti,davinci-nand";
        };
+
+       panel {
+               u-boot,dm-pre-reloc;
+       };
 };
 
 &eth0 {
index c42e7553c78f8a104f0c150832993ee08c5e926f..bc9a87210da995a98e3e9e6ba5924b10c17da971 100644 (file)
                        loczrama = <1>;
                };
        };
+
+       fss: fss@47000000 {
+               compatible = "simple-bus";
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+
+               ospi0: spi@47040000 {
+                       compatible = "ti,am654-ospi", "cdns,qspi-nor";
+                       reg = <0x0 0x47040000 0x0 0x100>,
+                               <0x5 0x00000000 0x1 0x0000000>;
+                       interrupts = <GIC_SPI 552 IRQ_TYPE_LEVEL_HIGH>;
+                       cdns,fifo-depth = <256>;
+                       cdns,fifo-width = <4>;
+                       cdns,trigger-address = <0x0>;
+                       clocks = <&k3_clks 248 0>;
+                       assigned-clocks = <&k3_clks 248 0>;
+                       assigned-clock-parents = <&k3_clks 248 2>;
+                       assigned-clock-rates = <166666666>;
+                       power-domains = <&k3_pds 248 TI_SCI_PD_EXCLUSIVE>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               ospi1: spi@47050000 {
+                       compatible = "ti,am654-ospi", "cdns,qspi-nor";
+                       reg = <0x0 0x47050000 0x0 0x100>,
+                               <0x7 0x00000000 0x1 0x00000000>;
+                       interrupts = <GIC_SPI 553 IRQ_TYPE_LEVEL_HIGH>;
+                       cdns,fifo-depth = <256>;
+                       cdns,fifo-width = <4>;
+                       cdns,trigger-address = <0x0>;
+                       clocks = <&k3_clks 249 6>;
+                       power-domains = <&k3_pds 249 TI_SCI_PD_EXCLUSIVE>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+       };
 };
index 3ead944640a3075863e7672b0762c1d9836cd0fc..3d89bf32a9d14356c1abd1d7503cb5c55e3ac607 100644 (file)
@@ -30,6 +30,8 @@
                i2c3 = &main_i2c1;
                i2c4 = &main_i2c2;
                i2c5 = &main_i2c3;
+               spi0 = &ospi0;
+               spi1 = &ospi1;
        };
 
        chosen { };
                         <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 0x47000000 0x00 0x47000000 0x00 0x00068400>,
+                        <0x00 0x50000000 0x00 0x50000000 0x00 0x8000000>,
+                        <0x00 0x70000000 0x00 0x70000000 0x00 0x200000>,
+                        <0x05 0x00000000 0x05 0x00000000 0x01 0x0000000>,
+                        <0x07 0x00000000 0x07 0x00000000 0x01 0x0000000>;
 
                cbass_mcu: interconnect@28380000 {
                        compatible = "simple-bus";
                                 <0x00 0x42040000 0x00 0x42040000 0x00 0x03ac2400>, /* WKUP */
                                 <0x00 0x45100000 0x00 0x45100000 0x00 0x00c24000>, /* MMRs, remaining NAVSS */
                                 <0x00 0x46000000 0x00 0x46000000 0x00 0x00200000>, /* CPSW */
-                                <0x00 0x47000000 0x00 0x47000000 0x00 0x00068400>; /* OSPI space 1 */
+                                <0x00 0x47000000 0x00 0x47000000 0x00 0x00068400>, /* OSPI space 1 */
+                                <0x00 0x50000000 0x00 0x50000000 0x00 0x8000000>, /*  FSS OSPI0 data region 1 */
+                                <0x05 0x00000000 0x05 0x00000000 0x01 0x0000000>, /* FSS OSPI0 data region 3*/
+                                <0x07 0x00000000 0x07 0x00000000 0x01 0x0000000>; /* FSS OSPI1 data region 3*/
 
                        cbass_wakeup: interconnect@42040000 {
                                compatible = "simple-bus";
index 54ecb3d44400241f110647885521ea7b6d80ffa8..a7e5eb055313755efa62188d77b15cc3754fa796 100644 (file)
@@ -52,6 +52,7 @@
                #address-cells = <2>;
                #size-cells = <2>;
                ranges;
+               u-boot,dm-spl;
 
                ti,sci-dev-id = <119>;
 
@@ -68,6 +69,7 @@
                        ti,dma-ring-reset-quirk;
                        ti,sci = <&dmsc>;
                        ti,sci-dev-id = <195>;
+                       u-boot,dm-spl;
                };
 
                mcu_udmap: udmap@285c0000 {
@@ -90,6 +92,7 @@
                                                <0x4>; /* RX_CHAN */
                        ti,sci-rm-range-rflow = <0x5>; /* GP RFLOW */
                        dma-coherent;
+                       u-boot,dm-spl;
                };
        };
 
                        AM65X_WKUP_IOPAD(0x0088, PIN_INPUT, 0) /* (L4) MCU_MDIO0_MDIO */
                >;
        };
+
+       mcu-fss0-ospi0-pins-default {
+               u-boot,dm-spl;
+       };
 };
 
 &main_uart0 {
 &usb1 {
        dr_mode = "peripheral";
 };
+
+&fss {
+       u-boot,dm-spl;
+};
+
+&ospi0 {
+       u-boot,dm-spl;
+
+        flash@0{
+               u-boot,dm-spl;
+       };
+};
index 7ebbf17862555c9c8586c6214c22511e872111eb..5058b6c88e96042c121e12fa80d7d0158d9b630a 100644 (file)
                        AM65X_IOPAD(0x02c0, PIN_OUTPUT, 0) /* (AC8) USB1_DRVVBUS */
                >;
        };
+
+       main_i2c2_pins_default: main-i2c2-pins-default {
+               pinctrl-single,pins = <
+                       AM65X_IOPAD(0x0074, PIN_INPUT, 5) /* (T27) GPMC0_CSn3.I2C2_SCL */
+                       AM65X_IOPAD(0x0070, PIN_INPUT, 5) /* (R25) GPMC0_CSn2.I2C2_SDA */
+               >;
+       };
+};
+
+&main_pmx1 {
+       main_i2c0_pins_default: main-i2c0-pins-default {
+               pinctrl-single,pins = <
+                       AM65X_IOPAD(0x0000, PIN_INPUT, 0) /* (D20) I2C0_SCL */
+                       AM65X_IOPAD(0x0004, PIN_INPUT, 0) /* (C21) I2C0_SDA */
+               >;
+       };
+
+       main_i2c1_pins_default: main-i2c1-pins-default {
+               pinctrl-single,pins = <
+                       AM65X_IOPAD(0x0008, PIN_INPUT, 0) /* (B21) I2C1_SCL */
+                       AM65X_IOPAD(0x000c, PIN_INPUT, 0) /* (E21) I2C1_SDA */
+               >;
+       };
 };
 
 &wkup_pmx0 {
                        AM65X_WKUP_IOPAD(0x00e4, PIN_INPUT, 0) /* (AD6) WKUP_I2C0_SDA */
                >;
        };
+
+       mcu_fss0_ospi0_pins_default: mcu-fss0-ospi0-pins_default {
+               pinctrl-single,pins = <
+                       AM65X_WKUP_IOPAD(0x0000, PIN_OUTPUT, 0) /* (V1) MCU_OSPI0_CLK */
+                       AM65X_WKUP_IOPAD(0x0008, PIN_INPUT, 0)   /* (U2) MCU_OSPI0_DQS */
+                       AM65X_WKUP_IOPAD(0x000c, PIN_INPUT, 0)  /* (U4) MCU_OSPI0_D0 */
+                       AM65X_WKUP_IOPAD(0x0010, PIN_INPUT, 0)  /* (U5) MCU_OSPI0_D1 */
+                       AM65X_WKUP_IOPAD(0x0014, PIN_INPUT, 0)  /* (T2) MCU_OSPI0_D2 */
+                       AM65X_WKUP_IOPAD(0x0018, PIN_INPUT, 0)  /* (T3) MCU_OSPI0_D3 */
+                       AM65X_WKUP_IOPAD(0x001c, PIN_INPUT, 0)  /* (T4) MCU_OSPI0_D4 */
+                       AM65X_WKUP_IOPAD(0x0020, PIN_INPUT, 0)  /* (T5) MCU_OSPI0_D5 */
+                       AM65X_WKUP_IOPAD(0x0024, PIN_INPUT, 0)  /* (R2) MCU_OSPI0_D6 */
+                       AM65X_WKUP_IOPAD(0x0028, PIN_INPUT, 0)  /* (R3) MCU_OSPI0_D7 */
+                       AM65X_WKUP_IOPAD(0x002c, PIN_OUTPUT, 0) /* (R4) MCU_OSPI0_CSn0 */
+               >;
+       };
 };
 
 &sdhci0 {
        };
 };
 
+&main_i2c0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&main_i2c0_pins_default>;
+       clock-frequency = <400000>;
+
+       pca9555: gpio@21 {
+               compatible = "nxp,pca9555";
+               reg = <0x21>;
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+};
+
+&main_i2c1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&main_i2c1_pins_default>;
+       clock-frequency = <400000>;
+};
+
+&main_i2c2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&main_i2c2_pins_default>;
+       clock-frequency = <400000>;
+};
+
 &dwc3_1 {
        status = "okay";
 };
 &usb0_phy {
        status = "disabled";
 };
+
+&ospi0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mcu_fss0_ospi0_pins_default>;
+
+       flash@0{
+               compatible = "jedec,spi-nor";
+               reg = <0x0>;
+               spi-tx-bus-width = <1>;
+               spi-rx-bus-width = <8>;
+               spi-max-frequency = <40000000>;
+               cdns,tshsl-ns = <60>;
+               cdns,tsd2d-ns = <60>;
+               cdns,tchsh-ns = <60>;
+               cdns,tslch-ns = <60>;
+               cdns,read-delay = <0>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+       };
+};
index 5d5689d2849600857a968f032a5fe04d7e7e8f87..257b56a1b0323f4ef1b28188e916634b4cb56f82 100644 (file)
                        AM65X_WKUP_IOPAD(0x00e4, PIN_INPUT, 0) /* (AD6) WKUP_I2C0_SDA */
                >;
        };
+
+       mcu_fss0_ospi0_pins_default: mcu-fss0-ospi0-pins_default {
+               pinctrl-single,pins = <
+                       AM65X_WKUP_IOPAD(0x0000, PIN_OUTPUT, 0) /* (V1) MCU_OSPI0_CLK */
+                       AM65X_WKUP_IOPAD(0x0008, PIN_INPUT, 0)   /* (U2) MCU_OSPI0_DQS */
+                       AM65X_WKUP_IOPAD(0x000c, PIN_INPUT, 0)  /* (U4) MCU_OSPI0_D0 */
+                       AM65X_WKUP_IOPAD(0x0010, PIN_INPUT, 0)  /* (U5) MCU_OSPI0_D1 */
+                       AM65X_WKUP_IOPAD(0x0014, PIN_INPUT, 0)  /* (T2) MCU_OSPI0_D2 */
+                       AM65X_WKUP_IOPAD(0x0018, PIN_INPUT, 0)  /* (T3) MCU_OSPI0_D3 */
+                       AM65X_WKUP_IOPAD(0x001c, PIN_INPUT, 0)  /* (T4) MCU_OSPI0_D4 */
+                       AM65X_WKUP_IOPAD(0x0020, PIN_INPUT, 0)  /* (T5) MCU_OSPI0_D5 */
+                       AM65X_WKUP_IOPAD(0x0024, PIN_INPUT, 0)  /* (R2) MCU_OSPI0_D6 */
+                       AM65X_WKUP_IOPAD(0x0028, PIN_INPUT, 0)  /* (R3) MCU_OSPI0_D7 */
+                       AM65X_WKUP_IOPAD(0x002c, PIN_OUTPUT, 0) /* (R4) MCU_OSPI0_CSn0 */
+               >;
+       };
 };
 
 &main_pmx0 {
                u-boot,dm-spl;
        };
 };
+
+&ospi0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mcu_fss0_ospi0_pins_default>;
+
+       reg = <0x0 0x47040000 0x0 0x100>,
+             <0x0 0x50000000 0x0 0x8000000>;
+
+       flash@0{
+               compatible = "jedec,spi-nor";
+               reg = <0x0>;
+               spi-tx-bus-width = <1>;
+               spi-rx-bus-width = <8>;
+               spi-max-frequency = <40000000>;
+               cdns,tshsl-ns = <60>;
+               cdns,tsd2d-ns = <60>;
+               cdns,tchsh-ns = <60>;
+               cdns,tslch-ns = <60>;
+               cdns,read-delay = <0>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+       };
+};
index a3a81932168e76c9a01d4c7c9fe99b6a218ebd45..7b01e4204f73a5efbdf01b8b28525c1e69662d82 100644 (file)
 &exp2 {
        u-boot,dm-spl;
 };
+
+&mcu_fss0_ospi0_pins_default {
+       u-boot,dm-spl;
+};
+
+&fss {
+       u-boot,dm-spl;
+};
+
+&ospi0 {
+       u-boot,dm-spl;
+
+       flash@0 {
+               u-boot,dm-spl;
+       };
+};
+
+&ospi1 {
+       u-boot,dm-spl;
+
+       flash@0 {
+               u-boot,dm-spl;
+       };
+};
+
+&mcu_fss0_ospi1_pins_default {
+       u-boot,dm-spl;
+};
index d216b707fd2cbc144c8002f4450a47d19dbb1910..496a15e1d1acbcc10f5c0091b71dc98864378ac5 100644 (file)
                        J721E_WKUP_IOPAD(0xfc, PIN_INPUT_PULLUP, 0) /* (H24) WKUP_I2C0_SDA */
                >;
        };
+
+       mcu_fss0_ospi1_pins_default: mcu-fss0-ospi1-pins-default {
+               pinctrl-single,pins = <
+                       J721E_WKUP_IOPAD(0x34, PIN_OUTPUT, 0) /* (F22) MCU_OSPI1_CLK */
+                       J721E_WKUP_IOPAD(0x50, PIN_OUTPUT, 0) /* (C22) MCU_OSPI1_CSn0 */
+                       J721E_WKUP_IOPAD(0x40, PIN_INPUT, 0) /* (D22) MCU_OSPI1_D0 */
+                       J721E_WKUP_IOPAD(0x44, PIN_INPUT, 0) /* (G22) MCU_OSPI1_D1 */
+                       J721E_WKUP_IOPAD(0x48, PIN_INPUT, 0) /* (D23) MCU_OSPI1_D2 */
+                       J721E_WKUP_IOPAD(0x4c, PIN_INPUT, 0) /* (C23) MCU_OSPI1_D3 */
+                       J721E_WKUP_IOPAD(0x3c, PIN_INPUT, 0) /* (B23) MCU_OSPI1_DQS */
+                       J721E_WKUP_IOPAD(0x38, PIN_INPUT, 0) /* (A23) MCU_OSPI1_LBCLKO */
+               >;
+       };
 };
 
 &usbss0 {
                #gpio-cells = <2>;
        };
 };
+
+&ospi1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mcu_fss0_ospi1_pins_default>;
+
+       flash@0{
+               compatible = "jedec,spi-nor";
+               reg = <0x0>;
+               spi-tx-bus-width = <1>;
+               spi-rx-bus-width = <4>;
+               spi-max-frequency = <40000000>;
+               cdns,tshsl-ns = <60>;
+               cdns,tsd2d-ns = <60>;
+               cdns,tchsh-ns = <60>;
+               cdns,tslch-ns = <60>;
+               cdns,read-delay = <2>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+       };
+};
index fe52fd1b2f9f07fde90abd79b48d1376b1f59d7d..2eed50aa5a4c2e993501285efff3c00c4d703f15 100644 (file)
                        assigned-clocks = <&k3_clks 102 0>;
                        assigned-clock-rates = <250000000>;
                };
+
+               ospi0: spi@47040000 {
+                       compatible = "ti,am654-ospi";
+                       reg = <0x0 0x47040000 0x0 0x100>,
+                               <0x5 0x00000000 0x1 0x0000000>;
+                       interrupts = <GIC_SPI 840 IRQ_TYPE_LEVEL_HIGH>;
+                       cdns,fifo-depth = <256>;
+                       cdns,fifo-width = <4>;
+                       cdns,trigger-address = <0x0>;
+                       clocks = <&k3_clks 103 0>;
+                       assigned-clocks = <&k3_clks 103 0>;
+                       assigned-clock-parents = <&k3_clks 103 2>;
+                       assigned-clock-rates = <166666666>;
+                       power-domains = <&k3_pds 103 TI_SCI_PD_EXCLUSIVE>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               ospi1: spi@47050000 {
+                       compatible = "ti,am654-ospi";
+                       reg = <0x0 0x47050000 0x0 0x100>,
+                               <0x7 0x00000000 0x1 0x00000000>;
+                       interrupts = <GIC_SPI 841 IRQ_TYPE_LEVEL_HIGH>;
+                       cdns,fifo-depth = <256>;
+                       cdns,fifo-width = <4>;
+                       cdns,trigger-address = <0x0>;
+                       clocks = <&k3_clks 104 0>;
+                       assigned-clocks = <&k3_clks 104 0>;
+                       assigned-clock-rates = <133333333>;
+                       power-domains = <&k3_pds 104 TI_SCI_PD_EXCLUSIVE>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
        };
 
        mcu_i2c0: i2c@40b00000 {
diff --git a/arch/arm/dts/k3-j721e-r5-common-proc-board-u-boot.dtsi b/arch/arm/dts/k3-j721e-r5-common-proc-board-u-boot.dtsi
new file mode 100644 (file)
index 0000000..824b301
--- /dev/null
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/
+ */
+
+/ {
+       chosen {
+               firmware-loader = &fs_loader0;
+       };
+
+       fs_loader0: fs_loader@0 {
+               u-boot,dm-pre-reloc;
+               compatible = "u-boot,fs-loader";
+       };
+};
+
+&main_r5fss0 {
+       u-boot,dm-spl;
+};
+
+&main_r5fss0_core0 {
+       u-boot,dm-spl;
+};
+
+&main_r5fss0_core1 {
+       u-boot,dm-spl;
+};
+
+&tps659413a {
+       esm: esm {
+               compatible = "ti,tps659413-esm";
+               u-boot,dm-spl;
+       };
+};
index 5973e211c387fd5ed3a662cf29234c4a49e36a69..403b158f4900fba263b30747095dec088f5c062a 100644 (file)
@@ -13,6 +13,8 @@
        aliases {
                remoteproc0 = &sysctrler;
                remoteproc1 = &a72_0;
+               remoteproc2 = &main_r5fss0_core0;
+               remoteproc3 = &main_r5fss0_core1;
        };
 
        chosen {
        };
 };
 
+&cbass_main {
+       main_esm: esm@700000 {
+               compatible = "ti,j721e-esm";
+               reg = <0x0 0x700000 0x0 0x1000>;
+               ti,esm-pins = <344>, <345>;
+               u-boot,dm-spl;
+       };
+};
+
 &dmsc {
        mboxes= <&mcu_secproxy 8>, <&mcu_secproxy 6>, <&mcu_secproxy 5>;
        mbox-names = "tx", "rx", "notify";
                        J721E_WKUP_IOPAD(0xfc, PIN_INPUT_PULLUP, 0) /* (H24) WKUP_I2C0_SDA */
                >;
        };
+
+       mcu_fss0_ospi0_pins_default: mcu-fss0-ospi0-pins-default {
+               pinctrl-single,pins = <
+                       J721E_WKUP_IOPAD(0x0000, PIN_OUTPUT, 0) /* MCU_OSPI0_CLK */
+                       J721E_WKUP_IOPAD(0x0008, PIN_INPUT, 0)  /* MCU_OSPI0_DQS */
+                       J721E_WKUP_IOPAD(0x000c, PIN_INPUT, 0)  /* MCU_OSPI0_D0 */
+                       J721E_WKUP_IOPAD(0x0010, PIN_INPUT, 0)  /* MCU_OSPI0_D1 */
+                       J721E_WKUP_IOPAD(0x0014, PIN_INPUT, 0)  /* MCU_OSPI0_D2 */
+                       J721E_WKUP_IOPAD(0x0018, PIN_INPUT, 0)  /* MCU_OSPI0_D3 */
+                       J721E_WKUP_IOPAD(0x001c, PIN_INPUT, 0)  /* MCU_OSPI0_D4 */
+                       J721E_WKUP_IOPAD(0x0020, PIN_INPUT, 0)  /* MCU_OSPI0_D5 */
+                       J721E_WKUP_IOPAD(0x0024, PIN_INPUT, 0)  /* MCU_OSPI0_D6 */
+                       J721E_WKUP_IOPAD(0x0028, PIN_INPUT, 0)  /* MCU_OSPI0_D7 */
+                       J721E_WKUP_IOPAD(0x002c, PIN_OUTPUT, 0) /* MCU_OSPI0_CSn0 */
+               >;
+       };
+
+       mcu_fss0_ospi1_pins_default: mcu-fss0-ospi1-pins-default {
+               u-boot,dm-spl;
+               pinctrl-single,pins = <
+                       J721E_WKUP_IOPAD(0x34, PIN_OUTPUT, 0) /* (F22) MCU_OSPI1_CLK */
+                       J721E_WKUP_IOPAD(0x50, PIN_OUTPUT, 0) /* (C22) MCU_OSPI1_CSn0 */
+                       J721E_WKUP_IOPAD(0x40, PIN_INPUT, 0) /* (D22) MCU_OSPI1_D0 */
+                       J721E_WKUP_IOPAD(0x44, PIN_INPUT, 0) /* (G22) MCU_OSPI1_D1 */
+                       J721E_WKUP_IOPAD(0x48, PIN_INPUT, 0) /* (D23) MCU_OSPI1_D2 */
+                       J721E_WKUP_IOPAD(0x4c, PIN_INPUT, 0) /* (C23) MCU_OSPI1_D3 */
+                       J721E_WKUP_IOPAD(0x3c, PIN_INPUT, 0) /* (B23) MCU_OSPI1_DQS */
+                       J721E_WKUP_IOPAD(0x38, PIN_INPUT, 0) /* (A23) MCU_OSPI1_LBCLKO */
+               >;
+       };
 };
 
 &main_pmx0 {
        };
 };
 
+&ospi0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mcu_fss0_ospi0_pins_default>;
+
+       reg = <0x0 0x47040000 0x0 0x100>,
+             <0x0 0x50000000 0x0 0x8000000>;
+
+       flash@0{
+               compatible = "jedec,spi-nor";
+               reg = <0x0>;
+               spi-tx-bus-width = <1>;
+               spi-rx-bus-width = <8>;
+               spi-max-frequency = <40000000>;
+               cdns,tshsl-ns = <60>;
+               cdns,tsd2d-ns = <60>;
+               cdns,tchsh-ns = <60>;
+               cdns,tslch-ns = <60>;
+               cdns,read-delay = <0>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+       };
+};
+
+&ospi1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mcu_fss0_ospi1_pins_default>;
+       u-boot,dm-spl;
+
+       reg = <0x0 0x47050000 0x0 0x100>,
+             <0x0 0x58000000 0x0 0x8000000>;
+
+       flash@0{
+               compatible = "jedec,spi-nor";
+               reg = <0x0>;
+               spi-tx-bus-width = <1>;
+               spi-rx-bus-width = <4>;
+               spi-max-frequency = <40000000>;
+               cdns,tshsl-ns = <60>;
+               cdns,tsd2d-ns = <60>;
+               cdns,tchsh-ns = <60>;
+               cdns,tslch-ns = <60>;
+               cdns,read-delay = <2>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               u-boot,dm-spl;
+       };
+};
+
 #include "k3-j721e-common-proc-board-u-boot.dtsi"
index 1e1519f1c900219d308fb57dab75170480f647ff..8497ff3e3e12cc5395a8fd0086776d88cdccf5f8 100644 (file)
                        J721E_WKUP_IOPAD(0x28, PIN_INPUT, 1) /* (G21) MCU_OSPI0_D7.MCU_HYPERBUS0_DQ7 */
                >;
        };
+
+       mcu_fss0_ospi0_pins_default: mcu-fss0-ospi0-pins-default {
+               pinctrl-single,pins = <
+                       J721E_WKUP_IOPAD(0x0000, PIN_OUTPUT, 0) /* MCU_OSPI0_CLK */
+                       J721E_WKUP_IOPAD(0x0008, PIN_INPUT, 0)  /* MCU_OSPI0_DQS */
+                       J721E_WKUP_IOPAD(0x000c, PIN_INPUT, 0)  /* MCU_OSPI0_D0 */
+                       J721E_WKUP_IOPAD(0x0010, PIN_INPUT, 0)  /* MCU_OSPI0_D1 */
+                       J721E_WKUP_IOPAD(0x0014, PIN_INPUT, 0)  /* MCU_OSPI0_D2 */
+                       J721E_WKUP_IOPAD(0x0018, PIN_INPUT, 0)  /* MCU_OSPI0_D3 */
+                       J721E_WKUP_IOPAD(0x001c, PIN_INPUT, 0)  /* MCU_OSPI0_D4 */
+                       J721E_WKUP_IOPAD(0x0020, PIN_INPUT, 0)  /* MCU_OSPI0_D5 */
+                       J721E_WKUP_IOPAD(0x0024, PIN_INPUT, 0)  /* MCU_OSPI0_D6 */
+                       J721E_WKUP_IOPAD(0x0028, PIN_INPUT, 0)  /* MCU_OSPI0_D7 */
+                       J721E_WKUP_IOPAD(0x002c, PIN_OUTPUT, 0) /* MCU_OSPI0_CSn0 */
+               >;
+       };
 };
 
 &hbmc {
                reg = <0x0 0x0 0x4000000>;
        };
 };
+
+&ospi0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mcu_fss0_ospi0_pins_default>;
+
+       flash@0{
+               compatible = "jedec,spi-nor";
+               reg = <0x0>;
+               spi-tx-bus-width = <1>;
+               spi-rx-bus-width = <8>;
+               spi-max-frequency = <40000000>;
+               cdns,tshsl-ns = <60>;
+               cdns,tsd2d-ns = <60>;
+               cdns,tchsh-ns = <60>;
+               cdns,tslch-ns = <60>;
+               cdns,read-delay = <0>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+       };
+};
index 68ba517e50098afd17850e534883f658cab420f4..6bd5aabe23740a00f5ce238ddbec89dde9a3f90e 100644 (file)
@@ -40,6 +40,8 @@
                i2c7 = &main_i2c4;
                i2c8 = &main_i2c5;
                i2c9 = &main_i2c6;
+               spi0 = &ospi0;
+               spi1 = &ospi1;
        };
 
        chosen { };
                #size-cells = <2>;
                ranges = <0x00 0x00100000 0x00 0x00100000 0x00 0x00020000>, /* ctrl mmr */
                         <0x00 0x00600000 0x00 0x00600000 0x00 0x00031100>, /* GPIO */
+                        <0x00 0x00700000 0x00 0x00700000 0x00 0x00001000>, /* ESM */
                         <0x00 0x00900000 0x00 0x00900000 0x00 0x00012000>, /* serdes */
                         <0x00 0x00A40000 0x00 0x00A40000 0x00 0x00000800>, /* timesync router */
                         <0x00 0x01000000 0x00 0x01000000 0x00 0x0af02400>, /* Most peripherals */
index 18778ada7bd32527f6060b51df09bbafd97b44ff..4cd2d595182282bffd73670110fa8e895a65fe41 100644 (file)
@@ -60,7 +60,7 @@
                serial1 = &uart_A;
        };
 
-       linein: audio-codec@0 {
+       linein: audio-codec-0 {
                #sound-dai-cells = <0>;
                compatible = "everest,es7241";
                VDDA-supply = <&vcc_3v3>;
@@ -70,7 +70,7 @@
                sound-name-prefix = "Linein";
        };
 
-       lineout: audio-codec@1 {
+       lineout: audio-codec-1 {
                #sound-dai-cells = <0>;
                compatible = "everest,es7154";
                VDD-supply = <&vcc_3v3>;
                sound-name-prefix = "Lineout";
        };
 
-       spdif_dit: audio-codec@2 {
+       spdif_dit: audio-codec-2 {
                #sound-dai-cells = <0>;
                compatible = "linux,spdif-dit";
                status = "okay";
                sound-name-prefix = "DIT";
        };
 
-       dmics: audio-codec@3 {
+       dmics: audio-codec-3 {
                #sound-dai-cells = <0>;
                compatible = "dmic-codec";
                num-channels = <7>;
                sound-name-prefix = "MIC";
        };
 
+       spdif_dir: audio-codec-4 {
+               #sound-dai-cells = <0>;
+               compatible = "linux,spdif-dir";
+               status = "okay";
+               sound-name-prefix = "DIR";
+       };
+
        emmc_pwrseq: emmc-pwrseq {
                compatible = "mmc-pwrseq-emmc";
                reset-gpios = <&gpio BOOT_9 GPIO_ACTIVE_LOW>;
                                "TODDR_A IN 2", "TDMIN_C OUT",
                                "TODDR_B IN 2", "TDMIN_C OUT",
                                "TODDR_C IN 2", "TDMIN_C OUT",
+                               "TODDR_A IN 3", "SPDIFIN Capture",
+                               "TODDR_B IN 3", "SPDIFIN Capture",
+                               "TODDR_C IN 3", "SPDIFIN Capture",
                                "TODDR_A IN 4", "PDM Capture",
                                "TODDR_B IN 4", "PDM Capture",
                                "TODDR_C IN 4", "PDM Capture",
                                       <393216000>;
                status = "okay";
 
-               dai-link@0 {
+               dai-link-0 {
                        sound-dai = <&frddr_a>;
                };
 
-               dai-link@1 {
+               dai-link-1 {
                        sound-dai = <&frddr_b>;
                };
 
-               dai-link@2 {
+               dai-link-2 {
                        sound-dai = <&frddr_c>;
                };
 
-               dai-link@3 {
+               dai-link-3 {
                        sound-dai = <&toddr_a>;
                };
 
-               dai-link@4 {
+               dai-link-4 {
                        sound-dai = <&toddr_b>;
                };
 
-               dai-link@5 {
+               dai-link-5 {
                        sound-dai = <&toddr_c>;
                };
 
-               dai-link@6 {
+               dai-link-6 {
                        sound-dai = <&tdmif_c>;
                        dai-format = "i2s";
                        dai-tdm-slot-tx-mask-2 = <1 1>;
 
                };
 
-               dai-link@7 {
+               dai-link-7 {
                        sound-dai = <&spdifout>;
 
                        codec {
                        };
                };
 
-               dai-link@8 {
+               dai-link-8 {
+                       sound-dai = <&spdifin>;
+
+                       codec {
+                               sound-dai = <&spdif_dir>;
+                       };
+               };
+
+               dai-link-9 {
                        sound-dai = <&pdm>;
 
                        codec {
                eth_phy0: ethernet-phy@0 {
                        /* Realtek RTL8211F (0x001cc916) */
                        reg = <0>;
+                       interrupt-parent = <&gpio_intc>;
+                       interrupts = <98 IRQ_TYPE_LEVEL_LOW>;
                        eee-broken-1000t;
                };
        };
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       sd-uhs-sdr104;
+       max-frequency = <200000000>;
        non-removable;
        disable-wp;
 
 
 /* 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";
 
        bus-width = <8>;
-       cap-sd-highspeed;
        cap-mmc-highspeed;
-       max-frequency = <180000000>;
+       max-frequency = <200000000>;
        non-removable;
        disable-wp;
        mmc-ddr-1_8v;
        vqmmc-supply = <&vddio_boot>;
 };
 
+&spdifin {
+       pinctrl-0 = <&spdif_in_a19_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
 &spdifout {
        pinctrl-0 = <&spdif_out_a20_pins>;
        pinctrl-names = "default";
 
 &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_21 GPIO_ACTIVE_HIGH>;
+       };
 };
 
 &uart_AO {
index df017dbd2e572028f2c98b66b065d1d2b5325b3a..aace3d32a3df233277eda6bed15e96d56abc2cde 100644 (file)
@@ -20,7 +20,7 @@
        #address-cells = <2>;
        #size-cells = <2>;
 
-       tdmif_a: audio-controller@0 {
+       tdmif_a: audio-controller-0 {
                compatible = "amlogic,axg-tdm-iface";
                #sound-dai-cells = <0>;
                sound-name-prefix = "TDM_A";
@@ -31,7 +31,7 @@
                status = "disabled";
        };
 
-       tdmif_b: audio-controller@1 {
+       tdmif_b: audio-controller-1 {
                compatible = "amlogic,axg-tdm-iface";
                #sound-dai-cells = <0>;
                sound-name-prefix = "TDM_B";
@@ -42,7 +42,7 @@
                status = "disabled";
        };
 
-       tdmif_c: audio-controller@2 {
+       tdmif_c: audio-controller-2 {
                compatible = "amlogic,axg-tdm-iface";
                #sound-dai-cells = <0>;
                sound-name-prefix = "TDM_C";
                status = "disabled";
        };
 
-       ao_alt_xtal: ao_alt_xtal-clk {
-               compatible = "fixed-clock";
-               clock-frequency = <32000000>;
-               clock-output-names = "ao_alt_xtal";
-               #clock-cells = <0>;
-       };
-
        arm-pmu {
                compatible = "arm,cortex-a53-pmu";
                interrupts = <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>,
 
                cpu0: cpu@0 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x0 0x0>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
+                       clocks = <&scpi_dvfs 0>;
                };
 
                cpu1: cpu@1 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x0 0x1>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
+                       clocks = <&scpi_dvfs 0>;
                };
 
                cpu2: cpu@2 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x0 0x2>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
+                       clocks = <&scpi_dvfs 0>;
                };
 
                cpu3: cpu@3 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x0 0x3>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
+                       clocks = <&scpi_dvfs 0>;
                };
 
                l2: l2-cache0 {
                };
        };
 
+       sm: secure-monitor {
+               compatible = "amlogic,meson-gxbb-sm";
+       };
+
+       efuse: efuse {
+               compatible = "amlogic,meson-gxbb-efuse";
+               clocks = <&clkc CLKID_EFUSE>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               read-only;
+               secure-monitor = <&sm>;
+       };
+
        psci {
                compatible = "arm,psci-1.0";
                method = "smc";
                };
        };
 
+       scpi {
+               compatible = "arm,scpi-pre-1.0";
+               mboxes = <&mailbox 1 &mailbox 2>;
+               shmem = <&cpu_scp_lpri &cpu_scp_hpri>;
+
+               scpi_clocks: clocks {
+                       compatible = "arm,scpi-clocks";
+
+                       scpi_dvfs: clock-controller {
+                               compatible = "arm,scpi-dvfs-clocks";
+                               #clock-cells = <1>;
+                               clock-indices = <0>;
+                               clock-output-names = "vcpu";
+                       };
+               };
+
+               scpi_sensors: sensors {
+                       compatible = "amlogic,meson-gxbb-scpi-sensors";
+                       #thermal-sensor-cells = <1>;
+               };
+       };
+
        soc {
                compatible = "simple-bus";
                #address-cells = <2>;
                ranges;
 
                ethmac: ethernet@ff3f0000 {
-                       compatible = "amlogic,meson-axg-dwmac", "snps,dwmac";
-                       reg = <0x0 0xff3f0000 0x0 0x10000
-                              0x0 0xff634540 0x0 0x8>;
-                       interrupts = <GIC_SPI 8 IRQ_TYPE_EDGE_RISING>;
+                       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";
+                       rx-fifo-depth = <4096>;
+                       tx-fifo-depth = <2048>;
                        status = "disabled";
                };
 
                                                groups = "i2c0_sck",
                                                         "i2c0_sda";
                                                function = "i2c0";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "i2c1_sck_x",
                                                         "i2c1_sda_x";
                                                function = "i2c1";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "i2c1_sck_z",
                                                         "i2c1_sda_z";
                                                function = "i2c1";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "i2c2_sck_a",
                                                         "i2c2_sda_a";
                                                function = "i2c2";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "i2c2_sck_x",
                                                         "i2c2_sda_x";
                                                function = "i2c2";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "i2c3_sda_a6",
                                                         "i2c3_sck_a7";
                                                function = "i2c3";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "i2c3_sda_a12",
                                                         "i2c3_sck_a13";
                                                function = "i2c3";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "i2c3_sda_a19",
                                                         "i2c3_sck_a20";
                                                function = "i2c3";
+                                               bias-disable;
                                        };
                                };
 
                                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;
                                        };
                                };
 
                                        mux {
                                                groups = "BOOT_8";
                                                function = "gpio_periphs";
-                                       };
-                                       cfg-pull-down {
-                                               pins = "BOOT_8";
                                                bias-pull-down;
                                        };
                                };
                                                         "eth_txd2_rgmii",
                                                         "eth_txd3_rgmii";
                                                function = "eth";
+                                               bias-disable;
                                        };
                                };
 
                                                         "eth_txd2_rgmii",
                                                         "eth_txd3_rgmii";
                                                function = "eth";
+                                               bias-disable;
                                        };
                                };
 
                                                         "eth_txd0_x",
                                                         "eth_txd1_x";
                                                function = "eth";
+                                               bias-disable;
                                        };
                                };
 
                                                         "eth_txd0_y",
                                                         "eth_txd1_y";
                                                function = "eth";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "mclk_b";
                                                function = "mclk_b";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "mclk_c";
                                                function = "mclk_c";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pdm_dclk_a14";
                                                function = "pdm";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pdm_dclk_a19";
                                                function = "pdm";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pdm_din0";
                                                function = "pdm";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pdm_din1";
                                                function = "pdm";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pdm_din2";
                                                function = "pdm";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pdm_din3";
                                                function = "pdm";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pwm_a_a";
                                                function = "pwm_a";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pwm_a_x18";
                                                function = "pwm_a";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pwm_a_x20";
                                                function = "pwm_a";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pwm_a_z";
                                                function = "pwm_a";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pwm_b_a";
                                                function = "pwm_b";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pwm_b_x";
                                                function = "pwm_b";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pwm_b_z";
                                                function = "pwm_b";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pwm_c_a";
                                                function = "pwm_c";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pwm_c_x10";
                                                function = "pwm_c";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pwm_c_x17";
                                                function = "pwm_c";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pwm_d_x11";
                                                function = "pwm_d";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "pwm_d_x16";
                                                function = "pwm_d";
+                                               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;
                                        };
                                };
 
                                        mux {
                                                groups = "GPIOX_4";
                                                function = "gpio_periphs";
-                                       };
-                                       cfg-pull-down {
-                                               pins = "GPIOX_4";
                                                bias-pull-down;
                                        };
                                };
                                        mux {
                                                groups = "spdif_in_z";
                                                function = "spdif_in";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spdif_in_a1";
                                                function = "spdif_in";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spdif_in_a7";
                                                function = "spdif_in";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spdif_in_a19";
                                                function = "spdif_in";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spdif_in_a20";
                                                function = "spdif_in";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spdif_out_a1";
                                                function = "spdif_out";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spdif_out_a11";
                                                function = "spdif_out";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spdif_out_a19";
                                                function = "spdif_out";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spdif_out_a20";
                                                function = "spdif_out";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spdif_out_z";
                                                function = "spdif_out";
+                                               bias-disable;
                                        };
                                };
 
                                                         "spi0_mosi",
                                                         "spi0_clk";
                                                function = "spi0";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spi0_ss0";
                                                function = "spi0";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spi0_ss1";
                                                function = "spi0";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spi0_ss2";
                                                function = "spi0";
+                                               bias-disable;
                                        };
                                };
 
                                                         "spi1_mosi_a",
                                                         "spi1_clk_a";
                                                function = "spi1";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spi1_ss0_a";
                                                function = "spi1";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spi1_ss1";
                                                function = "spi1";
+                                               bias-disable;
                                        };
                                };
 
                                                         "spi1_mosi_x",
                                                         "spi1_clk_x";
                                                function = "spi1";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "spi1_ss0_x";
                                                function = "spi1";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdma_din0";
                                                function = "tdma";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdma_dout0_x14";
                                                function = "tdma";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdma_dout0_x15";
                                                function = "tdma";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdma_dout1";
                                                function = "tdma";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdma_din1";
                                                function = "tdma";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdma_fs";
                                                function = "tdma";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdma_fs_slv";
                                                function = "tdma";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdma_sclk";
                                                function = "tdma";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdma_sclk_slv";
                                                function = "tdma";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmb_din0";
                                                function = "tdmb";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmb_din1";
                                                function = "tdmb";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmb_din2";
                                                function = "tdmb";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmb_din3";
                                                function = "tdmb";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmb_dout0";
                                                function = "tdmb";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmb_dout1";
                                                function = "tdmb";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmb_dout2";
                                                function = "tdmb";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmb_dout3";
                                                function = "tdmb";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmb_fs";
                                                function = "tdmb";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmb_fs_slv";
                                                function = "tdmb";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmb_sclk";
                                                function = "tdmb";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmb_sclk_slv";
                                                function = "tdmb";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmc_fs";
                                                function = "tdmc";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmc_fs_slv";
                                                function = "tdmc";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmc_sclk";
                                                function = "tdmc";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmc_sclk_slv";
                                                function = "tdmc";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmc_din0";
                                                function = "tdmc";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmc_din1";
                                                function = "tdmc";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmc_din2";
                                                function = "tdmc";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmc_din3";
                                                function = "tdmc";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmc_dout0";
                                                function = "tdmc";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmc_dout1";
                                                function = "tdmc";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmc_dout2";
                                                function = "tdmc";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "tdmc_dout3";
                                                function = "tdmc";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "uart_tx_a",
                                                         "uart_rx_a";
                                                function = "uart_a";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "uart_cts_a",
                                                         "uart_rts_a";
                                                function = "uart_a";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "uart_tx_b_x",
                                                         "uart_rx_b_x";
                                                function = "uart_b";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "uart_cts_b_x",
                                                         "uart_rts_b_x";
                                                function = "uart_b";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "uart_tx_b_z",
                                                         "uart_rx_b_z";
                                                function = "uart_b";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "uart_cts_b_z",
                                                         "uart_rts_b_z";
                                                function = "uart_b";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "uart_ao_tx_b_z",
                                                         "uart_ao_rx_b_z";
                                                function = "uart_ao_b_z";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "uart_ao_cts_b_z",
                                                         "uart_ao_rts_b_z";
                                                function = "uart_ao_b_z";
+                                               bias-disable;
                                        };
                                };
                        };
                                clkc: clock-controller {
                                        compatible = "amlogic,axg-clkc";
                                        #clock-cells = <1>;
+                                       clocks = <&xtal>;
+                                       clock-names = "xtal";
                                };
                        };
                };
 
-               mailbox: mailbox@ff63dc00 {
-                       compatible = "amlogic,meson-gx-mhu", "amlogic,meson-gxbb-mhu";
-                       reg = <0 0xff63dc00 0 0x400>;
+               mailbox: mailbox@ff63c404 {
+                       compatible = "amlogic,meson-gxbb-mhu";
+                       reg = <0 0xff63c404 0 0x4c>;
                        interrupts = <GIC_SPI 208 IRQ_TYPE_EDGE_RISING>,
                                     <GIC_SPI 209 IRQ_TYPE_EDGE_RISING>,
                                     <GIC_SPI 210 IRQ_TYPE_EDGE_RISING>;
 
                        toddr_a: audio-controller@100 {
                                compatible = "amlogic,axg-toddr";
-                               reg = <0x0 0x100 0x0 0x1c>;
+                               reg = <0x0 0x100 0x0 0x2c>;
                                #sound-dai-cells = <0>;
                                sound-name-prefix = "TODDR_A";
                                interrupts = <GIC_SPI 84 IRQ_TYPE_EDGE_RISING>;
                                clocks = <&clkc_audio AUD_CLKID_TODDR_A>;
                                resets = <&arb AXG_ARB_TODDR_A>;
+                               amlogic,fifo-depth = <512>;
                                status = "disabled";
                        };
 
                        toddr_b: audio-controller@140 {
                                compatible = "amlogic,axg-toddr";
-                               reg = <0x0 0x140 0x0 0x1c>;
+                               reg = <0x0 0x140 0x0 0x2c>;
                                #sound-dai-cells = <0>;
                                sound-name-prefix = "TODDR_B";
                                interrupts = <GIC_SPI 85 IRQ_TYPE_EDGE_RISING>;
                                clocks = <&clkc_audio AUD_CLKID_TODDR_B>;
                                resets = <&arb AXG_ARB_TODDR_B>;
+                               amlogic,fifo-depth = <256>;
                                status = "disabled";
                        };
 
                        toddr_c: audio-controller@180 {
                                compatible = "amlogic,axg-toddr";
-                               reg = <0x0 0x180 0x0 0x1c>;
+                               reg = <0x0 0x180 0x0 0x2c>;
                                #sound-dai-cells = <0>;
                                sound-name-prefix = "TODDR_C";
                                interrupts = <GIC_SPI 86 IRQ_TYPE_EDGE_RISING>;
                                clocks = <&clkc_audio AUD_CLKID_TODDR_C>;
                                resets = <&arb AXG_ARB_TODDR_C>;
+                               amlogic,fifo-depth = <256>;
                                status = "disabled";
                        };
 
                        frddr_a: audio-controller@1c0 {
                                compatible = "amlogic,axg-frddr";
-                               reg = <0x0 0x1c0 0x0 0x1c>;
+                               reg = <0x0 0x1c0 0x0 0x2c>;
                                #sound-dai-cells = <0>;
                                sound-name-prefix = "FRDDR_A";
                                interrupts = <GIC_SPI 88 IRQ_TYPE_EDGE_RISING>;
                                clocks = <&clkc_audio AUD_CLKID_FRDDR_A>;
                                resets = <&arb AXG_ARB_FRDDR_A>;
+                               amlogic,fifo-depth = <512>;
                                status = "disabled";
                        };
 
                        frddr_b: audio-controller@200 {
                                compatible = "amlogic,axg-frddr";
-                               reg = <0x0 0x200 0x0 0x1c>;
+                               reg = <0x0 0x200 0x0 0x2c>;
                                #sound-dai-cells = <0>;
                                sound-name-prefix = "FRDDR_B";
                                interrupts = <GIC_SPI 89 IRQ_TYPE_EDGE_RISING>;
                                clocks = <&clkc_audio AUD_CLKID_FRDDR_B>;
                                resets = <&arb AXG_ARB_FRDDR_B>;
+                               amlogic,fifo-depth = <256>;
                                status = "disabled";
                        };
 
                        frddr_c: audio-controller@240 {
                                compatible = "amlogic,axg-frddr";
-                               reg = <0x0 0x240 0x0 0x1c>;
+                               reg = <0x0 0x240 0x0 0x2c>;
                                #sound-dai-cells = <0>;
                                sound-name-prefix = "FRDDR_C";
                                interrupts = <GIC_SPI 90 IRQ_TYPE_EDGE_RISING>;
                                clocks = <&clkc_audio AUD_CLKID_FRDDR_C>;
                                resets = <&arb AXG_ARB_FRDDR_C>;
+                               amlogic,fifo-depth = <256>;
                                status = "disabled";
                        };
 
                                status = "disabled";
                        };
 
+                       spdifin: audio-controller@400 {
+                               compatible = "amlogic,axg-spdifin";
+                               reg = <0x0 0x400 0x0 0x30>;
+                               #sound-dai-cells = <0>;
+                               sound-name-prefix = "SPDIFIN";
+                               interrupts = <GIC_SPI 87 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,axg-spdifout";
                                reg = <0x0 0x480 0x0 0x50>;
                                        compatible = "amlogic,meson-axg-aoclkc";
                                        #clock-cells = <1>;
                                        #reset-cells = <1>;
+                                       clocks = <&xtal>, <&clkc CLKID_CLK81>;
+                                       clock-names = "xtal", "mpeg-clk";
                                };
                        };
 
                                        mux {
                                                groups = "i2c_ao_sck_4";
                                                function = "i2c_ao";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "i2c_ao_sck_8";
                                                function = "i2c_ao";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "i2c_ao_sck_10";
                                                function = "i2c_ao";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "i2c_ao_sda_5";
                                                function = "i2c_ao";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "i2c_ao_sda_9";
                                                function = "i2c_ao";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "i2c_ao_sda_11";
                                                function = "i2c_ao";
+                                               bias-disable;
                                        };
                                };
 
                                        mux {
                                                groups = "remote_input_ao";
                                                function = "remote_input_ao";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "uart_ao_tx_a",
                                                         "uart_ao_rx_a";
                                                function = "uart_ao_a";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "uart_ao_cts_a",
                                                         "uart_ao_rts_a";
                                                function = "uart_ao_a";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "uart_ao_tx_b",
                                                         "uart_ao_rx_b";
                                                function = "uart_ao_b";
+                                               bias-disable;
                                        };
                                };
 
                                                groups = "uart_ao_cts_b",
                                                         "uart_ao_rts_b";
                                                function = "uart_ao_b";
+                                               bias-disable;
                                        };
                                };
                        };
                        };
 
                        gpio_intc: interrupt-controller@f080 {
-                               compatible = "amlogic,meson-gpio-intc";
+                               compatible = "amlogic,meson-axg-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>;
-                               status = "disabled";
+                       };
+
+                       watchdog@f0d0 {
+                               compatible = "amlogic,meson-gxbb-wdt";
+                               reg = <0x0 0xf0d0 0x0 0x10>;
+                               clocks = <&xtal>;
                        };
 
                        pwm_ab: pwm@1b000 {
                                status = "disabled";
                        };
 
+                       clk_msr: clock-measure@18000 {
+                               compatible = "amlogic,meson-axg-clk-measure";
+                               reg = <0x0 0x18000 0x0 0x10>;
+                       };
+
                        i2c3: i2c@1c000 {
                                compatible = "amlogic,meson-axg-i2c";
                                reg = <0x0 0x1c000 0x0 0x20>;
                        #size-cells = <1>;
                        ranges = <0 0x0 0xfffc0000 0x20000>;
 
-                       cpu_scp_lpri: scp-shmem@0 {
+                       cpu_scp_lpri: scp-shmem@13000 {
                                compatible = "amlogic,meson-axg-scp-shmem";
                                reg = <0x13000 0x400>;
                        };
 
-                       cpu_scp_hpri: scp-shmem@200 {
+                       cpu_scp_hpri: scp-shmem@13400 {
                                compatible = "amlogic,meson-axg-scp-shmem";
                                reg = <0x13400 0x400>;
                        };
index 3f39e020f74e62ede06732b5ac4046324f2adada..abe04f4ad7d873ba95f41e3b2e7b2b767f65aab9 100644 (file)
@@ -5,51 +5,42 @@
 
 #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-audio-reset.h>
 #include <dt-bindings/reset/amlogic,meson-g12a-reset.h>
+#include <dt-bindings/thermal/thermal.h>
 
 / {
        interrupt-parent = <&gic>;
        #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";
-       };
+       chosen {
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
 
-       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";
-       };
+               simplefb_cvbs: framebuffer-cvbs {
+                       compatible = "amlogic,simple-framebuffer",
+                                    "simple-framebuffer";
+                       amlogic,pipeline = "vpu-cvbs";
+                       clocks = <&clkc CLKID_HDMI>,
+                                <&clkc CLKID_HTX_PCLK>,
+                                <&clkc CLKID_VPU_INTR>;
+                       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";
+               simplefb_hdmi: framebuffer-hdmi {
+                       compatible = "amlogic,simple-framebuffer",
+                                   "simple-framebuffer";
+                       amlogic,pipeline = "vpu-hdmi";
+                       clocks = <&clkc CLKID_HDMI>,
+                                <&clkc CLKID_HTX_PCLK>,
+                                <&clkc CLKID_VPU_INTR>;
+                       status = "disabled";
+               };
        };
 
        efuse: efuse {
@@ -58,6 +49,7 @@
                #address-cells = <1>;
                #size-cells = <1>;
                read-only;
+               secure-monitor = <&sm>;
        };
 
        psci {
                #size-cells = <2>;
                ranges;
 
+               pcie: pcie@fc000000 {
+                       compatible = "amlogic,g12a-pcie", "snps,dw-pcie";
+                       reg = <0x0 0xfc000000 0x0 0x400000
+                              0x0 0xff648000 0x0 0x2000
+                              0x0 0xfc400000 0x0 0x200000>;
+                       reg-names = "elbi", "cfg", "config";
+                       interrupts = <GIC_SPI 221 IRQ_TYPE_LEVEL_HIGH>;
+                       #interrupt-cells = <1>;
+                       interrupt-map-mask = <0 0 0 0>;
+                       interrupt-map = <0 0 0 0 &gic GIC_SPI 223 IRQ_TYPE_LEVEL_HIGH>;
+                       bus-range = <0x0 0xff>;
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       device_type = "pci";
+                       ranges = <0x81000000 0 0 0x0 0xfc600000 0 0x00100000
+                                 0x82000000 0 0xfc700000 0x0 0xfc700000 0 0x1900000>;
+
+                       clocks = <&clkc CLKID_PCIE_PHY
+                                 &clkc CLKID_PCIE_COMB
+                                 &clkc CLKID_PCIE_PLL>;
+                       clock-names = "general",
+                                     "pclk",
+                                     "port";
+                       resets = <&reset RESET_PCIE_CTRL_A>,
+                                <&reset RESET_PCIE_APB>;
+                       reset-names = "port",
+                                     "apb";
+                       num-lanes = <1>;
+                       phys = <&usb3_pcie_phy PHY_TYPE_PCIE>;
+                       phy-names = "pcie";
+                       status = "disabled";
+               };
+
+               thermal-zones {
+                       cpu_thermal: cpu-thermal {
+                               polling-delay = <1000>;
+                               polling-delay-passive = <100>;
+                               thermal-sensors = <&cpu_temp>;
+
+                               trips {
+                                       cpu_passive: cpu-passive {
+                                               temperature = <85000>; /* millicelsius */
+                                               hysteresis = <2000>; /* millicelsius */
+                                               type = "passive";
+                                       };
+
+                                       cpu_hot: cpu-hot {
+                                               temperature = <95000>; /* millicelsius */
+                                               hysteresis = <2000>; /* millicelsius */
+                                               type = "hot";
+                                       };
+
+                                       cpu_critical: cpu-critical {
+                                               temperature = <110000>; /* millicelsius */
+                                               hysteresis = <2000>; /* millicelsius */
+                                               type = "critical";
+                                       };
+                               };
+                       };
+
+                       ddr_thermal: ddr-thermal {
+                               polling-delay = <1000>;
+                               polling-delay-passive = <100>;
+                               thermal-sensors = <&ddr_temp>;
+
+                               trips {
+                                       ddr_passive: ddr-passive {
+                                               temperature = <85000>; /* millicelsius */
+                                               hysteresis = <2000>; /* millicelsius */
+                                               type = "passive";
+                                       };
+
+                                       ddr_critical: ddr-critical {
+                                               temperature = <110000>; /* millicelsius */
+                                               hysteresis = <2000>; /* millicelsius */
+                                               type = "critical";
+                                       };
+                               };
+
+                               cooling-maps {
+                                       map {
+                                               trip = <&ddr_passive>;
+                                               cooling-device = <&mali THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                                       };
+                               };
+                       };
+               };
+
                ethmac: ethernet@ff3f0000 {
                        compatible = "amlogic,meson-axg-dwmac",
                                     "snps,dwmac-3.70a",
                                };
                        };
 
+                       cpu_temp: temperature-sensor@34800 {
+                               compatible = "amlogic,g12a-cpu-thermal",
+                                            "amlogic,g12a-thermal";
+                               reg = <0x0 0x34800 0x0 0x50>;
+                               interrupts = <GIC_SPI 35 IRQ_TYPE_EDGE_RISING>;
+                               clocks = <&clkc CLKID_TS>;
+                               #thermal-sensor-cells = <0>;
+                               amlogic,ao-secure = <&sec_AO>;
+                       };
+
+                       ddr_temp: temperature-sensor@34c00 {
+                               compatible = "amlogic,g12a-ddr-thermal",
+                                            "amlogic,g12a-thermal";
+                               reg = <0x0 0x34c00 0x0 0x50>;
+                               interrupts = <GIC_SPI 36 IRQ_TYPE_EDGE_RISING>;
+                               clocks = <&clkc CLKID_TS>;
+                               #thermal-sensor-cells = <0>;
+                               amlogic,ao-secure = <&sec_AO>;
+                       };
+
                        usb2_phy0: phy@36000 {
                                compatible = "amlogic,g12a-usb2-phy";
                                reg = <0x0 0x36000 0x0 0x2000>;
                                };
                        };
 
-                       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>;
-                                       #reset-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";
-                                       resets = <&clkc_audio AUD_RESET_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";
-                                       resets = <&clkc_audio AUD_RESET_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";
-                                       resets = <&clkc_audio AUD_RESET_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";
-                                       resets = <&clkc_audio AUD_RESET_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";
-                                       resets = <&clkc_audio AUD_RESET_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";
-                                       resets = <&clkc_audio AUD_RESET_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";
-                                       resets = <&clkc_audio AUD_RESET_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>;
                        };
                };
 
+               vdec: video-decoder@ff620000 {
+                       compatible = "amlogic,g12a-vdec";
+                       reg = <0x0 0xff620000 0x0 0x10000>,
+                             <0x0 0xffd0e180 0x0 0xe4>;
+                       reg-names = "dos", "esparser";
+                       interrupts = <GIC_SPI 44 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 32 IRQ_TYPE_EDGE_RISING>;
+                       interrupt-names = "vdec", "esparser";
+
+                       amlogic,ao-sysctrl = <&rti>;
+                       amlogic,canvas = <&canvas>;
+
+                       clocks = <&clkc CLKID_PARSER>,
+                                <&clkc CLKID_DOS>,
+                                <&clkc CLKID_VDEC_1>,
+                                <&clkc CLKID_VDEC_HEVC>,
+                                <&clkc CLKID_VDEC_HEVCF>;
+                       clock-names = "dos_parser", "dos", "vdec_1",
+                                     "vdec_hevc", "vdec_hevcf";
+                       resets = <&reset RESET_PARSER>;
+                       reset-names = "esparser";
+               };
+
                vpu: vpu@ff900000 {
                        compatible = "amlogic,meson-g12a-vpu";
                        reg = <0x0 0xff900000 0x0 0x100000>,
                        compatible = "amlogic,meson-g12a-mali", "arm,mali-bifrost";
                        reg = <0x0 0xffe40000 0x0 0x40000>;
                        interrupt-parent = <&gic>;
-                       interrupts = <GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>,
+                       interrupts = <GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>;
-                       interrupt-names = "gpu", "mmu", "job";
+                                    <GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "job", "mmu", "gpu";
                        clocks = <&clkc CLKID_MALI>;
                        resets = <&reset RESET_DVALIN_CAPB3>, <&reset RESET_DVALIN>;
 
                        assigned-clock-rates = <0>, /* Do Nothing */
                                               <800000000>,
                                               <0>; /* Do Nothing */
+                       #cooling-cells = <2>;
                };
        };
 
diff --git a/arch/arm/dts/meson-g12.dtsi b/arch/arm/dts/meson-g12.dtsi
new file mode 100644 (file)
index 0000000..03054c4
--- /dev/null
@@ -0,0 +1,398 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2019 BayLibre, SAS
+ * Author: Jerome Brunet <jbrunet@baylibre.com>
+ */
+
+#include "meson-g12-common.dtsi"
+#include <dt-bindings/clock/axg-audio-clkc.h>
+#include <dt-bindings/power/meson-g12a-power.h>
+#include <dt-bindings/reset/amlogic,meson-axg-audio-arb.h>
+#include <dt-bindings/reset/amlogic,meson-g12a-audio-reset.h>
+
+/ {
+       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";
+       };
+};
+
+&apb {
+       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>;
+                       #reset-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 0x2c>;
+                       #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>,
+                                <&clkc_audio AUD_RESET_TODDR_A>;
+                       reset-names = "arb", "rst";
+                       amlogic,fifo-depth = <512>;
+                       status = "disabled";
+               };
+
+               toddr_b: audio-controller@140 {
+                       compatible = "amlogic,g12a-toddr",
+                                    "amlogic,axg-toddr";
+                       reg = <0x0 0x140 0x0 0x2c>;
+                       #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>,
+                                <&clkc_audio AUD_RESET_TODDR_B>;
+                       reset-names = "arb", "rst";
+                       amlogic,fifo-depth = <256>;
+                       status = "disabled";
+               };
+
+               toddr_c: audio-controller@180 {
+                       compatible = "amlogic,g12a-toddr",
+                                    "amlogic,axg-toddr";
+                       reg = <0x0 0x180 0x0 0x2c>;
+                       #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>,
+                                <&clkc_audio AUD_RESET_TODDR_C>;
+                       reset-names = "arb", "rst";
+                       amlogic,fifo-depth = <256>;
+                       status = "disabled";
+               };
+
+               frddr_a: audio-controller@1c0 {
+                       compatible = "amlogic,g12a-frddr",
+                                    "amlogic,axg-frddr";
+                       reg = <0x0 0x1c0 0x0 0x2c>;
+                       #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>,
+                                <&clkc_audio AUD_RESET_FRDDR_A>;
+                       reset-names = "arb", "rst";
+                       amlogic,fifo-depth = <512>;
+                       status = "disabled";
+               };
+
+               frddr_b: audio-controller@200 {
+                       compatible = "amlogic,g12a-frddr",
+                                    "amlogic,axg-frddr";
+                       reg = <0x0 0x200 0x0 0x2c>;
+                       #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>,
+                                <&clkc_audio AUD_RESET_FRDDR_B>;
+                       reset-names = "arb", "rst";
+                       amlogic,fifo-depth = <256>;
+                       status = "disabled";
+               };
+
+               frddr_c: audio-controller@240 {
+                       compatible = "amlogic,g12a-frddr",
+                                    "amlogic,axg-frddr";
+                       reg = <0x0 0x240 0x0 0x2c>;
+                       #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>,
+                                <&clkc_audio AUD_RESET_FRDDR_C>;
+                       reset-names = "arb", "rst";
+                       amlogic,fifo-depth = <256>;
+                       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";
+                       resets = <&clkc_audio AUD_RESET_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";
+                       resets = <&clkc_audio AUD_RESET_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";
+                       resets = <&clkc_audio AUD_RESET_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";
+                       resets = <&clkc_audio AUD_RESET_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";
+                       resets = <&clkc_audio AUD_RESET_SPDIFIN>;
+                       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";
+                       resets = <&clkc_audio AUD_RESET_SPDIFOUT>;
+                       status = "disabled";
+               };
+
+               tdmout_a: audio-controller@500 {
+                       compatible = "amlogic,g12a-tdmout";
+                       reg = <0x0 0x500 0x0 0x40>;
+                       sound-name-prefix = "TDMOUT_A";
+                       resets = <&clkc_audio AUD_RESET_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";
+                       resets = <&clkc_audio AUD_RESET_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";
+                       resets = <&clkc_audio AUD_RESET_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";
+                       resets = <&clkc_audio AUD_RESET_SPDIFOUT_B>;
+                       status = "disabled";
+               };
+
+               tohdmitx: audio-controller@744 {
+                       compatible = "amlogic,g12a-tohdmitx";
+                       reg = <0x0 0x744 0x0 0x4>;
+                       #sound-dai-cells = <1>;
+                       sound-name-prefix = "TOHDMITX";
+                       resets = <&clkc_audio AUD_RESET_TOHDMITX>;
+                       status = "disabled";
+               };
+       };
+};
+
+&cpu_thermal {
+       cooling-maps {
+               map0 {
+                       trip = <&cpu_passive>;
+                       cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                        <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                        <&cpu100 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                        <&cpu101 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                        <&cpu102 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                        <&cpu103 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+               };
+               map1 {
+                       trip = <&cpu_hot>;
+                       cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                        <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                        <&cpu100 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                        <&cpu101 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                        <&cpu102 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                        <&cpu103 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+               };
+       };
+};
+
+&ethmac {
+       power-domains = <&pwrc PWRC_G12A_ETH_ID>;
+};
+
+&vpu {
+       power-domains = <&pwrc PWRC_G12A_VPU_ID>;
+};
+
+&sd_emmc_a {
+       amlogic,dram-access-quirk;
+};
+
+&simplefb_cvbs {
+       power-domains = <&pwrc PWRC_G12A_VPU_ID>;
+};
+
+&simplefb_hdmi {
+       power-domains = <&pwrc PWRC_G12A_VPU_ID>;
+};
+
index c7a87368850b03ffbacb0a8f122fd4da6b800e20..2ac9e3a43b966a43e296b4504d2078f3807627ab 100644 (file)
                enable-active-high;
        };
 
+       vddcpu: regulator-vddcpu {
+               /*
+                * SY8120B1ABC DC/DC Regulator.
+                */
+               compatible = "pwm-regulator";
+
+               regulator-name = "VDDCPU";
+               regulator-min-microvolt = <721000>;
+               regulator-max-microvolt = <1022000>;
+
+               vin-supply = <&dc_in>;
+
+               pwms = <&pwm_AO_cd 1 1250 0>;
+               pwm-dutycycle-range = <100 0>;
+
+               regulator-boot-on;
+               regulator-always-on;
+       };
+
        vddio_ao1v8: regulator-vddio_ao1v8 {
                compatible = "regulator-fixed";
                regulator-name = "VDDIO_AO1V8";
        status = "okay";
 };
 
+&cpu0 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU_CLK>;
+       clock-latency = <50000>;
+};
+
+&cpu1 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU_CLK>;
+       clock-latency = <50000>;
+};
+
+&cpu2 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU_CLK>;
+       clock-latency = <50000>;
+};
+
+&cpu3 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU_CLK>;
+       clock-latency = <50000>;
+};
+
 &cvbs_vdac_port {
        cvbs_vdac_out: endpoint {
                remote-endpoint = <&cvbs_connector_in>;
        pinctrl-names = "default";
 };
 
+&ir {
+       status = "okay";
+       pinctrl-0 = <&remote_input_ao_pins>;
+       pinctrl-names = "default";
+};
+
+&pwm_AO_cd {
+       pinctrl-0 = <&pwm_ao_d_e_pins>;
+       pinctrl-names = "default";
+       clocks = <&xtal>;
+       clock-names = "clkin1";
+       status = "okay";
+};
+
 &pwm_ef {
        status = "okay";
        pinctrl-0 = <&pwm_e_pins>;
        non-removable;
        disable-wp;
 
+       /* WiFi firmware requires power to be kept while in suspend */
+       keep-power-in-suspend;
+
        mmc-pwrseq = <&sdio_pwrseq>;
 
        vmmc-supply = <&vddao_3v3>;
index 8551fbd4a488cfd358c160104177e3a9e613108d..2a324f0136e3fc404dc243d4985e889634b79352 100644 (file)
                regulator-always-on;
        };
 
+       vddcpu: regulator-vddcpu {
+               /*
+                * MP8756GD Regulator.
+                */
+               compatible = "pwm-regulator";
+
+               regulator-name = "VDDCPU";
+               regulator-min-microvolt = <721000>;
+               regulator-max-microvolt = <1022000>;
+
+               vin-supply = <&main_12v>;
+
+               pwms = <&pwm_AO_cd 1 1250 0>;
+               pwm-dutycycle-range = <100 0>;
+
+               regulator-boot-on;
+               regulator-always-on;
+       };
 };
 
 &cec_AO {
        hdmi-phandle = <&hdmi_tx>;
 };
 
+&cpu0 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU_CLK>;
+       clock-latency = <50000>;
+};
+
+&cpu1 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU_CLK>;
+       clock-latency = <50000>;
+};
+
+&cpu2 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU_CLK>;
+       clock-latency = <50000>;
+};
+
+&cpu3 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU_CLK>;
+       clock-latency = <50000>;
+};
+
 &cvbs_vdac_port {
        cvbs_vdac_out: endpoint {
                remote-endpoint = <&cvbs_connector_in>;
        pinctrl-names = "default";
 };
 
+&pwm_AO_cd {
+       pinctrl-0 = <&pwm_ao_d_e_pins>;
+       pinctrl-names = "default";
+       clocks = <&xtal>;
+       clock-names = "clkin1";
+       status = "okay";
+};
+
 /* SD card */
 &sd_emmc_b {
        status = "okay";
index eb5d177d7a999311e21ff1cc8ceb8350908c8611..fb0ab27d1f642dbe5e7100f737ea64b7a69d5eb1 100644 (file)
@@ -3,8 +3,7 @@
  * Copyright (c) 2018 Amlogic, Inc. All rights reserved.
  */
 
-#include "meson-g12-common.dtsi"
-#include <dt-bindings/power/meson-g12a-power.h>
+#include "meson-g12.dtsi"
 
 / {
        compatible = "amlogic,g12a";
@@ -19,6 +18,7 @@
                        reg = <0x0 0x0>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
+                       #cooling-cells = <2>;
                };
 
                cpu1: cpu@1 {
@@ -27,6 +27,7 @@
                        reg = <0x0 0x1>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
+                       #cooling-cells = <2>;
                };
 
                cpu2: cpu@2 {
@@ -35,6 +36,7 @@
                        reg = <0x0 0x2>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
+                       #cooling-cells = <2>;
                };
 
                cpu3: cpu@3 {
@@ -43,6 +45,7 @@
                        reg = <0x0 0x3>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
+                       #cooling-cells = <2>;
                };
 
                l2: l2-cache0 {
        };
 };
 
-&ethmac {
-       power-domains = <&pwrc PWRC_G12A_ETH_ID>;
-};
-
-&vpu {
-       power-domains = <&pwrc PWRC_G12A_VPU_ID>;
-};
+&cpu_thermal {
+       cooling-maps {
+               map0 {
+                       trip = <&cpu_passive>;
+                       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>;
+               };
 
-&sd_emmc_a {
-       amlogic,dram-access-quirk;
+               map1 {
+                       trip = <&cpu_hot>;
+                       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>;
+               };
+       };
 };
index 3a6a1e0c1e32c5cd4101e25bc979ac6ff091cdbc..124a809010840f31ff5b72dd92d9ceb82a105610 100644 (file)
 / {
        compatible = "khadas,vim3", "amlogic,a311d", "amlogic,g12b";
 };
+
+/*
+ * The VIM3 on-board  MCU can mux the PCIe/USB3.0 shared differential
+ * lines using a FUSB340TMX USB 3.1 SuperSpeed Data Switch between
+ * an USB3.0 Type A connector and a M.2 Key M slot.
+ * The PHY driving these differential lines is shared between
+ * the USB3.0 controller and the PCIe Controller, thus only
+ * a single controller can use it.
+ * If the MCU is configured to mux the PCIe/USB3.0 differential lines
+ * to the M.2 Key M slot, uncomment the following block to disable
+ * USB3.0 from the USB Complex and enable the PCIe controller.
+ * The End User is not expected to uncomment the following except for
+ * testing purposes, but instead rely on the firmware/bootloader to
+ * update these nodes accordingly if PCIe mode is selected by the MCU.
+ */
+/*
+&pcie {
+       status = "okay";
+};
+
+&usb {
+       phys = <&usb2_phy0>, <&usb2_phy1>;
+       phy-names = "usb2-phy0", "usb2-phy1";
+};
+ */
index 42f15405750cd9f7ed1f01373580c86db0ee3b73..0e54c1dc2842b2a85486d348d5d84dc5948e1828 100644 (file)
@@ -12,7 +12,7 @@
 #include <dt-bindings/sound/meson-g12a-tohdmitx.h>
 
 / {
-       compatible = "hardkernel,odroid-n2", "amlogic,g12b";
+       compatible = "hardkernel,odroid-n2", "amlogic,s922x", "amlogic,g12b";
        model = "Hardkernel ODROID-N2";
 
        aliases {
index 5628ccd54531ac28e11d5eb3683344c6cef25991..6dbc3968045b812c1337d32ef8a4f8f554e4328e 100644 (file)
@@ -4,8 +4,7 @@
  * Author: Neil Armstrong <narmstrong@baylibre.com>
  */
 
-#include "meson-g12-common.dtsi"
-#include <dt-bindings/power/meson-g12a-power.h>
+#include "meson-g12.dtsi"
 
 / {
        compatible = "amlogic,g12b";
@@ -49,7 +48,9 @@
                        compatible = "arm,cortex-a53";
                        reg = <0x0 0x0>;
                        enable-method = "psci";
+                       capacity-dmips-mhz = <592>;
                        next-level-cache = <&l2>;
+                       #cooling-cells = <2>;
                };
 
                cpu1: cpu@1 {
@@ -57,7 +58,9 @@
                        compatible = "arm,cortex-a53";
                        reg = <0x0 0x1>;
                        enable-method = "psci";
+                       capacity-dmips-mhz = <592>;
                        next-level-cache = <&l2>;
+                       #cooling-cells = <2>;
                };
 
                cpu100: cpu@100 {
@@ -65,7 +68,9 @@
                        compatible = "arm,cortex-a73";
                        reg = <0x0 0x100>;
                        enable-method = "psci";
+                       capacity-dmips-mhz = <1024>;
                        next-level-cache = <&l2>;
+                       #cooling-cells = <2>;
                };
 
                cpu101: cpu@101 {
@@ -73,7 +78,9 @@
                        compatible = "arm,cortex-a73";
                        reg = <0x0 0x101>;
                        enable-method = "psci";
+                       capacity-dmips-mhz = <1024>;
                        next-level-cache = <&l2>;
+                       #cooling-cells = <2>;
                };
 
                cpu102: cpu@102 {
@@ -81,7 +88,9 @@
                        compatible = "arm,cortex-a73";
                        reg = <0x0 0x102>;
                        enable-method = "psci";
+                       capacity-dmips-mhz = <1024>;
                        next-level-cache = <&l2>;
+                       #cooling-cells = <2>;
                };
 
                cpu103: cpu@103 {
@@ -89,7 +98,9 @@
                        compatible = "arm,cortex-a73";
                        reg = <0x0 0x103>;
                        enable-method = "psci";
+                       capacity-dmips-mhz = <1024>;
                        next-level-cache = <&l2>;
+                       #cooling-cells = <2>;
                };
 
                l2: l2-cache0 {
        compatible = "amlogic,g12b-clkc";
 };
 
-&ethmac {
-       power-domains = <&pwrc PWRC_G12A_ETH_ID>;
-};
-
-&vpu {
-       power-domains = <&pwrc PWRC_G12A_VPU_ID>;
-};
-
-&sd_emmc_a {
-       amlogic,dram-access-quirk;
-};
diff --git a/arch/arm/dts/meson-gx-libretech-pc.dtsi b/arch/arm/dts/meson-gx-libretech-pc.dtsi
new file mode 100644 (file)
index 0000000..248b018
--- /dev/null
@@ -0,0 +1,375 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019 BayLibre SAS.
+ * Author: Jerome Brunet <jbrunet@baylibre.com>
+ */
+
+/* Libretech Amlogic GX PC form factor - AKA: Tartiflette */
+
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+
+/ {
+       adc-keys {
+               compatible = "adc-keys";
+               io-channels = <&saradc 0>;
+               io-channel-names = "buttons";
+               keyup-threshold-microvolt = <1800000>;
+
+               update-button {
+                       label = "update";
+                       linux,code = <KEY_VENDOR>;
+                       press-threshold-microvolt = <1300000>;
+               };
+       };
+
+       aliases {
+               serial0 = &uart_AO;
+               ethernet0 = &ethmac;
+               spi0 = &spifc;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       cvbs-connector {
+               compatible = "composite-video-connector";
+               status = "disabled";
+
+               port {
+                       cvbs_connector_in: endpoint {
+                               remote-endpoint = <&cvbs_vdac_out>;
+                       };
+               };
+       };
+
+       emmc_pwrseq: emmc-pwrseq {
+               compatible = "mmc-pwrseq-emmc";
+               reset-gpios = <&gpio BOOT_9 GPIO_ACTIVE_LOW>;
+       };
+
+       hdmi-connector {
+               compatible = "hdmi-connector";
+               type = "a";
+
+               port {
+                       hdmi_connector_in: endpoint {
+                               remote-endpoint = <&hdmi_tx_tmds_out>;
+                       };
+               };
+       };
+
+       gpio-keys-polled {
+               compatible = "gpio-keys-polled";
+               poll-interval = <100>;
+
+               power-button {
+                       label = "power";
+                       linux,code = <KEY_POWER>;
+                       gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>;
+               };
+       };
+
+       memory@0 {
+               device_type = "memory";
+               reg = <0x0 0x0 0x0 0x80000000>;
+       };
+
+       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;
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               green {
+                       color = <LED_COLOR_ID_GREEN>;
+                       function = LED_FUNCTION_DISK_ACTIVITY;
+                       gpios = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "disk-activity";
+               };
+
+               blue {
+                       color = <LED_COLOR_ID_BLUE>;
+                       function = LED_FUNCTION_STATUS;
+                       gpios = <&gpio GPIODV_28 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "heartbeat";
+                       panic-indicator;
+               };
+       };
+
+       vcc_card: regulator-vcc_card {
+               compatible = "regulator-fixed";
+               regulator-name = "VCC_CARD";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&vddio_ao3v3>;
+
+               gpio = <&gpio GPIODV_4 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       vcc5v: regulator-vcc5v {
+               compatible = "regulator-fixed";
+               regulator-name = "VCC5V";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&ao_5v>;
+
+               gpio = <&gpio GPIOH_3 GPIO_OPEN_DRAIN>;
+       };
+
+       vddio_ao18: regulator-vddio_ao18 {
+               compatible = "regulator-fixed";
+               regulator-name = "VDDIO_AO18";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&ao_5v>;
+               regulator-always-on;
+       };
+
+       vddio_ao3v3: regulator-vddio_ao3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "VDDIO_AO3V3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&ao_5v>;
+               regulator-always-on;
+       };
+
+       vddio_boot: regulator-vddio_boot {
+               compatible = "regulator-fixed";
+               regulator-name = "VDDIO_BOOT";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&vddio_ao3v3>;
+               regulator-always-on;
+       };
+
+       vddio_card: regulator-vddio-card {
+               compatible = "regulator-gpio";
+               regulator-name = "VDDIO_CARD";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpios = <&gpio GPIODV_5 GPIO_ACTIVE_HIGH>;
+               gpios-states = <0>;
+
+               states = <3300000 0>,
+                        <1800000 1>;
+
+               regulator-settling-time-up-us = <200>;
+               regulator-settling-time-down-us = <50000>;
+       };
+};
+
+&cec_AO {
+       pinctrl-0 = <&ao_cec_pins>;
+       pinctrl-names = "default";
+       hdmi-phandle = <&hdmi_tx>;
+       status = "okay";
+};
+
+&cvbs_vdac_port {
+       cvbs_vdac_out: endpoint {
+               remote-endpoint = <&cvbs_connector_in>;
+       };
+};
+
+&ethmac {
+       pinctrl-0 = <&eth_pins>, <&eth_phy_irq_pins>;
+       pinctrl-names = "default";
+       phy-handle = <&external_phy>;
+       amlogic,tx-delay-ns = <2>;
+       phy-mode = "rgmii";
+       status = "okay";
+};
+
+&external_mdio {
+       external_phy: ethernet-phy@0 {
+               reg = <0>;
+               max-speed = <1000>;
+               reset-assert-us = <10000>;
+               reset-deassert-us = <30000>;
+               reset-gpios = <&gpio GPIOZ_14 GPIO_ACTIVE_LOW>;
+               interrupt-parent = <&gpio_intc>;
+               interrupts = <25 IRQ_TYPE_LEVEL_LOW>;
+       };
+};
+
+&pinctrl_periphs {
+       /*
+        * Make sure the reset pin of the usb HUB is driven high to take
+        * it out of reset.
+        */
+       usb1_rst_pins: usb1_rst_irq {
+               mux {
+                       groups = "GPIODV_3";
+                       function = "gpio_periphs";
+                       bias-disable;
+                       output-high;
+               };
+       };
+
+       /* Make sure the phy irq pin is properly configured as input */
+       eth_phy_irq_pins: eth_phy_irq {
+               mux {
+                       groups = "GPIOZ_15";
+                       function = "gpio_periphs";
+                       bias-disable;
+                       output-disable;
+               };
+       };
+};
+
+&hdmi_tx {
+       pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>;
+       pinctrl-names = "default";
+       hdmi-supply = <&vcc5v>;
+       status = "okay";
+};
+
+&hdmi_tx_tmds_port {
+       hdmi_tx_tmds_out: endpoint {
+               remote-endpoint = <&hdmi_connector_in>;
+       };
+};
+
+&ir {
+       pinctrl-0 = <&remote_input_ao_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&i2c_C {
+       pinctrl-0 = <&i2c_c_dv18_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+
+       rtc: rtc@51 {
+               reg = <0x51>;
+               compatible = "nxp,pcf8563";
+               #clock-cells = <0>;
+               clock-output-names = "rtc_clkout";
+       };
+};
+
+&pwm_AO_ab {
+       pinctrl-0 = <&pwm_ao_a_3_pins>;
+       pinctrl-names = "default";
+       clocks = <&clkc CLKID_FCLK_DIV4>;
+       clock-names = "clkin0";
+       status = "okay";
+};
+
+&pwm_ab {
+       pinctrl-0 = <&pwm_b_pins>;
+       pinctrl-names = "default";
+       clocks = <&clkc CLKID_FCLK_DIV4>;
+       clock-names = "clkin0";
+       status = "okay";
+};
+
+&pwm_ef {
+       pinctrl-0 = <&pwm_e_pins>, <&pwm_f_clk_pins>;
+       pinctrl-names = "default";
+       clocks = <&clkc CLKID_FCLK_DIV4>;
+       clock-names = "clkin0";
+       status = "okay";
+};
+
+&saradc {
+       vref-supply = <&vddio_ao18>;
+       status = "okay";
+};
+
+/* SD card */
+&sd_emmc_b {
+       pinctrl-0 = <&sdcard_pins>;
+       pinctrl-1 = <&sdcard_clk_gate_pins>;
+       pinctrl-names = "default", "clk-gate";
+
+       bus-width = <4>;
+       cap-sd-highspeed;
+       sd-uhs-sdr12;
+       sd-uhs-sdr25;
+       sd-uhs-sdr50;
+       sd-uhs-ddr50;
+       max-frequency = <200000000>;
+       disable-wp;
+
+       cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
+
+       vmmc-supply = <&vcc_card>;
+       vqmmc-supply = <&vddio_card>;
+
+       status = "okay";
+};
+
+/* eMMC */
+&sd_emmc_c {
+       pinctrl-0 = <&emmc_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 = <&vddio_ao3v3>;
+       vqmmc-supply = <&vddio_boot>;
+
+       status = "okay";
+};
+
+&spifc {
+       pinctrl-0 = <&nor_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+
+       gd25lq128: spi-flash@0 {
+               compatible = "jedec,spi-nor";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               spi-max-frequency = <12000000>;
+       };
+};
+
+&uart_AO {
+       pinctrl-0 = <&uart_ao_a_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
+&usb0 {
+       status = "okay";
+};
+
+&usb2_phy0 {
+       pinctrl-0 = <&usb1_rst_pins>;
+       pinctrl-names = "default";
+       phy-supply = <&vcc5v>;
+};
+
+&usb2_phy1 {
+       phy-supply = <&vcc5v>;
+};
index f1e5cdbade5edf281ecc9ea183c5e5b763c0f726..40db06e28b662f85e1d20c12fd1fe52f7ad85680 100644 (file)
                };
        };
 
+       chosen {
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+
+               simplefb_cvbs: framebuffer-cvbs {
+                       compatible = "amlogic,simple-framebuffer",
+                                    "simple-framebuffer";
+                       amlogic,pipeline = "vpu-cvbs";
+                       power-domains = <&pwrc_vpu>;
+                       status = "disabled";
+               };
+
+               simplefb_hdmi: framebuffer-hdmi {
+                       compatible = "amlogic,simple-framebuffer",
+                                    "simple-framebuffer";
+                       amlogic,pipeline = "vpu-hdmi";
+                       power-domains = <&pwrc_vpu>;
+                       status = "disabled";
+               };
+       };
+
        cpus {
                #address-cells = <0x2>;
                #size-cells = <0x0>;
 
                cpu0: cpu@0 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x0 0x0>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
@@ -65,7 +87,7 @@
 
                cpu1: cpu@1 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x0 0x1>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
@@ -74,7 +96,7 @@
 
                cpu2: cpu@2 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x0 0x2>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
 
                cpu3: cpu@3 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x0 0x3>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
                #address-cells = <1>;
                #size-cells = <1>;
                read-only;
+               secure-monitor = <&sm>;
 
                sn: sn@14 {
                        reg = <0x14 0x10>;
                        };
 
                        reset: reset-controller@4404 {
-                               compatible = "amlogic,meson-gx-reset", "amlogic,meson-gxbb-reset";
+                               compatible = "amlogic,meson-gxbb-reset";
                                reg = <0x0 0x04404 0x0 0x9c>;
                                #reset-cells = <1>;
                        };
                        };
 
                        i2c_A: i2c@8500 {
-                               compatible = "amlogic,meson-gx-i2c", "amlogic,meson-gxbb-i2c";
+                               compatible = "amlogic,meson-gxbb-i2c";
                                reg = <0x0 0x08500 0x0 0x20>;
                                interrupts = <GIC_SPI 21 IRQ_TYPE_EDGE_RISING>;
                                #address-cells = <1>;
                                status = "disabled";
                        };
 
+                       clock-measure@8758 {
+                               compatible = "amlogic,meson-gx-clk-measure";
+                               reg = <0x0 0x8758 0x0 0x10>;
+                       };
+
                        i2c_B: i2c@87c0 {
-                               compatible = "amlogic,meson-gx-i2c", "amlogic,meson-gxbb-i2c";
+                               compatible = "amlogic,meson-gxbb-i2c";
                                reg = <0x0 0x087c0 0x0 0x20>;
                                interrupts = <GIC_SPI 214 IRQ_TYPE_EDGE_RISING>;
                                #address-cells = <1>;
                        };
 
                        i2c_C: i2c@87e0 {
-                               compatible = "amlogic,meson-gx-i2c", "amlogic,meson-gxbb-i2c";
+                               compatible = "amlogic,meson-gxbb-i2c";
                                reg = <0x0 0x087e0 0x0 0x20>;
                                interrupts = <GIC_SPI 215 IRQ_TYPE_EDGE_RISING>;
                                #address-cells = <1>;
                        };
 
                        spifc: spi@8c80 {
-                               compatible = "amlogic,meson-gx-spifc", "amlogic,meson-gxbb-spifc";
+                               compatible = "amlogic,meson-gxbb-spifc";
                                reg = <0x0 0x08c80 0x0 0x80>;
                                #address-cells = <1>;
                                #size-cells = <0>;
                        };
 
                        watchdog@98d0 {
-                               compatible = "amlogic,meson-gx-wdt", "amlogic,meson-gxbb-wdt";
+                               compatible = "amlogic,meson-gxbb-wdt";
                                reg = <0x0 0x098d0 0x0 0x10>;
                                clocks = <&xtal>;
                        };
                                compatible = "amlogic,meson-gx-ao-cec";
                                reg = <0x0 0x00100 0x0 0x14>;
                                interrupts = <GIC_SPI 199 IRQ_TYPE_EDGE_RISING>;
+                               status = "disabled";
                        };
 
                        sec_AO: ao-secure@140 {
                        };
 
                        i2c_AO: i2c@500 {
-                               compatible = "amlogic,meson-gx-i2c", "amlogic,meson-gxbb-i2c";
+                               compatible = "amlogic,meson-gxbb-i2c";
                                reg = <0x0 0x500 0x0 0x20>;
                                interrupts = <GIC_SPI 195 IRQ_TYPE_EDGE_RISING>;
                                #address-cells = <1>;
                        };
                };
 
-               periphs: periphs@c8834000 {
+               vdec: video-codec@c8820000 {
+                       compatible = "amlogic,gx-vdec";
+                       reg = <0x0 0xc8820000 0x0 0x10000>,
+                             <0x0 0xc110a580 0x0 0xe4>;
+                       reg-names = "dos", "esparser";
+
+                       interrupts = <GIC_SPI 44 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 32 IRQ_TYPE_EDGE_RISING>;
+                       interrupt-names = "vdec", "esparser";
+
+                       amlogic,ao-sysctrl = <&sysctrl_AO>;
+                       amlogic,canvas = <&canvas>;
+               };
+
+               periphs: bus@c8834000 {
                        compatible = "simple-bus";
                        reg = <0x0 0xc8834000 0x0 0x2000>;
                        #address-cells = <2>;
                        };
 
                        mailbox: mailbox@404 {
-                               compatible = "amlogic,meson-gx-mhu", "amlogic,meson-gxbb-mhu";
+                               compatible = "amlogic,meson-gxbb-mhu";
                                reg = <0 0x404 0 0x4c>;
                                interrupts = <GIC_SPI 208 IRQ_TYPE_EDGE_RISING>,
                                             <GIC_SPI 209 IRQ_TYPE_EDGE_RISING>,
                };
 
                ethmac: ethernet@c9410000 {
-                       compatible = "amlogic,meson-gx-dwmac", "amlogic,meson-gxbb-dwmac", "snps,dwmac";
-                       reg = <0x0 0xc9410000 0x0 0x10000
-                              0x0 0xc8834540 0x0 0x4>;
-                       interrupts = <GIC_SPI 8 IRQ_TYPE_EDGE_RISING>;
+                       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>;
                        interrupt-names = "macirq";
+                       rx-fifo-depth = <4096>;
+                       tx-fifo-depth = <2048>;
                        status = "disabled";
                };
 
                vpu: vpu@d0100000 {
                        compatible = "amlogic,meson-gx-vpu";
                        reg = <0x0 0xd0100000 0x0 0x100000>,
-                             <0x0 0xc883c000 0x0 0x1000>,
-                             <0x0 0xc8838000 0x0 0x1000>;
-                       reg-names = "vpu", "hhi", "dmc";
+                             <0x0 0xc883c000 0x0 0x1000>;
+                       reg-names = "vpu", "hhi";
                        interrupts = <GIC_SPI 3 IRQ_TYPE_EDGE_RISING>;
                        #address-cells = <1>;
                        #size-cells = <0>;
+                       amlogic,canvas = <&canvas>;
 
                        /* CVBS VDAC output port */
                        cvbs_vdac_port: port@0 {
index cbe99bd4e06d2c43934a23848bbe788ee69e0390..d6ca684e0e616bc1d2a63df5fe5505f9fab46c2c 100644 (file)
@@ -10,6 +10,7 @@
 
 / {
        compatible = "friendlyarm,nanopi-k2", "amlogic,meson-gxbb";
+       model = "FriendlyARM NanoPi K2";
 
        aliases {
                serial0 = &uart_AO;
 
        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>;
        pinctrl-names = "default";
 };
 
-&pinctrl_aobus {
+&gpio_ao {
        gpio-line-names = "UART TX", "UART RX", "Power Control", "Power Key In",
                          "VCCK En", "CON1 Header Pin31",
                          "I2S Header Pin6", "IR In", "I2S Header Pin7",
                          "";
 };
 
-&pinctrl_periphs {
+&gpio {
        gpio-line-names = /* Bank GPIOZ */
                          "Eth MDIO", "Eth MDC", "Eth RGMII RX Clk",
                          "Eth RX DV", "Eth RX D0", "Eth RX D1", "Eth RX D2",
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <200000000>;
+       max-frequency = <50000000>;
 
        non-removable;
        disable-wp;
 
+       /* WiFi firmware requires power to be kept while in suspend */
+       keep-power-in-suspend;
+
        mmc-pwrseq = <&sdio_pwrseq>;
 
        vmmc-supply = <&vddio_ao3v3>;
        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_HIGH>;
-       cd-inverted;
+       cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
 
        vmmc-supply = <&vddio_ao3v3>;
        vqmmc-supply = <&vddio_tf>;
index 54954b314a452b7929aa0ce30a031927c2832b92..6ded279c40c86f42e5d42d26c536d424849ce1a3 100644 (file)
                regulator-min-microvolt = <5000000>;
                regulator-max-microvolt = <5000000>;
 
+               /*
+                * signal name from schematics: PWREN
+                */
                gpio = <&gpio_ao GPIOAO_5 GPIO_ACTIVE_HIGH>;
                enable-active-high;
+               /*
+                * signal name from schematics: USB_POWER
+                */
+               vin-supply = <&p5v0>;
        };
 
        leds {
                };
        };
 
+       p5v0: regulator-p5v0 {
+               compatible = "regulator-fixed";
+
+               regulator-name = "P5V0";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               regulator-always-on;
+       };
+
+       hdmi_p5v0: regulator-hdmi_p5v0 {
+               compatible = "regulator-fixed";
+               regulator-name = "HDMI_P5V0";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               /* AP2331SA-7 */
+               vin-supply = <&p5v0>;
+       };
+
        tflash_vdd: regulator-tflash_vdd {
-               /*
-                * signal name from schematics: TFLASH_VDD_EN
-                */
                compatible = "regulator-fixed";
 
                regulator-name = "TFLASH_VDD";
                regulator-min-microvolt = <3300000>;
                regulator-max-microvolt = <3300000>;
 
+               /*
+                * signal name from schematics: TFLASH_VDD_EN
+                */
                gpio = <&gpio GPIOY_12 GPIO_ACTIVE_HIGH>;
                enable-active-high;
+               /* U16 RT9179GB */
+               vin-supply = <&vddio_ao3v3>;
        };
 
        tf_io: gpio-regulator-tf_io {
                gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_HIGH>;
                gpios-states = <0>;
 
-               states = <3300000 0
-                         1800000 1>;
+               states = <3300000 0>,
+                        <1800000 1>;
+               /* U12/U13 RT9179GB */
+               vin-supply = <&vddio_ao3v3>;
        };
 
        vcc1v8: regulator-vcc1v8 {
                regulator-name = "VCC1V8";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <1800000>;
+               regulator-always-on;
+               /* U18 RT9179GB */
+               vin-supply = <&vddio_ao3v3>;
        };
 
        vcc3v3: regulator-vcc3v3 {
                regulator-max-microvolt = <3300000>;
        };
 
+       vddio_ao1v8: regulator-vddio-ao1v8 {
+               compatible = "regulator-fixed";
+               regulator-name = "VDDIO_AO1V8";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               regulator-always-on;
+               /* U17 RT9179GB */
+               vin-supply = <&p5v0>;
+       };
+
+       vddio_ao3v3: regulator-vddio-ao3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "VDDIO_AO3V3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+               /* U11 MP2161GJ-C499 */
+               vin-supply = <&p5v0>;
+       };
+
+       ddr3_1v5: regulator-ddr3_1v5 {
+               compatible = "regulator-fixed";
+               regulator-name = "DDR3_1V5";
+               regulator-min-microvolt = <1500000>;
+               regulator-max-microvolt = <1500000>;
+               regulator-always-on;
+               /* U15 MP2161GJ-C499 */
+               vin-supply = <&p5v0>;
+       };
+
        emmc_pwrseq: emmc-pwrseq {
                compatible = "mmc-pwrseq-emmc";
                reset-gpios = <&gpio BOOT_9 GPIO_ACTIVE_LOW>;
        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>;
-                       eee-broken-1000t;
                };
        };
 };
        status = "okay";
        pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>;
        pinctrl-names = "default";
+       hdmi-supply = <&hdmi_p5v0>;
 };
 
 &hdmi_tx_tmds_port {
        pinctrl-names = "default";
 };
 
-&pinctrl_aobus {
+&gpio_ao {
        gpio-line-names = "UART TX", "UART RX", "VCCK En", "TF 3V3/1V8 En",
                          "USB HUB nRESET", "USB OTG Power En",
                          "J7 Header Pin2", "IR In", "J7 Header Pin4",
                          "";
 };
 
-&pinctrl_periphs {
+&gpio {
        gpio-line-names = /* Bank GPIOZ */
                          "Eth MDIO", "Eth MDC", "Eth RGMII RX Clk",
                          "Eth RX DV", "Eth RX D0", "Eth RX D1", "Eth RX D2",
 
        bus-width = <4>;
        cap-sd-highspeed;
+       sd-uhs-sdr12;
+       sd-uhs-sdr25;
+       sd-uhs-sdr50;
+       sd-uhs-ddr50;
        max-frequency = <100000000>;
        disable-wp;
 
-       cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
-       cd-inverted;
+       cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
 
        vmmc-supply = <&tflash_vdd>;
        vqmmc-supply = <&tf_io>;
        pinctrl-names = "default", "clk-gate";
 
        bus-width = <8>;
-       max-frequency = <100000000>;
+       max-frequency = <200000000>;
        non-removable;
        disable-wp;
        cap-mmc-highspeed;
 };
 
 &usb0_phy {
-       status = "okay";
+       status = "disabled";
        phy-supply = <&usb_otg_pwr>;
 };
 
 };
 
 &usb0 {
-       status = "okay";
+       status = "disabled";
 };
 
 &usb1 {
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 56e0dd1ff55c684f93937fec5a78cea46f98cc59..150a82f3b2d77cdab89f376e440e4470d80588a9 100644 (file)
@@ -21,6 +21,6 @@
        phy-mode = "rmii";
 
        snps,reset-gpio = <&gpio GPIOZ_14 0>;
-       snps,reset-delays-us = <0 10000 1000000>;
+       snps,reset-delays-us = <0>, <10000>, <1000000>;
        snps,reset-active-low;
 };
index 0be0f2a5d2fe918e2f1a43b798f2ee4899719bb9..e803a466fe4ebb15c160c480790749c46c419cbf 100644 (file)
@@ -46,8 +46,8 @@
                gpios-states = <1>;
 
                /* Based on P200 schematics, signal CARD_1.8V/3.3V_CTR */
-               states = <1800000 0
-                         3300000 1>;
+               states = <1800000 0>,
+                        <3300000 1>;
 
                regulator-settling-time-up-us = <10000>;
                regulator-settling-time-down-us = <150000>;
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
 
        non-removable;
        disable-wp;
 
+       /* WiFi firmware requires power to be kept while in suspend */
+       keep-power-in-suspend;
+
        mmc-pwrseq = <&sdio_pwrseq>;
 
        vmmc-supply = <&vddao_3v3>;
index 1ade7e486828c2db082a121e856456e5562d3445..0cb40326b0d3fc9251c5ba0c14914dacf277fbf5 100644 (file)
@@ -81,6 +81,7 @@
                        mux {
                                groups = "uart_tx_ao_a", "uart_rx_ao_a";
                                function = "uart_ao";
+                               bias-disable;
                        };
                };
 
@@ -89,6 +90,7 @@
                                groups = "uart_cts_ao_a",
                                       "uart_rts_ao_a";
                                function = "uart_ao";
+                               bias-disable;
                        };
                };
 
@@ -96,6 +98,7 @@
                        mux {
                                groups = "uart_tx_ao_b", "uart_rx_ao_b";
                                function = "uart_ao_b";
+                               bias-disable;
                        };
                };
 
                                groups = "uart_cts_ao_b",
                                       "uart_rts_ao_b";
                                function = "uart_ao_b";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "remote_input_ao";
                                function = "remote_input_ao";
+                               bias-disable;
                        };
                };
 
                                groups = "i2c_sck_ao",
                                       "i2c_sda_ao";
                                function = "i2c_ao";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "pwm_ao_a_3";
                                function = "pwm_ao_a_3";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "pwm_ao_a_6";
                                function = "pwm_ao_a_6";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "pwm_ao_a_12";
                                function = "pwm_ao_a_12";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "pwm_ao_b";
                                function = "pwm_ao_b";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "i2s_am_clk";
                                function = "i2s_out_ao";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "i2s_out_ao_clk";
                                function = "i2s_out_ao";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "i2s_out_lr_clk";
                                function = "i2s_out_ao";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "i2s_out_ch01_ao";
                                function = "i2s_out_ao";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "i2s_out_ch23_ao";
                                function = "i2s_out_ao";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "i2s_out_ch45_ao";
                                function = "i2s_out_ao";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "spdif_out_ao_13";
                                function = "spdif_out_ao";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "ao_cec";
                                function = "cec_ao";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "ee_cec";
                                function = "cec_ao";
+                               bias-disable;
                        };
                };
        };
 
 &clkc_AO {
        compatible = "amlogic,meson-gxbb-aoclkc", "amlogic,meson-gx-aoclkc";
+       clocks = <&xtal>, <&clkc CLKID_CLK81>;
+       clock-names = "xtal", "mpeg-clk";
+};
+
+&efuse {
+       clocks = <&clkc CLKID_EFUSE>;
 };
 
 &ethmac {
        clkc: clock-controller {
                compatible = "amlogic,gxbb-clkc";
                #clock-cells = <1>;
+               clocks = <&xtal>;
+               clock-names = "xtal";
        };
 };
 
                };
 
                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-pull-down;
                        };
                };
 
                        mux {
                                groups = "BOOT_8";
                                function = "gpio_periphs";
-                       };
-                       cfg-pull-down {
-                               pins = "BOOT_8";
                                bias-pull-down;
                        };
                };
                                       "nor_c",
                                       "nor_cs";
                                function = "nor";
+                               bias-disable;
                        };
                };
 
                                        "spi_mosi",
                                        "spi_sclk";
                                function = "spi";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "spi_ss0";
                                function = "spi";
+                               bias-disable;
                        };
                };
 
                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;
                        };
                };
 
                        mux {
                                groups = "CARD_2";
                                function = "gpio_periphs";
-                       };
-                       cfg-pull-down {
-                               pins = "CARD_2";
                                bias-pull-down;
                        };
                };
 
                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;
                        };
                };
 
                        mux {
                                groups = "GPIOX_4";
                                function = "gpio_periphs";
-                       };
-                       cfg-pull-down {
-                               pins = "GPIOX_4";
                                bias-pull-down;
                        };
                };
                        mux {
                                groups = "sdio_irq";
                                function = "sdio";
+                               bias-disable;
                        };
                };
 
                                groups = "uart_tx_a",
                                       "uart_rx_a";
                                function = "uart_a";
+                               bias-disable;
                        };
                };
 
                                groups = "uart_cts_a",
                                       "uart_rts_a";
                                function = "uart_a";
+                               bias-disable;
                        };
                };
 
                                groups = "uart_tx_b",
                                       "uart_rx_b";
                                function = "uart_b";
+                               bias-disable;
                        };
                };
 
                                groups = "uart_cts_b",
                                       "uart_rts_b";
                                function = "uart_b";
+                               bias-disable;
                        };
                };
 
                                groups = "uart_tx_c",
                                       "uart_rx_c";
                                function = "uart_c";
+                               bias-disable;
                        };
                };
 
                                groups = "uart_cts_c",
                                       "uart_rts_c";
                                function = "uart_c";
+                               bias-disable;
                        };
                };
 
                                groups = "i2c_sck_a",
                                       "i2c_sda_a";
                                function = "i2c_a";
+                               bias-disable;
                        };
                };
 
                                groups = "i2c_sck_b",
                                       "i2c_sda_b";
                                function = "i2c_b";
+                               bias-disable;
                        };
                };
 
                                groups = "i2c_sck_c",
                                       "i2c_sda_c";
                                function = "i2c_c";
+                               bias-disable;
                        };
                };
 
                                       "eth_txd2",
                                       "eth_txd3";
                                function = "eth";
+                               bias-disable;
                        };
                };
 
                                       "eth_txd0",
                                       "eth_txd1";
                                function = "eth";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "pwm_a_x";
                                function = "pwm_a_x";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "pwm_a_y";
                                function = "pwm_a_y";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "pwm_b";
                                function = "pwm_b";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "pwm_d";
                                function = "pwm_d";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "pwm_e";
                                function = "pwm_e";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "pwm_f_x";
                                function = "pwm_f_x";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "pwm_f_y";
                                function = "pwm_f_y";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "hdmi_hpd";
                                function = "hdmi_hpd";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "hdmi_sda", "hdmi_scl";
                                function = "hdmi_i2c";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "i2sout_ch23_y";
                                function = "i2s_out";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "i2sout_ch45_y";
                                function = "i2s_out";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "i2sout_ch67_y";
                                function = "i2s_out";
+                               bias-disable;
                        };
                };
 
                        mux {
                                groups = "spdif_out_y";
                                function = "spdif_out";
+                               bias-disable;
                        };
                };
        };
        resets = <&reset RESET_SD_EMMC_C>;
 };
 
+&simplefb_hdmi {
+       clocks = <&clkc CLKID_HDMI_PCLK>,
+                <&clkc CLKID_CLK81>,
+                <&clkc CLKID_GCLK_VENCI_INT0>;
+};
+
 &spicc {
        clocks = <&clkc CLKID_SPICC>;
        clock-names = "core";
        compatible = "amlogic,meson-gxbb-vpu", "amlogic,meson-gx-vpu";
        power-domains = <&pwrc_vpu>;
 };
+
+&vdec {
+       compatible = "amlogic,gxbb-vdec", "amlogic,gx-vdec";
+       clocks = <&clkc CLKID_DOS_PARSER>,
+                <&clkc CLKID_DOS>,
+                <&clkc CLKID_VDEC_1>,
+                <&clkc CLKID_VDEC_HEVC>;
+       clock-names = "dos_parser", "dos", "vdec_1", "vdec_hevc";
+       resets = <&reset RESET_PARSER>;
+       reset-names = "esparser";
+};
index 82b1c485114780c53c20c9587259cd90d53ba1b9..4d5949496596697a5d2aa1d21b8aa4106d866b88 100644 (file)
@@ -14,7 +14,7 @@
 / {
        compatible = "libretech,aml-s805x-ac", "amlogic,s805x",
                     "amlogic,meson-gxl";
-       model = "Libre Computer Board AML-S805X-AC";
+       model = "Libre Computer AML-S805X-AC";
 
        aliases {
                serial0 = &uart_AO;
diff --git a/arch/arm/dts/meson-gxl-s905d-libretech-pc-u-boot.dtsi b/arch/arm/dts/meson-gxl-s905d-libretech-pc-u-boot.dtsi
new file mode 100644 (file)
index 0000000..c35158d
--- /dev/null
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2019 BayLibre, SAS.
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ */
+
+#include "meson-gx-u-boot.dtsi"
diff --git a/arch/arm/dts/meson-gxl-s905d-libretech-pc.dts b/arch/arm/dts/meson-gxl-s905d-libretech-pc.dts
new file mode 100644 (file)
index 0000000..100a1cf
--- /dev/null
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019 BayLibre SAS. All rights reserved.
+ * Author: Jerome Brunet <jbrunet@baylibre.com>
+ */
+
+/dts-v1/;
+
+#include "meson-gxl-s905d.dtsi"
+#include "meson-gx-libretech-pc.dtsi"
+
+/ {
+       compatible = "libretech,aml-s905d-pc", "amlogic,s905d",
+                    "amlogic,meson-gxl";
+       model = "Libre Computer AML-S905D-PC";
+};
diff --git a/arch/arm/dts/meson-gxl-s905d.dtsi b/arch/arm/dts/meson-gxl-s905d.dtsi
new file mode 100644 (file)
index 0000000..4332191
--- /dev/null
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2016 Endless Computers, Inc.
+ * Author: Carlo Caione <carlo@endlessm.com>
+ */
+
+#include "meson-gxl.dtsi"
+#include "meson-gxl-mali.dtsi"
+
+/ {
+       compatible = "amlogic,s905d", "amlogic,meson-gxl";
+};
index ceb34afe421d5634f1c1970050c845fbaf350a7b..440bc23c734268cd4638fb33ee063c748f51c487 100644 (file)
 
        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>;
 };
 
 &ir {
-       linux,rc-map-name = "rc-geekbox";
+       linux,rc-map-name = "rc-khadas";
 };
 
-&pinctrl_aobus {
+&gpio_ao {
        gpio-line-names = "UART TX",
                          "UART RX",
                          "Power Key In",
                          "";
 };
 
-&pinctrl_periphs {
+&gpio {
        gpio-line-names = /* Bank GPIOZ */
                          "", "", "", "", "", "", "",
                          "", "", "", "", "", "", "",
        };
 };
 
+&uart_A {
+       bluetooth {
+               compatible = "brcm,bcm43438-bt";
+               shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>;
+               max-speed = <2000000>;
+               clocks = <&wifi32k>;
+               clock-names = "lpo";
+       };
+};
+
 /* This is brought out on the Linux_RX (18) and Linux_TX (19) pins: */
 &uart_AO {
        status = "okay";
index a23252efc685205432e78ff1087e9771e40ef750..e8348b2728db576cf8260b9fcc1c171d6f48f409 100644 (file)
@@ -12,8 +12,9 @@
 #include "meson-gxl-s905x.dtsi"
 
 / {
-       compatible = "libretech,cc", "amlogic,s905x", "amlogic,meson-gxl";
-       model = "Libre Computer Board AML-S905X-CC";
+       compatible = "libretech,aml-s905x-cc", "amlogic,s905x",
+                    "amlogic,meson-gxl";
+       model = "Libre Computer AML-S905X-CC";
 
        aliases {
                serial0 = &uart_AO;
                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>;
        };
 };
 
        };
 };
 
-&pinctrl_aobus {
+&gpio_ao {
        gpio-line-names = "UART TX",
                          "UART RX",
                          "Blue LED",
                          "7J1 Header Pin15";
 };
 
-&pinctrl_periphs {
+&gpio {
        gpio-line-names = /* Bank GPIOZ */
                          "", "", "", "", "", "", "",
                          "", "", "", "", "", "", "",
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
        disable-wp;
 
-       cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
-       cd-inverted;
+       cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
 
        vmmc-supply = <&vcc_3v3>;
        vqmmc-supply = <&vcc_card>;
 
        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 a1b31013ab6e3494d810619fadf81752a67b94f4..43eb7d149e3647b1590f5c11f29676813591bbd8 100644 (file)
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
 
        non-removable;
        disable-wp;
 
+       /* WiFi firmware requires power to be kept while in suspend */
+       keep-power-in-suspend;
+
        mmc-pwrseq = <&sdio_pwrseq>;
 
        vmmc-supply = <&vddao_3v3>;
 
        bus-width = <4>;
        cap-sd-highspeed;
-       max-frequency = <100000000>;
+       max-frequency = <50000000>;
        disable-wp;
 
-       cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
-       cd-inverted;
+       cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
 
        vmmc-supply = <&vddao_3v3>;
        vqmmc-supply = <&vddio_boot>;
index d5c3d78aafeb5d97d69eb5cd788f1957a8c2538b..259d8639939059fd1e6bd3ca1e7563caec4c0c21 100644 (file)
                                phys = <&usb3_phy>, <&usb2_phy0>, <&usb2_phy1>;
                        };
                };
+
+               crypto: crypto@c883e000 {
+                       compatible = "amlogic,gxl-crypto";
+                       reg = <0x0 0xc883e000 0x0 0x36>;
+                       interrupts = <GIC_SPI 188 IRQ_TYPE_EDGE_RISING>,
+                                    <GIC_SPI 189 IRQ_TYPE_EDGE_RISING>;
+                       clocks = <&clkc CLKID_BLKMV>;
+                       clock-names = "blkmv";
+                       status = "okay";
+               };
        };
 };
 
@@ -80,9 +90,6 @@
 };
 
 &ethmac {
-       reg = <0x0 0xc9410000 0x0 0x10000
-              0x0 0xc8834540 0x0 0x4>;
-
        clocks = <&clkc CLKID_ETH>,
                 <&clkc CLKID_FCLK_DIV2>,
                 <&clkc CLKID_MPLL2>;
                };
 
                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;
                        };
                        };
                };
 
+               i2c_c_dv18_pins: i2c_c_dv18 {
+                       mux {
+                               groups = "i2c_sck_c_dv19",
+                                     "i2c_sda_c_dv18";
+                               function = "i2c_c";
+                               bias-disable;
+                       };
+               };
+
                eth_pins: eth_c {
                        mux {
                                groups = "eth_mdio",
                        #size-cells = <0>;
 
                        internal_phy: ethernet-phy@8 {
-                               compatible = "ethernet-phy-id0181.4400", "ethernet-phy-ieee802.3-c22";
+                               compatible = "ethernet-phy-id0181.4400";
                                interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>;
                                reg = <8>;
                                max-speed = <100>;
        resets = <&reset RESET_SD_EMMC_C>;
 };
 
+&simplefb_hdmi {
+       clocks = <&clkc CLKID_HDMI_PCLK>,
+                <&clkc CLKID_CLK81>,
+                <&clkc CLKID_GCLK_VENCI_INT0>;
+};
+
 &spicc {
        clocks = <&clkc CLKID_SPICC>;
        clock-names = "core";
        compatible = "amlogic,meson-gxl-vpu", "amlogic,meson-gx-vpu";
        power-domains = <&pwrc_vpu>;
 };
+
+&vdec {
+       compatible = "amlogic,gxl-vdec", "amlogic,gx-vdec";
+       clocks = <&clkc CLKID_DOS_PARSER>,
+                <&clkc CLKID_DOS>,
+                <&clkc CLKID_VDEC_1>,
+                <&clkc CLKID_VDEC_HEVC>;
+       clock-names = "dos_parser", "dos", "vdec_1", "vdec_hevc";
+       resets = <&reset RESET_PARSER>;
+       reset-names = "esparser";
+};
index 782e9edac80518a5d88efbded2963cda7c5ee300..f82f25c1a5f97be47d4593be9850ac0c5c7f0f32 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>;
 
                                map1 {
                                        trip = <&cpu_alert1>;
-                                       cooling-device = <&gpio_fan 2 THERMAL_NO_LIMIT>;
-                               };
-
-                               map2 {
-                                       trip = <&cpu_alert1>;
-                                       cooling-device =
-                                               <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
-                               };
-
-                               map3 {
-                                       trip = <&cpu_alert1>;
-                                       cooling-device =
-                                               <&cpu4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+                                       cooling-device = <&gpio_fan 2 THERMAL_NO_LIMIT>,
+                                                        <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&cpu4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&cpu5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&cpu6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+                                                        <&cpu7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
                                };
                        };
                };
 
        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>;
        status = "okay";
        pinctrl-0 = <&remote_input_ao_pins>;
        pinctrl-names = "default";
-       linux,rc-map-name = "rc-geekbox";
+       linux,rc-map-name = "rc-khadas";
 };
 
 &pwm_AO_ab {
 &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;
 
+       /* WiFi firmware requires power to be kept while in suspend */
+       keep-power-in-suspend;
+
        mmc-pwrseq = <&sdio_pwrseq>;
 
        vmmc-supply = <&vddao_3v3>;
 &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_HIGH>;
-       cd-inverted;
+       cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
 
        vmmc-supply = <&vddao_3v3>;
        vqmmc-supply = <&vddio_boot>;
 &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>;
+               max-speed = <2000000>;
+               clocks = <&wifi32k>;
+               clock-names = "lpo";
+       };
 };
 
 /* This is brought out on the Linux_RX (18) and Linux_TX (19) pins: */
diff --git a/arch/arm/dts/meson-gxm-s912-libretech-pc-u-boot.dtsi b/arch/arm/dts/meson-gxm-s912-libretech-pc-u-boot.dtsi
new file mode 100644 (file)
index 0000000..c35158d
--- /dev/null
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2019 BayLibre, SAS.
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ */
+
+#include "meson-gx-u-boot.dtsi"
diff --git a/arch/arm/dts/meson-gxm-s912-libretech-pc.dts b/arch/arm/dts/meson-gxm-s912-libretech-pc.dts
new file mode 100644 (file)
index 0000000..444c249
--- /dev/null
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019 BayLibre SAS. All rights reserved.
+ * Author: Jerome Brunet <jbrunet@baylibre.com>
+ */
+
+/dts-v1/;
+
+#include "meson-gxm.dtsi"
+#include "meson-gx-libretech-pc.dtsi"
+
+/ {
+       compatible = "libretech,aml-s912-pc", "amlogic,s912",
+                    "amlogic,meson-gxm";
+       model = "Libre Computer AML-S912-PC";
+
+       typec2_vbus: regulator-typec2_vbus {
+               compatible = "regulator-fixed";
+               regulator-name = "TYPEC2_VBUS";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&vcc5v>;
+
+               gpio = <&gpio GPIODV_1 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+};
+
+&pinctrl_periphs {
+       /*
+        * Make sure the irq pin of the TYPE C controller is not driven
+        * by the SoC.
+        */
+       fusb302_irq_pins: fusb302_irq {
+               mux {
+                       groups = "GPIODV_0";
+                       function = "gpio_periphs";
+                       bias-pull-up;
+                       output-disable;
+               };
+       };
+};
+
+&i2c_C {
+       fusb302@22 {
+               compatible = "fcs,fusb302";
+               reg = <0x22>;
+
+               pinctrl-0 = <&fusb302_irq_pins>;
+               pinctrl-names = "default";
+               interrupt-parent = <&gpio_intc>;
+               interrupts = <59 IRQ_TYPE_LEVEL_LOW>;
+
+               vbus-supply = <&typec2_vbus>;
+
+               status = "okay";
+       };
+};
+
+&usb2_phy2 {
+       phy-supply = <&typec2_vbus>;
+};
index 247888d68a3aabe06e8841a8d93cbfe8afe12960..5ff64a0d2dcf8aeecd677b8215738184e5fe2348 100644 (file)
@@ -44,7 +44,7 @@
 
                cpu4: cpu@100 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x0 0x100>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
@@ -53,7 +53,7 @@
 
                cpu5: cpu@101 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x0 0x101>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
@@ -62,7 +62,7 @@
 
                cpu6: cpu@102 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x0 0x102>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
@@ -71,7 +71,7 @@
 
                cpu7: cpu@103 {
                        device_type = "cpu";
-                       compatible = "arm,cortex-a53", "arm,armv8";
+                       compatible = "arm,cortex-a53";
                        reg = <0x0 0x103>;
                        enable-method = "psci";
                        next-level-cache = <&l2>;
                reset-names = "phy";
                status = "okay";
        };
+
+       mali: gpu@c0000 {
+               compatible = "amlogic,meson-gxm-mali", "arm,mali-t820";
+               reg = <0x0 0xc0000 0x0 0x40000>;
+               interrupt-parent = <&gic>;
+               interrupts = <GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>;
+               interrupt-names = "job", "mmu", "gpu";
+               clocks = <&clkc CLKID_MALI>;
+               resets = <&reset RESET_MALI_CAPB3>, <&reset RESET_MALI>;
+
+               /*
+                * Mali clocking is provided by two identical clock paths
+                * MALI_0 and MALI_1 muxed to a single clock by a glitch
+                * free mux to safely change frequency while running.
+                */
+               assigned-clocks = <&clkc CLKID_MALI_0_SEL>,
+                                 <&clkc CLKID_MALI_0>,
+                                 <&clkc CLKID_MALI>; /* Glitch free mux */
+               assigned-clock-parents = <&clkc CLKID_FCLK_DIV3>,
+                                        <0>, /* Do Nothing */
+                                        <&clkc CLKID_MALI_0>;
+               assigned-clock-rates = <0>, /* Do Nothing */
+                                      <666666666>,
+                                      <0>; /* Do Nothing */
+       };
 };
 
 &clkc_AO {
 &dwc3 {
        phys = <&usb3_phy>, <&usb2_phy0>, <&usb2_phy1>, <&usb2_phy2>;
 };
+
+&vdec {
+       compatible = "amlogic,gxm-vdec", "amlogic,gx-vdec";
+};
index 8647da7d6609b05089bcced0dd21d9a19b3a41d2..90815fa25ec645486e2f05654e00ffa5595c9f74 100644 (file)
        linux,rc-map-name = "rc-khadas";
 };
 
+&pcie {
+       reset-gpios = <&gpio GPIOA_8 GPIO_ACTIVE_LOW>;
+};
+
 &pwm_ef {
         status = "okay";
         pinctrl-0 = <&pwm_e_pins>;
        non-removable;
        disable-wp;
 
+       /* WiFi firmware requires power to be kept while in suspend */
+       keep-power-in-suspend;
+
        mmc-pwrseq = <&sdio_pwrseq>;
 
        vmmc-supply = <&vsys_3v3>;
index 3435aaa4e8db50c7f28c0b08f2b802faf8e6f20f..a8bb3fa9fec98e994ce2876b95e81e86b8369c02 100644 (file)
@@ -9,6 +9,7 @@
 #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,sei610", "amlogic,sm1";
                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 {
                stdout-path = "serial0:115200n8";
        };
        };
 
        gpio-keys {
-               compatible = "gpio-keys-polled";
-               poll-interval = <100>;
+               compatible = "gpio-keys";
 
                key1 {
                        label = "A";
                        linux,code = <BTN_0>;
                        gpios = <&gpio GPIOH_6 GPIO_ACTIVE_LOW>;
+                       interrupt-parent = <&gpio_intc>;
+                       interrupts = <34 IRQ_TYPE_EDGE_BOTH>;
                };
 
                key2 {
                        label = "B";
                        linux,code = <BTN_1>;
                        gpios = <&gpio GPIOH_7 GPIO_ACTIVE_LOW>;
+                       interrupt-parent = <&gpio_intc>;
+                       interrupts = <35 IRQ_TYPE_EDGE_BOTH>;
                };
 
                key3 {
                        label = "C";
                        linux,code = <BTN_2>;
                        gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>;
+                       interrupt-parent = <&gpio_intc>;
+                       interrupts = <2 IRQ_TYPE_EDGE_BOTH>;
+               };
+
+               mic_mute {
+                       label = "MicMute";
+                       linux,code = <SW_MUTE_DEVICE>;
+                       linux,input-type = <EV_SW>;
+                       gpios = <&gpio_ao GPIOE_2 GPIO_ACTIVE_LOW>;
+                       interrupt-parent = <&gpio_intc>;
+                       interrupts = <99 IRQ_TYPE_EDGE_BOTH>;
+               };
+
+               power_key {
+                       label = "PowerKey";
+                       linux,code = <KEY_POWER>;
+                       gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_LOW>;
+                       interrupt-parent = <&gpio_intc>;
+                       interrupts = <3 IRQ_TYPE_EDGE_BOTH>;
                };
        };
 
                clock-names = "ext_clock";
        };
 
+       sound {
+               compatible = "amlogic,axg-sound-card";
+               model = "SM1-SEI610";
+               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 {
+                               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>;
+                       };
+               };
+       };
+
        wifi32k: wifi32k {
                compatible = "pwm-clock";
                #clock-cells = <0>;
        };
 };
 
+&arb {
+       status = "okay";
+};
+
 &cec_AO {
        pinctrl-0 = <&cec_ao_a_h_pins>;
        pinctrl-names = "default";
        hdmi-phandle = <&hdmi_tx>;
 };
 
+&clkc_audio {
+       status = "okay";
+};
+
 &cpu0 {
        cpu-supply = <&vddcpu>;
        operating-points-v2 = <&cpu_opp_table>;
        phy-mode = "rmii";
 };
 
+&frddr_a {
+       status = "okay";
+};
+
+&frddr_b {
+       status = "okay";
+};
+
+&frddr_c {
+       status = "okay";
+};
+
 &hdmi_tx {
        status = "okay";
        pinctrl-0 = <&hdmitx_hpd_pins>, <&hdmitx_ddc_pins>;
        pinctrl-names = "default";
 };
 
+&pdm {
+       pinctrl-0 = <&pdm_din0_z_pins>, <&pdm_dclk_z_pins>;
+       pinctrl-names = "default";
+       status = "okay";
+};
+
 &pwm_AO_ab {
        status = "okay";
        pinctrl-0 = <&pwm_ao_a_pins>;
        non-removable;
        disable-wp;
 
+       /* WiFi firmware requires power to be kept while in suspend */
+       keep-power-in-suspend;
+
        mmc-pwrseq = <&sdio_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>;
 
        bluetooth {
                compatible = "brcm,bcm43438-bt";
+               interrupt-parent = <&gpio_intc>;
+               interrupts = <95 IRQ_TYPE_LEVEL_HIGH>;
                shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>;
                max-speed = <2000000>;
                clocks = <&wifi32k>;
index 521573f3a5babef270b05b6080c846ef1def4431..d847a3fcbc85764222915bac1cbc9372e03f1539 100644 (file)
@@ -5,11 +5,47 @@
  */
 
 #include "meson-g12-common.dtsi"
+#include <dt-bindings/clock/axg-audio-clkc.h>
 #include <dt-bindings/power/meson-sm1-power.h>
+#include <dt-bindings/reset/amlogic,meson-axg-audio-arb.h>
+#include <dt-bindings/reset/amlogic,meson-g12a-audio-reset.h>
 
 / {
        compatible = "amlogic,sm1";
 
+       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>;
        };
 };
 
+&apb {
+       audio: bus@60000 {
+               compatible = "simple-bus";
+               reg = <0x0 0x60000 0x0 0x1000>;
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges = <0x0 0x0 0x0 0x60000 0x0 0x1000>;
+
+               clkc_audio: clock-controller@0 {
+                       status = "disabled";
+                       compatible = "amlogic,sm1-audio-clkc";
+                       reg = <0x0 0x0 0x0 0xb4>;
+                       #clock-cells = <1>;
+                       #reset-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_FCLK_DIV5>;
+                       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,sm1-toddr",
+                                    "amlogic,axg-toddr";
+                       reg = <0x0 0x100 0x0 0x2c>;
+                       #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>,
+                                <&clkc_audio AUD_RESET_TODDR_A>;
+                       reset-names = "arb", "rst";
+                       amlogic,fifo-depth = <8192>;
+                       status = "disabled";
+               };
+
+               toddr_b: audio-controller@140 {
+                       compatible = "amlogic,sm1-toddr",
+                                    "amlogic,axg-toddr";
+                       reg = <0x0 0x140 0x0 0x2c>;
+                       #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>,
+                                <&clkc_audio AUD_RESET_TODDR_B>;
+                       reset-names = "arb", "rst";
+                       amlogic,fifo-depth = <256>;
+                       status = "disabled";
+               };
+
+               toddr_c: audio-controller@180 {
+                       compatible = "amlogic,sm1-toddr",
+                                    "amlogic,axg-toddr";
+                       reg = <0x0 0x180 0x0 0x2c>;
+                       #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>,
+                                <&clkc_audio AUD_RESET_TODDR_C>;
+                       reset-names = "arb", "rst";
+                       amlogic,fifo-depth = <256>;
+                       status = "disabled";
+               };
+
+               frddr_a: audio-controller@1c0 {
+                       compatible = "amlogic,sm1-frddr",
+                                    "amlogic,axg-frddr";
+                       reg = <0x0 0x1c0 0x0 0x2c>;
+                       #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>,
+                                <&clkc_audio AUD_RESET_FRDDR_A>;
+                       reset-names = "arb", "rst";
+                       amlogic,fifo-depth = <512>;
+                       status = "disabled";
+               };
+
+               frddr_b: audio-controller@200 {
+                       compatible = "amlogic,sm1-frddr",
+                                    "amlogic,axg-frddr";
+                       reg = <0x0 0x200 0x0 0x2c>;
+                       #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>,
+                                <&clkc_audio AUD_RESET_FRDDR_B>;
+                       reset-names = "arb", "rst";
+                       amlogic,fifo-depth = <256>;
+                       status = "disabled";
+               };
+
+               frddr_c: audio-controller@240 {
+                       compatible = "amlogic,sm1-frddr",
+                                    "amlogic,axg-frddr";
+                       reg = <0x0 0x240 0x0 0x2c>;
+                       #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>,
+                                <&clkc_audio AUD_RESET_FRDDR_C>;
+                       reset-names = "arb", "rst";
+                       amlogic,fifo-depth = <256>;
+                       status = "disabled";
+               };
+
+               arb: reset-controller@280 {
+                       status = "disabled";
+                       compatible = "amlogic,meson-sm1-audio-arb";
+                       reg = <0x0 0x280 0x0 0x4>;
+                       #reset-cells = <1>;
+                       clocks = <&clkc_audio AUD_CLKID_DDR_ARB>;
+               };
+
+               tdmin_a: audio-controller@300 {
+                       compatible = "amlogic,sm1-tdmin",
+                                    "amlogic,axg-tdmin";
+                       reg = <0x0 0x300 0x0 0x40>;
+                       sound-name-prefix = "TDMIN_A";
+                       resets = <&clkc_audio AUD_RESET_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,sm1-tdmin",
+                                    "amlogic,axg-tdmin";
+                       reg = <0x0 0x340 0x0 0x40>;
+                       sound-name-prefix = "TDMIN_B";
+                       resets = <&clkc_audio AUD_RESET_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,sm1-tdmin",
+                                    "amlogic,axg-tdmin";
+                       reg = <0x0 0x380 0x0 0x40>;
+                       sound-name-prefix = "TDMIN_C";
+                       resets = <&clkc_audio AUD_RESET_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,sm1-tdmin",
+                                    "amlogic,axg-tdmin";
+                       reg = <0x0 0x3c0 0x0 0x40>;
+                       sound-name-prefix = "TDMIN_LB";
+                       resets = <&clkc_audio AUD_RESET_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";
+               };
+
+               tdmout_a: audio-controller@500 {
+                       compatible = "amlogic,sm1-tdmout";
+                       reg = <0x0 0x500 0x0 0x40>;
+                       sound-name-prefix = "TDMOUT_A";
+                       resets = <&clkc_audio AUD_RESET_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,sm1-tdmout";
+                       reg = <0x0 0x540 0x0 0x40>;
+                       sound-name-prefix = "TDMOUT_B";
+                       resets = <&clkc_audio AUD_RESET_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,sm1-tdmout";
+                       reg = <0x0 0x580 0x0 0x40>;
+                       sound-name-prefix = "TDMOUT_C";
+                       resets = <&clkc_audio AUD_RESET_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";
+               };
+
+               tohdmitx: audio-controller@744 {
+                       compatible = "amlogic,sm1-tohdmitx",
+                                    "amlogic,g12a-tohdmitx";
+                       reg = <0x0 0x744 0x0 0x4>;
+                       #sound-dai-cells = <1>;
+                       sound-name-prefix = "TOHDMITX";
+                       resets = <&clkc_audio AUD_RESET_TOHDMITX>;
+                       status = "disabled";
+               };
+
+               toddr_d: audio-controller@840 {
+                       compatible = "amlogic,sm1-toddr",
+                                    "amlogic,axg-toddr";
+                       reg = <0x0 0x840 0x0 0x2c>;
+                       #sound-dai-cells = <0>;
+                       sound-name-prefix = "TODDR_D";
+                       interrupts = <GIC_SPI 49 IRQ_TYPE_EDGE_RISING>;
+                       clocks = <&clkc_audio AUD_CLKID_TODDR_D>;
+                       resets = <&arb AXG_ARB_TODDR_D>,
+                                <&clkc_audio AUD_RESET_TODDR_D>;
+                       reset-names = "arb", "rst";
+                       amlogic,fifo-depth = <256>;
+                       status = "disabled";
+               };
+
+               frddr_d: audio-controller@880 {
+                        compatible = "amlogic,sm1-frddr",
+                                     "amlogic,axg-frddr";
+                       reg = <0x0 0x880 0x0 0x2c>;
+                       #sound-dai-cells = <0>;
+                       sound-name-prefix = "FRDDR_D";
+                       interrupts = <GIC_SPI 50 IRQ_TYPE_EDGE_RISING>;
+                       clocks = <&clkc_audio AUD_CLKID_FRDDR_D>;
+                       resets = <&arb AXG_ARB_FRDDR_D>,
+                                <&clkc_audio AUD_RESET_FRDDR_D>;
+                       reset-names = "arb", "rst";
+                       amlogic,fifo-depth = <256>;
+                       status = "disabled";
+               };
+       };
+
+       pdm: audio-controller@61000 {
+               compatible = "amlogic,sm1-pdm",
+                            "amlogic,axg-pdm";
+               reg = <0x0 0x61000 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";
+       };
+};
+
 &cecb_AO {
        compatible = "amlogic,meson-sm1-ao-cec";
 };
        power-domains = <&pwrc PWRC_SM1_ETH_ID>;
 };
 
+&gpio_intc {
+       compatible = "amlogic,meson-sm1-gpio-intc",
+                    "amlogic,meson-gpio-intc";
+};
+
+&pcie {
+       power-domains = <&pwrc PWRC_SM1_PCIE_ID>;
+};
+
 &pwrc {
        compatible = "amlogic,meson-sm1-pwrc";
 };
 
+&simplefb_cvbs {
+       power-domains = <&pwrc PWRC_SM1_VPU_ID>;
+};
+
+&simplefb_hdmi {
+       power-domains = <&pwrc PWRC_SM1_VPU_ID>;
+};
+
+&vdec {
+       compatible = "amlogic,sm1-vdec";
+};
+
 &vpu {
        power-domains = <&pwrc PWRC_SM1_VPU_ID>;
 };
index 38f29bb789e873cabbefbd61484293af6f619e5c..8b20b5e17357f33cd6396e6922661db06e3c88af 100644 (file)
                                DDR_MR3
                        >;
 
+#ifdef DDR_PHY_CAL_SKIP
                        st,phy-cal = <
                                DDR_DX0DLLCR
                                DDR_DX0DQTR
                                DDR_DX3DQSTR
                        >;
 
+#endif
+
                        status = "okay";
                };
        };
diff --git a/arch/arm/dts/stm32mp15-pinctrl.dtsi b/arch/arm/dts/stm32mp15-pinctrl.dtsi
new file mode 100644 (file)
index 0000000..53df840
--- /dev/null
@@ -0,0 +1,1114 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) STMicroelectronics 2017 - All Rights Reserved
+ * Author: Ludovic Barre <ludovic.barre@st.com> for STMicroelectronics.
+ */
+#include <dt-bindings/pinctrl/stm32-pinfunc.h>
+
+&pinctrl {
+       adc1_in6_pins_a: adc1-in6 {
+               pins {
+                       pinmux = <STM32_PINMUX('F', 12, ANALOG)>;
+               };
+       };
+
+       adc12_ain_pins_a: adc12-ain-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('C', 3, ANALOG)>, /* ADC1 in13 */
+                                <STM32_PINMUX('F', 12, ANALOG)>, /* ADC1 in6 */
+                                <STM32_PINMUX('F', 13, ANALOG)>, /* ADC2 in2 */
+                                <STM32_PINMUX('F', 14, ANALOG)>; /* ADC2 in6 */
+               };
+       };
+
+       adc12_usb_cc_pins_a: adc12-usb-cc-pins-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('A', 4, ANALOG)>, /* ADC12 in18 */
+                                <STM32_PINMUX('A', 5, ANALOG)>; /* ADC12 in19 */
+               };
+       };
+
+       cec_pins_a: cec-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('A', 15, AF4)>;
+                       bias-disable;
+                       drive-open-drain;
+                       slew-rate = <0>;
+               };
+       };
+
+       cec_pins_sleep_a: cec-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('A', 15, ANALOG)>; /* HDMI_CEC */
+               };
+       };
+
+       cec_pins_b: cec-1 {
+               pins {
+                       pinmux = <STM32_PINMUX('B', 6, AF5)>;
+                       bias-disable;
+                       drive-open-drain;
+                       slew-rate = <0>;
+               };
+       };
+
+       cec_pins_sleep_b: cec-sleep-1 {
+               pins {
+                       pinmux = <STM32_PINMUX('B', 6, ANALOG)>; /* HDMI_CEC */
+               };
+       };
+
+       dac_ch1_pins_a: dac-ch1 {
+               pins {
+                       pinmux = <STM32_PINMUX('A', 4, ANALOG)>;
+               };
+       };
+
+       dac_ch2_pins_a: dac-ch2 {
+               pins {
+                       pinmux = <STM32_PINMUX('A', 5, ANALOG)>;
+               };
+       };
+
+       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 */
+                                <STM32_PINMUX('G', 4, AF11)>, /* ETH_RGMII_GTX_CLK */
+                                <STM32_PINMUX('G', 13, AF11)>, /* ETH_RGMII_TXD0 */
+                                <STM32_PINMUX('G', 14, AF11)>, /* ETH_RGMII_TXD1 */
+                                <STM32_PINMUX('C', 2, AF11)>, /* ETH_RGMII_TXD2 */
+                                <STM32_PINMUX('E', 2, AF11)>, /* ETH_RGMII_TXD3 */
+                                <STM32_PINMUX('B', 11, AF11)>, /* ETH_RGMII_TX_CTL */
+                                <STM32_PINMUX('C', 1, AF11)>; /* ETH_MDC */
+                       bias-disable;
+                       drive-push-pull;
+                       slew-rate = <2>;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('A', 2, AF11)>; /* ETH_MDIO */
+                       bias-disable;
+                       drive-push-pull;
+                       slew-rate = <0>;
+               };
+               pins3 {
+                       pinmux = <STM32_PINMUX('C', 4, AF11)>, /* ETH_RGMII_RXD0 */
+                                <STM32_PINMUX('C', 5, AF11)>, /* ETH_RGMII_RXD1 */
+                                <STM32_PINMUX('B', 0, AF11)>, /* ETH_RGMII_RXD2 */
+                                <STM32_PINMUX('B', 1, AF11)>, /* ETH_RGMII_RXD3 */
+                                <STM32_PINMUX('A', 1, AF11)>, /* ETH_RGMII_RX_CLK */
+                                <STM32_PINMUX('A', 7, AF11)>; /* ETH_RGMII_RX_CTL */
+                       bias-disable;
+               };
+       };
+
+       ethernet0_rgmii_pins_sleep_a: rgmii-sleep-0 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('G', 5, ANALOG)>, /* ETH_RGMII_CLK125 */
+                                <STM32_PINMUX('G', 4, ANALOG)>, /* ETH_RGMII_GTX_CLK */
+                                <STM32_PINMUX('G', 13, ANALOG)>, /* ETH_RGMII_TXD0 */
+                                <STM32_PINMUX('G', 14, ANALOG)>, /* ETH_RGMII_TXD1 */
+                                <STM32_PINMUX('C', 2, ANALOG)>, /* ETH_RGMII_TXD2 */
+                                <STM32_PINMUX('E', 2, ANALOG)>, /* ETH_RGMII_TXD3 */
+                                <STM32_PINMUX('B', 11, ANALOG)>, /* ETH_RGMII_TX_CTL */
+                                <STM32_PINMUX('A', 2, ANALOG)>, /* ETH_MDIO */
+                                <STM32_PINMUX('C', 1, ANALOG)>, /* ETH_MDC */
+                                <STM32_PINMUX('C', 4, ANALOG)>, /* ETH_RGMII_RXD0 */
+                                <STM32_PINMUX('C', 5, ANALOG)>, /* ETH_RGMII_RXD1 */
+                                <STM32_PINMUX('B', 0, ANALOG)>, /* ETH_RGMII_RXD2 */
+                                <STM32_PINMUX('B', 1, ANALOG)>, /* ETH_RGMII_RXD3 */
+                                <STM32_PINMUX('A', 1, ANALOG)>, /* ETH_RGMII_RX_CLK */
+                                <STM32_PINMUX('A', 7, ANALOG)>; /* ETH_RGMII_RX_CTL */
+               };
+       };
+
+       fmc_pins_a: fmc-0 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('D', 4, AF12)>, /* FMC_NOE */
+                                <STM32_PINMUX('D', 5, AF12)>, /* FMC_NWE */
+                                <STM32_PINMUX('D', 11, AF12)>, /* FMC_A16_FMC_CLE */
+                                <STM32_PINMUX('D', 12, AF12)>, /* FMC_A17_FMC_ALE */
+                                <STM32_PINMUX('D', 14, AF12)>, /* FMC_D0 */
+                                <STM32_PINMUX('D', 15, AF12)>, /* FMC_D1 */
+                                <STM32_PINMUX('D', 0, AF12)>, /* FMC_D2 */
+                                <STM32_PINMUX('D', 1, AF12)>, /* FMC_D3 */
+                                <STM32_PINMUX('E', 7, AF12)>, /* FMC_D4 */
+                                <STM32_PINMUX('E', 8, AF12)>, /* FMC_D5 */
+                                <STM32_PINMUX('E', 9, AF12)>, /* FMC_D6 */
+                                <STM32_PINMUX('E', 10, AF12)>, /* FMC_D7 */
+                                <STM32_PINMUX('G', 9, AF12)>; /* FMC_NE2_FMC_NCE */
+                       bias-disable;
+                       drive-push-pull;
+                       slew-rate = <1>;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('D', 6, AF12)>; /* FMC_NWAIT */
+                       bias-pull-up;
+               };
+       };
+
+       fmc_sleep_pins_a: fmc-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('D', 4, ANALOG)>, /* FMC_NOE */
+                                <STM32_PINMUX('D', 5, ANALOG)>, /* FMC_NWE */
+                                <STM32_PINMUX('D', 11, ANALOG)>, /* FMC_A16_FMC_CLE */
+                                <STM32_PINMUX('D', 12, ANALOG)>, /* FMC_A17_FMC_ALE */
+                                <STM32_PINMUX('D', 14, ANALOG)>, /* FMC_D0 */
+                                <STM32_PINMUX('D', 15, ANALOG)>, /* FMC_D1 */
+                                <STM32_PINMUX('D', 0, ANALOG)>, /* FMC_D2 */
+                                <STM32_PINMUX('D', 1, ANALOG)>, /* FMC_D3 */
+                                <STM32_PINMUX('E', 7, ANALOG)>, /* FMC_D4 */
+                                <STM32_PINMUX('E', 8, ANALOG)>, /* FMC_D5 */
+                                <STM32_PINMUX('E', 9, ANALOG)>, /* FMC_D6 */
+                                <STM32_PINMUX('E', 10, ANALOG)>, /* FMC_D7 */
+                                <STM32_PINMUX('D', 6, ANALOG)>, /* FMC_NWAIT */
+                                <STM32_PINMUX('G', 9, ANALOG)>; /* FMC_NE2_FMC_NCE */
+               };
+       };
+
+       i2c1_pins_a: i2c1-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('D', 12, AF5)>, /* I2C1_SCL */
+                                <STM32_PINMUX('F', 15, AF5)>; /* I2C1_SDA */
+                       bias-disable;
+                       drive-open-drain;
+                       slew-rate = <0>;
+               };
+       };
+
+       i2c1_pins_sleep_a: i2c1-1 {
+               pins {
+                       pinmux = <STM32_PINMUX('D', 12, ANALOG)>, /* I2C1_SCL */
+                                <STM32_PINMUX('F', 15, ANALOG)>; /* I2C1_SDA */
+               };
+       };
+
+       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 */
+                                <STM32_PINMUX('H', 5, AF4)>; /* I2C2_SDA */
+                       bias-disable;
+                       drive-open-drain;
+                       slew-rate = <0>;
+               };
+       };
+
+       i2c2_pins_sleep_a: i2c2-1 {
+               pins {
+                       pinmux = <STM32_PINMUX('H', 4, ANALOG)>, /* I2C2_SCL */
+                                <STM32_PINMUX('H', 5, ANALOG)>; /* I2C2_SDA */
+               };
+       };
+
+       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 */
+                                <STM32_PINMUX('A', 12, AF4)>; /* I2C5_SDA */
+                       bias-disable;
+                       drive-open-drain;
+                       slew-rate = <0>;
+               };
+       };
+
+       i2c5_pins_sleep_a: i2c5-1 {
+               pins {
+                       pinmux = <STM32_PINMUX('A', 11, ANALOG)>, /* I2C5_SCL */
+                                <STM32_PINMUX('A', 12, ANALOG)>; /* I2C5_SDA */
+
+               };
+       };
+
+       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 */
+                                <STM32_PINMUX('I', 10, AF14)>, /* LCD_HSYNC */
+                                <STM32_PINMUX('I',  9, AF14)>, /* LCD_VSYNC */
+                                <STM32_PINMUX('F', 10, AF14)>, /* LCD_DE */
+                                <STM32_PINMUX('H',  2, AF14)>, /* LCD_R0 */
+                                <STM32_PINMUX('H',  3, AF14)>, /* LCD_R1 */
+                                <STM32_PINMUX('H',  8, AF14)>, /* LCD_R2 */
+                                <STM32_PINMUX('H',  9, AF14)>, /* LCD_R3 */
+                                <STM32_PINMUX('H', 10, AF14)>, /* LCD_R4 */
+                                <STM32_PINMUX('C',  0, AF14)>, /* LCD_R5 */
+                                <STM32_PINMUX('H', 12, AF14)>, /* LCD_R6 */
+                                <STM32_PINMUX('E', 15, AF14)>, /* LCD_R7 */
+                                <STM32_PINMUX('E',  5, AF14)>, /* LCD_G0 */
+                                <STM32_PINMUX('E',  6, AF14)>, /* LCD_G1 */
+                                <STM32_PINMUX('H', 13, AF14)>, /* LCD_G2 */
+                                <STM32_PINMUX('H', 14, AF14)>, /* LCD_G3 */
+                                <STM32_PINMUX('H', 15, AF14)>, /* LCD_G4 */
+                                <STM32_PINMUX('I',  0, AF14)>, /* LCD_G5 */
+                                <STM32_PINMUX('I',  1, AF14)>, /* LCD_G6 */
+                                <STM32_PINMUX('I',  2, AF14)>, /* LCD_G7 */
+                                <STM32_PINMUX('D',  9, AF14)>, /* LCD_B0 */
+                                <STM32_PINMUX('G', 12, AF14)>, /* LCD_B1 */
+                                <STM32_PINMUX('G', 10, AF14)>, /* LCD_B2 */
+                                <STM32_PINMUX('D', 10, AF14)>, /* LCD_B3 */
+                                <STM32_PINMUX('I',  4, AF14)>, /* LCD_B4 */
+                                <STM32_PINMUX('A',  3, AF14)>, /* LCD_B5 */
+                                <STM32_PINMUX('B',  8, AF14)>, /* LCD_B6 */
+                                <STM32_PINMUX('D',  8, AF14)>; /* LCD_B7 */
+                       bias-disable;
+                       drive-push-pull;
+                       slew-rate = <1>;
+               };
+       };
+
+       ltdc_pins_sleep_a: ltdc-a-1 {
+               pins {
+                       pinmux = <STM32_PINMUX('G',  7, ANALOG)>, /* LCD_CLK */
+                                <STM32_PINMUX('I', 10, ANALOG)>, /* LCD_HSYNC */
+                                <STM32_PINMUX('I',  9, ANALOG)>, /* LCD_VSYNC */
+                                <STM32_PINMUX('F', 10, ANALOG)>, /* LCD_DE */
+                                <STM32_PINMUX('H',  2, ANALOG)>, /* LCD_R0 */
+                                <STM32_PINMUX('H',  3, ANALOG)>, /* LCD_R1 */
+                                <STM32_PINMUX('H',  8, ANALOG)>, /* LCD_R2 */
+                                <STM32_PINMUX('H',  9, ANALOG)>, /* LCD_R3 */
+                                <STM32_PINMUX('H', 10, ANALOG)>, /* LCD_R4 */
+                                <STM32_PINMUX('C',  0, ANALOG)>, /* LCD_R5 */
+                                <STM32_PINMUX('H', 12, ANALOG)>, /* LCD_R6 */
+                                <STM32_PINMUX('E', 15, ANALOG)>, /* LCD_R7 */
+                                <STM32_PINMUX('E',  5, ANALOG)>, /* LCD_G0 */
+                                <STM32_PINMUX('E',  6, ANALOG)>, /* LCD_G1 */
+                                <STM32_PINMUX('H', 13, ANALOG)>, /* LCD_G2 */
+                                <STM32_PINMUX('H', 14, ANALOG)>, /* LCD_G3 */
+                                <STM32_PINMUX('H', 15, ANALOG)>, /* LCD_G4 */
+                                <STM32_PINMUX('I',  0, ANALOG)>, /* LCD_G5 */
+                                <STM32_PINMUX('I',  1, ANALOG)>, /* LCD_G6 */
+                                <STM32_PINMUX('I',  2, ANALOG)>, /* LCD_G7 */
+                                <STM32_PINMUX('D',  9, ANALOG)>, /* LCD_B0 */
+                                <STM32_PINMUX('G', 12, ANALOG)>, /* LCD_B1 */
+                                <STM32_PINMUX('G', 10, ANALOG)>, /* LCD_B2 */
+                                <STM32_PINMUX('D', 10, ANALOG)>, /* LCD_B3 */
+                                <STM32_PINMUX('I',  4, ANALOG)>, /* LCD_B4 */
+                                <STM32_PINMUX('A',  3, ANALOG)>, /* LCD_B5 */
+                                <STM32_PINMUX('B',  8, ANALOG)>, /* LCD_B6 */
+                                <STM32_PINMUX('D',  8, ANALOG)>; /* LCD_B7 */
+               };
+       };
+
+       ltdc_pins_b: ltdc-b-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('I', 14, AF14)>, /* LCD_CLK */
+                                <STM32_PINMUX('I', 12, AF14)>, /* LCD_HSYNC */
+                                <STM32_PINMUX('I', 13, AF14)>, /* LCD_VSYNC */
+                                <STM32_PINMUX('K',  7, AF14)>, /* LCD_DE */
+                                <STM32_PINMUX('I', 15, AF14)>, /* LCD_R0 */
+                                <STM32_PINMUX('J',  0, AF14)>, /* LCD_R1 */
+                                <STM32_PINMUX('J',  1, AF14)>, /* LCD_R2 */
+                                <STM32_PINMUX('J',  2, AF14)>, /* LCD_R3 */
+                                <STM32_PINMUX('J',  3, AF14)>, /* LCD_R4 */
+                                <STM32_PINMUX('J',  4, AF14)>, /* LCD_R5 */
+                                <STM32_PINMUX('J',  5, AF14)>, /* LCD_R6 */
+                                <STM32_PINMUX('J',  6, AF14)>, /* LCD_R7 */
+                                <STM32_PINMUX('J',  7, AF14)>, /* LCD_G0 */
+                                <STM32_PINMUX('J',  8, AF14)>, /* LCD_G1 */
+                                <STM32_PINMUX('J',  9, AF14)>, /* LCD_G2 */
+                                <STM32_PINMUX('J', 10, AF14)>, /* LCD_G3 */
+                                <STM32_PINMUX('J', 11, AF14)>, /* LCD_G4 */
+                                <STM32_PINMUX('K',  0, AF14)>, /* LCD_G5 */
+                                <STM32_PINMUX('K',  1, AF14)>, /* LCD_G6 */
+                                <STM32_PINMUX('K',  2, AF14)>, /* LCD_G7 */
+                                <STM32_PINMUX('J', 12, AF14)>, /* LCD_B0 */
+                                <STM32_PINMUX('J', 13, AF14)>, /* LCD_B1 */
+                                <STM32_PINMUX('J', 14, AF14)>, /* LCD_B2 */
+                                <STM32_PINMUX('J', 15, AF14)>, /* LCD_B3 */
+                                <STM32_PINMUX('K',  3, AF14)>, /* LCD_B4 */
+                                <STM32_PINMUX('K',  4, AF14)>, /* LCD_B5 */
+                                <STM32_PINMUX('K',  5, AF14)>, /* LCD_B6 */
+                                <STM32_PINMUX('K',  6, AF14)>; /* LCD_B7 */
+                       bias-disable;
+                       drive-push-pull;
+                       slew-rate = <1>;
+               };
+       };
+
+       ltdc_pins_sleep_b: ltdc-b-1 {
+               pins {
+                       pinmux = <STM32_PINMUX('I', 14, ANALOG)>, /* LCD_CLK */
+                                <STM32_PINMUX('I', 12, ANALOG)>, /* LCD_HSYNC */
+                                <STM32_PINMUX('I', 13, ANALOG)>, /* LCD_VSYNC */
+                                <STM32_PINMUX('K',  7, ANALOG)>, /* LCD_DE */
+                                <STM32_PINMUX('I', 15, ANALOG)>, /* LCD_R0 */
+                                <STM32_PINMUX('J',  0, ANALOG)>, /* LCD_R1 */
+                                <STM32_PINMUX('J',  1, ANALOG)>, /* LCD_R2 */
+                                <STM32_PINMUX('J',  2, ANALOG)>, /* LCD_R3 */
+                                <STM32_PINMUX('J',  3, ANALOG)>, /* LCD_R4 */
+                                <STM32_PINMUX('J',  4, ANALOG)>, /* LCD_R5 */
+                                <STM32_PINMUX('J',  5, ANALOG)>, /* LCD_R6 */
+                                <STM32_PINMUX('J',  6, ANALOG)>, /* LCD_R7 */
+                                <STM32_PINMUX('J',  7, ANALOG)>, /* LCD_G0 */
+                                <STM32_PINMUX('J',  8, ANALOG)>, /* LCD_G1 */
+                                <STM32_PINMUX('J',  9, ANALOG)>, /* LCD_G2 */
+                                <STM32_PINMUX('J', 10, ANALOG)>, /* LCD_G3 */
+                                <STM32_PINMUX('J', 11, ANALOG)>, /* LCD_G4 */
+                                <STM32_PINMUX('K',  0, ANALOG)>, /* LCD_G5 */
+                                <STM32_PINMUX('K',  1, ANALOG)>, /* LCD_G6 */
+                                <STM32_PINMUX('K',  2, ANALOG)>, /* LCD_G7 */
+                                <STM32_PINMUX('J', 12, ANALOG)>, /* LCD_B0 */
+                                <STM32_PINMUX('J', 13, ANALOG)>, /* LCD_B1 */
+                                <STM32_PINMUX('J', 14, ANALOG)>, /* LCD_B2 */
+                                <STM32_PINMUX('J', 15, ANALOG)>, /* LCD_B3 */
+                                <STM32_PINMUX('K',  3, ANALOG)>, /* LCD_B4 */
+                                <STM32_PINMUX('K',  4, ANALOG)>, /* LCD_B5 */
+                                <STM32_PINMUX('K',  5, ANALOG)>, /* LCD_B6 */
+                                <STM32_PINMUX('K',  6, ANALOG)>; /* LCD_B7 */
+               };
+       };
+
+       m_can1_pins_a: m-can1-0 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('H', 13, AF9)>; /* CAN1_TX */
+                       slew-rate = <1>;
+                       drive-push-pull;
+                       bias-disable;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('I', 9, AF9)>; /* CAN1_RX */
+                       bias-disable;
+               };
+       };
+
+       m_can1_sleep_pins_a: m_can1-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('H', 13, ANALOG)>, /* CAN1_TX */
+                                <STM32_PINMUX('I', 9, ANALOG)>; /* CAN1_RX */
+               };
+       };
+
+       pwm1_pins_a: pwm1-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('E', 9, AF1)>, /* TIM1_CH1 */
+                                <STM32_PINMUX('E', 11, AF1)>, /* TIM1_CH2 */
+                                <STM32_PINMUX('E', 14, AF1)>; /* TIM1_CH4 */
+                       bias-pull-down;
+                       drive-push-pull;
+                       slew-rate = <0>;
+               };
+       };
+
+       pwm1_sleep_pins_a: pwm1-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('E', 9, ANALOG)>, /* TIM1_CH1 */
+                                <STM32_PINMUX('E', 11, ANALOG)>, /* TIM1_CH2 */
+                                <STM32_PINMUX('E', 14, ANALOG)>; /* TIM1_CH4 */
+               };
+       };
+
+       pwm2_pins_a: pwm2-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('A', 3, AF1)>; /* TIM2_CH4 */
+                       bias-pull-down;
+                       drive-push-pull;
+                       slew-rate = <0>;
+               };
+       };
+
+       pwm2_sleep_pins_a: pwm2-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('A', 3, ANALOG)>; /* TIM2_CH4 */
+               };
+       };
+
+       pwm3_pins_a: pwm3-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('C', 7, AF2)>; /* TIM3_CH2 */
+                       bias-pull-down;
+                       drive-push-pull;
+                       slew-rate = <0>;
+               };
+       };
+
+       pwm3_sleep_pins_a: pwm3-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('C', 7, ANALOG)>; /* TIM3_CH2 */
+               };
+       };
+
+       pwm4_pins_a: pwm4-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('D', 14, AF2)>, /* TIM4_CH3 */
+                                <STM32_PINMUX('D', 15, AF2)>; /* TIM4_CH4 */
+                       bias-pull-down;
+                       drive-push-pull;
+                       slew-rate = <0>;
+               };
+       };
+
+       pwm4_sleep_pins_a: pwm4-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('D', 14, ANALOG)>, /* TIM4_CH3 */
+                                <STM32_PINMUX('D', 15, ANALOG)>; /* TIM4_CH4 */
+               };
+       };
+
+       pwm4_pins_b: pwm4-1 {
+               pins {
+                       pinmux = <STM32_PINMUX('D', 13, AF2)>; /* TIM4_CH2 */
+                       bias-pull-down;
+                       drive-push-pull;
+                       slew-rate = <0>;
+               };
+       };
+
+       pwm4_sleep_pins_b: pwm4-sleep-1 {
+               pins {
+                       pinmux = <STM32_PINMUX('D', 13, ANALOG)>; /* TIM4_CH2 */
+               };
+       };
+
+       pwm5_pins_a: pwm5-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('H', 11, AF2)>; /* TIM5_CH2 */
+                       bias-pull-down;
+                       drive-push-pull;
+                       slew-rate = <0>;
+               };
+       };
+
+       pwm5_sleep_pins_a: pwm5-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('H', 11, ANALOG)>; /* TIM5_CH2 */
+               };
+       };
+
+       pwm8_pins_a: pwm8-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('I', 2, AF3)>; /* TIM8_CH4 */
+                       bias-pull-down;
+                       drive-push-pull;
+                       slew-rate = <0>;
+               };
+       };
+
+       pwm8_sleep_pins_a: pwm8-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('I', 2, ANALOG)>; /* TIM8_CH4 */
+               };
+       };
+
+       pwm12_pins_a: pwm12-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('H', 6, AF2)>; /* TIM12_CH1 */
+                       bias-pull-down;
+                       drive-push-pull;
+                       slew-rate = <0>;
+               };
+       };
+
+       pwm12_sleep_pins_a: pwm12-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('H', 6, ANALOG)>; /* TIM12_CH1 */
+               };
+       };
+
+       qspi_clk_pins_a: qspi-clk-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('F', 10, AF9)>; /* QSPI_CLK */
+                       bias-disable;
+                       drive-push-pull;
+                       slew-rate = <3>;
+               };
+       };
+
+       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 */
+                                <STM32_PINMUX('F', 9, AF10)>, /* QSPI_BK1_IO1 */
+                                <STM32_PINMUX('F', 7, AF9)>, /* QSPI_BK1_IO2 */
+                                <STM32_PINMUX('F', 6, AF9)>; /* QSPI_BK1_IO3 */
+                       bias-disable;
+                       drive-push-pull;
+                       slew-rate = <1>;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('B', 6, AF10)>; /* QSPI_BK1_NCS */
+                       bias-pull-up;
+                       drive-push-pull;
+                       slew-rate = <1>;
+               };
+       };
+
+       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 */
+                                <STM32_PINMUX('H', 3, AF9)>, /* QSPI_BK2_IO1 */
+                                <STM32_PINMUX('G', 10, AF11)>, /* QSPI_BK2_IO2 */
+                                <STM32_PINMUX('G', 7, AF11)>; /* QSPI_BK2_IO3 */
+                       bias-disable;
+                       drive-push-pull;
+                       slew-rate = <1>;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('C', 0, AF10)>; /* QSPI_BK2_NCS */
+                       bias-pull-up;
+                       drive-push-pull;
+                       slew-rate = <1>;
+               };
+       };
+
+       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 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('C', 8, AF12)>, /* SDMMC1_D0 */
+                                <STM32_PINMUX('C', 9, AF12)>, /* SDMMC1_D1 */
+                                <STM32_PINMUX('C', 10, AF12)>, /* SDMMC1_D2 */
+                                <STM32_PINMUX('C', 11, AF12)>, /* SDMMC1_D3 */
+                                <STM32_PINMUX('D', 2, AF12)>; /* SDMMC1_CMD */
+                       slew-rate = <1>;
+                       drive-push-pull;
+                       bias-disable;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('C', 12, AF12)>; /* SDMMC1_CK */
+                       slew-rate = <2>;
+                       drive-push-pull;
+                       bias-disable;
+               };
+       };
+
+       sdmmc1_b4_od_pins_a: sdmmc1-b4-od-0 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('C', 8, AF12)>, /* SDMMC1_D0 */
+                                <STM32_PINMUX('C', 9, AF12)>, /* SDMMC1_D1 */
+                                <STM32_PINMUX('C', 10, AF12)>, /* SDMMC1_D2 */
+                                <STM32_PINMUX('C', 11, AF12)>; /* SDMMC1_D3 */
+                       slew-rate = <1>;
+                       drive-push-pull;
+                       bias-disable;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('C', 12, AF12)>; /* SDMMC1_CK */
+                       slew-rate = <2>;
+                       drive-push-pull;
+                       bias-disable;
+               };
+               pins3 {
+                       pinmux = <STM32_PINMUX('D', 2, AF12)>; /* SDMMC1_CMD */
+                       slew-rate = <1>;
+                       drive-open-drain;
+                       bias-disable;
+               };
+       };
+
+       sdmmc1_b4_sleep_pins_a: sdmmc1-b4-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('C', 8, ANALOG)>, /* SDMMC1_D0 */
+                                <STM32_PINMUX('C', 9, ANALOG)>, /* SDMMC1_D1 */
+                                <STM32_PINMUX('C', 10, ANALOG)>, /* SDMMC1_D2 */
+                                <STM32_PINMUX('C', 11, ANALOG)>, /* SDMMC1_D3 */
+                                <STM32_PINMUX('C', 12, ANALOG)>, /* SDMMC1_CK */
+                                <STM32_PINMUX('D', 2, ANALOG)>; /* SDMMC1_CMD */
+               };
+       };
+
+       sdmmc1_dir_pins_a: sdmmc1-dir-0 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('F', 2, AF11)>, /* SDMMC1_D0DIR */
+                                <STM32_PINMUX('C', 7, AF8)>, /* SDMMC1_D123DIR */
+                                <STM32_PINMUX('B', 9, AF11)>; /* SDMMC1_CDIR */
+                       slew-rate = <1>;
+                       drive-push-pull;
+                       bias-pull-up;
+               };
+               pins2{
+                       pinmux = <STM32_PINMUX('E', 4, AF8)>; /* SDMMC1_CKIN */
+                       bias-pull-up;
+               };
+       };
+
+       sdmmc1_dir_sleep_pins_a: sdmmc1-dir-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('F', 2, ANALOG)>, /* SDMMC1_D0DIR */
+                                <STM32_PINMUX('C', 7, ANALOG)>, /* SDMMC1_D123DIR */
+                                <STM32_PINMUX('B', 9, ANALOG)>, /* SDMMC1_CDIR */
+                                <STM32_PINMUX('E', 4, ANALOG)>; /* SDMMC1_CKIN */
+               };
+       };
+
+       sdmmc2_b4_pins_a: sdmmc2-b4-0 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */
+                                <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */
+                                <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */
+                                <STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */
+                                <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */
+                       slew-rate = <1>;
+                       drive-push-pull;
+                       bias-pull-up;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */
+                       slew-rate = <2>;
+                       drive-push-pull;
+                       bias-pull-up;
+               };
+       };
+
+       sdmmc2_b4_od_pins_a: sdmmc2-b4-od-0 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */
+                                <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */
+                                <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */
+                                <STM32_PINMUX('B', 4, AF9)>; /* SDMMC2_D3 */
+                       slew-rate = <1>;
+                       drive-push-pull;
+                       bias-pull-up;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */
+                       slew-rate = <2>;
+                       drive-push-pull;
+                       bias-pull-up;
+               };
+               pins3 {
+                       pinmux = <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */
+                       slew-rate = <1>;
+                       drive-open-drain;
+                       bias-pull-up;
+               };
+       };
+
+       sdmmc2_b4_sleep_pins_a: sdmmc2-b4-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('B', 14, ANALOG)>, /* SDMMC2_D0 */
+                                <STM32_PINMUX('B', 15, ANALOG)>, /* SDMMC2_D1 */
+                                <STM32_PINMUX('B', 3, ANALOG)>, /* SDMMC2_D2 */
+                                <STM32_PINMUX('B', 4, ANALOG)>, /* SDMMC2_D3 */
+                                <STM32_PINMUX('E', 3, ANALOG)>, /* SDMMC2_CK */
+                                <STM32_PINMUX('G', 6, ANALOG)>; /* SDMMC2_CMD */
+               };
+       };
+
+       sdmmc2_b4_pins_b: sdmmc2-b4-1 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */
+                                <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */
+                                <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */
+                                <STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */
+                                <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */
+                       slew-rate = <1>;
+                       drive-push-pull;
+                       bias-disable;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */
+                       slew-rate = <2>;
+                       drive-push-pull;
+                       bias-disable;
+               };
+       };
+
+       sdmmc2_b4_od_pins_b: sdmmc2-b4-od-1 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */
+                                <STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */
+                                <STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */
+                                <STM32_PINMUX('B', 4, AF9)>; /* SDMMC2_D3 */
+                       slew-rate = <1>;
+                       drive-push-pull;
+                       bias-disable;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */
+                       slew-rate = <2>;
+                       drive-push-pull;
+                       bias-disable;
+               };
+               pins3 {
+                       pinmux = <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */
+                       slew-rate = <1>;
+                       drive-open-drain;
+                       bias-disable;
+               };
+       };
+
+       sdmmc2_d47_pins_a: sdmmc2-d47-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('A', 8, AF9)>, /* SDMMC2_D4 */
+                                <STM32_PINMUX('A', 9, AF10)>, /* SDMMC2_D5 */
+                                <STM32_PINMUX('E', 5, AF9)>, /* SDMMC2_D6 */
+                                <STM32_PINMUX('D', 3, AF9)>; /* SDMMC2_D7 */
+                       slew-rate = <1>;
+                       drive-push-pull;
+                       bias-pull-up;
+               };
+       };
+
+       sdmmc2_d47_sleep_pins_a: sdmmc2-d47-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('A', 8, ANALOG)>, /* SDMMC2_D4 */
+                                <STM32_PINMUX('A', 9, ANALOG)>, /* SDMMC2_D5 */
+                                <STM32_PINMUX('E', 5, ANALOG)>, /* SDMMC2_D6 */
+                                <STM32_PINMUX('D', 3, ANALOG)>; /* SDMMC2_D7 */
+               };
+       };
+
+       sdmmc3_b4_pins_a: sdmmc3-b4-0 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('F', 0, AF9)>, /* SDMMC3_D0 */
+                                <STM32_PINMUX('F', 4, AF9)>, /* SDMMC3_D1 */
+                                <STM32_PINMUX('F', 5, AF9)>, /* SDMMC3_D2 */
+                                <STM32_PINMUX('D', 7, AF10)>, /* SDMMC3_D3 */
+                                <STM32_PINMUX('F', 1, AF9)>; /* SDMMC3_CMD */
+                       slew-rate = <1>;
+                       drive-push-pull;
+                       bias-pull-up;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('G', 15, AF10)>; /* SDMMC3_CK */
+                       slew-rate = <2>;
+                       drive-push-pull;
+                       bias-pull-up;
+               };
+       };
+
+       sdmmc3_b4_od_pins_a: sdmmc3-b4-od-0 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('F', 0, AF9)>, /* SDMMC3_D0 */
+                                <STM32_PINMUX('F', 4, AF9)>, /* SDMMC3_D1 */
+                                <STM32_PINMUX('F', 5, AF9)>, /* SDMMC3_D2 */
+                                <STM32_PINMUX('D', 7, AF10)>; /* SDMMC3_D3 */
+                       slew-rate = <1>;
+                       drive-push-pull;
+                       bias-pull-up;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('G', 15, AF10)>; /* SDMMC3_CK */
+                       slew-rate = <2>;
+                       drive-push-pull;
+                       bias-pull-up;
+               };
+               pins3 {
+                       pinmux = <STM32_PINMUX('F', 1, AF9)>; /* SDMMC2_CMD */
+                       slew-rate = <1>;
+                       drive-open-drain;
+                       bias-pull-up;
+               };
+       };
+
+       sdmmc3_b4_sleep_pins_a: sdmmc3-b4-sleep-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('F', 0, ANALOG)>, /* SDMMC3_D0 */
+                                <STM32_PINMUX('F', 4, ANALOG)>, /* SDMMC3_D1 */
+                                <STM32_PINMUX('F', 5, ANALOG)>, /* SDMMC3_D2 */
+                                <STM32_PINMUX('D', 7, ANALOG)>, /* SDMMC3_D3 */
+                                <STM32_PINMUX('G', 15, ANALOG)>, /* SDMMC3_CK */
+                                <STM32_PINMUX('F', 1, ANALOG)>; /* SDMMC3_CMD */
+               };
+       };
+
+       spdifrx_pins_a: spdifrx-0 {
+               pins {
+                       pinmux = <STM32_PINMUX('G', 12, AF8)>; /* SPDIF_IN1 */
+                       bias-disable;
+               };
+       };
+
+       spdifrx_sleep_pins_a: spdifrx-1 {
+               pins {
+                       pinmux = <STM32_PINMUX('G', 12, ANALOG)>; /* SPDIF_IN1 */
+               };
+       };
+
+       spi2_pins_a: spi2-0 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('B', 10, AF5)>, /* SPI2_SCK */
+                                <STM32_PINMUX('I', 0, AF5)>, /* SPI2_NSS */
+                                <STM32_PINMUX('I', 3, AF5)>; /* SPI2_MOSI */
+                       bias-disable;
+                       drive-push-pull;
+                       slew-rate = <3>;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('I', 2, AF5)>; /* SPI2_MISO */
+                       bias-disable;
+               };
+       };
+
+       stusb1600_pins_a: stusb1600-0 {
+                       pins {
+                               pinmux = <STM32_PINMUX('I', 11, ANALOG)>;
+                               bias-pull-up;
+               };
+       };
+
+       uart4_pins_a: uart4-0 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('G', 11, AF6)>; /* UART4_TX */
+                       bias-disable;
+                       drive-push-pull;
+                       slew-rate = <0>;
+               };
+               pins2 {
+                       pinmux = <STM32_PINMUX('B', 2, AF8)>; /* UART4_RX */
+                       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 {
+       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 {
+               pins {
+                       pinmux = <STM32_PINMUX('Z', 4, AF6)>, /* I2C4_SCL */
+                                <STM32_PINMUX('Z', 5, AF6)>; /* I2C4_SDA */
+                       bias-disable;
+                       drive-open-drain;
+                       slew-rate = <0>;
+               };
+       };
+
+       i2c4_pins_sleep_a: i2c4-1 {
+               pins {
+                       pinmux = <STM32_PINMUX('Z', 4, ANALOG)>, /* I2C4_SCL */
+                                <STM32_PINMUX('Z', 5, ANALOG)>; /* I2C4_SDA */
+               };
+       };
+
+       spi1_pins_a: spi1-0 {
+               pins1 {
+                       pinmux = <STM32_PINMUX('Z', 0, AF5)>, /* SPI1_SCK */
+                                <STM32_PINMUX('Z', 2, AF5)>; /* SPI1_MOSI */
+                       bias-disable;
+                       drive-push-pull;
+                       slew-rate = <1>;
+               };
+
+               pins2 {
+                       pinmux = <STM32_PINMUX('Z', 1, AF5)>; /* SPI1_MISO */
+                       bias-disable;
+               };
+       };
+};
diff --git a/arch/arm/dts/stm32mp15-u-boot.dtsi b/arch/arm/dts/stm32mp15-u-boot.dtsi
new file mode 100644 (file)
index 0000000..8f9535a
--- /dev/null
@@ -0,0 +1,155 @@
+// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
+/*
+ * Copyright : STMicroelectronics 2018
+ */
+
+/ {
+       aliases {
+               gpio0 = &gpioa;
+               gpio1 = &gpiob;
+               gpio2 = &gpioc;
+               gpio3 = &gpiod;
+               gpio4 = &gpioe;
+               gpio5 = &gpiof;
+               gpio6 = &gpiog;
+               gpio7 = &gpioh;
+               gpio8 = &gpioi;
+               gpio9 = &gpioj;
+               gpio10 = &gpiok;
+               gpio25 = &gpioz;
+               pinctrl0 = &pinctrl;
+               pinctrl1 = &pinctrl_z;
+       };
+
+       clocks {
+               u-boot,dm-pre-reloc;
+       };
+
+       /* need PSCI for sysreset during board_f */
+       psci {
+               u-boot,dm-pre-proper;
+       };
+
+       reboot {
+               u-boot,dm-pre-reloc;
+       };
+
+       soc {
+               u-boot,dm-pre-reloc;
+       };
+};
+
+&bsec {
+       u-boot,dm-pre-proper;
+};
+
+&clk_csi {
+       u-boot,dm-pre-reloc;
+};
+
+&clk_hsi {
+       u-boot,dm-pre-reloc;
+};
+
+&clk_hse {
+       u-boot,dm-pre-reloc;
+};
+
+&clk_lsi {
+       u-boot,dm-pre-reloc;
+};
+
+&clk_lse {
+       u-boot,dm-pre-reloc;
+};
+
+&gpioa {
+       u-boot,dm-pre-reloc;
+};
+
+&gpiob {
+       u-boot,dm-pre-reloc;
+};
+
+&gpioc {
+       u-boot,dm-pre-reloc;
+};
+
+&gpiod {
+       u-boot,dm-pre-reloc;
+};
+
+&gpioe {
+       u-boot,dm-pre-reloc;
+};
+
+&gpiof {
+       u-boot,dm-pre-reloc;
+};
+
+&gpiog {
+       u-boot,dm-pre-reloc;
+};
+
+&gpioh {
+       u-boot,dm-pre-reloc;
+};
+
+&gpioi {
+       u-boot,dm-pre-reloc;
+};
+
+&gpioj {
+       u-boot,dm-pre-reloc;
+};
+
+&gpiok {
+       u-boot,dm-pre-reloc;
+};
+
+&gpioz {
+       u-boot,dm-pre-reloc;
+};
+
+&iwdg2 {
+       u-boot,dm-pre-reloc;
+};
+
+/* pre-reloc probe = reserve video frame buffer in video_reserve() */
+&ltdc {
+       u-boot,dm-pre-proper;
+};
+
+&pinctrl {
+       u-boot,dm-pre-reloc;
+};
+
+&pinctrl_z {
+       u-boot,dm-pre-reloc;
+};
+
+&pwr_regulators {
+       u-boot,dm-pre-reloc;
+};
+
+&rcc {
+       u-boot,dm-pre-reloc;
+       #address-cells = <1>;
+       #size-cells = <0>;
+};
+
+&sdmmc1 {
+       compatible = "st,stm32-sdmmc2", "arm,pl18x", "arm,primecell";
+};
+
+&sdmmc2 {
+       compatible = "st,stm32-sdmmc2", "arm,pl18x", "arm,primecell";
+};
+
+&sdmmc3 {
+       compatible = "st,stm32-sdmmc2", "arm,pl18x", "arm,primecell";
+};
+
+&usbotg_hs {
+       compatible = "st,stm32mp1-hsotg", "snps,dwc2";
+};
diff --git a/arch/arm/dts/stm32mp151.dtsi b/arch/arm/dts/stm32mp151.dtsi
new file mode 100644 (file)
index 0000000..f185639
--- /dev/null
@@ -0,0 +1,1716 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) STMicroelectronics 2017 - All Rights Reserved
+ * Author: Ludovic Barre <ludovic.barre@st.com> for STMicroelectronics.
+ */
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/clock/stm32mp1-clks.h>
+#include <dt-bindings/reset/stm32mp1-resets.h>
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu0: cpu@0 {
+                       compatible = "arm,cortex-a7";
+                       device_type = "cpu";
+                       reg = <0>;
+               };
+       };
+
+       psci {
+               compatible = "arm,psci-1.0";
+               method = "smc";
+               cpu_off = <0x84000002>;
+               cpu_on = <0x84000003>;
+       };
+
+       intc: interrupt-controller@a0021000 {
+               compatible = "arm,cortex-a7-gic";
+               #interrupt-cells = <3>;
+               interrupt-controller;
+               reg = <0xa0021000 0x1000>,
+                     <0xa0022000 0x2000>;
+       };
+
+       timer {
+               compatible = "arm,armv7-timer";
+               interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
+               interrupt-parent = <&intc>;
+       };
+
+       clocks {
+               clk_hse: clk-hse {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <24000000>;
+               };
+
+               clk_hsi: clk-hsi {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <64000000>;
+               };
+
+               clk_lse: clk-lse {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <32768>;
+               };
+
+               clk_lsi: clk-lsi {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <32000>;
+               };
+
+               clk_csi: clk-csi {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <4000000>;
+               };
+       };
+
+       thermal-zones {
+               cpu_thermal: cpu-thermal {
+                       polling-delay-passive = <0>;
+                       polling-delay = <0>;
+                       thermal-sensors = <&dts>;
+
+                       trips {
+                               cpu_alert1: cpu-alert1 {
+                                       temperature = <85000>;
+                                       hysteresis = <0>;
+                                       type = "passive";
+                               };
+
+                               cpu-crit {
+                                       temperature = <120000>;
+                                       hysteresis = <0>;
+                                       type = "critical";
+                               };
+                       };
+
+                       cooling-maps {
+                       };
+               };
+       };
+
+       booster: regulator-booster {
+               compatible = "st,stm32mp1-booster";
+               st,syscfg = <&syscfg>;
+               status = "disabled";
+       };
+
+       reboot {
+               compatible = "syscon-reboot";
+               regmap = <&rcc>;
+               offset = <0x404>;
+               mask = <0x1>;
+       };
+
+       soc {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               interrupt-parent = <&intc>;
+               ranges;
+
+               timers2: timer@40000000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40000000 0x400>;
+                       clocks = <&rcc TIM2_K>;
+                       clock-names = "int";
+                       dmas = <&dmamux1 18 0x400 0x1>,
+                              <&dmamux1 19 0x400 0x1>,
+                              <&dmamux1 20 0x400 0x1>,
+                              <&dmamux1 21 0x400 0x1>,
+                              <&dmamux1 22 0x400 0x1>;
+                       dma-names = "ch1", "ch2", "ch3", "ch4", "up";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       timer@1 {
+                               compatible = "st,stm32h7-timer-trigger";
+                               reg = <1>;
+                               status = "disabled";
+                       };
+
+                       counter {
+                               compatible = "st,stm32-timer-counter";
+                               status = "disabled";
+                       };
+               };
+
+               timers3: timer@40001000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40001000 0x400>;
+                       clocks = <&rcc TIM3_K>;
+                       clock-names = "int";
+                       dmas = <&dmamux1 23 0x400 0x1>,
+                              <&dmamux1 24 0x400 0x1>,
+                              <&dmamux1 25 0x400 0x1>,
+                              <&dmamux1 26 0x400 0x1>,
+                              <&dmamux1 27 0x400 0x1>,
+                              <&dmamux1 28 0x400 0x1>;
+                       dma-names = "ch1", "ch2", "ch3", "ch4", "up", "trig";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       timer@2 {
+                               compatible = "st,stm32h7-timer-trigger";
+                               reg = <2>;
+                               status = "disabled";
+                       };
+
+                       counter {
+                               compatible = "st,stm32-timer-counter";
+                               status = "disabled";
+                       };
+               };
+
+               timers4: timer@40002000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40002000 0x400>;
+                       clocks = <&rcc TIM4_K>;
+                       clock-names = "int";
+                       dmas = <&dmamux1 29 0x400 0x1>,
+                              <&dmamux1 30 0x400 0x1>,
+                              <&dmamux1 31 0x400 0x1>,
+                              <&dmamux1 32 0x400 0x1>;
+                       dma-names = "ch1", "ch2", "ch3", "ch4";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       timer@3 {
+                               compatible = "st,stm32h7-timer-trigger";
+                               reg = <3>;
+                               status = "disabled";
+                       };
+
+                       counter {
+                               compatible = "st,stm32-timer-counter";
+                               status = "disabled";
+                       };
+               };
+
+               timers5: timer@40003000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40003000 0x400>;
+                       clocks = <&rcc TIM5_K>;
+                       clock-names = "int";
+                       dmas = <&dmamux1 55 0x400 0x1>,
+                              <&dmamux1 56 0x400 0x1>,
+                              <&dmamux1 57 0x400 0x1>,
+                              <&dmamux1 58 0x400 0x1>,
+                              <&dmamux1 59 0x400 0x1>,
+                              <&dmamux1 60 0x400 0x1>;
+                       dma-names = "ch1", "ch2", "ch3", "ch4", "up", "trig";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       timer@4 {
+                               compatible = "st,stm32h7-timer-trigger";
+                               reg = <4>;
+                               status = "disabled";
+                       };
+
+                       counter {
+                               compatible = "st,stm32-timer-counter";
+                               status = "disabled";
+                       };
+               };
+
+               timers6: timer@40004000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40004000 0x400>;
+                       clocks = <&rcc TIM6_K>;
+                       clock-names = "int";
+                       dmas = <&dmamux1 69 0x400 0x1>;
+                       dma-names = "up";
+                       status = "disabled";
+
+                       timer@5 {
+                               compatible = "st,stm32h7-timer-trigger";
+                               reg = <5>;
+                               status = "disabled";
+                       };
+               };
+
+               timers7: timer@40005000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40005000 0x400>;
+                       clocks = <&rcc TIM7_K>;
+                       clock-names = "int";
+                       dmas = <&dmamux1 70 0x400 0x1>;
+                       dma-names = "up";
+                       status = "disabled";
+
+                       timer@6 {
+                               compatible = "st,stm32h7-timer-trigger";
+                               reg = <6>;
+                               status = "disabled";
+                       };
+               };
+
+               timers12: timer@40006000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40006000 0x400>;
+                       clocks = <&rcc TIM12_K>;
+                       clock-names = "int";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       timer@11 {
+                               compatible = "st,stm32h7-timer-trigger";
+                               reg = <11>;
+                               status = "disabled";
+                       };
+               };
+
+               timers13: timer@40007000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40007000 0x400>;
+                       clocks = <&rcc TIM13_K>;
+                       clock-names = "int";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       timer@12 {
+                               compatible = "st,stm32h7-timer-trigger";
+                               reg = <12>;
+                               status = "disabled";
+                       };
+               };
+
+               timers14: timer@40008000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40008000 0x400>;
+                       clocks = <&rcc TIM14_K>;
+                       clock-names = "int";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       timer@13 {
+                               compatible = "st,stm32h7-timer-trigger";
+                               reg = <13>;
+                               status = "disabled";
+                       };
+               };
+
+               lptimer1: timer@40009000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-lptimer";
+                       reg = <0x40009000 0x400>;
+                       clocks = <&rcc LPTIM1_K>;
+                       clock-names = "mux";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm-lp";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       trigger@0 {
+                               compatible = "st,stm32-lptimer-trigger";
+                               reg = <0>;
+                               status = "disabled";
+                       };
+
+                       counter {
+                               compatible = "st,stm32-lptimer-counter";
+                               status = "disabled";
+                       };
+               };
+
+               spi2: spi@4000b000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32h7-spi";
+                       reg = <0x4000b000 0x400>;
+                       interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc SPI2_K>;
+                       resets = <&rcc SPI2_R>;
+                       dmas = <&dmamux1 39 0x400 0x05>,
+                              <&dmamux1 40 0x400 0x05>;
+                       dma-names = "rx", "tx";
+                       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>;
+                       compatible = "st,stm32h7-spi";
+                       reg = <0x4000c000 0x400>;
+                       interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc SPI3_K>;
+                       resets = <&rcc SPI3_R>;
+                       dmas = <&dmamux1 61 0x400 0x05>,
+                              <&dmamux1 62 0x400 0x05>;
+                       dma-names = "rx", "tx";
+                       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>;
+                       reg = <0x4000d000 0x400>;
+                       clocks = <&rcc SPDIF_K>;
+                       clock-names = "kclk";
+                       interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
+                       dmas = <&dmamux1 93 0x400 0x01>,
+                              <&dmamux1 94 0x400 0x01>;
+                       dma-names = "rx", "rx-ctrl";
+                       status = "disabled";
+               };
+
+               usart2: serial@4000e000 {
+                       compatible = "st,stm32h7-uart";
+                       reg = <0x4000e000 0x400>;
+                       interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc USART2_K>;
+                       status = "disabled";
+               };
+
+               usart3: serial@4000f000 {
+                       compatible = "st,stm32h7-uart";
+                       reg = <0x4000f000 0x400>;
+                       interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc USART3_K>;
+                       status = "disabled";
+               };
+
+               uart4: serial@40010000 {
+                       compatible = "st,stm32h7-uart";
+                       reg = <0x40010000 0x400>;
+                       interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc UART4_K>;
+                       status = "disabled";
+               };
+
+               uart5: serial@40011000 {
+                       compatible = "st,stm32h7-uart";
+                       reg = <0x40011000 0x400>;
+                       interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc UART5_K>;
+                       status = "disabled";
+               };
+
+               i2c1: i2c@40012000 {
+                       compatible = "st,stm32f7-i2c";
+                       reg = <0x40012000 0x400>;
+                       interrupt-names = "event", "error";
+                       interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc I2C1_K>;
+                       resets = <&rcc I2C1_R>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               i2c2: i2c@40013000 {
+                       compatible = "st,stm32f7-i2c";
+                       reg = <0x40013000 0x400>;
+                       interrupt-names = "event", "error";
+                       interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc I2C2_K>;
+                       resets = <&rcc I2C2_R>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               i2c3: i2c@40014000 {
+                       compatible = "st,stm32f7-i2c";
+                       reg = <0x40014000 0x400>;
+                       interrupt-names = "event", "error";
+                       interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc I2C3_K>;
+                       resets = <&rcc I2C3_R>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               i2c5: i2c@40015000 {
+                       compatible = "st,stm32f7-i2c";
+                       reg = <0x40015000 0x400>;
+                       interrupt-names = "event", "error";
+                       interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc I2C5_K>;
+                       resets = <&rcc I2C5_R>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               cec: cec@40016000 {
+                       compatible = "st,stm32-cec";
+                       reg = <0x40016000 0x400>;
+                       interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc CEC_K>, <&clk_lse>;
+                       clock-names = "cec", "hdmi-cec";
+                       status = "disabled";
+               };
+
+               dac: dac@40017000 {
+                       compatible = "st,stm32h7-dac-core";
+                       reg = <0x40017000 0x400>;
+                       clocks = <&rcc DAC12>;
+                       clock-names = "pclk";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+
+                       dac1: dac@1 {
+                               compatible = "st,stm32-dac";
+                               #io-channels-cells = <1>;
+                               reg = <1>;
+                               status = "disabled";
+                       };
+
+                       dac2: dac@2 {
+                               compatible = "st,stm32-dac";
+                               #io-channels-cells = <1>;
+                               reg = <2>;
+                               status = "disabled";
+                       };
+               };
+
+               uart7: serial@40018000 {
+                       compatible = "st,stm32h7-uart";
+                       reg = <0x40018000 0x400>;
+                       interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc UART7_K>;
+                       status = "disabled";
+               };
+
+               uart8: serial@40019000 {
+                       compatible = "st,stm32h7-uart";
+                       reg = <0x40019000 0x400>;
+                       interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc UART8_K>;
+                       status = "disabled";
+               };
+
+               timers1: timer@44000000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x44000000 0x400>;
+                       clocks = <&rcc TIM1_K>;
+                       clock-names = "int";
+                       dmas = <&dmamux1 11 0x400 0x1>,
+                              <&dmamux1 12 0x400 0x1>,
+                              <&dmamux1 13 0x400 0x1>,
+                              <&dmamux1 14 0x400 0x1>,
+                              <&dmamux1 15 0x400 0x1>,
+                              <&dmamux1 16 0x400 0x1>,
+                              <&dmamux1 17 0x400 0x1>;
+                       dma-names = "ch1", "ch2", "ch3", "ch4",
+                                   "up", "trig", "com";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       timer@0 {
+                               compatible = "st,stm32h7-timer-trigger";
+                               reg = <0>;
+                               status = "disabled";
+                       };
+
+                       counter {
+                               compatible = "st,stm32-timer-counter";
+                               status = "disabled";
+                       };
+               };
+
+               timers8: timer@44001000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x44001000 0x400>;
+                       clocks = <&rcc TIM8_K>;
+                       clock-names = "int";
+                       dmas = <&dmamux1 47 0x400 0x1>,
+                              <&dmamux1 48 0x400 0x1>,
+                              <&dmamux1 49 0x400 0x1>,
+                              <&dmamux1 50 0x400 0x1>,
+                              <&dmamux1 51 0x400 0x1>,
+                              <&dmamux1 52 0x400 0x1>,
+                              <&dmamux1 53 0x400 0x1>;
+                       dma-names = "ch1", "ch2", "ch3", "ch4",
+                                   "up", "trig", "com";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       timer@7 {
+                               compatible = "st,stm32h7-timer-trigger";
+                               reg = <7>;
+                               status = "disabled";
+                       };
+
+                       counter {
+                               compatible = "st,stm32-timer-counter";
+                               status = "disabled";
+                       };
+               };
+
+               usart6: serial@44003000 {
+                       compatible = "st,stm32h7-uart";
+                       reg = <0x44003000 0x400>;
+                       interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc USART6_K>;
+                       status = "disabled";
+               };
+
+               spi1: spi@44004000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32h7-spi";
+                       reg = <0x44004000 0x400>;
+                       interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc SPI1_K>;
+                       resets = <&rcc SPI1_R>;
+                       dmas = <&dmamux1 37 0x400 0x05>,
+                              <&dmamux1 38 0x400 0x05>;
+                       dma-names = "rx", "tx";
+                       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>;
+                       compatible = "st,stm32h7-spi";
+                       reg = <0x44005000 0x400>;
+                       interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc SPI4_K>;
+                       resets = <&rcc SPI4_R>;
+                       dmas = <&dmamux1 83 0x400 0x05>,
+                              <&dmamux1 84 0x400 0x05>;
+                       dma-names = "rx", "tx";
+                       status = "disabled";
+               };
+
+               timers15: timer@44006000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x44006000 0x400>;
+                       clocks = <&rcc TIM15_K>;
+                       clock-names = "int";
+                       dmas = <&dmamux1 105 0x400 0x1>,
+                              <&dmamux1 106 0x400 0x1>,
+                              <&dmamux1 107 0x400 0x1>,
+                              <&dmamux1 108 0x400 0x1>;
+                       dma-names = "ch1", "up", "trig", "com";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       timer@14 {
+                               compatible = "st,stm32h7-timer-trigger";
+                               reg = <14>;
+                               status = "disabled";
+                       };
+               };
+
+               timers16: timer@44007000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x44007000 0x400>;
+                       clocks = <&rcc TIM16_K>;
+                       clock-names = "int";
+                       dmas = <&dmamux1 109 0x400 0x1>,
+                              <&dmamux1 110 0x400 0x1>;
+                       dma-names = "ch1", "up";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+                       timer@15 {
+                               compatible = "st,stm32h7-timer-trigger";
+                               reg = <15>;
+                               status = "disabled";
+                       };
+               };
+
+               timers17: timer@44008000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x44008000 0x400>;
+                       clocks = <&rcc TIM17_K>;
+                       clock-names = "int";
+                       dmas = <&dmamux1 111 0x400 0x1>,
+                              <&dmamux1 112 0x400 0x1>;
+                       dma-names = "ch1", "up";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       timer@16 {
+                               compatible = "st,stm32h7-timer-trigger";
+                               reg = <16>;
+                               status = "disabled";
+                       };
+               };
+
+               spi5: spi@44009000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32h7-spi";
+                       reg = <0x44009000 0x400>;
+                       interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc SPI5_K>;
+                       resets = <&rcc SPI5_R>;
+                       dmas = <&dmamux1 85 0x400 0x05>,
+                              <&dmamux1 86 0x400 0x05>;
+                       dma-names = "rx", "tx";
+                       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>;
+                       clocks = <&rcc DFSDM_K>;
+                       clock-names = "dfsdm";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+
+                       dfsdm0: filter@0 {
+                               compatible = "st,stm32-dfsdm-adc";
+                               #io-channel-cells = <1>;
+                               reg = <0>;
+                               interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
+                               dmas = <&dmamux1 101 0x400 0x01>;
+                               dma-names = "rx";
+                               status = "disabled";
+                       };
+
+                       dfsdm1: filter@1 {
+                               compatible = "st,stm32-dfsdm-adc";
+                               #io-channel-cells = <1>;
+                               reg = <1>;
+                               interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>;
+                               dmas = <&dmamux1 102 0x400 0x01>;
+                               dma-names = "rx";
+                               status = "disabled";
+                       };
+
+                       dfsdm2: filter@2 {
+                               compatible = "st,stm32-dfsdm-adc";
+                               #io-channel-cells = <1>;
+                               reg = <2>;
+                               interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
+                               dmas = <&dmamux1 103 0x400 0x01>;
+                               dma-names = "rx";
+                               status = "disabled";
+                       };
+
+                       dfsdm3: filter@3 {
+                               compatible = "st,stm32-dfsdm-adc";
+                               #io-channel-cells = <1>;
+                               reg = <3>;
+                               interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>;
+                               dmas = <&dmamux1 104 0x400 0x01>;
+                               dma-names = "rx";
+                               status = "disabled";
+                       };
+
+                       dfsdm4: filter@4 {
+                               compatible = "st,stm32-dfsdm-adc";
+                               #io-channel-cells = <1>;
+                               reg = <4>;
+                               interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>;
+                               dmas = <&dmamux1 91 0x400 0x01>;
+                               dma-names = "rx";
+                               status = "disabled";
+                       };
+
+                       dfsdm5: filter@5 {
+                               compatible = "st,stm32-dfsdm-adc";
+                               #io-channel-cells = <1>;
+                               reg = <5>;
+                               interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>;
+                               dmas = <&dmamux1 92 0x400 0x01>;
+                               dma-names = "rx";
+                               status = "disabled";
+                       };
+               };
+
+               dma1: dma-controller@48000000 {
+                       compatible = "st,stm32-dma";
+                       reg = <0x48000000 0x400>;
+                       interrupts = <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 47 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc DMA1>;
+                       #dma-cells = <4>;
+                       st,mem2mem;
+                       dma-requests = <8>;
+               };
+
+               dma2: dma-controller@48001000 {
+                       compatible = "st,stm32-dma";
+                       reg = <0x48001000 0x400>;
+                       interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc DMA2>;
+                       #dma-cells = <4>;
+                       st,mem2mem;
+                       dma-requests = <8>;
+               };
+
+               dmamux1: dma-router@48002000 {
+                       compatible = "st,stm32h7-dmamux";
+                       reg = <0x48002000 0x1c>;
+                       #dma-cells = <3>;
+                       dma-requests = <128>;
+                       dma-masters = <&dma1 &dma2>;
+                       dma-channels = <16>;
+                       clocks = <&rcc DMAMUX>;
+               };
+
+               adc: adc@48003000 {
+                       compatible = "st,stm32mp1-adc-core";
+                       reg = <0x48003000 0x400>;
+                       interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc ADC12>, <&rcc ADC12_K>;
+                       clock-names = "bus", "adc";
+                       interrupt-controller;
+                       st,syscfg = <&syscfg>;
+                       #interrupt-cells = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+
+                       adc1: adc@0 {
+                               compatible = "st,stm32mp1-adc";
+                               #io-channel-cells = <1>;
+                               reg = <0x0>;
+                               interrupt-parent = <&adc>;
+                               interrupts = <0>;
+                               dmas = <&dmamux1 9 0x400 0x01>;
+                               dma-names = "rx";
+                               status = "disabled";
+                       };
+
+                       adc2: adc@100 {
+                               compatible = "st,stm32mp1-adc";
+                               #io-channel-cells = <1>;
+                               reg = <0x100>;
+                               interrupt-parent = <&adc>;
+                               interrupts = <1>;
+                               dmas = <&dmamux1 10 0x400 0x01>;
+                               dma-names = "rx";
+                               status = "disabled";
+                       };
+               };
+
+               sdmmc3: sdmmc@48004000 {
+                       compatible = "arm,pl18x", "arm,primecell";
+                       arm,primecell-periphid = <0x10153180>;
+                       reg = <0x48004000 0x400>;
+                       interrupts = <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "cmd_irq";
+                       clocks = <&rcc SDMMC3_K>;
+                       clock-names = "apb_pclk";
+                       resets = <&rcc SDMMC3_R>;
+                       cap-sd-highspeed;
+                       cap-mmc-highspeed;
+                       max-frequency = <120000000>;
+                       status = "disabled";
+               };
+
+               usbotg_hs: usb-otg@49000000 {
+                       compatible = "snps,dwc2";
+                       reg = <0x49000000 0x10000>;
+                       clocks = <&rcc USBO_K>;
+                       clock-names = "otg";
+                       resets = <&rcc USBO_R>;
+                       reset-names = "dwc2";
+                       interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
+                       g-rx-fifo-size = <256>;
+                       g-np-tx-fifo-size = <32>;
+                       g-tx-fifo-size = <128 128 64 64 64 64 32 32>;
+                       dr_mode = "otg";
+                       usb33d-supply = <&usb33>;
+                       status = "disabled";
+               };
+
+               hwspinlock: hwspinlock@4c000000 {
+                       compatible = "st,stm32-hwspinlock";
+                       #hwlock-cells = <1>;
+                       reg = <0x4c000000 0x400>;
+                       clocks = <&rcc HSEM>;
+                       clock-names = "hwspinlock";
+               };
+
+               ipcc: mailbox@4c001000 {
+                       compatible = "st,stm32mp1-ipcc";
+                       #mbox-cells = <1>;
+                       reg = <0x4c001000 0x400>;
+                       st,proc-id = <0>;
+                       interrupts-extended =
+                               <&intc GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>,
+                               <&intc GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>,
+                               <&exti 61 1>;
+                       interrupt-names = "rx", "tx", "wakeup";
+                       clocks = <&rcc IPCC>;
+                       wakeup-source;
+                       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>;
+                       #clock-cells = <1>;
+                       #reset-cells = <1>;
+               };
+
+               pwr_regulators: pwr@50001000 {
+                       compatible = "st,stm32mp1,pwr-reg";
+                       reg = <0x50001000 0x10>;
+
+                       reg11: reg11 {
+                               regulator-name = "reg11";
+                               regulator-min-microvolt = <1100000>;
+                               regulator-max-microvolt = <1100000>;
+                       };
+
+                       reg18: reg18 {
+                               regulator-name = "reg18";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                       };
+
+                       usb33: usb33 {
+                               regulator-name = "usb33";
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                       };
+               };
+
+               exti: interrupt-controller@5000d000 {
+                       compatible = "st,stm32mp1-exti", "syscon";
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+                       reg = <0x5000d000 0x400>;
+               };
+
+               syscfg: syscon@50020000 {
+                       compatible = "st,stm32mp157-syscfg", "syscon";
+                       reg = <0x50020000 0x400>;
+                       clocks = <&rcc SYSCFG>;
+               };
+
+               lptimer2: timer@50021000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-lptimer";
+                       reg = <0x50021000 0x400>;
+                       clocks = <&rcc LPTIM2_K>;
+                       clock-names = "mux";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm-lp";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       trigger@1 {
+                               compatible = "st,stm32-lptimer-trigger";
+                               reg = <1>;
+                               status = "disabled";
+                       };
+
+                       counter {
+                               compatible = "st,stm32-lptimer-counter";
+                               status = "disabled";
+                       };
+               };
+
+               lptimer3: timer@50022000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32-lptimer";
+                       reg = <0x50022000 0x400>;
+                       clocks = <&rcc LPTIM3_K>;
+                       clock-names = "mux";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm-lp";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+
+                       trigger@2 {
+                               compatible = "st,stm32-lptimer-trigger";
+                               reg = <2>;
+                               status = "disabled";
+                       };
+               };
+
+               lptimer4: timer@50023000 {
+                       compatible = "st,stm32-lptimer";
+                       reg = <0x50023000 0x400>;
+                       clocks = <&rcc LPTIM4_K>;
+                       clock-names = "mux";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm-lp";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+               };
+
+               lptimer5: timer@50024000 {
+                       compatible = "st,stm32-lptimer";
+                       reg = <0x50024000 0x400>;
+                       clocks = <&rcc LPTIM5_K>;
+                       clock-names = "mux";
+                       status = "disabled";
+
+                       pwm {
+                               compatible = "st,stm32-pwm-lp";
+                               #pwm-cells = <3>;
+                               status = "disabled";
+                       };
+               };
+
+               vrefbuf: vrefbuf@50025000 {
+                       compatible = "st,stm32-vrefbuf";
+                       reg = <0x50025000 0x8>;
+                       regulator-min-microvolt = <1500000>;
+                       regulator-max-microvolt = <2500000>;
+                       clocks = <&rcc VREF>;
+                       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>;
+                       interrupts = <GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc TMPSENS>;
+                       clock-names = "pclk";
+                       #thermal-sensor-cells = <0>;
+                       status = "disabled";
+               };
+
+               hash1: hash@54002000 {
+                       compatible = "st,stm32f756-hash";
+                       reg = <0x54002000 0x400>;
+                       interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc HASH1>;
+                       resets = <&rcc HASH1_R>;
+                       dmas = <&mdma1 31 0x10 0x1000A02 0x0 0x0>;
+                       dma-names = "in";
+                       dma-maxburst = <2>;
+                       status = "disabled";
+               };
+
+               rng1: rng@54003000 {
+                       compatible = "st,stm32-rng";
+                       reg = <0x54003000 0x400>;
+                       clocks = <&rcc RNG1_K>;
+                       resets = <&rcc RNG1_R>;
+                       status = "disabled";
+               };
+
+               mdma1: dma-controller@58000000 {
+                       compatible = "st,stm32h7-mdma";
+                       reg = <0x58000000 0x1000>;
+                       interrupts = <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc MDMA>;
+                       #dma-cells = <5>;
+                       dma-channels = <32>;
+                       dma-requests = <48>;
+               };
+
+               fmc: nand-controller@58002000 {
+                       compatible = "st,stm32mp15-fmc2";
+                       reg = <0x58002000 0x1000>,
+                             <0x80000000 0x1000>,
+                             <0x88010000 0x1000>,
+                             <0x88020000 0x1000>,
+                             <0x81000000 0x1000>,
+                             <0x89010000 0x1000>,
+                             <0x89020000 0x1000>;
+                       interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
+                       dmas = <&mdma1 20 0x10 0x12000a02 0x0 0x0>,
+                              <&mdma1 20 0x10 0x12000a08 0x0 0x0>,
+                              <&mdma1 21 0x10 0x12000a0a 0x0 0x0>;
+                       dma-names = "tx", "rx", "ecc";
+                       clocks = <&rcc FMC_K>;
+                       resets = <&rcc FMC_R>;
+                       status = "disabled";
+               };
+
+               qspi: spi@58003000 {
+                       compatible = "st,stm32f469-qspi";
+                       reg = <0x58003000 0x1000>, <0x70000000 0x10000000>;
+                       reg-names = "qspi", "qspi_mm";
+                       interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>;
+                       dmas = <&mdma1 22 0x10 0x100002 0x0 0x0>,
+                              <&mdma1 22 0x10 0x100008 0x0 0x0>;
+                       dma-names = "tx", "rx";
+                       clocks = <&rcc QSPI_K>;
+                       resets = <&rcc QSPI_R>;
+                       status = "disabled";
+               };
+
+               sdmmc1: sdmmc@58005000 {
+                       compatible = "arm,pl18x", "arm,primecell";
+                       arm,primecell-periphid = <0x10153180>;
+                       reg = <0x58005000 0x1000>;
+                       interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "cmd_irq";
+                       clocks = <&rcc SDMMC1_K>;
+                       clock-names = "apb_pclk";
+                       resets = <&rcc SDMMC1_R>;
+                       cap-sd-highspeed;
+                       cap-mmc-highspeed;
+                       max-frequency = <120000000>;
+                       status = "disabled";
+               };
+
+               sdmmc2: sdmmc@58007000 {
+                       compatible = "arm,pl18x", "arm,primecell";
+                       arm,primecell-periphid = <0x10153180>;
+                       reg = <0x58007000 0x1000>;
+                       interrupts = <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "cmd_irq";
+                       clocks = <&rcc SDMMC2_K>;
+                       clock-names = "apb_pclk";
+                       resets = <&rcc SDMMC2_R>;
+                       cap-sd-highspeed;
+                       cap-mmc-highspeed;
+                       max-frequency = <120000000>;
+                       status = "disabled";
+               };
+
+               crc1: crc@58009000 {
+                       compatible = "st,stm32f7-crc";
+                       reg = <0x58009000 0x400>;
+                       clocks = <&rcc CRC1>;
+                       status = "disabled";
+               };
+
+               stmmac_axi_config_0: stmmac-axi-config {
+                       snps,wr_osr_lmt = <0x7>;
+                       snps,rd_osr_lmt = <0x7>;
+                       snps,blen = <0 0 0 0 16 8 4>;
+               };
+
+               ethernet0: ethernet@5800a000 {
+                       compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a";
+                       reg = <0x5800a000 0x2000>;
+                       reg-names = "stmmaceth";
+                       interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "macirq";
+                       clock-names = "stmmaceth",
+                                     "mac-clk-tx",
+                                     "mac-clk-rx",
+                                     "eth-ck",
+                                     "ethstp",
+                                     "syscfg-clk";
+                       clocks = <&rcc ETHMAC>,
+                                <&rcc ETHTX>,
+                                <&rcc ETHRX>,
+                                <&rcc ETHCK_K>,
+                                <&rcc ETHSTP>,
+                                <&rcc SYSCFG>;
+                       st,syscon = <&syscfg 0x4>;
+                       snps,mixed-burst;
+                       snps,pbl = <2>;
+                       snps,en-tx-lpi-clockgating;
+                       snps,axi-config = <&stmmac_axi_config_0>;
+                       snps,tso;
+                       status = "disabled";
+               };
+
+               usbh_ohci: usbh-ohci@5800c000 {
+                       compatible = "generic-ohci";
+                       reg = <0x5800c000 0x1000>;
+                       clocks = <&rcc USBH>;
+                       resets = <&rcc USBH_R>;
+                       interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
+                       status = "disabled";
+               };
+
+               usbh_ehci: usbh-ehci@5800d000 {
+                       compatible = "generic-ehci";
+                       reg = <0x5800d000 0x1000>;
+                       clocks = <&rcc USBH>;
+                       resets = <&rcc USBH_R>;
+                       interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
+                       companion = <&usbh_ohci>;
+                       status = "disabled";
+               };
+
+               ltdc: display-controller@5a001000 {
+                       compatible = "st,stm32-ltdc";
+                       reg = <0x5a001000 0x400>;
+                       interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc LTDC_PX>;
+                       clock-names = "lcd";
+                       resets = <&rcc LTDC_R>;
+                       status = "disabled";
+               };
+
+               iwdg2: watchdog@5a002000 {
+                       compatible = "st,stm32mp1-iwdg";
+                       reg = <0x5a002000 0x400>;
+                       clocks = <&rcc IWDG2>, <&rcc CK_LSI>;
+                       clock-names = "pclk", "lsi";
+                       status = "disabled";
+               };
+
+               usbphyc: usbphyc@5a006000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32mp1-usbphyc";
+                       reg = <0x5a006000 0x1000>;
+                       clocks = <&rcc USBPHY_K>;
+                       resets = <&rcc USBPHY_R>;
+                       vdda1v1-supply = <&reg11>;
+                       vdda1v8-supply = <&reg18>;
+                       status = "disabled";
+
+                       usbphyc_port0: usb-phy@0 {
+                               #phy-cells = <0>;
+                               reg = <0>;
+                       };
+
+                       usbphyc_port1: usb-phy@1 {
+                               #phy-cells = <1>;
+                               reg = <1>;
+                       };
+               };
+
+               usart1: serial@5c000000 {
+                       compatible = "st,stm32h7-uart";
+                       reg = <0x5c000000 0x400>;
+                       interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc USART1_K>;
+                       status = "disabled";
+               };
+
+               spi6: spi@5c001000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "st,stm32h7-spi";
+                       reg = <0x5c001000 0x400>;
+                       interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc SPI6_K>;
+                       resets = <&rcc SPI6_R>;
+                       dmas = <&mdma1 34 0x0 0x40008 0x0 0x0>,
+                              <&mdma1 35 0x0 0x40002 0x0 0x0>;
+                       dma-names = "rx", "tx";
+                       status = "disabled";
+               };
+
+               i2c4: i2c@5c002000 {
+                       compatible = "st,stm32f7-i2c";
+                       reg = <0x5c002000 0x400>;
+                       interrupt-names = "event", "error";
+                       interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc I2C4_K>;
+                       resets = <&rcc I2C4_R>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               rtc: rtc@5c004000 {
+                       compatible = "st,stm32mp1-rtc";
+                       reg = <0x5c004000 0x400>;
+                       clocks = <&rcc RTCAPB>, <&rcc RTC>;
+                       clock-names = "pclk", "rtc_ck";
+                       interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
+                       status = "disabled";
+               };
+
+               bsec: efuse@5c005000 {
+                       compatible = "st,stm32mp15-bsec";
+                       reg = <0x5c005000 0x400>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ts_cal1: calib@5c {
+                               reg = <0x5c 0x2>;
+                       };
+                       ts_cal2: calib@5e {
+                               reg = <0x5e 0x2>;
+                       };
+               };
+
+               i2c6: i2c@5c009000 {
+                       compatible = "st,stm32f7-i2c";
+                       reg = <0x5c009000 0x400>;
+                       interrupt-names = "event", "error";
+                       interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc I2C6_K>;
+                       resets = <&rcc I2C6_R>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               /*
+                * Break node order to solve dependency probe issue between
+                * pinctrl and exti.
+                */
+               pinctrl: pin-controller@50002000 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "st,stm32mp157-pinctrl";
+                       ranges = <0 0x50002000 0xa400>;
+                       interrupt-parent = <&exti>;
+                       st,syscfg = <&exti 0x60 0xff>;
+                       hwlocks = <&hwspinlock 0>;
+                       pins-are-numbered;
+
+                       gpioa: gpio@50002000 {
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               reg = <0x0 0x400>;
+                               clocks = <&rcc GPIOA>;
+                               st,bank-name = "GPIOA";
+                               status = "disabled";
+                       };
+
+                       gpiob: gpio@50003000 {
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               reg = <0x1000 0x400>;
+                               clocks = <&rcc GPIOB>;
+                               st,bank-name = "GPIOB";
+                               status = "disabled";
+                       };
+
+                       gpioc: gpio@50004000 {
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               reg = <0x2000 0x400>;
+                               clocks = <&rcc GPIOC>;
+                               st,bank-name = "GPIOC";
+                               status = "disabled";
+                       };
+
+                       gpiod: gpio@50005000 {
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               reg = <0x3000 0x400>;
+                               clocks = <&rcc GPIOD>;
+                               st,bank-name = "GPIOD";
+                               status = "disabled";
+                       };
+
+                       gpioe: gpio@50006000 {
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               reg = <0x4000 0x400>;
+                               clocks = <&rcc GPIOE>;
+                               st,bank-name = "GPIOE";
+                               status = "disabled";
+                       };
+
+                       gpiof: gpio@50007000 {
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               reg = <0x5000 0x400>;
+                               clocks = <&rcc GPIOF>;
+                               st,bank-name = "GPIOF";
+                               status = "disabled";
+                       };
+
+                       gpiog: gpio@50008000 {
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               reg = <0x6000 0x400>;
+                               clocks = <&rcc GPIOG>;
+                               st,bank-name = "GPIOG";
+                               status = "disabled";
+                       };
+
+                       gpioh: gpio@50009000 {
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               reg = <0x7000 0x400>;
+                               clocks = <&rcc GPIOH>;
+                               st,bank-name = "GPIOH";
+                               status = "disabled";
+                       };
+
+                       gpioi: gpio@5000a000 {
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               reg = <0x8000 0x400>;
+                               clocks = <&rcc GPIOI>;
+                               st,bank-name = "GPIOI";
+                               status = "disabled";
+                       };
+
+                       gpioj: gpio@5000b000 {
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               reg = <0x9000 0x400>;
+                               clocks = <&rcc GPIOJ>;
+                               st,bank-name = "GPIOJ";
+                               status = "disabled";
+                       };
+
+                       gpiok: gpio@5000c000 {
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               reg = <0xa000 0x400>;
+                               clocks = <&rcc GPIOK>;
+                               st,bank-name = "GPIOK";
+                               status = "disabled";
+                       };
+               };
+
+               pinctrl_z: pin-controller-z@54004000 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "st,stm32mp157-z-pinctrl";
+                       ranges = <0 0x54004000 0x400>;
+                       pins-are-numbered;
+                       interrupt-parent = <&exti>;
+                       st,syscfg = <&exti 0x60 0xff>;
+                       hwlocks = <&hwspinlock 0>;
+
+                       gpioz: gpio@54004000 {
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               reg = <0 0x400>;
+                               clocks = <&rcc GPIOZ>;
+                               st,bank-name = "GPIOZ";
+                               st,bank-ioport = <11>;
+                               status = "disabled";
+                       };
+               };
+       };
+
+       mlahb: ahb {
+               compatible = "st,mlahb", "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+               dma-ranges = <0x00000000 0x38000000 0x10000>,
+                            <0x10000000 0x10000000 0x60000>,
+                            <0x30000000 0x30000000 0x60000>;
+
+               m4_rproc: m4@10000000 {
+                       compatible = "st,stm32mp1-m4";
+                       reg = <0x10000000 0x40000>,
+                             <0x30000000 0x40000>,
+                             <0x38000000 0x10000>;
+                       resets = <&rcc MCU_R>;
+                       st,syscfg-holdboot = <&rcc 0x10C 0x1>;
+                       st,syscfg-tz = <&rcc 0x000 0x1>;
+                       status = "disabled";
+               };
+       };
+};
diff --git a/arch/arm/dts/stm32mp153.dtsi b/arch/arm/dts/stm32mp153.dtsi
new file mode 100644 (file)
index 0000000..2d759fc
--- /dev/null
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
+ * Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
+ */
+
+#include "stm32mp151.dtsi"
+
+/ {
+       cpus {
+               cpu1: cpu@1 {
+                       compatible = "arm,cortex-a7";
+                       device_type = "cpu";
+                       reg = <1>;
+               };
+       };
+
+       soc {
+               m_can1: can@4400e000 {
+                       compatible = "bosch,m_can";
+                       reg = <0x4400e000 0x400>, <0x44011000 0x1400>;
+                       reg-names = "m_can", "message_ram";
+                       interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "int0", "int1";
+                       clocks = <&rcc CK_HSE>, <&rcc FDCAN_K>;
+                       clock-names = "hclk", "cclk";
+                       bosch,mram-cfg = <0x0 0 0 32 0 0 2 2>;
+                       status = "disabled";
+               };
+
+               m_can2: can@4400f000 {
+                       compatible = "bosch,m_can";
+                       reg = <0x4400f000 0x400>, <0x44011000 0x2800>;
+                       reg-names = "m_can", "message_ram";
+                       interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>,
+                                    <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-names = "int0", "int1";
+                       clocks = <&rcc CK_HSE>, <&rcc FDCAN_K>;
+                       clock-names = "hclk", "cclk";
+                       bosch,mram-cfg = <0x1400 0 0 32 0 0 2 2>;
+                       status = "disabled";
+               };
+       };
+};
diff --git a/arch/arm/dts/stm32mp157-u-boot.dtsi b/arch/arm/dts/stm32mp157-u-boot.dtsi
deleted file mode 100644 (file)
index 8f9535a..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
-/*
- * Copyright : STMicroelectronics 2018
- */
-
-/ {
-       aliases {
-               gpio0 = &gpioa;
-               gpio1 = &gpiob;
-               gpio2 = &gpioc;
-               gpio3 = &gpiod;
-               gpio4 = &gpioe;
-               gpio5 = &gpiof;
-               gpio6 = &gpiog;
-               gpio7 = &gpioh;
-               gpio8 = &gpioi;
-               gpio9 = &gpioj;
-               gpio10 = &gpiok;
-               gpio25 = &gpioz;
-               pinctrl0 = &pinctrl;
-               pinctrl1 = &pinctrl_z;
-       };
-
-       clocks {
-               u-boot,dm-pre-reloc;
-       };
-
-       /* need PSCI for sysreset during board_f */
-       psci {
-               u-boot,dm-pre-proper;
-       };
-
-       reboot {
-               u-boot,dm-pre-reloc;
-       };
-
-       soc {
-               u-boot,dm-pre-reloc;
-       };
-};
-
-&bsec {
-       u-boot,dm-pre-proper;
-};
-
-&clk_csi {
-       u-boot,dm-pre-reloc;
-};
-
-&clk_hsi {
-       u-boot,dm-pre-reloc;
-};
-
-&clk_hse {
-       u-boot,dm-pre-reloc;
-};
-
-&clk_lsi {
-       u-boot,dm-pre-reloc;
-};
-
-&clk_lse {
-       u-boot,dm-pre-reloc;
-};
-
-&gpioa {
-       u-boot,dm-pre-reloc;
-};
-
-&gpiob {
-       u-boot,dm-pre-reloc;
-};
-
-&gpioc {
-       u-boot,dm-pre-reloc;
-};
-
-&gpiod {
-       u-boot,dm-pre-reloc;
-};
-
-&gpioe {
-       u-boot,dm-pre-reloc;
-};
-
-&gpiof {
-       u-boot,dm-pre-reloc;
-};
-
-&gpiog {
-       u-boot,dm-pre-reloc;
-};
-
-&gpioh {
-       u-boot,dm-pre-reloc;
-};
-
-&gpioi {
-       u-boot,dm-pre-reloc;
-};
-
-&gpioj {
-       u-boot,dm-pre-reloc;
-};
-
-&gpiok {
-       u-boot,dm-pre-reloc;
-};
-
-&gpioz {
-       u-boot,dm-pre-reloc;
-};
-
-&iwdg2 {
-       u-boot,dm-pre-reloc;
-};
-
-/* pre-reloc probe = reserve video frame buffer in video_reserve() */
-&ltdc {
-       u-boot,dm-pre-proper;
-};
-
-&pinctrl {
-       u-boot,dm-pre-reloc;
-};
-
-&pinctrl_z {
-       u-boot,dm-pre-reloc;
-};
-
-&pwr_regulators {
-       u-boot,dm-pre-reloc;
-};
-
-&rcc {
-       u-boot,dm-pre-reloc;
-       #address-cells = <1>;
-       #size-cells = <0>;
-};
-
-&sdmmc1 {
-       compatible = "st,stm32-sdmmc2", "arm,pl18x", "arm,primecell";
-};
-
-&sdmmc2 {
-       compatible = "st,stm32-sdmmc2", "arm,pl18x", "arm,primecell";
-};
-
-&sdmmc3 {
-       compatible = "st,stm32-sdmmc2", "arm,pl18x", "arm,primecell";
-};
-
-&usbotg_hs {
-       compatible = "st,stm32mp1-hsotg", "snps,dwc2";
-};
diff --git a/arch/arm/dts/stm32mp157.dtsi b/arch/arm/dts/stm32mp157.dtsi
new file mode 100644 (file)
index 0000000..3f0a4a9
--- /dev/null
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
+ * Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
+ */
+
+#include "stm32mp153.dtsi"
+
+/ {
+       soc {
+               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>;
+                       clocks = <&rcc DSI_K>, <&clk_hse>, <&rcc DSI_PX>;
+                       clock-names = "pclk", "ref", "px_clk";
+                       resets = <&rcc DSI_R>;
+                       reset-names = "apb";
+                       status = "disabled";
+               };
+       };
+};
index 2c7dc509a33310078ff47194fb7a76b61cecdac5..f2ff7a23c55e33aa8fd16bce9350692099e90c73 100644 (file)
@@ -7,7 +7,7 @@
  */
 
 #include <dt-bindings/clock/stm32mp1-clksrc.h>
-#include "stm32mp157-u-boot.dtsi"
+#include "stm32mp15-u-boot.dtsi"
 #include "stm32mp15-ddr3-2x4Gb-1066-binG.dtsi"
 
 / {
 
 &sdmmc1_b4_pins_a {
        u-boot,dm-spl;
-       pins {
+       pins1 {
+               u-boot,dm-spl;
+       };
+       pins2 {
                u-boot,dm-spl;
        };
 };
        u-boot,force-b-session-valid;
        hnp-srp-disable;
 };
-
-&v3v3 {
-       regulator-always-on;
-};
index b23fa6dee018a367e42ee3ba5af69f553ad614b3..f577d79afb64cabe5c8bd8cc09aef9f91c05caff 100644 (file)
@@ -6,8 +6,10 @@
 
 /dts-v1/;
 
-#include "stm32mp157c.dtsi"
-#include "stm32mp157xac-pinctrl.dtsi"
+#include "stm32mp157.dtsi"
+#include "stm32mp15-pinctrl.dtsi"
+#include "stm32mp157-pinctrl.dtsi"
+#include "stm32mp15xxac-pinctrl.dtsi"
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/mfd/st,stpmic1.h>
 
index a5cc01dd19fb338f67e1481009934b298de0af38..5844d41c536f51e55b2b5dacd64f3e9b6da481f8 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 #include <dt-bindings/clock/stm32mp1-clksrc.h>
-#include "stm32mp157-u-boot.dtsi"
+#include "stm32mp15-u-boot.dtsi"
 #include "stm32mp15-ddr3-1x4Gb-1066-binG.dtsi"
 
 / {
 
 &sdmmc1_b4_pins_a {
        u-boot,dm-spl;
-       pins {
+       pins1 {
+               u-boot,dm-spl;
+       };
+       pins2 {
                u-boot,dm-spl;
        };
 };
index 624bf6954bec2d14bfa710727ba4ac57bc5b3f6b..d03d4cd2606ab63457ce136ef8f83e6cf0378268 100644 (file)
@@ -6,10 +6,10 @@
 
 /dts-v1/;
 
-#include "stm32mp157c.dtsi"
-#include "stm32mp157xac-pinctrl.dtsi"
-#include <dt-bindings/gpio/gpio.h>
-#include <dt-bindings/mfd/st,stpmic1.h>
+#include "stm32mp157.dtsi"
+#include "stm32mp15-pinctrl.dtsi"
+#include "stm32mp15xxac-pinctrl.dtsi"
+#include "stm32mp15xx-dkx.dtsi"
 
 / {
        model = "STMicroelectronics STM32MP157A-DK1 Discovery Board";
        chosen {
                stdout-path = "serial0:115200n8";
        };
-
-       memory@c0000000 {
-               device_type = "memory";
-               reg = <0xc0000000 0x20000000>;
-       };
-
-       reserved-memory {
-               #address-cells = <1>;
-               #size-cells = <1>;
-               ranges;
-
-               mcuram2: mcuram2@10000000 {
-                       compatible = "shared-dma-pool";
-                       reg = <0x10000000 0x40000>;
-                       no-map;
-               };
-
-               vdev0vring0: vdev0vring0@10040000 {
-                       compatible = "shared-dma-pool";
-                       reg = <0x10040000 0x1000>;
-                       no-map;
-               };
-
-               vdev0vring1: vdev0vring1@10041000 {
-                       compatible = "shared-dma-pool";
-                       reg = <0x10041000 0x1000>;
-                       no-map;
-               };
-
-               vdev0buffer: vdev0buffer@10042000 {
-                       compatible = "shared-dma-pool";
-                       reg = <0x10042000 0x4000>;
-                       no-map;
-               };
-
-               mcuram: mcuram@30000000 {
-                       compatible = "shared-dma-pool";
-                       reg = <0x30000000 0x40000>;
-                       no-map;
-               };
-
-               retram: retram@38000000 {
-                       compatible = "shared-dma-pool";
-                       reg = <0x38000000 0x10000>;
-                       no-map;
-               };
-
-               gpu_reserved: gpu@d4000000 {
-                       reg = <0xd4000000 0x4000000>;
-                       no-map;
-               };
-       };
-
-       led {
-               compatible = "gpio-leds";
-               blue {
-                       label = "heartbeat";
-                       gpios = <&gpiod 11 GPIO_ACTIVE_HIGH>;
-                       linux,default-trigger = "heartbeat";
-                       default-state = "off";
-               };
-       };
-
-       sound {
-               compatible = "audio-graph-card";
-               label = "STM32MP1-DK";
-               routing =
-                       "Playback" , "MCLK",
-                       "Capture" , "MCLK",
-                       "MICL" , "Mic Bias";
-               dais = <&sai2a_port &sai2b_port &i2s2_port>;
-               status = "okay";
-       };
-};
-
-&adc {
-       pinctrl-names = "default";
-       pinctrl-0 = <&adc12_ain_pins_a>, <&adc12_usb_cc_pins_a>;
-       vdd-supply = <&vdd>;
-       vdda-supply = <&vdd>;
-       vref-supply = <&vrefbuf>;
-       status = "disabled";
-       adc1: adc@0 {
-               /*
-                * Type-C USB_PWR_CC1 & USB_PWR_CC2 on in18 & in19.
-                * Use at least 5 * RC time, e.g. 5 * (Rp + Rd) * C:
-                * 5 * (56 + 47kOhms) * 5pF => 2.5us.
-                * Use arbitrary margin here (e.g. 5us).
-                */
-               st,min-sample-time-nsecs = <5000>;
-               /* AIN connector, USB Type-C CC1 & CC2 */
-               st,adc-channels = <0 1 6 13 18 19>;
-               status = "okay";
-       };
-       adc2: adc@100 {
-               /* AIN connector, USB Type-C CC1 & CC2 */
-               st,adc-channels = <0 1 2 6 18 19>;
-               st,min-sample-time-nsecs = <5000>;
-               status = "okay";
-       };
-};
-
-&cec {
-       pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&cec_pins_b>;
-       pinctrl-1 = <&cec_pins_sleep_b>;
-       status = "okay";
-};
-
-&ethernet0 {
-       status = "okay";
-       pinctrl-0 = <&ethernet0_rgmii_pins_a>;
-       pinctrl-1 = <&ethernet0_rgmii_pins_sleep_a>;
-       pinctrl-names = "default", "sleep";
-       phy-mode = "rgmii-id";
-       max-speed = <1000>;
-       phy-handle = <&phy0>;
-
-       mdio0 {
-               #address-cells = <1>;
-               #size-cells = <0>;
-               compatible = "snps,dwmac-mdio";
-               phy0: ethernet-phy@0 {
-                       reg = <0>;
-               };
-       };
-};
-
-&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>;
-               #sound-dai-cells = <0>;
-               status = "okay";
-
-               ports {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-
-                       port@0 {
-                               reg = <0>;
-                               sii9022_in: endpoint {
-                                       remote-endpoint = <&ltdc_ep0_out>;
-                               };
-                       };
-
-                       port@3 {
-                               reg = <3>;
-                               sii9022_tx_endpoint: endpoint {
-                                       remote-endpoint = <&i2s2_endpoint>;
-                               };
-                       };
-               };
-       };
-
-       cs42l51: cs42l51@4a {
-               compatible = "cirrus,cs42l51";
-               reg = <0x4a>;
-               #sound-dai-cells = <0>;
-               VL-supply = <&v3v3>;
-               VD-supply = <&v1v8_audio>;
-               VA-supply = <&v1v8_audio>;
-               VAHP-supply = <&v1v8_audio>;
-               reset-gpios = <&gpiog 9 GPIO_ACTIVE_LOW>;
-               clocks = <&sai2a>;
-               clock-names = "MCLK";
-               status = "okay";
-
-               cs42l51_port: port {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-
-                       cs42l51_tx_endpoint: endpoint@0 {
-                               reg = <0>;
-                               remote-endpoint = <&sai2a_endpoint>;
-                               frame-master;
-                               bitclock-master;
-                       };
-
-                       cs42l51_rx_endpoint: endpoint@1 {
-                               reg = <1>;
-                               remote-endpoint = <&sai2b_endpoint>;
-                               frame-master;
-                               bitclock-master;
-                       };
-               };
-       };
-};
-
-&i2c4 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c4_pins_a>;
-       i2c-scl-rising-time-ns = <185>;
-       i2c-scl-falling-time-ns = <20>;
-       status = "okay";
-       /* spare dmas for other usage */
-       /delete-property/dmas;
-       /delete-property/dma-names;
-
-       typec: stusb1600@28 {
-               compatible = "st,stusb1600";
-               reg = <0x28>;
-               interrupts = <11 IRQ_TYPE_EDGE_FALLING>;
-               interrupt-parent = <&gpioi>;
-               pinctrl-names = "default";
-               pinctrl-0 = <&stusb1600_pins_a>;
-
-               status = "okay";
-
-               typec_con: connector {
-                       compatible = "usb-c-connector";
-                       label = "USB-C";
-                       power-role = "sink";
-                       power-opmode = "default";
-               };
-       };
-
-       pmic: stpmic@33 {
-               compatible = "st,stpmic1";
-               reg = <0x33>;
-               interrupts-extended = <&gpioa 0 IRQ_TYPE_EDGE_FALLING>;
-               interrupt-controller;
-               #interrupt-cells = <2>;
-               status = "okay";
-
-               regulators {
-                       compatible = "st,stpmic1-regulators";
-                       ldo1-supply = <&v3v3>;
-                       ldo3-supply = <&vdd_ddr>;
-                       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>;
-                       };
-
-                       v1v8_audio: ldo1 {
-                               regulator-name = "v1v8_audio";
-                               regulator-min-microvolt = <1800000>;
-                               regulator-max-microvolt = <1800000>;
-                               regulator-always-on;
-                               interrupts = <IT_CURLIM_LDO1 0>;
-                       };
-
-                       v3v3_hdmi: ldo2 {
-                               regulator-name = "v3v3_hdmi";
-                               regulator-min-microvolt = <3300000>;
-                               regulator-max-microvolt = <3300000>;
-                               regulator-always-on;
-                               interrupts = <IT_CURLIM_LDO2 0>;
-                       };
-
-                       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>;
-                       };
-
-                       vdda: ldo5 {
-                               regulator-name = "vdda";
-                               regulator-min-microvolt = <2900000>;
-                               regulator-max-microvolt = <2900000>;
-                               interrupts = <IT_CURLIM_LDO5 0>;
-                               regulator-boot-on;
-                       };
-
-                       v1v2_hdmi: ldo6 {
-                               regulator-name = "v1v2_hdmi";
-                               regulator-min-microvolt = <1200000>;
-                               regulator-max-microvolt = <1200000>;
-                               regulator-always-on;
-                               interrupts = <IT_CURLIM_LDO6 0>;
-                       };
-
-                       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>;
-                        };
-
-                       vbus_otg: pwr_sw1 {
-                               regulator-name = "vbus_otg";
-                               interrupts = <IT_OCP_OTG 0>;
-                        };
-
-                        vbus_sw: pwr_sw2 {
-                               regulator-name = "vbus_sw";
-                               interrupts = <IT_OCP_SWOUT 0>;
-                               regulator-active-discharge = <1>;
-                        };
-               };
-
-               onkey {
-                       compatible = "st,stpmic1-onkey";
-                       interrupts = <IT_PONKEY_F 0>, <IT_PONKEY_R 0>;
-                       interrupt-names = "onkey-falling", "onkey-rising";
-                       power-off-time-sec = <10>;
-                       status = "okay";
-               };
-
-               watchdog {
-                       compatible = "st,stpmic1-wdt";
-                       status = "disabled";
-               };
-       };
-};
-
-&i2s2 {
-       clocks = <&rcc SPI2>, <&rcc SPI2_K>, <&rcc PLL3_Q>, <&rcc PLL3_R>;
-       clock-names = "pclk", "i2sclk", "x8k", "x11k";
-       pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&i2s2_pins_a>;
-       pinctrl-1 = <&i2s2_pins_sleep_a>;
-       status = "okay";
-
-       i2s2_port: port {
-               i2s2_endpoint: endpoint {
-                       remote-endpoint = <&sii9022_tx_endpoint>;
-                       format = "i2s";
-                       mclk-fs = <256>;
-               };
-       };
-};
-
-&ipcc {
-       status = "okay";
-};
-
-&iwdg2 {
-       timeout-sec = <32>;
-       status = "okay";
-};
-
-&ltdc {
-       pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&ltdc_pins_a>;
-       pinctrl-1 = <&ltdc_pins_sleep_a>;
-       status = "okay";
-
-       port {
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               ltdc_ep0_out: endpoint@0 {
-                       reg = <0>;
-                       remote-endpoint = <&sii9022_in>;
-               };
-       };
-};
-
-&m4_rproc {
-       memory-region = <&retram>, <&mcuram>, <&mcuram2>, <&vdev0vring0>,
-                       <&vdev0vring1>, <&vdev0buffer>;
-       mboxes = <&ipcc 0>, <&ipcc 1>, <&ipcc 2>;
-       mbox-names = "vq0", "vq1", "shutdown";
-       interrupt-parent = <&exti>;
-       interrupts = <68 1>;
-       status = "okay";
-};
-
-&pwr_regulators {
-       vdd-supply = <&vdd>;
-       vdd_3v3_usbfs-supply = <&vdd_usb>;
-};
-
-&rng1 {
-       status = "okay";
-};
-
-&rtc {
-       status = "okay";
-};
-
-&sai2 {
-       clocks = <&rcc SAI2>, <&rcc PLL3_Q>, <&rcc PLL3_R>;
-       clock-names = "pclk", "x8k", "x11k";
-       pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&sai2a_pins_a>, <&sai2b_pins_b>;
-       pinctrl-1 = <&sai2a_sleep_pins_a>, <&sai2b_sleep_pins_b>;
-       status = "okay";
-
-       sai2a: audio-controller@4400b004 {
-               #clock-cells = <0>;
-               dma-names = "tx";
-               clocks = <&rcc SAI2_K>;
-               clock-names = "sai_ck";
-               status = "okay";
-
-               sai2a_port: port {
-                       sai2a_endpoint: endpoint {
-                               remote-endpoint = <&cs42l51_tx_endpoint>;
-                               format = "i2s";
-                               mclk-fs = <256>;
-                               dai-tdm-slot-num = <2>;
-                               dai-tdm-slot-width = <32>;
-                       };
-               };
-       };
-
-       sai2b: audio-controller@4400b024 {
-               dma-names = "rx";
-               st,sync = <&sai2a 2>;
-               clocks = <&rcc SAI2_K>, <&sai2a>;
-               clock-names = "sai_ck", "MCLK";
-               status = "okay";
-
-               sai2b_port: port {
-                       sai2b_endpoint: endpoint {
-                               remote-endpoint = <&cs42l51_rx_endpoint>;
-                               format = "i2s";
-                               mclk-fs = <256>;
-                               dai-tdm-slot-num = <2>;
-                               dai-tdm-slot-width = <32>;
-                       };
-               };
-       };
-};
-
-&sdmmc1 {
-       pinctrl-names = "default", "opendrain", "sleep";
-       pinctrl-0 = <&sdmmc1_b4_pins_a>;
-       pinctrl-1 = <&sdmmc1_b4_od_pins_a>;
-       pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;
-       broken-cd;
-       st,neg-edge;
-       bus-width = <4>;
-       vmmc-supply = <&v3v3>;
-       status = "okay";
-};
-
-&uart4 {
-       pinctrl-names = "default";
-       pinctrl-0 = <&uart4_pins_a>;
-       status = "okay";
-};
-
-&usbh_ehci {
-       phys = <&usbphyc_port0>;
-       phy-names = "usb";
-       status = "okay";
-};
-
-&usbotg_hs {
-       dr_mode = "peripheral";
-       phys = <&usbphyc_port1 0>;
-       phy-names = "usb2-phy";
-       status = "okay";
-};
-
-&usbphyc {
-       status = "okay";
-};
-
-&usbphyc_port0 {
-       phy-supply = <&vdd_usb>;
-};
-
-&usbphyc_port1 {
-       phy-supply = <&vdd_usb>;
-};
-
-&vrefbuf {
-       regulator-min-microvolt = <2500000>;
-       regulator-max-microvolt = <2500000>;
-       vdda-supply = <&vdd>;
-       status = "okay";
 };
index 18ac1e3cb2afe836a322cabb0a04d3cb4669acbf..06ef3a4095f109236b4c07c8073e79ff5ec180a2 100644 (file)
@@ -4,9 +4,3 @@
  */
 
 #include "stm32mp157a-dk1-u-boot.dtsi"
-
-&i2c1 {
-       hdmi-transmitter@39 {
-               reset-gpios = <&gpioa 10 GPIO_ACTIVE_LOW>;
-       };
-};
index d26adcbeba33ea235495eefab6e72abf1cb9d82d..7985b80967cadbd25a7f293bad91fe42804b4add 100644 (file)
@@ -6,11 +6,24 @@
 
 /dts-v1/;
 
-#include "stm32mp157a-dk1.dts"
+#include "stm32mp157.dtsi"
+#include "stm32mp15xc.dtsi"
+#include "stm32mp15-pinctrl.dtsi"
+#include "stm32mp15xxac-pinctrl.dtsi"
+#include "stm32mp15xx-dkx.dtsi"
 
 / {
        model = "STMicroelectronics STM32MP157C-DK2 Discovery Board";
        compatible = "st,stm32mp157c-dk2", "st,stm32mp157";
+
+       aliases {
+               ethernet0 = &ethernet0;
+               serial0 = &uart4;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
 };
 
 &dsi {
index 347edf7e5814ef314b7b797c5769eb8953abc52d..ed2f024be9810d5cdc78c073a231f1ee7d16099e 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 #include <dt-bindings/clock/stm32mp1-clksrc.h>
-#include "stm32mp157-u-boot.dtsi"
+#include "stm32mp15-u-boot.dtsi"
 #include "stm32mp15-ddr3-2x4Gb-1066-binG.dtsi"
 
 / {
 
 &sdmmc1_b4_pins_a {
        u-boot,dm-spl;
-       pins {
+       pins1 {
+               u-boot,dm-spl;
+       };
+       pins2 {
                u-boot,dm-spl;
        };
 };
index ae4da39ce854ea88ab1044eac5aefaac3fcf75e0..54af7c97b376a4041c1d854cd3a12edd300f1c71 100644 (file)
@@ -5,8 +5,10 @@
  */
 /dts-v1/;
 
-#include "stm32mp157c.dtsi"
-#include "stm32mp157xaa-pinctrl.dtsi"
+#include "stm32mp157.dtsi"
+#include "stm32mp15xc.dtsi"
+#include "stm32mp15-pinctrl.dtsi"
+#include "stm32mp15xxaa-pinctrl.dtsi"
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/mfd/st,stpmic1.h>
 
        };
 };
 
+&adc {
+       /* ANA0, ANA1 are dedicated pins and don't need pinctrl: only in6. */
+       pinctrl-0 = <&adc1_in6_pins_a>;
+       pinctrl-names = "default";
+       vdd-supply = <&vdd>;
+       vdda-supply = <&vdda>;
+       vref-supply = <&vdda>;
+       status = "disabled";
+       adc1: adc@0 {
+               st,adc-channels = <0 1 6>;
+               /* 16.5 ck_cycles sampling time */
+               st,min-sample-time-nsecs = <400>;
+               status = "okay";
+       };
+};
+
 &dac {
        pinctrl-names = "default";
        pinctrl-0 = <&dac_ch1_pins_a &dac_ch2_pins_a>;
index bd8ffc185f966b9e7d04a7851f27c73a5c4256c1..228e35e1688458b0f3433c80a47473e9afb331da 100644 (file)
 
        ov5640: camera@3c {
                compatible = "ovti,ov5640";
-               pinctrl-names = "default";
-               pinctrl-0 = <&ov5640_pins>;
                reg = <0x3c>;
                clocks = <&clk_ext_camera>;
                clock-names = "xclk";
                                pins = "gpio0", "gpio1", "gpio2", "gpio3", "gpio4";
                                bias-pull-down;
                        };
-
-                       ov5640_pins: camera {
-                               pins = "agpio2", "agpio3"; /* stmfx pins 18 & 19 */
-                               drive-push-pull;
-                               output-low;
-                       };
                };
        };
 };
        };
 };
 
+&sdmmc3 {
+       pinctrl-names = "default", "opendrain", "sleep";
+       pinctrl-0 = <&sdmmc3_b4_pins_a>;
+       pinctrl-1 = <&sdmmc3_b4_od_pins_a>;
+       pinctrl-2 = <&sdmmc3_b4_sleep_pins_a>;
+       broken-cd;
+       st,neg-edge;
+       bus-width = <4>;
+       vmmc-supply = <&v3v3>;
+       status = "disabled";
+};
+
 &spi1 {
        pinctrl-names = "default";
        pinctrl-0 = <&spi1_pins_a>;
        status = "disabled";
        pwm {
                pinctrl-0 = <&pwm2_pins_a>;
-               pinctrl-names = "default";
+               pinctrl-1 = <&pwm2_sleep_pins_a>;
+               pinctrl-names = "default", "sleep";
                status = "okay";
        };
        timer@1 {
        status = "disabled";
        pwm {
                pinctrl-0 = <&pwm8_pins_a>;
-               pinctrl-names = "default";
+               pinctrl-1 = <&pwm8_sleep_pins_a>;
+               pinctrl-names = "default", "sleep";
                status = "okay";
        };
        timer@7 {
        status = "disabled";
        pwm {
                pinctrl-0 = <&pwm12_pins_a>;
-               pinctrl-names = "default";
+               pinctrl-1 = <&pwm12_sleep_pins_a>;
+               pinctrl-names = "default", "sleep";
                status = "okay";
        };
        timer@11 {
 &usbotg_hs {
        dr_mode = "peripheral";
        phys = <&usbphyc_port1 0>;
+       phy-names = "usb2-phy";
        status = "okay";
 };
 
diff --git a/arch/arm/dts/stm32mp157c.dtsi b/arch/arm/dts/stm32mp157c.dtsi
deleted file mode 100644 (file)
index 22a9386..0000000
+++ /dev/null
@@ -1,1584 +0,0 @@
-// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
-/*
- * Copyright (C) STMicroelectronics 2017 - All Rights Reserved
- * Author: Ludovic Barre <ludovic.barre@st.com> for STMicroelectronics.
- */
-#include <dt-bindings/interrupt-controller/arm-gic.h>
-#include <dt-bindings/clock/stm32mp1-clks.h>
-#include <dt-bindings/reset/stm32mp1-resets.h>
-
-/ {
-       #address-cells = <1>;
-       #size-cells = <1>;
-
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               cpu0: cpu@0 {
-                       compatible = "arm,cortex-a7";
-                       device_type = "cpu";
-                       reg = <0>;
-               };
-
-               cpu1: cpu@1 {
-                       compatible = "arm,cortex-a7";
-                       device_type = "cpu";
-                       reg = <1>;
-               };
-       };
-
-       psci {
-               compatible = "arm,psci-1.0";
-               method = "smc";
-               cpu_off = <0x84000002>;
-               cpu_on = <0x84000003>;
-       };
-
-       intc: interrupt-controller@a0021000 {
-               compatible = "arm,cortex-a7-gic";
-               #interrupt-cells = <3>;
-               interrupt-controller;
-               reg = <0xa0021000 0x1000>,
-                     <0xa0022000 0x2000>;
-       };
-
-       timer {
-               compatible = "arm,armv7-timer";
-               interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
-                            <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
-                            <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
-                            <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
-               interrupt-parent = <&intc>;
-       };
-
-       clocks {
-               clk_hse: clk-hse {
-                       #clock-cells = <0>;
-                       compatible = "fixed-clock";
-                       clock-frequency = <24000000>;
-               };
-
-               clk_hsi: clk-hsi {
-                       #clock-cells = <0>;
-                       compatible = "fixed-clock";
-                       clock-frequency = <64000000>;
-               };
-
-               clk_lse: clk-lse {
-                       #clock-cells = <0>;
-                       compatible = "fixed-clock";
-                       clock-frequency = <32768>;
-               };
-
-               clk_lsi: clk-lsi {
-                       #clock-cells = <0>;
-                       compatible = "fixed-clock";
-                       clock-frequency = <32000>;
-               };
-
-               clk_csi: clk-csi {
-                       #clock-cells = <0>;
-                       compatible = "fixed-clock";
-                       clock-frequency = <4000000>;
-               };
-       };
-
-       thermal-zones {
-               cpu_thermal: cpu-thermal {
-                       polling-delay-passive = <0>;
-                       polling-delay = <0>;
-                       thermal-sensors = <&dts>;
-
-                       trips {
-                               cpu_alert1: cpu-alert1 {
-                                       temperature = <85000>;
-                                       hysteresis = <0>;
-                                       type = "passive";
-                               };
-
-                               cpu-crit {
-                                       temperature = <120000>;
-                                       hysteresis = <0>;
-                                       type = "critical";
-                               };
-                       };
-
-                       cooling-maps {
-                       };
-               };
-       };
-
-       booster: regulator-booster {
-               compatible = "st,stm32mp1-booster";
-               st,syscfg = <&syscfg>;
-               status = "disabled";
-       };
-
-       reboot {
-               compatible = "syscon-reboot";
-               regmap = <&rcc>;
-               offset = <0x404>;
-               mask = <0x1>;
-       };
-
-       soc {
-               compatible = "simple-bus";
-               #address-cells = <1>;
-               #size-cells = <1>;
-               interrupt-parent = <&intc>;
-               ranges;
-
-               timers2: timer@40000000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-timers";
-                       reg = <0x40000000 0x400>;
-                       clocks = <&rcc TIM2_K>;
-                       clock-names = "int";
-                       dmas = <&dmamux1 18 0x400 0x1>,
-                              <&dmamux1 19 0x400 0x1>,
-                              <&dmamux1 20 0x400 0x1>,
-                              <&dmamux1 21 0x400 0x1>,
-                              <&dmamux1 22 0x400 0x1>;
-                       dma-names = "ch1", "ch2", "ch3", "ch4", "up";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-
-                       timer@1 {
-                               compatible = "st,stm32h7-timer-trigger";
-                               reg = <1>;
-                               status = "disabled";
-                       };
-               };
-
-               timers3: timer@40001000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-timers";
-                       reg = <0x40001000 0x400>;
-                       clocks = <&rcc TIM3_K>;
-                       clock-names = "int";
-                       dmas = <&dmamux1 23 0x400 0x1>,
-                              <&dmamux1 24 0x400 0x1>,
-                              <&dmamux1 25 0x400 0x1>,
-                              <&dmamux1 26 0x400 0x1>,
-                              <&dmamux1 27 0x400 0x1>,
-                              <&dmamux1 28 0x400 0x1>;
-                       dma-names = "ch1", "ch2", "ch3", "ch4", "up", "trig";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-
-                       timer@2 {
-                               compatible = "st,stm32h7-timer-trigger";
-                               reg = <2>;
-                               status = "disabled";
-                       };
-               };
-
-               timers4: timer@40002000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-timers";
-                       reg = <0x40002000 0x400>;
-                       clocks = <&rcc TIM4_K>;
-                       clock-names = "int";
-                       dmas = <&dmamux1 29 0x400 0x1>,
-                              <&dmamux1 30 0x400 0x1>,
-                              <&dmamux1 31 0x400 0x1>,
-                              <&dmamux1 32 0x400 0x1>;
-                       dma-names = "ch1", "ch2", "ch3", "ch4";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-
-                       timer@3 {
-                               compatible = "st,stm32h7-timer-trigger";
-                               reg = <3>;
-                               status = "disabled";
-                       };
-               };
-
-               timers5: timer@40003000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-timers";
-                       reg = <0x40003000 0x400>;
-                       clocks = <&rcc TIM5_K>;
-                       clock-names = "int";
-                       dmas = <&dmamux1 55 0x400 0x1>,
-                              <&dmamux1 56 0x400 0x1>,
-                              <&dmamux1 57 0x400 0x1>,
-                              <&dmamux1 58 0x400 0x1>,
-                              <&dmamux1 59 0x400 0x1>,
-                              <&dmamux1 60 0x400 0x1>;
-                       dma-names = "ch1", "ch2", "ch3", "ch4", "up", "trig";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-
-                       timer@4 {
-                               compatible = "st,stm32h7-timer-trigger";
-                               reg = <4>;
-                               status = "disabled";
-                       };
-               };
-
-               timers6: timer@40004000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-timers";
-                       reg = <0x40004000 0x400>;
-                       clocks = <&rcc TIM6_K>;
-                       clock-names = "int";
-                       dmas = <&dmamux1 69 0x400 0x1>;
-                       dma-names = "up";
-                       status = "disabled";
-
-                       timer@5 {
-                               compatible = "st,stm32h7-timer-trigger";
-                               reg = <5>;
-                               status = "disabled";
-                       };
-               };
-
-               timers7: timer@40005000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-timers";
-                       reg = <0x40005000 0x400>;
-                       clocks = <&rcc TIM7_K>;
-                       clock-names = "int";
-                       dmas = <&dmamux1 70 0x400 0x1>;
-                       dma-names = "up";
-                       status = "disabled";
-
-                       timer@6 {
-                               compatible = "st,stm32h7-timer-trigger";
-                               reg = <6>;
-                               status = "disabled";
-                       };
-               };
-
-               timers12: timer@40006000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-timers";
-                       reg = <0x40006000 0x400>;
-                       clocks = <&rcc TIM12_K>;
-                       clock-names = "int";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-
-                       timer@11 {
-                               compatible = "st,stm32h7-timer-trigger";
-                               reg = <11>;
-                               status = "disabled";
-                       };
-               };
-
-               timers13: timer@40007000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-timers";
-                       reg = <0x40007000 0x400>;
-                       clocks = <&rcc TIM13_K>;
-                       clock-names = "int";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-
-                       timer@12 {
-                               compatible = "st,stm32h7-timer-trigger";
-                               reg = <12>;
-                               status = "disabled";
-                       };
-               };
-
-               timers14: timer@40008000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-timers";
-                       reg = <0x40008000 0x400>;
-                       clocks = <&rcc TIM14_K>;
-                       clock-names = "int";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-
-                       timer@13 {
-                               compatible = "st,stm32h7-timer-trigger";
-                               reg = <13>;
-                               status = "disabled";
-                       };
-               };
-
-               lptimer1: timer@40009000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-lptimer";
-                       reg = <0x40009000 0x400>;
-                       clocks = <&rcc LPTIM1_K>;
-                       clock-names = "mux";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm-lp";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-
-                       trigger@0 {
-                               compatible = "st,stm32-lptimer-trigger";
-                               reg = <0>;
-                               status = "disabled";
-                       };
-
-                       counter {
-                               compatible = "st,stm32-lptimer-counter";
-                               status = "disabled";
-                       };
-               };
-
-               spi2: spi@4000b000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32h7-spi";
-                       reg = <0x4000b000 0x400>;
-                       interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc SPI2_K>;
-                       resets = <&rcc SPI2_R>;
-                       dmas = <&dmamux1 39 0x400 0x05>,
-                              <&dmamux1 40 0x400 0x05>;
-                       dma-names = "rx", "tx";
-                       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>;
-                       compatible = "st,stm32h7-spi";
-                       reg = <0x4000c000 0x400>;
-                       interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc SPI3_K>;
-                       resets = <&rcc SPI3_R>;
-                       dmas = <&dmamux1 61 0x400 0x05>,
-                              <&dmamux1 62 0x400 0x05>;
-                       dma-names = "rx", "tx";
-                       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>;
-                       reg = <0x4000d000 0x400>;
-                       clocks = <&rcc SPDIF_K>;
-                       clock-names = "kclk";
-                       interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
-                       dmas = <&dmamux1 93 0x400 0x01>,
-                              <&dmamux1 94 0x400 0x01>;
-                       dma-names = "rx", "rx-ctrl";
-                       status = "disabled";
-               };
-
-               usart2: serial@4000e000 {
-                       compatible = "st,stm32h7-uart";
-                       reg = <0x4000e000 0x400>;
-                       interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc USART2_K>;
-                       status = "disabled";
-               };
-
-               usart3: serial@4000f000 {
-                       compatible = "st,stm32h7-uart";
-                       reg = <0x4000f000 0x400>;
-                       interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc USART3_K>;
-                       status = "disabled";
-               };
-
-               uart4: serial@40010000 {
-                       compatible = "st,stm32h7-uart";
-                       reg = <0x40010000 0x400>;
-                       interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc UART4_K>;
-                       status = "disabled";
-               };
-
-               uart5: serial@40011000 {
-                       compatible = "st,stm32h7-uart";
-                       reg = <0x40011000 0x400>;
-                       interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc UART5_K>;
-                       status = "disabled";
-               };
-
-               i2c1: i2c@40012000 {
-                       compatible = "st,stm32f7-i2c";
-                       reg = <0x40012000 0x400>;
-                       interrupt-names = "event", "error";
-                       interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc I2C1_K>;
-                       resets = <&rcc I2C1_R>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       status = "disabled";
-               };
-
-               i2c2: i2c@40013000 {
-                       compatible = "st,stm32f7-i2c";
-                       reg = <0x40013000 0x400>;
-                       interrupt-names = "event", "error";
-                       interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc I2C2_K>;
-                       resets = <&rcc I2C2_R>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       status = "disabled";
-               };
-
-               i2c3: i2c@40014000 {
-                       compatible = "st,stm32f7-i2c";
-                       reg = <0x40014000 0x400>;
-                       interrupt-names = "event", "error";
-                       interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc I2C3_K>;
-                       resets = <&rcc I2C3_R>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       status = "disabled";
-               };
-
-               i2c5: i2c@40015000 {
-                       compatible = "st,stm32f7-i2c";
-                       reg = <0x40015000 0x400>;
-                       interrupt-names = "event", "error";
-                       interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc I2C5_K>;
-                       resets = <&rcc I2C5_R>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       status = "disabled";
-               };
-
-               cec: cec@40016000 {
-                       compatible = "st,stm32-cec";
-                       reg = <0x40016000 0x400>;
-                       interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc CEC_K>, <&clk_lse>;
-                       clock-names = "cec", "hdmi-cec";
-                       status = "disabled";
-               };
-
-               dac: dac@40017000 {
-                       compatible = "st,stm32h7-dac-core";
-                       reg = <0x40017000 0x400>;
-                       clocks = <&rcc DAC12>;
-                       clock-names = "pclk";
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       status = "disabled";
-
-                       dac1: dac@1 {
-                               compatible = "st,stm32-dac";
-                               #io-channels-cells = <1>;
-                               reg = <1>;
-                               status = "disabled";
-                       };
-
-                       dac2: dac@2 {
-                               compatible = "st,stm32-dac";
-                               #io-channels-cells = <1>;
-                               reg = <2>;
-                               status = "disabled";
-                       };
-               };
-
-               uart7: serial@40018000 {
-                       compatible = "st,stm32h7-uart";
-                       reg = <0x40018000 0x400>;
-                       interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc UART7_K>;
-                       status = "disabled";
-               };
-
-               uart8: serial@40019000 {
-                       compatible = "st,stm32h7-uart";
-                       reg = <0x40019000 0x400>;
-                       interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc UART8_K>;
-                       status = "disabled";
-               };
-
-               timers1: timer@44000000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-timers";
-                       reg = <0x44000000 0x400>;
-                       clocks = <&rcc TIM1_K>;
-                       clock-names = "int";
-                       dmas = <&dmamux1 11 0x400 0x1>,
-                              <&dmamux1 12 0x400 0x1>,
-                              <&dmamux1 13 0x400 0x1>,
-                              <&dmamux1 14 0x400 0x1>,
-                              <&dmamux1 15 0x400 0x1>,
-                              <&dmamux1 16 0x400 0x1>,
-                              <&dmamux1 17 0x400 0x1>;
-                       dma-names = "ch1", "ch2", "ch3", "ch4",
-                                   "up", "trig", "com";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-
-                       timer@0 {
-                               compatible = "st,stm32h7-timer-trigger";
-                               reg = <0>;
-                               status = "disabled";
-                       };
-               };
-
-               timers8: timer@44001000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-timers";
-                       reg = <0x44001000 0x400>;
-                       clocks = <&rcc TIM8_K>;
-                       clock-names = "int";
-                       dmas = <&dmamux1 47 0x400 0x1>,
-                              <&dmamux1 48 0x400 0x1>,
-                              <&dmamux1 49 0x400 0x1>,
-                              <&dmamux1 50 0x400 0x1>,
-                              <&dmamux1 51 0x400 0x1>,
-                              <&dmamux1 52 0x400 0x1>,
-                              <&dmamux1 53 0x400 0x1>;
-                       dma-names = "ch1", "ch2", "ch3", "ch4",
-                                   "up", "trig", "com";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-
-                       timer@7 {
-                               compatible = "st,stm32h7-timer-trigger";
-                               reg = <7>;
-                               status = "disabled";
-                       };
-               };
-
-               usart6: serial@44003000 {
-                       compatible = "st,stm32h7-uart";
-                       reg = <0x44003000 0x400>;
-                       interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc USART6_K>;
-                       status = "disabled";
-               };
-
-               spi1: spi@44004000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32h7-spi";
-                       reg = <0x44004000 0x400>;
-                       interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc SPI1_K>;
-                       resets = <&rcc SPI1_R>;
-                       dmas = <&dmamux1 37 0x400 0x05>,
-                              <&dmamux1 38 0x400 0x05>;
-                       dma-names = "rx", "tx";
-                       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>;
-                       compatible = "st,stm32h7-spi";
-                       reg = <0x44005000 0x400>;
-                       interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc SPI4_K>;
-                       resets = <&rcc SPI4_R>;
-                       dmas = <&dmamux1 83 0x400 0x05>,
-                              <&dmamux1 84 0x400 0x05>;
-                       dma-names = "rx", "tx";
-                       status = "disabled";
-               };
-
-               timers15: timer@44006000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-timers";
-                       reg = <0x44006000 0x400>;
-                       clocks = <&rcc TIM15_K>;
-                       clock-names = "int";
-                       dmas = <&dmamux1 105 0x400 0x1>,
-                              <&dmamux1 106 0x400 0x1>,
-                              <&dmamux1 107 0x400 0x1>,
-                              <&dmamux1 108 0x400 0x1>;
-                       dma-names = "ch1", "up", "trig", "com";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-
-                       timer@14 {
-                               compatible = "st,stm32h7-timer-trigger";
-                               reg = <14>;
-                               status = "disabled";
-                       };
-               };
-
-               timers16: timer@44007000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-timers";
-                       reg = <0x44007000 0x400>;
-                       clocks = <&rcc TIM16_K>;
-                       clock-names = "int";
-                       dmas = <&dmamux1 109 0x400 0x1>,
-                              <&dmamux1 110 0x400 0x1>;
-                       dma-names = "ch1", "up";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-                       timer@15 {
-                               compatible = "st,stm32h7-timer-trigger";
-                               reg = <15>;
-                               status = "disabled";
-                       };
-               };
-
-               timers17: timer@44008000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-timers";
-                       reg = <0x44008000 0x400>;
-                       clocks = <&rcc TIM17_K>;
-                       clock-names = "int";
-                       dmas = <&dmamux1 111 0x400 0x1>,
-                              <&dmamux1 112 0x400 0x1>;
-                       dma-names = "ch1", "up";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-
-                       timer@16 {
-                               compatible = "st,stm32h7-timer-trigger";
-                               reg = <16>;
-                               status = "disabled";
-                       };
-               };
-
-               spi5: spi@44009000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32h7-spi";
-                       reg = <0x44009000 0x400>;
-                       interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc SPI5_K>;
-                       resets = <&rcc SPI5_R>;
-                       dmas = <&dmamux1 85 0x400 0x05>,
-                              <&dmamux1 86 0x400 0x05>;
-                       dma-names = "rx", "tx";
-                       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>;
-                       clocks = <&rcc DFSDM_K>;
-                       clock-names = "dfsdm";
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       status = "disabled";
-
-                       dfsdm0: filter@0 {
-                               compatible = "st,stm32-dfsdm-adc";
-                               #io-channel-cells = <1>;
-                               reg = <0>;
-                               interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
-                               dmas = <&dmamux1 101 0x400 0x01>;
-                               dma-names = "rx";
-                               status = "disabled";
-                       };
-
-                       dfsdm1: filter@1 {
-                               compatible = "st,stm32-dfsdm-adc";
-                               #io-channel-cells = <1>;
-                               reg = <1>;
-                               interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>;
-                               dmas = <&dmamux1 102 0x400 0x01>;
-                               dma-names = "rx";
-                               status = "disabled";
-                       };
-
-                       dfsdm2: filter@2 {
-                               compatible = "st,stm32-dfsdm-adc";
-                               #io-channel-cells = <1>;
-                               reg = <2>;
-                               interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>;
-                               dmas = <&dmamux1 103 0x400 0x01>;
-                               dma-names = "rx";
-                               status = "disabled";
-                       };
-
-                       dfsdm3: filter@3 {
-                               compatible = "st,stm32-dfsdm-adc";
-                               #io-channel-cells = <1>;
-                               reg = <3>;
-                               interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>;
-                               dmas = <&dmamux1 104 0x400 0x01>;
-                               dma-names = "rx";
-                               status = "disabled";
-                       };
-
-                       dfsdm4: filter@4 {
-                               compatible = "st,stm32-dfsdm-adc";
-                               #io-channel-cells = <1>;
-                               reg = <4>;
-                               interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>;
-                               dmas = <&dmamux1 91 0x400 0x01>;
-                               dma-names = "rx";
-                               status = "disabled";
-                       };
-
-                       dfsdm5: filter@5 {
-                               compatible = "st,stm32-dfsdm-adc";
-                               #io-channel-cells = <1>;
-                               reg = <5>;
-                               interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>;
-                               dmas = <&dmamux1 92 0x400 0x01>;
-                               dma-names = "rx";
-                               status = "disabled";
-                       };
-               };
-
-               m_can1: can@4400e000 {
-                       compatible = "bosch,m_can";
-                       reg = <0x4400e000 0x400>, <0x44011000 0x1400>;
-                       reg-names = "m_can", "message_ram";
-                       interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
-                       interrupt-names = "int0", "int1";
-                       clocks = <&rcc CK_HSE>, <&rcc FDCAN_K>;
-                       clock-names = "hclk", "cclk";
-                       bosch,mram-cfg = <0x0 0 0 32 0 0 2 2>;
-                       status = "disabled";
-               };
-
-               m_can2: can@4400f000 {
-                       compatible = "bosch,m_can";
-                       reg = <0x4400f000 0x400>, <0x44011000 0x2800>;
-                       reg-names = "m_can", "message_ram";
-                       interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
-                       interrupt-names = "int0", "int1";
-                       clocks = <&rcc CK_HSE>, <&rcc FDCAN_K>;
-                       clock-names = "hclk", "cclk";
-                       bosch,mram-cfg = <0x1400 0 0 32 0 0 2 2>;
-                       status = "disabled";
-               };
-
-               dma1: dma@48000000 {
-                       compatible = "st,stm32-dma";
-                       reg = <0x48000000 0x400>;
-                       interrupts = <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 47 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc DMA1>;
-                       #dma-cells = <4>;
-                       st,mem2mem;
-                       dma-requests = <8>;
-               };
-
-               dma2: dma@48001000 {
-                       compatible = "st,stm32-dma";
-                       reg = <0x48001000 0x400>;
-                       interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc DMA2>;
-                       #dma-cells = <4>;
-                       st,mem2mem;
-                       dma-requests = <8>;
-               };
-
-               dmamux1: dma-router@48002000 {
-                       compatible = "st,stm32h7-dmamux";
-                       reg = <0x48002000 0x1c>;
-                       #dma-cells = <3>;
-                       dma-requests = <128>;
-                       dma-masters = <&dma1 &dma2>;
-                       dma-channels = <16>;
-                       clocks = <&rcc DMAMUX>;
-               };
-
-               adc: adc@48003000 {
-                       compatible = "st,stm32mp1-adc-core";
-                       reg = <0x48003000 0x400>;
-                       interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc ADC12>, <&rcc ADC12_K>;
-                       clock-names = "bus", "adc";
-                       interrupt-controller;
-                       st,syscfg = <&syscfg>;
-                       #interrupt-cells = <1>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       status = "disabled";
-
-                       adc1: adc@0 {
-                               compatible = "st,stm32mp1-adc";
-                               #io-channel-cells = <1>;
-                               reg = <0x0>;
-                               interrupt-parent = <&adc>;
-                               interrupts = <0>;
-                               dmas = <&dmamux1 9 0x400 0x01>;
-                               dma-names = "rx";
-                               status = "disabled";
-                       };
-
-                       adc2: adc@100 {
-                               compatible = "st,stm32mp1-adc";
-                               #io-channel-cells = <1>;
-                               reg = <0x100>;
-                               interrupt-parent = <&adc>;
-                               interrupts = <1>;
-                               dmas = <&dmamux1 10 0x400 0x01>;
-                               dma-names = "rx";
-                               status = "disabled";
-                       };
-               };
-
-               sdmmc3: sdmmc@48004000 {
-                       compatible = "arm,pl18x", "arm,primecell";
-                       arm,primecell-periphid = <0x10153180>;
-                       reg = <0x48004000 0x400>;
-                       reg-names = "sdmmc";
-                       interrupts = <GIC_SPI 137 IRQ_TYPE_NONE>;
-                       clocks = <&rcc SDMMC3_K>;
-                       clock-names = "apb_pclk";
-                       resets = <&rcc SDMMC3_R>;
-                       cap-sd-highspeed;
-                       cap-mmc-highspeed;
-                       max-frequency = <120000000>;
-                       status = "disabled";
-               };
-
-               usbotg_hs: usb-otg@49000000 {
-                       compatible = "snps,dwc2";
-                       reg = <0x49000000 0x10000>;
-                       clocks = <&rcc USBO_K>;
-                       clock-names = "otg";
-                       resets = <&rcc USBO_R>;
-                       reset-names = "dwc2";
-                       interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
-                       g-rx-fifo-size = <256>;
-                       g-np-tx-fifo-size = <32>;
-                       g-tx-fifo-size = <128 128 64 64 64 64 32 32>;
-                       dr_mode = "otg";
-                       usb33d-supply = <&usb33>;
-                       status = "disabled";
-               };
-
-               hwspinlock: hwspinlock@4c000000 {
-                       compatible = "st,stm32-hwspinlock";
-                       #hwlock-cells = <1>;
-                       reg = <0x4c000000 0x400>;
-                       clocks = <&rcc HSEM>;
-                       clock-names = "hwspinlock";
-               };
-
-               ipcc: mailbox@4c001000 {
-                       compatible = "st,stm32mp1-ipcc";
-                       #mbox-cells = <1>;
-                       reg = <0x4c001000 0x400>;
-                       st,proc-id = <0>;
-                       interrupts-extended =
-                               <&intc GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>,
-                               <&intc GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>,
-                               <&exti 61 1>;
-                       interrupt-names = "rx", "tx", "wakeup";
-                       clocks = <&rcc IPCC>;
-                       wakeup-source;
-                       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>;
-                       #clock-cells = <1>;
-                       #reset-cells = <1>;
-               };
-
-               pwr_regulators: pwr@50001000 {
-                       compatible = "st,stm32mp1,pwr-reg";
-                       reg = <0x50001000 0x10>;
-
-                       reg11: reg11 {
-                               regulator-name = "reg11";
-                               regulator-min-microvolt = <1100000>;
-                               regulator-max-microvolt = <1100000>;
-                       };
-
-                       reg18: reg18 {
-                               regulator-name = "reg18";
-                               regulator-min-microvolt = <1800000>;
-                               regulator-max-microvolt = <1800000>;
-                       };
-
-                       usb33: usb33 {
-                               regulator-name = "usb33";
-                               regulator-min-microvolt = <3300000>;
-                               regulator-max-microvolt = <3300000>;
-                       };
-               };
-
-               exti: interrupt-controller@5000d000 {
-                       compatible = "st,stm32mp1-exti", "syscon";
-                       interrupt-controller;
-                       #interrupt-cells = <2>;
-                       reg = <0x5000d000 0x400>;
-               };
-
-               syscfg: syscon@50020000 {
-                       compatible = "st,stm32mp157-syscfg", "syscon";
-                       reg = <0x50020000 0x400>;
-                       clocks = <&rcc SYSCFG>;
-               };
-
-               lptimer2: timer@50021000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-lptimer";
-                       reg = <0x50021000 0x400>;
-                       clocks = <&rcc LPTIM2_K>;
-                       clock-names = "mux";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm-lp";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-
-                       trigger@1 {
-                               compatible = "st,stm32-lptimer-trigger";
-                               reg = <1>;
-                               status = "disabled";
-                       };
-
-                       counter {
-                               compatible = "st,stm32-lptimer-counter";
-                               status = "disabled";
-                       };
-               };
-
-               lptimer3: timer@50022000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32-lptimer";
-                       reg = <0x50022000 0x400>;
-                       clocks = <&rcc LPTIM3_K>;
-                       clock-names = "mux";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm-lp";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-
-                       trigger@2 {
-                               compatible = "st,stm32-lptimer-trigger";
-                               reg = <2>;
-                               status = "disabled";
-                       };
-               };
-
-               lptimer4: timer@50023000 {
-                       compatible = "st,stm32-lptimer";
-                       reg = <0x50023000 0x400>;
-                       clocks = <&rcc LPTIM4_K>;
-                       clock-names = "mux";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm-lp";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-               };
-
-               lptimer5: timer@50024000 {
-                       compatible = "st,stm32-lptimer";
-                       reg = <0x50024000 0x400>;
-                       clocks = <&rcc LPTIM5_K>;
-                       clock-names = "mux";
-                       status = "disabled";
-
-                       pwm {
-                               compatible = "st,stm32-pwm-lp";
-                               #pwm-cells = <3>;
-                               status = "disabled";
-                       };
-               };
-
-               vrefbuf: vrefbuf@50025000 {
-                       compatible = "st,stm32-vrefbuf";
-                       reg = <0x50025000 0x8>;
-                       regulator-min-microvolt = <1500000>;
-                       regulator-max-microvolt = <2500000>;
-                       clocks = <&rcc VREF>;
-                       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>;
-                       interrupts = <GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc TMPSENS>;
-                       clock-names = "pclk";
-                       #thermal-sensor-cells = <0>;
-                       status = "disabled";
-               };
-
-               cryp1: cryp@54001000 {
-                       compatible = "st,stm32mp1-cryp";
-                       reg = <0x54001000 0x400>;
-                       interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc CRYP1>;
-                       resets = <&rcc CRYP1_R>;
-                       status = "disabled";
-               };
-
-               hash1: hash@54002000 {
-                       compatible = "st,stm32f756-hash";
-                       reg = <0x54002000 0x400>;
-                       interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc HASH1>;
-                       resets = <&rcc HASH1_R>;
-                       dmas = <&mdma1 31 0x10 0x1000A02 0x0 0x0>;
-                       dma-names = "in";
-                       dma-maxburst = <2>;
-                       status = "disabled";
-               };
-
-               rng1: rng@54003000 {
-                       compatible = "st,stm32-rng";
-                       reg = <0x54003000 0x400>;
-                       clocks = <&rcc RNG1_K>;
-                       resets = <&rcc RNG1_R>;
-                       status = "disabled";
-               };
-
-               mdma1: dma@58000000 {
-                       compatible = "st,stm32h7-mdma";
-                       reg = <0x58000000 0x1000>;
-                       interrupts = <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc MDMA>;
-                       #dma-cells = <5>;
-                       dma-channels = <32>;
-                       dma-requests = <48>;
-               };
-
-               fmc: nand-controller@58002000 {
-                       compatible = "st,stm32mp15-fmc2";
-                       reg = <0x58002000 0x1000>,
-                             <0x80000000 0x1000>,
-                             <0x88010000 0x1000>,
-                             <0x88020000 0x1000>,
-                             <0x81000000 0x1000>,
-                             <0x89010000 0x1000>,
-                             <0x89020000 0x1000>;
-                       interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
-                       dmas = <&mdma1 20 0x10 0x12000a02 0x0 0x0>,
-                              <&mdma1 20 0x10 0x12000a08 0x0 0x0>,
-                              <&mdma1 21 0x10 0x12000a0a 0x0 0x0>;
-                       dma-names = "tx", "rx", "ecc";
-                       clocks = <&rcc FMC_K>;
-                       resets = <&rcc FMC_R>;
-                       status = "disabled";
-               };
-
-               qspi: spi@58003000 {
-                       compatible = "st,stm32f469-qspi";
-                       reg = <0x58003000 0x1000>, <0x70000000 0x10000000>;
-                       reg-names = "qspi", "qspi_mm";
-                       interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>;
-                       dmas = <&mdma1 22 0x10 0x100002 0x0 0x0>,
-                              <&mdma1 22 0x10 0x100008 0x0 0x0>;
-                       dma-names = "tx", "rx";
-                       clocks = <&rcc QSPI_K>;
-                       resets = <&rcc QSPI_R>;
-                       status = "disabled";
-               };
-
-               sdmmc1: sdmmc@58005000 {
-                       compatible = "arm,pl18x", "arm,primecell";
-                       arm,primecell-periphid = <0x10153180>;
-                       reg = <0x58005000 0x1000>;
-                       interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
-                       interrupt-names = "cmd_irq";
-                       clocks = <&rcc SDMMC1_K>;
-                       clock-names = "apb_pclk";
-                       resets = <&rcc SDMMC1_R>;
-                       cap-sd-highspeed;
-                       cap-mmc-highspeed;
-                       max-frequency = <120000000>;
-               };
-
-               sdmmc2: sdmmc@58007000 {
-                       compatible = "arm,pl18x", "arm,primecell";
-                       arm,primecell-periphid = <0x10153180>;
-                       reg = <0x58007000 0x1000>;
-                       interrupts = <GIC_SPI 124 IRQ_TYPE_NONE>;
-                       clocks = <&rcc SDMMC2_K>;
-                       clock-names = "apb_pclk";
-                       resets = <&rcc SDMMC2_R>;
-                       cap-sd-highspeed;
-                       cap-mmc-highspeed;
-                       max-frequency = <120000000>;
-                       status = "disabled";
-               };
-
-               crc1: crc@58009000 {
-                       compatible = "st,stm32f7-crc";
-                       reg = <0x58009000 0x400>;
-                       clocks = <&rcc CRC1>;
-                       status = "disabled";
-               };
-
-               stmmac_axi_config_0: stmmac-axi-config {
-                       snps,wr_osr_lmt = <0x7>;
-                       snps,rd_osr_lmt = <0x7>;
-                       snps,blen = <0 0 0 0 16 8 4>;
-               };
-
-               ethernet0: ethernet@5800a000 {
-                       compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a";
-                       reg = <0x5800a000 0x2000>;
-                       reg-names = "stmmaceth";
-                       interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>;
-                       interrupt-names = "macirq";
-                       clock-names = "stmmaceth",
-                                     "mac-clk-tx",
-                                     "mac-clk-rx",
-                                     "eth-ck",
-                                     "ethstp",
-                                     "syscfg-clk";
-                       clocks = <&rcc ETHMAC>,
-                                <&rcc ETHTX>,
-                                <&rcc ETHRX>,
-                                <&rcc ETHCK_K>,
-                                <&rcc ETHSTP>,
-                                <&rcc SYSCFG>;
-                       st,syscon = <&syscfg 0x4>;
-                       snps,mixed-burst;
-                       snps,pbl = <2>;
-                       snps,axi-config = <&stmmac_axi_config_0>;
-                       snps,tso;
-                       status = "disabled";
-               };
-
-               usbh_ohci: usbh-ohci@5800c000 {
-                       compatible = "generic-ohci";
-                       reg = <0x5800c000 0x1000>;
-                       clocks = <&rcc USBH>;
-                       resets = <&rcc USBH_R>;
-                       interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
-                       status = "disabled";
-               };
-
-               usbh_ehci: usbh-ehci@5800d000 {
-                       compatible = "generic-ehci";
-                       reg = <0x5800d000 0x1000>;
-                       clocks = <&rcc USBH>;
-                       resets = <&rcc USBH_R>;
-                       interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
-                       companion = <&usbh_ohci>;
-                       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>;
-                       clocks = <&rcc DSI_K>, <&clk_hse>, <&rcc DSI_PX>;
-                       clock-names = "pclk", "ref", "px_clk";
-                       resets = <&rcc DSI_R>;
-                       reset-names = "apb";
-                       status = "disabled";
-               };
-
-               ltdc: display-controller@5a001000 {
-                       compatible = "st,stm32-ltdc";
-                       reg = <0x5a001000 0x400>;
-                       interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc LTDC_PX>;
-                       clock-names = "lcd";
-                       resets = <&rcc LTDC_R>;
-                       status = "disabled";
-               };
-
-               iwdg2: watchdog@5a002000 {
-                       compatible = "st,stm32mp1-iwdg";
-                       reg = <0x5a002000 0x400>;
-                       clocks = <&rcc IWDG2>, <&rcc CK_LSI>;
-                       clock-names = "pclk", "lsi";
-                       status = "disabled";
-               };
-
-               usbphyc: usbphyc@5a006000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32mp1-usbphyc";
-                       reg = <0x5a006000 0x1000>;
-                       clocks = <&rcc USBPHY_K>;
-                       resets = <&rcc USBPHY_R>;
-                       vdda1v1-supply = <&reg11>;
-                       vdda1v8-supply = <&reg18>;
-                       status = "disabled";
-
-                       usbphyc_port0: usb-phy@0 {
-                               #phy-cells = <0>;
-                               reg = <0>;
-                       };
-
-                       usbphyc_port1: usb-phy@1 {
-                               #phy-cells = <1>;
-                               reg = <1>;
-                       };
-               };
-
-               usart1: serial@5c000000 {
-                       compatible = "st,stm32h7-uart";
-                       reg = <0x5c000000 0x400>;
-                       interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc USART1_K>;
-                       status = "disabled";
-               };
-
-               spi6: spi@5c001000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "st,stm32h7-spi";
-                       reg = <0x5c001000 0x400>;
-                       interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc SPI6_K>;
-                       resets = <&rcc SPI6_R>;
-                       dmas = <&mdma1 34 0x0 0x40008 0x0 0x0>,
-                              <&mdma1 35 0x0 0x40002 0x0 0x0>;
-                       dma-names = "rx", "tx";
-                       status = "disabled";
-               };
-
-               i2c4: i2c@5c002000 {
-                       compatible = "st,stm32f7-i2c";
-                       reg = <0x5c002000 0x400>;
-                       interrupt-names = "event", "error";
-                       interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc I2C4_K>;
-                       resets = <&rcc I2C4_R>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       status = "disabled";
-               };
-
-               rtc: rtc@5c004000 {
-                       compatible = "st,stm32mp1-rtc";
-                       reg = <0x5c004000 0x400>;
-                       clocks = <&rcc RTCAPB>, <&rcc RTC>;
-                       clock-names = "pclk", "rtc_ck";
-                       interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
-                       status = "disabled";
-               };
-
-               bsec: nvmem@5c005000 {
-                       compatible = "st,stm32mp15-bsec";
-                       reg = <0x5c005000 0x400>;
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ts_cal1: calib@5c {
-                               reg = <0x5c 0x2>;
-                       };
-                       ts_cal2: calib@5e {
-                               reg = <0x5e 0x2>;
-                       };
-               };
-
-               i2c6: i2c@5c009000 {
-                       compatible = "st,stm32f7-i2c";
-                       reg = <0x5c009000 0x400>;
-                       interrupt-names = "event", "error";
-                       interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>,
-                                    <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>;
-                       clocks = <&rcc I2C6_K>;
-                       resets = <&rcc I2C6_R>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       status = "disabled";
-               };
-       };
-
-       mlahb {
-               compatible = "simple-bus";
-               #address-cells = <1>;
-               #size-cells = <1>;
-               dma-ranges = <0x00000000 0x38000000 0x10000>,
-                            <0x10000000 0x10000000 0x60000>,
-                            <0x30000000 0x30000000 0x60000>;
-
-               m4_rproc: m4@10000000 {
-                       compatible = "st,stm32mp1-m4";
-                       reg = <0x10000000 0x40000>,
-                             <0x30000000 0x40000>,
-                             <0x38000000 0x10000>;
-                       resets = <&rcc MCU_R>;
-                       st,syscfg-holdboot = <&rcc 0x10C 0x1>;
-                       st,syscfg-tz = <&rcc 0x000 0x1>;
-                       status = "disabled";
-               };
-       };
-};
diff --git a/arch/arm/dts/stm32mp157xaa-pinctrl.dtsi b/arch/arm/dts/stm32mp157xaa-pinctrl.dtsi
deleted file mode 100644 (file)
index 875adf5..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-// 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/dts/stm32mp157xab-pinctrl.dtsi b/arch/arm/dts/stm32mp157xab-pinctrl.dtsi
deleted file mode 100644 (file)
index 961fa12..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-// 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/dts/stm32mp157xac-pinctrl.dtsi b/arch/arm/dts/stm32mp157xac-pinctrl.dtsi
deleted file mode 100644 (file)
index 26600f1..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-// 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/dts/stm32mp157xad-pinctrl.dtsi b/arch/arm/dts/stm32mp157xad-pinctrl.dtsi
deleted file mode 100644 (file)
index 910113f..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-// 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>;
-                       };
-               };
-       };
-};
diff --git a/arch/arm/dts/stm32mp15xc.dtsi b/arch/arm/dts/stm32mp15xc.dtsi
new file mode 100644 (file)
index 0000000..b06a55a
--- /dev/null
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
+ * Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
+ */
+
+/ {
+       soc {
+               cryp1: cryp@54001000 {
+                       compatible = "st,stm32mp1-cryp";
+                       reg = <0x54001000 0x400>;
+                       interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&rcc CRYP1>;
+                       resets = <&rcc CRYP1_R>;
+                       status = "disabled";
+               };
+       };
+};
index 6c952a57ee9da3280a16015dad10e3ca67f4002e..62c45def43758ff1b938486c2c97fe9518e501d5 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 #include <dt-bindings/clock/stm32mp1-clksrc.h>
-#include "stm32mp157-u-boot.dtsi"
+#include "stm32mp15-u-boot.dtsi"
 #include "stm32mp15-ddr3-2x4Gb-1066-binG.dtsi"
 
 / {
 
 &sdmmc1_b4_pins_a {
        u-boot,dm-spl;
-       pins {
+       pins1 {
+               u-boot,dm-spl;
+       };
+       pins2 {
                u-boot,dm-spl;
        };
 };
index e5be0a79ac5b03de162578a9a80dc46b800c247d..d8a255b9c687f65c0e182200e51927968d54d197 100644 (file)
@@ -4,8 +4,10 @@
  */
 /dts-v1/;
 
-#include "stm32mp157c.dtsi"
-#include "stm32mp157xaa-pinctrl.dtsi"
+#include "stm32mp157.dtsi"
+#include "stm32mp15xc.dtsi"
+#include "stm32mp15-pinctrl.dtsi"
+#include "stm32mp15xxaa-pinctrl.dtsi"
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/mfd/st,stpmic1.h>
 
diff --git a/arch/arm/dts/stm32mp15xx-dkx.dtsi b/arch/arm/dts/stm32mp15xx-dkx.dtsi
new file mode 100644 (file)
index 0000000..42d3f0c
--- /dev/null
@@ -0,0 +1,639 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
+ * Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
+ */
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/mfd/st,stpmic1.h>
+
+/ {
+       memory@c0000000 {
+               device_type = "memory";
+               reg = <0xc0000000 0x20000000>;
+       };
+
+       reserved-memory {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               mcuram2: mcuram2@10000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x10000000 0x40000>;
+                       no-map;
+               };
+
+               vdev0vring0: vdev0vring0@10040000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x10040000 0x1000>;
+                       no-map;
+               };
+
+               vdev0vring1: vdev0vring1@10041000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x10041000 0x1000>;
+                       no-map;
+               };
+
+               vdev0buffer: vdev0buffer@10042000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x10042000 0x4000>;
+                       no-map;
+               };
+
+               mcuram: mcuram@30000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x30000000 0x40000>;
+                       no-map;
+               };
+
+               retram: retram@38000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x38000000 0x10000>;
+                       no-map;
+               };
+
+               gpu_reserved: gpu@d4000000 {
+                       reg = <0xd4000000 0x4000000>;
+                       no-map;
+               };
+       };
+
+       led {
+               compatible = "gpio-leds";
+               blue {
+                       label = "heartbeat";
+                       gpios = <&gpiod 11 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "heartbeat";
+                       default-state = "off";
+               };
+       };
+
+       sound {
+               compatible = "audio-graph-card";
+               label = "STM32MP1-DK";
+               routing =
+                       "Playback" , "MCLK",
+                       "Capture" , "MCLK",
+                       "MICL" , "Mic Bias";
+               dais = <&sai2a_port &sai2b_port &i2s2_port>;
+               status = "okay";
+       };
+};
+
+&adc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&adc12_ain_pins_a>, <&adc12_usb_cc_pins_a>;
+       vdd-supply = <&vdd>;
+       vdda-supply = <&vdd>;
+       vref-supply = <&vrefbuf>;
+       status = "disabled";
+       adc1: adc@0 {
+               /*
+                * Type-C USB_PWR_CC1 & USB_PWR_CC2 on in18 & in19.
+                * Use at least 5 * RC time, e.g. 5 * (Rp + Rd) * C:
+                * 5 * (56 + 47kOhms) * 5pF => 2.5us.
+                * Use arbitrary margin here (e.g. 5us).
+                */
+               st,min-sample-time-nsecs = <5000>;
+               /* AIN connector, USB Type-C CC1 & CC2 */
+               st,adc-channels = <0 1 6 13 18 19>;
+               status = "okay";
+       };
+       adc2: adc@100 {
+               /* AIN connector, USB Type-C CC1 & CC2 */
+               st,adc-channels = <0 1 2 6 18 19>;
+               st,min-sample-time-nsecs = <5000>;
+               status = "okay";
+       };
+};
+
+&cec {
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&cec_pins_b>;
+       pinctrl-1 = <&cec_pins_sleep_b>;
+       status = "okay";
+};
+
+&ethernet0 {
+       status = "okay";
+       pinctrl-0 = <&ethernet0_rgmii_pins_a>;
+       pinctrl-1 = <&ethernet0_rgmii_pins_sleep_a>;
+       pinctrl-names = "default", "sleep";
+       phy-mode = "rgmii-id";
+       max-speed = <1000>;
+       phy-handle = <&phy0>;
+
+       mdio0 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "snps,dwmac-mdio";
+               phy0: ethernet-phy@0 {
+                       reg = <0>;
+               };
+       };
+};
+
+&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>;
+               #sound-dai-cells = <0>;
+               status = "okay";
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       port@0 {
+                               reg = <0>;
+                               sii9022_in: endpoint {
+                                       remote-endpoint = <&ltdc_ep0_out>;
+                               };
+                       };
+
+                       port@3 {
+                               reg = <3>;
+                               sii9022_tx_endpoint: endpoint {
+                                       remote-endpoint = <&i2s2_endpoint>;
+                               };
+                       };
+               };
+       };
+
+       cs42l51: cs42l51@4a {
+               compatible = "cirrus,cs42l51";
+               reg = <0x4a>;
+               #sound-dai-cells = <0>;
+               VL-supply = <&v3v3>;
+               VD-supply = <&v1v8_audio>;
+               VA-supply = <&v1v8_audio>;
+               VAHP-supply = <&v1v8_audio>;
+               reset-gpios = <&gpiog 9 GPIO_ACTIVE_LOW>;
+               clocks = <&sai2a>;
+               clock-names = "MCLK";
+               status = "okay";
+
+               cs42l51_port: port {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       cs42l51_tx_endpoint: endpoint@0 {
+                               reg = <0>;
+                               remote-endpoint = <&sai2a_endpoint>;
+                               frame-master;
+                               bitclock-master;
+                       };
+
+                       cs42l51_rx_endpoint: endpoint@1 {
+                               reg = <1>;
+                               remote-endpoint = <&sai2b_endpoint>;
+                               frame-master;
+                               bitclock-master;
+                       };
+               };
+       };
+};
+
+&i2c4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c4_pins_a>;
+       i2c-scl-rising-time-ns = <185>;
+       i2c-scl-falling-time-ns = <20>;
+       status = "okay";
+       /* spare dmas for other usage */
+       /delete-property/dmas;
+       /delete-property/dma-names;
+
+       typec: stusb1600@28 {
+               compatible = "st,stusb1600";
+               reg = <0x28>;
+               interrupts = <11 IRQ_TYPE_EDGE_FALLING>;
+               interrupt-parent = <&gpioi>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&stusb1600_pins_a>;
+
+               status = "okay";
+
+               typec_con: connector {
+                       compatible = "usb-c-connector";
+                       label = "USB-C";
+                       power-role = "sink";
+                       power-opmode = "default";
+               };
+       };
+
+       pmic: stpmic@33 {
+               compatible = "st,stpmic1";
+               reg = <0x33>;
+               interrupts-extended = <&gpioa 0 IRQ_TYPE_EDGE_FALLING>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+               status = "okay";
+
+               regulators {
+                       compatible = "st,stpmic1-regulators";
+                       ldo1-supply = <&v3v3>;
+                       ldo3-supply = <&vdd_ddr>;
+                       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>;
+                       };
+
+                       v1v8_audio: ldo1 {
+                               regulator-name = "v1v8_audio";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-always-on;
+                               interrupts = <IT_CURLIM_LDO1 0>;
+                       };
+
+                       v3v3_hdmi: ldo2 {
+                               regulator-name = "v3v3_hdmi";
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                               interrupts = <IT_CURLIM_LDO2 0>;
+                       };
+
+                       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>;
+                       };
+
+                       vdda: ldo5 {
+                               regulator-name = "vdda";
+                               regulator-min-microvolt = <2900000>;
+                               regulator-max-microvolt = <2900000>;
+                               interrupts = <IT_CURLIM_LDO5 0>;
+                               regulator-boot-on;
+                       };
+
+                       v1v2_hdmi: ldo6 {
+                               regulator-name = "v1v2_hdmi";
+                               regulator-min-microvolt = <1200000>;
+                               regulator-max-microvolt = <1200000>;
+                               regulator-always-on;
+                               interrupts = <IT_CURLIM_LDO6 0>;
+                       };
+
+                       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>;
+                        };
+
+                       vbus_otg: pwr_sw1 {
+                               regulator-name = "vbus_otg";
+                               interrupts = <IT_OCP_OTG 0>;
+                        };
+
+                        vbus_sw: pwr_sw2 {
+                               regulator-name = "vbus_sw";
+                               interrupts = <IT_OCP_SWOUT 0>;
+                               regulator-active-discharge = <1>;
+                        };
+               };
+
+               onkey {
+                       compatible = "st,stpmic1-onkey";
+                       interrupts = <IT_PONKEY_F 0>, <IT_PONKEY_R 0>;
+                       interrupt-names = "onkey-falling", "onkey-rising";
+                       power-off-time-sec = <10>;
+                       status = "okay";
+               };
+
+               watchdog {
+                       compatible = "st,stpmic1-wdt";
+                       status = "disabled";
+               };
+       };
+};
+
+&i2s2 {
+       clocks = <&rcc SPI2>, <&rcc SPI2_K>, <&rcc PLL3_Q>, <&rcc PLL3_R>;
+       clock-names = "pclk", "i2sclk", "x8k", "x11k";
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&i2s2_pins_a>;
+       pinctrl-1 = <&i2s2_pins_sleep_a>;
+       status = "okay";
+
+       i2s2_port: port {
+               i2s2_endpoint: endpoint {
+                       remote-endpoint = <&sii9022_tx_endpoint>;
+                       format = "i2s";
+                       mclk-fs = <256>;
+               };
+       };
+};
+
+&ipcc {
+       status = "okay";
+};
+
+&iwdg2 {
+       timeout-sec = <32>;
+       status = "okay";
+};
+
+&ltdc {
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&ltdc_pins_a>;
+       pinctrl-1 = <&ltdc_pins_sleep_a>;
+       status = "okay";
+
+       port {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               ltdc_ep0_out: endpoint@0 {
+                       reg = <0>;
+                       remote-endpoint = <&sii9022_in>;
+               };
+       };
+};
+
+&m4_rproc {
+       memory-region = <&retram>, <&mcuram>, <&mcuram2>, <&vdev0vring0>,
+                       <&vdev0vring1>, <&vdev0buffer>;
+       mboxes = <&ipcc 0>, <&ipcc 1>, <&ipcc 2>;
+       mbox-names = "vq0", "vq1", "shutdown";
+       interrupt-parent = <&exti>;
+       interrupts = <68 1>;
+       status = "okay";
+};
+
+&pwr_regulators {
+       vdd-supply = <&vdd>;
+       vdd_3v3_usbfs-supply = <&vdd_usb>;
+};
+
+&rng1 {
+       status = "okay";
+};
+
+&rtc {
+       status = "okay";
+};
+
+&sai2 {
+       clocks = <&rcc SAI2>, <&rcc PLL3_Q>, <&rcc PLL3_R>;
+       clock-names = "pclk", "x8k", "x11k";
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&sai2a_pins_a>, <&sai2b_pins_b>;
+       pinctrl-1 = <&sai2a_sleep_pins_a>, <&sai2b_sleep_pins_b>;
+       status = "okay";
+
+       sai2a: audio-controller@4400b004 {
+               #clock-cells = <0>;
+               dma-names = "tx";
+               clocks = <&rcc SAI2_K>;
+               clock-names = "sai_ck";
+               status = "okay";
+
+               sai2a_port: port {
+                       sai2a_endpoint: endpoint {
+                               remote-endpoint = <&cs42l51_tx_endpoint>;
+                               format = "i2s";
+                               mclk-fs = <256>;
+                               dai-tdm-slot-num = <2>;
+                               dai-tdm-slot-width = <32>;
+                       };
+               };
+       };
+
+       sai2b: audio-controller@4400b024 {
+               dma-names = "rx";
+               st,sync = <&sai2a 2>;
+               clocks = <&rcc SAI2_K>, <&sai2a>;
+               clock-names = "sai_ck", "MCLK";
+               status = "okay";
+
+               sai2b_port: port {
+                       sai2b_endpoint: endpoint {
+                               remote-endpoint = <&cs42l51_rx_endpoint>;
+                               format = "i2s";
+                               mclk-fs = <256>;
+                               dai-tdm-slot-num = <2>;
+                               dai-tdm-slot-width = <32>;
+                       };
+               };
+       };
+};
+
+&sdmmc1 {
+       pinctrl-names = "default", "opendrain", "sleep";
+       pinctrl-0 = <&sdmmc1_b4_pins_a>;
+       pinctrl-1 = <&sdmmc1_b4_od_pins_a>;
+       pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;
+       broken-cd;
+       st,neg-edge;
+       bus-width = <4>;
+       vmmc-supply = <&v3v3>;
+       status = "okay";
+};
+
+&sdmmc3 {
+       pinctrl-names = "default", "opendrain", "sleep";
+       pinctrl-0 = <&sdmmc3_b4_pins_a>;
+       pinctrl-1 = <&sdmmc3_b4_od_pins_a>;
+       pinctrl-2 = <&sdmmc3_b4_sleep_pins_a>;
+       broken-cd;
+       st,neg-edge;
+       bus-width = <4>;
+       vmmc-supply = <&v3v3>;
+       status = "disabled";
+};
+
+&timers1 {
+       /* spare dmas for other usage */
+       /delete-property/dmas;
+       /delete-property/dma-names;
+       status = "disabled";
+       pwm {
+               pinctrl-0 = <&pwm1_pins_a>;
+               pinctrl-1 = <&pwm1_sleep_pins_a>;
+               pinctrl-names = "default", "sleep";
+               status = "okay";
+       };
+       timer@0 {
+               status = "okay";
+       };
+};
+
+&timers3 {
+       /delete-property/dmas;
+       /delete-property/dma-names;
+       status = "disabled";
+       pwm {
+               pinctrl-0 = <&pwm3_pins_a>;
+               pinctrl-1 = <&pwm3_sleep_pins_a>;
+               pinctrl-names = "default", "sleep";
+               status = "okay";
+       };
+       timer@2 {
+               status = "okay";
+       };
+};
+
+&timers4 {
+       /delete-property/dmas;
+       /delete-property/dma-names;
+       status = "disabled";
+       pwm {
+               pinctrl-0 = <&pwm4_pins_a &pwm4_pins_b>;
+               pinctrl-1 = <&pwm4_sleep_pins_a &pwm4_sleep_pins_b>;
+               pinctrl-names = "default", "sleep";
+               status = "okay";
+       };
+       timer@3 {
+               status = "okay";
+       };
+};
+
+&timers5 {
+       /delete-property/dmas;
+       /delete-property/dma-names;
+       status = "disabled";
+       pwm {
+               pinctrl-0 = <&pwm5_pins_a>;
+               pinctrl-1 = <&pwm5_sleep_pins_a>;
+               pinctrl-names = "default", "sleep";
+               status = "okay";
+       };
+       timer@4 {
+               status = "okay";
+       };
+};
+
+&timers6 {
+       /delete-property/dmas;
+       /delete-property/dma-names;
+       status = "disabled";
+       timer@5 {
+               status = "okay";
+       };
+};
+
+&timers12 {
+       /delete-property/dmas;
+       /delete-property/dma-names;
+       status = "disabled";
+       pwm {
+               pinctrl-0 = <&pwm12_pins_a>;
+               pinctrl-1 = <&pwm12_sleep_pins_a>;
+               pinctrl-names = "default", "sleep";
+               status = "okay";
+       };
+       timer@11 {
+               status = "okay";
+       };
+};
+
+&uart4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart4_pins_a>;
+       status = "okay";
+};
+
+&usbh_ehci {
+       phys = <&usbphyc_port0>;
+       status = "okay";
+};
+
+&usbotg_hs {
+       dr_mode = "peripheral";
+       phys = <&usbphyc_port1 0>;
+       phy-names = "usb2-phy";
+       status = "okay";
+};
+
+&usbphyc {
+       status = "okay";
+};
+
+&usbphyc_port0 {
+       phy-supply = <&vdd_usb>;
+};
+
+&usbphyc_port1 {
+       phy-supply = <&vdd_usb>;
+};
+
+&vrefbuf {
+       regulator-min-microvolt = <2500000>;
+       regulator-max-microvolt = <2500000>;
+       vdda-supply = <&vdd>;
+       status = "okay";
+};
diff --git a/arch/arm/dts/stm32mp15xxaa-pinctrl.dtsi b/arch/arm/dts/stm32mp15xxaa-pinctrl.dtsi
new file mode 100644 (file)
index 0000000..04f7a43
--- /dev/null
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
+ * Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
+ */
+
+&pinctrl {
+       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 {
+       st,package = <STM32MP_PKG_AA>;
+
+       gpioz: gpio@54004000 {
+               status = "okay";
+               ngpios = <8>;
+               gpio-ranges = <&pinctrl_z 0 400 8>;
+       };
+};
diff --git a/arch/arm/dts/stm32mp15xxab-pinctrl.dtsi b/arch/arm/dts/stm32mp15xxab-pinctrl.dtsi
new file mode 100644 (file)
index 0000000..328dad1
--- /dev/null
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
+ * Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
+ */
+
+&pinctrl {
+       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/dts/stm32mp15xxac-pinctrl.dtsi b/arch/arm/dts/stm32mp15xxac-pinctrl.dtsi
new file mode 100644 (file)
index 0000000..7eaa245
--- /dev/null
@@ -0,0 +1,73 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
+ * Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
+ */
+
+&pinctrl {
+       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 {
+       st,package = <STM32MP_PKG_AC>;
+
+       gpioz: gpio@54004000 {
+               status = "okay";
+               ngpios = <8>;
+               gpio-ranges = <&pinctrl_z 0 400 8>;
+       };
+};
diff --git a/arch/arm/dts/stm32mp15xxad-pinctrl.dtsi b/arch/arm/dts/stm32mp15xxad-pinctrl.dtsi
new file mode 100644 (file)
index 0000000..b63e207
--- /dev/null
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
+ * Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
+ */
+
+&pinctrl {
+       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 9710abadcf0246d9b83872aef698fb794cc76f17..197fbd717aae165357cd14d6ebd15899e091ca8c 100644 (file)
@@ -5,7 +5,6 @@
  * Copyright (C) 2018 Xilinx, Inc.
  */
 /dts-v1/;
-#include "zynq-7000.dtsi"
 
 / {
        #address-cells = <1>;
        };
 
        amba: amba {
+               u-boot,dm-pre-reloc;
                compatible = "simple-bus";
                #address-cells = <1>;
                #size-cells = <1>;
-               interrupt-parent = <&intc>;
                ranges;
 
-               intc: interrupt-controller@f8f01000 {
-                       compatible = "arm,cortex-a9-gic";
-                       #interrupt-cells = <3>;
-                       interrupt-controller;
-                       reg = <0xF8F01000 0x1000>,
-                             <0xF8F00100 0x100>;
-               };
-
                slcr: slcr@f8000000 {
+                       u-boot,dm-pre-reloc;
                        #address-cells = <1>;
                        #size-cells = <1>;
                        compatible = "xlnx,zynq-slcr", "syscon", "simple-bus";
                        reg = <0xF8000000 0x1000>;
                        ranges;
                        clkc: clkc@100 {
+                               u-boot,dm-pre-reloc;
                                #clock-cells = <1>;
                                compatible = "xlnx,ps7-clkc";
                                clock-output-names = "armpll", "ddrpll",
                                reg = <0x100 0x100>;
                        };
                };
+
+               /*
+                * This is partially hack because it is normally subnode of smcc
+                * but for mini U-Boot there is no reason to enable SMCC driver
+                * which does almost nothing in NOR flash configuration that's
+                * why place cfi-flash directly here.
+                */
+               flash@e2000000 {
+                       u-boot,dm-pre-reloc;
+                       compatible = "cfi-flash";
+                       reg = <0xe2000000 0x2000000>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+               };
        };
 };
 
index 65af4081ff4f4c7a02d374c63da934c67aa0f4a6..eb0e29e6cb6e258ec7ff4b3e035fa5da603ff086 100644 (file)
                                spi-max-frequency = <50000000>;
                                #address-cells = <1>;
                                #size-cells = <1>;
-                               partition@qspi-fsbl-uboot {
+                               partition@0 {
                                        label = "qspi-fsbl-uboot";
                                        reg = <0x0 0x100000>;
                                };
-                               partition@qspi-linux {
+                               partition@100000 {
                                        label = "qspi-linux";
                                        reg = <0x100000 0x500000>;
                                };
-                               partition@qspi-device-tree {
+                               partition@600000 {
                                        label = "qspi-device-tree";
                                        reg = <0x600000 0x20000>;
                                };
-                               partition@qspi-rootfs {
+                               partition@620000 {
                                        label = "qspi-rootfs";
                                        reg = <0x620000 0x5E0000>;
                                };
-                               partition@qspi-bitstream {
+                               partition@c00000 {
                                        label = "qspi-bitstream";
                                        reg = <0xC00000 0x400000>;
                                };
index f6f10fe1a15d96b88ee9e0c688448f9bcb863d4c..ab6bde95fed933378a3d78ff950c62a88d1c66a7 100644 (file)
                spi-max-frequency = <100000000>;
                #address-cells = <1>;
                #size-cells = <1>;
-               partition@qspi-u-boot-spl {
+               partition@0 {
                        label = "qspi-u-boot-spl";
                        reg = <0x00000 0x10000>;
                };
-               partition@qspi-u-boot-img {
+               partition@10000 {
                        label = "qspi-u-boot-img";
                        reg = <0x10000 0x60000>;
                };
-               partition@qspi-device-tree {
+               partition@70000 {
                        label = "qspi-device-tree";
                        reg = <0x70000 0x10000>;
                };
-               partition@qspi-linux {
+               partition@80000 {
                        label = "qspi-linux";
                        reg = <0x80000 0x400000>;
                };
-               partition@qspi-rootfs {
+               partition@480000 {
                        label = "qspi-rootfs";
                        reg = <0x480000 0x1b80000>;
                };
index d10695740fa9ec58e14cd70d6cb46813fb59802e..b043d341d68067b63b5424cd1d0b89a55632e392 100644 (file)
                        #address-cells = <1>;
                        #size-cells = <0>;
                        reg = <7>;
-                       hwmon@52 {
+                       hwmon@34 {
                                compatible = "ti,ucd9248";
-                               reg = <52>;
+                               reg = <0x34>;
                        };
-                       hwmon@53 {
+                       hwmon@35 {
                                compatible = "ti,ucd9248";
-                               reg = <53>;
+                               reg = <0x35>;
                        };
-                       hwmon@54 {
+                       hwmon@36 {
                                compatible = "ti,ucd9248";
-                               reg = <54>;
+                               reg = <0x36>;
                        };
                };
        };
index e1f34653ec3cc79eabd2f088506269ac091565e5..c547d7921d9ce35ca1fd04fa6d1f5c2533fa35c0 100644 (file)
@@ -72,7 +72,7 @@
        status = "okay";
        num-cs = <4>;
        is-decoded-cs = <0>;
-       flash@0 {
+       flash@1 {
                compatible = "sst25wf080", "jedec,spi-nor";
                reg = <1>;
                spi-max-frequency = <1000000>;
deleted file mode 120000 (symlink)
index 5bd6af39a437e5dd72e49a326ed8aed914cd4f0a..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1 +0,0 @@
-zynq-zc770-xm011.dts
\ No newline at end of file
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..6ff8393d7ebec8fdcbd252af78deab4e72ce470f
--- /dev/null
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Xilinx ZC770 XM011 board DTS with NAND x16
+ *
+ * Copyright (C) 2013-2018 Xilinx, Inc.
+ */
+#include "zynq-zc770-xm011.dts"
+
+/ {
+       model = "Xilinx ZC770 XM011 board (NAND x16)";
+};
index 61482017d65ca904c4b3f3b4839b179410c0ff84..b6e3e255d731ce50c73372c079669231f05e0a4f 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0+
 /*
- * Xilinx ZC770 XM013 board DTS
+ * Xilinx ZC770 XM011 board DTS
  *
  * Copyright (C) 2013-2018 Xilinx, Inc.
  */
index 05a49982cc4b9877b139bb807131cabeb7c836a9..bdf0c2f956d1eca65c2fb312c3ed22d6d3ed6175 100644 (file)
@@ -67,7 +67,7 @@
        status = "okay";
        num-cs = <4>;
        is-decoded-cs = <0>;
-       eeprom: eeprom@0 {
+       eeprom: eeprom@2 {
                at25,byte-len = <8192>;
                at25,addr-mode = <2>;
                at25,page-size = <32>;
index cc41efcb4631af36bab3cbfb7d21bd316d36089b..600e8ee0255cea6f41b26dddac6e1bfb2a8533df 100644 (file)
@@ -54,7 +54,7 @@
                        label = "K1";
                        gpios = <&gpio0 0x32 0x1>;
                        linux,code = <0x66>;
-                       gpio-key,wakeup;
+                       wakeup-source;
                        autorepeat;
                };
        };
index 8eacd22d7cdacc818f37879dffc1b385dc483643..b02ef22abd205a74d9d529555aa2a7515424e5ab 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * Clock specification for Xilinx ZynqMP
  *
- * (C) Copyright 2017 - 2019, Xilinx, Inc.
+ * (C) Copyright 2017 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
        clocks = <&zynqmp_clk AMS_REF>;
 };
 
+&zynqmp_dpsub {
+       clocks = <&dp_aclk>, <&zynqmp_clk DP_AUDIO_REF>, <&zynqmp_clk DP_VIDEO_REF>;
+};
+
 &xlnx_dpdma {
        clocks = <&zynqmp_clk DPDMA_REF>;
 };
 
-&xlnx_dp_snd_codec0 {
+&zynqmp_dp_snd_codec0 {
        clocks = <&zynqmp_clk DP_AUDIO_REF>;
 };
+
+&zynqmp_pcap {
+       clocks = <&zynqmp_clk PCAP>;
+};
diff --git a/arch/arm/dts/zynqmp-clk.dtsi b/arch/arm/dts/zynqmp-clk.dtsi
deleted file mode 100644 (file)
index c9464ec..0000000
+++ /dev/null
@@ -1,244 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Clock specification for Xilinx ZynqMP
- *
- * (C) Copyright 2015 - 2018, Xilinx, Inc.
- *
- * Michal Simek <michal.simek@xilinx.com>
- */
-
-/ {
-       clk100: clk100 {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <100000000>;
-               u-boot,dm-pre-reloc;
-       };
-
-       clk125: clk125 {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <125000000>;
-       };
-
-       clk200: clk200 {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <200000000>;
-               u-boot,dm-pre-reloc;
-       };
-
-       clk250: clk250 {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <250000000>;
-       };
-
-       clk300: clk300 {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <300000000>;
-               u-boot,dm-pre-reloc;
-       };
-
-       clk600: clk600 {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <600000000>;
-       };
-
-       dp_aclk: clock0 {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <100000000>;
-               clock-accuracy = <100>;
-       };
-
-       dp_aud_clk: clock1 {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <24576000>;
-               clock-accuracy = <100>;
-       };
-
-       dpdma_clk: dpdma-clk {
-               compatible = "fixed-clock";
-               #clock-cells = <0x0>;
-               clock-frequency = <533000000>;
-       };
-
-       drm_clock: drm-clock {
-               compatible = "fixed-clock";
-               #clock-cells = <0x0>;
-               clock-frequency = <262750000>;
-               clock-accuracy = <0x64>;
-       };
-};
-
-&can0 {
-       clocks = <&clk100 &clk100>;
-};
-
-&can1 {
-       clocks = <&clk100 &clk100>;
-};
-
-&fpd_dma_chan1 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&fpd_dma_chan2 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&fpd_dma_chan3 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&fpd_dma_chan4 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&fpd_dma_chan5 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&fpd_dma_chan6 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&fpd_dma_chan7 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&fpd_dma_chan8 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&lpd_dma_chan1 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&lpd_dma_chan2 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&lpd_dma_chan3 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&lpd_dma_chan4 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&lpd_dma_chan5 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&lpd_dma_chan6 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&lpd_dma_chan7 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&lpd_dma_chan8 {
-       clocks = <&clk600>, <&clk100>;
-};
-
-&nand0 {
-       clocks = <&clk100 &clk100>;
-};
-
-&gem0 {
-       clocks = <&clk125>, <&clk125>, <&clk125>;
-};
-
-&gem1 {
-       clocks = <&clk125>, <&clk125>, <&clk125>;
-};
-
-&gem2 {
-       clocks = <&clk125>, <&clk125>, <&clk125>;
-};
-
-&gem3 {
-       clocks = <&clk125>, <&clk125>, <&clk125>;
-};
-
-&gpio {
-       clocks = <&clk100>;
-};
-
-&i2c0 {
-       clocks = <&clk100>;
-};
-
-&i2c1 {
-       clocks = <&clk100>;
-};
-
-&qspi {
-       clocks = <&clk300 &clk300>;
-};
-
-&sata {
-       clocks = <&clk250>;
-};
-
-&sdhci0 {
-       clocks = <&clk200 &clk200>;
-};
-
-&sdhci1 {
-       clocks = <&clk200 &clk200>;
-};
-
-&spi0 {
-       clocks = <&clk200 &clk200>;
-};
-
-&spi1 {
-       clocks = <&clk200 &clk200>;
-};
-
-&uart0 {
-       clocks = <&clk100 &clk100>;
-};
-
-&uart1 {
-       clocks = <&clk100 &clk100>;
-};
-
-&usb0 {
-       clocks = <&clk250>, <&clk250>;
-};
-
-&usb1 {
-       clocks = <&clk250>, <&clk250>;
-};
-
-&watchdog0 {
-       clocks = <&clk100>;
-};
-
-&lpd_watchdog {
-       clocks = <&clk250>;
-};
-
-&xilinx_drm {
-       clocks = <&drm_clock>;
-};
-
-&xlnx_dp {
-       clocks = <&dp_aclk>, <&dp_aud_clk>;
-};
-
-&xlnx_dpdma {
-       clocks = <&dpdma_clk>;
-};
-
-&xlnx_dp_snd_codec0 {
-       clocks = <&dp_aud_clk>;
-};
index e4ba5ae9b6832d655fc2cb64da0b6db8ff5f1b00..c523e81236667c37747be0bd5dcef916ffe2d82d 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP Mini Configuration
  *
- * (C) Copyright 2015 - 2018, Xilinx, Inc.
+ * (C) Copyright 2015 - 2020, Xilinx, Inc.
  *
  * Siva Durga Prasad <siva.durga.paladugu@xilinx.com>
  * Michal Simek <michal.simek@xilinx.com>
index 6117f83c474e89cf4cf74c615b00dcba1cb4591a..afb3e96520b83fcd472757643e4bded2a0f21b14 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZC1232
  *
- * (C) Copyright 2017 - 2018, Xilinx, Inc.
+ * (C) Copyright 2017 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <4>;
                spi-max-frequency = <108000000>; /* Based on DC1 spec */
-               partition@qspi-fsbl-uboot { /* for testing purpose */
+               partition@0 { /* for testing purpose */
                        label = "qspi-fsbl-uboot";
                        reg = <0x0 0x100000>;
                };
-               partition@qspi-linux { /* for testing purpose */
+               partition@100000 { /* for testing purpose */
                        label = "qspi-linux";
                        reg = <0x100000 0x500000>;
                };
-               partition@qspi-device-tree { /* for testing purpose */
+               partition@600000 { /* for testing purpose */
                        label = "qspi-device-tree";
                        reg = <0x600000 0x20000>;
                };
-               partition@qspi-rootfs { /* for testing purpose */
+               partition@620000 { /* for testing purpose */
                        label = "qspi-rootfs";
                        reg = <0x620000 0x5E0000>;
                };
index 6ac8346d23d913e4c66ff50a7928442176acaca9..9cc1c0c6c5a7195fd57a5cb4f5a782d3205279d8 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZC1254
  *
- * (C) Copyright 2015 - 2018, Xilinx, Inc.
+ * (C) Copyright 2015 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  * Siva Durga Prasad Paladugu <sivadur@xilinx.com>
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <4>; /* FIXME also DUAL configuration possible */
                spi-max-frequency = <108000000>; /* Based on DC1 spec */
-               partition@qspi-fsbl-uboot { /* for testing purpose */
+               partition@0 { /* for testing purpose */
                        label = "qspi-fsbl-uboot";
                        reg = <0x0 0x100000>;
                };
-               partition@qspi-linux { /* for testing purpose */
+               partition@100000 { /* for testing purpose */
                        label = "qspi-linux";
                        reg = <0x100000 0x500000>;
                };
-               partition@qspi-device-tree { /* for testing purpose */
+               partition@600000 { /* for testing purpose */
                        label = "qspi-device-tree";
                        reg = <0x600000 0x20000>;
                };
-               partition@qspi-rootfs { /* for testing purpose */
+               partition@620000 { /* for testing purpose */
                        label = "qspi-rootfs";
                        reg = <0x620000 0x5E0000>;
                };
index bb6a94eefb8fdfe5cdf62f15476204916e9a4506..0805b93c4ac953c511d0d40934b5ed0957afcc06 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP zc1751-xm015-dc1
  *
- * (C) Copyright 2015 - 2018, Xilinx, Inc.
+ * (C) Copyright 2015 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <4>;
                spi-max-frequency = <108000000>; /* Based on DC1 spec */
-               partition@qspi-fsbl-uboot { /* for testing purpose */
+               partition@0 { /* for testing purpose */
                        label = "qspi-fsbl-uboot";
                        reg = <0x0 0x100000>;
                };
-               partition@qspi-linux { /* for testing purpose */
+               partition@100000 { /* for testing purpose */
                        label = "qspi-linux";
                        reg = <0x100000 0x500000>;
                };
-               partition@qspi-device-tree { /* for testing purpose */
+               partition@600000 { /* for testing purpose */
                        label = "qspi-device-tree";
                        reg = <0x600000 0x20000>;
                };
-               partition@qspi-rootfs { /* for testing purpose */
+               partition@620000 { /* for testing purpose */
                        label = "qspi-rootfs";
                        reg = <0x620000 0x5E0000>;
                };
 /* SD1 with level shifter */
 &sdhci1 {
        status = "okay";
-       no-1-8-v;       /* for 1.0 silicon */
+       /*
+        * This property should be removed for supporting UHS mode
+        */
+       no-1-8-v;
        xlnx,mio_bank = <1>;
 };
 
        dr_mode = "host";
 };
 
-&xilinx_drm {
+&zynqmp_dpsub {
        status = "okay";
 };
 
-&xlnx_dp {
+&zynqmp_dp_snd_pcm0 {
        status = "okay";
 };
 
-&xlnx_dp_sub {
+&zynqmp_dp_snd_pcm1 {
        status = "okay";
-       xlnx,vid-clk-pl;
 };
 
-&xlnx_dp_snd_pcm0 {
+&zynqmp_dp_snd_card0 {
        status = "okay";
 };
 
-&xlnx_dp_snd_pcm1 {
-       status = "okay";
-};
-
-&xlnx_dp_snd_card {
-       status = "okay";
-};
-
-&xlnx_dp_snd_codec0 {
+&zynqmp_dp_snd_codec0 {
        status = "okay";
 };
 
index 1cc8aaa879761d62d6d82781dc628dd33d054afa..92d938d665d20ad6ccd9b7bdf5c0eda7887f0e4f 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP zc1751-xm016-dc2
  *
- * (C) Copyright 2015 - 2018, Xilinx, Inc.
+ * (C) Copyright 2015 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
                reg = <0>;
 
                partition@0 {
-                       label = "data";
+                       label = "spi0-data";
                        reg = <0x0 0x100000>;
                };
        };
                reg = <0>;
 
                partition@0 {
-                       label = "data";
+                       label = "spi1-data";
                        reg = <0x0 0x84000>;
                };
        };
index 2ead8dd24d57a6327f1c1bdedefd0a0ecd3be72d..c7de59e1e986ae78913ea8f0d8446a3ed1b4cd27 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP zc1751-xm017-dc3
  *
- * (C) Copyright 2016 - 2018, Xilinx, Inc.
+ * (C) Copyright 2016 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
index 84c2904dc202a59e2fcdb47f367140fa3657e156..9b38b8b919e2114cbfc78c8025659c2d6978d5c1 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP zc1751-xm018-dc4
  *
- * (C) Copyright 2015 - 2018, Xilinx, Inc.
+ * (C) Copyright 2015 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
        status = "okay";
 };
 
-&xlnx_dp {
+&zynqmp_dpsub {
        status = "okay";
 };
 
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <4>; /* also DUAL configuration possible */
                spi-max-frequency = <108000000>; /* Based on DC1 spec */
-               partition@qspi-fsbl-uboot { /* for testing purpose */
+               partition@0 { /* for testing purpose */
                        label = "qspi-fsbl-uboot";
                        reg = <0x0 0x100000>;
                };
-               partition@qspi-linux { /* for testing purpose */
+               partition@100000 { /* for testing purpose */
                        label = "qspi-linux";
                        reg = <0x100000 0x500000>;
                };
-               partition@qspi-device-tree { /* for testing purpose */
+               partition@600000 { /* for testing purpose */
                        label = "qspi-device-tree";
                        reg = <0x600000 0x20000>;
                };
-               partition@qspi-rootfs { /* for testing purpose */
+               partition@620000 { /* for testing purpose */
                        label = "qspi-rootfs";
                        reg = <0x620000 0x5E0000>;
                };
index 12c0173c55998e7fb6c4d3a38be45d7e19b4dafc..8d8ebeaac3bf806b36eed36aa983634e7ce63251 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP zc1751-xm019-dc5
  *
- * (C) Copyright 2015 - 2018, Xilinx, Inc.
+ * (C) Copyright 2015 - 2020, Xilinx, Inc.
  *
  * Siva Durga Prasad <siva.durga.paladugu@xilinx.com>
  * Michal Simek <michal.simek@xilinx.com>
index 21118c8cc34acdd00e613eca627be018657a79ed..1726edf78ed23a64decc9a9e894526c11c339747 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZCU100 revC
  *
- * (C) Copyright 2016 - 2018, Xilinx, Inc.
+ * (C) Copyright 2016 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  * Nathalie Chan King Choy
index 6c702f2674e3d52a012b62ddd749faeb98f0ec71..d508f3359943f198f15b7ed65ef27a4124bb3faa 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZCU102 Rev1.0
  *
- * (C) Copyright 2016 - 2018, Xilinx, Inc.
+ * (C) Copyright 2016 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
@@ -34,7 +34,3 @@
                reg = <0xe0 0x3>;
        };
 };
-
-&sdhci1 {
-       /delete-property/ no-1-8-v;
-};
diff --git a/arch/arm/dts/zynqmp-zcu102-rev1.1.dts b/arch/arm/dts/zynqmp-zcu102-rev1.1.dts
new file mode 100644 (file)
index 0000000..b679839
--- /dev/null
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * dts file for Xilinx ZynqMP ZCU102 Rev1.1
+ *
+ * (C) Copyright 2016 - 2020, Xilinx, Inc.
+ *
+ * Michal Simek <michal.simek@xilinx.com>
+ */
+
+#include "zynqmp-zcu102-rev1.0.dts"
+
+/ {
+       model = "ZynqMP ZCU102 Rev1.1";
+       compatible = "xlnx,zynqmp-zcu102-rev1.1", "xlnx,zynqmp-zcu102", "xlnx,zynqmp";
+};
index b580f9263d0225036665312c1e46e5ea631a0a11..d250681600a85cc1a29b9a980308f8a541e22c20 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZCU102 RevA
  *
- * (C) Copyright 2015 - 2018, Xilinx, Inc.
+ * (C) Copyright 2015 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <4>; /* FIXME also DUAL configuration possible */
                spi-max-frequency = <108000000>; /* Based on DC1 spec */
-               partition@qspi-fsbl-uboot { /* for testing purpose */
+               partition@0 { /* for testing purpose */
                        label = "qspi-fsbl-uboot";
                        reg = <0x0 0x100000>;
                };
-               partition@qspi-linux { /* for testing purpose */
+               partition@100000 { /* for testing purpose */
                        label = "qspi-linux";
                        reg = <0x100000 0x500000>;
                };
-               partition@qspi-device-tree { /* for testing purpose */
+               partition@600000 { /* for testing purpose */
                        label = "qspi-device-tree";
                        reg = <0x600000 0x20000>;
                };
-               partition@qspi-rootfs { /* for testing purpose */
+               partition@620000 { /* for testing purpose */
                        label = "qspi-rootfs";
                        reg = <0x620000 0x5E0000>;
                };
 /* SD1 with level shifter */
 &sdhci1 {
        status = "okay";
-       no-1-8-v;       /* for 1.0 silicon */
+       /*
+        * 1.0 revision has level shifter and this property should be
+        * removed for supporting UHS mode
+        */
+       no-1-8-v;
        xlnx,mio_bank = <1>;
 };
 
        status = "okay";
 };
 
-&xilinx_drm {
+&zynqmp_dpsub {
        status = "okay";
-       clocks = <&si570_1>;
 };
 
-&xlnx_dp {
+&zynqmp_dp_snd_codec0 {
        status = "okay";
 };
 
-&xlnx_dp_sub {
+&zynqmp_dp_snd_pcm0 {
        status = "okay";
-       xlnx,vid-clk-pl;
 };
 
-&xlnx_dp_snd_pcm0 {
+&zynqmp_dp_snd_pcm1 {
        status = "okay";
 };
 
-&xlnx_dp_snd_pcm1 {
-       status = "okay";
-};
-
-&xlnx_dp_snd_card {
-       status = "okay";
-};
-
-&xlnx_dp_snd_codec0 {
+&zynqmp_dp_snd_card0 {
        status = "okay";
 };
 
index 38ec18816456e7162d7efe5eddcbe68d8325f727..2422558b7484ba12c6b844aad779800bee93d19d 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZCU102 RevB
  *
- * (C) Copyright 2016 - 2018, Xilinx, Inc.
+ * (C) Copyright 2016 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
index 82557c88d21c24ade7660464cacaf43901f414bf..3ceb39dce02babdaa9d3c0e9b9cf495387f574a8 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZCU104
  *
- * (C) Copyright 2017 - 2018, Xilinx, Inc.
+ * (C) Copyright 2017 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <4>;
                spi-max-frequency = <108000000>; /* Based on DC1 spec */
-               partition@qspi-fsbl-uboot { /* for testing purpose */
+               partition@0 { /* for testing purpose */
                        label = "qspi-fsbl-uboot";
                        reg = <0x0 0x100000>;
                };
-               partition@qspi-linux { /* for testing purpose */
+               partition@100000 { /* for testing purpose */
                        label = "qspi-linux";
                        reg = <0x100000 0x500000>;
                };
-               partition@qspi-device-tree { /* for testing purpose */
+               partition@600000 { /* for testing purpose */
                        label = "qspi-device-tree";
                        reg = <0x600000 0x20000>;
                };
-               partition@qspi-rootfs { /* for testing purpose */
+               partition@620000 { /* for testing purpose */
                        label = "qspi-rootfs";
                        reg = <0x620000 0x5E0000>;
                };
index e0e7dac010c54cbb9b301f66c401719b8563327a..7dad4523deb0b43a5e3b9f89a230cac6ed45b79e 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZCU104
  *
- * (C) Copyright 2017 - 2018, Xilinx, Inc.
+ * (C) Copyright 2017 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <4>;
                spi-max-frequency = <108000000>; /* Based on DC1 spec */
-               partition@qspi-fsbl-uboot { /* for testing purpose */
+               partition@0 { /* for testing purpose */
                        label = "qspi-fsbl-uboot";
                        reg = <0x0 0x100000>;
                };
-               partition@qspi-linux { /* for testing purpose */
+               partition@100000 { /* for testing purpose */
                        label = "qspi-linux";
                        reg = <0x100000 0x500000>;
                };
-               partition@qspi-device-tree { /* for testing purpose */
+               partition@600000 { /* for testing purpose */
                        label = "qspi-device-tree";
                        reg = <0x600000 0x20000>;
                };
-               partition@qspi-rootfs { /* for testing purpose */
+               partition@620000 { /* for testing purpose */
                        label = "qspi-rootfs";
                        reg = <0x620000 0x5E0000>;
                };
index d31982fce784bae7274383f0d079126e09199d06..221685fd23bee46c303d27e0acba175966a6a51f 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZCU106
  *
- * (C) Copyright 2016, Xilinx, Inc.
+ * (C) Copyright 2016 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <4>; /* FIXME also DUAL configuration possible */
                spi-max-frequency = <108000000>; /* Based on DC1 spec */
-               partition@qspi-fsbl-uboot { /* for testing purpose */
+               partition@0 { /* for testing purpose */
                        label = "qspi-fsbl-uboot";
                        reg = <0x0 0x100000>;
                };
-               partition@qspi-linux { /* for testing purpose */
+               partition@100000 { /* for testing purpose */
                        label = "qspi-linux";
                        reg = <0x100000 0x500000>;
                };
-               partition@qspi-device-tree { /* for testing purpose */
+               partition@600000 { /* for testing purpose */
                        label = "qspi-device-tree";
                        reg = <0x600000 0x20000>;
                };
-               partition@qspi-rootfs { /* for testing purpose */
+               partition@620000 { /* for testing purpose */
                        label = "qspi-rootfs";
                        reg = <0x620000 0x5E0000>;
                };
 /* SD1 with level shifter */
 &sdhci1 {
        status = "okay";
+       /*
+        * This property should be removed for supporting UHS mode
+        */
+       no-1-8-v;
        xlnx,mio_bank = <1>;
 };
 
index bff224f78d1d781e99d1118d686210e0c235af14..d16bf8ac7ac7b68401effc61964ffc85dd03b105 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZCU111
  *
- * (C) Copyright 2017 - 2018, Xilinx, Inc.
+ * (C) Copyright 2017 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <4>; /* FIXME also DUAL configuration possible */
                spi-max-frequency = <108000000>; /* Based on DC1 spec */
-               partition@qspi-fsbl-uboot { /* for testing purpose */
+               partition@0 { /* for testing purpose */
                        label = "qspi-fsbl-uboot";
                        reg = <0x0 0x100000>;
                };
-               partition@qspi-linux { /* for testing purpose */
+               partition@100000 { /* for testing purpose */
                        label = "qspi-linux";
                        reg = <0x100000 0x500000>;
                };
-               partition@qspi-device-tree { /* for testing purpose */
+               partition@600000 { /* for testing purpose */
                        label = "qspi-device-tree";
                        reg = <0x600000 0x20000>;
                };
-               partition@qspi-rootfs { /* for testing purpose */
+               partition@620000 { /* for testing purpose */
                        label = "qspi-rootfs";
                        reg = <0x620000 0x5E0000>;
                };
 &sdhci1 {
        status = "okay";
        disable-wp;
+       /*
+        * This property should be removed for supporting UHS mode
+        */
+       no-1-8-v;
        xlnx,mio_bank = <1>;
 };
 
index c22de576a5869f59fc24a0082987455045de7a07..cdd5c341878ff83172920e55b28edc75859a240a 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZCU1275
  *
- * (C) Copyright 2017 - 2018, Xilinx, Inc.
+ * (C) Copyright 2017 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  * Siva Durga Prasad Paladugu <sivadur@xilinx.com>
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <4>; /* FIXME also DUAL configuration possible */
                spi-max-frequency = <108000000>; /* Based on DC1 spec */
-               partition@qspi-fsbl-uboot { /* for testing purpose */
+               partition@0 { /* for testing purpose */
                        label = "qspi-fsbl-uboot";
                        reg = <0x0 0x100000>;
                };
-               partition@qspi-linux { /* for testing purpose */
+               partition@100000 { /* for testing purpose */
                        label = "qspi-linux";
                        reg = <0x100000 0x500000>;
                };
-               partition@qspi-device-tree { /* for testing purpose */
+               partition@600000 { /* for testing purpose */
                        label = "qspi-device-tree";
                        reg = <0x600000 0x20000>;
                };
-               partition@qspi-rootfs { /* for testing purpose */
+               partition@620000 { /* for testing purpose */
                        label = "qspi-rootfs";
                        reg = <0x620000 0x5E0000>;
                };
index 2ec29b0b5d11a30f98971c6e0916346db6989f6f..430fc5adb4239fc511f017aad976139b92453ebb 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZCU1275 RevB
  *
- * (C) Copyright 2018, Xilinx, Inc.
+ * (C) Copyright 2018 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  * Siva Durga Prasad Paladugu <sivadur@xilinx.com>
                spi-tx-bus-width = <1>;
                spi-rx-bus-width = <1>;
                spi-max-frequency = <108000000>; /* Based on DC1 spec */
-               partition@qspi-fsbl-uboot { /* for testing purpose */
+               partition@0 { /* for testing purpose */
                        label = "qspi-fsbl-uboot";
                        reg = <0x0 0x100000>;
                };
-               partition@qspi-linux { /* for testing purpose */
+               partition@100000 { /* for testing purpose */
                        label = "qspi-linux";
                        reg = <0x100000 0x500000>;
                };
-               partition@qspi-device-tree { /* for testing purpose */
+               partition@600000 { /* for testing purpose */
                        label = "qspi-device-tree";
                        reg = <0x600000 0x20000>;
                };
-               partition@qspi-rootfs { /* for testing purpose */
+               partition@620000 { /* for testing purpose */
                        label = "qspi-rootfs";
                        reg = <0x620000 0x5E0000>;
                };
index 9c1801313889995b8cf46044b7d6c7e92bb900e4..d8b9cb1a9e1300586b2143e541a04b6ab2814ba8 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZCU1285 RevA
  *
- * (C) Copyright 2018 - 2019, Xilinx, Inc.
+ * (C) Copyright 2018 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  * Siva Durga Prasad Paladugu <sivadur@xilinx.com>
 
 &sdhci1 {
        status = "okay";
+       /*
+        * This property should be removed for supporting UHS mode
+        */
+       no-1-8-v;
        xlnx,mio_bank = <1>;
 };
index 9181060b893a9b995e6c5e4c437709b349b5f5d0..75ecd7a5c203e31ad5596f8851e960379942e104 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZCU208
  *
- * (C) Copyright 2017 - 2019, Xilinx, Inc.
+ * (C) Copyright 2017 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
@@ -50,7 +50,7 @@
                        label = "sw19";
                        gpios = <&gpio 22 GPIO_ACTIVE_HIGH>;
                        linux,code = <KEY_DOWN>;
-                       gpio-key,wakeup;
+                       wakeup-source;
                        autorepeat;
                };
        };
 &sdhci1 {
        status = "okay";
        disable-wp;
+       /*
+        * This property should be removed for supporting UHS mode
+        */
+       no-1-8-v;
        xlnx,mio_bank = <1>;
 };
 
index c294e1b51a22e9cdb25ec42b76ba07b53b0a9df7..f3b5edfeb4234f1ea3a8036f41a4182a3ea4c587 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP ZCU216
  *
- * (C) Copyright 2017 - 2019, Xilinx, Inc.
+ * (C) Copyright 2017 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  */
@@ -50,7 +50,7 @@
                        label = "sw19";
                        gpios = <&gpio 22 GPIO_ACTIVE_HIGH>;
                        linux,code = <KEY_DOWN>;
-                       gpio-key,wakeup;
+                       wakeup-source;
                        autorepeat;
                };
        };
 &sdhci1 {
        status = "okay";
        disable-wp;
+       /*
+        * This property should be removed for supporting UHS mode
+        */
+       no-1-8-v;
        xlnx,mio_bank = <1>;
 };
 
index 9e7fae83f787f444c8c459cceb45c0dbd47c056e..1634af0bd8960f15b3c56f59f289435c2c0d2424 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * dts file for Xilinx ZynqMP
  *
- * (C) Copyright 2014 - 2015, Xilinx, Inc.
+ * (C) Copyright 2014 - 2020, Xilinx, Inc.
  *
  * Michal Simek <michal.simek@xilinx.com>
  *
                        #power-domain-cells = <0x1>;
                        u-boot,dm-pre-reloc;
 
+                       zynqmp_pcap: pcap {
+                               compatible = "xlnx,zynqmp-pcap-fpga";
+                               clock-names = "ref_clk";
+                       };
+
                        zynqmp_power: zynqmp-power {
                                u-boot,dm-pre-reloc;
                                compatible = "xlnx,zynqmp-power";
                                compatible = "xlnx,zynqmp-reset";
                                #reset-cells = <1>;
                        };
+
+                       pinctrl0: pinctrl {
+                               compatible = "xlnx,zynqmp-pinctrl";
+                               status = "disabled";
+                       };
                };
        };
 
 
        fpga_full: fpga-full {
                compatible = "fpga-region";
-               fpga-mgr = <&pcap>;
+               fpga-mgr = <&zynqmp_pcap>;
                #address-cells = <2>;
                #size-cells = <2>;
+               ranges;
        };
 
        nvmem_firmware {
                };
        };
 
-       pcap: pcap {
-               compatible = "xlnx,zynqmp-pcap-fpga";
-       };
-
-       rst: reset-controller {
-               compatible = "xlnx,zynqmp-reset";
-               #reset-cells = <1>;
-       };
-
-       xlnx_dp_snd_card: dp_snd_card {
-               compatible = "xlnx,dp-snd-card";
-               status = "disabled";
-               xlnx,dp-snd-pcm = <&xlnx_dp_snd_pcm0>, <&xlnx_dp_snd_pcm1>;
-               xlnx,dp-snd-codec = <&xlnx_dp_snd_codec0>;
-       };
-
-       xlnx_dp_snd_codec0: dp_snd_codec0 {
-               compatible = "xlnx,dp-snd-codec";
-               status = "disabled";
-               clock-names = "aud_clk";
-       };
-
-       xlnx_dp_snd_pcm0: dp_snd_pcm0 {
-               compatible = "xlnx,dp-snd-pcm";
-               status = "disabled";
-               dmas = <&xlnx_dpdma 4>;
-               dma-names = "tx";
-       };
-
-       xlnx_dp_snd_pcm1: dp_snd_pcm1 {
-               compatible = "xlnx,dp-snd-pcm";
-               status = "disabled";
-               dmas = <&xlnx_dpdma 5>;
-               dma-names = "tx";
-       };
-
-       xilinx_drm: xilinx_drm {
-               compatible = "xlnx,drm";
-               status = "disabled";
-               xlnx,encoder-slave = <&xlnx_dp>;
-               xlnx,connector-type = "DisplayPort";
-               xlnx,dp-sub = <&xlnx_dp_sub>;
-               planes {
-                       xlnx,pixel-format = "rgb565";
-                       plane0 {
-                               dmas = <&xlnx_dpdma 3>;
-                               dma-names = "dma0";
-                       };
-                       plane1 {
-                               dmas = <&xlnx_dpdma 0>,
-                                       <&xlnx_dpdma 1>,
-                                       <&xlnx_dpdma 2>;
-                               dma-names = "dma0", "dma1", "dma2";
-                       };
-               };
-       };
-
        amba_apu: amba-apu@0 {
                compatible = "simple-bus";
                #address-cells = <2>;
                ranges = <0 0 0 0 0xffffffff>;
 
                gic: interrupt-controller@f9010000 {
-                       compatible = "arm,gic-400", "arm,cortex-a15-gic";
+                       compatible = "arm,gic-400";
                        #interrupt-cells = <3>;
                        reg = <0x0 0xf9010000 0x10000>,
                              <0x0 0xf9020000 0x20000>,
                        power-domains = <&zynqmp_firmware PD_SD_0>;
                        nvmem-cells = <&soc_revision>;
                        nvmem-cell-names = "soc_revision";
+                       #clock-cells = <1>;
+                       clock-output-names = "clk_out_sd0", "clk_in_sd0";
                };
 
                sdhci1: mmc@ff170000 {
                        power-domains = <&zynqmp_firmware PD_SD_1>;
                        nvmem-cells = <&soc_revision>;
                        nvmem-cell-names = "soc_revision";
-               };
-
-               pinctrl0: pinctrl@ff180000 {
-                       compatible = "xlnx,pinctrl-zynqmp";
-                       status = "disabled";
-                       reg = <0x0 0xff180000 0x0 0x1000>;
+                       #clock-cells = <1>;
+                       clock-output-names = "clk_out_sd1", "clk_in_sd1";
                };
 
                smmu: smmu@fd800000 {
                        };
                };
 
-               xlnx_dp: dp@fd4a0000 {
-                       compatible = "xlnx,v-dp";
-                       status = "disabled";
-                       reg = <0x0 0xfd4a0000 0x0 0x1000>;
-                       interrupts = <0 119 4>;
-                       interrupt-parent = <&gic>;
-                       clock-names = "aclk", "aud_clk";
-                       xlnx,dp-version = "v1.2";
-                       xlnx,max-lanes = <2>;
-                       xlnx,max-link-rate = <540000>;
-                       xlnx,max-bpc = <16>;
-                       xlnx,enable-ycrcb;
-                       xlnx,colormetry = "rgb";
-                       xlnx,bpc = <8>;
-                       xlnx,audio-chan = <2>;
-                       xlnx,dp-sub = <&xlnx_dp_sub>;
-                       xlnx,max-pclock-frequency = <300000>;
-               };
-
-               xlnx_dp_sub: dp_sub@fd4aa000 {
-                       compatible = "xlnx,dp-sub";
-                       status = "disabled";
-                       reg = <0x0 0xfd4aa000 0x0 0x1000>,
-                             <0x0 0xfd4ab000 0x0 0x1000>,
-                             <0x0 0xfd4ac000 0x0 0x1000>;
-                       reg-names = "blend", "av_buf", "aud";
-                       xlnx,output-fmt = "rgb";
-                       xlnx,vid-fmt = "yuyv";
-                       xlnx,gfx-fmt = "rgb565";
-               };
-
                xlnx_dpdma: dma@fd4c0000 {
                        compatible = "xlnx,dpdma";
                        status = "disabled";
                                compatible = "xlnx,audio1";
                        };
                };
+
+               zynqmp_dpsub: zynqmp-display@fd4a0000 {
+                       compatible = "xlnx,zynqmp-dpsub-1.7";
+                       status = "disabled";
+                       reg = <0x0 0xfd4a0000 0x0 0x1000>,
+                             <0x0 0xfd4aa000 0x0 0x1000>,
+                             <0x0 0xfd4ab000 0x0 0x1000>,
+                             <0x0 0xfd4ac000 0x0 0x1000>;
+                       reg-names = "dp", "blend", "av_buf", "aud";
+                       interrupts = <0 119 4>;
+                       interrupt-parent = <&gic>;
+
+                       clock-names = "dp_apb_clk", "dp_aud_clk",
+                                     "dp_vtc_pixel_clk_in";
+
+                       power-domains = <&zynqmp_firmware PD_DP>;
+
+                       vid-layer {
+                               dma-names = "vid0", "vid1", "vid2";
+                               dmas = <&xlnx_dpdma 0>,
+                                      <&xlnx_dpdma 1>,
+                                      <&xlnx_dpdma 2>;
+                       };
+
+                       gfx-layer {
+                               dma-names = "gfx0";
+                               dmas = <&xlnx_dpdma 3>;
+                       };
+
+                       /* dummy node to indicate there's no child i2c device */
+                       i2c-bus {
+                       };
+
+                       zynqmp_dp_snd_codec0: zynqmp_dp_snd_codec0 {
+                               compatible = "xlnx,dp-snd-codec";
+                               clock-names = "aud_clk";
+                       };
+
+                       zynqmp_dp_snd_pcm0: zynqmp_dp_snd_pcm0 {
+                               compatible = "xlnx,dp-snd-pcm";
+                               dmas = <&xlnx_dpdma 4>;
+                               dma-names = "tx";
+                       };
+
+                       zynqmp_dp_snd_pcm1: zynqmp_dp_snd_pcm1 {
+                               compatible = "xlnx,dp-snd-pcm";
+                               dmas = <&xlnx_dpdma 5>;
+                               dma-names = "tx";
+                       };
+
+                       zynqmp_dp_snd_card0: zynqmp_dp_snd_card {
+                               compatible = "xlnx,dp-snd-card";
+                               xlnx,dp-snd-pcm = <&zynqmp_dp_snd_pcm0>,
+                                                 <&zynqmp_dp_snd_pcm1>;
+                               xlnx,dp-snd-codec = <&zynqmp_dp_snd_codec0>;
+                       };
+               };
        };
 };
index 8a81c078811d4eb4dc00090f92b443b8a92a4ea8..6eca8db6d5ff5c65a61c64f8b56b9dde290ad6e9 100644 (file)
@@ -135,6 +135,6 @@ source "board/davinci/da8xxevm/Kconfig"
 source "board/lego/ev3/Kconfig"
 
 config SPL_LDSCRIPT
-       default "board/$(BOARDDIR)/u-boot-spl-da850evm.lds"
+       default "board/davinci/da8xxevm/u-boot-spl-da850evm.lds"
 
 endif
index 21e96f8c883c5cf86c9d0eff6e54188692110716..ec0da1164f3cb888f32a9c711683f4d8b6804a57 100644 (file)
 #include <linux/compiler.h>
 #include <cpu_func.h>
 
-#ifndef CONFIG_IMX8M
-const __weak struct rproc_att hostmap[] = { };
-
-static const struct rproc_att *get_host_mapping(unsigned long auxcore)
-{
-       const struct rproc_att *mmap = hostmap;
-
-       while (mmap && mmap->size) {
-               if (mmap->da <= auxcore &&
-                   mmap->da + mmap->size > auxcore)
-                       return mmap;
-               mmap++;
-       }
-
-       return NULL;
-}
-
-/*
- * A very simple elf loader, assumes the image is valid, returns the
- * entry point address.
- */
-static unsigned long load_elf_image_phdr(unsigned long addr)
-{
-       Elf32_Ehdr *ehdr; /* ELF header structure pointer */
-       Elf32_Phdr *phdr; /* Program header structure pointer */
-       int i;
-
-       ehdr = (Elf32_Ehdr *)addr;
-       phdr = (Elf32_Phdr *)(addr + ehdr->e_phoff);
-
-       /* Load each program header */
-       for (i = 0; i < ehdr->e_phnum; ++i, ++phdr) {
-               const struct rproc_att *mmap = get_host_mapping(phdr->p_paddr);
-               void *dst, *src;
-
-               if (phdr->p_type != PT_LOAD)
-                       continue;
-
-               if (!mmap) {
-                       printf("Invalid aux core address: %08x",
-                              phdr->p_paddr);
-                       return 0;
-               }
-
-               dst = (void *)(phdr->p_paddr - mmap->da) + mmap->sa;
-               src = (void *)addr + phdr->p_offset;
-
-               debug("Loading phdr %i to 0x%p (%i bytes)\n",
-                     i, dst, phdr->p_filesz);
-
-               if (phdr->p_filesz)
-                       memcpy(dst, src, phdr->p_filesz);
-               if (phdr->p_filesz != phdr->p_memsz)
-                       memset(dst + phdr->p_filesz, 0x00,
-                              phdr->p_memsz - phdr->p_filesz);
-               flush_cache((unsigned long)dst &
-                           ~(CONFIG_SYS_CACHELINE_SIZE - 1),
-                           ALIGN(phdr->p_filesz, CONFIG_SYS_CACHELINE_SIZE));
-       }
-
-       return ehdr->e_entry;
-}
-#endif
-
 int arch_auxiliary_core_up(u32 core_id, ulong addr)
 {
        ulong stack, pc;
index 8f4272286c11d6046e4635d9034cb31161424ba5..a13cbef9b5c3f636feed7b1f6bc2731ac07437af 100644 (file)
@@ -126,6 +126,14 @@ config K3_SYSFW_IMAGE_SIZE_MAX
          tree blob. Keep it as tight as possible, as this directly affects the
          overall SPL memory footprint.
 
+config K3_SYSFW_IMAGE_SPI_OFFS
+       hex "SPI offset of SYSFW firmware and configuration blob"
+       depends on K3_LOAD_SYSFW
+       default 0x6C0000
+       help
+         Offset of the combined System Firmware and configuration image tree
+         blob to be loaded when booting from a SPI flash memory.
+
 config SYS_K3_SPL_ATF
        bool "Start Cortex-A from SPL"
        depends on SPL && CPU_V7R
index d0b10e58ad3e176d7f35dcebcb3f5d20ef99b197..3768bccafa633a92e2aab1a86145e94aaef5c293 100644 (file)
@@ -161,10 +161,8 @@ void board_init_f(ulong dummy)
                pinctrl_select_state(dev, "default");
 
        /*
-        * Load, start up, and configure system controller firmware. Provide
-        * the U-Boot console init function to the SYSFW post-PM configuration
-        * callback hook, effectively switching on (or over) the console
-        * output.
+        * Load, start up, and configure system controller firmware while
+        * also populating the SYSFW post-PM configuration callback hook.
         */
        k3_sysfw_loader(k3_mmc_stop_clock, k3_mmc_restart_clock);
 
@@ -181,6 +179,9 @@ void board_init_f(ulong dummy)
        preloader_console_init();
 #endif
 
+       /* Output System Firmware version info */
+       k3_sysfw_print_ver();
+
        /* Perform EEPROM-based board detection */
        do_board_detect();
 
index 7f908eee803b685b5c984069fb7ce313c1cfdd5d..95f830b7ffe43304b36e05d97cfa07311f155667 100644 (file)
@@ -49,6 +49,13 @@ struct mm_region am654_mem_map[NR_MMU_REGIONS] = {
                .size = 0x80000000UL,
                .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
                         PTE_BLOCK_INNER_SHARE
+       }, {
+               .virt = 0x500000000UL,
+               .phys = 0x500000000UL,
+               .size = 0x400000000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+                        PTE_BLOCK_NON_SHARE |
+                        PTE_BLOCK_PXN | PTE_BLOCK_UXN
        }, {
                /* List terminator */
                0,
@@ -60,7 +67,7 @@ struct mm_region *mem_map = am654_mem_map;
 
 #ifdef CONFIG_SOC_K3_J721E
 /* NR_DRAM_BANKS + 32bit IO + 64bit IO + terminator */
-#define NR_MMU_REGIONS (CONFIG_NR_DRAM_BANKS + 5)
+#define NR_MMU_REGIONS (CONFIG_NR_DRAM_BANKS + 6)
 
 /* ToDo: Add 64bit IO */
 struct mm_region j721e_mem_map[NR_MMU_REGIONS] = {
@@ -102,6 +109,12 @@ struct mm_region j721e_mem_map[NR_MMU_REGIONS] = {
                .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
                         PTE_BLOCK_NON_SHARE |
                         PTE_BLOCK_PXN | PTE_BLOCK_UXN
+       }, {
+               .virt = 0x4d80000000UL,
+               .phys = 0x4d80000000UL,
+               .size = 0x0002000000UL,
+               .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL_NC) |
+                        PTE_BLOCK_INNER_SHARE
        }, {
                /* List terminator */
                0,
index 7af60a7f2f8294f83ddd60f2119b3065cd71d65d..efd84ec7eb9786b75e33239a37273c5b1a00020d 100644 (file)
 #include <asm/arch/sys_proto.h>
 #include <asm/hardware.h>
 #include <asm/io.h>
+#include <fs_loader.h>
+#include <fs.h>
+#include <env.h>
+#include <elf.h>
 
 struct ti_sci_handle *get_ti_sci_handle(void)
 {
@@ -31,6 +35,28 @@ struct ti_sci_handle *get_ti_sci_handle(void)
        return (struct ti_sci_handle *)ti_sci_get_handle_from_sysfw(dev);
 }
 
+void k3_sysfw_print_ver(void)
+{
+       struct ti_sci_handle *ti_sci = get_ti_sci_handle();
+       char fw_desc[sizeof(ti_sci->version.firmware_description) + 1];
+
+       /*
+        * Output System Firmware version info. Note that since the
+        * 'firmware_description' field is not guaranteed to be zero-
+        * terminated we manually add a \0 terminator if needed. Further
+        * note that we intentionally no longer rely on the extended
+        * printf() formatter '%.*s' to not having to require a more
+        * full-featured printf() implementation.
+        */
+       strncpy(fw_desc, ti_sci->version.firmware_description,
+               sizeof(ti_sci->version.firmware_description));
+       fw_desc[sizeof(fw_desc) - 1] = '\0';
+
+       printf("SYSFW ABI: %d.%d (firmware rev 0x%04x '%s')\n",
+              ti_sci->version.abi_major, ti_sci->version.abi_minor,
+              ti_sci->version.firmware_revision, fw_desc);
+}
+
 DECLARE_GLOBAL_DATA_PTR;
 
 #ifdef CONFIG_K3_EARLY_CONS
@@ -58,23 +84,98 @@ int early_console_init(void)
 #endif
 
 #ifdef CONFIG_SYS_K3_SPL_ATF
+
+void init_env(void)
+{
+#ifdef CONFIG_SPL_ENV_SUPPORT
+       char *part;
+
+       env_init();
+       env_relocate();
+       switch (spl_boot_device()) {
+       case BOOT_DEVICE_MMC2:
+               part = env_get("bootpart");
+               env_set("storage_interface", "mmc");
+               env_set("fw_dev_part", part);
+               break;
+       case BOOT_DEVICE_SPI:
+               env_set("storage_interface", "ubi");
+               env_set("fw_ubi_mtdpart", "UBI");
+               env_set("fw_ubi_volume", "UBI0");
+               break;
+       default:
+               printf("%s from device %u not supported!\n",
+                      __func__, spl_boot_device());
+               return;
+       }
+#endif
+}
+
+#ifdef CONFIG_FS_LOADER
+int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr)
+{
+       struct udevice *fsdev;
+       char *name = NULL;
+       int size = 0;
+
+       *loadaddr = 0;
+#ifdef CONFIG_SPL_ENV_SUPPORT
+       switch (spl_boot_device()) {
+       case BOOT_DEVICE_MMC2:
+               name = env_get(name_fw);
+               *loadaddr = env_get_hex(name_loadaddr, *loadaddr);
+               break;
+       default:
+               printf("Loading rproc fw image from device %u not supported!\n",
+                      spl_boot_device());
+               return 0;
+       }
+#endif
+       if (!*loadaddr)
+               return 0;
+
+       if (!uclass_get_device(UCLASS_FS_FIRMWARE_LOADER, 0, &fsdev)) {
+               size = request_firmware_into_buf(fsdev, name, (void *)*loadaddr,
+                                                0, 0);
+       }
+
+       return size;
+}
+#else
+int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr)
+{
+       return 0;
+}
+#endif
+
+__weak void start_non_linux_remote_cores(void)
+{
+}
+
 void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
 {
+       typedef void __noreturn (*image_entry_noargs_t)(void);
        struct ti_sci_handle *ti_sci = get_ti_sci_handle();
-       int ret;
+       u32 loadaddr = 0;
+       int ret, size;
 
        /* Release all the exclusive devices held by SPL before starting ATF */
        ti_sci->ops.dev_ops.release_exclusive_devices(ti_sci);
 
+       ret = rproc_init();
+       if (ret)
+               panic("rproc failed to be initialized (%d)\n", ret);
+
+       init_env();
+       start_non_linux_remote_cores();
+       size = load_firmware("name_mcur5f0_0fw", "addr_mcur5f0_0load",
+                            &loadaddr);
+
+
        /*
         * It is assumed that remoteproc device 1 is the corresponding
         * Cortex-A core which runs ATF. Make sure DT reflects the same.
         */
-       ret = rproc_dev_init(1);
-       if (ret)
-               panic("%s: ATF failed to initialize on rproc (%d)\n", __func__,
-                     ret);
-
        ret = rproc_load(1, spl_image->entry_point, 0x200);
        if (ret)
                panic("%s: ATF failed to load on rproc (%d)\n", __func__, ret);
@@ -85,13 +186,18 @@ void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
        ret = rproc_start(1);
        if (ret)
                panic("%s: ATF failed to start on rproc (%d)\n", __func__, ret);
+       if (!(size > 0 && valid_elf_image(loadaddr))) {
+               debug("Shutting down...\n");
+               release_resources_for_core_shutdown();
+
+               while (1)
+                       asm volatile("wfe");
+       }
 
-       debug("Releasing resources...\n");
-       release_resources_for_core_shutdown();
+       image_entry_noargs_t image_entry =
+               (image_entry_noargs_t)load_elf_image_phdr(loadaddr);
 
-       debug("Finalizing core shutdown...\n");
-       while (1)
-               asm volatile("wfe");
+       image_entry();
 }
 #endif
 
index d8b34fe0607e09a4ae0bad6d2a42892528542990..b1cbe116ef3133ca61444eed464b9849d2e4bfe5 100644 (file)
@@ -24,3 +24,6 @@ void setup_k3_mpu_regions(void);
 int early_console_init(void);
 void disable_linefill_optimization(void);
 void remove_fwl_configs(struct fwl_data *fwl_data, size_t fwl_data_size);
+void start_non_linux_remote_cores(void);
+int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr);
+void k3_sysfw_print_ver(void);
index 0994522f6c30ceed1e2bf345d32409081be8f1a8..f34090f9cc9999a9453d3f088af36b8d90e46f44 100644 (file)
@@ -19,6 +19,7 @@
 #include <dm/uclass-internal.h>
 #include <dm/pinctrl.h>
 #include <mmc.h>
+#include <remoteproc.h>
 
 #ifdef CONFIG_SPL_BUILD
 #ifdef CONFIG_K3_LOAD_SYSFW
@@ -202,6 +203,9 @@ void board_init_f(ulong dummy)
        preloader_console_init();
 #endif
 
+       /* Output System Firmware version info */
+       k3_sysfw_print_ver();
+
        /* Perform EEPROM-based board detection */
        do_board_detect();
 
@@ -326,3 +330,36 @@ void release_resources_for_core_shutdown(void)
        }
 }
 #endif
+
+#ifdef CONFIG_SYS_K3_SPL_ATF
+void start_non_linux_remote_cores(void)
+{
+       int size = 0, ret;
+       u32 loadaddr = 0;
+
+       size = load_firmware("name_mainr5f0_0fw", "addr_mainr5f0_0load",
+                            &loadaddr);
+       if (size <= 0)
+               goto err_load;
+
+       /* assuming remoteproc 2 is aliased for the needed remotecore */
+       ret = rproc_load(2, loadaddr, size);
+       if (ret) {
+               printf("Firmware failed to start on rproc (%d)\n", ret);
+               goto err_load;
+       }
+
+       ret = rproc_start(2);
+       if (ret) {
+               printf("Firmware init failed on rproc (%d)\n", ret);
+               goto err_load;
+       }
+
+       printf("Remoteproc 2 started successfully\n");
+
+       return;
+
+err_load:
+       rproc_reset(2);
+}
+#endif
index ee076ed87701f7e5cd8431a34cc443fdf2ada913..3d2ff6775a3f44b86ee00070122ce836262f42bc 100644 (file)
@@ -26,7 +26,9 @@ struct mpu_region_config k3_mpu_regions[16] = {
        /* U-Boot's code area marking it as WB and Write allocate */
        {CONFIG_SYS_SDRAM_BASE, REGION_2, XN_DIS, PRIV_RW_USR_RW,
         O_I_WB_RD_WR_ALLOC, REGION_2GB},
-       {0x0, 3, 0x0, 0x0, 0x0, 0x0},
+       /* mcu_r5fss0_core0 BTCM area marking it as WB and Write allocate. */
+       {0x41010000, 3, XN_DIS, PRIV_RW_USR_RW, O_I_WB_RD_WR_ALLOC,
+        REGION_8MB},
        {0x0, 4, 0x0, 0x0, 0x0, 0x0},
        {0x0, 5, 0x0, 0x0, 0x0, 0x0},
        {0x0, 6, 0x0, 0x0, 0x0, 0x0},
index db02607b171ee52076edd98d8cecc6bd121a5aa0..4f5c84824563171523c473b5793bc4c4d45ddd3d 100644 (file)
@@ -14,6 +14,8 @@
 #include <g_dnl.h>
 #include <usb.h>
 #include <dfu.h>
+#include <dm/uclass-internal.h>
+#include <spi_flash.h>
 
 #include <asm/arch/sys_proto.h>
 #include "common.h"
@@ -197,13 +199,33 @@ exit:
 }
 #endif
 
+#if CONFIG_IS_ENABLED(SPI_LOAD)
+static void *k3_sysfw_get_spi_addr(void)
+{
+       struct udevice *dev;
+       fdt_addr_t addr;
+       int ret;
+
+       ret = uclass_find_device_by_seq(UCLASS_SPI, CONFIG_SF_DEFAULT_BUS,
+                                       true, &dev);
+       if (ret)
+               return NULL;
+
+       addr = dev_read_addr_index(dev, 1);
+       if (addr == FDT_ADDR_T_NONE)
+               return NULL;
+
+       return (void *)(addr + CONFIG_K3_SYSFW_IMAGE_SPI_OFFS);
+}
+#endif
+
 void k3_sysfw_loader(void (*config_pm_pre_callback) (void),
                     void (*config_pm_done_callback)(void))
 {
        struct spl_image_info spl_image = { 0 };
        struct spl_boot_device bootdev = { 0 };
        struct ti_sci_handle *ti_sci;
-       int ret;
+       int ret = 0;
 
        /* Reserve a block of aligned memory for loading the SYSFW image */
        sysfw_load_address = memalign(ARCH_DMA_MINALIGN,
@@ -244,6 +266,13 @@ void k3_sysfw_loader(void (*config_pm_pre_callback) (void),
 #endif
                break;
 #endif
+#if CONFIG_IS_ENABLED(SPI_LOAD)
+       case BOOT_DEVICE_SPI:
+               sysfw_load_address = k3_sysfw_get_spi_addr();
+               if (!sysfw_load_address)
+                       ret = -ENODEV;
+               break;
+#endif
 #if CONFIG_IS_ENABLED(YMODEM_SUPPORT)
        case BOOT_DEVICE_UART:
 #ifdef CONFIG_K3_EARLY_CONS
@@ -305,22 +334,4 @@ void k3_sysfw_loader(void (*config_pm_pre_callback) (void),
         */
        if (config_pm_done_callback)
                config_pm_done_callback();
-
-       /*
-        * Output System Firmware version info. Note that since the
-        * 'firmware_description' field is not guaranteed to be zero-
-        * terminated we manually add a \0 terminator if needed. Further
-        * note that we intentionally no longer rely on the extended
-        * printf() formatter '%.*s' to not having to require a more
-        * full-featured printf() implementation.
-        */
-       char fw_desc[sizeof(ti_sci->version.firmware_description) + 1];
-
-       strncpy(fw_desc, ti_sci->version.firmware_description,
-               sizeof(ti_sci->version.firmware_description));
-       fw_desc[sizeof(fw_desc) - 1] = '\0';
-
-       printf("SYSFW ABI: %d.%d (firmware rev 0x%04x '%s')\n",
-              ti_sci->version.abi_major, ti_sci->version.abi_minor,
-              ti_sci->version.firmware_revision, fw_desc);
 }
index f2cd4966071b30cc181fe398d53843689a71d5ea..2427933c8ba751ede4932773231d2d7a9fbd12f7 100644 (file)
@@ -226,6 +226,10 @@ void enable_basic_clocks(void)
                &cmper->usb0clkctrl,
                &cmper->emiffwclkctrl,
                &cmper->emifclkctrl,
+#if CONFIG_IS_ENABLED(AM335X_LCD)
+               &cmper->lcdclkctrl,
+               &cmper->lcdcclkstctrl,
+#endif
                0
        };
 
index 2984a3edda21cea233362dc8b5b95aeb08dc4f6e..7644b8dc854b3ac5086bfc7cce41c8f95b6528ca 100644 (file)
@@ -15,7 +15,4 @@ config SYS_SOC
 
 source "board/LaCie/edminiv2/Kconfig"
 
-config SPL_LDSCRIPT
-       default "$(CPUDIR)/orion5x/u-boot-spl.lds" if ORION5X
-
 endif
index a77c706a1a0059c7f04ff420dd0a3393d51e5f64..3b923f088e764f30a3fcd8ae7785b323b81d2989 100644 (file)
@@ -12,8 +12,6 @@
 #include <linux/iopoll.h>
 
 #define BSEC_OTP_MAX_VALUE             95
-
-#ifndef CONFIG_STM32MP1_TRUSTED
 #define BSEC_TIMEOUT_US                        10000
 
 /* BSEC REGISTER OFFSET (base relative) */
 #define BSEC_OTP_LOCK_OFF              0x010
 #define BSEC_DISTURBED_OFF             0x01C
 #define BSEC_ERROR_OFF                 0x034
-#define BSEC_SPLOCK_OFF                        0x064 /* Program safmem sticky lock */
-#define BSEC_SWLOCK_OFF                        0x07C /* write in OTP sticky lock */
-#define BSEC_SRLOCK_OFF                        0x094 /* shadowing sticky lock */
+#define BSEC_WRLOCK_OFF                        0x04C /* OTP write permananet lock */
+#define BSEC_SPLOCK_OFF                        0x064 /* OTP write sticky lock */
+#define BSEC_SWLOCK_OFF                        0x07C /* shadow write sticky lock */
+#define BSEC_SRLOCK_OFF                        0x094 /* shadow read sticky lock */
 #define BSEC_OTP_DATA_OFF              0x200
 
 /* BSEC_CONFIGURATION Register MASK */
 #define BSEC_LOCK_PROGRAM              0x04
 
 /**
- * bsec_check_error() - Check status of one otp
- * @base: base address of bsec IP
+ * bsec_lock() - manage lock for each type SR/SP/SW
+ * @address: address of bsec IP register
  * @otp: otp number (0 - BSEC_OTP_MAX_VALUE)
- * Return: 0 if no error, -EAGAIN or -ENOTSUPP
+ * Return: true if locked else false
  */
-static u32 bsec_check_error(u32 base, u32 otp)
+static bool bsec_read_lock(u32 address, u32 otp)
 {
        u32 bit;
        u32 bank;
@@ -66,21 +65,17 @@ static u32 bsec_check_error(u32 base, u32 otp)
        bit = 1 << (otp & OTP_LOCK_MASK);
        bank = ((otp >> OTP_LOCK_BANK_SHIFT) & OTP_LOCK_MASK) * sizeof(u32);
 
-       if (readl(base + BSEC_DISTURBED_OFF + bank) & bit)
-               return -EAGAIN;
-       else if (readl(base + BSEC_ERROR_OFF + bank) & bit)
-               return -ENOTSUPP;
-
-       return 0;
+       return !!(readl(address + bank) & bit);
 }
 
+#ifndef CONFIG_STM32MP1_TRUSTED
 /**
- * bsec_lock() - manage lock for each type SR/SP/SW
- * @address: address of bsec IP register
+ * bsec_check_error() - Check status of one otp
+ * @base: base address of bsec IP
  * @otp: otp number (0 - BSEC_OTP_MAX_VALUE)
- * Return: true if locked else false
+ * Return: 0 if no error, -EAGAIN or -ENOTSUPP
  */
-static bool bsec_read_lock(u32 address, u32 otp)
+static u32 bsec_check_error(u32 base, u32 otp)
 {
        u32 bit;
        u32 bank;
@@ -88,7 +83,12 @@ static bool bsec_read_lock(u32 address, u32 otp)
        bit = 1 << (otp & OTP_LOCK_MASK);
        bank = ((otp >> OTP_LOCK_BANK_SHIFT) & OTP_LOCK_MASK) * sizeof(u32);
 
-       return !!(readl(address + bank) & bit);
+       if (readl(base + BSEC_DISTURBED_OFF + bank) & bit)
+               return -EAGAIN;
+       else if (readl(base + BSEC_ERROR_OFF + bank) & bit)
+               return -ENOTSUPP;
+
+       return 0;
 }
 
 /**
@@ -324,6 +324,16 @@ static int stm32mp_bsec_read_shadow(struct udevice *dev, u32 *val, u32 otp)
 #endif
 }
 
+static int stm32mp_bsec_read_lock(struct udevice *dev, u32 *val, u32 otp)
+{
+       struct stm32mp_bsec_platdata *plat = dev_get_platdata(dev);
+
+       /* return OTP permanent write lock status */
+       *val = bsec_read_lock(plat->base + BSEC_WRLOCK_OFF, otp);
+
+       return 0;
+}
+
 static int stm32mp_bsec_write_otp(struct udevice *dev, u32 val, u32 otp)
 {
 #ifdef CONFIG_STM32MP1_TRUSTED
@@ -350,22 +360,41 @@ static int stm32mp_bsec_write_shadow(struct udevice *dev, u32 val, u32 otp)
 #endif
 }
 
+static int stm32mp_bsec_write_lock(struct udevice *dev, u32 val, u32 otp)
+{
+#ifdef CONFIG_STM32MP1_TRUSTED
+       if (val == 1)
+               return stm32_smc_exec(STM32_SMC_BSEC,
+                                     STM32_SMC_WRLOCK_OTP,
+                                     otp, 0);
+       if (val == 0)
+               return 0; /* nothing to do */
+
+       return -EINVAL;
+#else
+       return -ENOTSUPP;
+#endif
+}
+
 static int stm32mp_bsec_read(struct udevice *dev, int offset,
                             void *buf, int size)
 {
        int ret;
        int i;
-       bool shadow = true;
+       bool shadow = true, lock = false;
        int nb_otp = size / sizeof(u32);
        int otp;
        unsigned int offs = offset;
 
-       if (offs >= STM32_BSEC_OTP_OFFSET) {
+       if (offs >= STM32_BSEC_LOCK_OFFSET) {
+               offs -= STM32_BSEC_LOCK_OFFSET;
+               lock = true;
+       } else if (offs >= STM32_BSEC_OTP_OFFSET) {
                offs -= STM32_BSEC_OTP_OFFSET;
                shadow = false;
        }
 
-       if (offs < 0 || (offs % 4) || (size % 4))
+       if ((offs % 4) || (size % 4))
                return -EINVAL;
 
        otp = offs / sizeof(u32);
@@ -373,7 +402,9 @@ static int stm32mp_bsec_read(struct udevice *dev, int offset,
        for (i = otp; i < (otp + nb_otp) && i <= BSEC_OTP_MAX_VALUE; i++) {
                u32 *addr = &((u32 *)buf)[i - otp];
 
-               if (shadow)
+               if (lock)
+                       ret = stm32mp_bsec_read_lock(dev, addr, i);
+               else if (shadow)
                        ret = stm32mp_bsec_read_shadow(dev, addr, i);
                else
                        ret = stm32mp_bsec_read_otp(dev, addr, i);
@@ -392,17 +423,20 @@ static int stm32mp_bsec_write(struct udevice *dev, int offset,
 {
        int ret = 0;
        int i;
-       bool shadow = true;
+       bool shadow = true, lock = false;
        int nb_otp = size / sizeof(u32);
        int otp;
        unsigned int offs = offset;
 
-       if (offs >= STM32_BSEC_OTP_OFFSET) {
+       if (offs >= STM32_BSEC_LOCK_OFFSET) {
+               offs -= STM32_BSEC_LOCK_OFFSET;
+               lock = true;
+       } else if (offs >= STM32_BSEC_OTP_OFFSET) {
                offs -= STM32_BSEC_OTP_OFFSET;
                shadow = false;
        }
 
-       if (offs < 0 || (offs % 4) || (size % 4))
+       if ((offs % 4) || (size % 4))
                return -EINVAL;
 
        otp = offs / sizeof(u32);
@@ -410,7 +444,9 @@ static int stm32mp_bsec_write(struct udevice *dev, int offset,
        for (i = otp; i < otp + nb_otp && i <= BSEC_OTP_MAX_VALUE; i++) {
                u32 *val = &((u32 *)buf)[i - otp];
 
-               if (shadow)
+               if (lock)
+                       ret = stm32mp_bsec_write_lock(dev, *val, i);
+               else if (shadow)
                        ret = stm32mp_bsec_write_shadow(dev, *val, i);
                else
                        ret = stm32mp_bsec_write_otp(dev, *val, i);
index ea0bd94605b77eac27a2045bfd5ca0403e2046fe..9aa57943345b4bf49cd9bb46276b170b339021ff 100644 (file)
 #define BOOTROM_INSTANCE_MASK   GENMASK(31, 16)
 #define BOOTROM_INSTANCE_SHIFT 16
 
-/* BSEC OTP index */
-#define BSEC_OTP_RPN   1
-#define BSEC_OTP_SERIAL        13
-#define BSEC_OTP_PKG   16
-#define BSEC_OTP_MAC   57
-
 /* Device Part Number (RPN) = OTP_DATA1 lower 8 bits */
 #define RPN_SHIFT      0
 #define RPN_MASK       GENMASK(7, 0)
@@ -285,25 +279,42 @@ u32 get_cpu_package(void)
        return get_otp(BSEC_OTP_PKG, PKG_SHIFT, PKG_MASK);
 }
 
-#if defined(CONFIG_DISPLAY_CPUINFO)
-int print_cpuinfo(void)
+void get_soc_name(char name[SOC_NAME_SIZE])
 {
        char *cpu_s, *cpu_r, *pkg;
 
        /* MPUs Part Numbers */
        switch (get_cpu_type()) {
+       case CPU_STM32MP157Fxx:
+               cpu_s = "157F";
+               break;
+       case CPU_STM32MP157Dxx:
+               cpu_s = "157D";
+               break;
        case CPU_STM32MP157Cxx:
                cpu_s = "157C";
                break;
        case CPU_STM32MP157Axx:
                cpu_s = "157A";
                break;
+       case CPU_STM32MP153Fxx:
+               cpu_s = "153F";
+               break;
+       case CPU_STM32MP153Dxx:
+               cpu_s = "153D";
+               break;
        case CPU_STM32MP153Cxx:
                cpu_s = "153C";
                break;
        case CPU_STM32MP153Axx:
                cpu_s = "153A";
                break;
+       case CPU_STM32MP151Fxx:
+               cpu_s = "151F";
+               break;
+       case CPU_STM32MP151Dxx:
+               cpu_s = "151D";
+               break;
        case CPU_STM32MP151Cxx:
                cpu_s = "151C";
                break;
@@ -350,7 +361,16 @@ int print_cpuinfo(void)
                break;
        }
 
-       printf("CPU: STM32MP%s%s Rev.%s\n", cpu_s, pkg, cpu_r);
+       snprintf(name, SOC_NAME_SIZE, "STM32MP%s%s Rev.%s", cpu_s, pkg, cpu_r);
+}
+
+#if defined(CONFIG_DISPLAY_CPUINFO)
+int print_cpuinfo(void)
+{
+       char name[SOC_NAME_SIZE];
+
+       get_soc_name(name);
+       printf("CPU: %s\n", name);
 
        return 0;
 }
index 82c430b7c777cc83ae33774783a939c63661e6ae..3ee7d6a83377211106bdeee112d6b526026a0dc8 100644 (file)
 
 #define ETZPC_RESERVED         0xffffffff
 
+#define STM32_FDCAN_BASE       0x4400e000
+#define STM32_CRYP2_BASE       0x4c005000
+#define STM32_CRYP1_BASE       0x54001000
+#define STM32_GPU_BASE         0x59000000
+#define STM32_DSI_BASE         0x5a000000
+
 static const u32 stm32mp1_ip_addr[] = {
        0x5c008000,     /* 00 stgenc */
        0x54000000,     /* 01 bkpsram */
@@ -33,7 +39,7 @@ static const u32 stm32mp1_ip_addr[] = {
        ETZPC_RESERVED, /* 06 reserved */
        0x54003000,     /* 07 rng1 */
        0x54002000,     /* 08 hash1 */
-       0x54001000,     /* 09 cryp1 */
+       STM32_CRYP1_BASE,       /* 09 cryp1 */
        0x5a003000,     /* 0A ddrctrl */
        0x5a004000,     /* 0B ddrphyc */
        0x5c009000,     /* 0C i2c6 */
@@ -86,7 +92,7 @@ static const u32 stm32mp1_ip_addr[] = {
        0x4400b000,     /* 3B sai2 */
        0x4400c000,     /* 3C sai3 */
        0x4400d000,     /* 3D dfsdm */
-       0x4400e000,     /* 3E tt_fdcan */
+       STM32_FDCAN_BASE,       /* 3E tt_fdcan */
        ETZPC_RESERVED, /* 3F reserved */
        0x50021000,     /* 40 lptim2 */
        0x50022000,     /* 41 lptim3 */
@@ -99,7 +105,7 @@ static const u32 stm32mp1_ip_addr[] = {
        0x48003000,     /* 48 adc */
        0x4c002000,     /* 49 hash2 */
        0x4c003000,     /* 4A rng2 */
-       0x4c005000,     /* 4B cryp2 */
+       STM32_CRYP2_BASE,       /* 4B cryp2 */
        ETZPC_RESERVED, /* 4C reserved */
        ETZPC_RESERVED, /* 4D reserved */
        ETZPC_RESERVED, /* 4E reserved */
@@ -126,11 +132,13 @@ static const u32 stm32mp1_ip_addr[] = {
 static bool fdt_disable_subnode_by_address(void *fdt, int offset, u32 addr)
 {
        int node;
+       fdt_addr_t regs;
 
        for (node = fdt_first_subnode(fdt, offset);
             node >= 0;
             node = fdt_next_subnode(fdt, node)) {
-               if (addr == (u32)fdt_getprop(fdt, node, "reg", 0)) {
+               regs = fdtdec_get_addr(fdt, node, "reg");
+               if (addr == regs) {
                        if (fdtdec_get_is_enabled(fdt, node)) {
                                fdt_status_disabled(fdt, node);
 
@@ -143,11 +151,11 @@ static bool fdt_disable_subnode_by_address(void *fdt, int offset, u32 addr)
        return false;
 }
 
-static int stm32_fdt_fixup_etzpc(void *fdt)
+static int stm32_fdt_fixup_etzpc(void *fdt, int soc_node)
 {
        const u32 *array;
        int array_size, i;
-       int soc_node, offset, shift;
+       int offset, shift;
        u32 addr, status, decprot[ETZPC_DECPROT_NB];
 
        array = stm32mp1_ip_addr;
@@ -156,10 +164,6 @@ static int stm32_fdt_fixup_etzpc(void *fdt)
        for (i = 0; i < ETZPC_DECPROT_NB; i++)
                decprot[i] = readl(ETZPC_DECPROT(i));
 
-       soc_node = fdt_path_offset(fdt, "/soc");
-       if (soc_node < 0)
-               return soc_node;
-
        for (i = 0; i < array_size; i++) {
                offset = i / NB_PROT_PER_REG;
                shift = (i % NB_PROT_PER_REG) * DECPROT_NB_BITS;
@@ -180,6 +184,40 @@ static int stm32_fdt_fixup_etzpc(void *fdt)
        return 0;
 }
 
+/* deactivate all the cpu except core 0 */
+static void stm32_fdt_fixup_cpu(void *blob, char *name)
+{
+       int off;
+       u32 reg;
+
+       off = fdt_path_offset(blob, "/cpus");
+       if (off < 0) {
+               printf("%s: couldn't find /cpus node\n", __func__);
+               return;
+       }
+
+       off = fdt_node_offset_by_prop_value(blob, -1, "device_type", "cpu", 4);
+       while (off != -FDT_ERR_NOTFOUND) {
+               reg = fdtdec_get_addr(blob, off, "reg");
+               if (reg != 0) {
+                       fdt_del_node(blob, off);
+                       printf("FDT: cpu %d node remove for %s\n", reg, name);
+                       /* after delete we can't trust the offsets anymore */
+                       off = -1;
+               }
+               off = fdt_node_offset_by_prop_value(blob, off,
+                                                   "device_type", "cpu", 4);
+       }
+}
+
+static void stm32_fdt_disable(void *fdt, int offset, u32 addr,
+                             const char *string, const char *name)
+{
+       if (fdt_disable_subnode_by_address(fdt, offset, addr))
+               printf("FDT: %s@%08x node disabled for %s\n",
+                      string, addr, name);
+}
+
 /*
  * This function is called right before the kernel is booted. "blob" is the
  * device tree that will be passed to the kernel.
@@ -187,14 +225,59 @@ static int stm32_fdt_fixup_etzpc(void *fdt)
 int ft_system_setup(void *blob, bd_t *bd)
 {
        int ret = 0;
-       u32 pkg;
+       int soc;
+       u32 pkg, cpu;
+       char name[SOC_NAME_SIZE];
+
+       soc = fdt_path_offset(blob, "/soc");
+       if (soc < 0)
+               return soc;
 
        if (CONFIG_IS_ENABLED(STM32_ETZPC)) {
-               ret = stm32_fdt_fixup_etzpc(blob);
+               ret = stm32_fdt_fixup_etzpc(blob, soc);
                if (ret)
                        return ret;
        }
 
+       /* MPUs Part Numbers and name*/
+       cpu = get_cpu_type();
+       get_soc_name(name);
+
+       switch (cpu) {
+       case CPU_STM32MP151Fxx:
+       case CPU_STM32MP151Dxx:
+       case CPU_STM32MP151Cxx:
+       case CPU_STM32MP151Axx:
+               stm32_fdt_fixup_cpu(blob, name);
+               /* after cpu delete we can't trust the soc offsets anymore */
+               soc = fdt_path_offset(blob, "/soc");
+               stm32_fdt_disable(blob, soc, STM32_FDCAN_BASE, "can", name);
+               /* fall through */
+       case CPU_STM32MP153Fxx:
+       case CPU_STM32MP153Dxx:
+       case CPU_STM32MP153Cxx:
+       case CPU_STM32MP153Axx:
+               stm32_fdt_disable(blob, soc, STM32_GPU_BASE, "gpu", name);
+               stm32_fdt_disable(blob, soc, STM32_DSI_BASE, "dsi", name);
+               break;
+       default:
+               break;
+       }
+
+       switch (cpu) {
+       case CPU_STM32MP157Dxx:
+       case CPU_STM32MP157Axx:
+       case CPU_STM32MP153Dxx:
+       case CPU_STM32MP153Axx:
+       case CPU_STM32MP151Dxx:
+       case CPU_STM32MP151Axx:
+               stm32_fdt_disable(blob, soc, STM32_CRYP1_BASE, "cryp", name);
+               stm32_fdt_disable(blob, soc, STM32_CRYP2_BASE, "cryp", name);
+               break;
+       default:
+               break;
+       }
+
        switch (get_cpu_package()) {
        case PKG_AA_LBGA448:
                pkg = STM32MP_PKG_AA;
index b8a17cfbddb8ac1976dd5fc3950c99875b58ea1d..bfc42a7c4899865e06efa2ac56c2ece5f33a8f57 100644 (file)
@@ -9,8 +9,10 @@
 /* DDR power initializations */
 enum ddr_type {
        STM32MP_DDR3,
-       STM32MP_LPDDR2,
-       STM32MP_LPDDR3,
+       STM32MP_LPDDR2_16,
+       STM32MP_LPDDR2_32,
+       STM32MP_LPDDR3_16,
+       STM32MP_LPDDR3_32,
 };
 
 int board_ddr_power_init(enum ddr_type ddr_type);
index f0636005e5d9d4736007449272c165e9534b143b..6daf9f7121636ae5536342e08a0e1db313183da5 100644 (file)
@@ -119,7 +119,14 @@ enum forced_boot_mode {
 #define STM32_BSEC_SHADOW(id)          (STM32_BSEC_SHADOW_OFFSET + (id) * 4)
 #define STM32_BSEC_OTP_OFFSET          0x80000000
 #define STM32_BSEC_OTP(id)             (STM32_BSEC_OTP_OFFSET + (id) * 4)
-
+#define STM32_BSEC_LOCK_OFFSET         0xC0000000
+#define STM32_BSEC_LOCK(id)            (STM32_BSEC_LOCK_OFFSET + (id) * 4)
+
+/* BSEC OTP index */
+#define BSEC_OTP_RPN   1
+#define BSEC_OTP_SERIAL        13
+#define BSEC_OTP_PKG   16
+#define BSEC_OTP_MAC   57
 #define BSEC_OTP_BOARD 59
 
 #endif /* __ASSEMBLY__*/
index 8130546b273a40188fba921272e5f5c28956fd69..4ad14f963b462c9c931896dcd9eb9636d5c18dff 100644 (file)
@@ -27,6 +27,7 @@
 #define STM32_SMC_READ_OTP             0x04
 #define STM32_SMC_READ_ALL             0x05
 #define STM32_SMC_WRITE_ALL            0x06
+#define STM32_SMC_WRLOCK_OTP           0x07
 
 /* SMC error codes */
 #define STM32_SMC_OK                   0x0
@@ -45,8 +46,8 @@ static inline u32 stm32_smc(u32 svc, u8 op, u32 data1, u32 data2, u32 *result)
        arm_smccc_smc(svc, op, data1, data2, 0, 0, 0, 0, &res);
 
        if (res.a0) {
-               pr_err("%s: Failed to exec in secure mode (err = %ld)\n",
-                      __func__, res.a0);
+               pr_err("%s: Failed to exec svc=%x op=%x in secure mode (err = %ld)\n",
+                      __func__, svc, op, res.a0);
                return -EINVAL;
        }
        if (result)
index da46c11573eab040f2df98678e0f515c53653db2..1617126beac4b045d5a3e08c3fdfb32a1a98416a 100644 (file)
@@ -3,13 +3,19 @@
  * Copyright (C) 2015-2017, STMicroelectronics - All Rights Reserved
  */
 
-/* ID = Device Version (bit31:16) + Device Part Number (RPN) (bit15:0)*/
+/* ID = Device Version (bit31:16) + Device Part Number (RPN) (bit7:0) */
 #define CPU_STM32MP157Cxx      0x05000000
 #define CPU_STM32MP157Axx      0x05000001
 #define CPU_STM32MP153Cxx      0x05000024
 #define CPU_STM32MP153Axx      0x05000025
 #define CPU_STM32MP151Cxx      0x0500002E
 #define CPU_STM32MP151Axx      0x0500002F
+#define CPU_STM32MP157Fxx      0x05000080
+#define CPU_STM32MP157Dxx      0x05000081
+#define CPU_STM32MP153Fxx      0x050000A4
+#define CPU_STM32MP153Dxx      0x050000A5
+#define CPU_STM32MP151Fxx      0x050000AE
+#define CPU_STM32MP151Dxx      0x050000AF
 
 /* return CPU_STMP32MP...Xxx constants */
 u32 get_cpu_type(void);
@@ -29,6 +35,10 @@ u32 get_cpu_package(void);
 #define PKG_AC_TFBGA361        2
 #define PKG_AD_TFBGA257        1
 
+/* Get SOC name */
+#define SOC_NAME_SIZE 20
+void get_soc_name(char name[SOC_NAME_SIZE]);
+
 /* return boot mode */
 u32 get_bootmode(void);
 
index 1d91b2d324a8dd7a699f58ecaf1a9e87a6de87da..3fb038d3e77b6e15d41d3a844351ea4fed494810 100644 (file)
@@ -30,6 +30,22 @@ u8 psci_state[STM32MP1_PSCI_NR_CPUS] __secure_data = {
         PSCI_AFFINITY_LEVEL_ON,
         PSCI_AFFINITY_LEVEL_OFF};
 
+static u32 __secure_data cntfrq;
+
+static u32 __secure cp15_read_cntfrq(void)
+{
+       u32 frq;
+
+       asm volatile("mrc p15, 0, %0, c14, c0, 0" : "=r" (frq));
+
+       return frq;
+}
+
+static void __secure cp15_write_cntfrq(u32 frq)
+{
+       asm volatile ("mcr p15, 0, %0, c14, c0, 0" : : "r" (frq));
+}
+
 static inline void psci_set_state(int cpu, u8 state)
 {
        psci_state[cpu] = state;
@@ -63,6 +79,9 @@ void __secure psci_arch_cpu_entry(void)
 
        psci_set_state(cpu, PSCI_AFFINITY_LEVEL_ON);
 
+       /* write the saved cntfrq */
+       cp15_write_cntfrq(cntfrq);
+
        /* reset magic in TAMP register */
        writel(0xFFFFFFFF, TAMP_BACKUP_MAGIC_NUMBER);
 }
@@ -130,6 +149,9 @@ s32 __secure psci_cpu_on(u32 function_id, u32 target_cpu, u32 pc,
        if (psci_state[cpu] == PSCI_AFFINITY_LEVEL_ON)
                return ARM_PSCI_RET_ALREADY_ON;
 
+       /* read and save cntfrq of current cpu to write on target cpu  */
+       cntfrq = cp15_read_cntfrq();
+
        /* reset magic in TAMP register */
        if (readl(TAMP_BACKUP_MAGIC_NUMBER))
                writel(0xFFFFFFFF, TAMP_BACKUP_MAGIC_NUMBER);
index a08e5ae41490011f98d9b11b78ae06333fdb9b5a..e1d66e8d32b7ed6bf9832cb5668df0c052fe4e92 100644 (file)
@@ -56,4 +56,10 @@ config DEFINE_TCM_OCM_MMAP
          This option if enabled defines the TCM and OCM memory and its
          memory attributes in MMU table entry.
 
+config VERSAL_NO_DDR
+       bool "Disable DDR MMU mapping"
+       help
+         This option configures MMU with no DDR to avoid speculative
+         access to DDR memory where DDR is not present.
+
 endif
index 6ee6cd43eca4ca83119595b4f6e9cde860796989..829a6c1b3e5354dc7bbcdf2dd836faa6ffe3e15e 100644 (file)
@@ -81,6 +81,15 @@ void mem_map_fill(void)
                if (!gd->bd->bi_dram[i].size)
                        break;
 
+#if defined(CONFIG_VERSAL_NO_DDR)
+               if (gd->bd->bi_dram[i].start < 0x80000000UL ||
+                   gd->bd->bi_dram[i].start > 0x100000000UL) {
+                       printf("Ignore caches over %llx/%llx\n",
+                              gd->bd->bi_dram[i].start,
+                              gd->bd->bi_dram[i].size);
+                       continue;
+               }
+#endif
                versal_mem_map[banks].virt = gd->bd->bi_dram[i].start;
                versal_mem_map[banks].phys = gd->bd->bi_dram[i].start;
                versal_mem_map[banks].size = gd->bd->bi_dram[i].size;
index 96ba90fb7a760faacd706fbe4e0b24d2e072581d..02a7dc9854753dfad2f277c0ad23a87b5b561eb5 100644 (file)
@@ -6,6 +6,7 @@
 #include <debug_uart.h>
 #include <hang.h>
 #include <spl.h>
+#include <generated/dt.h>
 
 #include <asm/io.h>
 #include <asm/spl.h>
@@ -44,7 +45,6 @@ u32 spl_boot_device(void)
        switch ((zynq_slcr_get_boot_mode()) & ZYNQ_BM_MASK) {
 #ifdef CONFIG_SPL_SPI_SUPPORT
        case ZYNQ_BM_QSPI:
-               puts("qspi boot\n");
                mode = BOOT_DEVICE_SPI;
                break;
 #endif
@@ -56,7 +56,6 @@ u32 spl_boot_device(void)
                break;
 #ifdef CONFIG_SPL_MMC_SUPPORT
        case ZYNQ_BM_SD:
-               puts("mmc boot\n");
                mode = BOOT_DEVICE_MMC1;
                break;
 #endif
@@ -89,8 +88,11 @@ void spl_board_prepare_for_boot(void)
 int board_fit_config_name_match(const char *name)
 {
        /* Just empty function now - can't decide what to choose */
-       debug("%s: %s\n", __func__, name);
+       debug("%s: Check %s, default %s\n", __func__, name, DEVICE_TREE);
 
-       return 0;
+       if (!strcmp(name, DEVICE_TREE))
+               return 0;
+
+       return -1;
 }
 #endif
index fd361c5ce8a58d3dd7548a0a2b86a34f38205590..a0acfa2ff1ed96ea85f7fa11bfecf4e9e36a8778 100644 (file)
@@ -128,7 +128,9 @@ struct apu_regs {
 #define ZYNQMP_SILICON_VER_SHIFT       12
 
 struct csu_regs {
-       u32 reserved0[17];
+       u32 reserved0[4];
+       u32 multi_boot;
+       u32 reserved1[12];
        u32 version;
 };
 
index 1e770ba111d318fa375dc6fcb141706025c99c93..92e31849f88d3bb593178de035826df6a8634a16 100755 (executable)
@@ -29,11 +29,8 @@ else
 fi
 
 if [ ! -f $BL31 ]; then
-       echo "WARNING: BL31 file $BL31 NOT found, resulting binary is non-functional" >&2
+       echo "WARNING: BL31 file $BL31 NOT found, U-Boot will run in EL3" >&2
        BL31=/dev/null
-       # But U-Boot proper could be loaded in EL3 by specifying
-       # firmware = "uboot";
-       # instead of "atf" in config node
 fi
 
 cat << __HEADER_EOF
@@ -58,6 +55,10 @@ cat << __HEADER_EOF
                                algo = "md5";
                        };
                };
+__HEADER_EOF
+
+if [ -f $BL31 ]; then
+cat << __ATF
                atf {
                        description = "ARM Trusted Firmware";
                        data = /incbin/("$BL31");
@@ -71,7 +72,8 @@ cat << __HEADER_EOF
                                algo = "md5";
                        };
                };
-__HEADER_EOF
+__ATF
+fi
 
 DEFAULT=1
 cnt=1
@@ -106,6 +108,15 @@ __CONF_HEADER_EOF
 cnt=1
 for dtname in $DT
 do
+if [ ! -f $BL31 ]; then
+cat << __CONF_SECTION1_EOF
+               config_$cnt {
+                       description = "$(basename $dtname .dtb)";
+                       firmware = "uboot";
+                       fdt = "fdt_$cnt";
+               };
+__CONF_SECTION1_EOF
+else
 cat << __CONF_SECTION1_EOF
                config_$cnt {
                        description = "$(basename $dtname .dtb)";
@@ -114,6 +125,8 @@ cat << __CONF_SECTION1_EOF
                        fdt = "fdt_$cnt";
                };
 __CONF_SECTION1_EOF
+fi
+
 cnt=$((cnt+1))
 done
 
index 896657f51c3d4e65bd573c7a812e8db72ce7fd81..68df0a79c4e5e3a5ada00ae686bb1403f0a2453c 100644 (file)
@@ -6,7 +6,6 @@
  */
 
 #include <common.h>
-#include <debug_uart.h>
 #include <init.h>
 #include <spl.h>
 
@@ -20,14 +19,6 @@ void board_init_f(ulong dummy)
 {
        board_early_init_f();
        board_early_init_r();
-
-#ifdef CONFIG_DEBUG_UART
-       /* Uart debug for sure */
-       debug_uart_init();
-       puts("Debug uart enabled\n"); /* or printch() */
-#endif
-       /* Delay is required for clocks to be propagated */
-       udelay(1000000);
 }
 
 static void ps_mode_reset(ulong mode)
@@ -66,6 +57,8 @@ void board_boot_order(u32 *spl_boot_list)
                spl_boot_list[1] = BOOT_DEVICE_MMC2;
        if (spl_boot_list[0] == BOOT_DEVICE_MMC2)
                spl_boot_list[1] = BOOT_DEVICE_MMC1;
+
+       spl_boot_list[2] = BOOT_DEVICE_RAM;
 }
 
 u32 spl_boot_device(void)
index d36d9f06319994f4638ebfbfbad407e5c650f85d..7f23ff45887a3dea4a5270a6eaef30e51360a58b 100644 (file)
@@ -30,6 +30,6 @@ ldflags-$(CONFIG_MCF547x_8x)  := --got=single
 
 ifneq (,$(findstring -linux-,$(shell $(CC) --version)))
 ifneq (,$(findstring GOT,$(shell $(LD) --help)))
-PLATFORM_LDFLAGS += $(ldflags-y)
+KBUILD_LDFLAGS += $(ldflags-y)
 endif
 endif
index a27a5245fe89eb9f12a271f1e560a34406bc204b..88b1a409f26054f238be925729552b70d30eea70 100644 (file)
@@ -10,7 +10,7 @@ endif
 CONFIG_STANDALONE_LOAD_ADDR ?= 0x20000
 
 PLATFORM_CPPFLAGS += -D__M68K__
-PLATFORM_LDFLAGS  += -n
+KBUILD_LDFLAGS  += -n
 PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections
 PLATFORM_RELFLAGS += -ffixed-d7 -msep-data
 LDFLAGS_FINAL                  += --gc-sections
index 5ce8261451d33c9a46757ac4eae491157633a387..2bd260e5d76e2d4b576767c7234ca478f8eb89af 100644 (file)
@@ -30,7 +30,4 @@ config STACK_SIZE
 
 source "board/xilinx/microblaze-generic/Kconfig"
 
-config SPL_LDSCRIPT
-       default "arch/microblaze/cpu/u-boot-spl.lds"
-
 endmenu
index 527fd6a2fd925185c7be3f0257023b723fce9f43..faf4129ac16c3c18a49444bea3e4744324c79f3d 100644 (file)
@@ -9,7 +9,7 @@ ifdef CONFIG_SYS_BIG_ENDIAN
 32bit-bfd              := elf32-tradbigmips
 64bit-bfd              := elf64-tradbigmips
 PLATFORM_CPPFLAGS      += -EB
-PLATFORM_LDFLAGS       += -EB
+KBUILD_LDFLAGS         += -EB
 endif
 
 ifdef CONFIG_SYS_LITTLE_ENDIAN
@@ -18,19 +18,19 @@ ifdef CONFIG_SYS_LITTLE_ENDIAN
 32bit-bfd              := elf32-tradlittlemips
 64bit-bfd              := elf64-tradlittlemips
 PLATFORM_CPPFLAGS      += -EL
-PLATFORM_LDFLAGS       += -EL
+KBUILD_LDFLAGS         += -EL
 endif
 
 ifdef CONFIG_32BIT
 PLATFORM_CPPFLAGS      += -mabi=32
-PLATFORM_LDFLAGS       += -m $(32bit-emul)
+KBUILD_LDFLAGS         += -m $(32bit-emul)
 OBJCOPYFLAGS           += -O $(32bit-bfd)
 CONFIG_STANDALONE_LOAD_ADDR    ?= 0x80200000
 endif
 
 ifdef CONFIG_64BIT
 PLATFORM_CPPFLAGS      += -mabi=64
-PLATFORM_LDFLAGS       += -m$(64bit-emul)
+KBUILD_LDFLAGS         += -m$(64bit-emul)
 OBJCOPYFLAGS           += -O $(64bit-bfd)
 CONFIG_STANDALONE_LOAD_ADDR    ?= 0xffffffff80200000
 endif
@@ -62,7 +62,7 @@ endif
 
 PLATFORM_CPPFLAGS              += -G 0 -mno-abicalls -fno-pic
 PLATFORM_CPPFLAGS              += -msoft-float
-PLATFORM_LDFLAGS               += -G 0 -static -n -nostdlib
+KBUILD_LDFLAGS                 += -G 0 -static -n -nostdlib
 PLATFORM_RELFLAGS              += -ffunction-sections -fdata-sections
 LDFLAGS_FINAL                  += --gc-sections
 OBJCOPYFLAGS                   += -j .text -j .rodata -j .data -j .u_boot_list
index f5d21c837a4737308886dbe2ea4a5ea08005fc32..88e2c58cb44a62156986a3c1bc94611e4daea30b 100644 (file)
@@ -15,7 +15,7 @@ PLATFORM_RELFLAGS += -fpic -mrelocatable -ffunction-sections \
 
 PF_CPPFLAGS_POWERPC    := $(call cc-option,-fno-ira-hoist-pressure,)
 PLATFORM_CPPFLAGS += -D__powerpc__ -ffixed-r2 -m32 $(PF_CPPFLAGS_POWERPC)
-PLATFORM_LDFLAGS  += -m32 -melf32ppclinux
+KBUILD_LDFLAGS  += -m32 -melf32ppclinux
 
 #
 # When cross-compiling on NetBSD, we have to define __PPC__ or else we
index cc87da7e0433714500ae5a32947890ba6bdb3bec..3061bf886302ba1c71fec336cfdd3a641973efc7 100644 (file)
@@ -242,7 +242,4 @@ config STACK_SIZE_SHIFT
        int
        default 14
 
-config SPL_LDSCRIPT
-       default "arch/riscv/cpu/u-boot-spl.lds"
-
 endmenu
index 84654eb3ed87e72a153f43ee3831377f323f0755..1ebce5bd674815be420b8817a3480af03024c77c 100644 (file)
 64bit-emul             := elf64lriscv
 
 ifdef CONFIG_32BIT
-PLATFORM_LDFLAGS       += -m $(32bit-emul)
+KBUILD_LDFLAGS         += -m $(32bit-emul)
 EFI_LDS                        := elf_riscv32_efi.lds
 endif
 
 ifdef CONFIG_64BIT
-PLATFORM_LDFLAGS       += -m $(64bit-emul)
+KBUILD_LDFLAGS         += -m $(64bit-emul)
 EFI_LDS                        := elf_riscv64_efi.lds
 endif
 
index b5e8f46297912230610d3818dc871ddc2c734b25..27d8412661ff8ba4ed7efa32f9ea04785c157722 100644 (file)
@@ -29,11 +29,11 @@ endif
 
 PLATFORM_RELFLAGS += -fdata-sections -ffunction-sections -fvisibility=hidden
 
-PLATFORM_LDFLAGS += -Bsymbolic -Bsymbolic-functions
-PLATFORM_LDFLAGS += -m $(if $(IS_32BIT),elf_i386,elf_x86_64)
+KBUILD_LDFLAGS += -Bsymbolic -Bsymbolic-functions
+KBUILD_LDFLAGS += -m $(if $(IS_32BIT),elf_i386,elf_x86_64)
 
 # This is used in the top-level Makefile which does not include
-# PLATFORM_LDFLAGS
+# KBUILD_LDFLAGS
 LDFLAGS_EFI_PAYLOAD := -Bsymbolic -Bsymbolic-functions -shared --no-undefined -s
 
 OBJCOPYFLAGS_EFI := -j .text -j .sdata -j .data -j .dynamic -j .dynsym \
@@ -71,7 +71,7 @@ LDSCRIPT := $(LDSCRIPT_EFI)
 else
 
 PLATFORM_CPPFLAGS += $(CFLAGS_NON_EFI)
-PLATFORM_LDFLAGS += --emit-relocs
+KBUILD_LDFLAGS += --emit-relocs
 LDFLAGS_FINAL += --gc-sections $(if $(CONFIG_SPL_BUILD),,-pie)
 
 endif
index c0e7fb65b298facd00b7a1dd753083a792cdaea5..70ad8322ef4ae7fb881cb727b189b28788297af7 100644 (file)
@@ -22,7 +22,7 @@
 #define BMODE_PME              12
 #define BMODE_DIAG             15
 
-#ifdef CONFIG_LCD
+#if CONFIG_IS_ENABLED(LCD) && !CONFIG_IS_ENABLED(DM_VIDEO)
 #include <lcd.h>
 #define LCD_SETCURSOR(x, y)    lcd_position_cursor(x, y)
 #define LCD_PUTS(x)            lcd_puts(x)
index 2591bf4bb3ed54a319fc5224f5e2bac9c5db6daa..618cebc1a58aa7d5fc8a815bf3310a9264be4575 100644 (file)
 #ifndef _BUR_COMMON_H_
 #define _BUR_COMMON_H_
 
+#if !CONFIG_IS_ENABLED(DM_VIDEO)
 #include <../../../drivers/video/am335x-fb.h>
 
 int load_lcdtiming(struct am335x_lcdpanel *panel);
+#endif
+
 void br_summaryscreen(void);
 void pmicsetup(u32 mpupll, unsigned int bus);
 void enable_uart0_pin_mux(void);
index 148fc9075e4fffb098b6e61d599ff66d0bcc71c3..de8d455c27d9803dac6cf328a52348c7acefbe3c 100644 (file)
@@ -20,7 +20,7 @@ DECLARE_GLOBAL_DATA_PTR;
 
 /* --------------------------------------------------------------------------*/
 #if defined(CONFIG_LCD) && defined(CONFIG_AM335X_LCD) && \
-       !defined(CONFIG_SPL_BUILD)
+       !defined(CONFIG_DM_VIDEO) && !defined(CONFIG_SPL_BUILD)
 #include <asm/arch/hardware.h>
 #include <asm/arch/cpu.h>
 #include <asm/gpio.h>
index d3c5a4617bb2b5e13e7279c86ed888168cc2eac1..6f00f8738603af3c0d00ad366df7e4ea2d4e1b32 100644 (file)
@@ -5,3 +5,5 @@ L:      u-boot-amlogic@groups.io
 F:     board/amlogic/q200/
 F:     include/configs/q200.h
 F:     configs/khadas-vim2_defconfig
+F:     configs/libretech-s905d-pc_defconfig
+F:     configs/libretech-s912-pc_defconfig
index a342d2e05ec51fcf4772e84665d48080eca85f20..65544a844834eb7288213a5e3ee66aef4177e296 100644 (file)
@@ -1,8 +1,5 @@
 if TARGET_APF27
 
-config SPL_LDSCRIPT
-       default "arch/$(ARCH)/cpu/u-boot-spl.lds"
-
 config SYS_BOARD
        default "apf27"
 
index b9fc2d51778628ef5de6996572a8a0086a8a9406..055545c93063c5641ab7bd8fd283981b9bf808a3 100644 (file)
@@ -1,8 +1,5 @@
 if TARGET_MX31PDK
 
-config SPL_LDSCRIPT
-       default "arch/$(ARCH)/cpu/u-boot-spl.lds"
-
 config SYS_BOARD
        default "mx31pdk"
 
index e994a88e717cb379f1b818b09963868a672b5ef6..915164aa0b4a0e469406abdf5d809218decae7b7 100644 (file)
@@ -1,6 +1,32 @@
 // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
 /*
  * Copyright (C) 2019, STMicroelectronics - All Rights Reserved
+ *
+ * the st command stboard supports the STMicroelectronics board identification
+ * saved in OTP 59.
+ *
+ * The ST product codification have several element
+ * - "Commercial Product Name" (CPN): type of product board (DKX, EVX)
+ *   associated to the board ID "MBxxxx"
+ * - "Finished Good" or "Finish Good" (FG):
+ *   effective content of the product without chip STM32MP1xx (LCD, Wifi,…)
+ * - BOM: cost variant for same FG (for example, several provider of the same
+ *   component)
+ *
+ * For example
+ * - commercial product = STM32MP157C-EV1 for board MB1263
+ * - Finished Good = EVA32MP157A1$AU1
+ *
+ * Both information are written on board and these information are also saved
+ * in OTP59, with:
+ * bit [31:16] (hex) => Board id, MBxxxx
+ * bit [15:12] (dec) => Variant CPN (1....15)
+ * bit [11:8]  (dec) => Revision board (index with A = 1, Z = 26)
+ * bit [7:4]   (dec) => Variant FG : finished good index
+ * bit [3:0]   (dec) => BOM (01, .... 255)
+ *
+ * and displayed with the format:
+ *   Board: MB<Board> Var<VarCPN>.<VarFG> Rev.<Revision>-<BOM>
  */
 
 #ifndef CONFIG_SPL_BUILD
@@ -13,6 +39,7 @@
 static bool check_stboard(u16 board)
 {
        unsigned int i;
+       /* list of supported ST boards */
        const u16 st_board_id[] = {
                0x1272,
                0x1263,
@@ -31,9 +58,11 @@ static bool check_stboard(u16 board)
 
 static void display_stboard(u32 otp)
 {
-       printf("Board: MB%04x Var%d Rev.%c-%02d\n",
+       /* display board indentification with OPT coding */
+       printf("Board: MB%04x Var%d.%d Rev.%c-%02d\n",
               otp >> 16,
               (otp >> 12) & 0xF,
+              (otp >> 4) & 0xF,
               ((otp >> 8) & 0xF) - 1 + 'A',
               otp & 0xF);
 }
@@ -42,23 +71,23 @@ static int do_stboard(cmd_tbl_t *cmdtp, int flag, int argc,
                      char * const argv[])
 {
        int ret;
-       u32 otp;
+       u32 otp, lock;
        u8 revision;
-       unsigned long board, variant, bom;
+       unsigned long board, var_cpn, var_fg, bom;
        struct udevice *dev;
-       int confirmed = argc == 6 && !strcmp(argv[1], "-y");
+       int confirmed = argc == 7 && !strcmp(argv[1], "-y");
 
        argc -= 1 + confirmed;
        argv += 1 + confirmed;
 
-       if (argc != 0 && argc != 4)
+       if (argc != 0 && argc != 5)
                return CMD_RET_USAGE;
 
        ret = uclass_get_device_by_driver(UCLASS_MISC,
                                          DM_GET_DRIVER(stm32mp_bsec),
                                          &dev);
 
-       ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_BOARD),
+       ret = misc_read(dev, STM32_BSEC_OTP(BSEC_OTP_BOARD),
                        &otp, sizeof(otp));
 
        if (ret < 0) {
@@ -66,11 +95,20 @@ static int do_stboard(cmd_tbl_t *cmdtp, int flag, int argc,
                return CMD_RET_FAILURE;
        }
 
+       ret = misc_read(dev, STM32_BSEC_LOCK(BSEC_OTP_BOARD),
+                       &lock, sizeof(lock));
+       if (ret < 0) {
+               puts("LOCK read error");
+               return CMD_RET_FAILURE;
+       }
+
        if (argc == 0) {
                if (!otp)
                        puts("Board : OTP board FREE\n");
                else
                        display_stboard(otp);
+               printf("      OTP %d %s locked !\n", BSEC_OTP_BOARD,
+                      lock == 1 ? "" : "NOT");
                return CMD_RET_SUCCESS;
        }
 
@@ -86,8 +124,8 @@ static int do_stboard(cmd_tbl_t *cmdtp, int flag, int argc,
                return CMD_RET_USAGE;
        }
 
-       if (strict_strtoul(argv[1], 10, &variant) < 0 ||
-           variant == 0 || variant > 15) {
+       if (strict_strtoul(argv[1], 10, &var_cpn) < 0 ||
+           var_cpn == 0 || var_cpn > 15) {
                printf("argument %d invalid: %s\n", 2, argv[1]);
                return CMD_RET_USAGE;
        }
@@ -98,13 +136,21 @@ static int do_stboard(cmd_tbl_t *cmdtp, int flag, int argc,
                return CMD_RET_USAGE;
        }
 
-       if (strict_strtoul(argv[3], 10, &bom) < 0 ||
+       if (strict_strtoul(argv[3], 10, &var_fg) < 0 ||
+           var_fg > 15) {
+               printf("argument %d invalid: %s\n", 4, argv[3]);
+               return CMD_RET_USAGE;
+       }
+
+       if (strict_strtoul(argv[4], 10, &bom) < 0 ||
            bom == 0 || bom > 15) {
                printf("argument %d invalid: %s\n", 4, argv[3]);
                return CMD_RET_USAGE;
        }
 
-       otp = (board << 16) | (variant << 12) | (revision << 8) | bom;
+       /* st board indentification value */
+       otp = (board << 16) | (var_cpn << 12) | (revision << 8) |
+             (var_fg << 4) | bom;
        display_stboard(otp);
        printf("=> OTP[%d] = %08X\n", BSEC_OTP_BOARD, otp);
 
@@ -125,24 +171,35 @@ static int do_stboard(cmd_tbl_t *cmdtp, int flag, int argc,
        ret = misc_write(dev, STM32_BSEC_OTP(BSEC_OTP_BOARD),
                         &otp, sizeof(otp));
 
-       if (ret) {
+       if (ret < 0) {
                puts("BOARD programming error\n");
                return CMD_RET_FAILURE;
        }
+
+       /* write persistent lock */
+       otp = 1;
+       ret = misc_write(dev, STM32_BSEC_LOCK(BSEC_OTP_BOARD),
+                        &otp, sizeof(otp));
+       if (ret < 0) {
+               puts("BOARD lock error\n");
+               return CMD_RET_FAILURE;
+       }
+
        puts("BOARD programming done\n");
 
        return CMD_RET_SUCCESS;
 }
 
-U_BOOT_CMD(stboard, 6, 0, do_stboard,
+U_BOOT_CMD(stboard, 7, 0, do_stboard,
           "read/write board reference in OTP",
           "\n"
           "  Print current board information\n"
-          "stboard [-y] <Board> <Variant> <Revision> <BOM>\n"
+          "stboard [-y] <Board> <VarCPN> <Revision> <VarFG> <BOM>\n"
           "  Write board information\n"
           "  - Board: xxxx, example 1264 for MB1264\n"
-          "  - Variant: 1 ... 15\n"
+          "  - VarCPN: 1...15\n"
           "  - Revision: A...O\n"
+          "  - VarFG: 0...15\n"
           "  - BOM: 1...15\n");
 
 #endif
index c3d832f58489bd3ca5e5b37ad6696dc94c4eb727..4e35d36c76ddaf3778466765a5293d439c179cc3 100644 (file)
@@ -43,6 +43,7 @@ int board_ddr_power_init(enum ddr_type ddr_type)
        struct udevice *dev;
        bool buck3_at_1800000v = false;
        int ret;
+       u32 buck2;
 
        ret = uclass_get_device_by_driver(UCLASS_PMIC,
                                          DM_GET_DRIVER(pmic_stpmic1), &dev);
@@ -102,8 +103,10 @@ int board_ddr_power_init(enum ddr_type ddr_type)
 
                break;
 
-       case STM32MP_LPDDR2:
-       case STM32MP_LPDDR3:
+       case STM32MP_LPDDR2_16:
+       case STM32MP_LPDDR2_32:
+       case STM32MP_LPDDR3_16:
+       case STM32MP_LPDDR3_32:
                /*
                 * configure VDD_DDR1 = LDO3
                 * Set LDO3 to 1.8V
@@ -133,11 +136,23 @@ int board_ddr_power_init(enum ddr_type ddr_type)
                if (ret < 0)
                        return ret;
 
-               /* VDD_DDR2 : Set BUCK2 to 1.2V */
+               /* VDD_DDR2 : Set BUCK2 to 1.2V (16bits) or 1.25V (32 bits)*/
+               switch (ddr_type) {
+               case STM32MP_LPDDR2_32:
+               case STM32MP_LPDDR3_32:
+                       buck2 = STPMIC1_BUCK2_1250000V;
+                       break;
+               default:
+               case STM32MP_LPDDR2_16:
+               case STM32MP_LPDDR3_16:
+                       buck2 = STPMIC1_BUCK2_1200000V;
+                       break;
+               }
+
                ret = pmic_clrsetbits(dev,
                                      STPMIC1_BUCKX_MAIN_CR(STPMIC1_BUCK2),
                                      STPMIC1_BUCK_VOUT_MASK,
-                                     STPMIC1_BUCK2_1200000V);
+                                     buck2);
                if (ret < 0)
                        return ret;
 
index c36e7655c0726c900f80695fe56528a747cfa008..07f5344ec90f5aef7d78e1da6e0c44f6f48cb110 100644 (file)
@@ -104,19 +104,21 @@ int checkboard(void)
                printf(" (%s)", fdt_compat);
        puts("\n");
 
-       ret = uclass_get_device_by_driver(UCLASS_MISC,
-                                         DM_GET_DRIVER(stm32mp_bsec),
-                                         &dev);
-
-       if (!ret)
-               ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_BOARD),
-                               &otp, sizeof(otp));
-       if (ret > 0 && otp) {
-               printf("Board: MB%04x Var%d Rev.%c-%02d\n",
-                      otp >> 16,
-                      (otp >> 12) & 0xF,
-                      ((otp >> 8) & 0xF) - 1 + 'A',
-                      otp & 0xF);
+       /* display the STMicroelectronics board identification */
+       if (CONFIG_IS_ENABLED(CMD_STBOARD)) {
+               ret = uclass_get_device_by_driver(UCLASS_MISC,
+                                                 DM_GET_DRIVER(stm32mp_bsec),
+                                                 &dev);
+               if (!ret)
+                       ret = misc_read(dev, STM32_BSEC_SHADOW(BSEC_OTP_BOARD),
+                                       &otp, sizeof(otp));
+               if (ret > 0 && otp)
+                       printf("Board: MB%04x Var%d.%d Rev.%c-%02d\n",
+                              otp >> 16,
+                              (otp >> 12) & 0xF,
+                              (otp >> 4) & 0xF,
+                              ((otp >> 8) & 0xF) - 1 + 'A',
+                              otp & 0xF);
        }
 
        return 0;
index 2e3fd9c4a81080ae7321c7ecf8432c034e653f96..00be1ffe44d6147279a94f1d79cb5090131b9b35 100644 (file)
@@ -104,7 +104,7 @@ requests DMSC to get these services done as shown in the above diagram.
 Sources:
 --------
 1. SYSFW:
-       Tree: git://git.ti.com/processor-firmware/system-firmware-image-gen.git
+       Tree: git://git.ti.com/k3-image-gen/k3-image-gen.git
        Branch: master
 
 2. ATF:
@@ -138,7 +138,7 @@ $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=/tmp/r5
 
 4.2. A53:
 $ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- am65x_evm_a53_defconfig O=/tmp/a53
-$ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- ATF=<path to ATF dir>/build/k3/generic/release/bl31.bin TEE=<path to OPTEE OS dir>/out/arm-plat-k3/core/tee-pager.bin O=/tmp/a53
+$ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- ATF=<path to ATF dir>/build/k3/generic/release/bl31.bin TEE=<path to OPTEE OS dir>/out/arm-plat-k3/core/tee-pager_v2.bin O=/tmp/a53
 
 Target Images
 --------------
@@ -262,6 +262,61 @@ To boot kernel from eMMC, use the following commands:
 => setenv bootpart 0
 => boot
 
+OSPI:
+-----
+ROM supports booting from OSPI from offset 0x0.
+
+Flashing images to OSPI:
+
+Below commands can be used to download tiboot3.bin, tispl.bin, u-boot.img,
+and sysfw.itb over tftp and then flash those to OSPI at their respective
+addresses.
+
+=> sf probe
+=> tftp ${loadaddr} tiboot3.bin
+=> sf update $loadaddr 0x0 $filesize
+=> tftp ${loadaddr} tispl.bin
+=> sf update $loadaddr 0x80000 $filesize
+=> tftp ${loadaddr} u-boot.img
+=> sf update $loadaddr 0x280000 $filesize
+=> tftp ${loadaddr} sysfw.itb
+=> sf update $loadaddr 0x6C0000 $filesize
+
+Flash layout for OSPI:
+
+         0x0 +----------------------------+
+             |     ospi.tiboot3(512K)     |
+             |                            |
+     0x80000 +----------------------------+
+             |     ospi.tispl(2M)         |
+             |                            |
+    0x280000 +----------------------------+
+             |     ospi.u-boot(4M)        |
+             |                            |
+    0x680000 +----------------------------+
+             |     ospi.env(128K)         |
+             |                            |
+    0x6A0000 +----------------------------+
+            |   ospi.env.backup (128K)   |
+            |                            |
+    0x6C0000 +----------------------------+
+             |      ospi.sysfw(1M)        |
+             |                            |
+    0x7C0000 +----------------------------+
+            |      padding (256k)        |
+    0x800000 +----------------------------+
+             |     ospi.rootfs(UBIFS)     |
+             |                            |
+             +----------------------------+
+
+Kernel Image and DT are expected to be present in the /boot folder of UBIFS
+ospi.rootfs just like in SD card case. U-Boot looks for UBI volume named
+"rootfs" for rootfs.
+
+To boot kernel from OSPI, at the U-Boot prompt:
+=> setenv boot ubi
+=> boot
+
 UART:
 -----
 ROM supports booting from MCU_UART0 via X-Modem protocol. The entire UART-based
index 5be7d099db962d4bd325493a8e3aa99171867bec..7dcf33633294891e61af958b305650b342ebb1f1 100644 (file)
@@ -120,7 +120,7 @@ requests DMSC to get these services done as shown in the above diagram.
 Sources:
 --------
 1. SYSFW:
-       Tree: git://git.ti.com/processor-firmware/system-firmware-image-gen.git
+       Tree: git://git.ti.com/k3-image-gen/k3-image-gen.git
        Branch: master
 
 2. ATF:
@@ -154,7 +154,7 @@ $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=/tmp/r5
 
 4.2. A72:
 $ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- j721e_evm_a72_defconfig O=/tmp/a72
-$ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- ATF=<path to ATF dir>/build/k3/generic/release/bl31.bin TEE=<path to OPTEE OS dir>/out/arm-plat-k3/core/tee-pager.bin O=/tmp/a72
+$ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- ATF=<path to ATF dir>/build/k3/generic/release/bl31.bin TEE=<path to OPTEE OS dir>/out/arm-plat-k3/core/tee-pager_v2.bin O=/tmp/a72
 
 Target Images
 --------------
@@ -225,3 +225,50 @@ Image formats:
                 | |    Secure config  | |
                 | +-------------------+ |
                 +-----------------------+
+
+OSPI:
+-----
+ROM supports booting from OSPI from offset 0x0.
+
+Flashing images to OSPI:
+
+Below commands can be used to download tiboot3.bin, tispl.bin, u-boot.img,
+and sysfw.itb over tftp and then flash those to OSPI at their respective
+addresses.
+
+=> sf probe
+=> tftp ${loadaddr} tiboot3.bin
+=> sf update $loadaddr 0x0 $filesize
+=> tftp ${loadaddr} tispl.bin
+=> sf update $loadaddr 0x80000 $filesize
+=> tftp ${loadaddr} u-boot.img
+=> sf update $loadaddr 0x280000 $filesize
+=> tftp ${loadaddr} sysfw.itb
+=> sf update $loadaddr 0x6C0000 $filesize
+
+Flash layout for OSPI:
+
+         0x0 +----------------------------+
+             |     ospi.tiboot3(512K)     |
+             |                            |
+     0x80000 +----------------------------+
+             |     ospi.tispl(2M)         |
+             |                            |
+    0x280000 +----------------------------+
+             |     ospi.u-boot(4M)        |
+             |                            |
+    0x680000 +----------------------------+
+             |     ospi.env(128K)         |
+             |                            |
+    0x6A0000 +----------------------------+
+            |   ospi.env.backup (128K)   |
+            |                            |
+    0x6C0000 +----------------------------+
+             |      ospi.sysfw(1M)        |
+             |                            |
+    0x7C0000 +----------------------------+
+            |      padding (256k)        |
+    0x800000 +----------------------------+
+             |     ospi.rootfs(UBIFS)     |
+             |                            |
+             +----------------------------+
index aa2240b8523b9c8498ff74a07dfe39ff287e40f5..c068bb86b594577d2c2dee4160c6857d2061638a 100644 (file)
@@ -15,6 +15,8 @@
 #include <asm/io.h>
 #include <spl.h>
 #include <asm/arch/sys_proto.h>
+#include <dm.h>
+#include <dm/uclass-internal.h>
 
 #include "../common/board_detect.h"
 
@@ -343,5 +345,29 @@ int board_late_init(void)
 
 void spl_board_init(void)
 {
+#if defined(CONFIG_ESM_K3) || defined(CONFIG_ESM_PMIC)
+       struct udevice *dev;
+       int ret;
+#endif
+
        probe_daughtercards();
+
+#ifdef CONFIG_ESM_K3
+       if (board_ti_k3_is("J721EX-PM2-SOM")) {
+               ret = uclass_get_device_by_driver(UCLASS_MISC,
+                                                 DM_GET_DRIVER(k3_esm), &dev);
+               if (ret)
+                       printf("ESM init failed: %d\n", ret);
+       }
+#endif
+
+#ifdef CONFIG_ESM_PMIC
+       if (board_ti_k3_is("J721EX-PM2-SOM")) {
+               ret = uclass_get_device_by_driver(UCLASS_MISC,
+                                                 DM_GET_DRIVER(pmic_esm),
+                                                 &dev);
+               if (ret)
+                       printf("ESM PMIC init failed: %d\n", ret);
+       }
+#endif
 }
index f87e2e91059e3f82c36ea68a3cfb68b87451fefa..e83c692f2174101e634b29364b679730d067ddb7 100644 (file)
@@ -41,12 +41,16 @@ int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)
 #if defined(CONFIG_OF_BOARD) || defined(CONFIG_OF_SEPARATE)
 void *board_fdt_blob_setup(void)
 {
-       static void *fdt_blob = (void *)CONFIG_XILINX_OF_BOARD_DTB_ADDR;
+       static void *fdt_blob;
+
+#if !defined(CONFIG_VERSAL_NO_DDR) && !defined(CONFIG_ZYNQMP_NO_DDR)
+       fdt_blob = (void *)CONFIG_XILINX_OF_BOARD_DTB_ADDR;
 
        if (fdt_magic(fdt_blob) == FDT_MAGIC)
                return fdt_blob;
 
        debug("DTB is not passed via %p\n", fdt_blob);
+#endif
 
 #ifdef CONFIG_SPL_BUILD
        /* FDT is at end of BSS unless it is in a different memory region */
diff --git a/board/xilinx/zynqmp/zynqmp-zcu102-rev1.1/psu_init_gpl.c b/board/xilinx/zynqmp/zynqmp-zcu102-rev1.1/psu_init_gpl.c
new file mode 100644 (file)
index 0000000..1f3f2e6
--- /dev/null
@@ -0,0 +1,1042 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (c) Copyright 2015 Xilinx, Inc. All rights reserved.
+ */
+
+#include <asm/arch/psu_init_gpl.h>
+#include <xil_io.h>
+
+static unsigned long psu_pll_init_data(void)
+{
+       psu_mask_write(0xFF5E0034, 0xFE7FEDEFU, 0x7E4B0C62U);
+       psu_mask_write(0xFF5E0030, 0x00717F00U, 0x00014400U);
+       psu_mask_write(0xFF5E0030, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFF5E0030, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFF5E0030, 0x00000001U, 0x00000000U);
+       mask_poll(0xFF5E0040, 0x00000002U);
+       psu_mask_write(0xFF5E0030, 0x00000008U, 0x00000000U);
+       psu_mask_write(0xFF5E0048, 0x00003F00U, 0x00000300U);
+       psu_mask_write(0xFF5E0108, 0x013F3F07U, 0x01012300U);
+       psu_mask_write(0xFF5E0024, 0xFE7FEDEFU, 0x7E4B0C82U);
+       psu_mask_write(0xFF5E0020, 0x00717F00U, 0x00015B00U);
+       psu_mask_write(0xFF5E0020, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFF5E0020, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFF5E0020, 0x00000001U, 0x00000000U);
+       mask_poll(0xFF5E0040, 0x00000001U);
+       psu_mask_write(0xFF5E0020, 0x00000008U, 0x00000000U);
+       psu_mask_write(0xFF5E0044, 0x00003F00U, 0x00000300U);
+       psu_mask_write(0xFD1A0024, 0xFE7FEDEFU, 0x7E4B0C62U);
+       psu_mask_write(0xFD1A0020, 0x00717F00U, 0x00014800U);
+       psu_mask_write(0xFD1A0020, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFD1A0020, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD1A0020, 0x00000001U, 0x00000000U);
+       mask_poll(0xFD1A0044, 0x00000001U);
+       psu_mask_write(0xFD1A0020, 0x00000008U, 0x00000000U);
+       psu_mask_write(0xFD1A0048, 0x00003F00U, 0x00000300U);
+       psu_mask_write(0xFD1A0030, 0xFE7FEDEFU, 0x7E4B0C62U);
+       psu_mask_write(0xFD1A002C, 0x00717F00U, 0x00014000U);
+       psu_mask_write(0xFD1A002C, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFD1A002C, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD1A002C, 0x00000001U, 0x00000000U);
+       mask_poll(0xFD1A0044, 0x00000002U);
+       psu_mask_write(0xFD1A002C, 0x00000008U, 0x00000000U);
+       psu_mask_write(0xFD1A004C, 0x00003F00U, 0x00000200U);
+       psu_mask_write(0xFD1A003C, 0xFE7FEDEFU, 0x7E4B0C82U);
+       psu_mask_write(0xFD1A0038, 0x00717F00U, 0x00015A00U);
+       psu_mask_write(0xFD1A0038, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFD1A0038, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD1A0038, 0x00000001U, 0x00000000U);
+       mask_poll(0xFD1A0044, 0x00000004U);
+       psu_mask_write(0xFD1A0038, 0x00000008U, 0x00000000U);
+       psu_mask_write(0xFD1A0050, 0x00003F00U, 0x00000300U);
+
+       return 1;
+}
+
+static unsigned long psu_clock_init_data(void)
+{
+       psu_mask_write(0xFF5E005C, 0x063F3F07U, 0x06010D00U);
+       psu_mask_write(0xFF5E0100, 0x013F3F07U, 0x01010700U);
+       psu_mask_write(0xFF5E0060, 0x023F3F07U, 0x02010700U);
+       psu_mask_write(0xFF5E004C, 0x023F3F07U, 0x02022600U);
+       psu_mask_write(0xFF5E0068, 0x013F3F07U, 0x01010D00U);
+       psu_mask_write(0xFF5E0070, 0x013F3F07U, 0x01010800U);
+       psu_mask_write(0xFF18030C, 0x00020000U, 0x00000000U);
+       psu_mask_write(0xFF5E0074, 0x013F3F07U, 0x01011000U);
+       psu_mask_write(0xFF5E0078, 0x013F3F07U, 0x01011000U);
+       psu_mask_write(0xFF5E0120, 0x013F3F07U, 0x01011000U);
+       psu_mask_write(0xFF5E0124, 0x013F3F07U, 0x01011000U);
+       psu_mask_write(0xFF5E0088, 0x013F3F07U, 0x01011000U);
+       psu_mask_write(0xFF5E0090, 0x01003F07U, 0x01000402U);
+       psu_mask_write(0xFF5E009C, 0x01003F07U, 0x01000702U);
+       psu_mask_write(0xFF5E00A4, 0x01003F07U, 0x01000800U);
+       psu_mask_write(0xFF5E00A8, 0x01003F07U, 0x01000402U);
+       psu_mask_write(0xFF5E00AC, 0x01003F07U, 0x01001002U);
+       psu_mask_write(0xFF5E00B0, 0x01003F07U, 0x01000702U);
+       psu_mask_write(0xFF5E00B8, 0x01003F07U, 0x01000402U);
+       psu_mask_write(0xFF5E00C0, 0x013F3F07U, 0x01011000U);
+       psu_mask_write(0xFF5E0108, 0x013F3F07U, 0x01011F02U);
+       psu_mask_write(0xFF5E0104, 0x00000007U, 0x00000000U);
+       psu_mask_write(0xFF5E0128, 0x01003F07U, 0x01001000U);
+       psu_mask_write(0xFD1A00A0, 0x01003F07U, 0x01000300U);
+       psu_mask_write(0xFD1A00B4, 0x01003F07U, 0x01000300U);
+       psu_mask_write(0xFD1A0070, 0x013F3F07U, 0x01010500U);
+       psu_mask_write(0xFD1A0074, 0x013F3F07U, 0x01010F03U);
+       psu_mask_write(0xFD1A007C, 0x013F3F07U, 0x01010E03U);
+       psu_mask_write(0xFD1A0060, 0x03003F07U, 0x03000100U);
+       psu_mask_write(0xFD1A0068, 0x01003F07U, 0x01000300U);
+       psu_mask_write(0xFD1A0080, 0x00003F07U, 0x00000200U);
+       psu_mask_write(0xFD1A0084, 0x07003F07U, 0x07000200U);
+       psu_mask_write(0xFD1A00B8, 0x01003F07U, 0x01000200U);
+       psu_mask_write(0xFD1A00BC, 0x01003F07U, 0x01000200U);
+       psu_mask_write(0xFD1A00C0, 0x01003F07U, 0x01000203U);
+       psu_mask_write(0xFD1A00C4, 0x01003F07U, 0x01000602U);
+       psu_mask_write(0xFD1A00F8, 0x00003F07U, 0x00000300U);
+       psu_mask_write(0xFF180380, 0x000000FFU, 0x00000000U);
+       psu_mask_write(0xFD610100, 0x00000001U, 0x00000000U);
+       psu_mask_write(0xFF180300, 0x00000001U, 0x00000000U);
+       psu_mask_write(0xFF410050, 0x00000001U, 0x00000000U);
+
+       return 1;
+}
+
+static unsigned long psu_ddr_init_data(void)
+{
+       psu_mask_write(0xFD1A0108, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFD070000, 0xE30FBE3DU, 0x41040010U);
+       psu_mask_write(0xFD070010, 0x8000F03FU, 0x00000030U);
+       psu_mask_write(0xFD070020, 0x000003F3U, 0x00000200U);
+       psu_mask_write(0xFD070024, 0xFFFFFFFFU, 0x00800000U);
+       psu_mask_write(0xFD070030, 0x0000007FU, 0x00000000U);
+       psu_mask_write(0xFD070034, 0x00FFFF1FU, 0x00408210U);
+       psu_mask_write(0xFD070050, 0x00F1F1F4U, 0x00210000U);
+       psu_mask_write(0xFD070054, 0x0FFF0FFFU, 0x00000000U);
+       psu_mask_write(0xFD070060, 0x00000073U, 0x00000001U);
+       psu_mask_write(0xFD070064, 0x0FFF83FFU, 0x0080808AU);
+       psu_mask_write(0xFD070070, 0x00000017U, 0x00000010U);
+       psu_mask_write(0xFD070074, 0x00000003U, 0x00000000U);
+       psu_mask_write(0xFD0700C4, 0x3F000391U, 0x10000200U);
+       psu_mask_write(0xFD0700C8, 0x01FF1F3FU, 0x0040051FU);
+       psu_mask_write(0xFD0700D0, 0xC3FF0FFFU, 0x00020103U);
+       psu_mask_write(0xFD0700D4, 0x01FF7F0FU, 0x00020000U);
+       psu_mask_write(0xFD0700D8, 0x0000FF0FU, 0x00002305U);
+       psu_mask_write(0xFD0700DC, 0xFFFFFFFFU, 0x07300301U);
+       psu_mask_write(0xFD0700E0, 0xFFFFFFFFU, 0x00200200U);
+       psu_mask_write(0xFD0700E4, 0x00FF03FFU, 0x00210004U);
+       psu_mask_write(0xFD0700E8, 0xFFFFFFFFU, 0x000006C0U);
+       psu_mask_write(0xFD0700EC, 0xFFFF0000U, 0x08190000U);
+       psu_mask_write(0xFD0700F0, 0x0000003FU, 0x00000010U);
+       psu_mask_write(0xFD0700F4, 0x00000FFFU, 0x0000066FU);
+       psu_mask_write(0xFD070100, 0x7F3F7F3FU, 0x11102311U);
+       psu_mask_write(0xFD070104, 0x001F1F7FU, 0x00040419U);
+       psu_mask_write(0xFD070108, 0x3F3F3F3FU, 0x0708060DU);
+       psu_mask_write(0xFD07010C, 0x3FF3F3FFU, 0x0050400CU);
+       psu_mask_write(0xFD070110, 0x1F0F0F1FU, 0x08030309U);
+       psu_mask_write(0xFD070114, 0x0F0F3F1FU, 0x06060403U);
+       psu_mask_write(0xFD070118, 0x0F0F000FU, 0x01010004U);
+       psu_mask_write(0xFD07011C, 0x00000F0FU, 0x00000606U);
+       psu_mask_write(0xFD070120, 0x7F7F7F7FU, 0x03030D06U);
+       psu_mask_write(0xFD070124, 0x40070F3FU, 0x0002020BU);
+       psu_mask_write(0xFD07012C, 0x7F1F031FU, 0x1107010EU);
+       psu_mask_write(0xFD070130, 0x00030F1FU, 0x00020608U);
+       psu_mask_write(0xFD070180, 0xF7FF03FFU, 0x81000040U);
+       psu_mask_write(0xFD070184, 0x3FFFFFFFU, 0x020192D5U);
+       psu_mask_write(0xFD070190, 0x1FBFBF3FU, 0x048B820BU);
+       psu_mask_write(0xFD070194, 0xF31F0F0FU, 0x00030304U);
+       psu_mask_write(0xFD070198, 0x0FF1F1F1U, 0x07000101U);
+       psu_mask_write(0xFD07019C, 0x000000F1U, 0x00000021U);
+       psu_mask_write(0xFD0701A0, 0xC3FF03FFU, 0x00400003U);
+       psu_mask_write(0xFD0701A4, 0x00FF00FFU, 0x00C800FFU);
+       psu_mask_write(0xFD0701B0, 0x00000007U, 0x00000000U);
+       psu_mask_write(0xFD0701B4, 0x00003F3FU, 0x00000909U);
+       psu_mask_write(0xFD0701C0, 0x00000007U, 0x00000001U);
+       psu_mask_write(0xFD070200, 0x0000001FU, 0x0000001FU);
+       psu_mask_write(0xFD070204, 0x001F1F1FU, 0x001F0A0AU);
+       psu_mask_write(0xFD070208, 0x0F0F0F0FU, 0x01010100U);
+       psu_mask_write(0xFD07020C, 0x0F0F0F0FU, 0x01010101U);
+       psu_mask_write(0xFD070210, 0x00000F0FU, 0x00000F0FU);
+       psu_mask_write(0xFD070214, 0x0F0F0F0FU, 0x080F0808U);
+       psu_mask_write(0xFD070218, 0x8F0F0F0FU, 0x0F080808U);
+       psu_mask_write(0xFD07021C, 0x00000F0FU, 0x00000F0FU);
+       psu_mask_write(0xFD070220, 0x00001F1FU, 0x00000801U);
+       psu_mask_write(0xFD070224, 0x0F0F0F0FU, 0x08080808U);
+       psu_mask_write(0xFD070228, 0x0F0F0F0FU, 0x08080808U);
+       psu_mask_write(0xFD07022C, 0x0000000FU, 0x00000008U);
+       psu_mask_write(0xFD070240, 0x0F1F0F7CU, 0x06000600U);
+       psu_mask_write(0xFD070244, 0x00003333U, 0x00000001U);
+       psu_mask_write(0xFD070250, 0x7FFF3F07U, 0x01002001U);
+       psu_mask_write(0xFD070264, 0xFF00FFFFU, 0x08000040U);
+       psu_mask_write(0xFD07026C, 0xFF00FFFFU, 0x08000040U);
+       psu_mask_write(0xFD070280, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD070284, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD070288, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD07028C, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD070290, 0x0000FFFFU, 0x00000000U);
+       psu_mask_write(0xFD070294, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD070300, 0x00000011U, 0x00000000U);
+       psu_mask_write(0xFD07030C, 0x80000033U, 0x00000000U);
+       psu_mask_write(0xFD070320, 0x00000001U, 0x00000000U);
+       psu_mask_write(0xFD070400, 0x00000111U, 0x00000001U);
+       psu_mask_write(0xFD070404, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070408, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070490, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD070494, 0x0033000FU, 0x0020000BU);
+       psu_mask_write(0xFD070498, 0x07FF07FFU, 0x00000000U);
+       psu_mask_write(0xFD0704B4, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD0704B8, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070540, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD070544, 0x03330F0FU, 0x02000B03U);
+       psu_mask_write(0xFD070548, 0x07FF07FFU, 0x00000000U);
+       psu_mask_write(0xFD070564, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070568, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD0705F0, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD0705F4, 0x03330F0FU, 0x02000B03U);
+       psu_mask_write(0xFD0705F8, 0x07FF07FFU, 0x00000000U);
+       psu_mask_write(0xFD070614, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070618, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD0706A0, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD0706A4, 0x0033000FU, 0x00100003U);
+       psu_mask_write(0xFD0706A8, 0x07FF07FFU, 0x0000004FU);
+       psu_mask_write(0xFD0706AC, 0x0033000FU, 0x00100003U);
+       psu_mask_write(0xFD0706B0, 0x000007FFU, 0x0000004FU);
+       psu_mask_write(0xFD0706C4, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD0706C8, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070750, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD070754, 0x0033000FU, 0x00100003U);
+       psu_mask_write(0xFD070758, 0x07FF07FFU, 0x0000004FU);
+       psu_mask_write(0xFD07075C, 0x0033000FU, 0x00100003U);
+       psu_mask_write(0xFD070760, 0x000007FFU, 0x0000004FU);
+       psu_mask_write(0xFD070774, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070778, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070800, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD070804, 0x0033000FU, 0x00100003U);
+       psu_mask_write(0xFD070808, 0x07FF07FFU, 0x0000004FU);
+       psu_mask_write(0xFD07080C, 0x0033000FU, 0x00100003U);
+       psu_mask_write(0xFD070810, 0x000007FFU, 0x0000004FU);
+       psu_mask_write(0xFD070F04, 0x000001FFU, 0x00000000U);
+       psu_mask_write(0xFD070F08, 0x000000FFU, 0x00000000U);
+       psu_mask_write(0xFD070F0C, 0x000001FFU, 0x00000010U);
+       psu_mask_write(0xFD070F10, 0x000000FFU, 0x0000000FU);
+       psu_mask_write(0xFD072190, 0x1FBFBF3FU, 0x07828002U);
+       psu_mask_write(0xFD1A0108, 0x0000000CU, 0x00000000U);
+       psu_mask_write(0xFD080010, 0xFFFFFFFFU, 0x07001E00U);
+       psu_mask_write(0xFD080018, 0xFFFFFFFFU, 0x00F0FD78U);
+       psu_mask_write(0xFD08001C, 0xFFFFFFFFU, 0x55AA5480U);
+       psu_mask_write(0xFD080024, 0xFFFFFFFFU, 0x010100F4U);
+       psu_mask_write(0xFD080040, 0xFFFFFFFFU, 0x42021010U);
+       psu_mask_write(0xFD080044, 0xFFFFFFFFU, 0xCE401290U);
+       psu_mask_write(0xFD080068, 0xFFFFFFFFU, 0x01100000U);
+       psu_mask_write(0xFD080090, 0xFFFFFFFFU, 0x02A04161U);
+       psu_mask_write(0xFD0800C0, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD0800C4, 0xFFFFFFFFU, 0x000000E0U);
+       psu_mask_write(0xFD080100, 0xFFFFFFFFU, 0x0800040CU);
+       psu_mask_write(0xFD080110, 0xFFFFFFFFU, 0x06220F08U);
+       psu_mask_write(0xFD080114, 0xFFFFFFFFU, 0x28200008U);
+       psu_mask_write(0xFD080118, 0xFFFFFFFFU, 0x000F0300U);
+       psu_mask_write(0xFD08011C, 0xFFFFFFFFU, 0x83000800U);
+       psu_mask_write(0xFD080120, 0xFFFFFFFFU, 0x01132B07U);
+       psu_mask_write(0xFD080124, 0xFFFFFFFFU, 0x00320F08U);
+       psu_mask_write(0xFD080128, 0xFFFFFFFFU, 0x00000E0FU);
+       psu_mask_write(0xFD080140, 0xFFFFFFFFU, 0x08400020U);
+       psu_mask_write(0xFD080144, 0xFFFFFFFFU, 0x00000C80U);
+       psu_mask_write(0xFD080150, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080154, 0xFFFFFFFFU, 0x00000200U);
+       psu_mask_write(0xFD080180, 0xFFFFFFFFU, 0x00000630U);
+       psu_mask_write(0xFD080184, 0xFFFFFFFFU, 0x00000301U);
+       psu_mask_write(0xFD080188, 0xFFFFFFFFU, 0x00000020U);
+       psu_mask_write(0xFD08018C, 0xFFFFFFFFU, 0x00000200U);
+       psu_mask_write(0xFD080190, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080194, 0xFFFFFFFFU, 0x000006C0U);
+       psu_mask_write(0xFD080198, 0xFFFFFFFFU, 0x00000819U);
+       psu_mask_write(0xFD0801AC, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD0801B0, 0xFFFFFFFFU, 0x0000004DU);
+       psu_mask_write(0xFD0801B4, 0xFFFFFFFFU, 0x00000008U);
+       psu_mask_write(0xFD0801B8, 0xFFFFFFFFU, 0x0000004DU);
+       psu_mask_write(0xFD0801D8, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080200, 0xFFFFFFFFU, 0x800091C7U);
+       psu_mask_write(0xFD080204, 0xFFFFFFFFU, 0x00010236U);
+       psu_mask_write(0xFD080240, 0xFFFFFFFFU, 0x00141054U);
+       psu_mask_write(0xFD080250, 0xFFFFFFFFU, 0x00088000U);
+       psu_mask_write(0xFD080414, 0xFFFFFFFFU, 0x12341000U);
+       psu_mask_write(0xFD0804F4, 0xFFFFFFFFU, 0x00000005U);
+       psu_mask_write(0xFD080500, 0xFFFFFFFFU, 0x30000028U);
+       psu_mask_write(0xFD080508, 0xFFFFFFFFU, 0x0A000000U);
+       psu_mask_write(0xFD08050C, 0xFFFFFFFFU, 0x00000009U);
+       psu_mask_write(0xFD080510, 0xFFFFFFFFU, 0x0A000000U);
+       psu_mask_write(0xFD080520, 0xFFFFFFFFU, 0x0300B0CEU);
+       psu_mask_write(0xFD080528, 0xFFFFFFFFU, 0xF9032019U);
+       psu_mask_write(0xFD08052C, 0xFFFFFFFFU, 0x07F001E3U);
+       psu_mask_write(0xFD080544, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080548, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080558, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD08055C, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080560, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080564, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080680, 0xFFFFFFFFU, 0x008AAA58U);
+       psu_mask_write(0xFD080684, 0xFFFFFFFFU, 0x000079DDU);
+       psu_mask_write(0xFD080694, 0xFFFFFFFFU, 0x01E10210U);
+       psu_mask_write(0xFD080698, 0xFFFFFFFFU, 0x01E10000U);
+       psu_mask_write(0xFD0806A4, 0xFFFFFFFFU, 0x00087BDBU);
+       psu_mask_write(0xFD080700, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080704, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD08070C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080710, 0xFFFFFFFFU, 0x0E00B03CU);
+       psu_mask_write(0xFD080714, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080718, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080800, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080804, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD08080C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080810, 0xFFFFFFFFU, 0x0E00B03CU);
+       psu_mask_write(0xFD080814, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080818, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080900, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080904, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD08090C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080910, 0xFFFFFFFFU, 0x0E00B004U);
+       psu_mask_write(0xFD080914, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080918, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080A00, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080A04, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD080A0C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080A10, 0xFFFFFFFFU, 0x0E00B004U);
+       psu_mask_write(0xFD080A14, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080A18, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080B00, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080B04, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD080B08, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080B0C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080B10, 0xFFFFFFFFU, 0x0E00B004U);
+       psu_mask_write(0xFD080B14, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080B18, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080C00, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080C04, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD080C08, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080C0C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080C10, 0xFFFFFFFFU, 0x0E00B03CU);
+       psu_mask_write(0xFD080C14, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080C18, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080D00, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080D04, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD080D08, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080D0C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080D10, 0xFFFFFFFFU, 0x0E00B004U);
+       psu_mask_write(0xFD080D14, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080D18, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080E00, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080E04, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD080E08, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080E0C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080E10, 0xFFFFFFFFU, 0x0E00B03CU);
+       psu_mask_write(0xFD080E14, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080E18, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080F00, 0xFFFFFFFFU, 0x80803660U);
+       psu_mask_write(0xFD080F04, 0xFFFFFFFFU, 0x55556000U);
+       psu_mask_write(0xFD080F08, 0xFFFFFFFFU, 0xAAAAAAAAU);
+       psu_mask_write(0xFD080F0C, 0xFFFFFFFFU, 0x0029A4A4U);
+       psu_mask_write(0xFD080F10, 0xFFFFFFFFU, 0x0C00B000U);
+       psu_mask_write(0xFD080F14, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080F18, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD081400, 0xFFFFFFFFU, 0x2A019FFEU);
+       psu_mask_write(0xFD081404, 0xFFFFFFFFU, 0x01100000U);
+       psu_mask_write(0xFD08141C, 0xFFFFFFFFU, 0x01264300U);
+       psu_mask_write(0xFD08142C, 0xFFFFFFFFU, 0x00041800U);
+       psu_mask_write(0xFD081430, 0xFFFFFFFFU, 0x70800000U);
+       psu_mask_write(0xFD081440, 0xFFFFFFFFU, 0x2A019FFEU);
+       psu_mask_write(0xFD081444, 0xFFFFFFFFU, 0x01100000U);
+       psu_mask_write(0xFD08145C, 0xFFFFFFFFU, 0x01264300U);
+       psu_mask_write(0xFD08146C, 0xFFFFFFFFU, 0x00041800U);
+       psu_mask_write(0xFD081470, 0xFFFFFFFFU, 0x70800000U);
+       psu_mask_write(0xFD081480, 0xFFFFFFFFU, 0x2A019FFEU);
+       psu_mask_write(0xFD081484, 0xFFFFFFFFU, 0x01100000U);
+       psu_mask_write(0xFD08149C, 0xFFFFFFFFU, 0x01264300U);
+       psu_mask_write(0xFD0814AC, 0xFFFFFFFFU, 0x00041800U);
+       psu_mask_write(0xFD0814B0, 0xFFFFFFFFU, 0x70800000U);
+       psu_mask_write(0xFD0814C0, 0xFFFFFFFFU, 0x2A019FFEU);
+       psu_mask_write(0xFD0814C4, 0xFFFFFFFFU, 0x01100000U);
+       psu_mask_write(0xFD0814DC, 0xFFFFFFFFU, 0x01264300U);
+       psu_mask_write(0xFD0814EC, 0xFFFFFFFFU, 0x00041800U);
+       psu_mask_write(0xFD0814F0, 0xFFFFFFFFU, 0x70800000U);
+       psu_mask_write(0xFD081500, 0xFFFFFFFFU, 0x15019FFEU);
+       psu_mask_write(0xFD081504, 0xFFFFFFFFU, 0x21100000U);
+       psu_mask_write(0xFD08151C, 0xFFFFFFFFU, 0x01266300U);
+       psu_mask_write(0xFD08152C, 0xFFFFFFFFU, 0x00041800U);
+       psu_mask_write(0xFD081530, 0xFFFFFFFFU, 0x70400000U);
+       psu_mask_write(0xFD0817DC, 0xFFFFFFFFU, 0x012643C4U);
+
+       return 1;
+}
+
+static unsigned long psu_ddr_qos_init_data(void)
+{
+       psu_mask_write(0xFD360008, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD36001C, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD370008, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD37001C, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD380008, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD38001C, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD390008, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD39001C, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD3A0008, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD3A001C, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD3B0008, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD3B001C, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFF9B0008, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFF9B001C, 0x0000000FU, 0x00000000U);
+
+       return 1;
+}
+
+static unsigned long psu_mio_init_data(void)
+{
+       psu_mask_write(0xFF180000, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180004, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180008, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF18000C, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180010, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180014, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180018, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF18001C, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180020, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180024, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180028, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF18002C, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180030, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180034, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF180038, 0x000000FEU, 0x00000040U);
+       psu_mask_write(0xFF18003C, 0x000000FEU, 0x00000040U);
+       psu_mask_write(0xFF180040, 0x000000FEU, 0x00000040U);
+       psu_mask_write(0xFF180044, 0x000000FEU, 0x00000040U);
+       psu_mask_write(0xFF180048, 0x000000FEU, 0x000000C0U);
+       psu_mask_write(0xFF18004C, 0x000000FEU, 0x000000C0U);
+       psu_mask_write(0xFF180050, 0x000000FEU, 0x000000C0U);
+       psu_mask_write(0xFF180054, 0x000000FEU, 0x000000C0U);
+       psu_mask_write(0xFF180058, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF18005C, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF180060, 0x000000FEU, 0x00000020U);
+       psu_mask_write(0xFF180064, 0x000000FEU, 0x00000020U);
+       psu_mask_write(0xFF180068, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF18006C, 0x000000FEU, 0x00000018U);
+       psu_mask_write(0xFF180070, 0x000000FEU, 0x00000018U);
+       psu_mask_write(0xFF180074, 0x000000FEU, 0x00000018U);
+       psu_mask_write(0xFF180078, 0x000000FEU, 0x00000018U);
+       psu_mask_write(0xFF18007C, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF180080, 0x000000FEU, 0x00000008U);
+       psu_mask_write(0xFF180084, 0x000000FEU, 0x00000008U);
+       psu_mask_write(0xFF180098, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF18009C, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800A0, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800A4, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800A8, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800AC, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF1800B0, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800B4, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800B8, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800BC, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800C0, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800C4, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800C8, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800CC, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800D0, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800D4, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800D8, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800DC, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800E0, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800E4, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800E8, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800EC, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800F0, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800F4, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800F8, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800FC, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF180100, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180104, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180108, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF18010C, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180110, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180114, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180118, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF18011C, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180120, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180124, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180128, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF18012C, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180130, 0x000000FEU, 0x000000C0U);
+       psu_mask_write(0xFF180134, 0x000000FEU, 0x000000C0U);
+       psu_mask_write(0xFF180204, 0xFFFFFFFFU, 0x52240000U);
+       psu_mask_write(0xFF180208, 0xFFFFFFFFU, 0x00B03000U);
+       psu_mask_write(0xFF18020C, 0x00003FFFU, 0x00000FC0U);
+       psu_mask_write(0xFF180138, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF18013C, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180140, 0x03FFFFFFU, 0x00000000U);
+       psu_mask_write(0xFF180144, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180148, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF18014C, 0x03FFFFFFU, 0x00000000U);
+       psu_mask_write(0xFF180154, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180158, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF18015C, 0x03FFFFFFU, 0x00000000U);
+       psu_mask_write(0xFF180160, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180164, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180168, 0x03FFFFFFU, 0x00000000U);
+       psu_mask_write(0xFF180170, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180174, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180178, 0x03FFFFFFU, 0x00000000U);
+       psu_mask_write(0xFF18017C, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180180, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180184, 0x03FFFFFFU, 0x00000000U);
+       psu_mask_write(0xFF180200, 0x0000000FU, 0x00000000U);
+
+       return 1;
+}
+
+static unsigned long psu_peripherals_pre_init_data(void)
+{
+       psu_mask_write(0xFF5E0108, 0x013F3F07U, 0x01012302U);
+       psu_mask_write(0xFF5E0238, 0x00000001U, 0x00000001U);
+
+       return 1;
+}
+
+static unsigned long psu_peripherals_init_data(void)
+{
+       psu_mask_write(0xFD1A0100, 0x000F807EU, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x001A0000U, 0x00000000U);
+       psu_mask_write(0xFF5E023C, 0x0093C018U, 0x00000000U);
+       psu_mask_write(0xFF5E0230, 0x00000008U, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x00000001U, 0x00000000U);
+       psu_mask_write(0xFF180390, 0x00000004U, 0x00000004U);
+       psu_mask_write(0xFF5E023C, 0x00000400U, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x00000040U, 0x00000000U);
+       psu_mask_write(0xFF180310, 0x00008000U, 0x00000000U);
+       psu_mask_write(0xFF180320, 0x33840000U, 0x02840000U);
+       psu_mask_write(0xFF18031C, 0x7FFE0000U, 0x64500000U);
+       psu_mask_write(0xFF180358, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFF180324, 0x03C00000U, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x00000100U, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x00000600U, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x00008000U, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x00007800U, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x00000006U, 0x00000000U);
+       psu_mask_write(0xFF000034, 0x000000FFU, 0x0000000CU);
+       psu_mask_write(0xFF000018, 0x0000FFFFU, 0x0000003EU);
+       psu_mask_write(0xFF000000, 0x000001FFU, 0x00000017U);
+       psu_mask_write(0xFF000004, 0x000003FFU, 0x00000020U);
+       psu_mask_write(0xFF010034, 0x000000FFU, 0x0000000CU);
+       psu_mask_write(0xFF010018, 0x0000FFFFU, 0x0000003EU);
+       psu_mask_write(0xFF010000, 0x000001FFU, 0x00000017U);
+       psu_mask_write(0xFF010004, 0x000003FFU, 0x00000020U);
+       psu_mask_write(0xFF5E0238, 0x00040000U, 0x00000000U);
+       psu_mask_write(0xFF4B0024, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFFCA5000, 0x00001FFFU, 0x00000000U);
+       psu_mask_write(0xFD5C0060, 0x000F000FU, 0x00000000U);
+       psu_mask_write(0xFFA60040, 0x80000000U, 0x80000000U);
+       psu_mask_write(0xFF260020, 0xFFFFFFFFU, 0x0597F128U);
+       psu_mask_write(0xFF260000, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFF5E0250, 0x00000F0FU, 0x00000202U);
+
+       mask_delay(1);
+       psu_mask_write(0xFF5E0250, 0x00000F0FU, 0x00000002U);
+
+       mask_delay(5);
+       psu_mask_write(0xFF5E0250, 0x00000F0FU, 0x00000202U);
+       psu_mask_write(0xFF0A0244, 0x03FFFFFFU, 0x00000020U);
+       psu_mask_write(0xFF0A0248, 0x03FFFFFFU, 0x00000020U);
+       psu_mask_write(0xFF0A0008, 0xFFFFFFFFU, 0xFFDF0020U);
+       mask_delay(1);
+       psu_mask_write(0xFF0A0008, 0xFFFFFFFFU, 0xFFDF0000U);
+       mask_delay(5);
+       psu_mask_write(0xFF0A0244, 0x03FFFFFFU, 0x00000020U);
+       psu_mask_write(0xFF0A0248, 0x03FFFFFFU, 0x00000020U);
+       psu_mask_write(0xFF0A0008, 0xFFFFFFFFU, 0xFFDF0000U);
+
+       return 1;
+}
+
+static unsigned long psu_serdes_init_data(void)
+{
+       psu_mask_write(0xFD410000, 0x0000001FU, 0x0000000DU);
+       psu_mask_write(0xFD410004, 0x0000001FU, 0x00000009U);
+       psu_mask_write(0xFD410008, 0x0000001FU, 0x00000008U);
+       psu_mask_write(0xFD41000C, 0x0000001FU, 0x0000000FU);
+       psu_mask_write(0xFD402860, 0x00000080U, 0x00000080U);
+       psu_mask_write(0xFD402864, 0x00000088U, 0x00000008U);
+       psu_mask_write(0xFD402868, 0x00000080U, 0x00000080U);
+       psu_mask_write(0xFD40286C, 0x00000082U, 0x00000002U);
+       psu_mask_write(0xFD40A094, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD40A368, 0x000000FFU, 0x00000038U);
+       psu_mask_write(0xFD40A36C, 0x00000007U, 0x00000003U);
+       psu_mask_write(0xFD40E368, 0x000000FFU, 0x000000E0U);
+       psu_mask_write(0xFD40E36C, 0x00000007U, 0x00000003U);
+       psu_mask_write(0xFD406368, 0x000000FFU, 0x00000058U);
+       psu_mask_write(0xFD40636C, 0x00000007U, 0x00000003U);
+       psu_mask_write(0xFD406370, 0x000000FFU, 0x0000007CU);
+       psu_mask_write(0xFD406374, 0x000000FFU, 0x00000033U);
+       psu_mask_write(0xFD406378, 0x000000FFU, 0x00000002U);
+       psu_mask_write(0xFD40637C, 0x00000033U, 0x00000030U);
+       psu_mask_write(0xFD40A370, 0x000000FFU, 0x000000F4U);
+       psu_mask_write(0xFD40A374, 0x000000FFU, 0x00000031U);
+       psu_mask_write(0xFD40A378, 0x000000FFU, 0x00000002U);
+       psu_mask_write(0xFD40A37C, 0x00000033U, 0x00000030U);
+       psu_mask_write(0xFD40E370, 0x000000FFU, 0x000000C9U);
+       psu_mask_write(0xFD40E374, 0x000000FFU, 0x000000D2U);
+       psu_mask_write(0xFD40E378, 0x000000FFU, 0x00000001U);
+       psu_mask_write(0xFD40E37C, 0x000000B3U, 0x000000B0U);
+       psu_mask_write(0xFD40906C, 0x00000003U, 0x00000003U);
+       psu_mask_write(0xFD4080F4, 0x00000003U, 0x00000003U);
+       psu_mask_write(0xFD40E360, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD40D06C, 0x0000000FU, 0x0000000FU);
+       psu_mask_write(0xFD40C0F4, 0x0000000BU, 0x0000000BU);
+       psu_mask_write(0xFD4010CC, 0x00000020U, 0x00000020U);
+       psu_mask_write(0xFD4090CC, 0x00000020U, 0x00000020U);
+       psu_mask_write(0xFD401074, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD405074, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD409074, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD40D074, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD40189C, 0x00000080U, 0x00000080U);
+       psu_mask_write(0xFD4018F8, 0x000000FFU, 0x00000064U);
+       psu_mask_write(0xFD4018FC, 0x000000FFU, 0x00000064U);
+       psu_mask_write(0xFD401990, 0x000000FFU, 0x00000011U);
+       psu_mask_write(0xFD401924, 0x000000FFU, 0x00000004U);
+       psu_mask_write(0xFD401928, 0x000000FFU, 0x000000FEU);
+       psu_mask_write(0xFD401900, 0x000000FFU, 0x00000064U);
+       psu_mask_write(0xFD40192C, 0x000000FFU, 0x00000000U);
+       psu_mask_write(0xFD401980, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFD401914, 0x000000FFU, 0x000000F7U);
+       psu_mask_write(0xFD401918, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD401940, 0x000000FFU, 0x000000F7U);
+       psu_mask_write(0xFD401944, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD401994, 0x00000007U, 0x00000007U);
+       psu_mask_write(0xFD405994, 0x00000007U, 0x00000007U);
+       psu_mask_write(0xFD40989C, 0x00000080U, 0x00000080U);
+       psu_mask_write(0xFD4098F8, 0x000000FFU, 0x0000001AU);
+       psu_mask_write(0xFD4098FC, 0x000000FFU, 0x0000001AU);
+       psu_mask_write(0xFD409990, 0x000000FFU, 0x00000010U);
+       psu_mask_write(0xFD409924, 0x000000FFU, 0x000000FEU);
+       psu_mask_write(0xFD409928, 0x000000FFU, 0x00000000U);
+       psu_mask_write(0xFD409900, 0x000000FFU, 0x0000001AU);
+       psu_mask_write(0xFD40992C, 0x000000FFU, 0x00000000U);
+       psu_mask_write(0xFD409980, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFD409914, 0x000000FFU, 0x000000F7U);
+       psu_mask_write(0xFD409918, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD409940, 0x000000FFU, 0x000000F7U);
+       psu_mask_write(0xFD409944, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD409994, 0x00000007U, 0x00000007U);
+       psu_mask_write(0xFD40D89C, 0x00000080U, 0x00000080U);
+       psu_mask_write(0xFD40D8F8, 0x000000FFU, 0x0000007DU);
+       psu_mask_write(0xFD40D8FC, 0x000000FFU, 0x0000007DU);
+       psu_mask_write(0xFD40D990, 0x000000FFU, 0x00000001U);
+       psu_mask_write(0xFD40D924, 0x000000FFU, 0x0000009CU);
+       psu_mask_write(0xFD40D928, 0x000000FFU, 0x00000039U);
+       psu_mask_write(0xFD40D98C, 0x000000F0U, 0x00000020U);
+       psu_mask_write(0xFD40D900, 0x000000FFU, 0x0000007DU);
+       psu_mask_write(0xFD40D92C, 0x000000FFU, 0x00000064U);
+       psu_mask_write(0xFD40D980, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFD40D914, 0x000000FFU, 0x000000F7U);
+       psu_mask_write(0xFD40D918, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD40D940, 0x000000FFU, 0x000000F7U);
+       psu_mask_write(0xFD40D944, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD40D994, 0x00000007U, 0x00000007U);
+       psu_mask_write(0xFD40107C, 0x0000000FU, 0x00000001U);
+       psu_mask_write(0xFD40507C, 0x0000000FU, 0x00000001U);
+       psu_mask_write(0xFD40907C, 0x0000000FU, 0x00000001U);
+       psu_mask_write(0xFD40D07C, 0x0000000FU, 0x00000001U);
+       psu_mask_write(0xFD4019A4, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFD401038, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD40102C, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD4059A4, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFD405038, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD40502C, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD4099A4, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFD409038, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD40902C, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD40D9A4, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFD40D038, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD40D02C, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD4019AC, 0x00000003U, 0x00000000U);
+       psu_mask_write(0xFD4059AC, 0x00000003U, 0x00000000U);
+       psu_mask_write(0xFD4099AC, 0x00000003U, 0x00000000U);
+       psu_mask_write(0xFD40D9AC, 0x00000003U, 0x00000000U);
+       psu_mask_write(0xFD401978, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD405978, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD409978, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD40D978, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD3D001C, 0xFFFFFFFFU, 0x00000001U);
+       psu_mask_write(0xFD410010, 0x00000077U, 0x00000041U);
+       psu_mask_write(0xFD410014, 0x00000077U, 0x00000023U);
+       psu_mask_write(0xFD404CB4, 0x00000037U, 0x00000037U);
+       psu_mask_write(0xFD4041D8, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD40C1D8, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD40DC14, 0x000000FFU, 0x000000E6U);
+       psu_mask_write(0xFD40DC40, 0x0000001FU, 0x0000000CU);
+       psu_mask_write(0xFD40D94C, 0x00000020U, 0x00000020U);
+       psu_mask_write(0xFD40D950, 0x00000007U, 0x00000006U);
+       psu_mask_write(0xFD404CC0, 0x0000001FU, 0x00000000U);
+       psu_mask_write(0xFD404048, 0x000000FFU, 0x00000000U);
+       psu_mask_write(0xFD40C048, 0x000000FFU, 0x00000001U);
+
+       return 1;
+}
+
+static unsigned long psu_resetout_init_data(void)
+{
+       psu_mask_write(0xFF5E023C, 0x00000400U, 0x00000000U);
+       psu_mask_write(0xFF9D0080, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFF9D007C, 0x00000001U, 0x00000000U);
+       psu_mask_write(0xFF5E023C, 0x00000140U, 0x00000000U);
+       psu_mask_write(0xFF5E0230, 0x00000008U, 0x00000000U);
+       psu_mask_write(0xFD3D0100, 0x00000003U, 0x00000003U);
+       psu_mask_write(0xFD1A0100, 0x00000002U, 0x00000000U);
+       psu_mask_write(0xFD1A0100, 0x000C0000U, 0x00000000U);
+       psu_mask_write(0xFD1A0100, 0x00010000U, 0x00000000U);
+       psu_mask_write(0xFD4A0200, 0x00000002U, 0x00000000U);
+       psu_mask_write(0xFD4A0238, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFE20C200, 0x00023FFFU, 0x00022457U);
+       psu_mask_write(0xFE20C630, 0x003FFF00U, 0x00000000U);
+       psu_mask_write(0xFE20C11C, 0x00000600U, 0x00000600U);
+       psu_mask_write(0xFE20C12C, 0x00004000U, 0x00004000U);
+       psu_mask_write(0xFD480064, 0x00000200U, 0x00000200U);
+       psu_mask_write(0xFD48001C, 0x0000FFFFU, 0x00000000U);
+       psu_mask_write(0xFD480020, 0x0000FFFFU, 0x00000000U);
+       psu_mask_write(0xFD480024, 0x0000FFFFU, 0x00000000U);
+       psu_mask_write(0xFD480028, 0x0000FFFFU, 0x00000000U);
+       psu_mask_write(0xFD48002C, 0x0000FFFFU, 0x0000FFFFU);
+       psu_mask_write(0xFD480030, 0x0000FFFFU, 0x000000FFU);
+       psu_mask_write(0xFD480034, 0x0000FFFFU, 0x00000000U);
+       psu_mask_write(0xFD480038, 0x0000FFFFU, 0x0000FFFFU);
+       psu_mask_write(0xFD48003C, 0x0000FFFFU, 0x0000FFF0U);
+       psu_mask_write(0xFD480040, 0x0000FFFFU, 0x0000FFF0U);
+       psu_mask_write(0xFD480044, 0x0000FFFFU, 0x0000FFF1U);
+       psu_mask_write(0xFD480048, 0x0000FFFFU, 0x0000FFF1U);
+       psu_mask_write(0xFD48006C, 0x00000738U, 0x00000100U);
+       psu_mask_write(0xFD4800C8, 0x0000FFF0U, 0x00000040U);
+       psu_mask_write(0xFD4801A4, 0x000007FFU, 0x000000CDU);
+       psu_mask_write(0xFD4801A8, 0x00003FFFU, 0x00000624U);
+       psu_mask_write(0xFD4801AC, 0x000007FFU, 0x00000018U);
+       psu_mask_write(0xFD4801B0, 0x000007FFU, 0x000000B5U);
+       psu_mask_write(0xFD4801B4, 0x0000FFFFU, 0x00007E20U);
+       psu_mask_write(0xFD480088, 0x000000FFU, 0x00000001U);
+       psu_mask_write(0xFD4800D4, 0x000000FFU, 0x00000060U);
+       psu_mask_write(0xFD4800A4, 0x000003FFU, 0x00000000U);
+       psu_mask_write(0xFD480184, 0x00000FFFU, 0x00000041U);
+       psu_mask_write(0xFD480190, 0x00000040U, 0x00000000U);
+       psu_mask_write(0xFD480194, 0x0000FFE2U, 0x0000FFE2U);
+       psu_mask_write(0xFD480094, 0x00007E00U, 0x00004A00U);
+       psu_mask_write(0xFD480174, 0x0000FFFFU, 0x00009000U);
+       psu_mask_write(0xFD480200, 0xFFFFFFFFU, 0x10EED021U);
+       psu_mask_write(0xFD480204, 0xFFFFFFFFU, 0x10EE0007U);
+       psu_mask_write(0xFD480208, 0x000000FFU, 0x00000000U);
+       psu_mask_write(0xFD480060, 0x0000FFFFU, 0x00000400U);
+       psu_mask_write(0xFD480064, 0x000001FFU, 0x00000006U);
+       psu_mask_write(0xFD480010, 0x00001000U, 0x00000000U);
+       psu_mask_write(0xFD480164, 0x00001FFEU, 0x00000000U);
+       psu_mask_write(0xFD48013C, 0x00000020U, 0x00000020U);
+       psu_mask_write(0xFD4800AC, 0x00000100U, 0x00000000U);
+       psu_mask_write(0xFD4800C0, 0x000007FFU, 0x00000000U);
+       psu_mask_write(0xFD4800B8, 0x0000FFFFU, 0x00000000U);
+       psu_mask_write(0xFD4800BC, 0x00001FFFU, 0x00000000U);
+       psu_mask_write(0xFD4800B0, 0x0000FFFFU, 0x00000000U);
+       psu_mask_write(0xFD4800B4, 0x0000FFF8U, 0x00000000U);
+       psu_mask_write(0xFD48031C, 0x00000002U, 0x00000000U);
+       psu_mask_write(0xFD48008C, 0x0000B000U, 0x00008000U);
+       psu_mask_write(0xFD1A0100, 0x00020000U, 0x00000000U);
+       psu_mask_write(0xFF0A0008, 0xFFFFFFFFU, 0xFFDF0020U);
+       mask_poll(0xFD4023E4, 0x00000010U);
+       mask_poll(0xFD4063E4, 0x00000010U);
+       mask_poll(0xFD40A3E4, 0x00000010U);
+       mask_poll(0xFD40E3E4, 0x00000010U);
+       psu_mask_write(0xFD0C00AC, 0xFFFFFFFFU, 0x28184018U);
+       psu_mask_write(0xFD0C00B0, 0xFFFFFFFFU, 0x0E081406U);
+       psu_mask_write(0xFD0C00B4, 0xFFFFFFFFU, 0x064A0813U);
+       psu_mask_write(0xFD0C00B8, 0xFFFFFFFFU, 0x3FFC96A4U);
+
+       return 1;
+}
+
+static unsigned long psu_resetin_init_data(void)
+{
+       psu_mask_write(0xFF5E023C, 0x00000540U, 0x00000540U);
+       psu_mask_write(0xFF5E0230, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFD1A0100, 0x00000002U, 0x00000002U);
+       psu_mask_write(0xFD1A0100, 0x000E0000U, 0x000E0000U);
+       psu_mask_write(0xFD4A0238, 0x0000000FU, 0x0000000AU);
+       psu_mask_write(0xFD4A0200, 0x00000002U, 0x00000002U);
+       psu_mask_write(0xFD1A0100, 0x00010000U, 0x00010000U);
+
+       return 1;
+}
+
+static unsigned long psu_afi_config(void)
+{
+       psu_mask_write(0xFD1A0100, 0x00001F80U, 0x00000000U);
+       psu_mask_write(0xFF5E023C, 0x00080000U, 0x00000000U);
+       psu_mask_write(0xFD615000, 0x00000F00U, 0x00000A00U);
+
+       return 1;
+}
+
+static unsigned long psu_ddr_phybringup_data(void)
+{
+       unsigned int regval = 0;
+       unsigned int pll_retry = 10;
+       unsigned int pll_locked = 0;
+
+       while ((pll_retry > 0) && (!pll_locked)) {
+               Xil_Out32(0xFD080004, 0x00040010);
+               Xil_Out32(0xFD080004, 0x00040011);
+
+               while ((Xil_In32(0xFD080030) & 0x1) != 1)
+                       ;
+               pll_locked = (Xil_In32(0xFD080030) & 0x80000000)
+                   >> 31;
+               pll_locked &= (Xil_In32(0xFD0807E0) & 0x10000)
+                   >> 16;
+               pll_locked &= (Xil_In32(0xFD0809E0) & 0x10000)
+                   >> 16;
+               pll_locked &= (Xil_In32(0xFD080BE0) & 0x10000)
+                   >> 16;
+               pll_locked &= (Xil_In32(0xFD080DE0) & 0x10000)
+                   >> 16;
+               pll_retry--;
+       }
+       Xil_Out32(0xFD0800C4, Xil_In32(0xFD0800C4) | (pll_retry << 16));
+       if (!pll_locked)
+               return 0;
+
+       Xil_Out32(0xFD080004U, 0x00040063U);
+
+       while ((Xil_In32(0xFD080030U) & 0x0000000FU) != 0x0000000FU)
+               ;
+       prog_reg(0xFD080004U, 0x00000001U, 0x00000000U, 0x00000001U);
+
+       while ((Xil_In32(0xFD080030U) & 0x000000FFU) != 0x0000001FU)
+               ;
+       Xil_Out32(0xFD0701B0U, 0x00000001U);
+       Xil_Out32(0xFD070320U, 0x00000001U);
+       while ((Xil_In32(0xFD070004U) & 0x0000000FU) != 0x00000001U)
+               ;
+       prog_reg(0xFD080014U, 0x00000040U, 0x00000006U, 0x00000001U);
+       Xil_Out32(0xFD080004, 0x0004FE01);
+       regval = Xil_In32(0xFD080030);
+       while (regval != 0x80000FFF)
+               regval = Xil_In32(0xFD080030);
+       regval = ((Xil_In32(0xFD080030) & 0x1FFF0000) >> 18);
+       if (regval != 0)
+               return 0;
+
+       Xil_Out32(0xFD080200U, 0x100091C7U);
+       int cur_R006_tREFPRD;
+
+       cur_R006_tREFPRD = (Xil_In32(0xFD080018U) & 0x0003FFFFU) >> 0x00000000U;
+       prog_reg(0xFD080018, 0x3FFFF, 0x0, cur_R006_tREFPRD);
+
+       prog_reg(0xFD08001CU, 0x00000018U, 0x00000003U, 0x00000003U);
+       prog_reg(0xFD08142CU, 0x00000030U, 0x00000004U, 0x00000003U);
+       prog_reg(0xFD08146CU, 0x00000030U, 0x00000004U, 0x00000003U);
+       prog_reg(0xFD0814ACU, 0x00000030U, 0x00000004U, 0x00000003U);
+       prog_reg(0xFD0814ECU, 0x00000030U, 0x00000004U, 0x00000003U);
+       prog_reg(0xFD08152CU, 0x00000030U, 0x00000004U, 0x00000003U);
+
+       Xil_Out32(0xFD080004, 0x00060001);
+       regval = Xil_In32(0xFD080030);
+       while ((regval & 0x80004001) != 0x80004001)
+               regval = Xil_In32(0xFD080030);
+
+       prog_reg(0xFD08001CU, 0x00000018U, 0x00000003U, 0x00000000U);
+       prog_reg(0xFD08142CU, 0x00000030U, 0x00000004U, 0x00000000U);
+       prog_reg(0xFD08146CU, 0x00000030U, 0x00000004U, 0x00000000U);
+       prog_reg(0xFD0814ACU, 0x00000030U, 0x00000004U, 0x00000000U);
+       prog_reg(0xFD0814ECU, 0x00000030U, 0x00000004U, 0x00000000U);
+       prog_reg(0xFD08152CU, 0x00000030U, 0x00000004U, 0x00000000U);
+
+       Xil_Out32(0xFD080200U, 0x800091C7U);
+       prog_reg(0xFD080018, 0x3FFFF, 0x0, cur_R006_tREFPRD);
+
+       Xil_Out32(0xFD080004, 0x0000C001);
+       regval = Xil_In32(0xFD080030);
+       while ((regval & 0x80000C01) != 0x80000C01)
+               regval = Xil_In32(0xFD080030);
+
+       Xil_Out32(0xFD070180U, 0x01000040U);
+       Xil_Out32(0xFD070060U, 0x00000000U);
+       prog_reg(0xFD080014U, 0x00000040U, 0x00000006U, 0x00000000U);
+
+       return 1;
+}
+
+static int serdes_enb_coarse_saturation(void)
+{
+       Xil_Out32(0xFD402094, 0x00000010);
+       Xil_Out32(0xFD406094, 0x00000010);
+       Xil_Out32(0xFD40A094, 0x00000010);
+       Xil_Out32(0xFD40E094, 0x00000010);
+       return 1;
+}
+
+static int serdes_fixcal_code(void)
+{
+       int maskstatus = 1;
+       unsigned int rdata = 0;
+       unsigned int match_pmos_code[23];
+       unsigned int match_nmos_code[23];
+       unsigned int match_ical_code[7];
+       unsigned int match_rcal_code[7];
+       unsigned int p_code = 0;
+       unsigned int n_code = 0;
+       unsigned int i_code = 0;
+       unsigned int r_code = 0;
+       unsigned int repeat_count = 0;
+       unsigned int L3_TM_CALIB_DIG20 = 0;
+       unsigned int L3_TM_CALIB_DIG19 = 0;
+       unsigned int L3_TM_CALIB_DIG18 = 0;
+       unsigned int L3_TM_CALIB_DIG16 = 0;
+       unsigned int L3_TM_CALIB_DIG15 = 0;
+       unsigned int L3_TM_CALIB_DIG14 = 0;
+       int i = 0;
+       int count = 0;
+
+       rdata = Xil_In32(0xFD40289C);
+       rdata = rdata & ~0x03;
+       rdata = rdata | 0x1;
+       Xil_Out32(0xFD40289C, rdata);
+
+       do {
+               if (count == 1100000)
+                       break;
+               rdata = Xil_In32(0xFD402B1C);
+               count++;
+       } while ((rdata & 0x0000000E) != 0x0000000E);
+
+       for (i = 0; i < 23; i++) {
+               match_pmos_code[i] = 0;
+               match_nmos_code[i] = 0;
+       }
+       for (i = 0; i < 7; i++) {
+               match_ical_code[i] = 0;
+               match_rcal_code[i] = 0;
+       }
+
+       do {
+               Xil_Out32(0xFD410010, 0x00000000);
+               Xil_Out32(0xFD410014, 0x00000000);
+
+               Xil_Out32(0xFD410010, 0x00000001);
+               Xil_Out32(0xFD410014, 0x00000000);
+
+               maskstatus = mask_poll(0xFD40EF14, 0x2);
+               if (maskstatus == 0) {
+                       xil_printf("#SERDES initialization timed out\n\r");
+                       return maskstatus;
+               }
+
+               p_code = mask_read(0xFD40EF18, 0xFFFFFFFF);
+               n_code = mask_read(0xFD40EF1C, 0xFFFFFFFF);
+
+               i_code = mask_read(0xFD40EF24, 0xFFFFFFFF);
+               r_code = mask_read(0xFD40EF28, 0xFFFFFFFF);
+
+               if (p_code >= 0x26 && p_code <= 0x3C)
+                       match_pmos_code[p_code - 0x26] += 1;
+
+               if (n_code >= 0x26 && n_code <= 0x3C)
+                       match_nmos_code[n_code - 0x26] += 1;
+
+               if (i_code >= 0xC && i_code <= 0x12)
+                       match_ical_code[i_code - 0xC] += 1;
+
+               if (r_code >= 0x6 && r_code <= 0xC)
+                       match_rcal_code[r_code - 0x6] += 1;
+       } while (repeat_count++ < 10);
+
+       for (i = 0; i < 23; i++) {
+               if (match_pmos_code[i] >= match_pmos_code[0]) {
+                       match_pmos_code[0] = match_pmos_code[i];
+                       p_code = 0x26 + i;
+               }
+               if (match_nmos_code[i] >= match_nmos_code[0]) {
+                       match_nmos_code[0] = match_nmos_code[i];
+                       n_code = 0x26 + i;
+               }
+       }
+
+       for (i = 0; i < 7; i++) {
+               if (match_ical_code[i] >= match_ical_code[0]) {
+                       match_ical_code[0] = match_ical_code[i];
+                       i_code = 0xC + i;
+               }
+               if (match_rcal_code[i] >= match_rcal_code[0]) {
+                       match_rcal_code[0] = match_rcal_code[i];
+                       r_code = 0x6 + i;
+               }
+       }
+
+       L3_TM_CALIB_DIG20 = mask_read(0xFD40EC50, 0xFFFFFFF0);
+       L3_TM_CALIB_DIG20 = L3_TM_CALIB_DIG20 | 0x8 | ((p_code >> 2) & 0x7);
+
+       L3_TM_CALIB_DIG19 = mask_read(0xFD40EC4C, 0xFFFFFF18);
+       L3_TM_CALIB_DIG19 = L3_TM_CALIB_DIG19 | ((p_code & 0x3) << 6)
+           | 0x20 | 0x4 | ((n_code >> 3) & 0x3);
+
+       L3_TM_CALIB_DIG18 = mask_read(0xFD40EC48, 0xFFFFFF0F);
+       L3_TM_CALIB_DIG18 = L3_TM_CALIB_DIG18 | ((n_code & 0x7) << 5) | 0x10;
+
+       L3_TM_CALIB_DIG16 = mask_read(0xFD40EC40, 0xFFFFFFF8);
+       L3_TM_CALIB_DIG16 = L3_TM_CALIB_DIG16 | ((r_code >> 1) & 0x7);
+
+       L3_TM_CALIB_DIG15 = mask_read(0xFD40EC3C, 0xFFFFFF30);
+       L3_TM_CALIB_DIG15 = L3_TM_CALIB_DIG15 | ((r_code & 0x1) << 7)
+           | 0x40 | 0x8 | ((i_code >> 1) & 0x7);
+
+       L3_TM_CALIB_DIG14 = mask_read(0xFD40EC38, 0xFFFFFF3F);
+       L3_TM_CALIB_DIG14 = L3_TM_CALIB_DIG14 | ((i_code & 0x1) << 7) | 0x40;
+
+       Xil_Out32(0xFD40EC50, L3_TM_CALIB_DIG20);
+       Xil_Out32(0xFD40EC4C, L3_TM_CALIB_DIG19);
+       Xil_Out32(0xFD40EC48, L3_TM_CALIB_DIG18);
+       Xil_Out32(0xFD40EC40, L3_TM_CALIB_DIG16);
+       Xil_Out32(0xFD40EC3C, L3_TM_CALIB_DIG15);
+       Xil_Out32(0xFD40EC38, L3_TM_CALIB_DIG14);
+       return maskstatus;
+}
+
+static int init_serdes(void)
+{
+       int status = 1;
+
+       status &= psu_resetin_init_data();
+
+       status &= serdes_fixcal_code();
+       status &= serdes_enb_coarse_saturation();
+
+       status &= psu_serdes_init_data();
+       status &= psu_resetout_init_data();
+
+       return status;
+}
+
+static void init_peripheral(void)
+{
+       psu_mask_write(0xFD5F0018, 0x8000001FU, 0x8000001FU);
+}
+
+int psu_init(void)
+{
+       int status = 1;
+
+       status &= psu_mio_init_data();
+       status &= psu_peripherals_pre_init_data();
+       status &= psu_pll_init_data();
+       status &= psu_clock_init_data();
+
+       status &= psu_ddr_init_data();
+       status &= psu_ddr_phybringup_data();
+
+       status &= psu_peripherals_init_data();
+       status &= init_serdes();
+       init_peripheral();
+
+       status &= psu_afi_config();
+       psu_ddr_qos_init_data();
+
+       if (status == 0)
+               return 1;
+       return 0;
+}
diff --git a/board/xilinx/zynqmp/zynqmp-zcu111-revA/psu_init_gpl.c b/board/xilinx/zynqmp/zynqmp-zcu111-revA/psu_init_gpl.c
new file mode 100644 (file)
index 0000000..7c6664d
--- /dev/null
@@ -0,0 +1,978 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (c) Copyright 2015 Xilinx, Inc. All rights reserved.
+ */
+
+#include <asm/arch/psu_init_gpl.h>
+#include <xil_io.h>
+
+static unsigned long psu_pll_init_data(void)
+{
+       psu_mask_write(0xFF5E0034, 0xFE7FEDEFU, 0x7E672C6CU);
+       psu_mask_write(0xFF5E0030, 0x00717F00U, 0x00012D00U);
+       psu_mask_write(0xFF5E0030, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFF5E0030, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFF5E0030, 0x00000001U, 0x00000000U);
+       mask_poll(0xFF5E0040, 0x00000002U);
+       psu_mask_write(0xFF5E0030, 0x00000008U, 0x00000000U);
+       psu_mask_write(0xFF5E0048, 0x00003F00U, 0x00000200U);
+       psu_mask_write(0xFF5E0108, 0x013F3F07U, 0x01012300U);
+       psu_mask_write(0xFF5E0024, 0xFE7FEDEFU, 0x7E4B0C82U);
+       psu_mask_write(0xFF5E0020, 0x00717F00U, 0x00015A00U);
+       psu_mask_write(0xFF5E0020, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFF5E0020, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFF5E0020, 0x00000001U, 0x00000000U);
+       mask_poll(0xFF5E0040, 0x00000001U);
+       psu_mask_write(0xFF5E0020, 0x00000008U, 0x00000000U);
+       psu_mask_write(0xFF5E0044, 0x00003F00U, 0x00000300U);
+       psu_mask_write(0xFD1A0024, 0xFE7FEDEFU, 0x7E4B0C62U);
+       psu_mask_write(0xFD1A0020, 0x00717F00U, 0x00014800U);
+       psu_mask_write(0xFD1A0020, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFD1A0020, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD1A0020, 0x00000001U, 0x00000000U);
+       mask_poll(0xFD1A0044, 0x00000001U);
+       psu_mask_write(0xFD1A0020, 0x00000008U, 0x00000000U);
+       psu_mask_write(0xFD1A0048, 0x00003F00U, 0x00000300U);
+       psu_mask_write(0xFD1A0030, 0xFE7FEDEFU, 0x7E4B0C62U);
+       psu_mask_write(0xFD1A002C, 0x00717F00U, 0x00014000U);
+       psu_mask_write(0xFD1A002C, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFD1A002C, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD1A002C, 0x00000001U, 0x00000000U);
+       mask_poll(0xFD1A0044, 0x00000002U);
+       psu_mask_write(0xFD1A002C, 0x00000008U, 0x00000000U);
+       psu_mask_write(0xFD1A004C, 0x00003F00U, 0x00000200U);
+       psu_mask_write(0xFD1A003C, 0xFE7FEDEFU, 0x7E4B0C82U);
+       psu_mask_write(0xFD1A0038, 0x00717F00U, 0x00015A00U);
+       psu_mask_write(0xFD1A0038, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFD1A0038, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD1A0038, 0x00000001U, 0x00000000U);
+       mask_poll(0xFD1A0044, 0x00000004U);
+       psu_mask_write(0xFD1A0038, 0x00000008U, 0x00000000U);
+       psu_mask_write(0xFD1A0050, 0x00003F00U, 0x00000300U);
+
+       return 1;
+}
+
+static unsigned long psu_clock_init_data(void)
+{
+       psu_mask_write(0xFF5E005C, 0x063F3F07U, 0x06010C00U);
+       psu_mask_write(0xFF5E0100, 0x013F3F07U, 0x01010600U);
+       psu_mask_write(0xFF5E0060, 0x023F3F07U, 0x02010600U);
+       psu_mask_write(0xFF5E004C, 0x023F3F07U, 0x02031900U);
+       psu_mask_write(0xFF5E0068, 0x013F3F07U, 0x01010C00U);
+       psu_mask_write(0xFF5E0070, 0x013F3F07U, 0x01010800U);
+       psu_mask_write(0xFF18030C, 0x00020000U, 0x00000000U);
+       psu_mask_write(0xFF5E0074, 0x013F3F07U, 0x01010F00U);
+       psu_mask_write(0xFF5E0078, 0x013F3F07U, 0x01010F00U);
+       psu_mask_write(0xFF5E0120, 0x013F3F07U, 0x01010F00U);
+       psu_mask_write(0xFF5E0124, 0x013F3F07U, 0x01010F00U);
+       psu_mask_write(0xFF5E0090, 0x01003F07U, 0x01000302U);
+       psu_mask_write(0xFF5E009C, 0x01003F07U, 0x01000602U);
+       psu_mask_write(0xFF5E00A4, 0x01003F07U, 0x01000800U);
+       psu_mask_write(0xFF5E00A8, 0x01003F07U, 0x01000302U);
+       psu_mask_write(0xFF5E00AC, 0x01003F07U, 0x01000F02U);
+       psu_mask_write(0xFF5E00B0, 0x01003F07U, 0x01000602U);
+       psu_mask_write(0xFF5E00B8, 0x01003F07U, 0x01000302U);
+       psu_mask_write(0xFF5E00C0, 0x013F3F07U, 0x01010F00U);
+       psu_mask_write(0xFF5E0108, 0x013F3F07U, 0x01011E02U);
+       psu_mask_write(0xFF5E0104, 0x00000007U, 0x00000000U);
+       psu_mask_write(0xFF5E0128, 0x01003F07U, 0x01000F00U);
+       psu_mask_write(0xFD1A00A0, 0x01003F07U, 0x01000200U);
+       psu_mask_write(0xFD1A0070, 0x013F3F07U, 0x01010500U);
+       psu_mask_write(0xFD1A0074, 0x013F3F07U, 0x01010F03U);
+       psu_mask_write(0xFD1A007C, 0x013F3F07U, 0x01010E03U);
+       psu_mask_write(0xFD1A0060, 0x03003F07U, 0x03000100U);
+       psu_mask_write(0xFD1A0068, 0x01003F07U, 0x01000200U);
+       psu_mask_write(0xFD1A0080, 0x00003F07U, 0x00000200U);
+       psu_mask_write(0xFD1A00B8, 0x01003F07U, 0x01000200U);
+       psu_mask_write(0xFD1A00BC, 0x01003F07U, 0x01000200U);
+       psu_mask_write(0xFD1A00C0, 0x01003F07U, 0x01000203U);
+       psu_mask_write(0xFD1A00C4, 0x01003F07U, 0x01000502U);
+       psu_mask_write(0xFD1A00F8, 0x00003F07U, 0x00000200U);
+       psu_mask_write(0xFF180380, 0x000000FFU, 0x00000000U);
+       psu_mask_write(0xFD610100, 0x00000001U, 0x00000000U);
+       psu_mask_write(0xFF180300, 0x00000001U, 0x00000000U);
+       psu_mask_write(0xFF410050, 0x00000001U, 0x00000000U);
+
+       return 1;
+}
+
+static unsigned long psu_ddr_init_data(void)
+{
+       psu_mask_write(0xFD1A0108, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFD070000, 0xE30FBE3DU, 0x81040010U);
+       psu_mask_write(0xFD070010, 0x8000F03FU, 0x00000030U);
+       psu_mask_write(0xFD070020, 0x000003F3U, 0x00000200U);
+       psu_mask_write(0xFD070024, 0xFFFFFFFFU, 0x00800000U);
+       psu_mask_write(0xFD070030, 0x0000007FU, 0x00000000U);
+       psu_mask_write(0xFD070034, 0x00FFFF1FU, 0x00408410U);
+       psu_mask_write(0xFD070050, 0x00F1F1F4U, 0x00210000U);
+       psu_mask_write(0xFD070054, 0x0FFF0FFFU, 0x00000000U);
+       psu_mask_write(0xFD070060, 0x00000073U, 0x00000001U);
+       psu_mask_write(0xFD070064, 0x0FFF83FFU, 0x008180BBU);
+       psu_mask_write(0xFD070070, 0x00000017U, 0x00000010U);
+       psu_mask_write(0xFD070074, 0x00000003U, 0x00000000U);
+       psu_mask_write(0xFD0700C4, 0x3F000391U, 0x10000200U);
+       psu_mask_write(0xFD0700C8, 0x01FF1F3FU, 0x0040051FU);
+       psu_mask_write(0xFD0700D0, 0xC3FF0FFFU, 0x00020106U);
+       psu_mask_write(0xFD0700D4, 0x01FF7F0FU, 0x00020000U);
+       psu_mask_write(0xFD0700D8, 0x0000FF0FU, 0x00002305U);
+       psu_mask_write(0xFD0700DC, 0xFFFFFFFFU, 0x07300301U);
+       psu_mask_write(0xFD0700E0, 0xFFFFFFFFU, 0x00200200U);
+       psu_mask_write(0xFD0700E4, 0x00FF03FFU, 0x00210004U);
+       psu_mask_write(0xFD0700E8, 0xFFFFFFFFU, 0x000006C0U);
+       psu_mask_write(0xFD0700EC, 0xFFFF0000U, 0x08190000U);
+       psu_mask_write(0xFD0700F0, 0x0000003FU, 0x00000010U);
+       psu_mask_write(0xFD0700F4, 0x00000FFFU, 0x0000066FU);
+       psu_mask_write(0xFD070100, 0x7F3F7F3FU, 0x11102412U);
+       psu_mask_write(0xFD070104, 0x001F1F7FU, 0x0004041AU);
+       psu_mask_write(0xFD070108, 0x3F3F3F3FU, 0x0708060DU);
+       psu_mask_write(0xFD07010C, 0x3FF3F3FFU, 0x0050400CU);
+       psu_mask_write(0xFD070110, 0x1F0F0F1FU, 0x08030409U);
+       psu_mask_write(0xFD070114, 0x0F0F3F1FU, 0x06060403U);
+       psu_mask_write(0xFD070118, 0x0F0F000FU, 0x01010004U);
+       psu_mask_write(0xFD07011C, 0x00000F0FU, 0x00000606U);
+       psu_mask_write(0xFD070120, 0x7F7F7F7FU, 0x04040D07U);
+       psu_mask_write(0xFD070124, 0x40070F3FU, 0x0002030BU);
+       psu_mask_write(0xFD07012C, 0x7F1F031FU, 0x1207010EU);
+       psu_mask_write(0xFD070130, 0x00030F1FU, 0x00020608U);
+       psu_mask_write(0xFD070180, 0xF7FF03FFU, 0x81000040U);
+       psu_mask_write(0xFD070184, 0x3FFFFFFFU, 0x020196E5U);
+       psu_mask_write(0xFD070190, 0x1FBFBF3FU, 0x048B820BU);
+       psu_mask_write(0xFD070194, 0xF31F0F0FU, 0x00030304U);
+       psu_mask_write(0xFD070198, 0x0FF1F1F1U, 0x07000101U);
+       psu_mask_write(0xFD07019C, 0x000000F1U, 0x00000021U);
+       psu_mask_write(0xFD0701A0, 0xC3FF03FFU, 0x00400003U);
+       psu_mask_write(0xFD0701A4, 0x00FF00FFU, 0x00C800FFU);
+       psu_mask_write(0xFD0701B0, 0x00000007U, 0x00000000U);
+       psu_mask_write(0xFD0701B4, 0x00003F3FU, 0x00000909U);
+       psu_mask_write(0xFD0701C0, 0x00000007U, 0x00000001U);
+       psu_mask_write(0xFD070200, 0x0000001FU, 0x0000001FU);
+       psu_mask_write(0xFD070204, 0x001F1F1FU, 0x001F0909U);
+       psu_mask_write(0xFD070208, 0x0F0F0F0FU, 0x01010100U);
+       psu_mask_write(0xFD07020C, 0x0F0F0F0FU, 0x01010101U);
+       psu_mask_write(0xFD070210, 0x00000F0FU, 0x00000F0FU);
+       psu_mask_write(0xFD070214, 0x0F0F0F0FU, 0x070F0707U);
+       psu_mask_write(0xFD070218, 0x8F0F0F0FU, 0x07070707U);
+       psu_mask_write(0xFD07021C, 0x00000F0FU, 0x00000F0FU);
+       psu_mask_write(0xFD070220, 0x00001F1FU, 0x00001F01U);
+       psu_mask_write(0xFD070224, 0x0F0F0F0FU, 0x07070707U);
+       psu_mask_write(0xFD070228, 0x0F0F0F0FU, 0x07070707U);
+       psu_mask_write(0xFD07022C, 0x0000000FU, 0x00000007U);
+       psu_mask_write(0xFD070240, 0x0F1F0F7CU, 0x06000600U);
+       psu_mask_write(0xFD070244, 0x00003333U, 0x00000001U);
+       psu_mask_write(0xFD070250, 0x7FFF3F07U, 0x01002001U);
+       psu_mask_write(0xFD070264, 0xFF00FFFFU, 0x08000040U);
+       psu_mask_write(0xFD07026C, 0xFF00FFFFU, 0x08000040U);
+       psu_mask_write(0xFD070280, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD070284, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD070288, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD07028C, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD070290, 0x0000FFFFU, 0x00000000U);
+       psu_mask_write(0xFD070294, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD070300, 0x00000011U, 0x00000000U);
+       psu_mask_write(0xFD07030C, 0x80000033U, 0x00000000U);
+       psu_mask_write(0xFD070320, 0x00000001U, 0x00000000U);
+       psu_mask_write(0xFD070400, 0x00000111U, 0x00000001U);
+       psu_mask_write(0xFD070404, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070408, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070490, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD070494, 0x0033000FU, 0x0020000BU);
+       psu_mask_write(0xFD070498, 0x07FF07FFU, 0x00000000U);
+       psu_mask_write(0xFD0704B4, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD0704B8, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070540, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD070544, 0x03330F0FU, 0x02000B03U);
+       psu_mask_write(0xFD070548, 0x07FF07FFU, 0x00000000U);
+       psu_mask_write(0xFD070564, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070568, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD0705F0, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD0705F4, 0x03330F0FU, 0x02000B03U);
+       psu_mask_write(0xFD0705F8, 0x07FF07FFU, 0x00000000U);
+       psu_mask_write(0xFD070614, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070618, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD0706A0, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD0706A4, 0x0033000FU, 0x00100003U);
+       psu_mask_write(0xFD0706A8, 0x07FF07FFU, 0x0000004FU);
+       psu_mask_write(0xFD0706AC, 0x0033000FU, 0x00100003U);
+       psu_mask_write(0xFD0706B0, 0x000007FFU, 0x0000004FU);
+       psu_mask_write(0xFD0706C4, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD0706C8, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070750, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD070754, 0x0033000FU, 0x00100003U);
+       psu_mask_write(0xFD070758, 0x07FF07FFU, 0x0000004FU);
+       psu_mask_write(0xFD07075C, 0x0033000FU, 0x00100003U);
+       psu_mask_write(0xFD070760, 0x000007FFU, 0x0000004FU);
+       psu_mask_write(0xFD070774, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070778, 0x000073FFU, 0x0000200FU);
+       psu_mask_write(0xFD070800, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD070804, 0x0033000FU, 0x00100003U);
+       psu_mask_write(0xFD070808, 0x07FF07FFU, 0x0000004FU);
+       psu_mask_write(0xFD07080C, 0x0033000FU, 0x00100003U);
+       psu_mask_write(0xFD070810, 0x000007FFU, 0x0000004FU);
+       psu_mask_write(0xFD070F04, 0x000001FFU, 0x00000000U);
+       psu_mask_write(0xFD070F08, 0x000000FFU, 0x00000000U);
+       psu_mask_write(0xFD070F0C, 0x000001FFU, 0x00000010U);
+       psu_mask_write(0xFD070F10, 0x000000FFU, 0x0000000FU);
+       psu_mask_write(0xFD072190, 0x1FBFBF3FU, 0x07828002U);
+       psu_mask_write(0xFD1A0108, 0x0000000CU, 0x00000000U);
+       psu_mask_write(0xFD080010, 0xFFFFFFFFU, 0x07001E00U);
+       psu_mask_write(0xFD080018, 0xFFFFFFFFU, 0x00F10010U);
+       psu_mask_write(0xFD08001C, 0xFFFFFFFFU, 0x55AA5480U);
+       psu_mask_write(0xFD080024, 0xFFFFFFFFU, 0x010100F4U);
+       psu_mask_write(0xFD080040, 0xFFFFFFFFU, 0x42C21590U);
+       psu_mask_write(0xFD080044, 0xFFFFFFFFU, 0xD05512C0U);
+       psu_mask_write(0xFD080068, 0xFFFFFFFFU, 0x01100000U);
+       psu_mask_write(0xFD080090, 0xFFFFFFFFU, 0x02A04161U);
+       psu_mask_write(0xFD0800C0, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD0800C4, 0xFFFFFFFFU, 0x000000E0U);
+       psu_mask_write(0xFD080100, 0xFFFFFFFFU, 0x0800040CU);
+       psu_mask_write(0xFD080110, 0xFFFFFFFFU, 0x07240F08U);
+       psu_mask_write(0xFD080114, 0xFFFFFFFFU, 0x28200008U);
+       psu_mask_write(0xFD080118, 0xFFFFFFFFU, 0x000F0300U);
+       psu_mask_write(0xFD08011C, 0xFFFFFFFFU, 0x83000800U);
+       psu_mask_write(0xFD080120, 0xFFFFFFFFU, 0x01762B07U);
+       psu_mask_write(0xFD080124, 0xFFFFFFFFU, 0x00330F08U);
+       psu_mask_write(0xFD080128, 0xFFFFFFFFU, 0x00000E0FU);
+       psu_mask_write(0xFD080140, 0xFFFFFFFFU, 0x08400020U);
+       psu_mask_write(0xFD080144, 0xFFFFFFFFU, 0x00000C80U);
+       psu_mask_write(0xFD080150, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080154, 0xFFFFFFFFU, 0x00000200U);
+       psu_mask_write(0xFD080180, 0xFFFFFFFFU, 0x00000630U);
+       psu_mask_write(0xFD080184, 0xFFFFFFFFU, 0x00000301U);
+       psu_mask_write(0xFD080188, 0xFFFFFFFFU, 0x00000020U);
+       psu_mask_write(0xFD08018C, 0xFFFFFFFFU, 0x00000200U);
+       psu_mask_write(0xFD080190, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080194, 0xFFFFFFFFU, 0x000006C0U);
+       psu_mask_write(0xFD080198, 0xFFFFFFFFU, 0x00000819U);
+       psu_mask_write(0xFD0801AC, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD0801B0, 0xFFFFFFFFU, 0x0000004DU);
+       psu_mask_write(0xFD0801B4, 0xFFFFFFFFU, 0x00000008U);
+       psu_mask_write(0xFD0801B8, 0xFFFFFFFFU, 0x0000004DU);
+       psu_mask_write(0xFD0801D8, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080200, 0xFFFFFFFFU, 0x800091C7U);
+       psu_mask_write(0xFD080204, 0xFFFFFFFFU, 0x00010236U);
+       psu_mask_write(0xFD080240, 0xFFFFFFFFU, 0x00141054U);
+       psu_mask_write(0xFD080250, 0xFFFFFFFFU, 0x00088000U);
+       psu_mask_write(0xFD080414, 0xFFFFFFFFU, 0x12341000U);
+       psu_mask_write(0xFD0804F4, 0xFFFFFFFFU, 0x00000005U);
+       psu_mask_write(0xFD080500, 0xFFFFFFFFU, 0x30000028U);
+       psu_mask_write(0xFD080508, 0xFFFFFFFFU, 0x0A000000U);
+       psu_mask_write(0xFD08050C, 0xFFFFFFFFU, 0x00000009U);
+       psu_mask_write(0xFD080510, 0xFFFFFFFFU, 0x0A000000U);
+       psu_mask_write(0xFD080520, 0xFFFFFFFFU, 0x0300B0CEU);
+       psu_mask_write(0xFD080528, 0xFFFFFFFFU, 0xF9032019U);
+       psu_mask_write(0xFD08052C, 0xFFFFFFFFU, 0x07F001E3U);
+       psu_mask_write(0xFD080544, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080548, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080558, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD08055C, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080560, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080564, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080680, 0xFFFFFFFFU, 0x008AAA58U);
+       psu_mask_write(0xFD080684, 0xFFFFFFFFU, 0x000079DDU);
+       psu_mask_write(0xFD080694, 0xFFFFFFFFU, 0x01E10210U);
+       psu_mask_write(0xFD080698, 0xFFFFFFFFU, 0x01E10000U);
+       psu_mask_write(0xFD0806A4, 0xFFFFFFFFU, 0x00087BDBU);
+       psu_mask_write(0xFD080700, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080704, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD08070C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080710, 0xFFFFFFFFU, 0x0E00B03CU);
+       psu_mask_write(0xFD080714, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080718, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080800, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080804, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD08080C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080810, 0xFFFFFFFFU, 0x0E00B03CU);
+       psu_mask_write(0xFD080814, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080818, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080900, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080904, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD08090C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080910, 0xFFFFFFFFU, 0x0E00B004U);
+       psu_mask_write(0xFD080914, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080918, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080A00, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080A04, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD080A0C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080A10, 0xFFFFFFFFU, 0x0E00B004U);
+       psu_mask_write(0xFD080A14, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080A18, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080B00, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080B04, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD080B08, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080B0C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080B10, 0xFFFFFFFFU, 0x0E00B004U);
+       psu_mask_write(0xFD080B14, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080B18, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080C00, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080C04, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD080C08, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080C0C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080C10, 0xFFFFFFFFU, 0x0E00B03CU);
+       psu_mask_write(0xFD080C14, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080C18, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080D00, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080D04, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD080D08, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080D0C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080D10, 0xFFFFFFFFU, 0x0E00B004U);
+       psu_mask_write(0xFD080D14, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080D18, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080E00, 0xFFFFFFFFU, 0x40800604U);
+       psu_mask_write(0xFD080E04, 0xFFFFFFFFU, 0x00007FFFU);
+       psu_mask_write(0xFD080E08, 0xFFFFFFFFU, 0x00000000U);
+       psu_mask_write(0xFD080E0C, 0xFFFFFFFFU, 0x3F000008U);
+       psu_mask_write(0xFD080E10, 0xFFFFFFFFU, 0x0E00B03CU);
+       psu_mask_write(0xFD080E14, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080E18, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD080F00, 0xFFFFFFFFU, 0x80803660U);
+       psu_mask_write(0xFD080F04, 0xFFFFFFFFU, 0x55556000U);
+       psu_mask_write(0xFD080F08, 0xFFFFFFFFU, 0xAAAAAAAAU);
+       psu_mask_write(0xFD080F0C, 0xFFFFFFFFU, 0x0029A4A4U);
+       psu_mask_write(0xFD080F10, 0xFFFFFFFFU, 0x0C00B000U);
+       psu_mask_write(0xFD080F14, 0xFFFFFFFFU, 0x09095555U);
+       psu_mask_write(0xFD080F18, 0xFFFFFFFFU, 0x09092B2BU);
+       psu_mask_write(0xFD081400, 0xFFFFFFFFU, 0x2A019FFEU);
+       psu_mask_write(0xFD081404, 0xFFFFFFFFU, 0x01100000U);
+       psu_mask_write(0xFD08141C, 0xFFFFFFFFU, 0x01264300U);
+       psu_mask_write(0xFD08142C, 0xFFFFFFFFU, 0x00041800U);
+       psu_mask_write(0xFD081430, 0xFFFFFFFFU, 0x70800000U);
+       psu_mask_write(0xFD081440, 0xFFFFFFFFU, 0x2A019FFEU);
+       psu_mask_write(0xFD081444, 0xFFFFFFFFU, 0x01100000U);
+       psu_mask_write(0xFD08145C, 0xFFFFFFFFU, 0x01264300U);
+       psu_mask_write(0xFD08146C, 0xFFFFFFFFU, 0x00041800U);
+       psu_mask_write(0xFD081470, 0xFFFFFFFFU, 0x70800000U);
+       psu_mask_write(0xFD081480, 0xFFFFFFFFU, 0x2A019FFEU);
+       psu_mask_write(0xFD081484, 0xFFFFFFFFU, 0x01100000U);
+       psu_mask_write(0xFD08149C, 0xFFFFFFFFU, 0x01264300U);
+       psu_mask_write(0xFD0814AC, 0xFFFFFFFFU, 0x00041800U);
+       psu_mask_write(0xFD0814B0, 0xFFFFFFFFU, 0x70800000U);
+       psu_mask_write(0xFD0814C0, 0xFFFFFFFFU, 0x2A019FFEU);
+       psu_mask_write(0xFD0814C4, 0xFFFFFFFFU, 0x01100000U);
+       psu_mask_write(0xFD0814DC, 0xFFFFFFFFU, 0x01264300U);
+       psu_mask_write(0xFD0814EC, 0xFFFFFFFFU, 0x00041800U);
+       psu_mask_write(0xFD0814F0, 0xFFFFFFFFU, 0x70800000U);
+       psu_mask_write(0xFD081500, 0xFFFFFFFFU, 0x15019FFEU);
+       psu_mask_write(0xFD081504, 0xFFFFFFFFU, 0x21100000U);
+       psu_mask_write(0xFD08151C, 0xFFFFFFFFU, 0x01266300U);
+       psu_mask_write(0xFD08152C, 0xFFFFFFFFU, 0x00041800U);
+       psu_mask_write(0xFD081530, 0xFFFFFFFFU, 0x70400000U);
+       psu_mask_write(0xFD0817DC, 0xFFFFFFFFU, 0x012643C4U);
+
+       return 1;
+}
+
+static unsigned long psu_ddr_qos_init_data(void)
+{
+       psu_mask_write(0xFD360008, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD36001C, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD370008, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD37001C, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD380008, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD38001C, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD390008, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD39001C, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD3A0008, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD3A001C, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD3B0008, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFD3B001C, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFF9B0008, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFF9B001C, 0x0000000FU, 0x00000000U);
+
+       return 1;
+}
+
+static unsigned long psu_mio_init_data(void)
+{
+       psu_mask_write(0xFF180000, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180004, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180008, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF18000C, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180010, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180014, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180018, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF18001C, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180020, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180024, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180028, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF18002C, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180030, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180034, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF180038, 0x000000FEU, 0x00000040U);
+       psu_mask_write(0xFF18003C, 0x000000FEU, 0x00000040U);
+       psu_mask_write(0xFF180040, 0x000000FEU, 0x00000040U);
+       psu_mask_write(0xFF180044, 0x000000FEU, 0x00000040U);
+       psu_mask_write(0xFF180048, 0x000000FEU, 0x000000C0U);
+       psu_mask_write(0xFF18004C, 0x000000FEU, 0x000000C0U);
+       psu_mask_write(0xFF180050, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF180054, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF180058, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF18005C, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF180060, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF180064, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF180068, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF18006C, 0x000000FEU, 0x00000018U);
+       psu_mask_write(0xFF180070, 0x000000FEU, 0x00000018U);
+       psu_mask_write(0xFF180074, 0x000000FEU, 0x00000018U);
+       psu_mask_write(0xFF180078, 0x000000FEU, 0x00000018U);
+       psu_mask_write(0xFF18007C, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF180080, 0x000000FEU, 0x00000008U);
+       psu_mask_write(0xFF180084, 0x000000FEU, 0x00000008U);
+       psu_mask_write(0xFF180098, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF18009C, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800A0, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800A4, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800A8, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800AC, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF1800B0, 0x000000FEU, 0x00000000U);
+       psu_mask_write(0xFF1800B4, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800B8, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800BC, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800C0, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800C4, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800C8, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800CC, 0x000000FEU, 0x00000010U);
+       psu_mask_write(0xFF1800D0, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800D4, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800D8, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800DC, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800E0, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800E4, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800E8, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800EC, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800F0, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800F4, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800F8, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF1800FC, 0x000000FEU, 0x00000004U);
+       psu_mask_write(0xFF180100, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180104, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180108, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF18010C, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180110, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180114, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180118, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF18011C, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180120, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180124, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180128, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF18012C, 0x000000FEU, 0x00000002U);
+       psu_mask_write(0xFF180130, 0x000000FEU, 0x000000C0U);
+       psu_mask_write(0xFF180134, 0x000000FEU, 0x000000C0U);
+       psu_mask_write(0xFF180204, 0xFFFFFFFFU, 0x50040000U);
+       psu_mask_write(0xFF180208, 0xFFFFFFFFU, 0x00B02000U);
+       psu_mask_write(0xFF18020C, 0x00003FFFU, 0x00000FC0U);
+       psu_mask_write(0xFF180138, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF18013C, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180140, 0x03FFFFFFU, 0x00000000U);
+       psu_mask_write(0xFF180144, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180148, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF18014C, 0x03FFFFFFU, 0x00000000U);
+       psu_mask_write(0xFF180154, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180158, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF18015C, 0x03FFFFFFU, 0x00000000U);
+       psu_mask_write(0xFF180160, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180164, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180168, 0x03FFFFFFU, 0x00000000U);
+       psu_mask_write(0xFF180170, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180174, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180178, 0x03FFFFFFU, 0x00000000U);
+       psu_mask_write(0xFF18017C, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180180, 0x03FFFFFFU, 0x03FFFFFFU);
+       psu_mask_write(0xFF180184, 0x03FFFFFFU, 0x00000000U);
+       psu_mask_write(0xFF180200, 0x0000000FU, 0x00000000U);
+
+       return 1;
+}
+
+static unsigned long psu_peripherals_pre_init_data(void)
+{
+       psu_mask_write(0xFF5E0108, 0x013F3F07U, 0x01012302U);
+       psu_mask_write(0xFF5E0238, 0x00000001U, 0x00000001U);
+
+       return 1;
+}
+
+static unsigned long psu_peripherals_init_data(void)
+{
+       psu_mask_write(0xFD1A0100, 0x00018046U, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x001A0000U, 0x00000000U);
+       psu_mask_write(0xFF5E023C, 0x0093C018U, 0x00000000U);
+       psu_mask_write(0xFF5E0230, 0x00000008U, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x00000001U, 0x00000000U);
+       psu_mask_write(0xFF180390, 0x00000004U, 0x00000004U);
+       psu_mask_write(0xFF5E023C, 0x00000400U, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x00000040U, 0x00000000U);
+       psu_mask_write(0xFF180310, 0x00008000U, 0x00000000U);
+       psu_mask_write(0xFF180320, 0x33840000U, 0x02840000U);
+       psu_mask_write(0xFF18031C, 0x7FFE0000U, 0x64500000U);
+       psu_mask_write(0xFF180358, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFF180324, 0x03C00000U, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x00000600U, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x00008000U, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x00007800U, 0x00000000U);
+       psu_mask_write(0xFF5E0238, 0x00000006U, 0x00000000U);
+       psu_mask_write(0xFF000034, 0x000000FFU, 0x00000005U);
+       psu_mask_write(0xFF000018, 0x0000FFFFU, 0x0000008FU);
+       psu_mask_write(0xFF000000, 0x000001FFU, 0x00000017U);
+       psu_mask_write(0xFF000004, 0x000003FFU, 0x00000020U);
+       psu_mask_write(0xFF010034, 0x000000FFU, 0x00000005U);
+       psu_mask_write(0xFF010018, 0x0000FFFFU, 0x0000008FU);
+       psu_mask_write(0xFF010000, 0x000001FFU, 0x00000017U);
+       psu_mask_write(0xFF010004, 0x000003FFU, 0x00000020U);
+       psu_mask_write(0xFF5E0238, 0x00040000U, 0x00000000U);
+       psu_mask_write(0xFF4B0024, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFFCA5000, 0x00001FFFU, 0x00000000U);
+       psu_mask_write(0xFD5C0060, 0x000F000FU, 0x00000000U);
+       psu_mask_write(0xFFA60040, 0x80000000U, 0x80000000U);
+       psu_mask_write(0xFF260020, 0xFFFFFFFFU, 0x05F5DD18U);
+       psu_mask_write(0xFF260000, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFF5E0250, 0x00000F0FU, 0x00000202U);
+
+       mask_delay(1);
+       psu_mask_write(0xFF5E0250, 0x00000F0FU, 0x00000002U);
+
+       mask_delay(5);
+       psu_mask_write(0xFF5E0250, 0x00000F0FU, 0x00000202U);
+
+       return 1;
+}
+
+static unsigned long psu_serdes_init_data(void)
+{
+       psu_mask_write(0xFD410000, 0x0000001FU, 0x00000009U);
+       psu_mask_write(0xFD410004, 0x0000001FU, 0x00000009U);
+       psu_mask_write(0xFD410008, 0x0000001FU, 0x00000008U);
+       psu_mask_write(0xFD41000C, 0x0000001FU, 0x0000000FU);
+       psu_mask_write(0xFD402860, 0x00000082U, 0x00000002U);
+       psu_mask_write(0xFD402864, 0x00000080U, 0x00000080U);
+       psu_mask_write(0xFD402868, 0x00000080U, 0x00000080U);
+       psu_mask_write(0xFD40286C, 0x00000080U, 0x00000080U);
+       psu_mask_write(0xFD40A094, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD40A368, 0x000000FFU, 0x00000038U);
+       psu_mask_write(0xFD40A36C, 0x00000007U, 0x00000003U);
+       psu_mask_write(0xFD40E368, 0x000000FFU, 0x000000E0U);
+       psu_mask_write(0xFD40E36C, 0x00000007U, 0x00000003U);
+       psu_mask_write(0xFD402368, 0x000000FFU, 0x00000058U);
+       psu_mask_write(0xFD40236C, 0x00000007U, 0x00000003U);
+       psu_mask_write(0xFD406368, 0x000000FFU, 0x00000058U);
+       psu_mask_write(0xFD40636C, 0x00000007U, 0x00000003U);
+       psu_mask_write(0xFD402370, 0x000000FFU, 0x0000007CU);
+       psu_mask_write(0xFD402374, 0x000000FFU, 0x00000033U);
+       psu_mask_write(0xFD402378, 0x000000FFU, 0x00000002U);
+       psu_mask_write(0xFD40237C, 0x00000033U, 0x00000030U);
+       psu_mask_write(0xFD406370, 0x000000FFU, 0x0000007CU);
+       psu_mask_write(0xFD406374, 0x000000FFU, 0x00000033U);
+       psu_mask_write(0xFD406378, 0x000000FFU, 0x00000002U);
+       psu_mask_write(0xFD40637C, 0x00000033U, 0x00000030U);
+       psu_mask_write(0xFD40A370, 0x000000FFU, 0x000000F4U);
+       psu_mask_write(0xFD40A374, 0x000000FFU, 0x00000031U);
+       psu_mask_write(0xFD40A378, 0x000000FFU, 0x00000002U);
+       psu_mask_write(0xFD40A37C, 0x00000033U, 0x00000030U);
+       psu_mask_write(0xFD40E370, 0x000000FFU, 0x000000C9U);
+       psu_mask_write(0xFD40E374, 0x000000FFU, 0x000000D2U);
+       psu_mask_write(0xFD40E378, 0x000000FFU, 0x00000001U);
+       psu_mask_write(0xFD40E37C, 0x000000B3U, 0x000000B0U);
+       psu_mask_write(0xFD40906C, 0x00000003U, 0x00000003U);
+       psu_mask_write(0xFD4080F4, 0x00000003U, 0x00000003U);
+       psu_mask_write(0xFD40E360, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD40D06C, 0x0000000FU, 0x0000000FU);
+       psu_mask_write(0xFD40C0F4, 0x0000000BU, 0x0000000BU);
+       psu_mask_write(0xFD4090CC, 0x00000020U, 0x00000020U);
+       psu_mask_write(0xFD401074, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD405074, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD409074, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD40D074, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD401994, 0x00000007U, 0x00000007U);
+       psu_mask_write(0xFD405994, 0x00000007U, 0x00000007U);
+       psu_mask_write(0xFD40989C, 0x00000080U, 0x00000080U);
+       psu_mask_write(0xFD4098F8, 0x000000FFU, 0x0000001AU);
+       psu_mask_write(0xFD4098FC, 0x000000FFU, 0x0000001AU);
+       psu_mask_write(0xFD409990, 0x000000FFU, 0x00000010U);
+       psu_mask_write(0xFD409924, 0x000000FFU, 0x000000FEU);
+       psu_mask_write(0xFD409928, 0x000000FFU, 0x00000000U);
+       psu_mask_write(0xFD409900, 0x000000FFU, 0x0000001AU);
+       psu_mask_write(0xFD40992C, 0x000000FFU, 0x00000000U);
+       psu_mask_write(0xFD409980, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFD409914, 0x000000FFU, 0x000000F7U);
+       psu_mask_write(0xFD409918, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD409940, 0x000000FFU, 0x000000F7U);
+       psu_mask_write(0xFD409944, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD409994, 0x00000007U, 0x00000007U);
+       psu_mask_write(0xFD40D89C, 0x00000080U, 0x00000080U);
+       psu_mask_write(0xFD40D8F8, 0x000000FFU, 0x0000007DU);
+       psu_mask_write(0xFD40D8FC, 0x000000FFU, 0x0000007DU);
+       psu_mask_write(0xFD40D990, 0x000000FFU, 0x00000001U);
+       psu_mask_write(0xFD40D924, 0x000000FFU, 0x0000009CU);
+       psu_mask_write(0xFD40D928, 0x000000FFU, 0x00000039U);
+       psu_mask_write(0xFD40D98C, 0x000000F0U, 0x00000020U);
+       psu_mask_write(0xFD40D900, 0x000000FFU, 0x0000007DU);
+       psu_mask_write(0xFD40D92C, 0x000000FFU, 0x00000064U);
+       psu_mask_write(0xFD40D980, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFD40D914, 0x000000FFU, 0x000000F7U);
+       psu_mask_write(0xFD40D918, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD40D940, 0x000000FFU, 0x000000F7U);
+       psu_mask_write(0xFD40D944, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD40D994, 0x00000007U, 0x00000007U);
+       psu_mask_write(0xFD40107C, 0x0000000FU, 0x00000001U);
+       psu_mask_write(0xFD40507C, 0x0000000FU, 0x00000001U);
+       psu_mask_write(0xFD40907C, 0x0000000FU, 0x00000001U);
+       psu_mask_write(0xFD40D07C, 0x0000000FU, 0x00000001U);
+       psu_mask_write(0xFD4019A4, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFD401038, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD40102C, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD4059A4, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFD405038, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD40502C, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD4099A4, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFD409038, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD40902C, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD40D9A4, 0x000000FFU, 0x000000FFU);
+       psu_mask_write(0xFD40D038, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD40D02C, 0x00000040U, 0x00000040U);
+       psu_mask_write(0xFD4019AC, 0x00000003U, 0x00000000U);
+       psu_mask_write(0xFD4059AC, 0x00000003U, 0x00000000U);
+       psu_mask_write(0xFD4099AC, 0x00000003U, 0x00000000U);
+       psu_mask_write(0xFD40D9AC, 0x00000003U, 0x00000000U);
+       psu_mask_write(0xFD401978, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD405978, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD409978, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD40D978, 0x00000010U, 0x00000010U);
+       psu_mask_write(0xFD410010, 0x00000077U, 0x00000044U);
+       psu_mask_write(0xFD410014, 0x00000077U, 0x00000023U);
+       psu_mask_write(0xFD400CB4, 0x00000037U, 0x00000037U);
+       psu_mask_write(0xFD404CB4, 0x00000037U, 0x00000037U);
+       psu_mask_write(0xFD4001D8, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD4041D8, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD40C1D8, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFD40DC14, 0x000000FFU, 0x000000E6U);
+       psu_mask_write(0xFD40DC40, 0x0000001FU, 0x0000000CU);
+       psu_mask_write(0xFD40D94C, 0x00000020U, 0x00000020U);
+       psu_mask_write(0xFD40D950, 0x00000007U, 0x00000006U);
+       psu_mask_write(0xFD404CC0, 0x0000001FU, 0x00000000U);
+       psu_mask_write(0xFD400CC0, 0x0000001FU, 0x00000000U);
+       psu_mask_write(0xFD404048, 0x000000FFU, 0x00000000U);
+       psu_mask_write(0xFD400048, 0x000000FFU, 0x00000000U);
+       psu_mask_write(0xFD40C048, 0x000000FFU, 0x00000001U);
+
+       return 1;
+}
+
+static unsigned long psu_resetout_init_data(void)
+{
+       psu_mask_write(0xFF5E023C, 0x00000400U, 0x00000000U);
+       psu_mask_write(0xFF9D0080, 0x00000001U, 0x00000001U);
+       psu_mask_write(0xFF9D007C, 0x00000001U, 0x00000000U);
+       psu_mask_write(0xFF5E023C, 0x00000140U, 0x00000000U);
+       psu_mask_write(0xFF5E0230, 0x00000008U, 0x00000000U);
+       psu_mask_write(0xFD3D0100, 0x00000003U, 0x00000003U);
+       psu_mask_write(0xFD1A0100, 0x00000002U, 0x00000000U);
+       psu_mask_write(0xFD1A0100, 0x00010000U, 0x00000000U);
+       psu_mask_write(0xFD4A0200, 0x00000002U, 0x00000000U);
+       psu_mask_write(0xFD4A0238, 0x0000000FU, 0x00000000U);
+       psu_mask_write(0xFE20C200, 0x00023FFFU, 0x00022457U);
+       psu_mask_write(0xFE20C630, 0x003FFF00U, 0x00000000U);
+       psu_mask_write(0xFE20C11C, 0x00000600U, 0x00000600U);
+       psu_mask_write(0xFE20C12C, 0x00004000U, 0x00004000U);
+       psu_mask_write(0xFD480064, 0x00000200U, 0x00000200U);
+       mask_poll(0xFD4063E4, 0x00000010U);
+       mask_poll(0xFD40A3E4, 0x00000010U);
+       mask_poll(0xFD40E3E4, 0x00000010U);
+       psu_mask_write(0xFD0C00AC, 0xFFFFFFFFU, 0x28184018U);
+       psu_mask_write(0xFD0C00B0, 0xFFFFFFFFU, 0x0E081406U);
+       psu_mask_write(0xFD0C00B4, 0xFFFFFFFFU, 0x064A0813U);
+       psu_mask_write(0xFD0C00B8, 0xFFFFFFFFU, 0x3FFC96A4U);
+
+       return 1;
+}
+
+static unsigned long psu_resetin_init_data(void)
+{
+       psu_mask_write(0xFF5E023C, 0x00000540U, 0x00000540U);
+       psu_mask_write(0xFF5E0230, 0x00000008U, 0x00000008U);
+       psu_mask_write(0xFD1A0100, 0x00000002U, 0x00000002U);
+       psu_mask_write(0xFD4A0238, 0x0000000FU, 0x0000000AU);
+       psu_mask_write(0xFD4A0200, 0x00000002U, 0x00000002U);
+       psu_mask_write(0xFD1A0100, 0x00010000U, 0x00010000U);
+
+       return 1;
+}
+
+static unsigned long psu_afi_config(void)
+{
+       psu_mask_write(0xFD1A0100, 0x00001F80U, 0x00000000U);
+       psu_mask_write(0xFF5E023C, 0x00080000U, 0x00000000U);
+       psu_mask_write(0xFD615000, 0x00000F00U, 0x00000A00U);
+
+       return 1;
+}
+
+static unsigned long psu_ddr_phybringup_data(void)
+{
+       unsigned int regval = 0;
+       unsigned int pll_retry = 10;
+       unsigned int pll_locked = 0;
+
+       while ((pll_retry > 0) && (!pll_locked)) {
+               Xil_Out32(0xFD080004, 0x00040010);
+               Xil_Out32(0xFD080004, 0x00040011);
+
+               while ((Xil_In32(0xFD080030) & 0x1) != 1)
+                       ;
+               pll_locked = (Xil_In32(0xFD080030) & 0x80000000)
+                   >> 31;
+               pll_locked &= (Xil_In32(0xFD0807E0) & 0x10000)
+                   >> 16;
+               pll_locked &= (Xil_In32(0xFD0809E0) & 0x10000)
+                   >> 16;
+               pll_locked &= (Xil_In32(0xFD080BE0) & 0x10000)
+                   >> 16;
+               pll_locked &= (Xil_In32(0xFD080DE0) & 0x10000)
+                   >> 16;
+               pll_retry--;
+       }
+       Xil_Out32(0xFD0800C4, Xil_In32(0xFD0800C4) | (pll_retry << 16));
+       if (!pll_locked)
+               return 0;
+
+       Xil_Out32(0xFD080004U, 0x00040063U);
+
+       while ((Xil_In32(0xFD080030U) & 0x0000000FU) != 0x0000000FU)
+               ;
+       prog_reg(0xFD080004U, 0x00000001U, 0x00000000U, 0x00000001U);
+
+       while ((Xil_In32(0xFD080030U) & 0x000000FFU) != 0x0000001FU)
+               ;
+       Xil_Out32(0xFD0701B0U, 0x00000001U);
+       Xil_Out32(0xFD070320U, 0x00000001U);
+       while ((Xil_In32(0xFD070004U) & 0x0000000FU) != 0x00000001U)
+               ;
+       prog_reg(0xFD080014U, 0x00000040U, 0x00000006U, 0x00000001U);
+       Xil_Out32(0xFD080004, 0x0004FE01);
+       regval = Xil_In32(0xFD080030);
+       while (regval != 0x80000FFF)
+               regval = Xil_In32(0xFD080030);
+       regval = ((Xil_In32(0xFD080030) & 0x1FFF0000) >> 18);
+       if (regval != 0)
+               return 0;
+
+       Xil_Out32(0xFD080200U, 0x100091C7U);
+       int cur_R006_tREFPRD;
+
+       cur_R006_tREFPRD = (Xil_In32(0xFD080018U) & 0x0003FFFFU) >> 0x00000000U;
+       prog_reg(0xFD080018, 0x3FFFF, 0x0, cur_R006_tREFPRD);
+
+       prog_reg(0xFD08001CU, 0x00000018U, 0x00000003U, 0x00000003U);
+       prog_reg(0xFD08142CU, 0x00000030U, 0x00000004U, 0x00000003U);
+       prog_reg(0xFD08146CU, 0x00000030U, 0x00000004U, 0x00000003U);
+       prog_reg(0xFD0814ACU, 0x00000030U, 0x00000004U, 0x00000003U);
+       prog_reg(0xFD0814ECU, 0x00000030U, 0x00000004U, 0x00000003U);
+       prog_reg(0xFD08152CU, 0x00000030U, 0x00000004U, 0x00000003U);
+
+       Xil_Out32(0xFD080004, 0x00060001);
+       regval = Xil_In32(0xFD080030);
+       while ((regval & 0x80004001) != 0x80004001)
+               regval = Xil_In32(0xFD080030);
+
+       prog_reg(0xFD08001CU, 0x00000018U, 0x00000003U, 0x00000000U);
+       prog_reg(0xFD08142CU, 0x00000030U, 0x00000004U, 0x00000000U);
+       prog_reg(0xFD08146CU, 0x00000030U, 0x00000004U, 0x00000000U);
+       prog_reg(0xFD0814ACU, 0x00000030U, 0x00000004U, 0x00000000U);
+       prog_reg(0xFD0814ECU, 0x00000030U, 0x00000004U, 0x00000000U);
+       prog_reg(0xFD08152CU, 0x00000030U, 0x00000004U, 0x00000000U);
+
+       Xil_Out32(0xFD080200U, 0x800091C7U);
+       prog_reg(0xFD080018, 0x3FFFF, 0x0, cur_R006_tREFPRD);
+
+       Xil_Out32(0xFD080004, 0x0000C001);
+       regval = Xil_In32(0xFD080030);
+       while ((regval & 0x80000C01) != 0x80000C01)
+               regval = Xil_In32(0xFD080030);
+
+       Xil_Out32(0xFD070180U, 0x01000040U);
+       Xil_Out32(0xFD070060U, 0x00000000U);
+       prog_reg(0xFD080014U, 0x00000040U, 0x00000006U, 0x00000000U);
+
+       return 1;
+}
+
+static int serdes_enb_coarse_saturation(void)
+{
+       Xil_Out32(0xFD402094, 0x00000010);
+       Xil_Out32(0xFD406094, 0x00000010);
+       Xil_Out32(0xFD40A094, 0x00000010);
+       Xil_Out32(0xFD40E094, 0x00000010);
+       return 1;
+}
+
+static int serdes_fixcal_code(void)
+{
+       int maskstatus = 1;
+       unsigned int rdata = 0;
+       unsigned int match_pmos_code[23];
+       unsigned int match_nmos_code[23];
+       unsigned int match_ical_code[7];
+       unsigned int match_rcal_code[7];
+       unsigned int p_code = 0;
+       unsigned int n_code = 0;
+       unsigned int i_code = 0;
+       unsigned int r_code = 0;
+       unsigned int repeat_count = 0;
+       unsigned int L3_TM_CALIB_DIG20 = 0;
+       unsigned int L3_TM_CALIB_DIG19 = 0;
+       unsigned int L3_TM_CALIB_DIG18 = 0;
+       unsigned int L3_TM_CALIB_DIG16 = 0;
+       unsigned int L3_TM_CALIB_DIG15 = 0;
+       unsigned int L3_TM_CALIB_DIG14 = 0;
+       int i = 0;
+       int count = 0;
+
+       rdata = Xil_In32(0xFD40289C);
+       rdata = rdata & ~0x03;
+       rdata = rdata | 0x1;
+       Xil_Out32(0xFD40289C, rdata);
+
+       do {
+               if (count == 1100000)
+                       break;
+               rdata = Xil_In32(0xFD402B1C);
+               count++;
+       } while ((rdata & 0x0000000E) != 0x0000000E);
+
+       for (i = 0; i < 23; i++) {
+               match_pmos_code[i] = 0;
+               match_nmos_code[i] = 0;
+       }
+       for (i = 0; i < 7; i++) {
+               match_ical_code[i] = 0;
+               match_rcal_code[i] = 0;
+       }
+
+       do {
+               Xil_Out32(0xFD410010, 0x00000000);
+               Xil_Out32(0xFD410014, 0x00000000);
+
+               Xil_Out32(0xFD410010, 0x00000001);
+               Xil_Out32(0xFD410014, 0x00000000);
+
+               maskstatus = mask_poll(0xFD40EF14, 0x2);
+               if (maskstatus == 0) {
+                       xil_printf("#SERDES initialization timed out\n\r");
+                       return maskstatus;
+               }
+
+               p_code = mask_read(0xFD40EF18, 0xFFFFFFFF);
+               n_code = mask_read(0xFD40EF1C, 0xFFFFFFFF);
+               ;
+               i_code = mask_read(0xFD40EF24, 0xFFFFFFFF);
+               r_code = mask_read(0xFD40EF28, 0xFFFFFFFF);
+               ;
+
+               if (p_code >= 0x26 && p_code <= 0x3C)
+                       match_pmos_code[p_code - 0x26] += 1;
+
+               if (n_code >= 0x26 && n_code <= 0x3C)
+                       match_nmos_code[n_code - 0x26] += 1;
+
+               if (i_code >= 0xC && i_code <= 0x12)
+                       match_ical_code[i_code - 0xC] += 1;
+
+               if (r_code >= 0x6 && r_code <= 0xC)
+                       match_rcal_code[r_code - 0x6] += 1;
+
+       } while (repeat_count++ < 10);
+
+       for (i = 0; i < 23; i++) {
+               if (match_pmos_code[i] >= match_pmos_code[0]) {
+                       match_pmos_code[0] = match_pmos_code[i];
+                       p_code = 0x26 + i;
+               }
+               if (match_nmos_code[i] >= match_nmos_code[0]) {
+                       match_nmos_code[0] = match_nmos_code[i];
+                       n_code = 0x26 + i;
+               }
+       }
+
+       for (i = 0; i < 7; i++) {
+               if (match_ical_code[i] >= match_ical_code[0]) {
+                       match_ical_code[0] = match_ical_code[i];
+                       i_code = 0xC + i;
+               }
+               if (match_rcal_code[i] >= match_rcal_code[0]) {
+                       match_rcal_code[0] = match_rcal_code[i];
+                       r_code = 0x6 + i;
+               }
+       }
+
+       L3_TM_CALIB_DIG20 = mask_read(0xFD40EC50, 0xFFFFFFF0);
+       L3_TM_CALIB_DIG20 = L3_TM_CALIB_DIG20 | 0x8 | ((p_code >> 2) & 0x7);
+
+       L3_TM_CALIB_DIG19 = mask_read(0xFD40EC4C, 0xFFFFFF18);
+       L3_TM_CALIB_DIG19 = L3_TM_CALIB_DIG19 | ((p_code & 0x3) << 6)
+           | 0x20 | 0x4 | ((n_code >> 3) & 0x3);
+
+       L3_TM_CALIB_DIG18 = mask_read(0xFD40EC48, 0xFFFFFF0F);
+       L3_TM_CALIB_DIG18 = L3_TM_CALIB_DIG18 | ((n_code & 0x7) << 5) | 0x10;
+
+       L3_TM_CALIB_DIG16 = mask_read(0xFD40EC40, 0xFFFFFFF8);
+       L3_TM_CALIB_DIG16 = L3_TM_CALIB_DIG16 | ((r_code >> 1) & 0x7);
+
+       L3_TM_CALIB_DIG15 = mask_read(0xFD40EC3C, 0xFFFFFF30);
+       L3_TM_CALIB_DIG15 = L3_TM_CALIB_DIG15 | ((r_code & 0x1) << 7)
+           | 0x40 | 0x8 | ((i_code >> 1) & 0x7);
+
+       L3_TM_CALIB_DIG14 = mask_read(0xFD40EC38, 0xFFFFFF3F);
+       L3_TM_CALIB_DIG14 = L3_TM_CALIB_DIG14 | ((i_code & 0x1) << 7) | 0x40;
+
+       Xil_Out32(0xFD40EC50, L3_TM_CALIB_DIG20);
+       Xil_Out32(0xFD40EC4C, L3_TM_CALIB_DIG19);
+       Xil_Out32(0xFD40EC48, L3_TM_CALIB_DIG18);
+       Xil_Out32(0xFD40EC40, L3_TM_CALIB_DIG16);
+       Xil_Out32(0xFD40EC3C, L3_TM_CALIB_DIG15);
+       Xil_Out32(0xFD40EC38, L3_TM_CALIB_DIG14);
+       return maskstatus;
+}
+
+static int init_serdes(void)
+{
+       int status = 1;
+
+       status &= psu_resetin_init_data();
+
+       status &= serdes_fixcal_code();
+       status &= serdes_enb_coarse_saturation();
+
+       status &= psu_serdes_init_data();
+       status &= psu_resetout_init_data();
+
+       return status;
+}
+
+static void init_peripheral(void)
+{
+       psu_mask_write(0xFD5F0018, 0x8000001FU, 0x8000001FU);
+}
+
+int psu_init(void)
+{
+       int status = 1;
+
+       status &= psu_mio_init_data();
+       status &= psu_peripherals_pre_init_data();
+       status &= psu_pll_init_data();
+       status &= psu_clock_init_data();
+
+       status &= psu_ddr_init_data();
+       status &= psu_ddr_phybringup_data();
+
+       status &= psu_peripherals_init_data();
+       status &= init_serdes();
+       init_peripheral();
+
+       status &= psu_afi_config();
+       psu_ddr_qos_init_data();
+
+       if (status == 0)
+               return 1;
+       return 0;
+}
index 8bdc67748ec2c55635859fc9cfefb81715d2851c..3c92b1a5825f5a422770f60b617dd56683928997 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <cpu_func.h>
+#include <debug_uart.h>
 #include <env.h>
 #include <init.h>
 #include <sata.h>
@@ -319,22 +320,46 @@ static char *zynqmp_get_silicon_idcode_name(void)
 
 int board_early_init_f(void)
 {
-       int ret = 0;
-
 #if defined(CONFIG_ZYNQMP_PSU_INIT_ENABLED)
+       int ret;
+
        ret = psu_init();
+       if (ret)
+               return ret;
+
+       /* Delay is required for clocks to be propagated */
+       udelay(1000000);
 #endif
 
-       return ret;
+#ifdef CONFIG_DEBUG_UART
+       /* Uart debug for sure */
+       debug_uart_init();
+       puts("Debug uart enabled\n"); /* or printch() */
+#endif
+
+       return 0;
+}
+
+static int multi_boot(void)
+{
+       u32 multiboot;
+
+       multiboot = readl(&csu_base->multi_boot);
+
+       printf("Multiboot:\t%x\n", multiboot);
+
+       return 0;
 }
 
 int board_init(void)
 {
+#if defined(CONFIG_ZYNQMP_FIRMWARE)
        struct udevice *dev;
 
        uclass_get_device_by_name(UCLASS_FIRMWARE, "zynqmp-power", &dev);
        if (!dev)
                panic("PMU Firmware device not found - Enable it");
+#endif
 
 #if defined(CONFIG_SPL_BUILD)
        /* Check *at build time* if the filename is an non-empty string */
@@ -356,6 +381,9 @@ int board_init(void)
        }
 #endif
 
+       if (current_el() == 3)
+               multi_boot();
+
        return 0;
 }
 
@@ -487,7 +515,7 @@ static int reset_reason(void)
 
        env_set("reset_reason", reason);
 
-       ret = zynqmp_mmio_write(~0, ~0, (ulong)&crlapb_base->reset_reason);
+       ret = zynqmp_mmio_write((ulong)&crlapb_base->reset_reason, ~0, ~0);
        if (ret)
                return -EINVAL;
 
index 6403bc45a5ef790726deff449330236f32c7e25f..faa133da650a05017235c8b34089c60de8ca3c39 100644 (file)
@@ -399,6 +399,7 @@ config CMD_ABOOTIMG
 config CMD_ELF
        bool "bootelf, bootvx"
        default y
+       select LIB_ELF
        help
          Boot an ELF/vxWorks image from the memory.
 
index 036be5f44381ae5ac0e24820d30854d7eb0b3c5e..10e8264d3c7d14e5e09ed5ed3511848b4e7458ee 100644 (file)
--- a/cmd/elf.c
+++ b/cmd/elf.c
 #include <linux/linkage.h>
 #endif
 
-/*
- * A very simple ELF64 loader, assumes the image is valid, returns the
- * entry point address.
- *
- * Note if U-Boot is 32-bit, the loader assumes the to segment's
- * physical address and size is within the lower 32-bit address space.
- */
-static unsigned long load_elf64_image_phdr(unsigned long addr)
-{
-       Elf64_Ehdr *ehdr; /* Elf header structure pointer */
-       Elf64_Phdr *phdr; /* Program header structure pointer */
-       int i;
-
-       ehdr = (Elf64_Ehdr *)addr;
-       phdr = (Elf64_Phdr *)(addr + (ulong)ehdr->e_phoff);
-
-       /* Load each program header */
-       for (i = 0; i < ehdr->e_phnum; ++i) {
-               void *dst = (void *)(ulong)phdr->p_paddr;
-               void *src = (void *)addr + phdr->p_offset;
-
-               debug("Loading phdr %i to 0x%p (%lu bytes)\n",
-                     i, dst, (ulong)phdr->p_filesz);
-               if (phdr->p_filesz)
-                       memcpy(dst, src, phdr->p_filesz);
-               if (phdr->p_filesz != phdr->p_memsz)
-                       memset(dst + phdr->p_filesz, 0x00,
-                              phdr->p_memsz - phdr->p_filesz);
-               flush_cache(rounddown((unsigned long)dst, ARCH_DMA_MINALIGN),
-                           roundup(phdr->p_memsz, ARCH_DMA_MINALIGN));
-               ++phdr;
-       }
-
-       if (ehdr->e_machine == EM_PPC64 && (ehdr->e_flags &
-                                           EF_PPC64_ELFV1_ABI)) {
-               /*
-                * For the 64-bit PowerPC ELF V1 ABI, e_entry is a function
-                * descriptor pointer with the first double word being the
-                * address of the entry point of the function.
-                */
-               uintptr_t addr = ehdr->e_entry;
-
-               return *(Elf64_Addr *)addr;
-       }
-
-       return ehdr->e_entry;
-}
-
-static unsigned long load_elf64_image_shdr(unsigned long addr)
-{
-       Elf64_Ehdr *ehdr; /* Elf header structure pointer */
-       Elf64_Shdr *shdr; /* Section header structure pointer */
-       unsigned char *strtab = 0; /* String table pointer */
-       unsigned char *image; /* Binary image pointer */
-       int i; /* Loop counter */
-
-       ehdr = (Elf64_Ehdr *)addr;
-
-       /* Find the section header string table for output info */
-       shdr = (Elf64_Shdr *)(addr + (ulong)ehdr->e_shoff +
-                            (ehdr->e_shstrndx * sizeof(Elf64_Shdr)));
-
-       if (shdr->sh_type == SHT_STRTAB)
-               strtab = (unsigned char *)(addr + (ulong)shdr->sh_offset);
-
-       /* Load each appropriate section */
-       for (i = 0; i < ehdr->e_shnum; ++i) {
-               shdr = (Elf64_Shdr *)(addr + (ulong)ehdr->e_shoff +
-                                    (i * sizeof(Elf64_Shdr)));
-
-               if (!(shdr->sh_flags & SHF_ALLOC) ||
-                   shdr->sh_addr == 0 || shdr->sh_size == 0) {
-                       continue;
-               }
-
-               if (strtab) {
-                       debug("%sing %s @ 0x%08lx (%ld bytes)\n",
-                             (shdr->sh_type == SHT_NOBITS) ? "Clear" : "Load",
-                              &strtab[shdr->sh_name],
-                              (unsigned long)shdr->sh_addr,
-                              (long)shdr->sh_size);
-               }
-
-               if (shdr->sh_type == SHT_NOBITS) {
-                       memset((void *)(uintptr_t)shdr->sh_addr, 0,
-                              shdr->sh_size);
-               } else {
-                       image = (unsigned char *)addr + (ulong)shdr->sh_offset;
-                       memcpy((void *)(uintptr_t)shdr->sh_addr,
-                              (const void *)image, shdr->sh_size);
-               }
-               flush_cache(rounddown(shdr->sh_addr, ARCH_DMA_MINALIGN),
-                           roundup((shdr->sh_addr + shdr->sh_size),
-                                    ARCH_DMA_MINALIGN) -
-                                   rounddown(shdr->sh_addr, ARCH_DMA_MINALIGN));
-       }
-
-       if (ehdr->e_machine == EM_PPC64 && (ehdr->e_flags &
-                                           EF_PPC64_ELFV1_ABI)) {
-               /*
-                * For the 64-bit PowerPC ELF V1 ABI, e_entry is a function
-                * descriptor pointer with the first double word being the
-                * address of the entry point of the function.
-                */
-               uintptr_t addr = ehdr->e_entry;
-
-               return *(Elf64_Addr *)addr;
-       }
-
-       return ehdr->e_entry;
-}
-
-/*
- * A very simple ELF loader, assumes the image is valid, returns the
- * entry point address.
- *
- * The loader firstly reads the EFI class to see if it's a 64-bit image.
- * If yes, call the ELF64 loader. Otherwise continue with the ELF32 loader.
- */
-static unsigned long load_elf_image_phdr(unsigned long addr)
-{
-       Elf32_Ehdr *ehdr; /* Elf header structure pointer */
-       Elf32_Phdr *phdr; /* Program header structure pointer */
-       int i;
-
-       ehdr = (Elf32_Ehdr *)addr;
-       if (ehdr->e_ident[EI_CLASS] == ELFCLASS64)
-               return load_elf64_image_phdr(addr);
-
-       phdr = (Elf32_Phdr *)(addr + ehdr->e_phoff);
-
-       /* Load each program header */
-       for (i = 0; i < ehdr->e_phnum; ++i) {
-               void *dst = (void *)(uintptr_t)phdr->p_paddr;
-               void *src = (void *)addr + phdr->p_offset;
-
-               debug("Loading phdr %i to 0x%p (%i bytes)\n",
-                     i, dst, phdr->p_filesz);
-               if (phdr->p_filesz)
-                       memcpy(dst, src, phdr->p_filesz);
-               if (phdr->p_filesz != phdr->p_memsz)
-                       memset(dst + phdr->p_filesz, 0x00,
-                              phdr->p_memsz - phdr->p_filesz);
-               flush_cache(rounddown((unsigned long)dst, ARCH_DMA_MINALIGN),
-                           roundup(phdr->p_memsz, ARCH_DMA_MINALIGN));
-               ++phdr;
-       }
-
-       return ehdr->e_entry;
-}
-
-static unsigned long load_elf_image_shdr(unsigned long addr)
-{
-       Elf32_Ehdr *ehdr; /* Elf header structure pointer */
-       Elf32_Shdr *shdr; /* Section header structure pointer */
-       unsigned char *strtab = 0; /* String table pointer */
-       unsigned char *image; /* Binary image pointer */
-       int i; /* Loop counter */
-
-       ehdr = (Elf32_Ehdr *)addr;
-       if (ehdr->e_ident[EI_CLASS] == ELFCLASS64)
-               return load_elf64_image_shdr(addr);
-
-       /* Find the section header string table for output info */
-       shdr = (Elf32_Shdr *)(addr + ehdr->e_shoff +
-                            (ehdr->e_shstrndx * sizeof(Elf32_Shdr)));
-
-       if (shdr->sh_type == SHT_STRTAB)
-               strtab = (unsigned char *)(addr + shdr->sh_offset);
-
-       /* Load each appropriate section */
-       for (i = 0; i < ehdr->e_shnum; ++i) {
-               shdr = (Elf32_Shdr *)(addr + ehdr->e_shoff +
-                                    (i * sizeof(Elf32_Shdr)));
-
-               if (!(shdr->sh_flags & SHF_ALLOC) ||
-                   shdr->sh_addr == 0 || shdr->sh_size == 0) {
-                       continue;
-               }
-
-               if (strtab) {
-                       debug("%sing %s @ 0x%08lx (%ld bytes)\n",
-                             (shdr->sh_type == SHT_NOBITS) ? "Clear" : "Load",
-                              &strtab[shdr->sh_name],
-                              (unsigned long)shdr->sh_addr,
-                              (long)shdr->sh_size);
-               }
-
-               if (shdr->sh_type == SHT_NOBITS) {
-                       memset((void *)(uintptr_t)shdr->sh_addr, 0,
-                              shdr->sh_size);
-               } else {
-                       image = (unsigned char *)addr + shdr->sh_offset;
-                       memcpy((void *)(uintptr_t)shdr->sh_addr,
-                              (const void *)image, shdr->sh_size);
-               }
-               flush_cache(rounddown(shdr->sh_addr, ARCH_DMA_MINALIGN),
-                           roundup((shdr->sh_addr + shdr->sh_size),
-                                   ARCH_DMA_MINALIGN) -
-                           rounddown(shdr->sh_addr, ARCH_DMA_MINALIGN));
-       }
-
-       return ehdr->e_entry;
-}
-
 /* Allow ports to override the default behavior */
 static unsigned long do_bootelf_exec(ulong (*entry)(int, char * const[]),
                                     int argc, char * const argv[])
@@ -238,30 +33,6 @@ static unsigned long do_bootelf_exec(ulong (*entry)(int, char * const[]),
        return ret;
 }
 
-/*
- * Determine if a valid ELF image exists at the given memory location.
- * First look at the ELF header magic field, then make sure that it is
- * executable.
- */
-int valid_elf_image(unsigned long addr)
-{
-       Elf32_Ehdr *ehdr; /* Elf header structure pointer */
-
-       ehdr = (Elf32_Ehdr *)addr;
-
-       if (!IS_ELF(*ehdr)) {
-               printf("## No elf image at address 0x%08lx\n", addr);
-               return 0;
-       }
-
-       if (ehdr->e_type != ET_EXEC) {
-               printf("## Not a 32-bit elf image at address 0x%08lx\n", addr);
-               return 0;
-       }
-
-       return 1;
-}
-
 /* Interpreter command to boot an arbitrary ELF image from memory */
 int do_bootelf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
index bd35de30560f68481efb34ea2d407a892daaf258..307265108263aa4dd663651ee8d1f039d2d74b98 100644 (file)
@@ -1046,3 +1046,10 @@ config BLOBLIST_ADDR
 endmenu
 
 source "common/spl/Kconfig"
+
+config IMAGE_SIGN_INFO
+       bool
+       select SHA1
+       select SHA256
+       help
+         Enable image_sign_info helper functions.
index 896e4af91d4cdaeb5ad0d7086a60777ed55d0aad..702f2396cf466119f47aa218643a4d5dc9d7dd92 100644 (file)
@@ -112,7 +112,8 @@ obj-$(CONFIG_ANDROID_BOOT_IMAGE) += image-android.o image-android-dt.o
 obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += image-fdt.o
 obj-$(CONFIG_$(SPL_TPL_)FIT) += image-fit.o
 obj-$(CONFIG_$(SPL_)MULTI_DTB_FIT) += boot_fit.o common_fit.o
-obj-$(CONFIG_$(SPL_TPL_)FIT_SIGNATURE) += image-sig.o
+obj-$(CONFIG_IMAGE_SIGN_INFO) += image-sig.o
+obj-$(CONFIG_$(SPL_TPL_)FIT_SIGNATURE) += image-fit-sig.o
 obj-$(CONFIG_$(SPL_TPL_)FIT_CIPHER) += image-cipher.o
 obj-$(CONFIG_IO_TRACE) += iotrace.o
 obj-y += memsize.o
diff --git a/common/image-fit-sig.c b/common/image-fit-sig.c
new file mode 100644 (file)
index 0000000..490566c
--- /dev/null
@@ -0,0 +1,450 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2013, Google Inc.
+ */
+
+#ifdef USE_HOSTCC
+#include "mkimage.h"
+#include <time.h>
+#else
+#include <common.h>
+#include <malloc.h>
+DECLARE_GLOBAL_DATA_PTR;
+#endif /* !USE_HOSTCC*/
+#include <image.h>
+#include <u-boot/rsa.h>
+#include <u-boot/rsa-checksum.h>
+
+#define IMAGE_MAX_HASHED_NODES         100
+
+#ifdef USE_HOSTCC
+void *host_blob;
+
+void image_set_host_blob(void *blob)
+{
+       host_blob = blob;
+}
+
+void *image_get_host_blob(void)
+{
+       return host_blob;
+}
+#endif
+
+/**
+ * fit_region_make_list() - Make a list of image regions
+ *
+ * Given a list of fdt_regions, create a list of image_regions. This is a
+ * simple conversion routine since the FDT and image code use different
+ * structures.
+ *
+ * @fit: FIT image
+ * @fdt_regions: Pointer to FDT regions
+ * @count: Number of FDT regions
+ * @region: Pointer to image regions, which must hold @count records. If
+ * region is NULL, then (except for an SPL build) the array will be
+ * allocated.
+ * @return: Pointer to image regions
+ */
+struct image_region *fit_region_make_list(const void *fit,
+                                         struct fdt_region *fdt_regions,
+                                         int count,
+                                         struct image_region *region)
+{
+       int i;
+
+       debug("Hash regions:\n");
+       debug("%10s %10s\n", "Offset", "Size");
+
+       /*
+        * Use malloc() except in SPL (to save code size). In SPL the caller
+        * must allocate the array.
+        */
+#ifndef CONFIG_SPL_BUILD
+       if (!region)
+               region = calloc(sizeof(*region), count);
+#endif
+       if (!region)
+               return NULL;
+       for (i = 0; i < count; i++) {
+               debug("%10x %10x\n", fdt_regions[i].offset,
+                     fdt_regions[i].size);
+               region[i].data = fit + fdt_regions[i].offset;
+               region[i].size = fdt_regions[i].size;
+       }
+
+       return region;
+}
+
+static int fit_image_setup_verify(struct image_sign_info *info,
+                                 const void *fit, int noffset,
+                                 int required_keynode, char **err_msgp)
+{
+       char *algo_name;
+       const char *padding_name;
+
+       if (fdt_totalsize(fit) > CONFIG_FIT_SIGNATURE_MAX_SIZE) {
+               *err_msgp = "Total size too large";
+               return 1;
+       }
+
+       if (fit_image_hash_get_algo(fit, noffset, &algo_name)) {
+               *err_msgp = "Can't get hash algo property";
+               return -1;
+       }
+
+       padding_name = fdt_getprop(fit, noffset, "padding", NULL);
+       if (!padding_name)
+               padding_name = RSA_DEFAULT_PADDING_NAME;
+
+       memset(info, '\0', sizeof(*info));
+       info->keyname = fdt_getprop(fit, noffset, FIT_KEY_HINT, NULL);
+       info->fit = (void *)fit;
+       info->node_offset = noffset;
+       info->name = algo_name;
+       info->checksum = image_get_checksum_algo(algo_name);
+       info->crypto = image_get_crypto_algo(algo_name);
+       info->padding = image_get_padding_algo(padding_name);
+       info->fdt_blob = gd_fdt_blob();
+       info->required_keynode = required_keynode;
+       printf("%s:%s", algo_name, info->keyname);
+
+       if (!info->checksum || !info->crypto || !info->padding) {
+               *err_msgp = "Unknown signature algorithm";
+               return -1;
+       }
+
+       return 0;
+}
+
+int fit_image_check_sig(const void *fit, int noffset, const void *data,
+                       size_t size, int required_keynode, char **err_msgp)
+{
+       struct image_sign_info info;
+       struct image_region region;
+       uint8_t *fit_value;
+       int fit_value_len;
+
+       *err_msgp = NULL;
+       if (fit_image_setup_verify(&info, fit, noffset, required_keynode,
+                                  err_msgp))
+               return -1;
+
+       if (fit_image_hash_get_value(fit, noffset, &fit_value,
+                                    &fit_value_len)) {
+               *err_msgp = "Can't get hash value property";
+               return -1;
+       }
+
+       region.data = data;
+       region.size = size;
+
+       if (info.crypto->verify(&info, &region, 1, fit_value, fit_value_len)) {
+               *err_msgp = "Verification failed";
+               return -1;
+       }
+
+       return 0;
+}
+
+static int fit_image_verify_sig(const void *fit, int image_noffset,
+                               const char *data, size_t size,
+                               const void *sig_blob, int sig_offset)
+{
+       int noffset;
+       char *err_msg = "";
+       int verified = 0;
+       int ret;
+
+       /* Process all hash subnodes of the component image node */
+       fdt_for_each_subnode(noffset, fit, image_noffset) {
+               const char *name = fit_get_name(fit, noffset, NULL);
+
+               if (!strncmp(name, FIT_SIG_NODENAME,
+                            strlen(FIT_SIG_NODENAME))) {
+                       ret = fit_image_check_sig(fit, noffset, data,
+                                                 size, -1, &err_msg);
+                       if (ret) {
+                               puts("- ");
+                       } else {
+                               puts("+ ");
+                               verified = 1;
+                               break;
+                       }
+               }
+       }
+
+       if (noffset == -FDT_ERR_TRUNCATED || noffset == -FDT_ERR_BADSTRUCTURE) {
+               err_msg = "Corrupted or truncated tree";
+               goto error;
+       }
+
+       return verified ? 0 : -EPERM;
+
+error:
+       printf(" error!\n%s for '%s' hash node in '%s' image node\n",
+              err_msg, fit_get_name(fit, noffset, NULL),
+              fit_get_name(fit, image_noffset, NULL));
+       return -1;
+}
+
+int fit_image_verify_required_sigs(const void *fit, int image_noffset,
+                                  const char *data, size_t size,
+                                  const void *sig_blob, int *no_sigsp)
+{
+       int verify_count = 0;
+       int noffset;
+       int sig_node;
+
+       /* Work out what we need to verify */
+       *no_sigsp = 1;
+       sig_node = fdt_subnode_offset(sig_blob, 0, FIT_SIG_NODENAME);
+       if (sig_node < 0) {
+               debug("%s: No signature node found: %s\n", __func__,
+                     fdt_strerror(sig_node));
+               return 0;
+       }
+
+       fdt_for_each_subnode(noffset, sig_blob, sig_node) {
+               const char *required;
+               int ret;
+
+               required = fdt_getprop(sig_blob, noffset, FIT_KEY_REQUIRED,
+                                      NULL);
+               if (!required || strcmp(required, "image"))
+                       continue;
+               ret = fit_image_verify_sig(fit, image_noffset, data, size,
+                                          sig_blob, noffset);
+               if (ret) {
+                       printf("Failed to verify required signature '%s'\n",
+                              fit_get_name(sig_blob, noffset, NULL));
+                       return ret;
+               }
+               verify_count++;
+       }
+
+       if (verify_count)
+               *no_sigsp = 0;
+
+       return 0;
+}
+
+/**
+ * fit_config_check_sig() - Check the signature of a config
+ *
+ * @fit: FIT to check
+ * @noffset: Offset of configuration node (e.g. /configurations/conf-1)
+ * @required_keynode:  Offset in the control FDT of the required key node,
+ *                     if any. If this is given, then the configuration wil not
+ *                     pass verification unless that key is used. If this is
+ *                     -1 then any signature will do.
+ * @conf_noffset: Offset of the configuration subnode being checked (e.g.
+ *      /configurations/conf-1/kernel)
+ * @err_msgp:          In the event of an error, this will be pointed to a
+ *                     help error string to display to the user.
+ * @return 0 if all verified ok, <0 on error
+ */
+static int fit_config_check_sig(const void *fit, int noffset,
+                               int required_keynode, int conf_noffset,
+                               char **err_msgp)
+{
+       char * const exc_prop[] = {"data"};
+       const char *prop, *end, *name;
+       struct image_sign_info info;
+       const uint32_t *strings;
+       const char *config_name;
+       uint8_t *fit_value;
+       int fit_value_len;
+       bool found_config;
+       int max_regions;
+       int i, prop_len;
+       char path[200];
+       int count;
+
+       config_name = fit_get_name(fit, conf_noffset, NULL);
+       debug("%s: fdt=%p, conf='%s', sig='%s'\n", __func__, gd_fdt_blob(),
+             fit_get_name(fit, noffset, NULL),
+             fit_get_name(gd_fdt_blob(), required_keynode, NULL));
+       *err_msgp = NULL;
+       if (fit_image_setup_verify(&info, fit, noffset, required_keynode,
+                                  err_msgp))
+               return -1;
+
+       if (fit_image_hash_get_value(fit, noffset, &fit_value,
+                                    &fit_value_len)) {
+               *err_msgp = "Can't get hash value property";
+               return -1;
+       }
+
+       /* Count the number of strings in the property */
+       prop = fdt_getprop(fit, noffset, "hashed-nodes", &prop_len);
+       end = prop ? prop + prop_len : prop;
+       for (name = prop, count = 0; name < end; name++)
+               if (!*name)
+                       count++;
+       if (!count) {
+               *err_msgp = "Can't get hashed-nodes property";
+               return -1;
+       }
+
+       if (prop && prop_len > 0 && prop[prop_len - 1] != '\0') {
+               *err_msgp = "hashed-nodes property must be null-terminated";
+               return -1;
+       }
+
+       /* Add a sanity check here since we are using the stack */
+       if (count > IMAGE_MAX_HASHED_NODES) {
+               *err_msgp = "Number of hashed nodes exceeds maximum";
+               return -1;
+       }
+
+       /* Create a list of node names from those strings */
+       char *node_inc[count];
+
+       debug("Hash nodes (%d):\n", count);
+       found_config = false;
+       for (name = prop, i = 0; name < end; name += strlen(name) + 1, i++) {
+               debug("   '%s'\n", name);
+               node_inc[i] = (char *)name;
+               if (!strncmp(FIT_CONFS_PATH, name, strlen(FIT_CONFS_PATH)) &&
+                   name[sizeof(FIT_CONFS_PATH) - 1] == '/' &&
+                   !strcmp(name + sizeof(FIT_CONFS_PATH), config_name)) {
+                       debug("      (found config node %s)", config_name);
+                       found_config = true;
+               }
+       }
+       if (!found_config) {
+               *err_msgp = "Selected config not in hashed nodes";
+               return -1;
+       }
+
+       /*
+        * Each node can generate one region for each sub-node. Allow for
+        * 7 sub-nodes (hash-1, signature-1, etc.) and some extra.
+        */
+       max_regions = 20 + count * 7;
+       struct fdt_region fdt_regions[max_regions];
+
+       /* Get a list of regions to hash */
+       count = fdt_find_regions(fit, node_inc, count,
+                                exc_prop, ARRAY_SIZE(exc_prop),
+                                fdt_regions, max_regions - 1,
+                                path, sizeof(path), 0);
+       if (count < 0) {
+               *err_msgp = "Failed to hash configuration";
+               return -1;
+       }
+       if (count == 0) {
+               *err_msgp = "No data to hash";
+               return -1;
+       }
+       if (count >= max_regions - 1) {
+               *err_msgp = "Too many hash regions";
+               return -1;
+       }
+
+       /* Add the strings */
+       strings = fdt_getprop(fit, noffset, "hashed-strings", NULL);
+       if (strings) {
+               /*
+                * The strings region offset must be a static 0x0.
+                * This is set in tool/image-host.c
+                */
+               fdt_regions[count].offset = fdt_off_dt_strings(fit);
+               fdt_regions[count].size = fdt32_to_cpu(strings[1]);
+               count++;
+       }
+
+       /* Allocate the region list on the stack */
+       struct image_region region[count];
+
+       fit_region_make_list(fit, fdt_regions, count, region);
+       if (info.crypto->verify(&info, region, count, fit_value,
+                               fit_value_len)) {
+               *err_msgp = "Verification failed";
+               return -1;
+       }
+
+       return 0;
+}
+
+static int fit_config_verify_sig(const void *fit, int conf_noffset,
+                                const void *sig_blob, int sig_offset)
+{
+       int noffset;
+       char *err_msg = "";
+       int verified = 0;
+       int ret;
+
+       /* Process all hash subnodes of the component conf node */
+       fdt_for_each_subnode(noffset, fit, conf_noffset) {
+               const char *name = fit_get_name(fit, noffset, NULL);
+
+               if (!strncmp(name, FIT_SIG_NODENAME,
+                            strlen(FIT_SIG_NODENAME))) {
+                       ret = fit_config_check_sig(fit, noffset, sig_offset,
+                                                  conf_noffset, &err_msg);
+                       if (ret) {
+                               puts("- ");
+                       } else {
+                               puts("+ ");
+                               verified = 1;
+                               break;
+                       }
+               }
+       }
+
+       if (noffset == -FDT_ERR_TRUNCATED || noffset == -FDT_ERR_BADSTRUCTURE) {
+               err_msg = "Corrupted or truncated tree";
+               goto error;
+       }
+
+       if (verified)
+               return 0;
+
+error:
+       printf(" error!\n%s for '%s' hash node in '%s' config node\n",
+              err_msg, fit_get_name(fit, noffset, NULL),
+              fit_get_name(fit, conf_noffset, NULL));
+       return -EPERM;
+}
+
+int fit_config_verify_required_sigs(const void *fit, int conf_noffset,
+                                   const void *sig_blob)
+{
+       int noffset;
+       int sig_node;
+
+       /* Work out what we need to verify */
+       sig_node = fdt_subnode_offset(sig_blob, 0, FIT_SIG_NODENAME);
+       if (sig_node < 0) {
+               debug("%s: No signature node found: %s\n", __func__,
+                     fdt_strerror(sig_node));
+               return 0;
+       }
+
+       fdt_for_each_subnode(noffset, sig_blob, sig_node) {
+               const char *required;
+               int ret;
+
+               required = fdt_getprop(sig_blob, noffset, FIT_KEY_REQUIRED,
+                                      NULL);
+               if (!required || strcmp(required, "conf"))
+                       continue;
+               ret = fit_config_verify_sig(fit, conf_noffset, sig_blob,
+                                           noffset);
+               if (ret) {
+                       printf("Failed to verify required signature '%s'\n",
+                              fit_get_name(sig_blob, noffset, NULL));
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
+int fit_config_verify(const void *fit, int conf_noffset)
+{
+       return fit_config_verify_required_sigs(fit, conf_noffset,
+                                              gd_fdt_blob());
+}
index 0fef0a918da4b7979faae3749016a121822e4c4a..368b73088a2af9d0683e050ec13a9e33513f1481 100644 (file)
@@ -1271,7 +1271,7 @@ int fit_image_verify_with_data(const void *fit, int image_noffset,
        int ret;
 
        /* Verify all required signatures */
-       if (IMAGE_ENABLE_VERIFY &&
+       if (FIT_IMAGE_ENABLE_VERIFY &&
            fit_image_verify_required_sigs(fit, image_noffset, data, size,
                                           gd_fdt_blob(), &verify_all)) {
                err_msg = "Unable to verify required signature";
@@ -1293,7 +1293,7 @@ int fit_image_verify_with_data(const void *fit, int image_noffset,
                                                 &err_msg))
                                goto error;
                        puts("+ ");
-               } else if (IMAGE_ENABLE_VERIFY && verify_all &&
+               } else if (FIT_IMAGE_ENABLE_VERIFY && verify_all &&
                                !strncmp(name, FIT_SIG_NODENAME,
                                        strlen(FIT_SIG_NODENAME))) {
                        ret = fit_image_check_sig(fit, noffset, data,
@@ -1933,7 +1933,7 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
                if (image_type == IH_TYPE_KERNEL)
                        images->fit_uname_cfg = fit_base_uname_config;
 
-               if (IMAGE_ENABLE_VERIFY && images->verify) {
+               if (FIT_IMAGE_ENABLE_VERIFY && images->verify) {
                        puts("   Verifying Hash Integrity ... ");
                        if (fit_config_verify(fit, cfg_noffset)) {
                                puts("Bad Data Hash\n");
index 6563effcf347d359350fe7193ffccf0371af52af..84b2c0439cf8965a6a7e55cd0a2ec316f4c475ed 100644 (file)
@@ -17,18 +17,6 @@ DECLARE_GLOBAL_DATA_PTR;
 
 #define IMAGE_MAX_HASHED_NODES         100
 
-#ifdef USE_HOSTCC
-void *host_blob;
-void image_set_host_blob(void *blob)
-{
-       host_blob = blob;
-}
-void *image_get_host_blob(void)
-{
-       return host_blob;
-}
-#endif
-
 struct checksum_algo checksum_algos[] = {
        {
                .name = "sha1",
@@ -162,420 +150,3 @@ struct padding_algo *image_get_padding_algo(const char *name)
 
        return NULL;
 }
-
-/**
- * fit_region_make_list() - Make a list of image regions
- *
- * Given a list of fdt_regions, create a list of image_regions. This is a
- * simple conversion routine since the FDT and image code use different
- * structures.
- *
- * @fit: FIT image
- * @fdt_regions: Pointer to FDT regions
- * @count: Number of FDT regions
- * @region: Pointer to image regions, which must hold @count records. If
- * region is NULL, then (except for an SPL build) the array will be
- * allocated.
- * @return: Pointer to image regions
- */
-struct image_region *fit_region_make_list(const void *fit,
-               struct fdt_region *fdt_regions, int count,
-               struct image_region *region)
-{
-       int i;
-
-       debug("Hash regions:\n");
-       debug("%10s %10s\n", "Offset", "Size");
-
-       /*
-        * Use malloc() except in SPL (to save code size). In SPL the caller
-        * must allocate the array.
-        */
-#ifndef CONFIG_SPL_BUILD
-       if (!region)
-               region = calloc(sizeof(*region), count);
-#endif
-       if (!region)
-               return NULL;
-       for (i = 0; i < count; i++) {
-               debug("%10x %10x\n", fdt_regions[i].offset,
-                     fdt_regions[i].size);
-               region[i].data = fit + fdt_regions[i].offset;
-               region[i].size = fdt_regions[i].size;
-       }
-
-       return region;
-}
-
-static int fit_image_setup_verify(struct image_sign_info *info,
-               const void *fit, int noffset, int required_keynode,
-               char **err_msgp)
-{
-       char *algo_name;
-       const char *padding_name;
-
-       if (fdt_totalsize(fit) > CONFIG_FIT_SIGNATURE_MAX_SIZE) {
-               *err_msgp = "Total size too large";
-               return 1;
-       }
-
-       if (fit_image_hash_get_algo(fit, noffset, &algo_name)) {
-               *err_msgp = "Can't get hash algo property";
-               return -1;
-       }
-
-       padding_name = fdt_getprop(fit, noffset, "padding", NULL);
-       if (!padding_name)
-               padding_name = RSA_DEFAULT_PADDING_NAME;
-
-       memset(info, '\0', sizeof(*info));
-       info->keyname = fdt_getprop(fit, noffset, FIT_KEY_HINT, NULL);
-       info->fit = (void *)fit;
-       info->node_offset = noffset;
-       info->name = algo_name;
-       info->checksum = image_get_checksum_algo(algo_name);
-       info->crypto = image_get_crypto_algo(algo_name);
-       info->padding = image_get_padding_algo(padding_name);
-       info->fdt_blob = gd_fdt_blob();
-       info->required_keynode = required_keynode;
-       printf("%s:%s", algo_name, info->keyname);
-
-       if (!info->checksum || !info->crypto || !info->padding) {
-               *err_msgp = "Unknown signature algorithm";
-               return -1;
-       }
-
-       return 0;
-}
-
-int fit_image_check_sig(const void *fit, int noffset, const void *data,
-               size_t size, int required_keynode, char **err_msgp)
-{
-       struct image_sign_info info;
-       struct image_region region;
-       uint8_t *fit_value;
-       int fit_value_len;
-
-       *err_msgp = NULL;
-       if (fit_image_setup_verify(&info, fit, noffset, required_keynode,
-                                  err_msgp))
-               return -1;
-
-       if (fit_image_hash_get_value(fit, noffset, &fit_value,
-                                    &fit_value_len)) {
-               *err_msgp = "Can't get hash value property";
-               return -1;
-       }
-
-       region.data = data;
-       region.size = size;
-
-       if (info.crypto->verify(&info, &region, 1, fit_value, fit_value_len)) {
-               *err_msgp = "Verification failed";
-               return -1;
-       }
-
-       return 0;
-}
-
-static int fit_image_verify_sig(const void *fit, int image_noffset,
-               const char *data, size_t size, const void *sig_blob,
-               int sig_offset)
-{
-       int noffset;
-       char *err_msg = "";
-       int verified = 0;
-       int ret;
-
-       /* Process all hash subnodes of the component image node */
-       fdt_for_each_subnode(noffset, fit, image_noffset) {
-               const char *name = fit_get_name(fit, noffset, NULL);
-
-               if (!strncmp(name, FIT_SIG_NODENAME,
-                            strlen(FIT_SIG_NODENAME))) {
-                       ret = fit_image_check_sig(fit, noffset, data,
-                                                       size, -1, &err_msg);
-                       if (ret) {
-                               puts("- ");
-                       } else {
-                               puts("+ ");
-                               verified = 1;
-                               break;
-                       }
-               }
-       }
-
-       if (noffset == -FDT_ERR_TRUNCATED || noffset == -FDT_ERR_BADSTRUCTURE) {
-               err_msg = "Corrupted or truncated tree";
-               goto error;
-       }
-
-       return verified ? 0 : -EPERM;
-
-error:
-       printf(" error!\n%s for '%s' hash node in '%s' image node\n",
-              err_msg, fit_get_name(fit, noffset, NULL),
-              fit_get_name(fit, image_noffset, NULL));
-       return -1;
-}
-
-int fit_image_verify_required_sigs(const void *fit, int image_noffset,
-               const char *data, size_t size, const void *sig_blob,
-               int *no_sigsp)
-{
-       int verify_count = 0;
-       int noffset;
-       int sig_node;
-
-       /* Work out what we need to verify */
-       *no_sigsp = 1;
-       sig_node = fdt_subnode_offset(sig_blob, 0, FIT_SIG_NODENAME);
-       if (sig_node < 0) {
-               debug("%s: No signature node found: %s\n", __func__,
-                     fdt_strerror(sig_node));
-               return 0;
-       }
-
-       fdt_for_each_subnode(noffset, sig_blob, sig_node) {
-               const char *required;
-               int ret;
-
-               required = fdt_getprop(sig_blob, noffset, FIT_KEY_REQUIRED,
-                                      NULL);
-               if (!required || strcmp(required, "image"))
-                       continue;
-               ret = fit_image_verify_sig(fit, image_noffset, data, size,
-                                       sig_blob, noffset);
-               if (ret) {
-                       printf("Failed to verify required signature '%s'\n",
-                              fit_get_name(sig_blob, noffset, NULL));
-                       return ret;
-               }
-               verify_count++;
-       }
-
-       if (verify_count)
-               *no_sigsp = 0;
-
-       return 0;
-}
-
-/**
- * fit_config_check_sig() - Check the signature of a config
- *
- * @fit: FIT to check
- * @noffset: Offset of configuration node (e.g. /configurations/conf-1)
- * @required_keynode:  Offset in the control FDT of the required key node,
- *                     if any. If this is given, then the configuration wil not
- *                     pass verification unless that key is used. If this is
- *                     -1 then any signature will do.
- * @conf_noffset: Offset of the configuration subnode being checked (e.g.
- *      /configurations/conf-1/kernel)
- * @err_msgp:          In the event of an error, this will be pointed to a
- *                     help error string to display to the user.
- * @return 0 if all verified ok, <0 on error
- */
-static int fit_config_check_sig(const void *fit, int noffset,
-                               int required_keynode, int conf_noffset,
-                               char **err_msgp)
-{
-       char * const exc_prop[] = {"data"};
-       const char *prop, *end, *name;
-       struct image_sign_info info;
-       const uint32_t *strings;
-       const char *config_name;
-       uint8_t *fit_value;
-       int fit_value_len;
-       bool found_config;
-       int max_regions;
-       int i, prop_len;
-       char path[200];
-       int count;
-
-       config_name = fit_get_name(fit, conf_noffset, NULL);
-       debug("%s: fdt=%p, conf='%s', sig='%s'\n", __func__, gd_fdt_blob(),
-             fit_get_name(fit, noffset, NULL),
-             fit_get_name(gd_fdt_blob(), required_keynode, NULL));
-       *err_msgp = NULL;
-       if (fit_image_setup_verify(&info, fit, noffset, required_keynode,
-                                  err_msgp))
-               return -1;
-
-       if (fit_image_hash_get_value(fit, noffset, &fit_value,
-                                    &fit_value_len)) {
-               *err_msgp = "Can't get hash value property";
-               return -1;
-       }
-
-       /* Count the number of strings in the property */
-       prop = fdt_getprop(fit, noffset, "hashed-nodes", &prop_len);
-       end = prop ? prop + prop_len : prop;
-       for (name = prop, count = 0; name < end; name++)
-               if (!*name)
-                       count++;
-       if (!count) {
-               *err_msgp = "Can't get hashed-nodes property";
-               return -1;
-       }
-
-       if (prop && prop_len > 0 && prop[prop_len - 1] != '\0') {
-               *err_msgp = "hashed-nodes property must be null-terminated";
-               return -1;
-       }
-
-       /* Add a sanity check here since we are using the stack */
-       if (count > IMAGE_MAX_HASHED_NODES) {
-               *err_msgp = "Number of hashed nodes exceeds maximum";
-               return -1;
-       }
-
-       /* Create a list of node names from those strings */
-       char *node_inc[count];
-
-       debug("Hash nodes (%d):\n", count);
-       found_config = false;
-       for (name = prop, i = 0; name < end; name += strlen(name) + 1, i++) {
-               debug("   '%s'\n", name);
-               node_inc[i] = (char *)name;
-               if (!strncmp(FIT_CONFS_PATH, name, strlen(FIT_CONFS_PATH)) &&
-                   name[sizeof(FIT_CONFS_PATH) - 1] == '/' &&
-                   !strcmp(name + sizeof(FIT_CONFS_PATH), config_name)) {
-                       debug("      (found config node %s)", config_name);
-                       found_config = true;
-               }
-       }
-       if (!found_config) {
-               *err_msgp = "Selected config not in hashed nodes";
-               return -1;
-       }
-
-       /*
-        * Each node can generate one region for each sub-node. Allow for
-        * 7 sub-nodes (hash-1, signature-1, etc.) and some extra.
-        */
-       max_regions = 20 + count * 7;
-       struct fdt_region fdt_regions[max_regions];
-
-       /* Get a list of regions to hash */
-       count = fdt_find_regions(fit, node_inc, count,
-                       exc_prop, ARRAY_SIZE(exc_prop),
-                       fdt_regions, max_regions - 1,
-                       path, sizeof(path), 0);
-       if (count < 0) {
-               *err_msgp = "Failed to hash configuration";
-               return -1;
-       }
-       if (count == 0) {
-               *err_msgp = "No data to hash";
-               return -1;
-       }
-       if (count >= max_regions - 1) {
-               *err_msgp = "Too many hash regions";
-               return -1;
-       }
-
-       /* Add the strings */
-       strings = fdt_getprop(fit, noffset, "hashed-strings", NULL);
-       if (strings) {
-               /*
-                * The strings region offset must be a static 0x0.
-                * This is set in tool/image-host.c
-                */
-               fdt_regions[count].offset = fdt_off_dt_strings(fit);
-               fdt_regions[count].size = fdt32_to_cpu(strings[1]);
-               count++;
-       }
-
-       /* Allocate the region list on the stack */
-       struct image_region region[count];
-
-       fit_region_make_list(fit, fdt_regions, count, region);
-       if (info.crypto->verify(&info, region, count, fit_value,
-                               fit_value_len)) {
-               *err_msgp = "Verification failed";
-               return -1;
-       }
-
-       return 0;
-}
-
-static int fit_config_verify_sig(const void *fit, int conf_noffset,
-               const void *sig_blob, int sig_offset)
-{
-       int noffset;
-       char *err_msg = "";
-       int verified = 0;
-       int ret;
-
-       /* Process all hash subnodes of the component conf node */
-       fdt_for_each_subnode(noffset, fit, conf_noffset) {
-               const char *name = fit_get_name(fit, noffset, NULL);
-
-               if (!strncmp(name, FIT_SIG_NODENAME,
-                            strlen(FIT_SIG_NODENAME))) {
-                       ret = fit_config_check_sig(fit, noffset, sig_offset,
-                                                  conf_noffset, &err_msg);
-                       if (ret) {
-                               puts("- ");
-                       } else {
-                               puts("+ ");
-                               verified = 1;
-                               break;
-                       }
-               }
-       }
-
-       if (noffset == -FDT_ERR_TRUNCATED || noffset == -FDT_ERR_BADSTRUCTURE) {
-               err_msg = "Corrupted or truncated tree";
-               goto error;
-       }
-
-       if (verified)
-               return 0;
-
-error:
-       printf(" error!\n%s for '%s' hash node in '%s' config node\n",
-              err_msg, fit_get_name(fit, noffset, NULL),
-              fit_get_name(fit, conf_noffset, NULL));
-       return -EPERM;
-}
-
-int fit_config_verify_required_sigs(const void *fit, int conf_noffset,
-               const void *sig_blob)
-{
-       int noffset;
-       int sig_node;
-
-       /* Work out what we need to verify */
-       sig_node = fdt_subnode_offset(sig_blob, 0, FIT_SIG_NODENAME);
-       if (sig_node < 0) {
-               debug("%s: No signature node found: %s\n", __func__,
-                     fdt_strerror(sig_node));
-               return 0;
-       }
-
-       fdt_for_each_subnode(noffset, sig_blob, sig_node) {
-               const char *required;
-               int ret;
-
-               required = fdt_getprop(sig_blob, noffset, FIT_KEY_REQUIRED,
-                                      NULL);
-               if (!required || strcmp(required, "conf"))
-                       continue;
-               ret = fit_config_verify_sig(fit, conf_noffset, sig_blob,
-                                           noffset);
-               if (ret) {
-                       printf("Failed to verify required signature '%s'\n",
-                              fit_get_name(sig_blob, noffset, NULL));
-                       return ret;
-               }
-       }
-
-       return 0;
-}
-
-int fit_config_verify(const void *fit, int conf_noffset)
-{
-       return fit_config_verify_required_sigs(fit, conf_noffset,
-                                              gd_fdt_blob());
-}
index ec8994ad457b9393afec16a7514cd74186a6226a..06d7ff56d60c33cf4a31a02c5fa02ee34f75534b 100644 (file)
 #include <init.h>
 #include <version.h>
 
-/*
- * Board-specific Platform code can reimplement show_boot_progress () if needed
- */
-__weak void show_boot_progress(int val) {}
-
 static void run_preboot_environment_command(void)
 {
        char *p;
index b03a476b9f6906d14eae95f39fb9f3eed2f8f7fb..9d52b75cb4347c18f6e810166ef00f0cae262970 100644 (file)
@@ -139,7 +139,7 @@ config SPL_HANDOFF
 
 config SPL_LDSCRIPT
        string "Linker script for the SPL stage"
-       default "arch/$(ARCH)/cpu/u-boot-spl.lds"
+       default "arch/\$(ARCH)/cpu/u-boot-spl.lds"
        help
          The SPL stage will usually require a different linker-script
          (as it runs from a different memory region) than the regular
@@ -1306,7 +1306,7 @@ config TPL_LDSCRIPT
         string "Linker script for the TPL stage"
        depends on TPL
        default "arch/arm/cpu/armv8/u-boot-spl.lds" if ARM64
-       default "arch/$(ARCH)/cpu/u-boot-spl.lds"
+       default "arch/\$(ARCH)/cpu/u-boot-spl.lds"
        help
          The TPL stage will usually require a different linker-script
          (as it runs from a different memory region) than the regular
index caf0dd9b81829bc166b0b88719c977ad2acfce7b..097d1f67d24ee2f17af3205fbf36047f785f8b69 100644 (file)
--- a/config.mk
+++ b/config.mk
@@ -12,8 +12,7 @@
 #  If we did not have Tegra SoCs, build system would be much simpler...)
 PLATFORM_RELFLAGS :=
 PLATFORM_CPPFLAGS :=
-PLATFORM_LDFLAGS :=
-LDFLAGS :=
+KBUILD_LDFLAGS :=
 LDFLAGS_FINAL :=
 LDFLAGS_STANDALONE :=
 OBJCOPYFLAGS :=
@@ -70,7 +69,6 @@ RELFLAGS := $(PLATFORM_RELFLAGS)
 PLATFORM_CPPFLAGS += $(RELFLAGS)
 PLATFORM_CPPFLAGS += -pipe
 
-LDFLAGS += $(PLATFORM_LDFLAGS)
 LDFLAGS_FINAL += -Bstatic
 
 export PLATFORM_CPPFLAGS
index 63f0da9cb01cdb39525e60fb56e141cd0cc6beb1..2781d49daf5fa9aa67e8591f6a8699f459ac4209 100644 (file)
@@ -55,6 +55,8 @@ CONFIG_SYS_NAND_U_BOOT_OFFS=0x00080000
 CONFIG_PHY_ADDR_ENABLE=y
 CONFIG_PHY_ATHEROS=y
 CONFIG_PHY_SMSC=y
+CONFIG_DM_ETH=y
+CONFIG_DM_MDIO=y
 CONFIG_MII=y
 CONFIG_DRIVER_TI_CPSW=y
 CONFIG_SPI=y
index 335aa8cfa1ceb23a87114d1bbc6fff44345fead8..66899c277bffa0a21d8ac596641f125d28f1431a 100644 (file)
@@ -40,10 +40,14 @@ CONFIG_SPL_ENV_IS_NOWHERE=y
 CONFIG_BOOTCOUNT_LIMIT=y
 CONFIG_CLK=y
 CONFIG_CLK_CDCE9XX=y
+CONFIG_DFU_TFTP=y
 CONFIG_DFU_MMC=y
 CONFIG_DFU_NAND=y
 CONFIG_DFU_RAM=y
 CONFIG_USB_FUNCTION_FASTBOOT=y
+CONFIG_FASTBOOT_FLASH=y
+CONFIG_FASTBOOT_FLASH_MMC_DEV=1
+CONFIG_FASTBOOT_CMD_OEM_FORMAT=y
 CONFIG_DM_I2C=y
 CONFIG_MISC=y
 CONFIG_DM_MMC=y
index df7723b71ebdf76413401206741e689902a979cd..542bbd992c53afdba2411bc91addf65641c170f7 100644 (file)
@@ -16,6 +16,8 @@ CONFIG_NR_DRAM_BANKS=2
 CONFIG_ENV_OFFSET_REDUND=0x6A0000
 CONFIG_SPL_FS_FAT=y
 CONFIG_SPL_LIBDISK_SUPPORT=y
+CONFIG_SPL_SPI_FLASH_SUPPORT=y
+CONFIG_SPL_SPI_SUPPORT=y
 # CONFIG_PSCI_RESET is not set
 CONFIG_SPL_TEXT_BASE=0x80080000
 CONFIG_DISTRO_DEFAULTS=y
@@ -29,10 +31,17 @@ CONFIG_SPL_STACK_R=y
 CONFIG_SPL_SEPARATE_BSS=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x1400
+CONFIG_SPL_DMA=y
 CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_DM_MAILBOX=y
+CONFIG_SPL_MTD_SUPPORT=y
 CONFIG_SPL_DM_RESET=y
 CONFIG_SPL_POWER_DOMAIN=y
+CONFIG_SPI_FLASH_SFDP_SUPPORT=y
+# CONFIG_SPL_SPI_FLASH_TINY is not set
+CONFIG_SPL_SPI_FLASH_SFDP_SUPPORT=y
+CONFIG_SPL_SPI_LOAD=y
+CONFIG_SYS_SPI_U_BOOT_OFFS=0x280000
 CONFIG_SPL_YMODEM_SUPPORT=y
 CONFIG_CMD_ASKENV=y
 CONFIG_CMD_DFU=y
@@ -41,9 +50,13 @@ CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
 CONFIG_CMD_PCI=y
 CONFIG_CMD_REMOTEPROC=y
+CONFIG_CMD_SF=y
 CONFIG_CMD_USB=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_CMD_TIME=y
+CONFIG_MTDIDS_DEFAULT="nor0=47040000.spi.0"
+CONFIG_MTDPARTS_DEFAULT="mtdparts=47040000.spi.0:512k(ospi.tiboot3),2m(ospi.tispl),4m(ospi.u-boot),128k(ospi.env),128k(ospi.env.backup),1m(ospi.sysfw),-@8m(ospi.rootfs)"
+CONFIG_CMD_UBI=y
 # CONFIG_ISO_PARTITION is not set
 CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
@@ -58,11 +71,13 @@ CONFIG_DM=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_SPL_REGMAP=y
+CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_CLK=y
 CONFIG_SPL_CLK=y
 CONFIG_CLK_TI_SCI=y
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
+CONFIG_DFU_SF=y
 CONFIG_DMA_CHANNELS=y
 CONFIG_TI_K3_NAVSS_UDMA=y
 CONFIG_TI_SCI_PROTOCOL=y
@@ -79,6 +94,13 @@ CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_ADMA=y
 CONFIG_SPL_MMC_SDHCI_ADMA=y
 CONFIG_MMC_SDHCI_AM654=y
+CONFIG_MTD=y
+CONFIG_DM_MTD=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH_SFDP_SUPPORT
+CONFIG_SPI_FLASH_STMICRO=y
+# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
+CONFIG_SPI_FLASH_MTD=y
 CONFIG_PHY_TI=y
 CONFIG_PHY_FIXED=y
 CONFIG_DM_ETH=y
@@ -103,6 +125,9 @@ CONFIG_DM_RESET=y
 CONFIG_RESET_TI_SCI=y
 CONFIG_DM_SERIAL=y
 CONFIG_SOC_TI=y
+CONFIG_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_CADENCE_QSPI=y
 CONFIG_SYSRESET=y
 CONFIG_SPL_SYSRESET=y
 CONFIG_SYSRESET_TI_SCI=y
index b475aceefe984bb146f7ee287a1bd613e0c1f4a9..b7955265c717ce5787930cd5358fdfdc26286157 100644 (file)
@@ -16,6 +16,8 @@ CONFIG_SPL_STACK_R_ADDR=0x82000000
 CONFIG_NR_DRAM_BANKS=2
 CONFIG_SPL_FS_FAT=y
 CONFIG_SPL_LIBDISK_SUPPORT=y
+CONFIG_SPL_SPI_FLASH_SUPPORT=y
+CONFIG_SPL_SPI_SUPPORT=y
 CONFIG_SPL_TEXT_BASE=0x41c00000
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
 CONFIG_SPL_LOAD_FIT=y
@@ -26,6 +28,7 @@ CONFIG_SPL_SEPARATE_BSS=y
 CONFIG_SPL_EARLY_BSS=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x400
+CONFIG_SPL_DMA=y
 CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_DM_MAILBOX=y
 CONFIG_SPL_DM_RESET=y
@@ -34,6 +37,10 @@ CONFIG_SPL_POWER_DOMAIN=y
 CONFIG_SPL_RAM_SUPPORT=y
 CONFIG_SPL_RAM_DEVICE=y
 CONFIG_SPL_REMOTEPROC=y
+# CONFIG_SPL_SPI_FLASH_TINY is not set
+CONFIG_SPL_SPI_FLASH_SFDP_SUPPORT=y
+CONFIG_SPL_SPI_LOAD=y
+CONFIG_SYS_SPI_U_BOOT_OFFS=0x80000
 CONFIG_SPL_YMODEM_SUPPORT=y
 CONFIG_HUSH_PARSER=y
 CONFIG_CMD_BOOTZ=y
@@ -63,6 +70,8 @@ CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_CLK=y
 CONFIG_SPL_CLK=y
 CONFIG_CLK_TI_SCI=y
+CONFIG_DMA_CHANNELS=y
+CONFIG_TI_K3_NAVSS_UDMA=y
 CONFIG_TI_SCI_PROTOCOL=y
 CONFIG_DA8XX_GPIO=y
 CONFIG_DM_I2C=y
@@ -77,6 +86,10 @@ CONFIG_SUPPORT_EMMC_BOOT=y
 CONFIG_MMC_SDHCI=y
 CONFIG_SPL_MMC_SDHCI_ADMA=y
 CONFIG_MMC_SDHCI_AM654=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH_SFDP_SUPPORT=y
+CONFIG_SPI_FLASH_STMICRO=y
+# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
 CONFIG_PINCTRL=y
 # CONFIG_PINCTRL_GENERIC is not set
 CONFIG_SPL_PINCTRL=y
@@ -96,6 +109,10 @@ CONFIG_REMOTEPROC_TI_K3_ARM64=y
 CONFIG_DM_RESET=y
 CONFIG_RESET_TI_SCI=y
 CONFIG_DM_SERIAL=y
+CONFIG_SOC_TI=y
+CONFIG_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_CADENCE_QSPI=y
 CONFIG_SYSRESET=y
 CONFIG_SPL_SYSRESET=y
 CONFIG_SYSRESET_TI_SCI=y
index 6097a0224718713cdda1c5853e634fc03e3ed7db..9f43cee39611b79d9a98fbb893986c9ba019702d 100644 (file)
@@ -7,6 +7,7 @@ CONFIG_SYS_MALLOC_F_LEN=0x8000
 CONFIG_SOC_K3_AM6=y
 CONFIG_TARGET_AM654_A53_EVM=y
 CONFIG_ENV_SIZE=0x20000
+CONFIG_ENV_OFFSET=0x680000
 CONFIG_DM_GPIO=y
 CONFIG_SPL_MMC_SUPPORT=y
 CONFIG_SPL_SERIAL_SUPPORT=y
@@ -15,6 +16,9 @@ CONFIG_SPL_STACK_R_ADDR=0x82000000
 CONFIG_NR_DRAM_BANKS=2
 CONFIG_SPL_FS_FAT=y
 CONFIG_SPL_LIBDISK_SUPPORT=y
+CONFIG_SPL_SPI_FLASH_SUPPORT=y
+CONFIG_SPL_SPI_SUPPORT=y
+# CONFIG_PSCI_RESET is not set
 CONFIG_SPL_TEXT_BASE=0x80080000
 CONFIG_DISTRO_DEFAULTS=y
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
@@ -23,38 +27,60 @@ CONFIG_SPL_LOAD_FIT=y
 CONFIG_SPL_FIT_IMAGE_POST_PROCESS=y
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_BOOTCOMMAND="run findfdt; run envboot; run init_${boot}; run get_fit_${boot}; run get_overlaystring; run run_fit"
+CONFIG_CONSOLE_MUX=y
 CONFIG_SPL_SYS_MALLOC_SIMPLE=y
 CONFIG_SPL_STACK_R=y
 CONFIG_SPL_SEPARATE_BSS=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x1400
+CONFIG_SPL_DMA=y
 CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_DM_MAILBOX=y
+CONFIG_SPL_MTD_SUPPORT=y
 CONFIG_SPL_DM_RESET=y
 CONFIG_SPL_POWER_DOMAIN=y
+CONFIG_SPI_FLASH_SFDP_SUPPORT=y
+# CONFIG_SPL_SPI_FLASH_TINY is not set
+CONFIG_SPL_SPI_FLASH_SFDP_SUPPORT=y
+CONFIG_SPL_SPI_LOAD=y
+CONFIG_SYS_SPI_U_BOOT_OFFS=0x280000
 CONFIG_SPL_YMODEM_SUPPORT=y
 CONFIG_CMD_ASKENV=y
+CONFIG_CMD_DFU=y
+CONFIG_CMD_GPT=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
+CONFIG_CMD_PCI=y
+CONFIG_CMD_REMOTEPROC=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_USB=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_CMD_TIME=y
+CONFIG_MTDIDS_DEFAULT="nor0=47040000.spi.0"
+CONFIG_MTDPARTS_DEFAULT="mtdparts=47040000.spi.0:512k(ospi.tiboot3),2m(ospi.tispl),4m(ospi.u-boot),128k(ospi.env),128k(ospi.env.backup),1m(ospi.sysfw),-@8m(ospi.rootfs)"
+CONFIG_CMD_UBI=y
 # CONFIG_ISO_PARTITION is not set
-# CONFIG_EFI_PARTITION is not set
 CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="k3-am654-base-board"
 CONFIG_SPL_MULTI_DTB_FIT=y
 CONFIG_SPL_MULTI_DTB_FIT_NO_COMPRESSION=y
-CONFIG_ENV_IS_IN_FAT=y
-CONFIG_ENV_FAT_INTERFACE="mmc"
-CONFIG_ENV_FAT_DEVICE_AND_PART="1:1"
+CONFIG_ENV_IS_IN_MMC=y
+CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
+CONFIG_ENV_OFFSET_REDUND=0x6A0000
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_SPL_REGMAP=y
+CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_CLK=y
 CONFIG_SPL_CLK=y
 CONFIG_CLK_TI_SCI=y
+CONFIG_DFU_MMC=y
+CONFIG_DFU_RAM=y
+CONFIG_DFU_SF=y
 CONFIG_DMA_CHANNELS=y
 CONFIG_TI_K3_NAVSS_UDMA=y
 CONFIG_TI_SCI_PROTOCOL=y
@@ -62,10 +88,33 @@ CONFIG_DM_PCA953X=y
 CONFIG_DM_I2C=y
 CONFIG_I2C_SET_DEFAULT_BUS_NUM=y
 CONFIG_SYS_I2C_OMAP24XX=y
+CONFIG_DM_KEYBOARD=y
 CONFIG_DM_MAILBOX=y
 CONFIG_K3_SEC_PROXY=y
 CONFIG_DM_MMC=y
 CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_ADMA=y
+CONFIG_SPL_MMC_SDHCI_ADMA=y
+CONFIG_MMC_SDHCI_AM654=y
+CONFIG_MTD=y
+CONFIG_DM_MTD=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH_SFDP_SUPPORT
+CONFIG_SPI_FLASH_STMICRO=y
+# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
+CONFIG_SPI_FLASH_MTD=y
+CONFIG_PHY_TI=y
+CONFIG_PHY_FIXED=y
+CONFIG_DM_ETH=y
+CONFIG_E1000=y
+CONFIG_CMD_E1000=y
+CONFIG_TI_AM65_CPSW_NUSS=y
+CONFIG_PCI=y
+CONFIG_DM_PCI=y
+CONFIG_PCI_KEYSTONE=y
+CONFIG_PHY=y
+CONFIG_AM654_PHY=y
+CONFIG_OMAP_USB2_PHY=y
 CONFIG_PINCTRL=y
 # CONFIG_PINCTRL_GENERIC is not set
 CONFIG_SPL_PINCTRL=y
@@ -73,11 +122,29 @@ CONFIG_SPL_PINCTRL=y
 CONFIG_PINCTRL_SINGLE=y
 CONFIG_POWER_DOMAIN=y
 CONFIG_TI_SCI_POWER_DOMAIN=y
+CONFIG_REMOTEPROC_TI_K3_R5F=y
 CONFIG_DM_RESET=y
 CONFIG_RESET_TI_SCI=y
 CONFIG_DM_SERIAL=y
 CONFIG_SOC_TI=y
+CONFIG_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_CADENCE_QSPI=y
 CONFIG_SYSRESET=y
 CONFIG_SPL_SYSRESET=y
 CONFIG_SYSRESET_TI_SCI=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_DM_USB_GADGET=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_DWC3=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_DWC3_GENERIC=y
+CONFIG_USB_KEYBOARD=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_MANUFACTURER="Texas Instruments"
+CONFIG_USB_GADGET_VENDOR_NUM=0x0451
+CONFIG_USB_GADGET_PRODUCT_NUM=0x6162
+CONFIG_USB_GADGET_DOWNLOAD=y
+CONFIG_FAT_WRITE=y
 CONFIG_OF_LIBFDT_OVERLAY=y
index 0cdfc735b6ac7144ea1cae2d3070bd49a5ff7e0b..bbf50bf72be071ee100921dc15b026124b457c98 100644 (file)
@@ -6,6 +6,7 @@ CONFIG_SPL_LIBCOMMON_SUPPORT=y
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_SYS_MALLOC_F_LEN=0x55000
 CONFIG_SOC_K3_AM6=y
+CONFIG_K3_EARLY_CONS=y
 CONFIG_TARGET_AM654_R5_EVM=y
 CONFIG_ENV_SIZE=0x20000
 CONFIG_DM_GPIO=y
@@ -16,6 +17,8 @@ CONFIG_SPL_STACK_R_ADDR=0x82000000
 CONFIG_NR_DRAM_BANKS=2
 CONFIG_SPL_FS_FAT=y
 CONFIG_SPL_LIBDISK_SUPPORT=y
+CONFIG_SPL_SPI_FLASH_SUPPORT=y
+CONFIG_SPL_SPI_SUPPORT=y
 CONFIG_SPL_TEXT_BASE=0x41c00000
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
 CONFIG_SPL_LOAD_FIT=y
@@ -27,6 +30,7 @@ CONFIG_SPL_SEPARATE_BSS=y
 CONFIG_SPL_EARLY_BSS=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x400
+CONFIG_SPL_DMA=y
 CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_DM_MAILBOX=y
 CONFIG_SPL_DM_RESET=y
@@ -35,6 +39,10 @@ CONFIG_SPL_POWER_DOMAIN=y
 CONFIG_SPL_RAM_SUPPORT=y
 CONFIG_SPL_RAM_DEVICE=y
 CONFIG_SPL_REMOTEPROC=y
+# CONFIG_SPL_SPI_FLASH_TINY is not set
+CONFIG_SPL_SPI_FLASH_SFDP_SUPPORT=y
+CONFIG_SPL_SPI_LOAD=y
+CONFIG_SYS_SPI_U_BOOT_OFFS=0x80000
 CONFIG_SPL_YMODEM_SUPPORT=y
 CONFIG_HUSH_PARSER=y
 CONFIG_CMD_BOOTZ=y
@@ -58,10 +66,14 @@ CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_REGMAP=y
+CONFIG_SPL_REGMAP=y
 CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_CLK=y
 CONFIG_SPL_CLK=y
 CONFIG_CLK_TI_SCI=y
+CONFIG_DMA_CHANNELS=y
+CONFIG_TI_K3_NAVSS_UDMA=y
 CONFIG_TI_SCI_PROTOCOL=y
 CONFIG_DA8XX_GPIO=y
 CONFIG_DM_I2C=y
@@ -70,8 +82,15 @@ CONFIG_SYS_I2C_OMAP24XX=y
 CONFIG_DM_MAILBOX=y
 CONFIG_K3_SEC_PROXY=y
 CONFIG_MISC=y
+CONFIG_K3_AVS0=y
 CONFIG_DM_MMC=y
 CONFIG_MMC_SDHCI=y
+CONFIG_SPL_MMC_SDHCI_ADMA=y
+CONFIG_MMC_SDHCI_AM654=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH_SFDP_SUPPORT=y
+CONFIG_SPI_FLASH_STMICRO=y
+# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
 CONFIG_PINCTRL=y
 # CONFIG_PINCTRL_GENERIC is not set
 CONFIG_SPL_PINCTRL=y
@@ -83,6 +102,7 @@ CONFIG_DM_REGULATOR=y
 CONFIG_SPL_DM_REGULATOR=y
 CONFIG_DM_REGULATOR_GPIO=y
 CONFIG_SPL_DM_REGULATOR_GPIO=y
+CONFIG_DM_REGULATOR_TPS62360=y
 CONFIG_RAM=y
 CONFIG_SPL_RAM=y
 CONFIG_K3_SYSTEM_CONTROLLER=y
@@ -90,6 +110,10 @@ CONFIG_REMOTEPROC_TI_K3_ARM64=y
 CONFIG_DM_RESET=y
 CONFIG_RESET_TI_SCI=y
 CONFIG_DM_SERIAL=y
+CONFIG_SOC_TI=y
+CONFIG_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_CADENCE_QSPI=y
 CONFIG_SYSRESET=y
 CONFIG_SPL_SYSRESET=y
 CONFIG_SYSRESET_TI_SCI=y
index 57683b183fc27a36b0acec5b4fb3cdcb275f5421..1ae78463d4577f59301df4f71bc7dfb59c7cc715 100644 (file)
@@ -5,7 +5,7 @@ CONFIG_SYS_THUMB_BUILD=y
 # CONFIG_SPL_USE_ARCH_MEMCPY is not set
 # CONFIG_SPL_USE_ARCH_MEMSET is not set
 CONFIG_ARCH_AT91=y
-CONFIG_SPL_LDSCRIPT="arch/$(ARCH)/cpu/u-boot-spl.lds"
+CONFIG_SPL_LDSCRIPT="arch/arm/cpu/u-boot-spl.lds"
 CONFIG_SYS_TEXT_BASE=0x21000000
 CONFIG_TARGET_TAURUS=y
 CONFIG_SPL_GPIO_SUPPORT=y
index f94ea28376508890957010abe4a097a8dfc39130..4fde3b963c3cd6bd83a03ed64d85a0e7254cf62f 100644 (file)
@@ -2,7 +2,7 @@ CONFIG_ARM=y
 # CONFIG_SPL_SYS_THUMB_BUILD is not set
 CONFIG_SYS_L2CACHE_OFF=y
 CONFIG_ARCH_MX6=y
-CONFIG_SPL_LDSCRIPT="arch/$(ARCH)/cpu/u-boot-spl.lds"
+CONFIG_SPL_LDSCRIPT="arch/arm/cpu/u-boot-spl.lds"
 CONFIG_SYS_TEXT_BASE=0x17800000
 CONFIG_SPL_GPIO_SUPPORT=y
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
index 2bbd6a783b9437aeb72a9e1b3f06bb4e5d89c548..b9a68a9263aa53398f3383b7953bf6155ff85aa6 100644 (file)
@@ -1,6 +1,7 @@
 CONFIG_ARM=y
 CONFIG_ARCH_CPU_INIT=y
 CONFIG_ORION5X=y
+CONFIG_SPL_LDSCRIPT="arch/arm/cpu/arm926ejs/orion5x/u-boot-spl.lds"
 CONFIG_SYS_TEXT_BASE=0x00800000
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
index b27f9ba27b1073d62e8c27eb00964334a247d647..e9e82bb4309d39fd6057734ecbc4e7ecb25b3e6b 100644 (file)
@@ -31,6 +31,7 @@ CONFIG_SPL_STACK_R=y
 CONFIG_SPL_SEPARATE_BSS=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x1400
+CONFIG_SPL_DMA=y
 CONFIG_SPL_ENV_SUPPORT=y
 CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_DM_MAILBOX=y
@@ -39,6 +40,8 @@ CONFIG_SPL_POWER_SUPPORT=y
 CONFIG_SPL_POWER_DOMAIN=y
 CONFIG_SPL_RAM_SUPPORT=y
 CONFIG_SPL_RAM_DEVICE=y
+# CONFIG_SPL_SPI_FLASH_TINY is not set
+CONFIG_SPL_SPI_FLASH_SFDP_SUPPORT=y
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_SYS_SPI_U_BOOT_OFFS=0x280000
 CONFIG_SPL_USB_GADGET=y
@@ -60,7 +63,8 @@ CONFIG_CMD_USB_MASS_STORAGE=y
 CONFIG_CMD_TIME=y
 CONFIG_CMD_EXT4_WRITE=y
 CONFIG_MTDIDS_DEFAULT="nor0=47040000.spi.0,nor0=47034000.hyperbus"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=47034000.hyperbus:512k(hbmc.tiboot3),2m(hbmc.tispl),4m(hbmc.u-boot),256k(hbmc.env),1m(hbmc.sysfw),-@8m(hbmc.rootfs)"
+CONFIG_MTDPARTS_DEFAULT="mtdparts=47040000.spi.0:512k(ospi.tiboot3),2m(ospi.tispl),4m(ospi.u-boot),128k(ospi.env),128k(ospi.env.backup),1m(ospi.sysfw),-@8m(ospi.rootfs);47034000.hyperbus:512k(hbmc.tiboot3),2m(hbmc.tispl),4m(hbmc.u-boot),256k(hbmc.env),1m(hbmc.sysfw),-@8m(hbmc.rootfs)"
+CONFIG_CMD_UBI=y
 # CONFIG_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_OF_CONTROL=y
@@ -116,7 +120,10 @@ CONFIG_FLASH_CFI_MTD=y
 CONFIG_SYS_FLASH_CFI=y
 CONFIG_HBMC_AM654=y
 CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH_SFDP_SUPPORT
 CONFIG_SPI_FLASH_STMICRO=y
+# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
+CONFIG_SPI_FLASH_MTD=y
 CONFIG_PHY_TI=y
 CONFIG_PHY_FIXED=y
 CONFIG_DM_ETH=y
index ea70c34c5aff6773bbddb77bb3a4870135c9f810..917f82d4b545b88e437ec72089ed781f48ee25a9 100644 (file)
@@ -8,7 +8,6 @@ CONFIG_SOC_K3_J721E=y
 CONFIG_K3_EARLY_CONS=y
 CONFIG_TARGET_J721E_R5_EVM=y
 CONFIG_ENV_SIZE=0x20000
-CONFIG_ENV_OFFSET=0x680000
 CONFIG_DM_GPIO=y
 CONFIG_SPL_MMC_SUPPORT=y
 CONFIG_SPL_SERIAL_SUPPORT=y
@@ -29,7 +28,9 @@ CONFIG_SPL_SEPARATE_BSS=y
 CONFIG_SPL_EARLY_BSS=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x400
+CONFIG_SPL_DMA=y
 CONFIG_SPL_ENV_SUPPORT=y
+CONFIG_SPL_FS_EXT4=y
 CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_DM_MAILBOX=y
 CONFIG_SPL_DM_RESET=y
@@ -38,6 +39,8 @@ CONFIG_SPL_POWER_DOMAIN=y
 CONFIG_SPL_RAM_SUPPORT=y
 CONFIG_SPL_RAM_DEVICE=y
 CONFIG_SPL_REMOTEPROC=y
+# CONFIG_SPL_SPI_FLASH_TINY is not set
+CONFIG_SPL_SPI_FLASH_SFDP_SUPPORT=y
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_SYS_SPI_U_BOOT_OFFS=0x80000
 CONFIG_SPL_USB_GADGET=y
@@ -55,8 +58,6 @@ CONFIG_CMD_FAT=y
 CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="k3-j721e-r5-common-proc-board"
-CONFIG_ENV_IS_IN_MMC=y
-CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM=y
 CONFIG_SPL_DM=y
@@ -67,6 +68,8 @@ CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_CLK=y
 CONFIG_SPL_CLK=y
 CONFIG_CLK_TI_SCI=y
+CONFIG_DMA_CHANNELS=y
+CONFIG_TI_K3_NAVSS_UDMA=y
 CONFIG_TI_SCI_PROTOCOL=y
 CONFIG_DA8XX_GPIO=y
 CONFIG_DM_PCA953X=y
@@ -85,6 +88,7 @@ CONFIG_SPL_MMC_SDHCI_ADMA=y
 CONFIG_MMC_SDHCI_AM654=y
 CONFIG_MTD=y
 CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH_SFDP_SUPPORT=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_PINCTRL=y
 # CONFIG_PINCTRL_GENERIC is not set
@@ -100,9 +104,11 @@ CONFIG_SPL_DM_REGULATOR=y
 CONFIG_DM_REGULATOR_TPS65941=y
 CONFIG_K3_SYSTEM_CONTROLLER=y
 CONFIG_REMOTEPROC_TI_K3_ARM64=y
+CONFIG_REMOTEPROC_TI_K3_R5F=y
 CONFIG_DM_RESET=y
 CONFIG_RESET_TI_SCI=y
 CONFIG_DM_SERIAL=y
+CONFIG_SOC_TI=y
 CONFIG_SPI=y
 CONFIG_DM_SPI=y
 CONFIG_CADENCE_QSPI=y
@@ -126,3 +132,6 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0x6163
 CONFIG_USB_GADGET_DOWNLOAD=y
 CONFIG_FS_EXT4=y
 CONFIG_FS_FAT_MAX_CLUSTSIZE=16384
+CONFIG_ESM_K3=y
+CONFIG_ESM_PMIC=y
+CONFIG_SPL_BOARD_INIT=y
index f7918773e0d59bd33e524acaf5616169b7bd29e3..a723e2718e5ea1ad554ccbe1f7eae0099dff99b0 100644 (file)
@@ -36,6 +36,8 @@ CONFIG_SPL_DM_MAILBOX=y
 CONFIG_SPL_DM_RESET=y
 CONFIG_SPL_POWER_SUPPORT=y
 CONFIG_SPL_POWER_DOMAIN=y
+# CONFIG_SPL_SPI_FLASH_TINY is not set
+CONFIG_SPL_SPI_FLASH_SFDP_SUPPORT=y
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_SYS_SPI_U_BOOT_OFFS=0x280000
 CONFIG_SPL_YMODEM_SUPPORT=y
@@ -54,7 +56,8 @@ CONFIG_CMD_USB_MASS_STORAGE=y
 CONFIG_CMD_TIME=y
 CONFIG_CMD_EXT4_WRITE=y
 CONFIG_MTDIDS_DEFAULT="nor0=47040000.spi.0,nor0=47034000.hyperbus"
-CONFIG_MTDPARTS_DEFAULT="mtdparts=47034000.hyperbus:512k(hbmc.tiboot3),2m(hbmc.tispl),4m(hbmc.u-boot),256k(hbmc.env),1m(hbmc.sysfw),-@8m(hbmc.rootfs)"
+CONFIG_MTDPARTS_DEFAULT="mtdparts=47040000.spi.0:512k(ospi.tiboot3),2m(ospi.tispl),4m(ospi.u-boot),128k(ospi.env),128k(ospi.env.backup),1m(ospi.sysfw),-@8m(ospi.rootfs);47034000.hyperbus:512k(hbmc.tiboot3),2m(hbmc.tispl),4m(hbmc.u-boot),256k(hbmc.env),1m(hbmc.sysfw),-@8m(hbmc.rootfs)"
+CONFIG_CMD_UBI=y
 # CONFIG_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_OF_CONTROL=y
@@ -107,7 +110,10 @@ CONFIG_FLASH_CFI_MTD=y
 CONFIG_SYS_FLASH_CFI=y
 CONFIG_HBMC_AM654=y
 CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH_SFDP_SUPPORT
 CONFIG_SPI_FLASH_STMICRO=y
+# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set
+CONFIG_SPI_FLASH_MTD=y
 CONFIG_PHY_TI=y
 CONFIG_PHY_FIXED=y
 CONFIG_DM_ETH=y
index 91d1cc8b735098aea756937687c770bce178c5d5..196625d881afc1d359cd828148d3d054405d37cd 100644 (file)
@@ -28,6 +28,7 @@ CONFIG_USE_BOOTCOMMAND=y
 CONFIG_SPL_STACK_R=y
 CONFIG_SPL_SEPARATE_BSS=y
 CONFIG_SPL_EARLY_BSS=y
+CONFIG_SPL_DMA=y
 CONFIG_SPL_ENV_SUPPORT=y
 CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_DM_MAILBOX=y
@@ -37,6 +38,8 @@ CONFIG_SPL_POWER_DOMAIN=y
 CONFIG_SPL_RAM_SUPPORT=y
 CONFIG_SPL_RAM_DEVICE=y
 CONFIG_SPL_REMOTEPROC=y
+# CONFIG_SPL_SPI_FLASH_TINY is not set
+CONFIG_SPL_SPI_FLASH_SFDP_SUPPORT=y
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_SYS_SPI_U_BOOT_OFFS=0x80000
 CONFIG_SPL_YMODEM_SUPPORT=y
@@ -63,6 +66,8 @@ CONFIG_SPL_OF_TRANSLATE=y
 CONFIG_CLK=y
 CONFIG_SPL_CLK=y
 CONFIG_CLK_TI_SCI=y
+CONFIG_DMA_CHANNELS=y
+CONFIG_TI_K3_NAVSS_UDMA=y
 CONFIG_TI_SCI_PROTOCOL=y
 CONFIG_DA8XX_GPIO=y
 CONFIG_DM_I2C=y
@@ -79,6 +84,7 @@ CONFIG_SPL_MMC_SDHCI_ADMA=y
 CONFIG_MMC_SDHCI_AM654=y
 CONFIG_MTD=y
 CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH_SFDP_SUPPORT=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_PINCTRL=y
 # CONFIG_PINCTRL_GENERIC is not set
@@ -97,6 +103,7 @@ CONFIG_REMOTEPROC_TI_K3_ARM64=y
 CONFIG_DM_RESET=y
 CONFIG_RESET_TI_SCI=y
 CONFIG_DM_SERIAL=y
+CONFIG_SOC_TI=y
 CONFIG_SPI=y
 CONFIG_DM_SPI=y
 CONFIG_CADENCE_QSPI=y
diff --git a/configs/libretech-s905d-pc_defconfig b/configs/libretech-s905d-pc_defconfig
new file mode 100644 (file)
index 0000000..7e0c958
--- /dev/null
@@ -0,0 +1,73 @@
+CONFIG_ARM=y
+CONFIG_SYS_BOARD="q200"
+CONFIG_ARCH_MESON=y
+CONFIG_SYS_TEXT_BASE=0x01000000
+CONFIG_MESON_GXL=y
+CONFIG_ENV_SIZE=0x10000
+CONFIG_ENV_OFFSET=0xFFFF0000
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_DEBUG_UART_BASE=0xc81004c0
+CONFIG_DEBUG_UART_CLOCK=24000000
+CONFIG_ENV_SECT_SIZE=0x10000
+CONFIG_IDENT_STRING=" libretech-s905d-pc"
+CONFIG_DEBUG_UART=y
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_USE_PREBOOT=y
+CONFIG_PREBOOT="usb start"
+CONFIG_MISC_INIT_R=y
+# CONFIG_DISPLAY_CPUINFO is not set
+# CONFIG_CMD_BDI is not set
+# CONFIG_CMD_IMI is not set
+CONFIG_CMD_ADC=y
+CONFIG_CMD_GPIO=y
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MMC=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_SF_TEST=y
+CONFIG_CMD_SPI=y
+CONFIG_CMD_USB=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_REGULATOR=y
+CONFIG_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="meson-gxl-s905d-libretech-pc"
+CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_SARADC_MESON=y
+CONFIG_DM_GPIO=y
+CONFIG_DM_KEYBOARD=y
+CONFIG_DM_MMC=y
+CONFIG_MMC_MESON_GX=y
+CONFIG_MTD=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_PHY_REALTEK=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_PHY=y
+CONFIG_MESON_GXL_USB_PHY=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_MESON_GXL=y
+CONFIG_POWER_DOMAIN=y
+CONFIG_MESON_GX_VPU_POWER_DOMAIN=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_RESET=y
+CONFIG_DEBUG_UART_MESON=y
+CONFIG_DEBUG_UART_ANNOUNCE=y
+CONFIG_DEBUG_UART_SKIP_INIT=y
+CONFIG_MESON_SERIAL=y
+CONFIG_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_MESON_SPIFC=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_DWC3=y
+CONFIG_USB_XHCI_DWC3_OF_SIMPLE=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_KEYBOARD=y
+CONFIG_DM_VIDEO=y
+CONFIG_SYS_WHITE_ON_BLACK=y
+CONFIG_VIDEO_MESON=y
+CONFIG_VIDEO_DT_SIMPLEFB=y
+CONFIG_OF_LIBFDT_OVERLAY=y
diff --git a/configs/libretech-s912-pc_defconfig b/configs/libretech-s912-pc_defconfig
new file mode 100644 (file)
index 0000000..5f4ee32
--- /dev/null
@@ -0,0 +1,73 @@
+CONFIG_ARM=y
+CONFIG_SYS_BOARD="q200"
+CONFIG_ARCH_MESON=y
+CONFIG_SYS_TEXT_BASE=0x01000000
+CONFIG_MESON_GXM=y
+CONFIG_ENV_SIZE=0x10000
+CONFIG_ENV_OFFSET=0xFFFF0000
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_DEBUG_UART_BASE=0xc81004c0
+CONFIG_DEBUG_UART_CLOCK=24000000
+CONFIG_ENV_SECT_SIZE=0x10000
+CONFIG_IDENT_STRING=" libretech-s912-pc"
+CONFIG_DEBUG_UART=y
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_USE_PREBOOT=y
+CONFIG_PREBOOT="usb start"
+CONFIG_MISC_INIT_R=y
+# CONFIG_DISPLAY_CPUINFO is not set
+# CONFIG_CMD_BDI is not set
+# CONFIG_CMD_IMI is not set
+CONFIG_CMD_ADC=y
+CONFIG_CMD_GPIO=y
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MMC=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_SF_TEST=y
+CONFIG_CMD_SPI=y
+CONFIG_CMD_USB=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_REGULATOR=y
+CONFIG_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="meson-gxm-s912-libretech-pc"
+CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_SARADC_MESON=y
+CONFIG_DM_GPIO=y
+CONFIG_DM_KEYBOARD=y
+CONFIG_DM_MMC=y
+CONFIG_MMC_MESON_GX=y
+CONFIG_MTD=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_PHY_REALTEK=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_PHY=y
+CONFIG_MESON_GXL_USB_PHY=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_MESON_GXL=y
+CONFIG_POWER_DOMAIN=y
+CONFIG_MESON_GX_VPU_POWER_DOMAIN=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_RESET=y
+CONFIG_DEBUG_UART_MESON=y
+CONFIG_DEBUG_UART_ANNOUNCE=y
+CONFIG_DEBUG_UART_SKIP_INIT=y
+CONFIG_MESON_SERIAL=y
+CONFIG_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_MESON_SPIFC=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_DWC3=y
+CONFIG_USB_XHCI_DWC3_OF_SIMPLE=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_KEYBOARD=y
+CONFIG_DM_VIDEO=y
+CONFIG_SYS_WHITE_ON_BLACK=y
+CONFIG_VIDEO_MESON=y
+CONFIG_VIDEO_DT_SIMPLEFB=y
+CONFIG_OF_LIBFDT_OVERLAY=y
index ac1dac000521c2dacc28b8323a9617034a22e2f2..595a1be2372e7be57d977983d1eadea4f1b2b21f 100644 (file)
@@ -2,6 +2,7 @@ CONFIG_ARM=y
 # CONFIG_SPL_USE_ARCH_MEMCPY is not set
 # CONFIG_SPL_USE_ARCH_MEMSET is not set
 CONFIG_ARCH_MX31=y
+CONFIG_SPL_LDSCRIPT="arch/arm/cpu/u-boot-spl.lds"
 CONFIG_SYS_TEXT_BASE=0x87e00000
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_TARGET_MX31PDK=y
index 71a4d7fccb57ed7e769e85ada5cfe46f9e50f68e..8ca17d621bbfba8f5dae29e9d07aa4a7d1ee3636 100644 (file)
@@ -199,6 +199,7 @@ CONFIG_WDT_SANDBOX=y
 CONFIG_FS_CBFS=y
 CONFIG_FS_CRAMFS=y
 CONFIG_CMD_DHRYSTONE=y
+CONFIG_RSA_VERIFY_WITH_PKEY=y
 CONFIG_TPM=y
 CONFIG_LZ4=y
 CONFIG_ERRNO_STR=y
index f96891ecae7a2d5bcd214154f2539719babe5e3b..cc90f0006e248197e9945befd78756f435be795e 100644 (file)
@@ -225,6 +225,7 @@ CONFIG_WDT_SANDBOX=y
 CONFIG_FS_CBFS=y
 CONFIG_FS_CRAMFS=y
 CONFIG_CMD_DHRYSTONE=y
+CONFIG_RSA_VERIFY_WITH_PKEY=y
 CONFIG_TPM=y
 CONFIG_LZ4=y
 CONFIG_ERRNO_STR=y
index 43efefda517bf9ba5af304abc1c2e51ae6ec895e..59d34cb5e09dba5843aa002dbf10dd7944a91fd8 100644 (file)
@@ -175,6 +175,7 @@ CONFIG_VIDEO_SANDBOX_SDL=y
 CONFIG_OSD=y
 CONFIG_SANDBOX_OSD=y
 CONFIG_CMD_DHRYSTONE=y
+CONFIG_RSA_VERIFY_WITH_PKEY=y
 CONFIG_TPM=y
 CONFIG_LZ4=y
 CONFIG_ERRNO_STR=y
index cb387e744b07ca3d43b0c9c7ba6b05b5cb08b4b8..53c5bd8a4e0ce72a75b845e53a5f3cad180676dc 100644 (file)
@@ -198,6 +198,7 @@ CONFIG_FS_CBFS=y
 CONFIG_FS_CRAMFS=y
 # CONFIG_SPL_USE_TINY_PRINTF is not set
 CONFIG_CMD_DHRYSTONE=y
+CONFIG_RSA_VERIFY_WITH_PKEY=y
 CONFIG_TPM=y
 CONFIG_LZ4=y
 CONFIG_ERRNO_STR=y
index 0399132230a00346d3c1e79a7eebbb218f90721f..19d85f9b5a81953b5b3a1ce9e289aab5ccb72628 100644 (file)
@@ -6,7 +6,7 @@ CONFIG_SYS_THUMB_BUILD=y
 # CONFIG_SPL_USE_ARCH_MEMCPY is not set
 # CONFIG_SPL_USE_ARCH_MEMSET is not set
 CONFIG_ARCH_AT91=y
-CONFIG_SPL_LDSCRIPT="arch/$(ARCH)/cpu/u-boot-spl.lds"
+CONFIG_SPL_LDSCRIPT="arch/arm/cpu/u-boot-spl.lds"
 CONFIG_SYS_TEXT_BASE=0x21000000
 CONFIG_TARGET_TAURUS=y
 CONFIG_BOARD_TAURUS=y
index ea6244ba1dfdfc1b49b8c90ba8d8d622df764e62..e8c349261207b802f21b7edd640ba7a298974f55 100644 (file)
@@ -4,15 +4,13 @@ CONFIG_SYS_TEXT_BASE=0x8000000
 CONFIG_SYS_MALLOC_F_LEN=0x100000
 CONFIG_DM_GPIO=y
 CONFIG_COUNTER_FREQUENCY=62500000
-CONFIG_ENV_VARS_UBOOT_CONFIG=y
+CONFIG_DISTRO_DEFAULTS=y
 CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 # CONFIG_ARCH_FIXUP_FDT_MEMORY is not set
 CONFIG_BOOTDELAY=5
-CONFIG_SUPPORT_RAW_INITRD=y
 # CONFIG_DISPLAY_CPUINFO is not set
 CONFIG_BOARD_EARLY_INIT_R=y
-CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="Versal> "
 CONFIG_CMD_BOOTMENU=y
 CONFIG_CMD_MEMTEST=y
@@ -25,25 +23,15 @@ CONFIG_CMD_GPIO=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
 CONFIG_CMD_USB=y
-CONFIG_CMD_DHCP=y
 CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_PXE=y
 CONFIG_CMD_CACHE=y
 CONFIG_CMD_TIME=y
 CONFIG_CMD_TIMER=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_EXT4=y
 CONFIG_CMD_EXT4_WRITE=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_FS_GENERIC=y
-CONFIG_ISO_PARTITION=y
-CONFIG_EFI_PARTITION=y
-# CONFIG_PARTITION_UUIDS is not set
 CONFIG_OF_BOARD=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_NETCONSOLE=y
 CONFIG_IP_DEFRAG=y
 CONFIG_TFTP_BLOCKSIZE=4096
 CONFIG_CLK_VERSAL=y
@@ -61,6 +49,9 @@ CONFIG_MMC_SDHCI_ZYNQ=y
 CONFIG_ZYNQ_SDHCI_MIN_FREQ=100000
 CONFIG_MTD=y
 CONFIG_DM_SPI_FLASH=y
+CONFIG_SF_DUAL_FLASH=y
+CONFIG_SPI_FLASH_GIGADEVICE=y
+CONFIG_SPI_FLASH_ISSI=y
 CONFIG_SPI_FLASH_MACRONIX=y
 CONFIG_SPI_FLASH_SPANSION=y
 CONFIG_SPI_FLASH_STMICRO=y
@@ -88,7 +79,6 @@ CONFIG_USB_DWC3=y
 CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_ULPI_VIEWPORT=y
 CONFIG_USB_ULPI=y
-CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
 CONFIG_USB_GADGET_VENDOR_NUM=0x03FD
index ece619f239b29e789c565bd1d77017e56130a722..54cbd3e12b65280338518e0e924b9f4e9d807432 100644 (file)
@@ -11,13 +11,17 @@ CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
 CONFIG_FIT=y
 CONFIG_FIT_SIGNATURE=y
 CONFIG_FIT_VERBOSE=y
+CONFIG_SPL_FIT_PRINT=y
+CONFIG_SPL_LOAD_FIT=y
 CONFIG_LEGACY_IMAGE_FORMAT=y
 CONFIG_USE_PREBOOT=y
 CONFIG_SPL_STACK_R=y
+CONFIG_SPL_FPGA_SUPPORT=y
 CONFIG_SPL_OS_BOOT=y
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_SYS_SPI_U_BOOT_OFFS=0x100000
 # CONFIG_BOOTM_NETBSD is not set
+CONFIG_CMD_IMLS=y
 CONFIG_CMD_THOR_DOWNLOAD=y
 CONFIG_CMD_MEMTEST=y
 CONFIG_CMD_DFU=y
@@ -28,15 +32,18 @@ CONFIG_CMD_FPGA_LOADP=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
+CONFIG_CMD_NAND_LOCK_UNLOCK=y
 CONFIG_CMD_USB=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_CMD_TFTPPUT=y
 CONFIG_CMD_CACHE=y
 CONFIG_CMD_EXT4_WRITE=y
-CONFIG_OF_BOARD=y
+CONFIG_DEFAULT_DEVICE_TREE="zynq-zc706"
+CONFIG_OF_LIST="zynq-zc702 zynq-zc706 zynq-zc770-xm010 zynq-zc770-xm011 zynq-zc770-xm011-x16 zynq-zc770-xm012 zynq-zc770-xm013 zynq-cc108 zynq-microzed zynq-minized zynq-picozed zynq-zed zynq-zturn zynq-zybo zynq-zybo-z7 zynq-dlc20-rev1.0"
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_NETCONSOLE=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
@@ -44,6 +51,8 @@ CONFIG_FPGA_XILINX=y
 CONFIG_FPGA_ZYNQPL=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_CADENCE=y
+CONFIG_I2C_MUX=y
+CONFIG_I2C_MUX_PCA954x=y
 CONFIG_LED=y
 CONFIG_LED_GPIO=y
 CONFIG_MISC=y
@@ -52,11 +61,20 @@ CONFIG_SYS_I2C_EEPROM_ADDR=0x0
 CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW=0x0
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_ZYNQ=y
+CONFIG_MTD=y
+CONFIG_MTD_NOR_FLASH=y
+CONFIG_FLASH_CFI_DRIVER=y
+CONFIG_CFI_FLASH=y
+CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
+CONFIG_SYS_FLASH_CFI=y
+CONFIG_MTD_RAW_NAND=y
+CONFIG_NAND_ZYNQ=y
 CONFIG_SF_DEFAULT_SPEED=30000000
 CONFIG_SPI_FLASH_ISSI=y
 CONFIG_SPI_FLASH_MACRONIX=y
 CONFIG_SPI_FLASH_SPANSION=y
 CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_SST=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_PHY_MARVELL=y
 CONFIG_PHY_REALTEK=y
@@ -64,6 +82,7 @@ CONFIG_PHY_XILINX=y
 CONFIG_MII=y
 CONFIG_ZYNQ_GEM=y
 CONFIG_ZYNQ_SERIAL=y
+CONFIG_ZYNQ_SPI=y
 CONFIG_ZYNQ_QSPI=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
@@ -76,3 +95,5 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
 CONFIG_CI_UDC=y
 CONFIG_USB_GADGET_DOWNLOAD=y
 CONFIG_USB_FUNCTION_THOR=y
+CONFIG_DISPLAY=y
+CONFIG_SPL_GZIP=y
index d953c91a66ed9cb68add7e3b8432f0389b75572c..2d9a3b3a5f3a25cff136aa80f7511d3a77514fbd 100644 (file)
@@ -40,6 +40,7 @@ CONFIG_SYS_ALT_MEMTEST=y
 # CONFIG_CMD_ITEST is not set
 # CONFIG_CMD_SOURCE is not set
 # CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_CACHE=y
 # CONFIG_CMD_MISC is not set
 # CONFIG_PARTITIONS is not set
 CONFIG_OF_EMBED=y
index 3f845bebad843e79f78d29db279145cac99fbcbc..7b09edd78e1bfe7e1e2ab8c15bd7a1f4163e9590 100644 (file)
@@ -47,9 +47,10 @@ CONFIG_CMD_TIMER=y
 CONFIG_CMD_EXT4_WRITE=y
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_DEFAULT_DEVICE_TREE="zynqmp-zcu100-revC"
-CONFIG_OF_LIST="avnet-ultra96-rev1 zynqmp-a2197-revA zynqmp-e-a2197-00-revA zynqmp-g-a2197-00-revA zynqmp-m-a2197-01-revA zynqmp-m-a2197-02-revA zynqmp-m-a2197-03-revA zynqmp-p-a2197-00-revA zynqmp-zc1232-revA zynqmp-zc1254-revA zynqmp-zc1751-xm015-dc1 zynqmp-zc1751-xm016-dc2 zynqmp-zc1751-xm017-dc3 zynqmp-zc1751-xm018-dc4 zynqmp-zc1751-xm019-dc5 zynqmp-zcu100-revC zynqmp-zcu102-rev1.0 zynqmp-zcu102-revA zynqmp-zcu102-revB zynqmp-zcu104-revA zynqmp-zcu104-revC zynqmp-zcu106-revA zynqmp-zcu111-revA zynqmp-zcu1275-revA zynqmp-zcu1275-revB zynqmp-zcu1285-revA zynqmp-zcu208-revA zynqmp-zcu216-revA"
+CONFIG_OF_LIST="avnet-ultra96-rev1 zynqmp-a2197-revA zynqmp-e-a2197-00-revA zynqmp-g-a2197-00-revA zynqmp-m-a2197-01-revA zynqmp-m-a2197-02-revA zynqmp-m-a2197-03-revA zynqmp-p-a2197-00-revA zynqmp-zc1232-revA zynqmp-zc1254-revA zynqmp-zc1751-xm015-dc1 zynqmp-zc1751-xm016-dc2 zynqmp-zc1751-xm017-dc3 zynqmp-zc1751-xm018-dc4 zynqmp-zc1751-xm019-dc5 zynqmp-zcu100-revC zynqmp-zcu102-rev1.1 zynqmp-zcu102-rev1.0 zynqmp-zcu102-revA zynqmp-zcu102-revB zynqmp-zcu104-revA zynqmp-zcu104-revC zynqmp-zcu106-revA zynqmp-zcu111-revA zynqmp-zcu1275-revA zynqmp-zcu1275-revB zynqmp-zcu1285-revA zynqmp-zcu208-revA zynqmp-zcu216-revA"
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_NETCONSOLE=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_SCSI_AHCI=y
diff --git a/configs/zynq_cc108_defconfig b/configs/zynq_cc108_defconfig
deleted file mode 100644 (file)
index 4177117..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_DEBUG_UART_BASE=0xe0000000
-CONFIG_DEBUG_UART_CLOCK=50000000
-CONFIG_DEBUG_UART=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_LEGACY_IMAGE_FORMAT=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_SPI_LOAD=y
-CONFIG_SYS_SPI_U_BOOT_OFFS=0x100000
-# CONFIG_BOOTM_NETBSD is not set
-CONFIG_CMD_DFU=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4_WRITE=y
-CONFIG_DEFAULT_DEVICE_TREE="zynq-cc108"
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-CONFIG_MMC_SDHCI=y
-CONFIG_MMC_SDHCI_ZYNQ=y
-CONFIG_SF_DEFAULT_SPEED=30000000
-CONFIG_SPI_FLASH_ISSI=y
-CONFIG_SPI_FLASH_MACRONIX=y
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_SPI_FLASH_STMICRO=y
-CONFIG_SPI_FLASH_WINBOND=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_XILINX=y
-CONFIG_MII=y
-CONFIG_ZYNQ_GEM=y
-CONFIG_DEBUG_UART_ZYNQ=y
-CONFIG_DEBUG_UART_ANNOUNCE=y
-CONFIG_ZYNQ_SERIAL=y
-CONFIG_ZYNQ_QSPI=y
-CONFIG_USB=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_ULPI_VIEWPORT=y
-CONFIG_USB_ULPI=y
-CONFIG_USB_GADGET=y
-CONFIG_CI_UDC=y
-CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_USB_FUNCTION_THOR=y
index e2b9454c15c88ccfc9de3c6152691d60b1fd8c83..3b4e2f93fa3067de3b8699f0ab493c0630eeccb6 100644 (file)
@@ -52,8 +52,11 @@ CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_SPL_DM_SEQ_ALIAS=y
 # CONFIG_MMC is not set
+CONFIG_MTD=y
+CONFIG_DM_MTD=y
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_FLASH_CFI_DRIVER=y
+CONFIG_CFI_FLASH=y
 CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
 CONFIG_SYS_FLASH_CFI=y
 # CONFIG_EFI_LOADER is not set
diff --git a/configs/zynq_dlc20_rev1_0_defconfig b/configs/zynq_dlc20_rev1_0_defconfig
deleted file mode 100644 (file)
index d52b4b8..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_DEBUG_UART_BASE=0xe0001000
-CONFIG_DEBUG_UART_CLOCK=50000000
-CONFIG_IDENT_STRING=" Xilinx Zynq DLC20 Rev1.0"
-CONFIG_DEBUG_UART=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_LEGACY_IMAGE_FORMAT=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_OS_BOOT=y
-CONFIG_SPL_SPI_LOAD=y
-CONFIG_SYS_SPI_U_BOOT_OFFS=0x100000
-# CONFIG_BOOTM_NETBSD is not set
-CONFIG_CMD_THOR_DOWNLOAD=y
-CONFIG_CMD_DFU=y
-CONFIG_CMD_FPGA_LOADBP=y
-CONFIG_CMD_FPGA_LOADFS=y
-CONFIG_CMD_FPGA_LOADMK=y
-CONFIG_CMD_FPGA_LOADP=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4_WRITE=y
-CONFIG_DEFAULT_DEVICE_TREE="zynq-dlc20-rev1.0"
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_DFU_MMC=y
-CONFIG_DFU_RAM=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-CONFIG_DM_I2C=y
-CONFIG_SYS_I2C_CADENCE=y
-CONFIG_MISC=y
-CONFIG_I2C_EEPROM=y
-CONFIG_SYS_I2C_EEPROM_ADDR=0x0
-CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW=0x0
-CONFIG_MMC_SDHCI=y
-CONFIG_MMC_SDHCI_ZYNQ=y
-CONFIG_SF_DEFAULT_SPEED=30000000
-CONFIG_SPI_FLASH_STMICRO=y
-CONFIG_SPI_FLASH_WINBOND=y
-CONFIG_PHY_REALTEK=y
-CONFIG_MII=y
-CONFIG_ZYNQ_GEM=y
-CONFIG_DEBUG_UART_ZYNQ=y
-CONFIG_DEBUG_UART_ANNOUNCE=y
-CONFIG_ZYNQ_SERIAL=y
-CONFIG_ZYNQ_QSPI=y
-CONFIG_USB=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_ULPI_VIEWPORT=y
-CONFIG_USB_ULPI=y
-CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
-CONFIG_USB_GADGET_VENDOR_NUM=0x03fd
-CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
-CONFIG_CI_UDC=y
-CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_USB_FUNCTION_THOR=y
diff --git a/configs/zynq_microzed_defconfig b/configs/zynq_microzed_defconfig
deleted file mode 100644 (file)
index d4b484f..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_LEGACY_IMAGE_FORMAT=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_OS_BOOT=y
-CONFIG_SPL_SPI_LOAD=y
-CONFIG_SYS_SPI_U_BOOT_OFFS=0x100000
-# CONFIG_BOOTM_NETBSD is not set
-CONFIG_CMD_THOR_DOWNLOAD=y
-CONFIG_CMD_DFU=y
-CONFIG_CMD_FPGA_LOADBP=y
-CONFIG_CMD_FPGA_LOADFS=y
-CONFIG_CMD_FPGA_LOADMK=y
-CONFIG_CMD_FPGA_LOADP=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4_WRITE=y
-CONFIG_DEFAULT_DEVICE_TREE="zynq-microzed"
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_DFU_MMC=y
-CONFIG_DFU_RAM=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-CONFIG_MMC_SDHCI=y
-CONFIG_MMC_SDHCI_ZYNQ=y
-CONFIG_SF_DEFAULT_SPEED=30000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_SPI_FLASH_STMICRO=y
-CONFIG_SPI_FLASH_WINBOND=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_XILINX=y
-CONFIG_MII=y
-CONFIG_ZYNQ_GEM=y
-CONFIG_ZYNQ_SERIAL=y
-CONFIG_ZYNQ_QSPI=y
-CONFIG_USB=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_ULPI_VIEWPORT=y
-CONFIG_USB_ULPI=y
-CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
-CONFIG_USB_GADGET_VENDOR_NUM=0x03FD
-CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
-CONFIG_CI_UDC=y
-CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_USB_FUNCTION_THOR=y
diff --git a/configs/zynq_minized_defconfig b/configs/zynq_minized_defconfig
deleted file mode 100644 (file)
index 6c936aa..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_DEBUG_UART_BASE=0xe0001000
-CONFIG_DEBUG_UART_CLOCK=50000000
-CONFIG_DEBUG_UART=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_OS_BOOT=y
-# CONFIG_BOOTM_NETBSD is not set
-CONFIG_CMD_THOR_DOWNLOAD=y
-CONFIG_CMD_DFU=y
-CONFIG_CMD_FPGA_LOADBP=y
-CONFIG_CMD_FPGA_LOADFS=y
-CONFIG_CMD_FPGA_LOADMK=y
-CONFIG_CMD_FPGA_LOADP=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4_WRITE=y
-CONFIG_DEFAULT_DEVICE_TREE="zynq-minized"
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_DFU_MMC=y
-CONFIG_DFU_RAM=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-CONFIG_MMC_SDHCI=y
-CONFIG_MMC_SDHCI_ZYNQ=y
-CONFIG_SF_DEFAULT_SPEED=30000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_SPI_FLASH_STMICRO=y
-CONFIG_SPI_FLASH_WINBOND=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_XILINX=y
-CONFIG_MII=y
-CONFIG_ZYNQ_GEM=y
-CONFIG_DEBUG_UART_ZYNQ=y
-CONFIG_ZYNQ_SERIAL=y
-CONFIG_ZYNQ_QSPI=y
-CONFIG_USB=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_ULPI_VIEWPORT=y
-CONFIG_USB_ULPI=y
-CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
-CONFIG_USB_GADGET_VENDOR_NUM=0x03fd
-CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
-CONFIG_CI_UDC=y
-CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_USB_FUNCTION_THOR=y
diff --git a/configs/zynq_picozed_defconfig b/configs/zynq_picozed_defconfig
deleted file mode 100644 (file)
index f9db660..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_OS_BOOT=y
-# CONFIG_BOOTM_NETBSD is not set
-CONFIG_CMD_THOR_DOWNLOAD=y
-CONFIG_CMD_DFU=y
-CONFIG_CMD_FPGA_LOADBP=y
-CONFIG_CMD_FPGA_LOADFS=y
-CONFIG_CMD_FPGA_LOADMK=y
-CONFIG_CMD_FPGA_LOADP=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4_WRITE=y
-CONFIG_DEFAULT_DEVICE_TREE="zynq-picozed"
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_DFU_MMC=y
-CONFIG_DFU_RAM=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-CONFIG_MMC_SDHCI=y
-CONFIG_MMC_SDHCI_ZYNQ=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_XILINX=y
-CONFIG_MII=y
-CONFIG_ZYNQ_GEM=y
-CONFIG_ZYNQ_SERIAL=y
-CONFIG_USB=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_ULPI_VIEWPORT=y
-CONFIG_USB_ULPI=y
-CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
-CONFIG_USB_GADGET_VENDOR_NUM=0x03fd
-CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
-CONFIG_CI_UDC=y
-CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_USB_FUNCTION_THOR=y
diff --git a/configs/zynq_z_turn_defconfig b/configs/zynq_z_turn_defconfig
deleted file mode 100644 (file)
index 8a22ecb..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_DEBUG_UART_BASE=0xe0001000
-CONFIG_DEBUG_UART_CLOCK=50000000
-CONFIG_DEBUG_UART=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_LEGACY_IMAGE_FORMAT=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_OS_BOOT=y
-CONFIG_SPL_SPI_LOAD=y
-CONFIG_SYS_SPI_U_BOOT_OFFS=0x100000
-# CONFIG_BOOTM_NETBSD is not set
-CONFIG_CMD_THOR_DOWNLOAD=y
-CONFIG_CMD_DFU=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4_WRITE=y
-CONFIG_DEFAULT_DEVICE_TREE="zynq-zturn"
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_DFU_MMC=y
-CONFIG_DFU_RAM=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-CONFIG_LED=y
-CONFIG_LED_GPIO=y
-CONFIG_MMC_SDHCI=y
-CONFIG_MMC_SDHCI_ZYNQ=y
-CONFIG_SF_DEFAULT_SPEED=30000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_SPI_FLASH_STMICRO=y
-CONFIG_SPI_FLASH_WINBOND=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_XILINX=y
-CONFIG_MII=y
-CONFIG_ZYNQ_GEM=y
-CONFIG_DEBUG_UART_ZYNQ=y
-CONFIG_ZYNQ_SERIAL=y
-CONFIG_ZYNQ_QSPI=y
-CONFIG_USB=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_ULPI_VIEWPORT=y
-CONFIG_USB_ULPI=y
-CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
-CONFIG_USB_GADGET_VENDOR_NUM=0x03FD
-CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
-CONFIG_CI_UDC=y
-CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_USB_FUNCTION_THOR=y
diff --git a/configs/zynq_zc702_defconfig b/configs/zynq_zc702_defconfig
deleted file mode 100644 (file)
index cba3432..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_DEBUG_UART_BASE=0xe0001000
-CONFIG_DEBUG_UART_CLOCK=50000000
-CONFIG_IDENT_STRING=" Xilinx Zynq ZC702"
-CONFIG_DEBUG_UART=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_LEGACY_IMAGE_FORMAT=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_OS_BOOT=y
-CONFIG_SPL_SPI_LOAD=y
-CONFIG_SYS_SPI_U_BOOT_OFFS=0x100000
-# CONFIG_BOOTM_NETBSD is not set
-CONFIG_CMD_THOR_DOWNLOAD=y
-CONFIG_CMD_MEMTEST=y
-CONFIG_CMD_DFU=y
-CONFIG_CMD_FPGA_LOADBP=y
-CONFIG_CMD_FPGA_LOADFS=y
-CONFIG_CMD_FPGA_LOADMK=y
-CONFIG_CMD_FPGA_LOADP=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4_WRITE=y
-CONFIG_DEFAULT_DEVICE_TREE="zynq-zc702"
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_DFU_MMC=y
-CONFIG_DFU_RAM=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-CONFIG_DM_I2C=y
-CONFIG_SYS_I2C_CADENCE=y
-CONFIG_LED=y
-CONFIG_LED_GPIO=y
-CONFIG_MISC=y
-CONFIG_I2C_EEPROM=y
-CONFIG_SYS_I2C_EEPROM_ADDR=0x0
-CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW=0x0
-CONFIG_MMC_SDHCI=y
-CONFIG_MMC_SDHCI_ZYNQ=y
-CONFIG_SF_DEFAULT_SPEED=30000000
-CONFIG_SPI_FLASH_ISSI=y
-CONFIG_SPI_FLASH_MACRONIX=y
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_SPI_FLASH_STMICRO=y
-CONFIG_SPI_FLASH_WINBOND=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_XILINX=y
-CONFIG_MII=y
-CONFIG_ZYNQ_GEM=y
-CONFIG_DEBUG_UART_ZYNQ=y
-CONFIG_ZYNQ_SERIAL=y
-CONFIG_ZYNQ_QSPI=y
-CONFIG_USB=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_ULPI_VIEWPORT=y
-CONFIG_USB_ULPI=y
-CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
-CONFIG_USB_GADGET_VENDOR_NUM=0x03fd
-CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
-CONFIG_CI_UDC=y
-CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_USB_FUNCTION_THOR=y
diff --git a/configs/zynq_zc706_defconfig b/configs/zynq_zc706_defconfig
deleted file mode 100644 (file)
index 146ef7d..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_DEBUG_UART_BASE=0xe0001000
-CONFIG_DEBUG_UART_CLOCK=50000000
-CONFIG_IDENT_STRING=" Xilinx Zynq ZC706"
-CONFIG_DEBUG_UART=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_SPL_FIT_PRINT=y
-CONFIG_SPL_LOAD_FIT=y
-CONFIG_LEGACY_IMAGE_FORMAT=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_FPGA_SUPPORT=y
-CONFIG_SPL_OS_BOOT=y
-CONFIG_SPL_SPI_LOAD=y
-CONFIG_SYS_SPI_U_BOOT_OFFS=0x100000
-# CONFIG_BOOTM_NETBSD is not set
-CONFIG_CMD_THOR_DOWNLOAD=y
-CONFIG_CMD_DFU=y
-CONFIG_CMD_FPGA_LOADBP=y
-CONFIG_CMD_FPGA_LOADFS=y
-CONFIG_CMD_FPGA_LOADMK=y
-CONFIG_CMD_FPGA_LOADP=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4_WRITE=y
-CONFIG_DEFAULT_DEVICE_TREE="zynq-zc706"
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_DFU_MMC=y
-CONFIG_DFU_RAM=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-CONFIG_DM_I2C=y
-CONFIG_SYS_I2C_CADENCE=y
-CONFIG_MISC=y
-CONFIG_I2C_EEPROM=y
-CONFIG_SYS_I2C_EEPROM_ADDR=0x0
-CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW=0x0
-CONFIG_MMC_SDHCI=y
-CONFIG_MMC_SDHCI_ZYNQ=y
-CONFIG_SF_DEFAULT_SPEED=30000000
-CONFIG_SPI_FLASH_ISSI=y
-CONFIG_SPI_FLASH_MACRONIX=y
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_SPI_FLASH_STMICRO=y
-CONFIG_SPI_FLASH_WINBOND=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_XILINX=y
-CONFIG_MII=y
-CONFIG_ZYNQ_GEM=y
-CONFIG_DEBUG_UART_ZYNQ=y
-CONFIG_DEBUG_UART_ANNOUNCE=y
-CONFIG_ZYNQ_SERIAL=y
-CONFIG_ZYNQ_QSPI=y
-CONFIG_USB=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_ULPI_VIEWPORT=y
-CONFIG_USB_ULPI=y
-CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
-CONFIG_USB_GADGET_VENDOR_NUM=0x03fd
-CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
-CONFIG_CI_UDC=y
-CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_USB_FUNCTION_THOR=y
-CONFIG_WDT=y
-CONFIG_WDT_CDNS=y
-CONFIG_SPL_GZIP=y
diff --git a/configs/zynq_zc770_xm010_defconfig b/configs/zynq_zc770_xm010_defconfig
deleted file mode 100644 (file)
index 563985f..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_DEBUG_UART_BASE=0xe0001000
-CONFIG_DEBUG_UART_CLOCK=50000000
-CONFIG_IDENT_STRING=" Xilinx Zynq ZC770 XM010"
-CONFIG_DEBUG_UART=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_LEGACY_IMAGE_FORMAT=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_OS_BOOT=y
-CONFIG_SPL_SPI_LOAD=y
-CONFIG_SYS_SPI_U_BOOT_OFFS=0x100000
-# CONFIG_BOOTM_NETBSD is not set
-CONFIG_CMD_FPGA_LOADBP=y
-CONFIG_CMD_FPGA_LOADFS=y
-CONFIG_CMD_FPGA_LOADMK=y
-CONFIG_CMD_FPGA_LOADP=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_MMC=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4_WRITE=y
-# CONFIG_SPL_DOS_PARTITION is not set
-# CONFIG_SPL_EFI_PARTITION is not set
-CONFIG_DEFAULT_DEVICE_TREE="zynq-zc770-xm010"
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-CONFIG_MMC_SDHCI=y
-CONFIG_MMC_SDHCI_ZYNQ=y
-CONFIG_SF_DEFAULT_SPEED=30000000
-CONFIG_SPI_FLASH_ISSI=y
-CONFIG_SPI_FLASH_MACRONIX=y
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_SPI_FLASH_STMICRO=y
-CONFIG_SPI_FLASH_SST=y
-CONFIG_SPI_FLASH_WINBOND=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_XILINX=y
-CONFIG_MII=y
-CONFIG_ZYNQ_GEM=y
-CONFIG_DEBUG_UART_ZYNQ=y
-CONFIG_ZYNQ_SERIAL=y
-CONFIG_ZYNQ_SPI=y
-CONFIG_ZYNQ_QSPI=y
diff --git a/configs/zynq_zc770_xm011_defconfig b/configs/zynq_zc770_xm011_defconfig
deleted file mode 100644 (file)
index d64f3d0..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_DEBUG_UART_BASE=0xe0001000
-CONFIG_DEBUG_UART_CLOCK=50000000
-CONFIG_IDENT_STRING=" Xilinx Zynq ZC770 XM011"
-# CONFIG_SPL_FS_FAT is not set
-CONFIG_DEBUG_UART=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_LEGACY_IMAGE_FORMAT=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_OS_BOOT=y
-# CONFIG_BOOTM_NETBSD is not set
-# CONFIG_CMD_FLASH is not set
-CONFIG_CMD_FPGA_LOADBP=y
-CONFIG_CMD_FPGA_LOADFS=y
-CONFIG_CMD_FPGA_LOADMK=y
-CONFIG_CMD_FPGA_LOADP=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_NAND_LOCK_UNLOCK=y
-# CONFIG_CMD_SETEXPR is not set
-# CONFIG_CMD_NET is not set
-CONFIG_CMD_CACHE=y
-# CONFIG_SPL_DOS_PARTITION is not set
-# CONFIG_SPL_EFI_PARTITION is not set
-CONFIG_DEFAULT_DEVICE_TREE="zynq-zc770-xm011"
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_BLK=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-# CONFIG_MMC is not set
-CONFIG_MTD=y
-CONFIG_MTD_RAW_NAND=y
-CONFIG_NAND_ZYNQ=y
-CONFIG_DEBUG_UART_ZYNQ=y
-CONFIG_DEBUG_UART_ANNOUNCE=y
-CONFIG_ZYNQ_SERIAL=y
diff --git a/configs/zynq_zc770_xm011_x16_defconfig b/configs/zynq_zc770_xm011_x16_defconfig
deleted file mode 100644 (file)
index 7720d09..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_DEBUG_UART_BASE=0xe0001000
-CONFIG_DEBUG_UART_CLOCK=50000000
-CONFIG_IDENT_STRING=" Xilinx Zynq ZC770 XM011 x16"
-# CONFIG_SPL_FS_FAT is not set
-CONFIG_DEBUG_UART=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_LEGACY_IMAGE_FORMAT=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_OS_BOOT=y
-# CONFIG_BOOTM_NETBSD is not set
-# CONFIG_CMD_FLASH is not set
-CONFIG_CMD_FPGA_LOADBP=y
-CONFIG_CMD_FPGA_LOADFS=y
-CONFIG_CMD_FPGA_LOADMK=y
-CONFIG_CMD_FPGA_LOADP=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_NAND_LOCK_UNLOCK=y
-# CONFIG_CMD_SETEXPR is not set
-# CONFIG_CMD_NET is not set
-CONFIG_CMD_CACHE=y
-# CONFIG_SPL_DOS_PARTITION is not set
-# CONFIG_SPL_EFI_PARTITION is not set
-CONFIG_DEFAULT_DEVICE_TREE="zynq-zc770-xm011-x16"
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_BLK=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-# CONFIG_MMC is not set
-CONFIG_MTD=y
-CONFIG_MTD_RAW_NAND=y
-CONFIG_NAND_ZYNQ=y
-CONFIG_DEBUG_UART_ZYNQ=y
-CONFIG_DEBUG_UART_ANNOUNCE=y
-CONFIG_ZYNQ_SERIAL=y
diff --git a/configs/zynq_zc770_xm012_defconfig b/configs/zynq_zc770_xm012_defconfig
deleted file mode 100644 (file)
index f40a496..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_IDENT_STRING=" Xilinx Zynq ZC770 XM012"
-# CONFIG_SPL_FS_FAT is not set
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_LEGACY_IMAGE_FORMAT=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_OS_BOOT=y
-# CONFIG_BOOTM_NETBSD is not set
-CONFIG_CMD_IMLS=y
-CONFIG_CMD_FPGA_LOADBP=y
-CONFIG_CMD_FPGA_LOADFS=y
-CONFIG_CMD_FPGA_LOADMK=y
-CONFIG_CMD_FPGA_LOADP=y
-CONFIG_CMD_GPIO=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_CACHE=y
-# CONFIG_SPL_DOS_PARTITION is not set
-# CONFIG_SPL_EFI_PARTITION is not set
-CONFIG_DEFAULT_DEVICE_TREE="zynq-zc770-xm012"
-CONFIG_ENV_IS_IN_FLASH=y
-CONFIG_ENV_ADDR=0xE20E0000
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_BLK=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-# CONFIG_MMC is not set
-CONFIG_MTD_NOR_FLASH=y
-CONFIG_FLASH_CFI_DRIVER=y
-CONFIG_SYS_FLASH_USE_BUFFER_WRITE=y
-CONFIG_SYS_FLASH_CFI=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_XILINX=y
-CONFIG_MII=y
-CONFIG_ZYNQ_GEM=y
-CONFIG_ZYNQ_SERIAL=y
diff --git a/configs/zynq_zc770_xm013_defconfig b/configs/zynq_zc770_xm013_defconfig
deleted file mode 100644 (file)
index 3b73f44..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_IDENT_STRING=" Xilinx Zynq ZC770 XM013"
-# CONFIG_SPL_FS_FAT is not set
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_LEGACY_IMAGE_FORMAT=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_OS_BOOT=y
-CONFIG_SPL_SPI_LOAD=y
-CONFIG_SYS_SPI_U_BOOT_OFFS=0x100000
-# CONFIG_BOOTM_NETBSD is not set
-CONFIG_CMD_FPGA_LOADBP=y
-CONFIG_CMD_FPGA_LOADFS=y
-CONFIG_CMD_FPGA_LOADMK=y
-CONFIG_CMD_FPGA_LOADP=y
-CONFIG_CMD_GPIO=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_CACHE=y
-# CONFIG_SPL_DOS_PARTITION is not set
-# CONFIG_SPL_EFI_PARTITION is not set
-CONFIG_DEFAULT_DEVICE_TREE="zynq-zc770-xm013"
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_BLK=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-# CONFIG_MMC is not set
-CONFIG_SF_DEFAULT_SPEED=30000000
-CONFIG_SPI_FLASH_ISSI=y
-CONFIG_SPI_FLASH_MACRONIX=y
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_SPI_FLASH_STMICRO=y
-CONFIG_SPI_FLASH_WINBOND=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_XILINX=y
-CONFIG_MII=y
-CONFIG_ZYNQ_GEM=y
-CONFIG_ZYNQ_SERIAL=y
-CONFIG_ZYNQ_QSPI=y
diff --git a/configs/zynq_zed_defconfig b/configs/zynq_zed_defconfig
deleted file mode 100644 (file)
index 18b39b5..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_DEBUG_UART_BASE=0xe0001000
-CONFIG_DEBUG_UART_CLOCK=50000000
-CONFIG_DEBUG_UART=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_LEGACY_IMAGE_FORMAT=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_OS_BOOT=y
-CONFIG_SPL_SPI_LOAD=y
-CONFIG_SYS_SPI_U_BOOT_OFFS=0x100000
-# CONFIG_BOOTM_NETBSD is not set
-CONFIG_CMD_THOR_DOWNLOAD=y
-CONFIG_CMD_DFU=y
-CONFIG_CMD_FPGA_LOADBP=y
-CONFIG_CMD_FPGA_LOADFS=y
-CONFIG_CMD_FPGA_LOADMK=y
-CONFIG_CMD_FPGA_LOADP=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4_WRITE=y
-CONFIG_DEFAULT_DEVICE_TREE="zynq-zed"
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_DFU_MMC=y
-CONFIG_DFU_RAM=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-CONFIG_MMC_SDHCI=y
-CONFIG_MMC_SDHCI_ZYNQ=y
-CONFIG_SF_DEFAULT_SPEED=30000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_SPI_FLASH_STMICRO=y
-CONFIG_SPI_FLASH_WINBOND=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_XILINX=y
-CONFIG_MII=y
-CONFIG_ZYNQ_GEM=y
-CONFIG_DEBUG_UART_ZYNQ=y
-CONFIG_ZYNQ_SERIAL=y
-CONFIG_ZYNQ_QSPI=y
-CONFIG_USB=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_ULPI_VIEWPORT=y
-CONFIG_USB_ULPI=y
-CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
-CONFIG_USB_GADGET_VENDOR_NUM=0x03fd
-CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
-CONFIG_CI_UDC=y
-CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_USB_FUNCTION_THOR=y
diff --git a/configs/zynq_zybo_defconfig b/configs/zynq_zybo_defconfig
deleted file mode 100644 (file)
index fe1c412..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_DEBUG_UART_BASE=0xe0001000
-CONFIG_DEBUG_UART_CLOCK=50000000
-CONFIG_DEBUG_UART=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_LEGACY_IMAGE_FORMAT=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_OS_BOOT=y
-CONFIG_SPL_SPI_LOAD=y
-CONFIG_SYS_SPI_U_BOOT_OFFS=0x100000
-# CONFIG_BOOTM_NETBSD is not set
-CONFIG_CMD_THOR_DOWNLOAD=y
-CONFIG_CMD_DFU=y
-CONFIG_CMD_FPGA_LOADBP=y
-CONFIG_CMD_FPGA_LOADFS=y
-CONFIG_CMD_FPGA_LOADMK=y
-CONFIG_CMD_FPGA_LOADP=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4_WRITE=y
-CONFIG_DEFAULT_DEVICE_TREE="zynq-zybo"
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_DFU_MMC=y
-CONFIG_DFU_RAM=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-CONFIG_MMC_SDHCI=y
-CONFIG_MMC_SDHCI_ZYNQ=y
-CONFIG_SF_DEFAULT_SPEED=30000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_MARVELL=y
-CONFIG_PHY_REALTEK=y
-CONFIG_PHY_XILINX=y
-CONFIG_MII=y
-CONFIG_ZYNQ_GEM=y
-CONFIG_DEBUG_UART_ZYNQ=y
-CONFIG_ZYNQ_SERIAL=y
-CONFIG_ZYNQ_QSPI=y
-CONFIG_USB=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_ULPI_VIEWPORT=y
-CONFIG_USB_ULPI=y
-CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
-CONFIG_USB_GADGET_VENDOR_NUM=0x03fd
-CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
-CONFIG_CI_UDC=y
-CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_USB_FUNCTION_THOR=y
-CONFIG_DISPLAY=y
diff --git a/configs/zynq_zybo_z7_defconfig b/configs/zynq_zybo_z7_defconfig
deleted file mode 100644 (file)
index 1dee757..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-CONFIG_ARM=y
-CONFIG_SPL_SYS_DCACHE_OFF=y
-CONFIG_ARCH_ZYNQ=y
-CONFIG_SYS_TEXT_BASE=0x4000000
-CONFIG_DM_GPIO=y
-CONFIG_SPL_STACK_R_ADDR=0x200000
-CONFIG_SPL=y
-CONFIG_DEBUG_UART_BASE=0xe0001000
-CONFIG_DEBUG_UART_CLOCK=100000000
-CONFIG_DEBUG_UART=y
-CONFIG_DISTRO_DEFAULTS=y
-CONFIG_SYS_CUSTOM_LDSCRIPT=y
-CONFIG_SYS_LDSCRIPT="arch/arm/mach-zynq/u-boot.lds"
-CONFIG_FIT=y
-CONFIG_FIT_SIGNATURE=y
-CONFIG_FIT_VERBOSE=y
-CONFIG_LEGACY_IMAGE_FORMAT=y
-CONFIG_USE_PREBOOT=y
-CONFIG_SPL_STACK_R=y
-CONFIG_SPL_OS_BOOT=y
-CONFIG_SPL_SPI_LOAD=y
-CONFIG_SYS_SPI_U_BOOT_OFFS=0x100000
-# CONFIG_BOOTM_NETBSD is not set
-CONFIG_CMD_THOR_DOWNLOAD=y
-CONFIG_CMD_DFU=y
-CONFIG_CMD_FPGA_LOADBP=y
-CONFIG_CMD_FPGA_LOADFS=y
-CONFIG_CMD_FPGA_LOADMK=y
-CONFIG_CMD_FPGA_LOADP=y
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-# CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT4_WRITE=y
-CONFIG_DEFAULT_DEVICE_TREE="zynq-zybo-z7"
-CONFIG_ENV_IS_IN_SPI_FLASH=y
-CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_SPL_DM_SEQ_ALIAS=y
-CONFIG_DFU_MMC=y
-CONFIG_DFU_RAM=y
-CONFIG_FPGA_XILINX=y
-CONFIG_FPGA_ZYNQPL=y
-CONFIG_MMC_SDHCI=y
-CONFIG_MMC_SDHCI_ZYNQ=y
-CONFIG_SF_DEFAULT_SPEED=30000000
-CONFIG_SPI_FLASH_SPANSION=y
-CONFIG_PHY_REALTEK=y
-CONFIG_MII=y
-CONFIG_ZYNQ_GEM=y
-CONFIG_DEBUG_UART_ZYNQ=y
-CONFIG_ZYNQ_SERIAL=y
-CONFIG_ZYNQ_QSPI=y
-CONFIG_USB=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_ULPI_VIEWPORT=y
-CONFIG_USB_ULPI=y
-CONFIG_USB_GADGET=y
-CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
-CONFIG_USB_GADGET_VENDOR_NUM=0x03fd
-CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
-CONFIG_CI_UDC=y
-CONFIG_USB_GADGET_DOWNLOAD=y
-CONFIG_USB_FUNCTION_THOR=y
index e577a957169b6634651d674de439ae44dda5d840..6a1c6fc552b166839752824dde1bc2c8305c4358 100644 (file)
@@ -34,6 +34,16 @@ integers can only be built on 64-bit hosts.
 Note that standalone/API support is not available at present.
 
 
+Prerequisites
+-------------
+
+Here are some packages that are worth installing if you are doing sandbox or
+tools development in U-Boot:
+
+   python3-pytest lzma lzma-alone lz4 python3 python3-virtualenv
+   libssl1.0-dev
+
+
 Basic Operation
 ---------------
 
index 1640bf910ec9064910afbdb5de64d09762e7725e..b7a0fbfd0359a1b9461c53929f9a96622edcd888 100644 (file)
@@ -25,6 +25,14 @@ It features:
  - Standard connectivity, widely inherited from the STM32 MCU family
  - Comprehensive security support
 
+Each line comes with a security option (cryptography & secure boot) and
+a Cortex-A frequency option:
+
+ - A : Cortex-A7 @ 650 MHz
+ - C : Secure Boot + HW Crypto + Cortex-A7 @ 650 MHz
+ - D : Cortex-A7 @ 800 MHz
+ - F : Secure Boot + HW Crypto + Cortex-A7 @ 800 MHz
+
 Everything is supported in Linux but U-Boot is limited to:
 
  1. UART
@@ -416,20 +424,26 @@ For STMicroelectonics board, it is retrieved in STM32MP15x OTP :
  - OTP_58[15:0] = MAC_ADDR[47:32]
 
 To program a MAC address on virgin OTP words above, you can use the fuse command
-on bank 0 to access to internal OTP:
+on bank 0 to access to internal OTP and lock them:
 
 Prerequisite: check if a MAC address isn't yet programmed in OTP
 
-1) check OTP: their value must be equal to 0
+1) check OTP: their value must be equal to 0::
+
+    STM32MP> fuse sense 0 57 2
+    Sensing bank 0:
+    Word 0x00000039: 00000000 00000000
+
+2) check environment variable::
 
-   STM32MP> fuse sense 0 57 2
-   Sensing bank 0:
-   Word 0x00000039: 00000000 00000000
+    STM32MP> env print ethaddr
+    ## Error: "ethaddr" not defined
 
-2) check environment variable
+3) check lock status of fuse 57 & 58 (at 0x39, 0=unlocked, 1=locked)::
 
-   STM32MP> env print ethaddr
-   ## Error: "ethaddr" not defined
+    STM32MP> fuse sense 0 0x10000039 2
+    Sensing bank 0:
+       Word 0x10000039: 00000000 00000000
 
 Example to set mac address "12:34:56:78:9a:bc"
 
@@ -443,11 +457,19 @@ Example to set mac address "12:34:56:78:9a:bc"
     Sensing bank 0:
     Word 0x00000039: 78563412 0000bc9a
 
-3) next REBOOT, in the trace::
+3) Lock OTP::
+
+    STM32MP> fuse prog 0 0x10000039 1 1
+
+    STM32MP> fuse sense 0 0x10000039 2
+    Sensing bank 0:
+       Word 0x10000039: 00000001 00000001
+
+4) next REBOOT, in the trace::
 
     ### Setting environment from OTP MAC address = "12:34:56:78:9a:bc"
 
-4) check env update::
+5) check env update::
 
     STM32MP> env print ethaddr
     ethaddr=12:34:56:78:9a:bc
index 3f0513ed362a28974eb00fc0dd791401f06691f4..6a09df1d15f8e094561e020ca684c6de6f20b2a2 100644 (file)
@@ -32,7 +32,8 @@ Building
 
 configure and build for zc702 board::
 
-   $ make zynq_zc702_config
+   $ export DEVICE_TREE=zynq-zc702
+   $ make xilinx_zynq_virt_defconfig
    $ make
 
 Bootmode
index ba56ed5dea11cf2b21e51789bb8a601829bb7e29..b06b829933746227387b4435a91f2035c191db85 100644 (file)
@@ -16,6 +16,10 @@ Optional:
    The resulting transfer speed can be adjusted by setting the delay[us]
    between gpio-toggle operations. Speed [Hz] = 1000000 / 4 * udelay[us],
    It not defined, then default is 5us (~50KHz).
+* i2c-gpio,deblock
+   Run deblocking sequence when the driver gets probed.
+* i2c-gpio,scl-output-only;
+   Set if SCL is an output only
 
 Example:
 
index ee708ce92c785f64d2b65b6e754f5c14d16b6f66..ac6a7df4327d15013b441add9df9ef5c88d52dba 100644 (file)
@@ -129,6 +129,8 @@ phyc attributes:
                MR3
 
 - st,phy-cal   : phy cal depending of calibration or tuning of DDR
+       This parameter is optional; when it is absent the built-in PHY
+       calibration is done.
        for STM32MP15x: 12 values are requested in this order
                DX0DLLCR
                DX0DQTR
diff --git a/doc/device-tree-bindings/misc/bootcounter.txt b/doc/device-tree-bindings/misc/bootcounter.txt
new file mode 100644 (file)
index 0000000..d32fbc3
--- /dev/null
@@ -0,0 +1,21 @@
+U-Boot bootcounter Devicetree Binding
+=====================================
+
+The device tree node describes the U-Boot bootcounter
+memory based device binding.
+
+Required properties :
+
+- compatible : "u-boot,bootcount";
+- single-word : set this, if you have only one word space
+    for storing the bootcounter.
+
+Example
+-------
+
+MPC83xx based board:
+
+bootcount@0x13ff8 {
+       compatible = "u-boot,bootcount";
+       reg = <0x13ff8 0x08>;
+};
diff --git a/doc/device-tree-bindings/misc/esm-k3.txt b/doc/device-tree-bindings/misc/esm-k3.txt
new file mode 100644 (file)
index 0000000..01c8b6b
--- /dev/null
@@ -0,0 +1,25 @@
+Texas Instruments K3 ESM Binding
+======================
+
+ESM (Error Signaling Module) is an IP block on TI K3 devices that allows
+handling of safety events somewhat similar to what interrupt controller
+would do. The safety signals have their separate paths within the SoC,
+and they are handled by the ESM, which routes them to the proper
+destination, which can be system reset, interrupt controller, etc. In
+the simplest configuration the signals are just routed to reset the
+SoC.
+
+Required properties :
+- compatible   : "ti,j721e-esm"
+- ti,esm-pins  : integer array of esm events IDs to route to external event
+                 pin which can be used to reset the SoC. The array can
+                 have arbitrary amount of event IDs listed on it.
+
+Example
+=======
+
+       main_esm: esm@700000 {
+               compatible = "ti,j721e-esm";
+               reg = <0x0 0x700000 0x0 0x1000>;
+               ti,esm-pins = <344>, <345>;
+       };
diff --git a/doc/device-tree-bindings/misc/esm-pmic.txt b/doc/device-tree-bindings/misc/esm-pmic.txt
new file mode 100644 (file)
index 0000000..a60ad74
--- /dev/null
@@ -0,0 +1,19 @@
+PMIC ESM Binding
+======================
+
+Certain Power Management ICs contain safety handling logic within them,
+allowing automatic reset of the board in case a safety error is signaled.
+For this purpose, ESM (Error Signal Monitor) is implemented within
+the PMIC running its own state machine.
+
+Required properties :
+- compatible   : "ti,tps659413-esm"
+
+Example
+=======
+
+&tps659413a {
+       esm: esm {
+               compatible = "ti,tps659413-esm";
+       };
+};
diff --git a/doc/device-tree-bindings/video/tilcdc/panel.txt b/doc/device-tree-bindings/video/tilcdc/panel.txt
new file mode 100644 (file)
index 0000000..8082163
--- /dev/null
@@ -0,0 +1,66 @@
+Device-Tree bindings for tilcdc DRM generic panel output driver
+
+Required properties:
+ - compatible: value should be "ti,tilcdc,panel".
+ - panel-info: configuration info to configure LCDC correctly for the panel
+   - ac-bias: AC Bias Pin Frequency
+   - ac-bias-intrpt: AC Bias Pin Transitions per Interrupt
+   - dma-burst-sz: DMA burst size
+   - bpp: Bits per pixel
+   - fdd: FIFO DMA Request Delay
+   - sync-edge: Horizontal and Vertical Sync Edge: 0=rising 1=falling
+   - sync-ctrl: Horizontal and Vertical Sync: Control: 0=ignore
+   - raster-order: Raster Data Order Select: 1=Most-to-least 0=Least-to-most
+   - fifo-th: DMA FIFO threshold
+ - display-timings: typical videomode of lcd panel.  Multiple video modes
+   can be listed if the panel supports multiple timings, but the 'native-mode'
+   should be the preferred/default resolution.  Refer to
+   Documentation/devicetree/bindings/display/panel/display-timing.txt for display
+   timing binding details.
+
+Optional properties:
+- backlight: phandle of the backlight device attached to the panel
+- enable-gpios: GPIO pin to enable or disable the panel
+
+Recommended properties:
+ - pinctrl-names, pinctrl-0: the pincontrol settings to configure
+   muxing properly for pins that connect to TFP410 device
+
+Example:
+
+       /* Settings for CDTech_S035Q01 / LCD3 cape: */
+       lcd3 {
+               compatible = "ti,tilcdc,panel";
+               pinctrl-names = "default";
+               pinctrl-0 = <&bone_lcd3_cape_lcd_pins>;
+               backlight = <&backlight>;
+               enable-gpios = <&gpio3 19 0>;
+
+               panel-info {
+                       ac-bias           = <255>;
+                       ac-bias-intrpt    = <0>;
+                       dma-burst-sz      = <16>;
+                       bpp               = <16>;
+                       fdd               = <0x80>;
+                       sync-edge         = <0>;
+                       sync-ctrl         = <1>;
+                       raster-order      = <0>;
+                       fifo-th           = <0>;
+               };
+               display-timings {
+                       native-mode = <&timing0>;
+                       timing0: 320x240 {
+                               hactive         = <320>;
+                               vactive         = <240>;
+                               hback-porch     = <21>;
+                               hfront-porch    = <58>;
+                               hsync-len       = <47>;
+                               vback-porch     = <11>;
+                               vfront-porch    = <23>;
+                               vsync-len       = <2>;
+                               clock-frequency = <8000000>;
+                               hsync-active    = <0>;
+                               vsync-active    = <0>;
+                       };
+               };
+       };
diff --git a/doc/device-tree-bindings/video/tilcdc/tilcdc.txt b/doc/device-tree-bindings/video/tilcdc/tilcdc.txt
new file mode 100644 (file)
index 0000000..7bf1bb4
--- /dev/null
@@ -0,0 +1,82 @@
+Device-Tree bindings for tilcdc DRM driver
+
+Required properties:
+ - compatible: value should be one of the following:
+    - "ti,am33xx-tilcdc" for AM335x based boards
+    - "ti,da850-tilcdc" for DA850/AM18x/OMAP-L138 based boards
+ - interrupts: the interrupt number
+ - reg: base address and size of the LCDC device
+
+Recommended properties:
+ - ti,hwmods: Name of the hwmod associated to the LCDC
+
+Optional properties:
+ - max-bandwidth: The maximum pixels per second that the memory
+   interface / lcd controller combination can sustain
+ - max-width: The maximum horizontal pixel width supported by
+   the lcd controller.
+ - max-pixelclock: The maximum pixel clock that can be supported
+   by the lcd controller in KHz.
+ - blue-and-red-wiring: Recognized values "straight" or "crossed".
+   This property deals with the LCDC revision 2 (found on AM335x)
+   color errata [1].
+    - "straight" indicates normal wiring that supports RGB565,
+      BGR888, and XBGR8888 color formats.
+    - "crossed" indicates wiring that has blue and red wires
+      crossed. This setup supports BGR565, RGB888 and XRGB8888
+      formats.
+    - If the property is not present or its value is not recognized
+      the legacy mode is assumed. This configuration supports RGB565,
+      RGB888 and XRGB8888 formats. However, depending on wiring, the red
+      and blue colors are swapped in either 16 or 24-bit color modes.
+
+Optional nodes:
+
+ - port/ports: to describe a connection to an external encoder. The
+   binding follows Documentation/devicetree/bindings/graph.txt and
+   supports a single port with a single endpoint.
+
+ - See also Documentation/devicetree/bindings/display/tilcdc/panel.txt and
+   Documentation/devicetree/bindings/display/tilcdc/tfp410.txt for connecting
+   tfp410 DVI encoder or lcd panel to lcdc
+
+[1] There is an errata about AM335x color wiring. For 16-bit color mode
+    the wires work as they should (LCD_DATA[0:4] is for Blue[3:7]),
+    but for 24 bit color modes the wiring of blue and red components is
+    crossed and LCD_DATA[0:4] is for Red[3:7] and LCD_DATA[11:15] is
+    for Blue[3-7]. For more details see section 3.1.1 in AM335x
+    Silicon Errata:
+    http://www.ti.com/general/docs/lit/getliterature.tsp?baseLiteratureNumber=sprz360
+
+Example:
+
+       fb: fb@4830e000 {
+               compatible = "ti,am33xx-tilcdc", "ti,da850-tilcdc";
+               reg = <0x4830e000 0x1000>;
+               interrupt-parent = <&intc>;
+               interrupts = <36>;
+               ti,hwmods = "lcdc";
+
+               blue-and-red-wiring = "crossed";
+
+               port {
+                       lcdc_0: endpoint@0 {
+                               remote-endpoint = <&hdmi_0>;
+                       };
+               };
+       };
+
+       tda19988: tda19988 {
+               compatible = "nxp,tda998x";
+               reg = <0x70>;
+
+               pinctrl-names = "default", "off";
+               pinctrl-0 = <&nxp_hdmi_bonelt_pins>;
+               pinctrl-1 = <&nxp_hdmi_bonelt_off_pins>;
+
+               port {
+                       hdmi_0: endpoint@0 {
+                               remote-endpoint = <&lcdc_0>;
+                       };
+               };
+       };
index 23501fd743884d6cd934393d8c558365ffe6bb71..420875042896a724ebe17319c778275811e182f2 100644 (file)
@@ -107,7 +107,6 @@ obj-y += reset/
 obj-y += input/
 # SOC specific infrastructure drivers.
 obj-y += smem/
-obj-y += soc/
 obj-y += thermal/
 obj-$(CONFIG_TEE) += tee/
 obj-y += axi/
@@ -119,3 +118,5 @@ obj-$(CONFIG_MACH_PIC32) += ddr/microchip/
 obj-$(CONFIG_DM_HWSPINLOCK) += hwspinlock/
 obj-$(CONFIG_DM_RNG) += rng/
 endif
+
+obj-y += soc/
index 0e506c9ea2a8021f07b03af72ed64eea31332b58..0356f8ba1815edfe01dba33ad2229019aea2adfd 100644 (file)
@@ -106,6 +106,13 @@ config DM_BOOTCOUNT_I2C_EEPROM
          pointing to the underlying i2c eeprom device) and an optional 'offset'
          property are supported.
 
+config BOOTCOUNT_MEM
+       bool "Support memory based bootcounter"
+       help
+         Enabling Memory based bootcount, typically in a SoC register which
+         is not cleared on softreset.
+         compatible = "u-boot,bootcount";
+
 endmenu
 
 endif
index 73ccfb5a08889b54c31494810568bf3f310e9a06..059d40d16b0c72acaddf231a06f05b83dfbb46b5 100644 (file)
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0+
 
 obj-$(CONFIG_BOOTCOUNT_GENERIC)        += bootcount.o
+obj-$(CONFIG_BOOTCOUNT_MEM)    += bootcount.o
 obj-$(CONFIG_BOOTCOUNT_AT91)   += bootcount_at91.o
 obj-$(CONFIG_BOOTCOUNT_AM33XX) += bootcount_davinci.o
 obj-$(CONFIG_BOOTCOUNT_RAM)    += bootcount_ram.o
index 7a6d03dcca3b8268ddf84b70c8da588c96a22486..655dfaf59c48a3a1259978ed9cac3b2a007ca332 100644 (file)
@@ -8,6 +8,7 @@
 #include <cpu_func.h>
 #include <linux/compiler.h>
 
+#if !defined(CONFIG_DM_BOOTCOUNT)
 /* Now implement the generic default functions */
 __weak void bootcount_store(ulong a)
 {
@@ -49,3 +50,94 @@ __weak ulong bootcount_load(void)
                return raw_bootcount_load(reg);
 #endif /* defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) */
 }
+#else
+#include <dm.h>
+
+/*
+ * struct bootcount_mem_priv - private bootcount mem driver data
+ *
+ * @base: base address used for bootcounter
+ * @singleword: if true use only one 32 bit word for bootcounter
+ */
+struct bootcount_mem_priv {
+       phys_addr_t base;
+       bool singleword;
+};
+
+static int bootcount_mem_get(struct udevice *dev, u32 *a)
+{
+       struct bootcount_mem_priv *priv = dev_get_priv(dev);
+       void *reg = (void *)priv->base;
+       u32 magic = CONFIG_SYS_BOOTCOUNT_MAGIC;
+
+       if (priv->singleword) {
+               u32 tmp = raw_bootcount_load(reg);
+
+               if ((tmp & 0xffff0000) != (magic & 0xffff0000))
+                       return -ENODEV;
+
+               *a = (tmp & 0x0000ffff);
+       } else {
+               if (raw_bootcount_load(reg + 4) != magic)
+                       return -ENODEV;
+
+               *a = raw_bootcount_load(reg);
+       }
+
+       return 0;
+};
+
+static int bootcount_mem_set(struct udevice *dev, const u32 a)
+{
+       struct bootcount_mem_priv *priv = dev_get_priv(dev);
+       void *reg = (void *)priv->base;
+       u32 magic = CONFIG_SYS_BOOTCOUNT_MAGIC;
+       uintptr_t flush_start = rounddown(priv->base,
+                                         CONFIG_SYS_CACHELINE_SIZE);
+       uintptr_t flush_end;
+
+       if (priv->singleword) {
+               raw_bootcount_store(reg, (magic & 0xffff0000) | a);
+               flush_end = roundup(priv->base + 4,
+                                   CONFIG_SYS_CACHELINE_SIZE);
+       } else {
+               raw_bootcount_store(reg, a);
+               raw_bootcount_store(reg + 4, magic);
+               flush_end = roundup(priv->base + 8,
+                                   CONFIG_SYS_CACHELINE_SIZE);
+       }
+       flush_dcache_range(flush_start, flush_end);
+
+       return 0;
+};
+
+static const struct bootcount_ops bootcount_mem_ops = {
+       .get = bootcount_mem_get,
+       .set = bootcount_mem_set,
+};
+
+static int bootcount_mem_probe(struct udevice *dev)
+{
+       struct bootcount_mem_priv *priv = dev_get_priv(dev);
+
+       priv->base = (phys_addr_t)dev_read_addr(dev);
+       if (dev_read_bool(dev, "single-word"))
+               priv->singleword = true;
+
+       return 0;
+}
+
+static const struct udevice_id bootcount_mem_ids[] = {
+       { .compatible = "u-boot,bootcount" },
+       { }
+};
+
+U_BOOT_DRIVER(bootcount_mem) = {
+       .name   = "bootcount-mem",
+       .id     = UCLASS_BOOTCOUNT,
+       .priv_auto_alloc_size = sizeof(struct bootcount_mem_priv),
+       .probe  = bootcount_mem_probe,
+       .of_match = bootcount_mem_ids,
+       .ops    = &bootcount_mem_ops,
+};
+#endif
index fd8c821e48b0bf60dc827cc35e82a97aeffb2729..52bd8e96f3e54a9bcc3e8fdf078167574170629d 100644 (file)
@@ -95,6 +95,7 @@ DECLARE_GLOBAL_DATA_PTR;
 #define RCC_I2C12CKSELR                0x8C0
 #define RCC_I2C35CKSELR                0x8C4
 #define RCC_SPI2S1CKSELR       0x8D8
+#define RCC_SPI45CKSELR                0x8E0
 #define RCC_UART6CKSELR                0x8E4
 #define RCC_UART24CKSELR       0x8E8
 #define RCC_UART35CKSELR       0x8EC
@@ -304,6 +305,7 @@ enum stm32mp1_parent_sel {
        _DSI_SEL,
        _ADC12_SEL,
        _SPI1_SEL,
+       _SPI45_SEL,
        _RTC_SEL,
        _PARENT_SEL_NB,
        _UNKNOWN_SEL = 0xff,
@@ -527,6 +529,7 @@ static const struct stm32mp1_clk_gate stm32mp1_clk_gate[] = {
        STM32MP1_CLK_SET_CLR(RCC_MP_APB1ENSETR, 24, I2C5_K, _I2C35_SEL),
 
        STM32MP1_CLK_SET_CLR(RCC_MP_APB2ENSETR, 8, SPI1_K, _SPI1_SEL),
+       STM32MP1_CLK_SET_CLR(RCC_MP_APB2ENSETR, 10, SPI5_K, _SPI45_SEL),
        STM32MP1_CLK_SET_CLR(RCC_MP_APB2ENSETR, 13, USART6_K, _UART6_SEL),
 
        STM32MP1_CLK_SET_CLR_F(RCC_MP_APB3ENSETR, 13, VREF, _PCLK3),
@@ -603,6 +606,8 @@ static const u8 dsi_parents[] = {_DSI_PHY, _PLL4_P};
 static const u8 adc_parents[] = {_PLL4_R, _CK_PER, _PLL3_Q};
 static const u8 spi_parents[] = {_PLL4_P, _PLL3_Q, _I2S_CKIN, _CK_PER,
                                 _PLL3_R};
+static const u8 spi45_parents[] = {_PCLK2, _PLL4_Q, _HSI_KER, _CSI_KER,
+                                  _HSE_KER};
 static const u8 rtc_parents[] = {_UNKNOWN_ID, _LSE, _LSI, _HSE};
 
 static const struct stm32mp1_clk_sel stm32mp1_clk_sel[_PARENT_SEL_NB] = {
@@ -621,14 +626,15 @@ static const struct stm32mp1_clk_sel stm32mp1_clk_sel[_PARENT_SEL_NB] = {
        STM32MP1_CLK_PARENT(_SDMMC3_SEL, RCC_SDMMC3CKSELR, 0, 0x7,
                            sdmmc3_parents),
        STM32MP1_CLK_PARENT(_ETH_SEL, RCC_ETHCKSELR, 0, 0x3, eth_parents),
-       STM32MP1_CLK_PARENT(_QSPI_SEL, RCC_QSPICKSELR, 0, 0xf, qspi_parents),
-       STM32MP1_CLK_PARENT(_FMC_SEL, RCC_FMCCKSELR, 0, 0xf, fmc_parents),
+       STM32MP1_CLK_PARENT(_QSPI_SEL, RCC_QSPICKSELR, 0, 0x3, qspi_parents),
+       STM32MP1_CLK_PARENT(_FMC_SEL, RCC_FMCCKSELR, 0, 0x3, fmc_parents),
        STM32MP1_CLK_PARENT(_USBPHY_SEL, RCC_USBCKSELR, 0, 0x3, usbphy_parents),
        STM32MP1_CLK_PARENT(_USBO_SEL, RCC_USBCKSELR, 4, 0x1, usbo_parents),
        STM32MP1_CLK_PARENT(_STGEN_SEL, RCC_STGENCKSELR, 0, 0x3, stgen_parents),
        STM32MP1_CLK_PARENT(_DSI_SEL, RCC_DSICKSELR, 0, 0x1, dsi_parents),
-       STM32MP1_CLK_PARENT(_ADC12_SEL, RCC_ADCCKSELR, 0, 0x1, adc_parents),
+       STM32MP1_CLK_PARENT(_ADC12_SEL, RCC_ADCCKSELR, 0, 0x3, adc_parents),
        STM32MP1_CLK_PARENT(_SPI1_SEL, RCC_SPI2S1CKSELR, 0, 0x7, spi_parents),
+       STM32MP1_CLK_PARENT(_SPI45_SEL, RCC_SPI45CKSELR, 0, 0x7, spi45_parents),
        STM32MP1_CLK_PARENT(_RTC_SEL, RCC_BDCR, RCC_BDCR_RTCSRC_SHIFT,
                            (RCC_BDCR_RTCSRC_MASK >> RCC_BDCR_RTCSRC_SHIFT),
                            rtc_parents),
@@ -747,6 +753,7 @@ char * const stm32mp1_clk_parent_sel_name[_PARENT_SEL_NB] = {
        [_DSI_SEL] = "DSI",
        [_ADC12_SEL] = "ADC12",
        [_SPI1_SEL] = "SPI1",
+       [_SPI45_SEL] = "SPI45",
        [_RTC_SEL] = "RTC",
 };
 
index 7035b59a13794a51e64c9739fa860dbec84d72df..4b0028d04bf6c30692e926e6f7e9b08d098e0350 100644 (file)
@@ -291,6 +291,13 @@ static int meson_clk_probe(struct udevice *dev)
        if (IS_ERR(priv->map))
                return PTR_ERR(priv->map);
 
+       /*
+        * Depending on the boot src, the state of the MMC clock might
+        * be different. Reset it to make sure we won't get stuck
+        */
+       regmap_write(priv->map, HHI_NAND_CLK_CNTL, 0);
+       regmap_write(priv->map, HHI_SD_EMMC_CLK_CNTL, 0);
+
        debug("meson-clk-axg: probed\n");
 
        return 0;
index 686d94ebfe858d0f3280dbcd7e36881d945ca980..c1976aa1efb15644f7611fa709c462e4b8c4b0ca 100644 (file)
@@ -804,6 +804,7 @@ static ulong meson_clk_get_rate_by_id(struct clk *clk, unsigned long id)
                break;
        case CLKID_PCIE_PLL:
                rate = meson_pcie_pll_get_rate(clk);
+               break;
        case CLKID_VPU_0:
                rate = meson_div_get_rate(clk, CLKID_VPU_0_DIV);
                break;
@@ -977,6 +978,13 @@ static int meson_clk_probe(struct udevice *dev)
        if (IS_ERR(priv->map))
                return PTR_ERR(priv->map);
 
+       /*
+        * Depending on the boot src, the state of the MMC clock might
+        * be different. Reset it to make sure we won't get stuck
+        */
+       regmap_write(priv->map, HHI_NAND_CLK_CNTL, 0);
+       regmap_write(priv->map, HHI_SD_EMMC_CLK_CNTL, 0);
+
        debug("meson-clk-g12a: probed\n");
 
        return 0;
index e781e08d9d5d92d4ec3760fbfb1bf574dd102350..5ef4dd794d5210684d2ab89b5dfb7696783d6be2 100644 (file)
@@ -887,6 +887,13 @@ static int meson_clk_probe(struct udevice *dev)
        if (IS_ERR(priv->map))
                return PTR_ERR(priv->map);
 
+       /*
+        * Depending on the boot src, the state of the MMC clock might
+        * be different. Reset it to make sure we won't get stuck
+        */
+       regmap_write(priv->map, HHI_NAND_CLK_CNTL, 0);
+       regmap_write(priv->map, HHI_SD_EMMC_CLK_CNTL, 0);
+
        debug("meson-clk: probed\n");
 
        return 0;
index 952b296dd8f7a18edd023b6d9a3bc816d21297f4..a9b085db8c2e3e237755e6c6b661eaf4424af319 100644 (file)
@@ -370,8 +370,6 @@ step2:
        debug("Setting DEBUG_3[21] to 0x%08x\n", in_be32(&ddr->debug[2]));
 
 #endif /* part 1 of the workaound */
-       /* Always start in self-refresh, clear after MEM_EN */
-       setbits_be32(&ddr->sdram_cfg_2, SDRAM_CFG2_FRC_SR);
 
        /*
         * 500 painful micro-seconds must elapse between
@@ -384,6 +382,8 @@ step2:
 
 #ifdef CONFIG_DEEP_SLEEP
        if (is_warm_boot()) {
+               /* enter self-refresh */
+               setbits_be32(&ddr->sdram_cfg_2, SDRAM_CFG2_FRC_SR);
                /* do board specific memory setup */
                board_mem_sleep_setup();
                temp_sdram_cfg = (in_be32(&ddr->sdram_cfg) | SDRAM_CFG_BI);
@@ -395,10 +395,6 @@ step2:
        out_be32(&ddr->sdram_cfg, temp_sdram_cfg | SDRAM_CFG_MEM_EN);
        asm volatile("sync;isync");
 
-       /* Exit self-refresh after DDR conf as some ddr memories can fail. */
-       clrbits_be32(&ddr->sdram_cfg_2, SDRAM_CFG2_FRC_SR);
-       asm volatile("sync;isync");
-
        total_gb_size_per_controller = 0;
        for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
                if (!(regs->cs[i].config & 0x80000000))
@@ -548,4 +544,9 @@ step2:
                clrbits_be32(&ddr->sdram_cfg, 0x2);
        }
 #endif /* CONFIG_SYS_FSL_ERRATUM_DDR111_DDR134 */
+#ifdef CONFIG_DEEP_SLEEP
+       if (is_warm_boot())
+               /* exit self-refresh */
+               clrbits_be32(&ddr->sdram_cfg_2, SDRAM_CFG2_FRC_SR);
+#endif
 }
index e587f1fcb2b47c5763d3ef9cb91a21adece11c8b..a0e536ae5e975eeb0c6490eb0de27ff080dbf51e 100644 (file)
@@ -938,7 +938,9 @@ static int udma_alloc_rchan_sci_req(struct udma_chan *uc)
 
        req.valid_params = TI_SCI_MSG_VALUE_RM_UDMAP_CH_FETCH_SIZE_VALID |
                        TI_SCI_MSG_VALUE_RM_UDMAP_CH_CQ_QNUM_VALID |
-                       TI_SCI_MSG_VALUE_RM_UDMAP_CH_CHAN_TYPE_VALID;
+                       TI_SCI_MSG_VALUE_RM_UDMAP_CH_CHAN_TYPE_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_START_VALID |
+                       TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_CNT_VALID;
        req.nav_id = tisci_rm->tisci_dev_id;
        req.index = uc->rchan->id;
        req.rx_chan_type = mode;
@@ -954,9 +956,6 @@ static int udma_alloc_rchan_sci_req(struct udma_chan *uc)
        if (uc->rflow->id != uc->rchan->id && uc->dir != DMA_MEM_TO_MEM) {
                req.flowid_start = uc->rflow->id;
                req.flowid_cnt = 1;
-               req.valid_params |=
-                       TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_START_VALID |
-                       TI_SCI_MSG_VALUE_RM_UDMAP_CH_RX_FLOWID_CNT_VALID;
        }
 
        ret = tisci_rm->tisci_udmap_ops->rx_ch_cfg(tisci_rm->tisci, &req);
index 2a2aa2f4f169f4c878673de02a889448a23d951c..c37642569ddaf27453ab21a63068dd56d78002e9 100644 (file)
@@ -51,7 +51,7 @@ static int ipi_req(const u32 *req, size_t req_len, u32 *res, size_t res_maxlen)
 
 static int send_req(const u32 *req, size_t req_len, u32 *res, size_t res_maxlen)
 {
-       if (IS_ENABLED(CONFIG_SPL_BUILD))
+       if (IS_ENABLED(CONFIG_SPL_BUILD) || current_el() == 3)
                return ipi_req(req, req_len, res, res_maxlen);
 
        return xilinx_pm_request(req[0], 0, 0, 0, 0, res);
index 99b2e5dfed41ef03c74b49a42ff5fc1fc835e299..c3f95b252f24f3969d7cf5838e6304f7fe36c805 100644 (file)
@@ -2364,82 +2364,6 @@ fail:
        return ret;
 }
 
-/**
- * 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.
- *
- * Return: 0 if all went well, else returns appropriate error value.
- *
- * See @ti_sci_msg_rm_ring_get_cfg_req for more info.
- */
-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 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;
-       int ret = 0;
-
-       if (IS_ERR(handle))
-               return PTR_ERR(handle);
-       if (!handle)
-               return -EINVAL;
-
-       info = handle_to_ti_sci_info(handle);
-
-       xfer = ti_sci_setup_one_xfer(info, TI_SCI_MSG_RM_RING_GET_CFG,
-                                    TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
-                                    (u32 *)&req, sizeof(req), sizeof(*resp));
-       if (IS_ERR(xfer)) {
-               ret = PTR_ERR(xfer);
-               dev_err(info->dev,
-                       "RM_RA:Message get config failed(%d)\n", ret);
-               return ret;
-       }
-       req.nav_id = nav_id;
-       req.index = index;
-
-       ret = ti_sci_do_xfer(info, xfer);
-       if (ret) {
-               dev_err(info->dev, "RM_RA:Mbox get config send fail %d\n", ret);
-               goto fail;
-       }
-
-       resp = (struct ti_sci_msg_rm_ring_get_cfg_resp *)xfer->tx_message.buf;
-
-       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:
-       dev_dbg(info->dev, "RM_RA:get config ring %u ret:%d\n", index, ret);
-       return ret;
-}
-
 static int ti_sci_cmd_rm_psil_pair(const struct ti_sci_handle *handle,
                                   u32 nav_id, u32 src_thread, u32 dst_thread)
 {
@@ -2948,7 +2872,6 @@ static void ti_sci_setup_ops(struct ti_sci_info *info)
        pops->proc_shutdown_no_wait = ti_sci_cmd_proc_shutdown_no_wait;
 
        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;
index 69ff74d6a95476b75fd84e531f0246fc38655e02..24b4d1c7948a7b6ba2a4970d7f68aa3cc95c5cd3 100644 (file)
@@ -58,7 +58,6 @@
 /* NAVSS resource management */
 /* Ringacc requests */
 #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_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
 
 #define TISCI_MSG_FWL_SET              0x9000
 #define TISCI_MSG_FWL_GET              0x9001
index 0b5e70af591cbf031a7eb83a5d416f696f5cfb9d..088a6f3efb3847297761ee52a94c8e152ba5bec1 100644 (file)
@@ -203,14 +203,16 @@ static int calc_bus_speed(struct dw_i2c *priv, int speed, ulong bus_clk,
        const struct dw_scl_sda_cfg *scl_sda_cfg = NULL;
        struct i2c_regs *regs = priv->regs;
        enum i2c_speed_mode i2c_spd;
+       u32 comp_param1;
        int spk_cnt;
        int ret;
 
+       comp_param1 = readl(&regs->comp_param1);
+
        if (priv)
                scl_sda_cfg = priv->scl_sda_cfg;
        /* Allow high speed if there is no config, or the config allows it */
-       if (speed >= I2C_SPEED_HIGH_RATE &&
-           (!scl_sda_cfg || scl_sda_cfg->has_high_speed))
+       if (speed >= I2C_SPEED_HIGH_RATE)
                i2c_spd = IC_SPEED_MODE_HIGH;
        else if (speed >= I2C_SPEED_FAST_PLUS_RATE)
                i2c_spd = IC_SPEED_MODE_FAST_PLUS;
@@ -219,6 +221,13 @@ static int calc_bus_speed(struct dw_i2c *priv, int speed, ulong bus_clk,
        else
                i2c_spd = IC_SPEED_MODE_STANDARD;
 
+       /* Check is high speed possible and fall back to fast mode if not */
+       if (i2c_spd == IC_SPEED_MODE_HIGH) {
+               if ((comp_param1 & DW_IC_COMP_PARAM_1_SPEED_MODE_MASK)
+                               != DW_IC_COMP_PARAM_1_SPEED_MODE_HIGH)
+                       i2c_spd = IC_SPEED_MODE_FAST;
+       }
+
        /* Get the proper spike-suppression count based on target speed */
        if (!priv || !priv->has_spk_cnt)
                spk_cnt = 0;
@@ -231,6 +240,9 @@ static int calc_bus_speed(struct dw_i2c *priv, int speed, ulong bus_clk,
                if (i2c_spd == IC_SPEED_MODE_STANDARD) {
                        config->scl_hcnt = scl_sda_cfg->ss_hcnt;
                        config->scl_lcnt = scl_sda_cfg->ss_lcnt;
+               } else if (i2c_spd == IC_SPEED_MODE_HIGH) {
+                       config->scl_hcnt = scl_sda_cfg->hs_hcnt;
+                       config->scl_lcnt = scl_sda_cfg->hs_lcnt;
                } else {
                        config->scl_hcnt = scl_sda_cfg->fs_hcnt;
                        config->scl_lcnt = scl_sda_cfg->fs_lcnt;
@@ -274,7 +286,7 @@ static int _dw_i2c_set_bus_speed(struct dw_i2c *priv, struct i2c_regs *i2c_base,
 
        switch (config.speed_mode) {
        case IC_SPEED_MODE_HIGH:
-               cntl |= IC_CON_SPD_SS;
+               cntl |= IC_CON_SPD_HS;
                writel(config.scl_hcnt, &i2c_base->ic_hs_scl_hcnt);
                writel(config.scl_lcnt, &i2c_base->ic_hs_scl_lcnt);
                break;
index 61a882cb650dd7a7ce2cdd91e4e89683a753ccfe..7ee236193daa6b0c62b7cbf5843d5c4236272e5b 100644 (file)
@@ -138,22 +138,27 @@ struct i2c_regs {
 #define IC_STATUS_TFNF         0x0002
 #define IC_STATUS_ACT          0x0001
 
+#define DW_IC_COMP_PARAM_1_SPEED_MODE_HIGH      (BIT(2) | BIT(3))
+#define DW_IC_COMP_PARAM_1_SPEED_MODE_MASK      (BIT(2) | BIT(3))
+
 /**
  * struct dw_scl_sda_cfg - I2C timing configuration
  *
- * @has_high_speed: Support high speed (3.4Mbps)
  * @ss_hcnt: Standard speed high time in ns
  * @fs_hcnt: Fast speed high time in ns
+ * @hs_hcnt: High speed high time in ns
  * @ss_lcnt: Standard speed low time in ns
  * @fs_lcnt: Fast speed low time in ns
+ * @hs_lcnt: High speed low time in ns
  * @sda_hold: SDA hold time
  */
 struct dw_scl_sda_cfg {
-       bool has_high_speed;
        u32 ss_hcnt;
        u32 fs_hcnt;
+       u32 hs_hcnt;
        u32 ss_lcnt;
        u32 fs_lcnt;
+       u32 hs_lcnt;
        u32 sda_hold;
 };
 
index 4e8fa214739a4bee0faa963bac3717f5090a9aae..07fdd343f22c6938f421fd440789e73f7c928f6b 100644 (file)
@@ -32,23 +32,50 @@ struct i2c_gpio_bus {
        int udelay;
         /* sda, scl */
        struct gpio_desc gpios[PIN_COUNT];
+
+       int (*get_sda)(struct i2c_gpio_bus *bus);
+       void (*set_sda)(struct i2c_gpio_bus *bus, int bit);
+       void (*set_scl)(struct i2c_gpio_bus *bus, int bit);
 };
 
-static int i2c_gpio_sda_get(struct gpio_desc *sda)
+static int i2c_gpio_sda_get(struct i2c_gpio_bus *bus)
 {
+       struct gpio_desc *sda = &bus->gpios[PIN_SDA];
+
        return dm_gpio_get_value(sda);
 }
 
-static void i2c_gpio_sda_set(struct gpio_desc *sda, int bit)
+static void i2c_gpio_sda_set(struct i2c_gpio_bus *bus, int bit)
 {
+       struct gpio_desc *sda = &bus->gpios[PIN_SDA];
+
        if (bit)
                dm_gpio_set_dir_flags(sda, GPIOD_IS_IN);
        else
                dm_gpio_set_dir_flags(sda, GPIOD_IS_OUT);
 }
 
-static void i2c_gpio_scl_set(struct gpio_desc *scl, int bit)
+static void i2c_gpio_scl_set(struct i2c_gpio_bus *bus, int bit)
 {
+       struct gpio_desc *scl = &bus->gpios[PIN_SCL];
+       int count = 0;
+
+       if (bit) {
+               dm_gpio_set_dir_flags(scl, GPIOD_IS_IN);
+               while (!dm_gpio_get_value(scl) && count++ < 100000)
+                       udelay(1);
+
+               if (!dm_gpio_get_value(scl))
+                       pr_err("timeout waiting on slave to release scl\n");
+       } else {
+               dm_gpio_set_dir_flags(scl, GPIOD_IS_OUT);
+       }
+}
+
+/* variant for output only gpios which cannot support clock stretching */
+static void i2c_gpio_scl_set_output_only(struct i2c_gpio_bus *bus, int bit)
+{
+       struct gpio_desc *scl = &bus->gpios[PIN_SCL];
        ulong flags = GPIOD_IS_OUT;
 
        if (bit)
@@ -56,65 +83,60 @@ static void i2c_gpio_scl_set(struct gpio_desc *scl, int bit)
        dm_gpio_set_dir_flags(scl, flags);
 }
 
-static void i2c_gpio_write_bit(struct gpio_desc *scl, struct gpio_desc *sda,
-                              int delay, uchar bit)
+static void i2c_gpio_write_bit(struct i2c_gpio_bus *bus, int delay, uchar bit)
 {
-       i2c_gpio_scl_set(scl, 0);
+       bus->set_scl(bus, 0);
        udelay(delay);
-       i2c_gpio_sda_set(sda, bit);
+       bus->set_sda(bus, bit);
        udelay(delay);
-       i2c_gpio_scl_set(scl, 1);
+       bus->set_scl(bus, 1);
        udelay(2 * delay);
 }
 
-static int i2c_gpio_read_bit(struct gpio_desc *scl, struct gpio_desc *sda,
-                            int delay)
+static int i2c_gpio_read_bit(struct i2c_gpio_bus *bus, int delay)
 {
        int value;
 
-       i2c_gpio_scl_set(scl, 1);
+       bus->set_scl(bus, 1);
        udelay(delay);
-       value = i2c_gpio_sda_get(sda);
+       value = bus->get_sda(bus);
        udelay(delay);
-       i2c_gpio_scl_set(scl, 0);
+       bus->set_scl(bus, 0);
        udelay(2 * delay);
 
        return value;
 }
 
 /* START: High -> Low on SDA while SCL is High */
-static void i2c_gpio_send_start(struct gpio_desc *scl, struct gpio_desc *sda,
-                               int delay)
+static void i2c_gpio_send_start(struct i2c_gpio_bus *bus, int delay)
 {
        udelay(delay);
-       i2c_gpio_sda_set(sda, 1);
+       bus->set_sda(bus, 1);
        udelay(delay);
-       i2c_gpio_scl_set(scl, 1);
+       bus->set_scl(bus, 1);
        udelay(delay);
-       i2c_gpio_sda_set(sda, 0);
+       bus->set_sda(bus, 0);
        udelay(delay);
 }
 
 /* STOP: Low -> High on SDA while SCL is High */
-static void i2c_gpio_send_stop(struct gpio_desc *scl, struct gpio_desc *sda,
-                              int delay)
+static void i2c_gpio_send_stop(struct i2c_gpio_bus *bus, int delay)
 {
-       i2c_gpio_scl_set(scl, 0);
+       bus->set_scl(bus, 0);
        udelay(delay);
-       i2c_gpio_sda_set(sda, 0);
+       bus->set_sda(bus, 0);
        udelay(delay);
-       i2c_gpio_scl_set(scl, 1);
+       bus->set_scl(bus, 1);
        udelay(delay);
-       i2c_gpio_sda_set(sda, 1);
+       bus->set_sda(bus, 1);
        udelay(delay);
 }
 
 /* ack should be I2C_ACK or I2C_NOACK */
-static void i2c_gpio_send_ack(struct gpio_desc *scl, struct gpio_desc *sda,
-                             int delay, int ack)
+static void i2c_gpio_send_ack(struct i2c_gpio_bus *bus, int delay, int ack)
 {
-       i2c_gpio_write_bit(scl, sda, delay, ack);
-       i2c_gpio_scl_set(scl, 0);
+       i2c_gpio_write_bit(bus, delay, ack);
+       bus->set_scl(bus, 0);
        udelay(delay);
 }
 
@@ -123,44 +145,41 @@ static void i2c_gpio_send_ack(struct gpio_desc *scl, struct gpio_desc *sda,
  * to clock any confused device back into an idle state.  Also send a
  * <stop> at the end of the sequence for belts & suspenders.
  */
-static void i2c_gpio_send_reset(struct gpio_desc *scl, struct gpio_desc *sda,
-                               int delay)
+static void i2c_gpio_send_reset(struct i2c_gpio_bus *bus, int delay)
 {
        int j;
 
        for (j = 0; j < 9; j++)
-               i2c_gpio_write_bit(scl, sda, delay, 1);
+               i2c_gpio_write_bit(bus, delay, 1);
 
-       i2c_gpio_send_stop(scl, sda, delay);
+       i2c_gpio_send_stop(bus, delay);
 }
 
 /* Set sda high with low clock, before reading slave data */
-static void i2c_gpio_sda_high(struct gpio_desc *scl, struct gpio_desc *sda,
-                             int delay)
+static void i2c_gpio_sda_high(struct i2c_gpio_bus *bus, int delay)
 {
-       i2c_gpio_scl_set(scl, 0);
+       bus->set_scl(bus, 0);
        udelay(delay);
-       i2c_gpio_sda_set(sda, 1);
+       bus->set_sda(bus, 1);
        udelay(delay);
 }
 
 /* Send 8 bits and look for an acknowledgement */
-static int i2c_gpio_write_byte(struct gpio_desc *scl, struct gpio_desc *sda,
-                              int delay, uchar data)
+static int i2c_gpio_write_byte(struct i2c_gpio_bus *bus, int delay, uchar data)
 {
        int j;
        int nack;
 
        for (j = 0; j < 8; j++) {
-               i2c_gpio_write_bit(scl, sda, delay, data & 0x80);
+               i2c_gpio_write_bit(bus, delay, data & 0x80);
                data <<= 1;
        }
 
        udelay(delay);
 
        /* Look for an <ACK>(negative logic) and return it */
-       i2c_gpio_sda_high(scl, sda, delay);
-       nack = i2c_gpio_read_bit(scl, sda, delay);
+       i2c_gpio_sda_high(bus, delay);
+       nack = i2c_gpio_read_bit(bus, delay);
 
        return nack;    /* not a nack is an ack */
 }
@@ -169,31 +188,29 @@ static int i2c_gpio_write_byte(struct gpio_desc *scl, struct gpio_desc *sda,
  * if ack == I2C_ACK, ACK the byte so can continue reading, else
  * send I2C_NOACK to end the read.
  */
-static uchar i2c_gpio_read_byte(struct gpio_desc *scl, struct gpio_desc *sda,
-                               int delay, int ack)
+static uchar i2c_gpio_read_byte(struct i2c_gpio_bus *bus, int delay, int ack)
 {
        int  data;
        int  j;
 
-       i2c_gpio_sda_high(scl, sda, delay);
+       i2c_gpio_sda_high(bus, delay);
        data = 0;
        for (j = 0; j < 8; j++) {
                data <<= 1;
-               data |= i2c_gpio_read_bit(scl, sda, delay);
+               data |= i2c_gpio_read_bit(bus, delay);
        }
-       i2c_gpio_send_ack(scl, sda, delay, ack);
+       i2c_gpio_send_ack(bus, delay, ack);
 
        return data;
 }
 
 /* send start and the slave chip address */
-int i2c_send_slave_addr(struct gpio_desc *scl, struct gpio_desc *sda, int delay,
-                       uchar chip)
+int i2c_send_slave_addr(struct i2c_gpio_bus *bus, int delay, uchar chip)
 {
-       i2c_gpio_send_start(scl, sda, delay);
+       i2c_gpio_send_start(bus, delay);
 
-       if (i2c_gpio_write_byte(scl, sda, delay, chip)) {
-               i2c_gpio_send_stop(scl, sda, delay);
+       if (i2c_gpio_write_byte(bus, delay, chip)) {
+               i2c_gpio_send_stop(bus, delay);
                return -EIO;
        }
 
@@ -204,29 +221,27 @@ static int i2c_gpio_write_data(struct i2c_gpio_bus *bus, uchar chip,
                               uchar *buffer, int len,
                               bool end_with_repeated_start)
 {
-       struct gpio_desc *scl = &bus->gpios[PIN_SCL];
-       struct gpio_desc *sda = &bus->gpios[PIN_SDA];
        unsigned int delay = bus->udelay;
        int failures = 0;
 
        debug("%s: chip %x buffer %p len %d\n", __func__, chip, buffer, len);
 
-       if (i2c_send_slave_addr(scl, sda, delay, chip << 1)) {
+       if (i2c_send_slave_addr(bus, delay, chip << 1)) {
                debug("i2c_write, no chip responded %02X\n", chip);
                return -EIO;
        }
 
        while (len-- > 0) {
-               if (i2c_gpio_write_byte(scl, sda, delay, *buffer++))
+               if (i2c_gpio_write_byte(bus, delay, *buffer++))
                        failures++;
        }
 
        if (!end_with_repeated_start) {
-               i2c_gpio_send_stop(scl, sda, delay);
+               i2c_gpio_send_stop(bus, delay);
                return failures;
        }
 
-       if (i2c_send_slave_addr(scl, sda, delay, (chip << 1) | 0x1)) {
+       if (i2c_send_slave_addr(bus, delay, (chip << 1) | 0x1)) {
                debug("i2c_write, no chip responded %02X\n", chip);
                return -EIO;
        }
@@ -237,16 +252,14 @@ static int i2c_gpio_write_data(struct i2c_gpio_bus *bus, uchar chip,
 static int i2c_gpio_read_data(struct i2c_gpio_bus *bus, uchar chip,
                              uchar *buffer, int len)
 {
-       struct gpio_desc *scl = &bus->gpios[PIN_SCL];
-       struct gpio_desc *sda = &bus->gpios[PIN_SDA];
        unsigned int delay = bus->udelay;
 
        debug("%s: chip %x buffer: %p len %d\n", __func__, chip, buffer, len);
 
        while (len-- > 0)
-               *buffer++ = i2c_gpio_read_byte(scl, sda, delay, len == 0);
+               *buffer++ = i2c_gpio_read_byte(bus, delay, len == 0);
 
-       i2c_gpio_send_stop(scl, sda, delay);
+       i2c_gpio_send_stop(bus, delay);
 
        return 0;
 }
@@ -277,14 +290,12 @@ static int i2c_gpio_xfer(struct udevice *dev, struct i2c_msg *msg, int nmsgs)
 static int i2c_gpio_probe(struct udevice *dev, uint chip, uint chip_flags)
 {
        struct i2c_gpio_bus *bus = dev_get_priv(dev);
-       struct gpio_desc *scl = &bus->gpios[PIN_SCL];
-       struct gpio_desc *sda = &bus->gpios[PIN_SDA];
        unsigned int delay = bus->udelay;
        int ret;
 
-       i2c_gpio_send_start(scl, sda, delay);
-       ret = i2c_gpio_write_byte(scl, sda, delay, (chip << 1) | 0);
-       i2c_gpio_send_stop(scl, sda, delay);
+       i2c_gpio_send_start(bus, delay);
+       ret = i2c_gpio_write_byte(bus, delay, (chip << 1) | 0);
+       i2c_gpio_send_stop(bus, delay);
 
        debug("%s: bus: %d (%s) chip: %x flags: %x ret: %d\n",
              __func__, dev->seq, dev->name, chip, chip_flags, ret);
@@ -295,12 +306,25 @@ static int i2c_gpio_probe(struct udevice *dev, uint chip, uint chip_flags)
 static int i2c_gpio_set_bus_speed(struct udevice *dev, unsigned int speed_hz)
 {
        struct i2c_gpio_bus *bus = dev_get_priv(dev);
-       struct gpio_desc *scl = &bus->gpios[PIN_SCL];
-       struct gpio_desc *sda = &bus->gpios[PIN_SDA];
 
        bus->udelay = 1000000 / (speed_hz << 2);
 
-       i2c_gpio_send_reset(scl, sda, bus->udelay);
+       i2c_gpio_send_reset(bus, bus->udelay);
+
+       return 0;
+}
+
+static int i2c_gpio_drv_probe(struct udevice *dev)
+{
+       if (dev_read_bool(dev, "i2c-gpio,deblock")) {
+               /* @200kHz 9 clocks = 44us, 62us is ok */
+               const unsigned int DELAY_ABORT_SEQ = 62;
+               struct i2c_gpio_bus *bus = dev_get_priv(dev);
+
+               return i2c_deblock_gpio_loop(&bus->gpios[PIN_SDA],
+                                            &bus->gpios[PIN_SCL],
+                                            16, 5, DELAY_ABORT_SEQ);
+       }
 
        return 0;
 }
@@ -320,6 +344,13 @@ static int i2c_gpio_ofdata_to_platdata(struct udevice *dev)
        bus->udelay = fdtdec_get_int(blob, node, "i2c-gpio,delay-us",
                                     DEFAULT_UDELAY);
 
+       bus->get_sda = i2c_gpio_sda_get;
+       bus->set_sda = i2c_gpio_sda_set;
+       if (fdtdec_get_bool(blob, node, "i2c-gpio,scl-output-only"))
+               bus->set_scl = i2c_gpio_scl_set_output_only;
+       else
+               bus->set_scl = i2c_gpio_scl_set;
+
        return 0;
 error:
        pr_err("Can't get %s gpios! Error: %d", dev->name, ret);
@@ -341,6 +372,7 @@ U_BOOT_DRIVER(i2c_gpio) = {
        .name   = "i2c-gpio",
        .id     = UCLASS_I2C,
        .of_match = i2c_gpio_ids,
+       .probe  = i2c_gpio_drv_probe,
        .ofdata_to_platdata = i2c_gpio_ofdata_to_platdata,
        .priv_auto_alloc_size = sizeof(struct i2c_gpio_bus),
        .ops    = &i2c_gpio_ops,
index 2aa3efe8aaa01e7fa8f1b86109e917fd32056535..e9ec3885767a970cb3961705bc5221166d9e7c46 100644 (file)
@@ -501,35 +501,53 @@ static int i2c_gpio_get_pin(struct gpio_desc *pin)
        return dm_gpio_get_value(pin);
 }
 
-static int i2c_deblock_gpio_loop(struct gpio_desc *sda_pin,
-                                struct gpio_desc *scl_pin)
+int i2c_deblock_gpio_loop(struct gpio_desc *sda_pin,
+                         struct gpio_desc *scl_pin,
+                         unsigned int scl_count,
+                         unsigned int start_count,
+                         unsigned int delay)
 {
-       int counter = 9;
-       int ret = 0;
+       int i, ret = -EREMOTEIO;
 
        i2c_gpio_set_pin(sda_pin, 1);
        i2c_gpio_set_pin(scl_pin, 1);
-       udelay(5);
+       udelay(delay);
 
        /*  Toggle SCL until slave release SDA */
-       while (counter-- >= 0) {
+       while (scl_count-- >= 0) {
                i2c_gpio_set_pin(scl_pin, 1);
-               udelay(5);
+               udelay(delay);
                i2c_gpio_set_pin(scl_pin, 0);
-               udelay(5);
-               if (i2c_gpio_get_pin(sda_pin))
+               udelay(delay);
+               if (i2c_gpio_get_pin(sda_pin)) {
+                       ret = 0;
                        break;
+               }
+       }
+
+       if (!ret && start_count) {
+               for (i = 0; i < start_count; i++) {
+                       /* Send start condition */
+                       udelay(delay);
+                       i2c_gpio_set_pin(sda_pin, 1);
+                       udelay(delay);
+                       i2c_gpio_set_pin(scl_pin, 1);
+                       udelay(delay);
+                       i2c_gpio_set_pin(sda_pin, 0);
+                       udelay(delay);
+                       i2c_gpio_set_pin(scl_pin, 0);
+               }
        }
 
        /* Then, send I2C stop */
        i2c_gpio_set_pin(sda_pin, 0);
-       udelay(5);
+       udelay(delay);
 
        i2c_gpio_set_pin(scl_pin, 1);
-       udelay(5);
+       udelay(delay);
 
        i2c_gpio_set_pin(sda_pin, 1);
-       udelay(5);
+       udelay(delay);
 
        if (!i2c_gpio_get_pin(sda_pin) || !i2c_gpio_get_pin(scl_pin))
                ret = -EREMOTEIO;
@@ -561,7 +579,7 @@ static int i2c_deblock_gpio(struct udevice *bus)
                goto out_no_pinctrl;
        }
 
-       ret0 = i2c_deblock_gpio_loop(&gpios[PIN_SDA], &gpios[PIN_SCL]);
+       ret0 = i2c_deblock_gpio_loop(&gpios[PIN_SDA], &gpios[PIN_SCL], 9, 0, 5);
 
        ret = pinctrl_select_state(bus, "default");
        if (ret) {
index 7d046c1a1e62a5bedb091d08b080e810c8bfdebf..fc5c1221e1e1cff595e1c0599251136fd3c302e3 100644 (file)
@@ -7,10 +7,10 @@
 #include <clk.h>
 #include <dm.h>
 #include <i2c.h>
-#include <malloc.h>
 #include <reset.h>
 
 #include <dm/device.h>
+#include <linux/err.h>
 #include <linux/io.h>
 
 /* STM32 I2C registers */
@@ -145,7 +145,6 @@ struct stm32_i2c_spec {
 
 /**
  * struct stm32_i2c_setup - private I2C timing setup parameters
- * @speed: I2C speed mode (standard, Fast Plus)
  * @speed_freq: I2C speed frequency  (Hz)
  * @clock_src: I2C clock source frequency (Hz)
  * @rise_time: Rise time (ns)
@@ -154,7 +153,6 @@ struct stm32_i2c_spec {
  * @analog_filter: Analog filter delay (On/Off)
  */
 struct stm32_i2c_setup {
-       enum i2c_speed_mode speed;
        u32 speed_freq;
        u32 clock_src;
        u32 rise_time;
@@ -184,10 +182,11 @@ struct stm32_i2c_priv {
        struct stm32_i2c_regs *regs;
        struct clk clk;
        struct stm32_i2c_setup *setup;
-       int speed;
+       u32 speed;
 };
 
 static const struct stm32_i2c_spec i2c_specs[] = {
+       /* Standard speed - 100 KHz */
        [IC_SPEED_MODE_STANDARD] = {
                .rate = I2C_SPEED_STANDARD_RATE,
                .rate_min = 8000,
@@ -200,6 +199,7 @@ static const struct stm32_i2c_spec i2c_specs[] = {
                .l_min = 4700,
                .h_min = 4000,
        },
+       /* Fast speed - 400 KHz */
        [IC_SPEED_MODE_FAST] = {
                .rate = I2C_SPEED_FAST_RATE,
                .rate_min = 320000,
@@ -212,6 +212,7 @@ static const struct stm32_i2c_spec i2c_specs[] = {
                .l_min = 1300,
                .h_min = 600,
        },
+       /* Fast Plus Speed - 1 MHz */
        [IC_SPEED_MODE_FAST_PLUS] = {
                .rate = I2C_SPEED_FAST_PLUS_RATE,
                .rate_min = 800000,
@@ -474,6 +475,7 @@ static int stm32_i2c_xfer(struct udevice *bus, struct i2c_msg *msg,
 }
 
 static int stm32_i2c_compute_solutions(struct stm32_i2c_setup *setup,
+                                      const struct stm32_i2c_spec *specs,
                                       struct list_head *solutions)
 {
        struct stm32_i2c_timings *v;
@@ -490,13 +492,13 @@ static int stm32_i2c_compute_solutions(struct stm32_i2c_setup *setup,
        af_delay_max = setup->analog_filter ?
                       STM32_I2C_ANALOG_FILTER_DELAY_MAX : 0;
 
-       sdadel_min = i2c_specs[setup->speed].hddat_min + setup->fall_time -
+       sdadel_min = specs->hddat_min + setup->fall_time -
                     af_delay_min - (setup->dnf + 3) * i2cclk;
 
-       sdadel_max = i2c_specs[setup->speed].vddat_max - setup->rise_time -
+       sdadel_max = specs->vddat_max - setup->rise_time -
                     af_delay_max - (setup->dnf + 4) * i2cclk;
 
-       scldel_min = setup->rise_time + i2c_specs[setup->speed].sudat_min;
+       scldel_min = setup->rise_time + specs->sudat_min;
 
        if (sdadel_min < 0)
                sdadel_min = 0;
@@ -548,6 +550,7 @@ static int stm32_i2c_compute_solutions(struct stm32_i2c_setup *setup,
 }
 
 static int stm32_i2c_choose_solution(struct stm32_i2c_setup *setup,
+                                    const struct stm32_i2c_spec *specs,
                                     struct list_head *solutions,
                                     struct stm32_i2c_timings *s)
 {
@@ -570,8 +573,8 @@ static int stm32_i2c_choose_solution(struct stm32_i2c_setup *setup,
        dnf_delay = setup->dnf * i2cclk;
 
        tsync = af_delay_min + dnf_delay + (2 * i2cclk);
-       clk_max = STM32_NSEC_PER_SEC / i2c_specs[setup->speed].rate_min;
-       clk_min = STM32_NSEC_PER_SEC / i2c_specs[setup->speed].rate_max;
+       clk_max = STM32_NSEC_PER_SEC / specs->rate_min;
+       clk_min = STM32_NSEC_PER_SEC / specs->rate_max;
 
        /*
         * Among Prescaler possibilities discovered above figures out SCL Low
@@ -589,7 +592,7 @@ static int stm32_i2c_choose_solution(struct stm32_i2c_setup *setup,
                for (l = 0; l < STM32_SCLL_MAX; l++) {
                        u32 tscl_l = (l + 1) * prescaler + tsync;
 
-                       if ((tscl_l < i2c_specs[setup->speed].l_min) ||
+                       if (tscl_l < specs->l_min ||
                            (i2cclk >=
                             ((tscl_l - af_delay_min - dnf_delay) / 4))) {
                                continue;
@@ -601,7 +604,7 @@ static int stm32_i2c_choose_solution(struct stm32_i2c_setup *setup,
                                           setup->rise_time + setup->fall_time;
 
                                if ((tscl >= clk_min) && (tscl <= clk_max) &&
-                                   (tscl_h >= i2c_specs[setup->speed].h_min) &&
+                                   (tscl_h >= specs->h_min) &&
                                    (i2cclk < tscl_h)) {
                                        u32 clk_error;
 
@@ -630,26 +633,40 @@ static int stm32_i2c_choose_solution(struct stm32_i2c_setup *setup,
        return ret;
 }
 
+static const struct stm32_i2c_spec *get_specs(u32 rate)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(i2c_specs); i++)
+               if (rate <= i2c_specs[i].rate)
+                       return &i2c_specs[i];
+
+       /* NOT REACHED */
+       return ERR_PTR(-EINVAL);
+}
+
 static int stm32_i2c_compute_timing(struct stm32_i2c_priv *i2c_priv,
                                    struct stm32_i2c_setup *setup,
                                    struct stm32_i2c_timings *output)
 {
+       const struct stm32_i2c_spec *specs;
        struct stm32_i2c_timings *v, *_v;
        struct list_head solutions;
        int ret;
 
-       if (setup->speed >= ARRAY_SIZE(i2c_specs)) {
-               pr_err("%s: speed out of bound {%d/%d}\n", __func__,
-                      setup->speed, ARRAY_SIZE(i2c_specs) - 1);
+       specs = get_specs(setup->speed_freq);
+       if (specs == ERR_PTR(-EINVAL)) {
+               pr_err("%s: speed out of bound {%d}\n", __func__,
+                      setup->speed_freq);
                return -EINVAL;
        }
 
-       if ((setup->rise_time > i2c_specs[setup->speed].rise_max) ||
-           (setup->fall_time > i2c_specs[setup->speed].fall_max)) {
+       if (setup->rise_time > specs->rise_max ||
+           setup->fall_time > specs->fall_max) {
                pr_err("%s :timings out of bound Rise{%d>%d}/Fall{%d>%d}\n",
                       __func__,
-                      setup->rise_time, i2c_specs[setup->speed].rise_max,
-                      setup->fall_time, i2c_specs[setup->speed].fall_max);
+                      setup->rise_time, specs->rise_max,
+                      setup->fall_time, specs->fall_max);
                return -EINVAL;
        }
 
@@ -659,18 +676,12 @@ static int stm32_i2c_compute_timing(struct stm32_i2c_priv *i2c_priv,
                return -EINVAL;
        }
 
-       if (setup->speed_freq > i2c_specs[setup->speed].rate) {
-               pr_err("%s: Freq {%d/%d}\n", __func__,
-                      setup->speed_freq, i2c_specs[setup->speed].rate);
-               return -EINVAL;
-       }
-
        INIT_LIST_HEAD(&solutions);
-       ret = stm32_i2c_compute_solutions(setup, &solutions);
+       ret = stm32_i2c_compute_solutions(setup, specs, &solutions);
        if (ret)
                goto exit;
 
-       ret = stm32_i2c_choose_solution(setup, &solutions, output);
+       ret = stm32_i2c_choose_solution(setup, specs, &solutions, output);
        if (ret)
                goto exit;
 
@@ -689,14 +700,24 @@ exit:
        return ret;
 }
 
+static u32 get_lower_rate(u32 rate)
+{
+       int i;
+
+       for (i = ARRAY_SIZE(i2c_specs) - 1; i >= 0; i--)
+               if (rate > i2c_specs[i].rate)
+                       return i2c_specs[i].rate;
+
+       return i2c_specs[0].rate;
+}
+
 static int stm32_i2c_setup_timing(struct stm32_i2c_priv *i2c_priv,
                                  struct stm32_i2c_timings *timing)
 {
        struct stm32_i2c_setup *setup = i2c_priv->setup;
        int ret = 0;
 
-       setup->speed = i2c_priv->speed;
-       setup->speed_freq = i2c_specs[setup->speed].rate;
+       setup->speed_freq = i2c_priv->speed;
        setup->clock_src = clk_get_rate(&i2c_priv->clk);
 
        if (!setup->clock_src) {
@@ -709,13 +730,11 @@ static int stm32_i2c_setup_timing(struct stm32_i2c_priv *i2c_priv,
                if (ret) {
                        debug("%s: failed to compute I2C timings.\n",
                              __func__);
-                       if (i2c_priv->speed > IC_SPEED_MODE_STANDARD) {
-                               i2c_priv->speed--;
-                               setup->speed = i2c_priv->speed;
+                       if (setup->speed_freq > I2C_SPEED_STANDARD_RATE) {
                                setup->speed_freq =
-                                       i2c_specs[setup->speed].rate;
+                                       get_lower_rate(setup->speed_freq);
                                debug("%s: downgrade I2C Speed Freq to (%i)\n",
-                                     __func__, i2c_specs[setup->speed].rate);
+                                     __func__, setup->speed_freq);
                        } else {
                                break;
                        }
@@ -727,13 +746,15 @@ static int stm32_i2c_setup_timing(struct stm32_i2c_priv *i2c_priv,
                return ret;
        }
 
-       debug("%s: I2C Speed(%i), Freq(%i), Clk Source(%i)\n", __func__,
-             setup->speed, setup->speed_freq, setup->clock_src);
+       debug("%s: I2C Freq(%i), Clk Source(%i)\n", __func__,
+             setup->speed_freq, setup->clock_src);
        debug("%s: I2C Rise(%i) and Fall(%i) Time\n", __func__,
              setup->rise_time, setup->fall_time);
        debug("%s: I2C Analog Filter(%s), DNF(%i)\n", __func__,
              setup->analog_filter ? "On" : "Off", setup->dnf);
 
+       i2c_priv->speed = setup->speed_freq;
+
        return 0;
 }
 
@@ -773,21 +794,13 @@ static int stm32_i2c_set_bus_speed(struct udevice *bus, unsigned int speed)
 {
        struct stm32_i2c_priv *i2c_priv = dev_get_priv(bus);
 
-       switch (speed) {
-       case I2C_SPEED_STANDARD_RATE:
-               i2c_priv->speed = IC_SPEED_MODE_STANDARD;
-               break;
-       case I2C_SPEED_FAST_RATE:
-               i2c_priv->speed = IC_SPEED_MODE_FAST;
-               break;
-       case I2C_SPEED_FAST_PLUS_RATE:
-               i2c_priv->speed = IC_SPEED_MODE_FAST_PLUS;
-               break;
-       default:
+       if (speed > I2C_SPEED_FAST_PLUS_RATE) {
                debug("%s: Speed %d not supported\n", __func__, speed);
                return -EINVAL;
        }
 
+       i2c_priv->speed = speed;
+
        return stm32_i2c_hw_config(i2c_priv);
 }
 
index f18aa8f7ba930e5ae256e9c88e7cda49f5eff4a0..766402745dddb286a28f356ba3147f03b703d64f 100644 (file)
@@ -462,6 +462,11 @@ config IHS_FPGA
          gdsys devices, which supply the majority of the functionality offered
          by the devices. This driver supports both CON and CPU variants of the
          devices, depending on the device tree entry.
+config ESM_K3
+       bool "Enable K3 ESM driver"
+       depends on ARCH_K3
+       help
+         Support ESM (Error Signaling Module) on TI K3 SoCs.
 
 config MICROCHIP_FLEXCOM
        bool "Enable Microchip Flexcom driver"
@@ -481,4 +486,11 @@ config K3_AVS0
          optimized voltage from the efuse, so that it can be programmed
          to the PMIC on board.
 
+config ESM_PMIC
+       bool "Enable PMIC ESM driver"
+       depends on DM_PMIC
+       help
+         Support ESM (Error Signal Monitor) on PMIC devices. ESM is used
+         typically to reboot the board in error condition.
+
 endmenu
index 2b843de93ceb823eef41b70ef43207b7c5909387..68e0e7ad1726ac2032f23a8f3a41b44182532242 100644 (file)
@@ -72,3 +72,5 @@ obj-$(CONFIG_WINBOND_W83627) += winbond_w83627.o
 obj-$(CONFIG_JZ4780_EFUSE) += jz4780_efuse.o
 obj-$(CONFIG_MICROCHIP_FLEXCOM) += microchip_flexcom.o
 obj-$(CONFIG_K3_AVS0) += k3_avs.o
+obj-$(CONFIG_ESM_K3) += k3_esm.o
+obj-$(CONFIG_ESM_PMIC) += esm_pmic.o
diff --git a/drivers/misc/esm_pmic.c b/drivers/misc/esm_pmic.c
new file mode 100644 (file)
index 0000000..92c8d68
--- /dev/null
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * PMIC Error Signal Monitor driver
+ *
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
+ *      Tero Kristo <t-kristo@ti.com>
+ *
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <power/pmic.h>
+#include <dm/device_compat.h>
+
+#define INT_ESM_REG            0x6c
+#define INT_ESM_MASK           0x3f
+
+#define ESM_MCU_START_REG      0x8f
+
+#define ESM_MCU_START          BIT(0)
+
+#define ESM_MCU_MODE_CFG_REG   0x92
+
+#define ESM_MCU_EN             BIT(6)
+#define ESM_MCU_ENDRV          BIT(5)
+
+/**
+ * pmic_esm_probe: configures and enables PMIC ESM functionality
+ *
+ * Configures ESM PMIC support and enables it.
+ */
+static int pmic_esm_probe(struct udevice *dev)
+{
+       int ret;
+
+       ret = pmic_reg_write(dev->parent, INT_ESM_REG, INT_ESM_MASK);
+       if (ret) {
+               dev_err(dev, "clearing ESM irqs failed: %d\n", ret);
+               return ret;
+       }
+
+       ret = pmic_reg_write(dev->parent, ESM_MCU_MODE_CFG_REG,
+                            ESM_MCU_EN | ESM_MCU_ENDRV);
+       if (ret) {
+               dev_err(dev, "setting ESM mode failed: %d\n", ret);
+               return ret;
+       }
+
+       ret = pmic_reg_write(dev->parent, ESM_MCU_START_REG, ESM_MCU_START);
+       if (ret) {
+               dev_err(dev, "starting ESM failed: %d\n", ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+static const struct udevice_id pmic_esm_ids[] = {
+       { .compatible = "ti,tps659413-esm" },
+       {}
+};
+
+U_BOOT_DRIVER(pmic_esm) = {
+       .name = "esm_pmic",
+       .of_match = pmic_esm_ids,
+       .id = UCLASS_MISC,
+       .probe = pmic_esm_probe,
+};
index 6c0459dc555b7b7cd5acda62a07aa0852df5bb00..ef5f103c98ef3947f795b61ece35b2dd70bd5b7e 100644 (file)
@@ -14,7 +14,7 @@
 
 struct i2c_eeprom_drv_data {
        u32 size; /* size in bytes */
-       u32 pagewidth; /* pagesize = 2^pagewidth */
+       u32 pagesize; /* page size in bytes */
        u32 addr_offset_mask; /* bits in addr used for offset overflow */
        u32 offset_len; /* size in bytes of offset */
 };
@@ -99,13 +99,11 @@ static int i2c_eeprom_std_ofdata_to_platdata(struct udevice *dev)
        u32 pagesize;
        u32 size;
 
-       if (dev_read_u32(dev, "pagesize", &pagesize) == 0) {
+       if (dev_read_u32(dev, "pagesize", &pagesize) == 0)
                priv->pagesize = pagesize;
-       } else {
+       else
                /* 6 bit -> page size of up to 2^63 (should be sufficient) */
-               priv->pagewidth = data->pagewidth;
-               priv->pagesize = (1 << priv->pagewidth);
-       }
+               priv->pagesize = data->pagesize;
 
        if (dev_read_u32(dev, "size", &size) == 0)
                priv->size = size;
@@ -158,98 +156,98 @@ static int i2c_eeprom_std_probe(struct udevice *dev)
 
 static const struct i2c_eeprom_drv_data eeprom_data = {
        .size = 0,
-       .pagewidth = 0,
+       .pagesize = 1,
        .addr_offset_mask = 0,
        .offset_len = 1,
 };
 
 static const struct i2c_eeprom_drv_data mc24aa02e48_data = {
        .size = 256,
-       .pagewidth = 3,
+       .pagesize = 8,
        .addr_offset_mask = 0,
        .offset_len = 1,
 };
 
 static const struct i2c_eeprom_drv_data atmel24c01a_data = {
        .size = 128,
-       .pagewidth = 3,
+       .pagesize = 8,
        .addr_offset_mask = 0,
        .offset_len = 1,
 };
 
 static const struct i2c_eeprom_drv_data atmel24c02_data = {
        .size = 256,
-       .pagewidth = 3,
+       .pagesize = 8,
        .addr_offset_mask = 0,
        .offset_len = 1,
 };
 
 static const struct i2c_eeprom_drv_data atmel24c04_data = {
        .size = 512,
-       .pagewidth = 4,
+       .pagesize = 16,
        .addr_offset_mask = 0x1,
        .offset_len = 1,
 };
 
 static const struct i2c_eeprom_drv_data atmel24c08_data = {
        .size = 1024,
-       .pagewidth = 4,
+       .pagesize = 16,
        .addr_offset_mask = 0x3,
        .offset_len = 1,
 };
 
 static const struct i2c_eeprom_drv_data atmel24c08a_data = {
        .size = 1024,
-       .pagewidth = 4,
+       .pagesize = 16,
        .addr_offset_mask = 0x3,
        .offset_len = 1,
 };
 
 static const struct i2c_eeprom_drv_data atmel24c16a_data = {
        .size = 2048,
-       .pagewidth = 4,
+       .pagesize = 16,
        .addr_offset_mask = 0x7,
        .offset_len = 1,
 };
 
 static const struct i2c_eeprom_drv_data atmel24mac402_data = {
        .size = 256,
-       .pagewidth = 4,
+       .pagesize = 16,
        .addr_offset_mask = 0,
        .offset_len = 1,
 };
 
 static const struct i2c_eeprom_drv_data atmel24c32_data = {
        .size = 4096,
-       .pagewidth = 5,
+       .pagesize = 32,
        .addr_offset_mask = 0,
        .offset_len = 2,
 };
 
 static const struct i2c_eeprom_drv_data atmel24c64_data = {
        .size = 8192,
-       .pagewidth = 5,
+       .pagesize = 32,
        .addr_offset_mask = 0,
        .offset_len = 2,
 };
 
 static const struct i2c_eeprom_drv_data atmel24c128_data = {
        .size = 16384,
-       .pagewidth = 6,
+       .pagesize = 64,
        .addr_offset_mask = 0,
        .offset_len = 2,
 };
 
 static const struct i2c_eeprom_drv_data atmel24c256_data = {
        .size = 32768,
-       .pagewidth = 6,
+       .pagesize = 64,
        .addr_offset_mask = 0,
        .offset_len = 2,
 };
 
 static const struct i2c_eeprom_drv_data atmel24c512_data = {
        .size = 65536,
-       .pagewidth = 6,
+       .pagesize = 64,
        .addr_offset_mask = 0,
        .offset_len = 2,
 };
index 90df377250511166cc5c03f3f5c86dd339c4cb88..d8048e1b70b81761ebb15fa25c473df3b48a453a 100644 (file)
@@ -316,15 +316,15 @@ static struct vd_data am654_vd_data[] = {
                .opp = AM6_OPP_NOM,
                .opps = {
                        [AM6_OPP_NOM] = {
-                               .volt = 1000000,
+                               .volt = 1100000,
                                .freq = 800000000,
                        },
                        [AM6_OPP_OD] = {
-                               .volt = 1100000,
+                               .volt = 1200000,
                                .freq = 1000000000,
                        },
                        [AM6_OPP_TURBO] = {
-                               .volt = 1220000,
+                               .volt = 1240000,
                                .freq = 1100000000,
                        },
                },
@@ -336,15 +336,15 @@ static struct vd_data am654_vd_data[] = {
                .clk_id = 0, /* ARM clock */
                .opps = {
                        [AM6_OPP_NOM] = {
-                               .volt = 1000000,
+                               .volt = 1100000,
                                .freq = 800000000,
                        },
                        [AM6_OPP_OD] = {
-                               .volt = 1100000,
+                               .volt = 1200000,
                                .freq = 1000000000,
                        },
                        [AM6_OPP_TURBO] = {
-                               .volt = 1220000,
+                               .volt = 1240000,
                                .freq = 1100000000,
                        },
                },
diff --git a/drivers/misc/k3_esm.c b/drivers/misc/k3_esm.c
new file mode 100644 (file)
index 0000000..8f270f3
--- /dev/null
@@ -0,0 +1,87 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Texas Instruments' K3 Error Signalling Module driver
+ *
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
+ *      Tero Kristo <t-kristo@ti.com>
+ *
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <dm/device_compat.h>
+
+#define ESM_SFT_RST                    0x0c
+#define ESM_SFT_RST_KEY                        0x0f
+
+#define ESM_STS(i)                     (0x404 + (i) / 32 * 0x20)
+#define ESM_PIN_EN_SET_OFFSET(i)       (0x414 + (i) / 32 * 0x20)
+#define ESM_PIN_MASK(i)                        BIT((i) & 0x1f)
+
+static void esm_pin_enable(void __iomem *base, int pin)
+{
+       /* Enable event */
+       writel(ESM_PIN_MASK(pin), base + ESM_PIN_EN_SET_OFFSET(pin));
+}
+
+/**
+ * k3_esm_probe: configures ESM based on DT data
+ *
+ * Parses ESM info from device tree, and configures the module accordingly.
+ */
+static int k3_esm_probe(struct udevice *dev)
+{
+       int ret;
+       void __iomem *base;
+       int num_pins;
+       u32 *pins;
+       int i;
+
+       base = dev_remap_addr_index(dev, 0);
+       if (!base)
+               return -ENODEV;
+
+       num_pins = dev_read_size(dev, "ti,esm-pins");
+       if (num_pins < 0) {
+               dev_err(dev, "ti,esm-pins property missing or invalid: %d\n",
+                       num_pins);
+               return num_pins;
+       }
+
+       num_pins /= sizeof(u32);
+
+       pins = kmalloc(num_pins * sizeof(u32), __GFP_ZERO);
+       if (!pins)
+               return -ENOMEM;
+
+       ret = dev_read_u32_array(dev, "ti,esm-pins", pins, num_pins);
+       if (ret < 0) {
+               dev_err(dev, "failed to read ti,esm-pins property: %d\n",
+                       ret);
+               goto free_pins;
+       }
+
+       /* Clear any pending events */
+       writel(ESM_SFT_RST_KEY, base + ESM_SFT_RST);
+
+       for (i = 0; i < num_pins; i++)
+               esm_pin_enable(base, pins[i]);
+
+free_pins:
+       kfree(pins);
+       return ret;
+}
+
+static const struct udevice_id k3_esm_ids[] = {
+       { .compatible = "ti,j721e-esm" },
+       {}
+};
+
+U_BOOT_DRIVER(k3_esm) = {
+       .name = "k3_esm",
+       .of_match = k3_esm_ids,
+       .id = UCLASS_MISC,
+       .probe = k3_esm_probe,
+};
index b5f5122b1b7bb91220bd0010c4f3b5a0cb95648d..86c1a7164a93e26e378d8154c9a270634c5aa249 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include <common.h>
+#include <clk.h>
 #include <cpu_func.h>
 #include <dm.h>
 #include <fdtdec.h>
@@ -241,12 +242,23 @@ static int meson_mmc_probe(struct udevice *dev)
        struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
        struct mmc *mmc = &pdata->mmc;
        struct mmc_config *cfg = &pdata->cfg;
+       struct clk_bulk clocks;
        uint32_t val;
+       int ret;
+
 #ifdef CONFIG_PWRSEQ
        struct udevice *pwr_dev;
-       int ret;
 #endif
 
+       /* Enable the clocks feeding the MMC controller */
+       ret = clk_get_bulk(dev, &clocks);
+       if (ret)
+               return ret;
+
+       ret = clk_enable_bulk(&clocks);
+       if (ret)
+               return ret;
+
        cfg->voltages = MMC_VDD_33_34 | MMC_VDD_32_33 |
                        MMC_VDD_31_32 | MMC_VDD_165_195;
        cfg->host_caps = MMC_MODE_8BIT | MMC_MODE_4BIT |
index 28db4153f5e0b995d72084eb7b6cca790b746f92..0aea83dac0e66a8cb86f4f77296c735704be43bc 100644 (file)
@@ -1081,18 +1081,23 @@ static int zynq_nand_probe(struct udevice *dev)
        u8 set_feature[4] = {ONDIE_ECC_FEATURE_ENABLE, 0x00, 0x00, 0x00};
        unsigned long ecc_cfg;
        int ondie_ecc_enabled = 0;
-       int err = -1;
        int is_16bit_bw;
 
        smc->reg = (struct zynq_nand_smc_regs *)dev_read_addr(dev);
        of_nand = dev_read_subnode(dev, "flash@e1000000");
        if (!ofnode_valid(of_nand)) {
                printf("Failed to find nand node in dt\n");
-               goto fail;
+               return -ENODEV;
        }
+
+       if (!ofnode_is_available(of_nand)) {
+               debug("Nand node in dt disabled\n");
+               return dm_scan_fdt_dev(dev);
+       }
+
        if (ofnode_read_resource(of_nand, 0, &res)) {
                printf("Failed to get nand resource\n");
-               goto fail;
+               return -ENODEV;
        }
 
        xnand->nand_base = (void __iomem *)res.start;
@@ -1119,7 +1124,7 @@ static int zynq_nand_probe(struct udevice *dev)
        if (is_16bit_bw == NAND_BW_UNKNOWN) {
                printf("%s: Unable detect NAND based on MIO settings\n",
                       __func__);
-               goto fail;
+               return -EINVAL;
        }
 
        if (is_16bit_bw == NAND_BW_16BIT)
@@ -1130,13 +1135,13 @@ static int zynq_nand_probe(struct udevice *dev)
        /* Initialize the NAND flash interface on NAND controller */
        if (zynq_nand_init_nand_flash(mtd, nand_chip->options) < 0) {
                printf("%s: nand flash init failed\n", __func__);
-               goto fail;
+               return -EINVAL;
        }
 
        /* first scan to find the device and get the page size */
        if (nand_scan_ident(mtd, 1, NULL)) {
                printf("%s: nand_scan_ident failed\n", __func__);
-               goto fail;
+               return -EINVAL;
        }
        /* Send the command for reading device ID */
        nand_chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
@@ -1261,14 +1266,12 @@ static int zynq_nand_probe(struct udevice *dev)
        /* Second phase scan */
        if (nand_scan_tail(mtd)) {
                printf("%s: nand_scan_tail failed\n", __func__);
-               goto fail;
+               return -EINVAL;
        }
        if (nand_register(0, mtd))
-               goto fail;
+               return -EINVAL;
+
        return 0;
-fail:
-       free(xnand);
-       return err;
 }
 
 static const struct udevice_id zynq_nand_dt_ids[] = {
index 5f2f87d352c401d7fb343c3b463ba03a2948929b..a158824fc9fdefc6093ca2dd8527d042caaab9c1 100644 (file)
@@ -197,6 +197,7 @@ struct zynq_gem_priv {
        int phyaddr;
        int init;
        struct zynq_gem_regs *iobase;
+       struct zynq_gem_regs *mdiobase;
        phy_interface_t interface;
        struct phy_device *phydev;
        ofnode phy_of_node;
@@ -211,7 +212,7 @@ static int phy_setup_op(struct zynq_gem_priv *priv, u32 phy_addr, u32 regnum,
                        u32 op, u16 *data)
 {
        u32 mgtcr;
-       struct zynq_gem_regs *regs = priv->iobase;
+       struct zynq_gem_regs *regs = priv->mdiobase;
        int err;
 
        err = wait_for_bit_le32(&regs->nwsr, ZYNQ_GEM_NWSR_MDIOIDLE_MASK,
@@ -297,7 +298,7 @@ static int zynq_phy_init(struct udevice *dev)
 {
        int ret;
        struct zynq_gem_priv *priv = dev_get_priv(dev);
-       struct zynq_gem_regs *regs = priv->iobase;
+       struct zynq_gem_regs *regs_mdio = priv->mdiobase;
        const u32 supported = SUPPORTED_10baseT_Half |
                        SUPPORTED_10baseT_Full |
                        SUPPORTED_100baseT_Half |
@@ -306,7 +307,7 @@ static int zynq_phy_init(struct udevice *dev)
                        SUPPORTED_1000baseT_Full;
 
        /* Enable only MDIO bus */
-       writel(ZYNQ_GEM_NWCTRL_MDEN_MASK, &regs->nwctrl);
+       writel(ZYNQ_GEM_NWCTRL_MDEN_MASK, &regs_mdio->nwctrl);
 
        priv->phydev = phy_connect(priv->bus, priv->phyaddr, dev,
                                   priv->interface);
@@ -335,6 +336,7 @@ static int zynq_gem_init(struct udevice *dev)
        unsigned long clk_rate = 0;
        struct zynq_gem_priv *priv = dev_get_priv(dev);
        struct zynq_gem_regs *regs = priv->iobase;
+       struct zynq_gem_regs *regs_mdio = priv->mdiobase;
        struct emac_bd *dummy_tx_bd = &priv->tx_bd[TX_FREE_DESC];
        struct emac_bd *dummy_rx_bd = &priv->tx_bd[TX_FREE_DESC + 2];
 
@@ -402,7 +404,7 @@ static int zynq_gem_init(struct udevice *dev)
                writel(ZYNQ_GEM_DMACR_INIT, &regs->dmacr);
 
                /* Setup for Network Control register, MDIO, Rx and Tx enable */
-               setbits_le32(&regs->nwctrl, ZYNQ_GEM_NWCTRL_MDEN_MASK);
+               setbits_le32(&regs_mdio->nwctrl, ZYNQ_GEM_NWCTRL_MDEN_MASK);
 
                /* Disable the second priority queue */
                dummy_tx_bd->addr = 0;
@@ -578,6 +580,7 @@ static int zynq_gem_free_pkt(struct udevice *dev, uchar *packet, int length)
        struct zynq_gem_priv *priv = dev_get_priv(dev);
        struct emac_bd *current_bd = &priv->rx_bd[priv->rxbd_current];
        struct emac_bd *first_bd;
+       dma_addr_t addr;
 
        if (current_bd->status & ZYNQ_GEM_RXBUF_SOF_MASK) {
                priv->rx_first_buf = priv->rxbd_current;
@@ -592,6 +595,17 @@ static int zynq_gem_free_pkt(struct udevice *dev, uchar *packet, int length)
                first_bd->status = 0xF0000000;
        }
 
+       /* Flush the cache for the packet as well */
+#if defined(CONFIG_PHYS_64BIT)
+       addr = (dma_addr_t)((current_bd->addr & ZYNQ_GEM_RXBUF_ADD_MASK)
+               | ((dma_addr_t)current_bd->addr_hi << 32));
+#else
+       addr = current_bd->addr & ZYNQ_GEM_RXBUF_ADD_MASK;
+#endif
+       flush_dcache_range(addr, addr + roundup(PKTSIZE_ALIGN,
+                                               ARCH_DMA_MINALIGN));
+       barrier();
+
        if ((++priv->rxbd_current) >= RX_BUF)
                priv->rxbd_current = 0;
 
@@ -731,6 +745,7 @@ static int zynq_gem_ofdata_to_platdata(struct udevice *dev)
 
        pdata->iobase = (phys_addr_t)dev_read_addr(dev);
        priv->iobase = (struct zynq_gem_regs *)pdata->iobase;
+       priv->mdiobase = priv->iobase;
        /* Hardcode for now */
        priv->phyaddr = -1;
 
@@ -756,8 +771,9 @@ static int zynq_gem_ofdata_to_platdata(struct udevice *dev)
 
        priv->int_pcs = dev_read_bool(dev, "is-internal-pcspma");
 
-       printf("ZYNQ GEM: %lx, phyaddr %x, interface %s\n", (ulong)priv->iobase,
-              priv->phyaddr, phy_string_for_interface(priv->interface));
+       printf("\nZYNQ GEM: %lx, mdio bus %lx, phyaddr %d, interface %s\n",
+              (ulong)priv->iobase, (ulong)priv->mdiobase, priv->phyaddr,
+              phy_string_for_interface(priv->interface));
 
        return 0;
 }
index e8f3c950bd7f854e019de4c10d9027f0ab64df03..7b3416ae6ec8d9f3a5ebaa4eff087cdb2a1d7664 100644 (file)
@@ -59,8 +59,8 @@ static int tps65941_bind(struct udevice *dev)
        if (!children)
                printf("%s: %s - no child found\n", __func__, dev->name);
 
-       /* Always return success for this device */
-       return 0;
+       /* Probe all the child devices */
+       return dm_scan_fdt_dev(dev);
 }
 
 static struct dm_pmic_ops tps65941_ops = {
index d765a46f7c21f9b8524d24567a2a5c94f2e97b0a..11b14ae6520f911268297eb9f1dab4c11395372c 100644 (file)
@@ -639,7 +639,8 @@ void stm32mp1_refresh_disable(struct stm32mp1_ddrctl *ctl)
        start_sw_done(ctl);
        /* quasi-dynamic register update*/
        setbits_le32(&ctl->rfshctl3, DDRCTRL_RFSHCTL3_DIS_AUTO_REFRESH);
-       clrbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_POWERDOWN_EN);
+       clrbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_POWERDOWN_EN |
+                                  DDRCTRL_PWRCTL_SELFREF_EN);
        clrbits_le32(&ctl->dfimisc, DDRCTRL_DFIMISC_DFI_INIT_COMPLETE_EN);
        wait_sw_done_ack(ctl);
 }
@@ -652,6 +653,8 @@ void stm32mp1_refresh_restore(struct stm32mp1_ddrctl *ctl,
                clrbits_le32(&ctl->rfshctl3, DDRCTRL_RFSHCTL3_DIS_AUTO_REFRESH);
        if (pwrctl & DDRCTRL_PWRCTL_POWERDOWN_EN)
                setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_POWERDOWN_EN);
+       if ((pwrctl & DDRCTRL_PWRCTL_SELFREF_EN))
+               setbits_le32(&ctl->pwrctl, DDRCTRL_PWRCTL_SELFREF_EN);
        setbits_le32(&ctl->dfimisc, DDRCTRL_DFIMISC_DFI_INIT_COMPLETE_EN);
        wait_sw_done_ack(ctl);
 }
@@ -668,14 +671,34 @@ void stm32mp1_ddr_init(struct ddr_info *priv,
 {
        u32 pir;
        int ret = -EINVAL;
+       char bus_width;
+
+       switch (config->c_reg.mstr & DDRCTRL_MSTR_DATA_BUS_WIDTH_MASK) {
+       case DDRCTRL_MSTR_DATA_BUS_WIDTH_QUARTER:
+               bus_width = 8;
+               break;
+       case DDRCTRL_MSTR_DATA_BUS_WIDTH_HALF:
+               bus_width = 16;
+               break;
+       default:
+               bus_width = 32;
+               break;
+       }
+
 
        if (config->c_reg.mstr & DDRCTRL_MSTR_DDR3)
                ret = board_ddr_power_init(STM32MP_DDR3);
-       else if (config->c_reg.mstr & DDRCTRL_MSTR_LPDDR2)
-               ret = board_ddr_power_init(STM32MP_LPDDR2);
-       else if (config->c_reg.mstr & DDRCTRL_MSTR_LPDDR3)
-               ret = board_ddr_power_init(STM32MP_LPDDR3);
-
+       else if (config->c_reg.mstr & DDRCTRL_MSTR_LPDDR2) {
+               if (bus_width == 32)
+                       ret = board_ddr_power_init(STM32MP_LPDDR2_32);
+               else
+                       ret = board_ddr_power_init(STM32MP_LPDDR2_16);
+       } else if (config->c_reg.mstr & DDRCTRL_MSTR_LPDDR3) {
+               if (bus_width == 32)
+                       ret = board_ddr_power_init(STM32MP_LPDDR3_32);
+               else
+                       ret = board_ddr_power_init(STM32MP_LPDDR3_16);
+       }
        if (ret)
                panic("ddr power init failed\n");
 
@@ -746,7 +769,8 @@ start:
  */
        set_reg(priv, REGPHY_REG, &config->p_reg);
        set_reg(priv, REGPHY_TIMING, &config->p_timing);
-       set_reg(priv, REGPHY_CAL, &config->p_cal);
+       if (config->p_cal_present)
+               set_reg(priv, REGPHY_CAL, &config->p_cal);
 
        if (INTERACTIVE(STEP_PHY_INIT))
                goto start;
@@ -781,13 +805,16 @@ start:
 
        wait_operating_mode(priv, DDRCTRL_STAT_OPERATING_MODE_NORMAL);
 
-       debug("DDR DQS training : ");
+       if (config->p_cal_present) {
+               debug("DDR DQS training skipped.\n");
+       } else {
+               debug("DDR DQS training : ");
 /*  8. Disable Auto refresh and power down by setting
  *    - RFSHCTL3.dis_au_refresh = 1
  *    - PWRCTL.powerdown_en = 0
  *    - DFIMISC.dfiinit_complete_en = 0
  */
-       stm32mp1_refresh_disable(priv->ctl);
+               stm32mp1_refresh_disable(priv->ctl);
 
 /*  9. Program PUBL PGCR to enable refresh during training and rank to train
  *     not done => keep the programed value in PGCR
@@ -795,14 +822,15 @@ start:
 
 /* 10. configure PUBL PIR register to specify which training step to run */
        /* warning : RVTRN  is not supported by this PUBL */
-       stm32mp1_ddrphy_init(priv->phy, DDRPHYC_PIR_QSTRN);
+               stm32mp1_ddrphy_init(priv->phy, DDRPHYC_PIR_QSTRN);
 
 /* 11. monitor PUB PGSR.IDONE to poll cpmpletion of training sequence */
-       ddrphy_idone_wait(priv->phy);
+               ddrphy_idone_wait(priv->phy);
 
 /* 12. set back registers in step 8 to the orginal values if desidered */
-       stm32mp1_refresh_restore(priv->ctl, config->c_reg.rfshctl3,
-                                config->c_reg.pwrctl);
+               stm32mp1_refresh_restore(priv->ctl, config->c_reg.rfshctl3,
+                                        config->c_reg.pwrctl);
+       } /* if (config->p_cal_present) */
 
        /* enable uMCTL2 AXI port 0 and 1 */
        setbits_le32(&priv->ctl->pctrl_0, DDRCTRL_PCTRL_N_PORT_EN);
index 52b748f3ca210935dbbb258351df67c7828ec179..4998f0443944e2270323d64796732ece1b74ced3 100644 (file)
@@ -170,6 +170,7 @@ struct stm32mp1_ddr_config {
        struct stm32mp1_ddrphy_reg p_reg;
        struct stm32mp1_ddrphy_timing p_timing;
        struct stm32mp1_ddrphy_cal p_cal;
+       bool p_cal_present;
 };
 
 int stm32mp1_ddr_clk_enable(struct ddr_info *priv, u32 mem_speed);
index 9d33186b3a25cc7df109db3339d719b21f715b5d..afd93c518eb597754c8013b82f246b35cc415246 100644 (file)
@@ -260,6 +260,7 @@ struct stm32mp1_ddrphy {
 
 #define DDRCTRL_MRSTAT_MR_WR_BUSY              BIT(0)
 
+#define DDRCTRL_PWRCTL_SELFREF_EN              BIT(0)
 #define DDRCTRL_PWRCTL_POWERDOWN_EN            BIT(1)
 #define DDRCTRL_PWRCTL_SELFREF_SW              BIT(5)
 
index cc9b2e7c96c96e5c8fd4af70fa796cea99ebad19..805c9ddaadc3760c85a93024c9d91dfc2598aabb 100644 (file)
@@ -106,7 +106,7 @@ static void stm32mp1_do_usage(void)
                "help                       displays help\n"
                "info                       displays DDR information\n"
                "info  <param> <val>        changes DDR information\n"
-               "      with <param> = step, name, size or speed\n"
+               "      with <param> = step, name, size, speed or cal\n"
                "freq                       displays the DDR PHY frequency in kHz\n"
                "freq  <freq>               changes the DDR PHY frequency\n"
                "param [type|reg]           prints input parameters\n"
@@ -160,6 +160,7 @@ static void stm32mp1_do_info(struct ddr_info *priv,
                printf("name = %s\n", config->info.name);
                printf("size = 0x%x\n", config->info.size);
                printf("speed = %d kHz\n", config->info.speed);
+               printf("cal = %d\n", config->p_cal_present);
                return;
        }
 
@@ -208,6 +209,16 @@ static void stm32mp1_do_info(struct ddr_info *priv,
                }
                return;
        }
+       if (!strcmp(argv[1], "cal")) {
+               if (strict_strtoul(argv[2], 10, &value) < 0 ||
+                   (value != 0 && value != 1)) {
+                       printf("invalid value %s\n", argv[2]);
+               } else {
+                       config->p_cal_present = value;
+                       printf("cal = %d\n", config->p_cal_present);
+               }
+               return;
+       }
        printf("argument %s invalid\n", argv[1]);
 }
 
@@ -367,7 +378,6 @@ bool stm32mp1_ddr_interactive(void *priv,
                              enum stm32mp1_ddr_interact_step step,
                              const struct stm32mp1_ddr_config *config)
 {
-       const char *prompt = "DDR>";
        char buffer[CONFIG_SYS_CBSIZE];
        char *argv[CONFIG_SYS_MAXARGS + 1];     /* NULL terminated */
        int argc;
@@ -403,13 +413,12 @@ bool stm32mp1_ddr_interactive(void *priv,
        }
 
        printf("%d:%s\n", step, step_str[step]);
-       printf("%s\n", prompt);
 
        if (next_step > step)
                return false;
 
        while (next_step == step) {
-               cli_readline_into_buffer(prompt, buffer, 0);
+               cli_readline_into_buffer("DDR>", buffer, 0);
                argc = cli_simple_parse_line(buffer, argv);
                if (!argc)
                        continue;
index eb78f1198d727dceafb0322f9651d8ba96cf713a..b1e593f86bd6819cc4a13e1696772363149eebae 100644 (file)
@@ -65,18 +65,22 @@ static __maybe_unused int stm32mp1_ddr_setup(struct udevice *dev)
        struct clk axidcg;
        struct stm32mp1_ddr_config config;
 
-#define PARAM(x, y) \
-       { x,\
-         offsetof(struct stm32mp1_ddr_config, y),\
-         sizeof(config.y) / sizeof(u32)}
+#define PARAM(x, y, z)                                                 \
+       {       .name = x,                                              \
+               .offset = offsetof(struct stm32mp1_ddr_config, y),      \
+               .size = sizeof(config.y) / sizeof(u32),                 \
+               .present = z,                                           \
+       }
 
-#define CTL_PARAM(x) PARAM("st,ctl-"#x, c_##x)
-#define PHY_PARAM(x) PARAM("st,phy-"#x, p_##x)
+#define CTL_PARAM(x) PARAM("st,ctl-"#x, c_##x, NULL)
+#define PHY_PARAM(x) PARAM("st,phy-"#x, p_##x, NULL)
+#define PHY_PARAM_OPT(x) PARAM("st,phy-"#x, p_##x, &config.p_##x##_present)
 
        const struct {
                const char *name; /* name in DT */
                const u32 offset; /* offset in config struct */
                const u32 size;   /* size of parameters */
+               bool * const present;  /* presence indication for opt */
        } param[] = {
                CTL_PARAM(reg),
                CTL_PARAM(timing),
@@ -84,7 +88,7 @@ static __maybe_unused int stm32mp1_ddr_setup(struct udevice *dev)
                CTL_PARAM(perf),
                PHY_PARAM(reg),
                PHY_PARAM(timing),
-               PHY_PARAM(cal)
+               PHY_PARAM_OPT(cal)
        };
 
        config.info.speed = dev_read_u32_default(dev, "st,mem-speed", 0);
@@ -103,11 +107,25 @@ static __maybe_unused int stm32mp1_ddr_setup(struct udevice *dev)
                                         param[idx].size);
                debug("%s: %s[0x%x] = %d\n", __func__,
                      param[idx].name, param[idx].size, ret);
-               if (ret) {
+               if (ret &&
+                   (ret != -FDT_ERR_NOTFOUND || !param[idx].present)) {
                        pr_err("%s: Cannot read %s, error=%d\n",
                               __func__, param[idx].name, ret);
                        return -EINVAL;
                }
+               if (param[idx].present) {
+                       /* save presence of optional parameters */
+                       *param[idx].present = true;
+                       if (ret == -FDT_ERR_NOTFOUND) {
+                               *param[idx].present = false;
+#ifdef CONFIG_STM32MP1_DDR_INTERACTIVE
+                               /* reset values if used later */
+                               memset((void *)((u32)&config +
+                                               param[idx].offset),
+                                       0, param[idx].size * sizeof(u32));
+#endif
+                       }
+               }
        }
 
        ret = clk_get_by_name(dev, "axidcg", &axidcg);
index 4e1c1fab54c42e1d35c676c5b7f5e63157d41991..3013b7b6676ce8868272d04029a82ad4897a042e 100644 (file)
@@ -8,6 +8,8 @@
 #include <ram.h>
 #include <reset.h>
 #include <asm/io.h>
+#include <linux/bitops.h>
+#include <linux/iopoll.h>
 
 #include "stm32mp1_ddr_regs.h"
 #include "stm32mp1_ddr.h"
@@ -75,6 +77,133 @@ static u8 get_nb_bytes(struct stm32mp1_ddrctl *ctl)
        return nb_bytes;
 }
 
+static u8 get_nb_bank(struct stm32mp1_ddrctl *ctl)
+{
+       /* Count bank address bits */
+       u8 bits = 0;
+       u32 reg, val;
+
+       reg = readl(&ctl->addrmap1);
+       /* addrmap1.addrmap_bank_b1 */
+       val = (reg & GENMASK(5, 0)) >> 0;
+       if (val <= 31)
+               bits++;
+       /* addrmap1.addrmap_bank_b2 */
+       val = (reg & GENMASK(13, 8)) >> 8;
+       if (val <= 31)
+               bits++;
+       /* addrmap1.addrmap_bank_b3 */
+       val = (reg & GENMASK(21, 16)) >> 16;
+       if (val <= 31)
+               bits++;
+
+       return bits;
+}
+
+static u8 get_nb_col(struct stm32mp1_ddrctl *ctl)
+{
+       u8 bits;
+       u32 reg, val;
+
+       /* Count column address bits, start at 2 for b0 and b1 (fixed) */
+       bits = 2;
+
+       reg = readl(&ctl->addrmap2);
+       /* addrmap2.addrmap_col_b2 */
+       val = (reg & GENMASK(3, 0)) >> 0;
+       if (val <= 7)
+               bits++;
+       /* addrmap2.addrmap_col_b3 */
+       val = (reg & GENMASK(11, 8)) >> 8;
+       if (val <= 7)
+               bits++;
+       /* addrmap2.addrmap_col_b4 */
+       val = (reg & GENMASK(19, 16)) >> 16;
+       if (val <= 7)
+               bits++;
+       /* addrmap2.addrmap_col_b5 */
+       val = (reg & GENMASK(27, 24)) >> 24;
+       if (val <= 7)
+               bits++;
+
+       reg = readl(&ctl->addrmap3);
+       /* addrmap3.addrmap_col_b6 */
+       val = (reg & GENMASK(3, 0)) >> 0;
+       if (val <= 7)
+               bits++;
+       /* addrmap3.addrmap_col_b7 */
+       val = (reg & GENMASK(11, 8)) >> 8;
+       if (val <= 7)
+               bits++;
+       /* addrmap3.addrmap_col_b8 */
+       val = (reg & GENMASK(19, 16)) >> 16;
+       if (val <= 7)
+               bits++;
+       /* addrmap3.addrmap_col_b9 */
+       val = (reg & GENMASK(27, 24)) >> 24;
+       if (val <= 7)
+               bits++;
+
+       reg = readl(&ctl->addrmap4);
+       /* addrmap4.addrmap_col_b10 */
+       val = (reg & GENMASK(3, 0)) >> 0;
+       if (val <= 7)
+               bits++;
+       /* addrmap4.addrmap_col_b11 */
+       val = (reg & GENMASK(11, 8)) >> 8;
+       if (val <= 7)
+               bits++;
+
+       return bits;
+}
+
+static u8 get_nb_row(struct stm32mp1_ddrctl *ctl)
+{
+       /* Count row address bits */
+       u8 bits = 0;
+       u32 reg, val;
+
+       reg = readl(&ctl->addrmap5);
+       /* addrmap5.addrmap_row_b0 */
+       val = (reg & GENMASK(3, 0)) >> 0;
+       if (val <= 11)
+               bits++;
+       /* addrmap5.addrmap_row_b1 */
+       val = (reg & GENMASK(11, 8)) >> 8;
+       if (val <= 11)
+               bits++;
+       /* addrmap5.addrmap_row_b2_10 */
+       val = (reg & GENMASK(19, 16)) >> 16;
+       if (val <= 11)
+               bits += 9;
+       else
+               printf("warning: addrmap5.addrmap_row_b2_10 not supported\n");
+       /* addrmap5.addrmap_row_b11 */
+       val = (reg & GENMASK(27, 24)) >> 24;
+       if (val <= 11)
+               bits++;
+
+       reg = readl(&ctl->addrmap6);
+       /* addrmap6.addrmap_row_b12 */
+       val = (reg & GENMASK(3, 0)) >> 0;
+       if (val <= 7)
+               bits++;
+       /* addrmap6.addrmap_row_b13 */
+       val = (reg & GENMASK(11, 8)) >> 8;
+       if (val <= 7)
+               bits++;
+       /* addrmap6.addrmap_row_b14 */
+       val = (reg & GENMASK(19, 16)) >> 16;
+       if (val <= 7)
+               bits++;
+       /* addrmap6.addrmap_row_b15 */
+       val = (reg & GENMASK(27, 24)) >> 24;
+       if (val <= 7)
+               bits++;
+
+       return bits;
+}
+
 static void itm_soft_reset(struct stm32mp1_ddrphy *phy)
 {
        stm32mp1_ddrphy_init(phy, DDRPHYC_PIR_ITMSRST);
@@ -169,8 +298,13 @@ static void set_r0dgps_delay(struct stm32mp1_ddrphy *phy,
 }
 
 /* Basic BIST configuration for data lane tests. */
-static void config_BIST(struct stm32mp1_ddrphy *phy)
+static void config_BIST(struct stm32mp1_ddrctl *ctl,
+                       struct stm32mp1_ddrphy *phy)
 {
+       u8 nb_bank = get_nb_bank(ctl);
+       u8 nb_row = get_nb_row(ctl);
+       u8 nb_col = get_nb_col(ctl);
+
        /* Selects the SDRAM bank address to be used during BIST. */
        u32 bbank = 0;
        /* Selects the SDRAM row address to be used during BIST. */
@@ -190,18 +324,20 @@ static void config_BIST(struct stm32mp1_ddrphy *phy)
         * must be 0 with single rank
         */
        u32 brank = 0;
+
        /* Specifies the maximum SDRAM bank address to be used during
         * BIST before the address & increments to the next rank.
         */
-       u32 bmbank = 1;
+       u32 bmbank = (1 << nb_bank) - 1;
        /* Specifies the maximum SDRAM row address to be used during
         * BIST before the address & increments to the next bank.
         */
-       u32 bmrow = 0x7FFF; /* To check */
+       u32 bmrow = (1 << nb_row) - 1;
        /* Specifies the maximum SDRAM column address to be used during
         * BIST before the address & increments to the next row.
         */
-       u32 bmcol = 0x3FF;  /* To check */
+       u32 bmcol = (1 << nb_col) - 1;
+
        u32 bmode_conf = 0x00000001;  /* DRam mode */
        u32 bdxen_conf = 0x00000001;  /* BIST on Data byte */
        u32 bdpat_conf = 0x00000002;  /* Select LFSR pattern */
@@ -223,8 +359,6 @@ static void config_BIST(struct stm32mp1_ddrphy *phy)
 
        writel(bcol | (brow << 12) | (bbank << 28), &phy->bistar0);
        writel(brank | (bmrank << 2) | (bainc << 4), &phy->bistar1);
-
-       /* To check this line : */
        writel(bmcol | (bmrow << 12) | (bmbank << 28), &phy->bistar2);
 }
 
@@ -246,6 +380,8 @@ static void BIST_test(struct stm32mp1_ddrphy *phy, u8 byte,
        bool result = true; /* BIST_SUCCESS */
        u32 cnt = 0;
        u32 error = 0;
+       u32 val;
+       int ret;
 
        bist->test_result = true;
 
@@ -266,7 +402,7 @@ run:
                writel(rand(), &phy->bistlsr);
 
        /* some delay to reset BIST */
-       mdelay(1);
+       udelay(10);
 
        /*Perform BIST Run*/
        clrsetbits_le32(&phy->bistrr,
@@ -274,27 +410,29 @@ run:
                        0x00000001);
        /* Write BISTRR.BINST = 3?b001; */
 
-       /* Wait for a number of CTL clocks before reading BIST register*/
-       /* Wait 300 ctl_clk cycles;  ... IS it really needed?? */
-       /* Perform BIST Instruction Stop*/
-       /* Write BISTRR.BINST = 3?b010;*/
-
-       /* poll on BISTGSR.BDONE. If 0, wait.  ++TODO Add timeout */
-       while (!(readl(&phy->bistgsr) & DDRPHYC_BISTGSR_BDDONE))
-               ;
-
-       /*Check if received correct number of words*/
-       /* if (Read BISTWCSR.DXWCNT = Read BISTWCR.BWCNT) */
-       if (((readl(&phy->bistwcsr)) >> DDRPHYC_BISTWCSR_DXWCNT_SHIFT) ==
-           readl(&phy->bistwcr)) {
-               /*Determine if there is a data comparison error*/
-               /* if (Read BISTGSR.BDXERR = 1?b0) */
-               if (readl(&phy->bistgsr) & DDRPHYC_BISTGSR_BDXERR)
-                       result = false; /* BIST_FAIL; */
-               else
-                       result = true; /* BIST_SUCCESS; */
-       } else {
+       /* poll on BISTGSR.BDONE and wait max 1000 us */
+       ret = readl_poll_timeout(&phy->bistgsr, val,
+                                val & DDRPHYC_BISTGSR_BDDONE, 1000);
+
+       if (ret < 0) {
+               printf("warning: BIST timeout\n");
                result = false; /* BIST_FAIL; */
+               /*Perform BIST Stop */
+               clrsetbits_le32(&phy->bistrr, 0x00000007, 0x00000002);
+       } else {
+               /*Check if received correct number of words*/
+               /* if (Read BISTWCSR.DXWCNT = Read BISTWCR.BWCNT) */
+               if (((readl(&phy->bistwcsr)) >> DDRPHYC_BISTWCSR_DXWCNT_SHIFT)
+                   == readl(&phy->bistwcr)) {
+                       /*Determine if there is a data comparison error*/
+                       /* if (Read BISTGSR.BDXERR = 1?b0) */
+                       if (readl(&phy->bistgsr) & DDRPHYC_BISTGSR_BDXERR)
+                               result = false; /* BIST_FAIL; */
+                       else
+                               result = true; /* BIST_SUCCESS; */
+               } else {
+                       result = false; /* BIST_FAIL; */
+               }
        }
 
        /* loop while success */
@@ -394,7 +532,7 @@ static enum test_result bit_deskew(struct stm32mp1_ddrctl *ctl,
        clrbits_le32(&phy->dx3gcr, DDRPHYC_DXNGCR_DXEN);
 
        /* Config the BIST block */
-       config_BIST(phy);
+       config_BIST(ctl, phy);
        pr_debug("BIST Config done.\n");
 
        /* Train each byte */
@@ -807,7 +945,7 @@ static enum test_result eye_training(struct stm32mp1_ddrctl *ctl,
        clrbits_le32(&phy->dx3gcr, DDRPHYC_DXNGCR_DXEN);
 
        /* Config the BIST block */
-       config_BIST(phy);
+       config_BIST(ctl, phy);
 
        for (byte = 0; byte < nb_bytes; byte++) {
                if (ctrlc()) {
@@ -1182,15 +1320,17 @@ static u8 set_midpoint_read_dqs_gating(struct stm32mp1_ddrphy *phy, u8 byte,
                                 dqs_gate_values[byte][0],
                                 dqs_gate_values[byte][1]);
                        pr_debug("*******the nominal values were system latency: 0  phase: 2*******\n");
-                       set_r0dgsl_delay(phy, byte, dqs_gate_values[byte][0]);
-                       set_r0dgps_delay(phy, byte, dqs_gate_values[byte][1]);
                }
        } else {
                /* if intermitant, restore defaut values */
                pr_debug("dqs gating:no regular fail/pass/fail found. defaults values restored.\n");
-               set_r0dgsl_delay(phy, byte, 0);
-               set_r0dgps_delay(phy, byte, 2);
+               dqs_gate_values[byte][0] = 0;
+               dqs_gate_values[byte][1] = 2;
        }
+       set_r0dgsl_delay(phy, byte, dqs_gate_values[byte][0]);
+       set_r0dgps_delay(phy, byte, dqs_gate_values[byte][1]);
+       printf("Byte %d, R0DGSL = %d, R0DGPS = %d\n",
+              byte, dqs_gate_values[byte][0], dqs_gate_values[byte][1]);
 
        /* return 0 if intermittent or if both left_bound
         * and right_bound are not found
@@ -1227,7 +1367,7 @@ static enum test_result read_dqs_gating(struct stm32mp1_ddrctl *ctl,
        clrbits_le32(&phy->dx3gcr, DDRPHYC_DXNGCR_DXEN);
 
        /* config the bist block */
-       config_BIST(phy);
+       config_BIST(ctl, phy);
 
        for (byte = 0; byte < nb_bytes; byte++) {
                if (ctrlc()) {
@@ -1281,11 +1421,16 @@ static enum test_result do_read_dqs_gating(struct stm32mp1_ddrctl *ctl,
 {
        u32 rfshctl3 = readl(&ctl->rfshctl3);
        u32 pwrctl = readl(&ctl->pwrctl);
+       u32 derateen = readl(&ctl->derateen);
        enum test_result res;
 
+       writel(0x0, &ctl->derateen);
        stm32mp1_refresh_disable(ctl);
+
        res = read_dqs_gating(ctl, phy, string);
+
        stm32mp1_refresh_restore(ctl, rfshctl3, pwrctl);
+       writel(derateen, &ctl->derateen);
 
        return res;
 }
@@ -1296,11 +1441,16 @@ static enum test_result do_bit_deskew(struct stm32mp1_ddrctl *ctl,
 {
        u32 rfshctl3 = readl(&ctl->rfshctl3);
        u32 pwrctl = readl(&ctl->pwrctl);
+       u32 derateen = readl(&ctl->derateen);
        enum test_result res;
 
+       writel(0x0, &ctl->derateen);
        stm32mp1_refresh_disable(ctl);
+
        res = bit_deskew(ctl, phy, string);
+
        stm32mp1_refresh_restore(ctl, rfshctl3, pwrctl);
+       writel(derateen, &ctl->derateen);
 
        return res;
 }
@@ -1311,11 +1461,16 @@ static enum test_result do_eye_training(struct stm32mp1_ddrctl *ctl,
 {
        u32 rfshctl3 = readl(&ctl->rfshctl3);
        u32 pwrctl = readl(&ctl->pwrctl);
+       u32 derateen = readl(&ctl->derateen);
        enum test_result res;
 
+       writel(0x0, &ctl->derateen);
        stm32mp1_refresh_disable(ctl);
+
        res = eye_training(ctl, phy, string);
+
        stm32mp1_refresh_restore(ctl, rfshctl3, pwrctl);
+       writel(derateen, &ctl->derateen);
 
        return res;
 }
index 09e050ffb2d3ab76f49ce8b7fd8da60c61b4b14c..1fc8193ad93fc290f992a7437a23ff842e236019 100644 (file)
@@ -2,9 +2,9 @@
 /*
  * Texas Instruments' K3 DSP Remoteproc driver
  *
- * Copyright (C) 2018-2019 Texas Instruments Incorporated - http://www.ti.com/
+ * Copyright (C) 2018-2020 Texas Instruments Incorporated - http://www.ti.com/
  *     Lokesh Vutla <lokeshvutla@ti.com>
- *
+ *     Suman Anna <s-anna@ti.com>
  */
 
 #include <common.h>
@@ -18,6 +18,7 @@
 #include <power-domain.h>
 #include <dm/device_compat.h>
 #include <linux/err.h>
+#include <linux/sizes.h>
 #include <linux/soc/ti/ti_sci_protocol.h>
 #include "ti_sci_proc.h"
 
@@ -37,20 +38,80 @@ struct k3_dsp_mem {
        size_t size;
 };
 
+/**
+ * struct k3_dsp_boot_data - internal data structure used for boot
+ * @boot_align_addr: Boot vector address alignment granularity
+ * @uses_lreset: Flag to denote the need for local reset management
+ */
+struct k3_dsp_boot_data {
+       u32 boot_align_addr;
+       bool uses_lreset;
+};
+
 /**
  * struct k3_dsp_privdata - Structure representing Remote processor data.
  * @rproc_rst:         rproc reset control data
  * @tsp:               Pointer to TISCI proc contrl handle
+ * @data:              Pointer to DSP specific boot data structure
  * @mem:               Array of available memories
  * @num_mem:           Number of available memories
  */
 struct k3_dsp_privdata {
        struct reset_ctl dsp_rst;
        struct ti_sci_proc tsp;
+       struct k3_dsp_boot_data *data;
        struct k3_dsp_mem *mem;
        int num_mems;
 };
 
+/*
+ * The C66x DSP cores have a local reset that affects only the CPU, and a
+ * generic module reset that powers on the device and allows the DSP internal
+ * memories to be accessed while the local reset is asserted. This function is
+ * used to release the global reset on C66x DSPs to allow loading into the DSP
+ * internal RAMs. This helper function is invoked in k3_dsp_load() before any
+ * actual firmware loading and is undone only in k3_dsp_stop(). The local reset
+ * on C71x cores is a no-op and the global reset cannot be released on C71x
+ * cores until after the firmware images are loaded, so this function does
+ * nothing for C71x cores.
+ */
+static int k3_dsp_prepare(struct udevice *dev)
+{
+       struct k3_dsp_privdata *dsp = dev_get_priv(dev);
+       struct k3_dsp_boot_data *data = dsp->data;
+       int ret;
+
+       /* local reset is no-op on C71x processors */
+       if (!data->uses_lreset)
+               return 0;
+
+       ret = ti_sci_proc_power_domain_on(&dsp->tsp);
+       if (ret)
+               dev_err(dev, "cannot enable internal RAM loading, ret = %d\n",
+                       ret);
+
+       return ret;
+}
+
+/*
+ * This function is the counterpart to k3_dsp_prepare() and is used to assert
+ * the global reset on C66x DSP cores (no-op for C71x DSP cores). This completes
+ * the second step of powering down the C66x DSP cores. The cores themselves
+ * are halted through the local reset in first step. This function is invoked
+ * in k3_dsp_stop() after the local reset is asserted.
+ */
+static int k3_dsp_unprepare(struct udevice *dev)
+{
+       struct k3_dsp_privdata *dsp = dev_get_priv(dev);
+       struct k3_dsp_boot_data *data = dsp->data;
+
+       /* local reset is no-op on C71x processors */
+       if (!data->uses_lreset)
+               return 0;
+
+       return ti_sci_proc_power_domain_off(&dsp->tsp);
+}
+
 /**
  * k3_dsp_load() - Load up the Remote processor image
  * @dev:       rproc device pointer
@@ -62,6 +123,7 @@ struct k3_dsp_privdata {
 static int k3_dsp_load(struct udevice *dev, ulong addr, ulong size)
 {
        struct k3_dsp_privdata *dsp = dev_get_priv(dev);
+       struct k3_dsp_boot_data *data = dsp->data;
        u32 boot_vector;
        int ret;
 
@@ -70,17 +132,33 @@ static int k3_dsp_load(struct udevice *dev, ulong addr, ulong size)
        if (ret)
                return ret;
 
+       ret = k3_dsp_prepare(dev);
+       if (ret) {
+               dev_err(dev, "DSP prepare failed for core %d\n",
+                       dsp->tsp.proc_id);
+               goto proc_release;
+       }
+
        ret = rproc_elf_load_image(dev, addr, size);
        if (ret < 0) {
                dev_err(dev, "Loading elf failed %d\n", ret);
-               goto proc_release;
+               goto unprepare;
        }
 
        boot_vector = rproc_elf_get_boot_addr(dev, addr);
+       if (boot_vector & (data->boot_align_addr - 1)) {
+               ret = -EINVAL;
+               dev_err(dev, "Boot vector 0x%x not aligned on 0x%x boundary\n",
+                       boot_vector, data->boot_align_addr);
+               goto proc_release;
+       }
 
        dev_dbg(dev, "%s: Boot vector = 0x%x\n", __func__, boot_vector);
 
        ret = ti_sci_proc_set_config(&dsp->tsp, boot_vector, 0, 0);
+unprepare:
+       if (ret)
+               k3_dsp_unprepare(dev);
 proc_release:
        ti_sci_proc_release(&dsp->tsp);
        return ret;
@@ -95,6 +173,7 @@ proc_release:
 static int k3_dsp_start(struct udevice *dev)
 {
        struct k3_dsp_privdata *dsp = dev_get_priv(dev);
+       struct k3_dsp_boot_data *data = dsp->data;
        int ret;
 
        dev_dbg(dev, "%s\n", __func__);
@@ -102,16 +181,18 @@ static int k3_dsp_start(struct udevice *dev)
        ret = ti_sci_proc_request(&dsp->tsp);
        if (ret)
                return ret;
-       /*
-        * Setting the right clock frequency would have taken care by
-        * assigned-clock-rates during the device probe. So no need to
-        * set the frequency again here.
-        */
-       ret = ti_sci_proc_power_domain_on(&dsp->tsp);
-       if (ret)
-               goto proc_release;
+
+       if (!data->uses_lreset) {
+               ret = ti_sci_proc_power_domain_on(&dsp->tsp);
+               if (ret)
+                       goto proc_release;
+       }
 
        ret = reset_deassert(&dsp->dsp_rst);
+       if (ret) {
+               if (!data->uses_lreset)
+                       ti_sci_proc_power_domain_off(&dsp->tsp);
+       }
 
 proc_release:
        ti_sci_proc_release(&dsp->tsp);
@@ -302,6 +383,8 @@ static int k3_dsp_of_to_priv(struct udevice *dev, struct k3_dsp_privdata *dsp)
        if (ret)
                return ret;
 
+       dsp->data = (struct k3_dsp_boot_data *)dev_get_driver_data(dev);
+
        return 0;
 }
 
@@ -326,6 +409,15 @@ static int k3_dsp_probe(struct udevice *dev)
                return ret;
        }
 
+       /*
+        * The DSP local resets are deasserted by default on Power-On-Reset.
+        * Assert the local resets to ensure the DSPs don't execute bogus code
+        * in .load() callback when the module reset is released to support
+        * internal memory loading. This is needed for C66x DSPs, and is a
+        * no-op on C71x DSPs.
+        */
+       reset_assert(&dsp->dsp_rst);
+
        dev_dbg(dev, "Remoteproc successfully probed\n");
 
        return 0;
@@ -340,9 +432,19 @@ static int k3_dsp_remove(struct udevice *dev)
        return 0;
 }
 
+static const struct k3_dsp_boot_data c66_data = {
+       .boot_align_addr = SZ_1K,
+       .uses_lreset = true,
+};
+
+static const struct k3_dsp_boot_data c71_data = {
+       .boot_align_addr = SZ_2M,
+       .uses_lreset = false,
+};
+
 static const struct udevice_id k3_dsp_ids[] = {
-       { .compatible = "ti,j721e-c66-dsp"},
-       { .compatible = "ti,j721e-c71-dsp"},
+       { .compatible = "ti,j721e-c66-dsp", .data = (ulong)&c66_data, },
+       { .compatible = "ti,j721e-c71-dsp", .data = (ulong)&c71_data, },
        {}
 };
 
index ea56689552aa6cf1ee6ad061fba512a1d77c7493..c01b29d90f1b07b9dce8ed73e1c771efa86e31e5 100644 (file)
@@ -543,6 +543,7 @@ static int k3_r5f_rproc_configure(struct k3_r5f_core *core)
 {
        struct k3_r5f_cluster *cluster = core->cluster;
        u32 set_cfg = 0, clr_cfg = 0, cfg, ctrl, sts;
+       bool lockstep_permitted;
        u64 boot_vec = 0;
        int ret;
 
@@ -560,8 +561,9 @@ static int k3_r5f_rproc_configure(struct k3_r5f_core *core)
                goto out;
 
        /* Sanity check for Lockstep mode */
-       if (cluster->mode && is_primary_core(core) &&
-           !(sts & PROC_BOOT_STATUS_FLAG_R5_LOCKSTEP_PERMITTED)) {
+       lockstep_permitted = !!(sts &
+                               PROC_BOOT_STATUS_FLAG_R5_LOCKSTEP_PERMITTED);
+       if (cluster->mode && is_primary_core(core) && !lockstep_permitted) {
                dev_err(core->dev, "LockStep mode not permitted on this device\n");
                ret = -EINVAL;
                goto out;
@@ -573,7 +575,7 @@ static int k3_r5f_rproc_configure(struct k3_r5f_core *core)
                clr_cfg |= PROC_BOOT_CFG_FLAG_R5_TEINIT;
                if (cluster->mode == CLUSTER_MODE_LOCKSTEP)
                        set_cfg |= PROC_BOOT_CFG_FLAG_R5_LOCKSTEP;
-               else
+               else if (lockstep_permitted)
                        clr_cfg |= PROC_BOOT_CFG_FLAG_R5_LOCKSTEP;
        }
 
@@ -816,4 +818,5 @@ U_BOOT_DRIVER(k3_r5fss) = {
        .id = UCLASS_MISC,
        .probe = k3_r5f_cluster_probe,
        .priv_auto_alloc_size = sizeof(struct k3_r5f_cluster),
+       .flags = DM_FLAG_DEFAULT_PD_CTRL_OFF,
 };
index e4e4c3928582c89b51129e9c4885845128cf78c1..0dd6cec82a65516b126f119c519ec19a0d5ef586 100644 (file)
@@ -17,8 +17,6 @@
 #include <serial.h>
 #include <linux/err.h>
 
-DECLARE_GLOBAL_DATA_PTR;
-
 #define ZYNQ_UART_SR_TXACTIVE  BIT(11) /* TX active */
 #define ZYNQ_UART_SR_TXFULL    BIT(4) /* TX FIFO full */
 #define ZYNQ_UART_SR_RXEMPTY   BIT(1) /* RX FIFO empty */
@@ -45,7 +43,7 @@ struct zynq_uart_platdata {
        struct uart_zynq *regs;
 };
 
-/* Set up the baud rate in gd struct */
+/* Set up the baud rate */
 static void _uart_zynq_serial_setbrg(struct uart_zynq *regs,
                                     unsigned long clock, unsigned long baud)
 {
@@ -140,9 +138,12 @@ static int zynq_serial_setbrg(struct udevice *dev, int baudrate)
 static int zynq_serial_probe(struct udevice *dev)
 {
        struct zynq_uart_platdata *platdata = dev_get_platdata(dev);
+       struct uart_zynq *regs = platdata->regs;
+       u32 val;
 
-       /* No need to reinitialize the UART after relocation */
-       if (gd->flags & GD_FLG_RELOC)
+       /* No need to reinitialize the UART if TX already enabled */
+       val = readl(&regs->control);
+       if (val & ZYNQ_UART_CR_TX_EN)
                return 0;
 
        _uart_zynq_serial_init(platdata->regs);
index 9def7e02f4bd88b61a2b064221825828a82c9501..ff42056abdd1aa2f5abd2a9438272d820bad7ab3 100644 (file)
@@ -6,14 +6,13 @@
 
 #include <common.h>
 #include <dm.h>
-#include <fdtdec.h>
+#include <clk.h>
 #include <timer.h>
+#include <linux/err.h>
 
 #include <asm/io.h>
 #include <asm/arch-armv7/globaltimer.h>
 
-DECLARE_GLOBAL_DATA_PTR;
-
 struct sti_timer_priv {
        struct globaltimer *global_timer;
 };
@@ -44,13 +43,24 @@ static int sti_timer_probe(struct udevice *dev)
 {
        struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev);
        struct sti_timer_priv *priv = dev_get_priv(dev);
-       fdt_addr_t addr;
-
-       uc_priv->clock_rate = CONFIG_SYS_HZ_CLOCK;
+       struct clk clk;
+       int err;
+       ulong ret;
 
        /* get arm global timer base address */
-       addr = fdtdec_get_addr(gd->fdt_blob, dev_of_offset(dev), "reg");
-       priv->global_timer = (struct globaltimer *)addr;
+       priv->global_timer = (struct globaltimer *)dev_read_addr_ptr(dev);
+       if (!priv->global_timer)
+               return -ENOENT;
+
+       err = clk_get_by_index(dev, 0, &clk);
+       if (!err) {
+               ret = clk_get_rate(&clk);
+               if (IS_ERR_VALUE(ret))
+                       return ret;
+               uc_priv->clock_rate = ret;
+       } else {
+               uc_priv->clock_rate = CONFIG_SYS_HZ_CLOCK;
+       }
 
        /* init timer */
        writel(0x01, &priv->global_timer->ctl);
index 4c933697022ff87df00354b5700f48b453108d66..7c5012a67f0c07a95c5cd5ec32c11f1f51dffaf8 100644 (file)
@@ -473,6 +473,12 @@ config ATMEL_HLCD
        help
           HLCDC supports video output to an attached LCD panel.
 
+config AM335X_LCD
+       bool "Enable AM335x video support"
+       depends on DM_VIDEO
+       help
+          Supports video output to an attached LCD panel.
+
 config LOGICORE_DP_TX
        bool "Enable Logicore DP TX driver"
        depends on DISPLAY
index 51c1af587f27b6b41f58584f83c4541d5f8b1187..eb5add2a20c717fe54afa6065f911b02f49e1a22 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * Copyright (C) 2013-2018 Hannes Schmelzer <oe5hpm@oevsv.at>
  * B&R Industrial Automation GmbH - http://www.br-automation.com
+ * Copyright (C) 2020 Dario Binacchi <dariobin@libero.it>
  *
  * minimal framebuffer driver for TI's AM335x SoC to be compatible with
  * Wolfgang Denk's LCD-Framework (CONFIG_LCD, common/lcd.c)
  * - starts output DMA from gd->fb_base buffer
  */
 #include <common.h>
+#include <dm.h>
 #include <asm/io.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/omap.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/sys_proto.h>
+#include <asm/utils.h>
+#include <linux/err.h>
 #include <lcd.h>
+#include <video.h>
 #include "am335x-fb.h"
 
-#if !defined(LCD_CNTL_BASE)
-#error "hw-base address of LCD-Controller (LCD_CNTL_BASE) not defined!"
-#endif
-
 #define LCDC_FMAX                              200000000
 
 /* LCD Control Register */
-#define LCD_CLK_DIVISOR(x)                     ((x) << 8)
-#define LCD_RASTER_MODE                                0x01
+#define LCDC_CTRL_CLK_DIVISOR_MASK             GENMASK(15, 8)
+#define LCDC_CTRL_RASTER_MODE                  BIT(0)
+#define LCDC_CTRL_CLK_DIVISOR(x)               (((x) & GENMASK(7, 0)) << 8)
 /* LCD Clock Enable Register */
-#define LCD_CORECLKEN                          (0x01 << 0)
-#define LCD_LIDDCLKEN                          (0x01 << 1)
-#define LCD_DMACLKEN                           (0x01 << 2)
+#define LCDC_CLKC_ENABLE_CORECLKEN             BIT(0)
+#define LCDC_CLKC_ENABLE_LIDDCLKEN             BIT(1)
+#define LCDC_CLKC_ENABLE_DMACLKEN              BIT(2)
 /* LCD DMA Control Register */
-#define LCD_DMA_BURST_SIZE(x)                  ((x) << 4)
-#define LCD_DMA_BURST_1                                0x0
-#define LCD_DMA_BURST_2                                0x1
-#define LCD_DMA_BURST_4                                0x2
-#define LCD_DMA_BURST_8                                0x3
-#define LCD_DMA_BURST_16                       0x4
+#define LCDC_DMA_CTRL_BURST_SIZE(x)            (((x) & GENMASK(2, 0)) << 4)
+#define LCDC_DMA_CTRL_BURST_1                  0x0
+#define LCDC_DMA_CTRL_BURST_2                  0x1
+#define LCDC_DMA_CTRL_BURST_4                  0x2
+#define LCDC_DMA_CTRL_BURST_8                  0x3
+#define LCDC_DMA_CTRL_BURST_16                 0x4
+#define LCDC_DMA_CTRL_FIFO_TH(x)               (((x) & GENMASK(2, 0)) << 8)
 /* LCD Timing_0 Register */
-#define LCD_HBPLSB(x)                          ((((x)-1) & 0xFF) << 24)
-#define LCD_HFPLSB(x)                          ((((x)-1) & 0xFF) << 16)
-#define LCD_HSWLSB(x)                          ((((x)-1) & 0x3F) << 10)
-#define LCD_HORLSB(x)                          (((((x) >> 4)-1) & 0x3F) << 4)
-#define LCD_HORMSB(x)                          (((((x) >> 4)-1) & 0x40) >> 4)
+#define LCDC_RASTER_TIMING_0_HORMSB(x) ((((x) - 1) & BIT(10)) >> 7)
+#define LCDC_RASTER_TIMING_0_HORLSB(x) (((((x) >> 4) - 1) & GENMASK(5, 0)) << 4)
+#define LCDC_RASTER_TIMING_0_HSWLSB(x) ((((x) - 1) & GENMASK(5, 0)) << 10)
+#define LCDC_RASTER_TIMING_0_HFPLSB(x) ((((x) - 1) & GENMASK(7, 0)) << 16)
+#define LCDC_RASTER_TIMING_0_HBPLSB(x) ((((x) - 1) & GENMASK(7, 0)) << 24)
 /* LCD Timing_1 Register */
-#define LCD_VBP(x)                             ((x) << 24)
-#define LCD_VFP(x)                             ((x) << 16)
-#define LCD_VSW(x)                             (((x)-1) << 10)
-#define LCD_VERLSB(x)                          (((x)-1) & 0x3FF)
+#define LCDC_RASTER_TIMING_1_VERLSB(x)         (((x) - 1) & GENMASK(9, 0))
+#define LCDC_RASTER_TIMING_1_VSW(x)    ((((x) - 1) & GENMASK(5, 0)) << 10)
+#define LCDC_RASTER_TIMING_1_VFP(x)            (((x) & GENMASK(7, 0)) << 16)
+#define LCDC_RASTER_TIMING_1_VBP(x)            (((x) & GENMASK(7, 0)) << 24)
 /* LCD Timing_2 Register */
-#define LCD_HSWMSB(x)                          ((((x)-1) & 0x3C0) << 21)
-#define LCD_VERMSB(x)                          ((((x)-1) & 0x400) << 16)
-#define LCD_HBPMSB(x)                          ((((x)-1) & 0x300) >> 4)
-#define LCD_HFPMSB(x)                          ((((x)-1) & 0x300) >> 8)
-#define LCD_INVMASK(x)                         ((x) & 0x3F00000)
+#define LCDC_RASTER_TIMING_2_HFPMSB(x) ((((x) - 1) & GENMASK(9, 8)) >> 8)
+#define LCDC_RASTER_TIMING_2_HBPMSB(x) ((((x) - 1) & GENMASK(9, 8)) >> 4)
+#define LCDC_RASTER_TIMING_2_ACB(x)            (((x) & GENMASK(7, 0)) << 8)
+#define LCDC_RASTER_TIMING_2_ACBI(x)           (((x) & GENMASK(3, 0)) << 16)
+#define LCDC_RASTER_TIMING_2_VSYNC_INVERT      BIT(20)
+#define LCDC_RASTER_TIMING_2_HSYNC_INVERT      BIT(21)
+#define LCDC_RASTER_TIMING_2_PXCLK_INVERT      BIT(22)
+#define LCDC_RASTER_TIMING_2_DE_INVERT         BIT(23)
+#define LCDC_RASTER_TIMING_2_HSVS_RISEFALL     BIT(24)
+#define LCDC_RASTER_TIMING_2_HSVS_CONTROL      BIT(25)
+#define LCDC_RASTER_TIMING_2_VERMSB(x)         ((((x) - 1) & BIT(10)) << 16)
+#define LCDC_RASTER_TIMING_2_HSWMSB(x) ((((x) - 1) & GENMASK(9, 6)) << 21)
 /* LCD Raster Ctrl Register */
-#define LCD_TFT_24BPP_MODE                     (1 << 25)
-#define LCD_TFT_24BPP_UNPACK                   (1 << 26)
-#define LCD_PALMODE_RAWDATA                    (0x02 << 20)
-#define LCD_TFT_MODE                           (0x01 << 7)
-#define LCD_RASTER_ENABLE                      (0x01 << 0)
-
-
-/* Macro definitions */
-#define FBSIZE(x)      ((x->hactive * x->vactive * x->bpp) >> 3)
+#define LCDC_RASTER_CTRL_ENABLE                        BIT(0)
+#define LCDC_RASTER_CTRL_TFT_MODE              BIT(7)
+#define LCDC_RASTER_CTRL_DATA_ORDER            BIT(8)
+#define LCDC_RASTER_CTRL_REQDLY(x)             (((x) & GENMASK(7, 0)) << 12)
+#define LCDC_RASTER_CTRL_PALMODE_RAWDATA       (0x02 << 20)
+#define LCDC_RASTER_CTRL_TFT_ALT_ENABLE                BIT(23)
+#define LCDC_RASTER_CTRL_TFT_24BPP_MODE                BIT(25)
+#define LCDC_RASTER_CTRL_TFT_24BPP_UNPACK      BIT(26)
 
 struct am335x_lcdhw {
        unsigned int            pid;                    /* 0x00 */
@@ -99,10 +108,106 @@ struct am335x_lcdhw {
        unsigned int            clkc_reset;             /* 0x70 */
 };
 
-static struct am335x_lcdhw *lcdhw = (void *)LCD_CNTL_BASE;
+struct dpll_data {
+       unsigned long rounded_rate;
+       u16 rounded_m;
+       u8 rounded_n;
+       u8 rounded_div;
+};
 
 DECLARE_GLOBAL_DATA_PTR;
 
+/**
+ * am335x_dpll_round_rate() - Round a target rate for an OMAP DPLL
+ *
+ * @dpll_data: struct dpll_data pointer for the DPLL
+ * @rate:      New DPLL clock rate
+ * @return rounded rate and the computed m, n and div values in the dpll_data
+ *         structure, or -ve error code.
+ */
+static ulong am335x_dpll_round_rate(struct dpll_data *dd, ulong rate)
+{
+       unsigned int m, n, d;
+       unsigned long rounded_rate;
+       int err, err_r;
+
+       dd->rounded_rate = -EFAULT;
+       err = rate;
+       err_r = err;
+
+       for (d = 2; err && d < 255; d++) {
+               for (m = 2; m < 2047; m++) {
+                       if ((V_OSCK * m) < (rate * d))
+                               continue;
+
+                       n = (V_OSCK * m) / (rate * d);
+                       if (n > 127)
+                               break;
+
+                       if (((V_OSCK * m) / n) > LCDC_FMAX)
+                               break;
+
+                       rounded_rate = (V_OSCK * m) / n / d;
+                       err = abs(rounded_rate - rate);
+                       if (err < err_r) {
+                               err_r = err;
+                               dd->rounded_rate = rounded_rate;
+                               dd->rounded_m = m;
+                               dd->rounded_n = n;
+                               dd->rounded_div = d;
+                               if (err == 0)
+                                       break;
+                       }
+               }
+       }
+
+       debug("DPLL display: best error %d Hz (M %d, N %d, DIV %d)\n",
+             err_r, dd->rounded_m, dd->rounded_n, dd->rounded_div);
+
+       return dd->rounded_rate;
+}
+
+/**
+ * am335x_fb_set_pixel_clk_rate() - Set pixel clock rate.
+ *
+ * @am335x_lcdhw: Base address of the LCD controller registers.
+ * @rate:         New clock rate in Hz.
+ * @return new rate, or -ve error code.
+ */
+static ulong am335x_fb_set_pixel_clk_rate(struct am335x_lcdhw *regs, ulong rate)
+{
+       struct dpll_params dpll_disp = { 1, 0, 1, -1, -1, -1, -1 };
+       struct dpll_data dd;
+       ulong round_rate;
+       u32 reg;
+
+       round_rate = am335x_dpll_round_rate(&dd, rate);
+       if (IS_ERR_VALUE(round_rate))
+               return round_rate;
+
+       dpll_disp.m = dd.rounded_m;
+       dpll_disp.n = dd.rounded_n;
+       do_setup_dpll(&dpll_disp_regs, &dpll_disp);
+
+       reg = readl(&regs->ctrl) & ~LCDC_CTRL_CLK_DIVISOR_MASK;
+       reg |= LCDC_CTRL_CLK_DIVISOR(dd.rounded_div);
+       writel(reg, &regs->ctrl);
+       return round_rate;
+}
+
+#if !CONFIG_IS_ENABLED(DM_VIDEO)
+
+#if !defined(LCD_CNTL_BASE)
+#error "hw-base address of LCD-Controller (LCD_CNTL_BASE) not defined!"
+#endif
+
+/* Macro definitions */
+#define FBSIZE(x)      (((x)->hactive * (x)->vactive * (x)->bpp) >> 3)
+
+#define LCDC_RASTER_TIMING_2_INVMASK(x)                ((x) & GENMASK(25, 20))
+
+static struct am335x_lcdhw *lcdhw = (void *)LCD_CNTL_BASE;
+
 int lcd_get_size(int *line_length)
 {
        *line_length = (panel_info.vl_col * NBITS(panel_info.vl_bpix)) / 8;
@@ -112,11 +217,9 @@ int lcd_get_size(int *line_length)
 int am335xfb_init(struct am335x_lcdpanel *panel)
 {
        u32 raster_ctrl = 0;
-
        struct cm_dpll *const cmdpll = (struct cm_dpll *)CM_DPLL;
-       struct dpll_params dpll_disp = { 1, 0, 1, -1, -1, -1, -1 };
-       unsigned int m, n, d, best_d = 2;
-       int err = 0, err_r = 0;
+       ulong rate;
+       u32 reg;
 
        if (gd->fb_base == 0) {
                printf("ERROR: no valid fb_base stored in GLOBAL_DATA_PTR!\n");
@@ -132,10 +235,10 @@ int am335xfb_init(struct am335x_lcdpanel *panel)
        case 16:
                break;
        case 32:
-               raster_ctrl |= LCD_TFT_24BPP_UNPACK;
+               raster_ctrl |= LCDC_RASTER_CTRL_TFT_24BPP_UNPACK;
                /* fallthrough */
        case 24:
-               raster_ctrl |= LCD_TFT_24BPP_MODE;
+               raster_ctrl |= LCDC_RASTER_CTRL_TFT_24BPP_MODE;
                break;
        default:
                pr_err("am335x-fb: invalid bpp value: %d\n", panel->bpp);
@@ -157,32 +260,9 @@ int am335xfb_init(struct am335x_lcdpanel *panel)
        debug("using frambuffer at 0x%08x with size %d.\n",
              (unsigned int)gd->fb_base, FBSIZE(panel));
 
-       /* setup display pll for requested clock frequency */
-       err = panel->pxl_clk;
-       err_r = err;
-
-       for (d = 2; d < 255; d++) {
-               for (m = 2; m < 2047; m++) {
-                       if ((V_OSCK * m) < (panel->pxl_clk * d))
-                               continue;
-                       n = (V_OSCK * m) / (panel->pxl_clk * d);
-                       if (n > 127)
-                               break;
-                       if (((V_OSCK * m) / n) > LCDC_FMAX)
-                               break;
-
-                       err = abs((V_OSCK * m) / n / d - panel->pxl_clk);
-                       if (err < err_r) {
-                               err_r = err;
-                               dpll_disp.m = m;
-                               dpll_disp.n = n;
-                               best_d = d;
-                       }
-               }
-       }
-       debug("%s: PLL: best error %d Hz (M %d, N %d, DISP %d)\n",
-             __func__, err_r, dpll_disp.m, dpll_disp.n, best_d);
-       do_setup_dpll(&dpll_disp_regs, &dpll_disp);
+       rate = am335x_fb_set_pixel_clk_rate(lcdhw, panel->pxl_clk);
+       if (IS_ERR_VALUE(rate))
+               return rate;
 
        /* clock source for LCDC from dispPLL M2 */
        writel(0x0, &cmdpll->clklcdcpixelclk);
@@ -199,37 +279,340 @@ int am335xfb_init(struct am335x_lcdpanel *panel)
 
        debug("am335x-fb: wait for stable power ...\n");
        mdelay(panel->pup_delay);
-       lcdhw->clkc_enable = LCD_CORECLKEN | LCD_LIDDCLKEN | LCD_DMACLKEN;
+       lcdhw->clkc_enable = LCDC_CLKC_ENABLE_CORECLKEN |
+               LCDC_CLKC_ENABLE_LIDDCLKEN | LCDC_CLKC_ENABLE_DMACLKEN;
        lcdhw->raster_ctrl = 0;
-       lcdhw->ctrl = LCD_CLK_DIVISOR(best_d) | LCD_RASTER_MODE;
+
+       reg = lcdhw->ctrl & LCDC_CTRL_CLK_DIVISOR_MASK;
+       reg |= LCDC_CTRL_RASTER_MODE;
+       lcdhw->ctrl = reg;
+
        lcdhw->lcddma_fb0_base = gd->fb_base;
        lcdhw->lcddma_fb0_ceiling = gd->fb_base + FBSIZE(panel);
        lcdhw->lcddma_fb1_base = gd->fb_base;
        lcdhw->lcddma_fb1_ceiling = gd->fb_base + FBSIZE(panel);
-       lcdhw->lcddma_ctrl = LCD_DMA_BURST_SIZE(LCD_DMA_BURST_16);
-
-       lcdhw->raster_timing0 = LCD_HORLSB(panel->hactive) |
-                               LCD_HORMSB(panel->hactive) |
-                               LCD_HFPLSB(panel->hfp) |
-                               LCD_HBPLSB(panel->hbp) |
-                               LCD_HSWLSB(panel->hsw);
-       lcdhw->raster_timing1 = LCD_VBP(panel->vbp) |
-                               LCD_VFP(panel->vfp) |
-                               LCD_VSW(panel->vsw) |
-                               LCD_VERLSB(panel->vactive);
-       lcdhw->raster_timing2 = LCD_HSWMSB(panel->hsw) |
-                               LCD_VERMSB(panel->vactive) |
-                               LCD_INVMASK(panel->pol) |
-                               LCD_HBPMSB(panel->hbp) |
-                               LCD_HFPMSB(panel->hfp) |
+       lcdhw->lcddma_ctrl = LCDC_DMA_CTRL_BURST_SIZE(LCDC_DMA_CTRL_BURST_16);
+
+       lcdhw->raster_timing0 = LCDC_RASTER_TIMING_0_HORLSB(panel->hactive) |
+                               LCDC_RASTER_TIMING_0_HORMSB(panel->hactive) |
+                               LCDC_RASTER_TIMING_0_HFPLSB(panel->hfp) |
+                               LCDC_RASTER_TIMING_0_HBPLSB(panel->hbp) |
+                               LCDC_RASTER_TIMING_0_HSWLSB(panel->hsw);
+       lcdhw->raster_timing1 = LCDC_RASTER_TIMING_1_VBP(panel->vbp) |
+                               LCDC_RASTER_TIMING_1_VFP(panel->vfp) |
+                               LCDC_RASTER_TIMING_1_VSW(panel->vsw) |
+                               LCDC_RASTER_TIMING_1_VERLSB(panel->vactive);
+       lcdhw->raster_timing2 = LCDC_RASTER_TIMING_2_HSWMSB(panel->hsw) |
+                               LCDC_RASTER_TIMING_2_VERMSB(panel->vactive) |
+                               LCDC_RASTER_TIMING_2_INVMASK(panel->pol) |
+                               LCDC_RASTER_TIMING_2_HBPMSB(panel->hbp) |
+                               LCDC_RASTER_TIMING_2_HFPMSB(panel->hfp) |
                                0x0000FF00;     /* clk cycles for ac-bias */
        lcdhw->raster_ctrl =    raster_ctrl |
-                               LCD_PALMODE_RAWDATA |
-                               LCD_TFT_MODE |
-                               LCD_RASTER_ENABLE;
+                               LCDC_RASTER_CTRL_PALMODE_RAWDATA |
+                               LCDC_RASTER_CTRL_TFT_MODE |
+                               LCDC_RASTER_CTRL_ENABLE;
 
        debug("am335x-fb: waiting picture to be stable.\n.");
        mdelay(panel->pon_delay);
 
        return 0;
 }
+
+#else /* CONFIG_DM_VIDEO */
+
+#define FBSIZE(t, p)   (((t)->hactive.typ * (t)->vactive.typ * (p)->bpp) >> 3)
+
+enum {
+       LCD_MAX_WIDTH           = 2048,
+       LCD_MAX_HEIGHT          = 2048,
+       LCD_MAX_LOG2_BPP        = VIDEO_BPP32,
+};
+
+/**
+ * tilcdc_panel_info: Panel parameters
+ *
+ * @ac_bias: AC Bias Pin Frequency
+ * @ac_bias_intrpt: AC Bias Pin Transitions per Interrupt
+ * @dma_burst_sz: DMA burst size
+ * @bpp: Bits per pixel
+ * @fdd: FIFO DMA Request Delay
+ * @tft_alt_mode: TFT Alternative Signal Mapping (Only for active)
+ * @invert_pxl_clk: Invert pixel clock
+ * @sync_edge: Horizontal and Vertical Sync Edge: 0=rising 1=falling
+ * @sync_ctrl: Horizontal and Vertical Sync: Control: 0=ignore
+ * @raster_order: Raster Data Order Select: 1=Most-to-least 0=Least-to-most
+ * @fifo_th: DMA FIFO threshold
+ */
+struct tilcdc_panel_info {
+       u32 ac_bias;
+       u32 ac_bias_intrpt;
+       u32 dma_burst_sz;
+       u32 bpp;
+       u32 fdd;
+       bool tft_alt_mode;
+       bool invert_pxl_clk;
+       u32 sync_edge;
+       u32 sync_ctrl;
+       u32 raster_order;
+       u32 fifo_th;
+};
+
+struct am335x_fb_priv {
+       struct am335x_lcdhw *regs;
+       struct tilcdc_panel_info panel;
+       struct display_timing timing;
+};
+
+static int am335x_fb_remove(struct udevice *dev)
+{
+       struct video_uc_platdata *uc_plat = dev_get_uclass_platdata(dev);
+
+       uc_plat->base -= 0x20;
+       uc_plat->size += 0x20;
+       return 0;
+}
+
+static int am335x_fb_probe(struct udevice *dev)
+{
+       struct video_uc_platdata *uc_plat = dev_get_uclass_platdata(dev);
+       struct video_priv *uc_priv = dev_get_uclass_priv(dev);
+       struct am335x_fb_priv *priv = dev_get_priv(dev);
+       struct am335x_lcdhw *regs = priv->regs;
+       struct tilcdc_panel_info *panel = &priv->panel;
+       struct display_timing *timing = &priv->timing;
+       struct cm_dpll *const cmdpll = (struct cm_dpll *)CM_DPLL;
+       u32 reg;
+
+       /* Before relocation we don't need to do anything */
+       if (!(gd->flags & GD_FLG_RELOC))
+               return 0;
+
+       am335x_fb_set_pixel_clk_rate(regs, timing->pixelclock.typ);
+
+       /* clock source for LCDC from dispPLL M2 */
+       writel(0, &cmdpll->clklcdcpixelclk);
+
+       /* palette default entry */
+       memset((void *)uc_plat->base, 0, 0x20);
+       *(unsigned int *)uc_plat->base = 0x4000;
+       /* point fb behind palette */
+       uc_plat->base += 0x20;
+       uc_plat->size -= 0x20;
+
+       writel(LCDC_CLKC_ENABLE_CORECLKEN | LCDC_CLKC_ENABLE_LIDDCLKEN |
+              LCDC_CLKC_ENABLE_DMACLKEN, &regs->clkc_enable);
+       writel(0, &regs->raster_ctrl);
+
+       reg = readl(&regs->ctrl) & LCDC_CTRL_CLK_DIVISOR_MASK;
+       reg |= LCDC_CTRL_RASTER_MODE;
+       writel(reg, &regs->ctrl);
+
+       writel(uc_plat->base, &regs->lcddma_fb0_base);
+       writel(uc_plat->base + FBSIZE(timing, panel),
+              &regs->lcddma_fb0_ceiling);
+       writel(uc_plat->base, &regs->lcddma_fb1_base);
+       writel(uc_plat->base + FBSIZE(timing, panel),
+              &regs->lcddma_fb1_ceiling);
+
+       reg = LCDC_DMA_CTRL_FIFO_TH(panel->fifo_th);
+       switch (panel->dma_burst_sz) {
+       case 1:
+               reg |= LCDC_DMA_CTRL_BURST_SIZE(LCDC_DMA_CTRL_BURST_1);
+               break;
+       case 2:
+               reg |= LCDC_DMA_CTRL_BURST_SIZE(LCDC_DMA_CTRL_BURST_2);
+               break;
+       case 4:
+               reg |= LCDC_DMA_CTRL_BURST_SIZE(LCDC_DMA_CTRL_BURST_4);
+               break;
+       case 8:
+               reg |= LCDC_DMA_CTRL_BURST_SIZE(LCDC_DMA_CTRL_BURST_8);
+               break;
+       case 16:
+               reg |= LCDC_DMA_CTRL_BURST_SIZE(LCDC_DMA_CTRL_BURST_16);
+               break;
+       }
+
+       writel(reg, &regs->lcddma_ctrl);
+
+       writel(LCDC_RASTER_TIMING_0_HORLSB(timing->hactive.typ) |
+              LCDC_RASTER_TIMING_0_HORMSB(timing->hactive.typ) |
+              LCDC_RASTER_TIMING_0_HFPLSB(timing->hfront_porch.typ) |
+              LCDC_RASTER_TIMING_0_HBPLSB(timing->hback_porch.typ) |
+              LCDC_RASTER_TIMING_0_HSWLSB(timing->hsync_len.typ),
+              &regs->raster_timing0);
+
+       writel(LCDC_RASTER_TIMING_1_VBP(timing->vback_porch.typ) |
+              LCDC_RASTER_TIMING_1_VFP(timing->vfront_porch.typ) |
+              LCDC_RASTER_TIMING_1_VSW(timing->vsync_len.typ) |
+              LCDC_RASTER_TIMING_1_VERLSB(timing->vactive.typ),
+              &regs->raster_timing1);
+
+       reg = LCDC_RASTER_TIMING_2_ACB(panel->ac_bias) |
+               LCDC_RASTER_TIMING_2_ACBI(panel->ac_bias_intrpt) |
+               LCDC_RASTER_TIMING_2_HSWMSB(timing->hsync_len.typ) |
+               LCDC_RASTER_TIMING_2_VERMSB(timing->vactive.typ) |
+               LCDC_RASTER_TIMING_2_HBPMSB(timing->hback_porch.typ) |
+               LCDC_RASTER_TIMING_2_HFPMSB(timing->hfront_porch.typ);
+
+       if (timing->flags & DISPLAY_FLAGS_VSYNC_LOW)
+               reg |= LCDC_RASTER_TIMING_2_VSYNC_INVERT;
+
+       if (timing->flags & DISPLAY_FLAGS_HSYNC_LOW)
+               reg |= LCDC_RASTER_TIMING_2_HSYNC_INVERT;
+
+       if (panel->invert_pxl_clk)
+               reg |= LCDC_RASTER_TIMING_2_PXCLK_INVERT;
+
+       if (panel->sync_edge)
+               reg |= LCDC_RASTER_TIMING_2_HSVS_RISEFALL;
+
+       if (panel->sync_ctrl)
+               reg |= LCDC_RASTER_TIMING_2_HSVS_CONTROL;
+
+       writel(reg, &regs->raster_timing2);
+
+       reg = LCDC_RASTER_CTRL_PALMODE_RAWDATA | LCDC_RASTER_CTRL_TFT_MODE |
+               LCDC_RASTER_CTRL_ENABLE | LCDC_RASTER_CTRL_REQDLY(panel->fdd);
+
+       if (panel->tft_alt_mode)
+               reg |= LCDC_RASTER_CTRL_TFT_ALT_ENABLE;
+
+       if (panel->bpp == 24)
+               reg |= LCDC_RASTER_CTRL_TFT_24BPP_MODE;
+       else if (panel->bpp == 32)
+               reg |= LCDC_RASTER_CTRL_TFT_24BPP_MODE |
+                       LCDC_RASTER_CTRL_TFT_24BPP_UNPACK;
+
+       if (panel->raster_order)
+               reg |= LCDC_RASTER_CTRL_DATA_ORDER;
+
+       writel(reg, &regs->raster_ctrl);
+
+       uc_priv->xsize = timing->hactive.typ;
+       uc_priv->ysize = timing->vactive.typ;
+       uc_priv->bpix = log_2_n_round_up(panel->bpp);
+       return 0;
+}
+
+static int am335x_fb_ofdata_to_platdata(struct udevice *dev)
+{
+       struct am335x_fb_priv *priv = dev_get_priv(dev);
+       struct tilcdc_panel_info *panel = &priv->panel;
+       struct display_timing *timing = &priv->timing;
+       ofnode node;
+       int err;
+
+       node = ofnode_by_compatible(ofnode_null(), "ti,am33xx-tilcdc");
+       if (!ofnode_valid(node)) {
+               dev_err(dev, "missing 'ti,am33xx-tilcdc' node\n");
+               return -ENXIO;
+       }
+
+       priv->regs = (struct am335x_lcdhw *)ofnode_get_addr(node);
+       dev_dbg(dev, "LCD: base address=0x%x\n", (unsigned int)priv->regs);
+
+       err = ofnode_decode_display_timing(dev_ofnode(dev), 0, timing);
+       if (err) {
+               dev_err(dev, "failed to get display timing\n");
+               return err;
+       }
+
+       if (timing->pixelclock.typ > (LCDC_FMAX / 2)) {
+               dev_err(dev, "invalid display clock-frequency: %d Hz\n",
+                       timing->pixelclock.typ);
+               return -EINVAL;
+       }
+
+       if (timing->hactive.typ > LCD_MAX_WIDTH)
+               timing->hactive.typ = LCD_MAX_WIDTH;
+
+       if (timing->vactive.typ > LCD_MAX_HEIGHT)
+               timing->vactive.typ = LCD_MAX_HEIGHT;
+
+       node = ofnode_find_subnode(dev_ofnode(dev), "panel-info");
+       if (!ofnode_valid(node)) {
+               dev_err(dev, "missing 'panel-info' node\n");
+               return -ENXIO;
+       }
+
+       err |= ofnode_read_u32(node, "ac-bias", &panel->ac_bias);
+       err |= ofnode_read_u32(node, "ac-bias-intrpt", &panel->ac_bias_intrpt);
+       err |= ofnode_read_u32(node, "dma-burst-sz", &panel->dma_burst_sz);
+       err |= ofnode_read_u32(node, "bpp", &panel->bpp);
+       err |= ofnode_read_u32(node, "fdd", &panel->fdd);
+       err |= ofnode_read_u32(node, "sync-edge", &panel->sync_edge);
+       err |= ofnode_read_u32(node, "sync-ctrl", &panel->sync_ctrl);
+       err |= ofnode_read_u32(node, "raster-order", &panel->raster_order);
+       err |= ofnode_read_u32(node, "fifo-th", &panel->fifo_th);
+       if (err) {
+               dev_err(dev, "failed to get panel info\n");
+               return err;
+       }
+
+       switch (panel->bpp) {
+       case 16:
+       case 24:
+       case 32:
+               break;
+       default:
+               dev_err(dev, "invalid seting, bpp: %d\n", panel->bpp);
+               return -EINVAL;
+       }
+
+       switch (panel->dma_burst_sz) {
+       case 1:
+       case 2:
+       case 4:
+       case 8:
+       case 16:
+               break;
+       default:
+               dev_err(dev, "invalid setting, dma-burst-sz: %d\n",
+                       panel->dma_burst_sz);
+               return -EINVAL;
+       }
+
+       /* optional */
+       panel->tft_alt_mode = ofnode_read_bool(node, "tft-alt-mode");
+       panel->invert_pxl_clk = ofnode_read_bool(node, "invert-pxl-clk");
+
+       dev_dbg(dev, "LCD: %dx%d, bpp=%d, clk=%d Hz\n", timing->hactive.typ,
+               timing->vactive.typ, panel->bpp, timing->pixelclock.typ);
+       dev_dbg(dev, "     hbp=%d, hfp=%d, hsw=%d\n", timing->hback_porch.typ,
+               timing->hfront_porch.typ, timing->hsync_len.typ);
+       dev_dbg(dev, "     vbp=%d, vfp=%d, vsw=%d\n", timing->vback_porch.typ,
+               timing->vfront_porch.typ, timing->vsync_len.typ);
+
+       return 0;
+}
+
+static int am335x_fb_bind(struct udevice *dev)
+{
+       struct video_uc_platdata *uc_plat = dev_get_uclass_platdata(dev);
+
+       uc_plat->size = ((LCD_MAX_WIDTH * LCD_MAX_HEIGHT *
+                         (1 << LCD_MAX_LOG2_BPP)) >> 3) + 0x20;
+
+       dev_dbg(dev, "frame buffer size 0x%x\n", uc_plat->size);
+       return 0;
+}
+
+static const struct udevice_id am335x_fb_ids[] = {
+       { .compatible = "ti,tilcdc,panel" },
+       { }
+};
+
+U_BOOT_DRIVER(am335x_fb) = {
+       .name = "am335x_fb",
+       .id = UCLASS_VIDEO,
+       .of_match = am335x_fb_ids,
+       .bind = am335x_fb_bind,
+       .ofdata_to_platdata = am335x_fb_ofdata_to_platdata,
+       .probe = am335x_fb_probe,
+       .remove = am335x_fb_remove,
+       .priv_auto_alloc_size = sizeof(struct am335x_fb_priv),
+};
+
+#endif /* CONFIG_DM_VIDEO */
index f5883c02ddd317d2917b44281ccf4830b2432803..c9f92bc3895dd9baf6ad1493bd3cd6c15d31e851 100644 (file)
@@ -7,7 +7,9 @@
 #ifndef AM335X_FB_H
 #define AM335X_FB_H
 
-#define HSVS_CONTROL   (0x01 << 25)    /*
+#if !CONFIG_IS_ENABLED(DM_VIDEO)
+
+#define HSVS_CONTROL           BIT(25) /*
                                         * 0 = lcd_lp and lcd_fp are driven on
                                         * opposite edges of pixel clock than
                                         * the lcd_pixel_o
@@ -17,7 +19,7 @@
                                         * Matrix displays the edge timing is
                                         * fixed
                                         */
-#define HSVS_RISEFALL  (0x01 << 24)    /*
+#define HSVS_RISEFALL          BIT(24) /*
                                         * 0 = lcd_lp and lcd_fp are driven on
                                         * the rising edge of pixel clock (bit
                                         * 25 must be set to 1)
                                         * the falling edge of pixel clock (bit
                                         * 25 must be set to 1)
                                         */
-#define DE_INVERT      (0x01 << 23)    /*
+#define DE_INVERT              BIT(23) /*
                                         * 0 = DE is low-active
                                         * 1 = DE is high-active
                                         */
-#define PXCLK_INVERT   (0x01 << 22)    /*
+#define PXCLK_INVERT           BIT(22) /*
                                         * 0 = pix-clk is high-active
                                         * 1 = pic-clk is low-active
                                         */
-#define HSYNC_INVERT   (0x01 << 21)    /*
+#define HSYNC_INVERT           BIT(21) /*
                                         * 0 = HSYNC is active high
                                         * 1 = HSYNC is avtive low
                                         */
-#define VSYNC_INVERT   (0x01 << 20)    /*
+#define VSYNC_INVERT           BIT(20) /*
                                         * 0 = VSYNC is active high
                                         * 1 = VSYNC is active low
                                         */
@@ -68,4 +70,6 @@ struct am335x_lcdpanel {
 
 int am335xfb_init(struct am335x_lcdpanel *panel);
 
+#endif  /* CONFIG_DM_VIDEO */
+
 #endif  /* AM335X_FB_H */
index 31f0aa7ddcc456d9f38d4cb0cac798cbcf416dc9..4e1720ef7ea2ed095086bfcc919fdd274e4c042a 100644 (file)
@@ -1014,7 +1014,6 @@ static void sunxi_mode_set(const struct ctfb_res_modes *mode,
 static const char *sunxi_get_mon_desc(enum sunxi_monitor monitor)
 {
        switch (monitor) {
-       case sunxi_monitor_none:                return "none";
        case sunxi_monitor_dvi:                 return "dvi";
        case sunxi_monitor_hdmi:                return "hdmi";
        case sunxi_monitor_lcd:                 return "lcd";
@@ -1023,8 +1022,9 @@ static const char *sunxi_get_mon_desc(enum sunxi_monitor monitor)
        case sunxi_monitor_composite_ntsc:      return "composite-ntsc";
        case sunxi_monitor_composite_pal_m:     return "composite-pal-m";
        case sunxi_monitor_composite_pal_nc:    return "composite-pal-nc";
+       case sunxi_monitor_none:                /* fall through */
+       default:                                return "none";
        }
-       return NULL; /* never reached */
 }
 
 ulong board_get_usable_ram_top(ulong total_size)
index cb4da2e3cf8804ac0b38a4e8b022084ed8c4c7b3..6cafd243e049841251470929be7b83c7b3567e37 100644 (file)
@@ -185,6 +185,15 @@ config XILINX_TB_WATCHDOG
          Select this to enable Xilinx Axi watchdog timer, which can be found on some
          Xilinx Microblaze Platforms.
 
+config WDT_XILINX
+       bool "Xilinx window watchdog timer support"
+       depends on WDT && ARCH_VERSAL
+       select REGMAP
+       imply WATCHDOG
+       help
+         Select this to enable Xilinx window watchdog timer, which can be found on
+         Xilinx Versal Platforms.
+
 config WDT_TANGIER
        bool "Intel Tangier watchdog timer support"
        depends on WDT && INTEL_MID
index 87f92a43b14e5afe78af561108f5aa2081323151..519bbd3a40fc4db15f84aa9631e50f9b770948d8 100644 (file)
@@ -30,3 +30,4 @@ obj-$(CONFIG_WDT_OMAP3) += omap_wdt.o
 obj-$(CONFIG_WDT_SP805) += sp805_wdt.o
 obj-$(CONFIG_WDT_STM32MP) += stm32mp_wdt.o
 obj-$(CONFIG_WDT_TANGIER) += tangier_wdt.o
+obj-$(CONFIG_WDT_XILINX) += xilinx_wwdt.o
index 775f06a6e1c20b46ab86affbbc76794f9b320d16..5bf02605a884c9432e61e665310e189d70173822 100644 (file)
@@ -15,8 +15,6 @@
 #include <linux/err.h>
 #include <linux/io.h>
 
-DECLARE_GLOBAL_DATA_PTR;
-
 struct cdns_regs {
        u32 zmr;        /* WD Zero mode register, offset - 0x0 */
        u32 ccr;        /* Counter Control Register offset - 0x4 */
diff --git a/drivers/watchdog/xilinx_wwdt.c b/drivers/watchdog/xilinx_wwdt.c
new file mode 100644 (file)
index 0000000..d8a585a
--- /dev/null
@@ -0,0 +1,179 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Xilinx window watchdog timer driver.
+ *
+ * Author(s):  Michal Simek <michal.simek@xilinx.com>
+ *             Ashok Reddy Soma <ashokred@xilinx.com>
+ *
+ * Copyright (c) 2020, Xilinx Inc.
+ */
+
+#include <clk.h>
+#include <common.h>
+#include <dm.h>
+#include <regmap.h>
+#include <wdt.h>
+#include <linux/compat.h>
+#include <linux/io.h>
+
+/* Refresh Register Masks */
+#define XWT_WWREF_GWRR_MASK    BIT(0) /* Refresh and start new period */
+
+/* Generic Control/Status Register Masks */
+#define XWT_WWCSR_GWEN_MASK    BIT(0) /* Enable Bit */
+
+/* Register offsets for the Wdt device */
+#define XWT_WWREF_OFFSET       0x1000 /* Refresh Register */
+#define XWT_WWCSR_OFFSET       0x2000 /* Control/Status Register */
+#define XWT_WWOFF_OFFSET       0x2008 /* Offset Register */
+#define XWT_WWCMP0_OFFSET      0x2010 /* Compare Value Register0 */
+#define XWT_WWCMP1_OFFSET      0x2014 /* Compare Value Register1 */
+#define XWT_WWWRST_OFFSET      0x2FD0 /* Warm Reset Register */
+
+struct xlnx_wwdt_priv {
+       bool enable_once;
+       struct regmap *regs;
+       struct clk clk;
+};
+
+struct xlnx_wwdt_platdata {
+       bool enable_once;
+};
+
+static int xlnx_wwdt_reset(struct udevice *dev)
+{
+       struct xlnx_wwdt_priv *wdt = dev_get_priv(dev);
+
+       regmap_write(wdt->regs, XWT_WWREF_OFFSET, XWT_WWREF_GWRR_MASK);
+
+       return 0;
+}
+
+static int xlnx_wwdt_stop(struct udevice *dev)
+{
+       u32 csr;
+       struct xlnx_wwdt_priv *wdt = dev_get_priv(dev);
+
+       if (wdt->enable_once) {
+               dev_warn(dev, "Can't stop Xilinx watchdog.\n");
+               return -EBUSY;
+       }
+
+       /* Disable the generic watchdog timer */
+       regmap_read(wdt->regs, XWT_WWCSR_OFFSET, &csr);
+       csr &= ~(XWT_WWCSR_GWEN_MASK);
+       regmap_write(wdt->regs, XWT_WWCSR_OFFSET, csr);
+
+       clk_disable(&wdt->clk);
+
+       dev_dbg(dev, "Watchdog disabled!\n");
+
+       return 0;
+}
+
+static int xlnx_wwdt_start(struct udevice *dev, u64 timeout, ulong flags)
+{
+       int ret;
+       u32 csr;
+       u64 count;
+       unsigned long clock_f;
+       struct xlnx_wwdt_priv *wdt = dev_get_priv(dev);
+
+       clock_f = clk_get_rate(&wdt->clk);
+       if (IS_ERR_VALUE(clock_f)) {
+               dev_err(dev, "failed to get rate\n");
+               return clock_f;
+       }
+
+       dev_dbg(dev, "%s: CLK %ld\n", __func__, clock_f);
+
+       /* Calculate timeout count */
+       count = timeout * clock_f;
+
+       /* clk_enable will return -ENOSYS when it is not implemented */
+       ret = clk_enable(&wdt->clk);
+       if (ret && ret != -ENOSYS) {
+               dev_err(dev, "failed to enable clock\n");
+               return ret;
+       }
+
+       /*
+        * Timeout count is half as there are two windows
+        * first window overflow is ignored (interrupt),
+        * reset is only generated at second window overflow
+        */
+       count = count >> 1;
+
+       /* Disable the generic watchdog timer */
+       regmap_read(wdt->regs, XWT_WWCSR_OFFSET, &csr);
+       csr &= ~(XWT_WWCSR_GWEN_MASK);
+       regmap_write(wdt->regs, XWT_WWCSR_OFFSET, csr);
+
+       /* Set compare and offset registers for generic watchdog timeout */
+       regmap_write(wdt->regs, XWT_WWCMP0_OFFSET, (u32)count);
+       regmap_write(wdt->regs, XWT_WWCMP1_OFFSET, 0);
+       regmap_write(wdt->regs, XWT_WWOFF_OFFSET, (u32)count);
+
+       /* Enable the generic watchdog timer */
+       regmap_read(wdt->regs, XWT_WWCSR_OFFSET, &csr);
+       csr |= (XWT_WWCSR_GWEN_MASK);
+       regmap_write(wdt->regs, XWT_WWCSR_OFFSET, csr);
+
+       return 0;
+}
+
+static int xlnx_wwdt_probe(struct udevice *dev)
+{
+       int ret;
+       struct xlnx_wwdt_platdata *platdata = dev_get_platdata(dev);
+       struct xlnx_wwdt_priv *wdt = dev_get_priv(dev);
+
+       dev_dbg(dev, "%s: Probing wdt%u\n", __func__, dev->seq);
+
+       ret = regmap_init_mem(dev_ofnode(dev), &wdt->regs);
+       if (ret) {
+               dev_dbg(dev, "failed to get regbase of wwdt\n");
+               return ret;
+       }
+
+       wdt->enable_once = platdata->enable_once;
+
+       ret = clk_get_by_index(dev, 0, &wdt->clk);
+       if (ret < 0)
+               dev_err(dev, "failed to get clock\n");
+
+       return ret;
+}
+
+static int xlnx_wwdt_ofdata_to_platdata(struct udevice *dev)
+{
+       struct xlnx_wwdt_platdata *platdata = dev_get_platdata(dev);
+
+       platdata->enable_once = dev_read_u32_default(dev,
+                                                    "xlnx,wdt-enable-once", 0);
+       dev_dbg(dev, "wdt-enable-once %d\n", platdata->enable_once);
+
+       return 0;
+}
+
+static const struct wdt_ops xlnx_wwdt_ops = {
+       .start = xlnx_wwdt_start,
+       .reset = xlnx_wwdt_reset,
+       .stop = xlnx_wwdt_stop,
+};
+
+static const struct udevice_id xlnx_wwdt_ids[] = {
+       { .compatible = "xlnx,versal-wwdt-1.0", },
+       {},
+};
+
+U_BOOT_DRIVER(xlnx_wwdt) = {
+       .name = "xlnx_wwdt",
+       .id = UCLASS_WDT,
+       .of_match = xlnx_wwdt_ids,
+       .probe = xlnx_wwdt_probe,
+       .priv_auto_alloc_size = sizeof(struct xlnx_wwdt_priv),
+       .platdata_auto_alloc_size = sizeof(struct xlnx_wwdt_platdata),
+       .ofdata_to_platdata = xlnx_wwdt_ofdata_to_platdata,
+       .ops = &xlnx_wwdt_ops,
+};
index 0d6f559b39d3c9af9ad42a68387180fdffdecad6..8ab7be11c5be3fe7848267e8c50faf349ea7ed09 100644 (file)
@@ -404,8 +404,7 @@ config SYS_REDUNDAND_ENVIRONMENT
 config ENV_FAT_INTERFACE
        string "Name of the block device for the environment"
        depends on ENV_IS_IN_FAT
-       default "mmc" if ARCH_SUNXI
-       default "mmc" if TI_COMMON_CMD_OPTIONS || ARCH_ZYNQMP || ARCH_AT91
+       default "mmc"
        help
          Define this to a string that is the name of the block device.
 
@@ -500,6 +499,7 @@ config ENV_OFFSET
        default 0 if ARC
        default 0x140000 if ARCH_AT91
        default 0x260000 if ARCH_OMAP2PLUS
+       default 0x1080000 if MICROBLAZE && ENV_IS_IN_SPI_FLASH
        help
          Offset from the start of the device (or partition)
 
@@ -529,6 +529,7 @@ config ENV_SECT_SIZE
        default 0x2000 if ARCH_ROCKCHIP
        default 0x40000 if ARCH_ZYNQMP || ARCH_VERSAL
        default 0x20000 if ARCH_ZYNQ || ARCH_OMAP2PLUS || ARCH_AT91
+       default 0x20000 if MICROBLAZE && ENV_IS_IN_SPI_FLASH
        help
          Size of the sector containing the environment.
 
index 0b17a91804cf7fdd0f0e3f4e9361295d463bfdc7..779e2528b77e8a8494855d639d85479ed4552731 100644 (file)
@@ -55,7 +55,7 @@ $(LIB):       $(LIBOBJS) FORCE
        $(call if_changed,link_lib)
 
 quiet_cmd_link_elf = LD      $@
-      cmd_link_elf = $(LD) $(LDFLAGS) $(LDFLAGS_STANDALONE) -g  \
+      cmd_link_elf = $(LD) $(KBUILD_LDFLAGS) $(LDFLAGS_STANDALONE) -g  \
                     -o $@ -e $(SYM_PREFIX)$(@F) $< $(LIB) $(PLATFORM_LIBGCC)
 
 $(ELF): $(obj)/%: $(obj)/%.o $(LIB) FORCE
index 5d027329fe0f048c6b9ba88b84510cfcbe734872..d9e220cfe3582eaf2bca571495cb7dd3ac0d13ba 100644 (file)
@@ -25,7 +25,7 @@
 #include <linux/list.h>
 
 typedef struct global_data {
-       bd_t *bd;
+       struct bd_info *bd;
        unsigned long flags;
        unsigned int baudrate;
        unsigned long cpu_clk;          /* CPU clock in Hz!             */
index eee84f49bb17a98caa12358915e9f4f68d98c6bd..cc94d39069e11b4f9d3fe06eed68457191256335 100644 (file)
@@ -23,6 +23,8 @@
 
 #ifndef __ASSEMBLY__
 
+#include <linux/types.h>
+
 typedef struct bd_info {
        unsigned long   bi_memstart;    /* start of DRAM memory */
        phys_size_t     bi_memsize;     /* size  of DRAM memory in bytes */
index 23ee2254edb712e28d761ab9096661baa7b23153..19d861d40288ee73682dda488391dd3a6a5d2fc4 100644 (file)
@@ -73,7 +73,8 @@
        "name_kern=Image\0"                                             \
        "console=ttyS2,115200n8\0"                                      \
        "stdin=serial,usbkbd\0"                                         \
-       "args_all=setenv optargs earlycon=ns16550a,mmio32,0x02800000\0" \
+       "args_all=setenv optargs earlycon=ns16550a,mmio32,0x02800000 "  \
+               "${mtdparts}\0"                                         \
        "run_kern=booti ${loadaddr} ${rd_spec} ${fdtaddr}\0"            \
 
 /* U-Boot MMC-specific configuration */
                "0 /lib/firmware/am65x-mcu-r5f0_0-fw "                  \
                "1 /lib/firmware/am65x-mcu-r5f0_1-fw "
 
+#ifdef CONFIG_TARGET_AM654_A53_EVM
+#define EXTRA_ENV_AM65X_BOARD_SETTINGS_MTD                             \
+       "mtdids=" CONFIG_MTDIDS_DEFAULT "\0"                            \
+       "mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0"
+#else
+#define EXTRA_ENV_AM65X_BOARD_SETTINGS_MTD
+#endif
+
+#define EXTRA_ENV_AM65X_BOARD_SETTINGS_UBI                             \
+       "init_ubi=run args_all args_ubi; sf probe; "                    \
+               "ubi part ospi.rootfs; ubifsmount ubi:rootfs;\0"        \
+       "get_kern_ubi=ubifsload ${loadaddr} ${bootdir}/${name_kern}\0"  \
+       "get_fdt_ubi=ubifsload ${fdtaddr} ${bootdir}/${name_fdt}\0"     \
+       "args_ubi=setenv bootargs console=${console} ${optargs} "       \
+               "rootfstype=ubifs root=ubi0:rootfs rw ubi.mtd=ospi.rootfs\0"
+
 #define EXTRA_ENV_DFUARGS                                              \
        "dfu_bufsiz=0x20000\0"                                          \
        DFU_ALT_INFO_MMC                                                \
        DEFAULT_FIT_TI_ARGS                                             \
        EXTRA_ENV_AM65X_BOARD_SETTINGS                                  \
        EXTRA_ENV_AM65X_BOARD_SETTINGS_MMC                              \
+       EXTRA_ENV_AM65X_BOARD_SETTINGS_MTD                              \
+       EXTRA_ENV_AM65X_BOARD_SETTINGS_UBI                              \
        EXTRA_ENV_RPROC_SETTINGS                                        \
        EXTRA_ENV_DFUARGS
 
index ea15912c900ede719f4feb62f871f53d08fa23e9..006663373bafcc6a400ebf91f4677ab289de13c4 100644 (file)
@@ -14,7 +14,9 @@
 #include <configs/bur_cfg_common.h>
 #include <configs/bur_am335x_common.h>
 /* ------------------------------------------------------------------------- */
+#if !defined(CONFIG_AM335X_LCD)
 #define CONFIG_AM335X_LCD
+#endif
 #define LCD_BPP                                LCD_COLOR32
 
 /* memory */
index 4371c471e5a9f3c30cbbad578d9c8510c832ffe2..7488b661f53a166721cc1f402ea2f78ff45c8112 100644 (file)
@@ -74,7 +74,8 @@
        "overlayaddr=0x83000000\0"                                      \
        "name_kern=Image\0"                                             \
        "console=ttyS2,115200n8\0"                                      \
-       "args_all=setenv optargs earlycon=ns16550a,mmio32,0x02800000\0" \
+       "args_all=setenv optargs earlycon=ns16550a,mmio32,0x02800000 "  \
+               "${mtdparts}\0"                                         \
        "run_kern=booti ${loadaddr} ${rd_spec} ${fdtaddr}\0"
 
 #define PARTS_DEFAULT \
        "mmcdev=1\0"                                                    \
        "bootpart=1:2\0"                                                \
        "bootdir=/boot\0"                                               \
+       "addr_mainr5f0_0load=88000000\0"                                        \
+       "name_mainr5f0_0fw=/lib/firmware/j7-main-r5f0_0-fw\0"           \
+       "addr_mcur5f0_0load=89000000\0"                                 \
+       "name_mcur5f0_0fw=/lib/firmware/j7-mcu-r5f0_0-fw\0"             \
        "rd_spec=-\0"                                                   \
        "init_mmc=run args_all args_mmc\0"                              \
        "get_fdt_mmc=load mmc ${bootpart} ${fdtaddr} ${bootdir}/${name_fdt}\0" \
        DFU_ALT_INFO_RAM \
        DFU_ALT_INFO_OSPI
 
+#ifdef CONFIG_TARGET_J721E_A72_EVM
+#define EXTRA_ENV_J721E_BOARD_SETTINGS_MTD                             \
+       "mtdids=" CONFIG_MTDIDS_DEFAULT "\0"                            \
+       "mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0"
+#else
+#define EXTRA_ENV_J721E_BOARD_SETTINGS_MTD
+#endif
+
 /* Incorporate settings into the U-Boot environment */
 #define CONFIG_EXTRA_ENV_SETTINGS                                      \
        DEFAULT_MMC_TI_ARGS                                             \
        EXTRA_ENV_J721E_BOARD_SETTINGS_MMC                              \
        EXTRA_ENV_RPROC_SETTINGS                                        \
        EXTRA_ENV_DFUARGS                                               \
-       DEFAULT_UFS_TI_ARGS
+       DEFAULT_UFS_TI_ARGS                                             \
+       EXTRA_ENV_J721E_BOARD_SETTINGS_MTD
 
 /* Now for the remaining common defines */
 #include <configs/ti_armv7_common.h>
index b1cef4d4695f6ad2012a509d02bf8bb7e6669dab..1eaf65b0a2a105ef8a63dc227365946395e6099c 100644 (file)
 
 /* NOR */
 #ifdef CONFIG_MTD_NOR_FLASH
-# define CONFIG_SYS_FLASH_BASE         0xE2000000
-# define CONFIG_SYS_FLASH_SIZE         (16 * 1024 * 1024)
 # define CONFIG_SYS_MAX_FLASH_BANKS    1
 # define CONFIG_SYS_MAX_FLASH_SECT     512
 # define CONFIG_SYS_FLASH_ERASE_TOUT   1000
 # define CONFIG_SYS_FLASH_WRITE_TOUT   5000
 # define CONFIG_FLASH_SHOW_PROGRESS    10
 # undef CONFIG_SYS_FLASH_EMPTY_INFO
+# define CONFIG_SYS_FLASH_QUIET_TEST
 #endif
 
 #ifdef CONFIG_NAND_ZYNQ
index cd70ae1a0447703e7f57021ee1ed910a97d83712..4d1c58075cf0de33ed126582fe1d2d876353e8b4 100644 (file)
@@ -88,28 +88,28 @@ void printascii(const char *str);
  *
  * @value:     Value to output
  */
-void printhex2(uint value);
+void printhex2(unsigned int value);
 
 /**
  * printhex4() - Output a 4-digit hex value
  *
  * @value:     Value to output
  */
-void printhex4(uint value);
+void printhex4(unsigned int value);
 
 /**
  * printhex8() - Output a 8-digit hex value
  *
  * @value:     Value to output
  */
-void printhex8(uint value);
+void printhex8(unsigned int value);
 
 /**
  * printdec() - Output a decimalism value
  *
  * @value:     Value to output
  */
-void printdec(uint value);
+void printdec(unsigned int value);
 
 #ifdef CONFIG_DEBUG_UART_ANNOUNCE
 #define _DEBUG_UART_ANNOUNCE   printascii("<debug_uart> ");
@@ -151,34 +151,34 @@ void printdec(uint value);
                        _printch(*str++); \
        } \
 \
-       static inline void printhex1(uint digit) \
+       static inline void printhex1(unsigned int digit) \
        { \
                digit &= 0xf; \
                _debug_uart_putc(digit > 9 ? digit - 10 + 'a' : digit + '0'); \
        } \
 \
-       static inline void printhex(uint value, int digits) \
+       static inline void printhex(unsigned int value, int digits) \
        { \
                while (digits-- > 0) \
                        printhex1(value >> (4 * digits)); \
        } \
 \
-       void printhex2(uint value) \
+       void printhex2(unsigned int value) \
        { \
                printhex(value, 2); \
        } \
 \
-       void printhex4(uint value) \
+       void printhex4(unsigned int value) \
        { \
                printhex(value, 4); \
        } \
 \
-       void printhex8(uint value) \
+       void printhex8(unsigned int value) \
        { \
                printhex(value, 8); \
        } \
 \
-       void printdec(uint value) \
+       void printdec(unsigned int value) \
        { \
                if (value > 10) { \
                        printdec(value / 10); \
index 75901c636893c7ddb67c3777be1f97f0b042ebd0..f561f5c5ef8f281a23bced0b79ca4a026cbf8eed 100644 (file)
 #define AUD_CLKID_TDM_SCLK_PAD0                160
 #define AUD_CLKID_TDM_SCLK_PAD1                161
 #define AUD_CLKID_TDM_SCLK_PAD2                162
+#define AUD_CLKID_TOP                  163
+#define AUD_CLKID_TORAM                        164
+#define AUD_CLKID_EQDRC                        165
+#define AUD_CLKID_RESAMPLE_B           166
+#define AUD_CLKID_TOVAD                        167
+#define AUD_CLKID_LOCKER               168
+#define AUD_CLKID_SPDIFIN_LB           169
+#define AUD_CLKID_FRDDR_D              170
+#define AUD_CLKID_TODDR_D              171
+#define AUD_CLKID_LOOPBACK_B           172
 
 #endif /* __AXG_AUDIO_CLKC_BINDINGS_H */
index 9d15e2221fdb7fd5f732eaa5a800f7b66112f8a5..ec3b26319fc494e812e3e3d02e659245c6a00d78 100644 (file)
 #define CLKID_AO_UART2         4
 #define CLKID_AO_IR_BLASTER    5
 #define CLKID_AO_CEC_32K       6
+#define CLKID_AO_CTS_OSCIN     7
+#define CLKID_AO_32K_PRE       8
+#define CLKID_AO_32K_DIV       9
+#define CLKID_AO_32K_SEL       10
+#define CLKID_AO_32K           11
+#define CLKID_AO_CTS_RTC_OSCIN 12
+#define CLKID_AO_CLK81         13
 
 #endif
index 8ba99a5e3fd34a64f8581ca51cedd47f11e803c5..db0763e96173ad8afde275856e060bf7b89c12c2 100644 (file)
 #define CLKID_VAPB_1           138
 #define CLKID_VAPB_SEL         139
 #define CLKID_VAPB             140
+#define CLKID_VDEC_1           153
+#define CLKID_VDEC_HEVC                156
+#define CLKID_GEN_CLK          159
+#define CLKID_VID_PLL          166
+#define CLKID_VCLK             175
+#define CLKID_VCLK2            176
+#define CLKID_VCLK_DIV1                185
+#define CLKID_VCLK_DIV2                186
+#define CLKID_VCLK_DIV4                187
+#define CLKID_VCLK_DIV6                188
+#define CLKID_VCLK_DIV12       189
+#define CLKID_VCLK2_DIV1       190
+#define CLKID_VCLK2_DIV2       191
+#define CLKID_VCLK2_DIV4       192
+#define CLKID_VCLK2_DIV6       193
+#define CLKID_VCLK2_DIV12      194
+#define CLKID_CTS_ENCI         199
+#define CLKID_CTS_ENCP         200
+#define CLKID_CTS_VDAC         201
+#define CLKID_HDMI_TX          202
+#define CLKID_HDMI             205
 
 #endif /* __GXBB_CLKC_H */
index 43a68a1110f043f3eaab908c554d20f30a9aeb33..489c75b27645d34fc6e82ad6ef7f8388accbb734 100644 (file)
@@ -1,15 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
 /*
  * GPIO definitions for Amlogic Meson GXBB SoCs
  *
  * Copyright (C) 2016 Endless Mobile, Inc.
  * Author: Carlo Caione <carlo@endlessm.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #ifndef _DT_BINDINGS_MESON_GXBB_GPIO_H
index 01f2a2abd35eea91bad49c60c478a47d461502eb..0a001ae48272e547f463ca0bf90536f754d43cad 100644 (file)
@@ -1,15 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
 /*
  * GPIO definitions for Amlogic Meson GXL SoCs
  *
  * Copyright (C) 2016 Endless Mobile, Inc.
  * Author: Carlo Caione <carlo@endlessm.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #ifndef _DT_BINDINGS_MESON_GXL_GPIO_H
diff --git a/include/dt-bindings/leds/common.h b/include/dt-bindings/leds/common.h
new file mode 100644 (file)
index 0000000..9e1256a
--- /dev/null
@@ -0,0 +1,75 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * This header provides macros for the common LEDs device tree bindings.
+ *
+ * Copyright (C) 2015, Samsung Electronics Co., Ltd.
+ * Author: Jacek Anaszewski <j.anaszewski@samsung.com>
+ *
+ * Copyright (C) 2019 Jacek Anaszewski <jacek.anaszewski@gmail.com>
+ */
+
+#ifndef __DT_BINDINGS_LEDS_H
+#define __DT_BINDINGS_LEDS_H
+
+/* External trigger type */
+#define LEDS_TRIG_TYPE_EDGE    0
+#define LEDS_TRIG_TYPE_LEVEL   1
+
+/* Boost modes */
+#define LEDS_BOOST_OFF         0
+#define LEDS_BOOST_ADAPTIVE    1
+#define LEDS_BOOST_FIXED       2
+
+/* Standard LED colors */
+#define LED_COLOR_ID_WHITE     0
+#define LED_COLOR_ID_RED       1
+#define LED_COLOR_ID_GREEN     2
+#define LED_COLOR_ID_BLUE      3
+#define LED_COLOR_ID_AMBER     4
+#define LED_COLOR_ID_VIOLET    5
+#define LED_COLOR_ID_YELLOW    6
+#define LED_COLOR_ID_IR                7
+#define LED_COLOR_ID_MAX       8
+
+/* Standard LED functions */
+#define LED_FUNCTION_ACTIVITY "activity"
+#define LED_FUNCTION_ALARM "alarm"
+#define LED_FUNCTION_BACKLIGHT "backlight"
+#define LED_FUNCTION_BLUETOOTH "bluetooth"
+#define LED_FUNCTION_BOOT "boot"
+#define LED_FUNCTION_CPU "cpu"
+#define LED_FUNCTION_CAPSLOCK "capslock"
+#define LED_FUNCTION_CHARGING "charging"
+#define LED_FUNCTION_DEBUG "debug"
+#define LED_FUNCTION_DISK "disk"
+#define LED_FUNCTION_DISK_ACTIVITY "disk-activity"
+#define LED_FUNCTION_DISK_ERR "disk-err"
+#define LED_FUNCTION_DISK_READ "disk-read"
+#define LED_FUNCTION_DISK_WRITE "disk-write"
+#define LED_FUNCTION_FAULT "fault"
+#define LED_FUNCTION_FLASH "flash"
+#define LED_FUNCTION_HEARTBEAT "heartbeat"
+#define LED_FUNCTION_INDICATOR "indicator"
+#define LED_FUNCTION_KBD_BACKLIGHT "kbd_backlight"
+#define LED_FUNCTION_LAN "lan"
+#define LED_FUNCTION_MAIL "mail"
+#define LED_FUNCTION_MTD "mtd"
+#define LED_FUNCTION_MICMUTE "micmute"
+#define LED_FUNCTION_MUTE "mute"
+#define LED_FUNCTION_NUMLOCK "numlock"
+#define LED_FUNCTION_PANIC "panic"
+#define LED_FUNCTION_PROGRAMMING "programming"
+#define LED_FUNCTION_POWER "power"
+#define LED_FUNCTION_RX "rx"
+#define LED_FUNCTION_SD "sd"
+#define LED_FUNCTION_SCROLLLOCK "scrolllock"
+#define LED_FUNCTION_STANDBY "standby"
+#define LED_FUNCTION_STATUS "status"
+#define LED_FUNCTION_TORCH "torch"
+#define LED_FUNCTION_TX "tx"
+#define LED_FUNCTION_USB "usb"
+#define LED_FUNCTION_WAN "wan"
+#define LED_FUNCTION_WLAN "wlan"
+#define LED_FUNCTION_WPS "wps"
+
+#endif /* __DT_BINDINGS_LEDS_H */
index 05c36367875c8bdaeec3b13b63b6e2fc852de9d3..1ef807856cb8989152e72323a3d6ee895cac0d53 100644 (file)
@@ -13,5 +13,7 @@
 #define AXG_ARB_FRDDR_A        3
 #define AXG_ARB_FRDDR_B        4
 #define AXG_ARB_FRDDR_C        5
+#define AXG_ARB_TODDR_D        6
+#define AXG_ARB_FRDDR_D        7
 
 #endif /* _DT_BINDINGS_AMLOGIC_MESON_AXG_AUDIO_ARB_H */
index ad6f55dabd6d72483fa00911a0c6864906188fda..0f2e0fe45ca4bbbd901dc45831c4a73b81658316 100644 (file)
@@ -1,12 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
 /*
- *
  * Copyright (c) 2016 BayLibre, SAS.
  * Author: Neil Armstrong <narmstrong@baylibre.com>
  *
  * Copyright (c) 2017 Amlogic, inc.
  * Author: Yixun Lan <yixun.lan@amlogic.com>
  *
- * SPDX-License-Identifier: (GPL-2.0+ OR BSD)
  */
 
 #ifndef _DT_BINDINGS_AMLOGIC_MESON_AXG_RESET_H
index 14b78dabed0e16c852b7c9d42989b8f64ee9934b..f805129ca7af7eb744ac044489b428191c4ba552 100644 (file)
 #define AUD_RESET_TOHDMITX     24
 #define AUD_RESET_CLKTREE      25
 
+/* SM1 added resets */
+#define AUD_RESET_RESAMPLE_B   26
+#define AUD_RESET_TOVAD                27
+#define AUD_RESET_LOCKER       28
+#define AUD_RESET_SPDIFIN_LB   29
+#define AUD_RESET_FRATV                30
+#define AUD_RESET_FRHDMIRX     31
+#define AUD_RESET_FRDDR_D      32
+#define AUD_RESET_TODDR_D      33
+#define AUD_RESET_LOOPBACK_B   34
+#define AUD_RESET_EARCTX       35
+#define AUD_RESET_EARCRX       36
+#define AUD_RESET_FRDDR_E      37
+#define AUD_RESET_TODDR_E      38
+
 #endif
index 524d6077ac1bb6853ef4c4a39f30581b096f07ea..ea5058618863f23f120a849c1bb333040e48acd4 100644 (file)
@@ -1,56 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
 /*
- * This file is provided under a dual BSD/GPLv2 license.  When using or
- * redistributing this file, you may do so under either license.
- *
- * GPL LICENSE SUMMARY
- *
  * Copyright (c) 2016 BayLibre, SAS.
  * Author: Neil Armstrong <narmstrong@baylibre.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program 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/>.
- * The full GNU General Public License is included in this distribution
- * in the file called COPYING.
- *
- * BSD LICENSE
- *
- * Copyright (c) 2016 BayLibre, SAS.
- * Author: Neil Armstrong <narmstrong@baylibre.com>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *   * Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   * Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in
- *     the documentation and/or other materials provided with the
- *     distribution.
- *   * Neither the name of Intel Corporation nor the names of its
- *     contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #ifndef _DT_BINDINGS_AMLOGIC_MESON_GXBB_RESET_H
 #define _DT_BINDINGS_AMLOGIC_MESON_GXBB_RESET_H
index 81f40191d73bcaf7b7f5ae0649336002ead3641b..e7c51986df84d986e1b1ac4dd70cd29d4574b77d 100644 (file)
@@ -692,6 +692,10 @@ unsigned long elf_hash(const unsigned char *name);
 
 #ifndef __ASSEMBLER__
 int valid_elf_image(unsigned long addr);
+unsigned long load_elf64_image_phdr(unsigned long addr);
+unsigned long load_elf64_image_shdr(unsigned long addr);
+unsigned long load_elf_image_phdr(unsigned long addr);
+unsigned long load_elf_image_shdr(unsigned long addr);
 #endif
 
 #endif /* _ELF_H */
index 523c8fc4fe9a80ce1fd87909e6697893ce2930d9..11a57af0a4bd17abac9eec18621bbb905018d235 100644 (file)
                "echo \"  Reading DTB for AM57x EVM RevA3...\"; " \
                "abootimg get dtb --index=0 dtb_start dtb_size; " \
                "cp.b $dtb_start $fdtaddr $dtb_size; " \
-               "fdt addr $fdtaddr; " \
+               "fdt addr $fdtaddr 0x80000; " \
                "echo \"  Applying DTBOs for AM57x EVM RevA3...\"; " \
                "adtimg addr $dtboaddr; " \
-               "adtimg get dt --index=0 dtbo0_addr; " \
+               "adtimg get dt --index=0 dtbo0_addr dtbo0_size; " \
                "fdt apply $dtbo0_addr; " \
-               "adtimg get dt --index=1 dtbo1_addr; " \
+               "adtimg get dt --index=1 dtbo1_addr dtbo1_size; " \
                "fdt apply $dtbo1_addr; " \
        "elif test $board_name = beagle_x15_revc; then " \
                "echo \"  Reading DTB for Beagle X15 RevC...\"; " \
                "abootimg get dtb --index=0 dtb_start dtb_size; " \
                "cp.b $dtb_start $fdtaddr $dtb_size; " \
-               "fdt addr $fdtaddr; " \
+               "fdt addr $fdtaddr 0x80000; " \
        "else " \
                "echo Error: Android boot is not supported for $board_name; " \
                "exit; " \
index 0faf8542e283ac97007adeb6566d12dd5f8c8399..059200115a8e030958350e439c3dc0f37e38c0dd 100644 (file)
@@ -330,6 +330,24 @@ uint i2c_get_chip_addr_offset_mask(struct udevice *dev);
  */
 int i2c_deblock(struct udevice *bus);
 
+/**
+ * i2c_deblock_gpio_loop() - recover a bus from an unknown state by toggling SDA/SCL
+ *
+ * This is the inner logic used for toggling I2C SDA/SCL lines as GPIOs
+ * for deblocking the I2C bus.
+ *
+ * @sda_pin:   SDA GPIO
+ * @scl_pin:   SCL GPIO
+ * @scl_count: Number of SCL clock cycles generated to deblock SDA
+ * @start_count:Number of I2C start conditions sent after deblocking SDA
+ * @delay:     Delay between SCL clock line changes
+ * @return 0 if OK, -ve on error
+ */
+struct gpio_desc;
+int i2c_deblock_gpio_loop(struct gpio_desc *sda_pin, struct gpio_desc *scl_pin,
+                         unsigned int scl_count, unsigned int start_count,
+                         unsigned int delay);
+
 /**
  * struct dm_i2c_ops - driver operations for I2C uclass
  *
index b96254ae79f5bb7cc071e005efd41934f92e5d56..cd620d519fca478307a9f511ad69585c92d8d872 100644 (file)
@@ -16,8 +16,6 @@ struct i2c_eeprom_ops {
 struct i2c_eeprom {
        /* The EEPROM's page size in byte */
        unsigned long pagesize;
-       /* The EEPROM's page width in bits (pagesize = 2^pagewidth) */
-       unsigned pagewidth;
        /* The EEPROM's capacity in bytes */
        unsigned long size;
 };
index 3ffc0fdd6822a1ba6a68d2a81e53f5b42ced3528..2388c1f2044742b08fde276df0858413171b3c1b 100644 (file)
@@ -1136,6 +1136,7 @@ int fit_conf_get_prop_node(const void *fit, int noffset,
 
 int fit_check_ramdisk(const void *fit, int os_noffset,
                uint8_t arch, int verify);
+#endif /* IMAGE_ENABLE_FIT */
 
 int calculate_hash(const void *data, int data_len, const char *algo,
                        uint8_t *value, int *value_len);
@@ -1148,16 +1149,20 @@ int calculate_hash(const void *data, int data_len, const char *algo,
 # if defined(CONFIG_FIT_SIGNATURE)
 #  define IMAGE_ENABLE_SIGN    1
 #  define IMAGE_ENABLE_VERIFY  1
+#  define FIT_IMAGE_ENABLE_VERIFY      1
 #  include <openssl/evp.h>
 # else
 #  define IMAGE_ENABLE_SIGN    0
 #  define IMAGE_ENABLE_VERIFY  0
+#  define FIT_IMAGE_ENABLE_VERIFY      0
 # endif
 #else
 # define IMAGE_ENABLE_SIGN     0
-# define IMAGE_ENABLE_VERIFY   CONFIG_IS_ENABLED(FIT_SIGNATURE)
+# define IMAGE_ENABLE_VERIFY           CONFIG_IS_ENABLED(RSA_VERIFY)
+# define FIT_IMAGE_ENABLE_VERIFY       CONFIG_IS_ENABLED(FIT_SIGNATURE)
 #endif
 
+#if IMAGE_ENABLE_FIT
 #ifdef USE_HOSTCC
 void *image_get_host_blob(void);
 void image_set_host_blob(void *host_blob);
@@ -1171,6 +1176,7 @@ void image_set_host_blob(void *host_blob);
 #else
 #define IMAGE_ENABLE_BEST_MATCH        0
 #endif
+#endif /* IMAGE_ENABLE_FIT */
 
 /* Information passed to the signing routines */
 struct image_sign_info {
@@ -1186,18 +1192,21 @@ struct image_sign_info {
        int required_keynode;           /* Node offset of key to use: -1=any */
        const char *require_keys;       /* Value for 'required' property */
        const char *engine_id;          /* Engine to use for signing */
+       /*
+        * Note: the following two fields are always valid even w/o
+        * RSA_VERIFY_WITH_PKEY in order to make sure this structure is
+        * the same on target and host. Otherwise, vboot test may fail.
+        */
+       const void *key;                /* Pointer to public key in DER */
+       int keylen;                     /* Length of public key */
 };
 
-#endif /* Allow struct image_region to always be defined for rsa.h */
-
 /* A part of an image, used for hashing */
 struct image_region {
        const void *data;
        int size;
 };
 
-#if IMAGE_ENABLE_FIT
-
 #if IMAGE_ENABLE_VERIFY
 # include <u-boot/rsa-checksum.h>
 #endif
@@ -1298,6 +1307,8 @@ struct crypto_algo *image_get_crypto_algo(const char *full_name);
  */
 struct padding_algo *image_get_padding_algo(const char *name);
 
+#if IMAGE_ENABLE_FIT
+
 /**
  * fit_image_verify_required_sigs() - Verify signatures marked as 'required'
  *
@@ -1438,6 +1449,7 @@ struct cipher_algo *image_get_cipher_algo(const char *full_name);
 #endif /* CONFIG_FIT_VERBOSE */
 #endif /* CONFIG_FIT */
 
+#if !defined(USE_HOSTCC)
 #if defined(CONFIG_ANDROID_BOOT_IMAGE)
 struct andr_img_hdr;
 int android_image_check_header(const struct andr_img_hdr *hdr);
@@ -1459,6 +1471,7 @@ bool android_image_print_dtb_contents(ulong hdr_addr);
 #endif
 
 #endif /* CONFIG_ANDROID_BOOT_IMAGE */
+#endif /* !USE_HOSTCC */
 
 /**
  * board_fit_config_name_match() - Check for a matching board name
index 1cba8d9b790406231089a41daac28254ee3acbde..8c4863efe19167c019e539b77cf2856bab119e92 100644 (file)
@@ -327,8 +327,6 @@ struct ti_sci_proc_ops {
 /**
  * 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,
@@ -336,10 +334,6 @@ struct ti_sci_rm_ringacc_ops {
                      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);
 };
 
 /**
index dc8b5a745915a8f471e1b59047727b7109abb4d9..1493a677f048e6e8f5a90baa71c61def4b2f5dc8 100644 (file)
@@ -37,6 +37,7 @@
 #define STPMIC1_BUCK_VOUT(sel)         (sel << STPMIC1_BUCK_VOUT_SHIFT)
 
 #define STPMIC1_BUCK2_1200000V         STPMIC1_BUCK_VOUT(24)
+#define STPMIC1_BUCK2_1250000V         STPMIC1_BUCK_VOUT(26)
 #define STPMIC1_BUCK2_1350000V         STPMIC1_BUCK_VOUT(30)
 
 #define STPMIC1_BUCK3_1800000V         STPMIC1_BUCK_VOUT(39)
index 6087cd793c26154909bf6c66348c902aa0e264ce..5d8d14dbf5cd5ac6d7a66a69bece7a2d376bb5f3 100644 (file)
 
 /* Platform-specific defines */
 #include <linux/compiler.h>
+#include <asm/global_data.h>
 #include <asm/spl.h>
 #include <handoff.h>
 
+struct blk_desc;
+struct image_header;
+
 /* Value in r0 indicates we booted from U-Boot */
 #define UBOOT_NOT_LOADED_FROM_SPL      0x13578642
 
index 8a428c4b6a1ac88fcbe5ef5fce62b0e356a3c11c..1da8af1bb83dbbf37cff2f392d3717b7bcea237c 100644 (file)
@@ -26,6 +26,29 @@ struct key_prop {
        uint32_t exp_len;       /* Exponent length in number of uint8_t */
 };
 
+/**
+ * rsa_gen_key_prop() - Generate key properties of RSA public key
+ * @key:       Specifies key data in DER format
+ * @keylen:    Length of @key
+ * @prop:      Generated key property
+ *
+ * This function takes a blob of encoded RSA public key data in DER
+ * format, parse it and generate all the relevant properties
+ * in key_prop structure.
+ * Return a pointer to struct key_prop in @prop on success.
+ *
+ * Return:     0 on success, negative on error
+ */
+int rsa_gen_key_prop(const void *key, uint32_t keylen, struct key_prop **proc);
+
+/**
+ * rsa_free_key_prop() - Free key properties
+ * @prop:      Pointer to struct key_prop
+ *
+ * This function frees all the memories allocated by rsa_gen_key_prop().
+ */
+void rsa_free_key_prop(struct key_prop *prop);
+
 /**
  * rsa_mod_exp_sw() - Perform RSA Modular Exponentiation in sw
  *
index ab6aff710dd6e430ab41e17f0a889275208415bc..452f390c8024845c6e7be9bda8ffa1c4bb206425 100644 (file)
@@ -602,4 +602,10 @@ config TEST_FDTDEC
 config LIB_DATE
        bool
 
+config LIB_ELF
+       bool
+       help
+         Supoort basic elf loading/validating functions.
+         This supports fir 32 bit and 64 bit versions.
+
 endmenu
index 15259d0473c4032b0c22c5af5a2cf013d018baba..32bf3f36931e50610ad9a7dd312ca0b9e132d4a9 100644 (file)
@@ -122,6 +122,7 @@ obj-y += vsprintf.o strto.o
 endif
 
 obj-y += date.o
+obj-$(CONFIG_LIB_ELF) += elf.o
 
 #
 # Build a fast OID lookup registry from include/linux/oid_registry.h
diff --git a/lib/elf.c b/lib/elf.c
new file mode 100644 (file)
index 0000000..d074e4e
--- /dev/null
+++ b/lib/elf.c
@@ -0,0 +1,246 @@
+// SPDX-License-Identifier: BSD-2-Clause
+/*
+   Copyright (c) 2001 William L. Pitts
+*/
+
+#include <common.h>
+#include <command.h>
+#include <cpu_func.h>
+#include <elf.h>
+#include <env.h>
+#include <net.h>
+#include <vxworks.h>
+#ifdef CONFIG_X86
+#include <vbe.h>
+#include <asm/e820.h>
+#include <linux/linkage.h>
+#endif
+
+/*
+ * A very simple ELF64 loader, assumes the image is valid, returns the
+ * entry point address.
+ *
+ * Note if U-Boot is 32-bit, the loader assumes the to segment's
+ * physical address and size is within the lower 32-bit address space.
+ */
+unsigned long load_elf64_image_phdr(unsigned long addr)
+{
+       Elf64_Ehdr *ehdr; /* Elf header structure pointer */
+       Elf64_Phdr *phdr; /* Program header structure pointer */
+       int i;
+
+       ehdr = (Elf64_Ehdr *)addr;
+       phdr = (Elf64_Phdr *)(addr + (ulong)ehdr->e_phoff);
+
+       /* Load each program header */
+       for (i = 0; i < ehdr->e_phnum; ++i) {
+               void *dst = (void *)(ulong)phdr->p_paddr;
+               void *src = (void *)addr + phdr->p_offset;
+
+               debug("Loading phdr %i to 0x%p (%lu bytes)\n",
+                     i, dst, (ulong)phdr->p_filesz);
+               if (phdr->p_filesz)
+                       memcpy(dst, src, phdr->p_filesz);
+               if (phdr->p_filesz != phdr->p_memsz)
+                       memset(dst + phdr->p_filesz, 0x00,
+                              phdr->p_memsz - phdr->p_filesz);
+               flush_cache(rounddown((unsigned long)dst, ARCH_DMA_MINALIGN),
+                           roundup(phdr->p_memsz, ARCH_DMA_MINALIGN));
+               ++phdr;
+       }
+
+       if (ehdr->e_machine == EM_PPC64 && (ehdr->e_flags &
+                                           EF_PPC64_ELFV1_ABI)) {
+               /*
+                * For the 64-bit PowerPC ELF V1 ABI, e_entry is a function
+                * descriptor pointer with the first double word being the
+                * address of the entry point of the function.
+                */
+               uintptr_t addr = ehdr->e_entry;
+
+               return *(Elf64_Addr *)addr;
+       }
+
+       return ehdr->e_entry;
+}
+
+unsigned long load_elf64_image_shdr(unsigned long addr)
+{
+       Elf64_Ehdr *ehdr; /* Elf header structure pointer */
+       Elf64_Shdr *shdr; /* Section header structure pointer */
+       unsigned char *strtab = 0; /* String table pointer */
+       unsigned char *image; /* Binary image pointer */
+       int i; /* Loop counter */
+
+       ehdr = (Elf64_Ehdr *)addr;
+
+       /* Find the section header string table for output info */
+       shdr = (Elf64_Shdr *)(addr + (ulong)ehdr->e_shoff +
+                            (ehdr->e_shstrndx * sizeof(Elf64_Shdr)));
+
+       if (shdr->sh_type == SHT_STRTAB)
+               strtab = (unsigned char *)(addr + (ulong)shdr->sh_offset);
+
+       /* Load each appropriate section */
+       for (i = 0; i < ehdr->e_shnum; ++i) {
+               shdr = (Elf64_Shdr *)(addr + (ulong)ehdr->e_shoff +
+                                    (i * sizeof(Elf64_Shdr)));
+
+               if (!(shdr->sh_flags & SHF_ALLOC) ||
+                   shdr->sh_addr == 0 || shdr->sh_size == 0) {
+                       continue;
+               }
+
+               if (strtab) {
+                       debug("%sing %s @ 0x%08lx (%ld bytes)\n",
+                             (shdr->sh_type == SHT_NOBITS) ? "Clear" : "Load",
+                              &strtab[shdr->sh_name],
+                              (unsigned long)shdr->sh_addr,
+                              (long)shdr->sh_size);
+               }
+
+               if (shdr->sh_type == SHT_NOBITS) {
+                       memset((void *)(uintptr_t)shdr->sh_addr, 0,
+                              shdr->sh_size);
+               } else {
+                       image = (unsigned char *)addr + (ulong)shdr->sh_offset;
+                       memcpy((void *)(uintptr_t)shdr->sh_addr,
+                              (const void *)image, shdr->sh_size);
+               }
+               flush_cache(rounddown(shdr->sh_addr, ARCH_DMA_MINALIGN),
+                           roundup((shdr->sh_addr + shdr->sh_size),
+                                    ARCH_DMA_MINALIGN) -
+                               rounddown(shdr->sh_addr, ARCH_DMA_MINALIGN));
+       }
+
+       if (ehdr->e_machine == EM_PPC64 && (ehdr->e_flags &
+                                           EF_PPC64_ELFV1_ABI)) {
+               /*
+                * For the 64-bit PowerPC ELF V1 ABI, e_entry is a function
+                * descriptor pointer with the first double word being the
+                * address of the entry point of the function.
+                */
+               uintptr_t addr = ehdr->e_entry;
+
+               return *(Elf64_Addr *)addr;
+       }
+
+       return ehdr->e_entry;
+}
+
+/*
+ * A very simple ELF loader, assumes the image is valid, returns the
+ * entry point address.
+ *
+ * The loader firstly reads the EFI class to see if it's a 64-bit image.
+ * If yes, call the ELF64 loader. Otherwise continue with the ELF32 loader.
+ */
+unsigned long load_elf_image_phdr(unsigned long addr)
+{
+       Elf32_Ehdr *ehdr; /* Elf header structure pointer */
+       Elf32_Phdr *phdr; /* Program header structure pointer */
+       int i;
+
+       ehdr = (Elf32_Ehdr *)addr;
+       if (ehdr->e_ident[EI_CLASS] == ELFCLASS64)
+               return load_elf64_image_phdr(addr);
+
+       phdr = (Elf32_Phdr *)(addr + ehdr->e_phoff);
+
+       /* Load each program header */
+       for (i = 0; i < ehdr->e_phnum; ++i) {
+               void *dst = (void *)(uintptr_t)phdr->p_paddr;
+               void *src = (void *)addr + phdr->p_offset;
+
+               debug("Loading phdr %i to 0x%p (%i bytes)\n",
+                     i, dst, phdr->p_filesz);
+               if (phdr->p_filesz)
+                       memcpy(dst, src, phdr->p_filesz);
+               if (phdr->p_filesz != phdr->p_memsz)
+                       memset(dst + phdr->p_filesz, 0x00,
+                              phdr->p_memsz - phdr->p_filesz);
+               flush_cache(rounddown((unsigned long)dst, ARCH_DMA_MINALIGN),
+                           roundup(phdr->p_memsz, ARCH_DMA_MINALIGN));
+               ++phdr;
+       }
+
+       return ehdr->e_entry;
+}
+
+unsigned long load_elf_image_shdr(unsigned long addr)
+{
+       Elf32_Ehdr *ehdr; /* Elf header structure pointer */
+       Elf32_Shdr *shdr; /* Section header structure pointer */
+       unsigned char *strtab = 0; /* String table pointer */
+       unsigned char *image; /* Binary image pointer */
+       int i; /* Loop counter */
+
+       ehdr = (Elf32_Ehdr *)addr;
+       if (ehdr->e_ident[EI_CLASS] == ELFCLASS64)
+               return load_elf64_image_shdr(addr);
+
+       /* Find the section header string table for output info */
+       shdr = (Elf32_Shdr *)(addr + ehdr->e_shoff +
+                            (ehdr->e_shstrndx * sizeof(Elf32_Shdr)));
+
+       if (shdr->sh_type == SHT_STRTAB)
+               strtab = (unsigned char *)(addr + shdr->sh_offset);
+
+       /* Load each appropriate section */
+       for (i = 0; i < ehdr->e_shnum; ++i) {
+               shdr = (Elf32_Shdr *)(addr + ehdr->e_shoff +
+                                    (i * sizeof(Elf32_Shdr)));
+
+               if (!(shdr->sh_flags & SHF_ALLOC) ||
+                   shdr->sh_addr == 0 || shdr->sh_size == 0) {
+                       continue;
+               }
+
+               if (strtab) {
+                       debug("%sing %s @ 0x%08lx (%ld bytes)\n",
+                             (shdr->sh_type == SHT_NOBITS) ? "Clear" : "Load",
+                              &strtab[shdr->sh_name],
+                              (unsigned long)shdr->sh_addr,
+                              (long)shdr->sh_size);
+               }
+
+               if (shdr->sh_type == SHT_NOBITS) {
+                       memset((void *)(uintptr_t)shdr->sh_addr, 0,
+                              shdr->sh_size);
+               } else {
+                       image = (unsigned char *)addr + shdr->sh_offset;
+                       memcpy((void *)(uintptr_t)shdr->sh_addr,
+                              (const void *)image, shdr->sh_size);
+               }
+               flush_cache(rounddown(shdr->sh_addr, ARCH_DMA_MINALIGN),
+                           roundup((shdr->sh_addr + shdr->sh_size),
+                                   ARCH_DMA_MINALIGN) -
+                           rounddown(shdr->sh_addr, ARCH_DMA_MINALIGN));
+       }
+
+       return ehdr->e_entry;
+}
+
+/*
+ * Determine if a valid ELF image exists at the given memory location.
+ * First look at the ELF header magic field, then make sure that it is
+ * executable.
+ */
+int valid_elf_image(unsigned long addr)
+{
+       Elf32_Ehdr *ehdr; /* Elf header structure pointer */
+
+       ehdr = (Elf32_Ehdr *)addr;
+
+       if (!IS_ELF(*ehdr)) {
+               printf("## No elf image at address 0x%08lx\n", addr);
+               return 0;
+       }
+
+       if (ehdr->e_type != ET_EXEC) {
+               printf("## Not a 32-bit elf image at address 0x%08lx\n", addr);
+               return 0;
+       }
+
+       return 1;
+}
index 2b33f323bcccff0f3a792b71d3f270050b1449fa..a90d67e5a87b3c1af8f4c07d95bf3263ab0bf1d2 100644 (file)
@@ -18,6 +18,33 @@ if RSA
 config SPL_RSA
        bool "Use RSA Library within SPL"
 
+config SPL_RSA_VERIFY
+       bool
+       help
+         Add RSA signature verification support in SPL.
+
+config RSA_VERIFY
+       bool
+       help
+         Add RSA signature verification support.
+
+config RSA_VERIFY_WITH_PKEY
+       bool "Execute RSA verification without key parameters from FDT"
+       select RSA_VERIFY
+       select ASYMMETRIC_KEY_TYPE
+       select ASYMMETRIC_PUBLIC_KEY_SUBTYPE
+       select RSA_PUBLIC_KEY_PARSER
+       help
+         The standard RSA-signature verification code (FIT_SIGNATURE) uses
+         pre-calculated key properties, that are stored in fdt blob, in
+         decrypting a signature.
+         This does not suit the use case where there is no way defined to
+         provide such additional key properties in standardized form,
+         particularly UEFI secure boot.
+         This options enables RSA signature verification with a public key
+         directly specified in image_sign_info, where all the necessary
+         key properties will be calculated on the fly in verification code.
+
 config RSA_SOFTWARE_EXP
        bool "Enable driver for RSA Modular Exponentiation in software"
        depends on DM
index a51c6e1685fb720474a8d2dfea1b03b45e96467a..14ed3cb4012bd8fe55d49a70ad0f2903c3a11e4c 100644 (file)
@@ -5,5 +5,6 @@
 # (C) Copyright 2000-2007
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 
-obj-$(CONFIG_$(SPL_)FIT_SIGNATURE) += rsa-verify.o rsa-checksum.o
+obj-$(CONFIG_$(SPL_)RSA_VERIFY) += rsa-verify.o rsa-checksum.o
+obj-$(CONFIG_RSA_VERIFY_WITH_PKEY) += rsa-keyprop.o
 obj-$(CONFIG_RSA_SOFTWARE_EXP) += rsa-mod-exp.o
diff --git a/lib/rsa/rsa-keyprop.c b/lib/rsa/rsa-keyprop.c
new file mode 100644 (file)
index 0000000..9464df0
--- /dev/null
@@ -0,0 +1,725 @@
+// SPDX-License-Identifier: GPL-2.0+ and MIT
+/*
+ * RSA library - generate parameters for a public key
+ *
+ * Copyright (c) 2019 Linaro Limited
+ * Author: AKASHI Takahiro
+ *
+ * Big number routines in this file come from BearSSL:
+ * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
+ */
+
+#include <common.h>
+#include <image.h>
+#include <malloc.h>
+#include <asm/byteorder.h>
+#include <crypto/internal/rsa.h>
+#include <u-boot/rsa-mod-exp.h>
+
+/**
+ * br_dec16be() - Convert 16-bit big-endian integer to native
+ * @src:       Pointer to data
+ * Return:     Native-endian integer
+ */
+static unsigned br_dec16be(const void *src)
+{
+       return be16_to_cpup(src);
+}
+
+/**
+ * br_dec32be() - Convert 32-bit big-endian integer to native
+ * @src:       Pointer to data
+ * Return:     Native-endian integer
+ */
+static uint32_t br_dec32be(const void *src)
+{
+       return be32_to_cpup(src);
+}
+
+/**
+ * br_enc32be() - Convert native 32-bit integer to big-endian
+ * @dst:       Pointer to buffer to store big-endian integer in
+ * @x:         Native 32-bit integer
+ */
+static void br_enc32be(void *dst, uint32_t x)
+{
+       __be32 tmp;
+
+       tmp = cpu_to_be32(x);
+       memcpy(dst, &tmp, sizeof(tmp));
+}
+
+/* from BearSSL's src/inner.h */
+
+/*
+ * Negate a boolean.
+ */
+static uint32_t NOT(uint32_t ctl)
+{
+       return ctl ^ 1;
+}
+
+/*
+ * Multiplexer: returns x if ctl == 1, y if ctl == 0.
+ */
+static uint32_t MUX(uint32_t ctl, uint32_t x, uint32_t y)
+{
+       return y ^ (-ctl & (x ^ y));
+}
+
+/*
+ * Equality check: returns 1 if x == y, 0 otherwise.
+ */
+static uint32_t EQ(uint32_t x, uint32_t y)
+{
+       uint32_t q;
+
+       q = x ^ y;
+       return NOT((q | -q) >> 31);
+}
+
+/*
+ * Inequality check: returns 1 if x != y, 0 otherwise.
+ */
+static uint32_t NEQ(uint32_t x, uint32_t y)
+{
+       uint32_t q;
+
+       q = x ^ y;
+       return (q | -q) >> 31;
+}
+
+/*
+ * Comparison: returns 1 if x > y, 0 otherwise.
+ */
+static uint32_t GT(uint32_t x, uint32_t y)
+{
+       /*
+        * If both x < 2^31 and y < 2^31, then y-x will have its high
+        * bit set if x > y, cleared otherwise.
+        *
+        * If either x >= 2^31 or y >= 2^31 (but not both), then the
+        * result is the high bit of x.
+        *
+        * If both x >= 2^31 and y >= 2^31, then we can virtually
+        * subtract 2^31 from both, and we are back to the first case.
+        * Since (y-2^31)-(x-2^31) = y-x, the subtraction is already
+        * fine.
+        */
+       uint32_t z;
+
+       z = y - x;
+       return (z ^ ((x ^ y) & (x ^ z))) >> 31;
+}
+
+/*
+ * Compute the bit length of a 32-bit integer. Returned value is between 0
+ * and 32 (inclusive).
+ */
+static uint32_t BIT_LENGTH(uint32_t x)
+{
+       uint32_t k, c;
+
+       k = NEQ(x, 0);
+       c = GT(x, 0xFFFF); x = MUX(c, x >> 16, x); k += c << 4;
+       c = GT(x, 0x00FF); x = MUX(c, x >>  8, x); k += c << 3;
+       c = GT(x, 0x000F); x = MUX(c, x >>  4, x); k += c << 2;
+       c = GT(x, 0x0003); x = MUX(c, x >>  2, x); k += c << 1;
+       k += GT(x, 0x0001);
+       return k;
+}
+
+#define GE(x, y)   NOT(GT(y, x))
+#define LT(x, y)   GT(y, x)
+#define MUL(x, y)   ((uint64_t)(x) * (uint64_t)(y))
+
+/*
+ * Integers 'i32'
+ * --------------
+ *
+ * The 'i32' functions implement computations on big integers using
+ * an internal representation as an array of 32-bit integers. For
+ * an array x[]:
+ *  -- x[0] contains the "announced bit length" of the integer
+ *  -- x[1], x[2]... contain the value in little-endian order (x[1]
+ *     contains the least significant 32 bits)
+ *
+ * Multiplications rely on the elementary 32x32->64 multiplication.
+ *
+ * The announced bit length specifies the number of bits that are
+ * significant in the subsequent 32-bit words. Unused bits in the
+ * last (most significant) word are set to 0; subsequent words are
+ * uninitialized and need not exist at all.
+ *
+ * The execution time and memory access patterns of all computations
+ * depend on the announced bit length, but not on the actual word
+ * values. For modular integers, the announced bit length of any integer
+ * modulo n is equal to the actual bit length of n; thus, computations
+ * on modular integers are "constant-time" (only the modulus length may
+ * leak).
+ */
+
+/*
+ * Extract one word from an integer. The offset is counted in bits.
+ * The word MUST entirely fit within the word elements corresponding
+ * to the announced bit length of a[].
+ */
+static uint32_t br_i32_word(const uint32_t *a, uint32_t off)
+{
+       size_t u;
+       unsigned j;
+
+       u = (size_t)(off >> 5) + 1;
+       j = (unsigned)off & 31;
+       if (j == 0) {
+               return a[u];
+       } else {
+               return (a[u] >> j) | (a[u + 1] << (32 - j));
+       }
+}
+
+/* from BearSSL's src/int/i32_bitlen.c */
+
+/*
+ * Compute the actual bit length of an integer. The argument x should
+ * point to the first (least significant) value word of the integer.
+ * The len 'xlen' contains the number of 32-bit words to access.
+ *
+ * CT: value or length of x does not leak.
+ */
+static uint32_t br_i32_bit_length(uint32_t *x, size_t xlen)
+{
+       uint32_t tw, twk;
+
+       tw = 0;
+       twk = 0;
+       while (xlen -- > 0) {
+               uint32_t w, c;
+
+               c = EQ(tw, 0);
+               w = x[xlen];
+               tw = MUX(c, w, tw);
+               twk = MUX(c, (uint32_t)xlen, twk);
+       }
+       return (twk << 5) + BIT_LENGTH(tw);
+}
+
+/* from BearSSL's src/int/i32_decode.c */
+
+/*
+ * Decode an integer from its big-endian unsigned representation. The
+ * "true" bit length of the integer is computed, but all words of x[]
+ * corresponding to the full 'len' bytes of the source are set.
+ *
+ * CT: value or length of x does not leak.
+ */
+static void br_i32_decode(uint32_t *x, const void *src, size_t len)
+{
+       const unsigned char *buf;
+       size_t u, v;
+
+       buf = src;
+       u = len;
+       v = 1;
+       for (;;) {
+               if (u < 4) {
+                       uint32_t w;
+
+                       if (u < 2) {
+                               if (u == 0) {
+                                       break;
+                               } else {
+                                       w = buf[0];
+                               }
+                       } else {
+                               if (u == 2) {
+                                       w = br_dec16be(buf);
+                               } else {
+                                       w = ((uint32_t)buf[0] << 16)
+                                               | br_dec16be(buf + 1);
+                               }
+                       }
+                       x[v ++] = w;
+                       break;
+               } else {
+                       u -= 4;
+                       x[v ++] = br_dec32be(buf + u);
+               }
+       }
+       x[0] = br_i32_bit_length(x + 1, v - 1);
+}
+
+/* from BearSSL's src/int/i32_encode.c */
+
+/*
+ * Encode an integer into its big-endian unsigned representation. The
+ * output length in bytes is provided (parameter 'len'); if the length
+ * is too short then the integer is appropriately truncated; if it is
+ * too long then the extra bytes are set to 0.
+ */
+static void br_i32_encode(void *dst, size_t len, const uint32_t *x)
+{
+       unsigned char *buf;
+       size_t k;
+
+       buf = dst;
+
+       /*
+        * Compute the announced size of x in bytes; extra bytes are
+        * filled with zeros.
+        */
+       k = (x[0] + 7) >> 3;
+       while (len > k) {
+               *buf ++ = 0;
+               len --;
+       }
+
+       /*
+        * Now we use k as index within x[]. That index starts at 1;
+        * we initialize it to the topmost complete word, and process
+        * any remaining incomplete word.
+        */
+       k = (len + 3) >> 2;
+       switch (len & 3) {
+       case 3:
+               *buf ++ = x[k] >> 16;
+               /* fall through */
+       case 2:
+               *buf ++ = x[k] >> 8;
+               /* fall through */
+       case 1:
+               *buf ++ = x[k];
+               k --;
+       }
+
+       /*
+        * Encode all complete words.
+        */
+       while (k > 0) {
+               br_enc32be(buf, x[k]);
+               k --;
+               buf += 4;
+       }
+}
+
+/* from BearSSL's src/int/i32_ninv32.c */
+
+/*
+ * Compute -(1/x) mod 2^32. If x is even, then this function returns 0.
+ */
+static uint32_t br_i32_ninv32(uint32_t x)
+{
+       uint32_t y;
+
+       y = 2 - x;
+       y *= 2 - y * x;
+       y *= 2 - y * x;
+       y *= 2 - y * x;
+       y *= 2 - y * x;
+       return MUX(x & 1, -y, 0);
+}
+
+/* from BearSSL's src/int/i32_add.c */
+
+/*
+ * Add b[] to a[] and return the carry (0 or 1). If ctl is 0, then a[]
+ * is unmodified, but the carry is still computed and returned. The
+ * arrays a[] and b[] MUST have the same announced bit length.
+ *
+ * a[] and b[] MAY be the same array, but partial overlap is not allowed.
+ */
+static uint32_t br_i32_add(uint32_t *a, const uint32_t *b, uint32_t ctl)
+{
+       uint32_t cc;
+       size_t u, m;
+
+       cc = 0;
+       m = (a[0] + 63) >> 5;
+       for (u = 1; u < m; u ++) {
+               uint32_t aw, bw, naw;
+
+               aw = a[u];
+               bw = b[u];
+               naw = aw + bw + cc;
+
+               /*
+                * Carry is 1 if naw < aw. Carry is also 1 if naw == aw
+                * AND the carry was already 1.
+                */
+               cc = (cc & EQ(naw, aw)) | LT(naw, aw);
+               a[u] = MUX(ctl, naw, aw);
+       }
+       return cc;
+}
+
+/* from BearSSL's src/int/i32_sub.c */
+
+/*
+ * Subtract b[] from a[] and return the carry (0 or 1). If ctl is 0,
+ * then a[] is unmodified, but the carry is still computed and returned.
+ * The arrays a[] and b[] MUST have the same announced bit length.
+ *
+ * a[] and b[] MAY be the same array, but partial overlap is not allowed.
+ */
+static uint32_t br_i32_sub(uint32_t *a, const uint32_t *b, uint32_t ctl)
+{
+       uint32_t cc;
+       size_t u, m;
+
+       cc = 0;
+       m = (a[0] + 63) >> 5;
+       for (u = 1; u < m; u ++) {
+               uint32_t aw, bw, naw;
+
+               aw = a[u];
+               bw = b[u];
+               naw = aw - bw - cc;
+
+               /*
+                * Carry is 1 if naw > aw. Carry is 1 also if naw == aw
+                * AND the carry was already 1.
+                */
+               cc = (cc & EQ(naw, aw)) | GT(naw, aw);
+               a[u] = MUX(ctl, naw, aw);
+       }
+       return cc;
+}
+
+/* from BearSSL's src/int/i32_div32.c */
+
+/*
+ * Constant-time division. The dividend hi:lo is divided by the
+ * divisor d; the quotient is returned and the remainder is written
+ * in *r. If hi == d, then the quotient does not fit on 32 bits;
+ * returned value is thus truncated. If hi > d, returned values are
+ * indeterminate.
+ */
+static uint32_t br_divrem(uint32_t hi, uint32_t lo, uint32_t d, uint32_t *r)
+{
+       /* TODO: optimize this */
+       uint32_t q;
+       uint32_t ch, cf;
+       int k;
+
+       q = 0;
+       ch = EQ(hi, d);
+       hi = MUX(ch, 0, hi);
+       for (k = 31; k > 0; k --) {
+               int j;
+               uint32_t w, ctl, hi2, lo2;
+
+               j = 32 - k;
+               w = (hi << j) | (lo >> k);
+               ctl = GE(w, d) | (hi >> k);
+               hi2 = (w - d) >> j;
+               lo2 = lo - (d << k);
+               hi = MUX(ctl, hi2, hi);
+               lo = MUX(ctl, lo2, lo);
+               q |= ctl << k;
+       }
+       cf = GE(lo, d) | hi;
+       q |= cf;
+       *r = MUX(cf, lo - d, lo);
+       return q;
+}
+
+/*
+ * Wrapper for br_divrem(); the remainder is returned, and the quotient
+ * is discarded.
+ */
+static uint32_t br_rem(uint32_t hi, uint32_t lo, uint32_t d)
+{
+       uint32_t r;
+
+       br_divrem(hi, lo, d, &r);
+       return r;
+}
+
+/*
+ * Wrapper for br_divrem(); the quotient is returned, and the remainder
+ * is discarded.
+ */
+static uint32_t br_div(uint32_t hi, uint32_t lo, uint32_t d)
+{
+       uint32_t r;
+
+       return br_divrem(hi, lo, d, &r);
+}
+
+/* from BearSSL's src/int/i32_muladd.c */
+
+/*
+ * Multiply x[] by 2^32 and then add integer z, modulo m[]. This
+ * function assumes that x[] and m[] have the same announced bit
+ * length, and the announced bit length of m[] matches its true
+ * bit length.
+ *
+ * x[] and m[] MUST be distinct arrays.
+ *
+ * CT: only the common announced bit length of x and m leaks, not
+ * the values of x, z or m.
+ */
+static void br_i32_muladd_small(uint32_t *x, uint32_t z, const uint32_t *m)
+{
+       uint32_t m_bitlen;
+       size_t u, mlen;
+       uint32_t a0, a1, b0, hi, g, q, tb;
+       uint32_t chf, clow, under, over;
+       uint64_t cc;
+
+       /*
+        * We can test on the modulus bit length since we accept to
+        * leak that length.
+        */
+       m_bitlen = m[0];
+       if (m_bitlen == 0) {
+               return;
+       }
+       if (m_bitlen <= 32) {
+               x[1] = br_rem(x[1], z, m[1]);
+               return;
+       }
+       mlen = (m_bitlen + 31) >> 5;
+
+       /*
+        * Principle: we estimate the quotient (x*2^32+z)/m by
+        * doing a 64/32 division with the high words.
+        *
+        * Let:
+        *   w = 2^32
+        *   a = (w*a0 + a1) * w^N + a2
+        *   b = b0 * w^N + b2
+        * such that:
+        *   0 <= a0 < w
+        *   0 <= a1 < w
+        *   0 <= a2 < w^N
+        *   w/2 <= b0 < w
+        *   0 <= b2 < w^N
+        *   a < w*b
+        * I.e. the two top words of a are a0:a1, the top word of b is
+        * b0, we ensured that b0 is "full" (high bit set), and a is
+        * such that the quotient q = a/b fits on one word (0 <= q < w).
+        *
+        * If a = b*q + r (with 0 <= r < q), we can estimate q by
+        * doing an Euclidean division on the top words:
+        *   a0*w+a1 = b0*u + v  (with 0 <= v < w)
+        * Then the following holds:
+        *   0 <= u <= w
+        *   u-2 <= q <= u
+        */
+       a0 = br_i32_word(x, m_bitlen - 32);
+       hi = x[mlen];
+       memmove(x + 2, x + 1, (mlen - 1) * sizeof *x);
+       x[1] = z;
+       a1 = br_i32_word(x, m_bitlen - 32);
+       b0 = br_i32_word(m, m_bitlen - 32);
+
+       /*
+        * We estimate a divisor q. If the quotient returned by br_div()
+        * is g:
+        * -- If a0 == b0 then g == 0; we want q = 0xFFFFFFFF.
+        * -- Otherwise:
+        *    -- if g == 0 then we set q = 0;
+        *    -- otherwise, we set q = g - 1.
+        * The properties described above then ensure that the true
+        * quotient is q-1, q or q+1.
+        */
+       g = br_div(a0, a1, b0);
+       q = MUX(EQ(a0, b0), 0xFFFFFFFF, MUX(EQ(g, 0), 0, g - 1));
+
+       /*
+        * We subtract q*m from x (with the extra high word of value 'hi').
+        * Since q may be off by 1 (in either direction), we may have to
+        * add or subtract m afterwards.
+        *
+        * The 'tb' flag will be true (1) at the end of the loop if the
+        * result is greater than or equal to the modulus (not counting
+        * 'hi' or the carry).
+        */
+       cc = 0;
+       tb = 1;
+       for (u = 1; u <= mlen; u ++) {
+               uint32_t mw, zw, xw, nxw;
+               uint64_t zl;
+
+               mw = m[u];
+               zl = MUL(mw, q) + cc;
+               cc = (uint32_t)(zl >> 32);
+               zw = (uint32_t)zl;
+               xw = x[u];
+               nxw = xw - zw;
+               cc += (uint64_t)GT(nxw, xw);
+               x[u] = nxw;
+               tb = MUX(EQ(nxw, mw), tb, GT(nxw, mw));
+       }
+
+       /*
+        * If we underestimated q, then either cc < hi (one extra bit
+        * beyond the top array word), or cc == hi and tb is true (no
+        * extra bit, but the result is not lower than the modulus). In
+        * these cases we must subtract m once.
+        *
+        * Otherwise, we may have overestimated, which will show as
+        * cc > hi (thus a negative result). Correction is adding m once.
+        */
+       chf = (uint32_t)(cc >> 32);
+       clow = (uint32_t)cc;
+       over = chf | GT(clow, hi);
+       under = ~over & (tb | (~chf & LT(clow, hi)));
+       br_i32_add(x, m, over);
+       br_i32_sub(x, m, under);
+}
+
+/* from BearSSL's src/int/i32_reduce.c */
+
+/*
+ * Reduce an integer (a[]) modulo another (m[]). The result is written
+ * in x[] and its announced bit length is set to be equal to that of m[].
+ *
+ * x[] MUST be distinct from a[] and m[].
+ *
+ * CT: only announced bit lengths leak, not values of x, a or m.
+ */
+static void br_i32_reduce(uint32_t *x, const uint32_t *a, const uint32_t *m)
+{
+       uint32_t m_bitlen, a_bitlen;
+       size_t mlen, alen, u;
+
+       m_bitlen = m[0];
+       mlen = (m_bitlen + 31) >> 5;
+
+       x[0] = m_bitlen;
+       if (m_bitlen == 0) {
+               return;
+       }
+
+       /*
+        * If the source is shorter, then simply copy all words from a[]
+        * and zero out the upper words.
+        */
+       a_bitlen = a[0];
+       alen = (a_bitlen + 31) >> 5;
+       if (a_bitlen < m_bitlen) {
+               memcpy(x + 1, a + 1, alen * sizeof *a);
+               for (u = alen; u < mlen; u ++) {
+                       x[u + 1] = 0;
+               }
+               return;
+       }
+
+       /*
+        * The source length is at least equal to that of the modulus.
+        * We must thus copy N-1 words, and input the remaining words
+        * one by one.
+        */
+       memcpy(x + 1, a + 2 + (alen - mlen), (mlen - 1) * sizeof *a);
+       x[mlen] = 0;
+       for (u = 1 + alen - mlen; u > 0; u --) {
+               br_i32_muladd_small(x, a[u], m);
+       }
+}
+
+/**
+ * rsa_free_key_prop() - Free key properties
+ * @prop:      Pointer to struct key_prop
+ *
+ * This function frees all the memories allocated by rsa_gen_key_prop().
+ */
+void rsa_free_key_prop(struct key_prop *prop)
+{
+       if (!prop)
+               return;
+
+       free((void *)prop->modulus);
+       free((void *)prop->public_exponent);
+       free((void *)prop->rr);
+
+       free(prop);
+}
+
+/**
+ * rsa_gen_key_prop() - Generate key properties of RSA public key
+ * @key:       Specifies key data in DER format
+ * @keylen:    Length of @key
+ * @prop:      Generated key property
+ *
+ * This function takes a blob of encoded RSA public key data in DER
+ * format, parse it and generate all the relevant properties
+ * in key_prop structure.
+ * Return a pointer to struct key_prop in @prop on success.
+ *
+ * Return:     0 on success, negative on error
+ */
+int rsa_gen_key_prop(const void *key, uint32_t keylen, struct key_prop **prop)
+{
+       struct rsa_key rsa_key;
+       uint32_t *n = NULL, *rr = NULL, *rrtmp = NULL;
+       const int max_rsa_size = 4096;
+       int rlen, i, ret;
+
+       *prop = calloc(sizeof(**prop), 1);
+       n = calloc(sizeof(uint32_t), 1 + (max_rsa_size >> 5));
+       rr = calloc(sizeof(uint32_t), 1 + (max_rsa_size >> 5));
+       rrtmp = calloc(sizeof(uint32_t), 1 + (max_rsa_size >> 5));
+       if (!(*prop) || !n || !rr || !rrtmp) {
+               ret = -ENOMEM;
+               goto err;
+       }
+
+       ret = rsa_parse_pub_key(&rsa_key, key, keylen);
+       if (ret)
+               goto err;
+
+       /* modulus */
+       /* removing leading 0's */
+       for (i = 0; i < rsa_key.n_sz && !rsa_key.n[i]; i++)
+               ;
+       (*prop)->num_bits = (rsa_key.n_sz - i) * 8;
+       (*prop)->modulus = malloc(rsa_key.n_sz - i);
+       if (!(*prop)->modulus) {
+               ret = -ENOMEM;
+               goto err;
+       }
+       memcpy((void *)(*prop)->modulus, &rsa_key.n[i], rsa_key.n_sz - i);
+
+       /* exponent */
+       (*prop)->public_exponent = calloc(1, sizeof(uint64_t));
+       if (!(*prop)->public_exponent) {
+               ret = -ENOMEM;
+               goto err;
+       }
+       memcpy((void *)(*prop)->public_exponent + sizeof(uint64_t)
+                                               - rsa_key.e_sz,
+              rsa_key.e, rsa_key.e_sz);
+       (*prop)->exp_len = rsa_key.e_sz;
+
+       /* n0 inverse */
+       br_i32_decode(n, &rsa_key.n[i], rsa_key.n_sz - i);
+       (*prop)->n0inv = br_i32_ninv32(n[1]);
+
+       /* R^2 mod n; R = 2^(num_bits) */
+       rlen = (*prop)->num_bits * 2; /* #bits of R^2 = (2^num_bits)^2 */
+       rr[0] = 0;
+       *(uint8_t *)&rr[0] = (1 << (rlen % 8));
+       for (i = 1; i < (((rlen + 31) >> 5) + 1); i++)
+               rr[i] = 0;
+       br_i32_decode(rrtmp, rr, ((rlen + 7) >> 3) + 1);
+       br_i32_reduce(rr, rrtmp, n);
+
+       rlen = ((*prop)->num_bits + 7) >> 3; /* #bytes of R^2 mod n */
+       (*prop)->rr = malloc(rlen);
+       if (!(*prop)->rr) {
+               ret = -ENOMEM;
+               goto err;
+       }
+       br_i32_encode((void *)(*prop)->rr, rlen, rr);
+
+       return 0;
+
+err:
+       free(n);
+       free(rr);
+       free(rrtmp);
+       rsa_free_key_prop(*prop);
+       return ret;
+}
index 326a5e4ea97e5fc369c72520b627e5a040c071c9..80e817314b5867d692d5b656b45d9b9a5e90ff75 100644 (file)
 #include "mkimage.h"
 #include <fdt_support.h>
 #endif
+#include <linux/kconfig.h>
 #include <u-boot/rsa-mod-exp.h>
 #include <u-boot/rsa.h>
 
+#ifndef __UBOOT__
+/*
+ * NOTE:
+ * Since host tools, like mkimage, make use of openssl library for
+ * RSA encryption, rsa_verify_with_pkey()/rsa_gen_key_prop() are
+ * of no use and should not be compiled in.
+ * So just turn off CONFIG_RSA_VERIFY_WITH_PKEY.
+ */
+
+#undef CONFIG_RSA_VERIFY_WITH_PKEY
+#endif
+
 /* Default public exponent for backward compatibility */
 #define RSA_DEFAULT_PUBEXP     65537
 
@@ -271,6 +284,7 @@ out:
 }
 #endif
 
+#if CONFIG_IS_ENABLED(FIT_SIGNATURE) || IS_ENABLED(CONFIG_RSA_VERIFY_WITH_PKEY)
 /**
  * rsa_verify_key() - Verify a signature against some data using RSA Key
  *
@@ -342,7 +356,52 @@ static int rsa_verify_key(struct image_sign_info *info,
 
        return 0;
 }
+#endif
 
+#ifdef CONFIG_RSA_VERIFY_WITH_PKEY
+/**
+ * rsa_verify_with_pkey() - Verify a signature against some data using
+ * only modulus and exponent as RSA key properties.
+ * @info:      Specifies key information
+ * @hash:      Pointer to the expected hash
+ * @sig:       Signature
+ * @sig_len:   Number of bytes in signature
+ *
+ * Parse a RSA public key blob in DER format pointed to in @info and fill
+ * a key_prop structure with properties of the key. Then verify a RSA PKCS1.5
+ * signature against an expected hash using the calculated properties.
+ *
+ * Return      0 if verified, -ve on error
+ */
+static int rsa_verify_with_pkey(struct image_sign_info *info,
+                               const void *hash, uint8_t *sig, uint sig_len)
+{
+       struct key_prop *prop;
+       int ret;
+
+       /* Public key is self-described to fill key_prop */
+       ret = rsa_gen_key_prop(info->key, info->keylen, &prop);
+       if (ret) {
+               debug("Generating necessary parameter for decoding failed\n");
+               return ret;
+       }
+
+       ret = rsa_verify_key(info, prop, sig, sig_len, hash,
+                            info->crypto->key_len);
+
+       rsa_free_key_prop(prop);
+
+       return ret;
+}
+#else
+static int rsa_verify_with_pkey(struct image_sign_info *info,
+                               const void *hash, uint8_t *sig, uint sig_len)
+{
+       return -EACCES;
+}
+#endif
+
+#if CONFIG_IS_ENABLED(FIT_SIGNATURE)
 /**
  * rsa_verify_with_keynode() - Verify a signature against some data using
  * information in node with prperties of RSA Key like modulus, exponent etc.
@@ -396,18 +455,22 @@ static int rsa_verify_with_keynode(struct image_sign_info *info,
 
        return ret;
 }
+#else
+static int rsa_verify_with_keynode(struct image_sign_info *info,
+                                  const void *hash, uint8_t *sig,
+                                  uint sig_len, int node)
+{
+       return -EACCES;
+}
+#endif
 
 int rsa_verify(struct image_sign_info *info,
               const struct image_region region[], int region_count,
               uint8_t *sig, uint sig_len)
 {
-       const void *blob = info->fdt_blob;
        /* Reserve memory for maximum checksum-length */
        uint8_t hash[info->crypto->key_len];
-       int ndepth, noffset;
-       int sig_node, node;
-       char name[100];
-       int ret;
+       int ret = -EACCES;
 
        /*
         * Verify that the checksum-length does not exceed the
@@ -420,12 +483,6 @@ int rsa_verify(struct image_sign_info *info,
                return -EINVAL;
        }
 
-       sig_node = fdt_subnode_offset(blob, 0, FIT_SIG_NODENAME);
-       if (sig_node < 0) {
-               debug("%s: No signature node found\n", __func__);
-               return -ENOENT;
-       }
-
        /* Calculate checksum with checksum-algorithm */
        ret = info->checksum->calculate(info->checksum->name,
                                        region, region_count, hash);
@@ -434,29 +491,51 @@ int rsa_verify(struct image_sign_info *info,
                return -EINVAL;
        }
 
-       /* See if we must use a particular key */
-       if (info->required_keynode != -1) {
-               ret = rsa_verify_with_keynode(info, hash, sig, sig_len,
-                       info->required_keynode);
+       if (IS_ENABLED(CONFIG_RSA_VERIFY_WITH_PKEY) && !info->fdt_blob) {
+               /* don't rely on fdt properties */
+               ret = rsa_verify_with_pkey(info, hash, sig, sig_len);
+
                return ret;
        }
 
-       /* Look for a key that matches our hint */
-       snprintf(name, sizeof(name), "key-%s", info->keyname);
-       node = fdt_subnode_offset(blob, sig_node, name);
-       ret = rsa_verify_with_keynode(info, hash, sig, sig_len, node);
-       if (!ret)
-               return ret;
+       if (CONFIG_IS_ENABLED(FIT_SIGNATURE)) {
+               const void *blob = info->fdt_blob;
+               int ndepth, noffset;
+               int sig_node, node;
+               char name[100];
+
+               sig_node = fdt_subnode_offset(blob, 0, FIT_SIG_NODENAME);
+               if (sig_node < 0) {
+                       debug("%s: No signature node found\n", __func__);
+                       return -ENOENT;
+               }
 
-       /* No luck, so try each of the keys in turn */
-       for (ndepth = 0, noffset = fdt_next_node(info->fit, sig_node, &ndepth);
-                       (noffset >= 0) && (ndepth > 0);
-                       noffset = fdt_next_node(info->fit, noffset, &ndepth)) {
-               if (ndepth == 1 && noffset != node) {
+               /* See if we must use a particular key */
+               if (info->required_keynode != -1) {
                        ret = rsa_verify_with_keynode(info, hash, sig, sig_len,
-                                                     noffset);
-                       if (!ret)
-                               break;
+                                                     info->required_keynode);
+                       return ret;
+               }
+
+               /* Look for a key that matches our hint */
+               snprintf(name, sizeof(name), "key-%s", info->keyname);
+               node = fdt_subnode_offset(blob, sig_node, name);
+               ret = rsa_verify_with_keynode(info, hash, sig, sig_len, node);
+               if (!ret)
+                       return ret;
+
+               /* No luck, so try each of the keys in turn */
+               for (ndepth = 0, noffset = fdt_next_node(info->fit, sig_node,
+                                                        &ndepth);
+                    (noffset >= 0) && (ndepth > 0);
+                    noffset = fdt_next_node(info->fit, noffset, &ndepth)) {
+                       if (ndepth == 1 && noffset != node) {
+                               ret = rsa_verify_with_keynode(info, hash,
+                                                             sig, sig_len,
+                                                             noffset);
+                               if (!ret)
+                                       break;
+                       }
                }
        }
 
index 55ff9f7437d515d3a78aea4d8e23b01f2957322c..1ac2b09c725ca24c788b819f679fac9e772642c2 100644 (file)
@@ -22,9 +22,22 @@ static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
                                *base = 16;
                        else
                                *base = 8;
-               } else
+               } else {
+                       int i = 0;
+                       char var;
+
                        *base = 10;
+
+                       do {
+                               var = tolower(s[i++]);
+                               if (var >= 'a' && var <= 'f') {
+                                       *base = 16;
+                                       break;
+                               }
+                       } while (var);
+               }
        }
+
        if (*base == 16 && s[0] == '0' && tolower(s[1]) == 'x')
                s += 2;
        return s;
index ed81cbd53746527cb60e24370cb5e3837703bb69..8bf2eabe9026df405825ddf3b78aedf5d417f94b 100644 (file)
@@ -490,6 +490,7 @@ static int eth_post_probe(struct udevice *dev)
        struct eth_device_priv *priv = dev->uclass_priv;
        struct eth_pdata *pdata = dev->platdata;
        unsigned char env_enetaddr[ARP_HLEN];
+       char *source = "DT";
 
 #if defined(CONFIG_NEEDS_MANUAL_RELOC)
        struct eth_ops *ops = eth_get_ops(dev);
@@ -522,6 +523,7 @@ static int eth_post_probe(struct udevice *dev)
        /* Check if the device has a valid MAC address in device tree */
        if (!eth_dev_get_mac_address(dev, pdata->enetaddr) ||
            !is_valid_ethaddr(pdata->enetaddr)) {
+               source = "ROM";
                /* Check if the device has a MAC address in ROM */
                if (eth_get_ops(dev)->read_rom_hwaddr)
                        eth_get_ops(dev)->read_rom_hwaddr(dev);
@@ -533,9 +535,9 @@ static int eth_post_probe(struct udevice *dev)
                    memcmp(pdata->enetaddr, env_enetaddr, ARP_HLEN)) {
                        printf("\nWarning: %s MAC addresses don't match:\n",
                               dev->name);
-                       printf("Address in ROM is          %pM\n",
-                              pdata->enetaddr);
-                       printf("Address in environment is  %pM\n",
+                       printf("Address in %s is\t\t%pM\n",
+                              source, pdata->enetaddr);
+                       printf("Address in environment is\t%pM\n",
                               env_enetaddr);
                }
 
@@ -543,8 +545,8 @@ static int eth_post_probe(struct udevice *dev)
                memcpy(pdata->enetaddr, env_enetaddr, ARP_HLEN);
        } else if (is_valid_ethaddr(pdata->enetaddr)) {
                eth_env_set_enetaddr_by_index("eth", dev->seq, pdata->enetaddr);
-               printf("\nWarning: %s using MAC address from ROM\n",
-                      dev->name);
+               printf("\nWarning: %s using MAC address from %s\n",
+                      dev->name, source);
        } else if (is_zero_ethaddr(pdata->enetaddr) ||
                   !is_valid_ethaddr(pdata->enetaddr)) {
 #ifdef CONFIG_NET_RANDOM_ETHADDR
index b8969e2a75e61f1d1a62ed34aa2ad956aa9ca46e..cad3b6e76c627d196e1ce060a8c8392063b31742 100644 (file)
@@ -54,7 +54,6 @@ kecho := $($(quiet)kecho)
 #   to specify a valid file as first prerequisite (often the kbuild file)
 define filechk
        $(Q)set -e;                             \
-       $(kecho) '  CHK     $@';                \
        mkdir -p $(dir $@);                     \
        $(filechk_$(1)) < $< > $@.tmp;          \
        if [ -r $@ ] && cmp -s $@ $@.tmp; then  \
@@ -110,26 +109,30 @@ as-option = $(call try-run,\
 as-instr = $(call try-run,\
        printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3))
 
+# __cc-option
+# Usage: MY_CFLAGS += $(call __cc-option,$(CC),$(MY_CFLAGS),-march=winchip-c6,-march=i586)
+__cc-option = $(call try-run,\
+       $(1) -Werror $(2) $(3) -c -x c /dev/null -o "$$TMP",$(3),$(4))
+
 # cc-option
 # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
+cc-option = $(call __cc-option, $(CC),\
+       $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS),$(1),$(2))
 
-cc-option = $(call try-run,\
-       $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2))
+# hostcc-option
+# Usage: cflags-y += $(call hostcc-option,-march=winchip-c6,-march=i586)
+hostcc-option = $(call __cc-option, $(HOSTCC),\
+       $(HOSTCFLAGS) $(HOST_EXTRACFLAGS),$(1),$(2))
 
 # cc-option-yn
 # Usage: flag := $(call cc-option-yn,-march=winchip-c6)
 cc-option-yn = $(call try-run,\
        $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n)
 
-# cc-option-align
-# Prefix align with either -falign or -malign
-cc-option-align = $(subst -functions=0,,\
-       $(call cc-option,-falign-functions=0,-malign-functions=0))
-
 # cc-disable-warning
 # Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable)
 cc-disable-warning = $(call try-run,\
-       $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
+       $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
 
 # cc-name
 # Expands to either gcc or clang
@@ -148,17 +151,15 @@ cc-ifversion = $(shell [ $(cc-version) $(1) $(2) ] && echo $(3) || echo $(4))
 
 # added for U-Boot
 binutils-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/binutils-version.sh $(AS))
-dtc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/dtc-version.sh $(DTC))
 
 # cc-ldoption
 # Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both)
 cc-ldoption = $(call try-run,\
-       $(CC) $(1) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2))
+       $(CC) $(1) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2))
 
 # ld-option
-# Usage: LDFLAGS += $(call ld-option, -X)
-ld-option = $(call try-run,\
-       $(CC) -x c /dev/null -c -o "$$TMPO" ; $(LD) $(1) "$$TMPO" -o "$$TMP",$(1),$(2))
+# Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y)
+ld-option = $(call try-run, $(LD) $(KBUILD_LDFLAGS) $(1) -v,$(1),$(2),$(3))
 
 # ar-option
 # Usage: KBUILD_ARFLAGS := $(call ar-option,D)
@@ -208,7 +209,7 @@ hdr-inst := -f $(srctree)/scripts/Makefile.headersinst obj
 # Prefix -I with $(srctree) if it is not an absolute path.
 # skip if -I has no parameter
 addtree = $(if $(patsubst -I%,%,$(1)), \
-$(if $(filter-out -I/%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1))) $(1))
+$(if $(filter-out -I/% -I./% -I../%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1)),$(1)),$(1))
 
 # Find all -I options and call addtree
 flags = $(foreach o,$($(1)),$(if $(filter -I%,$(o)),$(call addtree,$(o)),$(o)))
index 26eb701f8deade2421f0e678c7bf1957eb0012db..5e5f1682c902271ef32fa6c7939dda38da6e39c3 100644 (file)
@@ -70,15 +70,8 @@ endif
 
 include scripts/Makefile.lib
 
-ifdef host-progs
-ifneq ($(hostprogs-y),$(host-progs))
-$(warning kbuild: $(obj)/Makefile - Usage of host-progs is deprecated. Please replace with hostprogs-y!)
-hostprogs-y += $(host-progs)
-endif
-endif
-
 # Do not include host rules unless needed
-ifneq ($(hostprogs-y)$(hostprogs-m),)
+ifneq ($(hostprogs-y)$(hostprogs-m)$(hostlibs-y)$(hostlibs-m)$(hostcxxlibs-y)$(hostcxxlibs-m),)
 include scripts/Makefile.host
 endif
 
@@ -181,7 +174,6 @@ $(obj)/%.i: $(src)/%.c FORCE
 cmd_gensymtypes =                                                           \
     $(CPP) -D__GENKSYMS__ $(c_flags) $< |                                   \
     $(GENKSYMS) $(if $(1), -T $(2))                                         \
-     $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX))             \
      $(if $(KBUILD_PRESERVE),-p)                                            \
      -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
 
@@ -222,7 +214,7 @@ cmd_modversions =                                                           \
                $(call cmd_gensymtypes,$(KBUILD_SYMTYPES),$(@:.o=.symtypes))    \
                    > $(@D)/.tmp_$(@F:.o=.ver);                                 \
                                                                                \
-               $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F)                      \
+               $(LD) $(KBUILD_LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F)               \
                        -T $(@D)/.tmp_$(@F:.o=.ver);                            \
                rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver);                \
        else                                                                    \
@@ -231,6 +223,11 @@ cmd_modversions =                                                          \
 endif
 
 ifdef CONFIG_FTRACE_MCOUNT_RECORD
+# gcc 5 supports generating the mcount tables directly
+ifneq ($(call cc-option,-mrecord-mcount,y),y)
+KBUILD_CFLAGS += -mrecord-mcount
+else
+# else do it all manually
 ifdef BUILD_C_RECORDMCOUNT
 ifeq ("$(origin RECORDMCOUNT_WARN)", "command line")
   RECORDMCOUNT_FLAGS = -w
@@ -249,8 +246,8 @@ else
 sub_cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \
        "$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \
        "$(if $(CONFIG_64BIT),64,32)" \
-       "$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CFLAGS)" \
-       "$(LD)" "$(NM)" "$(RM)" "$(MV)" \
+       "$(OBJDUMP)" "$(OBJCOPY)" "$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS)" \
+       "$(LD) $(KBUILD_LDFLAGS)" "$(NM)" "$(RM)" "$(MV)" \
        "$(if $(part-of-module),1,0)" "$(@)";
 recordmcount_source := $(srctree)/scripts/recordmcount.pl
 endif
@@ -259,6 +256,7 @@ cmd_record_mcount =                                         \
             "$(CC_FLAGS_FTRACE)" ]; then                       \
                $(sub_cmd_record_mcount)                        \
        fi;
+endif # -record-mcount
 endif
 
 define rule_cc_o_c
@@ -450,7 +448,4 @@ ifneq ($(cmd_files),)
   include $(cmd_files)
 endif
 
-# Declare the contents of the .PHONY variable as phony.  We keep that
-# information in a variable se we can use it in if_changed and friends.
-
 .PHONY: $(PHONY)
index 4cc468d24eab431628d50cebe0e2567733e9a4a6..d5922e915defa8f25241d432d5edba6e45c5cae4 100644 (file)
@@ -43,8 +43,9 @@ subdir-ymn    := $(foreach f, $(subdir-ymn), \
 
 __clean-files  := $(extra-y) $(extra-m) $(extra-)       \
                   $(always) $(targets) $(clean-files)   \
-                  $(host-progs)                         \
-                  $(hostprogs-y) $(hostprogs-m) $(hostprogs-)
+                  $(hostprogs-y) $(hostprogs-m) $(hostprogs-) \
+                  $(hostlibs-y) $(hostlibs-m) $(hostlibs-) \
+                  $(hostcxxlibs-y) $(hostcxxlibs-m)
 
 __clean-files   := $(filter-out $(no-clean-files), $(__clean-files))
 
@@ -91,7 +92,4 @@ PHONY += $(subdir-ymn)
 $(subdir-ymn):
        $(Q)$(MAKE) $(clean)=$@
 
-# Declare the contents of the .PHONY variable as phony.  We keep that
-# information in a variable se we can use it in if_changed and friends.
-
 .PHONY: $(PHONY)
index 1105c76be12fea84d9bb7909319f70fd8edad98c..80231fbddfda1eeaa80aa3ff9ecccae8dda443a8 100644 (file)
@@ -56,25 +56,4 @@ endif
 
 KBUILD_CFLAGS += $(warning)
 
-dtc-warning-2 += -Wnode_name_chars_strict
-dtc-warning-2 += -Wproperty_name_chars_strict
-
-dtc-warning := $(dtc-warning-$(findstring 1, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS)))
-dtc-warning += $(dtc-warning-$(findstring 2, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS)))
-dtc-warning += $(dtc-warning-$(findstring 3, $(KBUILD_ENABLE_EXTRA_GCC_CHECKS)))
-
-DTC_FLAGS += $(dtc-warning)
-
-else
-
-# Disable noisy checks by default
-DTC_FLAGS += -Wno-unit_address_vs_reg
-DTC_FLAGS += -Wno-simple_bus_reg
-DTC_FLAGS += -Wno-unit_address_format
-DTC_FLAGS += -Wno-pci_bridge
-DTC_FLAGS += -Wno-pci_device_bus_num
-DTC_FLAGS += -Wno-pci_device_reg
-DTC_FLAGS += -Wno-avoid_unnecessary_addr_size
-DTC_FLAGS += -Wno-alias_paths
-
 endif
index e3379a3c51a18a6ef90a87494bcb2102eb1f4e89..da2f4d5bfd372dda42be7b381ad3a08f399c39c3 100644 (file)
@@ -22,6 +22,8 @@
 # They are linked as C++ code to the executable qconf
 
 __hostprogs := $(sort $(hostprogs-y) $(hostprogs-m))
+host-cshlib := $(sort $(hostlibs-y) $(hostlibs-m))
+host-cxxshlib := $(sort $(hostcxxlibs-y) $(hostcxxlibs-m))
 
 # C code
 # Executables compiled from a single .c file
@@ -47,6 +49,10 @@ host-cxxmulti        := $(foreach m,$(__hostprogs),$(if $($(m)-cxxobjs),$(m)))
 # C++ Object (.o) files compiled from .cc files
 host-cxxobjs   := $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs)))
 
+# Object (.o) files used by the shared libaries
+host-cshobjs   := $(sort $(foreach m,$(host-cshlib),$($(m:.so=-objs))))
+host-cxxshobjs := $(sort $(foreach m,$(host-cxxshlib),$($(m:.so=-objs))))
+
 # output directory for programs/.o files
 # hostprogs-y := tools/build may have been specified.
 # Retrieve also directory of .o files from prog-objs or prog-cxxobjs notation
@@ -61,6 +67,10 @@ host-cmulti  := $(addprefix $(obj)/,$(host-cmulti))
 host-cobjs     := $(addprefix $(obj)/,$(host-cobjs))
 host-cxxmulti  := $(addprefix $(obj)/,$(host-cxxmulti))
 host-cxxobjs   := $(addprefix $(obj)/,$(host-cxxobjs))
+host-cshlib    := $(addprefix $(obj)/,$(host-cshlib))
+host-cxxshlib  := $(addprefix $(obj)/,$(host-cxxshlib))
+host-cshobjs   := $(addprefix $(obj)/,$(host-cshobjs))
+host-cxxshobjs := $(addprefix $(obj)/,$(host-cxxshobjs))
 host-shared    := $(addprefix $(obj)/,$(host-shared))
 host-objdirs    := $(addprefix $(obj)/,$(host-objdirs))
 
@@ -69,9 +79,9 @@ obj-dirs += $(host-objdirs)
 #####
 # Handle options to gcc. Support building with separate output directory
 
-_hostc_flags   = $(HOSTCFLAGS)   $(HOST_EXTRACFLAGS)   \
+_hostc_flags   = $(KBUILD_HOSTCFLAGS)   $(HOST_EXTRACFLAGS)   \
                  $(HOSTCFLAGS_$(basetarget).o)
-_hostcxx_flags = $(HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \
+_hostcxx_flags = $(KBUILD_HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \
                  $(HOSTCXXFLAGS_$(basetarget).o)
 
 ifeq ($(KBUILD_SRC),)
@@ -92,16 +102,16 @@ hostcxx_flags  = -Wp,-MD,$(depfile) $(__hostcxx_flags)
 # host-csingle -> Executable
 quiet_cmd_host-csingle         = HOSTCC  $@
       cmd_host-csingle = $(HOSTCC) $(hostc_flags) -o $@ $< \
-               $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
+               $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
 $(host-csingle): $(obj)/%: $(src)/%.c FORCE
        $(call if_changed_dep,host-csingle)
 
 # Link an executable based on list of .o files, all plain c
 # host-cmulti -> executable
 quiet_cmd_host-cmulti  = HOSTLD  $@
-      cmd_host-cmulti  = $(HOSTCC) $(HOSTLDFLAGS) -o $@ \
+      cmd_host-cmulti  = $(HOSTCC) $(KBUILD_HOSTLDFLAGS) -o $@ \
                          $(addprefix $(obj)/,$($(@F)-objs)) \
-                         $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
+                         $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
 $(host-cmulti): FORCE
        $(call if_changed,host-cmulti)
 $(call multi_depend, $(host-cmulti), , -objs)
@@ -116,10 +126,10 @@ $(host-cobjs): $(obj)/%.o: $(src)/%.c FORCE
 # Link an executable based on list of .o files, a mixture of .c and .cc
 # host-cxxmulti -> executable
 quiet_cmd_host-cxxmulti        = HOSTLD  $@
-      cmd_host-cxxmulti        = $(HOSTCXX) $(HOSTLDFLAGS) -o $@ \
+      cmd_host-cxxmulti        = $(HOSTCXX) $(KBUILD_HOSTLDFLAGS) -o $@ \
                          $(foreach o,objs cxxobjs,\
                          $(addprefix $(obj)/,$($(@F)-$(o)))) \
-                         $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
+                         $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
 $(host-cxxmulti): FORCE
        $(call if_changed,host-cxxmulti)
 $(call multi_depend, $(host-cxxmulti), , -objs -cxxobjs)
@@ -130,5 +140,43 @@ quiet_cmd_host-cxxobjs     = HOSTCXX $@
 $(host-cxxobjs): $(obj)/%.o: $(src)/%.cc FORCE
        $(call if_changed_dep,host-cxxobjs)
 
+# Compile .c file, create position independent .o file
+# host-cshobjs -> .o
+quiet_cmd_host-cshobjs = HOSTCC  -fPIC $@
+      cmd_host-cshobjs = $(HOSTCC) $(hostc_flags) -fPIC -c -o $@ $<
+$(host-cshobjs): $(obj)/%.o: $(src)/%.c FORCE
+       $(call if_changed_dep,host-cshobjs)
+
+# Compile .c file, create position independent .o file
+# Note that plugin capable gcc versions can be either C or C++ based
+# therefore plugin source files have to be compilable in both C and C++ mode.
+# This is why a C++ compiler is invoked on a .c file.
+# host-cxxshobjs -> .o
+quiet_cmd_host-cxxshobjs       = HOSTCXX -fPIC $@
+      cmd_host-cxxshobjs       = $(HOSTCXX) $(hostcxx_flags) -fPIC -c -o $@ $<
+$(host-cxxshobjs): $(obj)/%.o: $(src)/%.c FORCE
+       $(call if_changed_dep,host-cxxshobjs)
+
+# Link a shared library, based on position independent .o files
+# *.o -> .so shared library (host-cshlib)
+quiet_cmd_host-cshlib  = HOSTLLD -shared $@
+      cmd_host-cshlib  = $(HOSTCC) $(HOSTLDFLAGS) -shared -o $@ \
+                         $(addprefix $(obj)/,$($(@F:.so=-objs))) \
+                         $(HOST_LOADLIBES) $(HOSTLDLIBS_$(@F))
+$(host-cshlib): FORCE
+       $(call if_changed,host-cshlib)
+$(call multi_depend, $(host-cshlib), .so, -objs)
+
+# Link a shared library, based on position independent .o files
+# *.o -> .so shared library (host-cxxshlib)
+quiet_cmd_host-cxxshlib        = HOSTLLD -shared $@
+      cmd_host-cxxshlib        = $(HOSTCXX) $(HOSTLDFLAGS) -shared -o $@ \
+                         $(addprefix $(obj)/,$($(@F:.so=-objs))) \
+                         $(HOST_LOADLIBES) $(HOSTLDLIBS_$(@F))
+$(host-cxxshlib): FORCE
+       $(call if_changed,host-cxxshlib)
+$(call multi_depend, $(host-cxxshlib), .so, -objs)
+
 targets += $(host-csingle)  $(host-cmulti) $(host-cobjs)\
-          $(host-cxxmulti) $(host-cxxobjs) $(host-shared)
+          $(host-cxxmulti) $(host-cxxobjs) $(host-shared) \
+          $(host-cshlib) $(host-cshobjs) $(host-cxxshlib) $(host-cxxshobjs)
index 30f392fdfb08ce52d3bf8818da13b6b98aaf8523..8decb0e451d4c29c6f1ec8ca7ae4d08e0f675e08 100644 (file)
@@ -144,9 +144,10 @@ else
 # $(call addtree,-I$(obj)) locates .h files in srctree, from generated .c files
 #   and locates generated .h files
 # FIXME: Replace both with specific CFLAGS* statements in the makefiles
-__c_flags      = $(call addtree,-I$(obj)) $(call flags,_c_flags)
-__a_flags      =                          $(call flags,_a_flags)
-__cpp_flags     =                          $(call flags,_cpp_flags)
+__c_flags      = $(if $(obj),$(call addtree,-I$(src)) -I$(obj)) \
+                 $(call flags,_c_flags)
+__a_flags      = $(call flags,_a_flags)
+__cpp_flags     = $(call flags,_cpp_flags)
 endif
 
 # Modified for U-Boot: LINUXINCLUDE -> UBOOTINCLUDE
@@ -160,7 +161,7 @@ a_flags        = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(UBOOTINCLUDE)     \
 cpp_flags      = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(UBOOTINCLUDE)     \
                 $(__cpp_flags)
 
-ld_flags       = $(LDFLAGS) $(ldflags-y)
+ld_flags       = $(KBUILD_LDFLAGS) $(ldflags-y) $(LDFLAGS_$(@F))
 
 # Try these files in order to find the U-Boot-specific .dtsi include file
 u_boot_dtsi_options = $(strip $(wildcard $(dir $<)$(basename $(notdir $<))-u-boot.dtsi) \
@@ -255,8 +256,7 @@ $(obj)/%: $(src)/%_shipped
 # ---------------------------------------------------------------------------
 
 quiet_cmd_ld = LD      $@
-cmd_ld = $(LD) $(LDFLAGS) $(ldflags-y) $(LDFLAGS_$(@F)) \
-              $(filter-out FORCE,$^) -o $@
+cmd_ld = $(LD) $(ld_flags) $(filter-out FORCE,$^) -o $@
 
 # Objcopy
 # ---------------------------------------------------------------------------
@@ -274,6 +274,30 @@ cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -n -f -9 > $@) || \
 # DTC
 # ---------------------------------------------------------------------------
 
+# Disable noisy checks by default
+ifeq ($(findstring 1,$(KBUILD_ENABLE_EXTRA_GCC_CHECKS)),)
+DTC_FLAGS += -Wno-unit_address_vs_reg \
+       -Wno-unit_address_format \
+       -Wno-avoid_unnecessary_addr_size \
+       -Wno-alias_paths \
+       -Wno-graph_child_address \
+       -Wno-graph_port \
+       -Wno-unique_unit_address \
+       -Wno-simple_bus_reg \
+       -Wno-pci_device_reg
+
+# U-Boot specific disables
+DTC_FLAGS += -Wno-pci_bridge \
+        -Wno-pci_device_bus_num
+endif
+
+ifneq ($(findstring 2,$(KBUILD_ENABLE_EXTRA_GCC_CHECKS)),)
+DTC_FLAGS += -Wnode_name_chars_strict \
+       -Wproperty_name_chars_strict
+endif
+
+DTC_FLAGS += $(DTC_FLAGS_$(basetarget))
+
 # Generate an assembly file to wrap the output of the device tree compiler
 quiet_cmd_dt_S_dtb= DTB     $@
 # Modified for U-Boot
index 314b02ba07dbee88e71aa9eeb352e9f6f5f70e30..5384f212783090818bc60922daece5a94e15e63a 100644 (file)
@@ -407,7 +407,7 @@ $(obj)/u-boot-spl-mtk.bin: $(obj)/u-boot-spl.bin FORCE
 # Rule to link u-boot-spl
 # May be overridden by arch/$(ARCH)/config.mk
 quiet_cmd_u-boot-spl ?= LD      $@
-      cmd_u-boot-spl ?= (cd $(obj) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) \
+      cmd_u-boot-spl ?= (cd $(obj) && $(LD) $(KBUILD_LDFLAGS) $(LDFLAGS_$(@F)) \
                       $(patsubst $(obj)/%,%,$(u-boot-spl-init)) --start-group \
                       $(patsubst $(obj)/%,%,$(u-boot-spl-main))  \
                       $(patsubst $(obj)/%,%,$(u-boot-spl-platdata)) \
index da7fb2cd4dde9cd1ca52e8981628fdb9e3ad05f7..c9277d782c5ec24005480c13c59d95e291045fff 100644 (file)
@@ -25,7 +25,7 @@
  *
  * So we play the same trick that "mkdep" played before. We replace
  * the dependency on autoconf.h by a dependency on every config
- * option which is mentioned in any of the listed prequisites.
+ * option which is mentioned in any of the listed prerequisites.
  *
  * kconfig populates a tree in include/config/ with an empty file
  * for each config symbol and when the configuration is updated
@@ -34,7 +34,7 @@
  * the config symbols are rebuilt.
  *
  * So if the user changes his CONFIG_HIS_DRIVER option, only the objects
- * which depend on "include/linux/config/his/driver.h" will be rebuilt,
+ * which depend on "include/config/his/driver.h" will be rebuilt,
  * so most likely only his driver ;-)
  *
  * The idea above dates, by the way, back to Michael E Chastain, AFAIK.
  * and then basically copies the .<target>.d file to stdout, in the
  * process filtering out the dependency on autoconf.h and adding
  * dependencies on include/config/my/option.h for every
- * CONFIG_MY_OPTION encountered in any of the prequisites.
+ * CONFIG_MY_OPTION encountered in any of the prerequisites.
  *
  * It will also filter out all the dependencies on *.ver. We need
  * to make sure that the generated version checksum are globally up
  * to date before even starting the recursive build, so it's too late
  * at this point anyway.
  *
- * The algorithm to grep for "CONFIG_..." is bit unusual, but should
- * be fast ;-) We don't even try to really parse the header files, but
+ * We don't even try to really parse the header files, but
  * merely grep, i.e. if CONFIG_FOO is mentioned in a comment, it will
  * be picked up as well. It's not a problem with respect to
  * correctness, since that can only give too many dependencies, thus
  * (Note: it'd be easy to port over the complete mkdep state machine,
  *  but I don't think the added complexity is worth it)
  */
-/*
- * Note 2: if somebody writes HELLO_CONFIG_BOOM in a file, it will depend onto
- * CONFIG_BOOM. This could seem a bug (not too hard to fix), but please do not
- * fix it! Some UserModeLinux files (look at arch/um/) call CONFIG_BOOM as
- * UML_CONFIG_BOOM, to avoid conflicts with /usr/include/linux/autoconf.h,
- * through arch/um/include/uml-config.h; this fixdep "bug" makes sure that
- * those files will have correct dependencies.
- */
 
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <sys/mman.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
-#include <limits.h>
 #include <ctype.h>
-#include <arpa/inet.h>
-
-#define INT_CONF ntohl(0x434f4e46)
-#define INT_ONFI ntohl(0x4f4e4649)
-#define INT_NFIG ntohl(0x4e464947)
-#define INT_FIG_ ntohl(0x4649475f)
 
-char *target;
-char *depfile;
-char *cmdline;
 int is_spl_build = 0; /* hack for U-Boot */
 
 static void usage(void)
 {
-       fprintf(stderr, "Usage: fixdep <depfile> <target> <cmdline>\n");
+       fprintf(stderr, "Usage: fixdep [-e] <depfile> <target> <cmdline>\n");
+       fprintf(stderr, " -e  insert extra dependencies given on stdin\n");
        exit(1);
 }
 
 /*
- * Print out the commandline prefixed with cmd_<target filename> :=
+ * Print out a dependency path from a symbol name
  */
-static void print_cmdline(void)
+static void print_dep(const char *m, int slen, const char *dir)
 {
-       printf("cmd_%s := %s\n\n", target, cmdline);
+       int c, prev_c = '/', i;
+
+       printf("    $(wildcard %s/", dir);
+       for (i = 0; i < slen; i++) {
+               c = m[i];
+               if (c == '_')
+                       c = '/';
+               else
+                       c = tolower(c);
+               if (c != '/' || prev_c != '/')
+                       putchar(c);
+               prev_c = c;
+       }
+       printf(".h) \\\n");
+}
+
+static void do_extra_deps(void)
+{
+       char buf[80];
+
+       while (fgets(buf, sizeof(buf), stdin)) {
+               int len = strlen(buf);
+
+               if (len < 2 || buf[len - 1] != '\n') {
+                       fprintf(stderr, "fixdep: bad data on stdin\n");
+                       exit(1);
+               }
+               print_dep(buf, len - 1, "include/ksym");
+       }
 }
 
 struct item {
@@ -198,57 +207,44 @@ static void define_config(const char *name, int len, unsigned int hash)
 static void use_config(const char *m, int slen)
 {
        unsigned int hash = strhash(m, slen);
-       int c, i;
 
        if (is_defined_config(m, slen, hash))
            return;
 
        define_config(m, slen, hash);
+       print_dep(m, slen, "include/config");
+}
 
-       printf("    $(wildcard include/config/");
-       for (i = 0; i < slen; i++) {
-               c = m[i];
-               if (c == '_')
-                       c = '/';
-               else
-                       c = tolower(c);
-               putchar(c);
-       }
-       printf(".h) \\\n");
+/* test if s ends in sub */
+static int str_ends_with(const char *s, int slen, const char *sub)
+{
+       int sublen = strlen(sub);
+
+       if (sublen > slen)
+               return 0;
+
+       return !memcmp(s + slen - sublen, sub, sublen);
 }
 
-static void parse_config_file(const char *map, size_t len)
+static void parse_config_file(const char *p)
 {
-       const int *end = (const int *) (map + len);
-       /* start at +1, so that p can never be < map */
-       const int *m   = (const int *) map + 1;
-       const char *p, *q;
+       const char *q, *r;
+       const char *start = p;
        char tmp_buf[256] = "SPL_"; /* hack for U-Boot */
 
-       for (; m < end; m++) {
-               if (*m == INT_CONF) { p = (char *) m  ; goto conf; }
-               if (*m == INT_ONFI) { p = (char *) m-1; goto conf; }
-               if (*m == INT_NFIG) { p = (char *) m-2; goto conf; }
-               if (*m == INT_FIG_) { p = (char *) m-3; goto conf; }
-               continue;
-       conf:
-               if (p > map + len - 7)
+       while ((p = strstr(p, "CONFIG_"))) {
+               if (p > start && (isalnum(p[-1]) || p[-1] == '_')) {
+                       p += 7;
                        continue;
-               if (memcmp(p, "CONFIG_", 7))
-                       continue;
-               p += 7;
-               for (q = p; q < map + len; q++) {
-                       if (!(isalnum(*q) || *q == '_'))
-                               goto found;
                }
-               continue;
-
-       found:
-               if (!memcmp(q - 7, "_MODULE", 7))
-                       q -= 7;
-               if (q - p < 0)
-                       continue;
-
+               p += 7;
+               q = p;
+               while (*q && (isalnum(*q) || *q == '_'))
+                       q++;
+               if (str_ends_with(p, q - p, "_MODULE"))
+                       r = q - 7;
+               else
+                       r = q;
                /*
                 * U-Boot also handles
                 *   CONFIG_IS_ENABLED(...)
@@ -261,69 +257,61 @@ static void parse_config_file(const char *map, size_t len)
                    (q - p == 9 && !memcmp(p, "IS_MODULE(", 10)) ||
                    (q - p == 3 && !memcmp(p, "VAL(", 4))) {
                        p = q + 1;
-                       for (q = p; q < map + len; q++)
-                               if (*q == ')')
-                                       goto found2;
-                       continue;
-
-               found2:
-                       if (is_spl_build) {
-                               memcpy(tmp_buf + 4, p, q - p);
-                               q = tmp_buf + 4 + (q - p);
+                       while (isalnum(*q) || *q == '_')
+                               q++;
+                       r = q;
+                       if (r > p && is_spl_build) {
+                               memcpy(tmp_buf + 4, p, r - p);
+                               r = tmp_buf + 4 + (r - p);
                                p = tmp_buf;
                        }
                }
                /* end U-Boot hack */
 
-               use_config(p, q - p);
+               if (r > p)
+                       use_config(p, r - p);
+               p = q;
        }
 }
 
-/* test is s ends in sub */
-static int strrcmp(char *s, char *sub)
-{
-       int slen = strlen(s);
-       int sublen = strlen(sub);
-
-       if (sublen > slen)
-               return 1;
-
-       return memcmp(s + slen - sublen, sub, sublen);
-}
-
-static void do_config_file(const char *filename)
+static void *read_file(const char *filename)
 {
        struct stat st;
        int fd;
-       void *map;
+       char *buf;
 
        fd = open(filename, O_RDONLY);
        if (fd < 0) {
-               fprintf(stderr, "fixdep: error opening config file: ");
+               fprintf(stderr, "fixdep: error opening file: ");
                perror(filename);
                exit(2);
        }
        if (fstat(fd, &st) < 0) {
-               fprintf(stderr, "fixdep: error fstat'ing config file: ");
+               fprintf(stderr, "fixdep: error fstat'ing file: ");
                perror(filename);
                exit(2);
        }
-       if (st.st_size == 0) {
-               close(fd);
-               return;
+       buf = malloc(st.st_size + 1);
+       if (!buf) {
+               perror("fixdep: malloc");
+               exit(2);
        }
-       map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
-       if ((long) map == -1) {
-               perror("fixdep: mmap");
-               close(fd);
-               return;
+       if (read(fd, buf, st.st_size) != st.st_size) {
+               perror("fixdep: read");
+               exit(2);
        }
+       buf[st.st_size] = '\0';
+       close(fd);
 
-       parse_config_file(map, st.st_size);
-
-       munmap(map, st.st_size);
+       return buf;
+}
 
-       close(fd);
+/* Ignore certain dependencies */
+static int is_ignored_file(const char *s, int len)
+{
+       return str_ends_with(s, len, "include/generated/autoconf.h") ||
+              str_ends_with(s, len, "include/generated/autoksyms.h") ||
+              str_ends_with(s, len, ".ver");
 }
 
 /*
@@ -331,70 +319,70 @@ static void do_config_file(const char *filename)
  * assignments are parsed not only by make, but also by the rather simple
  * parser in scripts/mod/sumversion.c.
  */
-static void parse_dep_file(void *map, size_t len)
+static void parse_dep_file(char *m, const char *target, int insert_extra_deps)
 {
-       char *m = map;
-       char *end = m + len;
        char *p;
-       char s[PATH_MAX];
-       int is_target;
+       int is_last, is_target;
        int saw_any_target = 0;
        int is_first_dep = 0;
+       void *buf;
 
-       while (m < end) {
+       while (1) {
                /* Skip any "white space" */
-               while (m < end && (*m == ' ' || *m == '\\' || *m == '\n'))
+               while (*m == ' ' || *m == '\\' || *m == '\n')
                        m++;
+
+               if (!*m)
+                       break;
+
                /* Find next "white space" */
                p = m;
-               while (p < end && *p != ' ' && *p != '\\' && *p != '\n')
+               while (*p && *p != ' ' && *p != '\\' && *p != '\n')
                        p++;
+               is_last = (*p == '\0');
                /* Is the token we found a target name? */
                is_target = (*(p-1) == ':');
                /* Don't write any target names into the dependency file */
                if (is_target) {
                        /* The /next/ file is the first dependency */
                        is_first_dep = 1;
-               } else {
-                       /* Save this token/filename */
-                       memcpy(s, m, p-m);
-                       s[p - m] = 0;
-
-                       /* Ignore certain dependencies */
-                       if (strrcmp(s, "include/generated/autoconf.h") &&
-                           strrcmp(s, "arch/um/include/uml-config.h") &&
-                           strrcmp(s, "include/linux/kconfig.h") &&
-                           strrcmp(s, ".ver")) {
+               } else if (!is_ignored_file(m, p - m)) {
+                       *p = '\0';
+
+                       /*
+                        * Do not list the source file as dependency, so that
+                        * kbuild is not confused if a .c file is rewritten
+                        * into .S or vice versa. Storing it in source_* is
+                        * needed for modpost to compute srcversions.
+                        */
+                       if (is_first_dep) {
                                /*
-                                * Do not list the source file as dependency,
-                                * so that kbuild is not confused if a .c file
-                                * is rewritten into .S or vice versa. Storing
-                                * it in source_* is needed for modpost to
-                                * compute srcversions.
+                                * If processing the concatenation of multiple
+                                * dependency files, only process the first
+                                * target name, which will be the original
+                                * source name, and ignore any other target
+                                * names, which will be intermediate temporary
+                                * files.
                                 */
-                               if (is_first_dep) {
-                                       /*
-                                        * If processing the concatenation of
-                                        * multiple dependency files, only
-                                        * process the first target name, which
-                                        * will be the original source name,
-                                        * and ignore any other target names,
-                                        * which will be intermediate temporary
-                                        * files.
-                                        */
-                                       if (!saw_any_target) {
-                                               saw_any_target = 1;
-                                               printf("source_%s := %s\n\n",
-                                                       target, s);
-                                               printf("deps_%s := \\\n",
-                                                       target);
-                                       }
-                                       is_first_dep = 0;
-                               } else
-                                       printf("  %s \\\n", s);
-                               do_config_file(s);
+                               if (!saw_any_target) {
+                                       saw_any_target = 1;
+                                       printf("source_%s := %s\n\n",
+                                              target, m);
+                                       printf("deps_%s := \\\n", target);
+                               }
+                               is_first_dep = 0;
+                       } else {
+                               printf("  %s \\\n", m);
                        }
+
+                       buf = read_file(m);
+                       parse_config_file(buf);
+                       free(buf);
                }
+
+               if (is_last)
+                       break;
+
                /*
                 * Start searching for next token immediately after the first
                 * "whitespace" character that follows this token.
@@ -407,63 +395,23 @@ static void parse_dep_file(void *map, size_t len)
                exit(1);
        }
 
+       if (insert_extra_deps)
+               do_extra_deps();
+
        printf("\n%s: $(deps_%s)\n\n", target, target);
        printf("$(deps_%s):\n", target);
 }
 
-static void print_deps(void)
-{
-       struct stat st;
-       int fd;
-       void *map;
-
-       fd = open(depfile, O_RDONLY);
-       if (fd < 0) {
-               fprintf(stderr, "fixdep: error opening depfile: ");
-               perror(depfile);
-               exit(2);
-       }
-       if (fstat(fd, &st) < 0) {
-               fprintf(stderr, "fixdep: error fstat'ing depfile: ");
-               perror(depfile);
-               exit(2);
-       }
-       if (st.st_size == 0) {
-               fprintf(stderr,"fixdep: %s is empty\n",depfile);
-               close(fd);
-               return;
-       }
-       map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
-       if ((long) map == -1) {
-               perror("fixdep: mmap");
-               close(fd);
-               return;
-       }
-
-       parse_dep_file(map, st.st_size);
-
-       munmap(map, st.st_size);
-
-       close(fd);
-}
-
-static void traps(void)
-{
-       static char test[] __attribute__((aligned(sizeof(int)))) = "CONF";
-       int *p = (int *)test;
-
-       if (*p != INT_CONF) {
-               fprintf(stderr, "fixdep: sizeof(int) != 4 or wrong endianness? %#x\n",
-                       *p);
-               exit(2);
-       }
-}
-
 int main(int argc, char *argv[])
 {
-       traps();
-
-       if (argc != 4)
+       const char *depfile, *target, *cmdline;
+       int insert_extra_deps = 0;
+       void *buf;
+
+       if (argc == 5 && !strcmp(argv[1], "-e")) {
+               insert_extra_deps = 1;
+               argv++;
+       } else if (argc != 4)
                usage();
 
        depfile = argv[1];
@@ -474,8 +422,11 @@ int main(int argc, char *argv[])
        if (!strncmp(target, "spl/", 4) || !strncmp(target, "tpl/", 4))
                is_spl_build = 1;
 
-       print_cmdline();
-       print_deps();
+       printf("cmd_%s := %s\n\n", target, cmdline);
+
+       buf = read_file(depfile);
+       parse_dep_file(buf, target, insert_extra_deps);
+       free(buf);
 
        return 0;
 }
diff --git a/scripts/dtc-version.sh b/scripts/dtc-version.sh
deleted file mode 100755 (executable)
index 0744c39..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/sh
-#
-# dtc-version dtc-command
-#
-# Prints the dtc version of `dtc-command' in a canonical 6-digit form
-# such as `010404'  for dtc 1.4.4
-#
-
-dtc="$*"
-
-if [ ${#dtc} -eq 0 ]; then
-       echo "Error: No dtc command specified."
-       printf "Usage:\n\t$0 <dtc-command>\n"
-       exit 1
-fi
-
-MAJOR=$($dtc -v | head -1 | awk '{print $NF}' | cut -d . -f 1)
-MINOR=$($dtc -v | head -1 | awk '{print $NF}' | cut -d . -f 2)
-PATCH=$($dtc -v | head -1 | awk '{print $NF}' | cut -d . -f 3 | cut -d - -f 1)
-
-printf "%02d%02d%02d\\n" $MAJOR $MINOR $PATCH
index e999be939831bde794f2aafb7b336c9ed36f4544..58d879dd11f5212eaeaed3408d2f063211576180 100644 (file)
@@ -9,21 +9,11 @@ dtc-objs      := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \
 dtc-objs       += dtc-lexer.lex.o dtc-parser.tab.o
 
 # Source files need to get at the userspace version of libfdt_env.h to compile
+HOST_EXTRACFLAGS := -I$(src)/libfdt
 
-HOSTCFLAGS_DTC := -I$(src) -I$(src)/libfdt
-
-HOSTCFLAGS_checks.o := $(HOSTCFLAGS_DTC)
-HOSTCFLAGS_data.o := $(HOSTCFLAGS_DTC)
-HOSTCFLAGS_dtc.o := $(HOSTCFLAGS_DTC)
-HOSTCFLAGS_flattree.o := $(HOSTCFLAGS_DTC)
-HOSTCFLAGS_fstree.o := $(HOSTCFLAGS_DTC)
-HOSTCFLAGS_livetree.o := $(HOSTCFLAGS_DTC)
-HOSTCFLAGS_srcpos.o := $(HOSTCFLAGS_DTC)
-HOSTCFLAGS_treesource.o := $(HOSTCFLAGS_DTC)
-HOSTCFLAGS_util.o := $(HOSTCFLAGS_DTC)
-
-HOSTCFLAGS_dtc-lexer.lex.o := $(HOSTCFLAGS_DTC)
-HOSTCFLAGS_dtc-parser.tab.o := $(HOSTCFLAGS_DTC)
+# Generated files need one more search path to include headers in source tree
+HOSTCFLAGS_dtc-lexer.lex.o := -I$(src)
+HOSTCFLAGS_dtc-parser.tab.o := -I$(src)
 
 # dependencies on generated files need to be listed explicitly
 $(obj)/dtc-lexer.lex.o: $(obj)/dtc-parser.tab.h
index 40879677c8c3af28bc646a98bd2c67c73ad55989..c35aa6f88639e47240419de0f7dcb493cd546a9a 100644 (file)
@@ -255,7 +255,7 @@ static void check_duplicate_node_names(struct check *c, struct dt_info *dti,
                     child2;
                     child2 = child2->next_sibling)
                        if (streq(child->name, child2->name))
-                               FAIL(c, dti, node, "Duplicate node name");
+                               FAIL(c, dti, child2, "Duplicate node name");
 }
 ERROR(duplicate_node_names, check_duplicate_node_names, NULL);
 
@@ -317,6 +317,11 @@ static void check_unit_address_vs_reg(struct check *c, struct dt_info *dti,
        const char *unitname = get_unitname(node);
        struct property *prop = get_property(node, "reg");
 
+       if (get_subnode(node, "__overlay__")) {
+               /* HACK: Overlay fragments are a special case */
+               return;
+       }
+
        if (!prop) {
                prop = get_property(node, "ranges");
                if (prop && !prop->val.len)
@@ -1030,6 +1035,36 @@ static void check_avoid_unnecessary_addr_size(struct check *c, struct dt_info *d
 }
 WARNING(avoid_unnecessary_addr_size, check_avoid_unnecessary_addr_size, NULL, &avoid_default_addr_size);
 
+static void check_unique_unit_address(struct check *c, struct dt_info *dti,
+                                             struct node *node)
+{
+       struct node *childa;
+
+       if (node->addr_cells < 0 || node->size_cells < 0)
+               return;
+
+       if (!node->children)
+               return;
+
+       for_each_child(node, childa) {
+               struct node *childb;
+               const char *addr_a = get_unitname(childa);
+
+               if (!strlen(addr_a))
+                       continue;
+
+               for_each_child(node, childb) {
+                       const char *addr_b = get_unitname(childb);
+                       if (childa == childb)
+                               break;
+
+                       if (streq(addr_a, addr_b))
+                               FAIL(c, dti, childb, "duplicate unit-address (also used in node %s)", childa->fullpath);
+               }
+       }
+}
+WARNING(unique_unit_address, check_unique_unit_address, NULL, &avoid_default_addr_size);
+
 static void check_obsolete_chosen_interrupt_controller(struct check *c,
                                                       struct dt_info *dti,
                                                       struct node *node)
@@ -1370,6 +1405,152 @@ static void check_interrupts_property(struct check *c,
 }
 WARNING(interrupts_property, check_interrupts_property, &phandle_references);
 
+static const struct bus_type graph_port_bus = {
+       .name = "graph-port",
+};
+
+static const struct bus_type graph_ports_bus = {
+       .name = "graph-ports",
+};
+
+static void check_graph_nodes(struct check *c, struct dt_info *dti,
+                             struct node *node)
+{
+       struct node *child;
+
+       for_each_child(node, child) {
+               if (!(strprefixeq(child->name, child->basenamelen, "endpoint") ||
+                     get_property(child, "remote-endpoint")))
+                       continue;
+
+               node->bus = &graph_port_bus;
+
+               /* The parent of 'port' nodes can be either 'ports' or a device */
+               if (!node->parent->bus &&
+                   (streq(node->parent->name, "ports") || get_property(node, "reg")))
+                       node->parent->bus = &graph_ports_bus;
+
+               break;
+       }
+
+}
+WARNING(graph_nodes, check_graph_nodes, NULL);
+
+static void check_graph_child_address(struct check *c, struct dt_info *dti,
+                                     struct node *node)
+{
+       int cnt = 0;
+       struct node *child;
+
+       if (node->bus != &graph_ports_bus && node->bus != &graph_port_bus)
+               return;
+
+       for_each_child(node, child) {
+               struct property *prop = get_property(child, "reg");
+
+               /* No error if we have any non-zero unit address */
+               if (prop && propval_cell(prop) != 0)
+                       return;
+
+               cnt++;
+       }
+
+       if (cnt == 1 && node->addr_cells != -1)
+               FAIL(c, dti, node, "graph node has single child node '%s', #address-cells/#size-cells are not necessary",
+                    node->children->name);
+}
+WARNING(graph_child_address, check_graph_child_address, NULL, &graph_nodes);
+
+static void check_graph_reg(struct check *c, struct dt_info *dti,
+                           struct node *node)
+{
+       char unit_addr[9];
+       const char *unitname = get_unitname(node);
+       struct property *prop;
+
+       prop = get_property(node, "reg");
+       if (!prop || !unitname)
+               return;
+
+       if (!(prop->val.val && prop->val.len == sizeof(cell_t))) {
+               FAIL(c, dti, node, "graph node malformed 'reg' property");
+               return;
+       }
+
+       snprintf(unit_addr, sizeof(unit_addr), "%x", propval_cell(prop));
+       if (!streq(unitname, unit_addr))
+               FAIL(c, dti, node, "graph node unit address error, expected \"%s\"",
+                    unit_addr);
+
+       if (node->parent->addr_cells != 1)
+               FAIL_PROP(c, dti, node, get_property(node, "#address-cells"),
+                         "graph node '#address-cells' is %d, must be 1",
+                         node->parent->addr_cells);
+       if (node->parent->size_cells != 0)
+               FAIL_PROP(c, dti, node, get_property(node, "#size-cells"),
+                         "graph node '#size-cells' is %d, must be 0",
+                         node->parent->size_cells);
+}
+
+static void check_graph_port(struct check *c, struct dt_info *dti,
+                            struct node *node)
+{
+       if (node->bus != &graph_port_bus)
+               return;
+
+       if (!strprefixeq(node->name, node->basenamelen, "port"))
+               FAIL(c, dti, node, "graph port node name should be 'port'");
+
+       check_graph_reg(c, dti, node);
+}
+WARNING(graph_port, check_graph_port, NULL, &graph_nodes);
+
+static struct node *get_remote_endpoint(struct check *c, struct dt_info *dti,
+                                       struct node *endpoint)
+{
+       int phandle;
+       struct node *node;
+       struct property *prop;
+
+       prop = get_property(endpoint, "remote-endpoint");
+       if (!prop)
+               return NULL;
+
+       phandle = propval_cell(prop);
+       /* Give up if this is an overlay with external references */
+       if (phandle == 0 || phandle == -1)
+               return NULL;
+
+       node = get_node_by_phandle(dti->dt, phandle);
+       if (!node)
+               FAIL_PROP(c, dti, endpoint, prop, "graph phandle is not valid");
+
+       return node;
+}
+
+static void check_graph_endpoint(struct check *c, struct dt_info *dti,
+                                struct node *node)
+{
+       struct node *remote_node;
+
+       if (!node->parent || node->parent->bus != &graph_port_bus)
+               return;
+
+       if (!strprefixeq(node->name, node->basenamelen, "endpoint"))
+               FAIL(c, dti, node, "graph endpont node name should be 'endpoint'");
+
+       check_graph_reg(c, dti, node);
+
+       remote_node = get_remote_endpoint(c, dti, node);
+       if (!remote_node)
+               return;
+
+       if (get_remote_endpoint(c, dti, remote_node) != node)
+               FAIL(c, dti, node, "graph connection to node '%s' is not bidirectional",
+                    remote_node->fullpath);
+}
+WARNING(graph_endpoint, check_graph_endpoint, NULL, &graph_nodes);
+
 static struct check *check_table[] = {
        &duplicate_node_names, &duplicate_property_names,
        &node_name_chars, &node_name_format, &property_name_chars,
@@ -1404,6 +1585,7 @@ static struct check *check_table[] = {
 
        &avoid_default_addr_size,
        &avoid_unnecessary_addr_size,
+       &unique_unit_address,
        &obsolete_chosen_interrupt_controller,
        &chosen_node_is_root, &chosen_node_bootargs, &chosen_node_stdout_path,
 
@@ -1430,6 +1612,8 @@ static struct check *check_table[] = {
 
        &alias_paths,
 
+       &graph_nodes, &graph_child_address, &graph_port, &graph_endpoint,
+
        &always_fail,
 };
 
index 66ff7f7d8eb73ca4c4a2d1275caf788741366ed3..011a5b25539a18f3882aaadbe61b228e391b00d7 100644 (file)
@@ -191,18 +191,18 @@ devicetree:
                }
        | devicetree DT_REF nodedef
                {
-                       struct node *target = get_node_by_ref($1, $2);
-
-                       if (target) {
-                               merge_nodes(target, $3);
+                       /*
+                        * We rely on the rule being always:
+                        *   versioninfo plugindecl memreserves devicetree
+                        * so $-1 is what we want (plugindecl)
+                        */
+                       if ($<flags>-1 & DTSF_PLUGIN) {
+                               add_orphan_node($1, $3, $2);
                        } else {
-                               /*
-                                * We rely on the rule being always:
-                                *   versioninfo plugindecl memreserves devicetree
-                                * so $-1 is what we want (plugindecl)
-                                */
-                               if ($<flags>-1 & DTSF_PLUGIN)
-                                       add_orphan_node($1, $3, $2);
+                               struct node *target = get_node_by_ref($1, $2);
+
+                               if (target)
+                                       merge_nodes(target, $3);
                                else
                                        ERROR(&@2, "Label or path %s not found", $2);
                        }
index 81b6c484542d16eeee10d2c56d07f71be5b9022c..6e4c367f54b3a8de0289d9677519a81b63ef5aa4 100644 (file)
@@ -238,10 +238,16 @@ struct node * add_orphan_node(struct node *dt, struct node *new_node, char *ref)
        struct data d = empty_data;
        char *name;
 
-       d = data_add_marker(d, REF_PHANDLE, ref);
-       d = data_append_integer(d, 0xffffffff, 32);
+       if (ref[0] == '/') {
+               d = data_append_data(d, ref, strlen(ref) + 1);
 
-       p = build_property("target", d);
+               p = build_property("target-path", d);
+       } else {
+               d = data_add_marker(d, REF_PHANDLE, ref);
+               d = data_append_integer(d, 0xffffffff, 32);
+
+               p = build_property("target", d);
+       }
 
        xasprintf(&name, "fragment@%u",
                        next_orphan_fragment++);
index ad87849e333bc6e450a1b27685fd10bfe065c241..b00f14ff7a17caaf0ed92d5823a3e398386a2d9f 100644 (file)
@@ -1 +1 @@
-#define DTC_VERSION "DTC 1.4.6-gaadd0b65"
+#define DTC_VERSION "DTC 1.4.6-g84e414b0"
index 2da579edcbafd3ffe4f9af5a91562b06fe41c8b0..0aabc1d6a1826c93ba855f979469dcd47aacb76f 100644 (file)
@@ -2,9 +2,6 @@
 # Generated files
 #
 *.moc
-gconf.glade.h
-*.pot
-*.mo
 
 #
 # configuration programs
@@ -14,4 +11,3 @@ mconf
 nconf
 qconf
 gconf
-kxgettext
index 8b7b34975802f336b3bc9b09ae55a05e7bc7b1d3..559bb88264c3621aec0f0f7797ace0d079c6cf10 100644 (file)
@@ -3,8 +3,8 @@
 # Kernel configuration targets
 # These targets are used from top-level makefile
 
-PHONY += xconfig gconfig menuconfig config syncconfig update-po-config \
-       localmodconfig localyesconfig
+PHONY += xconfig gconfig menuconfig config localmodconfig localyesconfig \
+       build_menuconfig build_nconfig build_gconfig build_xconfig
 
 # Added for U-Boot
 #  Linux has defconfig files in arch/$(SRCARCH)/configs/,
@@ -40,14 +40,15 @@ config: $(obj)/conf
 nconfig: $(obj)/nconf
        $< $(silent) $(Kconfig)
 
-# This has become an internal implementation detail and is now deprecated
-# for external use.
-syncconfig: $(obj)/conf
-       $(Q)mkdir -p include/config include/generated
-       $< $(silent) --$@ $(Kconfig)
+build_menuconfig: $(obj)/mconf
+
+build_nconfig: $(obj)/nconf
+
+build_gconfig: $(obj)/gconf
+
+build_xconfig: $(obj)/qconf
 
 localyesconfig localmodconfig: $(obj)/conf
-       $(Q)mkdir -p include/config include/generated
        $(Q)perl $(srctree)/$(src)/streamline_config.pl --$@ $(srctree) $(Kconfig) > .tmp.config
        $(Q)if [ -f .config ]; then                                     \
                        cmp -s .tmp.config .config ||                   \
@@ -61,32 +62,13 @@ localyesconfig localmodconfig: $(obj)/conf
        fi
        $(Q)rm -f .tmp.config
 
-# Create new linux.pot file
-# Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files
-update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h
-       $(Q)$(kecho) "  GEN     config.pot"
-       $(Q)xgettext --default-domain=linux                         \
-           --add-comments --keyword=_ --keyword=N_                 \
-           --from-code=UTF-8                                       \
-           --files-from=$(srctree)/scripts/kconfig/POTFILES.in     \
-           --directory=$(srctree) --directory=$(objtree)           \
-           --output $(obj)/config.pot
-       $(Q)sed -i s/CHARSET/UTF-8/ $(obj)/config.pot
-       $(Q)(for i in `ls $(srctree)/arch/*/Kconfig      \
-           $(srctree)/arch/*/um/Kconfig`;               \
-           do                                           \
-               $(kecho) "  GEN     $$i";                    \
-               $(obj)/kxgettext $$i                     \
-                    >> $(obj)/config.pot;               \
-           done )
-       $(Q)$(kecho) "  GEN     linux.pot"
-       $(Q)msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \
-           --output $(obj)/linux.pot
-       $(Q)rm -f $(obj)/config.pot
-
 # These targets map 1:1 to the commandline options of 'conf'
+#
+# Note:
+#  syncconfig has become an internal implementation detail and is now
+#  deprecated for external use
 simple-targets := oldconfig allnoconfig allyesconfig allmodconfig \
-       alldefconfig randconfig listnewconfig olddefconfig
+       alldefconfig randconfig listnewconfig olddefconfig syncconfig
 PHONY += $(simple-targets)
 
 $(simple-targets): $(obj)/conf
@@ -161,8 +143,7 @@ clean-dirs += tests/.cache
 # Help text used by make help
 help:
        @echo  '  config          - Update current config utilising a line-oriented program'
-       @echo  '  nconfig         - Update current config utilising a ncurses menu based'
-       @echo  '                    program'
+       @echo  '  nconfig         - Update current config utilising a ncurses menu based program'
        @echo  '  menuconfig      - Update current config utilising a menu based program'
        @echo  '  xconfig         - Update current config utilising a Qt based front-end'
        @echo  '  gconfig         - Update current config utilising a GTK+ based front-end'
@@ -182,141 +163,78 @@ help:
 #      @echo  '  kvmconfig       - Enable additional options for kvm guest kernel support'
 #      @echo  '  xenconfig       - Enable additional options for xen dom0 and guest kernel support'
 #      @echo  '  tinyconfig      - Configure the tiniest possible kernel'
-
-# lxdialog stuff
-check-lxdialog  := $(srctree)/$(src)/lxdialog/check-lxdialog.sh
-
-# Use recursively expanded variables so we do not call gcc unless
-# we really need to do so. (Do not call gcc as part of make mrproper)
-HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags) \
-                    -DLOCALE
+       @echo  '  testconfig      - Run Kconfig unit tests (requires python3 and pytest)'
 
 # ===========================================================================
 # Shared Makefile for the various kconfig executables:
 # conf:          Used for defconfig, oldconfig and related targets
-# nconf:  Used for the nconfig target.
-#         Utilizes ncurses
-# mconf:  Used for the menuconfig target
-#         Utilizes the lxdialog package
-# qconf:  Used for the xconfig target
-#         Based on Qt which needs to be installed to compile it
-# gconf:  Used for the gconfig target
-#         Based on GTK+ which needs to be installed to compile it
 # object files used by all kconfig flavours
 
-lxdialog := lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o
-lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o
-
 conf-objs      := conf.o  zconf.tab.o
-mconf-objs     := mconf.o zconf.tab.o $(lxdialog)
-nconf-objs     := nconf.o zconf.tab.o nconf.gui.o
-kxgettext-objs := kxgettext.o zconf.tab.o
-qconf-cxxobjs  := qconf.o
-qconf-objs     := zconf.tab.o
-gconf-objs     := gconf.o zconf.tab.o
 
-hostprogs-y := conf nconf mconf kxgettext qconf gconf
+hostprogs-y := conf
 
 targets                += zconf.lex.c
-clean-files    := qconf.moc .tmp_qtcheck .tmp_gtkcheck
-clean-files    += gconf.glade.h
-clean-files     += config.pot linux.pot
-
-# Check that we have the required ncurses stuff installed for lxdialog (menuconfig)
-PHONY += $(obj)/dochecklxdialog
-$(addprefix $(obj)/, mconf.o $(lxdialog)): $(obj)/dochecklxdialog
-$(obj)/dochecklxdialog:
-       $(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTLOADLIBES_mconf)
-
-always := dochecklxdialog
-
-# Add environment specific flags
-HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCC) $(HOSTCFLAGS))
-HOST_EXTRACXXFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCXX) $(HOSTCXXFLAGS))
 
 # generated files seem to need this to find local include files
 HOSTCFLAGS_zconf.lex.o := -I$(src)
 HOSTCFLAGS_zconf.tab.o := -I$(src)
 
-HOSTLOADLIBES_qconf    = $(KC_QT_LIBS)
-HOSTCXXFLAGS_qconf.o   = $(KC_QT_CFLAGS)
-
-HOSTLOADLIBES_gconf    = `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0`
-HOSTCFLAGS_gconf.o     = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \
-                          -Wno-missing-prototypes
-
-HOSTLOADLIBES_mconf   = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
-
-HOSTLOADLIBES_nconf    = $(shell \
-                               pkg-config --libs menuw panelw ncursesw 2>/dev/null \
-                               || pkg-config --libs menu panel ncurses 2>/dev/null \
-                               || echo "-lmenu -lpanel -lncurses"  )
-$(obj)/qconf.o: $(obj)/.tmp_qtcheck
-
-ifeq ($(MAKECMDGOALS),xconfig)
-$(obj)/.tmp_qtcheck: $(src)/Makefile
--include $(obj)/.tmp_qtcheck
-
-# Qt needs some extra effort...
-$(obj)/.tmp_qtcheck:
-       @set -e; $(kecho) "  CHECK   qt"; \
-       if pkg-config --exists Qt5Core; then \
-           cflags="-std=c++11 -fPIC `pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets`"; \
-           libs=`pkg-config --libs Qt5Core Qt5Gui Qt5Widgets`; \
-           moc=`pkg-config --variable=host_bins Qt5Core`/moc; \
-       elif pkg-config --exists QtCore; then \
-           cflags=`pkg-config --cflags QtCore QtGui`; \
-           libs=`pkg-config --libs QtCore QtGui`; \
-           moc=`pkg-config --variable=moc_location QtCore`; \
-       else \
-           echo >&2 "*"; \
-           echo >&2 "* Could not find Qt via pkg-config."; \
-           echo >&2 "* Please install either Qt 4.8 or 5.x. and make sure it's in PKG_CONFIG_PATH"; \
-           echo >&2 "*"; \
-           exit 1; \
-       fi; \
-       echo "KC_QT_CFLAGS=$$cflags" > $@; \
-       echo "KC_QT_LIBS=$$libs" >> $@; \
-       echo "KC_QT_MOC=$$moc" >> $@
-endif
+# nconf: Used for the nconfig target based on ncurses
+hostprogs-y    += nconf
+nconf-objs     := nconf.o zconf.tab.o nconf.gui.o
 
-$(obj)/gconf.o: $(obj)/.tmp_gtkcheck
-
-ifeq ($(MAKECMDGOALS),gconfig)
--include $(obj)/.tmp_gtkcheck
-
-# GTK+ needs some extra effort, too...
-$(obj)/.tmp_gtkcheck:
-       @if `pkg-config --exists gtk+-2.0 gmodule-2.0 libglade-2.0`; then               \
-               if `pkg-config --atleast-version=2.0.0 gtk+-2.0`; then                  \
-                       touch $@;                                                               \
-               else                                                                    \
-                       echo >&2 "*";                                                   \
-                       echo >&2 "* GTK+ is present but version >= 2.0.0 is required."; \
-                       echo >&2 "*";                                                   \
-                       false;                                                          \
-               fi                                                                      \
-       else                                                                            \
-               echo >&2 "*";                                                           \
-               echo >&2 "* Unable to find the GTK+ installation. Please make sure that";       \
-               echo >&2 "* the GTK+ 2.0 development package is correctly installed...";        \
-               echo >&2 "* You need gtk+-2.0, glib-2.0 and libglade-2.0.";             \
-               echo >&2 "*";                                                           \
-               false;                                                                  \
-       fi
-endif
+HOSTLDLIBS_nconf       = $(shell . $(obj)/.nconf-cfg && echo $$libs)
+HOSTCFLAGS_nconf.o     = $(shell . $(obj)/.nconf-cfg && echo $$cflags)
+HOSTCFLAGS_nconf.gui.o = $(shell . $(obj)/.nconf-cfg && echo $$cflags)
 
-$(obj)/zconf.tab.o: $(obj)/zconf.lex.c
+$(obj)/nconf.o $(obj)/nconf.gui.o: $(obj)/.nconf-cfg
+
+# mconf: Used for the menuconfig target based on lxdialog
+hostprogs-y    += mconf
+lxdialog       := checklist.o inputbox.o menubox.o textbox.o util.o yesno.o
+mconf-objs     := mconf.o zconf.tab.o $(addprefix lxdialog/, $(lxdialog))
+
+HOSTLDLIBS_mconf = $(shell . $(obj)/.mconf-cfg && echo $$libs)
+$(foreach f, mconf.o $(lxdialog), \
+  $(eval HOSTCFLAGS_$f = $$(shell . $(obj)/.mconf-cfg && echo $$$$cflags)))
+
+$(obj)/mconf.o: $(obj)/.mconf-cfg
+$(addprefix $(obj)/lxdialog/, $(lxdialog)): $(obj)/.mconf-cfg
+
+# qconf: Used for the xconfig target based on Qt
+hostprogs-y    += qconf
+qconf-cxxobjs  := qconf.o
+qconf-objs     := zconf.tab.o
+
+HOSTLDLIBS_qconf       = $(shell . $(obj)/.qconf-cfg && echo $$libs)
+HOSTCXXFLAGS_qconf.o   = $(shell . $(obj)/.qconf-cfg && echo $$cflags)
 
-$(obj)/qconf.o: $(obj)/qconf.moc
+$(obj)/qconf.o: $(obj)/.qconf-cfg $(obj)/qconf.moc
 
 quiet_cmd_moc = MOC     $@
-      cmd_moc = $(KC_QT_MOC) -i $< -o $@
+      cmd_moc = $(shell . $(obj)/.qconf-cfg && echo $$moc) -i $< -o $@
 
-$(obj)/%.moc: $(src)/%.h $(obj)/.tmp_qtcheck
+$(obj)/%.moc: $(src)/%.h $(obj)/.qconf-cfg
        $(call cmd,moc)
 
-# Extract gconf menu items for i18n support
-$(obj)/gconf.glade.h: $(obj)/gconf.glade
-       $(Q)intltool-extract --type=gettext/glade --srcdir=$(srctree) \
-       $(obj)/gconf.glade
+# gconf: Used for the gconfig target based on GTK+
+hostprogs-y    += gconf
+gconf-objs     := gconf.o zconf.tab.o
+
+HOSTLDLIBS_gconf = $(shell . $(obj)/.gconf-cfg && echo $$libs)
+HOSTCFLAGS_gconf.o  = $(shell . $(obj)/.gconf-cfg && echo $$cflags)
+
+$(obj)/gconf.o: $(obj)/.gconf-cfg
+
+$(obj)/zconf.tab.o: $(obj)/zconf.lex.c
+
+# check if necessary packages are available, and configure build flags
+define filechk_conf_cfg
+       $(CONFIG_SHELL) $<
+endef
+
+$(obj)/.%conf-cfg: $(src)/%conf-cfg.sh FORCE
+       $(call filechk,conf_cfg)
+
+clean-files += .*conf-cfg
diff --git a/scripts/kconfig/POTFILES.in b/scripts/kconfig/POTFILES.in
deleted file mode 100644 (file)
index 9674573..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-scripts/kconfig/lxdialog/checklist.c
-scripts/kconfig/lxdialog/inputbox.c
-scripts/kconfig/lxdialog/menubox.c
-scripts/kconfig/lxdialog/textbox.c
-scripts/kconfig/lxdialog/util.c
-scripts/kconfig/lxdialog/yesno.c
-scripts/kconfig/mconf.c
-scripts/kconfig/conf.c
-scripts/kconfig/confdata.c
-scripts/kconfig/gconf.c
-scripts/kconfig/gconf.glade.h
-scripts/kconfig/qconf.cc
diff --git a/scripts/kconfig/check.sh b/scripts/kconfig/check.sh
deleted file mode 100755 (executable)
index 97f0fee..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-# SPDX-License-Identifier: GPL-2.0
-# Needed for systems without gettext
-$* -x c -o /dev/null - > /dev/null 2>&1 << EOF
-#include <libintl.h>
-int main()
-{
-       gettext("");
-       return 0;
-}
-EOF
-if [ ! "$?" -eq "0"  ]; then
-       echo -DKBUILD_NO_NLS;
-fi
index 283eeedaa4fa57c56568de51eac4bdb0bd52b227..c54ff0453c34978513c41c9c0e1b9b045bf5d23a 100644 (file)
@@ -3,7 +3,6 @@
  * Released under the terms of the GNU GPL v2.0.
  */
 
-#include <locale.h>
 #include <ctype.h>
 #include <limits.h>
 #include <stdio.h>
@@ -86,7 +85,7 @@ static int conf_askvalue(struct symbol *sym, const char *def)
        enum symbol_type type = sym_get_type(sym);
 
        if (!sym_has_value(sym))
-               printf(_("(NEW) "));
+               printf("(NEW) ");
 
        line[0] = '\n';
        line[1] = 0;
@@ -133,7 +132,7 @@ static int conf_string(struct menu *menu)
        const char *def;
 
        while (1) {
-               printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
+               printf("%*s%s ", indent - 1, "", menu->prompt->text);
                printf("(%s) ", sym->name);
                def = sym_get_string_value(sym);
                if (sym_get_string_value(sym))
@@ -166,7 +165,7 @@ static int conf_sym(struct menu *menu)
        tristate oldval, newval;
 
        while (1) {
-               printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
+               printf("%*s%s ", indent - 1, "", menu->prompt->text);
                if (sym->name)
                        printf("(%s) ", sym->name);
                putchar('[');
@@ -251,7 +250,7 @@ static int conf_choice(struct menu *menu)
                case no:
                        return 1;
                case mod:
-                       printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu)));
+                       printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
                        return 0;
                case yes:
                        break;
@@ -261,7 +260,7 @@ static int conf_choice(struct menu *menu)
        while (1) {
                int cnt, def;
 
-               printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu)));
+               printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
                def_sym = sym_get_choice_value(sym);
                cnt = def = 0;
                line[0] = 0;
@@ -269,7 +268,7 @@ static int conf_choice(struct menu *menu)
                        if (!menu_is_visible(child))
                                continue;
                        if (!child->sym) {
-                               printf("%*c %s\n", indent, '*', _(menu_get_prompt(child)));
+                               printf("%*c %s\n", indent, '*', menu_get_prompt(child));
                                continue;
                        }
                        cnt++;
@@ -278,14 +277,14 @@ static int conf_choice(struct menu *menu)
                                printf("%*c", indent, '>');
                        } else
                                printf("%*c", indent, ' ');
-                       printf(" %d. %s", cnt, _(menu_get_prompt(child)));
+                       printf(" %d. %s", cnt, menu_get_prompt(child));
                        if (child->sym->name)
                                printf(" (%s)", child->sym->name);
                        if (!sym_has_value(child->sym))
-                               printf(_(" (NEW)"));
+                               printf(" (NEW)");
                        printf("\n");
                }
-               printf(_("%*schoice"), indent - 1, "");
+               printf("%*schoice", indent - 1, "");
                if (cnt == 1) {
                        printf("[1]: 1\n");
                        goto conf_childs;
@@ -372,7 +371,7 @@ static void conf(struct menu *menu)
                        if (prompt)
                                printf("%*c\n%*c %s\n%*c\n",
                                        indent, '*',
-                                       indent, '*', _(prompt),
+                                       indent, '*', prompt,
                                        indent, '*');
                default:
                        ;
@@ -437,7 +436,7 @@ static void check_conf(struct menu *menu)
                                }
                        } else {
                                if (!conf_cnt++)
-                                       printf(_("*\n* Restart config...\n*\n"));
+                                       printf("*\n* Restart config...\n*\n");
                                rootEntry = menu_get_parent_menu(menu);
                                conf(rootEntry);
                        }
@@ -497,10 +496,7 @@ int main(int ac, char **av)
        int opt;
        const char *name, *defconfig_file = NULL /* gcc uninit */;
        struct stat tmpstat;
-
-       setlocale(LC_ALL, "");
-       bindtextdomain(PACKAGE, LOCALEDIR);
-       textdomain(PACKAGE);
+       int no_conf_write = 0;
 
        tty_stdio = isatty(0) && isatty(1);
 
@@ -512,6 +508,11 @@ int main(int ac, char **av)
                input_mode = (enum input_mode)opt;
                switch (opt) {
                case syncconfig:
+                       /*
+                        * syncconfig is invoked during the build stage.
+                        * Suppress distracting "configuration written to ..."
+                        */
+                       conf_set_message_callback(NULL);
                        sync_kconfig = 1;
                        break;
                case defconfig:
@@ -559,7 +560,7 @@ int main(int ac, char **av)
                }
        }
        if (ac == optind) {
-               fprintf(stderr, _("%s: Kconfig file missing\n"), av[0]);
+               fprintf(stderr, "%s: Kconfig file missing\n", av[0]);
                conf_usage(progname);
                exit(1);
        }
@@ -569,12 +570,12 @@ int main(int ac, char **av)
        if (sync_kconfig) {
                name = conf_get_configname();
                if (stat(name, &tmpstat)) {
-                       fprintf(stderr, _("***\n"
+                       fprintf(stderr, "***\n"
                                "*** Configuration file \"%s\" not found!\n"
                                "***\n"
                                "*** Please run some configurator (e.g. \"make oldconfig\" or\n"
                                "*** \"make menuconfig\" or \"make xconfig\").\n"
-                               "***\n"), name);
+                               "***\n", name);
                        exit(1);
                }
        }
@@ -585,9 +586,9 @@ int main(int ac, char **av)
                        defconfig_file = conf_get_default_confname();
                if (conf_read(defconfig_file)) {
                        fprintf(stderr,
-                               _("***\n"
+                               "***\n"
                                  "*** Can't find default configuration \"%s\"!\n"
-                                 "***\n"),
+                                 "***\n",
                                defconfig_file);
                        exit(1);
                }
@@ -611,7 +612,7 @@ int main(int ac, char **av)
                if ((strcmp(name, "") != 0) && (strcmp(name, "1") != 0)) {
                        if (conf_read_simple(name, S_DEF_USER)) {
                                fprintf(stderr,
-                                       _("*** Can't read seed configuration \"%s\"!\n"),
+                                       "*** Can't read seed configuration \"%s\"!\n",
                                        name);
                                exit(1);
                        }
@@ -628,7 +629,7 @@ int main(int ac, char **av)
                if (conf_read_simple(name, S_DEF_USER) &&
                    conf_read_simple("all.config", S_DEF_USER)) {
                        fprintf(stderr,
-                               _("*** KCONFIG_ALLCONFIG set, but no \"%s\" or \"all.config\" file found\n"),
+                               "*** KCONFIG_ALLCONFIG set, but no \"%s\" or \"all.config\" file found\n",
                                name);
                        exit(1);
                }
@@ -638,13 +639,14 @@ int main(int ac, char **av)
        }
 
        if (sync_kconfig) {
-               if (conf_get_changed()) {
-                       name = getenv("KCONFIG_NOSILENTUPDATE");
-                       if (name && *name) {
+               name = getenv("KCONFIG_NOSILENTUPDATE");
+               if (name && *name) {
+                       if (conf_get_changed()) {
                                fprintf(stderr,
-                                       _("\n*** The configuration requires explicit update.\n\n"));
+                                       "\n*** The configuration requires explicit update.\n\n");
                                return 1;
                        }
+                       no_conf_write = 1;
                }
        }
 
@@ -693,23 +695,23 @@ int main(int ac, char **av)
                /* syncconfig is used during the build so we shall update autoconf.
                 * All other commands are only used to generate a config.
                 */
-               if (conf_get_changed() && conf_write(NULL)) {
-                       fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n"));
+               if (!no_conf_write && conf_write(NULL)) {
+                       fprintf(stderr, "\n*** Error during writing of the configuration.\n\n");
                        exit(1);
                }
                if (conf_write_autoconf()) {
-                       fprintf(stderr, _("\n*** Error during update of the configuration.\n\n"));
+                       fprintf(stderr, "\n*** Error during update of the configuration.\n\n");
                        return 1;
                }
        } else if (input_mode == savedefconfig) {
                if (conf_write_defconfig(defconfig_file)) {
-                       fprintf(stderr, _("n*** Error while saving defconfig to: %s\n\n"),
+                       fprintf(stderr, "n*** Error while saving defconfig to: %s\n\n",
                                defconfig_file);
                        return 1;
                }
        } else if (input_mode != listnewconfig) {
                if (conf_write(NULL)) {
-                       fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n"));
+                       fprintf(stderr, "\n*** Error during writing of the configuration.\n\n");
                        exit(1);
                }
        }
index a04bb26304fc71675bd6e77f2765705daa55ea29..d587b10d7f8ebed37a84801a3f1d9ae49230249d 100644 (file)
 
 #include "lkc.h"
 
+/* return true if 'path' exists, false otherwise */
+static bool is_present(const char *path)
+{
+       struct stat st;
+
+       return !stat(path, &st);
+}
+
+/* return true if 'path' exists and it is a directory, false otherwise */
+static bool is_dir(const char *path)
+{
+       struct stat st;
+
+       if (stat(path, &st))
+               return 0;
+
+       return S_ISDIR(st.st_mode);
+}
+
+/*
+ * Create the parent directory of the given path.
+ *
+ * For example, if 'include/config/auto.conf' is given, create 'include/config'.
+ */
+static int make_parent_dir(const char *path)
+{
+       char tmp[PATH_MAX + 1];
+       char *p;
+
+       strncpy(tmp, path, sizeof(tmp));
+       tmp[sizeof(tmp) - 1] = 0;
+
+       /* Remove the base name. Just return if nothing is left */
+       p = strrchr(tmp, '/');
+       if (!p)
+               return 0;
+       *(p + 1) = 0;
+
+       /* Just in case it is an absolute path */
+       p = tmp;
+       while (*p == '/')
+               p++;
+
+       while ((p = strchr(p, '/'))) {
+               *p = 0;
+
+               /* skip if the directory exists */
+               if (!is_dir(tmp) && mkdir(tmp, 0755))
+                       return -1;
+
+               *p = '/';
+               while (*p == '/')
+                       p++;
+       }
+
+       return 0;
+}
+
 struct conf_printer {
        void (*print_symbol)(FILE *, struct symbol *, const char *, void *);
        void (*print_comment)(FILE *, const char *, void *);
@@ -30,7 +88,7 @@ static void conf_message(const char *fmt, ...)
 static const char *conf_filename;
 static int conf_lineno, conf_warnings;
 
-const char conf_defname[] = "arch/$ARCH/defconfig";
+const char conf_defname[] = "arch/$(ARCH)/defconfig";
 
 static void conf_warning(const char *fmt, ...)
 {
@@ -43,16 +101,16 @@ static void conf_warning(const char *fmt, ...)
        conf_warnings++;
 }
 
-static void conf_default_message_callback(const char *fmt, va_list ap)
+static void conf_default_message_callback(const char *s)
 {
        printf("#\n# ");
-       vprintf(fmt, ap);
+       printf("%s", s);
        printf("\n#\n");
 }
 
-static void (*conf_message_callback) (const char *fmt, va_list ap) =
+static void (*conf_message_callback)(const char *s) =
        conf_default_message_callback;
-void conf_set_message_callback(void (*fn) (const char *fmt, va_list ap))
+void conf_set_message_callback(void (*fn)(const char *s))
 {
        conf_message_callback = fn;
 }
@@ -60,10 +118,15 @@ void conf_set_message_callback(void (*fn) (const char *fmt, va_list ap))
 static void conf_message(const char *fmt, ...)
 {
        va_list ap;
+       char buf[4096];
+
+       if (!conf_message_callback)
+               return;
 
        va_start(ap, fmt);
-       if (conf_message_callback)
-               conf_message_callback(fmt, ap);
+
+       vsnprintf(buf, sizeof(buf), fmt, ap);
+       conf_message_callback(buf);
        va_end(ap);
 }
 
@@ -81,43 +144,16 @@ const char *conf_get_autoconfig_name(void)
        return name ? name : "include/config/auto.conf";
 }
 
-static char *conf_expand_value(const char *in)
-{
-       struct symbol *sym;
-       const char *src;
-       static char res_value[SYMBOL_MAXLENGTH];
-       char *dst, name[SYMBOL_MAXLENGTH];
-
-       res_value[0] = 0;
-       dst = name;
-       while ((src = strchr(in, '$'))) {
-               strncat(res_value, in, src - in);
-               src++;
-               dst = name;
-               while (isalnum(*src) || *src == '_')
-                       *dst++ = *src++;
-               *dst = 0;
-               sym = sym_lookup(name, 0);
-               sym_calc_value(sym);
-               strcat(res_value, sym_get_string_value(sym));
-               in = src;
-       }
-       strcat(res_value, in);
-
-       return res_value;
-}
-
 char *conf_get_default_confname(void)
 {
-       struct stat buf;
        static char fullname[PATH_MAX+1];
        char *env, *name;
 
-       name = conf_expand_value(conf_defname);
+       name = expand_string(conf_defname);
        env = getenv(SRCTREE);
        if (env) {
                sprintf(fullname, "%s/%s", env, name);
-               if (!stat(fullname, &buf))
+               if (is_present(fullname))
                        return fullname;
        }
        return name;
@@ -270,10 +306,11 @@ int conf_read_simple(const char *name, int def)
                        if (expr_calc_value(prop->visible.expr) == no ||
                            prop->expr->type != E_SYMBOL)
                                continue;
-                       name = conf_expand_value(prop->expr->left.sym->name);
+                       sym_calc_value(prop->expr->left.sym);
+                       name = sym_get_string_value(prop->expr->left.sym);
                        in = zconf_fopen(name);
                        if (in) {
-                               conf_message(_("using defaults found in %s"),
+                               conf_message("using defaults found in %s",
                                         name);
                                goto load;
                        }
@@ -418,7 +455,7 @@ int conf_read(const char *name)
 
        for_all_symbols(i, sym) {
                sym_calc_value(sym);
-               if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO))
+               if (sym_is_choice(sym) || (sym->flags & SYMBOL_NO_WRITE))
                        continue;
                if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) {
                        /* check that calculated value agrees with saved value */
@@ -748,10 +785,9 @@ int conf_write(const char *name)
 
        dirname[0] = 0;
        if (name && name[0]) {
-               struct stat st;
                char *slash;
 
-               if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
+               if (is_dir(name)) {
                        strcpy(dirname, name);
                        strcat(dirname, "/");
                        basename = conf_get_configname();
@@ -829,33 +865,66 @@ next:
                        return 1;
        }
 
-       conf_message(_("configuration written to %s"), newname);
+       conf_message("configuration written to %s", newname);
 
        sym_set_change_count(0);
 
        return 0;
 }
 
+/* write a dependency file as used by kbuild to track dependencies */
+static int conf_write_dep(const char *name)
+{
+       struct file *file;
+       FILE *out;
+
+       if (!name)
+               name = ".kconfig.d";
+       out = fopen("..config.tmp", "w");
+       if (!out)
+               return 1;
+       fprintf(out, "deps_config := \\\n");
+       for (file = file_list; file; file = file->next) {
+               if (file->next)
+                       fprintf(out, "\t%s \\\n", file->name);
+               else
+                       fprintf(out, "\t%s\n", file->name);
+       }
+       fprintf(out, "\n%s: \\\n"
+                    "\t$(deps_config)\n\n", conf_get_autoconfig_name());
+
+       env_write_dep(out, conf_get_autoconfig_name());
+
+       fprintf(out, "\n$(deps_config): ;\n");
+       fclose(out);
+
+       if (make_parent_dir(name))
+               return 1;
+       rename("..config.tmp", name);
+       return 0;
+}
+
 static int conf_split_config(void)
 {
        const char *name;
        char path[PATH_MAX+1];
        char *s, *d, c;
        struct symbol *sym;
-       struct stat sb;
        int res, i, fd;
 
        name = conf_get_autoconfig_name();
        conf_read_simple(name, S_DEF_AUTO);
        sym_calc_value(modules_sym);
 
+       if (make_parent_dir("include/config/foo.h"))
+               return 1;
        if (chdir("include/config"))
                return 1;
 
        res = 0;
        for_all_symbols(i, sym) {
                sym_calc_value(sym);
-               if ((sym->flags & SYMBOL_AUTO) || !sym->name)
+               if ((sym->flags & SYMBOL_NO_WRITE) || !sym->name)
                        continue;
                if (sym->flags & SYMBOL_WRITE) {
                        if (sym->flags & SYMBOL_DEF_AUTO) {
@@ -920,19 +989,12 @@ static int conf_split_config(void)
                                res = 1;
                                break;
                        }
-                       /*
-                        * Create directory components,
-                        * unless they exist already.
-                        */
-                       d = path;
-                       while ((d = strchr(d, '/'))) {
-                               *d = 0;
-                               if (stat(path, &sb) && mkdir(path, 0755)) {
-                                       res = 1;
-                                       goto out;
-                               }
-                               *d++ = '/';
+
+                       if (make_parent_dir(path)) {
+                               res = 1;
+                               goto out;
                        }
+
                        /* Try it again. */
                        fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
                        if (fd == -1) {
@@ -958,7 +1020,7 @@ int conf_write_autoconf(void)
 
        sym_clear_all_valid();
 
-       file_write_dep("include/config/auto.conf.cmd");
+       conf_write_dep("include/config/auto.conf.cmd");
 
        if (conf_split_config())
                return 1;
@@ -1005,14 +1067,22 @@ int conf_write_autoconf(void)
        name = getenv("KCONFIG_AUTOHEADER");
        if (!name)
                name = "include/generated/autoconf.h";
+       if (make_parent_dir(name))
+               return 1;
        if (rename(".tmpconfig.h", name))
                return 1;
+
        name = getenv("KCONFIG_TRISTATE");
        if (!name)
                name = "include/config/tristate.conf";
+       if (make_parent_dir(name))
+               return 1;
        if (rename(".tmpconfig_tristate", name))
                return 1;
+
        name = conf_get_autoconfig_name();
+       if (make_parent_dir(name))
+               return 1;
        /*
         * This must be the last step, kbuild has a dependency on auto.conf
         * and this marks the successful completion of the previous steps.
index 94a383b21df6405f4a9f6b6c08758d6c822381d8..7c329e179007a1e7cf92f012eee74f9ccb2f85d1 100644 (file)
@@ -141,7 +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_AUTO       0x1000  /* value from environment variable */
+#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 */
 
@@ -171,6 +171,9 @@ struct symbol {
  * config BAZ
  *         int "BAZ Value"
  *         range 1..255
+ *
+ * Please, also check zconf.y:print_symbol() when modifying the
+ * list of property types!
  */
 enum prop_type {
        P_UNKNOWN,
@@ -182,7 +185,6 @@ enum prop_type {
        P_SELECT,   /* select BAR */
        P_IMPLY,    /* imply BAR */
        P_RANGE,    /* range 7..100 (for a symbol) */
-       P_ENV,      /* value from environment variable */
        P_SYMBOL,   /* where a symbol is defined */
 };
 
diff --git a/scripts/kconfig/gconf-cfg.sh b/scripts/kconfig/gconf-cfg.sh
new file mode 100755 (executable)
index 0000000..480ecd8
--- /dev/null
@@ -0,0 +1,30 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+
+PKG="gtk+-2.0 gmodule-2.0 libglade-2.0"
+
+if [ -z "$(command -v pkg-config)" ]; then
+       echo >&2 "*"
+       echo >&2 "* 'make gconfig' requires 'pkg-config'. Please install it."
+       echo >&2 "*"
+       exit 1
+fi
+
+if ! pkg-config --exists $PKG; then
+       echo >&2 "*"
+       echo >&2 "* Unable to find the GTK+ installation. Please make sure that"
+       echo >&2 "* the GTK+ 2.0 development package is correctly installed."
+       echo >&2 "* You need $PKG"
+       echo >&2 "*"
+       exit 1
+fi
+
+if ! pkg-config --atleast-version=2.0.0 gtk+-2.0; then
+       echo >&2 "*"
+       echo >&2 "* GTK+ is present but version >= 2.0.0 is required."
+       echo >&2 "*"
+       exit 1
+fi
+
+echo cflags=\"$(pkg-config --cflags $PKG)\"
+echo libs=\"$(pkg-config --libs $PKG)\"
index cfddddb9c9d722b63c522450a5b277a4fd22d318..a9e48cc7b50a3630e1230d487e513831d65b873f 100644 (file)
@@ -101,8 +101,8 @@ const char *dbg_sym_flags(int val)
                strcat(buf, "write/");
        if (val & SYMBOL_CHANGED)
                strcat(buf, "changed/");
-       if (val & SYMBOL_AUTO)
-               strcat(buf, "auto/");
+       if (val & SYMBOL_NO_WRITE)
+               strcat(buf, "no_write/");
 
        buf[strlen(buf) - 1] = '\0';
 
@@ -137,7 +137,7 @@ void init_main_window(const gchar * glade_file)
 
        xml = glade_xml_new(glade_file, "window1", NULL);
        if (!xml)
-               g_error(_("GUI loading failed !\n"));
+               g_error("GUI loading failed !\n");
        glade_xml_signal_autoconnect(xml);
 
        main_wnd = glade_xml_get_widget(xml, "window1");
@@ -233,7 +233,7 @@ void init_left_tree(void)
 
        column = gtk_tree_view_column_new();
        gtk_tree_view_append_column(view, column);
-       gtk_tree_view_column_set_title(column, _("Options"));
+       gtk_tree_view_column_set_title(column, "Options");
 
        renderer = gtk_cell_renderer_toggle_new();
        gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),
@@ -276,7 +276,7 @@ void init_right_tree(void)
 
        column = gtk_tree_view_column_new();
        gtk_tree_view_append_column(view, column);
-       gtk_tree_view_column_set_title(column, _("Options"));
+       gtk_tree_view_column_set_title(column, "Options");
 
        renderer = gtk_cell_renderer_pixbuf_new();
        gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),
@@ -305,7 +305,7 @@ void init_right_tree(void)
 
        renderer = gtk_cell_renderer_text_new();
        gtk_tree_view_insert_column_with_attributes(view, -1,
-                                                   _("Name"), renderer,
+                                                   "Name", renderer,
                                                    "text", COL_NAME,
                                                    "foreground-gdk",
                                                    COL_COLOR, NULL);
@@ -329,7 +329,7 @@ void init_right_tree(void)
                                                    COL_COLOR, NULL);
        renderer = gtk_cell_renderer_text_new();
        gtk_tree_view_insert_column_with_attributes(view, -1,
-                                                   _("Value"), renderer,
+                                                   "Value", renderer,
                                                    "text", COL_VALUE,
                                                    "editable",
                                                    COL_EDIT,
@@ -368,7 +368,7 @@ static void text_insert_help(struct menu *menu)
 {
        GtkTextBuffer *buffer;
        GtkTextIter start, end;
-       const char *prompt = _(menu_get_prompt(menu));
+       const char *prompt = menu_get_prompt(menu);
        struct gstr help = str_new();
 
        menu_get_ext_help(menu, &help);
@@ -422,7 +422,7 @@ gboolean on_window1_delete_event(GtkWidget * widget, GdkEvent * event,
        if (!conf_get_changed())
                return FALSE;
 
-       dialog = gtk_dialog_new_with_buttons(_("Warning !"),
+       dialog = gtk_dialog_new_with_buttons("Warning !",
                                             GTK_WINDOW(main_wnd),
                                             (GtkDialogFlags)
                                             (GTK_DIALOG_MODAL |
@@ -436,7 +436,7 @@ gboolean on_window1_delete_event(GtkWidget * widget, GdkEvent * event,
        gtk_dialog_set_default_response(GTK_DIALOG(dialog),
                                        GTK_RESPONSE_CANCEL);
 
-       label = gtk_label_new(_("\nSave configuration ?\n"));
+       label = gtk_label_new("\nSave configuration ?\n");
        gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label);
        gtk_widget_show(label);
 
@@ -496,7 +496,7 @@ load_filename(GtkFileSelection * file_selector, gpointer user_data)
                                             (user_data));
 
        if (conf_read(fn))
-               text_insert_msg(_("Error"), _("Unable to load configuration !"));
+               text_insert_msg("Error", "Unable to load configuration !");
        else
                display_tree(&rootmenu);
 }
@@ -505,7 +505,7 @@ void on_load1_activate(GtkMenuItem * menuitem, gpointer user_data)
 {
        GtkWidget *fs;
 
-       fs = gtk_file_selection_new(_("Load file..."));
+       fs = gtk_file_selection_new("Load file...");
        g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button),
                         "clicked",
                         G_CALLBACK(load_filename), (gpointer) fs);
@@ -524,7 +524,7 @@ void on_load1_activate(GtkMenuItem * menuitem, gpointer user_data)
 void on_save_activate(GtkMenuItem * menuitem, gpointer user_data)
 {
        if (conf_write(NULL))
-               text_insert_msg(_("Error"), _("Unable to save configuration !"));
+               text_insert_msg("Error", "Unable to save configuration !");
 }
 
 
@@ -537,7 +537,7 @@ store_filename(GtkFileSelection * file_selector, gpointer user_data)
                                             (user_data));
 
        if (conf_write(fn))
-               text_insert_msg(_("Error"), _("Unable to save configuration !"));
+               text_insert_msg("Error", "Unable to save configuration !");
 
        gtk_widget_destroy(GTK_WIDGET(user_data));
 }
@@ -546,7 +546,7 @@ void on_save_as1_activate(GtkMenuItem * menuitem, gpointer user_data)
 {
        GtkWidget *fs;
 
-       fs = gtk_file_selection_new(_("Save file as..."));
+       fs = gtk_file_selection_new("Save file as...");
        g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button),
                         "clicked",
                         G_CALLBACK(store_filename), (gpointer) fs);
@@ -639,7 +639,7 @@ on_set_option_mode3_activate(GtkMenuItem *menuitem, gpointer user_data)
 void on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data)
 {
        GtkWidget *dialog;
-       const gchar *intro_text = _(
+       const gchar *intro_text = 
            "Welcome to gkc, the GTK+ graphical configuration tool\n"
            "For each option, a blank box indicates the feature is disabled, a\n"
            "check indicates it is enabled, and a dot indicates that it is to\n"
@@ -654,7 +654,7 @@ void on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data)
            "option.\n"
            "\n"
            "Toggling Show Debug Info under the Options menu will show \n"
-           "the dependencies, which you can then match by examining other options.");
+           "the dependencies, which you can then match by examining other options.";
 
        dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd),
                                        GTK_DIALOG_DESTROY_WITH_PARENT,
@@ -671,8 +671,8 @@ void on_about1_activate(GtkMenuItem * menuitem, gpointer user_data)
 {
        GtkWidget *dialog;
        const gchar *about_text =
-           _("gkc is copyright (c) 2002 Romain Lievin <roms@lpg.ticalc.org>.\n"
-             "Based on the source code from Roman Zippel.\n");
+           "gkc is copyright (c) 2002 Romain Lievin <roms@lpg.ticalc.org>.\n"
+             "Based on the source code from Roman Zippel.\n";
 
        dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd),
                                        GTK_DIALOG_DESTROY_WITH_PARENT,
@@ -689,9 +689,9 @@ void on_license1_activate(GtkMenuItem * menuitem, gpointer user_data)
 {
        GtkWidget *dialog;
        const gchar *license_text =
-           _("gkc is released under the terms of the GNU GPL v2.\n"
+           "gkc is released under the terms of the GNU GPL v2.\n"
              "For more information, please see the source code or\n"
-             "visit http://www.fsf.org/licenses/licenses.html\n");
+             "visit http://www.fsf.org/licenses/licenses.html\n";
 
        dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd),
                                        GTK_DIALOG_DESTROY_WITH_PARENT,
@@ -1049,7 +1049,7 @@ static gchar **fill_row(struct menu *menu)
        bzero(row, sizeof(row));
 
        row[COL_OPTION] =
-           g_strdup_printf("%s %s", _(menu_get_prompt(menu)),
+           g_strdup_printf("%s %s", menu_get_prompt(menu),
                            sym && !sym_has_value(sym) ? "(NEW)" : "");
 
        if (opt_mode == OPT_ALL && !menu_is_visible(menu))
@@ -1102,7 +1102,7 @@ static gchar **fill_row(struct menu *menu)
 
                if (def_menu)
                        row[COL_VALUE] =
-                           g_strdup(_(menu_get_prompt(def_menu)));
+                           g_strdup(menu_get_prompt(def_menu));
        }
        if (sym->flags & SYMBOL_CHOICEVAL)
                row[COL_BTNRAD] = GINT_TO_POINTER(TRUE);
@@ -1447,10 +1447,6 @@ int main(int ac, char *av[])
        char *env;
        gchar *glade_file;
 
-       bindtextdomain(PACKAGE, LOCALEDIR);
-       bind_textdomain_codeset(PACKAGE, "UTF-8");
-       textdomain(PACKAGE);
-
        /* GTK stuffs */
        gtk_set_locale();
        gtk_init(&ac, &av);
index 3ea9c5f9f730db8a6c555b5692a3086434524956..b3e0ea0ac732712813c3bcf220d1839174fac95e 100644 (file)
@@ -32,7 +32,6 @@ static struct kconf_id kconf_id_array[] = {
        { "on",                 T_ON,                   TF_PARAM },
        { "modules",            T_OPT_MODULES,          TF_OPTION },
        { "defconfig_list",     T_OPT_DEFCONFIG_LIST,   TF_OPTION },
-       { "env",                T_OPT_ENV,              TF_OPTION },
        { "allnoconfig_y",      T_OPT_ALLNOCONFIG_Y,    TF_OPTION },
 };
 
diff --git a/scripts/kconfig/kxgettext.c b/scripts/kconfig/kxgettext.c
deleted file mode 100644 (file)
index 240880a..0000000
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Arnaldo Carvalho de Melo <acme@conectiva.com.br>, 2005
- *
- * Released under the terms of the GNU GPL v2.0
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "lkc.h"
-
-static char *escape(const char* text, char *bf, int len)
-{
-       char *bfp = bf;
-       int multiline = strchr(text, '\n') != NULL;
-       int eol = 0;
-       int textlen = strlen(text);
-
-       if ((textlen > 0) && (text[textlen-1] == '\n'))
-               eol = 1;
-
-       *bfp++ = '"';
-       --len;
-
-       if (multiline) {
-               *bfp++ = '"';
-               *bfp++ = '\n';
-               *bfp++ = '"';
-               len -= 3;
-       }
-
-       while (*text != '\0' && len > 1) {
-               if (*text == '"')
-                       *bfp++ = '\\';
-               else if (*text == '\n') {
-                       *bfp++ = '\\';
-                       *bfp++ = 'n';
-                       *bfp++ = '"';
-                       *bfp++ = '\n';
-                       *bfp++ = '"';
-                       len -= 5;
-                       ++text;
-                       goto next;
-               }
-               else if (*text == '\\') {
-                       *bfp++ = '\\';
-                       len--;
-               }
-               *bfp++ = *text++;
-next:
-               --len;
-       }
-
-       if (multiline && eol)
-               bfp -= 3;
-
-       *bfp++ = '"';
-       *bfp = '\0';
-
-       return bf;
-}
-
-struct file_line {
-       struct file_line *next;
-       const char *file;
-       int lineno;
-};
-
-static struct file_line *file_line__new(const char *file, int lineno)
-{
-       struct file_line *self = malloc(sizeof(*self));
-
-       if (self == NULL)
-               goto out;
-
-       self->file   = file;
-       self->lineno = lineno;
-       self->next   = NULL;
-out:
-       return self;
-}
-
-struct message {
-       const char       *msg;
-       const char       *option;
-       struct message   *next;
-       struct file_line *files;
-};
-
-static struct message *message__list;
-
-static struct message *message__new(const char *msg, char *option,
-                                   const char *file, int lineno)
-{
-       struct message *self = malloc(sizeof(*self));
-
-       if (self == NULL)
-               goto out;
-
-       self->files = file_line__new(file, lineno);
-       if (self->files == NULL)
-               goto out_fail;
-
-       self->msg = xstrdup(msg);
-       if (self->msg == NULL)
-               goto out_fail_msg;
-
-       self->option = option;
-       self->next = NULL;
-out:
-       return self;
-out_fail_msg:
-       free(self->files);
-out_fail:
-       free(self);
-       self = NULL;
-       goto out;
-}
-
-static struct message *mesage__find(const char *msg)
-{
-       struct message *m = message__list;
-
-       while (m != NULL) {
-               if (strcmp(m->msg, msg) == 0)
-                       break;
-               m = m->next;
-       }
-
-       return m;
-}
-
-static int message__add_file_line(struct message *self, const char *file,
-                                 int lineno)
-{
-       int rc = -1;
-       struct file_line *fl = file_line__new(file, lineno);
-
-       if (fl == NULL)
-               goto out;
-
-       fl->next    = self->files;
-       self->files = fl;
-       rc = 0;
-out:
-       return rc;
-}
-
-static int message__add(const char *msg, char *option, const char *file,
-                       int lineno)
-{
-       int rc = 0;
-       char bf[16384];
-       char *escaped = escape(msg, bf, sizeof(bf));
-       struct message *m = mesage__find(escaped);
-
-       if (m != NULL)
-               rc = message__add_file_line(m, file, lineno);
-       else {
-               m = message__new(escaped, option, file, lineno);
-
-               if (m != NULL) {
-                       m->next       = message__list;
-                       message__list = m;
-               } else
-                       rc = -1;
-       }
-       return rc;
-}
-
-static void menu_build_message_list(struct menu *menu)
-{
-       struct menu *child;
-
-       message__add(menu_get_prompt(menu), NULL,
-                    menu->file == NULL ? "Root Menu" : menu->file->name,
-                    menu->lineno);
-
-       if (menu->sym != NULL && menu_has_help(menu))
-               message__add(menu_get_help(menu), menu->sym->name,
-                            menu->file == NULL ? "Root Menu" : menu->file->name,
-                            menu->lineno);
-
-       for (child = menu->list; child != NULL; child = child->next)
-               if (child->prompt != NULL)
-                       menu_build_message_list(child);
-}
-
-static void message__print_file_lineno(struct message *self)
-{
-       struct file_line *fl = self->files;
-
-       putchar('\n');
-       if (self->option != NULL)
-               printf("# %s:00000\n", self->option);
-
-       printf("#: %s:%d", fl->file, fl->lineno);
-       fl = fl->next;
-
-       while (fl != NULL) {
-               printf(", %s:%d", fl->file, fl->lineno);
-               fl = fl->next;
-       }
-
-       putchar('\n');
-}
-
-static void message__print_gettext_msgid_msgstr(struct message *self)
-{
-       message__print_file_lineno(self);
-
-       printf("msgid %s\n"
-              "msgstr \"\"\n", self->msg);
-}
-
-static void menu__xgettext(void)
-{
-       struct message *m = message__list;
-
-       while (m != NULL) {
-               /* skip empty lines ("") */
-               if (strlen(m->msg) > sizeof("\"\""))
-                       message__print_gettext_msgid_msgstr(m);
-               m = m->next;
-       }
-}
-
-int main(int ac, char **av)
-{
-       conf_parse(av[1]);
-
-       menu_build_message_list(menu_get_root_menu(NULL));
-       menu__xgettext();
-       return 0;
-}
index f4394af6e4b81c8d0c0f18acf6eb97852e79cc72..9eb7c837cd8fd686bbafa000d067db3c8e4b444f 100644 (file)
@@ -8,15 +8,6 @@
 
 #include "expr.h"
 
-#ifndef KBUILD_NO_NLS
-# include <libintl.h>
-#else
-static inline const char *gettext(const char *txt) { return txt; }
-static inline void textdomain(const char *domainname) {}
-static inline void bindtextdomain(const char *name, const char *dir) {}
-static inline char *bind_textdomain_codeset(const char *dn, char *c) { return c; }
-#endif
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -29,11 +20,6 @@ extern "C" {
 #define PACKAGE "linux"
 #endif
 
-#define LOCALEDIR "/usr/share/locale"
-
-#define _(text) gettext(text)
-#define N_(text) (text)
-
 #ifndef CONFIG_
 #define CONFIG_ "CONFIG_"
 #endif
@@ -58,7 +44,6 @@ enum conf_def_mode {
 
 #define T_OPT_MODULES          1
 #define T_OPT_DEFCONFIG_LIST   2
-#define T_OPT_ENV              3
 #define T_OPT_ALLNOCONFIG_Y    4
 
 struct kconf_id {
@@ -112,11 +97,11 @@ void menu_set_type(int type);
 
 /* util.c */
 struct file *file_lookup(const char *name);
-int file_write_dep(const char *name);
 void *xmalloc(size_t size);
 void *xcalloc(size_t nmemb, size_t size);
 void *xrealloc(void *p, size_t size);
 char *xstrdup(const char *s);
+char *xstrndup(const char *s, size_t n);
 
 struct gstr {
        size_t len;
@@ -134,16 +119,12 @@ void str_printf(struct gstr *gs, const char *fmt, ...);
 const char *str_get(struct gstr *gs);
 
 /* symbol.c */
-extern struct expr *sym_env_list;
-
-void sym_init(void);
 void sym_clear_all_valid(void);
 struct symbol *sym_choice_default(struct symbol *sym);
 const char *sym_get_string_default(struct symbol *sym);
 struct symbol *sym_check_deps(struct symbol *sym);
 struct property *prop_alloc(enum prop_type type, struct symbol *sym);
 struct symbol *prop_get_symbol(struct property *prop);
-struct property *sym_get_env_prop(struct symbol *sym);
 
 static inline tristate sym_get_tristate_value(struct symbol *sym)
 {
index 9dc8abfb1dc3cf1aa6d6753940c909e1dd4ec889..cf4510a2bdc71e5f91d628d77b2d69b4cc8edb37 100644 (file)
@@ -10,7 +10,7 @@ int conf_write(const char *name);
 int conf_write_autoconf(void);
 bool conf_get_changed(void);
 void conf_set_changed_callback(void (*fn)(void));
-void conf_set_message_callback(void (*fn)(const char *fmt, va_list ap));
+void conf_set_message_callback(void (*fn)(const char *s));
 
 /* menu.c */
 extern struct menu rootmenu;
@@ -31,7 +31,6 @@ extern struct symbol * symbol_hash[SYMBOL_HASHSIZE];
 
 struct symbol * sym_lookup(const char *name, int flags);
 struct symbol * sym_find(const char *name);
-char *sym_expand_string_value(const char *in);
 const char * sym_escape_string_value(const char *in);
 struct symbol ** sym_re_search(const char *pattern);
 const char * sym_type_name(enum symbol_type type);
@@ -49,5 +48,19 @@ const char * sym_get_string_value(struct symbol *sym);
 
 const char * prop_get_type_name(enum prop_type type);
 
+/* preprocess.c */
+enum variable_flavor {
+       VAR_SIMPLE,
+       VAR_RECURSIVE,
+       VAR_APPEND,
+};
+void env_write_dep(FILE *f, const char *auto_conf_name);
+void variable_add(const char *name, const char *value,
+                 enum variable_flavor flavor);
+void variable_all_del(void);
+char *expand_string(const char *in);
+char *expand_dollar(const char **str);
+char *expand_one_token(const char **str);
+
 /* expr.c */
 void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken);
diff --git a/scripts/kconfig/lxdialog/check-lxdialog.sh b/scripts/kconfig/lxdialog/check-lxdialog.sh
deleted file mode 100755 (executable)
index 6c0bcd9..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/bin/sh
-# SPDX-License-Identifier: GPL-2.0
-# Check ncurses compatibility
-
-# What library to link
-ldflags()
-{
-       pkg-config --libs ncursesw 2>/dev/null && exit
-       pkg-config --libs ncurses 2>/dev/null && exit
-       for ext in so a dll.a dylib ; do
-               for lib in ncursesw ncurses curses ; do
-                       $cc -print-file-name=lib${lib}.${ext} | grep -q /
-                       if [ $? -eq 0 ]; then
-                               echo "-l${lib}"
-                               exit
-                       fi
-               done
-       done
-       exit 1
-}
-
-# Where is ncurses.h?
-ccflags()
-{
-       if pkg-config --cflags ncursesw 2>/dev/null; then
-               echo '-DCURSES_LOC="<ncurses.h>" -DNCURSES_WIDECHAR=1'
-       elif pkg-config --cflags ncurses 2>/dev/null; then
-               echo '-DCURSES_LOC="<ncurses.h>"'
-       elif [ -f /usr/include/ncursesw/curses.h ]; then
-               echo '-I/usr/include/ncursesw -DCURSES_LOC="<curses.h>"'
-               echo ' -DNCURSES_WIDECHAR=1'
-       elif [ -f /usr/include/ncurses/ncurses.h ]; then
-               echo '-I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"'
-       elif [ -f /usr/include/ncurses/curses.h ]; then
-               echo '-I/usr/include/ncurses -DCURSES_LOC="<curses.h>"'
-       elif [ -f /usr/include/ncurses.h ]; then
-               echo '-DCURSES_LOC="<ncurses.h>"'
-       else
-               echo '-DCURSES_LOC="<curses.h>"'
-       fi
-}
-
-# Temp file, try to clean up after us
-tmp=.lxdialog.tmp
-trap "rm -f $tmp" 0 1 2 3 15
-
-# Check if we can link to ncurses
-check() {
-        $cc -x c - -o $tmp 2>/dev/null <<'EOF'
-#include CURSES_LOC
-main() {}
-EOF
-       if [ $? != 0 ]; then
-           echo " *** Unable to find the ncurses libraries or the"       1>&2
-           echo " *** required header files."                            1>&2
-           echo " *** 'make menuconfig' requires the ncurses libraries." 1>&2
-           echo " *** "                                                  1>&2
-           echo " *** Install ncurses (ncurses-devel or libncurses-dev " 1>&2
-           echo " *** depending on your distribution) and try again."    1>&2
-           echo " *** "                                                  1>&2
-           exit 1
-       fi
-}
-
-usage() {
-       printf "Usage: $0 [-check compiler options|-ccflags|-ldflags compiler options]\n"
-}
-
-if [ $# -eq 0 ]; then
-       usage
-       exit 1
-fi
-
-cc=""
-case "$1" in
-       "-check")
-               shift
-               cc="$@"
-               check
-               ;;
-       "-ccflags")
-               ccflags
-               ;;
-       "-ldflags")
-               shift
-               cc="$@"
-               ldflags
-               ;;
-       "*")
-               usage
-               exit 1
-               ;;
-esac
index fc0b12bbccbea8509f5b3d2d60ad0577adfb01c5..fd161cfff121fd15e45aebce45bbc38f311d3709 100644 (file)
@@ -90,8 +90,8 @@ static void print_buttons(WINDOW * dialog, int height, int width, int selected)
        int x = width / 2 - 11;
        int y = height - 2;
 
-       print_button(dialog, gettext("Select"), y, x, selected == 0);
-       print_button(dialog, gettext(" Help "), y, x + 14, selected == 1);
+       print_button(dialog, "Select", y, x, selected == 0);
+       print_button(dialog, " Help ", y, x + 14, selected == 1);
 
        wmove(dialog, y, x + 1 + 14 * selected);
        wrefresh(dialog);
index b1617ffbe70e0cc98d5f649ee3730ff44590d85d..68b565e3c495664881d1ae85ba9a2d7de6e157e5 100644 (file)
 #include <string.h>
 #include <stdbool.h>
 
-#ifndef KBUILD_NO_NLS
-# include <libintl.h>
-#else
-# define gettext(Msgid) ((const char *) (Msgid))
-#endif
-
 #ifdef __sun__
 #define CURS_MACROS
 #endif
-#include CURSES_LOC
+#include <ncurses.h>
 
 /*
  * Colors in ncurses 1.9.9e do not work properly since foreground and
index edeb094dbad029509a9243ee44e9b1d27c65c15c..611945611bf8352d4831a51c411c2d3d5d7afc59 100644 (file)
@@ -18,8 +18,8 @@ static void print_buttons(WINDOW * dialog, int height, int width, int selected)
        int x = width / 2 - 11;
        int y = height - 2;
 
-       print_button(dialog, gettext("  Ok  "), y, x, selected == 0);
-       print_button(dialog, gettext(" Help "), y, x + 14, selected == 1);
+       print_button(dialog, "  Ok  ", y, x, selected == 0);
+       print_button(dialog, " Help ", y, x + 14, selected == 1);
 
        wmove(dialog, y, x + 1 + 14 * selected);
        wrefresh(dialog);
index 0ef23192c2dc719f2c54738204b83a89c6267a9d..58c2f8afe59bbd93a08dc0d453bd189557787035 100644 (file)
@@ -144,11 +144,11 @@ static void print_buttons(WINDOW * win, int height, int width, int selected)
        int x = width / 2 - 28;
        int y = height - 2;
 
-       print_button(win, gettext("Select"), y, x, selected == 0);
-       print_button(win, gettext(" Exit "), y, x + 12, selected == 1);
-       print_button(win, gettext(" Help "), y, x + 24, selected == 2);
-       print_button(win, gettext(" Save "), y, x + 36, selected == 3);
-       print_button(win, gettext(" Load "), y, x + 48, selected == 4);
+       print_button(win, "Select", y, x, selected == 0);
+       print_button(win, " Exit ", y, x + 12, selected == 1);
+       print_button(win, " Help ", y, x + 24, selected == 2);
+       print_button(win, " Save ", y, x + 36, selected == 3);
+       print_button(win, " Load ", y, x + 48, selected == 4);
 
        wmove(win, y, x + 1 + 12 * selected);
        wrefresh(win);
index ab34000d9b9327b8679c961c40da72dc9f451186..4e339b12664e0f3d719be4ff41b35b1f789d3a5e 100644 (file)
@@ -116,7 +116,7 @@ do_resize:
 
        print_title(dialog, title, width);
 
-       print_button(dialog, gettext(" Exit "), height - 2, width / 2 - 4, TRUE);
+       print_button(dialog, " Exit ", height - 2, width / 2 - 4, TRUE);
        wnoutrefresh(dialog);
        getyx(dialog, cur_y, cur_x);    /* Save cursor position */
 
index 274341d0204069d81828fd4a3ba3716de4c87777..bcaac9b7bab2cafb17b82d5e447ae778c68ff618 100644 (file)
@@ -16,8 +16,8 @@ static void print_buttons(WINDOW * dialog, int height, int width, int selected)
        int x = width / 2 - 10;
        int y = height - 2;
 
-       print_button(dialog, gettext(" Yes "), y, x, selected == 0);
-       print_button(dialog, gettext("  No  "), y, x + 13, selected == 1);
+       print_button(dialog, " Yes ", y, x, selected == 0);
+       print_button(dialog, "  No  ", y, x + 13, selected == 1);
 
        wmove(dialog, y, x + 1 + 13 * selected);
        wrefresh(dialog);
diff --git a/scripts/kconfig/mconf-cfg.sh b/scripts/kconfig/mconf-cfg.sh
new file mode 100755 (executable)
index 0000000..c812872
--- /dev/null
@@ -0,0 +1,47 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+
+PKG="ncursesw"
+PKG2="ncurses"
+
+if [ -n "$(command -v pkg-config)" ]; then
+       if pkg-config --exists $PKG; then
+               echo cflags=\"$(pkg-config --cflags $PKG)\"
+               echo libs=\"$(pkg-config --libs $PKG)\"
+               exit 0
+       fi
+
+       if pkg-config --exists $PKG2; then
+               echo cflags=\"$(pkg-config --cflags $PKG2)\"
+               echo libs=\"$(pkg-config --libs $PKG2)\"
+               exit 0
+       fi
+fi
+
+# Check the default paths in case pkg-config is not installed.
+# (Even if it is installed, some distributions such as openSUSE cannot
+# find ncurses by pkg-config.)
+if [ -f /usr/include/ncursesw/ncurses.h ]; then
+       echo cflags=\"-D_GNU_SOURCE -I/usr/include/ncursesw\"
+       echo libs=\"-lncursesw\"
+       exit 0
+fi
+
+if [ -f /usr/include/ncurses/ncurses.h ]; then
+       echo cflags=\"-D_GNU_SOURCE -I/usr/include/ncurses\"
+       echo libs=\"-lncurses\"
+       exit 0
+fi
+
+if [ -f /usr/include/ncurses.h ]; then
+       echo cflags=\"-D_GNU_SOURCE\"
+       echo libs=\"-lncurses\"
+       exit 0
+fi
+
+echo >&2 "*"
+echo >&2 "* Unable to find the ncurses package."
+echo >&2 "* Install ncurses (ncurses-devel or libncurses-dev"
+echo >&2 "* depending on your distribution)."
+echo >&2 "*"
+exit 1
index c829be8bb19fb3e0b37ee72a7e632074dd3f1b11..c1b38747c1474b72df6d18b67c777b81edcea88b 100644 (file)
 #include <string.h>
 #include <signal.h>
 #include <unistd.h>
-#include <locale.h>
 
 #include "lkc.h"
 #include "lxdialog/dialog.h"
 
-static const char mconf_readme[] = N_(
+static const char mconf_readme[] =
 "Overview\n"
 "--------\n"
 "This interface lets you select features and parameters for the build.\n"
@@ -171,37 +170,37 @@ static const char mconf_readme[] = N_(
 " blackbg    => selects a color scheme with black background\n"
 " classic    => theme with blue background. The classic look\n"
 " bluetitle  => an LCD friendly version of classic. (default)\n"
-"\n"),
-menu_instructions[] = N_(
+"\n",
+menu_instructions[] =
        "Arrow keys navigate the menu.  "
        "<Enter> selects submenus ---> (or empty submenus ----).  "
        "Highlighted letters are hotkeys.  "
        "Pressing <Y> includes, <N> excludes, <M> modularizes features.  "
        "Press <Esc><Esc> to exit, <?> for Help, </> for Search.  "
-       "Legend: [*] built-in  [ ] excluded  <M> module  < > module capable"),
-radiolist_instructions[] = N_(
+       "Legend: [*] built-in  [ ] excluded  <M> module  < > module capable",
+radiolist_instructions[] =
        "Use the arrow keys to navigate this window or "
        "press the hotkey of the item you wish to select "
        "followed by the <SPACE BAR>. "
-       "Press <?> for additional information about this option."),
-inputbox_instructions_int[] = N_(
+       "Press <?> for additional information about this option.",
+inputbox_instructions_int[] =
        "Please enter a decimal value. "
        "Fractions will not be accepted.  "
-       "Use the <TAB> key to move from the input field to the buttons below it."),
-inputbox_instructions_hex[] = N_(
+       "Use the <TAB> key to move from the input field to the buttons below it.",
+inputbox_instructions_hex[] =
        "Please enter a hexadecimal value. "
-       "Use the <TAB> key to move from the input field to the buttons below it."),
-inputbox_instructions_string[] = N_(
+       "Use the <TAB> key to move from the input field to the buttons below it.",
+inputbox_instructions_string[] =
        "Please enter a string value. "
-       "Use the <TAB> key to move from the input field to the buttons below it."),
-setmod_text[] = N_(
+       "Use the <TAB> key to move from the input field to the buttons below it.",
+setmod_text[] =
        "This feature depends on another which has been configured as a module.\n"
-       "As a result, this feature will be built as a module."),
-load_config_text[] = N_(
+       "As a result, this feature will be built as a module.",
+load_config_text[] =
        "Enter the name of the configuration file you wish to load.  "
        "Accept the name shown to restore the configuration you "
-       "last retrieved.  Leave blank to abort."),
-load_config_help[] = N_(
+       "last retrieved.  Leave blank to abort.",
+load_config_help[] =
        "\n"
        "For various reasons, one may wish to keep several different\n"
        "configurations available on a single machine.\n"
@@ -211,11 +210,11 @@ load_config_help[] = N_(
        "configuration.\n"
        "\n"
        "If you are uncertain, then you have probably never used alternate\n"
-       "configuration files. You should therefore leave this blank to abort.\n"),
-save_config_text[] = N_(
+       "configuration files. You should therefore leave this blank to abort.\n",
+save_config_text[] =
        "Enter a filename to which this configuration should be saved "
-       "as an alternate.  Leave blank to abort."),
-save_config_help[] = N_(
+       "as an alternate.  Leave blank to abort.",
+save_config_help[] =
        "\n"
        "For various reasons, one may wish to keep different configurations\n"
        "available on a single machine.\n"
@@ -225,8 +224,8 @@ save_config_help[] = N_(
        "configuration options you have selected at that time.\n"
        "\n"
        "If you are uncertain what all this means then you should probably\n"
-       "leave this blank.\n"),
-search_help[] = N_(
+       "leave this blank.\n",
+search_help[] =
        "\n"
        "Search for symbols and display their relations.\n"
        "Regular expressions are allowed.\n"
@@ -271,7 +270,7 @@ search_help[] = N_(
        "Examples: USB  => find all symbols containing USB\n"
        "          ^USB => find all symbols starting with USB\n"
        "          USB$ => find all symbols ending with USB\n"
-       "\n");
+       "\n";
 
 static int indent;
 static struct menu *current_menu;
@@ -400,19 +399,19 @@ static void search_conf(void)
        struct subtitle_part stpart;
 
        title = str_new();
-       str_printf( &title, _("Enter (sub)string or regexp to search for "
-                             "(with or without \"%s\")"), CONFIG_);
+       str_printf( &title, "Enter (sub)string or regexp to search for "
+                             "(with or without \"%s\")", CONFIG_);
 
 again:
        dialog_clear();
-       dres = dialog_inputbox(_("Search Configuration Parameter"),
+       dres = dialog_inputbox("Search Configuration Parameter",
                              str_get(&title),
                              10, 75, "");
        switch (dres) {
        case 0:
                break;
        case 1:
-               show_helptext(_("Search Configuration"), search_help);
+               show_helptext("Search Configuration", search_help);
                goto again;
        default:
                str_free(&title);
@@ -443,7 +442,7 @@ again:
 
                res = get_relations_str(sym_arr, &head);
                set_subtitle();
-               dres = show_textbox_ext(_("Search Results"), (char *)
+               dres = show_textbox_ext("Search Results", (char *)
                                        str_get(&res), 0, 0, keys, &vscroll,
                                        &hscroll, &update_text, (void *)
                                        &data);
@@ -491,7 +490,6 @@ static void build_conf(struct menu *menu)
                        switch (prop->type) {
                        case P_MENU:
                                child_count++;
-                               prompt = _(prompt);
                                if (single_menu_mode) {
                                        item_make("%s%*c%s",
                                                  menu->data ? "-->" : "++>",
@@ -508,7 +506,7 @@ static void build_conf(struct menu *menu)
                        case P_COMMENT:
                                if (prompt) {
                                        child_count++;
-                                       item_make("   %*c*** %s ***", indent + 1, ' ', _(prompt));
+                                       item_make("   %*c*** %s ***", indent + 1, ' ', prompt);
                                        item_set_tag(':');
                                        item_set_data(menu);
                                }
@@ -516,7 +514,7 @@ static void build_conf(struct menu *menu)
                        default:
                                if (prompt) {
                                        child_count++;
-                                       item_make("---%*c%s", indent + 1, ' ', _(prompt));
+                                       item_make("---%*c%s", indent + 1, ' ', prompt);
                                        item_set_tag(':');
                                        item_set_data(menu);
                                }
@@ -560,10 +558,10 @@ static void build_conf(struct menu *menu)
                        item_set_data(menu);
                }
 
-               item_add_str("%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
+               item_add_str("%*c%s", indent + 1, ' ', menu_get_prompt(menu));
                if (val == yes) {
                        if (def_menu) {
-                               item_add_str(" (%s)", _(menu_get_prompt(def_menu)));
+                               item_add_str(" (%s)", menu_get_prompt(def_menu));
                                item_add_str("  --->");
                                if (def_menu->list) {
                                        indent += 2;
@@ -575,7 +573,7 @@ static void build_conf(struct menu *menu)
                }
        } else {
                if (menu == current_menu) {
-                       item_make("---%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
+                       item_make("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
                        item_set_tag(':');
                        item_set_data(menu);
                        goto conf_childs;
@@ -618,17 +616,17 @@ static void build_conf(struct menu *menu)
                                tmp = indent - tmp + 4;
                                if (tmp < 0)
                                        tmp = 0;
-                               item_add_str("%*c%s%s", tmp, ' ', _(menu_get_prompt(menu)),
+                               item_add_str("%*c%s%s", tmp, ' ', menu_get_prompt(menu),
                                             (sym_has_value(sym) || !sym_is_changable(sym)) ?
-                                            "" : _(" (NEW)"));
+                                            "" : " (NEW)");
                                item_set_tag('s');
                                item_set_data(menu);
                                goto conf_childs;
                        }
                }
-               item_add_str("%*c%s%s", indent + 1, ' ', _(menu_get_prompt(menu)),
+               item_add_str("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
                          (sym_has_value(sym) || !sym_is_changable(sym)) ?
-                         "" : _(" (NEW)"));
+                         "" : " (NEW)");
                if (menu->prompt->type == P_MENU) {
                        item_add_str("  %s", menu_is_empty(menu) ? "----" : "--->");
                        return;
@@ -665,8 +663,8 @@ static void conf(struct menu *menu, struct menu *active_menu)
                        break;
                set_subtitle();
                dialog_clear();
-               res = dialog_menu(prompt ? _(prompt) : _("Main Menu"),
-                                 _(menu_instructions),
+               res = dialog_menu(prompt ? prompt : "Main Menu",
+                                 menu_instructions,
                                  active_menu, &s_scroll);
                if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
                        break;
@@ -708,7 +706,7 @@ static void conf(struct menu *menu, struct menu *active_menu)
                                show_help(submenu);
                        else {
                                reset_subtitle();
-                               show_helptext(_("README"), _(mconf_readme));
+                               show_helptext("README", mconf_readme);
                        }
                        break;
                case 3:
@@ -773,16 +771,13 @@ static void show_helptext(const char *title, const char *text)
        show_textbox(title, text, 0, 0);
 }
 
-static void conf_message_callback(const char *fmt, va_list ap)
+static void conf_message_callback(const char *s)
 {
-       char buf[PATH_MAX+1];
-
-       vsnprintf(buf, sizeof(buf), fmt, ap);
        if (save_and_exit) {
                if (!silent)
-                       printf("%s", buf);
+                       printf("%s", s);
        } else {
-               show_textbox(NULL, buf, 6, 60);
+               show_textbox(NULL, s, 6, 60);
        }
 }
 
@@ -793,13 +788,13 @@ static void show_help(struct menu *menu)
        help.max_width = getmaxx(stdscr) - 10;
        menu_get_ext_help(menu, &help);
 
-       show_helptext(_(menu_get_prompt(menu)), str_get(&help));
+       show_helptext(menu_get_prompt(menu), str_get(&help));
        str_free(&help);
 }
 
 static void conf_choice(struct menu *menu)
 {
-       const char *prompt = _(menu_get_prompt(menu));
+       const char *prompt = menu_get_prompt(menu);
        struct menu *child;
        struct symbol *active;
 
@@ -814,9 +809,9 @@ static void conf_choice(struct menu *menu)
                        if (!menu_is_visible(child))
                                continue;
                        if (child->sym)
-                               item_make("%s", _(menu_get_prompt(child)));
+                               item_make("%s", menu_get_prompt(child));
                        else {
-                               item_make("*** %s ***", _(menu_get_prompt(child)));
+                               item_make("*** %s ***", menu_get_prompt(child));
                                item_set_tag(':');
                        }
                        item_set_data(child);
@@ -826,8 +821,8 @@ static void conf_choice(struct menu *menu)
                                item_set_tag('X');
                }
                dialog_clear();
-               res = dialog_checklist(prompt ? _(prompt) : _("Main Menu"),
-                                       _(radiolist_instructions),
+               res = dialog_checklist(prompt ? prompt : "Main Menu",
+                                       radiolist_instructions,
                                        MENUBOX_HEIGTH_MIN,
                                        MENUBOX_WIDTH_MIN,
                                        CHECKLIST_HEIGTH_MIN);
@@ -868,26 +863,26 @@ static void conf_string(struct menu *menu)
 
                switch (sym_get_type(menu->sym)) {
                case S_INT:
-                       heading = _(inputbox_instructions_int);
+                       heading = inputbox_instructions_int;
                        break;
                case S_HEX:
-                       heading = _(inputbox_instructions_hex);
+                       heading = inputbox_instructions_hex;
                        break;
                case S_STRING:
-                       heading = _(inputbox_instructions_string);
+                       heading = inputbox_instructions_string;
                        break;
                default:
-                       heading = _("Internal mconf error!");
+                       heading = "Internal mconf error!";
                }
                dialog_clear();
-               res = dialog_inputbox(prompt ? _(prompt) : _("Main Menu"),
+               res = dialog_inputbox(prompt ? prompt : "Main Menu",
                                      heading, 10, 75,
                                      sym_get_string_value(menu->sym));
                switch (res) {
                case 0:
                        if (sym_set_string_value(menu->sym, dialog_input_result))
                                return;
-                       show_textbox(NULL, _("You have made an invalid entry."), 5, 43);
+                       show_textbox(NULL, "You have made an invalid entry.", 5, 43);
                        break;
                case 1:
                        show_help(menu);
@@ -915,10 +910,10 @@ static void conf_load(void)
                                sym_set_change_count(1);
                                return;
                        }
-                       show_textbox(NULL, _("File does not exist!"), 5, 38);
+                       show_textbox(NULL, "File does not exist!", 5, 38);
                        break;
                case 1:
-                       show_helptext(_("Load Alternate Configuration"), load_config_help);
+                       show_helptext("Load Alternate Configuration", load_config_help);
                        break;
                case KEY_ESC:
                        return;
@@ -941,10 +936,10 @@ static void conf_save(void)
                                set_config_filename(dialog_input_result);
                                return;
                        }
-                       show_textbox(NULL, _("Can't create file!  Probably a nonexistent directory."), 5, 60);
+                       show_textbox(NULL, "Can't create file!  Probably a nonexistent directory.", 5, 60);
                        break;
                case 1:
-                       show_helptext(_("Save Alternate Configuration"), save_config_help);
+                       show_helptext("Save Alternate Configuration", save_config_help);
                        break;
                case KEY_ESC:
                        return;
@@ -961,8 +956,8 @@ static int handle_exit(void)
        dialog_clear();
        if (conf_get_changed())
                res = dialog_yesno(NULL,
-                                  _("Do you wish to save your new configuration?\n"
-                                    "(Press <ESC><ESC> to continue kernel configuration.)"),
+                                  "Do you wish to save your new configuration?\n"
+                                    "(Press <ESC><ESC> to continue kernel configuration.)",
                                   6, 60);
        else
                res = -1;
@@ -972,26 +967,26 @@ static int handle_exit(void)
        switch (res) {
        case 0:
                if (conf_write(filename)) {
-                       fprintf(stderr, _("\n\n"
+                       fprintf(stderr, "\n\n"
                                          "Error while writing of the configuration.\n"
                                          "Your configuration changes were NOT saved."
-                                         "\n\n"));
+                                         "\n\n");
                        return 1;
                }
                /* fall through */
        case -1:
                if (!silent)
-                       printf(_("\n\n"
+                       printf("\n\n"
                                 "*** End of the configuration.\n"
                                 "*** Execute 'make' to start the build or try 'make help'."
-                                "\n\n"));
+                                "\n\n");
                res = 0;
                break;
        default:
                if (!silent)
-                       fprintf(stderr, _("\n\n"
+                       fprintf(stderr, "\n\n"
                                          "Your configuration changes were NOT saved."
-                                         "\n\n"));
+                                         "\n\n");
                if (res != KEY_ESC)
                        res = 0;
        }
@@ -1009,10 +1004,6 @@ int main(int ac, char **av)
        char *mode;
        int res;
 
-       setlocale(LC_ALL, "");
-       bindtextdomain(PACKAGE, LOCALEDIR);
-       textdomain(PACKAGE);
-
        signal(SIGINT, sig_handler);
 
        if (ac > 1 && strcmp(av[1], "-s") == 0) {
@@ -1031,8 +1022,8 @@ int main(int ac, char **av)
        }
 
        if (init_dialog(NULL)) {
-               fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
-               fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
+               fprintf(stderr, "Your display is too small to run Menuconfig!\n");
+               fprintf(stderr, "It must be at least 19 lines by 80 columns.\n");
                return 1;
        }
 
index 5c5c1374b151f2a3b25217817d68a0af4b8a120f..4cf15d449c05d2a126d0a3fa9af592068b8ff5d7 100644 (file)
@@ -212,10 +212,7 @@ void menu_add_option(int token, char *arg)
                        sym_defconfig_list = current_entry->sym;
                else if (sym_defconfig_list != current_entry->sym)
                        zconf_error("trying to redefine defconfig symbol");
-               sym_defconfig_list->flags |= SYMBOL_AUTO;
-               break;
-       case T_OPT_ENV:
-               prop_add_env(arg);
+               sym_defconfig_list->flags |= SYMBOL_NO_WRITE;
                break;
        case T_OPT_ALLNOCONFIG_Y:
                current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y;
@@ -711,7 +708,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
        struct menu *submenu[8], *menu, *location = NULL;
        struct jump_key *jump = NULL;
 
-       str_printf(r, _("Prompt: %s\n"), _(prop->text));
+       str_printf(r, "Prompt: %s\n", prop->text);
        menu = prop->menu->parent;
        for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) {
                bool accessible = menu_is_visible(menu);
@@ -744,16 +741,16 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
        }
 
        if (i > 0) {
-               str_printf(r, _("  Location:\n"));
+               str_printf(r, "  Location:\n");
                for (j = 4; --i >= 0; j += 2) {
                        menu = submenu[i];
                        if (jump && menu == location)
                                jump->offset = strlen(r->s);
                        str_printf(r, "%*c-> %s", j, ' ',
-                                  _(menu_get_prompt(menu)));
+                                  menu_get_prompt(menu));
                        if (menu->sym) {
                                str_printf(r, " (%s [=%s])", menu->sym->name ?
-                                       menu->sym->name : _("<choice>"),
+                                       menu->sym->name : "<choice>",
                                        sym_get_string_value(menu->sym));
                        }
                        str_append(r, "\n");
@@ -817,23 +814,23 @@ static void get_symbol_str(struct gstr *r, struct symbol *sym,
 
        prop = get_symbol_prop(sym);
        if (prop) {
-               str_printf(r, _("  Defined at %s:%d\n"), prop->menu->file->name,
+               str_printf(r, "  Defined at %s:%d\n", prop->menu->file->name,
                        prop->menu->lineno);
                if (!expr_is_yes(prop->visible.expr)) {
-                       str_append(r, _("  Depends on: "));
+                       str_append(r, "  Depends on: ");
                        expr_gstr_print(prop->visible.expr, r);
                        str_append(r, "\n");
                }
        }
 
-       get_symbol_props_str(r, sym, P_SELECT, _("  Selects: "));
+       get_symbol_props_str(r, sym, P_SELECT, "  Selects: ");
        if (sym->rev_dep.expr) {
                expr_gstr_print_revdep(sym->rev_dep.expr, r, yes, "  Selected by [y]:\n");
                expr_gstr_print_revdep(sym->rev_dep.expr, r, mod, "  Selected by [m]:\n");
                expr_gstr_print_revdep(sym->rev_dep.expr, r, no, "  Selected by [n]:\n");
        }
 
-       get_symbol_props_str(r, sym, P_IMPLY, _("  Implies: "));
+       get_symbol_props_str(r, sym, P_IMPLY, "  Implies: ");
        if (sym->implied.expr) {
                expr_gstr_print_revdep(sym->implied.expr, r, yes, "  Implied by [y]:\n");
                expr_gstr_print_revdep(sym->implied.expr, r, mod, "  Implied by [m]:\n");
@@ -852,7 +849,7 @@ struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head)
        for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
                get_symbol_str(&res, sym, head);
        if (!i)
-               str_append(&res, _("No matches found.\n"));
+               str_append(&res, "No matches found.\n");
        return res;
 }
 
@@ -867,7 +864,7 @@ void menu_get_ext_help(struct menu *menu, struct gstr *help)
                        str_printf(help, "%s%s:\n\n", CONFIG_, sym->name);
                help_text = menu_get_help(menu);
        }
-       str_printf(help, "%s\n", _(help_text));
+       str_printf(help, "%s\n", help_text);
        if (sym)
                get_symbol_str(help, sym, NULL);
 }
diff --git a/scripts/kconfig/nconf-cfg.sh b/scripts/kconfig/nconf-cfg.sh
new file mode 100644 (file)
index 0000000..001559e
--- /dev/null
@@ -0,0 +1,47 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+
+PKG="ncursesw menuw panelw"
+PKG2="ncurses menu panel"
+
+if [ -n "$(command -v pkg-config)" ]; then
+       if pkg-config --exists $PKG; then
+               echo cflags=\"$(pkg-config --cflags $PKG)\"
+               echo libs=\"$(pkg-config --libs $PKG)\"
+               exit 0
+       fi
+
+       if pkg-config --exists $PKG2; then
+               echo cflags=\"$(pkg-config --cflags $PKG2)\"
+               echo libs=\"$(pkg-config --libs $PKG2)\"
+               exit 0
+       fi
+fi
+
+# Check the default paths in case pkg-config is not installed.
+# (Even if it is installed, some distributions such as openSUSE cannot
+# find ncurses by pkg-config.)
+if [ -f /usr/include/ncursesw/ncurses.h ]; then
+       echo cflags=\"-D_GNU_SOURCE -I/usr/include/ncursesw\"
+       echo libs=\"-lncursesw -lmenuw -lpanelw\"
+       exit 0
+fi
+
+if [ -f /usr/include/ncurses/ncurses.h ]; then
+       echo cflags=\"-D_GNU_SOURCE -I/usr/include/ncurses\"
+       echo libs=\"-lncurses -lmenu -lpanel\"
+       exit 0
+fi
+
+if [ -f /usr/include/ncurses.h ]; then
+       echo cflags=\"-D_GNU_SOURCE\"
+       echo libs=\"-lncurses -lmenu -lpanel\"
+       exit 0
+fi
+
+echo >&2 "*"
+echo >&2 "* Unable to find the ncurses package."
+echo >&2 "* Install ncurses (ncurses-devel or libncurses-dev"
+echo >&2 "* depending on your distribution)."
+echo >&2 "*"
+exit 1
index 0031147798153bdd06aa5c1f3d6f2015298b5b5d..5cbdb92e11b3b04b855807b263f64c405cf94ee6 100644 (file)
@@ -15,7 +15,7 @@
 #include "nconf.h"
 #include <ctype.h>
 
-static const char nconf_global_help[] = N_(
+static const char nconf_global_help[] =
 "Help windows\n"
 "------------\n"
 "o  Global help:  Unless in a data entry window, pressing <F1> will give \n"
@@ -130,8 +130,8 @@ static const char nconf_global_help[] = N_(
 "\n"
 "Note that this mode can eventually be a little more CPU expensive than\n"
 "the default mode, especially with a larger number of unfolded submenus.\n"
-"\n"),
-menu_no_f_instructions[] = N_(
+"\n",
+menu_no_f_instructions[] =
 "Legend:  [*] built-in  [ ] excluded  <M> module  < > module capable.\n"
 "Submenus are designated by a trailing \"--->\", empty ones by \"----\".\n"
 "\n"
@@ -147,8 +147,8 @@ menu_no_f_instructions[] = N_(
 "You do not have function keys support.\n"
 "Press <1> instead of <F1>, <2> instead of <F2>, etc.\n"
 "For verbose global help use key <1>.\n"
-"For help related to the current menu entry press <?> or <h>.\n"),
-menu_instructions[] = N_(
+"For help related to the current menu entry press <?> or <h>.\n",
+menu_instructions[] =
 "Legend:  [*] built-in  [ ] excluded  <M> module  < > module capable.\n"
 "Submenus are designated by a trailing \"--->\", empty ones by \"----\".\n"
 "\n"
@@ -163,30 +163,30 @@ menu_instructions[] = N_(
 "\n"
 "Pressing <1> may be used instead of <F1>, <2> instead of <F2>, etc.\n"
 "For verbose global help press <F1>.\n"
-"For help related to the current menu entry press <?> or <h>.\n"),
-radiolist_instructions[] = N_(
+"For help related to the current menu entry press <?> or <h>.\n",
+radiolist_instructions[] =
 "Press <Up>, <Down>, <Home> or <End> to navigate a radiolist, select\n"
 "with <Space>.\n"
 "For help related to the current entry press <?> or <h>.\n"
-"For global help press <F1>.\n"),
-inputbox_instructions_int[] = N_(
+"For global help press <F1>.\n",
+inputbox_instructions_int[] =
 "Please enter a decimal value.\n"
 "Fractions will not be accepted.\n"
-"Press <Enter> to apply, <Esc> to cancel."),
-inputbox_instructions_hex[] = N_(
+"Press <Enter> to apply, <Esc> to cancel.",
+inputbox_instructions_hex[] =
 "Please enter a hexadecimal value.\n"
-"Press <Enter> to apply, <Esc> to cancel."),
-inputbox_instructions_string[] = N_(
+"Press <Enter> to apply, <Esc> to cancel.",
+inputbox_instructions_string[] =
 "Please enter a string value.\n"
-"Press <Enter> to apply, <Esc> to cancel."),
-setmod_text[] = N_(
+"Press <Enter> to apply, <Esc> to cancel.",
+setmod_text[] =
 "This feature depends on another feature which has been configured as a\n"
-"module.  As a result, the current feature will be built as a module too."),
-load_config_text[] = N_(
+"module.  As a result, the current feature will be built as a module too.",
+load_config_text[] =
 "Enter the name of the configuration file you wish to load.\n"
 "Accept the name shown to restore the configuration you last\n"
-"retrieved.  Leave empty to abort."),
-load_config_help[] = N_(
+"retrieved.  Leave empty to abort.",
+load_config_help[] =
 "For various reasons, one may wish to keep several different\n"
 "configurations available on a single machine.\n"
 "\n"
@@ -194,11 +194,11 @@ load_config_help[] = N_(
 "default one, entering its name here will allow you to load and modify\n"
 "that configuration.\n"
 "\n"
-"Leave empty to abort.\n"),
-save_config_text[] = N_(
+"Leave empty to abort.\n",
+save_config_text[] =
 "Enter a filename to which this configuration should be saved\n"
-"as an alternate.  Leave empty to abort."),
-save_config_help[] = N_(
+"as an alternate.  Leave empty to abort.",
+save_config_help[] =
 "For various reasons, one may wish to keep several different\n"
 "configurations available on a single machine.\n"
 "\n"
@@ -206,8 +206,8 @@ save_config_help[] = N_(
 "and use the current configuration as an alternate to whatever\n"
 "configuration options you have selected at that time.\n"
 "\n"
-"Leave empty to abort.\n"),
-search_help[] = N_(
+"Leave empty to abort.\n",
+search_help[] =
 "Search for symbols (configuration variable names CONFIG_*) and display\n"
 "their relations.  Regular expressions are supported.\n"
 "Example:  Search for \"^FOO\".\n"
@@ -244,7 +244,7 @@ search_help[] = N_(
 "USB  => find all symbols containing USB\n"
 "^USB => find all symbols starting with USB\n"
 "USB$ => find all symbols ending with USB\n"
-"\n");
+"\n";
 
 struct mitem {
        char str[256];
@@ -388,7 +388,7 @@ static void print_function_line(void)
 static void handle_f1(int *key, struct menu *current_item)
 {
        show_scroll_win(main_window,
-                       _("Global help"), _(nconf_global_help));
+                       "Global help", nconf_global_help);
        return;
 }
 
@@ -403,8 +403,8 @@ static void handle_f2(int *key, struct menu *current_item)
 static void handle_f3(int *key, struct menu *current_item)
 {
        show_scroll_win(main_window,
-                       _("Short help"),
-                       _(current_instructions));
+                       "Short help",
+                       current_instructions);
        return;
 }
 
@@ -412,7 +412,7 @@ static void handle_f3(int *key, struct menu *current_item)
 static void handle_f4(int *key, struct menu *current_item)
 {
        int res = btn_dialog(main_window,
-                       _("Show all symbols?"),
+                       "Show all symbols?",
                        2,
                        "   <Show All>   ",
                        "<Don't show all>");
@@ -653,8 +653,8 @@ static int do_exit(void)
                return 0;
        }
        res = btn_dialog(main_window,
-                       _("Do you wish to save your new configuration?\n"
-                               "<ESC> to cancel and resume nconfig."),
+                       "Do you wish to save your new configuration?\n"
+                               "<ESC> to cancel and resume nconfig.",
                        2,
                        "   <save>   ",
                        "<don't save>");
@@ -670,15 +670,15 @@ static int do_exit(void)
                if (res)
                        btn_dialog(
                                main_window,
-                               _("Error during writing of configuration.\n"
-                                 "Your configuration changes were NOT saved."),
+                               "Error during writing of configuration.\n"
+                                 "Your configuration changes were NOT saved.",
                                  1,
                                  "<OK>");
                break;
        default:
                btn_dialog(
                        main_window,
-                       _("Your configuration changes were NOT saved."),
+                       "Your configuration changes were NOT saved.",
                        1,
                        "<OK>");
                break;
@@ -697,12 +697,12 @@ static void search_conf(void)
        int dres;
 
        title = str_new();
-       str_printf( &title, _("Enter (sub)string or regexp to search for "
-                             "(with or without \"%s\")"), CONFIG_);
+       str_printf( &title, "Enter (sub)string or regexp to search for "
+                             "(with or without \"%s\")", CONFIG_);
 
 again:
        dres = dialog_inputbox(main_window,
-                       _("Search Configuration Parameter"),
+                       "Search Configuration Parameter",
                        str_get(&title),
                        "", &dialog_input_result, &dialog_input_result_len);
        switch (dres) {
@@ -710,7 +710,7 @@ again:
                break;
        case 1:
                show_scroll_win(main_window,
-                               _("Search Configuration"), search_help);
+                               "Search Configuration", search_help);
                goto again;
        default:
                str_free(&title);
@@ -726,7 +726,7 @@ again:
        res = get_relations_str(sym_arr, NULL);
        free(sym_arr);
        show_scroll_win(main_window,
-                       _("Search Results"), str_get(&res));
+                       "Search Results", str_get(&res));
        str_free(&res);
        str_free(&title);
 }
@@ -754,7 +754,7 @@ static void build_conf(struct menu *menu)
                        switch (ptype) {
                        case P_MENU:
                                child_count++;
-                               prompt = _(prompt);
+                               prompt = prompt;
                                if (single_menu_mode) {
                                        item_make(menu, 'm',
                                                "%s%*c%s",
@@ -775,7 +775,7 @@ static void build_conf(struct menu *menu)
                                        item_make(menu, ':',
                                                "   %*c*** %s ***",
                                                indent + 1, ' ',
-                                               _(prompt));
+                                               prompt);
                                }
                                break;
                        default:
@@ -783,7 +783,7 @@ static void build_conf(struct menu *menu)
                                        child_count++;
                                        item_make(menu, ':', "---%*c%s",
                                                indent + 1, ' ',
-                                               _(prompt));
+                                               prompt);
                                }
                        }
                } else
@@ -829,11 +829,11 @@ static void build_conf(struct menu *menu)
                }
 
                item_add_str("%*c%s", indent + 1,
-                               ' ', _(menu_get_prompt(menu)));
+                               ' ', menu_get_prompt(menu));
                if (val == yes) {
                        if (def_menu) {
                                item_add_str(" (%s)",
-                                       _(menu_get_prompt(def_menu)));
+                                       menu_get_prompt(def_menu));
                                item_add_str("  --->");
                                if (def_menu->list) {
                                        indent += 2;
@@ -847,7 +847,7 @@ static void build_conf(struct menu *menu)
                if (menu == current_menu) {
                        item_make(menu, ':',
                                "---%*c%s", indent + 1,
-                               ' ', _(menu_get_prompt(menu)));
+                               ' ', menu_get_prompt(menu));
                        goto conf_childs;
                }
                child_count++;
@@ -894,17 +894,17 @@ static void build_conf(struct menu *menu)
                                if (tmp < 0)
                                        tmp = 0;
                                item_add_str("%*c%s%s", tmp, ' ',
-                                               _(menu_get_prompt(menu)),
+                                               menu_get_prompt(menu),
                                                (sym_has_value(sym) ||
                                                 !sym_is_changable(sym)) ? "" :
-                                               _(" (NEW)"));
+                                               " (NEW)");
                                goto conf_childs;
                        }
                }
                item_add_str("%*c%s%s", indent + 1, ' ',
-                               _(menu_get_prompt(menu)),
+                               menu_get_prompt(menu),
                                (sym_has_value(sym) || !sym_is_changable(sym)) ?
-                               "" : _(" (NEW)"));
+                               "" : " (NEW)");
                if (menu->prompt && menu->prompt->type == P_MENU) {
                        item_add_str("  %s", menu_is_empty(menu) ? "----" : "--->");
                        return;
@@ -1086,8 +1086,8 @@ static void conf(struct menu *menu)
                if (!child_count)
                        break;
 
-               show_menu(prompt ? _(prompt) : _("Main Menu"),
-                               _(menu_instructions),
+               show_menu(prompt ? prompt : "Main Menu",
+                               menu_instructions,
                                current_index, &last_top_row);
                keypad((menu_win(curses_menu)), TRUE);
                while (!global_exit) {
@@ -1210,12 +1210,9 @@ static void conf(struct menu *menu)
        }
 }
 
-static void conf_message_callback(const char *fmt, va_list ap)
+static void conf_message_callback(const char *s)
 {
-       char buf[1024];
-
-       vsnprintf(buf, sizeof(buf), fmt, ap);
-       btn_dialog(main_window, buf, 1, "<OK>");
+       btn_dialog(main_window, s, 1, "<OK>");
 }
 
 static void show_help(struct menu *menu)
@@ -1227,13 +1224,13 @@ static void show_help(struct menu *menu)
 
        help = str_new();
        menu_get_ext_help(menu, &help);
-       show_scroll_win(main_window, _(menu_get_prompt(menu)), str_get(&help));
+       show_scroll_win(main_window, menu_get_prompt(menu), str_get(&help));
        str_free(&help);
 }
 
 static void conf_choice(struct menu *menu)
 {
-       const char *prompt = _(menu_get_prompt(menu));
+       const char *prompt = menu_get_prompt(menu);
        struct menu *child = NULL;
        struct symbol *active;
        int selected_index = 0;
@@ -1256,13 +1253,13 @@ static void conf_choice(struct menu *menu)
 
                        if (child->sym == sym_get_choice_value(menu->sym))
                                item_make(child, ':', "<X> %s",
-                                               _(menu_get_prompt(child)));
+                                               menu_get_prompt(child));
                        else if (child->sym)
                                item_make(child, ':', "    %s",
-                                               _(menu_get_prompt(child)));
+                                               menu_get_prompt(child));
                        else
                                item_make(child, ':', "*** %s ***",
-                                               _(menu_get_prompt(child)));
+                                               menu_get_prompt(child));
 
                        if (child->sym == active){
                                last_top_row = top_row(curses_menu);
@@ -1270,8 +1267,8 @@ static void conf_choice(struct menu *menu)
                        }
                        i++;
                }
-               show_menu(prompt ? _(prompt) : _("Choice Menu"),
-                               _(radiolist_instructions),
+               show_menu(prompt ? prompt : "Choice Menu",
+                               radiolist_instructions,
                                selected_index,
                                &last_top_row);
                while (!global_exit) {
@@ -1358,19 +1355,19 @@ static void conf_string(struct menu *menu)
 
                switch (sym_get_type(menu->sym)) {
                case S_INT:
-                       heading = _(inputbox_instructions_int);
+                       heading = inputbox_instructions_int;
                        break;
                case S_HEX:
-                       heading = _(inputbox_instructions_hex);
+                       heading = inputbox_instructions_hex;
                        break;
                case S_STRING:
-                       heading = _(inputbox_instructions_string);
+                       heading = inputbox_instructions_string;
                        break;
                default:
-                       heading = _("Internal nconf error!");
+                       heading = "Internal nconf error!";
                }
                res = dialog_inputbox(main_window,
-                               prompt ? _(prompt) : _("Main Menu"),
+                               prompt ? prompt : "Main Menu",
                                heading,
                                sym_get_string_value(menu->sym),
                                &dialog_input_result,
@@ -1381,7 +1378,7 @@ static void conf_string(struct menu *menu)
                                                dialog_input_result))
                                return;
                        btn_dialog(main_window,
-                               _("You have made an invalid entry."), 0);
+                               "You have made an invalid entry.", 0);
                        break;
                case 1:
                        show_help(menu);
@@ -1410,11 +1407,11 @@ static void conf_load(void)
                                sym_set_change_count(1);
                                return;
                        }
-                       btn_dialog(main_window, _("File does not exist!"), 0);
+                       btn_dialog(main_window, "File does not exist!", 0);
                        break;
                case 1:
                        show_scroll_win(main_window,
-                                       _("Load Alternate Configuration"),
+                                       "Load Alternate Configuration",
                                        load_config_help);
                        break;
                case KEY_EXIT:
@@ -1441,13 +1438,13 @@ static void conf_save(void)
                                set_config_filename(dialog_input_result);
                                return;
                        }
-                       btn_dialog(main_window, _("Can't create file! "
-                               "Probably a nonexistent directory."),
+                       btn_dialog(main_window, "Can't create file! "
+                               "Probably a nonexistent directory.",
                                1, "<OK>");
                        break;
                case 1:
                        show_scroll_win(main_window,
-                               _("Save Alternate Configuration"),
+                               "Save Alternate Configuration",
                                save_config_help);
                        break;
                case KEY_EXIT:
@@ -1480,10 +1477,6 @@ int main(int ac, char **av)
        int lines, columns;
        char *mode;
 
-       setlocale(LC_ALL, "");
-       bindtextdomain(PACKAGE, LOCALEDIR);
-       textdomain(PACKAGE);
-
        if (ac > 1 && strcmp(av[1], "-s") == 0) {
                /* Silence conf_read() until the real callback is set up */
                conf_set_message_callback(NULL);
@@ -1541,8 +1534,8 @@ int main(int ac, char **av)
        /* check for KEY_FUNC(1) */
        if (has_key(KEY_F(1)) == FALSE) {
                show_scroll_win(main_window,
-                               _("Instructions"),
-                               _(menu_no_f_instructions));
+                               "Instructions",
+                               menu_no_f_instructions);
        }
 
        conf_set_message_callback(conf_message_callback);
index 9f6f21d3b0d4674baab323071e5cd4d057d86c2f..2b9e19f603c4ae7047907baeb3b80705fc5316d6 100644 (file)
@@ -14,7 +14,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-#include <locale.h>
 #include <ncurses.h>
 #include <menu.h>
 #include <panel.h>
diff --git a/scripts/kconfig/preprocess.c b/scripts/kconfig/preprocess.c
new file mode 100644 (file)
index 0000000..5ca2df7
--- /dev/null
@@ -0,0 +1,572 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// Copyright (C) 2018 Masahiro Yamada <yamada.masahiro@socionext.com>
+
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "list.h"
+
+#define ARRAY_SIZE(arr)                (sizeof(arr) / sizeof((arr)[0]))
+
+static char *expand_string_with_args(const char *in, int argc, char *argv[]);
+
+static void __attribute__((noreturn)) pperror(const char *format, ...)
+{
+       va_list ap;
+
+       fprintf(stderr, "%s:%d: ", current_file->name, yylineno);
+       va_start(ap, format);
+       vfprintf(stderr, format, ap);
+       va_end(ap);
+       fprintf(stderr, "\n");
+
+       exit(1);
+}
+
+/*
+ * Environment variables
+ */
+static LIST_HEAD(env_list);
+
+struct env {
+       char *name;
+       char *value;
+       struct list_head node;
+};
+
+static void env_add(const char *name, const char *value)
+{
+       struct env *e;
+
+       e = xmalloc(sizeof(*e));
+       e->name = xstrdup(name);
+       e->value = xstrdup(value);
+
+       list_add_tail(&e->node, &env_list);
+}
+
+static void env_del(struct env *e)
+{
+       list_del(&e->node);
+       free(e->name);
+       free(e->value);
+       free(e);
+}
+
+/* The returned pointer must be freed when done */
+static char *env_expand(const char *name)
+{
+       struct env *e;
+       const char *value;
+
+       if (!*name)
+               return NULL;
+
+       list_for_each_entry(e, &env_list, node) {
+               if (!strcmp(name, e->name))
+                       return xstrdup(e->value);
+       }
+
+       value = getenv(name);
+       if (!value)
+               return NULL;
+
+       /*
+        * We need to remember all referenced environment variables.
+        * They will be written out to include/config/auto.conf.cmd
+        */
+       env_add(name, value);
+
+       return xstrdup(value);
+}
+
+void env_write_dep(FILE *f, const char *autoconfig_name)
+{
+       struct env *e, *tmp;
+
+       list_for_each_entry_safe(e, tmp, &env_list, node) {
+               fprintf(f, "ifneq \"$(%s)\" \"%s\"\n", e->name, e->value);
+               fprintf(f, "%s: FORCE\n", autoconfig_name);
+               fprintf(f, "endif\n");
+               env_del(e);
+       }
+}
+
+/*
+ * Built-in functions
+ */
+struct function {
+       const char *name;
+       unsigned int min_args;
+       unsigned int max_args;
+       char *(*func)(int argc, char *argv[]);
+};
+
+static char *do_error_if(int argc, char *argv[])
+{
+       if (!strcmp(argv[0], "y"))
+               pperror("%s", argv[1]);
+
+       return NULL;
+}
+
+static char *do_filename(int argc, char *argv[])
+{
+       return xstrdup(current_file->name);
+}
+
+static char *do_info(int argc, char *argv[])
+{
+       printf("%s\n", argv[0]);
+
+       return xstrdup("");
+}
+
+static char *do_lineno(int argc, char *argv[])
+{
+       char buf[16];
+
+       sprintf(buf, "%d", yylineno);
+
+       return xstrdup(buf);
+}
+
+static char *do_shell(int argc, char *argv[])
+{
+       FILE *p;
+       char buf[256];
+       char *cmd;
+       size_t nread;
+       int i;
+
+       cmd = argv[0];
+
+       p = popen(cmd, "r");
+       if (!p) {
+               perror(cmd);
+               exit(1);
+       }
+
+       nread = fread(buf, 1, sizeof(buf), p);
+       if (nread == sizeof(buf))
+               nread--;
+
+       /* remove trailing new lines */
+       while (nread > 0 && buf[nread - 1] == '\n')
+               nread--;
+
+       buf[nread] = 0;
+
+       /* replace a new line with a space */
+       for (i = 0; i < nread; i++) {
+               if (buf[i] == '\n')
+                       buf[i] = ' ';
+       }
+
+       if (pclose(p) == -1) {
+               perror(cmd);
+               exit(1);
+       }
+
+       return xstrdup(buf);
+}
+
+static char *do_warning_if(int argc, char *argv[])
+{
+       if (!strcmp(argv[0], "y"))
+               fprintf(stderr, "%s:%d: %s\n",
+                       current_file->name, yylineno, argv[1]);
+
+       return xstrdup("");
+}
+
+static const struct function function_table[] = {
+       /* Name         MIN     MAX     Function */
+       { "error-if",   2,      2,      do_error_if },
+       { "filename",   0,      0,      do_filename },
+       { "info",       1,      1,      do_info },
+       { "lineno",     0,      0,      do_lineno },
+       { "shell",      1,      1,      do_shell },
+       { "warning-if", 2,      2,      do_warning_if },
+};
+
+#define FUNCTION_MAX_ARGS              16
+
+static char *function_expand(const char *name, int argc, char *argv[])
+{
+       const struct function *f;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(function_table); i++) {
+               f = &function_table[i];
+               if (strcmp(f->name, name))
+                       continue;
+
+               if (argc < f->min_args)
+                       pperror("too few function arguments passed to '%s'",
+                               name);
+
+               if (argc > f->max_args)
+                       pperror("too many function arguments passed to '%s'",
+                               name);
+
+               return f->func(argc, argv);
+       }
+
+       return NULL;
+}
+
+/*
+ * Variables (and user-defined functions)
+ */
+static LIST_HEAD(variable_list);
+
+struct variable {
+       char *name;
+       char *value;
+       enum variable_flavor flavor;
+       int exp_count;
+       struct list_head node;
+};
+
+static struct variable *variable_lookup(const char *name)
+{
+       struct variable *v;
+
+       list_for_each_entry(v, &variable_list, node) {
+               if (!strcmp(name, v->name))
+                       return v;
+       }
+
+       return NULL;
+}
+
+static char *variable_expand(const char *name, int argc, char *argv[])
+{
+       struct variable *v;
+       char *res;
+
+       v = variable_lookup(name);
+       if (!v)
+               return NULL;
+
+       if (argc == 0 && v->exp_count)
+               pperror("Recursive variable '%s' references itself (eventually)",
+                       name);
+
+       if (v->exp_count > 1000)
+               pperror("Too deep recursive expansion");
+
+       v->exp_count++;
+
+       if (v->flavor == VAR_RECURSIVE)
+               res = expand_string_with_args(v->value, argc, argv);
+       else
+               res = xstrdup(v->value);
+
+       v->exp_count--;
+
+       return res;
+}
+
+void variable_add(const char *name, const char *value,
+                 enum variable_flavor flavor)
+{
+       struct variable *v;
+       char *new_value;
+       bool append = false;
+
+       v = variable_lookup(name);
+       if (v) {
+               /* For defined variables, += inherits the existing flavor */
+               if (flavor == VAR_APPEND) {
+                       flavor = v->flavor;
+                       append = true;
+               } else {
+                       free(v->value);
+               }
+       } else {
+               /* For undefined variables, += assumes the recursive flavor */
+               if (flavor == VAR_APPEND)
+                       flavor = VAR_RECURSIVE;
+
+               v = xmalloc(sizeof(*v));
+               v->name = xstrdup(name);
+               v->exp_count = 0;
+               list_add_tail(&v->node, &variable_list);
+       }
+
+       v->flavor = flavor;
+
+       if (flavor == VAR_SIMPLE)
+               new_value = expand_string(value);
+       else
+               new_value = xstrdup(value);
+
+       if (append) {
+               v->value = xrealloc(v->value,
+                                   strlen(v->value) + strlen(new_value) + 2);
+               strcat(v->value, " ");
+               strcat(v->value, new_value);
+               free(new_value);
+       } else {
+               v->value = new_value;
+       }
+}
+
+static void variable_del(struct variable *v)
+{
+       list_del(&v->node);
+       free(v->name);
+       free(v->value);
+       free(v);
+}
+
+void variable_all_del(void)
+{
+       struct variable *v, *tmp;
+
+       list_for_each_entry_safe(v, tmp, &variable_list, node)
+               variable_del(v);
+}
+
+/*
+ * Evaluate a clause with arguments.  argc/argv are arguments from the upper
+ * function call.
+ *
+ * Returned string must be freed when done
+ */
+static char *eval_clause(const char *str, size_t len, int argc, char *argv[])
+{
+       char *tmp, *name, *res, *endptr, *prev, *p;
+       int new_argc = 0;
+       char *new_argv[FUNCTION_MAX_ARGS];
+       int nest = 0;
+       int i;
+       unsigned long n;
+
+       tmp = xstrndup(str, len);
+
+       /*
+        * If variable name is '1', '2', etc.  It is generally an argument
+        * from a user-function call (i.e. local-scope variable).  If not
+        * available, then look-up global-scope variables.
+        */
+       n = strtoul(tmp, &endptr, 10);
+       if (!*endptr && n > 0 && n <= argc) {
+               res = xstrdup(argv[n - 1]);
+               goto free_tmp;
+       }
+
+       prev = p = tmp;
+
+       /*
+        * Split into tokens
+        * The function name and arguments are separated by a comma.
+        * For example, if the function call is like this:
+        *   $(foo,$(x),$(y))
+        *
+        * The input string for this helper should be:
+        *   foo,$(x),$(y)
+        *
+        * and split into:
+        *   new_argv[0] = 'foo'
+        *   new_argv[1] = '$(x)'
+        *   new_argv[2] = '$(y)'
+        */
+       while (*p) {
+               if (nest == 0 && *p == ',') {
+                       *p = 0;
+                       if (new_argc >= FUNCTION_MAX_ARGS)
+                               pperror("too many function arguments");
+                       new_argv[new_argc++] = prev;
+                       prev = p + 1;
+               } else if (*p == '(') {
+                       nest++;
+               } else if (*p == ')') {
+                       nest--;
+               }
+
+               p++;
+       }
+       new_argv[new_argc++] = prev;
+
+       /*
+        * Shift arguments
+        * new_argv[0] represents a function name or a variable name.  Put it
+        * into 'name', then shift the rest of the arguments.  This simplifies
+        * 'const' handling.
+        */
+       name = expand_string_with_args(new_argv[0], argc, argv);
+       new_argc--;
+       for (i = 0; i < new_argc; i++)
+               new_argv[i] = expand_string_with_args(new_argv[i + 1],
+                                                     argc, argv);
+
+       /* Search for variables */
+       res = variable_expand(name, new_argc, new_argv);
+       if (res)
+               goto free;
+
+       /* Look for built-in functions */
+       res = function_expand(name, new_argc, new_argv);
+       if (res)
+               goto free;
+
+       /* Last, try environment variable */
+       if (new_argc == 0) {
+               res = env_expand(name);
+               if (res)
+                       goto free;
+       }
+
+       res = xstrdup("");
+free:
+       for (i = 0; i < new_argc; i++)
+               free(new_argv[i]);
+       free(name);
+free_tmp:
+       free(tmp);
+
+       return res;
+}
+
+/*
+ * Expand a string that follows '$'
+ *
+ * For example, if the input string is
+ *     ($(FOO)$($(BAR)))$(BAZ)
+ * this helper evaluates
+ *     $($(FOO)$($(BAR)))
+ * and returns a new string containing the expansion (note that the string is
+ * recursively expanded), also advancing 'str' to point to the next character
+ * after the corresponding closing parenthesis, in this case, *str will be
+ *     $(BAR)
+ */
+static char *expand_dollar_with_args(const char **str, int argc, char *argv[])
+{
+       const char *p = *str;
+       const char *q;
+       int nest = 0;
+
+       /*
+        * In Kconfig, variable/function references always start with "$(".
+        * Neither single-letter variables as in $A nor curly braces as in ${CC}
+        * are supported.  '$' not followed by '(' loses its special meaning.
+        */
+       if (*p != '(') {
+               *str = p;
+               return xstrdup("$");
+       }
+
+       p++;
+       q = p;
+       while (*q) {
+               if (*q == '(') {
+                       nest++;
+               } else if (*q == ')') {
+                       if (nest-- == 0)
+                               break;
+               }
+               q++;
+       }
+
+       if (!*q)
+               pperror("unterminated reference to '%s': missing ')'", p);
+
+       /* Advance 'str' to after the expanded initial portion of the string */
+       *str = q + 1;
+
+       return eval_clause(p, q - p, argc, argv);
+}
+
+char *expand_dollar(const char **str)
+{
+       return expand_dollar_with_args(str, 0, NULL);
+}
+
+static char *__expand_string(const char **str, bool (*is_end)(char c),
+                            int argc, char *argv[])
+{
+       const char *in, *p;
+       char *expansion, *out;
+       size_t in_len, out_len;
+
+       out = xmalloc(1);
+       *out = 0;
+       out_len = 1;
+
+       p = in = *str;
+
+       while (1) {
+               if (*p == '$') {
+                       in_len = p - in;
+                       p++;
+                       expansion = expand_dollar_with_args(&p, argc, argv);
+                       out_len += in_len + strlen(expansion);
+                       out = xrealloc(out, out_len);
+                       strncat(out, in, in_len);
+                       strcat(out, expansion);
+                       free(expansion);
+                       in = p;
+                       continue;
+               }
+
+               if (is_end(*p))
+                       break;
+
+               p++;
+       }
+
+       in_len = p - in;
+       out_len += in_len;
+       out = xrealloc(out, out_len);
+       strncat(out, in, in_len);
+
+       /* Advance 'str' to the end character */
+       *str = p;
+
+       return out;
+}
+
+static bool is_end_of_str(char c)
+{
+       return !c;
+}
+
+/*
+ * Expand variables and functions in the given string.  Undefined variables
+ * expand to an empty string.
+ * The returned string must be freed when done.
+ */
+static char *expand_string_with_args(const char *in, int argc, char *argv[])
+{
+       return __expand_string(&in, is_end_of_str, argc, argv);
+}
+
+char *expand_string(const char *in)
+{
+       return expand_string_with_args(in, 0, NULL);
+}
+
+static bool is_end_of_token(char c)
+{
+       /* Why are '.' and '/' valid characters for symbols? */
+       return !(isalnum(c) || c == '_' || c == '-' || c == '.' || c == '/');
+}
+
+/*
+ * Expand variables in a token.  The parsing stops when a token separater
+ * (in most cases, it is a whitespace) is encountered.  'str' is updated to
+ * point to the next character.
+ *
+ * The returned string must be freed when done.
+ */
+char *expand_one_token(const char **str)
+{
+       return __expand_string(str, is_end_of_token, 0, NULL);
+}
diff --git a/scripts/kconfig/qconf-cfg.sh b/scripts/kconfig/qconf-cfg.sh
new file mode 100755 (executable)
index 0000000..02ccc0a
--- /dev/null
@@ -0,0 +1,32 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+
+PKG="Qt5Core Qt5Gui Qt5Widgets"
+PKG2="QtCore QtGui"
+
+if [ -z "$(command -v pkg-config)" ]; then
+       echo >&2 "*"
+       echo >&2 "* 'make xconfig' requires 'pkg-config'. Please install it."
+       echo >&2 "*"
+       exit 1
+fi
+
+if pkg-config --exists $PKG; then
+       echo cflags=\"-std=c++11 -fPIC $(pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets)\"
+       echo libs=\"$(pkg-config --libs $PKG)\"
+       echo moc=\"$(pkg-config --variable=host_bins Qt5Core)/moc\"
+       exit 0
+fi
+
+if pkg-config --exists $PKG2; then
+       echo cflags=\"$(pkg-config --cflags $PKG2)\"
+       echo libs=\"$(pkg-config --libs $PKG2)\"
+       echo moc=\"$(pkg-config --variable=moc_location QtCore)\"
+       exit 0
+fi
+
+echo >&2 "*"
+echo >&2 "* Could not find Qt via pkg-config."
+echo >&2 "* Please install either Qt 4.8 or 5.x. and make sure it's in PKG_CONFIG_PATH"
+echo >&2 "*"
+exit 1
index ae6c725464110c67bf1e72325c4f7fa8879b6c94..0c3fa9405684e46957132e2af3db5e2b302deb7f 100644 (file)
 #include "qconf.moc"
 #include "images.c"
 
-#ifdef _
-# undef _
-# define _ qgettext
-#endif
 
 static QApplication *configApp;
 static ConfigSettings *configSettings;
@@ -46,12 +42,7 @@ QAction *ConfigMainWindow::saveAction;
 
 static inline QString qgettext(const char* str)
 {
-       return QString::fromLocal8Bit(gettext(str));
-}
-
-static inline QString qgettext(const QString& str)
-{
-       return QString::fromLocal8Bit(gettext(str.toLatin1()));
+       return QString::fromLocal8Bit(str);
 }
 
 ConfigSettings::ConfigSettings()
@@ -127,7 +118,7 @@ void ConfigItem::updateMenu(void)
 
        sym = menu->sym;
        prop = menu->prompt;
-       prompt = _(menu_get_prompt(menu));
+       prompt = qgettext(menu_get_prompt(menu));
 
        if (prop) switch (prop->type) {
        case P_MENU:
@@ -216,7 +207,7 @@ void ConfigItem::updateMenu(void)
                break;
        }
        if (!sym_has_value(sym) && visible)
-               prompt += _(" (NEW)");
+               prompt += " (NEW)";
 set_prompt:
        setText(promptColIdx, prompt);
 }
@@ -327,7 +318,7 @@ ConfigList::ConfigList(ConfigView* p, const char *name)
        setVerticalScrollMode(ScrollPerPixel);
        setHorizontalScrollMode(ScrollPerPixel);
 
-       setHeaderLabels(QStringList() << _("Option") << _("Name") << "N" << "M" << "Y" << _("Value"));
+       setHeaderLabels(QStringList() << "Option" << "Name" << "N" << "M" << "Y" << "Value");
 
        connect(this, SIGNAL(itemSelectionChanged(void)),
                SLOT(updateSelection(void)));
@@ -883,7 +874,7 @@ void ConfigList::contextMenuEvent(QContextMenuEvent *e)
                        QAction *action;
 
                        headerPopup = new QMenu(this);
-                       action = new QAction(_("Show Name"), this);
+                       action = new QAction("Show Name", this);
                          action->setCheckable(true);
                          connect(action, SIGNAL(toggled(bool)),
                                  parent(), SLOT(setShowName(bool)));
@@ -891,7 +882,7 @@ void ConfigList::contextMenuEvent(QContextMenuEvent *e)
                                  action, SLOT(setOn(bool)));
                          action->setChecked(showName);
                          headerPopup->addAction(action);
-                       action = new QAction(_("Show Range"), this);
+                       action = new QAction("Show Range", this);
                          action->setCheckable(true);
                          connect(action, SIGNAL(toggled(bool)),
                                  parent(), SLOT(setShowRange(bool)));
@@ -899,7 +890,7 @@ void ConfigList::contextMenuEvent(QContextMenuEvent *e)
                                  action, SLOT(setOn(bool)));
                          action->setChecked(showRange);
                          headerPopup->addAction(action);
-                       action = new QAction(_("Show Data"), this);
+                       action = new QAction("Show Data", this);
                          action->setCheckable(true);
                          connect(action, SIGNAL(toggled(bool)),
                                  parent(), SLOT(setShowData(bool)));
@@ -1086,7 +1077,7 @@ void ConfigInfoView::menuInfo(void)
        if (sym) {
                if (_menu->prompt) {
                        head += "<big><b>";
-                       head += print_filter(_(_menu->prompt->text));
+                       head += print_filter(_menu->prompt->text);
                        head += "</b></big>";
                        if (sym->name) {
                                head += " (";
@@ -1117,7 +1108,7 @@ void ConfigInfoView::menuInfo(void)
                str_free(&help_gstr);
        } else if (_menu->prompt) {
                head += "<big><b>";
-               head += print_filter(_(_menu->prompt->text));
+               head += print_filter(_menu->prompt->text);
                head += "</b></big><br><br>";
                if (showDebug()) {
                        if (_menu->prompt->visible.expr) {
@@ -1152,13 +1143,12 @@ QString ConfigInfoView::debug_info(struct symbol *sym)
                case P_PROMPT:
                case P_MENU:
                        debug += QString().sprintf("prompt: <a href=\"m%p\">", prop->menu);
-                       debug += print_filter(_(prop->text));
+                       debug += print_filter(prop->text);
                        debug += "</a><br>";
                        break;
                case P_DEFAULT:
                case P_SELECT:
                case P_RANGE:
-               case P_ENV:
                        debug += prop_get_type_name(prop->type);
                        debug += ": ";
                        expr_print(prop->expr, expr_print_help, &debug, E_NONE);
@@ -1234,7 +1224,7 @@ void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char
 QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos)
 {
        QMenu* popup = Parent::createStandardContextMenu(pos);
-       QAction* action = new QAction(_("Show Debug Info"), popup);
+       QAction* action = new QAction("Show Debug Info", popup);
          action->setCheckable(true);
          connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
          connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
@@ -1261,11 +1251,11 @@ ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *nam
        QHBoxLayout* layout2 = new QHBoxLayout(0);
        layout2->setContentsMargins(0, 0, 0, 0);
        layout2->setSpacing(6);
-       layout2->addWidget(new QLabel(_("Find:"), this));
+       layout2->addWidget(new QLabel("Find:", this));
        editField = new QLineEdit(this);
        connect(editField, SIGNAL(returnPressed()), SLOT(search()));
        layout2->addWidget(editField);
-       searchButton = new QPushButton(_("Search"), this);
+       searchButton = new QPushButton("Search", this);
        searchButton->setAutoDefault(false);
        connect(searchButton, SIGNAL(clicked()), SLOT(search()));
        layout2->addWidget(searchButton);
@@ -1387,44 +1377,44 @@ ConfigMainWindow::ConfigMainWindow(void)
        toolBar = new QToolBar("Tools", this);
        addToolBar(toolBar);
 
-       backAction = new QAction(QPixmap(xpm_back), _("Back"), this);
+       backAction = new QAction(QPixmap(xpm_back), "Back", this);
          connect(backAction, SIGNAL(triggered(bool)), SLOT(goBack()));
          backAction->setEnabled(false);
-       QAction *quitAction = new QAction(_("&Quit"), this);
+       QAction *quitAction = new QAction("&Quit", this);
        quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
          connect(quitAction, SIGNAL(triggered(bool)), SLOT(close()));
-       QAction *loadAction = new QAction(QPixmap(xpm_load), _("&Load"), this);
+       QAction *loadAction = new QAction(QPixmap(xpm_load), "&Load", this);
        loadAction->setShortcut(Qt::CTRL + Qt::Key_L);
          connect(loadAction, SIGNAL(triggered(bool)), SLOT(loadConfig()));
-       saveAction = new QAction(QPixmap(xpm_save), _("&Save"), this);
+       saveAction = new QAction(QPixmap(xpm_save), "&Save", this);
        saveAction->setShortcut(Qt::CTRL + Qt::Key_S);
          connect(saveAction, SIGNAL(triggered(bool)), SLOT(saveConfig()));
        conf_set_changed_callback(conf_changed);
        // Set saveAction's initial state
        conf_changed();
-       QAction *saveAsAction = new QAction(_("Save &As..."), this);
+       QAction *saveAsAction = new QAction("Save &As...", this);
          connect(saveAsAction, SIGNAL(triggered(bool)), SLOT(saveConfigAs()));
-       QAction *searchAction = new QAction(_("&Find"), this);
+       QAction *searchAction = new QAction("&Find", this);
        searchAction->setShortcut(Qt::CTRL + Qt::Key_F);
          connect(searchAction, SIGNAL(triggered(bool)), SLOT(searchConfig()));
-       singleViewAction = new QAction(QPixmap(xpm_single_view), _("Single View"), this);
+       singleViewAction = new QAction(QPixmap(xpm_single_view), "Single View", this);
        singleViewAction->setCheckable(true);
          connect(singleViewAction, SIGNAL(triggered(bool)), SLOT(showSingleView()));
-       splitViewAction = new QAction(QPixmap(xpm_split_view), _("Split View"), this);
+       splitViewAction = new QAction(QPixmap(xpm_split_view), "Split View", this);
        splitViewAction->setCheckable(true);
          connect(splitViewAction, SIGNAL(triggered(bool)), SLOT(showSplitView()));
-       fullViewAction = new QAction(QPixmap(xpm_tree_view), _("Full View"), this);
+       fullViewAction = new QAction(QPixmap(xpm_tree_view), "Full View", this);
        fullViewAction->setCheckable(true);
          connect(fullViewAction, SIGNAL(triggered(bool)), SLOT(showFullView()));
 
-       QAction *showNameAction = new QAction(_("Show Name"), this);
+       QAction *showNameAction = new QAction("Show Name", this);
          showNameAction->setCheckable(true);
          connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
          showNameAction->setChecked(configView->showName());
-       QAction *showRangeAction = new QAction(_("Show Range"), this);
+       QAction *showRangeAction = new QAction("Show Range", this);
          showRangeAction->setCheckable(true);
          connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
-       QAction *showDataAction = new QAction(_("Show Data"), this);
+       QAction *showDataAction = new QAction("Show Data", this);
          showDataAction->setCheckable(true);
          connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
 
@@ -1435,21 +1425,21 @@ ConfigMainWindow::ConfigMainWindow(void)
        connect(optGroup, SIGNAL(triggered(QAction *)), menuView,
                SLOT(setOptionMode(QAction *)));
 
-       configView->showNormalAction = new QAction(_("Show Normal Options"), optGroup);
-       configView->showAllAction = new QAction(_("Show All Options"), optGroup);
-       configView->showPromptAction = new QAction(_("Show Prompt Options"), optGroup);
+       configView->showNormalAction = new QAction("Show Normal Options", optGroup);
+       configView->showAllAction = new QAction("Show All Options", optGroup);
+       configView->showPromptAction = new QAction("Show Prompt Options", optGroup);
        configView->showNormalAction->setCheckable(true);
        configView->showAllAction->setCheckable(true);
        configView->showPromptAction->setCheckable(true);
 
-       QAction *showDebugAction = new QAction( _("Show Debug Info"), this);
+       QAction *showDebugAction = new QAction("Show Debug Info", this);
          showDebugAction->setCheckable(true);
          connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
          showDebugAction->setChecked(helpText->showDebug());
 
-       QAction *showIntroAction = new QAction( _("Introduction"), this);
+       QAction *showIntroAction = new QAction("Introduction", this);
          connect(showIntroAction, SIGNAL(triggered(bool)), SLOT(showIntro()));
-       QAction *showAboutAction = new QAction( _("About"), this);
+       QAction *showAboutAction = new QAction("About", this);
          connect(showAboutAction, SIGNAL(triggered(bool)), SLOT(showAbout()));
 
        // init tool bar
@@ -1463,7 +1453,7 @@ ConfigMainWindow::ConfigMainWindow(void)
        toolBar->addAction(fullViewAction);
 
        // create config menu
-       QMenu* config = menu->addMenu(_("&File"));
+       QMenu* config = menu->addMenu("&File");
        config->addAction(loadAction);
        config->addAction(saveAction);
        config->addAction(saveAsAction);
@@ -1471,11 +1461,11 @@ ConfigMainWindow::ConfigMainWindow(void)
        config->addAction(quitAction);
 
        // create edit menu
-       QMenu* editMenu = menu->addMenu(_("&Edit"));
+       QMenu* editMenu = menu->addMenu("&Edit");
        editMenu->addAction(searchAction);
 
        // create options menu
-       QMenu* optionMenu = menu->addMenu(_("&Option"));
+       QMenu* optionMenu = menu->addMenu("&Option");
        optionMenu->addAction(showNameAction);
        optionMenu->addAction(showRangeAction);
        optionMenu->addAction(showDataAction);
@@ -1486,7 +1476,7 @@ ConfigMainWindow::ConfigMainWindow(void)
 
        // create help menu
        menu->addSeparator();
-       QMenu* helpMenu = menu->addMenu(_("&Help"));
+       QMenu* helpMenu = menu->addMenu("&Help");
        helpMenu->addAction(showIntroAction);
        helpMenu->addAction(showAboutAction);
 
@@ -1534,14 +1524,14 @@ void ConfigMainWindow::loadConfig(void)
        if (s.isNull())
                return;
        if (conf_read(QFile::encodeName(s)))
-               QMessageBox::information(this, "qconf", _("Unable to load configuration!"));
+               QMessageBox::information(this, "qconf", "Unable to load configuration!");
        ConfigView::updateListAll();
 }
 
 bool ConfigMainWindow::saveConfig(void)
 {
        if (conf_write(NULL)) {
-               QMessageBox::information(this, "qconf", _("Unable to save configuration!"));
+               QMessageBox::information(this, "qconf", "Unable to save configuration!");
                return false;
        }
        return true;
@@ -1723,11 +1713,11 @@ void ConfigMainWindow::closeEvent(QCloseEvent* e)
                e->accept();
                return;
        }
-       QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning,
+       QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning,
                        QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
-       mb.setButtonText(QMessageBox::Yes, _("&Save Changes"));
-       mb.setButtonText(QMessageBox::No, _("&Discard Changes"));
-       mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit"));
+       mb.setButtonText(QMessageBox::Yes, "&Save Changes");
+       mb.setButtonText(QMessageBox::No, "&Discard Changes");
+       mb.setButtonText(QMessageBox::Cancel, "Cancel Exit");
        switch (mb.exec()) {
        case QMessageBox::Yes:
                if (saveConfig())
@@ -1746,7 +1736,7 @@ void ConfigMainWindow::closeEvent(QCloseEvent* e)
 
 void ConfigMainWindow::showIntro(void)
 {
-       static const QString str = _("Welcome to the qconf graphical configuration tool.\n\n"
+       static const QString str = "Welcome to the qconf graphical configuration tool.\n\n"
                "For each option, a blank box indicates the feature is disabled, a check\n"
                "indicates it is enabled, and a dot indicates that it is to be compiled\n"
                "as a module.  Clicking on the box will cycle through the three states.\n\n"
@@ -1756,16 +1746,16 @@ void ConfigMainWindow::showIntro(void)
                "options must be enabled to support the option you are interested in, you can\n"
                "still view the help of a grayed-out option.\n\n"
                "Toggling Show Debug Info under the Options menu will show the dependencies,\n"
-               "which you can then match by examining other options.\n\n");
+               "which you can then match by examining other options.\n\n";
 
        QMessageBox::information(this, "qconf", str);
 }
 
 void ConfigMainWindow::showAbout(void)
 {
-       static const QString str = _("qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n"
+       static const QString str = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n"
                "Copyright (C) 2015 Boris Barbulovski <bbarbulovski@gmail.com>.\n\n"
-               "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n");
+               "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n";
 
        QMessageBox::information(this, "qconf", str);
 }
@@ -1826,7 +1816,7 @@ static const char *progname;
 
 static void usage(void)
 {
-       printf(_("%s [-s] <config>\n").toLatin1().constData(), progname);
+       printf("%s [-s] <config>\n", progname);
        exit(0);
 }
 
@@ -1835,9 +1825,6 @@ int main(int ac, char** av)
        ConfigMainWindow* v;
        const char *name;
 
-       bindtextdomain(PACKAGE, LOCALEDIR);
-       textdomain(PACKAGE);
-
        progname = av[0];
        configApp = new QApplication(ac, av);
        if (ac > 1 && av[1][0] == '-') {
index a2e83ab17de3cc2c4c5a15f06b8c0f0eecc4ed99..4686531e2f8ce6fe88c375917724fb076bc8679e 100755 (executable)
@@ -165,10 +165,10 @@ sub read_kconfig {
     my $last_source = "";
 
     # Check for any environment variables used
-    while ($source =~ /\$(\w+)/ && $last_source ne $source) {
+    while ($source =~ /\$\((\w+)\)/ && $last_source ne $source) {
        my $env = $1;
        $last_source = $source;
-       $source =~ s/\$$env/$ENV{$env}/;
+       $source =~ s/\$\($env\)/$ENV{$env}/;
     }
 
     open(my $kinfile, '<', $source) || die "Can't open $kconfig";
index f0b2e3b3102d50f957af12db07e3d4235297dffe..703b9b899ee9c6fd0b2f2de9411d8be5b4413cbe 100644 (file)
@@ -33,33 +33,6 @@ struct symbol *sym_defconfig_list;
 struct symbol *modules_sym;
 tristate modules_val;
 
-struct expr *sym_env_list;
-
-static void sym_add_default(struct symbol *sym, const char *def)
-{
-       struct property *prop = prop_alloc(P_DEFAULT, sym);
-
-       prop->expr = expr_alloc_symbol(sym_lookup(def, SYMBOL_CONST));
-}
-
-void sym_init(void)
-{
-       struct symbol *sym;
-       struct utsname uts;
-       static bool inited = false;
-
-       if (inited)
-               return;
-       inited = true;
-
-       uname(&uts);
-
-       sym = sym_lookup("UNAME_RELEASE", 0);
-       sym->type = S_STRING;
-       sym->flags |= SYMBOL_AUTO;
-       sym_add_default(sym, uts.release);
-}
-
 enum symbol_type sym_get_type(struct symbol *sym)
 {
        enum symbol_type type = sym->type;
@@ -103,15 +76,6 @@ struct property *sym_get_choice_prop(struct symbol *sym)
        return NULL;
 }
 
-struct property *sym_get_env_prop(struct symbol *sym)
-{
-       struct property *prop;
-
-       for_all_properties(sym, prop, P_ENV)
-               return prop;
-       return NULL;
-}
-
 static struct property *sym_get_default_prop(struct symbol *sym)
 {
        struct property *prop;
@@ -490,7 +454,7 @@ void sym_calc_value(struct symbol *sym)
                }
        }
 
-       if (sym->flags & SYMBOL_AUTO)
+       if (sym->flags & SYMBOL_NO_WRITE)
                sym->flags &= ~SYMBOL_WRITE;
 
        if (sym->flags & SYMBOL_NEED_SET_CHOICE_VALUES)
@@ -906,59 +870,6 @@ struct symbol *sym_find(const char *name)
        return symbol;
 }
 
-/*
- * Expand symbol's names embedded in the string given in argument. Symbols'
- * name to be expanded shall be prefixed by a '$'. Unknown symbol expands to
- * the empty string.
- */
-char *sym_expand_string_value(const char *in)
-{
-       const char *src;
-       char *res;
-       size_t reslen;
-
-       /*
-        * Note: 'in' might come from a token that's about to be
-        * freed, so make sure to always allocate a new string
-        */
-       reslen = strlen(in) + 1;
-       res = xmalloc(reslen);
-       res[0] = '\0';
-
-       while ((src = strchr(in, '$'))) {
-               char *p, name[SYMBOL_MAXLENGTH];
-               const char *symval = "";
-               struct symbol *sym;
-               size_t newlen;
-
-               strncat(res, in, src - in);
-               src++;
-
-               p = name;
-               while (isalnum(*src) || *src == '_')
-                       *p++ = *src++;
-               *p = '\0';
-
-               sym = sym_find(name);
-               if (sym != NULL) {
-                       sym_calc_value(sym);
-                       symval = sym_get_string_value(sym);
-               }
-
-               newlen = strlen(res) + strlen(symval) + strlen(src) + 1;
-               if (newlen > reslen) {
-                       reslen = newlen;
-                       res = xrealloc(res, reslen);
-               }
-
-               strcat(res, symval);
-               in = src;
-       }
-       strcat(res, in);
-
-       return res;
-}
-
 const char *sym_escape_string_value(const char *in)
 {
        const char *p;
@@ -1100,7 +1011,7 @@ static struct dep_stack {
        struct dep_stack *prev, *next;
        struct symbol *sym;
        struct property *prop;
-       struct expr *expr;
+       struct expr **expr;
 } *check_top;
 
 static void dep_stack_insert(struct dep_stack *stack, struct symbol *sym)
@@ -1165,31 +1076,42 @@ static void sym_check_print_recursive(struct symbol *last_sym)
                        fprintf(stderr, "%s:%d:error: recursive dependency detected!\n",
                                prop->file->name, prop->lineno);
 
-               if (stack->expr) {
-                       fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n",
-                               prop->file->name, prop->lineno,
+               if (sym_is_choice(sym)) {
+                       fprintf(stderr, "%s:%d:\tchoice %s contains symbol %s\n",
+                               menu->file->name, menu->lineno,
                                sym->name ? sym->name : "<choice>",
-                               prop_get_type_name(prop->type),
                                next_sym->name ? next_sym->name : "<choice>");
-               } else if (stack->prop) {
+               } else if (sym_is_choice_value(sym)) {
+                       fprintf(stderr, "%s:%d:\tsymbol %s is part of choice %s\n",
+                               menu->file->name, menu->lineno,
+                               sym->name ? sym->name : "<choice>",
+                               next_sym->name ? next_sym->name : "<choice>");
+               } else if (stack->expr == &sym->dir_dep.expr) {
                        fprintf(stderr, "%s:%d:\tsymbol %s depends on %s\n",
                                prop->file->name, prop->lineno,
                                sym->name ? sym->name : "<choice>",
                                next_sym->name ? next_sym->name : "<choice>");
-               } else if (sym_is_choice(sym)) {
-                       fprintf(stderr, "%s:%d:\tchoice %s contains symbol %s\n",
-                               menu->file->name, menu->lineno,
+               } else if (stack->expr == &sym->rev_dep.expr) {
+                       fprintf(stderr, "%s:%d:\tsymbol %s is selected by %s\n",
+                               prop->file->name, prop->lineno,
                                sym->name ? sym->name : "<choice>",
                                next_sym->name ? next_sym->name : "<choice>");
-               } else if (sym_is_choice_value(sym)) {
-                       fprintf(stderr, "%s:%d:\tsymbol %s is part of choice %s\n",
-                               menu->file->name, menu->lineno,
+               } else if (stack->expr == &sym->implied.expr) {
+                       fprintf(stderr, "%s:%d:\tsymbol %s is implied by %s\n",
+                               prop->file->name, prop->lineno,
                                sym->name ? sym->name : "<choice>",
                                next_sym->name ? next_sym->name : "<choice>");
+               } else if (stack->expr) {
+                       fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n",
+                               prop->file->name, prop->lineno,
+                               sym->name ? sym->name : "<choice>",
+                               prop_get_type_name(prop->type),
+                               next_sym->name ? next_sym->name : "<choice>");
                } else {
-                       fprintf(stderr, "%s:%d:\tsymbol %s is selected by %s\n",
+                       fprintf(stderr, "%s:%d:\tsymbol %s %s is visible depending on %s\n",
                                prop->file->name, prop->lineno,
                                sym->name ? sym->name : "<choice>",
+                               prop_get_type_name(prop->type),
                                next_sym->name ? next_sym->name : "<choice>");
                }
        }
@@ -1246,12 +1168,26 @@ static struct symbol *sym_check_sym_deps(struct symbol *sym)
 
        dep_stack_insert(&stack, sym);
 
+       stack.expr = &sym->dir_dep.expr;
+       sym2 = sym_check_expr_deps(sym->dir_dep.expr);
+       if (sym2)
+               goto out;
+
+       stack.expr = &sym->rev_dep.expr;
        sym2 = sym_check_expr_deps(sym->rev_dep.expr);
        if (sym2)
                goto out;
 
+       stack.expr = &sym->implied.expr;
+       sym2 = sym_check_expr_deps(sym->implied.expr);
+       if (sym2)
+               goto out;
+
+       stack.expr = NULL;
+
        for (prop = sym->prop; prop; prop = prop->next) {
-               if (prop->type == P_CHOICE || prop->type == P_SELECT)
+               if (prop->type == P_CHOICE || prop->type == P_SELECT ||
+                   prop->type == P_IMPLY)
                        continue;
                stack.prop = prop;
                sym2 = sym_check_expr_deps(prop->visible.expr);
@@ -1259,7 +1195,7 @@ static struct symbol *sym_check_sym_deps(struct symbol *sym)
                        break;
                if (prop->type != P_DEFAULT || sym_is_choice(sym))
                        continue;
-               stack.expr = prop->expr;
+               stack.expr = &prop->expr;
                sym2 = sym_check_expr_deps(prop->expr);
                if (sym2)
                        break;
@@ -1337,9 +1273,6 @@ struct symbol *sym_check_deps(struct symbol *sym)
                sym->flags &= ~SYMBOL_CHECK;
        }
 
-       if (sym2 && sym2 == sym)
-               sym2 = NULL;
-
        return sym2;
 }
 
@@ -1378,8 +1311,6 @@ const char *prop_get_type_name(enum prop_type type)
        switch (type) {
        case P_PROMPT:
                return "prompt";
-       case P_ENV:
-               return "env";
        case P_COMMENT:
                return "comment";
        case P_MENU:
@@ -1401,32 +1332,3 @@ const char *prop_get_type_name(enum prop_type type)
        }
        return "unknown";
 }
-
-static void prop_add_env(const char *env)
-{
-       struct symbol *sym, *sym2;
-       struct property *prop;
-       char *p;
-
-       sym = current_entry->sym;
-       sym->flags |= SYMBOL_AUTO;
-       for_all_properties(sym, prop, P_ENV) {
-               sym2 = prop_get_symbol(prop);
-               if (strcmp(sym2->name, env))
-                       menu_warn(current_entry, "redefining environment symbol from %s",
-                                 sym2->name);
-               return;
-       }
-
-       prop = prop_alloc(P_ENV, sym);
-       prop->expr = expr_alloc_symbol(sym_lookup(env, SYMBOL_CONST));
-
-       sym_env_list = expr_alloc_one(E_LIST, sym_env_list);
-       sym_env_list->right.sym = sym;
-
-       p = getenv(env);
-       if (p)
-               sym_add_default(sym, p);
-       else
-               menu_warn(current_entry, "environment variable %s undefined", env);
-}
diff --git a/scripts/kconfig/tests/err_recursive_dep/Kconfig b/scripts/kconfig/tests/err_recursive_dep/Kconfig
new file mode 100644 (file)
index 0000000..ebdb3ff
--- /dev/null
@@ -0,0 +1,63 @@
+# SPDX-License-Identifier: GPL-2.0
+
+# depends on itself
+
+config A
+       bool "A"
+       depends on A
+
+# select itself
+
+config B
+       bool
+       select B
+
+# depends on each other
+
+config C1
+       bool "C1"
+       depends on C2
+
+config C2
+       bool "C2"
+       depends on C1
+
+# depends on and select
+
+config D1
+       bool "D1"
+       depends on D2
+       select D2
+
+config D2
+       bool
+
+# depends on and imply
+
+config E1
+       bool "E1"
+       depends on E2
+       imply E2
+
+config E2
+       bool "E2"
+
+# property
+
+config F1
+       bool "F1"
+       default F2
+
+config F2
+       bool "F2"
+       depends on F1
+
+# menu
+
+menu "menu depending on its content"
+       depends on G
+
+config G
+       bool "G"
+
+endmenu
diff --git a/scripts/kconfig/tests/err_recursive_dep/__init__.py b/scripts/kconfig/tests/err_recursive_dep/__init__.py
new file mode 100644 (file)
index 0000000..5f3821b
--- /dev/null
@@ -0,0 +1,10 @@
+# SPDX-License-Identifier: GPL-2.0
+"""
+Detect recursive dependency error.
+
+Recursive dependency should be treated as an error.
+"""
+
+def test(conf):
+    assert conf.oldaskconfig() == 1
+    assert conf.stderr_contains('expected_stderr')
diff --git a/scripts/kconfig/tests/err_recursive_dep/expected_stderr b/scripts/kconfig/tests/err_recursive_dep/expected_stderr
new file mode 100644 (file)
index 0000000..84679b1
--- /dev/null
@@ -0,0 +1,38 @@
+Kconfig:11:error: recursive dependency detected!
+Kconfig:11:    symbol B is selected by B
+For a resolution refer to Documentation/kbuild/kconfig-language.txt
+subsection "Kconfig recursive dependency limitations"
+
+Kconfig:5:error: recursive dependency detected!
+Kconfig:5:     symbol A depends on A
+For a resolution refer to Documentation/kbuild/kconfig-language.txt
+subsection "Kconfig recursive dependency limitations"
+
+Kconfig:17:error: recursive dependency detected!
+Kconfig:17:    symbol C1 depends on C2
+Kconfig:21:    symbol C2 depends on C1
+For a resolution refer to Documentation/kbuild/kconfig-language.txt
+subsection "Kconfig recursive dependency limitations"
+
+Kconfig:32:error: recursive dependency detected!
+Kconfig:32:    symbol D2 is selected by D1
+Kconfig:27:    symbol D1 depends on D2
+For a resolution refer to Documentation/kbuild/kconfig-language.txt
+subsection "Kconfig recursive dependency limitations"
+
+Kconfig:37:error: recursive dependency detected!
+Kconfig:37:    symbol E1 depends on E2
+Kconfig:42:    symbol E2 is implied by E1
+For a resolution refer to Documentation/kbuild/kconfig-language.txt
+subsection "Kconfig recursive dependency limitations"
+
+Kconfig:60:error: recursive dependency detected!
+Kconfig:60:    symbol G depends on G
+For a resolution refer to Documentation/kbuild/kconfig-language.txt
+subsection "Kconfig recursive dependency limitations"
+
+Kconfig:51:error: recursive dependency detected!
+Kconfig:51:    symbol F2 depends on F1
+Kconfig:49:    symbol F1 default value contains F2
+For a resolution refer to Documentation/kbuild/kconfig-language.txt
+subsection "Kconfig recursive dependency limitations"
index 0d15e41da47558d6fe862e27206dcc2b44775ede..473228810c356e7ae969e49da963c3b30056ea56 100644 (file)
@@ -1,5 +1,5 @@
 #
 # Automatically generated file; DO NOT EDIT.
-# Linux Kernel Configuration
+# Main menu
 #
 # CONFIG_A is not set
diff --git a/scripts/kconfig/tests/warn_recursive_dep/Kconfig b/scripts/kconfig/tests/warn_recursive_dep/Kconfig
deleted file mode 100644 (file)
index a65bfcb..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-# depends on itself
-
-config A
-       bool "A"
-       depends on A
-
-# select itself
-
-config B
-       bool
-       select B
-
-# depends on each other
-
-config C1
-       bool "C1"
-       depends on C2
-
-config C2
-       bool "C2"
-       depends on C1
-
-# depends on and select
-
-config D1
-       bool "D1"
-       depends on D2
-       select D2
-
-config D2
-       bool
-
-# depends on and imply
-# This is not recursive dependency
-
-config E1
-       bool "E1"
-       depends on E2
-       imply E2
-
-config E2
-       bool "E2"
-
-# property
-
-config F1
-       bool "F1"
-       default F2
-
-config F2
-       bool "F2"
-       depends on F1
-
-# menu
-
-menu "menu depending on its content"
-       depends on G
-
-config G
-       bool "G"
-
-endmenu
diff --git a/scripts/kconfig/tests/warn_recursive_dep/__init__.py b/scripts/kconfig/tests/warn_recursive_dep/__init__.py
deleted file mode 100644 (file)
index adb2195..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-"""
-Warn recursive inclusion.
-
-Recursive dependency should be warned.
-"""
-
-def test(conf):
-    assert conf.oldaskconfig() == 0
-    assert conf.stderr_contains('expected_stderr')
diff --git a/scripts/kconfig/tests/warn_recursive_dep/expected_stderr b/scripts/kconfig/tests/warn_recursive_dep/expected_stderr
deleted file mode 100644 (file)
index 3de807d..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-Kconfig:9:error: recursive dependency detected!
-Kconfig:9:     symbol B is selected by B
-For a resolution refer to Documentation/kbuild/kconfig-language.txt
-subsection "Kconfig recursive dependency limitations"
-
-Kconfig:3:error: recursive dependency detected!
-Kconfig:3:     symbol A depends on A
-For a resolution refer to Documentation/kbuild/kconfig-language.txt
-subsection "Kconfig recursive dependency limitations"
-
-Kconfig:15:error: recursive dependency detected!
-Kconfig:15:    symbol C1 depends on C2
-Kconfig:19:    symbol C2 depends on C1
-For a resolution refer to Documentation/kbuild/kconfig-language.txt
-subsection "Kconfig recursive dependency limitations"
-
-Kconfig:30:error: recursive dependency detected!
-Kconfig:30:    symbol D2 is selected by D1
-Kconfig:25:    symbol D1 depends on D2
-For a resolution refer to Documentation/kbuild/kconfig-language.txt
-subsection "Kconfig recursive dependency limitations"
-
-Kconfig:59:error: recursive dependency detected!
-Kconfig:59:    symbol G depends on G
-For a resolution refer to Documentation/kbuild/kconfig-language.txt
-subsection "Kconfig recursive dependency limitations"
-
-Kconfig:50:error: recursive dependency detected!
-Kconfig:50:    symbol F2 depends on F1
-Kconfig:48:    symbol F1 default value contains F2
index c6f6e21b809ffe7a6f60acd2a7f016ee88971d5c..d999683bb2a778ae05841531abad3fc3e323d4a0 100644 (file)
 struct file *file_lookup(const char *name)
 {
        struct file *file;
-       char *file_name = sym_expand_string_value(name);
 
        for (file = file_list; file; file = file->next) {
                if (!strcmp(name, file->name)) {
-                       free(file_name);
                        return file;
                }
        }
 
        file = xmalloc(sizeof(*file));
        memset(file, 0, sizeof(*file));
-       file->name = file_name;
+       file->name = xstrdup(name);
        file->next = file_list;
        file_list = file;
        return file;
 }
 
-/* write a dependency file as used by kbuild to track dependencies */
-int file_write_dep(const char *name)
-{
-       struct symbol *sym, *env_sym;
-       struct expr *e;
-       struct file *file;
-       FILE *out;
-
-       if (!name)
-               name = ".kconfig.d";
-       out = fopen("..config.tmp", "w");
-       if (!out)
-               return 1;
-       fprintf(out, "deps_config := \\\n");
-       for (file = file_list; file; file = file->next) {
-               if (file->next)
-                       fprintf(out, "\t%s \\\n", file->name);
-               else
-                       fprintf(out, "\t%s\n", file->name);
-       }
-       fprintf(out, "\n%s: \\\n"
-                    "\t$(deps_config)\n\n", conf_get_autoconfig_name());
-
-       expr_list_for_each_sym(sym_env_list, e, sym) {
-               struct property *prop;
-               const char *value;
-
-               prop = sym_get_env_prop(sym);
-               env_sym = prop_get_symbol(prop);
-               if (!env_sym)
-                       continue;
-               value = getenv(env_sym->name);
-               if (!value)
-                       value = "";
-               fprintf(out, "ifneq \"$(%s)\" \"%s\"\n", env_sym->name, value);
-               fprintf(out, "%s: FORCE\n", conf_get_autoconfig_name());
-               fprintf(out, "endif\n");
-       }
-
-       fprintf(out, "\n$(deps_config): ;\n");
-       fclose(out);
-       rename("..config.tmp", name);
-       return 0;
-}
-
-
 /* Allocate initial growable string */
 struct gstr str_new(void)
 {
@@ -165,3 +117,14 @@ char *xstrdup(const char *s)
        fprintf(stderr, "Out of memory.\n");
        exit(1);
 }
+
+char *xstrndup(const char *s, size_t n)
+{
+       char *p;
+
+       p = strndup(s, n);
+       if (p)
+               return p;
+       fprintf(stderr, "Out of memory.\n");
+       exit(1);
+}
index 045093d827e11640c67fdb2c3ca4bb85734d2a7e..25bd2b89fe3f3b8d588cad2c72b3cc9b3ebae2cb 100644 (file)
@@ -1,13 +1,13 @@
 %option nostdinit noyywrap never-interactive full ecs
 %option 8bit nodefault yylineno
-%option noinput
-%x COMMAND HELP STRING PARAM
+%x COMMAND HELP STRING PARAM ASSIGN_VAL
 %{
 /*
  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
  * Released under the terms of the GNU GPL v2.0.
  */
 
+#include <assert.h>
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -35,6 +35,8 @@ struct buffer *current_buf;
 
 static int last_ts, first_ts;
 
+static char *expand_token(const char *in, size_t n);
+static void append_expanded_string(const char *in);
 static void zconf_endhelp(void);
 static void zconf_endfile(void);
 
@@ -101,17 +103,28 @@ n [A-Za-z0-9_-]
 <COMMAND>{
        {n}+    {
                const struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
-               BEGIN(PARAM);
                current_pos.file = current_file;
                current_pos.lineno = yylineno;
                if (id && id->flags & TF_COMMAND) {
+                       BEGIN(PARAM);
                        yylval.id = id;
                        return id->token;
                }
                alloc_string(yytext, yyleng);
                yylval.string = text;
-               return T_WORD;
+               return T_VARIABLE;
        }
+       ({n}|$)+        {
+               /* this token includes at least one '$' */
+               yylval.string = expand_token(yytext, yyleng);
+               if (strlen(yylval.string))
+                       return T_VARIABLE;
+               free(yylval.string);
+       }
+       "="     { BEGIN(ASSIGN_VAL); yylval.flavor = VAR_RECURSIVE; return T_ASSIGN; }
+       ":="    { BEGIN(ASSIGN_VAL); yylval.flavor = VAR_SIMPLE; return T_ASSIGN; }
+       "+="    { BEGIN(ASSIGN_VAL); yylval.flavor = VAR_APPEND; return T_ASSIGN; }
+       [[:blank:]]+
        .       warn_ignored_character(*yytext);
        \n      {
                BEGIN(INITIAL);
@@ -119,6 +132,16 @@ n  [A-Za-z0-9_-]
        }
 }
 
+<ASSIGN_VAL>{
+       [^[:blank:]\n]+.*       {
+               alloc_string(yytext, yyleng);
+               yylval.string = text;
+               return T_ASSIGN_VAL;
+       }
+       \n      { BEGIN(INITIAL); return T_EOL; }
+       .
+}
+
 <PARAM>{
        "&&"    return T_AND;
        "||"    return T_OR;
@@ -147,6 +170,13 @@ n  [A-Za-z0-9_-]
                yylval.string = text;
                return T_WORD;
        }
+       ({n}|[/.$])+    {
+               /* this token includes at least one '$' */
+               yylval.string = expand_token(yytext, yyleng);
+               if (strlen(yylval.string))
+                       return T_WORD;
+               free(yylval.string);
+       }
        #.*     /* comment */
        \\\n    ;
        [[:blank:]]+
@@ -157,12 +187,13 @@ n [A-Za-z0-9_-]
 }
 
 <STRING>{
-       [^'"\\\n]+/\n   {
+       "$".*   append_expanded_string(yytext);
+       [^$'"\\\n]+/\n  {
                append_string(yytext, yyleng);
                yylval.string = text;
                return T_WORD_QUOTE;
        }
-       [^'"\\\n]+      {
+       [^$'"\\\n]+     {
                append_string(yytext, yyleng);
        }
        \\.?/\n {
@@ -249,6 +280,58 @@ n  [A-Za-z0-9_-]
 }
 
 %%
+static char *expand_token(const char *in, size_t n)
+{
+       char *out;
+       int c;
+       char c2;
+       const char *rest, *end;
+
+       new_string();
+       append_string(in, n);
+
+       /* get the whole line because we do not know the end of token. */
+       while ((c = input()) != EOF) {
+               if (c == '\n') {
+                       unput(c);
+                       break;
+               }
+               c2 = c;
+               append_string(&c2, 1);
+       }
+
+       rest = text;
+       out = expand_one_token(&rest);
+
+       /* push back unused characters to the input stream */
+       end = rest + strlen(rest);
+       while (end > rest)
+               unput(*--end);
+
+       free(text);
+
+       return out;
+}
+
+static void append_expanded_string(const char *str)
+{
+       const char *end;
+       char *res;
+
+       str++;
+
+       res = expand_dollar(&str);
+
+       /* push back unused characters to the input stream */
+       end = str + strlen(str);
+       while (end > str)
+               unput(*--end);
+
+       append_string(res, strlen(res));
+
+       free(res);
+}
+
 void zconf_starthelp(void)
 {
        new_string();
index ad6305b0f40cb962edf922ae73639c75b63c60c0..22fceb264cf51b6972c7d09357265d416c4157a5 100644 (file)
@@ -31,7 +31,7 @@ struct symbol *symbol_hash[SYMBOL_HASHSIZE];
 static struct menu *current_menu, *current_entry;
 
 %}
-%expect 32
+%expect 30
 
 %union
 {
@@ -41,6 +41,7 @@ static struct menu *current_menu, *current_entry;
        struct expr *expr;
        struct menu *menu;
        const struct kconf_id *id;
+       enum variable_flavor flavor;
 }
 
 %token <id>T_MAINMENU
@@ -77,6 +78,9 @@ static struct menu *current_menu, *current_entry;
 %token T_CLOSE_PAREN
 %token T_OPEN_PAREN
 %token T_EOL
+%token <string> T_VARIABLE
+%token <flavor> T_ASSIGN
+%token <string> T_ASSIGN_VAL
 
 %left T_OR
 %left T_AND
@@ -92,7 +96,7 @@ static struct menu *current_menu, *current_entry;
 %type <id> end
 %type <id> option_name
 %type <menu> if_entry menu_entry choice_entry
-%type <string> symbol_option_arg word_opt
+%type <string> symbol_option_arg word_opt assign_val
 
 %destructor {
        fprintf(stderr, "%s:%d: missing end statement for this entry\n",
@@ -109,28 +113,15 @@ static struct menu *current_menu, *current_entry;
 %%
 input: nl start | start;
 
-start: mainmenu_stmt stmt_list | no_mainmenu_stmt stmt_list;
+start: mainmenu_stmt stmt_list | stmt_list;
 
 /* mainmenu entry */
 
-mainmenu_stmt: T_MAINMENU prompt nl
+mainmenu_stmt: T_MAINMENU prompt T_EOL
 {
        menu_add_prompt(P_MENU, $2, NULL);
 };
 
-/* Default main menu, if there's no mainmenu entry */
-
-no_mainmenu_stmt: /* empty */
-{
-       /*
-        * Hack: Keep the main menu title on the heap so we can safely free it
-        * later regardless of whether it comes from the 'prompt' in
-        * mainmenu_stmt or here
-        */
-       menu_add_prompt(P_MENU, xstrdup("Linux Kernel Configuration"), NULL);
-};
-
-
 stmt_list:
          /* empty */
        | stmt_list common_stmt
@@ -156,6 +147,7 @@ common_stmt:
        | config_stmt
        | menuconfig_stmt
        | source_stmt
+       | assignment_stmt
 ;
 
 option_error:
@@ -273,7 +265,7 @@ symbol_option_arg:
 choice: T_CHOICE word_opt T_EOL
 {
        struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
-       sym->flags |= SYMBOL_AUTO;
+       sym->flags |= SYMBOL_NO_WRITE;
        menu_add_entry(sym);
        menu_add_expr(P_CHOICE, NULL, NULL);
        free($2);
@@ -345,7 +337,7 @@ choice_block:
 
 /* if entry */
 
-if_entry: T_IF expr nl
+if_entry: T_IF expr T_EOL
 {
        printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
        menu_add_entry(NULL);
@@ -524,31 +516,42 @@ symbol:     nonconst_symbol
 word_opt: /* empty */                  { $$ = NULL; }
        | T_WORD
 
+/* assignment statement */
+
+assignment_stmt:  T_VARIABLE T_ASSIGN assign_val T_EOL { variable_add($1, $3, $2); free($1); free($3); }
+
+assign_val:
+       /* empty */             { $$ = xstrdup(""); };
+       | T_ASSIGN_VAL
+;
+
 %%
 
 void conf_parse(const char *name)
 {
-       const char *tmp;
        struct symbol *sym;
        int i;
 
        zconf_initscan(name);
 
-       sym_init();
        _menu_init();
 
        if (getenv("ZCONF_DEBUG"))
                yydebug = 1;
        yyparse();
+
+       /* Variables are expanded in the parse phase. We can free them here. */
+       variable_all_del();
+
        if (yynerrs)
                exit(1);
        if (!modules_sym)
                modules_sym = sym_find( "n" );
 
-       tmp = rootmenu.prompt->text;
-       rootmenu.prompt->text = _(rootmenu.prompt->text);
-       rootmenu.prompt->text = sym_expand_string_value(rootmenu.prompt->text);
-       free((char*)tmp);
+       if (!menu_has_prompt(&rootmenu)) {
+               current_entry = &rootmenu;
+               menu_add_prompt(P_MENU, "Main menu", NULL);
+       }
 
        menu_finalize(&rootmenu);
        for_all_symbols(i, sym) {
@@ -714,6 +717,10 @@ static void print_symbol(FILE *out, struct menu *menu)
                        print_quoted_string(out, prop->text);
                        fputc('\n', out);
                        break;
+               case P_SYMBOL:
+                       fputs( "  symbol ", out);
+                       fprintf(out, "%s\n", prop->sym->name);
+                       break;
                default:
                        fprintf(out, "  unknown prop %d!\n", prop->type);
                        break;
@@ -780,3 +787,4 @@ void zconfdump(FILE *out)
 #include "expr.c"
 #include "symbol.c"
 #include "menu.c"
+#include "preprocess.c"
index cb51b4672102dc61c01a91bd001e77ae945dd498..0157e0b060adcb71baffbf0a6af3ca3969e7a5bd 100644 (file)
@@ -28,6 +28,16 @@ config UT_LIB_ASN1
          Enables a test which exercises asn1 compiler and decoder function
          via various parsers.
 
+config UT_LIB_RSA
+       bool "Unit test for rsa_verify() function"
+       depends on RSA
+       depends on RSA_VERIFY_WITH_PKEY
+       select IMAGE_SIGN_INFO
+       default y
+       help
+         Enables rsa_verify() test, currently rsa_verify_with_pkey only()
+         only, at the 'ut lib' command.
+
 endif
 
 config UT_TIME
index 230068d5a0019b806d5da0fc4528bc0c0570ae24..ce9ae4a9bed9c0211596934cf19c9c12b9633bce 100644 (file)
@@ -8,4 +8,5 @@ obj-y += lmb.o
 obj-y += string.o
 obj-$(CONFIG_ERRNO_STR) += test_errno_str.o
 obj-$(CONFIG_UT_LIB_ASN1) += asn1.o
+obj-$(CONFIG_UT_LIB_RSA) += rsa.o
 obj-$(CONFIG_AES) += test_aes.o
diff --git a/test/lib/rsa.c b/test/lib/rsa.c
new file mode 100644 (file)
index 0000000..44f8ade
--- /dev/null
@@ -0,0 +1,206 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2019 Linaro Limited
+ * Author: AKASHI Takahiro
+ *
+ * Unit test for rsa_verify() function
+ */
+
+#include <common.h>
+#include <command.h>
+#include <image.h>
+#include <test/lib.h>
+#include <test/test.h>
+#include <test/ut.h>
+#include <u-boot/rsa.h>
+
+#ifdef CONFIG_RSA_VERIFY_WITH_PKEY
+/*
+ * openssl genrsa 2048 -out private.pem
+ * openssl rsa -in private.pem -pubout -outform der -out public.der
+ * dd if=public.der of=public.raw bs=24 skip=1
+ */
+static unsigned char public_key[] = {
+       0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xca, 0x25, 0x23,
+       0xe0, 0x0a, 0x4d, 0x8f, 0x56, 0xfc, 0xc9, 0x06, 0x4c, 0xcc, 0x94, 0x43,
+       0xe0, 0x56, 0x44, 0x6e, 0x37, 0x54, 0x87, 0x12, 0x84, 0xf9, 0x07, 0x4f,
+       0xe4, 0x23, 0x40, 0xc3, 0x43, 0x84, 0x37, 0x86, 0xd3, 0x9d, 0x95, 0x1c,
+       0xe4, 0x8a, 0x66, 0x02, 0x09, 0xe2, 0x3d, 0xce, 0x2c, 0xc6, 0x02, 0x6a,
+       0xd4, 0x65, 0x61, 0xff, 0x85, 0x6f, 0x88, 0x63, 0xba, 0x31, 0x62, 0x1e,
+       0xb7, 0x95, 0xe9, 0x08, 0x3c, 0xe9, 0x35, 0xde, 0xfd, 0x65, 0x92, 0xb8,
+       0x9e, 0x71, 0xa4, 0xcd, 0x47, 0xfd, 0x04, 0x26, 0xb9, 0x78, 0xbf, 0x05,
+       0x0d, 0xfc, 0x00, 0x84, 0x08, 0xfc, 0xc4, 0x4b, 0xea, 0xf5, 0x97, 0x68,
+       0x0d, 0x97, 0xd7, 0xff, 0x4f, 0x92, 0x82, 0xd7, 0xbb, 0xef, 0xb7, 0x67,
+       0x8e, 0x72, 0x54, 0xe8, 0xc5, 0x9e, 0xfd, 0xd8, 0x38, 0xe9, 0xbe, 0x19,
+       0x37, 0x5b, 0x36, 0x8b, 0xbf, 0x49, 0xa1, 0x59, 0x3a, 0x9d, 0xad, 0x92,
+       0x08, 0x0b, 0xe3, 0xa4, 0xa4, 0x7d, 0xd3, 0x70, 0xc0, 0xb8, 0xfb, 0xc7,
+       0xda, 0xd3, 0x19, 0x86, 0x37, 0x9a, 0xcd, 0xab, 0x30, 0x96, 0xab, 0xa4,
+       0xa2, 0x31, 0xa0, 0x38, 0xfb, 0xbf, 0x85, 0xd3, 0x24, 0x39, 0xed, 0xbf,
+       0xe1, 0x31, 0xed, 0x6c, 0x39, 0xc1, 0xe5, 0x05, 0x2e, 0x12, 0x30, 0x36,
+       0x73, 0x5d, 0x62, 0xf3, 0x82, 0xaf, 0x38, 0xc8, 0xca, 0xfa, 0xa1, 0x99,
+       0x57, 0x3c, 0xe1, 0xc1, 0x7b, 0x05, 0x0b, 0xcc, 0x2e, 0xa9, 0x10, 0xc8,
+       0x68, 0xbd, 0x27, 0xb6, 0x19, 0x9c, 0xd2, 0xad, 0xb3, 0x1f, 0xca, 0x35,
+       0x6e, 0x84, 0x23, 0xa1, 0xe9, 0xa4, 0x4c, 0xab, 0x19, 0x09, 0x79, 0x6e,
+       0x3c, 0x7b, 0x74, 0xfc, 0x33, 0x05, 0xcf, 0xa4, 0x2e, 0xeb, 0x55, 0x60,
+       0x05, 0xc7, 0xcf, 0x3f, 0x92, 0xac, 0x2d, 0x69, 0x0b, 0x19, 0x16, 0x79,
+       0x75, 0x02, 0x03, 0x01, 0x00, 0x01
+};
+
+static unsigned int public_key_len = 270;
+
+/*
+ * dd if=/dev/urandom of=data.raw bs=512 count=1
+ */
+static unsigned char data_raw[] = {
+       0x3e, 0x48, 0x6e, 0xef, 0x83, 0xd1, 0x4c, 0xfd, 0x92, 0x47, 0x92, 0xd7,
+       0xf6, 0x16, 0x25, 0x0a, 0xdf, 0xe2, 0xb6, 0x6c, 0xe7, 0xe0, 0x55, 0xb2,
+       0x70, 0x66, 0xf0, 0xe5, 0xdc, 0xaf, 0xd3, 0x2e, 0xc1, 0x3e, 0x5c, 0x4b,
+       0xb5, 0xa7, 0x23, 0x1f, 0x2c, 0xce, 0xf8, 0x83, 0x00, 0x6d, 0xeb, 0xdd,
+       0x19, 0x71, 0x13, 0xb4, 0xae, 0x5c, 0xa8, 0xae, 0x52, 0xc8, 0xe1, 0x77,
+       0x9e, 0x98, 0x75, 0xbc, 0xef, 0x36, 0x9f, 0x0c, 0x14, 0xed, 0x1a, 0x0a,
+       0x4f, 0x6c, 0xa4, 0xb1, 0xbb, 0x0e, 0x43, 0x93, 0x12, 0xfc, 0x2e, 0x82,
+       0x93, 0x4e, 0xcb, 0xa2, 0xcd, 0x59, 0x3f, 0xc5, 0x11, 0x38, 0x3a, 0x88,
+       0xc3, 0xcf, 0xf9, 0x61, 0xa8, 0x9e, 0x96, 0xb6, 0xbf, 0xa6, 0x5b, 0x0d,
+       0xd9, 0xbd, 0x05, 0x4c, 0xbe, 0xed, 0x86, 0xca, 0x10, 0x63, 0x72, 0x75,
+       0x4b, 0xbd, 0x86, 0x42, 0x30, 0x9d, 0x54, 0x4e, 0x12, 0xda, 0xf4, 0xb4,
+       0xfd, 0xd9, 0x54, 0x95, 0x8f, 0x83, 0xc2, 0x63, 0x44, 0xdd, 0x96, 0x1a,
+       0xd0, 0x7c, 0xcf, 0xcb, 0x16, 0xd6, 0xff, 0xa3, 0xbb, 0xeb, 0x24, 0x06,
+       0xbf, 0x81, 0xd0, 0x29, 0x76, 0x19, 0x66, 0x84, 0xfc, 0x49, 0xde, 0x7b,
+       0x5d, 0xd2, 0x27, 0x58, 0x21, 0x7b, 0xff, 0x4d, 0x64, 0xf3, 0x89, 0xe3,
+       0xea, 0xb6, 0x54, 0x4e, 0xb1, 0x62, 0x52, 0x89, 0xe3, 0x22, 0xf2, 0x26,
+       0x3e, 0x4f, 0x43, 0x58, 0x78, 0x91, 0x55, 0xbc, 0x1e, 0xd6, 0x97, 0xfc,
+       0x0b, 0x85, 0x4c, 0x92, 0x9c, 0xbf, 0xc4, 0xb1, 0x62, 0x93, 0x27, 0xa9,
+       0xb2, 0xf4, 0xb4, 0x7a, 0xfb, 0x56, 0xe5, 0x8f, 0xe1, 0x94, 0x4d, 0xfd,
+       0xe4, 0x72, 0x8d, 0xa9, 0x71, 0x65, 0xcb, 0x2e, 0x6d, 0x39, 0xd5, 0x95,
+       0xe7, 0x3f, 0xab, 0xaa, 0x7a, 0x74, 0x84, 0x25, 0x4b, 0x42, 0x1e, 0xd3,
+       0x86, 0xca, 0x47, 0x4a, 0xf0, 0x24, 0x81, 0x24, 0xb0, 0xe1, 0xbb, 0x6c,
+       0x3f, 0x2a, 0xa0, 0xb8, 0xeb, 0xd6, 0x01, 0xce, 0x63, 0x51, 0xe1, 0x81,
+       0xd2, 0x32, 0x43, 0x56, 0x44, 0x4a, 0x6b, 0x51, 0x24, 0xa2, 0xc7, 0x39,
+       0x7c, 0x54, 0xda, 0xf8, 0xd4, 0x93, 0x7c, 0x8e, 0x4e, 0x9d, 0x15, 0x08,
+       0xce, 0x27, 0xd8, 0x28, 0xb0, 0x5b, 0x75, 0x32, 0x43, 0xe8, 0xd6, 0xbf,
+       0x12, 0xd5, 0xc5, 0x12, 0x8e, 0xeb, 0x77, 0x8f, 0x00, 0xde, 0x45, 0x1e,
+       0xdd, 0xf3, 0xef, 0x43, 0x99, 0x79, 0x86, 0xea, 0x01, 0xce, 0xf2, 0x4d,
+       0xa0, 0xfe, 0x5a, 0x55, 0xc0, 0x1f, 0xce, 0xe8, 0xbe, 0xc2, 0x66, 0xdb,
+       0xcb, 0x3f, 0xa5, 0x48, 0xa1, 0xe2, 0x49, 0xa1, 0x29, 0x65, 0x5b, 0x62,
+       0x39, 0xcc, 0xef, 0xbe, 0x86, 0xb7, 0xe3, 0x44, 0x67, 0x04, 0x04, 0xb1,
+       0xec, 0xd8, 0xb2, 0xb2, 0x38, 0xbc, 0x10, 0xea, 0x7a, 0x0e, 0xa4, 0xa4,
+       0xcb, 0x21, 0xd9, 0xc7, 0xb4, 0x0b, 0xb8, 0x39, 0xb4, 0x07, 0x53, 0x3f,
+       0xb9, 0x55, 0x55, 0xa1, 0x6f, 0x11, 0x49, 0xc0, 0x94, 0x77, 0xaf, 0x76,
+       0x97, 0x7f, 0x31, 0x08, 0xdd, 0x72, 0x48, 0x72, 0xf8, 0x11, 0x4f, 0x69,
+       0x10, 0xef, 0x23, 0x06, 0xf3, 0x34, 0xac, 0xee, 0x97, 0x89, 0x41, 0x1c,
+       0x36, 0x38, 0xb1, 0x80, 0x96, 0x7a, 0x9e, 0x72, 0xab, 0x25, 0xeb, 0xce,
+       0x7b, 0xb8, 0x5d, 0xc8, 0xef, 0xa4, 0x73, 0xa1, 0xa6, 0x8f, 0x01, 0x54,
+       0xce, 0x58, 0x19, 0xe5, 0x7e, 0xfa, 0x77, 0x08, 0x9d, 0x53, 0xc1, 0xcc,
+       0x08, 0xe8, 0x1d, 0xe0, 0x82, 0x5e, 0xe1, 0xe6, 0xbd, 0xbb, 0x59, 0x7e,
+       0x12, 0x9c, 0x39, 0x60, 0x23, 0xf7, 0xbe, 0x0a, 0x7c, 0x48, 0x12, 0xa0,
+       0x84, 0x04, 0x3f, 0xa1, 0x6e, 0x92, 0xcd, 0xa0, 0xac, 0xee, 0x0b, 0xbc,
+       0x18, 0x30, 0x28, 0xbd, 0xf5, 0xfa, 0x3a, 0x35
+};
+
+static unsigned int data_raw_len = 512;
+
+/*
+ * openssl dgst -sha256 -sign private.key -out data.enc data.raw
+ */
+unsigned char data_enc[] = {
+       0xa7, 0x4a, 0x12, 0x8f, 0xee, 0x65, 0x4b, 0xcd, 0x88, 0xca, 0x4d, 0xed,
+       0xe3, 0x04, 0xe7, 0x7c, 0x59, 0xbf, 0x2f, 0xad, 0x95, 0x73, 0x5b, 0x2c,
+       0x4e, 0xb5, 0xda, 0x5e, 0x3a, 0x6d, 0xb4, 0xc5, 0x84, 0x0c, 0xd2, 0x4a,
+       0x62, 0x0d, 0x5f, 0xba, 0x10, 0xee, 0xb1, 0x2a, 0xe1, 0xfe, 0x50, 0x18,
+       0x97, 0xcc, 0xea, 0x26, 0x62, 0x33, 0x5a, 0x1d, 0x51, 0x38, 0x52, 0x89,
+       0x4d, 0xa7, 0x18, 0xff, 0xa6, 0xc8, 0xd4, 0x7a, 0xc0, 0xa6, 0x22, 0xdf,
+       0x41, 0x89, 0x93, 0x9b, 0xe7, 0x9e, 0xc1, 0xc8, 0x80, 0xda, 0x1a, 0x3f,
+       0xa4, 0x7a, 0xd0, 0x07, 0xcb, 0x5c, 0xa4, 0x75, 0x12, 0x54, 0x78, 0x67,
+       0xbf, 0xe6, 0xae, 0x1e, 0x56, 0x33, 0x9e, 0xe0, 0x6e, 0x33, 0xa7, 0x58,
+       0xb0, 0x47, 0x49, 0xa8, 0x37, 0xdb, 0x82, 0x4b, 0xbd, 0x32, 0x9c, 0xdc,
+       0xf4, 0x67, 0x17, 0x24, 0x55, 0xfd, 0x83, 0x1e, 0xc8, 0xb4, 0x5c, 0xf9,
+       0x15, 0x6c, 0x5e, 0xaa, 0x72, 0x03, 0x9e, 0x7c, 0x17, 0xf5, 0x7c, 0x37,
+       0x96, 0x00, 0xb0, 0xd8, 0xaa, 0x05, 0xfa, 0xaa, 0xa1, 0x78, 0x77, 0xd5,
+       0x09, 0xdd, 0x05, 0xc7, 0xe2, 0x9f, 0x68, 0xc7, 0xf8, 0xfb, 0x0b, 0x6f,
+       0x18, 0x1e, 0xcc, 0x93, 0xd3, 0x3f, 0xc9, 0x26, 0x29, 0x64, 0xe7, 0x15,
+       0xdc, 0xb8, 0x19, 0x10, 0x24, 0x55, 0x55, 0x3b, 0x79, 0xa1, 0x65, 0x12,
+       0xe0, 0x0b, 0x88, 0x44, 0x4c, 0xea, 0x85, 0x5a, 0x6b, 0x2d, 0x45, 0x6e,
+       0xe7, 0x83, 0x6f, 0x3a, 0xaa, 0x1e, 0xf1, 0x9c, 0x8f, 0xdc, 0xb9, 0x37,
+       0xa2, 0x15, 0x61, 0x93, 0x06, 0x23, 0xf5, 0xfe, 0xf0, 0xf8, 0x2b, 0xf7,
+       0xc0, 0x68, 0x67, 0xf6, 0x4e, 0x08, 0x0d, 0x0d, 0x08, 0xbe, 0xfb, 0x2c,
+       0x4c, 0xe7, 0xd7, 0x1a, 0xad, 0xd9, 0x98, 0xa1, 0x8d, 0x94, 0x1c, 0xd1,
+       0x89, 0x06, 0xc9, 0x3a
+};
+
+static unsigned int data_enc_len = 256;
+
+/**
+ * lib_rsa_verify_valid() - unit test for rsa_verify()
+ *
+ * Test rsa_verify() with valid hash
+ *
+ * @uts:       unit test state
+ * Return:     0 = success, 1 = failure
+ */
+static int lib_rsa_verify_valid(struct unit_test_state *uts)
+{
+       struct image_sign_info info;
+       struct image_region reg;
+       int ret;
+
+       memset(&info, '\0', sizeof(info));
+       info.name = "sha256,rsa2048";
+       info.padding = image_get_padding_algo("pkcs-1.5");
+       info.checksum = image_get_checksum_algo("sha256,rsa2048");
+       info.crypto = image_get_crypto_algo(info.name);
+
+       info.key = public_key;
+       info.keylen = public_key_len;
+
+       reg.data = data_raw;
+       reg.size = data_raw_len;
+       ret = rsa_verify(&info, &reg, 1, data_enc, data_enc_len);
+       ut_assertf(ret == 0, "verification unexpectedly failed (%d)\n", ret);
+
+       return CMD_RET_SUCCESS;
+}
+
+LIB_TEST(lib_rsa_verify_valid, 0);
+
+/**
+ * lib_rsa_verify_invalid() - unit test for rsa_verify()
+ *
+ * Test rsa_verify() with invalid hash
+ *
+ * @uts:       unit test state
+ * Return:     0 = success, 1 = failure
+ */
+static int lib_rsa_verify_invalid(struct unit_test_state *uts)
+{
+       struct image_sign_info info;
+       struct image_region reg;
+       unsigned char ctmp;
+       int ret;
+
+       memset(&info, '\0', sizeof(info));
+       info.name = "sha256,rsa2048";
+       info.padding = image_get_padding_algo("pkcs-1.5");
+       info.checksum = image_get_checksum_algo("sha256,rsa2048");
+       info.crypto = image_get_crypto_algo(info.name);
+
+       info.key = public_key;
+       info.keylen = public_key_len;
+
+       /* randomly corrupt enc'ed data */
+       ctmp = data_enc[data_enc_len - 10];
+       data_enc[data_enc_len - 10] = 0x12;
+
+       reg.data = data_raw;
+       reg.size = data_raw_len;
+       ret = rsa_verify(&info, &reg, 1, data_enc, data_enc_len);
+
+       /* revert a change */
+       data_enc[data_enc_len - 10] = ctmp;
+
+       ut_assertf(ret != 0, "verification unexpectedly succeeded\n");
+
+       return CMD_RET_SUCCESS;
+}
+
+LIB_TEST(lib_rsa_verify_invalid, 0);
+#endif /* RSA_VERIFY_WITH_PKEY */
index 3cbe01b73e2838c6586746a8f7b8baf115025b77..2e5025258d717c97b12ee67b5f3ded94def7873b 100644 (file)
@@ -138,6 +138,9 @@ command-line option; see the next section.
   before running the tests. If using this option, make sure that any
   environment variables required by the build process are already set, such as
   `$CROSS_COMPILE`.
+- `--buildman` indicates that `--build` should use buildman to build U-Boot.
+  There is no need to set $CROSS_COMPILE` in this case since buildman handles
+  it.
 - `--build-dir` sets the directory containing the compiled U-Boot binaries.
   If omitted, this is `${source_dir}/build-${board_type}`.
 - `--result-dir` sets the directory to write results, such as log files,
@@ -333,7 +336,7 @@ PATH=$HOME/ubtest/bin:$PATH \
 
 If you want the test script to compile U-Boot for you too, then you likely
 need to set `$CROSS_COMPILE` to allow this, and invoke the test script as
-follow:
+follows:
 
 ```bash
 CROSS_COMPILE=arm-none-eabi- \
@@ -342,6 +345,14 @@ CROSS_COMPILE=arm-none-eabi- \
     ./test/py/test.py --bd seaboard --build
 ```
 
+or, using buildman to handle it:
+
+```bash
+    PATH=$HOME/ubtest/bin:$PATH \
+    PYTHONPATH=${HOME}/ubtest/py/${HOSTNAME}:${PYTHONPATH} \
+    ./test/py/test.py --bd seaboard --build --buildman
+```
+
 ## Writing tests
 
 Please refer to the pytest documentation for details of writing pytest tests.
index 34ac4fb06247fcf6a56acb387c7e8c3e098bfce3..e3392ff6bc4eec691f643555394bea9cac0078db 100644 (file)
@@ -70,6 +70,8 @@ def pytest_addoption(parser):
         help='U-Boot board identity/instance')
     parser.addoption('--build', default=False, action='store_true',
         help='Compile U-Boot before running tests')
+    parser.addoption('--buildman', default=False, action='store_true',
+        help='Use buildman to build U-Boot (assuming --build is given)')
     parser.addoption('--gdbserver', default=None,
         help='Run sandbox under gdbserver. The argument is the channel '+
         'over which gdbserver should communicate, e.g. localhost:1234')
@@ -140,16 +142,26 @@ def pytest_configure(config):
     log = multiplexed_log.Logfile(result_dir + '/test-log.html')
 
     if config.getoption('build'):
-        if build_dir != source_dir:
-            o_opt = 'O=%s' % build_dir
+        if config.getoption('buildman'):
+            if build_dir != source_dir:
+                dest_args = ['-o', build_dir, '-w']
+            else:
+                dest_args = ['-i']
+            cmds = (['buildman', '--board', board_type] + dest_args,)
+            name = 'buildman'
         else:
-            o_opt = ''
-        cmds = (
-            ['make', o_opt, '-s', board_type + '_defconfig'],
-            ['make', o_opt, '-s', '-j8'],
-        )
-        with log.section('make'):
-            runner = log.get_runner('make', sys.stdout)
+            if build_dir != source_dir:
+                o_opt = 'O=%s' % build_dir
+            else:
+                o_opt = ''
+            cmds = (
+                ['make', o_opt, '-s', board_type + '_defconfig'],
+                ['make', o_opt, '-s', '-j8'],
+            )
+            name = 'make'
+
+        with log.section(name):
+            runner = log.get_runner(name, sys.stdout)
             for cmd in cmds:
                 runner.run(cmd, cwd=source_dir)
             runner.close()
index bf2a0fc0e24898178e683d83217b3743121397f9..939d82eec12a622b6c4dcc6b3b80057d9037be59 100644 (file)
@@ -237,10 +237,11 @@ def find_ram_base(u_boot_console):
             raise Exception('Failed to find RAM bank start in `bdinfo`')
 
     # We don't want ram_base to be zero as some functions test if the given
-    # address is NULL (0). Let's add 2MiB then (size of an ARM LPAE/v8 section).
+    # address is NULL (0). Besides, on some RISC-V targets the low memory
+    # is protected that prevents S-mode U-Boot from access.
+    # Let's add 2MiB then (size of an ARM LPAE/v8 section).
 
-    if ram_base == 0:
-        ram_base += 1024 * 1024 * 2
+    ram_base += 1024 * 1024 * 2
 
     return ram_base
 
index 99be724b82a554b761c363d63010a4fa14d64956..c2b26340047ae31be56c339c10d77eada999f099 100644 (file)
@@ -58,7 +58,7 @@ hostprogs-$(CONFIG_FIT_SIGNATURE) += fit_info fit_check_sign
 hostprogs-$(CONFIG_CMD_BOOTEFI_SELFTEST) += file2include
 
 FIT_OBJS-$(CONFIG_FIT) := fit_common.o fit_image.o image-host.o common/image-fit.o
-FIT_SIG_OBJS-$(CONFIG_FIT_SIGNATURE) := common/image-sig.o
+FIT_SIG_OBJS-$(CONFIG_FIT_SIGNATURE) := common/image-sig.o common/image-fit-sig.o
 FIT_CIPHER_OBJS-$(CONFIG_FIT_CIPHER) := common/image-cipher.o
 
 # The following files are synced with upstream DTC.
@@ -161,7 +161,7 @@ endif
 ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_ARMADA_38X)$(CONFIG_ARMADA_39X)$(CONFIG_FIT_SIGNATURE),)
 HOSTCFLAGS_kwbimage.o += \
        $(shell pkg-config --cflags libssl libcrypto 2> /dev/null || echo "")
-HOSTLOADLIBES_mkimage += \
+HOSTLDLIBS_mkimage += \
        $(shell pkg-config --libs libssl libcrypto 2> /dev/null || echo "-lssl -lcrypto")
 
 # OS X deprecate openssl in favour of CommonCrypto, supress deprecation
@@ -175,9 +175,9 @@ endif
 
 HOSTCFLAGS_fit_image.o += -DMKIMAGE_DTC=\"$(CONFIG_MKIMAGE_DTC_PATH)\"
 
-HOSTLOADLIBES_dumpimage := $(HOSTLOADLIBES_mkimage)
-HOSTLOADLIBES_fit_info := $(HOSTLOADLIBES_mkimage)
-HOSTLOADLIBES_fit_check_sign := $(HOSTLOADLIBES_mkimage)
+HOSTLDLIBS_dumpimage := $(HOSTLDLIBS_mkimage)
+HOSTLDLIBS_fit_info := $(HOSTLDLIBS_mkimage)
+HOSTLDLIBS_fit_check_sign := $(HOSTLDLIBS_mkimage)
 
 hostprogs-$(CONFIG_EXYNOS5250) += mkexynosspl
 hostprogs-$(CONFIG_EXYNOS5420) += mkexynosspl
index c1ac0d0f58d826cedb2ef64ed6defd68cf2fc0f2..4cf01141574aeba8d94921cabaa790fee70b475c 100644 (file)
@@ -1056,19 +1056,46 @@ toolchain. For example:
    buildman -O clang-7 --board sandbox
 
 
+Doing a simple build
+====================
+
+In some cases you just want to build a single board and get the full output, use
+the -w option, for example:
+
+   buildman -o /tmp/build --board sandbox -w
+
+This will write the full build into /tmp/build including object files.
+
+
 Other options
 =============
 
-Buildman has various other command line options. Try --help to see them.
+Buildman has various other command-line options. Try --help to see them.
+
+To find out what toolchain prefix buildman will use for a build, use the -A
+option.
+
+To request that compiler warnings be promoted to errors, use -E. This passes the
+-Werror flag to the compiler. Note that the build can still produce warnings
+with -E, e.g. the migration warnings:
 
-To find out what architecture or toolchain prefix buildman will use for a build,
-see the -a and -A options.
+        ===================== WARNING ======================
+        This board does not use CONFIG_DM_MMC. Please update
+        ...
+        ====================================================
 
 When doing builds, Buildman's return code will reflect the overall result:
 
     0 (success)     No errors or warnings found
     128             Errors found
-    129             Warnings found
+    129             Warnings found (only if no -W)
+
+You can use -W to tell Buildman to return 0 (success) instead of 129 when
+warnings are found. Note that it can be useful to combine -E and -W. This means
+that all compiler warnings will produce failures (code 128) and all other
+warnings will produce success (since 129 is changed to 0).
+
+If there are both warnings and errors, errors win, so buildman returns 128.
 
 
 How to change from MAKEALL
index 3fd4fac6955349c9bbcc120ff4b9f74fcdf9f623..70c55c588a787e0b2098460355df444c84666810 100644 (file)
@@ -174,6 +174,8 @@ class Builder:
         in_tree: Build U-Boot in-tree instead of specifying an output
             directory separate from the source code. This option is really
             only useful for testing in-tree builds.
+        work_in_output: Use the output directory as the work directory and
+            don't write to a separate output directory.
 
     Private members:
         _base_board_dict: Last-summarised Dict of boards
@@ -224,7 +226,7 @@ class Builder:
                  no_subdirs=False, full_path=False, verbose_build=False,
                  incremental=False, per_board_out_dir=False,
                  config_only=False, squash_config_y=False,
-                 warnings_as_errors=False):
+                 warnings_as_errors=False, work_in_output=False):
         """Create a new Builder object
 
         Args:
@@ -250,10 +252,15 @@ class Builder:
             config_only: Only configure each build, don't build it
             squash_config_y: Convert CONFIG options with the value 'y' to '1'
             warnings_as_errors: Treat all compiler warnings as errors
+            work_in_output: Use the output directory as the work directory and
+                don't write to a separate output directory.
         """
         self.toolchains = toolchains
         self.base_dir = base_dir
-        self._working_dir = os.path.join(base_dir, '.bm-work')
+        if work_in_output:
+            self._working_dir = base_dir
+        else:
+            self._working_dir = os.path.join(base_dir, '.bm-work')
         self.threads = []
         self.do_make = self.Make
         self.gnu_make = gnu_make
@@ -280,6 +287,7 @@ class Builder:
         self.config_only = config_only
         self.squash_config_y = squash_config_y
         self.config_filenames = BASE_CONFIG_FILENAMES
+        self.work_in_output = work_in_output
         if not self.squash_config_y:
             self.config_filenames += EXTRA_CONFIG_FILENAMES
 
@@ -329,7 +337,7 @@ class Builder:
 
         show_errors: True to show summarised error/warning info
         show_sizes: Show size deltas
-        show_detail: Show detail for each board
+        show_detail: Show size delta detail for each board if show_sizes
         show_bloat: Show detail for each function
         list_error_boards: Show the boards which caused each error/warning
         show_config: Show config deltas
@@ -477,6 +485,7 @@ class Builder:
         if self.commits:
             commit = self.commits[commit_upto]
             subject = commit.subject.translate(trans_valid_chars)
+            # See _GetOutputSpaceRemovals() which parses this name
             commit_dir = ('%02d_of_%02d_g%s_%s' % (commit_upto + 1,
                     self.commit_count, commit.hash, subject[:20]))
         elif not self.no_subdirs:
@@ -992,7 +1001,7 @@ class Builder:
                 board.target
             board_dict: Dict containing boards for which we built this
                 commit, keyed by board.target. The value is an Outcome object.
-            show_detail: Show detail for each board
+            show_detail: Show size delta detail for each board
             show_bloat: Show detail for each function
         """
         arch_list = {}
@@ -1109,7 +1118,7 @@ class Builder:
             environment: Dictionary keyed by environment variable, Each
                      value is the value of environment variable.
             show_sizes: Show image size deltas
-            show_detail: Show detail for each board
+            show_detail: Show size delta detail for each board if show_sizes
             show_bloat: Show detail for each function
             show_config: Show config changes
             show_environment: Show environment changes
@@ -1474,6 +1483,8 @@ class Builder:
         Args:
             thread_num: Number of thread to check.
         """
+        if self.work_in_output:
+            return self._working_dir
         return os.path.join(self._working_dir, '%02d' % thread_num)
 
     def _PrepareThread(self, thread_num, setup_git):
@@ -1515,12 +1526,15 @@ class Builder:
         for thread in range(max_threads):
             self._PrepareThread(thread, setup_git)
 
-    def _PrepareOutputSpace(self):
+    def _GetOutputSpaceRemovals(self):
         """Get the output directories ready to receive files.
 
-        We delete any output directories which look like ones we need to
-        create. Having left over directories is confusing when the user wants
-        to check the output manually.
+        Figure out what needs to be deleted in the output directory before it
+        can be used. We only delete old buildman directories which have the
+        expected name pattern. See _GetOutputDir().
+
+        Returns:
+            List of full paths of directories to remove
         """
         if not self.commits:
             return
@@ -1531,12 +1545,26 @@ class Builder:
         to_remove = []
         for dirname in glob.glob(os.path.join(self.base_dir, '*')):
             if dirname not in dir_list:
-                to_remove.append(dirname)
+                leaf = dirname[len(self.base_dir) + 1:]
+                m =  re.match('[0-9]+_of_[0-9]+_g[0-9a-f]+_.*', leaf)
+                if m:
+                    to_remove.append(dirname)
+        return to_remove
+
+    def _PrepareOutputSpace(self):
+        """Get the output directories ready to receive files.
+
+        We delete any output directories which look like ones we need to
+        create. Having left over directories is confusing when the user wants
+        to check the output manually.
+        """
+        to_remove = self._GetOutputSpaceRemovals()
         if to_remove:
-            Print('Removing %d old build directories' % len(to_remove),
+            Print('Removing %d old build directories...' % len(to_remove),
                   newline=False)
             for dirname in to_remove:
                 shutil.rmtree(dirname)
+            Print('done')
 
     def BuildBoards(self, commits, board_selected, keep_outputs, verbose):
         """Build all commits for a list of boards
@@ -1571,6 +1599,7 @@ class Builder:
             job.board = brd
             job.commits = commits
             job.keep_outputs = keep_outputs
+            job.work_in_output = self.work_in_output
             job.step = self._step
             self.queue.put(job)
 
index 570c1f6595c93259255296c817a4f9d10bb1c805..7561f399428b0ae29feb1a908f662303fc67fb2c 100644 (file)
@@ -39,11 +39,18 @@ class BuilderJob:
 
     Members:
         board: Board object to build
-        commits: List of commit options to build.
+        commits: List of Commit objects to build
+        keep_outputs: True to save build output files
+        step: 1 to process every commit, n to process every nth commit
+        work_in_output: Use the output directory as the work directory and
+            don't write to a separate output directory.
     """
     def __init__(self):
         self.board = None
         self.commits = []
+        self.keep_outputs = False
+        self.step = 1
+        self.work_in_output = False
 
 
 class ResultThread(threading.Thread):
@@ -114,7 +121,7 @@ class BuilderThread(threading.Thread):
                 **kwargs)
 
     def RunCommit(self, commit_upto, brd, work_dir, do_config, config_only,
-                  force_build, force_build_failures):
+                  force_build, force_build_failures, work_in_output):
         """Build a particular commit.
 
         If the build is already done, and we are not forcing a build, we skip
@@ -129,6 +136,8 @@ class BuilderThread(threading.Thread):
             force_build: Force a build even if one was previously done
             force_build_failures: Force a bulid if the previous result showed
                 failure
+            work_in_output: Use the output directory as the work directory and
+                don't write to a separate output directory.
 
         Returns:
             tuple containing:
@@ -139,7 +148,7 @@ class BuilderThread(threading.Thread):
         # self.Make() below, in the event that we do a build.
         result = command.CommandResult()
         result.return_code = 0
-        if self.builder.in_tree:
+        if work_in_output or self.builder.in_tree:
             out_dir = work_dir
         else:
             if self.per_board_out_dir:
@@ -261,14 +270,18 @@ class BuilderThread(threading.Thread):
         result.out_dir = out_dir
         return result, do_config
 
-    def _WriteResult(self, result, keep_outputs):
+    def _WriteResult(self, result, keep_outputs, work_in_output):
         """Write a built result to the output directory.
 
         Args:
             result: CommandResult object containing result to write
             keep_outputs: True to store the output binaries, False
                 to delete them
+            work_in_output: Use the output directory as the work directory and
+                don't write to a separate output directory.
         """
+        if work_in_output:
+            return
         # Fatal error
         if result.return_code < 0:
             return
@@ -430,7 +443,8 @@ class BuilderThread(threading.Thread):
                 result, request_config = self.RunCommit(commit_upto, brd,
                         work_dir, do_config, self.builder.config_only,
                         force_build or self.builder.force_build,
-                        self.builder.force_build_failures)
+                        self.builder.force_build_failures,
+                        work_in_output=job.work_in_output)
                 failed = result.return_code or result.stderr
                 did_config = do_config
                 if failed and not do_config:
@@ -438,7 +452,8 @@ class BuilderThread(threading.Thread):
                     # with a reconfig.
                     if self.builder.force_config_on_failure:
                         result, request_config = self.RunCommit(commit_upto,
-                            brd, work_dir, True, False, True, False)
+                            brd, work_dir, True, False, True, False,
+                            work_in_output=job.work_in_output)
                         did_config = True
                 if not self.builder.force_reconfig:
                     do_config = request_config
@@ -477,15 +492,16 @@ class BuilderThread(threading.Thread):
                         raise ValueError('Interrupt')
 
                 # We have the build results, so output the result
-                self._WriteResult(result, job.keep_outputs)
+                self._WriteResult(result, job.keep_outputs, job.work_in_output)
                 self.builder.out_queue.put(result)
         else:
             # Just build the currently checked-out build
             result, request_config = self.RunCommit(None, brd, work_dir, True,
                         self.builder.config_only, True,
-                        self.builder.force_build_failures)
+                        self.builder.force_build_failures,
+                        work_in_output=job.work_in_output)
             result.commit_upto = 0
-            self._WriteResult(result, job.keep_outputs)
+            self._WriteResult(result, job.keep_outputs, job.work_in_output)
             self.builder.out_queue.put(result)
 
     def run(self):
index b41209373dded78f4a295399bb9e782738e5a7d5..17ea015a95601b14193607d05a015cd97177ccfe 100644 (file)
@@ -13,8 +13,6 @@ def ParseArgs():
             args: command lin arguments
     """
     parser = OptionParser()
-    parser.add_option('-a', '--print-arch', action='store_true',
-          help='Print the architecture for a board (ARCH=)')
     parser.add_option('-A', '--print-prefix', action='store_true',
           help='Print the tool-chain prefix for a board (CROSS_COMPILE=)')
     parser.add_option('-b', '--branch', type='string',
@@ -31,7 +29,7 @@ def ParseArgs():
           help='Reconfigure for every commit (disable incremental build)')
     parser.add_option('-d', '--detail', dest='show_detail',
           action='store_true', default=False,
-          help='Show detailed information for each board in summary')
+          help='Show detailed size delta for each board in the -S summary')
     parser.add_option('-D', '--config-only', action='store_true', default=False,
           help="Don't build, just configure each commit")
     parser.add_option('-e', '--show_errors', action='store_true',
@@ -106,6 +104,10 @@ def ParseArgs():
           default=False, help='Show build results while the build progresses')
     parser.add_option('-V', '--verbose-build', action='store_true',
           default=False, help='Run make with V=1, logging all output')
+    parser.add_option('-w', '--work-in-output', action='store_true',
+          default=False, help='Use the output directory as the work directory')
+    parser.add_option('-W', '--ignore-warnings', action='store_true',
+          default=False, help='Return success even if there are warnings')
     parser.add_option('-x', '--exclude', dest='exclude',
           type='string', action='append',
           help='Specify a list of boards to exclude, separated by comma')
index 969d866547a4d775c365cadb6f0ef63f7009321e..5ddc598c9521add121d4b1e252f85f71973dc0f8 100644 (file)
@@ -85,38 +85,15 @@ def ShowActions(series, why_selected, boards_selected, builder, options,
         for warning in board_warnings:
             print(col.Color(col.YELLOW, warning))
 
-def CheckOutputDir(output_dir):
-    """Make sure that the output directory is not within the current directory
-
-    If we try to use an output directory which is within the current directory
-    (which is assumed to hold the U-Boot source) we may end up deleting the
-    U-Boot source code. Detect this and print an error in this case.
-
-    Args:
-        output_dir: Output directory path to check
-    """
-    path = os.path.realpath(output_dir)
-    cwd_path = os.path.realpath('.')
-    while True:
-        if os.path.realpath(path) == cwd_path:
-            Print("Cannot use output directory '%s' since it is within the current directory '%s'" %
-                  (path, cwd_path))
-            sys.exit(1)
-        parent = os.path.dirname(path)
-        if parent == path:
-            break
-        path = parent
-
-def ShowToolchainInfo(boards, toolchains, print_arch, print_prefix):
+def ShowToolchainPrefix(boards, toolchains):
     """Show information about a the tool chain used by one or more boards
 
-    The function checks that all boards use the same toolchain.
+    The function checks that all boards use the same toolchain, then prints
+    the correct value for CROSS_COMPILE.
 
     Args:
         boards: Boards object containing selected boards
         toolchains: Toolchains object containing available toolchains
-        print_arch: True to print ARCH value
-        print_prefix: True to print CROSS_COMPILE value
 
     Return:
         None on success, string error message otherwise
@@ -129,10 +106,7 @@ def ShowToolchainInfo(boards, toolchains, print_arch, print_prefix):
         return 'Supplied boards must share one toolchain'
         return False
     tc = tc_set.pop()
-    if print_arch:
-        print(tc.GetEnvArgs(toolchain.VAR_ARCH))
-    if print_prefix:
-        print(tc.GetEnvArgs(toolchain.VAR_CROSS_COMPILE))
+    print(tc.GetEnvArgs(toolchain.VAR_CROSS_COMPILE))
     return None
 
 def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
@@ -228,9 +202,8 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
     if not len(selected):
         sys.exit(col.Color(col.RED, 'No matching boards found'))
 
-    if options.print_arch or options.print_prefix:
-        err = ShowToolchainInfo(boards, toolchains, options.print_arch,
-                                options.print_prefix)
+    if options.print_prefix:
+        err = ShowToolchainInfo(boards, toolchains)
         if err:
             sys.exit(col.Color(col.RED, err))
         return 0
@@ -263,6 +236,13 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
         str = ("No commits found to process in branch '%s': "
                "set branch's upstream or use -c flag" % options.branch)
         sys.exit(col.Color(col.RED, str))
+    if options.work_in_output:
+        if len(selected) != 1:
+            sys.exit(col.Color(col.RED,
+                               '-w can only be used with a single board'))
+        if count != 1:
+            sys.exit(col.Color(col.RED,
+                               '-w can only be used with a single commit'))
 
     # Read the metadata from the commits. First look at the upstream commit,
     # then the ones in the branch. We would like to do something like
@@ -324,7 +304,6 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
             output_dir = os.path.join(options.output_dir, dirname)
         if clean_dir and os.path.exists(output_dir):
             shutil.rmtree(output_dir)
-    CheckOutputDir(output_dir)
     builder = Builder(toolchains, output_dir, options.git_dir,
             options.threads, options.jobs, gnu_make=gnu_make, checkout=True,
             show_unknown=options.show_unknown, step=options.step,
@@ -334,7 +313,8 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
             per_board_out_dir=options.per_board_out_dir,
             config_only=options.config_only,
             squash_config_y=not options.preserve_config_y,
-            warnings_as_errors=options.warnings_as_errors)
+            warnings_as_errors=options.warnings_as_errors,
+            work_in_output=options.work_in_output)
     builder.force_config_on_failure = not options.quick
     if make_func:
         builder.do_make = make_func
@@ -378,6 +358,6 @@ def DoBuildman(options, args, toolchains=None, make_func=None, boards=None,
                                 options.keep_outputs, options.verbose)
             if fail:
                 return 128
-            elif warned:
+            elif warned and not options.ignore_warnings:
                 return 129
     return 0
index 4c3d497294d198eec76d3f773e1445cb1bddcbfb..2a256a92639caf336fa66290ac460eb63b27f528 100644 (file)
@@ -16,6 +16,7 @@ import control
 import gitutil
 import terminal
 import toolchain
+import tools
 
 settings_data = '''
 # Buildman settings file
@@ -208,7 +209,7 @@ class TestFunctional(unittest.TestCase):
 
     def tearDown(self):
         shutil.rmtree(self._base_dir)
-        shutil.rmtree(self._output_dir)
+        #shutil.rmtree(self._output_dir)
 
     def setupToolchains(self):
         self._toolchains = toolchain.Toolchains()
@@ -218,12 +219,12 @@ class TestFunctional(unittest.TestCase):
         return command.RunPipe([[self._buildman_pathname] + list(args)],
                 capture=True, capture_stderr=True)
 
-    def _RunControl(self, *args, **kwargs):
+    def _RunControl(self, *args, clean_dir=False, boards=None):
         sys.argv = [sys.argv[0]] + list(args)
         options, args = cmdline.ParseArgs()
         result = control.DoBuildman(options, args, toolchains=self._toolchains,
-                make_func=self._HandleMake, boards=self._boards,
-                clean_dir=kwargs.get('clean_dir', True))
+                make_func=self._HandleMake, boards=boards or self._boards,
+                clean_dir=clean_dir)
         self._builder = control.builder
         return result
 
@@ -397,6 +398,12 @@ class TestFunctional(unittest.TestCase):
                     combined='Test configuration complete')
         elif stage == 'build':
             stderr = ''
+            out_dir = ''
+            for arg in args:
+                if arg.startswith('O='):
+                    out_dir = arg[2:]
+            fname = os.path.join(cwd or '', out_dir, 'u-boot')
+            tools.WriteFile(fname, b'U-Boot')
             if type(commit) is not str:
                 stderr = self._error.get((brd.target, commit.sequence))
             if stderr:
@@ -527,11 +534,26 @@ class TestFunctional(unittest.TestCase):
         self.assertEqual(self._builder.count, self._total_builds)
         self.assertEqual(self._builder.fail, 0)
 
-    def testBadOutputDir(self):
-        """Test building with an output dir the same as out current dir"""
-        self._test_branch = '/__dev/__testbranch'
-        with self.assertRaises(SystemExit):
-            self._RunControl('-b', self._test_branch, '-o', os.getcwd())
-        with self.assertRaises(SystemExit):
-            self._RunControl('-b', self._test_branch, '-o',
-                             os.path.join(os.getcwd(), 'test'))
+    def testWorkInOutput(self):
+        """Test the -w option which should write directly to the output dir"""
+        board_list = board.Boards()
+        board_list.AddBoard(board.Board(*boards[0]))
+        self._RunControl('-o', self._output_dir, '-w', clean_dir=False,
+                         boards=board_list)
+        self.assertTrue(
+            os.path.exists(os.path.join(self._output_dir, 'u-boot')))
+
+    def testWorkInOutputFail(self):
+        """Test the -w option failures"""
+        with self.assertRaises(SystemExit) as e:
+            self._RunControl('-o', self._output_dir, '-w', clean_dir=False)
+        self.assertIn("single board", str(e.exception))
+        self.assertFalse(
+            os.path.exists(os.path.join(self._output_dir, 'u-boot')))
+
+        board_list = board.Boards()
+        board_list.AddBoard(board.Board(*boards[0]))
+        with self.assertRaises(SystemExit) as e:
+            self._RunControl('-b', self._test_branch, '-o', self._output_dir,
+                             '-w', clean_dir=False, boards=board_list)
+        self.assertIn("single commit", str(e.exception))
index acd862b3b0fcd8dbe518dafc93e2eb244ef54312..2aaedf44ac7f0bcfd8eacfacabe69904a71507de 100644 (file)
@@ -22,6 +22,7 @@ import commit
 import terminal
 import test_util
 import toolchain
+import tools
 
 use_network = True
 
@@ -469,6 +470,25 @@ class TestBuild(unittest.TestCase):
         self.assertEqual('HOSTCC=clang CC=clang',
                          tc.GetEnvArgs(toolchain.VAR_MAKE_ARGS))
 
+    def testPrepareOutputSpace(self):
+        def _Touch(fname):
+            tools.WriteFile(os.path.join(base_dir, fname), b'')
+
+        base_dir = tempfile.mkdtemp()
+
+        # Add various files that we want removed and left alone
+        to_remove = ['01_of_22_g0982734987_title', '102_of_222_g92bf_title',
+                     '01_of_22_g2938abd8_title']
+        to_leave = ['something_else', '01-something.patch', '01_of_22_another']
+        for name in to_remove + to_leave:
+            _Touch(name)
+
+        build = builder.Builder(self.toolchains, base_dir, None, 1, 2)
+        build.commits = self.commits
+        build.commit_count = len(commits)
+        result = set(build._GetOutputSpaceRemovals())
+        expected = set([os.path.join(base_dir, f) for f in to_remove])
+        self.assertEqual(expected, result)
 
 if __name__ == "__main__":
     unittest.main()
index 89c54d688a824650befc5970a0a3094baf0111a7..4456a805c742d0505500f8c5ea27803f794d660a 100644 (file)
@@ -490,7 +490,7 @@ class Toolchains:
         if arch == 'aarch64':
             arch = 'arm64'
         base = 'https://www.kernel.org/pub/tools/crosstool/files/bin'
-        versions = ['7.3.0', '6.4.0', '4.9.4']
+        versions = ['9.2.0', '7.3.0', '6.4.0', '4.9.4']
         links = []
         for version in versions:
             url = '%s/%s/%s/' % (base, arch, version)